Improved information and error feedback to the user.

This commit is contained in:
2016-11-11 17:42:59 -06:00
parent ad3fa573b8
commit 1f700869c7
8 changed files with 140 additions and 56 deletions
+131 -47
View File
@@ -1693,22 +1693,33 @@ namespace AdvertsingProfitControl
DataTable trimmedTable; DataTable trimmedTable;
DataTable updateTable; DataTable updateTable;
informationLabel.Text = @"Compressing data tables..."; informationLabel.Text = @"Compressing data tables...";
errorLabel.Text = "";
var operationStatus = ConstructCleanedSalesTable("Projections", dateId, out trimmedTable, out updateTable); var operationStatus = ConstructCleanedSalesTable("Projections", dateId, out trimmedTable, out updateTable);
if (operationStatus == TrimmingOperationResult.FailedToTrim) if (operationStatus == TrimmingOperationResult.FailedToTrim)
{ {
informationLabel.Text = @"Failed to trim the Projections table."; errorLabel.Text = @"Failed to trim the Projections table.";
return; return;
} }
ProcessTrimmingStatusResult(projectionsDataGridView, "Projections", operationStatus, trimmedTable, updateTable); if (!ProcessTrimmingStatusResult(projectionsDataGridView, "Projections", operationStatus, trimmedTable, updateTable)) return;
trimmedTable.Rows.Clear(); trimmedTable.Rows.Clear();
updateTable.Rows.Clear(); updateTable.Rows.Clear();
operationStatus = ConstructCleanedInventoryTable(dateId, out trimmedTable, out updateTable); operationStatus = ConstructCleanedInventoryTable(dateId, out trimmedTable, out updateTable);
if (operationStatus == TrimmingOperationResult.FailedToTrim) if (operationStatus == TrimmingOperationResult.FailedToTrim)
{ {
informationLabel.Text = @"Failed to trim the Inventory table."; errorLabel.Text = @"Failed to trim the Inventory table.";
return; return;
} }
ProcessTrimmingStatusForInventory(operationStatus, trimmedTable, updateTable); if (!ProcessTrimmingStatusForInventory(operationStatus, trimmedTable, updateTable)) return;
trimmedTable.Rows.Clear();
updateTable.Rows.Clear();
operationStatus = ConstructCleanedSalesTable("ActualSales", dateId, out trimmedTable, out updateTable);
if (operationStatus == TrimmingOperationResult.FailedToTrim)
{
errorLabel.Text = @"Failed to trim the Actual Sales table.";
return;
}
if (!ProcessTrimmingStatusResult(actualSalesDataGridView, "ActualSales", operationStatus, trimmedTable, updateTable)) return;
informationLabel.Text = @"All operations completed successfully.";
//Create the transaction scope. //Create the transaction scope.
//By default the TransactionScopeOption is "Required", so if an ambient transaction does not //By default the TransactionScopeOption is "Required", so if an ambient transaction does not
//exist then the new transaction that is made (in the first method) becomes the root transaction. //exist then the new transaction that is made (in the first method) becomes the root transaction.
@@ -2176,121 +2187,194 @@ namespace AdvertsingProfitControl
return TrimmingOperationResult.CreatedNewInsertionAndUpdateTables; return TrimmingOperationResult.CreatedNewInsertionAndUpdateTables;
} }
private void ProcessTrimmingStatusResult(DataGridView dataGridView, string tableName, TrimmingOperationResult operationStatus, DataTable trimmedTable, DataTable updateTable) private bool ProcessTrimmingStatusResult(DataGridView dataGridView, string tableName, TrimmingOperationResult operationStatus, DataTable trimmedTable, DataTable updateTable)
{ {
//Create the database interaction objects. //Create the database interaction objects.
var dbT = new DatabaseTracker(); var dbT = new DatabaseTracker();
var dbW = new DatabaseWriter(dbT.DatabaseConnectionString); var dbW = new DatabaseWriter(dbT.DatabaseConnectionString);
DbWriterStatus dbWriterStatus; DbWriterStatus dbWriterStatus;
var successful = false;
switch (operationStatus) switch (operationStatus)
{ {
case TrimmingOperationResult.NoChangesRequired: case TrimmingOperationResult.NoChangesRequired:
informationLabel.Text += Environment.NewLine + @"No changes for the " + tableName + @" table detected."; informationLabel.Text += Environment.NewLine + @"No changes for the " + tableName + @" table detected.";
successful = true;
break; break;
case TrimmingOperationResult.CreatedNewInsertionTable: case TrimmingOperationResult.CreatedNewInsertionTable:
informationLabel.Text += Environment.NewLine + @"Inserting new changes to the " + tableName + @" table."; informationLabel.Text += Environment.NewLine + @"Inserting new changes to the " + tableName + @" table.";
dbWriterStatus = dbW.InsertIntoSalesTable(trimmedTable, dbT.DatabaseConnectionString); dbWriterStatus = dbW.InsertIntoSalesTable(trimmedTable, dbT.DatabaseConnectionString);
//Spin through the collection and update the affected rows. if (dbWriterStatus.GetErrorMessage() == string.Empty)
foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{ {
dataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.Id].Value = rowIndex.Value; //Spin through the collection and update the affected rows.
dataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.IsDirty].Value = false; foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{
dataGridView.Rows[rowIndex.Key - 1].Cells[(int) SalesTableColumns.Id].Value = rowIndex.Value;
dataGridView.Rows[rowIndex.Key - 1].Cells[(int) SalesTableColumns.IsDirty].Value = false;
}
informationLabel.Text += Environment.NewLine + tableName + @" table successfully added to the database.";
successful = true;
}
else
{
errorLabel.Text = @"Failed to insert " + trimmedTable + @" into the database.";
} }
informationLabel.Text += Environment.NewLine + tableName + @" table successfully added to the database.";
break; break;
case TrimmingOperationResult.CreatedUpdateTable: case TrimmingOperationResult.CreatedUpdateTable:
informationLabel.Text += Environment.NewLine + @"Updating changes made to the " + tableName + @" table."; informationLabel.Text += Environment.NewLine + @"Updating changes made to the " + tableName + @" table.";
dbWriterStatus = dbW.UpdateSalesTable(updateTable, dbT.DatabaseConnectionString); dbWriterStatus = dbW.UpdateSalesTable(updateTable, dbT.DatabaseConnectionString);
//Spin through the collection and update the affected rows. if (dbWriterStatus.GetErrorMessage() == string.Empty)
foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{ {
//Only reset the IsDirty value to false since the updates when through. //Spin through the collection and update the affected rows.
dataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.IsDirty].Value = false; foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{
//Only reset the IsDirty value to false since the updates when through.
dataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.IsDirty].Value = false;
}
informationLabel.Text += Environment.NewLine + tableName + @" table successfully updated.";
successful = true;
}
else
{
errorLabel.Text = @"Failed to update the " + trimmedTable + @" table.";
} }
informationLabel.Text += Environment.NewLine + tableName + @" table successfully updated.";
break; break;
case TrimmingOperationResult.CreatedNewInsertionAndUpdateTables: case TrimmingOperationResult.CreatedNewInsertionAndUpdateTables:
//Insert the new values... //Insert the new values...
informationLabel.Text += Environment.NewLine + @"Inserting new changes to the " + tableName + @" table."; informationLabel.Text += Environment.NewLine + @"Inserting new changes to the " + tableName + @" table.";
dbWriterStatus = dbW.InsertIntoSalesTable(trimmedTable, dbT.DatabaseConnectionString); dbWriterStatus = dbW.InsertIntoSalesTable(trimmedTable, dbT.DatabaseConnectionString);
//Spin through the collection and update the affected rows. if (dbWriterStatus.GetErrorMessage() == string.Empty)
foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{ {
dataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.Id].Value = rowIndex.Value; //Spin through the collection and update the affected rows.
dataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.IsDirty].Value = false; foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{
dataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.Id].Value = rowIndex.Value;
dataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.IsDirty].Value = false;
}
informationLabel.Text += Environment.NewLine + tableName + @" table successfully added to the database.";
successful = true;
}
else
{
errorLabel.Text = @"Failed to insert " + trimmedTable + @" into the database.";
} }
//... and update the existing values. //... and update the existing values.
informationLabel.Text += Environment.NewLine + @"Updating changes made to the " + tableName + @" table."; informationLabel.Text += Environment.NewLine + @"Updating changes made to the " + tableName + @" table.";
dbWriterStatus = dbW.UpdateSalesTable(updateTable, dbT.DatabaseConnectionString); dbWriterStatus = dbW.UpdateSalesTable(updateTable, dbT.DatabaseConnectionString);
//Spin through the collection and update the affected rows. if (dbWriterStatus.GetErrorMessage() == string.Empty)
foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{ {
//Only reset the IsDirty value to false since the updates when through. //Spin through the collection and update the affected rows.
dataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.IsDirty].Value = false; foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{
//Only reset the IsDirty value to false since the updates when through.
dataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.IsDirty].Value = false;
}
informationLabel.Text += Environment.NewLine + tableName + @" table successfully updated.";
successful = true;
}
else
{
errorLabel.Text = @"Failed to update the " + trimmedTable + @" table.";
successful = false;
} }
informationLabel.Text += Environment.NewLine + @"All operations completed successfully.";
break; break;
} }
dataGridView.RefreshEdit(); dataGridView.RefreshEdit();
return successful;
} }
private void ProcessTrimmingStatusForInventory(TrimmingOperationResult operationStatus, DataTable trimmedTable, DataTable updateTable) private bool ProcessTrimmingStatusForInventory(TrimmingOperationResult operationStatus, DataTable trimmedTable, DataTable updateTable)
{ {
//Create the database interaction objects. //Create the database interaction objects.
var dbT = new DatabaseTracker(); var dbT = new DatabaseTracker();
var dbW = new DatabaseWriter(dbT.DatabaseConnectionString); var dbW = new DatabaseWriter(dbT.DatabaseConnectionString);
DbWriterStatus dbWriterStatus; DbWriterStatus dbWriterStatus;
var successful = false;
switch (operationStatus) switch (operationStatus)
{ {
case TrimmingOperationResult.NoChangesRequired: case TrimmingOperationResult.NoChangesRequired:
informationLabel.Text += Environment.NewLine + @"No changes for the Inventory table detected."; informationLabel.Text += Environment.NewLine + @"No changes to the Inventory table detected.";
successful = true;
break; break;
case TrimmingOperationResult.CreatedNewInsertionTable: case TrimmingOperationResult.CreatedNewInsertionTable:
informationLabel.Text += Environment.NewLine + @"Inserting new changes to the Inventory table."; informationLabel.Text += Environment.NewLine + @"Inserting new changes to the Inventory table.";
dbWriterStatus = dbW.InsertIntoInventoryTable(trimmedTable, dbT.DatabaseConnectionString); dbWriterStatus = dbW.InsertIntoInventoryTable(trimmedTable, dbT.DatabaseConnectionString);
//Spin through the collection and update the affected rows. if (dbWriterStatus.GetErrorMessage() == string.Empty)
foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{ {
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.Id].Value = rowIndex.Value; //Spin through the collection and update the affected rows.
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.IsDirty].Value = false; foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.Id].Value = rowIndex.Value;
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.IsDirty].Value = false;
}
informationLabel.Text += Environment.NewLine + @"Inventory table successfully added to the database.";
successful = true;
}
else
{
errorLabel.Text = @"Failed to insert Inventory table into the database.";
} }
informationLabel.Text += Environment.NewLine + @"Inventory table successfully added to the database.";
break; break;
case TrimmingOperationResult.CreatedUpdateTable: case TrimmingOperationResult.CreatedUpdateTable:
informationLabel.Text += Environment.NewLine + @"Updating changes made to the Inventory table."; informationLabel.Text += Environment.NewLine + @"Updating changes made to the Inventory table.";
dbWriterStatus = dbW.UpdateInventoryTable(updateTable, dbT.DatabaseConnectionString); dbWriterStatus = dbW.UpdateInventoryTable(updateTable, dbT.DatabaseConnectionString);
//Spin through the collection and update the affected rows. if (dbWriterStatus.GetErrorMessage() == string.Empty)
foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{ {
//Only reset the IsDirty value to false since the updates when through. //Spin through the collection and update the affected rows.
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.IsDirty].Value = false; foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{
//Only reset the IsDirty value to false since the updates when through.
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.IsDirty].Value = false;
}
informationLabel.Text += Environment.NewLine + @"Inventory table successfully updated.";
successful = true;
}
else
{
errorLabel.Text = @"Failed to update the changes in the Inventory table.";
} }
informationLabel.Text += Environment.NewLine + @"Inventory table successfully updated.";
break; break;
case TrimmingOperationResult.CreatedNewInsertionAndUpdateTables: case TrimmingOperationResult.CreatedNewInsertionAndUpdateTables:
//Insert the new values... //Insert the new values...
informationLabel.Text += Environment.NewLine + @"Inserting new changes to the Inventory table."; informationLabel.Text += Environment.NewLine + @"Inserting new changes to the Inventory table.";
dbWriterStatus = dbW.InsertIntoInventoryTable(trimmedTable, dbT.DatabaseConnectionString); dbWriterStatus = dbW.InsertIntoInventoryTable(trimmedTable, dbT.DatabaseConnectionString);
//Spin through the collection and update the affected rows. if (dbWriterStatus.GetErrorMessage() == string.Empty)
foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{ {
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.Id].Value = rowIndex.Value; //Spin through the collection and update the affected rows.
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.IsDirty].Value = false; foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.Id].Value = rowIndex.Value;
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.IsDirty].Value = false;
}
informationLabel.Text += Environment.NewLine + @"Inventory table successfully added to the database.";
successful = true;
}
else
{
errorLabel.Text = @"Failed to insert Inventory table into the database.";
} }
//... and update the existing values.
informationLabel.Text += Environment.NewLine + @"Updating changes made to the Inventory table.";
dbWriterStatus = dbW.UpdateInventoryTable(updateTable, dbT.DatabaseConnectionString); dbWriterStatus = dbW.UpdateInventoryTable(updateTable, dbT.DatabaseConnectionString);
//Spin through the collection and update the affected rows. if (dbWriterStatus.GetErrorMessage() == string.Empty)
foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{ {
//Only reset the IsDirty value to false since the updates when through. //Spin through the collection and update the affected rows.
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.IsDirty].Value = false; foreach (var rowIndex in dbWriterStatus.GetRowCollection())
{
//Only reset the IsDirty value to false since the updates when through.
inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int) InventoryTableColumns.IsDirty]
.Value = false;
}
informationLabel.Text += Environment.NewLine + @"Inventory table successfully updated.";
successful = true;
}
else
{
errorLabel.Text = @"Failed to update the changes in the Inventory table.";
} }
informationLabel.Text += Environment.NewLine + @"All operations completed successfully.";
break; break;
} }
inventoryDataGridView.RefreshEdit(); inventoryDataGridView.RefreshEdit();
return successful;
} }
#endregion #endregion
} }
} }
Binary file not shown.
@@ -14,7 +14,7 @@
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms> </dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>RAx8Npq1SZBvpDMCKEn72t59h34L92CEq1Pbw42lEP0=</dsig:DigestValue> <dsig:DigestValue>b+dnpfYfjG4ZhWDVMNt4VWQJIitMpgUqU/izPcTmc9E=</dsig:DigestValue>
</hash> </hash>
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
@@ -43,14 +43,14 @@
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
<dependency> <dependency>
<dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="AdvertsingProfitControl.exe" size="3521536"> <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="AdvertsingProfitControl.exe" size="3522560">
<assemblyIdentity name="AdvertsingProfitControl" version="0.9.5.2" language="neutral" processorArchitecture="amd64" /> <assemblyIdentity name="AdvertsingProfitControl" version="0.9.5.2" language="neutral" processorArchitecture="amd64" />
<hash> <hash>
<dsig:Transforms> <dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms> </dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>WhwHiylhNOOwlXzM3cD3DBPd29Ezk+2JmpmdTTNjSDI=</dsig:DigestValue> <dsig:DigestValue>C6TdhIcXFKDjcoa3VS25QEYS1igSVlAG0W3BGBQN3Vw=</dsig:DigestValue>
</hash> </hash>
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
@@ -14,7 +14,7 @@
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms> </dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>RAx8Npq1SZBvpDMCKEn72t59h34L92CEq1Pbw42lEP0=</dsig:DigestValue> <dsig:DigestValue>b+dnpfYfjG4ZhWDVMNt4VWQJIitMpgUqU/izPcTmc9E=</dsig:DigestValue>
</hash> </hash>
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
@@ -43,14 +43,14 @@
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
<dependency> <dependency>
<dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="AdvertsingProfitControl.exe" size="3521536"> <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="AdvertsingProfitControl.exe" size="3522560">
<assemblyIdentity name="AdvertsingProfitControl" version="0.9.5.2" language="neutral" processorArchitecture="amd64" /> <assemblyIdentity name="AdvertsingProfitControl" version="0.9.5.2" language="neutral" processorArchitecture="amd64" />
<hash> <hash>
<dsig:Transforms> <dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms> </dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>WhwHiylhNOOwlXzM3cD3DBPd29Ezk+2JmpmdTTNjSDI=</dsig:DigestValue> <dsig:DigestValue>C6TdhIcXFKDjcoa3VS25QEYS1igSVlAG0W3BGBQN3Vw=</dsig:DigestValue>
</hash> </hash>
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
@@ -14,7 +14,7 @@
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms> </dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>RAx8Npq1SZBvpDMCKEn72t59h34L92CEq1Pbw42lEP0=</dsig:DigestValue> <dsig:DigestValue>b+dnpfYfjG4ZhWDVMNt4VWQJIitMpgUqU/izPcTmc9E=</dsig:DigestValue>
</hash> </hash>
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
@@ -43,14 +43,14 @@
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
<dependency> <dependency>
<dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="AdvertsingProfitControl.exe" size="3521536"> <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="AdvertsingProfitControl.exe" size="3522560">
<assemblyIdentity name="AdvertsingProfitControl" version="0.9.5.2" language="neutral" processorArchitecture="amd64" /> <assemblyIdentity name="AdvertsingProfitControl" version="0.9.5.2" language="neutral" processorArchitecture="amd64" />
<hash> <hash>
<dsig:Transforms> <dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms> </dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>WhwHiylhNOOwlXzM3cD3DBPd29Ezk+2JmpmdTTNjSDI=</dsig:DigestValue> <dsig:DigestValue>C6TdhIcXFKDjcoa3VS25QEYS1igSVlAG0W3BGBQN3Vw=</dsig:DigestValue>
</hash> </hash>
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>