/******************************************************************************
*
*
*
* 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.
*
*/
#include <stdlib.h>
#include <math.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 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
};
// 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"
" 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;
};
struct colored_img_data_item
{
const char *name;
unsigned short width;
unsigned short height;
unsigned char *content;
unsigned char *alpha;
};
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);
}
data++;
}
}
static void writeColoredImgData(const char *dir,colored_img_data_item *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);
}
data++;
}
}
static colored_img_data_item 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 },
{ "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 void writeTabData(const char *dir)
{
writeColoredImgData(dir,colored_tab_data);
}
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 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;
}
//------------------------- 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))
{
QTextStream t(&f);
t << replaceColorMarkers(tabs_css);
}
else
{
fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data());
}
writeTabData(dname);
}
void HtmlGenerator::writeSearchData(const char *dir)
{
static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
writeImgData(dir,serverBasedSearch ? search_server_data : search_client_data);
Doxygen::indexList.addImageFile("search/close.png");
Doxygen::indexList.addImageFile("search/search.png");
QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search";
QFile f(searchDirName+"/search.css");
if (f.open(IO_WriteOnly))
{
QTextStream t(&f);
t << replaceColorMarkers(search_styleSheet);
}
Doxygen::indexList.addStyleSheetFile("search/search.css");
}
void HtmlGenerator::writeStyleSheetFile(QFile &file)
{
QTextStream t(&file);
t << replaceColorMarkers(defaultStyleSheet);
}
static void writeDefaultHeaderFile(QTextStream &t, const char *title,
const char *relPath,bool usePathCmd,
bool searchPage=FALSE)
{
QString relPathStr;
if (usePathCmd)
relPathStr="$relpath$";
else
relPathStr=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)
//{
// 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";
}
t << "<link ";
t << "href=\"";
if (Config_getString("HTML_STYLESHEET").isEmpty())
{
t << relPathStr << "doxygen.css";
}
else
{
QCString cssname=Config_getString("HTML_STYLESHEET");
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)
{
QTextStream t(&file);
t.setEncoding(QTextStream::UnicodeUTF8);
writeDefaultHeaderFile(t,"$title",relativePathToRoot(0),TRUE);
}
void HtmlGenerator::writeFooterFile(QFile &file)
{
QTextStream t(&file);
t.setEncoding(QTextStream::UnicodeUTF8);
t << "<hr class=\"footer\"/><address class=\"footer\"><small>\n";
t << theTranslator->trGeneratedAt( "$datetime", "$projectname" );
t << " <a href=\"http://www.doxygen.org/index.html\">"
<< "<img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/>"
<< "</a> $doxygenversion";
t << "</small></address>\n"
<< "</body>\n"
<< "</html>\n";
}
static void generateDynamicSections(QTextStream &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,dispTitle,relPath,FALSE);
}
else
{
t << substituteKeywords(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(QTextStream &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=\"\" frameborder=\"0\" \n";
t << " name=\"MSearchResults\" id=\"MSearchResults\">\n";
t << "</iframe>\n";
t << "</div>\n";
t << "\n";
}
static void writePageFooter(QTextStream &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");
static bool timeStamp = Config_getBool("HTML_TIMESTAMP");
if (searchEngine && !generateTreeView && !serverBasedSearch)
{
HtmlGenerator::writeSearchFooter(t,relPath);
}
if (g_footer.isEmpty())
{
t << "<hr class=\"footer\"/><address class=\"footer\"><small>";
if (timeStamp)
{
t << theTranslator->trGeneratedAt(
dateToString(TRUE),
Config_getString("PROJECT_NAME")
);
}
else
{
t << theTranslator->trGeneratedBy();
}
t << " " << endl << "<a href=\"http://www.doxygen.org/index.html\">";
t << endl << "<img class=\"footer\" src=\"" << relPath << "doxygen.png\" alt=\"doxygen\"/>"
<< "</a> " << versionString << " ";
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 << substituteKeywords(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);
QCString *dest;
if (ref || f)
{
if (ref)
{
t << "<a class=\"elRef\" ";
t << "doxygen=\"" << ref << ":";
if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
t << "\" ";
}
else
{
t << "<a class=\"el\" ";
}
t << "href=\"";
if (ref)
{
if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
}
else
{
t << relPath;
}
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)
{
QCString *dest;
if (ref)
{
t << "<a class=\"elRef\" ";
t << "doxygen=\"" << ref << ":";
if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
t << "\" ";
}
else
{
t << "<a class=\"el\" ";
}
t << "href=\"";
if (ref)
{
if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
}
else
{
t << relPath;
}
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)
{
QCString *dest;
//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 << "doxygen=\"" << ref << ":";
if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
t << "\" ";
}
else
{
t << "<a class=\"code\" ";
}
t << "href=\"";
if (ref)
{
if ((dest=Doxygen::tagDestinationDict[ref])) t << relPath << *dest << "/";
}
else
{
t << relPath;
}
if (f) t << f << Doxygen::htmlFileExtension;
if (anchor) t << "#" << anchor;
t << "\"";
if (tooltip) t << " title=\"" << convertToXML(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()
{
t << "<h2>";
}
void HtmlGenerator::endGroupHeader()
{
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 << "\">";
}
void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type)
{
t << "</a>";
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 << "<"; break;
case '>': t << ">"; break;
case '&': t << "&"; break;
case '"': t << """; break;
case '-': if (inHtmlComment) t << "-"; else t << "-"; break;
case '\\':
if (*p=='<')
{ t << "<"; p++; }
else if (*p=='>')
{ t << ">"; 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 << "<"; col++;
break;
case '>': t << ">"; col++;
break;
case '&': t << "&"; col++;
break;
case '\'': t << "'"; col++; // ' is not valid HTML
break;
case '"': t << """; col++;
break;
//case ' ': t << " "; col++;
// break;
case '\\':
if (*p=='<')
{ t << "<"; p++; }
else if (*p=='>')
{ t << ">"; 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(QTextStream &t,int sectionCount)
{
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=\"closed.png\"/> ";
}
else
{
t << "<div class=\"dynheader\">" << endl;
}
}
static void endSectionHeader(QTextStream &t)
{
t << "</div>" << endl;
}
static void startSectionSummary(QTextStream &t,int sectionCount)
{
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(QTextStream &t)
{
static bool dynamicSections = Config_getBool("HTML_DYNAMIC_SECTIONS");
if (dynamicSections)
{
t << "</div>" << endl;
}
}
static void startSectionContent(QTextStream &t,int sectionCount)
{
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(QTextStream &t)
{
t << "</div>" << endl;
}
//----------------------------
void HtmlGenerator::startClassDiagram()
{
startSectionHeader(t,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);
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;
}
}
// annonymous 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 << " </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\"> </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 border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" << 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();
}
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();
}
}
void HtmlGenerator::startMemberSubtitle()
{
DBG_HTML(t << "<!-- startMemberSubtitle -->" << endl)
if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<tr><td colspan=\"2\">";
}
void HtmlGenerator::endMemberSubtitle()
{
DBG_HTML(t << "<!-- endMemberSubtitle -->" << endl)
if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<br/><br/></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;)
//t << "<table class=\"memlist\">" << endl;
//t << " <tr>" << endl;
//t << " <td>" << endl;
}
void HtmlGenerator::endMemberDocList()
{
DBG_HTML(t << "<!-- endMemberDocList -->" << endl;)
//t << " </td>" << endl;
//t << " </tr>" << endl;
//t << "</table>" << endl;
}
void HtmlGenerator::startMemberDoc(const char *,const char *,const char *,const char *)
{
DBG_HTML(t << "<!-- startMemberDoc -->" << endl;)
//t << "<p>" << endl;
t << "\n<div class=\"memitem\">" << endl;
//t << "<table>" << endl;
//t << " <tr>" << endl;
//t << " <td>" << endl;
//t << " <table class=\"memproto\">" << endl;
t << "<div class=\"memproto\">" << endl;
}
void HtmlGenerator::startMemberDocPrefixItem()
{
DBG_HTML(t << "<!-- startMemberDocPrefixItem -->" << endl;)
//t << " <tr>" << endl;
//t << " <td class=\"memtemplate\" colspan=\"5\">";
t << "<div class=\"memtemplate\">" << endl;
}
void HtmlGenerator::endMemberDocPrefixItem()
{
DBG_HTML(t << "<!-- endMemberDocPrefixItem -->" << endl;)
//t << "</td>" << endl;
//t << " </tr>" << 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 << " </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)
{
t << "</td>" << endl;
t << " <td>";
if (closeBracket) t << " )";
t << " </td>" << endl;
t << " <td>";
}
else
{
t << "</td><td> </td>" << endl;
t << " </tr>" << endl;
t << " <tr>" << endl;
t << " <td></td>" << endl;
t << " <td>";
if (closeBracket) t << ")";
t << "</td>" << endl;
t << " <td></td><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 << " </td>" << endl;
//t << " </tr>" << endl;
//t << "</table>" << endl;
t << "</div>" << endl;
}
void HtmlGenerator::startDotGraph()
{
startSectionHeader(t,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,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,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,relPath);
endSectionContent(t);
m_sectionCount++;
}
void HtmlGenerator::startGroupCollaboration()
{
startSectionHeader(t,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,relPath);
endSectionContent(t);
m_sectionCount++;
}
void HtmlGenerator::startCallGraph()
{
startSectionHeader(t,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,relPath);
endSectionContent(t);
m_sectionCount++;
}
void HtmlGenerator::startDirDepGraph()
{
startSectionHeader(t,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,relPath);
endSectionContent(t);
m_sectionCount++;
}
void HtmlGenerator::writeGraphicalHierarchy(const DotGfxHierarchyTable &g)
{
g.writeGraph(t,dir);
}
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 << " ";
}
}
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(QTextStream &t,bool compact,bool topLevel=TRUE)
{
if (compact)
{
if (topLevel)
{
t << " <div class=\"tabs\">\n";
}
else
{
t << " <div class=\"tabs2\">\n";
}
t << " <ul class=\"tablist\">\n";
}
else
{
t << "<ul>";
}
}
static void endQuickIndexList(QTextStream &t,bool compact)
{
if (compact)
{
t << " </ul>\n";
t << " </div>\n";
}
else
{
t << "</ul>\n";
}
}
static void startQuickIndexItem(QTextStream &t,const char *l,
bool hl,bool /*compact*/,
const QCString &relPath)
{
t << " <li"; if (hl) t << " class=\"current\"";
t << "><a ";
t << "href=\"" << relPath << l << "\">";
t << "<span>";
}
static void endQuickIndexItem(QTextStream &t)
{
t << "</span>";
t << "</a>";
t << "</li>\n";
}
static QCString fixSpaces(const QCString &s)
{
return substitute(s," "," ");
}
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(QTextStream &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());
endQuickIndexItem(t);
// recursive into child list
renderQuickLinksAsTree(t,relPath,entry);
}
}
endQuickIndexList(t,FALSE);
}
}
static void renderQuickLinksAsTabs(QTextStream &t,const QCString &relPath,
LayoutNavEntry *hlEntry,LayoutNavEntry::Kind kind,
bool highlightParent,bool highlightSearch)
{
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())
{
#if 0 // old PHP based search engine
// last item of the top row -> special case for search engine
if (Config_getBool("SEARCHENGINE"))
{
QCString searchFor = fixSpaces(theTranslator->trSearchForIndex());
if (searchFor.at(0)=='S') searchFor="<u>S</u>"+searchFor.mid(1);
t << " <li>\n";
t << " <form action=\"" << relPath << "search.php\" method=\"get\">\n";
t << " <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
t << " <tr>\n";
t << " <td><label> " << searchFor << " </label></td>\n";
if (!highlightSearch)
{
t << " <td><input type=\"text\" name=\"query\" value=\"\" size=\"20\" accesskey=\"s\"/></td>\n";
t << " </tr>\n";
t << " </table>\n";
t << " </form>\n";
t << " </li>\n";
}
}
if (!highlightSearch) // on the search page the page will be ended by the
// page itself
{
endQuickIndexList(t,TRUE);
}
#endif
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";
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";
t << " </li>\n";
}
else if (!generateTreeView) // server based search
{
t << " <li id=\"searchli\">\n";
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";
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);
}
}
}
}
static void writeDefaultQuickLinks(QTextStream &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()
{
if (!Config_getBool("DISABLE_INDEX"))
{
t << "<div class=\"navigation\" id=\"top\">" << endl;
}
}
void HtmlGenerator::endQuickIndices()
{
if (!Config_getBool("DISABLE_INDEX"))
{
t << "</div>" << endl;
}
}
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()
{
QCString fileName = Config_getString("HTML_OUTPUT")+"/search.php";
QFile f(fileName);
if (f.open(IO_WriteOnly))
{
QTextStream t(&f);
t.setEncoding(QTextStream::UnicodeUTF8);
if (g_header.isEmpty())
{
writeDefaultHeaderFile(t,theTranslator->trSearch().data(),0,FALSE,TRUE);
}
else
{
t << substituteKeywords(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";
}
if (!Config_getBool("DISABLE_INDEX"))
{
writeDefaultQuickLinks(t,TRUE,HLI_Search,"");
}
else
{
t << " \n<div class=\"qindex\">\n";
t << " <form class=\"search\" action=\"search.php\" "
<< "method=\"get\">\n";
}
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";
if (!generateTreeView)
{
t << " echo \""
<< " <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"
<< "\";\n";
}
else
{
t << " echo \""
<< " </ul>\\n"
<< " </div>\\n"
<< "\";\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))
{
QTextStream 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> :</td><td valign=\"top\"><em>";
}
void HtmlGenerator::endConstraintType()
{
t << "</em></td>";
}
void HtmlGenerator::startConstraintDocs()
{
t << "<td> ";
}
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;
}