diff --git a/src/ServiceBouncer/Icons/Connected.png b/src/ServiceBouncer/Icons/Connect.png similarity index 100% rename from src/ServiceBouncer/Icons/Connected.png rename to src/ServiceBouncer/Icons/Connect.png diff --git a/src/ServiceBouncer/Icons/Disconnected.png b/src/ServiceBouncer/Icons/Disconnect.png similarity index 100% rename from src/ServiceBouncer/Icons/Disconnected.png rename to src/ServiceBouncer/Icons/Disconnect.png diff --git a/src/ServiceBouncer/MainForm.Designer.cs b/src/ServiceBouncer/MainForm.Designer.cs index 64834c0..ef2bff7 100644 --- a/src/ServiceBouncer/MainForm.Designer.cs +++ b/src/ServiceBouncer/MainForm.Designer.cs @@ -35,7 +35,11 @@ private void InitializeComponent() this.toolStripContainer = new System.Windows.Forms.ToolStripContainer(); this.statusStrip = new System.Windows.Forms.StatusStrip(); this.toolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.servicesDataGridView = new System.Windows.Forms.DataGridView(); + this.dataGridView = new System.Windows.Forms.DataGridView(); + this.dataGridStatusIcon = new System.Windows.Forms.DataGridViewImageColumn(); + this.dataGridName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridStatus = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridStatupType = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.contextMenuStartItem = new System.Windows.Forms.ToolStripMenuItem(); this.contextMenuStopItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -51,6 +55,7 @@ private void InitializeComponent() this.contextMenuSpacer3 = new System.Windows.Forms.ToolStripSeparator(); this.contextMenuOpenLocation = new System.Windows.Forms.ToolStripMenuItem(); this.contextMenuAssemblyInfo = new System.Windows.Forms.ToolStripMenuItem(); + this.serviceViewModelBindingSource = new System.Windows.Forms.BindingSource(this.components); this.toolStrip = new System.Windows.Forms.ToolStrip(); this.toolStripConnectButton = new System.Windows.Forms.ToolStripButton(); this.toolStripConnectToTextBox = new System.Windows.Forms.ToolStripTextBox(); @@ -73,19 +78,14 @@ private void InitializeComponent() this.toolStripFilterIcon = new System.Windows.Forms.ToolStripLabel(); this.toolStripFilterBox = new System.Windows.Forms.ToolStripTextBox(); this.refreshTimer = new System.Windows.Forms.Timer(this.components); - this.dataGridStatusIcon = new System.Windows.Forms.DataGridViewImageColumn(); - this.dataGridName = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.dataGridStatus = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.dataGridStatupType = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.serviceViewModelBindingSource = new System.Windows.Forms.BindingSource(this.components); this.toolStripContainer.ContentPanel.SuspendLayout(); this.toolStripContainer.TopToolStripPanel.SuspendLayout(); this.toolStripContainer.SuspendLayout(); this.statusStrip.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.servicesDataGridView)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); this.contextMenu.SuspendLayout(); - this.toolStrip.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.serviceViewModelBindingSource)).BeginInit(); + this.toolStrip.SuspendLayout(); this.SuspendLayout(); // // toolStripContainer @@ -94,7 +94,7 @@ private void InitializeComponent() // toolStripContainer.ContentPanel // this.toolStripContainer.ContentPanel.Controls.Add(this.statusStrip); - this.toolStripContainer.ContentPanel.Controls.Add(this.servicesDataGridView); + this.toolStripContainer.ContentPanel.Controls.Add(this.dataGridView); this.toolStripContainer.ContentPanel.Size = new System.Drawing.Size(1114, 329); this.toolStripContainer.Dock = System.Windows.Forms.DockStyle.Fill; this.toolStripContainer.Location = new System.Drawing.Point(0, 0); @@ -125,24 +125,24 @@ private void InitializeComponent() this.toolStripStatusLabel.Name = "toolStripStatusLabel"; this.toolStripStatusLabel.Size = new System.Drawing.Size(0, 17); // - // servicesDataGridView - // - this.servicesDataGridView.AllowUserToAddRows = false; - this.servicesDataGridView.AllowUserToDeleteRows = false; - this.servicesDataGridView.AllowUserToResizeRows = false; - this.servicesDataGridView.AutoGenerateColumns = false; - this.servicesDataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; - this.servicesDataGridView.BackgroundColor = System.Drawing.Color.White; - this.servicesDataGridView.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.servicesDataGridView.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleHorizontal; - this.servicesDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.servicesDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + // dataGridView + // + this.dataGridView.AllowUserToAddRows = false; + this.dataGridView.AllowUserToDeleteRows = false; + this.dataGridView.AllowUserToResizeRows = false; + this.dataGridView.AutoGenerateColumns = false; + this.dataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; + this.dataGridView.BackgroundColor = System.Drawing.Color.White; + this.dataGridView.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dataGridView.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleHorizontal; + this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.dataGridStatusIcon, this.dataGridName, this.dataGridStatus, this.dataGridStatupType}); - this.servicesDataGridView.ContextMenuStrip = this.contextMenu; - this.servicesDataGridView.DataSource = this.serviceViewModelBindingSource; + this.dataGridView.ContextMenuStrip = this.contextMenu; + this.dataGridView.DataSource = this.serviceViewModelBindingSource; dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window; dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -151,13 +151,13 @@ private void InitializeComponent() dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.servicesDataGridView.DefaultCellStyle = dataGridViewCellStyle1; - this.servicesDataGridView.Dock = System.Windows.Forms.DockStyle.Fill; - this.servicesDataGridView.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); - this.servicesDataGridView.Location = new System.Drawing.Point(0, 0); - this.servicesDataGridView.Margin = new System.Windows.Forms.Padding(7); - this.servicesDataGridView.Name = "servicesDataGridView"; - this.servicesDataGridView.ReadOnly = true; + this.dataGridView.DefaultCellStyle = dataGridViewCellStyle1; + this.dataGridView.Dock = System.Windows.Forms.DockStyle.Fill; + this.dataGridView.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.dataGridView.Location = new System.Drawing.Point(0, 0); + this.dataGridView.Margin = new System.Windows.Forms.Padding(7); + this.dataGridView.Name = "dataGridView"; + this.dataGridView.ReadOnly = true; dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Control; dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -166,12 +166,53 @@ private void InitializeComponent() dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.servicesDataGridView.RowHeadersDefaultCellStyle = dataGridViewCellStyle2; - this.servicesDataGridView.RowHeadersVisible = false; - this.servicesDataGridView.RowTemplate.Height = 25; - this.servicesDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; - this.servicesDataGridView.Size = new System.Drawing.Size(1114, 329); - this.servicesDataGridView.TabIndex = 0; + this.dataGridView.RowHeadersDefaultCellStyle = dataGridViewCellStyle2; + this.dataGridView.RowHeadersVisible = false; + this.dataGridView.RowTemplate.Height = 25; + this.dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dataGridView.Size = new System.Drawing.Size(1114, 329); + this.dataGridView.TabIndex = 0; + // + // dataGridStatusIcon + // + this.dataGridStatusIcon.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; + this.dataGridStatusIcon.DataPropertyName = "StatusIcon"; + this.dataGridStatusIcon.FillWeight = 50.76142F; + this.dataGridStatusIcon.HeaderText = ""; + this.dataGridStatusIcon.MinimumWidth = 30; + this.dataGridStatusIcon.Name = "dataGridStatusIcon"; + this.dataGridStatusIcon.ReadOnly = true; + this.dataGridStatusIcon.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridStatusIcon.Width = 30; + // + // dataGridName + // + this.dataGridName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.dataGridName.DataPropertyName = "Name"; + this.dataGridName.FillWeight = 70.05687F; + this.dataGridName.HeaderText = "Display Name"; + this.dataGridName.Name = "dataGridName"; + this.dataGridName.ReadOnly = true; + // + // dataGridStatus + // + this.dataGridStatus.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.dataGridStatus.DataPropertyName = "Status"; + this.dataGridStatus.FillWeight = 70.05687F; + this.dataGridStatus.HeaderText = "Status"; + this.dataGridStatus.Name = "dataGridStatus"; + this.dataGridStatus.ReadOnly = true; + this.dataGridStatus.Width = 68; + // + // dataGridStatupType + // + this.dataGridStatupType.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.dataGridStatupType.DataPropertyName = "StartupType"; + this.dataGridStatupType.FillWeight = 209.125F; + this.dataGridStatupType.HeaderText = "Startup Type"; + this.dataGridStatupType.Name = "dataGridStatupType"; + this.dataGridStatupType.ReadOnly = true; + this.dataGridStatupType.Width = 102; // // contextMenu // @@ -285,6 +326,10 @@ private void InitializeComponent() this.contextMenuAssemblyInfo.Text = "Assembly Info"; this.contextMenuAssemblyInfo.Click += new System.EventHandler(this.AssemblyInfoClick); // + // serviceViewModelBindingSource + // + this.serviceViewModelBindingSource.DataSource = typeof(ServiceBouncer.ServiceViewModel); + // // toolStrip // this.toolStrip.AllowMerge = false; @@ -320,7 +365,7 @@ private void InitializeComponent() // toolStripConnectButton // this.toolStripConnectButton.AutoSize = false; - this.toolStripConnectButton.Image = global::ServiceBouncer.Properties.Resources.Disconnected; + this.toolStripConnectButton.Image = global::ServiceBouncer.Properties.Resources.Connect; this.toolStripConnectButton.ImageTransparentColor = System.Drawing.Color.Magenta; this.toolStripConnectButton.Name = "toolStripConnectButton"; this.toolStripConnectButton.Size = new System.Drawing.Size(100, 29); @@ -496,51 +541,6 @@ private void InitializeComponent() this.refreshTimer.Interval = 1000; this.refreshTimer.Tick += new System.EventHandler(this.RefreshTimerTicked); // - // dataGridStatusIcon - // - this.dataGridStatusIcon.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; - this.dataGridStatusIcon.DataPropertyName = "StatusIcon"; - this.dataGridStatusIcon.FillWeight = 50.76142F; - this.dataGridStatusIcon.HeaderText = ""; - this.dataGridStatusIcon.MinimumWidth = 30; - this.dataGridStatusIcon.Name = "dataGridStatusIcon"; - this.dataGridStatusIcon.ReadOnly = true; - this.dataGridStatusIcon.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.dataGridStatusIcon.Width = 30; - // - // dataGridName - // - this.dataGridName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.dataGridName.DataPropertyName = "Name"; - this.dataGridName.FillWeight = 70.05687F; - this.dataGridName.HeaderText = "Display Name"; - this.dataGridName.Name = "dataGridName"; - this.dataGridName.ReadOnly = true; - // - // dataGridStatus - // - this.dataGridStatus.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.dataGridStatus.DataPropertyName = "Status"; - this.dataGridStatus.FillWeight = 70.05687F; - this.dataGridStatus.HeaderText = "Status"; - this.dataGridStatus.Name = "dataGridStatus"; - this.dataGridStatus.ReadOnly = true; - this.dataGridStatus.Width = 68; - // - // dataGridStatupType - // - this.dataGridStatupType.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.dataGridStatupType.DataPropertyName = "StartupType"; - this.dataGridStatupType.FillWeight = 209.125F; - this.dataGridStatupType.HeaderText = "Startup Type"; - this.dataGridStatupType.Name = "dataGridStatupType"; - this.dataGridStatupType.ReadOnly = true; - this.dataGridStatupType.Width = 102; - // - // serviceViewModelBindingSource - // - this.serviceViewModelBindingSource.DataSource = typeof(ServiceBouncer.ServiceViewModel); - // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); @@ -564,11 +564,11 @@ private void InitializeComponent() this.toolStripContainer.PerformLayout(); this.statusStrip.ResumeLayout(false); this.statusStrip.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.servicesDataGridView)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); this.contextMenu.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.serviceViewModelBindingSource)).EndInit(); this.toolStrip.ResumeLayout(false); this.toolStrip.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.serviceViewModelBindingSource)).EndInit(); this.ResumeLayout(false); } @@ -579,7 +579,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripButton toolStripStartButton; private System.Windows.Forms.ToolStripButton toolStripStopButton; private System.Windows.Forms.Timer refreshTimer; - private System.Windows.Forms.DataGridView servicesDataGridView; + private System.Windows.Forms.DataGridView dataGridView; private System.Windows.Forms.BindingSource serviceViewModelBindingSource; private System.Windows.Forms.ToolStripButton toolStripRestartButton; private System.Windows.Forms.ToolStripTextBox toolStripFilterBox; diff --git a/src/ServiceBouncer/MainForm.cs b/src/ServiceBouncer/MainForm.cs index cc69861..f0c90a2 100644 --- a/src/ServiceBouncer/MainForm.cs +++ b/src/ServiceBouncer/MainForm.cs @@ -2,6 +2,7 @@ using ServiceBouncer.ComponentModel; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.ServiceProcess; using System.Threading; @@ -12,7 +13,7 @@ namespace ServiceBouncer { public partial class MainForm : Form { - private readonly SortableBindingList services; + private readonly List services; private bool isActive; private string machineHostname; @@ -22,8 +23,7 @@ public MainForm() isActive = true; machineHostname = Environment.MachineName; toolStripConnectToTextBox.Text = machineHostname; - services = new SortableBindingList(); - + services = new List(); #if NET45 //In NET45 startup type requires WMI, so it doesn't auto refresh dataGridStatupType.HeaderText = $"{dataGridStatupType.HeaderText} (No Auto Refresh)"; @@ -49,7 +49,9 @@ private void FormLoaded(object sender, EventArgs e) PerformAction(async () => { CheckFrameworkValid(); + Connect(); await Reload(); + dataGridView.Sort(dataGridName, ListSortDirection.Ascending); }); } @@ -270,16 +272,24 @@ private async Task Reload() private void PopulateFilteredDataview() { + var sortColumn = dataGridView.SortedColumn; + var sortOrder = ListSortDirection.Ascending; + if (dataGridView.SortOrder == SortOrder.Descending) sortOrder = ListSortDirection.Descending; + if (!string.IsNullOrWhiteSpace(toolStripFilterBox.Text)) { - servicesDataGridView.DataSource = services.Where(service => service.Name.IndexOf(toolStripFilterBox.Text, StringComparison.OrdinalIgnoreCase) >= 0).OrderBy(x => x.Name).ToList(); + dataGridView.DataSource = new SortableBindingList(services.Where(service => service.Name.IndexOf(toolStripFilterBox.Text, StringComparison.OrdinalIgnoreCase) >= 0).ToList()); } else { - servicesDataGridView.DataSource = services; + dataGridView.DataSource = new SortableBindingList(services); } - servicesDataGridView.Refresh(); + dataGridView.Refresh(); + if (sortColumn != null) + { + dataGridView.Sort(sortColumn, sortOrder); + } } private void Connect() @@ -287,7 +297,7 @@ private void Connect() toolStripConnectButton.Text = "Disconnect"; toolStripConnectButton.ToolTipText = "Disconnect"; toolStripConnectButton.Tag = "Connected"; - toolStripConnectButton.Image = Properties.Resources.Connected; + toolStripConnectButton.Image = Properties.Resources.Disconnect; toolStripStatusLabel.Text = $"Connected to {machineHostname}."; } @@ -296,7 +306,7 @@ private void Disconnect() toolStripConnectButton.Text = "Connect"; toolStripConnectButton.ToolTipText = "Connect"; toolStripConnectButton.Tag = "Disconnected"; - toolStripConnectButton.Image = Properties.Resources.Disconnected; + toolStripConnectButton.Image = Properties.Resources.Connect; toolStripStatusLabel.Text = "Disconnected"; services.Clear(); PopulateFilteredDataview(); @@ -324,7 +334,7 @@ private void SetTitle() private void PerformOperation(Func actionToPerform) { - var selectedServices = servicesDataGridView.SelectedRows.OfType().Select(g => g.DataBoundItem).OfType().ToList(); + var selectedServices = dataGridView.SelectedRows.OfType().Select(g => g.DataBoundItem).OfType().ToList(); PerformOperation(actionToPerform, selectedServices); } diff --git a/src/ServiceBouncer/Properties/Resources.Designer.cs b/src/ServiceBouncer/Properties/Resources.Designer.cs index cfa625c..7dae7bf 100644 --- a/src/ServiceBouncer/Properties/Resources.Designer.cs +++ b/src/ServiceBouncer/Properties/Resources.Designer.cs @@ -83,9 +83,9 @@ internal class Resources { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap Connected { + internal static System.Drawing.Bitmap Connect { get { - object obj = ResourceManager.GetObject("Connected", resourceCulture); + object obj = ResourceManager.GetObject("Connect", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -103,9 +103,9 @@ internal class Resources { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap Disconnected { + internal static System.Drawing.Bitmap Disconnect { get { - object obj = ResourceManager.GetObject("Disconnected", resourceCulture); + object obj = ResourceManager.GetObject("Disconnect", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } diff --git a/src/ServiceBouncer/Properties/Resources.resx b/src/ServiceBouncer/Properties/Resources.resx index 5611289..626070d 100644 --- a/src/ServiceBouncer/Properties/Resources.resx +++ b/src/ServiceBouncer/Properties/Resources.resx @@ -127,9 +127,6 @@ ..\Icons\Running-State-Paused.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Icons\Disconnected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Icons\Restart.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -151,9 +148,6 @@ ..\Icons\Browse.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Icons\Connected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Icons\Filter.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -181,4 +175,10 @@ ..\Icons\Reconnect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Icons\Connect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Icons\Disconnect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/src/ServiceBouncer/ServiceBouncer.csproj b/src/ServiceBouncer/ServiceBouncer.csproj index 4e418e7..b2267ba 100644 --- a/src/ServiceBouncer/ServiceBouncer.csproj +++ b/src/ServiceBouncer/ServiceBouncer.csproj @@ -163,7 +163,9 @@ + +