From 28c6849462fee10310a9863761c04581f14b76bc Mon Sep 17 00:00:00 2001 From: Gridcoin Date: Thu, 21 Jul 2016 18:41:57 -0500 Subject: [PATCH] 3.5.7.0-Leisure Gridcoin Research 3.5.7.0/MSI=40.5 Leisure Upgrade - Advanced | Foundation | Expense Reimbursement Request: Added Username maintenance page to set your username. Added Expense Amount to Add, View and List pages. Fixed Expense Title width. Corrected problem with submitting new expenses (preventing the Expense View page from working). - Fixed GRCRestarter block downloader percentage value (where it could exceed 100%). - Block Syncing: Fixed a long standing bug where the wallet randomly stops asking for the best block. Additionally, when out of sync it will ask for missing blocks periodically. Made wallet more aware of clusters of orphans. - Added 'execute restartclient' for windows for debugging. - Modified getmininginfo and overview for Investors to say Staking Interest (instead of Boinc Mining) and removed Boinc Projects Exhaused for Investors. Removed Unable To Mine message for Investors. - Moved unecessary logging to fDebug10=true. Added message to show the condition when Process Block succeeds and Set Best Chain fails. - Added execute askforoutstandingblocks for debugging. --- Makefile.Debug | 1 - Makefile.Release | 1 - .../GRCRestarter/GridcoinUpgrader.vb | 9 +- .../GridcoinInstaller/GridcoinResearch.vdproj | 8 +- .../Installer/boinc/boinc/boincstake.vbproj | 10 + .../boinc/boinc/frmAddExpense.Designer.vb | 2 +- .../Installer/boinc/boinc/frmAddExpense.vb | 26 +- .../boinc/boinc/frmFoundation.Designer.vb | 10 +- .../Installer/boinc/boinc/frmFoundation.vb | 12 +- .../boinc/boinc/frmUsername.Designer.vb | 95 +++++ .../Installer/boinc/boinc/frmUsername.resx | 377 ++++++++++++++++++ contrib/Installer/boinc/boinc/frmUsername.vb | 19 + src/checkpoints.cpp | 2 +- src/clientversion.h | 4 +- src/init.cpp | 8 +- src/main.cpp | 220 +++++++--- src/main.h | 1 + src/miner.cpp | 2 +- src/net.cpp | 18 +- src/net.h | 2 +- src/qt/bitcoin.cpp | 1 + src/qt/bitcoingui.cpp | 4 +- src/rpcblockchain.cpp | 43 ++ src/rpcnet.cpp | 2 +- src/sql.cpp | 2 +- 25 files changed, 762 insertions(+), 117 deletions(-) create mode 100644 contrib/Installer/boinc/boinc/frmUsername.Designer.vb create mode 100644 contrib/Installer/boinc/boinc/frmUsername.resx create mode 100644 contrib/Installer/boinc/boinc/frmUsername.vb diff --git a/Makefile.Debug b/Makefile.Debug index 7202564592..d582540d57 100644 --- a/Makefile.Debug +++ b/Makefile.Debug @@ -1,6 +1,5 @@ ############################################################################# # Makefile for building: gridcoinresearch -# Generated by qmake (2.01a) (Qt 4.8.4) on: Sun Jul 10 18:30:27 2016 # Project: gridcoinresearch.pro # Template: app ############################################################################# diff --git a/Makefile.Release b/Makefile.Release index c546b16714..2ea88dc59d 100644 --- a/Makefile.Release +++ b/Makefile.Release @@ -1,6 +1,5 @@ ############################################################################# # Makefile for building: gridcoinresearch -# Generated by qmake (2.01a) (Qt 4.8.4) on: Sun Jul 10 18:30:28 2016 # Project: gridcoinresearch.pro # Template: app ############################################################################# diff --git a/contrib/Installer/GRCRestarter/GRCRestarter/GRCRestarter/GridcoinUpgrader.vb b/contrib/Installer/GRCRestarter/GRCRestarter/GRCRestarter/GridcoinUpgrader.vb index b9d8da20be..0900bea15c 100644 --- a/contrib/Installer/GRCRestarter/GRCRestarter/GRCRestarter/GridcoinUpgrader.vb +++ b/contrib/Installer/GRCRestarter/GRCRestarter/GRCRestarter/GridcoinUpgrader.vb @@ -139,23 +139,24 @@ Public Class GridcoinUpgrader rtbNotes.Visible = False Me.Height = rtbNotes.Top + txtStatus.Height - 25 Me.BackgroundImageLayout = ImageLayout.Tile - - RefreshScreen() ProgressBar1.Maximum = 100 TimerUE.Enabled = True Dim sz As Long sz = GetWebFileSize("snapshot.zip", "signed", True) - If sz < 20000000 Then sz = 477461000 + If sz < 20000000 Then sz = 500461000 'If we dont receive the filesize... 'This is an asynchronous process: DownloadBlocks("snapshot.zip", "signed/") While Not mbFinished System.Threading.Thread.Sleep(800) Dim p As Double = 0 p = Math.Round(GetFilePercent("snapshot.zip", sz) * 100, 2) + If p > 99.99 Then p = 99.99 lblPercent.Text = Trim(p) + "%" RefreshScreen() End While + lblPercent.Text = "100.00%" + RefreshScreen() TimerUE.Enabled = False txtStatus.Text = "Unzipping Blocks File..." RefreshScreen() @@ -180,7 +181,7 @@ Public Class GridcoinUpgrader Me.Show() txtStatus.Text = "Waiting for Gridcoin Wallet to exit..." Me.Update() : Me.Refresh() - BusyWaitLoop("gridcoinresearch*", 10, True) + BusyWaitLoop("gridcoinresearch*", 12, True) StartGridcoin() Environment.Exit(0) End diff --git a/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj b/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj index 73b26377b6..43b8a0fd33 100644 --- a/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj +++ b/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj @@ -1120,19 +1120,19 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Gridcoin Research" - "ProductCode" = "8:{1B5B36AC-1133-4B90-9DDD-FB78D681EF74}" - "PackageCode" = "8:{0FEACEFB-73C9-48EB-A9A6-1B764B5D1225}" + "ProductCode" = "8:{E6621A89-4C37-45A1-AC3F-DD5E299C02C9}" + "PackageCode" = "8:{BC3D09B4-C005-4A03-AB29-585E10E7FEA5}" "UpgradeCode" = "8:{9617E9EA-252F-43CE-B53E-B48C85F71192}" "AspNetVersion" = "8:4.0.30319.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:FALSE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:40.4" + "ProductVersion" = "8:40.5" "Manufacturer" = "8:GridcoinResearch" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" - "Title" = "8:Gridcoin Research 40.4" + "Title" = "8:Gridcoin Research 40.5" "Subject" = "8:" "ARPCONTACT" = "8:The Gridcoin Developers" "Keywords" = "8:Gridcoin Research" diff --git a/contrib/Installer/boinc/boinc/boincstake.vbproj b/contrib/Installer/boinc/boinc/boincstake.vbproj index cc8a99f317..cc65056946 100644 --- a/contrib/Installer/boinc/boinc/boincstake.vbproj +++ b/contrib/Installer/boinc/boinc/boincstake.vbproj @@ -96,6 +96,12 @@ + + frmUsername.vb + + + Form + frmDiagnostics.vb @@ -293,6 +299,10 @@ + + frmUsername.vb + Designer + frmDiagnostics.vb diff --git a/contrib/Installer/boinc/boinc/frmAddExpense.Designer.vb b/contrib/Installer/boinc/boinc/frmAddExpense.Designer.vb index f32f55b1e9..e2b9062a5b 100644 --- a/contrib/Installer/boinc/boinc/frmAddExpense.Designer.vb +++ b/contrib/Installer/boinc/boinc/frmAddExpense.Designer.vb @@ -334,7 +334,7 @@ Partial Class frmAddExpense Me.Controls.Add(Me.rtbNotes) Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) Me.Name = "frmAddExpense" - Me.Text = "Gridcoin Foundation - Expense/New Campaign Submission Form 1.0" + Me.Text = "Gridcoin Foundation - Expense/New Campaign Submission Form 1.1" Me.GroupBox1.ResumeLayout(False) Me.GroupBox1.PerformLayout() Me.ResumeLayout(False) diff --git a/contrib/Installer/boinc/boinc/frmAddExpense.vb b/contrib/Installer/boinc/boinc/frmAddExpense.vb index 77500e9d4a..43ae36d4be 100644 --- a/contrib/Installer/boinc/boinc/frmAddExpense.vb +++ b/contrib/Installer/boinc/boinc/frmAddExpense.vb @@ -11,16 +11,14 @@ Public Class frmAddExpense Private Sub frmTicketAdd_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load mGRCData = New GRCSec.GridcoinData - sHandle = mGRCData.GetHandle(GetSessionGuid) - + sHandle = KeyValue("TicketHandle") Try If Mode <> "View" Then - If sHandle = "" Or mGRCData.IsAuthenticated(GetSessionGuid) = False Then - If mfrmLogin Is Nothing Then - mfrmLogin = New frmLogin - End If - mfrmLogin.Show() + If sHandle = "" Then + MsgBox("Click to populate your GridCoin Username.", MsgBoxStyle.Critical) + Dim frmU As New frmUserName + frmU.Show() Me.Dispose() Exit Sub End If @@ -32,6 +30,10 @@ Public Class frmAddExpense If Mode = "View" Then 'Depersist from GFS Dim oExpense As SqlDataReader = mGRCData.GetBusinessObject("Expense", txtTicketId.Text, "ExpenseID") + If oExpense.HasRows = False Then + MsgBox("Sorry, this expense does not exist.", MsgBoxStyle.Critical) + Exit Sub + End If txtDescription.Text = oExpense("Descript") txtAmount.Text = Trim(oExpense("Amount")) txtAttachment.Text = Trim("" & oExpense("AttachmentName")) @@ -148,12 +150,10 @@ Public Class frmAddExpense Exit Sub End If 'if they are not logged on... throw an error ... 4-22-2016 - If sHandle = "" Or mGRCData.IsAuthenticated(GetSessionGuid) = False Then - MsgBox("Please authenticate first. After logging in you may re-submit the form.", MsgBoxStyle.Critical, "Not Logged In") - If mfrmLogin Is Nothing Then - mfrmLogin = New frmLogin - End If - mfrmLogin.Show() + If sHandle = "" Then + MsgBox("Please create a user name first. After logging in you may re-submit the form.", MsgBoxStyle.Critical, "Not Logged In") + Dim frmU1 As New frmUserName + frmU1.Show() Exit Sub End If diff --git a/contrib/Installer/boinc/boinc/frmFoundation.Designer.vb b/contrib/Installer/boinc/boinc/frmFoundation.Designer.vb index ce5b93861d..4e7268be10 100644 --- a/contrib/Installer/boinc/boinc/frmFoundation.Designer.vb +++ b/contrib/Installer/boinc/boinc/frmFoundation.Designer.vb @@ -48,7 +48,7 @@ Partial Class frmFoundation Me.gbResultsPane.ForeColor = System.Drawing.Color.Lime Me.gbResultsPane.Location = New System.Drawing.Point(12, 27) Me.gbResultsPane.Name = "gbResultsPane" - Me.gbResultsPane.Size = New System.Drawing.Size(1367, 588) + Me.gbResultsPane.Size = New System.Drawing.Size(1442, 588) Me.gbResultsPane.TabIndex = 2 Me.gbResultsPane.TabStop = False Me.gbResultsPane.Text = "Active Expense Approvals - (Right Click to Vote)" @@ -93,7 +93,7 @@ Partial Class frmFoundation DataGridViewCellStyle5.BackColor = System.Drawing.Color.Black DataGridViewCellStyle5.ForeColor = System.Drawing.Color.Lime Me.dgv.RowsDefaultCellStyle = DataGridViewCellStyle5 - Me.dgv.Size = New System.Drawing.Size(1342, 567) + Me.dgv.Size = New System.Drawing.Size(1430, 567) Me.dgv.TabIndex = 0 ' 'MenuStrip1 @@ -101,7 +101,7 @@ Partial Class frmFoundation Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ExpensesToolStripMenuItem, Me.AuthenticationToolStripMenuItem}) Me.MenuStrip1.Location = New System.Drawing.Point(0, 0) Me.MenuStrip1.Name = "MenuStrip1" - Me.MenuStrip1.Size = New System.Drawing.Size(1391, 24) + Me.MenuStrip1.Size = New System.Drawing.Size(1454, 24) Me.MenuStrip1.TabIndex = 3 Me.MenuStrip1.Text = "MenuStrip1" ' @@ -148,13 +148,13 @@ Partial Class frmFoundation Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.BackColor = System.Drawing.Color.Black - Me.ClientSize = New System.Drawing.Size(1391, 665) + Me.ClientSize = New System.Drawing.Size(1454, 665) Me.Controls.Add(Me.gbResultsPane) Me.Controls.Add(Me.MenuStrip1) Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) Me.MainMenuStrip = Me.MenuStrip1 Me.Name = "frmFoundation" - Me.Text = "Gridcoin Foundation - 1.0" + Me.Text = "Gridcoin Foundation - 1.1" Me.gbResultsPane.ResumeLayout(False) CType(Me.dgv, System.ComponentModel.ISupportInitialize).EndInit() Me.MenuStrip1.ResumeLayout(False) diff --git a/contrib/Installer/boinc/boinc/frmFoundation.vb b/contrib/Installer/boinc/boinc/frmFoundation.vb index 4dc12ba5e1..16bd20773b 100644 --- a/contrib/Installer/boinc/boinc/frmFoundation.vb +++ b/contrib/Installer/boinc/boinc/frmFoundation.vb @@ -27,10 +27,7 @@ Public Class frmFoundation dgv.ReadOnly = True Dim vHeading() As String = Split(sHeading, ";") - PopulateHeadings(vHeading, dgv, True) - '4-22-2016 - Dim iRow As Long = 0 Dim vPolls() As String = Split(sVoting, "") @@ -39,6 +36,8 @@ Public Class frmFoundation For y As Integer = 0 To UBound(vPolls) vPolls(y) = Replace(vPolls(y), "_", " ") Dim sTitle As String = ExtractXML(vPolls(y), "", "") + sTitle = Replace(sTitle, "expensesubmission", "Expense Submission: ") + Dim sExpiration As String = ExtractXML(vPolls(y), "") Dim sShareType As String = ExtractXML(vPolls(y), "") Dim sQuestion As String = ExtractXML(vPolls(y), "") @@ -46,7 +45,7 @@ Public Class frmFoundation Dim sId As String = GetFoundationGuid(sTitle) If Len(sId) > 0 Then Dim lDateDiff As Long = DateDiff(DateInterval.Day, Now, GlobalCDate(sExpiration)) - If Len(sTitle) > 0 And lDateDiff > -7 Then + If Len(sTitle) > 0 And lDateDiff > -7 And Not sTitle.Contains("00000") Then 'Array of answers Dim sArrayOfAnswers As String = ExtractXML(vPolls(y), "") Dim vAnswers() As String = Split(sArrayOfAnswers, "") @@ -54,7 +53,6 @@ Public Class frmFoundation Dim sAnswerName As String = ExtractXML(vAnswers(subY), "") Dim sParticipants As String = ExtractXML(vAnswers(subY), "") Dim sShares As String = ExtractXML(vAnswers(subY), "") - Next Dim sTotalParticipants As String = ExtractXML(vPolls(y), "") Dim sTotalShares As String = ExtractXML(vPolls(y), "") @@ -62,7 +60,6 @@ Public Class frmFoundation dgv.Rows.Add() dgv.Rows(iRow).Cells(0).Value = iRow + 1 dgv.Rows(iRow).Cells(1).Value = sTitle - ' If Len(sTitle) > 65 Then dgv.Rows(iRow).Cells(1).Value += "..." dgv.Rows(iRow).Cells(2).Value = sExpiration If lDateDiff < 0 Then dgv.Rows(iRow).Cells(2).Style.BackColor = Drawing.Color.Red dgv.Rows(iRow).Cells(3).Value = sShareType @@ -88,7 +85,7 @@ Public Class frmFoundation Next dgv.Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.None - dgv.Columns(1).Width = 350 + dgv.Columns(1).Width = 425 Catch ex As Exception Log(ex.Message) @@ -171,6 +168,7 @@ Public Class frmFoundation Catch ex As Exception Log("guid " + ex.Message) End Try + frmE.myGuid = sGuid frmE.Show() End If diff --git a/contrib/Installer/boinc/boinc/frmUsername.Designer.vb b/contrib/Installer/boinc/boinc/frmUsername.Designer.vb new file mode 100644 index 0000000000..c254eeabcd --- /dev/null +++ b/contrib/Installer/boinc/boinc/frmUsername.Designer.vb @@ -0,0 +1,95 @@ + _ +Partial Class frmUserName + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmUserName)) + Me.btnAddAttachment = New System.Windows.Forms.Button() + Me.txtUserName = New System.Windows.Forms.TextBox() + Me.Label9 = New System.Windows.Forms.Label() + Me.Label1 = New System.Windows.Forms.Label() + Me.SuspendLayout() + ' + 'btnAddAttachment + ' + Me.btnAddAttachment.BackColor = System.Drawing.Color.Black + Me.btnAddAttachment.ForeColor = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.btnAddAttachment.Location = New System.Drawing.Point(320, 16) + Me.btnAddAttachment.Name = "btnAddAttachment" + Me.btnAddAttachment.Size = New System.Drawing.Size(177, 29) + Me.btnAddAttachment.TabIndex = 17 + Me.btnAddAttachment.Text = "Update User Name" + Me.btnAddAttachment.UseVisualStyleBackColor = False + ' + 'txtUserName + ' + Me.txtUserName.BackColor = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(0, Byte), Integer)) + Me.txtUserName.Font = New System.Drawing.Font("Arial", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.txtUserName.ForeColor = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.txtUserName.Location = New System.Drawing.Point(76, 19) + Me.txtUserName.Name = "txtUserName" + Me.txtUserName.Size = New System.Drawing.Size(238, 22) + Me.txtUserName.TabIndex = 18 + ' + 'Label9 + ' + Me.Label9.AutoSize = True + Me.Label9.ForeColor = System.Drawing.Color.Lime + Me.Label9.Location = New System.Drawing.Point(12, 28) + Me.Label9.Name = "Label9" + Me.Label9.Size = New System.Drawing.Size(58, 13) + Me.Label9.TabIndex = 19 + Me.Label9.Text = "Username:" + ' + 'Label1 + ' + Me.Label1.AutoSize = True + Me.Label1.ForeColor = System.Drawing.Color.Lime + Me.Label1.Location = New System.Drawing.Point(73, 53) + Me.Label1.Name = "Label1" + Me.Label1.Size = New System.Drawing.Size(736, 13) + Me.Label1.TabIndex = 20 + Me.Label1.Text = "** The username field is used as the Submitted By value when adding Tickets, Vote" & _ + "s, new Foundation Campaigns, or Expense Reimbursement Requests **" + ' + 'frmUserName + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.BackColor = System.Drawing.Color.Black + Me.ClientSize = New System.Drawing.Size(853, 138) + Me.Controls.Add(Me.Label1) + Me.Controls.Add(Me.txtUserName) + Me.Controls.Add(Me.Label9) + Me.Controls.Add(Me.btnAddAttachment) + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.Name = "frmUserName" + Me.Text = "UserName Maintenance 1.0" + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + Friend WithEvents btnAddAttachment As System.Windows.Forms.Button + Friend WithEvents txtUserName As System.Windows.Forms.TextBox + Friend WithEvents Label9 As System.Windows.Forms.Label + Friend WithEvents Label1 As System.Windows.Forms.Label +End Class diff --git a/contrib/Installer/boinc/boinc/frmUsername.resx b/contrib/Installer/boinc/boinc/frmUsername.resx new file mode 100644 index 0000000000..ac367f82a7 --- /dev/null +++ b/contrib/Installer/boinc/boinc/frmUsername.resx @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAAAwMAAAAQAgAKglAABGFQAAKAAAABAA + AAAgAAAAAQAgAAAAAAAABAAAEgsAABILAAAAAAAAAAAAAElmg/9DYH3/cpOy/4Knx/+Bp8j/irPV/4+2 + 1/+Grc3/hKvL/3Wcu/92m7n/dJi3/2aFov9gfpv/h6jD/4631/9GZID/PlJs/0hZb/92jKH/hqbD/42y + 0v+Irc//hqvO/4Ciwv9xkK3/boun/3KRr/9piaf/iarG/5e82v+JqsT/QFRs/zM/Vf82PU7/d3h//1tX + Xv9mbHr/fZ++/4Kqz/+GrdH/d5m6/2eDof9wkbD/jLXW/5a61/+TttL/jZ2r/ztHXf8pMkj/NTdF/5OT + lv94b3L/a2Bi/2NcYP9vgpf/fJq4/4uuzf+MstH/jbbX/5S93v+Mr8z/ipqo/5mfpP9SZXz/Slp0/0A+ + SP+srK7/h36A/4N3d/95amf/alpY/1lVW/9zjqf/ia/O/5W+3/+OtNT/may8/5Oirv+6vsD/Ul5z/0NU + bv9TTVX/wL6//5SLjP+Xioj/jn97/4JzcP9pVE//Tjcz/2V5jv97nrv/fJWq/6Knq//Iysn/0tPT/1ps + h/86Rlz/a2Zt/8zKyv+mnp3/p5uZ/6GUkP+Th4P/iHdx/21RRv9WNij/dHR4/5icoP/Hycr/1tnZ/9bX + 1/9cbYf/TVJj/4+MkP/Mysr/ta6s/7esqP+xpaH/q56b/52QjP+MeXD/a00//395ef/Gxsb/19jY/9LV + 1f/Z2tr/W2d9/0o8Pf+dk5D/1tfX/6KnsP/HwsD/vrOv/7auq/+uo5//opWP/35lWv+onpr/19fX/9zd + 3f/Y2tr/vsvX/1xTV/9rUUn/rJ+Z/6mlpf9bWmX/ZnmU/4p+fP+9tbH/u7Sw/7GopP+SgHj/z8vI/9/g + 4P/X3N7/scne/6LE4v9xbXP/e2Rc/7+2sP+Ui4j/fG5q/2xbVv9jSD7/ppiT/9rZ2f/X2Nf/t7Gu/93f + 3v++urj/am15/4mmwv+iwt//cnB2/4JvZv++uLT/lId//5WHgP+LfHb/fGRZ/8i/uv/h4eD/5OXk/9LT + 0v+/uLP/oI+I/3JdVv9fX2v/iafD/4V9ff+WhHz/tKyn/66glf+tn5P/pJeN/5WCdv/c2tf/1Nre/8/Y + 3f+5trP/u7Gr/7mup/+llYv/fmpi/2Rlbf+YlJb/rKGZ/6yhm/+soJj/raSc/7Oro/+1rKP/xdDb/5er + vf+2vL//iH55/8vJx//S0M7/vLOt/62im/+hlI3/b4OM/5Wipf9+hYr/iYuN/6egnP+il5D/kYWA/5iO + iv+ekYn/3+Hh/6efmv/T0s//2dzc/9DX3P+vv8z/oaiu/2V7gf9hfoH/eZ6d/3icm/9ll5L/c5SZ/4CR + mv/AvLj/uLGs/9XZ2/+7urj/u8jT/7DE1P+4yM//pLnA/4+ptP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA + AAAAEAAAEgsAABILAAAAAAAAAAAAAFh2k/8+XHr/VniV/0ljgf9wkK//g6fH/4Sszv+Hrs7/fKLD/32j + xf+DrtH/k7vb/5C42v+Hrc7/fqbH/3yjw/99pcb/hq/O/32lxf95pMX/eKDA/42xzv+Hrc3/cJOy/3qb + uP9jhKT/aoai/1V2lv9oiqn/iKnD/4652v+Nt9b/TmqG/0Bcev8wS2n/Olh2/2F/nf92lrT/gJ+8/3yi + w/+Ap8n/i7DQ/4mx0v+JstX/ha3P/6HG5v+YvN3/iK3O/4OoyP+LsdH/d5u6/2mLqf9vlLL/Zoim/22R + sP9tkK//Y4Cb/1l1kf9TbIj/cJCs/5u81v+QsMr/kbnY/4y00v9RdI//RmGA/zpTcf87T2j/Ok9l/2yF + n/+CosD/cJW3/36kyP+XuNP/hqvL/4Coy/+Tudz/jLLU/5u93f+Apcj/ia3O/3KQrv9zj6r/Z4Sh/2Z/ + mv99nLj/dZa0/36eu/9oiaj/VHCP/3CRsP+Rr8j/nMHe/5e92v+Ms9L/g6bD/zxdcf9EX3//RFl0/z1N + Zf81Q1j/RUxe/2Bncv+GkZ3/cYmd/5K11P+bv9//k7XS/4uv0f93mr3/fKTK/4Knyv+Iq8r/fKDC/3+h + wP9si6j/aoil/2uHpP90ka3/YYCg/2uJpv97ocD/lbnW/4yvy/+Wutf/k7rY/4msyP+LobT/RWN2/z9V + c/9ATmb/N0Vc/zE/Vv87PUz/Y2Bm/4eJjv9TUlr/VVJa/2t0gv+CnLf/hanL/4CmyP9+psz/irPZ/3+n + y/99osT/dJe4/2yMqv9hfZr/X3qX/2OAnP9gfZv/faXF/5C52f+aweD/mrzZ/5e82/+Oss//iajB/5qm + sf9MXnb/LjlR/zI7UP8kLUH/LzZJ/z9ATf9dXWb/lpui/2llbf9bU1f/VUxP/1hWXv92jab/e56//3+l + yP+Cq9D/jLbb/5C22P99ocP/f6LC/2uJqP9vjqz/fqC+/4Coyf+Uvt//kLna/5C52v+Sscr/l7zb/5Cs + w/+JlaL/ipKZ/z1MX/8qM0r/KDJK/yMpPf8qMkb/QD1I/3Jzef+nqKr/e3R4/2thY/9lWVz/Zl1g/1pQ + Uv9rdYT/dpSx/3ibu/96nL3/fp29/4Ooyf+Mr87/gafH/4qvz/9+p8j/iLPV/5S+4P+PtdT/hK3O/5K1 + 0f+Gp8P/kp+q/5Wcov+Tm6P/RlRn/z5KYv8wN03/KzZM/y43Sf86NT7/goGE/7Kxsv+FfoD/dmps/3Bj + Y/90aWr/a15f/1tNTP9eV1n/cIOX/3WTsP+Cm7T/kbPQ/4uuzP+Wutj/kLbW/4232f+gx+f/m8Pj/5O+ + 4v+IrMr/ka/I/32Ilf+UmqD/mZ6j/6KlqP9DUmf/WG2I/2Bxiv8yPlb/LTJC/0U9RP+TlZn/uLa3/42G + iP99cnP/e29v/4F2dv95a2n/bFxa/2dZWf9cTkz/UFBV/3OGmv99mbL/fKLB/4uy0f+awN//krze/5/G + 5v+PtNP/ibLU/5e1zf+brLr/lp2j/4ykt/+Yo6z/v8PD/1FmfP9cbYX/ZX6c/zA7U/80N0X/WVFV/6yu + sf+4t7j/lIyN/4B2d/+Genn/i359/4V4df95Z2T/d2dk/2tbWP9WQj7/TT09/2Bre/9xka7/e5++/4Wr + yv+Vvd7/j7ja/5K62/+Psc3/k6i4/52nr/+XpK//k6Gu/8nLy//Gx8f/RFRl/15qf/9ddZT/LjlP/zEu + O/9lXmH/wL/A/7e1tv+ZkZL/ioCA/4+Dgf+ViIX/j4J+/4FxbP+CdHH/e2tn/2hTT/9XQDv/Rysm/1JR + W/90lrP/d5y7/4qx0f99pcb/YYep/3+Zr/+Pl57/oKet/6qqqv/O0dH/09XV/8/Pz/9PWm7/VWF4/1hz + lP8oLUL/ODA7/3t3fP/S0tL/tbKz/5yVlv+Sh4f/l4qJ/5+TkP+dj4v/int2/4p8ef9/cm7/eGVg/2xX + Uf9XOjL/RyUb/05ESf9bbYH/aoij/3uZtP9/lqv/k56n/6arr/+xsrL/0dPS/9XZ2P/V1tb/0tLS/1Rl + f/9abor/VGyM/ykrPP85MDr/jomM/93d3P+4tLX/p5+f/5yUlP+hlZP/ppmX/6WYlP+Vh4L/j4OA/4+C + f/+FdW//f2xl/2xRSf9bOi3/RyES/1c9NP9cY27/dHuE/4iLj/+bo6r/tLi6/8rMy//W2dn/2Nra/9XX + 1//U1dX/XHGM/15th/9GU2z/Jyw9/0dGUv+dm53/3t/f/7u3tv+tpaT/p5+e/6edmv+uop//raCe/56R + jf+UiIP/mY2J/45/ev+MfHb/fWZe/3BSRf9XMR7/ZUg8/3ZoY/+MiYv/kpWZ/6ysrv/S09P/zc/P/9PW + 1v/Z29v/19nZ/9fY2P9sfpn/V2Z//0hUa/9CS1//X19p/7CusP/b3d3/u7a2/7Krqf+zrKn/sqek/7aq + p/+ypqP/qJuX/6ebmP+kmJX/mYyH/5WIhP+Kd3D/gmpf/2NAL/9pTUD/bmFe/4iIi/+pq63/0dHQ/9na + 2v/U1dX/z9HR/9fa2v/Y2tr/2dra/1lvjv9VYHf/TFNl/15WW/9rZGj/wcDB/+Hi4v+4tLP/t7Gv/7ix + rv+4rar/vLCs/7muqv+wpKH/s6ik/6yfnP+ilJD/pJiV/5WGf/+PfHP/cFJC/3BVSf9oXl7/n56e/8bF + xP/Y19f/2tra/9XW1v/Lz9D/19ra/9rb2//Y2Nj/XnWS/1Nkfv9ERFD/TEBB/2pbWP/Nycj/5OXl/+Xm + 5v/S0ND/vLe2/7uzr/++tLD/v7Sv/7mvq/+0rar/taun/6ufmv+top7/oZOO/5uMhf9+ZFj/dFpO/25f + XP+8trL/zs3M/9zd3f/c3Nz/2tvb/9XX1//a29v/2Nra/8zR1P9OVWj/a258/1A9O/9JLij/ZU9I/9rZ + 2P/q6+r/p6Wo/11tgv+dqrn/z9LV/9LNy//DubX/vLKu/7uzsP+1rqz/saej/7Clof+nm5f/pZmT/4p1 + a/97Ylb/pZaO/8/My//V1dT/3t/f/97f3//c3t7/1tnZ/9nb3P/E1OD/jq/N/zUwPf9wYmD/Zk9J/19D + Ov9tUkj/4ODf/+vs7P96c3X/W11r/05fe/9bbor/hJqz/6+wtv/Oysn/x8G+/7+2sv+5r6r/s6qm/7Kn + o/+uo57/koJ7/4RuY/+4rKX/3Nva/+Dg4P/c3t3/3d/f/9zd3f/X297/q8LY/5/C4v+Vt9b/SUZS/4Fy + b/93YFn/b1RK/35kV//l5eT/2NfW/2lcW/9hUlH/ZFpd/1pphP9dcY//UDo3/1tBOf+gk47/zMjG/8zI + xf+1rqr/saqm/7OrqP+mmpT/jHht/8nEwP/h4uH/4+Pj/97f3//g4uH/xNHa/6PD3v+fwuL/p8jo/63N + 6v9YV2L/g3Rv/31pYf9wV03/j3lu/+rq6f+8t7b/fHBt/3JlYf93amf/Z1dU/2NQS/9ZPjb/YEM5/4p2 + bv+upaH/zczM/+Dh4P/U1NT/w8LA/7GrqP+ai4P/19jX/+Xl5f/j5OT/1dbW/4+Wof90j6n/iqvJ/5u7 + 2f+lxeL/ocPh/1xug/+MfHf/hXNr/3hfVv+fjYX/5ufm/5OKhv+He3f/f3Jt/4Z5dP94aWX/b1xW/2dO + Rf9sUUb/noyD/8O7uP/a2dn/39/f/9vd3P/q7Ov/2t3d/7ezr//W2tr/4uTk/8fCv/97amf/VEJB/1FN + V/9qe5L/l7fU/5y82P+nxuL/VWV7/5GBe/+FdG3/e2Ra/66gmf/X2Nj/in54/5KFf/+Nf3j/koV//4h7 + dv+BcGn/dV1U/3ddUP+unpX/1NDO/9/f3v/h4eD/4OHg/+jq6P/c39//vr+9/9nc2/+9tK//ppWM/4h1 + bv9tV1L/V0E+/0Q7Q/+Fnrf/ia3N/56/2/9LUGL/mYiA/4l4cv+AamD/vbOu/7ezsf+ViID/no+G/5uM + g/+bjob/lIeA/45+eP+BbWP/hGpc/8C1rP/d29n/4eHg/+Hi4f/j5OL/4+Xk/9zg3//Qzsz/tqym/6+j + m/+ypp7/n46G/414b/94Ylr/X05O/1NUY/9sgJj/jq/M/2VpeP+gj4j/mYiB/4RvZf/Mx8P/pp6Z/6aX + jv+omY//ppaN/6aWjf+hk4v/nY6F/5F/df+QeGr/zsjC/+Lh4P/n6Ob/3d/f/+Xn5//i5OP/zcjE/7ar + pP+4rab/ua6m/7yxq/+wo5z/o5CH/5mFe/+JdGv/V0I9/1FUYf9ugZb/ZGBk/6qakf+pmZD/koB4/7m0 + sP+jmI//tqmc/7Wom/+1p5r/s6aa/6yflf+omo//nY2D/5eDdf/c2df/5OXk/+Dj5P+rvM3/w9Da/7HD + 0v+stLv/tbKq/7+5tP+7sqz/vbOs/7mvqf+voZj/q5yT/6aWjf9zXVX/Y1RP/21pbf+Eg4r/sKij/7Oq + o/+onJX/xr+7/6eemv+7sKf/vbSq/760qf+5rqL/tquf/7Kmmf+qnJH/qZqO/+bl5P/S19z/m7HH/525 + 0f+Voq7/rK+y/4B5d/96amL/urWx/9nc2//b29n/xL65/7Soof+wo5z/q5+Y/6KVjf+XiYL/hndx/4qL + lf+jmpX/ppqS/6+jmf+ik4z/oZSM/6SWj/+Uh4H/m4+J/6Ognv+uq6j/t7Cq/8G6tP/Cvbn/wdHf/5u0 + zP+Sqb7/kZig/8DCw//X2tr/n5ua/4h5cP/Au7b/19rZ/9ja2f/Rz8z/zMfD/8C5tP+xqKP/tKqk/7Wp + ov+zp5//bXiA/4+VmP+lpqX/s6yn/5GKif+jmpf/sqeg/6yhm/+yp6D/loqE/5GEff+Ui4j/ioOD/35z + cP+Uiof/em9t/3hlXP+vp6H/2Nra/+Hj4/+xrqz/kYR8/8fBvP/a3Nz/2d3c/9/h4f/e4OD/297e/9XZ + 2f+qpqT/pZ6a/7Orpv9de4b/Y4WQ/2eNmP+WqrD/YHOB/2J7h/9jd4D/ZGt6/6Sorv+wp6D/tqui/6+j + m/+pnZX/lIJ3/7uyrP+VjIj/iXdu/8bAuv/e39//5Obm/8G9uv+ZjYX/zMnF/+Dh4f/T2Nj/2Nvb/83V + 2v+5ytj/m7jR/6HE4P+Zscf/lKSy/114ev9ef37/Vn15/1WFfv9aiIf/ZJOQ/3WZl/9qkpT/ZI+L/2OM + if9thY3/eoON/3x/h/95dnv/0tHO/6Galv+Sgnr/0s7L/97h4P/i5eX/zMnE/6yimf/Y2Nb/w8/Z/6i8 + zf/O09X/zdLV/9DW2f+6xs//t8XR/6m5yP+htsv/bYKM/2xzgP9pcH3/b4aQ/5Gtrv+Wsa//hqaj/3qf + n/9onJn/ZaWZ/2ukn/96paz/ham0/4aosv/Y2df/tKuk/6CUjf/d3t3/1drc/8HGyv+1s7H/wMvT/62/ + z/+iuc7/n7zX/6rF1/+lwMz/nrjB/5i0uP+IqKr/dpeb/36dov8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA + IAAAAAAAACQAABILAAASCwAAAAAAAAAAAABffJf/RmWC/zxZeP9fgJz/YoOi/z9Tb/95mLb/faDA/3yj + xf+Hr9L/ibHT/4iuzv+Irc3/ep/A/4OrzP9+qcz/jLfb/5m/3P+Pudv/lLra/3Wcvf90m7z/f6jK/3GW + tf+Aqcv/hK7P/32mxf9+qMj/fKXF/3yqzP9wmbn/fqPB/5e61f+NtNP/fqXE/22Oq/90kar/c5Sz/2CD + o/92lLD/Rl57/09vjf9VdJP/dJGr/42vyv+Pu93/jbfX/4231v9XdpL/UXKR/zZScf8yUm3/P2GB/05x + kv9hfpv/g6XD/4WpyP+NsdD/e6LD/3+lxf+ErdH/ao2t/36lxv+Ot9n/gKjL/4q01/9+qMr/lb3f/5vB + 4v+Otdb/jbbY/4ux0P90mrr/h67O/4621f96osH/fKXG/2iPrv98psf/eKC//36jwf9ylLL/b5S0/3ed + vf93mrn/ZoWi/1Ruif9ui6n/ZY2x/16Co/+EpsP/j6rB/4uy0f+OuNj/kLra/4631v9JY3z/VXOR/zRN + a/8pQV//OVZ0/zNMZ/9Oa4j/dpe1/2WCof9tiKT/iazK/3uixP+Apsf/jrTU/4qvz/+IsNL/iLDT/463 + 2v+Hrc7/l73e/6XJ6f+cwOD/k7jZ/4Clxf+Krs7/iq/Q/4aszP93mbj/a4mk/2uNq/9qjKr/Z4uo/2GA + nf9xlrb/ao2r/2yNq/9ngpv/XX2a/117mf9NYXz/ZnuS/3SWs/+Zv93/o8DW/4yvzP+Qutr/jrHN/4uz + 0/9Lb4f/WHaU/zpTcv83UXD/PFFs/zdMZP81TGT/WHKJ/4eox/+Mrcv/Z4eo/22Ut/9/pMb/jK/O/5y+ + 2v+PstD/dZ3A/4qz1v+Tutz/krfY/4uw0/+dv97/i6/R/4Opy/+LstP/hKfF/2mFov9uh6H/c5Kv/2B7 + mP9og5//bomi/4mryP+Dp8X/aomn/5S0z/9wkK3/X4Ok/0pkgv9ffJr/bY2r/5W30/+gxuT/m8Dc/5a8 + 2f+Rudn/h7DQ/4ewz/9KaoX/VHWU/0BegP9AWXf/QVNu/zZEWf87TWT/PERW/01ccP9zjqb/h5+z/3SR + qf95oMX/m7vY/5G11f+Otdj/h6zM/46vzP+Vutv/h63Q/4as0P+Lr9P/iq7R/3mdwf+Lr9D/dZm5/32f + vv9/oL7/dpWz/2yJp/9kgJz/aIGc/2+Oq/9dd5L/bZCv/2mKqf9hgaH/UGmG/3GVt/+OuNr/mb3b/5iv + wv+Vt9L/mr7a/5S82/+LsdD/gaK9/4SYqf8sTVf/TGyJ/0BZef9GW3f/Q1Rt/0BTa/8uOk//PEZa/0ZL + W/9LTVj/j5KX/36Fkf9aZm//gqK9/4uw0f+avd3/ncDe/4+x0P+IrM7/eZu9/3eZvP97o8v/hKzR/36j + xv+Sss//fKHD/3mdv/9/ocH/dZa1/2aDoP9riKb/Z4ak/2+MqP+Qsc7/ZIGg/1l3lv+FpMH/YX+b/4y2 + 1v+Rutz/j6a6/4+21f+Xvt3/k7nW/5C21f+Jrsz/iaa9/4yfr/9CaXT/S2WC/z5Ucv9AT2n/QVBn/zZF + XP8uO1L/NUBV/zs7Sf9WUFX/hYaK/4GDif9OTlf/UU1U/1tdaP9ygJD/gpmx/4Skw/+BpcX/jrTW/3md + wf+Ap83/ha7U/4222v9+pcj/fqPF/3SWt/9wkrP/b5Ky/2iGpP9lhKL/WXCL/197mP9kgZ7/VG6L/2SB + n/+Eqcj/eqPE/4211f+fxub/nr3W/5a62P+Tudj/lbvZ/42xzv+KrMj/jqS2/6Gttv9DVGr/RVt5/zlI + Yf9BTWL/NUJZ/zA9VP8vPVP/OENY/0A+Sf9MRUr/fYWQ/5eaoP9gXmf/WFFX/1RMUf9NQ0b/Xl5m/3GE + m/+Krs7/hKrL/4Koyf98ocX/gq3V/4u33f+Jtdz/h6/U/4Kqzf90mLr/cZGx/3iWtP9ujq3/WW+K/2WD + ov90k7D/bY2r/2yRsf+Ltdf/jbfZ/5W+3/+Uvt//lr3c/5e40/+Yvt3/lbnW/4qvy/+Horn/iZek/5Kb + pP9VZ37/N0dh/yUtQv8yO1D/ICU2/yApO/8rMEH/Oj5O/0A/S/9WU1v/gIqW/56gpf9vbHT/YVlf/19W + W/9WS07/XFZb/1RMUv9kb4L/dpaz/3aZuv9/pMf/fKPH/3+nyv+Ltdr/lbze/5e73P+BqMz/h6rK/4Oo + yf9ohqX/fZy5/22Nrf+Ao8H/gafG/4iy0v+ZwuP/kr7g/4yz0v+PuNn/lLLL/4uuyv+Vu9r/mbvW/4+k + tf+LlJ3/iI+W/4uTmv9KXHD/Ji9E/yo0TP8kLkf/JCg8/yQqPv8lLD//MzZH/0lGUf9ta3D/kZee/6Oi + pP9+eHz/bmVo/2dcYP9fUlX/Z15i/2FaXf9YTU//X2Bp/3yWsf91lrX/cpe7/4Giwf98ocP/f6LE/32e + v/99oMH/h67Q/4eoxP+Dqcr/j7bW/4SpyP96ocH/ga7Q/4Ov0f+XweL/jbfY/5Ozzf+Crc//k7zc/4+x + zf+Gq8j/krTP/5CYoP+XnKD/kZqi/42Tmv86RlT/PElg/zA5Uf8sN1H/KzRL/yAmOf8qNUn/MTdJ/z82 + PP95eHz/nqKo/6Ogov+DfYD/eG5w/3FmaP9oW13/cmhq/2tgYf9kWFr/W05O/1VJSf9vd4H/e5i1/2+O + rf92lbP/dJCs/32Ztf+CpcX/k7fW/5O31P+Lrcv/f6HA/5G42f+Bqsz/lsHi/53G5v+ZweH/mcPl/4Oy + 1/93mbf/j7fX/5y1yf95la3/jpqm/5OVmP+SmqH/lp2l/5+lq/9FU2j/S1px/z9MZP8yN03/OEJb/yk0 + Sv8rN0z/MS88/0I7Q/9/e37/rayt/6ilpv+KhIf/fHFz/3Zpa/9uYGD/dmps/3ZrbP9wZGX/ZllY/1xO + Tf9YS0r/WFFV/3WJnf90krH/fJq4/4icsf+Vt9P/jbDO/4uuzf+cwd//irHR/5i/3/+Gr9H/nMXm/57G + 5v+fxuX/lb/i/5bB5P+Os9L/iKzL/42pwf+Ai5j/hYeN/5WdpP+doab/nqOn/6qqq/9CUmX/TGB4/152 + k/9hc4z/S1dv/yg2Tf8tNEX/Mi04/0tCSv+DhIn/wcHB/6ilpv+SjI7/gXh5/3ptb/92aWn/gHV2/35y + cv94a2r/cmNh/2VWVf9lV1f/YlRT/1dJSP9UV1z/ZXeM/46pwv90kq7/kbPP/3mfv/+OtNT/mL/e/5e+ + 3v+MuNr/ncTk/5/G5v+ZweH/hKnH/4232f+XvNv/ma2+/5iotv+Vmp//l6Gp/4ykt/+Qm6X/qLG4/8HE + xP9OYHX/SFhu/11xi/9uhqP/VWeB/yIsQv8tNkf/OjQ+/1ZPVP+Lj5X/09PT/6ajpf+Wj5H/gXd4/31x + cv99cXH/iH18/4Z7e/+CdHL/e2to/3BeXP9wYmD/allX/2JTUf9LNzX/Sjw7/1JYY/9xiaL/epu1/3KW + tP9+pMP/h6zL/5i+3P+dxeX/kbrc/5a/4f+PuNr/jLHQ/4+21v+Vssr/nLC//6Cpsf+WoKf/k6m7/3+g + u/+osLT/xcnI/8HDw/9OY3n/V2iA/15vhv9rhKP/SVt3/ycySP8yN0f/OjU//2tiZP+cnqL/3Nzb/6Sh + o/+blZb/hXt8/4J4ef+EeHf/j4KC/4p+fP+Ie3j/g3Rw/3hmYv97amf/dWVi/2tbWP9aRkL/VUE//0cz + Mf9NREr/b4mh/3CQrP91l7b/eZ++/4qxz/+Sudn/j7nc/5K62/+Sutv/kLHM/4qtyf+MoLH/maWv/5+p + sP+co6n/i6G0/6Kjpf/Lzs3/zs/P/8XFxf9FXGv/Ultw/2Nyiv9mfJv/SmGA/yQrP/8xMUD/OjE5/3Ru + cP+rqqz/39/e/6Sfof+dlpf/jIOD/4Z8fP+KfXz/lomH/5KFg/+OgX7/h3h1/31saP+Cc3D/fm9s/3dm + Y/9mUk3/X0tG/1A4NP9HLCj/Qy4t/2R5j/95m7j/d528/3yhwP+Ms9P/kLbV/4Wtz/9Od5v/d5y8/3mS + qP+CiZD/k52k/6Kqr/+cmpn/u77A/8/S0f/S1dX/1NXV/8zMzP9GU2P/RElb/2Ftg/9ddJP/TGeH/yAg + Mv8xKzf/Oi81/4eGi/+/vb3/4eHh/6Oen/+jnZ7/j4WG/4uAgP+PgoD/nZCN/5qNiv+Yi4b/joB8/4Jy + bv+Ienf/gHRw/3trZ/9xXVn/blpV/11FP/9PMyz/Ryki/0ElIf9jdYz/aYml/2yOrP97ocH/eZ68/3CW + t/9ymLj/haK7/4yYo/+irrX/oaes/6mrrP+3t7b/0tTT/9XZ2P/V19f/09PT/9DQ0P9mcoj/P0dc/1Zl + fv9eepv/Nktp/ygoOP87NUH/STxB/5KSl//Pzs7/29zd/6SfoP+hm5z/mpCR/4+Eg/+UiIb/oJOS/6GU + kv+fko7/mouH/4d3cv+Nf3z/h3t3/4Bybv95ZmH/eGVg/25XUf9dQDj/VTYs/0UiFv87GRL/WVhg/1Zo + fP9ifZb/boul/3+ZsP95jJ7/iZah/52lq/+jqKz/rq6u/7q6uf/T1tb/19vb/9XX1//V19f/1NbW/9DR + 0f9bcI3/RlFn/2B1k/9cdZX/MkFb/ysrOf80LDj/VElN/6Kgo//a2dj/19jZ/6ymp/+rpKT/oZmZ/5aM + jP+ckI7/pZmW/6WYlf+kmJT/oZOP/41+ev+MgHz/joF+/4x/fP+CcWv/hHNs/3plX/9qT0f/Y0U6/1Qx + I/9AGAr/VTQm/1E8Nv9XYW//ZnqM/250fv+CgoX/lJme/6Ossv+utbn/uru7/83Pz//W2tn/1tnZ/9jZ + 2f/W2Nj/1NbW/9PT0/9meZH/R1Zw/2N+nv9adJX/MDxT/yotPf83NED/YFhd/6Cbm//g397/1tbX/7Cr + qv+vpqT/pZ2d/5yTk/+hlpT/rKCe/6qem/+qnZr/pZiU/5SHgv+ShoL/loqG/5OHg/+JenT/inx2/4Vy + a/93Xlf/cVVL/2JBM/9LIxH/Wjkp/15FOv9jV1f/eXJz/5KQkv+Lj5P/lZuh/5mgqP+7vb3/1NXU/8nL + y//T1tf/2tvb/9ja2v/W2Nj/1tjY/9XW1v9rhKT/SlVs/2VzjP9KUWb/KS9D/y00Rf9HSVj/aWdv/7Gu + sP/e4N//09PT/7Ourf+yq6j/qqKi/6efn/+lmpf/sKaj/66in/+wo6H/qZ2Z/5uOiv+YjIf/lIeD/5yQ + jP+OgHv/kIJ9/45+eP+Aa2P/e2FX/3BSRP9ZMh//Xz0r/2hNQv9xYFv/hn59/4qJjP+OlJn/m5mZ/76+ + vf/V1tX/19nZ/8nLy//Q09P/2drb/9jb2//X2dn/19nZ/9jY2P93jKn/TFVr/1xsh/9YZ4D/NUFX/0NO + ZP9VVmP/enqA/8PBwv/b3d3/0M/P/7Wwr/+2r63/rqem/7Gpp/+toZ//t6up/7Sopv+ypaP/sKOg/6OV + kf+om5j/o5eU/6OWk/+Vh4L/lYmF/5OGgP+IdW7/hnFo/31hVv9kQDD/YD0u/2xRRf9qWlX/dG5u/46O + kf+doab/ubm5/9bV1P/a29r/19nZ/9DR0f/P0dL/1dfX/9ba2f/Y2tr/2dra/9na2v9ziKX/VWWB/1pp + g/9HTmP/P0JR/z43QP9QSVH/hYOH/87NzP/c3t7/0tHR/7aysf+3sK3/tq+r/7auq/+0qab/urCs/7is + qf+2qab/tKil/6icmP+uop//qJyZ/6icmf+dkIv/n5OQ/5qOiv+Pfnj/j312/4dxZf9vTj7/Y0Ex/25U + Sf9uXlr/gH6A/5Wbof+1s7P/zMzL/9rZ2P/Z2dn/29vb/9TV1f/Jzc7/09bV/9nb2//Z29v/2tra/9jY + 1/9acI7/SVp2/1tkeP9JU2f/aGt1/29obP9nXF7/jYyQ/93c3P/h4uL/0c/P/7Svr/+2sa//ubOx/7ix + rv+2rKj/vbKu/7yxrf+7sKz/uq6q/6yhnf+1qqf/sqaj/6ygnP+hlJD/qJuY/6aalv+XiYL/l4Z//498 + c/98YFL/aEc2/3NbUP9WSEn/gYKG/7Osp//BwMD/19bV/9nZ2f/Y2Nj/3d3d/9DT0//Fycr/1djY/9ja + 2v/b29v/2dnZ/9bY2P9cco7/UWSA/1Rlf/9HUmb/SEFH/05ER/9hUlD/jIJ//+Df3//l5ub/5+jo/+Tk + 4v/Kxsb/ta+t/7Ourf+7sq//vLSx/760sP++s6//vrSv/7Wrp/+zrKn/taun/7aqpv+om5f/rKGd/62h + nf+ekIv/nZCK/5eHf/+GbmP/bU4//3JaT/9jUk//dmxt/8bAvf/Jycj/2NfX/9rb2//Z2tn/39/f/9jY + 2P/T1NT/2Nra/9rb2//Z2tr/2NnZ/9fZ2P9xi6n/aYCc/1Rief9DOT3/Qy0q/085Nf9hTUj/nJCL/9/e + 3v/m5+f/6Orq/7q7vv+psLn/4uXm/9rZ2f/Hwb7/vrSx/8C1sf/AtbH/v7Sv/7mvq/+4sq//squo/7Kr + qf+wpaH/rqOf/62in/+jlpL/ppmV/5+Riv+PenH/dVdJ/3hgVf+LeXD/tqyl/87Myv/S0dD/19fX/9/g + 4P/c3Nv/3t/f/9zd3f/W2Nj/29zc/9nb2//Y29v/1t3h/5Cmu/8yMUD/Z2dy/2dhZf9aR0T/Ri4q/0su + Jv9fR0D/opaR/+Dg4P/o6Oj/8PPy/3l0d/9JVm3/UmmH/4GSqP/Fz9j/5ufn/9fU0f/Gvrr/wbay/7qx + rf+9tbH/u7Ow/7avrv+wqKX/tKml/66jn/+onJj/raKd/6OWkf+Tgnr/e2BT/35nXf+fjoX/xb25/9TT + 0//Y19f/2drZ/97f3//f4OD/3t/f/9vd3f/X2tr/1djZ/9vd3f/H1uL/krbV/4yx0v8pIi//YVpe/2RT + UP9eSEL/Z09I/1s/N/9ePzX/tKml/+Xl5f/p6ur/3d3e/2JbX/9YWWf/S1t4/0ldfP9ecIv/YniV/6Gx + wv/R1dn/2tfV/8fBvv++trP/wLey/761sP+5sKv/tKqm/7Oqpf+xp6L/saai/6ugmv+Vh3//gGle/4dx + Z/+qm5L/0czJ/9zb2v/h4OD/3d3c/93e3v/e39//3N7e/9ze3v/b3Nz/ztDS/7LL4v+eweH/mr3e/5W4 + 1v87PEv/b2px/3RiXf9vWFH/c1pS/2FCN/9QKxz/w7y5/+np5//m5+f/sKys/1dLSv9aTk7/a2Zs/1Vf + dv9abYv/ZoKk/2WDp/9YVmD/fG1q/6qhn//V1NP/2NbU/8W/u/+7sqz/tqyo/7Copf+xqab/sqik/7Op + pP+hlY//iHRr/4x3bP+2qqP/2dfW/+Dg4P/j4+P/3Nzc/97g3//e4OD/3d/f/9rb2//N2uP/nb7c/5i8 + 3f+jxeT/ocHg/6DC4P9DQ1H/amFl/4BvaP93YFn/eWBZ/25SRv9kQjH/0MvJ/+no6P/s7ez/hn18/2xf + Xv9kVlT/aVpX/2VXVf9bYXT/XnWV/1NddP9IMSz/TS8l/1U6Mv97ZV3/qJ2Y/9DOzP/a2df/xcC9/7av + q/+1rqr/saqm/7Gqp/+to53/loV9/497cf/Fvrr/3t3c/+Pk4//j5OT/3+Hg/9/h4P/f4OD/3eDh/6zD + 1v+ZvNr/pMXk/57B4f+lx+b/p8jm/7TS7/9ZW2j/a2Fj/4RzbP99Z2D/d2BZ/25TSf9sTT3/2tfV/+np + 6P/m5uX/em9r/3pva/9uYF3/dWhl/3ZoZf9mVlL/YlJQ/15KRf9ZPzj/VTYs/2RIPv+Aa2P/m4uF/6+n + pP/ExMT/2dnZ/+Pl5P/X19b/wb+9/7CrqP+wqab/oJSO/5iHfv/T09L/4ODg/+Xl5f/k5OP/4eLi/93g + 3/+9wcf/coif/32bt/+Nrcr/kbTT/5692/+jxeP/nsDg/6fI5v9VXW//enFy/4h3cP+Fc2v/fGdf/3BV + S/91WEv/4d/d/+/w7/+4tLL/gHVx/4B0cf9yZWH/f3Ju/39ybv9yY1//b19c/2ZRS/9gRj3/WTou/3BW + Tf+Md2//qZqU/7+4tv/S0ND/3Nra/9/f3//Z29v/3eHh/+fq6v/LzMz/q6ek/6melv/V2Nj/4OHg/+Xm + 5v/h5OT/2NnZ/5GIh/9XTVL/XmNy/2d7kv+Cob7/k7TR/5a20/+kwNr/rMrm/6HC4P9UaYL/eoKM/4l4 + cf+Fc2z/gG1l/3ddU/+BaF3/5eTj/+Lj4/+Tiob/iHx4/4p+ef9/cm3/iXx3/4h6df97bWj/eGlj/21Z + U/9rVEz/YEI1/3hgVf+ZhXz/s6eg/87JyP/Z2Nf/397e/+Hh4f/b3d3/4+Tj/+zt7f/m6Oj/19nZ/6yn + o//V2tn/4OLh/+Dj4v/Hwr//koF6/2xYVf9YREH/TTk4/09JUv9RVmf/gZy3/5292f+Ss9H/qMbj/6PC + 3/9OYnz/f4GH/4x7df+Ecmv/g3Fp/3ddVP+OeW//4+Pj/+Dh4f+DeHP/j4N9/5GEfv+Je3X/kIN9/5GE + ff+GeHP/hXdy/3pnYP90Xlb/Z0k8/4FpXf+jkIX/wLaw/9rW1f/d3dz/4eHh/+Li4f/f4OD/4+Xj/+rs + 6//h4uL/1NjY/7CurP/Z3t3/2NnZ/761sP+nlo7/mIZ+/3tmYP9oUk3/YEtH/086OP88LzX/Z3aM/5i5 + 1v+Fqsv/j7LS/6fG4f88R17/jYmN/5GBef+Gdm//iXdw/3lhV/+di4P/4eLi/7Owrv+Mf3n/mIyD/5eJ + gP+Sg3v/l4uD/5SIgv+NgHn/kIR+/4V0bf9+amH/blFE/4pyZP+unpL/zMbB/97c2//f397/3+Dg/+Hi + 4P/k5OP/4+Ti/+Xn5f/k5+f/z9XV/8bGxP/V1dX/tKqk/6qck/+wo5r/qJeP/415cf9/aWD/dV9Y/2BK + Rv9NPD3/SEZU/2t3i/+Cob//iKzM/5m72P8uNUz/lIeE/5KBef+Hd3D/jHt0/3tjWP+uoJj/6evr/5iQ + i/+UiH//npCH/6CRiP+bi4H/opOK/52Ohv+WiYD/lIiC/45+dv+EdGv/dVlM/5R9b/+6rKL/19PR/+Df + 3v/i4uH/4uPh/+Hi4f/k5OL/4OHf/+Xo5//Z3t7/3N3c/8nFwf+wpZ7/s6ig/6+jnP+zp6D/r6Ka/52M + hP+RfHL/jnlw/3liWf9rV1P/WEpN/1hdbv9hbID/d5Gq/5e30/9KWXL/oJON/5uKgv+Vhn7/kYB5/3xl + Wv+6sKr/4+Ti/5OJgv+hkor/pZaN/6WWjf+ikon/qJiP/6SUi/+gkYn/m5CH/5uLgv+RgXj/fWNV/52I + ev/GvLT/3NnY/+Pj4v/m5+b/5+jm/97g3//l5+b/5Ofm/+Dj4//f393/v7aw/7Spof+1qqP/ua6n/7er + pP+7sKn/tKmj/6ydlv+dioH/n4yC/496cP+JdGv/dFxW/0Q1M/9SVGL/ZnSG/3GLo/9BSFz/qJiR/6ST + i/+llI3/no2E/4JsYv/Bu7f/wLy5/5+TjP+vopb/saSX/66hlf+snpH/rqCU/6qbkf+ompH/ppiP/6KS + if+djYP/gmpd/6GOgP/PycT/4N7d/+Xm5P/m5+b/4eTj/83T1//i5+b/4+bn/93i5f/Iw7//v7ew/7Gn + n/+5r6j/vLKr/72yq//Ata3/vrWv/7Soof+unZT/rZyU/6OQhv+ei4H/j3pw/1I5Mf9GPD7/ZGdx/2l4 + i/8/PUb/saKX/6makf+qm5L/ppeP/417cv+wq6j/qqGa/6abkf+4rJ7/uaye/7Wom/+1qJv/ua2g/7Wo + m/+uopb/qp2T/6mbkP+ll43/iHNm/6eXif/b19X/5eXk/+Tm5f/k5ub/w87Y/42nwv+2xdL/pr/V/52w + wv+aprP/o62w/7q3rv/Cvrv/wry3/7atp/+6sKn/vrWv/7iup/+vopn/r6Oa/6qakv+rnZT/opGI/2RO + Rv9oVU7/alpV/3FrbP9fZHH/zsjE/7Srpf+8sqv/sKWc/5CAeP/Tz8z/r6ei/6ynpP/CuK7/v7On/7er + n/+6r6P/t62g/7itof+2qp//sqaa/66hlf+qnpP/k4Bz/7Wonf/l4+H/6Oro/+jq6v+puMf/m7XM/5y7 + 1/+VrMD/mZyg/6aqrf+Be3v/bFxX/4J0bf+vqKL/z8/O/97g3//a2tn/0tDN/8O9uP+1qaL/r6Ob/6qc + lP+onJT/q5+X/5SFff+Qgnv/f3Ju/3RmYv9VUl7/0M/O/46Efv+ek47/r6eh/7qwqv+/trL/mYiA/52N + hv+ilI3/raKc/5+YlP+nnpn/uLCp/8S9tP/At6z/vLKm/7uuof+3q53/oZGF/8W9tf/i4uL/093l/42g + t/+Orcn/mrbP/5mtwP+Zn6T/trm7/87S0v+XlpX/eWpi/4d4bv+2r6n/z8/N/9re3v/e4N//zMfD/7eu + qP+7san/uK2n/7erpf+roZv/saeh/7Glnf+ypZ3/rZ+W/6eYjv9bXm7/zMnH/5+Tjf+onJP/rqOZ/7Oo + nv+klo7/o5WO/6KWjv+nmZH/o5aP/56Qif+kl47/kIR+/5WXmv+fn6D/sK6u/7Otqv/HxMH/tK+q/9fY + 1/+6zd3/m7TL/5+81v+Uq8D/h46Y/5KOj/+/wMH/3ODg/9nc3P+npqX/j4N9/46AeP+4sqz/09HP/9re + 3f/Y3Nv/3uHg/9vc2//W1tP/zMjF/8G7t/+zrKf/sqml/7etp/+3rKX/tqqj/7Wqov9XYGb/sba4/6ym + oP+4rqX/r6OZ/7Kon/+upZ7/sKSc/66hmf+wpJv/rKGZ/6memP+zqKH/qJ2W/4J1cf+Ed3H/hHl1/5CK + iv+Nio3/fXh7/4F6ev+JgX//iYGB/3BlZP9wX1n/jHx0/7Kspv/U1tX/4OLi/9/i4v+zsrH/m5CL/5GC + ev++trD/1NLR/9vf3//W2tn/3uDg/9/g4P/f4eD/3uHh/97i4//V29z/xcbG/6CbmP+yqaT/ua+o/7yy + q/9kdoj/XG1+/3GOoP95lqf/k6ey/7S1tv9LSVT/YmVx/3d7hP+BgIT/jIeK/5GOkf+0rqv/uK+p/6md + lP+0p53/qJuS/6OWjv+bjYX/k4N7/31mWv+ejYL/pJ6b/4x/ef93YFT/ppiO/8S/u//a29r/3+Hh/+Pl + 5f+/v73/pZ2X/46AeP/DvLX/19fW/97g4P/Y29v/3uHh/97h4P/Y29v/2dzc/9rc3P/W3N7/usvY/5mk + rf+SlZn/m5qa/56bmP9UeH//VnuB/1d+hP9giZD/gJ6p/4ijqv9qhpL/YnyQ/22Vnf9ujpb/XnB6/2Nr + ff+Mlqb/sa6r/7CnoP+7san/taqh/6+knP+toZn/qJyT/5F/dP+8sar/sayq/5eOiv9/bWP/r6Oa/83J + xv/e4OD/4+Xl/+Tn5//Lysj/r6Wf/5WHfv/Gwb3/3+Df/+Lk5P/R1dX/0tbW/9ba2f/P1tr/ucrY/6C7 + 0/+Krcv/lLrZ/6XI5v+ZvNv/iKK7/5exx/9Venf/WX97/1SHfP9QhHr/Tn93/1KJgP9ai4v/YIyP/3CW + lv+AnJz/dZWW/2uTlf9ji4v/XHx7/2N/g/9odYD/b3R//3V2ff9/gIb/g4CF/4mDhP/Qzcn/t7Ox/6CZ + lv+FdW3/s6ig/9bU0v/d4OD/4uTk/+Hk4//U1NH/uK+m/6GVi//Y1tT/4OLi/9LZ3P++y9X/wMvT/9DR + z//Lz9L/zdTZ/9DY3f+0wMv/prvN/6O2yP+Rpbr/j6rF/5Guy/9weYj/bnOD/2tyfP9mb3n/aXqA/2mB + hv9ahoD/WI2D/1qUi/9bkIv/XY+L/2eQk/9rn5j/a6ye/2msnf9qpp7/hae2/4yjsf+Kman/hZWj/212 + gf/W1tT/v7u4/6mhnP+Rgnr/uK+o/93d3f/e4eD/3+Pj/+Hk5P/JxsL/v7ix/8G9uP/X19X/srzF/5a1 + 0P+Ssc3/p7vO/9ff4v/Z3uD/0dbW/9rd3f/Z3d7/2N3d/8/Y2f/Azc//sMDD/7zGyv9mhYv/cXyI/2x0 + gv9ob33/b3qI/2yQlf+ku7//tsPH/7K/wf+itbP/kKup/4Wppv9nmJn/ZJuW/2Khlf9lpJr/cKOm/3Cg + pP90oKj/gaq0/4Ors//Y2Nb/y8jD/7atpv+ckIj/yMO+/+Hj4//Y293/u8TN/6+0uP+wsrH/usHH/7TG + 1v+gudH/nrnT/6i6yv+hv9r/mrvX/5W4zv+MscP/haq5/32grv91nKP/cZee/2SOkP9giIv/ZYuR/2mM + lP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/contrib/Installer/boinc/boinc/frmUsername.vb b/contrib/Installer/boinc/boinc/frmUsername.vb new file mode 100644 index 0000000000..df84999b68 --- /dev/null +++ b/contrib/Installer/boinc/boinc/frmUsername.vb @@ -0,0 +1,19 @@ +Imports System.Windows.Forms +Imports System.Data.SqlClient + +Public Class frmUserName + + Private Sub frmUserName_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load + txtUserName.Text = KeyValue("TicketHandle") + End Sub + + Private Sub btnAddAttachment_Click(sender As System.Object, e As System.EventArgs) Handles btnAddAttachment.Click + If txtUserName.Text.Length < 3 Then + MsgBox("UserName must be populated.", MsgBoxStyle.Critical) + Exit Sub + End If + UpdateKey("TicketHandle", txtUserName.Text) + MsgBox("Username Updated!", MsgBoxStyle.Information) + + End Sub +End Class diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp index d339ee938c..4e99fa4400 100644 --- a/src/checkpoints.cpp +++ b/src/checkpoints.cpp @@ -504,7 +504,7 @@ bool CSyncCheckpoint::ProcessSyncCheckpoint(CNode* pfrom) // Ask this guy to fill in what we're missing if (pfrom) { - pfrom->PushGetBlocks(pindexBest, hashCheckpoint); + pfrom->PushGetBlocks(pindexBest, hashCheckpoint, true); // ask directly as well in case rejected earlier by duplicate // proof-of-stake because getblocks may not get it this time pfrom->AskFor(CInv(MSG_BLOCK, mapOrphanBlocks.count(hashCheckpoint)? WantedByOrphan(mapOrphanBlocks[hashCheckpoint]) : hashCheckpoint)); diff --git a/src/clientversion.h b/src/clientversion.h index 55b035ae7f..edb72b0095 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -8,8 +8,8 @@ // These need to be macros, as version.cpp's and bitcoin-qt.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 3 #define CLIENT_VERSION_MINOR 5 -#define CLIENT_VERSION_REVISION 6 -#define CLIENT_VERSION_BUILD 8 +#define CLIENT_VERSION_REVISION 7 +#define CLIENT_VERSION_BUILD 0 // Converts the parameter X to a string after macro replacement on X has been performed. // Don't merge these into one macro! diff --git a/src/init.cpp b/src/init.cpp index a1ab38c7c1..e3d10ce4ba 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -24,6 +24,7 @@ std::vector split(std::string s, std::string delim); bool LoadAdminMessages(bool bFullTableScan,std::string& out_errors); extern void InitializeBoincProjects(); + MiningCPID GetMiningCPID(); StructCPID GetStructCPID(); std::string GetArgument(std::string arg, std::string defaultvalue); @@ -221,6 +222,9 @@ void InitializeBoincProjects() + + + void Shutdown(void* parg) { static CCriticalSection cs_Shutdown; @@ -264,7 +268,7 @@ void Shutdown(void* parg) else { while (!fExit) - MilliSleep(100); + MilliSleep(100); MilliSleep(100); ExitThread(0); } @@ -1209,6 +1213,6 @@ bool AppInit2() while (1) MilliSleep(5000); #endif - + printf("\r\nExiting AppInit2\r\n"); return true; } diff --git a/src/main.cpp b/src/main.cpp index b1721a98f9..2c9ffd3bf9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -32,10 +32,19 @@ int GetDayOfYear(); extern std::string NodeAddress(CNode* pfrom); extern std::string ConvertBinToHex(std::string a); extern std::string ConvertHexToBin(std::string a); +extern void AskForOutstandingBlocksForcefully(); + + +extern void CleanInboundConnections(); extern void RecoverNode(); extern bool PushGridcoinDiagnostics(); double qtPushGridcoinDiagnosticData(std::string data); +int RestartClient(); + bool RequestSupermajorityNeuralData(); +extern void ReloadBlockIndexHot(); + + extern std::string UnpackBinarySuperblock(std::string sBlock); extern std::string PackBinarySuperblock(std::string sBlock); extern std::vector StringToVector(std::string sData); @@ -304,6 +313,8 @@ bool bOptionPaymentsEnabled = false; int nCoinbaseMaturity = 100; CBlockIndex* pindexGenesisBlock = NULL; int nBestHeight = -1; +int nLastBestHeight = -1; + uint256 nBestChainTrust = 0; uint256 nBestInvalidTrust = 0; uint256 hashBestChain = 0; @@ -955,17 +966,13 @@ MiningCPID GetNextProject(bool bForce) mdMiningNetworkRAC = GlobalCPUMiningCPID.NetworkRAC; GlobalCPUMiningCPID.Magnitude = CalculatedMagnitude(GetAdjustedTime(),false); if (fDebug3) printf("(boinckey) For CPID %s Verified Magnitude = %f",GlobalCPUMiningCPID.cpid.c_str(),GlobalCPUMiningCPID.Magnitude); - msMiningErrors = "Boinc Mining"; + msMiningErrors = (msMiningCPID == "INVESTOR" || msPrimaryCPID=="INVESTOR" || msMiningCPID.empty()) ? "Staking Interest" : "Mining"; GlobalCPUMiningCPID.RSAWeight = GetRSAWeightByCPID(GlobalCPUMiningCPID.cpid); GlobalCPUMiningCPID.LastPaymentTime = GetLastPaymentTimeByCPID(GlobalCPUMiningCPID.cpid); return GlobalCPUMiningCPID; } - - - - - + msMiningProject = ""; msMiningCPID = ""; mdMiningRAC = 0; @@ -1080,7 +1087,7 @@ MiningCPID GetNextProject(bool bForce) GlobalCPUMiningCPID.Magnitude = CalculatedMagnitude(GetAdjustedTime(),false); if (fDebug && LessVerbose(2)) printf("For CPID %s Verified Magnitude = %f",GlobalCPUMiningCPID.cpid.c_str(),GlobalCPUMiningCPID.Magnitude); //Reserved for GRC Speech Synthesis - msMiningErrors = "Boinc Mining"; + msMiningErrors = (msMiningCPID == "INVESTOR" || msPrimaryCPID=="INVESTOR" || msMiningCPID.empty() || msPrimaryCPID.empty()) ? "Staking Interest" : "Boinc Mining"; GlobalCPUMiningCPID.RSAWeight = GetRSAWeightByCPID(GlobalCPUMiningCPID.cpid); GlobalCPUMiningCPID.LastPaymentTime = GetLastPaymentTimeByCPID(GlobalCPUMiningCPID.cpid); return GlobalCPUMiningCPID; @@ -1096,7 +1103,7 @@ MiningCPID GetNextProject(bool bForce) } } - msMiningErrors = "All BOINC projects exhausted."; + msMiningErrors = (msPrimaryCPID == "INVESTOR") ? "" : "All BOINC projects exhausted."; msMiningProject = "INVESTOR"; msMiningCPID = "INVESTOR"; mdMiningRAC = 0; @@ -1806,6 +1813,11 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CTransaction &tx, bool* pfMissingInput // This is done last to help prevent CPU exhaustion denial-of-service attacks. if (!tx.ConnectInputs(txdb, mapInputs, mapUnused, CDiskTxPos(1,1,1), pindexBest, false, false)) { + // If this happens repeatedly, purge peers + if (TimerMain("AcceptToMemoryPool", 15)) + { + CleanInboundConnections(); + } return error("AcceptToMemoryPool : Unable to Connect Inputs %s", hash.ToString().c_str()); } } @@ -2955,7 +2967,11 @@ bool CTransaction::ConnectInputs(CTxDB& txdb, MapPrevTx inputs, map vpindexSecondary; + printf("\r\n**Reorganize**"); //10-6-2015 Make Reorganize work more gracefully - try up to 5 times to reorganize, each with an intermediate further back for (int iRegression = 0; iRegression < 5; iRegression++) { - int rollback = iRegression*200; + int rollback = iRegression * 100; // Reorganize is costly in terms of db load, as it works in a single db transaction. // Try to limit how much needs to be done inside @@ -4188,7 +4206,7 @@ bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew) else { printf("{SBC} new best=%s height=%d ; ",hashBestChain.ToString().c_str(), nBestHeight); - + nLastBestHeight = nBestHeight; } // Check the version of the last 100 blocks to see if we need to upgrade: @@ -4434,13 +4452,17 @@ bool CBlock::CheckBlock(int height1, int64_t Mint, bool fCheckPOW, bool fCheckMe if (fDebug3) printf("CheckBlock[ResearchAge] : Researchers Reward Pays too much : Interest %f and Research %f and StakeReward %f, OUT_POR %f, with Out_Interest %f for CPID %s ", (double)bb.InterestSubsidy,(double)bb.ResearchSubsidy,CoinToDouble(nCalculatedResearch),(double)OUT_POR,(double)OUT_INTEREST,bb.cpid.c_str()); + /* if (msPrimaryCPID == bb.cpid) { - bStakeMinerOutOfSyncWithNetwork=true; - return false; + //bStakeMinerOutOfSyncWithNetwork=true; + //return false; } + */ + return DoS(10,error("CheckBlock[ResearchAge] : Researchers Reward Pays too much : Interest %f and Research %f and StakeReward %f, OUT_POR %f, with Out_Interest %f for CPID %s ", (double)bb.InterestSubsidy,(double)bb.ResearchSubsidy,CoinToDouble(nCalculatedResearch),(double)OUT_POR,(double)OUT_INTEREST,bb.cpid.c_str())); + // Reserved for future use. } } //if (fDebug3) printf(".EOCBR."); @@ -4853,6 +4875,17 @@ void GridcoinServices() } } + if (TimerMain("OutOfSyncDaily",900)) + { + double PORDiff = GetDifficulty(GetLastBlockIndex(pindexBest, true)); + bool fGhostChain = (!fTestNet && PORDiff < .75); + if (OutOfSyncByMoreThan(30) || fGhostChain) + { + printf("Restarting Gridcoin..."); + int iResult = RestartClient(); + } + } + if (false && TimerMain("FixSpentCoins",60)) { int nMismatchSpent; @@ -4892,7 +4925,15 @@ void GridcoinServices() bool bNeedSuperblock = ((double)superblock_age > (double)(GetSuperblockAgeSpacing(nBestHeight))); if ( nBestHeight % 3 == 0 && NeedASuperblock() ) bNeedSuperblock=true; - if (fDebug3) printf (" MRSA %f, BH %f ",(double)superblock_age,(double)nBestHeight); + if (fDebug3) + { + printf (" MRSA %f, BH %f ",(double)superblock_age,(double)nBestHeight); + if (nBestHeight==nLastBestHeight) + { + printf("\r\n ************ Processing block with the same best height as the last best height... ************* %f\r\n",(double)nBestHeight); + } + } + //12-2-2015 if (bNeedSuperblock) { @@ -5028,47 +5069,53 @@ void GridcoinServices() - void AskForOutstandingBlocks() +{ + LOCK(cs_vNodes); + BOOST_FOREACH(CNode* pNode, vNodes) + { + pNode->ClearBanned(); + if (!pNode->fClient && !pNode->fOneShot && (pNode->nStartingHeight > (nBestHeight - 144)) && (pNode->nVersion < NOBLKS_VERSION_START || pNode->nVersion >= NOBLKS_VERSION_END) ) + { + pNode->PushGetBlocks(pindexBest, uint256(0), true); + printf(".B."); + } + } +} + + +void AskForOutstandingBlocksForcefully() { LOCK(cs_vNodes); BOOST_FOREACH(CNode* pNode, vNodes) { pNode->ClearBanned(); // Ask for outstanding blocks - if (true) + if (!pNode->fClient && !pNode->fOneShot && (pNode->nStartingHeight > (nBestHeight - 144)) && (pNode->nVersion < NOBLKS_VERSION_START || pNode->nVersion >= NOBLKS_VERSION_END) ) { - if (!pNode->fClient && !pNode->fOneShot && (pNode->nStartingHeight > (nBestHeight - 144)) && (pNode->nVersion < NOBLKS_VERSION_START || pNode->nVersion >= NOBLKS_VERSION_END) ) - { - pNode->PushGetBlocks(pindexBest, uint256(0)); - printf("."); - } + pNode->PushGetBlocks(pindexBest, uint256(0), true); + pNode->PushGetBlocks(pindexBest->pprev, uint256(0),true); + printf(".GB."); } } } + void SyncChain() { - if (IsLockTimeWithinMinutes(nLastResync,60)) { printf("Resync too soon or already in progress. \r\n"); return; } - nLastResync = GetAdjustedTime(); - printf("\r\n * Sync Chain * \r\n"); CTxDB txdb; LOCK(cs_main); { - ShaveChain(txdb,33); + //ShaveChain(txdb,33); AskForOutstandingBlocks(); std::string sOut = ""; - LoadAdminMessages(true,sOut); - InitializeBoincProjects(); TallyResearchAverages(true); - ComputeNeuralNetworkSupermajorityHashes(); - LoadCPIDsInBackground(); printf("\r\n * Finished * \r\n"); } } @@ -5079,25 +5126,62 @@ void RecoverNode() SyncChain(); } +void CheckForLatestBlocks() +{ + bool fOut = OutOfSyncByMoreThan(30); + double PORDiff = GetDifficulty(GetLastBlockIndex(pindexBest, true)); + bool fGhostChain = (!fTestNet && PORDiff < .75); + if (fOut || fGhostChain) + { + mapOrphanBlocks.clear(); + setStakeSeen.clear(); + setStakeSeenOrphan.clear(); + AskForOutstandingBlocks(); + printf("\r\n ** Clearing Orphan Blocks... ** \r\n"); + } + +} + +void CleanInboundConnections() +{ + LOCK(cs_vNodes); + BOOST_FOREACH(CNode* pNode, vNodes) + { + pNode->ClearBanned(); + if (true) + { + if (pNode->nStartingHeight < (nBestHeight-1000)) + { + pNode->fDisconnect=true; + } + } + } + CheckForLatestBlocks(); + printf("\r\n Cleaning inbound connections \r\n"); +} + void ReloadBlockIndexHot() { printf("\r\n * Recovering Node * \r\n"); - // clear vectors, clear orphans, clear mapindex - mapOrphanBlocks.clear(); - mapBlockIndex.clear(); - setStakeSeen.clear(); - setStakeSeenOrphan.clear(); - mvResearchAge.clear(); - mapOrphanBlocks.clear(); - mapOrphanBlocksByPrev.clear(); - mvApplicationCache.clear(); - mvApplicationCacheTimestamp.clear(); - mvNeuralVersion.clear(); - mvDPOR.clear(); - mvDPORCopy.clear(); - mvBlockIndex.clear(); - mvCPIDBlockHashes.clear(); - LoadBlockIndex(true); + AssertLockHeld(cs_main); + { + // clear vectors, clear orphans, clear mapindex + mapOrphanBlocks.clear(); + mapBlockIndex.clear(); + setStakeSeen.clear(); + setStakeSeenOrphan.clear(); + mvResearchAge.clear(); + mapOrphanBlocks.clear(); + mapOrphanBlocksByPrev.clear(); + mvApplicationCache.clear(); + mvApplicationCacheTimestamp.clear(); + mvNeuralVersion.clear(); + mvDPOR.clear(); + mvDPORCopy.clear(); + mvBlockIndex.clear(); + mvCPIDBlockHashes.clear(); + LoadBlockIndex(true); + } LOCK(cs_vNodes); BOOST_FOREACH(CNode* pNode, vNodes) { @@ -5107,7 +5191,7 @@ void ReloadBlockIndexHot() { if (!pNode->fClient && !pNode->fOneShot && (pNode->nStartingHeight > (nBestHeight - 144)) && (pNode->nVersion < NOBLKS_VERSION_START || pNode->nVersion >= NOBLKS_VERSION_END) ) { - pNode->PushGetBlocks(pindexBest, uint256(0)); + pNode->PushGetBlocks(pindexBest, uint256(0), true); } } else @@ -5165,17 +5249,29 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock, bool generated_by_me) if (!mapBlockIndex.count(pblock->hashPrevBlock)) { // R HALFORD - 05-13-2016 - If we are out of sync, and get bombarded with orphans, recover the node. - if (TimerMain("OrphanBarrage", 100)) + if (TimerMain("OrphanBarrage", 40)) { bool fOut = OutOfSyncByMoreThan(30); double PORDiff = GetDifficulty(GetLastBlockIndex(pindexBest, true)); bool fGhostChain = (!fTestNet && PORDiff < .75); if (fOut || fGhostChain) { - RecoverNode(); + if (TimerMain("OrphansAndNotRecovering",8)) + { + printf("\r\nGridcoin has not recovered after clearing orphans; Restarting node...\r\n"); + int iResult = RestartClient(); + } + else + { + RecoverNode(); + } } } + if (TimerMain("OutOfSyncAndReceivingOrphans",25)) + { + CheckForLatestBlocks(); + } printf("ProcessBlock: ORPHAN BLOCK, prev=%s\n", pblock->hashPrevBlock.ToString().substr(0,20).c_str()); // ppcoin: check proof-of-stake if (pblock->IsProofOfStake()) @@ -5194,7 +5290,7 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock, bool generated_by_me) // Ask this guy to fill in what we're missing if (pfrom) { - pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(pblock2)); + pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(pblock2), true); // ppcoin: getblocks may not obtain the ancestor block rejected // earlier by duplicate-stake check so we ask for it again directly if (!IsInitialBlockDownload()) @@ -5350,7 +5446,7 @@ bool ProcessBlockLegacy(CNode* pfrom, CBlock* pblock, bool generated_by_me) // Ask this guy to fill in what we're missing if (pfrom) { - pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(pblock2)); + pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(pblock2), true); // ppcoin: getblocks may not obtain the ancestor block rejected // earlier by duplicate-stake check so we ask for it again directly if (!IsInitialBlockDownload()) @@ -7446,7 +7542,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, (nAskedForSyncBlocks < 1 || vNodes.size() <= 1)) { nAskedForSyncBlocks++; - pfrom->PushGetBlocks(pindexBest, uint256(0)); + pfrom->PushGetBlocks(pindexBest, uint256(0), true); if (fDebug3) printf("Asking %s for %f getblocks\r\n",NodeAddress(pfrom).c_str(),(double)nAskedForSyncBlocks); } } @@ -7461,7 +7557,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, (nAskedForBlocks < 1 || vNodes.size() <= 1)) { nAskedForBlocks++; - pfrom->PushGetBlocks(pindexBest, uint256(0)); + pfrom->PushGetBlocks(pindexBest, uint256(0), true); } } else @@ -7473,7 +7569,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, (nAskedForBlocks < 1 || vNodes.size() <= 1)) { nAskedForBlocks++; - pfrom->PushGetBlocks(pindexBest, uint256(0)); + pfrom->PushGetBlocks(pindexBest, uint256(0), true); } } @@ -7624,12 +7720,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, if (!fAlreadyHave) pfrom->AskFor(inv); else if (inv.type == MSG_BLOCK && mapOrphanBlocks.count(inv.hash)) { - pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(mapOrphanBlocks[inv.hash])); + pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(mapOrphanBlocks[inv.hash]), true); } else if (nInv == nLastBlock) { // In case we are on a very long side-chain, it is possible that we already have // the last block in an inv bundle sent in response to getblocks. Try to detect // this situation and push another getblocks to continue. - pfrom->PushGetBlocks(mapBlockIndex[inv.hash], uint256(0)); + pfrom->PushGetBlocks(mapBlockIndex[inv.hash], uint256(0), true); if (fDebug) printf("force request: %s\n", inv.ToString().c_str()); } @@ -7835,12 +7931,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, bool fMissingInputs = false; if (AcceptToMemoryPool(mempool, tx, &fMissingInputs)) { - SyncWithWallets(tx, NULL, true); RelayTransaction(tx, inv.hash); mapAlreadyAskedFor.erase(inv); vWorkQueue.push_back(inv.hash); vEraseQueue.push_back(inv.hash); - // Recursively process any orphan transactions that depended on this one + + // Recursively process any orphan transactions that depended on this one for (unsigned int i = 0; i < vWorkQueue.size(); i++) { uint256 hashPrev = vWorkQueue[i]; @@ -7855,7 +7951,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, if (AcceptToMemoryPool(mempool, orphanTx, &fMissingInputs2)) { printf(" accepted orphan tx %s\n", orphanTxHash.ToString().substr(0,10).c_str()); - SyncWithWallets(tx, NULL, true); RelayTransaction(orphanTx, orphanTxHash); mapAlreadyAskedFor.erase(CInv(MSG_TX, orphanTxHash)); vWorkQueue.push_back(orphanTxHash); @@ -7864,7 +7959,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } else if (!fMissingInputs2) { - // invalid orphan 9-11-2015 + // invalid orphan vEraseQueue.push_back(orphanTxHash); printf(" removed invalid orphan tx %s\n", orphanTxHash.ToString().substr(0,10).c_str()); } @@ -9696,6 +9791,13 @@ bool SendMessages(CNode* pto, bool fSendTrickle) AddPeek("Pushed Inv-Large " + RoundToString((double)vInv.size(),0)); if (fDebug3) printf(" *PIL* "); vInv.clear(); + // 7-11-2016 If connection count > 25, and we continually push large inventory, clean current inbound connections + if (vNodes.size() > 25) + { + // External Node + CleanInboundConnections(); + } + // Eventually ban the node if they keep asking for inventory TrackRequests(pto,"Inv-Large"); //3-26-2015 diff --git a/src/main.h b/src/main.h index b5b607cc5c..e70a2385a9 100644 --- a/src/main.h +++ b/src/main.h @@ -132,6 +132,7 @@ extern unsigned int nStakeMaxAge; extern unsigned int nNodeLifespan; extern int nCoinbaseMaturity; extern int nBestHeight; +extern int nLastBestHeight; extern uint256 nBestChainTrust; extern uint256 nBestInvalidTrust; extern uint256 hashBestChain; diff --git a/src/miner.cpp b/src/miner.cpp index 9246e9826e..1ea4ccfe8a 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -155,7 +155,7 @@ CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake, int64_t* pFees) if (OutOfSyncByAgeWithChanceOfMining()) { - printf("Wallet out of sync - unable to mine..."); + if (msPrimaryCPID != "INVESTOR") printf("Wallet out of sync - unable to mine..."); MilliSleep(500); return NULL; } diff --git a/src/net.cpp b/src/net.cpp index 04f029f57e..6eafdb6e73 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -158,14 +158,12 @@ std::string GetCommandNonce(std::string command) -void CNode::PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd) +void CNode::PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd, bool fForce) { - // Filter out duplicate requests - if (pindexBegin == pindexLastGetBlocksBegin && hashEnd == hashLastGetBlocksEnd) - return; + // The line of code below is the line of code that kept us from syncing to the best block! (fForce forces the sync to continue). + if (!fForce && pindexBegin == pindexLastGetBlocksBegin && hashEnd == hashLastGetBlocksEnd) return; // Filter out duplicate requests pindexLastGetBlocksBegin = pindexBegin; hashLastGetBlocksEnd = hashEnd; - PushMessage("getblocks", CBlockLocator(pindexBegin), hashEnd); } @@ -1695,17 +1693,15 @@ void ThreadSocketHandler2(void* parg) { if (pnode->nLastRecv == 0 || pnode->nLastSend == 0) { - if (fDebug3) printf("Socket no message in first N seconds, IP %s, %d %d\n", NodeAddress(pnode).c_str(), pnode->nLastRecv != 0, pnode->nLastSend != 0); - pnode->Misbehaving(10); + if (fDebug10) printf("Socket no message in first 24 seconds, IP %s, %d %d\n", NodeAddress(pnode).c_str(), pnode->nLastRecv != 0, pnode->nLastSend != 0); + pnode->Misbehaving(1); pnode->fDisconnect = true; } } if ((GetAdjustedTime() - pnode->nTimeConnected) > (60*60*2) && ((int)vNodes.size() > (MAX_OUTBOUND_CONNECTIONS*.75))) { - //11-25-2015 - if (fDebug3) printf("Node %s connected longer than 2 hours with connection count of %f, disconnecting. \r\n", NodeAddress(pnode).c_str(), - (double)vNodes.size()); + if (fDebug10) printf("Node %s connected longer than 2 hours with connection count of %f, disconnecting. \r\n", NodeAddress(pnode).c_str(), (double)vNodes.size()); pnode->fDisconnect = true; } @@ -2059,7 +2055,7 @@ void ThreadExecuteGridcoinServices(void* parg) void BusyWaitForTally() { - printf("\r\n ** Busy Wait for Tally ** \r\n"); + if (fDebug10) printf("\r\n ** Busy Wait for Tally ** \r\n"); bTallyFinished=false; bDoTally=true; int iTimeout = 0; diff --git a/src/net.h b/src/net.h index 16def657d9..945d73cee0 100644 --- a/src/net.h +++ b/src/net.h @@ -858,7 +858,7 @@ class CNode - void PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd); + void PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd, bool fForce); bool IsSubscribed(unsigned int nChannel); void Subscribe(unsigned int nChannel, unsigned int nHops=0); void CancelSubscribe(unsigned int nChannel); diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 5a5723189e..f167de470a 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -313,6 +313,7 @@ int main(int argc, char *argv[]) guiref = 0; } // Shutdown the core and its threads, but don't exit Bitcoin-Qt here + printf("\r\nbitcoin.cpp:main calling Shutdown...\r\n"); Shutdown(NULL); } diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 82e4d5d65d..ec3dc8aa21 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -471,7 +471,7 @@ int RestartClient() QString path = QCoreApplication::applicationDirPath() + "\\" + sFilename; QProcess p; #ifdef WIN32 - globalcom->dynamicCall("RestartWallet()"); + globalcom->dynamicCall("RebootClient()"); #endif StartShutdown(); return 1; @@ -2476,7 +2476,7 @@ void BitcoinGUI::updateStakingIcon() labelStakingIcon->setPixmap(QIcon(":/icons/staking_on").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); labelStakingIcon->setToolTip(tr("Staking.
Your weight is %1
Network weight is %2
Estimated time to earn reward is %3. %4").arg(nWeight).arg(nNetworkWeight).arg(text).arg(PORText)); msMiningErrors5 = "Interest: " + FromQString(text); - if (nPOREstimate > 0) msMiningErrors6 = "POR: " + FromQString(GetEstimatedTime(nPOREstimate)); + if (nPOREstimate > 0 && !(msPrimaryCPID=="INVESTOR" || msMiningCPID.empty())) msMiningErrors6 = "POR: " + FromQString(GetEstimatedTime(nPOREstimate)); } else { diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 96a8b4cfb2..02ae622d40 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -24,12 +24,17 @@ double ReturnTotalRacByCPID(std::string cpid); std::string UnpackBinarySuperblock(std::string sBlock); std::string PackBinarySuperblock(std::string sBlock); int DetermineCPIDType(std::string cpid); +void AskForOutstandingBlocks(); + extern Array MagnitudeReport(std::string cpid); extern bool UserAcknowledgedHoldHarmlessClause(std::string sAddress); std::string ConvertBinToHex(std::string a); std::string ConvertHexToBin(std::string a); +void AskForOutstandingBlocksForcefully(); void RecoverNode(); bool TallyResearchAverages(bool Forcefully); +void ReloadBlockIndexHot(); +int RestartClient(); void SyncChain(); @@ -2103,6 +2108,13 @@ Value execute(const Array& params, bool fHelp) results.push_back(entry); } + else if (sItem == "restartclient") + { + printf("Restarting Gridcoin..."); + int iResult = RestartClient(); + entry.push_back(Pair("Restarting",(double)iResult)); + results.push_back(entry); + } else if (sItem == "syncchain") { SyncChain(); @@ -2115,6 +2127,10 @@ Value execute(const Array& params, bool fHelp) entry.push_back(Pair("Recover",1)); results.push_back(entry); } + else if (sItem == "reloadblockindex") + { + ReloadBlockIndexHot(); + } else if (sItem=="burn") { if (params.size() < 5) @@ -2448,6 +2464,33 @@ Value execute(const Array& params, bool fHelp) results.push_back(entry); } } + else if (sItem == "shavechainsmall") + { + CTxDB txdb; + if (ShaveChain(txdb,1)) + { + entry.push_back(Pair("Warning!","This command is deprecated and can cause temporary instability. It is not recommended any longer. You may have to reboot the wallet to recover. ")); + entry.push_back(Pair("Shave Succeeded.",(double)pindexBest->nHeight)); + results.push_back(entry); + } + else + { + entry.push_back(Pair("Shave Failed.",(double)pindexBest->nHeight)); + results.push_back(entry); + } + } + else if (sItem == "askforoutstandingblocks") + { + AskForOutstandingBlocks(); + entry.push_back(Pair("Sent.",(double)pindexBest->nHeight)); + results.push_back(entry); + } + else if (sItem == "askforoutstandingblocksforcefully") + { + AskForOutstandingBlocksForcefully(); + entry.push_back(Pair("Sent.",(double)pindexBest->nHeight)); + results.push_back(entry); + } else if (sItem == "joindao") { //execute joindao dao_symbol your_receive_grc_address your_email diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index 17ac587c11..c4cf514d3a 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -262,7 +262,7 @@ bool AskNeuralNetworkNodeForBlocks(int iNodeLimit) { if (Contains(pNode->strSubVer,"1999")) { - pNode->PushGetBlocks(pindexBest, uint256(0)); + pNode->PushGetBlocks(pindexBest, uint256(0), false); iContactCount++; if (iContactCount >= iNodeLimit) return true; } diff --git a/src/sql.cpp b/src/sql.cpp index 93e5d48dd3..683bfdc60b 100644 --- a/src/sql.cpp +++ b/src/sql.cpp @@ -79,7 +79,7 @@ bool CSQL::ProcessSQLRow(CNode* pfrom) if (pfrom) { - pfrom->PushGetBlocks(pindexBest, hashSql); + pfrom->PushGetBlocks(pindexBest, hashSql, false); // ask directly as well in case rejected earlier by duplicate // proof-of-stake because getblocks may not get it this time pfrom->AskFor(CInv(MSG_BLOCK, mapOrphanBlocks.count(hashSql)? WantedByOrphan(mapOrphanBlocks[hashSql]) : hashSql));