diff --git a/Examples/APM/ReadMe.md b/Examples/APM/ReadMe.md
index efd4b66..1920edd 100644
--- a/Examples/APM/ReadMe.md
+++ b/Examples/APM/ReadMe.md
@@ -1,5 +1,9 @@
#MESA APM 2.0 KPI-ML Examples
+<<<<<<< HEAD
This folder contains example KPI-ML files for APM (Asset Performance Management) 2.0. These files are companion materials to the forthcoming white paper series by MESA on APM 2.0. These KPIs are defined in the first white paper of the series, which is titled "Guidelines for Goal Setting & Implementation Planning". The white paper will be available in the MESA Resource library (https://services.mesa.org/ResourceLibrary) in 2016Q3.
+=======
+This folder contains example KPI-ML files for APM (Asset Performance Management) 2.0. These files are companion materials to the forthcoming white paper APM 2.0 series by MESA. These KPIs are defined in the first white paper of the APM 2.0 series, which is titled "Guidelines for Goal Setting & Implementation Planning". The white paper will be available in the MESA Resource library (https://services.mesa.org/ResourceLibrary) in 2016Q3.
+>>>>>>> 3bd2785db624a93b14338c3bcf722575698acab9
See http://www.mesa.org/en/modelstrategicinitiatives/APM.asp for more information about the MESA APM 2.0 Working Group.
diff --git a/Source/Csharp/Hosting Your Own NuGet Feeds.website b/Source/Csharp/Hosting Your Own NuGet Feeds.website
new file mode 100644
index 0000000..391c510
--- /dev/null
+++ b/Source/Csharp/Hosting Your Own NuGet Feeds.website
@@ -0,0 +1,15 @@
+[{000214A0-0000-0000-C000-000000000046}]
+Prop4=31,Hosting Your Own NuGet Feeds
+Prop3=19,2
+[{A7AF692E-098D-4C08-A225-D433CA835ED0}]
+Prop5=3,0
+Prop9=19,0
+Prop2=65,2C0000000000000001000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F0000001F0000005D0600007B0300003C
+[InternetShortcut]
+URL=http://docs.nuget.org/docs/creating-packages/hosting-your-own-nuget-feeds
+IDList=
+IconFile=http://docs.nuget.org/favicon.ico
+IconIndex=1
+[{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}]
+Prop12=19,2
+Prop5=8,Microsoft.Website.BB217B22.C4AC2EF9
diff --git a/Source/Csharp/MESA.KPIML/.nuget/.gitignore b/Source/Csharp/MESA.KPIML/.nuget/.gitignore
new file mode 100644
index 0000000..78c5494
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/.nuget/.gitignore
@@ -0,0 +1 @@
+/*.exe
diff --git a/Source/Csharp/MESA.KPIML/.nuget/NuGet.Config b/Source/Csharp/MESA.KPIML/.nuget/NuGet.Config
new file mode 100644
index 0000000..67f8ea0
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/.nuget/NuGet.Config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/.nuget/NuGet.targets b/Source/Csharp/MESA.KPIML/.nuget/NuGet.targets
new file mode 100644
index 0000000..b12013c
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/.nuget/NuGet.targets
@@ -0,0 +1,144 @@
+
+
+
+ $(MSBuildProjectDirectory)\..\
+
+
+ true
+
+
+ false
+
+
+ false
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+ $([System.IO.Path]::Combine($(SolutionDir), ".nuget"))
+
+
+
+
+ $(SolutionDir).nuget
+
+
+
+ $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName.Replace(' ', '_')).config
+ $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config
+
+
+
+ $(MSBuildProjectDirectory)\packages.config
+ $(PackagesProjectConfig)
+
+
+
+
+ $(NuGetToolsPath)\NuGet.exe
+ @(PackageSource)
+
+ "$(NuGetExePath)"
+ mono --runtime=v4.0.30319 "$(NuGetExePath)"
+
+ $(TargetDir.Trim('\\'))
+
+ -RequireConsent
+ -NonInteractive
+
+ "$(SolutionDir) "
+ "$(SolutionDir)"
+
+
+ $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)
+ $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols
+
+
+
+ RestorePackages;
+ $(BuildDependsOn);
+
+
+
+
+ $(BuildDependsOn);
+ BuildPackage;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/Csharp/MESA.KPIML/KPI-ML.sln b/Source/Csharp/MESA.KPIML/KPI-ML.sln
new file mode 100644
index 0000000..353bed3
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPI-ML.sln
@@ -0,0 +1,60 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.40629.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F9AF529E-ADF4-48AA-8971-14BB0A2086B2}"
+ ProjectSection(SolutionItems) = preProject
+ ToDo.txt = ToDo.txt
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{F5562F5A-3E1F-48F6-9523-DE586FBFED8E}"
+ ProjectSection(SolutionItems) = preProject
+ .nuget\.gitignore = .nuget\.gitignore
+ .nuget\NuGet.Config = .nuget\NuGet.Config
+ .nuget\NuGet.exe = .nuget\NuGet.exe
+ .nuget\NuGet.targets = .nuget\NuGet.targets
+ .nuget\NuGet20151021.exe = .nuget\NuGet20151021.exe
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KPIML.NuGet.Packager", "KPIML.NuGet.Packager\KPIML.NuGet.Packager.csproj", "{0451BAEF-DF2E-4B98-8644-94EE9415E389}"
+ ProjectSection(ProjectDependencies) = postProject
+ {EEC1B04D-AE14-4607-9418-33E35559B1AA} = {EEC1B04D-AE14-4607-9418-33E35559B1AA}
+ {4EC94868-4170-4237-8814-DAD079A84615} = {4EC94868-4170-4237-8814-DAD079A84615}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KPIML.Cs", "KPIML\KPIML.Cs.csproj", "{EEC1B04D-AE14-4607-9418-33E35559B1AA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KPIML_UnitTests", "KPIML_UnitTests\KPIML_UnitTests.csproj", "{4EC94868-4170-4237-8814-DAD079A84615}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "packages", "packages", "{05E408F2-2070-4056-B2F6-B2A47B9BFE10}"
+ ProjectSection(SolutionItems) = preProject
+ packages\repositories.config = packages\repositories.config
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0451BAEF-DF2E-4B98-8644-94EE9415E389}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0451BAEF-DF2E-4B98-8644-94EE9415E389}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0451BAEF-DF2E-4B98-8644-94EE9415E389}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0451BAEF-DF2E-4B98-8644-94EE9415E389}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EEC1B04D-AE14-4607-9418-33E35559B1AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EEC1B04D-AE14-4607-9418-33E35559B1AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EEC1B04D-AE14-4607-9418-33E35559B1AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EEC1B04D-AE14-4607-9418-33E35559B1AA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4EC94868-4170-4237-8814-DAD079A84615}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4EC94868-4170-4237-8814-DAD079A84615}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4EC94868-4170-4237-8814-DAD079A84615}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4EC94868-4170-4237-8814-DAD079A84615}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(CodealikeProperties) = postSolution
+ SolutionGuid = a2757718-80b0-42a1-8625-f7d91b732b60
+ EndGlobalSection
+EndGlobal
diff --git a/Source/Csharp/MESA.KPIML/KPI-ML.v12.suo b/Source/Csharp/MESA.KPIML/KPI-ML.v12.suo
new file mode 100644
index 0000000..4acf812
Binary files /dev/null and b/Source/Csharp/MESA.KPIML/KPI-ML.v12.suo differ
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/.gitignore b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/.gitignore
new file mode 100644
index 0000000..70e9edf
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/.gitignore
@@ -0,0 +1,7 @@
+/*.bak
+
+/*.nupkg
+
+/*.exe
+
+/*.user
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/KPI-ML2.jpg b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/KPI-ML2.jpg
new file mode 100644
index 0000000..05fad3a
Binary files /dev/null and b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/KPI-ML2.jpg differ
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/KPIML.NuGet.Packager.csproj b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/KPIML.NuGet.Packager.csproj
new file mode 100644
index 0000000..51bdae9
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/KPIML.NuGet.Packager.csproj
@@ -0,0 +1,96 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {0451BAEF-DF2E-4B98-8644-94EE9415E389}
+ Library
+ Properties
+ KPI_ML.NuGet.Packager
+ KPI-ML.NuGet.Packager
+ v3.5
+
+
+ 512
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ bin\Debug\
+
+
+ AnyCPU
+ bin\Release\
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ REM NuGet packager projects don't seem to run Pre-build events at the required point in time.
+REM
+REM DIR $(ProjectDir)NuGet.*
+REM DIR $(SolutionDir).nuget\*.exe
+REM if NOT EXIST $(ProjectDir)NuGet.exe ( xcopy $(SolutionDir).nuget\NuGet.exe $(ProjectDir)NuGet.exe )
+
+
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGet.config b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGet.config
new file mode 100644
index 0000000..600485a
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGet.config
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGet.log b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGet.log
new file mode 100644
index 0000000..e36b853
Binary files /dev/null and b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGet.log differ
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGetPackage.ps1 b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGetPackage.ps1
new file mode 100644
index 0000000..20f4115
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGetPackage.ps1
@@ -0,0 +1,336 @@
+Param (
+ [switch]$Publish
+)
+
+$ErrorActionPreference = "Stop"
+$global:ExitCode = 1
+
+function Write-Log {
+
+ #region Parameters
+
+ [cmdletbinding()]
+ Param(
+ [Parameter(ValueFromPipeline=$true)]
+ [array] $Messages,
+
+ [Parameter()] [ValidateSet("Error", "Warn", "Info")]
+ [string] $Level = "Info",
+
+ [Parameter()]
+ [Switch] $NoConsoleOut = $false,
+
+ [Parameter()]
+ [String] $ForegroundColor = 'White',
+
+ [Parameter()] [ValidateRange(1,30)]
+ [Int16] $Indent = 0,
+
+ [Parameter()]
+ [IO.FileInfo] $Path = ".\NuGet.log",
+
+ [Parameter()]
+ [Switch] $Clobber,
+
+ [Parameter()]
+ [String] $EventLogName,
+
+ [Parameter()]
+ [String] $EventSource,
+
+ [Parameter()]
+ [Int32] $EventID = 1
+
+ )
+
+ #endregion
+
+ Begin {}
+
+ Process {
+
+ $ErrorActionPreference = "Continue"
+
+ if ($Messages.Length -gt 0) {
+ try {
+ foreach($m in $Messages) {
+ if ($NoConsoleOut -eq $false) {
+ switch ($Level) {
+ 'Error' {
+ Write-Error $m -ErrorAction SilentlyContinue
+ Write-Host ('{0}{1}' -f (" " * $Indent), $m) -ForegroundColor Red
+ }
+ 'Warn' {
+ Write-Warning $m
+ }
+ 'Info' {
+ Write-Host ('{0}{1}' -f (" " * $Indent), $m) -ForegroundColor $ForegroundColor
+ }
+ }
+ }
+
+ if ($m.Trim().Length -gt 0) {
+ $msg = '{0}{1} [{2}] : {3}' -f (" " * $Indent), (Get-Date -Format "yyyy-MM-dd HH:mm:ss"), $Level.ToUpper(), $m
+
+ if ($Clobber) {
+ $msg | Out-File -FilePath $Path -Force
+ } else {
+ $msg | Out-File -FilePath $Path -Append
+ }
+ }
+
+ if ($EventLogName) {
+
+ if (-not $EventSource) {
+ $EventSource = ([IO.FileInfo] $MyInvocation.ScriptName).Name
+ }
+
+ if(-not [Diagnostics.EventLog]::SourceExists($EventSource)) {
+ [Diagnostics.EventLog]::CreateEventSource($EventSource, $EventLogName)
+ }
+
+ $log = New-Object System.Diagnostics.EventLog
+ $log.set_log($EventLogName)
+ $log.set_source($EventSource)
+
+ switch ($Level) {
+ "Error" { $log.WriteEntry($Message, 'Error', $EventID) }
+ "Warn" { $log.WriteEntry($Message, 'Warning', $EventID) }
+ "Info" { $log.WriteEntry($Message, 'Information', $EventID) }
+ }
+ }
+ }
+ }
+ catch {
+ throw "Failed to create log entry in: '$Path'. The error was: '$_'."
+ }
+ }
+ }
+
+ End {}
+
+ <#
+ .SYNOPSIS
+ Writes logging information to screen and log file simultaneously.
+
+ .DESCRIPTION
+ Writes logging information to screen and log file simultaneously. Supports multiple log levels.
+
+ .PARAMETER Messages
+ The messages to be logged.
+
+ .PARAMETER Level
+ The type of message to be logged.
+
+ .PARAMETER NoConsoleOut
+ Specifies to not display the message to the console.
+
+ .PARAMETER ConsoleForeground
+ Specifies what color the text should be be displayed on the console. Ignored when switch 'NoConsoleOut' is specified.
+
+ .PARAMETER Indent
+ The number of spaces to indent the line in the log file.
+
+ .PARAMETER Path
+ The log file path.
+
+ .PARAMETER Clobber
+ Existing log file is deleted when this is specified.
+
+ .PARAMETER EventLogName
+ The name of the system event log, e.g. 'Application'.
+
+ .PARAMETER EventSource
+ The name to appear as the source attribute for the system event log entry. This is ignored unless 'EventLogName' is specified.
+
+ .PARAMETER EventID
+ The ID to appear as the event ID attribute for the system event log entry. This is ignored unless 'EventLogName' is specified.
+
+ .EXAMPLE
+ PS C:\> Write-Log -Message "It's all good!" -Path C:\MyLog.log -Clobber -EventLogName 'Application'
+
+ .EXAMPLE
+ PS C:\> Write-Log -Message "Oops, not so good!" -Level Error -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "My Script"
+
+ .INPUTS
+ System.String
+
+ .OUTPUTS
+ No output.
+
+ .NOTES
+ Revision History:
+ 2011-03-10 : Andy Arismendi - Created.
+ #>
+}
+
+function Create-Process() {
+ param([string] $fileName, [string] $arguments)
+
+ $pinfo = New-Object System.Diagnostics.ProcessStartInfo
+ $pinfo.RedirectStandardError = $true
+ $pinfo.RedirectStandardOutput = $true
+ $pinfo.UseShellExecute = $false
+ $pinfo.FileName = $fileName
+ $pinfo.Arguments = $arguments
+
+ $p = New-Object System.Diagnostics.Process
+ $p.StartInfo = $pinfo
+
+ return $p
+}
+
+function HandlePublishError {
+ param([string] $ErrorMessage)
+
+ # Run NuGet Setup
+ $encodedMessage = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ErrorMessage))
+ $setupTask = Start-Process PowerShell.exe "-ExecutionPolicy Unrestricted -File .\NuGetSetup.ps1 -Url $url -Base64EncodedMessage $encodedMessage" -Wait -PassThru
+
+ #Write-Log ("NuGet Setup Task Exit Code: " + $setupTask.ExitCode)
+
+ if ($setupTask.ExitCode -eq 0) {
+ # Try to push package again
+ $publishTask = Create-Process .\NuGet.exe ("push " + $_.Name + " -Source " + $url)
+ $publishTask.Start() | Out-Null
+ $publishTask.WaitForExit()
+
+ $output = ($publishTask.StandardOutput.ReadToEnd() -Split '[\r\n]') |? {$_}
+ $error = (($publishTask.StandardError.ReadToEnd() -Split '[\r\n]') |? {$_})
+ Write-Log $output
+ Write-Log $error Error
+
+ if ($publishTask.ExitCode -eq 0) {
+ $global:ExitCode = 0
+ }
+ }
+ elseif ($setupTask.ExitCode -eq 2) {
+ $global:ExitCode = 2
+ }
+ else {
+ $global:ExitCode = 0
+ }
+}
+
+function Publish {
+
+ Write-Log " "
+ Write-Log "Publishing package..." -ForegroundColor Green
+
+ # Get nuget config
+ [xml]$nugetConfig = Get-Content .\NuGet.Config
+
+ $nugetConfig.configuration.packageSources.add | ForEach-Object {
+ $url = $_.value
+
+ Write-Log "Repository Url: $url"
+ Write-Log " "
+
+ Get-ChildItem *.nupkg | Where-Object { $_.Name.EndsWith(".symbols.nupkg") -eq $false } | ForEach-Object {
+
+ # Try to push package
+ $task = Create-Process .\NuGet.exe ("push " + $_.Name + " -Source " + $url)
+ $task.Start() | Out-Null
+ $task.WaitForExit()
+
+ $output = ($task.StandardOutput.ReadToEnd() -Split '[\r\n]') |? { $_ }
+ $error = ($task.StandardError.ReadToEnd() -Split '[\r\n]') |? { $_ }
+ Write-Log $output
+ Write-Log $error Error
+
+ if ($task.ExitCode -gt 0) {
+ HandlePublishError -ErrorMessage $error
+ #Write-Log ("HandlePublishError() Exit Code: " + $global:ExitCode)
+ }
+ else {
+ $global:ExitCode = 0
+ }
+ }
+ }
+}
+
+Write-Log " "
+Write-Log "NuGet Packager 2.0.3" -ForegroundColor Yellow
+
+# KJS 2016-08-05 Get the NuGet.exe from the Solution's NuGet package manager, instead of checking a version into GitHub
+Write-Log " "
+if (Test-Path .\NuGet.exe) {
+ Write-Log "Using existing NuGet.exe from project folder"
+}
+else
+{
+ # Provided the user has done a Solution build that will build the Unit Test project, and thereby invoke
+ # the NuGet Package Manager on NUnit, we should be guaranteed that a usable NuGet.exe is in the
+ # Solution .nuget folder. The build dependencies try to force this to be the case. So try to copy it.
+ if (Test-Path ..\.nuget\NuGet.exe)
+ {
+ Write-Log "Copying NuGet.exe from Solution folder to local project"
+ Copy-Item ..\.nuget\NuGet.exe .\NuGet.exe -Verbose -WarningAction Stop -ErrorAction Stop
+ # Sometimes it copies a zero-byte file the first time after a Clean. Simple workaround that seems to solve this: rebuild.
+ }
+ else
+ {
+ # if not found, the rest of this script will likely fail at the -update self below
+ Write-Log "WARNING: NuGet.exe is not available in Solution folder or in local project - packaging cannot be done."
+ }
+}
+
+# Make sure the newly copied nuget executable is writable
+Set-ItemProperty .\NuGet.exe -Name IsReadOnly -Value $false
+
+# Make sure the nupkg files are writeable and create backup
+if (Test-Path *.nupkg) {
+ Set-ItemProperty *.nupkg -Name IsReadOnly -Value $false
+
+ Write-Log " "
+ Write-Log "Creating backup..." -ForegroundColor Green
+
+ Get-ChildItem *.nupkg | ForEach-Object {
+ Move-Item $_.Name ($_.Name + ".bak") -Force
+ Write-Log ("Renamed " + $_.Name + " to " + $_.Name + ".bak")
+ }
+}
+
+Write-Log " "
+Write-Log "Updating NuGet..." -ForegroundColor Green
+Write-Log (Invoke-Command {.\NuGet.exe update -Self} -ErrorAction Stop)
+
+Write-Log " "
+Write-Log "Creating package..." -ForegroundColor Green
+
+# Create symbols package if any .pdb files are located in the lib folder
+If ((Get-ChildItem *.pdb -Path .\lib -Recurse).Count -gt 0) {
+ $packageTask = Create-Process .\NuGet.exe ("pack Package.nuspec -Symbol -Verbosity Detailed")
+ $packageTask.Start() | Out-Null
+ $packageTask.WaitForExit()
+
+ $output = ($packageTask.StandardOutput.ReadToEnd() -Split '[\r\n]') |? {$_}
+ $error = (($packageTask.StandardError.ReadToEnd() -Split '[\r\n]') |? {$_})
+ Write-Log $output
+ Write-Log $error Error
+
+ $global:ExitCode = $packageTask.ExitCode
+}
+Else {
+ $packageTask = Create-Process .\NuGet.exe ("pack Package.nuspec -Verbosity Detailed")
+ $packageTask.Start() | Out-Null
+ $packageTask.WaitForExit()
+
+ $output = ($packageTask.StandardOutput.ReadToEnd() -Split '[\r\n]') |? {$_}
+ $error = (($packageTask.StandardError.ReadToEnd() -Split '[\r\n]') |? {$_})
+ Write-Log $output
+ Write-Log $error Error
+
+ $global:ExitCode = $packageTask.ExitCode
+}
+
+# Check if package should be published
+if ($Publish -and $global:ExitCode -eq 0) {
+ Publish
+}
+
+Write-Log " "
+Write-Log "Exit Code: $global:ExitCode" -ForegroundColor Gray
+
+$host.SetShouldExit($global:ExitCode)
+Exit $global:ExitCode
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGetSetup.ps1 b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGetSetup.ps1
new file mode 100644
index 0000000..bd9aa5e
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGetSetup.ps1
@@ -0,0 +1,208 @@
+Param (
+ [string]$Url,
+ [string]$Base64EncodedMessage
+)
+
+$ErrorActionPreference = "Stop"
+$ExitCode = 1
+
+function Write-Log {
+
+ #region Parameters
+
+ [cmdletbinding()]
+ Param(
+ [Parameter(ValueFromPipeline=$true)]
+ [array] $Messages,
+
+ [Parameter()] [ValidateSet("Error", "Warn", "Info")]
+ [string] $Level = "Info",
+
+ [Parameter()]
+ [Switch] $NoConsoleOut = $false,
+
+ [Parameter()]
+ [String] $ForegroundColor = 'White',
+
+ [Parameter()] [ValidateRange(1,30)]
+ [Int16] $Indent = 0,
+
+ [Parameter()]
+ [IO.FileInfo] $Path = ".\NuGet.log",
+
+ [Parameter()]
+ [Switch] $Clobber,
+
+ [Parameter()]
+ [String] $EventLogName,
+
+ [Parameter()]
+ [String] $EventSource,
+
+ [Parameter()]
+ [Int32] $EventID = 1
+
+ )
+
+ #endregion
+
+ Begin {}
+
+ Process {
+
+ $ErrorActionPreference = "Continue"
+
+ if ($Messages.Length -gt 0) {
+ try {
+ foreach($m in $Messages) {
+ if ($NoConsoleOut -eq $false) {
+ switch ($Level) {
+ 'Error' {
+ Write-Error $m -ErrorAction SilentlyContinue
+ Write-Host ('{0}{1}' -f (" " * $Indent), $m) -ForegroundColor Red
+ }
+ 'Warn' {
+ Write-Warning $m
+ }
+ 'Info' {
+ Write-Host ('{0}{1}' -f (" " * $Indent), $m) -ForegroundColor $ForegroundColor
+ }
+ }
+ }
+
+ if ($m.Trim().Length -gt 0) {
+ $msg = '{0}{1} [{2}] : {3}' -f (" " * $Indent), (Get-Date -Format "yyyy-MM-dd HH:mm:ss"), $Level.ToUpper(), $m
+
+ if ($Clobber) {
+ $msg | Out-File -FilePath $Path -Force
+ } else {
+ $msg | Out-File -FilePath $Path -Append
+ }
+ }
+
+ if ($EventLogName) {
+
+ if (-not $EventSource) {
+ $EventSource = ([IO.FileInfo] $MyInvocation.ScriptName).Name
+ }
+
+ if(-not [Diagnostics.EventLog]::SourceExists($EventSource)) {
+ [Diagnostics.EventLog]::CreateEventSource($EventSource, $EventLogName)
+ }
+
+ $log = New-Object System.Diagnostics.EventLog
+ $log.set_log($EventLogName)
+ $log.set_source($EventSource)
+
+ switch ($Level) {
+ "Error" { $log.WriteEntry($Message, 'Error', $EventID) }
+ "Warn" { $log.WriteEntry($Message, 'Warning', $EventID) }
+ "Info" { $log.WriteEntry($Message, 'Information', $EventID) }
+ }
+ }
+ }
+ }
+ catch {
+ throw "Failed to create log entry in: '$Path'. The error was: '$_'."
+ }
+ }
+ }
+
+ End {}
+
+ <#
+ .SYNOPSIS
+ Writes logging information to screen and log file simultaneously.
+
+ .DESCRIPTION
+ Writes logging information to screen and log file simultaneously. Supports multiple log levels.
+
+ .PARAMETER Messages
+ The messages to be logged.
+
+ .PARAMETER Level
+ The type of message to be logged.
+
+ .PARAMETER NoConsoleOut
+ Specifies to not display the message to the console.
+
+ .PARAMETER ConsoleForeground
+ Specifies what color the text should be be displayed on the console. Ignored when switch 'NoConsoleOut' is specified.
+
+ .PARAMETER Indent
+ The number of spaces to indent the line in the log file.
+
+ .PARAMETER Path
+ The log file path.
+
+ .PARAMETER Clobber
+ Existing log file is deleted when this is specified.
+
+ .PARAMETER EventLogName
+ The name of the system event log, e.g. 'Application'.
+
+ .PARAMETER EventSource
+ The name to appear as the source attribute for the system event log entry. This is ignored unless 'EventLogName' is specified.
+
+ .PARAMETER EventID
+ The ID to appear as the event ID attribute for the system event log entry. This is ignored unless 'EventLogName' is specified.
+
+ .EXAMPLE
+ PS C:\> Write-Log -Message "It's all good!" -Path C:\MyLog.log -Clobber -EventLogName 'Application'
+
+ .EXAMPLE
+ PS C:\> Write-Log -Message "Oops, not so good!" -Level Error -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "My Script"
+
+ .INPUTS
+ System.String
+
+ .OUTPUTS
+ No output.
+
+ .NOTES
+ Revision History:
+ 2011-03-10 : Andy Arismendi - Created.
+ #>
+}
+
+$choices = [System.Management.Automation.Host.ChoiceDescription[]](
+ (New-Object System.Management.Automation.Host.ChoiceDescription "&Add API Key","Add an API Key for this URL"),
+ (New-Object System.Management.Automation.Host.ChoiceDescription "&Skip","Skip pushing to this URL"))
+
+ Write-Output ""
+ Write-Log "Invalid API key for this repository URL, or there is a version conflict" Warn
+
+ If ($Base64EncodedMessage) {
+ Write-Warning ([System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($Base64EncodedMessage)))
+ }
+
+ $firstAnswer = $Host.UI.PromptForChoice(("Would you like to try adding an API key for " + $Url + "?"), "", $choices, (1))
+
+ if ($firstAnswer -eq 0) {
+ $fields = new-object "System.Collections.ObjectModel.Collection``1[[System.Management.Automation.Host.FieldDescription]]"
+
+ $f = New-Object System.Management.Automation.Host.FieldDescription "API Key for $Url"
+ $f.SetParameterType( [System.Security.SecureString] )
+ $f.HelpMessage = "Please enter API Key for $Url"
+ $f.Label = "&API Key for $Url"
+
+ $fields.Add($f)
+
+ $results = $Host.UI.Prompt( "Add API Key", "", $fields )
+
+ $pass = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($results["API Key for $Url"]))
+
+ # Add API Key to config file
+ Write-Log (.\NuGet.exe setApiKey $pass -Source $Url)
+
+ if ($LASTEXITCODE -le 0) {
+ $ExitCode = 0
+ }
+ }
+ else {
+ Write-Log "Skipping..."
+ $ExitCode = 2
+ }
+
+$host.SetShouldExit($ExitCode)
+Exit $ExitCode
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGet_online.config b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGet_online.config
new file mode 100644
index 0000000..f967ce4
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/NuGet_online.config
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/Package.nuspec b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/Package.nuspec
new file mode 100644
index 0000000..f80397a
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/Package.nuspec
@@ -0,0 +1,37 @@
+
+
+
+ MESA.KPIML
+ 2.0.0.0001
+ MESA.KPIML
+
+ MESA International
+ MESA International
+
+ MESA KPI-ML v2.0 support in C# .NET
+
+
+ MESA KPI-ML (Key Performance Indicator Markup Language) in C# .NET
+ See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+
+
+ First release of C#/.NET code initially auto-generated from the .EAP file for KPI-ML v1.0. Updated for KPI-ML v2.0.
+
+ en-US
+ https://github.com/MESAInternational/KPI-ML/
+ http://www.mesa.org/en/resources/KPI-ML2.jpg
+ false
+ http://opensource.org/licenses/Apache-2.0
+ The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+
+
+ MESA, XML, KPIML, KPI-ML
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/Properties/AssemblyInfo.cs b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..1a85b6e
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/Properties/AssemblyInfo.cs
@@ -0,0 +1,34 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("MESA.KPI_ML")]
+[assembly: AssemblyDescription("NuGet Package for MESA KPI-ML in C#/.NET")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("ABB")]
+[assembly: AssemblyProduct("MESA.KPI_ML")]
+[assembly: AssemblyCopyright("Copyright © MESA 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("5b586874-8d3e-4137-9ba8-e982413416d5")]
+
+// 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 Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.1.*")]
+[assembly: AssemblyFileVersion("1.0.1.0")]
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/bin/.gitignore b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/bin/.gitignore
new file mode 100644
index 0000000..e52f825
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/bin/.gitignore
@@ -0,0 +1,2 @@
+/Release
+/Debug
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/obj/.gitignore b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/obj/.gitignore
new file mode 100644
index 0000000..e52f825
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/obj/.gitignore
@@ -0,0 +1,2 @@
+/Release
+/Debug
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/tools/init.ps1 b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/tools/init.ps1
new file mode 100644
index 0000000..a686abf
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/tools/init.ps1
@@ -0,0 +1,8 @@
+# Runs the first time a package is installed in a solution, and every time the solution is opened.
+
+param($installPath, $toolsPath, $package, $project)
+
+# $installPath is the path to the folder where the package is installed.
+# $toolsPath is the path to the tools directory in the folder where the package is installed.
+# $package is a reference to the package object.
+# $project is null in init.ps1
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/tools/install.ps1 b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/tools/install.ps1
new file mode 100644
index 0000000..c175998
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/tools/install.ps1
@@ -0,0 +1,8 @@
+# Runs every time a package is installed in a project
+
+param($installPath, $toolsPath, $package, $project)
+
+# $installPath is the path to the folder where the package is installed.
+# $toolsPath is the path to the tools directory in the folder where the package is installed.
+# $package is a reference to the package object.
+# $project is a reference to the project the package was installed to.
diff --git a/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/tools/uninstall.ps1 b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/tools/uninstall.ps1
new file mode 100644
index 0000000..0ed95e5
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML.NuGet.Packager/tools/uninstall.ps1
@@ -0,0 +1,8 @@
+# Runs every time a package is uninstalled
+
+param($installPath, $toolsPath, $package, $project)
+
+# $installPath is the path to the folder where the package is installed.
+# $toolsPath is the path to the tools directory in the folder where the package is installed.
+# $package is a reference to the package object.
+# $project is a reference to the project the package was installed to.
diff --git a/Source/Csharp/MESA.KPIML/KPIML/.gitignore b/Source/Csharp/MESA.KPIML/KPIML/.gitignore
new file mode 100644
index 0000000..d7a4d4d
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/.gitignore
@@ -0,0 +1 @@
+/*.user
diff --git a/Source/Csharp/MESA.KPIML/KPIML/KPIML.Cs.csproj b/Source/Csharp/MESA.KPIML/KPIML/KPIML.Cs.csproj
new file mode 100644
index 0000000..78d8419
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/KPIML.Cs.csproj
@@ -0,0 +1,65 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {EEC1B04D-AE14-4607-9418-33E35559B1AA}
+ Library
+ Properties
+ MESA.KPIML
+ MESA.KPIML
+ v4.5
+ 512
+ ..\
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ bin\Debug\MESA.KPIML.XML
+ true
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ bin\Release\MESA.KPIML.XML
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML/Properties/AssemblyInfo.cs b/Source/Csharp/MESA.KPIML/KPIML/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..c15d625
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/Properties/AssemblyInfo.cs
@@ -0,0 +1,29 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("MESA.KPIML")]
+[assembly: AssemblyDescription("MESA KPI-ML C# library")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("MESA")]
+[assembly: AssemblyProduct("MESA.KPIML")]
+[assembly: AssemblyCopyright("Copyright © MESA 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("bc18fe26-fbc5-442d-9b88-a9ef4956b382")]
+
+// 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 Build and Revision Numbers
+// by using the '*' as shown: [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("2.0.0.*")]
+[assembly: AssemblyFileVersion("2.0.0.1")]
diff --git a/Source/Csharp/MESA.KPIML/KPIML/bin/.gitignore b/Source/Csharp/MESA.KPIML/KPIML/bin/.gitignore
new file mode 100644
index 0000000..e52f825
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/bin/.gitignore
@@ -0,0 +1,2 @@
+/Release
+/Debug
diff --git a/Source/Csharp/MESA.KPIML/KPIML/obj/.gitignore b/Source/Csharp/MESA.KPIML/KPIML/obj/.gitignore
new file mode 100644
index 0000000..e52f825
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/obj/.gitignore
@@ -0,0 +1,2 @@
+/Release
+/Debug
diff --git a/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Definition.cs b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Definition.cs
new file mode 100644
index 0000000..e23b8c3
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Definition.cs
@@ -0,0 +1,177 @@
+///////////////////////////////////////////////////////////
+// KPI_Definition.cs
+// Implementation of the Class KPI_Definition
+// Generated by Enterprise Architect
+// Created on: 22-Oct-2015 10:06:06 PM
+// Original author: dnbrandl
+// Code generator/author: kjsmiley
+// Last revised 2016-08-05
+// The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+///////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+
+namespace MESA.KPIML
+{
+ ///
+ /// MESA KPI Definition class. Referenceable by ID.
+ /// See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+ ///
+ public class KPI_Definition
+ {
+ ///
+ /// ID for the KPI Definition. Must be unique.
+ /// (if a numeric value is desired, use LONG instead of ULONG
+ /// to maximize compatibility across Java and C#. for a string,
+ /// consider using string equivalent of a type such as GUID)
+ ///
+ public string ID = "";
+
+ ///
+ /// Name for the KPI Definition
+ ///
+ public string Name = "";
+
+ ///
+ /// Audience(s) for this KPI Definition
+ /// Optional.
+ ///
+ public List Audience = new List();
+
+ ///
+ /// Description text(s) about the KPI Definition
+ /// Optional.
+ ///
+ public List Description = new List();
+
+ ///
+ /// Effect Model(s) for the KPI Definition.
+ /// See ISO-22400 standard for MIME types.
+ /// Optional.
+ ///
+ public List EffectModel = new List();
+
+ ///
+ /// Formula for the KPI Definition
+ ///
+ public string Formula = "";
+
+ ///
+ /// HierarchyScope for the KPI Definition
+ /// Optional.
+ ///
+ /// (proposed addition to KPI-ML v1.0+)
+ public List HierarchyScope = new List();
+
+ ///
+ /// List of Note(s) about the KPI Definition
+ /// Optional.
+ ///
+ public List Notes = new List();
+
+ ///
+ /// Text(s) about the Production Methodology for the KPI Definition
+ /// More than one value is permitted.
+ /// Allowable values are:
+ /// Batch
+ /// Discrete
+ /// Continuous
+ /// Other (provide Other value)
+ /// Optional.
+ ///
+ /// KpiMlEnums.ProductionMethodologies contains the list of allowable values.
+ public List ProductionMethodology = new List();
+
+ ///
+ /// Scope text(s) about the KPI Definition
+ /// e.g. work area, unit, division
+ /// Optional.
+ ///
+ public List Scope = new List();
+
+ ///
+ /// Text about the Timing for the KPI Definition
+ /// Allowable values are:
+ /// On-Demand
+ /// Periodically
+ /// Real-Time
+ /// Optional.
+ ///
+ /// KpiMlEnums.TimingValues contains the list of allowable values.
+ public List Timing = new List();
+
+ ///
+ /// Text about the desired Trend direction for the KPI Definition
+ /// Allowable values are:
+ /// higher-is-better
+ /// lower-is-better
+ /// other (provide Other value)
+ /// Optional.
+ ///
+ /// KpiMlEnums.TrendValues contains the list of allowable values
+ public string Trend = "";
+
+ ///
+ /// Text about the Unit of Measure for the KPI Definition
+ /// Unrestricted, but SI units are preferred.
+ /// Optional.
+ ///
+ public string UnitOfMeasure = "";
+
+ ///
+ /// Range(s) for KPI Definition
+ /// Optional.
+ ///
+ ///
+ /// Manually added, was not auto-generated - need to check .EAP file
+ ///
+ public List m_KPI_Range = new List();
+
+ ///
+ /// These KPI Definition Properties apply to the KPI Definition
+ /// Optional.
+ ///
+ ///
+ /// Note that these are embedded Property definitions, not references to Property IDs.
+ ///
+ public List m_KPI_Definition_Property = new List();
+
+ ///
+ /// This KPI Definition includes zero or more KPI Definition Time Ranges
+ /// Optional.
+ ///
+ ///
+ /// Note that these are embedded Range definitions, not references to Range IDs.
+ ///
+ public List m_KPI_Definition_Time_Range = new List();
+
+ ///
+ /// List of IDs for KPI Definitions which this KPI Definition may use inside its calculation.
+ /// Optional.
+ ///
+ ///
+ /// Note that these are definition IDs, not embedded KPI_Definitions.
+ /// This is a variation from the code auto-generated from the v1.0 .EAP file.
+ ///
+ public List used_in_calculation = new List();
+ //public List used_in_calculation = new List();
+
+ ///
+ /// Constructor for KPI Definition (auto-generated)
+ ///
+ public KPI_Definition()
+ {
+ // Everything is initialized by the property definitions above
+ }
+
+ ///
+ /// Destructor for KPI Definition (auto-generated)
+ ///
+ ~KPI_Definition()
+ {
+
+ }
+
+ }//end KPI_Definition
+}
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Definition_Property.cs b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Definition_Property.cs
new file mode 100644
index 0000000..8b493e4
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Definition_Property.cs
@@ -0,0 +1,67 @@
+///////////////////////////////////////////////////////////
+// KPI_Definition_Property.cs
+// Implementation of the Class KPI_Definition_Property
+// Generated by Enterprise Architect
+// Created on: 22-Oct-2015 10:06:06 PM
+// Original author: dnbrandl
+// Code generator/author: kjsmiley
+// Last revised 2016-08-05
+// The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+///////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+
+namespace MESA.KPIML
+{
+ ///
+ /// MESA KPI Definition Property class. Referenceable by ID.
+ /// See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+ ///
+ public class KPI_Definition_Property
+ {
+ ///
+ /// Unique identifier for this Property of the KPI Definition.
+ /// Required.
+ /// (if a numeric value is desired, use LONG instead of ULONG
+ /// to maximize compatibility across Java and C#. if a string
+ /// value, use string equivalent of a unique value such as GUID.)
+ ///
+ public string ID = "";
+
+ ///
+ /// Text describing the value of this Property for the
+ /// KPI Definition. Required.
+ ///
+ public string Value = "";
+
+ ///
+ /// Description text(s) for this Property of the
+ /// KPI Definition. Optional.
+ ///
+ public List Description = new List();
+
+ ///
+ /// This KPI Definition Property may include other KPI Definition Properties
+ /// Here we go with the actual properties, not ID references to them.
+ ///
+ public List m_KPI_Definition_Property = new List();
+
+ ///
+ /// Constructor (auto-generated)
+ ///
+ public KPI_Definition_Property()
+ {
+
+ }
+
+ ///
+ /// Destructor (auto-generated)
+ ///
+ ~KPI_Definition_Property()
+ {
+
+ }
+
+ }//end KPI_Definition_Property
+}
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Instance.cs b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Instance.cs
new file mode 100644
index 0000000..070cad0
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Instance.cs
@@ -0,0 +1,168 @@
+///////////////////////////////////////////////////////////
+// KPI_Instance.cs
+// Implementation of the Class KPI_Instance
+// Generated by Enterprise Architect
+// Created on: 22-Oct-2015 10:06:06 PM
+// Original author: dnbrandl
+// Code generator/author: kjsmiley
+// Last revised 2016-08-05
+// The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+///////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+
+namespace MESA.KPIML
+{
+ ///
+ /// MESA KPI Instance class. Referenceable by ID.
+ /// See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+ ///
+ public class KPI_Instance
+ {
+ ///
+ /// Unique identifier for this Instance of the KPI
+ ///
+ ///
+ /// (if a numeric value is desired, use LONG instead of ULONG
+ /// to maximize compatibility across Java and C#. for a string,
+ /// consider using string equivalent of a C# unique type such as GUID)
+ ///
+ public string ID = "";
+
+ ///
+ /// List of Audiences for this KPI Instance
+ /// Optional.
+ ///
+ public List Audience = new List();
+
+ ///
+ /// List of texts describing this KPI Instance.
+ /// Optional.
+ ///
+ public List Description = new List();
+
+ ///
+ /// List of Effect Model texts describing this KPI Instance
+ /// Optional.
+ /// See ISO 22400 standard for list of allowable MIME types.
+ ///
+ public List EffectModel = new List();
+
+ ///
+ /// Text describing the formula used to calculate this KPI Instance
+ ///
+ public string Formula = "";
+
+ ///
+ /// Name of this KPI Instance
+ ///
+ public string Name = "";
+
+ ///
+ /// List of Notes for this KPI Instance
+ /// Optional.
+ ///
+ public List Notes = new List();
+
+ ///
+ /// List of texts describing the Production Methodology associated with this KPI
+ /// Instance.
+ /// Allowable values include:
+ /// Batch
+ /// Continuous
+ /// Discrete
+ /// Other (provide other Value)
+ ///
+ /// Optional.
+ /// KpiMlEnums.ProductionMethodologies
+ public List ProductionMethodology = new List();
+
+ ///
+ /// Lit of texts describing the Scope for this KPI Instance
+ /// Optional.
+ ///
+ public List Scope = new List();
+
+ ///
+ /// List of texts describing the Timing for this KPI Instance
+ /// Optional.
+ ///
+ public List Timing = new List();
+
+ ///
+ /// Desired Trend direction for this KPI Instance
+ /// Allowable values include:
+ /// higher-is-better
+ /// lower-is-better
+ /// other (provide other Value)
+ /// Optional.
+ ///
+ /// KpiMlEnums.TrendValues
+ public string Trend = "";
+
+ ///
+ /// Text describing the Unit of Measure for this KPI Instance
+ /// Unconstrained, but SI units are preferred.
+ /// Optional.
+ ///
+ /// Question for MESA XML Committee: how should multiple possible units be handled? e.g. KUSD vs MUSD, g vs kg
+ public string UnitOfMeasure = "";
+
+ ///
+ /// This KPI Instance may include 0+ KPI Instance Property
+ /// Optional.
+ ///
+ public List m_KPI_Instance_Property = new List();
+
+ ///
+ /// KPI Instance Range
+ /// Optional.
+ ///
+ public List m_KPI_Range = new List();
+
+ ///
+ /// KPI Resource Reference
+ /// Optional.
+ ///
+ public List m_Resource_Reference = new List();
+
+ ///
+ /// KPI Instance Time Range
+ /// Optional.
+ ///
+ public List m_KPI_Instance_Time_Range = new List();
+
+ ///
+ /// These ID(s) are for KPI Instance(s) used by this KPI Instance for its calculations.
+ /// Optional.
+ ///
+ /// THIS IS DIFFERENT FROM THE v1.0 .EAP which calls for entire definitions, not just IDs.
+ public List used_in_calculation = new List();
+ //public List used_in_calculation;
+
+ ///
+ /// KPI Definition ID on which this Instance ID is based
+ /// Optional.
+ ///
+ /// (note: not auto-generated, need to check schema)
+ public string KPIDefinitionID = "";
+
+ ///
+ /// Constructor (auto-generated)
+ ///
+ public KPI_Instance()
+ {
+
+ }
+
+ ///
+ /// Destructor (auto-generated)
+ ///
+ ~KPI_Instance()
+ {
+
+ }
+
+ }//end KPI_Instance
+}
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Instance_Property.cs b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Instance_Property.cs
new file mode 100644
index 0000000..bdf9b53
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Instance_Property.cs
@@ -0,0 +1,68 @@
+///////////////////////////////////////////////////////////
+// KPI_Instance_Property.cs
+// Implementation of the Class KPI_Instance_Property
+// Generated by Enterprise Architect
+// Created on: 22-Oct-2015 10:06:06 PM
+// Original author: dnbrandl
+// Code generator/author: kjsmiley
+// Last revised 2016-08-05
+// The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+///////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+
+namespace MESA.KPIML
+{
+ ///
+ /// MESA KPI Instance Property class. Referenceable by ID.
+ /// See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+ ///
+ public class KPI_Instance_Property
+ {
+ ///
+ /// Unique identifier for this Property of the KPI Instance
+ ///
+ ///
+ /// (if a numeric value is desired, use LONG instead of ULONG
+ /// to maximize compatibility across Java and C#. for a string,
+ /// consider using string equivalent of a type such as GUID)
+ ///
+ public string ID = "";
+
+ ///
+ /// Text containing the Value of this Property of the KPI Instance.
+ /// Required.
+ ///
+ public string Value = "";
+
+ ///
+ /// List of texts describing this Property of the KPI Instance.
+ /// Optional.
+ ///
+ public List Description = new List();
+
+ ///
+ /// This KPI Instance Property may include other KPI Instance Properties
+ /// (embedded, not referenced by IDs)
+ ///
+ public List m_KPI_Instance_Property = new List();
+
+ ///
+ /// Constructor (auto-generated)
+ ///
+ public KPI_Instance_Property()
+ {
+
+ }
+
+ ///
+ /// Destructor (auto-generated)
+ ///
+ ~KPI_Instance_Property()
+ {
+
+ }
+
+ }//end KPI_Instance_Property
+}
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Range.cs b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Range.cs
new file mode 100644
index 0000000..71630b1
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Range.cs
@@ -0,0 +1,71 @@
+///////////////////////////////////////////////////////////
+// KPI_Range.cs
+// Implementation of the Class KPI_Range
+// Generated by Enterprise Architect
+// Created on: 22-Oct-2015 10:06:06 PM
+// Original author: dnbrandl
+// Code generator/author: kjsmiley
+// Last revised 2016-08-05
+// The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+///////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+
+namespace MESA.KPIML
+{
+ ///
+ /// MESA KPI Range class. Referenceable by ID.
+ /// See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+ ///
+ public class KPI_Range
+ {
+ ///
+ /// Unique identifier for this KPI Range definition
+ /// (if a numeric value is desired, use LONG instead of ULONG
+ /// to maximize compatibility across Java and C#. for a string,
+ /// consider using string equivalent of a C# unique type such as GUID)
+ ///
+ public string ID = "";
+
+ ///
+ /// Description(s) of this KPI Range
+ ///
+ public List Description = new List { };
+
+ ///
+ /// Lower Limit of this KPI Range
+ /// (NaN if no value is assigned)
+ ///
+ public double LowerLimit = System.Double.NaN;
+
+ ///
+ /// Upper Limit of this KPI Range
+ /// (NaN if no value is assigned)
+ ///
+ public double UpperLimit = System.Double.NaN;
+
+ ///
+ /// This KPI Range may include other KPI Ranges with the given IDs
+ ///
+ /// Why would a range definition include others? and if needed, wouldn't IDs be better than instances?
+ public List m_KPI_Range = new List();
+
+ ///
+ /// Constructor (auto-generated)
+ ///
+ public KPI_Range()
+ {
+
+ }
+
+ ///
+ /// Destructor (auto-generated)
+ ///
+ ~KPI_Range()
+ {
+
+ }
+
+ }//end KPI_Range
+}
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML/src/KPI_TimeRange.cs b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_TimeRange.cs
new file mode 100644
index 0000000..4aec83e
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_TimeRange.cs
@@ -0,0 +1,62 @@
+///////////////////////////////////////////////////////////
+// KPI_Time_Range.cs
+// Implementation of the Class KPI_Time_Range
+// Refactord from KPI_Definition_Time_Range, KPI_Instance_Time_Range, KPI_Value_Time_Range
+// Created on: 15-Jul-2016 5:26 PM
+// Original author: dnbrandl
+// Code generator/author: kjsmiley
+// Last revised 2016-08-05
+// The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+///////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+
+namespace MESA.KPIML
+{
+ ///
+ /// MESA KPI Time Range class. (No ID, so not referenceable.)
+ /// See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+ ///
+ public class KPI_Time_Range
+ {
+ ///
+ /// Start point of this KPI Time Range
+ ///
+ public DateTime StartTime = DateTime.MinValue;
+
+ ///
+ /// End point of this KPI Time Range
+ ///
+ public DateTime EndTime = DateTime.MaxValue;
+
+ ///
+ /// Duration of this KPI Time Range
+ /// See standard for syntax.
+ ///
+ public string Duration = "";
+
+ ///
+ /// Recurrence of this KPI Time Range
+ /// See standard for syntax.
+ ///
+ public string Recurrence = "";
+
+ ///
+ /// Constructor (auto-generated)
+ ///
+ public KPI_Time_Range()
+ {
+
+ }
+
+ ///
+ /// Destructor (auto-generated)
+ ///
+ ~KPI_Time_Range()
+ {
+
+ }
+
+ }//end KPI_Time_Range
+}
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Value.cs b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Value.cs
new file mode 100644
index 0000000..97c54cd
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Value.cs
@@ -0,0 +1,84 @@
+///////////////////////////////////////////////////////////
+// KPI_Value.cs
+// Implementation of the Class KPI_Value
+// Generated by Enterprise Architect
+// Created on: 22-Oct-2015 10:06:06 PM
+// Original author: dnbrandl
+// Code generator/author: kjsmiley
+// Last revised 2016-08-05
+// The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+///////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+
+namespace MESA.KPIML
+{
+ ///
+ /// MESA KPI Value class. Referenceable by ID.
+ /// See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+ ///
+ public class KPI_Value
+ {
+ ///
+ /// Unique identifier for this KPI Value
+ /// (if a numeric value is desired, use LONG instead of ULONG
+ /// to maximize compatibility across Java and C#. for a string,
+ /// consider using string equivalent of a unique C# type such as GUID)
+ ///
+ public string ID = "";
+
+ ///
+ /// Name of this KPI Value
+ ///
+ public string Name = "";
+
+ ///
+ /// Text(s) with Description of this KPI Value
+ /// Optional.
+ ///
+ public List Description = new List();
+
+ ///
+ /// Texts describing units of measure for this KPI Value
+ /// Unconstrained, but SI units are preferred.
+ /// Optional.
+ ///
+ public string UnitOfMeasure = "";
+
+ ///
+ /// Value of this KPI
+ /// (NaN if no value is assigned)
+ ///
+ public double Value = System.Double.NaN;
+
+ ///
+ /// KPI Value properties (embedded, not referenced by ID)
+ /// Optional.
+ ///
+ public List m_KPI_Value_Property = new List();
+
+ ///
+ /// KPI Value time range
+ /// Optional.
+ ///
+ public KPI_Time_Range m_KPI_Value_Time_Range = new KPI_Time_Range();
+
+ ///
+ /// Constructor (auto-generated)
+ ///
+ public KPI_Value()
+ {
+
+ }
+
+ ///
+ /// Destructor (auto-generated)
+ ///
+ ~KPI_Value()
+ {
+
+ }
+
+ }//end KPI_Value
+}
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Value_Property.cs b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Value_Property.cs
new file mode 100644
index 0000000..ac6c499
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/src/KPI_Value_Property.cs
@@ -0,0 +1,65 @@
+///////////////////////////////////////////////////////////
+// KPI_Value_Property.cs
+// Implementation of the Class KPI_Value_Property
+// Generated by Enterprise Architect
+// Created on: 22-Oct-2015 10:06:06 PM
+// Original author: dnbrandl
+// Code generator/author: kjsmiley
+// Last revised 2016-08-05
+// The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+///////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+
+namespace MESA.KPIML
+{
+ ///
+ /// MESA KPI Value Property class. Referenceable by ID.
+ /// See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+ ///
+ public class KPI_Value_Property
+ {
+ ///
+ /// Unique identifier for this Property of the KPI Value
+ /// (if a numeric value is desired, use LONG instead of ULONG
+ /// to maximize compatibility across Java and C#. for a string,
+ /// consider using string equivalent of a type such as GUID)
+ ///
+ public string ID = "";
+
+ ///
+ /// Value for this Property of the KPI Value. Required.
+ ///
+ public string Value = "";
+
+ ///
+ /// Text(s) describing this Property of the KPI Value
+ ///
+ public List Description = new List { };
+
+ ///
+ /// This KPI Value may include other KPI Values with the given IDs
+ ///
+ /// This differs from the v1.0 EAP file in that it references IDs instead of embedding the values.
+ public List m_KPI_Value_Property = new List();
+ //public List m_KPI_Value_Property = new List();
+
+ ///
+ /// Constructor (auto-generated)
+ ///
+ public KPI_Value_Property()
+ {
+
+ }
+
+ ///
+ /// Destructor (auto-generated)
+ ///
+ ~KPI_Value_Property()
+ {
+
+ }
+
+ }//end KPI_Value_Property
+}
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML/src/KpiMlEnums.cs b/Source/Csharp/MESA.KPIML/KPIML/src/KpiMlEnums.cs
new file mode 100644
index 0000000..fb1141f
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/src/KpiMlEnums.cs
@@ -0,0 +1,39 @@
+///////////////////////////////////////////////////////////
+// KpiMlEnums.cs
+// Hand-coded implementations of the restricted lists in KPI-ML
+// Created on: 22-Oct-2015 10:06:06 PM
+// Original author: kjsmiley
+// Last revised 2016-08-05
+// The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+///////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+
+namespace MESA.KPIML
+{
+ ///
+ /// Implementations of the restricted lists in KPI-ML
+ /// See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+ ///
+ static public class KpiMlEnums
+ {
+ ///
+ /// List of valid Timing Values
+ ///
+ static public List TimingValues = new List() { "Real-time", "Periodically", "On-demand", "Other" };
+
+ ///
+ /// List of valid Trend Values
+ ///
+ static public List TrendValues = new List() { "Higher-is-better", "Lower-is-better", "Other" };
+
+ ///
+ /// List of valid ProductionMethodology Values
+ ///
+ /// Should 'Other' be an option here too?
+ static public List ProductionMethodologies = new List() { "Batch", "Discrete", "Continuous" };
+
+ // XML Committee: Should we include a list for any other restricted value, e.g. ResourceType?
+ }
+}
diff --git a/Source/Csharp/MESA.KPIML/KPIML/src/Resource_Reference.cs b/Source/Csharp/MESA.KPIML/KPIML/src/Resource_Reference.cs
new file mode 100644
index 0000000..84acac2
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML/src/Resource_Reference.cs
@@ -0,0 +1,73 @@
+///////////////////////////////////////////////////////////
+// Resource_Reference.cs
+// Implementation of the Class Resource_Reference
+// Generated by Enterprise Architect
+// Created on: 22-Oct-2015 10:06:06 PM
+// Original author: dnbrandl
+// Code generator/author: kjsmiley
+// Last revised 2016-08-05
+// The KPI Markup Language (KPI-ML) is used courtesy of MESA International.
+///////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+
+namespace MESA.KPIML
+{
+ ///
+ /// MESA Resource Reference class for KPI-ML. Referenceable by ID.
+ /// See http://mesa.org/en/kpiml.asp and https://github.com/MESAInternational/KPI-ML/ for more information.
+ ///
+ public class Resource_Reference
+ {
+ ///
+ /// Unique identifier for this Resource Reference
+ ///
+ ///
+ /// (if a numeric value is desired, use LONG instead of ULONG
+ /// to maximize compatibility across Java and C#. for a string,
+ /// consider using string equivalent of a C# unique type such as GUID)
+ ///
+ public string ID = "";
+
+ ///
+ /// Text description of the ID for this Resource Reference
+ ///
+ public string ResourceID = "";
+
+ ///
+ /// Text description of the Type for this Resource Reference.
+ /// See ISA95 standard for valid types (e.g. Equipment)
+ ///
+ public string ResourceType = "";
+
+ ///
+ /// Description of this Resource Reference
+ ///
+ public List Description = new List { };
+
+ ///
+ /// This Resource Reference may include other Resource References with the given IDs
+ ///
+ /// THIS IS DIFFERENT FROM THE v1.0 .EAP which calls for entire definitions, not just IDs.
+ public List m_Resource_Reference = new List();
+ //public List m_Resource_Reference = new List();
+
+ ///
+ /// Constructor (auto-generated)
+ ///
+ public Resource_Reference()
+ {
+
+ }
+
+ ///
+ /// Destructor (auto-generated)
+ ///
+ ~Resource_Reference()
+ {
+
+ }
+
+ }//end Resource_Reference
+}
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML_Helpers/.gitignore b/Source/Csharp/MESA.KPIML/KPIML_Helpers/.gitignore
new file mode 100644
index 0000000..d7a4d4d
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_Helpers/.gitignore
@@ -0,0 +1 @@
+/*.user
diff --git a/Source/Csharp/MESA.KPIML/KPIML_Helpers/KPIML.Cs_Helpers.csproj b/Source/Csharp/MESA.KPIML/KPIML_Helpers/KPIML.Cs_Helpers.csproj
new file mode 100644
index 0000000..066c6b7
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_Helpers/KPIML.Cs_Helpers.csproj
@@ -0,0 +1,55 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {47D7E9BF-3110-4E2E-8ABE-6F19C9C68383}
+ Library
+ Properties
+ MESA.KPIML.Cs_Helpers
+ MESA.KPIML.Cs_Helpers
+ v4.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML_Helpers/Properties/AssemblyInfo.cs b/Source/Csharp/MESA.KPIML/KPIML_Helpers/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0dcddcf
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_Helpers/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("KPIML_Cs_Helpers")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("KPIML_Cs_Helpers")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("b8fc295c-6fa4-4359-a45a-c00f3456fe8c")]
+
+// 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 Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Source/Csharp/MESA.KPIML/KPIML_Helpers/bin/.gitignore b/Source/Csharp/MESA.KPIML/KPIML_Helpers/bin/.gitignore
new file mode 100644
index 0000000..e52f825
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_Helpers/bin/.gitignore
@@ -0,0 +1,2 @@
+/Release
+/Debug
diff --git a/Source/Csharp/MESA.KPIML/KPIML_Helpers/obj/.gitignore b/Source/Csharp/MESA.KPIML/KPIML_Helpers/obj/.gitignore
new file mode 100644
index 0000000..e52f825
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_Helpers/obj/.gitignore
@@ -0,0 +1,2 @@
+/Release
+/Debug
diff --git a/Source/Csharp/MESA.KPIML/KPIML_Helpers/src/KpiDefinitionHelpers.cs b/Source/Csharp/MESA.KPIML/KPIML_Helpers/src/KpiDefinitionHelpers.cs
new file mode 100644
index 0000000..0585dc4
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_Helpers/src/KpiDefinitionHelpers.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MESA.KPIML.Cs_Helpers
+{
+ ///
+ /// KPI Definition helper classes
+ ///
+ static public class KpiDefinitionHelpers
+ {
+
+ }
+}
diff --git a/Source/Csharp/MESA.KPIML/KPIML_Helpers/src/KpiInstanceHelpers.cs b/Source/Csharp/MESA.KPIML/KPIML_Helpers/src/KpiInstanceHelpers.cs
new file mode 100644
index 0000000..165f156
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_Helpers/src/KpiInstanceHelpers.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MESA.KPIML.Cs_Helpers
+{
+ ///
+ /// KPI Instance helper classes
+ ///
+ static public class KpiInstanceHelpers
+ {
+
+ }
+}
diff --git a/Source/Csharp/MESA.KPIML/KPIML_Helpers/src/KpiValueHelpers.cs b/Source/Csharp/MESA.KPIML/KPIML_Helpers/src/KpiValueHelpers.cs
new file mode 100644
index 0000000..7c45bba
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_Helpers/src/KpiValueHelpers.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MESA.KPIML.Cs_Helpers
+{
+ ///
+ /// KPI Value helper classes
+ ///
+ static public class KpiValueHelpers
+ {
+
+ }
+}
diff --git a/Source/Csharp/MESA.KPIML/KPIML_UnitTests/.gitignore b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/.gitignore
new file mode 100644
index 0000000..d7a4d4d
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/.gitignore
@@ -0,0 +1 @@
+/*.user
diff --git a/Source/Csharp/MESA.KPIML/KPIML_UnitTests/KPIML_UnitTests.csproj b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/KPIML_UnitTests.csproj
new file mode 100644
index 0000000..52b536e
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/KPIML_UnitTests.csproj
@@ -0,0 +1,100 @@
+
+
+
+ Debug
+ AnyCPU
+ {4EC94868-4170-4237-8814-DAD079A84615}
+ Library
+ Properties
+ KPIML_UnitTests
+ KPIML_UnitTests
+ v4.5
+ 512
+ {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 10.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
+ $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
+ False
+ UnitTest
+ ..\
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {eec1b04d-ae14-4607-9418-33e35559b1aa}
+ KPIML.Cs
+
+
+
+
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/KPIML_UnitTests/Properties/AssemblyInfo.cs b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..9c2acd1
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("KPIML_UnitTests")]
+[assembly: AssemblyDescription("Unit tests for KPI-ML C# .NET classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("MESA International")]
+[assembly: AssemblyProduct("KPIML_UnitTests")]
+[assembly: AssemblyCopyright("Copyright © MESA 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("01286e43-ec3c-4577-95e2-f84ad42fbb80")]
+
+// 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 Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("2.0.0.*")]
+[assembly: AssemblyFileVersion("2.0.0.1")]
diff --git a/Source/Csharp/MESA.KPIML/KPIML_UnitTests/UnitTest1.cs b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/UnitTest1.cs
new file mode 100644
index 0000000..37c0261
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/UnitTest1.cs
@@ -0,0 +1,219 @@
+using System;
+using NUnit.Framework;
+using MESA.KPIML;
+
+namespace KPIML_UnitTests
+{
+ ///
+ /// KPI-ML Unit Tests
+ ///
+ [TestFixture()]
+ public class KPIML_UnitTests
+ {
+ KPI_Definition def;
+ KPI_Instance ins;
+ KPI_Value val;
+
+ #region Test setup and teardown
+ ///
+ /// Constructor for tests
+ ///
+ [OneTimeSetUp]
+ public void KPIML_UnitTests_Start()
+ {
+ string where = "UnitTests_Start";
+
+ Console.WriteLine("*******************************");
+ Console.WriteLine("KPI-ML unit tests starting");
+ def = new KPI_Definition();
+ ins = new KPI_Instance();
+ val = new KPI_Value();
+ this.ReportStatus(where, "No exceptions in default constructors");
+
+ // none should be null
+ Assert.IsNotNull(def);
+ Assert.IsNotNull(ins);
+ Assert.IsNotNull(val);
+ this.ReportStatus(where, "No null objects");
+
+ // all IDs should be empty strings at first
+ Assert.IsEmpty(def.ID);
+ Assert.IsEmpty(ins.ID);
+ Assert.IsEmpty(ins.ID);
+ this.ReportStatus(where, "All IDs are initially empty");
+
+ // now assign IDs for xref (generated once with Visual Studio GUID tool 2016-08-05)
+ def.ID = new Guid("{3395892C-D200-4DC4-BD5B-403CBA9AC9C7}").ToString(); Assert.IsNotEmpty(def.ID);
+ ins.ID = new Guid("{67BA088B-7341-4F7C-B013-E99DEA7C7ABD}").ToString(); Assert.IsNotEmpty(ins.ID);
+ val.ID = new Guid("{273FD848-E1E1-4F90-8657-E8149FC791EE}").ToString(); Assert.IsNotEmpty(val.ID);
+ this.ReportStatus(where, "All IDs are defined from GUIDs");
+
+ // cross-reference the IDs
+ ins.KPIDefinitionID = def.ID;
+ this.ReportStatus(where, "Definition ID defined for Instance");
+ //val.KPIInstanceID = ins.ID; // not yet supported (need to fix in schema/code?)
+ this.ReportStatus(where, "*** Instance ID NOT defined for Value ***");
+
+ }
+
+ ///
+ /// Destructor for tests
+ ///
+ [OneTimeTearDown]
+ public void KPIML_UnitTests_End()
+ {
+ Console.WriteLine("KPI-ML unit tests are done");
+ Console.WriteLine("*******************************");
+ }
+ #endregion
+
+ // TO DO: Add unit tests to cover all PUBLIC methods
+ // (These Nunit tests do not work on PRIVATE methods. If you really want to test them too,
+ // make them PROTECTED and derive this unit test class from the class you're testing.)
+
+ [Test()]
+ public void KPI_Definition_UnitTest()
+ {
+ // for now, just ensure there are no null pointers or strings
+ Assert.IsNotNull(def.Audience);
+ Assert.IsNotNull(def.Description);
+ Assert.IsNotNull(def.EffectModel);
+ Assert.IsNotNull(def.Formula);
+ Assert.IsNotNull(def.HierarchyScope);
+ Assert.IsNotNull(def.ID);
+ Assert.IsNotNull(def.m_KPI_Definition_Property);
+ Assert.IsNotNull(def.m_KPI_Definition_Time_Range);
+ Assert.IsNotNull(def.m_KPI_Range);
+ Assert.IsNotNull(def.Name);
+ Assert.IsNotNull(def.Notes);
+ Assert.IsNotNull(def.ProductionMethodology);
+ Assert.IsNotNull(def.Scope);
+ Assert.IsNotNull(def.Timing);
+ Assert.IsNotNull(def.Trend);
+ Assert.IsNotNull(def.UnitOfMeasure);
+ Assert.IsNotNull(def.used_in_calculation);
+ this.ReportStatus("KPI_Definition_UnitTest", "No nulls");
+ }
+
+ [Test()]
+ public void KPI_Instance_UnitTest()
+ {
+ // for now, just ensure there are no null pointers or strings
+ Assert.IsNotNull(ins.Audience);
+ Assert.IsNotNull(ins.Description);
+ Assert.IsNotNull(ins.EffectModel);
+ Assert.IsNotNull(ins.Formula);
+ //Assert.IsNotNull(ins.HierarchyScope); // not yet supported in Instance, should it be added?
+ Assert.IsNotNull(ins.ID);
+ Assert.IsNotNull(ins.KPIDefinitionID); // unique to Instance
+ Assert.IsNotNull(ins.m_KPI_Instance_Property);
+ Assert.IsNotNull(ins.m_KPI_Instance_Time_Range);
+ Assert.IsNotNull(ins.m_KPI_Range);
+ Assert.IsNotNull(ins.Name);
+ Assert.IsNotNull(ins.Notes);
+ Assert.IsNotNull(ins.ProductionMethodology);
+ Assert.IsNotNull(ins.Scope);
+ Assert.IsNotNull(ins.Timing);
+ Assert.IsNotNull(ins.Trend);
+ Assert.IsNotNull(ins.UnitOfMeasure);
+ Assert.IsNotNull(ins.used_in_calculation);
+ Assert.IsNotNull(ins.m_Resource_Reference);
+ this.ReportStatus("KPI_Instance_UnitTest", "No nulls");
+ }
+
+ [Test()]
+ public void KPI_Value_UnitTest()
+ {
+ // for now, just ensure there are no null pointers or strings
+ Assert.IsNotNull(val.Description);
+ //Assert.IsNotNull(val.HierarchyScope); // not yet supported in Value, should it be added?
+ Assert.IsNotNull(val.ID);
+ //Assert.IsNotNull(val.KPIInstanceID); // unique to Value - not yet supported
+ Assert.IsNotNull(val.m_KPI_Value_Property);
+ Assert.IsNotNull(val.m_KPI_Value_Time_Range);
+ Assert.IsNotNull(val.Name);
+ //Assert.IsNotNull(val.Notes); // not yet supported in Value, should it be added?
+ Assert.IsNotNull(val.UnitOfMeasure);
+ //Assert.IsNotNull(val.Value); // this is a numeric (double), can't be null
+ Assert.AreEqual(System.Double.NaN,val.Value); // default value is NotANumber
+ //Assert.IsNotNull(val.m_Resource_Reference);// not yet supported in Value, should it be added?
+ this.ReportStatus("KPI_Instance_UnitTest", "No nulls");
+ }
+
+ [Test()]
+ public void KPI_Enums_UnitTest()
+ {
+
+ }
+
+ [Test()]
+ public void KPIML_TimeRange_UnitTests()
+ {
+ string where = "KPIML_TimeRange_UnitTests";
+
+ // create time ranges and make sure they are interchangeable
+ KPI_Time_Range tr = new KPI_Time_Range();
+ Assert.IsNotNull(tr);
+ this.ReportStatus(where, "Time Range created OK");
+
+ Assert.IsEmpty(tr.Duration);
+ Assert.IsEmpty(tr.Recurrence);
+ Assert.AreEqual(DateTime.MinValue, tr.StartTime);
+ Assert.AreEqual(DateTime.MaxValue, tr.EndTime);
+ this.ReportStatus(where, "Time Range created with correct default values");
+
+ // set something other than a default value for the elements
+ DateTime end = DateTime.Now;
+ //DateTime delta = new DateTime(new DateTimeOffset(1, 2, 3, 4, 5, 6, TimeSpan.Zero).Ticks);
+ //DateTime start = new DateTime(end.Ticks - delta.Ticks);
+ DateTime start = DateTime.Parse("2016-01-01 01:23:45");
+ tr.StartTime = start;
+ tr.EndTime = end;
+ tr.Duration = "P1Y2M3D4h5m6s";
+ tr.Recurrence = "Yearly";
+
+ Assert.IsNotNull(def);
+ Assert.IsNotNull(def.m_KPI_Definition_Time_Range);
+ Assert.IsEmpty(def.m_KPI_Definition_Time_Range);
+ Assert.IsNotNull(tr);
+
+ //KPI_Definition_Time_Range dtr = tr as KPI_Definition_Time_Range; // this cast is failing, returning a null
+ //Assert.IsNotNull(dtr);
+ //def.m_KPI_Definition_Time_Range.Add(dtr);
+ def.m_KPI_Definition_Time_Range.Add(tr);
+ Assert.IsNotEmpty(def.m_KPI_Definition_Time_Range);
+ Assert.IsNotNull(def.m_KPI_Definition_Time_Range[0]);
+ Assert.AreEqual(start, def.m_KPI_Definition_Time_Range[0].StartTime);
+ this.ReportStatus(where, "Time Range added OK to KPI Definition (first element in list)");
+
+ Assert.IsNotNull(ins);
+ Assert.IsNotNull(ins.m_KPI_Instance_Time_Range);
+ Assert.IsEmpty(ins.m_KPI_Instance_Time_Range);
+ ins.m_KPI_Instance_Time_Range.Add(tr);
+ Assert.IsNotEmpty(ins.m_KPI_Instance_Time_Range);
+ Assert.AreEqual(end, ins.m_KPI_Instance_Time_Range[0].EndTime);
+ this.ReportStatus(where, "Time Range added OK to KPI Instance (first element in list)");
+
+ Assert.IsNotNull(val);
+ Assert.IsEmpty(val.m_KPI_Value_Time_Range.Duration);
+ val.m_KPI_Value_Time_Range = (tr); // as KPI_Value_Time_Range
+ Assert.IsNotEmpty(val.m_KPI_Value_Time_Range.Duration);
+ this.ReportStatus(where, "Time Range updated OK in KPI Value (single value)");
+ }
+
+ #region Non-test private methods
+ ///
+ /// Report status of a test
+ ///
+ ///
+ ///
+ private void ReportStatus(string where,string status)
+ {
+ string msg = where+" "+status;
+ // put the message on the console where we can find it, regardless
+ Console.Out.WriteLine(msg);
+ //NUnit.VisualStudio.TestAdapter.TestLogger log = new NUnit.VisualStudio.TestAdapter.TestLogger(Console.Out,0);
+ }
+ #endregion
+ }
+}
diff --git a/Source/Csharp/MESA.KPIML/KPIML_UnitTests/bin/.gitignore b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/bin/.gitignore
new file mode 100644
index 0000000..e52f825
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/bin/.gitignore
@@ -0,0 +1,2 @@
+/Release
+/Debug
diff --git a/Source/Csharp/MESA.KPIML/KPIML_UnitTests/obj/.gitignore b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/obj/.gitignore
new file mode 100644
index 0000000..e52f825
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/obj/.gitignore
@@ -0,0 +1,2 @@
+/Release
+/Debug
diff --git a/Source/Csharp/MESA.KPIML/KPIML_UnitTests/packages.config b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/packages.config
new file mode 100644
index 0000000..f2fd55a
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/KPIML_UnitTests/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Source/Csharp/MESA.KPIML/ToDo.txt b/Source/Csharp/MESA.KPIML/ToDo.txt
new file mode 100644
index 0000000..b8862fd
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/ToDo.txt
@@ -0,0 +1,2 @@
+To do:
+
diff --git a/Source/Csharp/MESA.KPIML/packages/.gitignore b/Source/Csharp/MESA.KPIML/packages/.gitignore
new file mode 100644
index 0000000..d35e758
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/packages/.gitignore
@@ -0,0 +1,3 @@
+/Tvl.Java.1.2.0
+/NUnit*.*
+/*.bak
diff --git a/Source/Csharp/MESA.KPIML/packages/repositories.config b/Source/Csharp/MESA.KPIML/packages/repositories.config
new file mode 100644
index 0000000..f6dd426
--- /dev/null
+++ b/Source/Csharp/MESA.KPIML/packages/repositories.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Source/Csharp/ToDo.txt b/Source/Csharp/ToDo.txt
new file mode 100644
index 0000000..61ba041
--- /dev/null
+++ b/Source/Csharp/ToDo.txt
@@ -0,0 +1,5 @@
+To do:
+
+Discuss implementation topics with XML Committee
+
+Later, identify NuGet package hosting target location and update NuGet.Packager to publish to it.
diff --git a/Source/Java/ToDo.txt b/Source/Java/ToDo.txt
new file mode 100644
index 0000000..8718cfe
--- /dev/null
+++ b/Source/Java/ToDo.txt
@@ -0,0 +1,4 @@
+To do:
+
+Update and upload the generated Java code once we have worked out the C# code.
+Add JVM to the KPI-ML Java project references, so it can compile here.
\ No newline at end of file
diff --git a/Source/KPI-ML V01-modified_Csharp.eap b/Source/KPI-ML V01-modified_Csharp.eap
new file mode 100644
index 0000000..844455a
Binary files /dev/null and b/Source/KPI-ML V01-modified_Csharp.eap differ
diff --git a/Source/Readme.md b/Source/Readme.md
new file mode 100644
index 0000000..ac4c2f2
--- /dev/null
+++ b/Source/Readme.md
@@ -0,0 +1,13 @@
+This Source folder contains C# source code that was originally generated from the Enterprise Architect file in the [KPI-ML](http://www.mesa.org/en/KPIML.asp) [1.0 release](https://services.mesa.org/ResourceLibrary/ShowResource/8c814090-51b7-476c-8e64-3d0b3ae7ced2), which is now available here in GitHub in the new [MESA International repository](https://github.com/MESAInternational/KPI-ML).
+
+The `.EAP` file was tweaked to set some data types, and further adjustments have been made to the C# code to provide explicit initialization in the constructors, e.g. of List<> objects.
+
+Current contents of branch **addCSharpSource** include the C# source for classes for **KPI_Definition**, **KPI_Instance**, and **KPI_Value**, and subordinate classes. Placeholder classes were also created for supporting "helper" methods, to be discussed by the XML Committee.
+
+The branch also includes a placeholder for Java source. Once we have worked out implementation concerns, the Java source will be synced and uploaded as well.
+
+**`.gitignore`** is used to deliberately exclude bin, obj, and the NuGet.exe files, as well as Visual Studio's `.user` files.
+
+For C#, open **`KPI-ML\Source\Csharp\MESA.KPIML\KPI-ML.sln`** in Visual Studio and build it. It should build correctly except for one possible issue, i.e. publishing the MESA.KPIML NuGet package to D:\NuGets\, which is a path you are unlikely to have. This is a temporary problem and will be resolved when the permanent NuGet deployment location is determined.
+
+Please see the pull request for discussion of the implementation concerns.