diff --git a/README.md b/README.md index 276cff8..fb30381 100644 --- a/README.md +++ b/README.md @@ -70,9 +70,12 @@ This text Russian language. 10.09.2019 Окно Server Status - * иправлено падение окна Server Status при аварийном завершении СУБД + + * исправлено падение окна Server Status при аварийном завершении СУБД - добавлена расцветка процессов которые блокируют другие процессы + Окно Query + - добавлен фильтр в окно результатов запроса. Активируется двойным щелчком мыши по ячейке, текст которой и будет являтся условием фильтра. Снимается из контекстного меню. При нажатом Alt условие отбора инвертируется (Скрыть строки содержащие значение). - Для избегания ожиданий при получении информации об объектах. Выставляется клиентский параметр SET lock_timeout=15000 для служебного соединения. @@ -95,6 +98,20 @@ This text Russian language. - добавлен вывод CREATE STATISTICS для таблиц * исправлен вывод SQL команды для создания задания для комманд заданных в виде массива +28.03.2020 + - добавлена информация о фрагментации таблицы (cfs_fragmentation) + * убрано предупреждение о версии сервера + +11.04.2020 + - добавлена многоколоночная сортировка результатов выполнения запроса. Порядок сортировки колонок и направление отмечается цветными индикаторами (RED,YELLOW,GREEN,BLUE,GREY). + Максимальное число колонок сортировки 5. Для выполнения сортировки нужно щелкнуть по заголовку колонки удерживая клавишу Alt. + - добавлены новые опции для Vaccum ( DISABLE_PAGE_SKIPPING ) и Reindex ( CONCURRENTLY ) + * ускорена работа фильтра в окне результав запроса. + + + + + diff --git a/Release_(3.0)/pgAdmin3.exe b/Release_(3.0)/pgAdmin3.exe index cd3e502..00505fe 100644 Binary files a/Release_(3.0)/pgAdmin3.exe and b/Release_(3.0)/pgAdmin3.exe differ diff --git a/ctl/ctlSQLGrid.cpp b/ctl/ctlSQLGrid.cpp index 4ef1aec..e768847 100644 --- a/ctl/ctlSQLGrid.cpp +++ b/ctl/ctlSQLGrid.cpp @@ -20,7 +20,7 @@ #include "utils/sysSettings.h" #include "frm/frmExport.h" #include - +#include "ctl/ctlSQLResult.h" #define EXTRAEXTENT_HEIGHT 6 #define EXTRAEXTENT_WIDTH 6 @@ -56,10 +56,94 @@ ctlSQLGrid::ctlSQLGrid(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons SetDefaultCellOverflow(false); //SetDefaultRenderer(new wxGridCellAutoWrapStringRenderer); SetDefaultRenderer(new CursorCellRenderer); - + //SetUseNativeColLabels(true); + //UseNativeColHeader(true); grp=NULL; Connect(wxID_ANY, wxEVT_GRID_LABEL_LEFT_DCLICK, wxGridEventHandler(ctlSQLGrid::OnLabelDoubleClick)); +} +#include "wx/renderer.h" +#include "wx/headerctrl.h" + +void ctlSQLGrid::DrawColLabel( wxDC& dc, int col ) { + wxGrid::DrawColLabel(dc,col); + int colLeft = GetColLeft(col); + + wxRect rect(colLeft, 0, GetColWidth(col), m_colLabelHeight); + sqlResultTable *t=(sqlResultTable *)GetTable(); + + wxHeaderSortIconType sortArrow=t->getSortColumn(col)!=0 + ? t->getSortColumn(col)>0 + ? wxHDR_SORT_ICON_UP + : wxHDR_SORT_ICON_DOWN + : wxHDR_SORT_ICON_NONE; + + if (sortArrow != wxHDR_SORT_ICON_NONE ) + { + wxRect ar = rect; + + // make a rect for the arrow + ar.height = 4; + ar.width = 8; + ar.y += (rect.height - ar.height)/2; + ar.x = ar.x + rect.width - 3*ar.width/2; + int arrowSpace = 0; + arrowSpace = 3*ar.width/2; // space to preserve when drawing the label + wxPoint triPt[3]; + if ( sortArrow & wxHDR_SORT_ICON_UP ) + { + triPt[0].x = ar.width / 2; + triPt[0].y = 0; + triPt[1].x = ar.width; + triPt[1].y = ar.height; + triPt[2].x = 0; + triPt[2].y = ar.height; + } + else + { + triPt[0].x = 0; + triPt[0].y = 0; + triPt[1].x = ar.width; + triPt[1].y = 0; + triPt[2].x = ar.width / 2; + triPt[2].y = ar.height; + } + + wxColour c; + + c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW); + for (int k=0;kcolsortnumber[k]; + if (cl!=-1) { + if (cl==col) { + if (k==0) c=wxColor(155,17,48); // red + if (k==1) c=wxColor(255,255,0); // yellow + if (k==2) c=wxColor(34,199,76); // green + if (k==3) c=wxColor(12,38,160); // blue + } + } else break; + } + wxDCPenChanger setPen(dc, c); + wxDCBrushChanger setBrush(dc, c); + + wxDCClipper clip(dc, rect); + dc.DrawPolygon( 3, triPt, ar.x, ar.y); + } + + //wxRendererNative::Get().DrawHeaderButton + // (m_colWindow, + // //GetColLabelWindow(), + // dc, + // rect, + // 0, + // IsSortingBy(col) + // ? IsSortOrderAscending() + // ? wxHDR_SORT_ICON_UP + // : wxHDR_SORT_ICON_DOWN + // : wxHDR_SORT_ICON_NONE + // ); + + } void ctlSQLGrid::OnGridColSize(wxGridSizeEvent &event) { @@ -429,8 +513,15 @@ void ctlSQLGrid::OnLabelClick(wxGridEvent &event) grp->VisibleGroup(row,GetRowSize(row+1)==0); return; } + if ( col >= 0 && (event.AltDown() ) ) + { + // continue for sort event + sqlResultTable *t=(sqlResultTable *)GetTable(); + t->setSortColumn(col); + return; + } // add support for (de)selecting multiple rows and cols with Control pressed - if ( row >= 0 && (event.ControlDown() || event.CmdDown()) ) + else if ( row >= 0 && (event.ControlDown() || event.CmdDown()) ) { if (GetSelectedRows().Index(row) == wxNOT_FOUND) SelectRow(row, true); @@ -443,6 +534,7 @@ void ctlSQLGrid::OnLabelClick(wxGridEvent &event) SelectCol(col, true); else DeselectCol(col); + event.Skip(); } else event.Skip(); diff --git a/ctl/ctlSQLResult.cpp b/ctl/ctlSQLResult.cpp index 56fee96..8a11058 100644 --- a/ctl/ctlSQLResult.cpp +++ b/ctl/ctlSQLResult.cpp @@ -30,11 +30,12 @@ ctlSQLResult::ctlSQLResult(wxWindow *parent, pgConn *_conn, wxWindowID id, const thread = NULL; SetTable(new sqlResultTable(), true); - + EnableEditing(false); SetSizer(new wxBoxSizer(wxVERTICAL)); cg=GetGridLineColour(); Connect(wxID_ANY, wxEVT_GRID_RANGE_SELECT, wxGridRangeSelectEventHandler(ctlSQLResult::OnGridSelect)); + Connect(wxID_ANY, wxEVT_GRID_COL_SORT, wxGridEventHandler(ctlSQLResult::OnGridColSort)); } @@ -179,7 +180,6 @@ void ctlSQLResult::DisplayData(bool single) */ wxGridTableMessage *msg; sqlResultTable *table = (sqlResultTable *)GetTable(); - msg = new wxGridTableMessage(table, wxGRIDTABLE_NOTIFY_ROWS_DELETED, 0, GetNumberRows()); ProcessTableMessage(*msg); @@ -193,6 +193,7 @@ void ctlSQLResult::DisplayData(bool single) msg = new wxGridTableMessage(table, wxGRIDTABLE_NOTIFY_COLS_APPENDED, thread->DataSet()->NumCols()); ProcessTableMessage(*msg); delete msg; + table->initSort(); if (NumRows()<1000) { for(int row = 0; row < NumRows(); ++row) { if (row%2==0) { @@ -318,14 +319,17 @@ wxString ctlSQLResult::OnGetItemText(long item, long col) const } if (item >= 0) { - thread->DataSet()->Locate(item + 1); - return thread->DataSet()->GetVal(col); + //thread->DataSet()->Locate(item + 1); + //return thread->DataSet()->GetVal(col); + sqlResultTable *t=(sqlResultTable *)GetTable(); + return t->GetValueFast(item,col); } else return thread->DataSet()->ColName(col); } return wxEmptyString; } + wxString ctlSQLResult::SummaryColumn() { //ce=cells.Item(0); @@ -404,6 +408,11 @@ wxString ctlSQLResult::SummaryColumn() result.Printf(wxT("%f"), sum); return result; } +void ctlSQLResult::OnGridColSort(wxGridEvent& event) + { + const int col = event.GetCol(); + //m_table->Sort(col, !(m_grid->IsSortingBy(col) && m_grid->IsSortOrderAscending())); + } void ctlSQLResult::OnGridSelect(wxGridRangeSelectEvent &event) { @@ -413,7 +422,7 @@ void ctlSQLResult::ClearFilter() { size_t numRows = GetNumberRows(); int sizerow=GetDefaultRowSize(); - for (int i = 0 ; i < numRows; i++) + for (size_t i = 0 ; i < numRows; i++) { if (GetRowSize(i)>0) continue; //SetRowSize(i,sizerow); @@ -424,18 +433,23 @@ void ctlSQLResult::ClearFilter() } wxString ctlSQLResult::SetFilter(int row,int col,bool reverse) { - wxString fltval=GetCellValue(row,col); + wxString result=wxEmptyString; + sqlResultTable *t=(sqlResultTable *)GetTable(); + if (!(thread && thread->DataValid())) {result.Printf(wxT("Error thread not valid"));return result; } + //wxString fltval=GetCellValue(row,col); + wxString fltval=t->GetValueFast(row,col); wxString text; bool eq; size_t numRows = GetNumberRows(); int all=0,show=0,hide=0; - for (int i = 0 ; i < numRows; i++) + for (size_t i = 0 ; i < numRows; i++) { //str.Append(GetExportLine(i, cols)); //SetRowSize(i,sizerow); if (GetRowSize(i)==0) continue; - eq=(fltval==GetCellValue(i, col)); + + eq=(fltval==t->GetValueFast(i,col)); if (reverse) eq=!eq; if (!eq) { HideRow(i); @@ -445,18 +459,173 @@ wxString ctlSQLResult::SetFilter(int row,int col,bool reverse) } SetGridLineColour(wxColor(0,0,255)); - wxString result; result.Printf(wxT("Show rows:%d hide:%d all:%d"), show,hide,all); return result; } +#include +int sqlResultTable::sortColumns() +{ + bool no_sort=colsortnumber[0]==-1; + if (!maplines) { + maplines = new int[GetNumberRows()]; + for(int i=0;iDataSet()->ColTypClass(col) == PGTYPCLASS_NUMERIC) + { + //sort numeric column + std::multimap mp; + double d; + for (int i=0;iDataSet()->Locate(i+1); + d=thread->DataSet()->GetDouble(col); + mp.insert(std::pair(d, i)); + } + std::multimap::iterator it = mp.begin(); + double prev; + int row; + int minval=0; + cols[k] = new int[GetNumberRows()]; + for (int i = 0; it != mp.end(); it++, i++) { // + row=it->second; // row + if (i>0) if (prev!=it->first) minval++; + cols[k][row]=minval; + prev=it->first; + } + } else { + //no numeric sort as string + std::multimap mp; + wxString s; + for (int i=0;iDataSet()->Locate(i+1); + s=thread->DataSet()->GetVal(col); + mp.insert(std::pair(s, i)); + } + std::multimap::iterator it = mp.begin(); + wxString prev; + int row; + int minval=0; + cols[k] = new int[GetNumberRows()]; + for (int i = 0; it != mp.end(); it++, i++) { + row=it->second; // row + if (i>0) if (prev!=it->first) minval++; + cols[k][row]=minval; + prev=it->first; + } + } + } else break; + } + + class sorter { + int **cols; + sqlResultTable *m; + public: + sorter(int *_cols[], sqlResultTable *my_obj) { cols=_cols;m=my_obj;} + bool operator() (int i,int j) { + bool rez=true; + int a; + int b; + int col,ord; + for (int k=0;kcolsortnumber[k]; + if (col!=-1) { + ord=m->colorder[col]; + if (ord==0) continue; + a=cols[k][i]; + b=cols[k][j]; + if (a!=b) { + rez=aDataValid()) + { + if (col >= 0) + { + if (use_map) row=maplines[row]; + thread->DataSet()->Locate(row + 1); + wxString s = thread->DataSet()->GetVal(col); + return s; + } + + } + return ""; +} wxString sqlResultTable::GetValue(int row, int col) { if (thread && thread->DataValid()) { if (col >= 0) { + if (use_map) row=maplines[row]; thread->DataSet()->Locate(row + 1); if (settings->GetIndicateNull() && thread->DataSet()->IsNull(col)) return wxT(""); @@ -508,6 +677,8 @@ wxString sqlResultTable::GetValue(int row, int col) sqlResultTable::sqlResultTable() { thread = NULL; + colorder=NULL; + maplines=NULL; } int sqlResultTable::GetNumberRows() diff --git a/frm/frmMaintenance.cpp b/frm/frmMaintenance.cpp index d90bca0..3facecd 100644 --- a/frm/frmMaintenance.cpp +++ b/frm/frmMaintenance.cpp @@ -38,6 +38,9 @@ END_EVENT_TABLE() #define chkFreeze CTRL_CHECKBOX("chkFreeze") #define chkAnalyze CTRL_CHECKBOX("chkAnalyze") #define chkVerbose CTRL_CHECKBOX("chkVerbose") +#define chkDISABLE_PAGE_SKIPPING CTRL_CHECKBOX("chkDISABLE_PAGE_SKIPPING") +#define chkCONCURRENTLY CTRL_CHECKBOX("chkCONCURRENTLY") + #define stBitmap CTRL("stBitmap", wxStaticBitmap) @@ -109,10 +112,13 @@ void frmMaintenance::OnAction(wxCommandEvent &ev) chkFull->Enable(isVacuum); chkFreeze->Enable(isVacuum); chkAnalyze->Enable(isVacuum); + chkDISABLE_PAGE_SKIPPING->Enable(isVacuum && conn->BackendMinimumVersion(10, 0)); bool isReindex = (rbxAction->GetSelection() == 2); + chkCONCURRENTLY->Enable(isReindex && conn->BackendMinimumVersion(12, 0)); + bool isCluster = (rbxAction->GetSelection() == 3); - if (isReindex || (isCluster && !conn->BackendMinimumVersion(8, 4))) + if ((isCluster && !conn->BackendMinimumVersion(8, 4))) { chkVerbose->SetValue(false); chkVerbose->Enable(false); @@ -142,16 +148,18 @@ wxString frmMaintenance::GetSql() return wxEmptyString; } sql = wxT("VACUUM "); - + wxString opt = ""; if (chkFull->GetValue()) - sql += wxT("FULL "); + AppendIfFilled(opt,",",wxT("FULL")); if (chkFreeze->GetValue()) - sql += wxT("FREEZE "); + AppendIfFilled(opt,",",wxT("FREEZE")); if (chkVerbose->GetValue()) - sql += wxT("VERBOSE "); + AppendIfFilled(opt,",",wxT("VERBOSE")); if (chkAnalyze->GetValue()) - sql += wxT("ANALYZE "); - + AppendIfFilled(opt,",",wxT("ANALYZE")); + if (chkDISABLE_PAGE_SKIPPING->GetValue()) + AppendIfFilled(opt,",",wxT("DISABLE_PAGE_SKIPPING")); + sql += opt.IsNull() ? "" : "("+opt.Mid(1)+")"; if (object->GetMetaType() != PGM_DATABASE) sql += object->GetQuotedFullIdentifier(); @@ -170,14 +178,20 @@ wxString frmMaintenance::GetSql() } case 2: { + sql = wxT("REINDEX "); + if (chkVerbose->GetValue()) + sql += wxT("(VERBOSE) "); + if (object->GetMetaType() == PGM_UNIQUE || object->GetMetaType() == PGM_PRIMARYKEY) { - sql = wxT("REINDEX INDEX ") + object->GetQuotedFullIdentifier(); + sql += wxT("INDEX ") + chkCONCURRENTLY->GetValue() ? "CONCURRENTLY ": ""; + sql += object->GetQuotedFullIdentifier(); } else // Database, Tables, and Index (but not Constraintes ones) { - sql = wxT("REINDEX ") + object->GetTypeName().Upper() - + wxT(" ") + object->GetQuotedFullIdentifier(); + sql += object->GetTypeName().Upper(); + sql += chkCONCURRENTLY->GetValue() ? " CONCURRENTLY ": " "; + sql += object->GetQuotedFullIdentifier(); } break; } diff --git a/include/ctl/ctlSQLGrid.h b/include/ctl/ctlSQLGrid.h index 7949620..16fc853 100644 --- a/include/ctl/ctlSQLGrid.h +++ b/include/ctl/ctlSQLGrid.h @@ -56,6 +56,7 @@ private: void OnCopy(wxCommandEvent &event); void OnMouseWheel(wxMouseEvent &event); void OnGridColSize(wxGridSizeEvent &event); + void DrawColLabel( wxDC& dc, int col ); wxString GetColumnName(int colNum); wxString GetColKeyValue(int col); void AppendColumnHeader(wxString &str, int start, int end); diff --git a/include/ctl/ctlSQLResult.h b/include/ctl/ctlSQLResult.h index f228b16..45e11d9 100644 --- a/include/ctl/ctlSQLResult.h +++ b/include/ctl/ctlSQLResult.h @@ -69,6 +69,7 @@ public: void SetMaxRows(int rows); void ResultsFinished(); void OnGridSelect(wxGridRangeSelectEvent &event); + void OnGridColSort(wxGridEvent& event); wxString SetFilter(int row,int col,bool reverse); wxArrayString colNames; @@ -86,10 +87,20 @@ class sqlResultTable : public wxGridStringTable//wxGridTableBase public: sqlResultTable(); wxString GetValue(int row, int col); + wxString GetValueFast(int row, int col); wxString GetRowLabelValue( int row ) ; int GetNumberRows(); int GetNumberCols(); bool isplan; + bool use_map; // use maplines for GetValue + int *maplines; // maplines[visible_row]=real_row + int *colorder; // array order type -1 desc , 0 no sort, 1 asc +#define MAX_COL_SORT 5 + int colsortnumber[MAX_COL_SORT]; + int sortColumns(); // + int setSortColumn(int col); // set order for column (cycle change value -1,0,1) + int getSortColumn(int col); + int initSort(); // allocate memory bool IsEmptyCell(int row, int col) { return false; diff --git a/include/version.h b/include/version.h index 167907e..7af7e0a 100644 --- a/include/version.h +++ b/include/version.h @@ -13,7 +13,7 @@ #define VERSION_H // Application Versions -#define VERSION_STR wxT("1.25.0 Dev ASUTP version with support PG11") +#define VERSION_STR wxT("1.25.0 Dev ASUTP version with support PG12") #define VERSION_NUM 1,25,0,0 #define VERSION_PACKAGE 1.25.0-dev diff --git a/ui/frmMaintenance.xrc b/ui/frmMaintenance.xrc index cbb96b5..2b71bd9 100644 --- a/ui/frmMaintenance.xrc +++ b/ui/frmMaintenance.xrc @@ -37,7 +37,7 @@ - 3 + 5 5 5 0 @@ -63,6 +63,20 @@ wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT 4 + + + + + wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT + 4 + + + + + + wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT + 4 + wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT 4 diff --git a/ui/xrcDialogs.cpp b/ui/xrcDialogs.cpp index bed3d48..54c992b 100644 --- a/ui/xrcDialogs.cpp +++ b/ui/xrcDialogs.cpp @@ -35378,7 +35378,7 @@ static unsigned char xml_res_file_76[] = { 99,116,62,10,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,60,47, 111,98,106,101,99,116,62,10,60,47,114,101,115,111,117,114,99,101,62,10}; -static size_t xml_res_size_77 = 5178; +static size_t xml_res_size_77 = 5924; static unsigned char xml_res_file_77[] = { 60,63,120,109,108,32,118,101,114,115,105,111,110,61,34,49,46,48,34,32,101, 110,99,111,100,105,110,103,61,34,73,83,79,45,56,56,53,57,45,49,34,63,62, @@ -35456,7 +35456,7 @@ static unsigned char xml_res_file_77[] = { 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62, 86,65,67,85,85,77,32,111,112,116,105,111,110,115,60,47,108,97,98,101,108, 62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,99, -111,108,115,62,51,60,47,99,111,108,115,62,10,32,32,32,32,32,32,32,32,32, +111,108,115,62,53,60,47,99,111,108,115,62,10,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,60,118,103,97,112,62,53,60,47,118,103, 97,112,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 60,104,103,97,112,62,53,60,47,104,103,97,112,62,10,32,32,32,32,32,32,32, @@ -35512,111 +35512,144 @@ static unsigned char xml_res_file_77[] = { 32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,52,60,47,98, 111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, -32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, -32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, -69,88,80,65,78,68,124,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95,86, -69,82,84,73,67,65,76,124,119,120,84,79,80,124,119,120,76,69,70,84,124,119, -120,82,73,71,72,84,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32, -32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,52,60,47,98,111, -114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, -47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, -32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101, -114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, -32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120, -67,104,101,99,107,66,111,120,34,32,110,97,109,101,61,34,99,104,107,86,101, -114,98,111,115,101,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, -32,32,32,32,32,60,108,97,98,101,108,62,86,101,114,98,111,115,101,32,109, -101,115,115,97,103,101,115,60,47,108,97,98,101,108,62,10,32,32,32,32,32, -32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,99,104,101,99,107,101,100, -62,49,60,47,99,104,101,99,107,101,100,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,67,104,101,99,107,66,111, +120,34,32,110,97,109,101,61,34,99,104,107,68,73,83,65,66,76,69,95,80,65, +71,69,95,83,75,73,80,80,73,78,71,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,68,73, +83,65,66,76,69,95,80,65,71,69,95,83,75,73,80,80,73,78,71,60,47,108,97,98, +101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,69,88, +80,65,78,68,124,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95,86,69,82, +84,73,67,65,76,124,119,120,84,79,80,124,119,120,76,69,70,84,124,119,120, +82,73,71,72,84,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,52,60, +47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,67,104,101,99,107,66,111, +120,34,32,110,97,109,101,61,34,99,104,107,67,79,78,67,85,82,82,69,78,84, +76,89,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,108,97,98,101,108,62,67,79,78,67,85,82,82,69,78,84,76, +89,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32, -32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, -69,88,80,65,78,68,124,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95,86, -69,82,84,73,67,65,76,124,119,120,84,79,80,124,119,120,76,69,70,84,124,119, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103, +62,119,120,69,88,80,65,78,68,124,119,120,65,76,73,71,78,95,67,69,78,84, +69,82,95,86,69,82,84,73,67,65,76,124,119,120,84,79,80,124,119,120,76,69, +70,84,124,119,120,82,73,71,72,84,60,47,102,108,97,103,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100, +101,114,62,52,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102, +108,97,103,62,119,120,69,88,80,65,78,68,124,119,120,65,76,73,71,78,95,67, +69,78,84,69,82,95,86,69,82,84,73,67,65,76,124,119,120,84,79,80,124,119, +120,76,69,70,84,124,119,120,82,73,71,72,84,60,47,102,108,97,103,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101, +114,62,52,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,67,104,101,99,107,66,111,120,34,32,110,97,109, +101,61,34,99,104,107,86,101,114,98,111,115,101,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,86, +101,114,98,111,115,101,32,109,101,115,115,97,103,101,115,60,47,108,97,98, +101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,99,104,101,99,107,101,100,62,49,60,47,99,104,101,99,107,101,100,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,102,108,97,103,62,119,120,69,88,80,65,78,68,124,119,120,65,76,73,71, +78,95,67,69,78,84,69,82,95,86,69,82,84,73,67,65,76,124,119,120,84,79,80, +124,119,120,76,69,70,84,124,119,120,82,73,71,72,84,60,47,102,108,97,103, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,52,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,115,101,108,101,99,116,101,100,62,49,60,47, +115,101,108,101,99,116,101,100,62,10,32,32,32,32,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,110,111,116,101,98,111,111,107,112, +97,103,101,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101, +108,62,77,101,115,115,97,103,101,115,60,47,108,97,98,101,108,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,84,101,120,116,67,116,114,108,34,32,110,97,109,101,61, +34,116,120,116,77,101,115,115,97,103,101,115,34,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,84,69,95,77,85, +76,84,73,76,73,78,69,124,119,120,84,69,95,82,69,65,68,79,78,76,89,124,119, +120,72,83,67,82,79,76,76,60,47,115,116,121,108,101,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,60,102,108,97,103, +62,119,120,84,79,80,124,119,120,66,79,84,84,79,77,124,119,120,76,69,70, +84,124,119,120,82,73,71,72,84,124,119,120,69,88,80,65,78,68,124,119,120, +71,82,79,87,124,119,120,65,76,73,71,78,95,67,69,78,84,82,69,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105, +122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,60,111,98, +106,101,99,116,32,99,108,97,115,115,61,34,119,120,70,108,101,120,71,114, +105,100,83,105,122,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,60,99, +111,108,115,62,52,60,47,99,111,108,115,62,10,32,32,32,32,32,32,32,32,32, +32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101, +114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,117,116,116,111, +110,34,32,110,97,109,101,61,34,119,120,73,68,95,72,69,76,80,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,38,97,109, +112,59,72,101,108,112,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,112,111,115,62,50,44,49,51,53,100,60,47,112,111, +115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +84,79,80,124,119,120,66,79,84,84,79,77,124,119,120,76,69,70,84,124,119, 120,82,73,71,72,84,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32, -32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,52,60,47,98,111, -114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, -47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, -60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60, -47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,115, -101,108,101,99,116,101,100,62,49,60,47,115,101,108,101,99,116,101,100,62, +32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62, 10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, 32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61, -34,110,111,116,101,98,111,111,107,112,97,103,101,34,62,10,32,32,32,32,32, -32,32,32,32,32,32,32,60,108,97,98,101,108,62,77,101,115,115,97,103,101, -115,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60, -111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,84,101,120,116, -67,116,114,108,34,32,110,97,109,101,61,34,116,120,116,77,101,115,115,97, -103,101,115,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116, -121,108,101,62,119,120,84,69,95,77,85,76,84,73,76,73,78,69,124,119,120, -84,69,95,82,69,65,68,79,78,76,89,124,119,120,72,83,67,82,79,76,76,60,47, -115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, -98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, -101,99,116,62,10,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, -10,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,84,79,80,124,119, -120,66,79,84,84,79,77,124,119,120,76,69,70,84,124,119,120,82,73,71,72,84, -124,119,120,69,88,80,65,78,68,124,119,120,71,82,79,87,124,119,120,65,76, -73,71,78,95,67,69,78,84,82,69,60,47,102,108,97,103,62,10,32,32,32,32,32, -32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60,111,98,106,101, -99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34, -62,10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, -115,61,34,119,120,70,108,101,120,71,114,105,100,83,105,122,101,114,34,62, -10,32,32,32,32,32,32,32,32,32,32,60,99,111,108,115,62,52,60,47,99,111,108, -115,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, -108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32, -32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, -115,61,34,119,120,66,117,116,116,111,110,34,32,110,97,109,101,61,34,119, -120,73,68,95,72,69,76,80,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, -32,60,108,97,98,101,108,62,38,97,109,112,59,72,101,108,112,60,47,108,97, -98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,112,111,115, -62,50,44,49,51,53,100,60,47,112,111,115,62,10,32,32,32,32,32,32,32,32,32, -32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, -32,32,60,102,108,97,103,62,119,120,84,79,80,124,119,120,66,79,84,84,79, -77,124,119,120,76,69,70,84,124,119,120,82,73,71,72,84,60,47,102,108,97, -103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114, -62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32, -60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111, -98,106,101,99,116,32,99,108,97,115,115,61,34,115,112,97,99,101,114,34,62, -10,32,32,32,32,32,32,32,32,32,32,32,32,60,115,105,122,101,62,48,44,48,60, -47,115,105,122,101,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, -101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, -32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10, -32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, -97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110,97,109,101,61, -34,119,120,73,68,95,79,75,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32, -32,32,60,108,97,98,101,108,62,38,97,109,112,59,79,75,60,47,108,97,98,101, -108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,100,101,102,97,117, -108,116,62,49,60,47,100,101,102,97,117,108,116,62,10,32,32,32,32,32,32, -32,32,32,32,32,32,32,32,60,112,111,115,62,57,51,44,49,51,53,100,60,47,112, +34,115,112,97,99,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60, +115,105,122,101,62,48,44,48,60,47,115,105,122,101,62,10,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101, +114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,117,116,116,111, +110,34,32,110,97,109,101,61,34,119,120,73,68,95,79,75,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,38,97,109,112, +59,79,75,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,100,101,102,97,117,108,116,62,49,60,47,100,101,102,97,117,108, +116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,112,111,115,62,57, +51,44,49,51,53,100,60,47,112,111,115,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,60,102,108,97,103,62,119,120,84,79,80,124,119,120,66,79,84,84,79,77, +124,119,120,76,69,70,84,124,119,120,82,73,71,72,84,60,47,102,108,97,103, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62, +53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98, +106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101, +109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110,97, +109,101,61,34,119,120,73,68,95,67,65,78,67,69,76,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,38,97,109,112,59,67, +97,110,99,101,108,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,112,111,115,62,49,52,54,44,49,51,53,100,60,47,112, 111,115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, 99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119, 120,84,79,80,124,119,120,66,79,84,84,79,77,124,119,120,76,69,70,84,124, -119,120,82,73,71,72,84,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32, -32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101, -114,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, -10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97, -115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32, -32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61, -34,119,120,66,117,116,116,111,110,34,32,110,97,109,101,61,34,119,120,73, -68,95,67,65,78,67,69,76,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, -32,60,108,97,98,101,108,62,38,97,109,112,59,67,97,110,99,101,108,60,47, -108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,112, -111,115,62,49,52,54,44,49,51,53,100,60,47,112,111,115,62,10,32,32,32,32, -32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, -32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,84,79,80,124,119,120, -66,79,84,84,79,77,124,119,120,76,69,70,84,124,119,120,82,73,71,72,84,124, -119,120,69,88,80,65,78,68,124,119,120,71,82,79,87,124,119,120,65,76,73, -71,78,95,82,73,71,72,84,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32, -32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101, -114,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, -10,32,32,32,32,32,32,32,32,32,32,60,103,114,111,119,97,98,108,101,99,111, -108,115,62,49,60,47,103,114,111,119,97,98,108,101,99,111,108,115,62,10, -32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, -32,32,32,60,102,108,97,103,62,119,120,69,88,80,65,78,68,124,119,120,71, -82,79,87,60,47,102,108,97,103,62,10,32,32,32,32,32,32,60,47,111,98,106, -101,99,116,62,10,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,60, -47,111,98,106,101,99,116,62,10,60,47,114,101,115,111,117,114,99,101,62, -10}; +119,120,82,73,71,72,84,124,119,120,69,88,80,65,78,68,124,119,120,71,82, +79,87,124,119,120,65,76,73,71,78,95,82,73,71,72,84,60,47,102,108,97,103, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62, +53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,103,114, +111,119,97,98,108,101,99,111,108,115,62,49,60,47,103,114,111,119,97,98, +108,101,99,111,108,115,62,10,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,69,88, +80,65,78,68,124,119,120,71,82,79,87,60,47,102,108,97,103,62,10,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,60,47,111,98,106,101,99,116,62,10,60,47,114,101, +115,111,117,114,99,101,62,10}; static size_t xml_res_size_78 = 70018; static unsigned char xml_res_file_78[] = {