You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@openwhisk.apache.org by GitBox <gi...@apache.org> on 2018/03/06 20:15:31 UTC

[GitHub] pritidesai closed pull request #765: Update deploymentreader.go tests and fix bind logic.

pritidesai closed pull request #765: Update deploymentreader.go tests and fix bind logic.
URL: https://github.com/apache/incubator-openwhisk-wskdeploy/pull/765
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/.travis.yml b/.travis.yml
index bb7e6ef1..8b98781a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -30,7 +30,7 @@ install:
 - go get -u github.com/stretchr/testify
 - go get -u github.com/tools/godep
 before_script:
-- GO_FILES=$(find . -iname '*.go' -type f | grep -v /vendor/)
+- GO_FILES=$(find . -iname '*.go' -type f -not -path "./wski18n/i18n_resources.go")
 - export BAD_GO=$(gofmt -s -l $(echo $GO_FILES))
 - echo $BAD_GO
 - test -z "$BAD_GO"
diff --git a/cmd/report.go b/cmd/report.go
index 787e16a8..655a4b20 100644
--- a/cmd/report.go
+++ b/cmd/report.go
@@ -62,6 +62,8 @@ func init() {
 	RootCmd.AddCommand(reportCmd)
 
 	// TODO() REMOVE this flag... the flag -config exists already
+	// TODO() whiskclient alread retrieves wskprops and has a constant defined for it SOURCE_WSKPROPS
+	// Please remove or reuse code from whiskclient.go
 	reportCmd.Flags().StringVarP(&wskpropsPath, "wskproppath", "w",
 		path.Join(os.Getenv("HOME"), ".wskprops"),
 		wski18n.T(wski18n.ID_CMD_FLAG_CONFIG))
diff --git a/cmd/version.go b/cmd/version.go
index 7ad5bc58..c0f194a5 100644
--- a/cmd/version.go
+++ b/cmd/version.go
@@ -36,6 +36,7 @@ var versionCmd = &cobra.Command{
 	Run: func(cmd *cobra.Command, args []string) {
 		wskprint.PrintlnOpenWhiskOutput(
 			// Note: no need to translate the following string
+			// TODO(#767) - Flags.CliBuild and CliVersion are not set during build
 			fmt.Sprintf("wskdeploy build-version: %s--%s",
 				utils.Flags.CliBuild,
 				utils.Flags.CliVersion))
diff --git a/deployers/deploymentreader.go b/deployers/deploymentreader.go
index dd15c8bc..a31addd5 100644
--- a/deployers/deploymentreader.go
+++ b/deployers/deploymentreader.go
@@ -20,8 +20,6 @@ package deployers
 import (
 	"github.com/apache/incubator-openwhisk-client-go/whisk"
 	"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
-	"github.com/apache/incubator-openwhisk-wskdeploy/utils"
-	"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
 	"github.com/apache/incubator-openwhisk-wskdeploy/wskenv"
 	"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
 	"github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
@@ -46,7 +44,6 @@ func (reader *DeploymentReader) HandleYaml() error {
 
 	deploymentParser := parsers.NewYAMLParser()
 	deployment, err := deploymentParser.ParseDeployment(dep.DeploymentPath)
-
 	reader.DeploymentDescriptor = deployment
 
 	return err
@@ -68,48 +65,67 @@ func (reader *DeploymentReader) BindAssets() error {
 	return nil
 }
 
-func (reader *DeploymentReader) bindPackageInputsAndAnnotations() error {
-
+func (reader *DeploymentReader) getPackageMap() map[string]parsers.Package {
 	packMap := make(map[string]parsers.Package)
 
-	if reader.DeploymentDescriptor.GetProject().Packages == nil {
-		if reader.DeploymentDescriptor.Packages != nil {
+	// Create local packages list from Deployment file for us to iterate over
+	// either from top-level or under project schema
+	if len(reader.DeploymentDescriptor.GetProject().Packages) == 0 {
+
+		if len(reader.DeploymentDescriptor.Packages) > 0 {
+			infoMsg := wski18n.T(
+				wski18n.ID_DEBUG_PACKAGES_FOUND_UNDER_ROOT_X_path_X,
+				map[string]interface{}{
+					wski18n.KEY_PATH: reader.DeploymentDescriptor.Filepath})
+			wskprint.PrintlnOpenWhiskTrace(false, infoMsg)
 			for packName, depPacks := range reader.DeploymentDescriptor.Packages {
 				depPacks.Packagename = packName
 				packMap[packName] = depPacks
 			}
 		}
 	} else {
+
+		infoMsg := wski18n.T(
+			wski18n.ID_DEBUG_PACKAGES_FOUND_UNDER_PROJECT_X_path_X_name_X,
+			map[string]interface{}{
+				wski18n.KEY_PATH: reader.DeploymentDescriptor.Filepath,
+				wski18n.KEY_NAME: reader.DeploymentDescriptor.GetProject().Name})
+		wskprint.PrintlnOpenWhiskTrace(false, infoMsg)
+
 		for packName, depPacks := range reader.DeploymentDescriptor.GetProject().Packages {
 			depPacks.Packagename = packName
 			packMap[packName] = depPacks
 		}
 	}
 
+	return packMap
+}
+
+func (reader *DeploymentReader) bindPackageInputsAndAnnotations() error {
+
+	// retrieve "packages" list from depl. file; either at top-level or under "Project" schema
+	packMap := reader.getPackageMap()
+
 	for packName, pack := range packMap {
 
 		serviceDeployPack := reader.serviceDeployer.Deployment.Packages[packName]
 
 		if serviceDeployPack == nil {
-			warningString := wski18n.T(
-				wski18n.ID_ERR_DEPLOYMENT_NAME_NOT_FOUND_X_key_X_name_X,
-				map[string]interface{}{
-					wski18n.KEY_KEY:  wski18n.PACKAGE_NAME,
-					wski18n.KEY_NAME: packName})
-			wskprint.PrintlnOpenWhiskWarning(warningString)
+			displayEntityNotFoundInDeploymentWarning(parsers.YAML_KEY_PACKAGE, packName)
 			break
 		}
 
-		keyValArr := make(whisk.KeyValueArr, 0)
+		displayEntityFoundInDeploymentTrace(parsers.YAML_KEY_PACKAGE, packName)
 
 		if len(pack.Inputs) > 0 {
+
+			keyValArr := make(whisk.KeyValueArr, 0)
+
 			for name, input := range pack.Inputs {
 				var keyVal whisk.KeyValue
 
 				keyVal.Key = name
-
 				keyVal.Value = wskenv.InterpolateStringWithEnvVar(input.Value)
-
 				keyValArr = append(keyValArr, keyVal)
 			}
 
@@ -136,6 +152,9 @@ func (reader *DeploymentReader) bindPackageInputsAndAnnotations() error {
 				// iterate over each annotation from manifest file
 				for i, a := range serviceDeployPack.Package.Annotations {
 					if name == a.Key {
+						displayEntityFoundInDeploymentTrace(
+							parsers.YAML_KEY_ANNOTATION, a.Key)
+
 						// annotation key is found in manifest
 						keyExistsInManifest = true
 						// overwrite annotation in manifest file with deployment file
@@ -144,13 +163,7 @@ func (reader *DeploymentReader) bindPackageInputsAndAnnotations() error {
 					}
 				}
 				if !keyExistsInManifest {
-					warningString := wski18n.T(
-						wski18n.ID_ERR_DEPLOYMENT_NAME_NOT_FOUND_X_key_X_name_X,
-						map[string]interface{}{
-							wski18n.KEY_KEY:  parsers.YAML_KEY_ANNOTATION,
-							wski18n.KEY_NAME: name})
-					wskprint.PrintlnOpenWhiskWarning(warningString)
-					return wskderrors.NewYAMLFileFormatError(reader.DeploymentDescriptor.Filepath, warningString)
+					displayEntityNotFoundInDeploymentWarning(parsers.YAML_KEY_ANNOTATION, name)
 				}
 			}
 		}
@@ -160,30 +173,15 @@ func (reader *DeploymentReader) bindPackageInputsAndAnnotations() error {
 
 func (reader *DeploymentReader) bindActionInputsAndAnnotations() error {
 
-	packMap := make(map[string]parsers.Package)
-
-	if reader.DeploymentDescriptor.GetProject().Packages == nil {
-		if reader.DeploymentDescriptor.Packages != nil {
-			for packName, depPacks := range reader.DeploymentDescriptor.Packages {
-				depPacks.Packagename = packName
-				packMap[packName] = depPacks
-			}
-		}
-		//else {
-		//		packMap[reader.DeploymentDescriptor.Package.Packagename] = reader.DeploymentDescriptor.Package
-		//	}
-	} else {
-		for packName, depPacks := range reader.DeploymentDescriptor.GetProject().Packages {
-			depPacks.Packagename = packName
-			packMap[packName] = depPacks
-		}
-	}
+	// retrieve "packages" list from depl. file; either at top-level or under "Project" schema
+	packMap := reader.getPackageMap()
 
 	for packName, pack := range packMap {
 
 		serviceDeployPack := reader.serviceDeployer.Deployment.Packages[packName]
 
 		if serviceDeployPack == nil {
+			displayEntityNotFoundInDeploymentWarning(parsers.YAML_KEY_PACKAGE, packName)
 			break
 		}
 
@@ -203,6 +201,9 @@ func (reader *DeploymentReader) bindActionInputsAndAnnotations() error {
 				}
 
 				if wskAction, exists := serviceDeployPack.Actions[actionName]; exists {
+
+					displayEntityFoundInDeploymentTrace(parsers.YAML_KEY_ACTION, actionName)
+
 					depParams := make(map[string]whisk.KeyValue)
 					for _, kv := range keyValArr {
 						depParams[kv.Key] = kv
@@ -214,6 +215,8 @@ func (reader *DeploymentReader) bindActionInputsAndAnnotations() error {
 						}
 					}
 					wskAction.Action.Parameters = keyValArr
+				} else {
+					displayEntityNotFoundInDeploymentWarning(parsers.YAML_KEY_ACTION, actionName)
 				}
 			}
 
@@ -226,22 +229,24 @@ func (reader *DeploymentReader) bindActionInputsAndAnnotations() error {
 					// iterate over each annotation from manifest file
 					for i, a := range wskAction.Action.Annotations {
 						if name == a.Key {
+
+							displayEntityFoundInDeploymentTrace(
+								parsers.YAML_KEY_ANNOTATION, a.Key)
+
 							// annotation key is found in manifest
 							keyExistsInManifest = true
+
 							// overwrite annotation in manifest file with deployment file
 							wskAction.Action.Annotations[i].Value = input
 							break
 						}
 					}
 					if !keyExistsInManifest {
-						errMsg := wski18n.T(
-							wski18n.ID_ERR_DEPLOYMENT_NAME_NOT_FOUND_X_key_X_name_X,
-							map[string]interface{}{
-								wski18n.KEY_KEY:  parsers.YAML_KEY_ANNOTATION,
-								wski18n.KEY_NAME: name})
-						return wskderrors.NewYAMLFileFormatError(reader.DeploymentDescriptor.Filepath, errMsg)
+						displayEntityNotFoundInDeploymentWarning(parsers.YAML_KEY_ANNOTATION, name)
 					}
 				}
+			} else {
+				displayEntityNotFoundInDeploymentWarning(parsers.YAML_KEY_ACTION, actionName)
 			}
 		}
 	}
@@ -250,31 +255,22 @@ func (reader *DeploymentReader) bindActionInputsAndAnnotations() error {
 
 func (reader *DeploymentReader) bindTriggerInputsAndAnnotations() error {
 
-	packMap := make(map[string]parsers.Package)
-
-	if reader.DeploymentDescriptor.GetProject().Packages == nil {
-		if reader.DeploymentDescriptor.Packages != nil {
-			for packName, depPacks := range reader.DeploymentDescriptor.Packages {
-				depPacks.Packagename = packName
-				packMap[packName] = depPacks
-			}
-		}
-	} else {
-		for packName, depPacks := range reader.DeploymentDescriptor.GetProject().Packages {
-			depPacks.Packagename = packName
-			packMap[packName] = depPacks
-		}
-	}
+	// retrieve "packages" list from depl. file; either at top-level or under "Project" schema
+	packMap := reader.getPackageMap()
 
+	// go through all packages in our local package map
 	for _, pack := range packMap {
-
 		serviceDeployment := reader.serviceDeployer.Deployment
 
+		// for each Deployment file Trigger found in the current package
 		for triggerName, trigger := range pack.Triggers {
 
-			keyValArr := make(whisk.KeyValueArr, 0)
-
+			// If the Deployment file trigger has Input values we will attempt to bind them
 			if len(trigger.Inputs) > 0 {
+
+				keyValArr := make(whisk.KeyValueArr, 0)
+
+				// Interpolate values before we bind
 				for name, input := range trigger.Inputs {
 					var keyVal whisk.KeyValue
 
@@ -284,28 +280,27 @@ func (reader *DeploymentReader) bindTriggerInputsAndAnnotations() error {
 					keyValArr = append(keyValArr, keyVal)
 				}
 
+				// See if a matching Trigger (name) exists in manifest
 				if wskTrigger, exists := serviceDeployment.Triggers[triggerName]; exists {
 
+					displayEntityFoundInDeploymentTrace(parsers.YAML_KEY_TRIGGER, triggerName)
+
 					depParams := make(map[string]whisk.KeyValue)
 					for _, kv := range keyValArr {
 						depParams[kv.Key] = kv
 					}
 
-					var traceMsg string
 					for _, keyVal := range wskTrigger.Parameters {
-						traceMsg = wski18n.T(
-							wski18n.ID_DEBUG_KEY_VERIFY_X_name_X_key_X,
-							map[string]interface{}{
-								wski18n.KEY_NAME: parsers.YAML_KEY_ANNOTATION,
-								wski18n.KEY_KEY:  keyVal.Key})
-						wskprint.PrintOpenWhiskVerbose(utils.Flags.Verbose, traceMsg)
-
 						// TODO() verify logic and add Verbose/trace say "found" or "not found"
 						if _, exists := depParams[keyVal.Key]; !exists {
+							displayEntityFoundInDeploymentTrace(
+								parsers.YAML_KEY_ANNOTATION, keyVal.Key)
 							keyValArr = append(keyValArr, keyVal)
 						}
 					}
 					wskTrigger.Parameters = keyValArr
+				} else {
+					displayEntityNotFoundInDeploymentWarning(parsers.YAML_KEY_TRIGGER, triggerName)
 				}
 			}
 
@@ -326,14 +321,11 @@ func (reader *DeploymentReader) bindTriggerInputsAndAnnotations() error {
 						}
 					}
 					if !keyExistsInManifest {
-						errMsg := wski18n.T(
-							wski18n.ID_ERR_DEPLOYMENT_NAME_NOT_FOUND_X_key_X_name_X,
-							map[string]interface{}{
-								wski18n.KEY_KEY:  parsers.YAML_KEY_ANNOTATION,
-								wski18n.KEY_NAME: name})
-						return wskderrors.NewYAMLFileFormatError(reader.DeploymentDescriptor.Filepath, errMsg)
+						displayEntityNotFoundInDeploymentWarning(parsers.YAML_KEY_ANNOTATION, name)
 					}
 				}
+			} else {
+				displayEntityNotFoundInDeploymentWarning(parsers.YAML_KEY_TRIGGER, triggerName)
 			}
 
 		}
@@ -341,3 +333,21 @@ func (reader *DeploymentReader) bindTriggerInputsAndAnnotations() error {
 	}
 	return nil
 }
+
+func displayEntityNotFoundInDeploymentWarning(entityType string, entityName string) {
+	warnMsg := wski18n.T(
+		wski18n.ID_WARN_DEPLOYMENT_NAME_NOT_FOUND_X_key_X_name_X,
+		map[string]interface{}{
+			wski18n.KEY_KEY:  entityType,
+			wski18n.KEY_NAME: entityName})
+	wskprint.PrintOpenWhiskWarning(warnMsg)
+}
+
+func displayEntityFoundInDeploymentTrace(entityType string, entityName string) {
+	infoMsg := wski18n.T(
+		wski18n.ID_DEBUG_DEPLOYMENT_NAME_FOUND_X_key_X_name_X,
+		map[string]interface{}{
+			wski18n.KEY_KEY:  entityType,
+			wski18n.KEY_NAME: entityName})
+	wskprint.PrintlnOpenWhiskTrace(true, infoMsg)
+}
diff --git a/deployers/deploymentreader_test.go b/deployers/deploymentreader_test.go
index d5312d1e..cc48f2ca 100644
--- a/deployers/deploymentreader_test.go
+++ b/deployers/deploymentreader_test.go
@@ -20,144 +20,196 @@
 package deployers
 
 import (
+	"fmt"
 	"github.com/apache/incubator-openwhisk-client-go/whisk"
 	"github.com/stretchr/testify/assert"
 	"reflect"
 	"testing"
 )
 
+const (
+	// local error messages
+	TEST_ERROR_DEPLOYMENT_PARSE_FAILURE        = "Deployment [%s]: Failed to parse."
+	TEST_ERROR_DEPLOYMENT_BIND_TRIGGER_FAILURE = "Deployment [%s]: Failed to bind Trigger."
+	TEST_ERROR_DEPLOYMENT_FIND_PROJECT         = "Deployment [%s]: Failed to find Project [%s]."
+	TEST_ERROR_DEPLOYMENT_FIND_PACKAGES        = "Deployment [%s]: Failed to find Packages for project [%s]."
+	TEST_ERROR_DEPLOYMENT_FIND_PACKAGE         = "Deployment [%s]: Failed to find Package [%s]."
+	TEST_ERROR_DEPLOYMENT_FIND_TRIGGER         = "Deployment [%s]: Failed to find Trigger [%s]."
+	TEST_ERROR_DEPLOYMENT_SET_ANNOTATION       = "Failed to set Annotation value."
+	TEST_ERROR_DEPLOYMENT_SET_INPUT_PARAMETER  = "Failed to set input Parameter value."
+	TEST_ERROR_DEPLOYMENT_GET_ANNOTATION       = "Failed to get Annotation key."
+	TEST_ERROR_DEPLOYMENT_GET_INPUT_PARAMETER  = "Failed to get input Parameter key."
+)
+
+// TODO() these globals are shared by manifest_reader_test.go; these tests should be independent of each other
 var sd *ServiceDeployer
 var dr *DeploymentReader
 var deployment_file = "../tests/usecases/github/deployment.yaml"
 var manifest_file = "../tests/usecases/github/manifest.yaml"
 
 func init() {
+	// TODO(): setup "trace" flag here (and in all unit test files)
+}
+
+// Check DeploymentReader could handle deployment yaml successfully.
+func TestDeploymentReader_HandleYaml(t *testing.T) {
+
 	sd = NewServiceDeployer()
 	sd.DeploymentPath = deployment_file
 	sd.ManifestPath = manifest_file
 	sd.Check()
 	dr = NewDeploymentReader(sd)
-}
 
-// Check DeploymentReader could handle deployment yaml successfully.
-func TestDeploymentReader_HandleYaml(t *testing.T) {
+	TEST_PACKAGE := "GitHubCommits"
 	dr.HandleYaml()
-	assert.NotNil(t, dr.DeploymentDescriptor.GetProject().Packages["GitHubCommits"], "DeploymentReader handle deployment yaml failed.")
+
+	if _, exists := dr.DeploymentDescriptor.GetProject().Packages[TEST_PACKAGE]; !exists {
+		assert.Fail(t, fmt.Sprintf(TEST_ERROR_DEPLOYMENT_FIND_PACKAGE,
+			dr.serviceDeployer.DeploymentPath, TEST_PACKAGE))
+	}
+
 }
 
-// TODO(750) remove this unused test?
-func TestDeployerCheck(t *testing.T) {
-	sd := NewServiceDeployer()
-	sd.DeploymentPath = "../tests/usecases/badyaml/deployment.yaml"
-	sd.ManifestPath = "../tests/usecases/badyaml/manifest.yaml"
-	// The system will exit thus the test will fail.
-	// sd.Check()
+func createAnnotationArray(t *testing.T, kv whisk.KeyValue) whisk.KeyValueArr {
+	kva := make(whisk.KeyValueArr, 0)
+	kva = append(kva, kv)
+	return kva
 }
 
-func TestDeploymentReader_bindTrigger(t *testing.T) {
-	//init variables
+// Create a ServiceDeployer with a "dummy" DeploymentPlan (i.e., simulate a fake manifest parse)
+// load the deployment YAMl into dReader.DeploymentDescriptor
+// bind the deployment inputs and annotations to the named Trigger from Deployment to Manifest YAML
+func testLoadAndBindDeploymentYAML(t *testing.T, path string, triggerName string, kv whisk.KeyValue) (*ServiceDeployer, *DeploymentReader) {
+
 	sDeployer := NewServiceDeployer()
-	sDeployer.DeploymentPath = "../tests/dat/deployment-deploymentreader-test.yml"
-	sDeployer.Deployment.Triggers["locationUpdate"] = new(whisk.Trigger)
+	sDeployer.DeploymentPath = path
 
-	//parse deployment and bind triggers input and annotation
+	// Create Trigger for "bind" function to use (as a Manifest parse would have created)
+	sDeployer.Deployment.Triggers[triggerName] = new(whisk.Trigger)
+	sDeployer.Deployment.Triggers[triggerName].Annotations = createAnnotationArray(t, kv)
+
+	//parse deployment and bind triggers input and annotations
 	dReader := NewDeploymentReader(sDeployer)
-	dReader.HandleYaml()
-	dReader.bindTriggerInputsAndAnnotations()
+	err := dReader.HandleYaml()
 
-	trigger := sDeployer.Deployment.Triggers["locationUpdate"]
-	for _, param := range trigger.Parameters {
-		switch param.Key {
-		case "name":
-			assert.Equal(t, "Bernie", param.Value, "Failed to set inputs")
-		case "place":
-			assert.Equal(t, "DC", param.Value, "Failed to set inputs")
-		default:
-			assert.Fail(t, "Failed to get inputs key")
+	// DEBUG() Uncomment to display initial DeploymentDescriptor (manifest, deployemnt befopre binding)
+	//fmt.Println(utils.ConvertMapToJSONString("BEFORE: dReader.DeploymentDescriptor", dReader.DeploymentDescriptor))
+	//fmt.Println(utils.ConvertMapToJSONString("BEFORE: sDeployer.Deployment", sDeployer.Deployment))
 
-		}
+	// test load of deployment YAML
+	if err != nil {
+		assert.Fail(t, fmt.Sprintf(TEST_ERROR_DEPLOYMENT_PARSE_FAILURE, sDeployer.DeploymentPath))
 	}
-	for _, annos := range trigger.Annotations {
-		switch annos.Key {
-		case "bbb":
-			assert.Equal(t, "this is an annotation", annos.Value, "Failed to set annotations")
-		default:
-			assert.Fail(t, "Failed to get annotation key")
 
-		}
+	// Test that we can bind Triggers and Annotations
+	err = dReader.bindTriggerInputsAndAnnotations()
+
+	// test load of deployment YAML
+	if err != nil {
+		fmt.Println(err)
+		assert.Fail(t, fmt.Sprintf(TEST_ERROR_DEPLOYMENT_BIND_TRIGGER_FAILURE, sDeployer.DeploymentPath))
 	}
+
+	// DEBUG() Uncomment to display resultant DeploymentDescriptor (manifest + deployment file binding)
+	//fmt.Println(utils.ConvertMapToJSONString("AFTER: dReader.DeploymentDescriptor", dReader.DeploymentDescriptor))
+	//fmt.Println(utils.ConvertMapToJSONString("AFTER: sDeployer.Deployment", sDeployer.Deployment))
+
+	return sDeployer, dReader
 }
 
-func TestDeploymentReader_bindTrigger_packages(t *testing.T) {
+func TestDeploymentReader_ProjectBindTrigger(t *testing.T) {
+
 	//init variables
-	sDeployer := NewServiceDeployer()
-	sDeployer.DeploymentPath = "../tests/dat/deployment-deploymentreader-test-packages.yml"
-	sDeployer.Deployment.Triggers["locationUpdate"] = new(whisk.Trigger)
+	TEST_DATA := "../tests/dat/deployment_deploymentreader_project_bind_trigger.yml"
+	TEST_TRIGGER := "locationUpdate"
+	TEST_PROJECT := "AppWithTriggerRule"
+	TEST_ANNOTATION_KEY := "bbb"
+	// Create an annotation (in manifest representation) with key we expect, with value that should be overwritten
+	TEST_ANNOTATION := whisk.KeyValue{TEST_ANNOTATION_KEY, "foo"}
 
-	//parse deployment and bind triggers input and annotation
-	dReader := NewDeploymentReader(sDeployer)
-	dReader.HandleYaml()
-	dReader.bindTriggerInputsAndAnnotations()
+	// create ServicedEployer
+	sDeployer, dReader := testLoadAndBindDeploymentYAML(t, TEST_DATA, TEST_TRIGGER, TEST_ANNOTATION)
+
+	// test Project exists with expected name in Deployment file
+	projectNameDeploy := dReader.DeploymentDescriptor.GetProject().Name
+	if projectNameDeploy != TEST_PROJECT {
+		assert.Fail(t, fmt.Sprintf(TEST_ERROR_DEPLOYMENT_FIND_PROJECT, TEST_PROJECT))
+	}
+
+	// test that the Project has Packages
+	if len(dReader.DeploymentDescriptor.GetProject().Packages) == 0 {
+		assert.Fail(t, fmt.Sprintf(TEST_ERROR_DEPLOYMENT_FIND_PACKAGES, TEST_PROJECT))
+	}
+
+	trigger := sDeployer.Deployment.Triggers[TEST_TRIGGER]
 
-	trigger := sDeployer.Deployment.Triggers["locationUpdate"]
+	// test that Input values from dReader.DeploymentDescriptor wore "bound" onto sDeployer.Deployment
 	for _, param := range trigger.Parameters {
 		switch param.Key {
 		case "name":
-			assert.Equal(t, "Bernie", param.Value, "Failed to set inputs")
+			assert.Equal(t, "Bernie", param.Value, TEST_ERROR_DEPLOYMENT_SET_INPUT_PARAMETER)
 		case "place":
-			assert.Equal(t, "DC", param.Value, "Failed to set inputs")
+			assert.Equal(t, "DC", param.Value, TEST_ERROR_DEPLOYMENT_SET_INPUT_PARAMETER)
 		default:
-			assert.Fail(t, "Failed to get inputs key")
+			assert.Fail(t, TEST_ERROR_DEPLOYMENT_GET_INPUT_PARAMETER)
 
 		}
 	}
+
+	// test that Annotations from dReader.DeploymentDescriptor wore "bound" onto sDeployer.Deployment
 	for _, annos := range trigger.Annotations {
 		switch annos.Key {
-		case "bbb":
-			assert.Equal(t, "this is an annotation", annos.Value, "Failed to set annotations")
+		case TEST_ANNOTATION_KEY:
+			// Manifest's value should be overwritten
+			assert.Equal(t, "this is an annotation", annos.Value, TEST_ERROR_DEPLOYMENT_SET_ANNOTATION)
 		default:
-			assert.Fail(t, "Failed to get annotation key")
+			assert.Fail(t, TEST_ERROR_DEPLOYMENT_GET_ANNOTATION)
 
 		}
 	}
 }
 
-// TODO(749) - rewrite test to remove "package"
-//func TestDeploymentReader_bindTrigger_package(t *testing.T) {
-//	//init variables
-//	sDeployer := NewServiceDeployer()
-//	sDeployer.DeploymentPath = "../tests/dat/deployment-deploymentreader-test-package.yml"
-//	sDeployer.Deployment.Triggers["locationUpdate"] = new(whisk.Trigger)
-//
-//	//parse deployment and bind triggers input and annotation
-//	dReader := NewDeploymentReader(sDeployer)
-//	dReader.HandleYaml()
-//	dReader.bindTriggerInputsAndAnnotations()
-//
-//	assert.Equal(t, "triggerrule", dReader.DeploymentDescriptor.Package.Packagename)
-//	trigger := sDeployer.Deployment.Triggers["locationUpdate"]
-//	for _, param := range trigger.Parameters {
-//		switch param.Key {
-//		case "name":
-//			assert.Equal(t, "Bernie", param.Value, "Failed to set inputs")
-//		case "place":
-//			assert.Equal(t, "DC", param.Value, "Failed to set inputs")
-//		default:
-//			assert.Fail(t, "Failed to get inputs key")
-//
-//		}
-//	}
-//	for _, annos := range trigger.Annotations {
-//		switch annos.Key {
-//		case "bbb":
-//			assert.Equal(t, "this is an annotation", annos.Value, "Failed to set annotations")
-//		default:
-//			assert.Fail(t, "Failed to get annotation key")
-//
-//		}
-//	}
-//}
+func TestDeploymentReader_PackagesBindTrigger(t *testing.T) {
+	//init variables
+	TEST_DATA := "../tests/dat/deployment_deploymentreader_packages_bind_trigger.yml"
+	TEST_TRIGGER := "locationUpdate"
+	TEST_ANOTATION_KEY := "bbb"
+	// Create an annotation (in manifest representation) with key we expect, with value that should be overwritten
+	TEST_ANNOTATION := whisk.KeyValue{TEST_ANOTATION_KEY, "bar"}
+
+	sDeployer, _ := testLoadAndBindDeploymentYAML(t, TEST_DATA, TEST_TRIGGER, TEST_ANNOTATION)
+
+	// test that Input values from dReader.DeploymentDescriptor wore "bound" onto sDeployer.Deployment
+	if trigger, ok := sDeployer.Deployment.Triggers[TEST_TRIGGER]; ok {
+
+		for _, param := range trigger.Parameters {
+			switch param.Key {
+			case "name":
+				assert.Equal(t, "Bernie", param.Value, TEST_ERROR_DEPLOYMENT_SET_INPUT_PARAMETER)
+			case "place":
+				assert.Equal(t, "DC", param.Value, TEST_ERROR_DEPLOYMENT_SET_INPUT_PARAMETER)
+			default:
+				assert.Fail(t, TEST_ERROR_DEPLOYMENT_GET_INPUT_PARAMETER)
+
+			}
+		}
+		for _, annos := range trigger.Annotations {
+			switch annos.Key {
+			case "bbb":
+				assert.Equal(t, "this is an annotation", annos.Value, TEST_ERROR_DEPLOYMENT_SET_ANNOTATION)
+			default:
+				assert.Fail(t, TEST_ERROR_DEPLOYMENT_GET_ANNOTATION)
+
+			}
+		}
+	} else {
+		assert.Fail(t, fmt.Sprintf(TEST_ERROR_DEPLOYMENT_FIND_TRIGGER,
+			sDeployer.DeploymentPath,
+			TEST_TRIGGER))
+	}
+}
 
+// TODO() use local "load" function
 func TestDeploymentReader_BindAssets_ActionAnnotations(t *testing.T) {
 	sDeployer := NewServiceDeployer()
 	sDeployer.DeploymentPath = "../tests/dat/deployment_validate_action_annotations.yaml"
diff --git a/deployers/servicedeployer.go b/deployers/servicedeployer.go
index 0cea27a0..377c4250 100644
--- a/deployers/servicedeployer.go
+++ b/deployers/servicedeployer.go
@@ -138,7 +138,7 @@ func (deployer *ServiceDeployer) ConstructDeploymentPlan() error {
 		// Project Name in manifest/deployment file is mandatory for managed deployments
 		if deployer.ProjectName == "" {
 			errmsg := wski18n.T(wski18n.ID_ERR_KEY_MISSING_X_key_X,
-				map[string]interface{}{wski18n.KEY_KEY: wski18n.PROJECT_NAME})
+				map[string]interface{}{wski18n.KEY_KEY: wski18n.NAME_PROJECT})
 
 			return wskderrors.NewYAMLFileFormatError(manifest.Filepath, errmsg)
 		}
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index 56b500c0..d97a2a3b 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -487,7 +487,7 @@ func (dm *YAMLParser) ComposeActions(filePath string, actions map[string]Action,
 					errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_MISMATCH_X_runtime_X_ext_X_action_X,
 						map[string]interface{}{
 							wski18n.KEY_RUNTIME:   action.Runtime,
-							wski18n.KEY_EXTENTION: ext,
+							wski18n.KEY_EXTENSION: ext,
 							wski18n.KEY_ACTION:    action.Name})
 					return nil, wskderrors.NewInvalidRuntimeError(errMessage,
 						splitFilePath[len(splitFilePath)-1], action.Name,
@@ -542,7 +542,7 @@ func (dm *YAMLParser) ComposeActions(filePath string, actions map[string]Action,
 						warnStr := wski18n.T(wski18n.ID_ERR_RUNTIME_MISMATCH_X_runtime_X_ext_X_action_X,
 							map[string]interface{}{
 								wski18n.KEY_RUNTIME:   action.Runtime,
-								wski18n.KEY_EXTENTION: ext,
+								wski18n.KEY_EXTENSION: ext,
 								wski18n.KEY_ACTION:    action.Name})
 						wskprint.PrintOpenWhiskWarning(warnStr)
 
diff --git a/parsers/yamlparser.go b/parsers/yamlparser.go
index fb526ddb..79748307 100644
--- a/parsers/yamlparser.go
+++ b/parsers/yamlparser.go
@@ -26,17 +26,17 @@ import (
 // DO NOT translate
 const (
 	YAML_KEY_ACTION     = "action"
-	YAML_KEY_ANNOTATION = "annotoation"
+	YAML_KEY_ANNOTATION = "annotation"
 	YAML_KEY_API        = "api"
 	YAML_KEY_FEED       = "feed"
 	YAML_KEY_MANIFEST   = "manifest"
 	YAML_KEY_NAMESPACE  = "namespace"
+	YAML_KEY_PACKAGE    = "package"
 	YAML_KEY_PACKAGES   = "packages"
 	YAML_KEY_PROJECT    = "project"
 	YAML_KEY_RULE       = "rule"
 	YAML_KEY_SEQUENCE   = "sequence"
 	YAML_KEY_TRIGGER    = "trigger"
-	YAML_KEY_PACKAGE    = "package"
 	YAML_KEY_SOURCE     = "source" // deprecated
 )
 
diff --git a/tests/dat/deployment-deploymentreader-test-package.yml b/tests/dat/deployment-deploymentreader-test-package.yml
deleted file mode 100644
index 15c5d4e9..00000000
--- a/tests/dat/deployment-deploymentreader-test-package.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more contributor
-# license agreements.  See the NOTICE file distributed with this work for additional
-# information regarding copyright ownership.  The ASF licenses this file to you
-# under the Apache License, Version 2.0 (the # "License"); you may not use this
-# file except in compliance with the License.  You may obtain a copy of the License
-# at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed
-# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations under the License.
-#
-
-package:
-      name: triggerrule
-      actions:
-        greeting:
-          inputs:
-            name: Amy
-            place: Paris
-          annotations:
-            aaa: this is an annotation
-      triggers:
-        locationUpdate:
-          inputs:
-            name: Bernie
-            place: DC
-          annotations:
-            bbb: this is an annotation
diff --git a/tests/dat/deployment-deploymentreader-test-packages.yml b/tests/dat/deployment_deploymentreader_packages_bind_trigger.yml
similarity index 69%
rename from tests/dat/deployment-deploymentreader-test-packages.yml
rename to tests/dat/deployment_deploymentreader_packages_bind_trigger.yml
index 6c76f03a..31749b0c 100644
--- a/tests/dat/deployment-deploymentreader-test-packages.yml
+++ b/tests/dat/deployment_deploymentreader_packages_bind_trigger.yml
@@ -15,18 +15,18 @@
 #
 
 packages:
-    triggerrule:
-      actions:
-        greeting:
-          inputs:
-            name: Amy
-            place: Paris
-          annotations:
-            aaa: this is an annotation
-      triggers:
-        locationUpdate:
-          inputs:
-            name: Bernie
-            place: DC
-          annotations:
-            bbb: this is an annotation
+  triggerrule:
+    actions:
+      greeting:
+        inputs:
+          name: Amy
+          place: Paris
+        annotations:
+          aaa: this is an annotation
+    triggers:
+      locationUpdate:
+        inputs:
+          name: Bernie
+          place: DC
+        annotations:
+          bbb: this is an annotation
diff --git a/tests/dat/deployment-deploymentreader-test.yml b/tests/dat/deployment_deploymentreader_project_bind_trigger.yml
similarity index 100%
rename from tests/dat/deployment-deploymentreader-test.yml
rename to tests/dat/deployment_deploymentreader_project_bind_trigger.yml
diff --git a/tests/src/integration/validate-action-annotations/deployment-with-invalid-annotations.yaml b/tests/src/integration/validate-action-annotations/deployment-with-invalid-annotations.yaml
deleted file mode 100644
index cd3168b5..00000000
--- a/tests/src/integration/validate-action-annotations/deployment-with-invalid-annotations.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more contributor
-# license agreements.  See the NOTICE file distributed with this work for additional
-# information regarding copyright ownership.  The ASF licenses this file to you
-# under the Apache License, Version 2.0 (the # "License"); you may not use this
-# file except in compliance with the License.  You may obtain a copy of the License
-# at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed
-# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations under the License.
-#
-
-project:
-    name: TestActionAnnotations
-    packages:
-        packageActionAnnotations:
-            actions:
-                helloworld:
-                    inputs:
-                        name: Amy
-                        place: New York
-                    annotations:
-                        action_annotation_5: this is annotation 5
-                        action_annotation_6: this is annotation 6
-        packageActionAnnotationsWithWebAction:
-            actions:
-                helloworld:
-                    inputs:
-                        name: Amy
-                        place: New York
-                    annotations:
-                        action_annotation_5: this is annotation 5
-                        action_annotation_6: this is annotation 6
-                        web-export: true
diff --git a/tests/src/integration/validate-action-annotations/validate-action-annotations_test.go b/tests/src/integration/validate-action-annotations/validate-action-annotations_test.go
index 78f86fb4..842c4e8e 100644
--- a/tests/src/integration/validate-action-annotations/validate-action-annotations_test.go
+++ b/tests/src/integration/validate-action-annotations/validate-action-annotations_test.go
@@ -37,11 +37,3 @@ func TestActionAnnotations(t *testing.T) {
 	_, err = wskdeploy.Undeploy(manifestPath, deploymentPath)
 	assert.Equal(t, nil, err, "Failed to undeploy based on the manifest and deployment files.")
 }
-
-func TestInvalidActionAnnotations(t *testing.T) {
-	manifestPath := os.Getenv("GOPATH") + path + "manifest.yaml"
-	deploymentPath := os.Getenv("GOPATH") + path + "deployment-with-invalid-annotations.yaml"
-	wskdeploy := common.NewWskdeploy()
-	_, err := wskdeploy.Deploy(manifestPath, deploymentPath)
-	assert.NotNil(t, err, "Failed to validate invalid annotations in deployment file")
-}
diff --git a/utils/conversion.go b/utils/conversion.go
index e6c1e345..8b3ce5d4 100644
--- a/utils/conversion.go
+++ b/utils/conversion.go
@@ -51,13 +51,8 @@ func convertMapValue(value interface{}) interface{} {
 	}
 }
 
-func PrintTypeInfo(name string, value interface{}) {
-	info := fmt.Sprintf("Name=[%s], Value=[%v], Type=[%T]\n", name, value, value)
-	fmt.Print(info)
-}
-
+// TODO() add a Print function to wskprint that calls this and adds the label
 func ConvertMapToJSONString(name string, mapIn interface{}) string {
-	PrintTypeInfo(name, mapIn)
 	strMapOut, _ := json.MarshalIndent(mapIn, "", "  ")
-	return string(strMapOut)
+	return fmt.Sprintf("%s: %s", name, string(strMapOut))
 }
diff --git a/wski18n/i18n_ids.go b/wski18n/i18n_ids.go
index 564ef274..b8c1bdc8 100644
--- a/wski18n/i18n_ids.go
+++ b/wski18n/i18n_ids.go
@@ -29,25 +29,14 @@ const (
 	DEPLOYMENT         = "deployment"
 	CONFIGURATION      = "Configuration"
 	MANIFEST           = "manifest"
-	NAME_ACTION        = "Action Name"
-	NAME_FEED          = "Feed Name"
-	NAME_RULE          = "Rule Name"
-	NAME_RUNTIME       = "Runtime Name"
-	NAME_TRIGGER       = "Trigger Name"
+	NAME_PROJECT       = "project name"
 	NAMESPACES         = "Namespaces"
 	PACKAGE_BINDING    = "package binding"
 	PACKAGE_LICENSE    = "package license"
-	PACKAGE_NAME       = "package name"
 	PACKAGE_VERSION    = "package version"
 	PACKAGES           = "Packages"
-	PROJECT_NAME       = "project name"
-	REGISTRY           = "registry"
-	REGISTRY_URL       = "registry URL"
-	REPOSITORY         = "repository"
 	RULES              = "Rules"
 	TRIGGER_FEED       = "trigger feed"
-	TRIGGERS           = "Triggers"
-	WHISK_PROPS        = "wskprops"
 	APIGW_ACCESS_TOKEN = "API Gateway Access Token"
 )
 
@@ -61,15 +50,11 @@ const (
 	ID_MSG_PREFIX_WARNING = "msg_prefix_warning" // "Warning"
 
 	// Cobra command descriptions
-	ID_CMD_DESC_LONG_PUBLISH      = "msg_cmd_desc_long_publish"
-	ID_CMD_DESC_LONG_REPORT       = "msg_cmd_desc_long_report"
-	ID_CMD_DESC_LONG_ROOT         = "msg_cmd_desc_long_root"
-	ID_CMD_DESC_SHORT_ADD         = "msg_cmd_desc_short_add"
-	ID_CMD_DESC_SHORT_ADD_X_key_X = "msg_cmd_desc_short_add_entity"
-	ID_CMD_DESC_SHORT_PUBLISH     = "msg_cmd_desc_short_publish"
-	ID_CMD_DESC_SHORT_REPORT      = "msg_cmd_desc_short_report"
-	ID_CMD_DESC_SHORT_ROOT        = "msg_cmd_desc_short_root"
-	ID_CMD_DESC_SHORT_VERSION     = "msg_cmd_desc_short_version"
+	ID_CMD_DESC_LONG_REPORT   = "msg_cmd_desc_long_report"
+	ID_CMD_DESC_LONG_ROOT     = "msg_cmd_desc_long_root"
+	ID_CMD_DESC_SHORT_REPORT  = "msg_cmd_desc_short_report"
+	ID_CMD_DESC_SHORT_ROOT    = "msg_cmd_desc_short_root"
+	ID_CMD_DESC_SHORT_VERSION = "msg_cmd_desc_short_version"
 
 	// Cobra Flag messages
 	ID_CMD_FLAG_API_HOST    = "msg_cmd_flag_api_host"
@@ -143,7 +128,6 @@ const (
 
 	// Errors
 	ID_ERR_DEPENDENCY_UNKNOWN_TYPE                               = "msg_err_dependency_unknown_type"
-	ID_ERR_DEPLOYMENT_NAME_NOT_FOUND_X_key_X_name_X              = "msg_err_deployment_name_not_found"
 	ID_ERR_ENTITY_CREATE_X_key_X_err_X_code_X                    = "msg_err_entity_create"
 	ID_ERR_ENTITY_DELETE_X_key_X_err_X_code_X                    = "msg_err_entity_delete"
 	ID_ERR_FEED_INVOKE_X_err_X_code_X                            = "msg_err_feed_invoke"
@@ -178,54 +162,50 @@ const (
 	ID_WARN_WHISK_PROPS_DEPRECATED                            = "msg_warn_whisk_properties"
 	ID_WARN_ENTITY_NAME_EXISTS_X_key_X_name_X                 = "msg_warn_entity_name_exists"
 	ID_WARN_PACKAGES_NOT_FOUND_X_path_X                       = "msg_warn_packages_not_found"
+	ID_WARN_DEPLOYMENT_NAME_NOT_FOUND_X_key_X_name_X          = "msg_warn_deployment_name_not_found"
 
 	// Verbose (Debug/Trace) messages
-	ID_DEBUG_KEY_VERIFY_X_name_X_key_X     = "msg_dbg_key_verify"
-	ID_DEBUG_DEPLOYING_USING               = "msg_dbg_deploying_using"
-	ID_DEBUG_UNDEPLOYING_USING             = "msg_dbg_undeploying_using"
-	ID_DEBUG_PROJECT_SEARCH_X_path_X_key_X = "msg_dbg_searching_project_directory"
+	ID_DEBUG_DEPLOYING_USING                              = "msg_dbg_deploying_using"
+	ID_DEBUG_UNDEPLOYING_USING                            = "msg_dbg_undeploying_using"
+	ID_DEBUG_PROJECT_SEARCH_X_path_X_key_X                = "msg_dbg_searching_project_directory"
+	ID_DEBUG_DEPLOYMENT_NAME_FOUND_X_key_X_name_X         = "msg_dbg_deployment_name_found"
+	ID_DEBUG_PACKAGES_FOUND_UNDER_ROOT_X_path_X           = "msg_dbg_packages_found_root"
+	ID_DEBUG_PACKAGES_FOUND_UNDER_PROJECT_X_path_X_name_X = "msg_dbg_packages_found_project"
 )
 
 // Known keys used for text replacement in i18n translated strings
 const (
-	KEY_ACTION             = "action"
-	KEY_CMD                = "cmd"
-	KEY_CODE               = "code"
-	KEY_DEPLOYMENT_NAME    = "dname"
-	KEY_DEPLOYMENT_PATH    = "dpath"
-	KEY_ERR                = "err"
-	KEY_EXTENTION          = "ext"
-	KEY_FILE_TYPE          = "filetype"
-	KEY_HOST               = "host"
-	KEY_KEY                = "key"
-	KEY_LIMIT              = "limit"
-	KEY_MANIFEST_NAME      = "mname"
-	KEY_MANIFEST_PATH      = "mpath"
-	KEY_NAME               = "name"
-	KEY_NAMESPACE          = "namespace"
-	KEY_NEW                = "newkey"
-	KEY_OLD                = "oldkey"
-	KEY_PATH               = "path"
-	KEY_PROJECT            = "project"
-	KEY_RUNTIME            = "runtime"
-	KEY_SOURCE             = "source"
-	KEY_URL                = "url"
-	KEY_URL_TYPE           = "urltype"
-	KEY_VALUE              = "value"
-	KEY_VALUE_MIN          = "min" // TODO() attempt to use this for Limit value range errors
-	KEY_VALUE_MAX          = "max" // TODO() attempt to use this for Limit value range errors
-	KEY_API                = "api"
-	KEY_APIGW_ACCESS_TOKEN = "apigw_access_token"
+	KEY_ACTION          = "action"
+	KEY_CMD             = "cmd"
+	KEY_CODE            = "code"
+	KEY_DEPLOYMENT_NAME = "dname"
+	KEY_DEPLOYMENT_PATH = "dpath"
+	KEY_ERR             = "err"
+	KEY_EXTENSION       = "ext"
+	KEY_FILE_TYPE       = "filetype"
+	KEY_HOST            = "host"
+	KEY_KEY             = "key"
+	KEY_LIMIT           = "limit"
+	KEY_MANIFEST_NAME   = "mname"
+	KEY_MANIFEST_PATH   = "mpath"
+	KEY_NAME            = "name"
+	KEY_NAMESPACE       = "namespace"
+	KEY_NEW             = "newkey"
+	KEY_OLD             = "oldkey"
+	KEY_PATH            = "path"
+	KEY_PROJECT         = "project"
+	KEY_RUNTIME         = "runtime"
+	KEY_SOURCE          = "source"
+	KEY_VALUE           = "value"
+	KEY_VALUE_MIN       = "min" // TODO() attempt to use this for Limit value range errors
+	KEY_VALUE_MAX       = "max" // TODO() attempt to use this for Limit value range errors
+	KEY_API             = "api"
 )
 
 // Used to unit test that translations exist with these IDs
 var I18N_ID_SET = [](string){
-	ID_CMD_DESC_LONG_PUBLISH,
 	ID_CMD_DESC_LONG_REPORT,
 	ID_CMD_DESC_LONG_ROOT,
-	ID_CMD_DESC_SHORT_ADD,
-	ID_CMD_DESC_SHORT_ADD_X_key_X,
-	ID_CMD_DESC_SHORT_PUBLISH,
 	ID_CMD_DESC_SHORT_REPORT,
 	ID_CMD_DESC_SHORT_ROOT,
 	ID_CMD_DESC_SHORT_VERSION,
@@ -246,11 +226,12 @@ var I18N_ID_SET = [](string){
 	ID_CMD_FLAG_TOGGLE_HELP,
 	ID_CMD_FLAG_VERBOSE,
 	ID_DEBUG_DEPLOYING_USING,
-	ID_DEBUG_KEY_VERIFY_X_name_X_key_X,
+	ID_DEBUG_DEPLOYMENT_NAME_FOUND_X_key_X_name_X,
+	ID_DEBUG_PACKAGES_FOUND_UNDER_PROJECT_X_path_X_name_X,
+	ID_DEBUG_PACKAGES_FOUND_UNDER_ROOT_X_path_X,
 	ID_DEBUG_PROJECT_SEARCH_X_path_X_key_X,
 	ID_DEBUG_UNDEPLOYING_USING,
 	ID_ERR_DEPENDENCY_UNKNOWN_TYPE,
-	ID_ERR_DEPLOYMENT_NAME_NOT_FOUND_X_key_X_name_X,
 	ID_ERR_ENTITY_CREATE_X_key_X_err_X_code_X,
 	ID_ERR_ENTITY_DELETE_X_key_X_err_X_code_X,
 	ID_ERR_JSON_MISSING_KEY_CMD,
@@ -303,6 +284,7 @@ var I18N_ID_SET = [](string){
 	ID_MSG_UNMARSHAL_NETWORK_X_url_X,
 	ID_WARN_COMMAND_RETRY,
 	ID_WARN_CONFIG_INVALID_X_path_X,
+	ID_WARN_DEPLOYMENT_NAME_NOT_FOUND_X_key_X_name_X,
 	ID_WARN_ENTITY_NAME_EXISTS_X_key_X_name_X,
 	ID_WARN_KEY_DEPRECATED_X_oldkey_X_filetype_X_newkey_X,
 	ID_WARN_KEY_MISSING_X_key_X_value_X,
diff --git a/wski18n/i18n_resources.go b/wski18n/i18n_resources.go
index 74eed755..440b0726 100644
--- a/wski18n/i18n_resources.go
+++ b/wski18n/i18n_resources.go
@@ -1,20 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
 // Code generated by go-bindata.
 // sources:
 // wski18n/resources/de_DE.all.json
@@ -109,12 +92,12 @@ func wski18nResourcesDe_deAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/de_DE.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1518211603, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/de_DE.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1515697090, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
 
-var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x1a\x6b\x8f\x1b\xb7\xf1\xbb\x7f\xc5\xc0\x28\xe0\x04\x38\xcb\x4e\x8a\x02\x85\x81\x43\xe1\xd6\x6e\x72\x4d\xec\x33\xee\xec\x04\x81\x73\x58\x53\xcb\x91\xc4\x68\x97\x5c\x90\xdc\x93\x95\x83\xfa\xdb\x8b\xe1\x63\x77\xa5\x3b\xee\x52\x72\x82\xe6\x4b\xe4\xe3\x70\xde\x9c\xe7\x7e\x7c\x04\x70\xf7\x08\x00\xe0\xb1\xe0\x8f\x5f\xc0\xe3\xda\x2c\x8b\x46\xe3\x42\x7c\x2e\x50\x6b\xa5\x1f\x9f\xf9\x53\xab\x99\x34\x15\xb3\x42\x49\x02\x7b\xed\xce\x1e\x01\xec\xce\x46\x30\x08\xb9\x50\x09\x04\x17\x74\x34\x75\xdf\xb4\x65\x89\xc6\x24\x50\x5c\x87\xd3\x29\x2c\x1b\xa6\xa5\x90\xcb\x04\x96\x9f\xc3\x69\x12\x4b\x59\xf3\x82\xa3\x29\x8b\x4a\xc9\x65\xd1\xb4\xf3\x4a\x98\x55\x02\xd9\x3b\x7f\x0a\x0c\x1a\x56\xae\xd9\x12\xc1\x2a\xb0\x2b\x04\x8d\x4b\x61\xac\xde\x82\x41\x0b\x42\xc2\x7f\x9f\xcd\x36\x66\xdd\x68\xd5\x98\x59\x2e\x69\x8d\x8d\xd2\x36\x41\xf9\xca\x1d\x1a\x50\x12\x38\x36\x95\xda\x22\x07\x94\x56\x58\x81\x06\xbe\x12\x33\x9c\x9d\xc1\x3b\xcf\x93\x39\x83\x97\x25\xdd\x33\x67\xf0\x5e\x8b\xe5\x12\xb5\x39\x83\xab\xb6\xa2\x13\xb4\xe5\xec\x6b\x60\x06\x36\x58\x55\xf4\x7f\x8d\x25\x4a\xeb\x6e\xdc\x3a\x6a\x86\xf8\x27\x99\x4c\x83\xa5\x58\x08\xe4\x20\x59\x8d\xa6\x61\x25\xe6\xcb\xa2\x54\x4a\x92\x97\x60\x95\xaa\x48\x71\x5e\x90\x33\x68\xa5\xff\x05\x4c\x72\x30\x5b\x59\x82\x6a\x50\x6e\x56\xc2\xac\xa3\x9e\x0d\xb4\x46\xc8\x25\x30\xa8\x99\x14\x0b\x34\xd6\x01\xab\x86\xb0\xb2\x2a\xa0\xaa\x49\x92\x85\xa8\x3a\xf0\x5f\x5e\xbe\xf9\x31\x87\x67\xb3\x52\xda\x9e\x62\x7b\xd6\x59\x3e\x9f\xcc\xa8\x9d\xdf\x69\x75\x2b\x38\x1a\x60\x60\xda\xba\x66\x7a\x0b\x1e\x1e\xd4\x02\x36\x2b\x66\x9f\x18\x98\x23\x0e\xbc\xe0\xcb\xac\x15\x58\x9a\x34\x17\xf9\xb5\x55\xb0\xc2\xaa\x09\xa4\x61\xab\x5a\x9d\x65\x29\xb2\x48\x3e\x2f\x8c\xf3\x14\x2b\x9c\x03\x93\xc0\x9c\x73\x9f\xc1\x02\x91\x9f\x81\xf5\x1e\x0e\x4a\x83\x6e\xab\xee\x41\x46\xe2\xc7\x90\x2d\xdc\x83\xda\x8e\x51\x7f\xc6\x24\xdc\xdd\xcd\xd6\xb8\xdd\xed\x0e\x49\x39\x39\xb3\xe9\xdd\xa2\x36\x84\x39\xe5\x06\x42\x5a\x87\x3d\xc0\x81\x6c\xeb\x39\x89\xb9\x80\x8d\x59\x7b\x0b\x8c\xd3\x5a\x54\x6c\x59\xb0\x46\x14\x2b\x65\x52\xc6\xf5\x96\x7b\xf9\xee\x02\x3e\x7d\x7f\x79\xfd\xfe\x53\x26\xc6\x71\xde\x07\x48\x7f\x7a\x7d\x75\x7d\x71\xf9\x36\x0b\x6f\x6b\x57\xc5\x1a\x53\xda\xa7\x63\xa5\xc5\xef\xee\x0f\xf0\xe9\x87\xd7\xbf\xe4\x20\x2d\x51\xdb\xc2\x99\xe5\x61\xac\x0d\xb3\x2b\x52\x29\x29\x7a\x46\xc0\x19\x36\xf4\x88\x95\x5c\x88\x54\xca\xf1\x87\x0e\x15\x7c\xc5\x71\xc1\xda\xca\x82\x30\xf0\x97\xef\x2f\xdf\xbc\xee\x13\xc3\xd7\x39\x5a\xa9\x2a\xb5\x29\x02\x8e\x54\xa2\x74\x40\xd0\x01\x4d\x63\xed\xa3\xe5\x98\x5e\xba\x08\xdd\x85\xd5\x0c\xd4\x42\x5a\xd4\xf4\x42\x6f\x53\x3a\xf7\xdc\x0e\xe0\xa0\xd1\xaa\x6e\xb2\x18\x5f\xe3\x36\xdb\x9c\x6b\xdc\xe6\x32\xed\xb5\x5c\x33\xc9\x96\x98\x0a\x3e\x9e\xed\x46\xab\xdf\xb0\xb4\x7d\xea\xb5\x0a\xe6\x14\x02\xf4\x1a\x39\x44\x0c\xd3\x14\xbb\xf0\x34\xae\xff\x23\x42\x8b\x43\xdb\x85\xfe\x04\xde\xfe\x7c\x1a\x57\x10\x75\x82\x43\x83\xfa\x16\x75\x85\xc6\x44\xdd\x64\xa0\x36\x56\x8b\x24\x66\xaf\xe8\xd6\xa0\x26\x97\x16\x12\x39\xe8\x56\x5a\x51\x77\xb1\x30\x83\x82\x55\xcb\x65\x85\x05\xa5\xab\x04\x99\xf7\x0e\x02\xbe\xa7\x84\x56\xa3\x31\x6c\x99\xef\x29\xb7\xa8\xe7\xca\xa4\x94\x1c\x4e\x41\xb5\xb6\x69\xc7\xd4\xe1\xc2\x44\x51\x0b\x43\x09\xd3\x05\xc0\x74\xfc\x7b\xbf\x42\x20\x08\x72\xbc\xd2\x07\x41\x72\x70\x61\x40\x2a\x0b\x1e\x55\xab\x91\xcf\x7e\x1d\x53\xcf\x01\xc5\x46\x8c\xe4\x06\xa2\x48\x41\x9c\x40\xbe\x8c\xce\x94\x57\x12\xa5\x0e\xe6\x34\x52\x41\x94\xb1\x8e\xe4\x50\x9e\x8f\x77\x77\x33\xfa\xbd\xdb\xdd\x9c\xc1\x42\xab\x9a\x12\xbb\x51\xad\x2e\x71\xb7\xcb\xa2\xe9\x0d\x36\x45\x93\xc0\xa2\xad\x0c\xda\xd3\x68\x75\xea\x99\xa2\xb6\xa7\x47\x12\xb1\xfb\xc3\xe9\x72\x36\x62\xb9\x29\x98\x6b\xc6\x0a\xab\xd6\x28\x27\x45\xa6\x1b\xe0\x6f\x80\xbb\x71\x9a\xf0\xad\xac\x99\x36\x2b\x56\x15\x95\x2a\x59\x95\xa0\xf8\x21\x42\xc1\x65\x83\xf2\x67\x57\x7d\x84\x88\x61\x3c\x3d\x77\x1b\x6e\x59\xd5\xa2\xc9\x24\x28\xd1\x6e\x94\x5e\x9f\x4c\xd2\xe5\x37\x89\x16\x98\x25\x71\x5b\x5d\x4d\xc8\xda\xa7\xda\xa2\x64\xb2\xc4\xaa\x4a\xa6\xa2\xcb\x1f\x66\xf0\x2f\x0f\x43\x95\x76\x7f\x33\x97\xc0\x82\x89\x34\xf6\x57\x7d\xce\xe7\x82\x87\xb7\x58\x37\x15\x5a\x04\xd3\x92\x49\x17\x6d\x55\x6d\x67\x70\xd5\x4a\xf8\xd4\x15\xa3\x5d\x17\xf7\x89\xd2\x82\xc6\x5a\x51\x66\x67\xda\x0a\x56\x55\xdb\xbe\x5d\x61\xc6\xa0\x1d\xb7\xc2\x80\x53\xdf\xfb\x14\xc6\x32\xdb\xa6\xca\x9f\xa7\x4f\x9f\x3e\x3d\x3f\x3f\x3f\x1f\xd8\x62\x20\xc3\xb5\xbb\x0a\x04\x40\x80\x59\x54\xdd\x5c\x02\x79\x8e\x8a\xa2\x6a\x38\x84\x61\x86\x57\xce\xb8\x93\x9d\x6e\xeb\xe1\xdd\x7c\x22\xa3\xf6\xfe\x30\x80\x1c\xb7\x78\x36\xbd\x29\xfd\xed\x91\x3c\x41\x83\xb1\x2c\x2a\x5c\xab\x39\x5d\xce\x7e\x70\x1d\x29\x45\x43\x2a\x5b\x76\xbb\x1b\x58\x28\x9d\xfb\x6e\x0e\x88\x0d\x05\x3d\x8a\x5c\xb6\xe9\x7c\x17\x5a\xc4\x17\x33\x31\x25\xeb\xba\xd1\x18\xec\x89\xde\x8a\x85\x29\xc1\x50\xa5\xdd\x1b\xcc\xa7\x9e\x1e\xab\xbd\x8a\xe7\xf0\x20\x03\xb3\xd9\x48\xc3\x1f\x48\x44\x85\xfc\x91\x22\xf6\x38\x73\x84\x8c\xd0\x69\x31\x3f\xf4\x10\x27\x08\xca\xb1\x41\xc9\x51\x96\xc7\xe8\xb3\xbf\x34\x24\x74\x1c\x9d\xfe\x15\x26\x95\xfa\xea\x41\x32\x5f\xe2\x39\x0f\x73\x41\xb1\xa7\xd5\xa9\xd2\x6f\x10\x49\xd5\x22\x21\xfa\xff\x31\x0d\x45\x79\x8e\x73\x94\x2f\xb3\xe0\xfd\x48\xfa\xc7\xd8\x30\xf3\x69\xa4\x38\x19\xb7\xe3\x5e\x44\x3f\xd1\x92\x13\x41\x98\x3a\xeb\x53\xd3\x9a\xe3\xc8\x27\x99\xae\x73\x1f\xe3\x05\x78\xab\xc9\x92\x81\xec\x30\x55\xfc\x79\xfe\x16\x65\x5c\xa8\x56\xf2\x22\xf0\x3b\x3e\x93\x7c\x45\x40\xc9\xd8\xb4\x59\x89\x72\x05\x1b\x37\xe4\x27\xbe\xb8\x2f\x4d\xed\x0a\xa1\x6c\xb5\x26\xc5\x44\x01\xe3\x5c\xc3\x25\x2d\xff\x9b\x30\x30\xe3\x64\x21\xfd\x65\xa7\x2f\x3f\xcd\x99\x68\x2e\x7f\x95\xef\x2a\x64\xc6\xcd\x7e\x6e\x05\x47\xc7\x14\xc1\x13\xef\x2e\x5d\x76\xc5\xdc\x0b\x98\xa6\x35\xda\x3a\xdf\xa3\xc5\xe4\x61\x2b\xed\x7a\x94\x0c\x42\x61\xee\x9a\x30\x86\x82\xad\x6a\x41\xa3\xb3\xfc\x86\x49\xdb\x8f\xd0\xc0\xae\x84\xf9\x07\x7c\xb5\x7d\xf6\xf6\xeb\x0c\x3a\x53\x1d\xf3\x7d\x91\x06\x8d\xdf\xc7\x38\x72\x74\x0d\x0f\x75\x5e\xcb\x16\x8d\xbd\xc9\xa0\x1b\x8d\x7c\x94\x84\xdd\xfa\x26\x53\xc6\xc0\x5e\x11\x16\x06\xa9\x09\x78\x58\xb2\x38\x87\x18\x0c\x51\x35\xba\x91\x13\x3f\x03\x56\x0d\xdb\xaf\xee\x5d\x13\x3b\xba\xbb\x11\x77\x35\x4c\x63\xf7\x18\x9f\xf5\xa1\x10\xb8\xd0\x58\xda\x10\x1e\xb5\xdf\x69\x4c\x2d\x50\x5e\x5f\x5d\x5d\x5e\x5d\x27\xf8\x3e\x3f\xfc\x0f\x3c\x38\xdc\x3b\x38\x3f\x1f\x29\x50\xb4\xde\x8f\xc4\x6b\xa9\x36\xb2\xb0\xdb\x66\x24\x93\xc6\x88\x4b\x50\xa4\xaa\x70\x6b\x06\xfd\xca\x00\x94\xac\xb6\x60\xda\xc6\x6f\x13\x9f\xb9\x59\xfd\xcc\x6c\x8d\xc5\x1a\xe6\x42\x72\x21\x97\x06\x94\x86\xa5\xb0\xab\x76\x3e\x2b\x55\xdd\x2d\x76\xc6\x2b\x2a\xcf\x70\x0c\xcd\xa4\xc2\x42\x2a\xeb\x83\xd9\xc8\xa8\xe0\xc1\xc0\x25\xe4\xe1\xe4\xd9\x45\x6a\x87\x8b\x0e\xf7\x37\x4b\x53\x6c\x85\x62\xaf\xd4\xc8\x6c\x4a\x7b\x6e\xdf\x0d\x0e\x64\x2f\x9c\x6e\x84\x5d\x81\x5b\x94\xc7\x21\xe1\x0b\x3a\x44\xad\x77\x3b\xb7\x81\xf4\x67\xa5\xe2\xfe\x80\x7e\x4c\x34\xfa\x03\x96\x7c\x8c\x1f\x65\x89\xdf\x8b\xf0\x7f\x12\x4b\x0b\x44\x5e\x08\x79\xab\xd6\x29\x86\xfe\xed\xd2\x2d\xbd\x78\x0f\xe6\x62\x36\x5d\x83\xcd\xca\x2d\x24\x03\xa7\x71\x23\xe7\x8f\xfe\x1c\x6e\xd7\xb8\xed\xc6\x8b\x35\x93\x9c\x59\xa5\xc7\x46\xa7\x1d\x8c\x9b\xc4\x7d\x8c\xca\xbc\xa1\x67\x12\xf0\x4c\xd2\xec\x1a\xc1\x29\xbf\x7e\x33\x74\xcf\x81\xe7\x32\x0a\x47\x76\x35\xec\x0c\x27\x89\xba\x87\x54\x0b\x53\x33\x5b\xa6\x36\xd3\x7b\xef\x88\x2e\x70\x47\x82\x8f\x3c\x27\x77\x1e\xbb\x53\xae\xd0\xcf\x5c\x1d\x11\x67\x56\x17\x75\x09\xa8\x1e\x20\xd9\x7b\x76\xfe\x34\x8a\x31\x2e\x44\x18\x8d\x91\x7b\xb1\x4a\xa4\xd4\x76\xe1\x4f\x29\xfa\x04\x93\x74\x83\x7f\xa2\x15\x7e\x13\x2f\xfd\xae\x7b\x8f\x2b\xa5\x1d\xef\x7e\x3f\xec\xee\xf8\x9f\x39\x7a\x8e\x2c\x4e\xa8\xfa\xea\x18\x86\x0e\xf4\xea\x9e\x82\xe7\xe8\x89\x01\x3f\x00\xf5\xaa\xc4\xcf\x16\xa5\x89\x4c\xe3\x67\x1b\x67\x06\x5f\x22\x8a\x29\x96\x98\x2a\xbf\xfa\xa7\xbc\x44\xbf\x66\x0e\x29\xa1\x5f\xb6\x84\x39\x66\x9f\x60\x29\xed\x8a\x72\xf0\x7c\x27\x19\x69\x75\x75\xbc\xc9\xfd\xb0\x94\x52\xd8\x6e\x07\x1f\xae\x7e\x74\xc2\xbb\xf1\xa9\xf3\x41\xfa\x17\xe9\xcc\x03\xdc\xe4\x65\x00\x62\xa4\x66\xd5\x42\xe9\x3a\xd9\x2f\xbc\x89\xe7\x63\x1c\xcc\xe0\xbd\xde\x02\x5b\x32\x21\x67\xb3\x49\xb2\xbf\x19\x25\xbb\x28\x55\xd6\x7c\x64\xbd\xfd\x9f\xeb\xcb\xb7\x20\x64\xd3\x5a\xe0\xcc\x32\x78\x13\xb4\xf1\xa4\xac\xf9\x13\x8a\x59\xe3\x94\x58\x23\x3a\x42\x1b\x9c\x17\xde\x59\x52\x1f\x32\x3c\xe0\x54\x71\xeb\xc2\x60\x83\xf3\xee\x0b\x8b\x97\xef\x2e\x3c\x58\x23\x08\xa6\x64\xd2\xd7\x0f\x73\xf4\xa9\x12\x79\xf8\xd8\xa3\xbf\x34\x83\x50\x99\xb6\x0d\x67\xf6\xe0\xe3\x08\x72\xb8\x52\xc9\x5b\xd4\xf6\x80\xbc\x55\x43\x1c\x53\x8a\x1d\x8a\x7b\x92\xa8\xd1\xd9\x9c\x8b\xef\xb1\x98\x25\xf4\x9c\x19\xe4\xa0\xe4\x30\xdc\xdc\x47\x35\xa9\x0a\x21\xcb\xaa\xe5\x78\xc0\x1e\x33\x7b\x56\x48\x2a\xe3\xe7\x97\x57\x6f\x2f\xde\x7e\x97\x5f\x87\xc6\x0b\xc7\x55\xa2\x1b\xa6\x65\x51\xaa\x9a\x32\x68\xa1\xd1\x26\xd3\xec\x15\x9d\xc5\xc1\x67\x59\x73\x27\xcb\xc2\xa2\xf6\x29\xfe\x85\x8f\x6d\x14\x38\x6e\xc6\xec\x1b\xe8\xb9\xcd\xd3\xd1\xc1\x63\xf8\xe5\xc5\x70\xfe\xca\xd1\x62\x69\x27\x26\x1f\x8e\x32\x15\x16\x1c\x1b\x8d\x25\x59\xba\xd0\xd8\x54\xac\x4c\x06\x0d\xca\xbc\x44\x47\x55\x3c\xd4\x13\x6e\xd1\xe7\x1d\x63\x2f\x52\x79\x9e\x36\xa2\xaa\xc0\x28\x25\xc9\x9b\x7a\x32\x67\xd0\x04\x4f\x31\xbe\xaa\x72\xc5\x30\x6e\xf6\x70\x1a\x8b\x2c\x53\x80\xa0\x8e\x53\xea\x21\xb3\x52\x6d\xc5\x89\x3d\x83\x76\x06\x7e\x94\xbd\xdf\x50\x12\xb4\xfb\xe5\x87\x5a\x59\x1c\x39\xf8\x09\x7b\x12\x5f\x9e\x02\xa5\xbe\xfb\x75\x1a\xc5\x27\x77\xff\x18\x92\x54\xab\x19\x76\x3b\x6a\xc1\x29\xa2\xee\x7e\xb4\x6a\x9c\x9c\xc4\xef\xb2\x86\x1f\x64\x4d\x33\x56\x89\x5a\xd8\x42\x2c\xa5\xd2\x49\x96\xa2\x5f\x87\xc0\xe2\xae\x38\xae\xdc\xaf\xc3\x5a\x4c\x18\x08\xe8\x72\xa9\x97\x2b\x26\x97\xc8\xe6\xc9\xcf\x68\x7e\xec\x28\x76\xc5\x9f\x89\x72\x57\x5b\x3f\x34\xeb\x70\xcc\xe0\x82\xc8\x53\x01\x9d\xe1\x0b\x8e\x03\x53\x54\x6a\x59\x18\xf1\x7b\x8a\x81\x4a\x2d\xaf\xc5\xef\x48\xba\xf5\x17\xf6\x24\xee\x5d\x94\x49\xb7\x67\xa5\x66\x63\x8e\x76\x83\x28\xe1\xb9\x6b\x2a\xbe\x79\x9e\xcd\x4a\x8d\xb5\xd2\xdb\x31\x6e\x3c\xc4\xa9\x0c\x7d\xf3\xed\xdf\x1d\x4b\x7f\xfb\xe6\xdb\x6c\x9e\xa8\xfe\x52\x6d\xaa\x78\x0b\xa7\x27\x31\xf3\xdc\xeb\xe7\xaf\xcf\xe9\xbf\x69\x7e\xdc\x78\xa0\x68\xb4\x6a\x50\x5b\x81\xa9\x39\x74\x0c\x83\x83\x78\xe5\xa7\x8e\x56\x0b\xec\xe6\x8e\x7e\xd6\xd0\x23\x8b\xf3\xc9\x87\x63\x62\x0c\x89\x5c\x39\x87\xa3\xc8\x28\x2c\xa8\xd6\x1a\xc1\x9d\x21\xde\x6b\x76\x2b\x0c\xcc\x5b\x51\xf1\xf1\xd9\x84\x13\xc5\x87\x03\x4d\x6e\x9b\x15\x0a\x3a\xef\xdf\x0b\x08\xf2\x20\xaa\x07\x6d\xbb\x89\xcb\xdd\xdd\x2c\xfc\x35\xaa\x9b\x3a\x24\x21\x43\xa3\x4b\xff\x60\xe5\x44\xd9\xec\x58\x8d\xbd\x88\x7f\x64\xa9\x30\x11\x5b\x91\x00\x45\x05\xc5\x41\x57\xf2\x40\x99\x92\x6c\x3c\x4e\xea\x36\x1c\xb7\x61\x96\xe1\x1a\x55\xfc\x2c\x4c\xf2\x33\xc5\x7b\x6d\xea\x5e\x88\x61\x95\x46\xc6\xb7\xe0\x51\x74\xb5\x93\xc1\x0a\x4b\x0b\x4c\x2a\xbb\x42\x3f\x9a\x9b\x66\x29\x4e\xac\xb2\x26\x50\xf7\xbb\xda\x58\x35\x94\x4a\x5a\xe6\x3e\x40\x93\x6a\x7a\x0a\xf6\xea\xf5\x3f\x3f\x7c\x97\x5d\x8c\x39\xe8\xe3\x2a\x31\x3e\xf7\x1f\x40\xde\xa2\x16\x8b\x54\x15\xf6\x93\x3b\x0c\x8d\xd4\x7d\x07\x0e\xda\x1d\x8f\xd4\x44\xa8\xdb\x66\xf9\xb5\xf7\xe4\xd6\xd2\x41\xbd\x98\xc2\x3a\xd8\xa3\x8d\xe2\x1d\x6e\xd3\xf2\x30\x1b\x64\xba\x5c\x11\xde\xb0\xbe\x28\xfc\x64\x37\x3d\x16\xba\x8e\x37\xba\xe5\x47\x77\xe3\xde\xee\xbe\xd7\x60\xaf\xba\x47\x37\x8f\xfe\x17\x00\x00\xff\xff\xfc\x20\x12\xb6\x5e\x33\x00\x00")
+var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5a\x6d\x6f\x1b\x37\xf2\x7f\x9f\x4f\x31\x08\xfe\x40\x5a\xc0\x51\xd2\xfe\x71\xc0\x21\x80\x71\xc8\x5d\xd2\x36\xd7\x26\x0e\xec\xf8\x8a\x22\x35\x36\xd4\x72\xb4\xcb\x6a\x97\x5c\x90\x5c\x2b\xaa\xa1\xef\x7e\x18\x92\xfb\x20\xd9\xdc\xa5\x94\x06\xd7\x37\x55\xcc\xe1\xcc\x6f\x86\xe4\x3c\xee\xc7\x47\x00\x77\x8f\x00\x00\x1e\x0b\xfe\xf8\x05\x3c\xae\x4d\x91\x35\x1a\x57\xe2\x73\x86\x5a\x2b\xfd\xf8\xcc\xaf\x5a\xcd\xa4\xa9\x98\x15\x4a\x12\xd9\x6b\xb7\xf6\x08\x60\x77\x36\xc1\x41\xc8\x95\x8a\x30\x78\x43\x4b\x73\xfb\x4d\x9b\xe7\x68\x4c\x84\xc5\x55\x58\x9d\xe3\xb2\x61\x5a\x0a\x59\x44\xb8\xfc\x1a\x56\xa3\x5c\xf2\x9a\x67\x1c\x4d\x9e\x55\x4a\x16\x99\xc6\x46\x69\x1b\xe1\x75\xe9\x16\x0d\x28\x09\x1c\x9b\x4a\x6d\x91\x03\x4a\x2b\xac\x40\x03\xdf\x88\x05\x2e\xce\xe0\x3d\xcb\xd7\xac\x40\x73\x06\x2f\x73\xda\x67\xce\xe0\x83\x16\x45\x81\xda\x9c\xc1\x65\x5b\xd1\x0a\xda\x7c\xf1\x2d\x30\x03\x1b\xac\x2a\xfa\xbf\xc6\x1c\xa5\x75\x3b\x6e\x9d\x34\x03\x42\x82\x2d\x11\x4c\x83\xb9\x58\x09\xe4\x20\x59\x8d\xa6\x61\x39\x2e\x92\x75\x51\x2a\xa6\xc9\x4b\xb0\x4a\x55\x60\x55\x50\xe4\x0c\x5a\xe9\x7f\x01\x93\x1c\xcc\x56\xe6\xa0\x1a\x94\x9b\x52\x98\x35\x34\x41\x27\x68\x8d\x90\x05\x30\xa8\x99\x14\x2b\x34\xd6\x11\xab\x86\xb8\xb2\x2a\xb0\xaa\x49\x93\x95\xa8\x7a\xf2\xdf\x5e\xbe\xfd\x25\x05\xb3\x29\x95\xb6\xd3\x07\xf0\x5e\xab\x5b\xc1\xd1\x00\x03\xd3\xd6\x35\xd3\x5b\xf0\xf4\xa0\x56\xb0\x29\x99\x7d\x62\x60\x89\x38\x3a\x9e\x2f\x33\x63\x80\x34\x6b\x47\x83\x96\x6c\x59\x62\xd5\x04\xd1\xb0\x55\xad\x4e\x32\x21\x99\x2a\x1d\xcb\x2d\x6a\x43\xb2\x63\xf6\x11\xd2\x3a\x85\x03\x1d\xc8\xb6\x5e\xa2\x76\xe6\x31\x6b\x0f\x6d\x5a\xd6\xaa\x62\x45\xc6\x1a\x91\x95\xca\xc4\xb4\xf6\x2a\xbd\x7c\xff\x06\x3e\xfd\x74\x71\xf5\xe1\x53\x22\xc7\x69\xec\x23\xa6\xff\x79\x7d\x79\xf5\xe6\xe2\x5d\x12\xdf\xd6\x96\xd9\x1a\xb7\x11\xa6\xb4\xac\xb4\xf8\xd3\xfd\x01\x3e\xfd\xfc\xfa\xb7\x14\xa6\x39\x6a\x9b\xd1\xb9\x44\xb8\x36\xcc\x96\x64\x52\x32\xf4\x82\x88\xdd\x21\xa6\x30\x56\x72\x25\x62\x9e\xca\x2f\x3a\x56\xf0\x0d\xc7\x15\x6b\x2b\x0b\xc2\xc0\xff\xfd\x74\xf1\xf6\xf5\xb3\xc5\xc6\xac\x1b\xad\x1a\xf3\x6d\x8a\x55\xaa\x4a\x6d\xb2\xc0\x23\xe6\x5f\x1d\x11\xf4\x44\xf3\x5c\x87\xf7\x3d\x65\x97\xde\xa7\xf4\x8e\x20\x81\xb5\x90\x16\x35\x23\xf7\x17\xb3\xb9\x47\x3b\xa2\x83\x46\xab\xba\x49\x02\xbe\xc6\x6d\xf2\x71\xae\x71\x9b\x0a\xda\x5b\xb9\x66\x92\x15\xc8\x27\x61\x37\x5a\xfd\x81\xb9\x1d\x82\x85\x55\xb0\x44\xa8\x99\x5e\x23\x87\x8e\xc3\xbc\xc4\xce\x69\xcc\xd8\x7f\xcf\xb7\x24\xb0\xed\x7d\x62\x84\xef\xb0\x3e\xcf\x2b\xa8\x3a\x83\xd0\xa0\xbe\x45\x5d\xa1\x31\x9d\x6d\x12\x58\x1b\xab\x45\x94\xb3\x37\x74\x6b\x50\xd3\x95\x16\x12\x39\xe8\x56\x5a\x51\xf7\xbe\x30\x41\x82\x55\x45\x51\x61\x46\x7e\x3c\x22\xe6\x83\xa3\x80\x9f\xc8\xd3\xd7\x68\x0c\x2b\xd2\x6f\xca\x2d\xea\xa5\x32\x31\x23\x87\x55\x50\xad\x6d\xda\x29\x73\x38\x37\x91\xd5\xc2\x50\x24\x71\x0e\x30\xee\xff\x3e\x94\x08\x44\x41\x17\x2f\xf7\x4e\x90\x2e\xb8\x30\x20\x95\x05\xcf\xaa\xd5\xc8\x17\xbf\x4f\x99\xe7\x40\x62\x23\x26\x62\x03\x49\x24\x27\x4e\x24\x5f\x26\x67\xee\x56\x92\xa4\x9e\xe6\x34\x51\x41\x95\xa9\x44\xf6\x50\x9f\x8f\x77\x77\x0b\xfa\xbd\xdb\xdd\x9c\xc1\x4a\xab\x1a\xee\xee\x16\x46\xb5\x3a\xc7\xdd\x2e\x49\xa6\x3f\xb0\x39\x99\x44\xd6\x9d\x95\x41\x7b\x9a\xac\xde\x3c\x73\xd2\xf6\xec\x48\x2a\xf6\x7f\x38\x5d\xcf\x46\x14\x9b\x8c\xb9\x1c\x3e\xb3\x6a\x8d\x72\x56\x65\xda\x01\x7e\x07\xb8\x1d\xa7\x29\xdf\xca\x9a\x69\x53\xb2\x2a\xab\x54\xce\xaa\x88\xc4\xeb\x8e\x0a\x2e\x1a\x94\xbf\xba\xec\x23\x78\x0c\xe3\xe5\xb9\xdd\x70\xcb\xaa\x16\x4d\xa2\x40\x89\x76\xa3\xf4\xfa\x64\x91\x2e\xbe\x49\xb4\xc0\x2c\xa9\xdb\xea\x6a\x46\xd7\x21\xd4\x66\x39\x93\x39\x56\x55\x34\x14\x5d\xfc\xbc\x80\x7f\x79\x1a\x4a\x41\x87\x9d\xa9\x02\x56\x4c\xc4\xb9\xbf\x1a\x62\x3e\x17\x3c\xbc\xc5\xba\xa9\xd0\x22\x98\x96\x8e\x74\xd5\x56\xd5\x76\x01\x97\xad\x84\x4f\x7d\x32\xda\xd7\x1d\x9f\x28\x2c\x68\xac\x15\x45\x76\xa6\xad\x60\x55\xb5\x1d\xf2\x78\x66\x0c\xda\xe9\x53\x18\x21\xf5\x45\x41\x66\x2c\xb3\x6d\x2c\xfd\x79\xfa\xf4\xe9\xd3\xf3\xf3\xf3\xf3\xd1\x59\x8c\x74\xb8\x72\x5b\x81\x08\x88\x30\x49\xaa\x2b\x67\x91\xa7\x98\xa8\x33\x0d\x87\x50\x03\x7b\xe3\x4c\x5f\xb2\xd3\xcf\x7a\xbc\x37\x5d\xc8\xe4\x79\x5f\x8f\x28\xa7\x4f\x3c\x59\xde\x9c\xfd\xf6\x44\x9e\x60\xc1\x2e\x2d\xca\x5c\x0d\x36\x9f\xce\x5e\xbb\x52\x8d\xbc\x21\xa5\x2d\xbb\xdd\x0d\xac\x94\x4e\x7d\x37\x07\xc2\xc6\x8a\x1e\x25\x2e\xf9\xe8\x5c\x6e\xb9\xcd\xba\x17\x33\xd3\x5c\xb9\xbb\xa3\x4c\x77\xb7\xeb\x9d\x3d\xc9\x2b\x59\x28\x9f\xc7\x26\xed\xdf\x60\xba\xf4\x78\x37\xe6\x55\xb7\x0e\x0f\x02\x58\x2c\x26\x2a\xe1\x20\xa2\x33\xc8\x5f\xa9\xe2\xc0\x33\x45\xc9\x8e\x3a\xae\xe6\xf5\x40\x71\x82\xa2\x1c\x1b\x94\x1c\x65\x7e\x8c\x3d\x87\x4d\x63\x41\xc7\xc9\x19\x5e\x61\xd4\xa8\xaf\x1e\x14\xf3\x25\x37\xe7\x61\x14\xe4\x7b\x5a\x1d\x4b\xfd\x46\x9e\x54\xad\x22\xaa\xff\x0f\xc3\x50\xa7\xcf\x71\x17\xe5\xcb\x4e\xf0\xbe\x27\xfd\x6b\xce\x30\xf1\x69\xc4\x90\x4c\x9f\xe3\x9e\x47\x3f\xf1\x24\x67\x9c\x30\x55\xd6\xa7\x86\x35\x87\xc8\x07\x99\xbe\x72\x9f\xc2\x02\xbc\xd5\x74\x92\x41\xec\x38\x54\x7c\xbd\xfb\xd6\xe9\xb8\x52\xad\xe4\x59\xc0\x1b\x5c\x55\xf4\x02\x54\x68\xa3\xbe\x69\x53\x8a\xbc\x84\x8d\x6b\x4b\x13\x2e\xee\x53\x53\x5b\x22\xe4\xad\xd6\x64\x98\x4e\xc1\xae\xaf\xe1\x82\x96\xff\x4d\x1c\x98\x71\xba\x90\xfd\x92\xc3\x97\xef\xe6\xcc\x14\x97\xbf\xcb\xf7\x15\x32\xe3\x7a\x3f\xb7\x82\xa3\x03\x45\xf4\x84\xdd\x85\xcb\x3e\x99\x7b\x01\xf3\xb2\x26\x4b\xe7\x7b\xb2\x98\x3c\x2c\xa5\x5d\x8d\x92\x20\x28\xf4\x5d\x23\x87\xa1\x60\xab\x5a\xd0\xe8\x4e\x7e\xc3\xa4\x1d\x5a\x68\x60\x4b\x61\xfe\x01\xdf\x6c\x9f\xbd\xfb\x36\x41\xce\x5c\xc5\x7c\x5f\xa5\x51\xe1\xf7\xb1\x6b\x39\xba\x82\x87\x2a\xaf\xa2\x45\x63\x6f\x12\xe4\x76\x87\x7c\x94\x86\xfd\xc0\x21\x51\xc7\x00\x2f\x0b\x9d\xf4\x58\x07\xdc\xaf\x3a\xbd\x60\xd4\x44\xd5\xe8\x5a\x4e\xfc\x0c\x58\x35\x2e\xbf\xfa\x77\x4d\x70\x74\xbf\x23\x08\x01\xa6\xb1\x7f\x8c\xcf\x06\x57\x08\x5c\x68\xcc\x6d\x70\x8f\xda\x37\xfb\xe7\x26\x0b\xaf\x2f\x2f\x2f\x2e\xaf\x22\xb8\xcf\x0f\xff\x03\x4f\x0e\xf7\x16\xce\xcf\x27\x12\x14\xad\xf7\x3d\xf1\x5a\xaa\x8d\xcc\xec\xb6\x99\x88\xa4\x9d\xc7\x25\x2a\x32\x55\xd8\xb5\x80\x61\x64\x00\x4a\x56\x5b\x30\x6d\xe3\xe7\x5f\xcf\x5c\xaf\x7e\x61\xb6\xc6\x62\x0d\x4b\x21\xb9\x90\x85\x01\xa5\xa1\x10\xb6\x6c\x97\x8b\x5c\xd5\xfd\xc4\x63\x3a\xa3\xd2\xba\xcb\xaa\x72\x8d\xcc\xc6\x60\xba\x79\x24\x38\x92\x3d\xbf\xb5\x11\xb6\x04\x37\xc8\xec\xba\x71\x2f\x68\x11\xb5\xde\xed\xdc\x70\xca\xaf\xe5\x8a\xfb\x05\xfa\x31\x53\x51\x8f\x20\x79\x67\x3a\x09\x89\xdf\x73\xa5\x5f\x09\xd2\x0a\x91\x67\x42\xde\xaa\x75\x0c\xd0\x0f\x2e\xae\xd1\xd3\xf2\x64\xce\x39\xd2\x36\xd8\x94\x6e\x24\x16\x90\x5a\x3f\x8e\x0c\x4b\x5f\x07\xed\x1a\xb7\x7d\x1f\xaf\x66\x92\x33\xab\xf4\x54\x8f\xb2\xa7\x71\x2d\xaf\x8f\x9d\x31\x6f\xe8\x3e\x06\x3e\xb3\x32\xfb\x8a\x4b\x2a\xeb\xa3\x61\x44\xe0\xdb\x71\x7b\xdc\x05\x73\x47\x0d\x8c\xde\xbd\x2d\xc7\x25\xd8\xac\x50\x7a\xf4\xa4\x69\xcd\x6c\x5e\x4e\x28\xd8\x5f\x0f\xda\xc0\x9d\x08\xde\x05\x5c\x21\x0f\x27\x26\x7e\xbd\x2b\x03\xb9\x42\xdf\xdc\x74\x42\xdc\xb1\x3a\xf7\x46\x44\xf5\x88\xc9\x5e\xdb\xdf\xaf\x76\x6a\x4c\x2b\x11\x7a\x50\x74\xbd\x58\x25\x62\x66\x7b\xe3\x57\xe9\x99\x87\x23\xe9\x3b\xec\x24\x2b\xfc\x26\x2c\xc3\xb4\x75\x0f\x95\xd2\x0e\x3b\x73\x73\x71\xb7\xc7\xff\x4c\xb1\x73\x07\x71\xc6\xd4\x97\xc7\x00\x3a\xb0\xab\x7b\x0a\x1e\xd1\x13\x03\xbe\xd3\xe8\x4d\x89\x9f\x2d\x4a\xd3\x81\xc6\xcf\xb6\x2b\xce\xbf\x44\x15\x93\x15\x18\xcb\x73\x86\xa7\x5c\xa0\x9f\xe7\x06\xdf\x3b\x4c\x35\x42\xc3\x70\x88\x64\x14\xdf\x44\x3e\x7a\xbe\xb3\x40\x5a\x5d\x1d\x7f\xe4\xbe\x2b\x49\xb1\x62\xb7\x83\xeb\xcb\x5f\x9c\xf2\xae\x4f\xe9\xee\x20\xfd\x8b\x6c\xe6\x09\x6e\xfc\x74\x3b\x05\x48\xcd\xaa\x95\xd2\x75\x34\x31\x7f\xdb\xad\x4f\x21\x58\xc0\x07\xbd\x05\x56\x30\x21\x17\x8b\x59\xb1\x7f\x18\x25\x7b\x2f\x95\xd7\x7c\x62\x8e\xfc\xef\xab\x8b\x77\x20\x64\xd3\x5a\xe0\xcc\x32\x78\x1b\xac\xf1\x24\xaf\xf9\x13\xf2\x59\xd3\x92\x58\x23\x7a\x41\x1b\x5c\x66\xfe\xb2\xc4\xbe\x29\x78\xe0\x52\x75\xe3\x0d\x06\x1b\x5c\x86\x6b\x77\xe6\xe6\x12\x8e\xac\x11\x44\x93\x33\xe9\x03\xf5\x12\x7d\xa8\x44\x1e\x3e\x37\x18\x36\x2d\x20\xa4\x80\x6d\xc3\x99\xc5\x03\x9f\x61\x15\xe4\x4a\xde\xa2\xb6\x07\xe2\xad\x1a\xf3\x98\x33\xec\x58\xdd\x93\x54\xed\x2e\x9b\xbb\xe2\x7b\x10\x93\x94\x5e\x32\x83\x1c\x94\x1c\xbb\x9b\xfb\xac\x66\x4d\x21\x64\x5e\xb5\x1c\x0f\xe0\x31\xb3\x77\x0a\x51\x63\xfc\xfa\xf2\xf2\xdd\x9b\x77\x3f\xa6\x27\x7c\xdd\x86\xe3\x52\xbe\x0d\xd3\x32\xcb\x55\x4d\x11\x34\xd3\x68\xa3\x61\xf6\x92\xd6\xba\x0e\x63\x5e\x73\xa7\xcb\xca\xa2\xf6\x21\xfe\x85\xf7\x6d\xe4\x38\x6e\xa6\xce\x37\xc8\x73\x23\x9e\xa3\x9d\xc7\xf8\x13\x87\x71\xa3\x93\xa3\xc5\xdc\xce\xb4\x18\x9c\x64\x4a\x2c\x38\x36\x1a\x73\x3a\xe9\x4c\x63\x53\xb1\x3c\xea\x34\x28\xf2\x92\x1c\x55\xf1\x90\x4f\xb8\x89\x9a\xbf\x18\x7b\x9e\xca\x63\xda\x88\xaa\x02\xa3\x94\xa4\xdb\x34\x88\x39\x83\x26\xdc\x14\xe3\xb3\x2a\x57\x2e\xe3\x66\x8f\xa7\xb1\xc8\x12\x15\x08\xe6\x38\x25\x1f\x32\xa5\x6a\x2b\x4e\xf0\x0c\xda\x05\xf8\x9e\xf1\x7e\xe5\x46\xd4\xee\x97\xef\x1e\x25\x21\x72\xf4\x33\xe7\x49\xb8\xbc\x04\x0a\x7d\xf7\xf3\x34\xf2\x4f\x6e\xff\x31\x22\x29\x57\x33\xec\x76\xf2\x04\xe7\x84\xba\xfd\xdd\xa9\x76\x2d\x8a\xee\x03\xa8\xf1\x97\x4f\xf3\xc0\x2a\x51\x0b\x9b\x89\x42\x2a\x1d\x85\xd4\xdd\xeb\xe0\x58\xdc\x16\x87\xca\xfd\x3a\xcc\xc5\x84\x81\xc0\x2e\x55\x7a\x5e\x32\x59\x20\x5b\x46\xbf\x57\xf9\xa5\x97\xd8\x27\x7f\xa6\xd3\xbb\xda\xfa\xee\x54\xcf\x63\x01\x6f\x48\x3c\x25\xd0\x09\x77\xc1\x21\x30\x59\xa5\x8a\xcc\x88\x3f\x63\x00\x2a\x55\x5c\x89\x3f\x91\x6c\xeb\x37\xec\x69\x3c\x5c\x51\x26\xdd\x40\x93\x8a\x8d\x25\xda\x0d\xa2\x84\xe7\xae\xa8\xf8\xee\x79\x32\x94\x1a\x6b\xa5\xb7\x53\x68\x3c\xc5\xa9\x80\xbe\xfb\xfe\xef\x0e\xd2\xdf\xbe\xfb\x3e\x19\x13\xe5\x5f\xaa\x8d\x25\x6f\x61\xf5\x24\x30\xcf\xbd\x7d\xfe\xff\x39\xfd\x37\x8f\xc7\xd5\xe1\x59\xa3\x55\x83\xda\x0a\x8c\x35\x7c\x3b\x37\x38\xf2\x57\xbe\xbd\x67\xb5\xc0\xbe\xc1\xe7\x8b\xfa\x81\x59\xd7\x08\x7c\xd8\x27\x76\x2e\x91\x2b\x77\xe1\xc8\x33\x0a\x0b\xaa\xb5\x46\x70\x77\x10\x1f\x34\xbb\x15\x06\x96\xad\xa8\xf8\x74\x13\xc0\xa9\xe2\xdd\x81\xa6\x6b\x9b\xe4\x0a\xfa\xdb\xbf\xe7\x10\xe4\x81\x57\x0f\xd6\x76\xad\x8d\xbb\xbb\x45\xf8\x6b\x67\x6e\xaa\x90\x84\x0c\x85\x2e\xfd\x83\xe5\x33\x69\xb3\x83\xda\xd5\x22\xfe\x91\xc5\xdc\x44\x57\x8a\x04\x2a\x4a\x28\x0e\xaa\x92\x07\xd2\x94\x68\xe1\x71\x52\xb5\xe1\xd0\x86\x5e\x86\x2b\x54\xf1\xb3\x30\xd1\xef\x01\xef\x95\xa9\x7b\x2e\x86\x55\x1a\x19\xdf\x82\x67\xd1\xe7\x4e\x06\x2b\xcc\x2d\x30\xa9\x6c\x89\xbe\x07\x36\x0f\xa9\x6b\x0d\xcd\x56\xea\x21\x14\x1e\x54\xb5\x5d\xd6\x90\x2b\x69\x99\xfb\xd2\x4b\xaa\xb4\x76\x93\x93\x3e\x1a\x05\x38\xa3\xa4\x80\x78\xb0\x51\x1e\x22\xce\x61\xed\x4e\x4f\x6b\x68\x2a\x04\xa2\xfd\xcc\x33\x86\xf1\xd5\xeb\x7f\x5e\xff\x98\x9c\x30\x3a\xea\xe3\xb2\x45\xbe\x2c\x86\x99\xa2\x1f\x4d\xcf\x4e\x16\x1d\xd5\x8b\xc9\xe1\xcf\xb2\x18\xcf\xba\x26\xf9\x8e\x27\x5e\x69\x9c\x0d\x32\x9d\x97\xc4\x37\x8c\x18\x32\xdf\x7d\x8d\x77\x94\xae\xba\x1d\xfd\x80\xa2\xdf\x71\x6f\xbe\x3e\x78\x8f\x99\xf8\x38\x98\x6e\xb8\x3a\x7f\xf5\xb5\x39\xe1\xca\x74\xd0\xfa\x37\xe5\xe7\x40\x13\xdf\xac\xbf\x7a\xa0\xd7\x14\x2c\xf2\x02\x7e\x70\x08\x86\xaf\xd5\x5d\x7b\x9b\x98\x1d\x0b\x60\xfa\x3b\xd0\xe3\x31\x8c\x47\x4d\xdd\x68\x34\x40\x7a\x74\xf3\xe8\xbf\x01\x00\x00\xff\xff\x0d\x20\x90\xa6\xe8\x32\x00\x00")
 
 func wski18nResourcesEn_usAllJsonBytes() ([]byte, error) {
 	return bindataRead(
@@ -129,7 +112,7 @@ func wski18nResourcesEn_usAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 13150, mode: os.FileMode(420), modTime: time.Unix(1519437986, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 13032, mode: os.FileMode(420), modTime: time.Unix(1520362388, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -149,7 +132,7 @@ func wski18nResourcesEs_esAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/es_ES.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1518211603, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/es_ES.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1515697090, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -169,7 +152,7 @@ func wski18nResourcesFr_frAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/fr_FR.all.json", size: 101, mode: os.FileMode(420), modTime: time.Unix(1518211603, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/fr_FR.all.json", size: 101, mode: os.FileMode(420), modTime: time.Unix(1515697090, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -189,7 +172,7 @@ func wski18nResourcesIt_itAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/it_IT.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1518211603, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/it_IT.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1515697090, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -209,7 +192,7 @@ func wski18nResourcesJa_jaAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/ja_JA.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1518211603, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/ja_JA.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1515697090, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -229,7 +212,7 @@ func wski18nResourcesKo_krAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/ko_KR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1518211603, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/ko_KR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1515697090, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -249,7 +232,7 @@ func wski18nResourcesPt_brAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/pt_BR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1518211603, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/pt_BR.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1515697090, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -269,7 +252,7 @@ func wski18nResourcesZh_hansAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/zh_Hans.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1518211603, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/zh_Hans.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1515697090, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -289,7 +272,7 @@ func wski18nResourcesZh_hantAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/zh_Hant.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1518211603, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/zh_Hant.all.json", size: 0, mode: os.FileMode(420), modTime: time.Unix(1515697090, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -346,14 +329,14 @@ func AssetNames() []string {
 
 // _bindata is a table, holding each asset generator, mapped to its name.
 var _bindata = map[string]func() (*asset, error){
-	"wski18n/resources/de_DE.all.json":   wski18nResourcesDe_deAllJson,
-	"wski18n/resources/en_US.all.json":   wski18nResourcesEn_usAllJson,
-	"wski18n/resources/es_ES.all.json":   wski18nResourcesEs_esAllJson,
-	"wski18n/resources/fr_FR.all.json":   wski18nResourcesFr_frAllJson,
-	"wski18n/resources/it_IT.all.json":   wski18nResourcesIt_itAllJson,
-	"wski18n/resources/ja_JA.all.json":   wski18nResourcesJa_jaAllJson,
-	"wski18n/resources/ko_KR.all.json":   wski18nResourcesKo_krAllJson,
-	"wski18n/resources/pt_BR.all.json":   wski18nResourcesPt_brAllJson,
+	"wski18n/resources/de_DE.all.json": wski18nResourcesDe_deAllJson,
+	"wski18n/resources/en_US.all.json": wski18nResourcesEn_usAllJson,
+	"wski18n/resources/es_ES.all.json": wski18nResourcesEs_esAllJson,
+	"wski18n/resources/fr_FR.all.json": wski18nResourcesFr_frAllJson,
+	"wski18n/resources/it_IT.all.json": wski18nResourcesIt_itAllJson,
+	"wski18n/resources/ja_JA.all.json": wski18nResourcesJa_jaAllJson,
+	"wski18n/resources/ko_KR.all.json": wski18nResourcesKo_krAllJson,
+	"wski18n/resources/pt_BR.all.json": wski18nResourcesPt_brAllJson,
 	"wski18n/resources/zh_Hans.all.json": wski18nResourcesZh_hansAllJson,
 	"wski18n/resources/zh_Hant.all.json": wski18nResourcesZh_hantAllJson,
 }
@@ -397,20 +380,19 @@ type bintree struct {
 	Func     func() (*asset, error)
 	Children map[string]*bintree
 }
-
 var _bintree = &bintree{nil, map[string]*bintree{
-	"wski18n": {nil, map[string]*bintree{
-		"resources": {nil, map[string]*bintree{
-			"de_DE.all.json":   {wski18nResourcesDe_deAllJson, map[string]*bintree{}},
-			"en_US.all.json":   {wski18nResourcesEn_usAllJson, map[string]*bintree{}},
-			"es_ES.all.json":   {wski18nResourcesEs_esAllJson, map[string]*bintree{}},
-			"fr_FR.all.json":   {wski18nResourcesFr_frAllJson, map[string]*bintree{}},
-			"it_IT.all.json":   {wski18nResourcesIt_itAllJson, map[string]*bintree{}},
-			"ja_JA.all.json":   {wski18nResourcesJa_jaAllJson, map[string]*bintree{}},
-			"ko_KR.all.json":   {wski18nResourcesKo_krAllJson, map[string]*bintree{}},
-			"pt_BR.all.json":   {wski18nResourcesPt_brAllJson, map[string]*bintree{}},
-			"zh_Hans.all.json": {wski18nResourcesZh_hansAllJson, map[string]*bintree{}},
-			"zh_Hant.all.json": {wski18nResourcesZh_hantAllJson, map[string]*bintree{}},
+	"wski18n": &bintree{nil, map[string]*bintree{
+		"resources": &bintree{nil, map[string]*bintree{
+			"de_DE.all.json": &bintree{wski18nResourcesDe_deAllJson, map[string]*bintree{}},
+			"en_US.all.json": &bintree{wski18nResourcesEn_usAllJson, map[string]*bintree{}},
+			"es_ES.all.json": &bintree{wski18nResourcesEs_esAllJson, map[string]*bintree{}},
+			"fr_FR.all.json": &bintree{wski18nResourcesFr_frAllJson, map[string]*bintree{}},
+			"it_IT.all.json": &bintree{wski18nResourcesIt_itAllJson, map[string]*bintree{}},
+			"ja_JA.all.json": &bintree{wski18nResourcesJa_jaAllJson, map[string]*bintree{}},
+			"ko_KR.all.json": &bintree{wski18nResourcesKo_krAllJson, map[string]*bintree{}},
+			"pt_BR.all.json": &bintree{wski18nResourcesPt_brAllJson, map[string]*bintree{}},
+			"zh_Hans.all.json": &bintree{wski18nResourcesZh_hansAllJson, map[string]*bintree{}},
+			"zh_Hant.all.json": &bintree{wski18nResourcesZh_hantAllJson, map[string]*bintree{}},
 		}},
 	}},
 }}
@@ -461,3 +443,4 @@ func _filePath(dir, name string) string {
 	cannonicalName := strings.Replace(name, "\\", "/", -1)
 	return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
 }
+
diff --git a/wski18n/resources/en_US.all.json b/wski18n/resources/en_US.all.json
index b98062ad..7d1a2d77 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -15,10 +15,6 @@
     "id": "msg_prefix_warning",
     "translation": "Warning"
   },
-  {
-    "id": "msg_cmd_desc_long_publish",
-    "translation": "Publish a package to the registry set in ~/.wskprops."
-  },
   {
     "id": "msg_cmd_desc_long_report",
     "translation": "Reports on deployed entities (i.e., Packages, Actions, Triggers, Rules, etc.) as well as recent Activations in the specified namespace."
@@ -27,10 +23,6 @@
     "id": "msg_cmd_desc_long_root",
     "translation": "A tool to deploy, undeploy and sync openwhisk packages using a manifest and optional deployment files using YAML."
   },
-  {
-    "id": "msg_cmd_desc_short_publish",
-    "translation": "Publish a package to a registry."
-  },
   {
     "id": "msg_cmd_desc_short_report",
     "translation": "Provides a summary report of what's been deployed in the specified namespace."
@@ -39,14 +31,6 @@
     "id": "msg_cmd_desc_short_root",
     "translation": "A tool set to help deploy your openwhisk packages using a manifest file."
   },
-  {
-    "id": "msg_cmd_desc_short_add",
-    "translation": "Add an action, feed, trigger or rule to the manifest"
-  },
-  {
-    "id": "msg_cmd_desc_short_add_entity",
-    "translation": "Add a/an {{.key}} to the manifest file"
-  },
   {
     "id": "msg_cmd_desc_short_version",
     "translation": "Print the version number of wskdeploy"
@@ -267,10 +251,6 @@
     "id": "msg_err_dependency_unknown_type",
     "translation": "Dependency type is unknown.  wskdeploy only supports /whisk.system bindings or github.com packages.\n"
   },
-  {
-    "id": "msg_err_deployment_name_not_found",
-    "translation": "The {{.key}} [{{.name}}] in deployment file not found in manifest file.\n"
-  },
   {
     "id": "msg_err_entity_create",
     "translation": "Error creating {{.key}} with error message: {{.err}} and error code: {{.code}}.\n"
@@ -396,12 +376,12 @@
     "translation": "The manifest file [{{.path}}] contained no packages.\n"
   },
   {
-    "id": "DEBUG",
-    "translation": "================= DEBUG ==================="
+    "id": "msg_warn_deployment_name_not_found",
+    "translation": "The {{.key}} [{{.name}}] in the deployment file was not found in the manifest file.\n"
   },
   {
-    "id": "msg_dbg_key_verify",
-    "translation": "Verifying {{.name}} [{{.key}}] exists...\n"
+    "id": "DEBUG",
+    "translation": "================= DEBUG ==================="
   },
   {
     "id": "msg_dbg_deploying_using",
@@ -414,5 +394,17 @@
   {
     "id": "msg_dbg_searching_project_directory",
     "translation": "Searching project directory [{{.path}}] for [{{.key}}]...\n"
+  },
+  {
+    "id": "msg_dbg_deployment_name_found",
+    "translation": "The {{.key}} [{{.name}}] in the deployment file was found in the manifest file.\n"
+  },
+  {
+    "id": "msg_dbg_packages_found_root",
+    "translation": "Deployment file [{{.path}}]: Found packages under root.\n"
+  },
+  {
+    "id": "msg_dbg_packages_found_project",
+    "translation": "Deployment file [{{.path}}]: Found packages under project [{{.name}}].\n"
   }
 ]
diff --git a/wskprint/console.go b/wskprint/console.go
index 94e0f5d4..6e745650 100644
--- a/wskprint/console.go
+++ b/wskprint/console.go
@@ -22,6 +22,8 @@ import (
 	"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
 	"github.com/fatih/color"
 	"github.com/mattn/go-colorable"
+	"os"
+	"strings"
 )
 
 const (
@@ -101,3 +103,17 @@ func PrintOpenWhiskVerbose(verbose bool, message string) {
 func PrintlnOpenWhiskVerbose(verbose bool, message string) {
 	PrintOpenWhiskVerbose(verbose, message+"\n")
 }
+
+// Display "trace" output if either param is true OR we are running Go test verbose (i.e., "go test -v")
+// arg[0] = [/var/folders/nj/2blqqtm500l5ch2d5k0hvqvm0000gn/T/go-build041478919/github.com/apache/incubator-openwhisk-wskdeploy/deployers/_test/deployers.test
+// arg[1] = -test.v=true
+// arg[2] = -test.run=TestDeploymentReader_PackagesBindTrigger]
+// TODO() introduce "trace" as an optional flag (perhaps hidden or picked up from environment)
+func PrintlnOpenWhiskTrace(trace bool, message string) {
+	GO_TEST_VERBOSE := false
+	if len(os.Args) >= 2 {
+		// TODO() move this to an init() routine
+		GO_TEST_VERBOSE = strings.Contains(os.Args[1], "-test.v=true")
+	}
+	PrintOpenWhiskVerbose(GO_TEST_VERBOSE || trace, message+"\n")
+}


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services