From 7636fe76867173b68d3b081e616798c1e835f028 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Wed, 11 Mar 2026 20:26:01 -0400 Subject: [PATCH 1/7] B2026-022-Adding-RO-Editor-symbols-to-RO-Tables --- .../Exe/RefObj/ROEditor/ROEditor.cs | 1 + .../LibSource/RODBInterface/RODBInterface.cs | 37 +++++++++++++++++-- PROMS/Volian.Controls.Library/VlnFlexGrid.cs | 16 ++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs index 3c5a5e99..783ee109 100644 --- a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs +++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs @@ -419,6 +419,7 @@ namespace ROEditor System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); // The data path the was passed in. + PassedInPath = @"V:\Active Project Files\Farley PROMS Delivery\2022\RO"; DbConnectPath = PassedInPath; // Setup the context menu diff --git a/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs b/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs index f6ba23fe..2beac2bd 100644 --- a/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs +++ b/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs @@ -2142,7 +2142,21 @@ namespace RODBInterface wraccid = accid; string dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now); string xmlstr = GenerateXmlString(ro, false); - string strUpdate = "UPDATE " + ro.GetAttribute("Table") + " SET Info = '" + xmlstr + "'"; + StringBuilder xmlstrTmp = new StringBuilder(); // B2026-025 prep the info field data so it will be saved correctly. + char[] chrAry = xmlstr.ToCharArray(); + foreach (int chr in chrAry) + { + if (chr > 166) + + { + xmlstrTmp.Append($"\\u{(int)chr}?"); + } + else + { + xmlstrTmp.Append((char)chr); + } + } + string strUpdate = "UPDATE " + ro.GetAttribute("Table") + " SET Info = '" + xmlstrTmp.ToString() + "'"; if (movedRO) { VlnXmlElement parent = (VlnXmlElement)ro.ParentNode; @@ -2186,6 +2200,21 @@ namespace RODBInterface } string xmlstr = GenerateXmlString(ro, false); + StringBuilder xmlstrTmp = new StringBuilder(); // B2026-025 prep the info field data so it will be saved correctly. + char[] chrAry = xmlstr.ToCharArray(); + foreach (int chr in chrAry) + { + if (chr > 166) + + { + xmlstrTmp.Append($"\\u{(int)chr}?"); + } + else + { + xmlstrTmp.Append((char)chr); + } + } + string wraccid = null; if (ro.HasAttribute("AccPageID")) { @@ -2209,13 +2238,13 @@ namespace RODBInterface // strInsert = "INSERT INTO " + parent.GetAttribute("Table") + "( RecID, RecType, ParentID, AccPageID, ModDateTime, Info ) "; strInsert = "INSERT INTO " + parent.GetAttribute("Table") + "( RecID, RecType, ParentID, ModDateTime, AccPageID, Info ) "; strInsert = strInsert + " VALUES ('" + ro.GetAttribute("RecID") + "'," + (uint)RecordType.Group + ",'" + ro.GetAttribute("ParentID"); - strInsert = strInsert + "','" + wraccid + "','" + dt + "','" + xmlstr + "');"; + strInsert = strInsert + "','" + wraccid + "','" + dt + "','" + xmlstrTmp.ToString() + "');"; } else { strInsert = "INSERT INTO " + parent.GetAttribute("Table") + "( RecID, RecType, ParentID, ModDateTime, Info ) "; strInsert = strInsert + " VALUES ('" + ro.GetAttribute("RecID") + "'," + (uint)RecordType.Group + ",'" + ro.GetAttribute("ParentID"); - strInsert = strInsert + "','" + dt + "','" + xmlstr + "');"; + strInsert = strInsert + "','" + dt + "','" + xmlstrTmp.ToString() + "');"; } } @@ -2223,7 +2252,7 @@ namespace RODBInterface { strInsert = "INSERT INTO " + parent.GetAttribute("Table") + "( RecID, RecType, ParentID, AccPageId, ModDateTime, Info ) "; strInsert = strInsert + " VALUES ('" + ro.GetAttribute("RecID") + "'," + (uint)RecordType.RRO + ",'" + ro.GetAttribute("ParentID"); - strInsert = strInsert + "','" + wraccid + "','" + dt + "','" + xmlstr + "');"; + strInsert = strInsert + "','" + wraccid + "','" + dt + "','" + xmlstrTmp.ToString() + "');"; } try diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs index ee6162dc..465d323a 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs @@ -2473,6 +2473,19 @@ namespace Volian.Controls.Library private string ConvertTableText(string str) { string rtn = str; + string pattern = @"\\u([0-9]{1,4})\?"; + + string mValue, mValue2 = ""; + foreach (Match match in Regex.Matches(rtn, pattern, RegexOptions.IgnoreCase)) + { + mValue = match.Value; + mValue2 = @"\f1 " + mValue + @"\f0"; + rtn = rtn.Replace(match.Value, mValue2); + // @"\f1\u9474 ?\f0") + // linkValue = linkValue.Replace(match.Value, "\\f1 " + match.Value + "\\f0"); + } + + //ShowRawString(str, "ConvertTableText IN"); rtn = rtn.Replace(@"START]\v0", @"START]\cf1\v0"); rtn = rtn.Replace(@"\v #Link:", @"\cf0\v #Link:"); @@ -3827,6 +3840,9 @@ namespace Volian.Controls.Library this.MergedRanges.Clear(); this.Clear(); this.IsRoTable = true; + //valtext = valtext.Replace(@"\u8209?", "-"); + //valtext = Regex.Replace(valtext, @"\\u([0-9]{1,4})\?", m => int.TryParse(m?.Groups[1]?.Value, out int result) ? Convert.ToChar(result).ToString() : ""); + //valtext = valtext.Replace("-", @"\u8209?"); this.ParseTableFromText(valtext, GridLinePattern.Single); this.AutoSizeCols(); this.AutoSizeRows(); From ed615dbb31a4daa491d2b1b5fda5a8f264bed385 Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Mon, 16 Mar 2026 13:30:36 -0400 Subject: [PATCH 2/7] B2026-022-Adding-RO-Editor-symbols-to-RO-Tables --- PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs index 783ee109..fe7edb61 100644 --- a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs +++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs @@ -418,8 +418,7 @@ namespace ROEditor // NOTE: not doing the "Using System.Threading;" statement at beginning of file because it conflicts with the declaration of the "Timer" variable System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); - // The data path the was passed in. - PassedInPath = @"V:\Active Project Files\Farley PROMS Delivery\2022\RO"; + // The data path the was passed in. DbConnectPath = PassedInPath; // Setup the context menu From d17688fc9d010d4b710a04865fec078ddb18f1c1 Mon Sep 17 00:00:00 2001 From: John Jenko Date: Tue, 17 Mar 2026 11:24:24 -0400 Subject: [PATCH 3/7] C2026-030 corrected the Alarm format cover page --- PROMS/Formats/fmtall/BNPPalrall.xml | Bin 237646 -> 237670 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/PROMS/Formats/fmtall/BNPPalrall.xml b/PROMS/Formats/fmtall/BNPPalrall.xml index 58b11ba9d32e29e7dbed94e42cc9ce01b0ec172c..0cb98e6b9b933083ae03eafe4478c48c7e982fde 100644 GIT binary patch delta 77 zcmX?ifbZD>zJ?aYElg$$rcao}#4>F@lfw3p1x$R5aPD*ZY delta 82 zcmaEMfbZM^zJ?aYElg$$roCojn;!C!Nnm@>0wys=ICnabt1x}ZLZ&|mA*LlvO55)( OV&Xt3+YS^<`2zrCS0HBq From 4b479b3ceb2a3f21854e569b9182624c2891635e Mon Sep 17 00:00:00 2001 From: Paul Larsen Date: Tue, 17 Mar 2026 15:30:35 -0400 Subject: [PATCH 4/7] B2026-022-Adding-RO-Editor-symbols-to-RO-Tables --- .../LibSource/RODBInterface/RODBInterface.cs | 16 ++++++++++++++-- PROMS/Volian.Controls.Library/VlnFlexGrid.cs | 9 ++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs b/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs index 2beac2bd..ee29fbcd 100644 --- a/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs +++ b/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs @@ -2147,7 +2147,6 @@ namespace RODBInterface foreach (int chr in chrAry) { if (chr > 166) - { xmlstrTmp.Append($"\\u{(int)chr}?"); } @@ -2205,7 +2204,6 @@ namespace RODBInterface foreach (int chr in chrAry) { if (chr > 166) - { xmlstrTmp.Append($"\\u{(int)chr}?"); } @@ -2660,7 +2658,21 @@ namespace RODBInterface } } StatMsgWindow.StatusMessage = echild.GetAttribute("MenuTitle"); + StringBuilder tinfo2Tmp = new StringBuilder(); // B2026-025 prep the info field data so it will be saved correctly. str = "UPDATE " + echild.GetAttribute("Table") + " SET Info = '" + tinfo2 + "'"; + char[] chrAry = tinfo2.ToCharArray(); + foreach (int chr in chrAry) + { + if (chr > 166) + { + tinfo2Tmp.Append($"\\u{(int)chr}?"); + } + else + { + tinfo2Tmp.Append((char)chr); + } + } + str = "UPDATE " + echild.GetAttribute("Table") + " SET Info = '" + tinfo2Tmp.ToString() + "'"; str = str + ", ModDateTime = '" + dt + "' WHERE RecID = '" + echild.GetAttribute("RecID") + "';"; DBE.Command(str); DBE.Reader(); diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs index 465d323a..f7f2310f 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs @@ -2479,10 +2479,8 @@ namespace Volian.Controls.Library foreach (Match match in Regex.Matches(rtn, pattern, RegexOptions.IgnoreCase)) { mValue = match.Value; - mValue2 = @"\f1 " + mValue + @"\f0"; - rtn = rtn.Replace(match.Value, mValue2); - // @"\f1\u9474 ?\f0") - // linkValue = linkValue.Replace(match.Value, "\\f1 " + match.Value + "\\f0"); + mValue2 = $"\\f1 {mValue}\\f0"; + rtn = rtn.Replace(match.Value, mValue2); } @@ -3840,9 +3838,6 @@ namespace Volian.Controls.Library this.MergedRanges.Clear(); this.Clear(); this.IsRoTable = true; - //valtext = valtext.Replace(@"\u8209?", "-"); - //valtext = Regex.Replace(valtext, @"\\u([0-9]{1,4})\?", m => int.TryParse(m?.Groups[1]?.Value, out int result) ? Convert.ToChar(result).ToString() : ""); - //valtext = valtext.Replace("-", @"\u8209?"); this.ParseTableFromText(valtext, GridLinePattern.Single); this.AutoSizeCols(); this.AutoSizeRows(); From e03ae6195ab988749521792b9f6d00c334dcc08e Mon Sep 17 00:00:00 2001 From: mschill Date: Wed, 18 Mar 2026 07:53:17 -0400 Subject: [PATCH 5/7] =?UTF-8?q?C2026-028=20Update=20Tooltip=20for=20?= =?UTF-8?q?=E2=80=9CSet=20All=20at=20Level=E2=80=9D=20in=20Applicability.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROMS/Volian.Controls.Library/DisplayApplicability.Designer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PROMS/Volian.Controls.Library/DisplayApplicability.Designer.cs b/PROMS/Volian.Controls.Library/DisplayApplicability.Designer.cs index 74a354b4..cc37fbea 100644 --- a/PROMS/Volian.Controls.Library/DisplayApplicability.Designer.cs +++ b/PROMS/Volian.Controls.Library/DisplayApplicability.Designer.cs @@ -49,7 +49,7 @@ namespace Volian.Controls.Library this.btnApplicabilitychg.Size = new System.Drawing.Size(80, 22); this.btnApplicabilitychg.Margin = new System.Windows.Forms.Padding(2); this.btnApplicabilitychg.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.superTooltip1.SetSuperTooltip(this.btnApplicabilitychg, new DevComponents.DotNetBar.SuperTooltipInfo("Change applicability settings - All At Level", "", "When clicked, all steps at the level of the current step will have their applicability settings changed.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray)); + this.superTooltip1.SetSuperTooltip(this.btnApplicabilitychg, new DevComponents.DotNetBar.SuperTooltipInfo("Change applicability settings - All At Level", "", "When clicked, all steps at the level of the current step will have their applicability settings changed. Note that for two column procedures, the left column and right column are handled separately.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray)); this.btnApplicabilitychg.TabIndex = 0; this.btnApplicabilitychg.Text = "Set All at Level"; this.btnApplicabilitychg.ColorTable = DevComponents.DotNetBar.eButtonColor.BlueOrb; From 5eca8a5150a670dc3c3b86beb79009744e2a261e Mon Sep 17 00:00:00 2001 From: mschill Date: Wed, 18 Mar 2026 14:44:45 -0400 Subject: [PATCH 6/7] B2026-030 GoTo sometimes requires being pressed twice for ROs --- PROMS/Volian.Controls.Library/DisplayRO.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplayRO.cs b/PROMS/Volian.Controls.Library/DisplayRO.cs index c1f7725e..b40aa139 100644 --- a/PROMS/Volian.Controls.Library/DisplayRO.cs +++ b/PROMS/Volian.Controls.Library/DisplayRO.cs @@ -1164,12 +1164,21 @@ namespace Volian.Controls.Library tbROValue.Text = null; lbROId.Text = string.Empty; - // Disable all buttons by default - btnGoToRO.Enabled = false; + // Disable all buttons by default btnSaveRO.Enabled = false; btnCancelRO.Enabled = false; btnPreviewRO.Enabled = false; - } + + //B2026-030 GoTo sometimes requires being pressed twice + if (MyUserInfo != null && MyDvi != null && selectedChld.value != null) + { + btnGoToRO.Enabled = UserInfo.CanEditROs(MyUserInfo, MyDvi); // Writers and Reviewers cannot edit ROs (run the RO Editor) + } + else + { + btnGoToRO.Enabled = false; + } + } #endregion } From a10798c9831aa9fd39696f269358e76f7aa84709 Mon Sep 17 00:00:00 2001 From: mschill Date: Fri, 20 Mar 2026 15:30:51 -0400 Subject: [PATCH 7/7] B2026-033 Tooltip for Generate Word Attachments --- .../frmBatchRefresh.Designer.cs | 4 ++-- PROMS/VEPROMS User Interface/frmBatchRefresh.resx | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/PROMS/VEPROMS User Interface/frmBatchRefresh.Designer.cs b/PROMS/VEPROMS User Interface/frmBatchRefresh.Designer.cs index 41c381d5..ceed4fe9 100644 --- a/PROMS/VEPROMS User Interface/frmBatchRefresh.Designer.cs +++ b/PROMS/VEPROMS User Interface/frmBatchRefresh.Designer.cs @@ -1317,7 +1317,7 @@ this.swRegenWordAttmts.Name = "swRegenWordAttmts"; this.swRegenWordAttmts.Size = new System.Drawing.Size(91, 22); this.swRegenWordAttmts.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled; - this.superTooltip1.SetSuperTooltip(this.swRegenWordAttmts, new DevComponents.DotNetBar.SuperTooltipInfo("Generate Word Attachments", "", resources.GetString("swRegenWordAttmts.SuperTooltip"), null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(300, 200))); + this.superTooltip1.SetSuperTooltip(this.swRegenWordAttmts, new DevComponents.DotNetBar.SuperTooltipInfo("Generate Word Attachments", "", resources.GetString("swRegenWordAttmts.SuperTooltip"), null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(300, 250))); this.swRegenWordAttmts.SwitchClickTogglesValue = true; this.swRegenWordAttmts.TabIndex = 34; this.swRegenWordAttmts.Value = true; @@ -1334,7 +1334,7 @@ this.labelX1.Location = new System.Drawing.Point(107, 150); this.labelX1.Name = "labelX1"; this.labelX1.Size = new System.Drawing.Size(186, 22); - this.superTooltip1.SetSuperTooltip(this.labelX1, new DevComponents.DotNetBar.SuperTooltipInfo("Generate Word Attachments", "", resources.GetString("labelX1.SuperTooltip"), null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(300, 200))); + this.superTooltip1.SetSuperTooltip(this.labelX1, new DevComponents.DotNetBar.SuperTooltipInfo("Generate Word Attachments", "", resources.GetString("labelX1.SuperTooltip"), null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(300, 250))); this.labelX1.TabIndex = 33; this.labelX1.Text = "Generate Missing Word Attachments"; // diff --git a/PROMS/VEPROMS User Interface/frmBatchRefresh.resx b/PROMS/VEPROMS User Interface/frmBatchRefresh.resx index 15533721..c8355cb0 100644 --- a/PROMS/VEPROMS User Interface/frmBatchRefresh.resx +++ b/PROMS/VEPROMS User Interface/frmBatchRefresh.resx @@ -121,15 +121,15 @@ 17, 17 - When Word attachments are modified and saved, PROMS will create a PDF of the attachment contents and save it in the database. When this is done, all the of the RO references are resolved as well as pagination of the attachment. This speeds up the overall printing of the procedure in that PROMS simply inserts the attachment contents. Certain actions like loading a new RO.FST require that these PDFs be regenerated which is normally done at print time. + When Word attachments are modified and saved, PROMS will create a PDF of the attachment contents and save it in the database. When this is done, all of the RO references are resolved as well as pagination of the attachment. This speeds up the overall printing of the procedure in that PROMS simply inserts the attachment contents. Certain actions like loading a new RO.FST require that these PDFs be regenerated which is normally done at print time. -This function will generate (and save) any missing saved attachment PDFS stored in the database (not the PDFs of the entire procedure that you had previous printed). This will cause printing to be faster when you print after this as the PDFs will be pre-genrated in those cases (and thus not require regeneration unless changes were made to the Word Sections or ROs after running this). +This function will generate (and save) any missing saved attachment PDFs stored in the database (not the PDFs of the entire procedure that you had previous printed). This will cause printing to be faster when you print after this as the PDFs will be pre-genrated in those cases (and thus not require regeneration unless changes were made to the Word Sections or ROs after running this). - When Word attachments are modified and saved, PROMS will create a PDF of the attachment contents and save it in the database. When this is done, all the of the RO references are resolved as well as pagination of the attachment. This speeds up the overall printing of the procedure in that PROMS simply inserts the attachment contents. Certain actions like loading a new RO.FST require that these PDFs be regenerated which is normally done at print time. + When Word attachments are modified and saved, PROMS will create a PDF of the attachment contents and save it in the database. When this is done, all of the RO references are resolved as well as pagination of the attachment. This speeds up the overall printing of the procedure in that PROMS simply inserts the attachment contents. Certain actions like loading a new RO.FST require that these PDFs be regenerated which is normally done at print time. -This function will generate (and save) any missing saved attachment PDFS stored in the database (not the PDFs of the entire procedure that you had previous printed). This will cause printing to be faster when you print after this as the PDFs will be pre-genrated in those cases (and thus not require regeneration unless changes were made to the Word Sections or ROs after running this). +This function will generate (and save) any missing saved attachment PDFs stored in the database (not the PDFs of the entire procedure that you had previous printed). This will cause printing to be faster when you print after this as the PDFs will be pre-genrated in those cases (and thus not require regeneration unless changes were made to the Word Sections or ROs after running this). @@ -183,7 +183,7 @@ RO paths, ROFST versions, and the contents of RO figures are stored in the datab Be sure a current backup exists prior to running this function!! - When Word attachments are modified and saved, PROMS will create a PDF of the attachment contents and save it in the database. When this is done, all the of the RO references are resolved as well as pagination of the attachment. This speeds up the overall printing of the procedure in that PROMS simply inserts the attachment contents. + When Word attachments are modified and saved, PROMS will create a PDF of the attachment contents and save it in the database. When this is done, all of the RO references are resolved as well as pagination of the attachment. This speeds up the overall printing of the procedure in that PROMS simply inserts the attachment contents. This function will remove all of the saved attachment PDFS stored in the database (not the PDFs of the entire procedure that you had previous printed). This will force PROMS to regenerate (and save) the word attachment PDFs the next time the procedure is printed. @@ -202,9 +202,9 @@ RO paths, ROFST versions, and the contents of RO figures are stored in the datab Be sure a current backup exists prior to running this function!! - When Word attachments are modified and saved, PROMS will create a PDF of the attachment contents and save it in the database. When this is done, all the of the RO references are resolved as well as pagination of the attachment. This speeds up the overall printing of the procedure in that PROMS simply inserts the attachment contents. + When Word attachments are modified and saved, PROMS will create a PDF of the attachment contents and save it in the database. When this is done, all of the RO references are resolved as well as pagination of the attachment. This speeds up the overall printing of the procedure in that PROMS simply inserts the attachment contents. -This function will remove all of the saved attachment PDFS stored in the database (not the PDFs of the entire procedure that you had previous printed). This will force PROMS to regenerate (and save) the word attachment PDFs the next time the procedure is printed. +This function will remove all of the saved attachment PDFs stored in the database (not the PDFs of the entire procedure that you had previous printed). This will force PROMS to regenerate (and save) the word attachment PDFs the next time the procedure is printed.