Add support for remote databases in pgAgent [Ashesh Vashi, with some futzing by Dave...
authordpage <dpage@a7884b65-44f6-0310-8a51-81a127f17b15>
Mon, 29 Dec 2008 19:58:37 +0000 (19:58 +0000)
committerdpage <dpage@a7884b65-44f6-0310-8a51-81a127f17b15>
Mon, 29 Dec 2008 19:58:37 +0000 (19:58 +0000)
git-svn-id: svn://svn.pgadmin.org/trunk/pgadmin3@7526 a7884b65-44f6-0310-8a51-81a127f17b15

17 files changed:
CHANGELOG
pgadmin/agent/dlgStep.cpp
pgadmin/agent/pgaStep.cpp
pgadmin/db/pgConn.cpp
pgadmin/db/pgSet.cpp
pgadmin/dlg/dlgSelectDatabase.cpp [new file with mode: 0644]
pgadmin/dlg/module.mk
pgadmin/include/agent/dlgStep.h
pgadmin/include/agent/pgaStep.h
pgadmin/include/db/pgConn.h
pgadmin/include/db/pgSet.h
pgadmin/include/dlg/dlgSelectDatabase.h [new file with mode: 0644]
pgadmin/include/dlg/module.mk
pgadmin/include/precomp.h
pgadmin/pgAdmin3.vcproj
pgadmin/ui/dlgStep.xrc
pgadmin/ui/xrcDialogs.cpp

index ef032636b4548be7625cf56bbcf5bc8962af9f2b..cb4e2529010afc43cf4a0febda0d95148cc0a9a3 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -36,6 +36,8 @@ Changes
 \r
 Date       Dev Ver    Change details\r
 ---------- --- -----  --------------\r
+2008-12-29 DP  1.9.0  Allow pgAgent to connect to databases on remote servers,\r
+                      such as hot standby machines [Ashesh Vashi]\r
 2008-11-25 DP  1.9.0  Add support for DESC and NULLs FIRST/LAST options for\r
                       index columns [Quan Zongliang].\r
 2008-11-18 DP  1.9.0  Add support for per-database collation, ctype and\r
index 6598f5c5321e9342bdbb0d54c3b1413c7de81faa..b22c42367b3aa3e6094f2a80c76632b39f3ea82d 100644 (file)
 #include "utils/misc.h"
 #include "agent/dlgStep.h"
 #include "agent/pgaStep.h"
+#include "dlg/dlgSelectDatabase.h"
+#include "schema/pgTable.h"
 
 
 // pointer to controls
-#define        txtID                           CTRL_TEXT("txtID")
+#define txtID               CTRL_TEXT("txtID")
 #define chkEnabled          CTRL_CHECKBOX("chkEnabled")
-#define cbDatabase          CTRL_COMBOBOX("cbDatabase")
 #define rbxKind             CTRL_RADIOBOX("rbxKind")
 #define rbxOnError          CTRL_RADIOBOX("rbxOnError")
 #define pnlDefinition       CTRL_PANEL("pnlDefinition")
 #define txtSqlBox           CTRL_TEXT("txtSqlBox")
+#define cbDatabase          CTRL_COMBOBOX2("cbDatabase")
+#define txtConnStr          CTRL_TEXT("txtConnStr")
+#define btnSelDatabase      CTRL_BUTTON("btnSelDatabase")
+#define rbRemoteConn        CTRL_RADIOBUTTON("rbRemoteConn")
+#define rbLocalConn         CTRL_RADIOBUTTON("rbLocalConn")
 
 #define CTL_SQLBOX  188
 
@@ -32,7 +38,11 @@ BEGIN_EVENT_TABLE(dlgStep, dlgAgentProperty)
     EVT_COMBOBOX(XRCID("cbDatabase"),               dlgProperty::OnChange)
     EVT_RADIOBOX(XRCID("rbxKind"),                  dlgProperty::OnChange)
     EVT_RADIOBOX(XRCID("rbxOnError"),               dlgProperty::OnChange)
+    EVT_TEXT(XRCID("txtConnStr"),                   dlgProperty::OnChange)
     EVT_STC_MODIFIED(CTL_SQLBOX,                    dlgProperty::OnChangeStc)
+    EVT_BUTTON(XRCID("btnSelDatabase"),             dlgStep::OnSelectDatabase)
+    EVT_RADIOBUTTON(XRCID("rbRemoteConn"),          dlgStep::OnSelRemoteConn)
+    EVT_RADIOBUTTON(XRCID("rbLocalConn"),           dlgStep::OnSelLocalConn)
 END_EVENT_TABLE();
 
 
@@ -61,7 +71,8 @@ dlgStep::dlgStep(pgaFactory *f, frmMain *frame, pgaStep *node, pgaJob *j)
     delete placeholder;
     sizer->Layout();
 
-       txtID->Disable();
+
+    txtID->Disable();
 }
 
 
@@ -73,6 +84,15 @@ pgObject *dlgStep::GetObject()
 
 int dlgStep::Go(bool modal)
 {
+    // Set height for txtDatabase, btnSelDatabase, cbDatabase same as other text
+    // control 
+//    int commonHeight = txtID->GetSize().GetHeight();
+
+//    cbDatabase->SetMinSize(wxSize(cbDatabase->GetSize().GetWidth(), commonHeight));
+//    btnSelDatabase->SetMinSize(wxSize(30, commonHeight));
+//    txtConnStr->SetMinSize(wxSize(/* txtConnStr->GetSize().GetWidth() */ 10, commonHeight));
+    
+    hasConnStrSupport = connection->TableHasColumn(wxT("pgagent"), wxT("pga_jobstep"), wxT("jstconnstr"));
     cbDatabase->Append(wxT(" "));
     cbDatabase->SetSelection(0);
 
@@ -90,12 +110,26 @@ int dlgStep::Go(bool modal)
     if (step)
     {
         // edit mode
-               recId = step->GetRecId();
-               txtID->SetValue(NumToStr(recId));
-        if (step->GetDbname().IsEmpty())
-            cbDatabase->SetSelection(0);
+        recId = step->GetRecId();
+        txtID->SetValue(NumToStr(recId));
+
+        if (step->HasConnectionString())
+        {
+            rbRemoteConn->SetValue(true);
+            txtConnStr->Enable(true);
+            txtConnStr->ChangeValue(step->GetConnStr());
+            btnSelDatabase->Enable(true);
+            cbDatabase->Enable(false);
+        }
         else
-            cbDatabase->SetValue(step->GetDbname());
+        {
+            rbLocalConn->SetValue(true);
+            if (step->GetDbname().IsEmpty())
+                cbDatabase->SetSelection(0);
+            else
+                cbDatabase->SetValue(step->GetDbname());
+        }
+
         rbxKind->SetSelection(wxString(wxT("sb")).Find(step->GetKindChar()));
         rbxOnError->SetSelection(wxString(wxT("fsi")).Find(step->GetOnErrorChar()));
         sqlBox->SetText(step->GetCode());
@@ -105,6 +139,12 @@ int dlgStep::Go(bool modal)
     else
     {
         // create mode
+        rbLocalConn->SetValue(true);
+        cbDatabase->Enable(true);
+        btnSelDatabase->Enable(false);
+        txtConnStr->Enable(false);
+        if (!hasConnStrSupport)
+            rbLocalConn->Enable(false);
     }
 
     return dlgProperty::Go(modal);
@@ -128,19 +168,43 @@ void dlgStep::CheckChange()
     {
         enable  =  name != step->GetName()
                 || chkEnabled->GetValue() != step->GetEnabled()
-                || cbDatabase->GetValue().Trim() != step->GetDbname()
                 || rbxKind->GetSelection() != wxString(wxT("sb")).Find(step->GetKindChar())
                 || rbxOnError->GetSelection() != wxString(wxT("fsi")).Find(step->GetOnErrorChar())
                 || txtComment->GetValue() != step->GetComment()
                 || sqlBox->GetText() != step->GetCode();
+
+        if (!enable && rbxKind->GetSelection() == 0)
+        {
+            if (hasConnStrSupport)
+            {
+                if (step->HasConnectionString())
+                {
+                    if (rbRemoteConn->GetValue())
+                        enable = txtConnStr->GetValue().Trim() != step->GetConnStr();
+                    else
+                        enable = true;
+                }
+                else
+                {
+                    if (rbRemoteConn->GetValue())
+                        enable = true;
+                    else
+                        enable = cbDatabase->GetValue().Trim() != step->GetDbname();
+                }
+            }
+            else
+            {
+                enable = cbDatabase->GetValue().Trim() != step->GetDbname();
+            }
+        }
     }
     else
     {
         enable=true;
     }
 
-       if (statusBar)
-               statusBar->SetStatusText(wxEmptyString);
+    if (statusBar)
+        statusBar->SetStatusText(wxEmptyString);
 
     CheckValid(enable, !name.IsEmpty(), _("Please specify name."));
     CheckValid(enable, sqlBox->GetLength() > 0, _("Please specify code to execute."));
@@ -148,13 +212,47 @@ void dlgStep::CheckChange()
     // Disable/enable the database combo
     if (rbxKind->GetSelection() == 1)
     {
-        cbDatabase->SetSelection(0);
+        rbRemoteConn->Enable(false);
+        rbLocalConn->Enable(false);
+        // I don't see any reason to make
+        // the database combobox selection to 0
+        //cbDatabase->SetSelection(0);
+        txtConnStr->Enable(false);
+        btnSelDatabase->Enable(false);
         cbDatabase->Enable(false);
     }
     else
     {
-        cbDatabase->Enable(true);
-        CheckValid(enable, !cbDatabase->GetValue().Trim().IsEmpty(), _("Please select a database."));
+        if (hasConnStrSupport)
+        {
+            rbRemoteConn->Enable(true);
+            rbLocalConn->Enable(true);
+            if (rbRemoteConn->GetValue())
+            {
+                wxString validConnStr;                
+
+                btnSelDatabase->Enable(true);
+                txtConnStr->Enable(true);
+                cbDatabase->Enable(false);
+                CheckValid(enable, !txtConnStr->GetValue().Trim().IsEmpty(), _("Please select a connection string."));
+                CheckValid(enable, dlgSelectDatabase::getValidConnectionString(txtConnStr->GetValue().Trim(), validConnStr), _("Please enter a valid connection string"));
+            }
+            else
+            {
+                cbDatabase->Enable(true);
+                btnSelDatabase->Enable(false);
+                txtConnStr->Enable(false);
+                CheckValid(enable, !cbDatabase->GetValue().Trim().IsEmpty(), _("Please select a database."));
+            }
+        }
+        else
+        {
+            cbDatabase->Enable(true);
+            // Make sure both radio buttons are disabled
+            rbRemoteConn->Enable(false);
+            rbLocalConn->Enable(false);
+            CheckValid(enable, !cbDatabase->GetValue().Trim().IsEmpty(), _("Please select a database."));
+        }
     }
 
     EnableOK(enable);
@@ -178,19 +276,39 @@ wxString dlgStep::GetInsertSql()
         wxString name=GetName();
         wxString kind = wxT("sb")[rbxKind->GetSelection()];
         wxString onerror = wxT("fsi")[rbxOnError->GetSelection()];
-        wxString db;
+        wxString db, connstr;
         wxString jstjobid;
         if (jobId)
             jstjobid = NumToStr(jobId);
         else
             jstjobid = wxT("<JobId>");
+        // SQL script expected
+        if (rbxKind->GetSelection() == 0)
+        {
+            if (hasConnStrSupport && rbRemoteConn->GetValue())
+                       {
+                connstr = qtDbString(txtConnStr->GetValue().Trim());
+                               db = wxT("''");
+                       }
+            else
+                       {
+                db = qtDbString(cbDatabase->GetValue().Trim());
+                               connstr = wxT("''");
+                       }
+        }
 
-        db = qtDbString(cbDatabase->GetValue().Trim());
-
-        sql = wxT("INSERT INTO pgagent.pga_jobstep (jstid, jstjobid, jstname, jstdesc, jstenabled, jstkind, jstonerror, jstcode, jstdbname)\n")
-              wxT("SELECT <StpId>, ") + jstjobid + wxT(", ") + qtDbString(name) + wxT(", ") + qtDbString(txtComment->GetValue()) + wxT(", ")
+        sql = wxT("INSERT INTO pgagent.pga_jobstep (jstid, jstjobid, jstname, jstdesc, jstenabled, jstkind, jstonerror, jstcode, jstdbname");
+        if (hasConnStrSupport)
+            sql += wxT(", jstconnstr");
+        sql += wxT(")\n ") \
+               wxT("SELECT <StpId>, ") + jstjobid + wxT(", ") + qtDbString(name) + wxT(", ") + qtDbString(txtComment->GetValue()) + wxT(", ")
                 + BoolToStr(chkEnabled->GetValue()) + wxT(", ") + qtDbString(kind) + wxT(", ") 
-                + qtDbString(onerror) + wxT(", ") + qtDbString(sqlBox->GetText()) + wxT(", ") + db + wxT(";\n");
+                + qtDbString(onerror) + wxT(", ") + qtDbString(sqlBox->GetText()) + wxT(", ") + db;
+        if (hasConnStrSupport)
+        {
+            sql += wxT(", ") + connstr;
+        }
+        sql += wxT(";\n");
     }
     return sql;
 }
@@ -203,8 +321,8 @@ wxString dlgStep::GetUpdateSql()
     if (step)
     {
         // edit mode
-
         wxString name=GetName();
+        wxString kind = wxT("sb")[rbxKind->GetSelection()];
 
         wxString vars;
         if (name != step->GetName())
@@ -219,19 +337,66 @@ wxString dlgStep::GetUpdateSql()
                 vars.Append(wxT(", "));
             vars.Append(wxT("jstenabled=") + BoolToStr(chkEnabled->GetValue()));
         }
-        if (cbDatabase->GetValue().Trim() != step->GetDbname())
+        if (hasConnStrSupport && kind == wxT("s"))
+        {
+            if (rbRemoteConn->GetValue())
+            {
+                if (step->HasConnectionString())
+                {
+                    if (txtConnStr->GetValue().Trim() != step->GetConnStr())
+                    {
+                        if (!vars.IsEmpty())
+                            vars.Append(wxT(", "));
+                        vars.Append(wxT("jstconnstr=") + qtDbString(txtConnStr->GetValue().Trim()));
+                    }
+                }
+                else
+                {
+                    if (!vars.IsEmpty())
+                        vars.Append(wxT(", "));
+                    vars.Append(wxT("jstconnstr=") + qtDbString(txtConnStr->GetValue().Trim()) + wxT(", "));
+                    vars.Append(wxT("jstdbname=''"));
+                }
+            }
+            else
+            {
+                if (step->HasConnectionString())
+                {
+                    if (!vars.IsEmpty())
+                        vars.Append(wxT(", "));
+                    vars.Append(wxT("jstdbname=") + qtDbString(cbDatabase->GetValue().Trim()) + wxT(", "));
+                    vars.Append(wxT("jstconnstr=''"));
+                }
+                else
+                {
+                    if (cbDatabase->GetValue().Trim() != step->GetDbname())
+                    {
+                        if (!vars.IsEmpty())
+                            vars.Append(wxT(", "));
+                        vars.Append(wxT("jstdbname=") + qtDbString(cbDatabase->GetValue().Trim()));
+                    }
+                }
+            }
+        }
+        else if (kind == wxT("s"))
+        {
+            if (cbDatabase->GetValue().Trim() != step->GetDbname())
+            {
+                if (!vars.IsEmpty())
+                    vars.Append(wxT(", "));
+                vars.Append(wxT("jstdbname=") + qtDbString(cbDatabase->GetValue().Trim()));
+            }
+        }
+        else
         {
             if (!vars.IsEmpty())
                 vars.Append(wxT(", "));
-            
-            if (!cbDatabase->GetCurrentSelection())
-                vars.Append(wxT("jstdbname=''"));
-            else
-                vars.Append(wxT("jstdbname=") + qtDbString(cbDatabase->GetValue()));
+            vars.Append(wxT("jstdbname=''"));
+            if (hasConnStrSupport)
+                vars.Append(wxT(", jstconnstr=''"));
         }
-        if (rbxKind->GetSelection() != wxString(wxT("sb")).Find(step->GetKindChar()))
+        if (rbxKind->GetSelection() != kind)
         {
-            wxString kind = wxT("sb")[rbxKind->GetSelection()];
             if (!vars.IsEmpty())
                 vars.Append(wxT(", "));
             vars.Append(wxT("jstkind=") + qtDbString(kind));
@@ -278,3 +443,38 @@ bool dlgStep::IsUpToDate()
        else
                return true;
 }
+
+void dlgStep::OnSelectDatabase(wxCommandEvent &ev)
+{
+    dlgSelectDatabase dlgSD(this, wxID_ANY);
+    if (dlgSD.ShowModal() == wxID_OK)
+    {
+        wxString strConnStr = dlgSD.getConnInfo();
+        if (!strConnStr.IsEmpty())
+            txtConnStr->SetValue(strConnStr);
+    }
+}
+
+void dlgStep::OnSelRemoteConn(wxCommandEvent& ev)
+{
+    if (rbRemoteConn->GetValue())
+    {
+        cbDatabase->Enable(false);
+        btnSelDatabase->Enable(true);
+        txtConnStr->Enable(true);
+    }
+    dlgProperty::OnChange(ev);
+}
+
+void dlgStep::OnSelLocalConn(wxCommandEvent& ev)
+{
+    if (rbLocalConn->GetValue())
+    {
+        cbDatabase->Enable(true);
+        btnSelDatabase->Enable(false);
+        txtConnStr->Enable(false);
+    }
+    dlgProperty::OnChange(ev);
+}
+
+
index c167213967b74ca06384932b5fe2e88867bd7e5f..5373eb4e98531558c9f787a8413d6b4f7c6f572a 100644 (file)
@@ -56,7 +56,10 @@ void pgaStep::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *prope
         properties->AppendItem(_("ID"), GetRecId());
         properties->AppendItem(_("Enabled"), GetEnabled());
         properties->AppendItem(_("Kind"), GetKind());
-        properties->AppendItem(_("Database"), GetDbname());
+        if (GetConnStr().IsEmpty())
+            properties->AppendItem(_("Database"), GetDbname());
+        else
+            properties->AppendItem(_("Connection String"), GetConnStr());
         properties->AppendItem(_("Code"), GetCode());
         properties->AppendItem(_("On error"), GetOnError());
 
@@ -98,6 +101,8 @@ pgObject *pgaStepFactory::CreateObjects(pgCollection *collection, ctlTree *brows
             step->iSetRecId(steps->GetLong(wxT("jstid")));
                        step->iSetXid(steps->GetOid(wxT("xmin")));
             step->iSetDbname(steps->GetVal(wxT("jstdbname")));
+            if (steps->HasColumn(wxT("jstconnstr")))
+                step->iSetConnStr(steps->GetVal(wxT("jstconnstr")));
             step->iSetCode(steps->GetVal(wxT("jstcode")));
             step->iSetEnabled(steps->GetBool(wxT("jstenabled")));
 
index d2f41f219e1dfdee9944c275b88f8ba520fca23d..0828d6125e753e59f60eb9b2506edd6366dfa039 100644 (file)
@@ -819,3 +819,62 @@ wxString pgConn::qtString(const wxString& value)
        
     return result;
 }
+
+// Check if, TABLE (tblname) has column with name colname
+bool pgConn::TableHasColumn(wxString schemaname, wxString tblname, const wxString& colname)
+{
+    //
+    // SELECT a.attname
+    // FROM pg_catalog.pg_attribute a
+    // WHERE a.attrelid = (SELECT c.oid
+    //                     FROM pg_catalog.pg_class c
+    //                          LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+    //                     WHERE c.relname ~ '^(TABLENAME)$' AND 
+    //                           pg_catalog.pg_table_is_visible(c.oid) AND 
+    //                           n.nspname ~ '^(SCHEMANAME)$') AND 
+    //       a.attnum > 0 AND NOT a.attisdropped
+    // ORDER BY a.attnum
+    //
+
+    if (tblname.IsEmpty() || colname.IsEmpty())
+        return false;
+
+    if (schemaname.IsEmpty())
+        schemaname = wxT("public");
+
+    if (this && GetStatus() == PGCONN_OK)
+    {
+        tblname.Replace(wxT("\\"), wxT("\\\\"));
+        tblname.Replace(wxT("'"), wxT("''"));
+        schemaname.Replace(wxT("\\"), wxT("\\\\"));
+        schemaname.Replace(wxT("'"), wxT("''"));
+
+        wxString sql
+          = wxT("SELECT a.attname AS colname FROM pg_catalog.pg_attribute a ") \
+            wxT("WHERE a.attrelid = (SELECT c.oid FROM pg_catalog.pg_class c ") \
+            wxT("                    LEFT JOIN pg_catalog.pg_namespace n ON ") \
+            wxT("                                    n.oid = c.relnamespace ") \
+            wxT("                    WHERE c.relname ~ '^(") + tblname + wxT(")$' AND ") \
+            wxT("                          n.nspname ~ '^(") + schemaname + wxT(")$') AND ") \
+            wxT("      a.attnum > 0 AND NOT a.attisdropped ") \
+            wxT("ORDER BY a.attnum");
+
+        pgSet* set = ExecuteSet(sql);
+        if (set)
+        {
+            while (!set->Eof())
+            {
+                if (set->GetVal(wxT("colname")) == colname)
+                {
+                    delete set;
+                    return true;
+                }
+                set->MoveNext();
+            }
+        }
+        delete set;
+    }
+
+    return false;
+}
+
index 5a7ea97877eb50949d6b1b9005167e92eae434ce..7ab9e14e7eb19a04017938707f382393d07a34db 100644 (file)
@@ -203,6 +203,19 @@ int pgSet::ColNumber(const wxString &colname) const
     return col;
 }
 
+bool pgSet::HasColumn(const wxString &colname) const
+{
+    if (needColQuoting)
+    {
+        wxString quotedColName = colname;
+        quotedColName.Replace(wxT("\""), wxT("\"\""));
+        return (PQfnumber(res, (wxT("\"") + quotedColName + wxT("\"")).mb_str(conv)) < 0 ? false : true);
+    }
+    else
+        return (PQfnumber(res, colname.mb_str(conv)) < 0 ? false : true);
+
+}
+
 
 
 char *pgSet::GetCharPtr(const int col) const
diff --git a/pgadmin/dlg/dlgSelectDatabase.cpp b/pgadmin/dlg/dlgSelectDatabase.cpp
new file mode 100644 (file)
index 0000000..f92e998
--- /dev/null
@@ -0,0 +1,308 @@
+//////////////////////////////////////////////////////////////////////////\r
+//\r
+// pgAdmin III - PostgreSQL Tools\r
+// RCS-ID:      $Id:$\r
+// Copyright (C) 2002 - 2008, The pgAdmin Development Team\r
+// This software is released under the Artistic Licence\r
+//\r
+// dlgSelectDatabase.cpp - Database Selection for connection string\r
+//\r
+//////////////////////////////////////////////////////////////////////////\r
+\r
+// App headers\r
+#include "pgAdmin3.h"\r
+\r
+#include <wx/regex.h>\r
+\r
+#include "utils/misc.h"\r
+#include "dlg/dlgSelectDatabase.h"\r
+#include "schema/pgServer.h"\r
+#include "schema/pgDatabase.h"\r
+#include "frm/frmMain.h"\r
+\r
+extern frmMain *winMain;\r
+wxWindowID TCSERVER_ID = ::wxNewId();\r
+\r
+BEGIN_EVENT_TABLE(dlgSelectDatabase, wxDialog)\r
+    EVT_TREE_ITEM_ACTIVATED (TCSERVER_ID, dlgSelectDatabase::OnSelActivate)\r
+    EVT_TREE_SEL_CHANGED    (TCSERVER_ID, dlgSelectDatabase::OnSelect) \r
+END_EVENT_TABLE()\r
+\r
+\r
+dlgSelectDatabase::dlgSelectDatabase(wxWindow* parent, int id, const wxPoint& pos, const wxSize& size, long style):\r
+    wxDialog(parent, id, wxT("Select Database"), pos, size, wxDEFAULT_DIALOG_STYLE)\r
+{\r
+\r
+#ifdef __WXMSW__\r
+    SetWindowStyleFlag(GetWindowStyleFlag() & ~wxMAXIMIZE_BOX);\r
+#endif\r
+\r
+    wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+    tcServers = new wxTreeCtrl(this, TCSERVER_ID);\r
+    mainSizer->Add(tcServers, 1, wxEXPAND, 0);\r
+\r
+    wxBoxSizer *bottomSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+    bottomSizer->AddStretchSpacer();\r
+\r
+    wxButton *btnOk = new wxButton(this, wxID_OK, wxT("&OK"));\r
+    bottomSizer->Add(btnOk);\r
\r
+    wxButton *btnCANCEL = new wxButton(this, wxID_CANCEL, wxT("&Cancel"));\r
+    bottomSizer->Add(btnCANCEL, 0, wxLEFT, 10);\r
+\r
+    mainSizer->Add(bottomSizer, 0, wxALL|wxALIGN_RIGHT, 5);\r
+    SetSizer(mainSizer);\r
+\r
+    SetSize(wxSize(200, 240));\r
+\r
+    Layout();\r
+    Centre();\r
+\r
+    Initialize();\r
+}\r
+\r
+void dlgSelectDatabase::Initialize()\r
+{\r
+    // Add the root node\r
+    pgServerCollection *serversObj = new pgServerCollection(serverFactory.GetCollectionFactory());\r
+    wxTreeItemId rootItemID = tcServers->AddRoot(wxGetTranslation(serverFactory.GetCollectionFactory()->GetTypeName()),\r
+           serversObj->GetIconId(), -1, serversObj);\r
+    tcServers->SetImageList(imageList);\r
\r
+    ctlTree *browser=winMain->GetBrowser();\r
+    wxCookieType cookie;\r
+\r
+    wxTreeItemId servers=browser->GetRootItem();\r
+    wxTreeItemId serverItem=browser->GetFirstChild(servers, cookie);\r
+    while (serverItem)\r
+    {\r
+        pgServer *server = (pgServer*)browser->GetObject(serverItem);\r
+\r
+        dlgSelDBNode *cnInfo = new dlgSelDBNode(server);\r
+        wxTreeItemId itm = tcServers->AppendItem(rootItemID, server->GetFullName(), server->GetIconId(), -1, cnInfo);\r
+\r
+        pgConn* conn = server->connection();\r
+        \r
+        if (conn && conn->GetStatus() == PGCONN_OK)\r
+        {\r
+            pgSet *res = conn->ExecuteSet(wxT("SELECT datname, datallowconn FROM pg_catalog.pg_database"));\r
+            if (res)\r
+            {\r
+                while (!res->Eof())\r
+                {\r
+                    if (res->GetBool(wxT("datallowconn")))\r
+                    {\r
+                        dlgSelDBNode *cnInfo = new dlgSelDBNode(server, res->GetVal(wxT("datname")));\r
+                        tcServers->AppendItem(itm, cnInfo->getDatabase(), databaseFactory.GetIconId(), -1, cnInfo);\r
+                    }\r
+\r
+                    res->MoveNext();\r
+                }\r
+            }\r
+        }\r
+\r
+        serverItem = browser->GetNextChild(servers, cookie);\r
+    }\r
+\r
+    tcServers->Expand(servers);\r
+    selectedConn = NULL;\r
+}\r
+\r
+void dlgSelectDatabase::OnSelect(wxTreeEvent& ev)\r
+{\r
+    wxTreeItemId sel = tcServers->GetSelection();\r
+\r
+    if (sel.IsOk() && sel != tcServers->GetRootItem())\r
+    {\r
+        selectedConn = (dlgSelDBNode *)tcServers->GetItemData(sel);\r
+    }\r
+    else\r
+    {\r
+       selectedConn = NULL;\r
+    }\r
+}\r
+\r
+void dlgSelectDatabase::OnSelActivate(wxTreeEvent& ev)\r
+{\r
+    wxTreeItemId selID = tcServers->GetSelection();\r
+\r
+    if (selID.IsOk() && selID != tcServers->GetRootItem())\r
+    {\r
+        selectedConn = (dlgSelDBNode *)tcServers->GetItemData(selID);\r
+\r
+        if (selectedConn->dbname.IsEmpty() && tcServers->GetChildrenCount(selID, false) == 0)\r
+        {\r
+            winMain->ReconnectServer(selectedConn->server, true);\r
+\r
+            pgConn* conn = selectedConn->server->connection();\r
+            if (conn && conn->GetStatus() == PGCONN_OK)\r
+            {\r
+                pgSet *res = conn->ExecuteSet(wxT("SELECT datname, datallowconn FROM pg_catalog.pg_database"));\r
+                if (res)\r
+                {\r
+                    while (!res->Eof())\r
+                    {\r
+                        if (res->GetBool(wxT("datallowconn")))\r
+                        {\r
+                            dlgSelDBNode *cnInfo = new dlgSelDBNode(selectedConn->server, res->GetVal(wxT("datname")));\r
+                            tcServers->AppendItem(selID, cnInfo->getDatabase(), databaseFactory.GetIconId(), -1, cnInfo);\r
+                        }\r
+    \r
+                        res->MoveNext();\r
+                    }\r
+                }\r
+            }\r
+            tcServers->Expand(selID);\r
+        }\r
+    }\r
+    else\r
+    {\r
+       selectedConn = NULL;\r
+    }\r
+}\r
+\r
+\r
+wxString dlgSelectDatabase::getConnInfo()\r
+{\r
+    if (selectedConn)\r
+    {\r
+        return selectedConn->getConnectionString();\r
+    }\r
+\r
+    return wxEmptyString;\r
+}\r
+\r
+bool dlgSelectDatabase::getValidConnectionString(wxString connStr, wxString& resultStr)\r
+{\r
+    wxString      user;\r
+    wxString      dbname;\r
+    wxString      host;\r
+    unsigned long port = 0;\r
+    wxString      password;\r
+    unsigned long connection_timeout = 0; \r
+\r
+    wxRegEx propertyExp;\r
+    \r
+    // Remove white-spaces ahead the '="\r
+    bool res = propertyExp.Compile(wxT("(([ ]*[\t]*)+)="));\r
+    propertyExp.ReplaceAll(&connStr, wxT("="));\r
+\r
+    // Remove white-spaces after the '="\r
+    res = propertyExp.Compile(wxT("=(([ ]*[\t]*)+)"));\r
+    propertyExp.ReplaceAll(&connStr, wxT("="));\r
+    wxArrayString tokens = wxStringTokenize(connStr, wxT("\t \n\r"));\r
+\r
+    unsigned int index = 0;\r
+    while (index < tokens.Count())\r
+    {\r
+        wxString prop, value;\r
+        \r
+        // Find pairs\r
+        //   i.e. user=xxx\r
+        //        password=xxx\r
+        wxArrayString pairs = wxStringTokenize(tokens[index++], wxT("="));\r
+\r
+        // pair must exist in pair=value format\r
+        if (pairs.GetCount()!= 2)\r
+            return false;\r
+\r
+        prop=pairs[0];\r
+        value=pairs[1];\r
+\r
+        if (prop.CmpNoCase(wxT("user")) == 0)\r
+            user = value;\r
+        else if (prop.CmpNoCase(wxT("host")) == 0 || prop.CmpNoCase(wxT("hostAddr")) == 0)\r
+            host = value;\r
+        else if (prop.CmpNoCase(wxT("port")) == 0)\r
+        {\r
+            if (!value.ToULong(&port))\r
+                // port must be an unsigned integer\r
+                return false;\r
+        }\r
+        else if (prop.CmpNoCase(wxT("password")) == 0)\r
+            password = value;\r
+        else if (prop.CmpNoCase(wxT("connection_timeout")) == 0)\r
+        {\r
+            if (!value.ToULong(&connection_timeout))\r
+                // connection timeout must be an unsigned interger\r
+                return false;\r
+        }\r
+        else if (prop.CmpNoCase(wxT("dbname")) == 0)\r
+            dbname = value;\r
+        else\r
+            // Not valid property found\r
+            return false;\r
+    }\r
+\r
+    if (dbname.IsEmpty())\r
+        return false;\r
+\r
+    if (!user.IsEmpty())\r
+        resultStr = wxT("user=") + user + wxT(" ");\r
+\r
+    if (!host.IsEmpty())\r
+    {\r
+        resultStr += wxT("host=") + host + wxT(" ");\r
+    }\r
+\r
+\r
+    if (!resultStr.IsEmpty())\r
+        resultStr += wxT(" ");\r
+    resultStr += wxT("dbname=") + dbname + wxT(" ");\r
+\r
+    if (port != 0)\r
+    {\r
+        wxString portStr;\r
+        portStr.Printf(wxT("port=%d"), port);\r
+        resultStr += portStr + wxT(" ");\r
+    }\r
+\r
+\r
+    if (connection_timeout != 0)\r
+    {\r
+        wxString strConnTimeOut;\r
+        strConnTimeOut.Printf(wxT("connection_timeout=%d"), connection_timeout);\r
+        resultStr += strConnTimeOut + wxT(" ");\r
+    }\r
+\r
+    if (!password.IsEmpty())\r
+    {\r
+        resultStr += wxT("password=") + password + wxT(" ");\r
+    }\r
+    \r
+    resultStr = resultStr.Trim();\r
+    \r
+    return true;\r
+}\r
+\r
+dlgSelDBNode::dlgSelDBNode (pgServer *_server, const wxString& _dbname)\r
+{\r
+    server = _server;\r
+    dbname = _dbname;\r
+}\r
+\r
+wxString dlgSelDBNode::getConnectionString()\r
+{\r
+    if (dbname.IsEmpty())\r
+        return wxEmptyString;\r
+\r
+    pgConn *conn = server->connection();\r
+    wxString connStr;\r
+\r
+    if (conn && conn->GetStatus() == PGCONN_OK)\r
+    {\r
+        connStr += wxT("user=") + conn->GetUser() + wxT(" ");\r
+        connStr += wxT("hostaddr=") + conn->GetHostAddress() + wxT(" ");\r
+\r
+        wxString port;\r
+        port.Printf(wxT("port=%d "), conn->GetPort());\r
+        connStr += port;\r
+\r
+        connStr += wxT("dbname=") + dbname;\r
+    }\r
+\r
+    return connStr;\r
+}\r
+\r
index 4364925edd0bf1ff84f47e3957075e4afbc5604b..a38e650398977e9d7d86bb55142b9f9893a10cd7 100644 (file)
@@ -53,7 +53,8 @@ pgadmin3_SOURCES += \
        $(srcdir)/dlg/dlgType.cpp \
        $(srcdir)/dlg/dlgUser.cpp \
        $(srcdir)/dlg/dlgView.cpp \
-       $(srcdir)/dlg/dlgManageMacros.cpp
+       $(srcdir)/dlg/dlgManageMacros.cpp \
+       $(srcdir)/dlg/dlgSelectDatabase.cpp
 
 EXTRA_DIST += \
         $(srcdir)/dlg/module.mk 
index 2b4c81f48971047f3b8479d7d1453d220784e420..e00f5ecc370e98a344996291d379058253fef183 100644 (file)
@@ -39,13 +39,17 @@ public:
     wxString GetHelpPage(bool forCreate) const { return wxT("pgagent-steps"); }
 
 private:
+    void OnSelRemoteConn(wxCommandEvent& ev);
+    void OnSelLocalConn(wxCommandEvent& ev);
+    void OnSelectDatabase(wxCommandEvent &ev);
 
-       virtual bool IsUpToDate();
+    virtual bool IsUpToDate();
 
     long jobId;
     ctlSQLBox *sqlBox;
     pgaStep *step;
     pgaJob *job;
+    bool hasConnStrSupport;
 
     DECLARE_EVENT_TABLE()
 };
index 937778b4cbb42eb949e9ac1aeefe8136a3f4b6cd..42ed1ce209b485462f82de574e651d320d735b8d 100644 (file)
@@ -46,6 +46,8 @@ public:
     void iSetCode(const wxString &s) { code=s; }
     wxString GetDbname() const { return dbname; }
     void iSetDbname(const wxString &s) { dbname=s; }
+    wxString GetConnStr() const { return connstr; }
+    void iSetConnStr(const wxString &s) { connstr=s; }
     wxString GetOnError() const { return onError; }
     void iSetOnError(const wxString &s) { onError=s; }
     wxChar GetOnErrorChar() const { return onErrorChar; }
@@ -53,13 +55,15 @@ public:
        long GetRecId() const { return recId; }
     void iSetRecId(const long l) { recId=l; }
 
+    bool HasConnectionString() const { return !connstr.IsEmpty(); }
+
        bool IsUpToDate();
 
     wxString GetHelpPage(bool forCreate) const { return wxT("pgagent-steps"); }
 
 private:
     bool enabled;
-    wxString kind, code, dbname, onError;
+    wxString kind, code, dbname, connstr, onError;
     wxChar kindChar, onErrorChar;
        long recId;
 };
index da3b1a08c4898ae0cde159a22194fe55dee03f59..c66b900199dbd659d3f7d5d8ff04e43d0d1436d0 100644 (file)
@@ -136,6 +136,8 @@ public:
     pgNotification *GetNotification();
     int GetTxStatus();
 
+    bool TableHasColumn(wxString schemaname, wxString tblname, const wxString& colname);
+
 protected:
     PGconn *conn;
     int lastResultStatus;
index 1cdc077e8d7de3df87037736fcfd528718c1c86d..456b04d8bf437adf9e0c671ffa6d037e37699137 100644 (file)
@@ -62,6 +62,7 @@ public:
     bool IsNull(const int col) const { return (PQgetisnull(res, pos-1, col) != 0); }
     int ColScale(const int col) const;
     int ColNumber(const wxString &colName) const;
+    bool HasColumn(const wxString &colname) const;
 
 
     wxString GetVal(const int col) const;
diff --git a/pgadmin/include/dlg/dlgSelectDatabase.h b/pgadmin/include/dlg/dlgSelectDatabase.h
new file mode 100644 (file)
index 0000000..0254016
--- /dev/null
@@ -0,0 +1,63 @@
+//////////////////////////////////////////////////////////////////////////\r
+//\r
+// pgAdmin III - PostgreSQL Tools\r
+// RCS-ID:      $Id:$\r
+// Copyright (C) 2002 - 2008, The pgAdmin Development Team\r
+// This software is released under the Artistic Licence\r
+//\r
+// dlgSelectDatabase.h - Connect to a database\r
+//\r
+//////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef DLGSELECTDATABASE_H\r
+#define DLGSELECTDATABASE_H\r
+\r
+#include <wx/wx.h>\r
+#include <wx/image.h>\r
+#include <wx/treectrl.h>\r
+\r
+\r
+class pgServer;\r
+\r
+\r
+class dlgSelDBNode : public wxTreeItemData\r
+{\r
+\r
+public:\r
+    dlgSelDBNode(pgServer* server, const wxString& dbname=wxEmptyString);\r
+    dlgSelDBNode* createChild(const wxString& dbName);\r
+\r
+    wxString getDatabase() { return dbname; }\r
+    wxString getConnectionString();\r
+\r
+private:\r
+    pgServer*        server;  // Do not remove it, not owned by this\r
+    wxString         dbname;\r
+\r
+    friend class dlgSelectDatabase;\r
+   \r
+};\r
+\r
+\r
+class dlgSelectDatabase: public wxDialog\r
+{\r
+\r
+public:\r
+    dlgSelectDatabase(wxWindow* parent, int id, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxCLOSE_BOX);\r
+\r
+    wxString getConnInfo();\r
+    static bool getValidConnectionString(wxString connStr, wxString& resultStr);\r
+\r
+protected:\r
+    void Initialize();\r
+    void OnSelect(wxTreeEvent& ev);\r
+    void OnSelActivate(wxTreeEvent& ev);\r
+\r
+    wxTreeCtrl *tcServers;\r
+    dlgSelDBNode *selectedConn;\r
+\r
+    DECLARE_EVENT_TABLE()\r
+};\r
+\r
+#endif\r
+\r
index b8423bec046209b46b03c9d7611bab6a85ed569e..f8f9535cbf0bb9e3216bf5f05d8781f9f3e475cd 100644 (file)
@@ -52,7 +52,8 @@ pgadmin3_SOURCES += \
        $(srcdir)/include/dlg/dlgType.h \
        $(srcdir)/include/dlg/dlgUser.h \
        $(srcdir)/include/dlg/dlgView.h \
-       $(srcdir)/include/dlg/dlgManageMacros.h
+       $(srcdir)/include/dlg/dlgManageMacros.h \
+       $(srcdir)/include/dlg/dlgSelectDatabase.h
 
 EXTRA_DIST += \
         $(srcdir)/include/dlg/module.mk
index b168d9e4a4b6a8785b4593b23b896356c46afff6..63513b40ed512ea67ad42b08f237641ae3a20db2 100644 (file)
@@ -91,6 +91,7 @@
 #include "dlg/dlgRule.h"\r
 #include "dlg/dlgSchema.h"\r
 #include "dlg/dlgSelectConnection.h"\r
+#include "dlg/dlgSelectDatabase.h"\r
 #include "dlg/dlgSequence.h"\r
 #include "dlg/dlgServer.h"\r
 #include "dlg/dlgSynonym.h"\r
index b8bec3539eaaef4edee677f8a9c56ccffadafa53..6e21bb420b5325a80092196d1719129c50250beb 100644 (file)
                                RelativePath=".\dlg\dlgSelectConnection.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath=".\dlg\dlgSelectDatabase.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath=".\dlg\dlgSequence.cpp"\r
                                >\r
                                        RelativePath=".\include\dlg\dlgSelectConnection.h"\r
                                        >\r
                                </File>\r
+                               <File\r
+                                       RelativePath=".\include\dlg\dlgSelectDatabase.h"\r
+                                       >\r
+                               </File>\r
                                <File\r
                                        RelativePath=".\include\dlg\dlgSequence.h"\r
                                        >\r
index 2cfba66ba828dfdfdc22219c55e666c130dd75ad..4a4580e951d6f370bcaf71390268071a148c9655 100644 (file)
             <object class="wxPanel" name="pnlProperties">
               <object class="wxFlexGridSizer">
                 <cols>2</cols>
-                <rows>6</rows>
+                <rows>8</rows>
                 <vgap>5</vgap>
                 <hgap>5</hgap>
-                <growablerows>5</growablerows>
+                <growablerows>7</growablerows>
                 <growablecols>1</growablecols>
                 <object class="sizeritem">
                   <object class="wxStaticText" name="stName">
@@ -30,8 +30,7 @@
                   <border>4</border>
                 </object>
                 <object class="sizeritem">
-                  <object class="wxTextCtrl" name="txtName">
-                  </object>
+                  <object class="wxTextCtrl" name="txtName"/>
                   <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
                   <border>4</border>
                 </object>
@@ -43,8 +42,7 @@
                   <border>4</border>
                 </object>
                 <object class="sizeritem">
-                  <object class="wxTextCtrl" name="txtID">
-                  </object>
+                  <object class="wxTextCtrl" name="txtID"/>
                   <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
                   <border>4</border>
                 </object>
                   <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
                   <border>4</border>
                 </object>
+                <object class="sizeritem">
+                  <object class="wxStaticText" name="stConnType">
+                    <label>Connection Type</label>
+                    <flag>wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+                  </object>
+                  <flag>wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+                  <border>4</border>
+                </object>
+                <object class="sizeritem">
+                  <option>1</option>
+                  <object class="wxGridSizer">
+                    <hgap>0</hgap>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <vgap>0</vgap>
+                    <object class="sizeritem">
+                      <object class="wxRadioButton" name="rbLocalConn">
+                        <style>wxRB_GROUP</style>
+                        <label>Local</label>
+                        <enable>0</enable>
+                      </object>
+                      <flag>wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+                    </object>
+                    <object class="sizeritem">
+                      <object class="wxRadioButton" name="rbRemoteConn">
+                        <label>Remote</label>
+                        <enable>0</enable>
+                      </object>
+                      <flag>wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+                    </object>
+                  </object>
+                  <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+                  <border>4</border>
+                </object>
                 <object class="sizeritem">
                   <object class="wxStaticText" name="stDatabase">
                     <label>Database</label>
+                    <flag>wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
                   </object>
                   <flag>wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
                   <border>4</border>
                   <object class="wxComboBox" name="cbDatabase">
                     <content/>
                     <style>wxCB_READONLY|wxCB_DROPDOWN</style>
+                    <enable>0</enable>
+                  </object>
+                  <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+                  <border>4</border>
+                </object>
+                <object class="sizeritem">
+                  <object class="wxBoxSizer">
+                    <orient>wxVERTICAL</orient>
+                    <object class="sizeritem">
+                      <object class="wxStaticText" name="stConnStr">
+                        <label>Connection String</label>
+                        <flag>wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+                      </object>
+                      <flag>wxALIGN_TOP|wxTOP|wxLEFT|wxRIGHT</flag>
+                      <border>4</border>
+                    </object>
+                  </object>
+                  <flag>wxTOP</flag>
+                  <border>4</border>
+                </object>
+                <object class="sizeritem">
+                  <object class="wxFlexGridSizer">
+                    <hgap>0</hgap>
+                    <vgap>0</vgap>
+                    <cols>2</cols>
+                    <rows>1</rows>
+                    <growablerows></growablerows>
+                    <growablecols>0</growablecols>
+                    <object class="sizeritem">
+                      <object class="wxTextCtrl" name="txtConnStr">
+                        <enable>0</enable>
+                      </object>
+                      <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+                    </object>
+                    <object class="sizeritem">
+                      <object class="wxButton" name="btnSelDatabase">
+                        <label>...</label>
+                        <enable>0</enable>
+                        <size>15,-1d</size>
+                      </object>
+                    </object>
                   </object>
                   <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
                   <border>4</border>
       </object>
     </object>
   </object>
-</resource>
+</resource>
\ No newline at end of file
index f15228726e04f893292fe68005127610c816f278..e93fa6286250cc7d289897c69c5e1bbfd73f881e 100644 (file)
@@ -16196,7 +16196,7 @@ static unsigned char xml_res_file_44[] = {
 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_45 = 7601;
+static size_t xml_res_size_45 = 11122;
 static unsigned char xml_res_file_45[] = {
 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,
@@ -16233,12 +16233,12 @@ static unsigned char xml_res_file_45[] = {
 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,32,32,
 32,32,32,32,60,99,111,108,115,62,50,60,47,99,111,108,115,62,10,32,32,32,
-32,32,32,32,32,32,32,32,32,32,32,32,32,60,114,111,119,115,62,54,60,47,114,
+32,32,32,32,32,32,32,32,32,32,32,32,32,60,114,111,119,115,62,56,60,47,114,
 111,119,115,62,10,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,60,104,103,97,112,62,53,60,47,104,103,97,112,62,10,
 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,103,114,111,119,97,98,
-108,101,114,111,119,115,62,53,60,47,103,114,111,119,97,98,108,101,114,111,
+108,101,114,111,119,115,62,55,60,47,103,114,111,119,97,98,108,101,114,111,
 119,115,62,10,32,32,32,32,32,32,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,32,32,32,32,32,32,
@@ -16327,28 +16327,15 @@ static unsigned char xml_res_file_45[] = {
 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,83,116,97,116,105,99,84,101,120,116,34,32,110,97,
-109,101,61,34,115,116,68,97,116,97,98,97,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,68,
-97,116,97,98,97,115,101,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,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,65,76,73,71,78,95,67,69,78,84,82,69,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,111,109,98,111,
-66,111,120,34,32,110,97,109,101,61,34,99,98,68,97,116,97,98,97,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,
-99,111,110,116,101,110,116,47,62,10,32,32,32,32,32,32,32,32,32,32,32,32,
-32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,67,66,95,82,69,
-65,68,79,78,76,89,124,119,120,67,66,95,68,82,79,80,68,79,87,78,60,47,115,
-116,121,108,101,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,
+109,101,61,34,115,116,67,111,110,110,84,121,112,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,
+67,111,110,110,101,99,116,105,111,110,32,84,121,112,101,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,102,108,97,103,62,119,120,65,76,73,71,78,95,67,69,78,84,82,69,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,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,65,76,73,71,78,95,67,69,78,84,82,69,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,
@@ -16356,195 +16343,367 @@ static unsigned char xml_res_file_45[] = {
 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,82,97,100,105,111,66,
-111,120,34,32,110,97,109,101,61,34,114,98,120,75,105,110,100,34,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,110,
-116,101,110,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,105,116,101,109,62,83,81,76,60,47,105,116,101,109,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,
-105,116,101,109,62,66,97,116,99,104,60,47,105,116,101,109,62,10,32,32,32,
-32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,99,111,110,116,
-101,110,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
-32,32,60,115,101,108,101,99,116,105,111,110,62,48,60,47,115,101,108,101,
-99,116,105,111,110,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,75,105,110,100,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,
-100,105,109,101,110,115,105,111,110,62,49,60,47,100,105,109,101,110,115,
-105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
-32,32,60,115,116,121,108,101,62,119,120,82,65,95,83,80,69,67,73,70,89,95,
-67,79,76,83,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,
+34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,
+116,105,111,110,62,49,60,47,111,112,116,105,111,110,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,71,114,105,100,83,105,122,101,114,34,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,48,60,47,104,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,114,111,119,115,62,49,60,47,114,111,119,115,
+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,50,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,48,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,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,82,97,100,105,111,66,117,116,116,111,110,34,32,110,97,109,101,61,34,
+114,98,76,111,99,97,108,67,111,110,110,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,115,116,121,108,101,
+62,119,120,82,66,95,71,82,79,85,80,60,47,115,116,121,108,101,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,76,111,99,97,108,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,32,32,60,101,110,
+97,98,108,101,62,48,60,47,101,110,97,98,108,101,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,65,76,73,71,78,95,67,69,78,84,82,69,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,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,82,97,100,
+105,111,66,117,116,116,111,110,34,32,110,97,109,101,61,34,114,98,82,101,
+109,111,116,101,67,111,110,110,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,82,101,109,
+111,116,101,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,32,32,60,101,110,97,98,108,101,62,48,
+60,47,101,110,97,98,108,101,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,65,76,73,71,78,95,67,69,78,84,82,69,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,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,82,69,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,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61,
+34,115,116,68,97,116,97,98,97,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,68,97,116,97,
+98,97,115,101,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,102,108,97,103,62,119,120,65,76,73,
+71,78,95,67,69,78,84,82,69,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,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,65,76,73,71,78,95,67,69,78,84,82,69,
+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,111,109,98,111,66,111,120,34,32,110,97,109,101,61,34,99,98,
+68,97,116,97,98,97,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,99,111,110,116,101,110,116,47,62,10,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,
+62,119,120,67,66,95,82,69,65,68,79,78,76,89,124,119,120,67,66,95,68,82,
+79,80,68,79,87,78,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,32,60,101,110,97,98,108,101,62,48,60,
+47,101,110,97,98,108,101,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,82,69,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,66,111,120,
+83,105,122,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,32,32,60,111,114,105,101,110,116,62,119,120,86,69,82,84,73,67,
+65,76,60,47,111,114,105,101,110,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,83,116,97,116,105,99,84,101,120,116,
+34,32,110,97,109,101,61,34,115,116,67,111,110,110,83,116,114,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,111,110,110,101,99,116,105,111,110,32,83,116,114,
+105,110,103,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,32,32,60,102,108,97,103,62,119,120,
 65,76,73,71,78,95,67,69,78,84,82,69,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,82,97,100,105,111,66,111,
-120,34,32,110,97,109,101,61,34,114,98,120,79,110,69,114,114,111,114,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,79,110,32,101,114,114,111,114,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,115,
-101,108,101,99,116,105,111,110,62,48,60,47,115,101,108,101,99,116,105,111,
-110,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,110,116,101,110,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,105,116,101,109,62,70,97,105,108,60,47,105,
-116,101,109,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,105,116,101,109,62,83,117,99,99,101,101,100,60,47,105,116,
-101,109,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,105,116,101,109,62,73,103,110,111,114,101,60,47,105,116,101,
-109,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,
-47,99,111,110,116,101,110,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,
-32,32,32,32,32,32,32,32,60,100,105,109,101,110,115,105,111,110,62,49,60,
-47,100,105,109,101,110,115,105,111,110,62,10,32,32,32,32,32,32,32,32,32,
-32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,82,65,
-95,83,80,69,67,73,70,89,95,67,79,76,83,60,47,115,116,121,108,101,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,82,69,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,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,65,
+76,73,71,78,95,84,79,80,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,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,83,116,97,116,105,99,84,101,120,116,34,
-32,110,97,109,101,61,34,115,116,67,111,109,109,101,110,116,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,67,111,109,109,101,110,116,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,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,65,76,73,71,78,95,67,69,78,84,82,69,95,86,69,82,84,73,
-67,65,76,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,
+97,103,62,119,120,84,79,80,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,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,32,32,32,32,32,32,32,32,32,32,60,104,103,97,
+112,62,48,60,47,104,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,118,103,97,112,62,48,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,99,111,
+108,115,62,50,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,114,111,119,115,62,49,60,47,114,111,119,
+115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,
+103,114,111,119,97,98,108,101,114,111,119,115,47,62,10,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,103,114,111,119,97,98,108,
+101,99,111,108,115,62,48,60,47,103,114,111,119,97,98,108,101,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,
+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,84,101,120,116,67,116,114,108,34,32,110,97,109,101,61,34,116,120,116,
+67,111,110,110,83,116,114,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,101,110,97,98,108,101,62,48,60,47,
+101,110,97,98,108,101,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,82,69,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,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,66,117,116,
+116,111,110,34,32,110,97,109,101,61,34,98,116,110,83,101,108,68,97,116,
+97,98,97,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,32,32,32,32,60,108,97,98,101,108,62,46,46,46,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,32,32,60,101,110,97,98,108,101,62,48,60,47,101,110,97,98,108,
+101,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,115,105,122,101,62,49,53,44,45,49,100,60,47,115,105,122,101,
+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,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,82,
+69,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,84,101,120,116,67,116,114,108,34,32,110,97,109,101,61,34,
-116,120,116,67,111,109,109,101,110,116,34,62,10,32,32,32,32,32,32,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,60,47,115,116,121,108,101,62,10,32,32,
+61,34,119,120,82,97,100,105,111,66,111,120,34,32,110,97,109,101,61,34,114,
+98,120,75,105,110,100,34,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,110,116,101,110,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,105,116,101,109,62,83,
+81,76,60,47,105,116,101,109,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,105,116,101,109,62,66,97,116,99,104,60,47,
+105,116,101,109,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,60,47,99,111,110,116,101,110,116,62,10,32,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,60,115,101,108,101,99,116,105,111,110,
+62,48,60,47,115,101,108,101,99,116,105,111,110,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,75,105,
+110,100,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,100,105,109,101,110,115,105,111,110,62,49,
+60,47,100,105,109,101,110,115,105,111,110,62,10,32,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,82,
+65,95,83,80,69,67,73,70,89,95,67,79,76,83,60,47,115,116,121,108,101,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,65,76,73,71,78,95,67,69,78,84,82,69,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,
+82,97,100,105,111,66,111,120,34,32,110,97,109,101,61,34,114,98,120,79,110,
+69,114,114,111,114,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,79,110,32,101,114,114,111,114,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,115,101,108,101,99,116,105,111,110,62,48,60,47,115,101,
+108,101,99,116,105,111,110,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,110,116,101,110,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,105,116,101,109,62,
+70,97,105,108,60,47,105,116,101,109,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,105,116,101,109,62,83,117,99,99,
+101,101,100,60,47,105,116,101,109,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,105,116,101,109,62,73,103,110,111,114,
+101,60,47,105,116,101,109,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,60,47,99,111,110,116,101,110,116,62,10,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,100,105,109,101,110,
+115,105,111,110,62,49,60,47,100,105,109,101,110,115,105,111,110,62,10,32,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,
+108,101,62,119,120,82,65,95,83,80,69,67,73,70,89,95,67,79,76,83,60,47,115,
+116,121,108,101,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,82,69,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,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,82,69,95,86,69,82,84,73,67,65,76,124,119,120,65,76,76,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,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,68,101,102,105,110,105,116,
-105,111,110,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,80,97,
-110,101,108,34,32,110,97,109,101,61,34,112,110,108,68,101,102,105,110,105,
-116,105,111,110,34,62,10,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,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,32,
-32,32,32,32,32,60,99,111,108,115,62,49,60,47,99,111,108,115,62,10,32,32,
-32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,114,111,119,115,62,49,60,47,
-114,111,119,115,62,10,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,60,104,103,97,112,62,53,60,47,104,103,97,112,62,
-10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,103,114,111,119,97,
-98,108,101,114,111,119,115,62,48,60,47,103,114,111,119,97,98,108,101,114,
-111,119,115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,103,
-114,111,119,97,98,108,101,99,111,108,115,62,48,60,47,103,114,111,119,97,
-98,108,101,99,111,108,115,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,84,101,120,116,67,116,114,108,34,32,110,97,109,101,61,34,116,120,116,
-83,113,108,66,111,120,34,62,10,32,32,32,32,32,32,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,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,
+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,83,116,97,116,105,99,
+84,101,120,116,34,32,110,97,109,101,61,34,115,116,67,111,109,109,101,110,
+116,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,67,111,109,109,101,110,116,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,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,65,76,73,71,78,95,67,69,78,84,82,69,
+95,86,69,82,84,73,67,65,76,124,119,120,65,76,76,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,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,82,69,95,86,
-69,82,84,73,67,65,76,124,119,120,65,76,76,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,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,84,101,120,116,67,116,114,108,34,32,110,
+97,109,101,61,34,116,120,116,67,111,109,109,101,110,116,34,62,10,32,32,
+32,32,32,32,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,60,47,115,116,121,108,
+101,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,82,69,95,86,69,82,84,73,67,65,76,124,119,120,65,
+76,76,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,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,68,101,
+102,105,110,105,116,105,111,110,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,80,97,110,101,108,34,32,110,97,109,101,61,34,112,110,108,
+68,101,102,105,110,105,116,105,111,110,34,62,10,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,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,32,32,32,32,32,32,60,99,111,108,115,62,49,60,47,99,
+111,108,115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,114,
+111,119,115,62,49,60,47,114,111,119,115,62,10,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,60,104,103,97,112,62,53,
+60,47,104,103,97,112,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,60,103,114,111,119,97,98,108,101,114,111,119,115,62,48,60,47,103,114,
+111,119,97,98,108,101,114,111,119,115,62,10,32,32,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,60,103,114,111,119,97,98,108,101,99,111,108,115,62,
+48,60,47,103,114,111,119,97,98,108,101,99,111,108,115,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,84,101,120,116,67,116,114,108,34,32,110,
+97,109,101,61,34,116,120,116,83,113,108,66,111,120,34,62,10,32,32,32,32,
+32,32,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,60,47,115,116,121,108,101,
+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,82,69,95,86,69,82,84,73,67,65,76,124,119,120,65,76,
+76,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,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,69,88,80,65,78,68,124,
+119,120,65,76,73,71,78,95,67,69,78,84,82,69,124,119,120,65,76,76,60,47,
+102,108,97,103,62,10,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,
+62,51,60,47,98,111,114,100,101,114,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,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,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,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,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,69,88,80,65,78,68,124,119,120,
+65,76,76,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,51,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,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,69,88,80,65,78,68,124,119,120,65,76,73,71,78,95,67,69,78,84,
-82,69,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,
-32,32,60,98,111,114,100,101,114,62,51,60,47,98,111,114,100,101,114,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,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,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,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,60,47,111,98,106,101,99,116,
+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,100,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,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,
 69,88,80,65,78,68,124,119,120,65,76,76,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,51,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,100,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,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,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,69,88,80,65,78,68,124,119,120,65,76,76,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,51,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,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,69,88,80,65,78,
-68,124,119,120,65,76,76,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,51,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,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,
-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,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,83,116,97,116,117,115,
-66,97,114,34,32,110,97,109,101,61,34,117,110,107,83,116,97,116,117,115,
-66,97,114,34,62,10,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,
-62,119,120,83,84,95,83,73,90,69,71,82,73,80,60,47,115,116,121,108,101,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,
-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,32,32,60,98,111,114,100,101,114,62,51,60,47,98,111,114,100,101,
-114,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};
+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,69,88,80,65,78,68,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,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,83,116,97,116,117,115,66,97,114,34,32,110,97,109,101,
+61,34,117,110,107,83,116,97,116,117,115,66,97,114,34,62,10,32,32,32,32,
+32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,83,84,95,83,73,90,69,
+71,82,73,80,60,47,115,116,121,108,101,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,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,32,32,60,98,111,114,
+100,101,114,62,51,60,47,98,111,114,100,101,114,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_46 = 7395;
 static unsigned char xml_res_file_46[] = {