From 3fcf4585a3ffa0d0b32f05af3a4dbfb9aa9fb8bf Mon Sep 17 00:00:00 2001 From: jmulhall00 Date: Wed, 16 Sep 2026 08:47:32 -0400 Subject: [PATCH] Final stage, ready for big data up --- SpravatoETL/Project.params | 21 + SpravatoETL/SpravatoAuditImport.dtsx | 2425 +++++++++++++++----------- SpravatoETL/SpravatoETL.dtproj | 10 +- 3 files changed, 1407 insertions(+), 1049 deletions(-) diff --git a/SpravatoETL/Project.params b/SpravatoETL/Project.params index 8caaee5..e96cf0b 100644 --- a/SpravatoETL/Project.params +++ b/SpravatoETL/Project.params @@ -63,4 +63,25 @@ SSIS:Name="DataType">18 + + + {ba1993f5-586e-4726-8c8d-613c918be1c0} + + + 0 + 0 + 0 + 2025 + 9 + + \ No newline at end of file diff --git a/SpravatoETL/SpravatoAuditImport.dtsx b/SpravatoETL/SpravatoAuditImport.dtsx index 5060297..1dac16c 100644 --- a/SpravatoETL/SpravatoAuditImport.dtsx +++ b/SpravatoETL/SpravatoAuditImport.dtsx @@ -12,8 +12,8 @@ DTS:LocaleID="1033" DTS:ObjectName="SpravatoAuditImport" DTS:PackageType="5" - DTS:VersionBuild="66" - DTS:VersionGUID="{210EF0DC-4CA9-47F1-9622-033CF9A901AB}"> + DTS:VersionBuild="87" + DTS:VersionGUID="{49DDC2F4-D6BC-46C0-909D-A5B0280868CB}"> 8 @@ -40,7 +40,7 @@ AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA3sg5/WnZgE6AXM2AQAN7vwAAAAAIAAAARABUAFMAAAAQZgAAAAEAACAAAAAaXht5dLqn+z7ozOwacyZ7BmIb1G5RWYYItmattlyL7AAAAAAOgAAAAAIAACAAAAAJv8hz2eXum5xNI/bZPXyKVmwgBJWNvZlxs9ciQNte1kAAAADudeg19cOlvLiqLYGHuTbIp2wBAvARhpy8ILfWPSbnIBGkAqQzDCkFBtWqt8B8Us/fgoOhwEfGr4bSMZ5lBRFxQAAAAGnOcRTb0CB+E4eZMc16NRUIiSJN8Mk+oYkNUY5KxAb7Xi2oiBjurZSCC3ogsjKVakSYxReBGP8em9HaaCE1l3E + Encrypted="1">AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA3sg5/WnZgE6AXM2AQAN7vwAAAAAIAAAARABUAFMAAAAQZgAAAAEAACAAAAAxyy0b1eA+OVyJWQd0iHtXcngSIsEnhtXn9lH+lr2TqQAAAAAOgAAAAAIAACAAAADUNU1/9VNrAzqjAeDdks4NnFweCw2VoUmRnhXPUb1Xd0AAAAA01lK1tqkT7WzdmW0X3BxyVpWIHdBqB6hGF4GSDl/YZhGz/ZO1SpVbXsKeWs1FUESZjfNOBIrTfmjkEIxkI0nQQAAAABhrp5gVSRXQMG6j95VGLYgG1JZulQoW69P/50jKZTgbxNG+5kPHkRzuPuMuuYbZiv2Mg4oSbYFtudQHfcpiJZk @@ -65,7 +65,7 @@ DTS:ObjectName="FilePattern"> Admin vs Dispensed SMC*.xlsx + DTS:Name="ParameterValue">Admin Vs Dispensed SMC20260104-0110.xlsx \\retreathealthcare.org\network\Data\PHRMCY\Pharmacy Metrics\2026 Metrics\2026 Spravato Audit + DTS:Name="ParameterValue">\\retreathealthcare.org\network\Data\PHRMCY\Pharmacy Metrics @@ -163,6 +163,15 @@ DTS:DataType="8" xml:space="preserve"> + + 0 + 0 + + 0 + + DTS:ThreadHint="1"> - - - - - - - - - - - - + Folder="\\retreathealthcare.org\network\Data\PHRMCY\Pharmacy Metrics" /> + FileSpec="Admin Vs Dispensed SMC20260104-0110.xlsx" /> + Recurse="-1" /> @@ -418,23 +388,11 @@ - - @@ -479,6 +437,36 @@ VSTAMinorVersion="0" Language="CSharp" ReadWriteVariables="User::FilesProcessed"> + @@ -598,35 +586,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ]]> - -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_26e779e5f0794098bd25498a1ddbf8d9.Properties.Settings.get_Default():ST_26e779e5f0794098bd25498a1ddbf8d9.Properties.Sett" + - "ings")] - -namespace ST_26e779e5f0794098bd25498a1ddbf8d9.Properties { - - - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - private static Settings defaultInstance = new Settings(); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -}]]> ]]> +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("ST_26e779e5f0794098bd25498a1ddbf8d9")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ST_26e779e5f0794098bd25498a1ddbf8d9")] -[assembly: AssemblyCopyright("Copyright @ 2026")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_26e779e5f0794098bd25498a1ddbf8d9.Properties.Settings.get_Default():ST_26e779e5f0794098bd25498a1ddbf8d9.Properties.Sett" + + "ings")] -[assembly: AssemblyVersion("1.0.*")]]]> +namespace ST_26e779e5f0794098bd25498a1ddbf8d9.Properties { + + + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +}]]> @@ -3079,12 +3037,6 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=]]> cachedLength="255" cachedName="Total Dispensed" lineageId="Package\ForEach Spravato File\Load Spravato Stage\Read Spravato Workbook.Outputs[Excel Source Output].Columns[Total Dispensed]" /> - cachedLength="255" cachedName="Quantity" lineageId="Package\ForEach Spravato File\Load Spravato Stage\Read Spravato Workbook.Outputs[Excel Source Output].Columns[Quantity]" /> + @@ -3194,7 +3152,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=]]> dataType="wstr" errorOrTruncationOperation="Conversion" errorRowDisposition="FailComponent" - length="50" + length="255" lineageId="Package\ForEach Spravato File\Load Spravato Stage\Convert Spravato Fields.Outputs[Data Conversion Output].Columns[AdminDose_Text]" name="AdminDose_Text" truncationRowDisposition="FailComponent"> @@ -3203,7 +3161,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=]]> containsID="true" dataType="System.Int32" description="Specifies the input column used as the source of data for the conversion." - name="SourceInputColumnLineageID">#{Package\ForEach Spravato File\Load Spravato Stage\Read Spravato Workbook.Outputs[Excel Source Output].Columns[Admin Unit]} + name="SourceInputColumnLineageID">#{Package\ForEach Spravato File\Load Spravato Stage\Read Spravato Workbook.Outputs[Excel Source Output].Columns[Admin Dose]} @@ -4699,38 +4657,8 @@ FROM [Spravato Audit$A3:AG1048576] VSTAMajorVersion="17" VSTAMinorVersion="0" Language="CSharp" - ReadOnlyVariables="User::CurrentFilePath" - ReadWriteVariables="User::CurrentFileDateText,User::CurrentFileHash,User::CurrentFileModified,User::CurrentFileName,User::CurrentFileSize,User::CurrentFileSkipReason,User::FilesFound,User::LockedFilesSkipped,User::SkipCurrentFile"> - + ReadOnlyVariables="User::CurrentFilePath,$Project::MinimumSourceYear" + ReadWriteVariables="User::CurrentFileDateText,User::CurrentFileHash,User::CurrentFileModified,User::CurrentFileName,User::CurrentFileSize,User::CurrentFileSkipReason,User::CurrentSourceYear,User::FilesFound,User::LockedFilesSkipped,User::SkipCurrentFile"> @@ -4850,386 +4778,6 @@ using System.Runtime.CompilerServices; System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ]]> - - /// ScriptMain is the entry point class of the script. Do not change the name, attributes, - /// or parent of this class. - /// - [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] - public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase - { - #region Help: Using Integration Services variables and parameters in a script - /* To use a variable in this script, first ensure that the variable has been added to - * either the list contained in the ReadOnlyVariables property or the list contained in - * the ReadWriteVariables property of this script task, according to whether or not your - * code needs to write to the variable. To add the variable, save this script, close this instance of - * Visual Studio, and update the ReadOnlyVariables and - * ReadWriteVariables properties in the Script Transformation Editor window. - * To use a parameter in this script, follow the same steps. Parameters are always read-only. - * - * Example of reading from a variable: - * DateTime startTime = (DateTime) Dts.Variables["System::StartTime"].Value; - * - * Example of writing to a variable: - * Dts.Variables["User::myStringVariable"].Value = "new value"; - * - * Example of reading from a package parameter: - * int batchId = (int) Dts.Variables["$Package::batchId"].Value; - * - * Example of reading from a project parameter: - * int batchId = (int) Dts.Variables["$Project::batchId"].Value; - * - * Example of reading from a sensitive project parameter: - * int batchId = (int) Dts.Variables["$Project::batchId"].GetSensitiveValue(); - * */ - - #endregion - - #region Help: Firing Integration Services events from a script - /* This script task can fire events for logging purposes. - * - * Example of firing an error event: - * Dts.Events.FireError(18, "Process Values", "Bad value", "", 0); - * - * Example of firing an information event: - * Dts.Events.FireInformation(3, "Process Values", "Processing has started", "", 0, ref fireAgain) - * - * Example of firing a warning event: - * Dts.Events.FireWarning(14, "Process Values", "No values received for input", "", 0); - * */ - #endregion - - #region Help: Using Integration Services connection managers in a script - /* Some types of connection managers can be used in this script task. See the topic - * "Working with Connection Managers Programatically" for details. - * - * Example of using an ADO.Net connection manager: - * object rawConnection = Dts.Connections["Sales DB"].AcquireConnection(Dts.Transaction); - * SqlConnection myADONETConnection = (SqlConnection)rawConnection; - * //Use the connection in some code here, then release the connection - * Dts.Connections["Sales DB"].ReleaseConnection(rawConnection); - * - * Example of using a File connection manager - * object rawConnection = Dts.Connections["Prices.zip"].AcquireConnection(Dts.Transaction); - * string filePath = (string)rawConnection; - * //Use the connection in some code here, then release the connection - * Dts.Connections["Prices.zip"].ReleaseConnection(rawConnection); - * */ - #endregion - - - /// - /// This method is called when this script task executes in the control flow. - /// Before returning from this method, set the value of Dts.TaskResult to indicate success or failure. - /// To open Help, press F1. - /// - public void Main() - { - string filePath = - Dts.Variables["User::CurrentFilePath"].Value.ToString(); - - // Reset per-file state. - Dts.Variables["User::SkipCurrentFile"].Value = false; - Dts.Variables["User::CurrentFileSkipReason"].Value = ""; - - // The Foreach enumerator found the file, even if we later defer it. - int filesFound = - (int)Dts.Variables["User::FilesFound"].Value; - - Dts.Variables["User::FilesFound"].Value = - filesFound + 1; - - try - { - System.IO.FileInfo fileInfo = - new System.IO.FileInfo(filePath); - - Dts.Variables["User::CurrentFileName"].Value = - fileInfo.Name; - - if (!fileInfo.Exists) - { - Dts.Variables["User::SkipCurrentFile"].Value = true; - - Dts.Variables["User::CurrentFileSkipReason"].Value = - "File disappeared before processing."; - - bool fireAgainMissing = false; - - Dts.Events.FireWarning( - 0, - "Prepare Current File", - "Skipping file because it no longer exists: " + filePath, - "", - 0 - ); - - Dts.TaskResult = (int)ScriptResults.Success; - return; - } - - /* - * Try several times to obtain a read handle. - * - * FileShare.Read is intentional. We do not want to read a workbook - * while another process has it open for writing. - */ - System.IO.FileStream stream = null; - System.IO.IOException lastIOException = null; - - const int maxAttempts = 3; - const int waitMilliseconds = 2000; - - for (int attempt = 1; attempt <= maxAttempts; attempt++) - { - try - { - stream = new System.IO.FileStream( - filePath, - System.IO.FileMode.Open, - System.IO.FileAccess.Read, - System.IO.FileShare.Read - ); - - break; - } - catch (System.IO.IOException ex) - { - lastIOException = ex; - - if (attempt < maxAttempts) - { - System.Threading.Thread.Sleep(waitMilliseconds); - } - } - } - - /* - * Still unavailable after retries: - * defer this workbook instead of failing the package. - */ - if (stream == null) - { - Dts.Variables["User::SkipCurrentFile"].Value = true; - - string reason = - "File is locked/in use after " + - maxAttempts.ToString() + - " attempts. It will be retried on the next ETL run."; - - Dts.Variables["User::CurrentFileSkipReason"].Value = - reason; - - int lockedFiles = - (int)Dts.Variables["User::LockedFilesSkipped"].Value; - - Dts.Variables["User::LockedFilesSkipped"].Value = - lockedFiles + 1; - - Dts.Events.FireWarning( - 0, - "Prepare Current File", - reason + " File: " + filePath, - "", - 0 - ); - - Dts.TaskResult = (int)ScriptResults.Success; - return; - } - - using (stream) - { - fileInfo.Refresh(); - - Dts.Variables["User::CurrentFileSize"].Value = - fileInfo.Length; - - Dts.Variables["User::CurrentFileModified"].Value = - fileInfo.LastWriteTime; - - Dts.Variables["User::CurrentFileDateText"].Value = - fileInfo.LastWriteTime.ToString("yyyy-MM-dd"); - - using ( - System.Security.Cryptography.SHA256 sha256 = - System.Security.Cryptography.SHA256.Create() - ) - { - byte[] hashBytes = - sha256.ComputeHash(stream); - - string hash = - BitConverter.ToString(hashBytes) - .Replace("-", "") - .ToUpperInvariant(); - - Dts.Variables["User::CurrentFileHash"].Value = - hash; - } - } - - bool fireAgain = false; - - Dts.Events.FireInformation( - 0, - "Prepare Current File", - "Found: " + - fileInfo.Name + - " | Bytes: " + - fileInfo.Length.ToString() + - " | SHA256: " + - Dts.Variables["User::CurrentFileHash"].Value.ToString(), - "", - 0, - ref fireAgain - ); - - Dts.TaskResult = - (int)ScriptResults.Success; - } - catch (Exception ex) - { - /* - * Unexpected errors still fail the task. - * Only known file-access/locking conditions are deferred. - */ - Dts.Events.FireError( - 0, - "Prepare Current File", - ex.ToString(), - "", - 0 - ); - - Dts.TaskResult = - (int)ScriptResults.Failure; - } - } - - #region ScriptResults declaration - /// - /// This enum provides a convenient shorthand within the scope of this class for setting the - /// result of the script. - /// - /// This code was generated automatically. - /// - enum ScriptResults - { - Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, - Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure - }; - #endregion - - } -}]]> - -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_e1ef9c54be554a589a679829e6fb5458.Properties.Resources.get_ResourceManager():System.Resources.Resou" + - "rceManager")] -[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_e1ef9c54be554a589a679829e6fb5458.Properties.Resources.get_Culture():System.Globalization.CultureIn" + - "fo")] -[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_e1ef9c54be554a589a679829e6fb5458.Properties.Resources.set_Culture(System.Globalization.CultureInfo" + - "):Void")] - -namespace ST_e1ef9c54be554a589a679829e6fb5458.Properties { - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if ((resourceMan == null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ST_e1ef9c54be554a589a679829e6fb5458.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -}]]> - - - - ST_e1ef9c54be554a589a679829e6fb5458 - msBuild - ST_e1ef9c54be554a589a679829e6fb5458 - {55D8D7B5-1798-4076-8C4F-BBAB2218ACA3} - - - - - - - - - - -]]> - - - - - -]]> + Name="ScriptMain.cs" + Encoding="UTF8">20\d{2}) Metrics\\" + + @"(?20\d{2}) Spravato Audit\\", + System.Text.RegularExpressions.RegexOptions.IgnoreCase + ); + + /* + * If the matching filename exists somewhere under Pharmacy + * Metrics but is not inside the expected Spravato folder + * structure, ignore it. + */ + if (!pathMatch.Success) + { + string reason = + "File is not located in the expected " + + "'YYYY Metrics\\YYYY Spravato Audit' folder structure."; + + Dts.Variables["User::SkipCurrentFile"].Value = true; + + Dts.Variables["User::CurrentFileSkipReason"].Value = + reason; + + bool fireAgainInvalidPath = false; + + Dts.Events.FireInformation( + 0, + "Prepare Current File", + "Ignoring file: " + + filePath + + " | Reason: " + + reason, + "", + 0, + ref fireAgainInvalidPath + ); + + Dts.TaskResult = + (int)ScriptResults.Success; + + return; + } + + + int metricsYear = + Convert.ToInt32( + pathMatch.Groups["metricsYear"].Value + ); + + int auditYear = + Convert.ToInt32( + pathMatch.Groups["auditYear"].Value + ); + + + /* + * The two directory years should agree. + * + * Example: + * 2026 Metrics\2026 Spravato Audit = valid + * + * 2026 Metrics\2025 Spravato Audit = suspicious + */ + if (metricsYear != auditYear) + { + string reason = + "Metrics folder year (" + + metricsYear.ToString() + + ") does not match Spravato Audit folder year (" + + auditYear.ToString() + + ")."; + + Dts.Variables["User::SkipCurrentFile"].Value = true; + + Dts.Variables["User::CurrentFileSkipReason"].Value = + reason; + + Dts.Events.FireWarning( + 0, + "Prepare Current File", + "Skipping file due to inconsistent folder years. " + + "File: " + + filePath + + " | " + + reason, + "", + 0 + ); + + Dts.TaskResult = + (int)ScriptResults.Success; + + return; + } + + + Dts.Variables["User::CurrentSourceYear"].Value = + auditYear; + + + /* + * ------------------------------------------------------------ + * MINIMUM YEAR FILTER + * ------------------------------------------------------------ + * + * With MinimumSourceYear = 2025: + * + * 2024 -> ignored + * 2025 -> processed + * 2026 -> processed + * 2027 -> processed automatically + * 2028 -> processed automatically + * ------------------------------------------------------------ + */ + + if (auditYear < minimumSourceYear) + { + string reason = + "Source year " + + auditYear.ToString() + + " is earlier than MinimumSourceYear " + + minimumSourceYear.ToString() + + "."; + + Dts.Variables["User::SkipCurrentFile"].Value = true; + + Dts.Variables["User::CurrentFileSkipReason"].Value = + reason; + + bool fireAgainOldYear = false; + + Dts.Events.FireInformation( + 0, + "Prepare Current File", + "Ignoring historical file: " + + filePath + + " | " + + reason, + "", + 0, + ref fireAgainOldYear + ); + + Dts.TaskResult = + (int)ScriptResults.Success; + + return; + } + + + /* + * ------------------------------------------------------------ + * FILE IS AN ELIGIBLE SPRAVATO SOURCE FILE + * + * Increment FilesFound only after it passes the directory/year + * filters. Therefore a 2024 workbook does not inflate the + * Spravato FilesFound count. + * ------------------------------------------------------------ + */ + + int filesFound = + (int)Dts.Variables["User::FilesFound"].Value; + + Dts.Variables["User::FilesFound"].Value = + filesFound + 1; + + + /* + * ------------------------------------------------------------ + * MAKE SURE THE FILE STILL EXISTS + * ------------------------------------------------------------ + */ + + if (!fileInfo.Exists) + { + Dts.Variables["User::SkipCurrentFile"].Value = true; + + Dts.Variables["User::CurrentFileSkipReason"].Value = + "File disappeared before processing."; + + /* + * Treat this as deferred/unavailable so the warning email + * is generated. + */ + int unavailableFiles = + (int)Dts.Variables[ + "User::LockedFilesSkipped" + ].Value; + + Dts.Variables["User::LockedFilesSkipped"].Value = + unavailableFiles + 1; + + Dts.Events.FireWarning( + 0, + "Prepare Current File", + "Skipping file because it no longer exists: " + + filePath, + "", + 0 + ); + + Dts.TaskResult = + (int)ScriptResults.Success; + + return; + } + + + /* + * ------------------------------------------------------------ + * FILE LOCK / AVAILABILITY CHECK + * + * Try several times to obtain a read handle. + * + * FileShare.Read is intentional. We do not want to read a + * workbook while another process has it open for writing. + * ------------------------------------------------------------ + */ + + System.IO.FileStream stream = null; + System.IO.IOException lastIOException = null; + + const int maxAttempts = 3; + const int waitMilliseconds = 2000; + + for ( + int attempt = 1; + attempt <= maxAttempts; + attempt++ + ) + { + try + { + stream = + new System.IO.FileStream( + filePath, + System.IO.FileMode.Open, + System.IO.FileAccess.Read, + System.IO.FileShare.Read + ); + + break; + } + catch (System.IO.IOException ex) + { + lastIOException = ex; + + if (attempt < maxAttempts) + { + System.Threading.Thread.Sleep( + waitMilliseconds + ); + } + } + } + + + /* + * ------------------------------------------------------------ + * FILE IS STILL UNAVAILABLE AFTER RETRIES + * + * Defer it rather than failing the entire ETL package. + * ------------------------------------------------------------ + */ + + if (stream == null) + { + Dts.Variables["User::SkipCurrentFile"].Value = + true; + + string reason = + "File is locked/in use after " + + maxAttempts.ToString() + + " attempts. It will be retried on the next ETL run."; + + Dts.Variables[ + "User::CurrentFileSkipReason" + ].Value = reason; + + int lockedFiles = + (int)Dts.Variables[ + "User::LockedFilesSkipped" + ].Value; + + Dts.Variables[ + "User::LockedFilesSkipped" + ].Value = lockedFiles + 1; + + Dts.Events.FireWarning( + 0, + "Prepare Current File", + reason + + " File: " + + filePath, + "", + 0 + ); + + Dts.TaskResult = + (int)ScriptResults.Success; + + return; + } + + + /* + * ------------------------------------------------------------ + * FILE IS AVAILABLE - COLLECT METADATA AND HASH + * ------------------------------------------------------------ + */ + + using (stream) + { + fileInfo.Refresh(); + + Dts.Variables["User::CurrentFileSize"].Value = + fileInfo.Length; + + Dts.Variables[ + "User::CurrentFileModified" + ].Value = fileInfo.LastWriteTime; + + Dts.Variables[ + "User::CurrentFileDateText" + ].Value = + fileInfo.LastWriteTime.ToString( + "yyyy-MM-dd" + ); + + using ( + System.Security.Cryptography.SHA256 sha256 = + System.Security.Cryptography.SHA256.Create() + ) + { + byte[] hashBytes = + sha256.ComputeHash(stream); + + string hash = + BitConverter + .ToString(hashBytes) + .Replace("-", "") + .ToUpperInvariant(); + + Dts.Variables[ + "User::CurrentFileHash" + ].Value = hash; + } + } + + + /* + * ------------------------------------------------------------ + * LOG SUCCESSFUL FILE DISCOVERY + * ------------------------------------------------------------ + */ + + bool fireAgain = false; + + Dts.Events.FireInformation( + 0, + "Prepare Current File", + "Found: " + + fileInfo.Name + + " | Source Year: " + + auditYear.ToString() + + " | Bytes: " + + fileInfo.Length.ToString() + + " | SHA256: " + + Dts.Variables[ + "User::CurrentFileHash" + ].Value.ToString(), + "", + 0, + ref fireAgain + ); + + + Dts.TaskResult = + (int)ScriptResults.Success; + } + catch (Exception ex) + { + /* + * Unexpected errors still fail the task. + * + * Only known filtering / file availability conditions are + * intentionally skipped or deferred. + */ + + Dts.Events.FireError( + 0, + "Prepare Current File", + ex.ToString(), + "", + 0 + ); + + Dts.TaskResult = + (int)ScriptResults.Failure; + } + } + + + #region ScriptResults declaration + + enum ScriptResults + { + Success = + Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, + + Failure = + Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure + }; + + #endregion + } +}]]> @@ -5354,160 +5368,323 @@ namespace ST_e1ef9c54be554a589a679829e6fb5458.Properties { ]]> + + + + ST_e1ef9c54be554a589a679829e6fb5458 + msBuild + ST_e1ef9c54be554a589a679829e6fb5458 + {D052E0D5-0F13-4AAC-B9D5-14758386F25F} + + + + + + + + + + +]]> + + + + + + + +]]> + +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_e1ef9c54be554a589a679829e6fb5458.Properties.Resources.get_ResourceManager():System.Resources.Resou" + + "rceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_e1ef9c54be554a589a679829e6fb5458.Properties.Resources.get_Culture():System.Globalization.CultureIn" + + "fo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_e1ef9c54be554a589a679829e6fb5458.Properties.Resources.set_Culture(System.Globalization.CultureInfo" + + "):Void")] + +namespace ST_e1ef9c54be554a589a679829e6fb5458.Properties { + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ST_e1ef9c54be554a589a679829e6fb5458.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +}]]> 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 -BCoAAEJTSkIBAAEAAAAAAAwAAAB2NC4wLjMwMzE5AAAAAAUAbAAAAMwEAAAjfgAAOAUAAPwGAAAj -U3RyaW5ncwAAAAA0DAAAGAQAACNVUwBMEAAAEAAAACNHVUlEAAAAXBAAAPQBAAAjQmxvYgAAAAAA -AAACAAABVx2iAQkDAAAA+gEzABYAAAEAAAAxAAAABQAAAAYAAAAJAAAAAQAAADQAAAACAAAAEAAA -AAEAAAACAAAAAwAAAAQAAAABAAAABAAAAAEAAAABAAAAAAA5BAEAAAAAAAYAowKPBQYAMgOPBQYA -7wF8BQ8AAwYAAAYAHALoBAYAhgLoBAYAZwLoBAYAGQPoBAYAwwLoBAYA3ALoBAYAMwLoBAYATgJ7 -AwoA9wLoAwoAXwHoAwYABgVBAAYAYQRBAAYA5QB1BAYADQDRBgYA/AR1BAYA+gRBAAYAigR1BAYA -0gF8BQYAngZ1BAYANAWvBQYADwXTBA4AogEjBA4AAwIjBA4AewG+BAYAtwGPBQoAEQToAxIARQYA -ARIAowAAAQYAmwR1BAYAAQB1BAYAGwVBAAoARAXoAwYAowN1BAYAmgBBAAYAWAZBAAYAJQFBAAYA -ewBqAwYABwB1BAYAfATRBgYAZQRBAAYAWAV1BAYArAB1BAYAIAF1BAYAuAB1BAYA8gboBAAAAAA4 -AAAAAAABAAEAAQAQAKMEFAA5AAEAAQAAABAAtgUSBl0AAQADAAABEABPBhIGcQADAAcAAwEAAHMG -AABVAAQACgARAI8E+AARAE8B/AARAIoAAAEGBmoABAFWgGMGBwFWgC8BBwFQIAAAAACGAKkEBgAB -ALwkAAAAAIYYbwUGAAEAxCQAAAAAgxhvBQYAAQDMJAAAAACTCDAFCwEBAPgkAAAAAJMINwEQAQEA -/yQAAAAAkwhDARUBAQAHJQAAAACWCKUGGwECAA4lAAAAAIYYbwUGAAIAFiUAAAAAkRh1BSABAgAA -AAEAZAMJAG8FAQARAG8FBgAZAG8FCgApAG8FEAAxAG8FEAA5AG8FEABBAG8FEABJAG8FEABRAG8F -EABZAG8FEABhAG8FEABpAG8FBgCxAG8FBgDZAG8FFQDpAG8FBgBxAGsGMwDxAEEGOAD5AGwEPQAB -AVADRAC5AKEDSAABAVoDTAB5AG8FEAAZAdwASAAZAYwGUQDxAIEGVQApAZcGWwAhAZUDYQDxALEG -AQCBAG8FagBJASoFeAARAaEDSAApAZcGfQAZAbYDBgB5AL4DhAAZAe4AiACJAKEDjQCRAJsBkgBZ -AaoDlwBpAaEDnwApAYIApQApAcAGSABxAZMBBgBRAaEDSAApAZcGqwAhAa4EsQAhAWUFvABxAG8F -BgC5AG8FBgB5AcoAxQB5Ae4GzgDBAG8F1ADhAG8FBgAIABQA7gAIABgA8wApAHMAWwEuAAsAMwEu -ABMAPAEuABsAWwEuACMAZAEuACsAjQEuADMAjQEuADsAjQEuAEMAZAEuAEsAkwEuAFMAjQEuAFsA -qgFDAGMA8wBJAHMAWwFhAHsA8wBjAGsA8wAbAAMAAQAEAAMAAAA0BSQBAABXASkBAACpBi4BAgAE -AAMAAgAFAAUAAQAGAAUAAgAHAAcABIAAAAEAAAAZJmNKAAAAAAAAFAAAAAQAAAAAAAAAAAAAANwA -cgAAAAAAEQAAAAAAAAAAAAAA5QDJAwAAAAAEAAAAAAAAAAAAAADcAHUEAAAAABEAAAAAAAAAAAAA -AOUASwAAAAAAAAAAAAEAAADABQAABQACAAAAAAAASW50MzIASW50NjQAU0hBMjU2AFNUX2UxZWY5 -YzU0YmU1NTRhNTg5YTY3OTgyOWU2ZmI1NDU4ADxNb2R1bGU+AFN5c3RlbS5JTwBNaWNyb3NvZnQu -U3FsU2VydmVyLk1hbmFnZWREVFMAdmFsdWVfXwBtc2NvcmxpYgBUaHJlYWQAUmVwbGFjZQBkZWZh -dWx0SW5zdGFuY2UARmlsZU1vZGUAVmFyaWFibGUASURpc3Bvc2FibGUAUnVudGltZVR5cGVIYW5k -bGUAR2V0VHlwZUZyb21IYW5kbGUAZ2V0X05hbWUARGF0ZVRpbWUAZ2V0X0xhc3RXcml0ZVRpbWUA -TWljcm9zb2Z0LlNxbFNlcnZlci5EdHMuUnVudGltZQBUeXBlAEZpbGVTaGFyZQBGYWlsdXJlAGdl -dF9DdWx0dXJlAHNldF9DdWx0dXJlAHJlc291cmNlQ3VsdHVyZQBWU1RBUlRTY3JpcHRPYmplY3RN -b2RlbEJhc2UAQXBwbGljYXRpb25TZXR0aW5nc0Jhc2UARGlzcG9zZQBDcmVhdGUARWRpdG9yQnJv -d3NhYmxlU3RhdGUAQ29tcGlsZXJHZW5lcmF0ZWRBdHRyaWJ1dGUARGVidWdnZXJOb25Vc2VyQ29k -ZUF0dHJpYnV0ZQBEZWJ1Z2dhYmxlQXR0cmlidXRlAEVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZQBB -c3NlbWJseVRpdGxlQXR0cmlidXRlAEFzc2VtYmx5VHJhZGVtYXJrQXR0cmlidXRlAFRhcmdldEZy -YW1ld29ya0F0dHJpYnV0ZQBBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGUAQXNzZW1ibHlE -ZXNjcmlwdGlvbkF0dHJpYnV0ZQBDb21waWxhdGlvblJlbGF4YXRpb25zQXR0cmlidXRlAEFzc2Vt -Ymx5UHJvZHVjdEF0dHJpYnV0ZQBBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZQBTU0lTU2NyaXB0 -VGFza0VudHJ5UG9pbnRBdHRyaWJ1dGUAQXNzZW1ibHlDb21wYW55QXR0cmlidXRlAFJ1bnRpbWVD -b21wYXRpYmlsaXR5QXR0cmlidXRlAGdldF9WYWx1ZQBzZXRfVmFsdWUAdmFsdWUAU3lzdGVtLlRo -cmVhZGluZwBTeXN0ZW0uUnVudGltZS5WZXJzaW9uaW5nAEZpcmVXYXJuaW5nAFRvU3RyaW5nAENv -bXB1dGVIYXNoAFJlZnJlc2gAZ2V0X0xlbmd0aABNaWNyb3NvZnQuU3FsU2VydmVyLlNjcmlwdFRh -c2sATWljcm9zb2Z0LlNxbFNlcnZlci5EdHMuVGFza3MuU2NyaXB0VGFzawBTY3JpcHRPYmplY3RN -b2RlbABTeXN0ZW0uQ29tcG9uZW50TW9kZWwAU1RfZTFlZjljNTRiZTU1NGE1ODlhNjc5ODI5ZTZm -YjU0NTguZGxsAEZpbGVTdHJlYW0AZ2V0X0l0ZW0AU3lzdGVtAEhhc2hBbGdvcml0aG0ARW51bQBy -ZXNvdXJjZU1hbgBCb29sZWFuAFNjcmlwdE1haW4ARmlyZUluZm9ybWF0aW9uAFN5c3RlbS5Db25m -aWd1cmF0aW9uAFN5c3RlbS5HbG9iYWxpemF0aW9uAFN5c3RlbS5SZWZsZWN0aW9uAElPRXhjZXB0 -aW9uAEZpbGVJbmZvAEN1bHR1cmVJbmZvAEZpbGVTeXN0ZW1JbmZvAFNsZWVwAGdldF9SZXNvdXJj -ZU1hbmFnZXIARXZlbnRzT2JqZWN0V3JhcHBlcgBCaXRDb252ZXJ0ZXIARmlyZUVycm9yAC5jdG9y -AC5jY3RvcgBTeXN0ZW0uRGlhZ25vc3RpY3MAU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNl -cwBTeXN0ZW0uUmVzb3VyY2VzAFNUX2UxZWY5YzU0YmU1NTRhNTg5YTY3OTgyOWU2ZmI1NDU4LlBy -b3BlcnRpZXMuUmVzb3VyY2VzLnJlc291cmNlcwBEZWJ1Z2dpbmdNb2RlcwBTVF9lMWVmOWM1NGJl -NTU0YTU4OWE2Nzk4MjllNmZiNTQ1OC5Qcm9wZXJ0aWVzAGdldF9WYXJpYWJsZXMAU2V0dGluZ3MA -RmlsZUFjY2VzcwBTdWNjZXNzAGdldF9EdHMAU2NyaXB0UmVzdWx0cwBnZXRfRXZlbnRzAGdldF9F +ZGUuDQ0KJAAAAAAAAABQRQAATAEDAKSIqWoAAAAAAAAAAOAAIiALATAAACIAAAAIAAAAAAAAXkAA +AAAgAAAAYAAAAAAAEAAgAAAAAgAABAAAAAAAAAAGAAAAAAAAAACgAAAAAgAAAAAAAAMAYIUAABAA +ABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAAxAAABPAAAAAGAAAHgEAAAAAAAAAAAAAAAAAAAA +AAAAAIAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAZCAAAAAgAAAAIgAAAAIA +AAAAAAAAAAAAAAAAACAAAGAucnNyYwAAAHgEAAAAYAAAAAYAAAAkAAAAAAAAAAAAAAAAAABAAABA +LnJlbG9jAAAMAAAAAIAAAAACAAAAKgAAAAAAAAAAAAAAAAAAQAAAQgAAAAAAAAAAAAAAAAAAAABA +QAAAAAAAAEgAAAACAAUAOCgAABwXAAABAAAAAAAAAFQ/AAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAABswCAAQBwAAAQAAEQIoEAAACm8RAAAKcgEAAHBvEgAACm8T +AAAKbxQAAAoKAigQAAAKbxEAAApyLQAAcG8SAAAKbxMAAAqlIgAAAQsCKBAAAApvEQAACnJlAABw +bxIAAAoWjCMAAAFvFQAACgIoEAAACm8RAAAKcpEAAHBvEgAACnLJAABwbxUAAAoCKBAAAApvEQAA +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 +AOEAlQUVAPEAlQUGAHEAzAY+APkAZwZDAAEBfARJAAkBWgNQAMEAqwNUAAkBZANYAHkAlQUQACEB +3gBUACkBtANdADkBwAZnAPkA4gZrAEkB+AZxAEEBvgR5APkAEgcBAIEAqgaEAFEBfASKAFkBWgNU +AGEBAQCRABEBqwNUAEkB+AaWAEEBnwOcACEB7QZnAEkB+AalAIkAlQWrAIEBSgW5AEkB+Aa+ACEB +xgMGAHkAzgPFACEB8ADJAJEAqwPOAJkApQHTAJEBugPYAKEBqwPgAEkBhADmAEkBIQdUAKkBnQEG +AIkBqwNUAEEBiwXsAHEAlQUGAMEAlQUGALEBzAD1ALEBXQf+AMkAlQUEAekAlQUGAAgAFAAeAQgA +GAAjASkAcwCLAS4ACwBjAS4AEwBsAS4AGwCLAS4AIwCUAS4AKwC9AS4AMwC9AS4AOwC9AS4AQwCU +AS4ASwDDAS4AUwC9AS4AWwDaAUMAYwAjAUkAcwCLAWEAewAjAWMAawAjARsAAwABAAQAAwAAAFoF +VAEAAFkBWQEAAAoHXgECAAQAAwACAAUABQABAAYABQACAAcABwAEgAAAAQAAABom8mIAAAAAAAAW +AAAABAAAAAAAAAAAAAAADAF0AAAAAAARAAAAAAAAAAAAAAAVAdkDAAAAAAQAAAAAAAAAAAAAAAwB +hQQAAAAAEQAAAAAAAAAAAAAAFQFNAAAAAAAAAAAAAQAAAOYFAAAFAAIAAAAAAABUb0ludDMyAElu +dDY0AFNIQTI1NgBTVF9lMWVmOWM1NGJlNTU0YTU4OWE2Nzk4MjllNmZiNTQ1OAA8TW9kdWxlPgBT +eXN0ZW0uSU8ATWljcm9zb2Z0LlNxbFNlcnZlci5NYW5hZ2VkRFRTAHZhbHVlX18AbXNjb3JsaWIA +VGhyZWFkAFJlcGxhY2UAZGVmYXVsdEluc3RhbmNlAEZpbGVNb2RlAFZhcmlhYmxlAElEaXNwb3Nh +YmxlAFJ1bnRpbWVUeXBlSGFuZGxlAEdldFR5cGVGcm9tSGFuZGxlAGdldF9OYW1lAERhdGVUaW1l +AGdldF9MYXN0V3JpdGVUaW1lAE1pY3Jvc29mdC5TcWxTZXJ2ZXIuRHRzLlJ1bnRpbWUAVHlwZQBG +aWxlU2hhcmUARmFpbHVyZQBnZXRfQ3VsdHVyZQBzZXRfQ3VsdHVyZQByZXNvdXJjZUN1bHR1cmUA +Q2FwdHVyZQBWU1RBUlRTY3JpcHRPYmplY3RNb2RlbEJhc2UAQXBwbGljYXRpb25TZXR0aW5nc0Jh +c2UARGlzcG9zZQBDcmVhdGUARWRpdG9yQnJvd3NhYmxlU3RhdGUAQ29tcGlsZXJHZW5lcmF0ZWRB +dHRyaWJ1dGUARGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZQBEZWJ1Z2dhYmxlQXR0cmlidXRl +AEVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZQBBc3NlbWJseVRpdGxlQXR0cmlidXRlAEFzc2VtYmx5 +VHJhZGVtYXJrQXR0cmlidXRlAFRhcmdldEZyYW1ld29ya0F0dHJpYnV0ZQBBc3NlbWJseUNvbmZp +Z3VyYXRpb25BdHRyaWJ1dGUAQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZQBDb21waWxhdGlv +blJlbGF4YXRpb25zQXR0cmlidXRlAEFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZQBBc3NlbWJseUNv +cHlyaWdodEF0dHJpYnV0ZQBTU0lTU2NyaXB0VGFza0VudHJ5UG9pbnRBdHRyaWJ1dGUAQXNzZW1i +bHlDb21wYW55QXR0cmlidXRlAFJ1bnRpbWVDb21wYXRpYmlsaXR5QXR0cmlidXRlAGdldF9WYWx1 +ZQBzZXRfVmFsdWUAdmFsdWUAU3lzdGVtLlRocmVhZGluZwBTeXN0ZW0uUnVudGltZS5WZXJzaW9u +aW5nAEZpcmVXYXJuaW5nAFRvU3RyaW5nAE1hdGNoAENvbXB1dGVIYXNoAFJlZnJlc2gAZ2V0X0xl +bmd0aABNaWNyb3NvZnQuU3FsU2VydmVyLlNjcmlwdFRhc2sATWljcm9zb2Z0LlNxbFNlcnZlci5E +dHMuVGFza3MuU2NyaXB0VGFzawBTY3JpcHRPYmplY3RNb2RlbABTeXN0ZW0uQ29tcG9uZW50TW9k +ZWwAU1RfZTFlZjljNTRiZTU1NGE1ODlhNjc5ODI5ZTZmYjU0NTguZGxsAEZpbGVTdHJlYW0AZ2V0 +X0l0ZW0AU3lzdGVtAEhhc2hBbGdvcml0aG0ARW51bQByZXNvdXJjZU1hbgBCb29sZWFuAFNjcmlw +dE1haW4ARmlyZUluZm9ybWF0aW9uAFN5c3RlbS5Db25maWd1cmF0aW9uAFN5c3RlbS5HbG9iYWxp +emF0aW9uAFN5c3RlbS5SZWZsZWN0aW9uAEdyb3VwQ29sbGVjdGlvbgBJT0V4Y2VwdGlvbgBGaWxl +SW5mbwBDdWx0dXJlSW5mbwBGaWxlU3lzdGVtSW5mbwBTbGVlcABHcm91cABnZXRfUmVzb3VyY2VN +YW5hZ2VyAEV2ZW50c09iamVjdFdyYXBwZXIAQml0Q29udmVydGVyAEZpcmVFcnJvcgAuY3RvcgAu +Y2N0b3IAU3lzdGVtLkRpYWdub3N0aWNzAFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXMA +U3lzdGVtLlJlc291cmNlcwBTVF9lMWVmOWM1NGJlNTU0YTU4OWE2Nzk4MjllNmZiNTQ1OC5Qcm9w +ZXJ0aWVzLlJlc291cmNlcy5yZXNvdXJjZXMARGVidWdnaW5nTW9kZXMAU1RfZTFlZjljNTRiZTU1 +NGE1ODlhNjc5ODI5ZTZmYjU0NTguUHJvcGVydGllcwBnZXRfVmFyaWFibGVzAFNldHRpbmdzAFN5 +c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucwBSZWdleE9wdGlvbnMAZ2V0X0dyb3VwcwBGaWxl +QWNjZXNzAGdldF9TdWNjZXNzAGdldF9EdHMAU2NyaXB0UmVzdWx0cwBnZXRfRXZlbnRzAGdldF9F eGlzdHMAQ29uY2F0AE9iamVjdABnZXRfRGVmYXVsdABzZXRfVGFza1Jlc3VsdABUb1VwcGVySW52 -YXJpYW50AFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkAZ2V0X0Fzc2VtYmx5AAAAK1UAcwBl -AHIAOgA6AEMAdQByAHIAZQBuAHQARgBpAGwAZQBQAGEAdABoAAArVQBzAGUAcgA6ADoAUwBrAGkA -cABDAHUAcgByAGUAbgB0AEYAaQBsAGUAADdVAHMAZQByADoAOgBDAHUAcgByAGUAbgB0AEYAaQBs -AGUAUwBrAGkAcABSAGUAYQBzAG8AbgAAAQAhVQBzAGUAcgA6ADoARgBpAGwAZQBzAEYAbwB1AG4A -ZAAAK1UAcwBlAHIAOgA6AEMAdQByAHIAZQBuAHQARgBpAGwAZQBOAGEAbQBlAABHRgBpAGwAZQAg -AGQAaQBzAGEAcABwAGUAYQByAGUAZAAgAGIAZQBmAG8AcgBlACAAcAByAG8AYwBlAHMAcwBpAG4A -ZwAuAAApUAByAGUAcABhAHIAZQAgAEMAdQByAHIAZQBuAHQAIABGAGkAbABlAABXUwBrAGkAcABw -AGkAbgBnACAAZgBpAGwAZQAgAGIAZQBjAGEAdQBzAGUAIABpAHQAIABuAG8AIABsAG8AbgBnAGUA -cgAgAGUAeABpAHMAdABzADoAIAAAOUYAaQBsAGUAIABpAHMAIABsAG8AYwBrAGUAZAAvAGkAbgAg -AHUAcwBlACAAYQBmAHQAZQByACAAAGUgAGEAdAB0AGUAbQBwAHQAcwAuACAASQB0ACAAdwBpAGwA -bAAgAGIAZQAgAHIAZQB0AHIAaQBlAGQAIABvAG4AIAB0AGgAZQAgAG4AZQB4AHQAIABFAFQATAAg -AHIAdQBuAC4AADFVAHMAZQByADoAOgBMAG8AYwBrAGUAZABGAGkAbABlAHMAUwBrAGkAcABwAGUA -ZAAADyAARgBpAGwAZQA6ACAAACtVAHMAZQByADoAOgBDAHUAcgByAGUAbgB0AEYAaQBsAGUAUwBp -AHoAZQAAM1UAcwBlAHIAOgA6AEMAdQByAHIAZQBuAHQARgBpAGwAZQBNAG8AZABpAGYAaQBlAGQA -ADNVAHMAZQByADoAOgBDAHUAcgByAGUAbgB0AEYAaQBsAGUARABhAHQAZQBUAGUAeAB0AAAVeQB5 -AHkAeQAtAE0ATQAtAGQAZAABAy0AAStVAHMAZQByADoAOgBDAHUAcgByAGUAbgB0AEYAaQBsAGUA -SABhAHMAaAAAD0YAbwB1AG4AZAA6ACAAABUgAHwAIABCAHkAdABlAHMAOgAgAAAXIAB8ACAAUwBI -AEEAMgA1ADYAOgAgAABxUwBUAF8AZQAxAGUAZgA5AGMANQA0AGIAZQA1ADUANABhADUAOAA5AGEA -NgA3ADkAOAAyADkAZQA2AGYAYgA1ADQANQA4AC4AUAByAG8AcABlAHIAdABpAGUAcwAuAFIAZQBz -AG8AdQByAGMAZQBzAAAAxBoQ6hdPfkubj8w1TiQYrQAEIAEBCAMgAAEFIAEBEREEIAEBDgUgAQER -aRcHDw4IEj0SQQIIDggIEkERRRJJDgoSTQQgABJ5BCAAEn0GIAESgIEcAyAAHAMgAA4EIAEBHAMg -AAIFIAASgJEFAAIODg4IIAUBCA4ODggNIAQBDhGAmRGAnRGAoQQAAQEIBgADDg4ODgMgAAoEIAAR -RQQgAQ4OBAAAEkkHIAEdBRKAsQUAAQ4dBQUgAg4ODgUAAQ4dDgogBgEIDg4OCBACCCAFAggODg4I -CAABEoC9EYDBBSAAEoDFByACAQ4SgMUIt3pcVhk04IkIiYRdzYCAzJEEAAAAAAQBAAAAAwYSYQMG -EmUDBhIQAgYIAwYRFAQAABJhBAAAEmUFAAEBEmUEAAASEAMAAAEECAASYQQIABJlBAgAEhAIAQAI -AAAAAAAeAQABAFQCFldyYXBOb25FeGNlcHRpb25UaHJvd3MBCAEAAgAAAAAAKAEAI1NUX2UxZWY5 -YzU0YmU1NTRhNTg5YTY3OTgyOWU2ZmI1NDU4AAAFAQAAAAAWAQARQ29weXJpZ2h0IEAgIDIwMjYA -AEkBABouTkVURnJhbWV3b3JrLFZlcnNpb249djQuNwEAVA4URnJhbWV3b3JrRGlzcGxheU5hbWUS -Lk5FVCBGcmFtZXdvcmsgNC43tAAAAM7K774BAAAAkQAAAGxTeXN0ZW0uUmVzb3VyY2VzLlJlc291 -cmNlUmVhZGVyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1 -YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkjU3lzdGVtLlJlc291cmNlcy5SdW50aW1lUmVz -b3VyY2VTZXQCAAAAAAAAAAAAAABQQURQQURQtAAAAFQ4AAAAAAAAAAAAAG44AAAAIAAAAAAAAAAA -AAAAAAAAAAAAAAAAAABgOAAAAAAAAAAAAAAAAF9Db3JEbGxNYWluAG1zY29yZWUuZGxsAAAAAAD/ -JQAgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +YXJpYW50AENvbnZlcnQAUmVnZXgAU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeQBnZXRfQXNz +ZW1ibHkAAAAAK1UAcwBlAHIAOgA6AEMAdQByAHIAZQBuAHQARgBpAGwAZQBQAGEAdABoAAA3JABQ +AHIAbwBqAGUAYwB0ADoAOgBNAGkAbgBpAG0AdQBtAFMAbwB1AHIAYwBlAFkAZQBhAHIAACtVAHMA +ZQByADoAOgBTAGsAaQBwAEMAdQByAHIAZQBuAHQARgBpAGwAZQAAN1UAcwBlAHIAOgA6AEMAdQBy +AHIAZQBuAHQARgBpAGwAZQBTAGsAaQBwAFIAZQBhAHMAbwBuAAABAC9VAHMAZQByADoAOgBDAHUA +cgByAGUAbgB0AFMAbwB1AHIAYwBlAFkAZQBhAHIAACtVAHMAZQByADoAOgBDAHUAcgByAGUAbgB0 +AEYAaQBsAGUATgBhAG0AZQAAgJNcAFwAKAA/ADwAbQBlAHQAcgBpAGMAcwBZAGUAYQByAD4AMgAw +AFwAZAB7ADIAfQApACAATQBlAHQAcgBpAGMAcwBcAFwAKAA/ADwAYQB1AGQAaQB0AFkAZQBhAHIA +PgAyADAAXABkAHsAMgB9ACkAIABTAHAAcgBhAHYAYQB0AG8AIABBAHUAZABpAHQAXABcAACAsUYA +aQBsAGUAIABpAHMAIABuAG8AdAAgAGwAbwBjAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAGUAeABw +AGUAYwB0AGUAZAAgACcAWQBZAFkAWQAgAE0AZQB0AHIAaQBjAHMAXABZAFkAWQBZACAAUwBwAHIA +YQB2AGEAdABvACAAQQB1AGQAaQB0ACcAIABmAG8AbABkAGUAcgAgAHMAdAByAHUAYwB0AHUAcgBl +AC4AASlQAHIAZQBwAGEAcgBlACAAQwB1AHIAcgBlAG4AdAAgAEYAaQBsAGUAAB9JAGcAbgBvAHIA +aQBuAGcAIABmAGkAbABlADoAIAAAFyAAfAAgAFIAZQBhAHMAbwBuADoAIAAAF20AZQB0AHIAaQBj +AHMAWQBlAGEAcgAAE2EAdQBkAGkAdABZAGUAYQByAAArTQBlAHQAcgBpAGMAcwAgAGYAbwBsAGQA +ZQByACAAeQBlAGEAcgAgACgAAFspACAAZABvAGUAcwAgAG4AbwB0ACAAbQBhAHQAYwBoACAAUwBw +AHIAYQB2AGEAdABvACAAQQB1AGQAaQB0ACAAZgBvAGwAZABlAHIAIAB5AGUAYQByACAAKAAABSkA +LgAAbVMAawBpAHAAcABpAG4AZwAgAGYAaQBsAGUAIABkAHUAZQAgAHQAbwAgAGkAbgBjAG8AbgBz +AGkAcwB0AGUAbgB0ACAAZgBvAGwAZABlAHIAIAB5AGUAYQByAHMALgAgAEYAaQBsAGUAOgAgAAAH +IAB8ACAAABlTAG8AdQByAGMAZQAgAHkAZQBhAHIAIAAARyAAaQBzACAAZQBhAHIAbABpAGUAcgAg +AHQAaABhAG4AIABNAGkAbgBpAG0AdQBtAFMAbwB1AHIAYwBlAFkAZQBhAHIAIAAAAy4AADVJAGcA +bgBvAHIAaQBuAGcAIABoAGkAcwB0AG8AcgBpAGMAYQBsACAAZgBpAGwAZQA6ACAAACFVAHMAZQBy +ADoAOgBGAGkAbABlAHMARgBvAHUAbgBkAABHRgBpAGwAZQAgAGQAaQBzAGEAcABwAGUAYQByAGUA +ZAAgAGIAZQBmAG8AcgBlACAAcAByAG8AYwBlAHMAcwBpAG4AZwAuAAAxVQBzAGUAcgA6ADoATABv +AGMAawBlAGQARgBpAGwAZQBzAFMAawBpAHAAcABlAGQAAFdTAGsAaQBwAHAAaQBuAGcAIABmAGkA +bABlACAAYgBlAGMAYQB1AHMAZQAgAGkAdAAgAG4AbwAgAGwAbwBuAGcAZQByACAAZQB4AGkAcwB0 +AHMAOgAgAAA5RgBpAGwAZQAgAGkAcwAgAGwAbwBjAGsAZQBkAC8AaQBuACAAdQBzAGUAIABhAGYA +dABlAHIAIAAAZSAAYQB0AHQAZQBtAHAAdABzAC4AIABJAHQAIAB3AGkAbABsACAAYgBlACAAcgBl +AHQAcgBpAGUAZAAgAG8AbgAgAHQAaABlACAAbgBlAHgAdAAgAEUAVABMACAAcgB1AG4ALgAADyAA +RgBpAGwAZQA6ACAAACtVAHMAZQByADoAOgBDAHUAcgByAGUAbgB0AEYAaQBsAGUAUwBpAHoAZQAA +M1UAcwBlAHIAOgA6AEMAdQByAHIAZQBuAHQARgBpAGwAZQBNAG8AZABpAGYAaQBlAGQAADNVAHMA +ZQByADoAOgBDAHUAcgByAGUAbgB0AEYAaQBsAGUARABhAHQAZQBUAGUAeAB0AAAVeQB5AHkAeQAt +AE0ATQAtAGQAZAABAy0AAStVAHMAZQByADoAOgBDAHUAcgByAGUAbgB0AEYAaQBsAGUASABhAHMA +aAAAD0YAbwB1AG4AZAA6ACAAACEgAHwAIABTAG8AdQByAGMAZQAgAFkAZQBhAHIAOgAgAAAVIAB8 +ACAAQgB5AHQAZQBzADoAIAAAFyAAfAAgAFMASABBADIANQA2ADoAIAAAcVMAVABfAGUAMQBlAGYA +OQBjADUANABiAGUANQA1ADQAYQA1ADgAOQBhADYANwA5ADgAMgA5AGUANgBmAGIANQA0ADUAOAAu +AFAAcgBvAHAAZQByAHQAaQBlAHMALgBSAGUAcwBvAHUAcgBjAGUAcwAAAAAAlqIqI/RUBkykWESp +VPaIDQAEIAEBCAMgAAEFIAEBEREEIAEBDgUgAQERbSIHGQ4IEj0SQQgICBJFAg4CDg4CCAgOCAgS +RRFJEk0OChJRBCAAEn0FIAASgIEGIAESgIUcAyAAHAMgAA4EIAEBHAkAAxJBDg4RgJkDIAACBSAA +EoChBwAEDg4ODg4KIAYBCA4ODggQAgUgABKAqQYgARKAnQ4EAAEIDgUAAQ4dDgggBQEIDg4OCAUA +Ag4ODg0gBAEOEYC1EYC5EYC9BAABAQgGAAMODg4OAyAACgQgABFJBCABDg4EAAASTQcgAR0FEoDN +BQABDh0FBSACDg4OCCAFAggODg4ICAABEoDZEYDdBSAAEoDhByACAQ4SgOEIt3pcVhk04IkIiYRd +zYCAzJEEAAAAAAQBAAAAAwYSZQMGEmkDBhIQAgYIAwYRFAQAABJlBAAAEmkFAAEBEmkEAAASEAMA +AAEECAASZQQIABJpBAgAEhAIAQAIAAAAAAAeAQABAFQCFldyYXBOb25FeGNlcHRpb25UaHJvd3MB +CAEAAgAAAAAAKAEAI1NUX2UxZWY5YzU0YmU1NTRhNTg5YTY3OTgyOWU2ZmI1NDU4AAAFAQAAAAAW +AQARQ29weXJpZ2h0IEAgIDIwMjYAAEkBABouTkVURnJhbWV3b3JrLFZlcnNpb249djQuNwEAVA4U +RnJhbWV3b3JrRGlzcGxheU5hbWUSLk5FVCBGcmFtZXdvcmsgNC43tAAAAM7K774BAAAAkQAAAGxT +eXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlUmVhZGVyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4w +LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkjU3lzdGVt +LlJlc291cmNlcy5SdW50aW1lUmVzb3VyY2VTZXQCAAAAAAAAAAAAAABQQURQQURQtAAAADRAAAAA +AAAAAAAAAE5AAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAF9Db3JEbGxN +YWluAG1zY29yZWUuZGxsAAAAAAD/JQAgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AQAQAAAAGAAAgAAAAAAAAAAAAAAAAAAAAQABAAAAMAAAgAAAAAAAAAAAAAAAAAAAAQAAAAAASAAA -AFhAAAAaBAAAAAAAAAAAAAAaBDQAAABWAFMAXwBWAEUAUgBTAEkATwBOAF8ASQBOAEYATwAAAAAA -vQTv/gAAAQAAAAEAY0oZJgAAAQBjShkmPwAAAAAAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAEQAAAAB -AFYAYQByAEYAaQBsAGUASQBuAGYAbwAAAAAAJAAEAAAAVAByAGEAbgBzAGwAYQB0AGkAbwBuAAAA -AAAAALAEegMAAAEAUwB0AHIAaQBuAGcARgBpAGwAZQBJAG4AZgBvAAAAVgMAAAEAMAAwADAAMAAw -ADQAYgAwAAAAGgABAAEAQwBvAG0AbQBlAG4AdABzAAAAAAAAACIAAQABAEMAbwBtAHAAYQBuAHkA -TgBhAG0AZQAAAAAAAAAAAHAAJAABAEYAaQBsAGUARABlAHMAYwByAGkAcAB0AGkAbwBuAAAAAABT -AFQAXwBlADEAZQBmADkAYwA1ADQAYgBlADUANQA0AGEANQA4ADkAYQA2ADcAOQA4ADIAOQBlADYA -ZgBiADUANAA1ADgAAAA+AA8AAQBGAGkAbABlAFYAZQByAHMAaQBvAG4AAAAAADEALgAwAC4AOQA3 -ADUAMwAuADEAOQAwADQAMwAAAAAAcAAoAAEASQBuAHQAZQByAG4AYQBsAE4AYQBtAGUAAABTAFQA -XwBlADEAZQBmADkAYwA1ADQAYgBlADUANQA0AGEANQA4ADkAYQA2ADcAOQA4ADIAOQBlADYAZgBi -ADUANAA1ADgALgBkAGwAbAAAAEgAEgABAEwAZQBnAGEAbABDAG8AcAB5AHIAaQBnAGgAdAAAAEMA -bwBwAHkAcgBpAGcAaAB0ACAAQAAgACAAMgAwADIANgAAACoAAQABAEwAZQBnAGEAbABUAHIAYQBk -AGUAbQBhAHIAawBzAAAAAAAAAAAAeAAoAAEATwByAGkAZwBpAG4AYQBsAEYAaQBsAGUAbgBhAG0A -ZQAAAFMAVABfAGUAMQBlAGYAOQBjADUANABiAGUANQA1ADQAYQA1ADgAOQBhADYANwA5ADgAMgA5 -AGUANgBmAGIANQA0ADUAOAAuAGQAbABsAAAAaAAkAAEAUAByAG8AZAB1AGMAdABOAGEAbQBlAAAA -AABTAFQAXwBlADEAZQBmADkAYwA1ADQAYgBlADUANQA0AGEANQA4ADkAYQA2ADcAOQA4ADIAOQBl -ADYAZgBiADUANAA1ADgAAABCAA8AAQBQAHIAbwBkAHUAYwB0AFYAZQByAHMAaQBvAG4AAAAxAC4A -MAAuADkANwA1ADMALgAxADkAMAA0ADMAAAAAAEYADwABAEEAcwBzAGUAbQBiAGwAeQAgAFYAZQBy -AHMAaQBvAG4AAAAxAC4AMAAuADkANwA1ADMALgAxADkAMAA0ADMAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABABAA +AAAYAACAAAAAAAAAAAAAAAAAAAABAAEAAAAwAACAAAAAAAAAAAAAAAAAAAABAAAAAABIAAAAWGAA +ABoEAAAAAAAAAAAAABoENAAAAFYAUwBfAFYARQBSAFMASQBPAE4AXwBJAE4ARgBPAAAAAAC9BO/+ +AAABAAAAAQDyYhomAAABAPJiGiY/AAAAAAAAAAQAAAACAAAAAAAAAAAAAAAAAAAARAAAAAEAVgBh +AHIARgBpAGwAZQBJAG4AZgBvAAAAAAAkAAQAAABUAHIAYQBuAHMAbABhAHQAaQBvAG4AAAAAAAAA +sAR6AwAAAQBTAHQAcgBpAG4AZwBGAGkAbABlAEkAbgBmAG8AAABWAwAAAQAwADAAMAAwADAANABi +ADAAAAAaAAEAAQBDAG8AbQBtAGUAbgB0AHMAAAAAAAAAIgABAAEAQwBvAG0AcABhAG4AeQBOAGEA +bQBlAAAAAAAAAAAAcAAkAAEARgBpAGwAZQBEAGUAcwBjAHIAaQBwAHQAaQBvAG4AAAAAAFMAVABf +AGUAMQBlAGYAOQBjADUANABiAGUANQA1ADQAYQA1ADgAOQBhADYANwA5ADgAMgA5AGUANgBmAGIA +NQA0ADUAOAAAAD4ADwABAEYAaQBsAGUAVgBlAHIAcwBpAG8AbgAAAAAAMQAuADAALgA5ADcANQA0 +AC4AMgA1ADMAMwAwAAAAAABwACgAAQBJAG4AdABlAHIAbgBhAGwATgBhAG0AZQAAAFMAVABfAGUA +MQBlAGYAOQBjADUANABiAGUANQA1ADQAYQA1ADgAOQBhADYANwA5ADgAMgA5AGUANgBmAGIANQA0 +ADUAOAAuAGQAbABsAAAASAASAAEATABlAGcAYQBsAEMAbwBwAHkAcgBpAGcAaAB0AAAAQwBvAHAA +eQByAGkAZwBoAHQAIABAACAAIAAyADAAMgA2AAAAKgABAAEATABlAGcAYQBsAFQAcgBhAGQAZQBt +AGEAcgBrAHMAAAAAAAAAAAB4ACgAAQBPAHIAaQBnAGkAbgBhAGwARgBpAGwAZQBuAGEAbQBlAAAA +UwBUAF8AZQAxAGUAZgA5AGMANQA0AGIAZQA1ADUANABhADUAOAA5AGEANgA3ADkAOAAyADkAZQA2 +AGYAYgA1ADQANQA4AC4AZABsAGwAAABoACQAAQBQAHIAbwBkAHUAYwB0AE4AYQBtAGUAAAAAAFMA +VABfAGUAMQBlAGYAOQBjADUANABiAGUANQA1ADQAYQA1ADgAOQBhADYANwA5ADgAMgA5AGUANgBm +AGIANQA0ADUAOAAAAEIADwABAFAAcgBvAGQAdQBjAHQAVgBlAHIAcwBpAG8AbgAAADEALgAwAC4A +OQA3ADUANAAuADIANQAzADMAMAAAAAAARgAPAAEAQQBzAHMAZQBtAGIAbAB5ACAAVgBlAHIAcwBp +AG8AbgAAADEALgAwAC4AOQA3ADUANAAuADIANQAzADMAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAMAAAAgDgAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAwAAABgMAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @@ -5516,7 +5693,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= @@ -5602,6 +5779,24 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + + + + + + + + + + + + + + DTS:LocaleID="-1" DTS:ObjectName="Mark Package Failed" DTS:TaskContact="Execute SQL Task; Microsoft Corporation; SQL Server 2025; © 2025 Microsoft Corporation; All Rights Reserved;http://www.microsoft.com/sql/support/default.asp;1" - DTS:ThreadHint="1"> + DTS:ThreadHint="0"> + + + + + + + + + + + + DTS:LocaleID="-1" DTS:ObjectName="Send Success Email" DTS:TaskContact="Execute SQL Task; Microsoft Corporation; SQL Server 2025; © 2025 Microsoft Corporation; All Rights Reserved;http://www.microsoft.com/sql/support/default.asp;1" - DTS:ThreadHint="0"> + DTS:ThreadHint="1"> DTS:From="Package\Mark Package Failed" DTS:LogicalAnd="True" DTS:ObjectName="Constraint 5" - DTS:To="Package\Execute SQL Task" /> + DTS:To="Package\Send Failure Email" /> + Language="CSharp" ReadOnlyVariables="System::ErrorDescription,System::SourceName" ReadWriteVariables="User::ErrorMessage,User::ErrorTaskName"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + +]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - -]]> - -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_ccde3fbc55984542be29e65dd03de37b.Properties.Settings.get_Default():ST_ccde3fbc55984542be29e65dd03de37b.Properties.Sett" + - "ings")] - -namespace ST_ccde3fbc55984542be29e65dd03de37b.Properties { - - - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - private static Settings defaultInstance = new Settings(); - - public static Settings Default { - get { - return defaultInstance; - } - } - } }]]> ]]> +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("ST_ccde3fbc55984542be29e65dd03de37b")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ST_ccde3fbc55984542be29e65dd03de37b")] -[assembly: AssemblyCopyright("Copyright @ 2026")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_ccde3fbc55984542be29e65dd03de37b.Properties.Settings.get_Default():ST_ccde3fbc55984542be29e65dd03de37b.Properties.Sett" + + "ings")] -[assembly: AssemblyVersion("1.0.*")]]]> +namespace ST_ccde3fbc55984542be29e65dd03de37b.Properties { + + + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +}]]> @@ -6583,10 +6870,26 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Size="187,42" Id="Package\Complete Package Run" TopLeft="845.805555555556,587.277777777778" /> + + + + Size="173,42" Id="Package\ForEach Spravato File\Prepare Current File" TopLeft="72,28" /> + + @@ -6669,10 +6980,6 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - @@ -6695,10 +7002,6 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - @@ -6721,14 +7024,6 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - - @@ -6776,28 +7071,52 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + TopLeft="179.305555555556,168.777777777778" /> + + + + TopLeft="459.444444444445,111"> + End="9.36111111111097,50.2777777777781"> + End="0,24.888888888889" /> + + + + @@ -6808,30 +7127,30 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + TopLeft="758.305555555556,559.277777777778"> + End="80,49"> + End="39.75,0" /> + Point1="39.75,0" + Point2="43.75,0" + Point3="43.75,4" /> + End="43.75,45" /> + Point1="43.75,45" + Point2="43.75,49" + Point3="47.75,49" /> + End="80,49" /> @@ -6840,10 +7159,6 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - @@ -6868,10 +7183,6 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= RelativePosition="Any" /> - @@ -6908,64 +7219,82 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= RelativePosition="Any" /> - + Id="Package.PrecedenceConstraints[Constraint 5]" + TopLeft="1125.93055555556,842.277777777778"> + End="0,44.111111111111"> - + End="0,44.111111111111" /> + + + + + + + + + + + + + + + End="19.7503904364368,0" /> + Point1="19.7503904364368,0" + Point2="23.7503904364368,0" + Point3="23.7503904364368,4" /> + End="23.7503904364368,121.388888888889" /> + + - + Id="Package.PrecedenceConstraints[Constraint 6]" + TopLeft="995.5,817.388888888889"> + End="42.1388888888891,0"> + End="42.1388888888891,0" /> @@ -6977,11 +7306,84 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DataSourceViewID + + + TableInfoObjectType + Table + + + + + + + DataSourceViewID + + + + Capacity="8" xmlns="clr-namespace:Microsoft.SqlServer.IntegrationServices.Designer.Model.Serialization;assembly=Microsoft.SqlServer.IntegrationServices.Graph" xmlns:mssgle="clr-namespace:Microsoft.SqlServer.Graph.LayoutEngine;assembly=Microsoft.SqlServer.Graph" xmlns:assembly="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mssgm="clr-namespace:Microsoft.SqlServer.Graph.Model;assembly=Microsoft.SqlServer.Graph"> Size="170,42" Id="Package\ForEach Spravato File\Load Spravato Stage\Add Load Metadata" TopLeft="513,120" /> + + + + + + + + + + + + + + @@ -7017,7 +7443,9 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - + - - - - - - - - - - - - - - - + @@ -7093,76 +7501,5 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - - - - - - - - - - - - - - - - - - - - - DataSourceViewID - - - - - - - DataSourceViewID - - - TableInfoObjectType - Table - - - - - - - - - - ]]> \ No newline at end of file diff --git a/SpravatoETL/SpravatoETL.dtproj b/SpravatoETL/SpravatoETL.dtproj index 7452613..361c371 100644 --- a/SpravatoETL/SpravatoETL.dtproj +++ b/SpravatoETL/SpravatoETL.dtproj @@ -26,7 +26,7 @@ NB7014 - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA3sg5/WnZgE6AXM2AQAN7vwAAAAACAAAAAAAQZgAAAAEAACAAAADXpt36v+b/G2k3GP+x5aSBNtsGI66t2XClrgVXV8G93gAAAAAOgAAAAAIAACAAAAAp6SAHJ2+eFa1lecFSHIJjT+tQySnEYLkSZx+eboTACpAAAABd/6SVjhO/Ls1ZUXLbz4ES6iLa/Gj2EDfnbNb2Ew5SfG0ejvQtCt/NFIMdLy8Nu5rtAimyrs11UHLB7JwqePRhf6rEL/9MqvIsjhAehu8OYkNy7+mE77/YjwGLyvb0HHR+QewWJG99eB4NYFYbg55TA5wEyUIkSOcIdTfZz2ftmjyB0Jw8OZkqjYlr014Ots1AAAAAi/9ZN4kcsrRzs/6OUL8yjLu/xl/9bpjWNFEGwTzHtw0/Q8X+3O1NiJmLCZdOHH26GSElgtn1aZFqegnwvWHBng== + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA3sg5/WnZgE6AXM2AQAN7vwAAAAACAAAAAAAQZgAAAAEAACAAAAD2n8v162jS4usYQHHgTQpKiRrTte/8ME/zYYKLxZUsEwAAAAAOgAAAAAIAACAAAAAm/Yj5ab39arKSQVVLwUSWXzP1QJjuIi7+HwxO6ZU7fJAAAACMTeNcKPb6Gi/JogRDslqyaCkD66WFeN1Cq9E6QSeooteLQt2PJDDg1zmnVU/wkZCf1a/bqq4uyweFvmuSpRW8JpcqJDcFSG0BiKUNmY8zmp70tOczxLG/16T2tOgDglvdrwJLTJDXxXWCLcTi+q/7FtrMkzmRjs/6xUboH6CztpldpvXBqhvjnDHU4PC8PWZAAAAAgXV+v+NkuKyQDpDve2Kxhqu6jWbSNJ2JJZcGQ/MKekU4Iycgra4AFLzBzrrkqFSH2ylNtd4u2fbTGYcBhJ/wsg== 1 @@ -42,10 +42,10 @@ SpravatoAuditImport 1 0 - 66 + 82 - {210EF0DC-4CA9-47F1-9622-033CF9A901AB} + {14915F2A-D0D6-419E-A990-87951680C062} 8 @@ -62,7 +62,7 @@ 0 0 0 - Admin vs Dispensed SMC*.xlsx + Admin Vs Dispensed SMC20260104-0110.xlsx 18 @@ -90,7 +90,7 @@ 0 0 0 - \\retreathealthcare.org\network\Data\PHRMCY\Pharmacy Metrics\2026 Metrics\2026 Spravato Audit + \\retreathealthcare.org\network\Data\PHRMCY\Pharmacy Metrics 18