Repository: tenable/terrascan (language: python)

Issue:
Support for Terraform v0.13
Terraform v0.13 has been GA for more than a month now and supports the automatic installation of third-party providers and `for_each` for modules and some other extensions, which break Terrascan when used. You can read about the new features [here](https://www.hashicorp.com/blog/announcing-hashicorp-terraform-0-13).

Meanwhile, v0.14 is in [alpha testing now](https://github.com/hashicorp/terraform/releases/tag/v0.14.0-alpha20200910), but it doesn't have such big changes.


Discussion / hints:

Fix patch:
diff --git a/docs/getting-started/usage.md b/docs/getting-started/usage.md
index 790059f9e..032abde1e 100644
--- a/docs/getting-started/usage.md
+++ b/docs/getting-started/usage.md
@@ -118,7 +118,7 @@ Flags:
   -d, --iac-dir string            path to a directory containing one or more IaC files (default ".")
   -f, --iac-file string           path to a single IaC file
   -i, --iac-type string           iac type (helm, k8s, kustomize, terraform)
-      --iac-version string        iac version (helm: v3, k8s: v1, kustomize: v3, terraform: v12)
+      --iac-version string        iac version (helm: v3, k8s: v1, kustomize: v3, terraform: v12, v14)
   -p, --policy-path stringArray   policy path directory
   -t, --policy-type strings       policy type (all, aws, azure, gcp, github, k8s) (default [all])
   -r, --remote-type string        type of remote backend (git, s3, gcs, http)
@@ -240,7 +240,7 @@ $ docker run --rm --name terrascan -p 9010:9010 accurics/terrascan
 Here's an example of how to send a request to the Terrascan server using curl:
 
 ``` Bash
-$ curl -i -F "file=@aws_cloudfront_distribution.tf" localhost:9010/v1/terraform/v12/aws/local/file/scan
+$ curl -i -F "file=@aws_cloudfront_distribution.tf" localhost:9010/v1/terraform/v14/aws/local/file/scan
 HTTP/1.1 100 Continue
 
 HTTP/1.1 200 OK
diff --git a/go.mod b/go.mod
index e5cd3192f..87d94fe73 100644
--- a/go.mod
+++ b/go.mod
@@ -2,15 +2,21 @@ module github.com/accurics/terrascan
 
 go 1.15
 
+replace (
+	k8s.io/api => k8s.io/api v0.19.0
+	k8s.io/apimachinery => k8s.io/apimachinery v0.19.0
+	k8s.io/client-go => k8s.io/client-go v0.19.0
+)
+
 require (
 	github.com/ghodss/yaml v1.0.0
 	github.com/gorilla/mux v1.8.0
 	github.com/hashicorp/go-cleanhttp v0.5.1
-	github.com/hashicorp/go-getter v1.4.2-0.20200106182914-9813cbd4eb02
+	github.com/hashicorp/go-getter v1.5.1
 	github.com/hashicorp/go-retryablehttp v0.6.6
 	github.com/hashicorp/go-version v1.2.0
-	github.com/hashicorp/hcl/v2 v2.3.0
-	github.com/hashicorp/terraform v0.12.28
+	github.com/hashicorp/hcl/v2 v2.8.2
+	github.com/hashicorp/terraform v0.14.4
 	github.com/iancoleman/strcase v0.1.3
 	github.com/mattn/go-isatty v0.0.8
 	github.com/open-policy-agent/opa v0.22.0
@@ -20,12 +26,12 @@ require (
 	github.com/spf13/cobra v1.0.0
 	github.com/zclconf/go-cty v1.7.1
 	go.uber.org/zap v1.16.0
-	golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
+	golang.org/x/mod v0.4.1 // indirect
 	golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f
-	golang.org/x/tools v0.0.0-20201201064407-fd09bd90d85c // indirect
+	golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963 // indirect
 	gopkg.in/src-d/go-git.v4 v4.13.1
 	gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776
 	helm.sh/helm/v3 v3.4.0
-	honnef.co/go/tools v0.0.1-2020.1.6 // indirect
+	honnef.co/go/tools v0.1.0 // indirect
 	sigs.k8s.io/kustomize/api v0.7.1
 )
diff --git a/go.sum b/go.sum
index 18ac43a77..b868cbc7a 100644
--- a/go.sum
+++ b/go.sum
@@ -7,44 +7,72 @@ cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK
 cloud.google.com/go v0.45.1 h1:lRi0CHyU+ytlvylOlFKKq0af6JncuyoRh1J+QJBqQx0=
 cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
 cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go v0.51.0 h1:PvKAVQWCtlGUSlZkGW3QLelKaWq7KYv/MW1EboG8bfM=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
 cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
 cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
 cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM=
 cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
 cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8=
 cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
 cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4=
 cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE=
 github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
-github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
-github.com/Azure/azure-sdk-for-go v36.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
+github.com/Azure/azure-sdk-for-go v45.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
 github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
 github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
+github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
 github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
-github.com/Azure/go-autorest/autorest v0.9.2/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
 github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630=
+github.com/Azure/go-autorest/autorest v0.11.3/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
 github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
-github.com/Azure/go-autorest/autorest/adal v0.8.1-0.20191028180845-3492b2aff503/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
 github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
-github.com/Azure/go-autorest/autorest/azure/cli v0.2.0/go.mod h1:WWTbGPvkAg3I4ms2j2s+Zr5xCGwGqTQh+6M2ZqOczkE=
+github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
+github.com/Azure/go-autorest/autorest/azure/cli v0.4.0/go.mod h1:JljT387FplPzBA31vUcvsetLKF3pec5bdAxjVU4kI2s=
 github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
 github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
+github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
 github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
 github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
 github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
-github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
-github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI=
+github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
+github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
+github.com/Azure/go-autorest/autorest/validation v0.3.0/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E=
 github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
+github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
 github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
+github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
 github.com/Azure/go-ntlmssp v0.0.0-20180810175552-4a21cbd618b4/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
+github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4=
+github.com/ChrisTrenkamp/goxpath v0.0.0-20190607011252-c5096ec8773d/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4=
 github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=
@@ -76,14 +104,12 @@ github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:H
 github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
-github.com/Unknwon/com v0.0.0-20151008135407-28b053d5a292/go.mod h1:KYCjqMOeHpNuTOiFQU6WEcTG7poCJrUs0YgyHNtn1no=
 github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
 github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw=
 github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
 github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
 github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
 github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
-github.com/agl/ed25519 v0.0.0-20150830182803-278e1ec8e8a6/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
 github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
 github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
 github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
@@ -102,7 +128,7 @@ github.com/antchfx/xpath v0.0.0-20190129040759-c8489ed3251e/go.mod h1:Yee4kTMuNi
 github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0/go.mod h1:LzD22aAzDP8/dyiCKFp31He4m2GPjl0AFyzDtZzUu9M=
 github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-github.com/apparentlymart/go-cidr v1.0.1/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
+github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
 github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
 github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFUye+ZcSR6opIgz9Co7WcDx6ZcY+RjfFHoA0I=
 github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
@@ -110,7 +136,9 @@ github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2
 github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
 github.com/apparentlymart/go-textseg/v12 v12.0.0 h1:bNEQyAGak9tojivJNkoqWErVCQbjdL7GzRt3F8NvfJ0=
 github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
-github.com/apparentlymart/go-versions v0.0.2-0.20180815153302-64b99f7cb171/go.mod h1:JXY95WvQrPJQtudvNARshgWajS7jNNlM90altXIPNyI=
+github.com/apparentlymart/go-userdirs v0.0.0-20200915174352-b0c018a67c13/go.mod h1:7kfpUbyCdGJ9fDRCp3fopPQi5+cKNHgTE4ZuNrO71Cw=
+github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU=
+github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM=
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
@@ -126,14 +154,12 @@ github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:o
 github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
 github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
 github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=
-github.com/aws/aws-sdk-go v1.25.3/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
 github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-github.com/aws/aws-sdk-go v1.30.12 h1:KrjyosZvkpJjcwMk0RNxMZewQ47v7+ZkbQDXjWsJMs8=
-github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
+github.com/aws/aws-sdk-go v1.31.9 h1:n+b34ydVfgC30j0Qm69yaapmjejQPW2BoDBX7Uy/tLI=
+github.com/aws/aws-sdk-go v1.31.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
 github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
 github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
@@ -143,7 +169,6 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
 github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
 github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
 github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
-github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
 github.com/bmatcuk/doublestar v1.1.5/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE=
 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
 github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
@@ -164,6 +189,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
 github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
 github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
@@ -207,7 +233,6 @@ github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
-github.com/dnaeon/go-vcr v0.0.0-20180920040454-5637cf3d8a31/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
 github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
 github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
 github.com/docker/distribution v0.0.0-20191216044856-a8371794149d/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
@@ -230,19 +255,17 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m
 github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
 github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
-github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
-github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw=
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
 github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
 github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
 github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
 github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses=
 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
@@ -253,7 +276,6 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjr
 github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
 github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
 github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
-github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
@@ -269,7 +291,9 @@ github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0
 github.com/go-critic/go-critic v0.3.5-0.20190904082202-d79a9f0c64db/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA=
 github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w=
 github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
@@ -364,27 +388,30 @@ github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6
 github.com/godror/godror v0.13.3/go.mod h1:2ouUT4kdhUBk7TAkHWD4SN0CdI0pgEQbo8FVHhbSKWg=
 github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
+github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
-github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
-github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE=
 github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
 github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA=
 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
 github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v0.0.0-20181025225059-d3de96c4c28e/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
 github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -392,8 +419,8 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk=
 github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
 github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
@@ -425,21 +452,29 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
 github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
-github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
@@ -449,13 +484,12 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k=
 github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
 github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
-github.com/gophercloud/gophercloud v0.0.0-20190208042652-bc37892e1968/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4=
-github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
-github.com/gophercloud/utils v0.0.0-20190128072930-fbb6ab446f01/go.mod h1:wjDF8z83zTeg5eMLml5EBSlAhbF7G8DobyI1YsMuyzw=
+github.com/gophercloud/gophercloud v0.6.1-0.20191122030953-d8ac278c1c9d/go.mod h1:ozGNgr9KYOVATV5jsgHl/ceCDXGuguqOZAzoQ/2vcNM=
+github.com/gophercloud/gophercloud v0.10.1-0.20200424014253-c3bfe50899e5/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss=
+github.com/gophercloud/utils v0.0.0-20200423144003-7c72efc7435d/go.mod h1:ehWUbLQJPqS0Ep+CxeD559hsm9pthPXadJNKwZkp43w=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
 github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
@@ -476,22 +510,21 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf
 github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/hashicorp/aws-sdk-go-base v0.4.0/go.mod h1:eRhlz3c4nhqxFZJAahJEFL7gh6Jyj5rQmQc7F9eHFyQ=
+github.com/hashicorp/aws-sdk-go-base v0.6.0/go.mod h1:2fRjWDv3jJBeN6mVWFHV6hFTNeFBx2gpDLQaZNxUVAY=
 github.com/hashicorp/consul v0.0.0-20171026175957-610f3c86a089/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI=
 github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
 github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
 github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-azure-helpers v0.10.0/go.mod h1:YuAtHxm2v74s+IjQwUG88dHBJPd5jL+cXr5BGVzSKhE=
+github.com/hashicorp/go-azure-helpers v0.12.0/go.mod h1:Zc3v4DNeX6PDdy7NljlYpnrdac1++qNW0I4U+ofGwpg=
 github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg=
 github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
 github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-getter v1.4.2-0.20200106182914-9813cbd4eb02 h1:l1KB3bHVdvegcIf5upQ5mjcHjs2qsWnKh4Yr9xgIuu8=
-github.com/hashicorp/go-getter v1.4.2-0.20200106182914-9813cbd4eb02/go.mod h1:7qxyCd8rBfcShwsvxgIguu4KbS3l8bUCwg2Umn7RjeY=
+github.com/hashicorp/go-getter v1.5.1 h1:lM9sM02nvEApQGFgkXxWbhfqtyN+AyhQmi+MaMdBDOI=
+github.com/hashicorp/go-getter v1.5.1/go.mod h1:a7z7NPPfNQpJWcn4rSWFtdrSldqLdLPEF3d8nFMsSLM=
 github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
-github.com/hashicorp/go-hclog v0.0.0-20181001195459-61d530d6c27f/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
 github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
 github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
 github.com/hashicorp/go-immutable-radix v0.0.0-20180129170900-7f3cd4390caa/go.mod h1:6ij3Z20p+OhOkCSrA0gImAWoHYQRGbnlcuk6XYTiaRw=
@@ -499,7 +532,6 @@ github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh
 github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
 github.com/hashicorp/go-msgpack v0.5.4/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
 github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
-github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
 github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
 github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=
 github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
@@ -517,34 +549,32 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv
 github.com/hashicorp/go-tfe v0.8.1/go.mod h1:XAV72S4O1iP8BDaqiaPLmL2B4EE6almocnOn8E8stHc=
 github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E=
 github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f h1:UdxlrJz4JOnY8W+DbLISwf2B8WXEolNRA8BGCwI9jws=
 github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
 github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/hashicorp/hcl/v2 v2.0.0/go.mod h1:oVVDG71tEinNGYCxinCYadcmKU9bglqW9pV3txagJ90=
-github.com/hashicorp/hcl/v2 v2.3.0 h1:iRly8YaMwTBAKhn1Ybk7VSdzbnopghktCD031P8ggUE=
-github.com/hashicorp/hcl/v2 v2.3.0/go.mod h1:d+FwDBbOLvpAM3Z6J7gPj/VoAGkNe/gm352ZhjJ/Zv8=
-github.com/hashicorp/hil v0.0.0-20190212112733-ab17b08d6590/go.mod h1:n2TSygSNwsLJ76m8qFXTSc7beTb+auJxYdqrnoqwZWE=
+github.com/hashicorp/hcl/v2 v2.8.2 h1:wmFle3D1vu0okesm8BTLVDyJ6/OL9DCLUwn0b2OptiY=
+github.com/hashicorp/hcl/v2 v2.8.2/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yIfAEN3jqY=
 github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
 github.com/hashicorp/memberlist v0.1.0/go.mod h1:ncdBp14cuox2iFOq3kDiquKU6fqsTBc3W6JvZwjxxsE=
 github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
 github.com/hashicorp/serf v0.0.0-20160124182025-e4ec8cc423bb/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE=
 github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/hashicorp/terraform v0.12.28 h1:mBA+A9dvMXk1xDpflKEP5mL/KOD0sXap+M4F4Vlgnvc=
-github.com/hashicorp/terraform v0.12.28/go.mod h1:CBxNAiTW0pLap44/3GU4j7cYE2bMhkKZNlHPcr4P55U=
+github.com/hashicorp/terraform v0.14.4 h1:PZFImSTFl3cSxbefHOvEvId2l4I+ozwceLr0t9ka658=
+github.com/hashicorp/terraform v0.14.4/go.mod h1:q7VVurTsAQV89N/1TaaDIKWnvPbBI/4x0ob+vcHpFrQ=
 github.com/hashicorp/terraform-config-inspect v0.0.0-20191212124732-c6ae6269b9d7/go.mod h1:p+ivJws3dpqbp1iP84+npOyAmTTOLMgCzrXd3GSdn/A=
-github.com/hashicorp/terraform-svchost v0.0.0-20191011084731-65d371908596 h1:hjyO2JsNZUKT1ym+FAdlBEkGPevazYsmVgIMw7dVELg=
-github.com/hashicorp/terraform-svchost v0.0.0-20191011084731-65d371908596/go.mod h1:kNDNcF7sN4DocDLBkQYz73HGKwN1ANB1blq4lIYLYvg=
-github.com/hashicorp/vault v0.10.4/go.mod h1:KfSyffbKxoVyspOdlaGVjIuwLobi07qD1bAbosPMpP0=
+github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 h1:HKLsbzeOsfXmKNpr3GiT18XAblV0BjCbzL8KQAMZGa0=
+github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734/go.mod h1:kNDNcF7sN4DocDLBkQYz73HGKwN1ANB1blq4lIYLYvg=
 github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
+github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs=
@@ -554,8 +584,9 @@ github.com/iancoleman/strcase v0.1.3 h1:dJBk1m2/qjL1twPLf68JND55vvivMupZ4wIzE8CT
 github.com/iancoleman/strcase v0.1.3/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ=
 github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
+github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
@@ -573,10 +604,8 @@ github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqx
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 github.com/joyent/triton-go v0.0.0-20180313100802-d8f9c0314926/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA=
 github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok=
 github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -589,7 +618,6 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
 github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
 github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
-github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@@ -598,12 +626,10 @@ github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0
 github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
 github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -645,33 +671,32 @@ github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7
 github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI=
 github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
 github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc=
-github.com/masterzen/winrm v0.0.0-20190223112901-5e5c9a7fe54b/go.mod h1:wr1VqkwW0AB5JS0QLy5GpVMS9E3VtRoSYXUYyVk46KY=
+github.com/masterzen/simplexml v0.0.0-20190410153822-31eea3082786/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc=
+github.com/masterzen/winrm v0.0.0-20200615185753-c42b5136ff88/go.mod h1:a2HXwefeat3evJHxFXSayvRHpYEPJYtErl4uIzfaUqY=
 github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
 github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
 github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
 github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI=
 github.com/mattn/go-runewidth v0.0.0-20181025052659-b20a3daf6a39/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
 github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/mattn/go-shellwords v1.0.4/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
 github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
 github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
-github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
 github.com/miekg/dns v1.0.8/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
 github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
 github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
 github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
@@ -687,16 +712,16 @@ github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZX
 github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
 github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
 github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
-github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ=
+github.com/mitchellh/gox v1.0.1/go.mod h1:ED6BioOGXMswlXa2zxfh/xdd5QhwYliBFn9V18Ap4z4=
 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
 github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
 github.com/mitchellh/panicwrap v1.0.0/go.mod h1:pKvZHwWrZowLUzftuFq7coarnxbBXU4aQh3N0BJOeeA=
 github.com/mitchellh/prefixedio v0.0.0-20190213213902-5733675afd51/go.mod h1:kB1naBgV9ORnkiTVeyJOI1DavaJkG4oNIq0Af6ZVKUo=
-github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
 github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE=
+github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
 github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
@@ -729,13 +754,11 @@ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtb
 github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
-github.com/olekukonko/tablewriter v0.0.1 h1:b3iUnf1v+ppJiOfNX4yxxqfWKMQPZR5yoh8urCTFX88=
 github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
 github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ=
 github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
 github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw=
 github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -764,7 +787,7 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS
 github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
 github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
 github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
-github.com/packer-community/winrmcp v0.0.0-20180102160824-81144009af58/go.mod h1:f6Izs6JvFTdnRbziASagjZ2vmf55NSIkC/weStxCHqk=
+github.com/packer-community/winrmcp v0.0.0-20180921211025-c76d91c1e7db/go.mod h1:f6Izs6JvFTdnRbziASagjZ2vmf55NSIkC/weStxCHqk=
 github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/paulmach/orb v0.1.3/go.mod h1:VFlX/8C+IQ1p6FTRRKzKoOPJnvEtA5G0Veuqwbu//Vk=
@@ -844,7 +867,6 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d/go.mod h1:w5+eXa0mYznDkHaMCXA4XYffjlH+cy1oyKbfzJXa2Do=
-github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
 github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
@@ -868,29 +890,24 @@ github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJ
 github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg=
 github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v0.0.0-20181021141114-fe5e611709b0 h1:BgSbPgT2Zu8hDen1jJDGLWO8voaSRVrwsk18Q/uSh5M=
 github.com/spf13/cobra v0.0.0-20181021141114-fe5e611709b0/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
 github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
 github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
-github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v0.0.0-20181024212040-082b515c9490/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
@@ -910,7 +927,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
 github.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@@ -918,17 +934,15 @@ github.com/svanharmelen/jsonapi v0.0.0-20180618144545-0c0828c3f16d/go.mod h1:BST
 github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 github.com/tencentcloud/tencentcloud-sdk-go v3.0.82+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4=
 github.com/tencentyun/cos-go-sdk-v5 v0.0.0-20190808065407-f07404cefc8c/go.mod h1:wk2XFUg6egk4tSDNZtXeKfe2G6690UVyt163PuUxBZk=
-github.com/terraform-providers/terraform-provider-openstack v1.15.0/go.mod h1:2aQ6n/BtChAl1y2S60vebhyJyZXBsuAI5G4+lHrT1Ew=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/tombuildsstuff/giovanni v0.12.0/go.mod h1:qJ5dpiYWkRsuOSXO8wHbee7+wElkLNfWVolcf59N84E=
 github.com/ugorji/go v0.0.0-20180813092308-00b869d2f4a5/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
-github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok=
-github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
 github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ=
 github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
@@ -943,7 +957,6 @@ github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOV
 github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
 github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
 github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
-github.com/vmihailenco/msgpack v4.0.1+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
 github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
 github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
 github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70=
@@ -964,7 +977,9 @@ github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6Ut
 github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 github.com/yashtewari/glob-intersection v0.0.0-20180916065949-5c77d914dd0b h1:vVRagRXf67ESqAb72hG2C/ZwI8NtJF2u2V76EsuOHGY=
 github.com/yashtewari/glob-intersection v0.0.0-20180916065949-5c77d914dd0b/go.mod h1:HptNXiXVDcJjXe9SqMd0v2FsL9f8dz4GnXgltU6q/co=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yujunz/go-getter v1.5.1-lite.0.20201201013212-6d9c071adddf h1:gvEmqF83GB8R5XtrMseJb6A6R0OCtNAS8f4TmZg2dGc=
 github.com/yujunz/go-getter v1.5.1-lite.0.20201201013212-6d9c071adddf/go.mod h1:bL0Pr07HEdsMZ1WBqZIxXj96r5LnFsY4LgPaPEGkw1k=
@@ -974,11 +989,9 @@ github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go
 github.com/zclconf/go-cty v1.0.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
 github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
 github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
-github.com/zclconf/go-cty v1.2.1 h1:vGMsygfmeCl4Xb6OA5U5XVAaQZ69FvoG7X2jUtQujb8=
-github.com/zclconf/go-cty v1.2.1/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
 github.com/zclconf/go-cty v1.7.1 h1:AvsC01GMhMLFL8CgEYdHGM+yLnnDOwhPAYcgTkeF0Gw=
 github.com/zclconf/go-cty v1.7.1/go.mod h1:VDR4+I79ubFBGm1uJac1226K5yANQFHeauxPBoP54+o=
-github.com/zclconf/go-cty-yaml v1.0.1/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0=
+github.com/zclconf/go-cty-yaml v1.0.2/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0=
 github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
@@ -991,34 +1004,27 @@ go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qL
 go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs=
 go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.starlark.net v0.0.0-20190528202925-30ae18b8564f/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg=
 go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc=
 go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
-go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=
 go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
 go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc=
 go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
 go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
 go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o=
 go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU=
 go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM=
 go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
@@ -1026,7 +1032,6 @@ golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnf
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190222235706-ffb98f73852f/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -1042,18 +1047,22 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181023182221-1baf3a9d7d67/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1064,8 +1073,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
 golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=
 golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
 golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
@@ -1073,9 +1082,11 @@ golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCc
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY=
+golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1102,33 +1113,45 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs=
 golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc=
+golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1140,7 +1163,6 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1151,6 +1173,7 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190509141414-a5b02f93d862/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1158,29 +1181,40 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -1221,7 +1255,6 @@ golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDq
 golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws=
 golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1229,16 +1262,39 @@ golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e h1:aZzprAO9/8oim3qStq3wc1Xuxx4QmAGriC4VU4ojemQ=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191203134012-c197fd4bf371/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200609164405-eb789aa7ce50/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20201201064407-fd09bd90d85c h1:D/mVYXCk6gUcyr7WuGlAk/ShHqgARUXc2VQxo27Hmws=
-golang.org/x/tools v0.0.0-20201201064407-fd09bd90d85c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
+golang.org/x/tools v0.0.0-20201028111035-eafbe7b904eb/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963 h1:K+NlvTLy0oONtRtkl1jRD9xIhnItbG2PiE7YOdjPb+k=
+golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1249,18 +1305,29 @@ google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMt
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0 h1:jbyannxz0XFD3zdjgrSUsaJbgpH4eTrkdhRChkHPfO8=
 google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
 google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/api v0.34.0 h1:k40adF3uR+6x/+hO5Dh4ZFUqFp67vxvbpafFiJxl10A=
+google.golang.org/api v0.34.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
 google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
@@ -1271,12 +1338,31 @@ google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRn
 google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
 google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d h1:92D1fum1bJLKSdr11OJ+54YeCMCGYIygTA7R/YZxH5M=
+google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
@@ -1288,10 +1374,16 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij
 google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
 google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.1 h1:SfXqXS5hkufcdZ/mHtYCh53P2b+92WQq/DZcKLgsFRs=
+google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -1300,13 +1392,13 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
 google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
 google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1354,54 +1446,48 @@ honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWh
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.6 h1:W18jzjh8mfPez+AwGLxmOImucz/IFjpNlrKVnaj2YVc=
-honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY=
-k8s.io/api v0.17.0 h1:H9d/lw+VkZKEVIUc8F3wgiQ+FUXTTr21M87jXLU7yqM=
-k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI=
-k8s.io/api v0.19.2 h1:q+/krnHWKsL7OBZg/rxnycsl9569Pud76UJ77MvKXms=
-k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.1.0 h1:AWNL1W1i7f0wNZ8VwOKNJ0sliKvOF/adn0EHenfUh+c=
+honnef.co/go/tools v0.1.0/go.mod h1:XtegFAyX/PfluP4921rXU5IkjkqBCDnUq4W8VCIoKvM=
+k8s.io/api v0.19.0 h1:XyrFIJqTYZJ2DU7FBE/bSPz7b1HvbVBuBf07oeo6eTc=
+k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw=
 k8s.io/apiextensions-apiserver v0.19.2 h1:oG84UwiDsVDu7dlsGQs5GySmQHCzMhknfhFExJMz9tA=
 k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg=
-k8s.io/apimachinery v0.17.0 h1:xRBnuie9rXcPxUkDizUsGvPf1cnlZCFu210op7J7LJo=
-k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg=
-k8s.io/apimachinery v0.19.2 h1:5Gy9vQpAGTKHPVOh5c4plE274X8D/6cuEiTO2zve7tc=
-k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
+k8s.io/apimachinery v0.19.0 h1:gjKnAda/HZp5k4xQYjL0K/Yb66IvNqjthCb03QlKpaQ=
+k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
 k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA=
 k8s.io/cli-runtime v0.19.2/go.mod h1:CMynmJM4Yf02TlkbhKxoSzi4Zf518PukJ5xep/NaNeY=
-k8s.io/client-go v0.17.0 h1:8QOGvUGdqDMFrm9sD6IUFl256BcffynGoe80sxgTEDg=
-k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k=
-k8s.io/client-go v0.19.2 h1:gMJuU3xJZs86L1oQ99R4EViAADUPMHHtS9jFshasHSc=
-k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA=
+k8s.io/client-go v0.19.0 h1:1+0E0zfWFIWeyRhQYWzimJOyAk2UT7TiARaLNwJCf7k=
+k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU=
 k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk=
 k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo=
 k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
-k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
 k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
 k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
 k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A=
 k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
-k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU=
 k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
 k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ=
 k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
 k8s.io/kubectl v0.19.2/go.mod h1:4ib3oj5ma6gF95QukTvC7ZBMxp60+UEAhDPjLuBIrV4=
 k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
 k8s.io/metrics v0.19.2/go.mod h1:IlLaAGXN0q7yrtB+SV0q3JIraf6VtlDr+iuTcX21fCU=
-k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
+k8s.io/utils v0.0.0-20200411171748-3d5a2fe318e4/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg=
 k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
 mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
 mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0=
 sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0=
 sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
diff --git a/pkg/cli/run.go b/pkg/cli/run.go
index 0264d6b8f..55118c401 100644
--- a/pkg/cli/run.go
+++ b/pkg/cli/run.go
@@ -46,7 +46,7 @@ type ScanOptions struct {
 	// IaC type (terraform)
 	iacType string
 
-	// IaC version (for terraform:v12)
+	// IaC version (for terraform:v14)
 	iacVersion string
 
 	// Path to a single IaC file
diff --git a/pkg/iac-providers/register.go b/pkg/iac-providers/register.go
index 0febfc059..2c7e8703d 100644
--- a/pkg/iac-providers/register.go
+++ b/pkg/iac-providers/register.go
@@ -34,13 +34,15 @@ func RegisterIacProvider(iacType supportedIacType, iacVersion, defaultIacVersion
 		iacVersion = defaultIacVersion
 	}
 
-	// version support
-	supportedTerraformVersions := make(map[supportedIacVersion]reflect.Type)
-	supportedTerraformVersions[iacVersion] = iacProvider
+	if IacVersionMap, IacExists := supportedIacProviders[iacType]; IacExists {
+		IacVersionMap[iacVersion] = iacProvider
+	} else {
+		// version support
+		supportedIacVersions := make(map[supportedIacVersion]reflect.Type)
+		supportedIacVersions[iacVersion] = iacProvider
+		supportedIacProviders[iacType] = supportedIacVersions
+	}
 
 	// default version
 	defaultIacVersions[iacType] = defaultIacVersion
-
-	// type support
-	supportedIacProviders[iacType] = supportedTerraformVersions
 }
diff --git a/pkg/iac-providers/terraform.go b/pkg/iac-providers/terraform.go
index 028899d91..73e207a60 100644
--- a/pkg/iac-providers/terraform.go
+++ b/pkg/iac-providers/terraform.go
@@ -4,18 +4,21 @@ import (
 	"reflect"
 
 	tfv12 "github.com/accurics/terrascan/pkg/iac-providers/terraform/v12"
+	tfv14 "github.com/accurics/terrascan/pkg/iac-providers/terraform/v14"
 )
 
 // terraform specific constants
 const (
-	terraform               supportedIacType    = "terraform"
-	terraformV12            supportedIacVersion = "v12"
-	terraformDefaultVersion                     = terraformV12
+	terraform    supportedIacType    = "terraform"
+	terraformV14 supportedIacVersion = "v14"
+	terraformV12 supportedIacVersion = "v12"
+
+	terraformDefaultVersion = terraformV12
 )
 
 // register terraform as an IaC provider with terrascan
 func init() {
-
 	// register iac provider
 	RegisterIacProvider(terraform, terraformV12, terraformDefaultVersion, reflect.TypeOf(tfv12.TfV12{}))
+	RegisterIacProvider(terraform, terraformV14, terraformDefaultVersion, reflect.TypeOf(tfv14.TfV14{}))
 }
diff --git a/pkg/iac-providers/terraform/v12/convert.go b/pkg/iac-providers/terraform/commons/convert.go
similarity index 99%
rename from pkg/iac-providers/terraform/v12/convert.go
rename to pkg/iac-providers/terraform/commons/convert.go
index 1e2d92e0b..5d3c42482 100644
--- a/pkg/iac-providers/terraform/v12/convert.go
+++ b/pkg/iac-providers/terraform/commons/convert.go
@@ -14,7 +14,7 @@
     limitations under the License.
 */
 
-package tfv12
+package commons
 
 /*
 	Following code has been borrowed and modifed from:
diff --git a/pkg/iac-providers/terraform/v12/cty-converters.go b/pkg/iac-providers/terraform/commons/cty-converters.go
similarity index 99%
rename from pkg/iac-providers/terraform/v12/cty-converters.go
rename to pkg/iac-providers/terraform/commons/cty-converters.go
index c31779d84..89c4eec96 100644
--- a/pkg/iac-providers/terraform/v12/cty-converters.go
+++ b/pkg/iac-providers/terraform/commons/cty-converters.go
@@ -14,7 +14,7 @@
     limitations under the License.
 */
 
-package tfv12
+package commons
 
 import (
 	"fmt"
diff --git a/pkg/iac-providers/terraform/commons/load-dir.go b/pkg/iac-providers/terraform/commons/load-dir.go
new file mode 100644
index 000000000..9aae1aa2a
--- /dev/null
+++ b/pkg/iac-providers/terraform/commons/load-dir.go
@@ -0,0 +1,186 @@
+/*
+    Copyright (C) 2020 Accurics, Inc.
+
+	Licensed 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 commons
+
+import (
+	"fmt"
+	"os"
+	"path/filepath"
+
+	"github.com/accurics/terrascan/pkg/iac-providers/output"
+	"github.com/accurics/terrascan/pkg/utils"
+	version "github.com/hashicorp/go-version"
+	"github.com/hashicorp/hcl/v2"
+	hclConfigs "github.com/hashicorp/terraform/configs"
+	"github.com/spf13/afero"
+	"go.uber.org/zap"
+)
+
+var (
+	// ErrEmptyTFConfigDir error
+	ErrEmptyTFConfigDir = fmt.Errorf("directory has no terraform files")
+	// ErrLoadConfigDir error
+	ErrLoadConfigDir = fmt.Errorf("failed to load terraform allResourcesConfig dir")
+	// ErrBuildTFConfigDir error
+	ErrBuildTFConfigDir = fmt.Errorf("failed to build terraform allResourcesConfig")
+)
+
+// ModuleConfig contains the *hclConfigs.Config for every module in the
+// unified config tree along with *hclConfig.ModuleCall made by the parent
+// module. The ParentModuleCall helps in resolving references for variables
+// initilaized in the parent ModuleCall
+type ModuleConfig struct {
+	Config           *hclConfigs.Config
+	ParentModuleCall *hclConfigs.ModuleCall
+}
+
+// LoadIacDir starts traversing from the given rootDir and traverses through
+// all the descendant modules present to create an output list of all the
+// resources present in rootDir and descendant modules
+func LoadIacDir(absRootDir string) (allResourcesConfig output.AllResourceConfigs, err error) {
+
+	// create a new config parser
+	parser := hclConfigs.NewParser(afero.NewOsFs())
+
+	// check if the directory has any tf config files (.tf or .tf.json)
+	if !parser.IsConfigDir(absRootDir) {
+		zap.S().Errorf("directory '%s' has no terraform config files", absRootDir)
+		return allResourcesConfig, ErrEmptyTFConfigDir
+	}
+
+	// load root config directory
+	rootMod, diags := parser.LoadConfigDir(absRootDir)
+	if diags.HasErrors() {
+		zap.S().Errorf("failed to load terraform config dir '%s'. error:\n%+v\n", absRootDir, diags)
+		return allResourcesConfig, ErrLoadConfigDir
+	}
+
+	// create a new remote module installer to install remote modules
+	r := NewRemoteModuleInstaller()
+	defer r.CleanUp()
+
+	// using the BuildConfig and ModuleWalkerFunc to traverse through all
+	// descendant modules from the root module and create a unified
+	// configuration of type *configs.Config
+	// Note: currently, only Local paths are supported for Module Sources
+	versionI := 0
+	unified, diags := hclConfigs.BuildConfig(rootMod, hclConfigs.ModuleWalkerFunc(
+		func(req *hclConfigs.ModuleRequest) (*hclConfigs.Module, *version.Version, hcl.Diagnostics) {
+
+			// figure out path sub module directory, if it's remote then download it locally
+			var pathToModule string
+			if isLocalSourceAddr(req.SourceAddr) {
+				// determine the absolute path from root module to the sub module
+				// since we start at the end of the path, we need to assemble
+				// the parts in reverse order
+
+				pathToModule = req.SourceAddr
+				for p := req.Parent; p != nil; p = p.Parent {
+					pathToModule = filepath.Join(p.SourceAddr, pathToModule)
+				}
+				pathToModule = filepath.Join(absRootDir, pathToModule)
+				zap.S().Debugf("processing local module %q", pathToModule)
+			} else {
+				// temp dir to download the remote repo
+				tempDir := filepath.Join(os.TempDir(), utils.GenRandomString(6))
+
+				// Download remote module
+				pathToModule, err = r.DownloadModule(req.SourceAddr, tempDir)
+				if err != nil {
+					zap.S().Errorf("failed to download remote module %q. error: '%v'", req.SourceAddr, err)
+				}
+			}
+
+			// load sub module directory
+			subMod, diags := parser.LoadConfigDir(pathToModule)
+			version, _ := version.NewVersion(fmt.Sprintf("1.0.%d", versionI))
+			versionI++
+			return subMod, version, diags
+		},
+	))
+	if diags.HasErrors() {
+		zap.S().Errorf("failed to build unified config. errors:\n%+v\n", diags)
+		return allResourcesConfig, ErrBuildTFConfigDir
+	}
+
+	/*
+		The "unified" config created from BuildConfig in the previous step
+		represents a tree structure with rootDir module being at its root and
+		all the sub modules being its children, and these children can have
+		more children and so on...
+
+		Now, using BFS we traverse through all the submodules using the classic
+		approach of using a queue data structure
+	*/
+
+	// queue of for BFS, add root module config to it
+	root := &ModuleConfig{Config: unified.Root}
+	configsQ := []*ModuleConfig{root}
+
+	// initialize normalized output
+	allResourcesConfig = make(map[string][]output.ResourceConfig)
+
+	// using BFS traverse through all modules in the unified config tree
+	zap.S().Debug("traversing through all modules in config tree")
+	for len(configsQ) > 0 {
+
+		// pop first element from the queue
+		current := configsQ[0]
+		configsQ = configsQ[1:]
+
+		// reference resolver
+		r := NewRefResolver(current.Config, current.ParentModuleCall)
+
+		// traverse through all current's resources
+		for _, managedResource := range current.Config.Module.ManagedResources {
+
+			// create output.ResourceConfig from hclConfigs.Resource
+			resourceConfig, err := CreateResourceConfig(managedResource)
+			if err != nil {
+				return allResourcesConfig, fmt.Errorf("failed to create ResourceConfig")
+			}
+
+			// resolve references
+			resourceConfig.Config = r.ResolveRefs(resourceConfig.Config.(jsonObj))
+
+			// source file path
+			resourceConfig.Source, err = filepath.Rel(absRootDir, resourceConfig.Source)
+			if err != nil {
+				return allResourcesConfig, fmt.Errorf("failed to get resource: %s", err)
+			}
+
+			// append to normalized output
+			if _, present := allResourcesConfig[resourceConfig.Type]; !present {
+				allResourcesConfig[resourceConfig.Type] = []output.ResourceConfig{resourceConfig}
+			} else {
+				allResourcesConfig[resourceConfig.Type] = append(allResourcesConfig[resourceConfig.Type], resourceConfig)
+			}
+		}
+
+		// add all current's children to the queue
+		for childName, childModule := range current.Config.Children {
+			childModuleConfig := &ModuleConfig{
+				Config:           childModule,
+				ParentModuleCall: current.Config.Module.ModuleCalls[childName],
+			}
+			configsQ = append(configsQ, childModuleConfig)
+		}
+	}
+
+	// successful
+	return allResourcesConfig, nil
+}
diff --git a/pkg/iac-providers/terraform/commons/load-file.go b/pkg/iac-providers/terraform/commons/load-file.go
new file mode 100644
index 000000000..b188d2a16
--- /dev/null
+++ b/pkg/iac-providers/terraform/commons/load-file.go
@@ -0,0 +1,81 @@
+/*
+    Copyright (C) 2020 Accurics, Inc.
+
+	Licensed 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 commons
+
+import (
+	"fmt"
+	"path/filepath"
+
+	"github.com/accurics/terrascan/pkg/iac-providers/output"
+	hclConfigs "github.com/hashicorp/terraform/configs"
+	"github.com/spf13/afero"
+	"go.uber.org/zap"
+)
+
+var (
+	// ErrLoadConfigFile error
+	ErrLoadConfigFile = fmt.Errorf("failed to load config file")
+)
+
+// LoadIacFile parses the given terraform file from the given file path
+func LoadIacFile(absFilePath string) (allResourcesConfig output.AllResourceConfigs, err error) {
+
+	// new terraform config parser
+	parser := hclConfigs.NewParser(afero.NewOsFs())
+
+	hclFile, diags := parser.LoadConfigFile(absFilePath)
+	if diags != nil {
+		zap.S().Errorf("failed to load config file '%s'. error:\n%v\n", absFilePath, diags)
+		return allResourcesConfig, ErrLoadConfigFile
+	}
+	if hclFile == nil && diags.HasErrors() {
+		zap.S().Errorf("error occured while loading config file. error:\n%v\n", diags)
+		return allResourcesConfig, ErrLoadConfigFile
+	}
+
+	// initialize normalized output
+	allResourcesConfig = make(map[string][]output.ResourceConfig)
+
+	// traverse through all current's resources
+	for _, managedResource := range hclFile.ManagedResources {
+
+		// create output.ResourceConfig from hclConfigs.Resource
+		resourceConfig, err := CreateResourceConfig(managedResource)
+		if err != nil {
+			return allResourcesConfig, fmt.Errorf("failed to create ResourceConfig")
+		}
+
+		// extract file name from path
+		resourceConfig.Source = getFileName(resourceConfig.Source)
+
+		// append to normalized output
+		if _, present := allResourcesConfig[resourceConfig.Type]; !present {
+			allResourcesConfig[resourceConfig.Type] = []output.ResourceConfig{resourceConfig}
+		} else {
+			allResourcesConfig[resourceConfig.Type] = append(allResourcesConfig[resourceConfig.Type], resourceConfig)
+		}
+	}
+
+	// successful
+	return allResourcesConfig, nil
+}
+
+// getFileName return file name from the given file path
+func getFileName(path string) string {
+	_, file := filepath.Split(path)
+	return file
+}
diff --git a/pkg/iac-providers/terraform/v12/local-references.go b/pkg/iac-providers/terraform/commons/local-references.go
similarity index 99%
rename from pkg/iac-providers/terraform/v12/local-references.go
rename to pkg/iac-providers/terraform/commons/local-references.go
index 9df9e3247..1c006c984 100644
--- a/pkg/iac-providers/terraform/v12/local-references.go
+++ b/pkg/iac-providers/terraform/commons/local-references.go
@@ -14,7 +14,7 @@
     limitations under the License.
 */
 
-package tfv12
+package commons
 
 import (
 	"io/ioutil"
diff --git a/pkg/iac-providers/terraform/v12/lookup-references.go b/pkg/iac-providers/terraform/commons/lookup-references.go
similarity index 99%
rename from pkg/iac-providers/terraform/v12/lookup-references.go
rename to pkg/iac-providers/terraform/commons/lookup-references.go
index 425ff64f5..66d1f9d2f 100644
--- a/pkg/iac-providers/terraform/v12/lookup-references.go
+++ b/pkg/iac-providers/terraform/commons/lookup-references.go
@@ -14,7 +14,7 @@
     limitations under the License.
 */
 
-package tfv12
+package commons
 
 import (
 	"reflect"
diff --git a/pkg/iac-providers/terraform/v12/module-download.go b/pkg/iac-providers/terraform/commons/module-download.go
similarity index 99%
rename from pkg/iac-providers/terraform/v12/module-download.go
rename to pkg/iac-providers/terraform/commons/module-download.go
index 3b777e85c..40fb9b364 100644
--- a/pkg/iac-providers/terraform/v12/module-download.go
+++ b/pkg/iac-providers/terraform/commons/module-download.go
@@ -14,7 +14,7 @@
     limitations under the License.
 */
 
-package tfv12
+package commons
 
 import (
 	"os"
diff --git a/pkg/iac-providers/terraform/v12/module-references.go b/pkg/iac-providers/terraform/commons/module-references.go
similarity index 99%
rename from pkg/iac-providers/terraform/v12/module-references.go
rename to pkg/iac-providers/terraform/commons/module-references.go
index 40901c1a5..ea4027360 100644
--- a/pkg/iac-providers/terraform/v12/module-references.go
+++ b/pkg/iac-providers/terraform/commons/module-references.go
@@ -14,7 +14,7 @@
     limitations under the License.
 */
 
-package tfv12
+package commons
 
 import (
 	"reflect"
diff --git a/pkg/iac-providers/terraform/v12/references.go b/pkg/iac-providers/terraform/commons/references.go
similarity index 99%
rename from pkg/iac-providers/terraform/v12/references.go
rename to pkg/iac-providers/terraform/commons/references.go
index a6892471b..3ed0ad7d3 100644
--- a/pkg/iac-providers/terraform/v12/references.go
+++ b/pkg/iac-providers/terraform/commons/references.go
@@ -14,7 +14,7 @@
     limitations under the License.
 */
 
-package tfv12
+package commons
 
 import (
 	"reflect"
diff --git a/pkg/iac-providers/terraform/v12/resource.go b/pkg/iac-providers/terraform/commons/resource.go
similarity index 99%
rename from pkg/iac-providers/terraform/v12/resource.go
rename to pkg/iac-providers/terraform/commons/resource.go
index 1fbba9074..85699d1d7 100644
--- a/pkg/iac-providers/terraform/v12/resource.go
+++ b/pkg/iac-providers/terraform/commons/resource.go
@@ -14,7 +14,7 @@
     limitations under the License.
 */
 
-package tfv12
+package commons
 
 import (
 	"fmt"
diff --git a/pkg/iac-providers/terraform/v12/variable-references.go b/pkg/iac-providers/terraform/commons/variable-references.go
similarity index 99%
rename from pkg/iac-providers/terraform/v12/variable-references.go
rename to pkg/iac-providers/terraform/commons/variable-references.go
index 24ab27b1c..c68e8f780 100644
--- a/pkg/iac-providers/terraform/v12/variable-references.go
+++ b/pkg/iac-providers/terraform/commons/variable-references.go
@@ -14,7 +14,7 @@
     limitations under the License.
 */
 
-package tfv12
+package commons
 
 import (
 	"io/ioutil"
diff --git a/pkg/iac-providers/terraform/v12/load-dir.go b/pkg/iac-providers/terraform/v12/load-dir.go
index 95dffbdcf..adb44fe76 100644
--- a/pkg/iac-providers/terraform/v12/load-dir.go
+++ b/pkg/iac-providers/terraform/v12/load-dir.go
@@ -17,167 +17,13 @@
 package tfv12
 
 import (
-	"fmt"
-	"os"
-	"path/filepath"
-
 	"github.com/accurics/terrascan/pkg/iac-providers/output"
-	"github.com/accurics/terrascan/pkg/utils"
-	version "github.com/hashicorp/go-version"
-	"github.com/hashicorp/hcl/v2"
-	hclConfigs "github.com/hashicorp/terraform/configs"
-	"github.com/spf13/afero"
-	"go.uber.org/zap"
-)
-
-var (
-	errEmptyTFConfigDir = fmt.Errorf("directory has no terraform files")
-	errLoadConfigDir    = fmt.Errorf("failed to load terraform allResourcesConfig dir")
-	errBuildTFConfigDir = fmt.Errorf("failed to build terraform allResourcesConfig")
+	commons "github.com/accurics/terrascan/pkg/iac-providers/terraform/commons"
 )
 
-// ModuleConfig contains the *hclConfigs.Config for every module in the
-// unified config tree along with *hclConfig.ModuleCall made by the parent
-// module. The ParentModuleCall helps in resolving references for variables
-// initilaized in the parent ModuleCall
-type ModuleConfig struct {
-	Config           *hclConfigs.Config
-	ParentModuleCall *hclConfigs.ModuleCall
-}
-
 // LoadIacDir starts traversing from the given rootDir and traverses through
 // all the descendant modules present to create an output list of all the
 // resources present in rootDir and descendant modules
 func (*TfV12) LoadIacDir(absRootDir string) (allResourcesConfig output.AllResourceConfigs, err error) {
-
-	// create a new config parser
-	parser := hclConfigs.NewParser(afero.NewOsFs())
-
-	// check if the directory has any tf config files (.tf or .tf.json)
-	if !parser.IsConfigDir(absRootDir) {
-		zap.S().Errorf("directory '%s' has no terraform config files", absRootDir)
-		return allResourcesConfig, errEmptyTFConfigDir
-	}
-
-	// load root config directory
-	rootMod, diags := parser.LoadConfigDir(absRootDir)
-	if diags.HasErrors() {
-		zap.S().Errorf("failed to load terraform config dir '%s'. error:\n%+v\n", absRootDir, diags)
-		return allResourcesConfig, errLoadConfigDir
-	}
-
-	// create a new remote module installer to install remote modules
-	r := NewRemoteModuleInstaller()
-	defer r.CleanUp()
-
-	// using the BuildConfig and ModuleWalkerFunc to traverse through all
-	// descendant modules from the root module and create a unified
-	// configuration of type *configs.Config
-	// Note: currently, only Local paths are supported for Module Sources
-	versionI := 0
-	unified, diags := hclConfigs.BuildConfig(rootMod, hclConfigs.ModuleWalkerFunc(
-		func(req *hclConfigs.ModuleRequest) (*hclConfigs.Module, *version.Version, hcl.Diagnostics) {
-
-			// figure out path sub module directory, if it's remote then download it locally
-			var pathToModule string
-			if isLocalSourceAddr(req.SourceAddr) {
-				// determine the absolute path from root module to the sub module
-				// since we start at the end of the path, we need to assemble
-				// the parts in reverse order
-
-				pathToModule = req.SourceAddr
-				for p := req.Parent; p != nil; p = p.Parent {
-					pathToModule = filepath.Join(p.SourceAddr, pathToModule)
-				}
-				pathToModule = filepath.Join(absRootDir, pathToModule)
-				zap.S().Debugf("processing local module %q", pathToModule)
-			} else {
-				// temp dir to download the remote repo
-				tempDir := filepath.Join(os.TempDir(), utils.GenRandomString(6))
-
-				// Download remote module
-				pathToModule, err = r.DownloadModule(req.SourceAddr, tempDir)
-				if err != nil {
-					zap.S().Errorf("failed to download remote module %q. error: '%v'", req.SourceAddr, err)
-				}
-			}
-
-			// load sub module directory
-			subMod, diags := parser.LoadConfigDir(pathToModule)
-			version, _ := version.NewVersion(fmt.Sprintf("1.0.%d", versionI))
-			versionI++
-			return subMod, version, diags
-		},
-	))
-	if diags.HasErrors() {
-		zap.S().Errorf("failed to build unified config. errors:\n%+v\n", diags)
-		return allResourcesConfig, errBuildTFConfigDir
-	}
-
-	/*
-		The "unified" config created from BuildConfig in the previous step
-		represents a tree structure with rootDir module being at its root and
-		all the sub modules being its children, and these children can have
-		more children and so on...
-
-		Now, using BFS we traverse through all the submodules using the classic
-		approach of using a queue data structure
-	*/
-
-	// queue of for BFS, add root module config to it
-	root := &ModuleConfig{Config: unified.Root}
-	configsQ := []*ModuleConfig{root}
-
-	// initialize normalized output
-	allResourcesConfig = make(map[string][]output.ResourceConfig)
-
-	// using BFS traverse through all modules in the unified config tree
-	zap.S().Debug("traversing through all modules in config tree")
-	for len(configsQ) > 0 {
-
-		// pop first element from the queue
-		current := configsQ[0]
-		configsQ = configsQ[1:]
-
-		// reference resolver
-		r := NewRefResolver(current.Config, current.ParentModuleCall)
-
-		// traverse through all current's resources
-		for _, managedResource := range current.Config.Module.ManagedResources {
-
-			// create output.ResourceConfig from hclConfigs.Resource
-			resourceConfig, err := CreateResourceConfig(managedResource)
-			if err != nil {
-				return allResourcesConfig, fmt.Errorf("failed to create ResourceConfig")
-			}
-
-			// resolve references
-			resourceConfig.Config = r.ResolveRefs(resourceConfig.Config.(jsonObj))
-
-			// source file path
-			resourceConfig.Source, err = filepath.Rel(absRootDir, resourceConfig.Source)
-			if err != nil {
-				return allResourcesConfig, fmt.Errorf("failed to get resource: %s", err)
-			}
-
-			// append to normalized output
-			if _, present := allResourcesConfig[resourceConfig.Type]; !present {
-				allResourcesConfig[resourceConfig.Type] = []output.ResourceConfig{resourceConfig}
-			} else {
-				allResourcesConfig[resourceConfig.Type] = append(allResourcesConfig[resourceConfig.Type], resourceConfig)
-			}
-		}
-
-		// add all current's children to the queue
-		for childName, childModule := range current.Config.Children {
-			childModuleConfig := &ModuleConfig{
-				Config:           childModule,
-				ParentModuleCall: current.Config.Module.ModuleCalls[childName],
-			}
-			configsQ = append(configsQ, childModuleConfig)
-		}
-	}
-
-	// successful
-	return allResourcesConfig, nil
+	return commons.LoadIacDir(absRootDir)
 }
diff --git a/pkg/iac-providers/terraform/v12/load-file.go b/pkg/iac-providers/terraform/v12/load-file.go
index 07af9a928..031b91a35 100644
--- a/pkg/iac-providers/terraform/v12/load-file.go
+++ b/pkg/iac-providers/terraform/v12/load-file.go
@@ -17,64 +17,11 @@
 package tfv12
 
 import (
-	"fmt"
-	"path/filepath"
-
 	"github.com/accurics/terrascan/pkg/iac-providers/output"
-	hclConfigs "github.com/hashicorp/terraform/configs"
-	"github.com/spf13/afero"
-	"go.uber.org/zap"
-)
-
-var (
-	errLoadConfigFile = fmt.Errorf("failed to load config file")
+	commons "github.com/accurics/terrascan/pkg/iac-providers/terraform/commons"
 )
 
 // LoadIacFile parses the given terraform file from the given file path
 func (*TfV12) LoadIacFile(absFilePath string) (allResourcesConfig output.AllResourceConfigs, err error) {
-
-	// new terraform config parser
-	parser := hclConfigs.NewParser(afero.NewOsFs())
-
-	hclFile, diags := parser.LoadConfigFile(absFilePath)
-	if diags != nil {
-		zap.S().Errorf("failed to load config file '%s'. error:\n%v\n", absFilePath, diags)
-		return allResourcesConfig, errLoadConfigFile
-	}
-	if hclFile == nil && diags.HasErrors() {
-		zap.S().Errorf("error occured while loading config file. error:\n%v\n", diags)
-		return allResourcesConfig, errLoadConfigFile
-	}
-
-	// initialize normalized output
-	allResourcesConfig = make(map[string][]output.ResourceConfig)
-
-	// traverse through all current's resources
-	for _, managedResource := range hclFile.ManagedResources {
-
-		// create output.ResourceConfig from hclConfigs.Resource
-		resourceConfig, err := CreateResourceConfig(managedResource)
-		if err != nil {
-			return allResourcesConfig, fmt.Errorf("failed to create ResourceConfig")
-		}
-
-		// extract file name from path
-		resourceConfig.Source = getFileName(resourceConfig.Source)
-
-		// append to normalized output
-		if _, present := allResourcesConfig[resourceConfig.Type]; !present {
-			allResourcesConfig[resourceConfig.Type] = []output.ResourceConfig{resourceConfig}
-		} else {
-			allResourcesConfig[resourceConfig.Type] = append(allResourcesConfig[resourceConfig.Type], resourceConfig)
-		}
-	}
-
-	// successful
-	return allResourcesConfig, nil
-}
-
-// getFileName return file name from the given file path
-func getFileName(path string) string {
-	_, file := filepath.Split(path)
-	return file
+	return commons.LoadIacFile(absFilePath)
 }
diff --git a/pkg/iac-providers/terraform/v14/load-dir.go b/pkg/iac-providers/terraform/v14/load-dir.go
new file mode 100644
index 000000000..e7bf1d929
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/load-dir.go
@@ -0,0 +1,30 @@
+/*
+    Copyright (C) 2020 Accurics, Inc.
+
+	Licensed 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 tfv14
+
+import (
+	commons "github.com/accurics/terrascan/pkg/iac-providers/terraform/commons"
+
+	"github.com/accurics/terrascan/pkg/iac-providers/output"
+)
+
+// LoadIacDir starts traversing from the given rootDir and traverses through
+// all the descendant modules present to create an output list of all the
+// resources present in rootDir and descendant modules
+func (*TfV14) LoadIacDir(absRootDir string) (allResourcesConfig output.AllResourceConfigs, err error) {
+	return commons.LoadIacDir(absRootDir)
+}
diff --git a/pkg/iac-providers/terraform/v14/load-file.go b/pkg/iac-providers/terraform/v14/load-file.go
new file mode 100644
index 000000000..43d61043a
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/load-file.go
@@ -0,0 +1,27 @@
+/*
+    Copyright (C) 2020 Accurics, Inc.
+
+	Licensed 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 tfv14
+
+import (
+	"github.com/accurics/terrascan/pkg/iac-providers/output"
+	commons "github.com/accurics/terrascan/pkg/iac-providers/terraform/commons"
+)
+
+// LoadIacFile parses the given terraform file from the given file path
+func (*TfV14) LoadIacFile(absFilePath string) (allResourcesConfig output.AllResourceConfigs, err error) {
+	return commons.LoadIacFile(absFilePath)
+}
diff --git a/pkg/iac-providers/terraform/v14/types.go b/pkg/iac-providers/terraform/v14/types.go
new file mode 100644
index 000000000..6eb3ee0c9
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/types.go
@@ -0,0 +1,20 @@
+/*
+    Copyright (C) 2020 Accurics, Inc.
+
+	Licensed 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 tfv14
+
+// TfV14 struct implements the IacProvider interface
+type TfV14 struct{}
diff --git a/pkg/policy/all.go b/pkg/policy/all.go
index d88d2635d..959f54639 100644
--- a/pkg/policy/all.go
+++ b/pkg/policy/all.go
@@ -18,7 +18,7 @@ package policy
 
 const (
 	defaultAllIacType    supportedIacType    = "terraform"
-	defaultAllIacVersion supportedIacVersion = "v12"
+	defaultAllIacVersion supportedIacVersion = "v14"
 )
 
 func init() {
diff --git a/pkg/policy/aws.go b/pkg/policy/aws.go
index ac9f4fc71..937e2c3c6 100644
--- a/pkg/policy/aws.go
+++ b/pkg/policy/aws.go
@@ -19,7 +19,7 @@ package policy
 const (
 	aws                  supportedCloudType  = "aws"
 	defaultAWSIacType    supportedIacType    = "terraform"
-	defaultAWSIacVersion supportedIacVersion = "v12"
+	defaultAWSIacVersion supportedIacVersion = "v14"
 )
 
 func init() {
diff --git a/pkg/policy/azure.go b/pkg/policy/azure.go
index d2e57d773..9056eab06 100644
--- a/pkg/policy/azure.go
+++ b/pkg/policy/azure.go
@@ -19,7 +19,7 @@ package policy
 const (
 	azure                  supportedCloudType  = "azure"
 	defaultAzureIacType    supportedIacType    = "terraform"
-	defaultAzureIacVersion supportedIacVersion = "v12"
+	defaultAzureIacVersion supportedIacVersion = "v14"
 )
 
 func init() {
diff --git a/pkg/policy/gcp.go b/pkg/policy/gcp.go
index f49dfe606..545b3c0fa 100644
--- a/pkg/policy/gcp.go
+++ b/pkg/policy/gcp.go
@@ -19,7 +19,7 @@ package policy
 const (
 	gcp                  supportedCloudType  = "gcp"
 	defaultGCPIacType    supportedIacType    = "terraform"
-	defaultGCPIacVersion supportedIacVersion = "v12"
+	defaultGCPIacVersion supportedIacVersion = "v14"
 )
 
 func init() {
diff --git a/pkg/policy/github.go b/pkg/policy/github.go
index 94330db46..76fb1c930 100644
--- a/pkg/policy/github.go
+++ b/pkg/policy/github.go
@@ -19,7 +19,7 @@ package policy
 const (
 	github                  supportedCloudType  = "github"
 	defaultGithubIacType    supportedIacType    = "terraform"
-	defaultGithubIacVersion supportedIacVersion = "v12"
+	defaultGithubIacVersion supportedIacVersion = "v14"
 )
 
 func init() {


Test patch:
diff --git a/pkg/http-server/file-scan_test.go b/pkg/http-server/file-scan_test.go
index 023a1e914..72fe4a467 100644
--- a/pkg/http-server/file-scan_test.go
+++ b/pkg/http-server/file-scan_test.go
@@ -18,7 +18,7 @@ import (
 func TestUpload(t *testing.T) {
 	testFilePath := "./testdata/testconfig.tf"
 	testIacType := "terraform"
-	testIacVersion := "v12"
+	testIacVersion := "v14"
 	testCloudType := "aws"
 	testParamName := "file"
 
diff --git a/pkg/http-server/remote-repo_test.go b/pkg/http-server/remote-repo_test.go
index c930db667..da85c9a77 100644
--- a/pkg/http-server/remote-repo_test.go
+++ b/pkg/http-server/remote-repo_test.go
@@ -83,7 +83,7 @@ func TestScanRemoteRepo(t *testing.T) {
 func TestScanRemoteRepoHandler(t *testing.T) {
 	validRepo := "https://github.com/kanchwala-yusuf/Damn-Vulnerable-Terraform-Project.git"
 	testIacType := "terraform"
-	testIacVersion := "v12"
+	testIacVersion := "v14"
 	testCloudType := "aws"
 
 	table := []struct {
diff --git a/pkg/http-server/testdata/testconfig.tf b/pkg/http-server/testdata/testconfig.tf
index 0e92e1ac9..90345f4c4 100644
--- a/pkg/http-server/testdata/testconfig.tf
+++ b/pkg/http-server/testdata/testconfig.tf
@@ -8,14 +8,14 @@ resource "aws_vpc" "vpc_playground" {
   enable_dns_support   = true
   enable_dns_hostnames = true
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = "var.environment_tag"
   }
 }
 
 resource "aws_internet_gateway" "igw_playground" {
   vpc_id = aws_vpc.vpc_playground.id
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = "var.environment_tag"
   }
 }
 
@@ -24,7 +24,7 @@ resource "aws_subnet" "subnet_public_playground" {
   cidr_block              = var.cidr_subnet
   map_public_ip_on_launch = "true"
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = "var.environment_tag"
   }
 }
 
@@ -35,7 +35,7 @@ resource "aws_route_table" "rtb_public_playground" {
     gateway_id = aws_internet_gateway.igw_playground.id
   }
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = "var.environment_tag"
   }
 }
 
@@ -66,7 +66,7 @@ resource "aws_security_group" "sg_playground" {
     cidr_blocks = ["0.0.0.0/0"]
   }
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = "var.environment_tag"
   }
 }
 
@@ -82,7 +82,7 @@ resource "aws_instance" "instance_playground" {
   vpc_security_group_ids = [aws_security_group.sg_playground.id]
   key_name               = aws_key_pair.ec2key_playground.key_name
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = "var.environment_tag"
   }
   provisioner "remote-exec" {
 
diff --git a/pkg/iac-providers/providers_test.go b/pkg/iac-providers/providers_test.go
index 90e7c1f88..5643b5686 100644
--- a/pkg/iac-providers/providers_test.go
+++ b/pkg/iac-providers/providers_test.go
@@ -22,6 +22,7 @@ import (
 	"testing"
 
 	tfv12 "github.com/accurics/terrascan/pkg/iac-providers/terraform/v12"
+	tfv14 "github.com/accurics/terrascan/pkg/iac-providers/terraform/v14"
 )
 
 func TestNewIacProvider(t *testing.T) {
@@ -33,6 +34,13 @@ func TestNewIacProvider(t *testing.T) {
 		want       IacProvider
 		wantErr    error
 	}{
+		{
+			name:       "terraform v14",
+			iacType:    terraform,
+			iacVersion: terraformV14,
+			want:       &tfv14.TfV14{},
+			wantErr:    nil,
+		},
 		{
 			name:       "terraform v12",
 			iacType:    terraform,
@@ -43,7 +51,7 @@ func TestNewIacProvider(t *testing.T) {
 		{
 			name:       "not supported iac type",
 			iacType:    "not-supported",
-			iacVersion: terraformV12,
+			iacVersion: terraformV14,
 			want:       nil,
 			wantErr:    errIacNotSupported,
 		},
@@ -78,7 +86,19 @@ func TestIsIacSupported(t *testing.T) {
 		want       bool
 	}{
 		{
-			name:       "terraform v12",
+			name:       "terraform v14",
+			iacType:    terraform,
+			iacVersion: terraformV14,
+			want:       true,
+		},
+		{
+			name:       "not supported iac type",
+			iacType:    "not-supported",
+			iacVersion: terraformV14,
+			want:       false,
+		},
+		{
+			name:       "terraform v14",
 			iacType:    terraform,
 			iacVersion: terraformV12,
 			want:       true,
diff --git a/pkg/iac-providers/terraform/v12/module-download_test.go b/pkg/iac-providers/terraform/commons/module-download_test.go
similarity index 99%
rename from pkg/iac-providers/terraform/v12/module-download_test.go
rename to pkg/iac-providers/terraform/commons/module-download_test.go
index f772cb878..cd372ff8d 100644
--- a/pkg/iac-providers/terraform/v12/module-download_test.go
+++ b/pkg/iac-providers/terraform/commons/module-download_test.go
@@ -14,7 +14,7 @@
     limitations under the License.
 */
 
-package tfv12
+package commons
 
 import (
 	"fmt"
diff --git a/pkg/iac-providers/terraform/commons/test/util.go b/pkg/iac-providers/terraform/commons/test/util.go
new file mode 100644
index 000000000..544e3877e
--- /dev/null
+++ b/pkg/iac-providers/terraform/commons/test/util.go
@@ -0,0 +1,49 @@
+package test
+
+import (
+	"encoding/json"
+	"reflect"
+
+	"github.com/accurics/terrascan/pkg/iac-providers/output"
+)
+
+// prepareAllResourceConfigs prepares a
+// map[string]map[string]output.ResourceConfig
+// from the output.AllResourceConfigs, which is a
+// map[string][]output.ResourceConfig
+//
+// The goal is to put the [] into a map[string] so that we don't rely on the
+// implicit order of the [], but can use the keys for ordering.
+// The key is computed from the source and id, which should be globally unique.
+func prepareAllResourceConfigs(v output.AllResourceConfigs) ([]byte, error) {
+
+	newval := make(map[string]map[string]output.ResourceConfig, len(v))
+	for key, val := range v {
+		newval[key] = make(map[string]output.ResourceConfig, len(val))
+		for _, item := range val {
+			newkey := item.Source + "##" + item.ID
+			newval[key][newkey] = item
+		}
+	}
+
+	contents, err := json.Marshal(newval)
+	if err != nil {
+		return []byte{}, err
+	}
+
+	return contents, nil
+}
+
+// IdenticalAllResourceConfigs determines if a and b have identical contents
+func IdenticalAllResourceConfigs(a, b output.AllResourceConfigs) (bool, error) {
+	value1, err := prepareAllResourceConfigs(a)
+	if err != nil {
+		return false, err
+	}
+	value2, err := prepareAllResourceConfigs(b)
+	if err != nil {
+		return false, err
+	}
+
+	return reflect.DeepEqual(value1, value2), nil
+}
diff --git a/pkg/iac-providers/terraform/v12/load-dir_test.go b/pkg/iac-providers/terraform/v12/load-dir_test.go
index 94a07ec60..a5220bcc7 100644
--- a/pkg/iac-providers/terraform/v12/load-dir_test.go
+++ b/pkg/iac-providers/terraform/v12/load-dir_test.go
@@ -23,49 +23,10 @@ import (
 	"testing"
 
 	"github.com/accurics/terrascan/pkg/iac-providers/output"
+	"github.com/accurics/terrascan/pkg/iac-providers/terraform/commons"
+	commons_test "github.com/accurics/terrascan/pkg/iac-providers/terraform/commons/test"
 )
 
-// prepareAllResourceConfigs prepares a
-// map[string]map[string]output.ResourceConfig
-// from the output.AllResourceConfigs, which is a
-// map[string][]output.ResourceConfig
-//
-// The goal is to put the [] into a map[string] so that we don't rely on the
-// implicit order of the [], but can use the keys for ordering.
-// The key is computed from the source and id, which should be globally unique.
-func prepareAllResourceConfigs(v output.AllResourceConfigs) ([]byte, error) {
-
-	newval := make(map[string]map[string]output.ResourceConfig, len(v))
-	for key, val := range v {
-		newval[key] = make(map[string]output.ResourceConfig, len(val))
-		for _, item := range val {
-			newkey := item.Source + "##" + item.ID
-			newval[key][newkey] = item
-		}
-	}
-
-	contents, err := json.Marshal(newval)
-	if err != nil {
-		return []byte{}, err
-	}
-
-	return contents, nil
-}
-
-// identicalAllResourceConfigs determines if a and b have identical contents
-func identicalAllResourceConfigs(a, b output.AllResourceConfigs) (bool, error) {
-	value1, err := prepareAllResourceConfigs(a)
-	if err != nil {
-		return false, err
-	}
-	value2, err := prepareAllResourceConfigs(b)
-	if err != nil {
-		return false, err
-	}
-
-	return reflect.DeepEqual(value1, value2), nil
-}
-
 func TestLoadIacDir(t *testing.T) {
 
 	table := []struct {
@@ -79,25 +40,31 @@ func TestLoadIacDir(t *testing.T) {
 			name:    "invalid dirPath",
 			dirPath: "not-there",
 			tfv12:   TfV12{},
-			wantErr: errEmptyTFConfigDir,
+			wantErr: commons.ErrEmptyTFConfigDir,
 		},
 		{
 			name:    "empty config",
 			dirPath: "./testdata/testfile",
 			tfv12:   TfV12{},
-			wantErr: errEmptyTFConfigDir,
+			wantErr: commons.ErrEmptyTFConfigDir,
 		},
 		{
 			name:    "incorrect module structure",
 			dirPath: "./testdata/invalid-moduleconfigs",
 			tfv12:   TfV12{},
-			wantErr: errBuildTFConfigDir,
+			wantErr: commons.ErrBuildTFConfigDir,
 		},
 		{
 			name:    "load invalid config dir",
 			dirPath: "./testdata",
 			tfv12:   TfV12{},
-			wantErr: errLoadConfigDir,
+			wantErr: commons.ErrLoadConfigDir,
+		},
+		{
+			name:    "load invalid config dir",
+			dirPath: "./testdata/multiple-required-providers",
+			tfv12:   TfV12{},
+			wantErr: commons.ErrLoadConfigDir,
 		},
 	}
 
@@ -163,7 +130,7 @@ func TestLoadIacDir(t *testing.T) {
 				t.Errorf("unexpected error unmarshalling want: %v", err)
 			}
 
-			match, err := identicalAllResourceConfigs(got, want)
+			match, err := commons_test.IdenticalAllResourceConfigs(got, want)
 			if err != nil {
 				t.Errorf("unexpected error checking result: %v", err)
 			}
diff --git a/pkg/iac-providers/terraform/v12/load-file_test.go b/pkg/iac-providers/terraform/v12/load-file_test.go
index b9db07070..18a8823f2 100644
--- a/pkg/iac-providers/terraform/v12/load-file_test.go
+++ b/pkg/iac-providers/terraform/v12/load-file_test.go
@@ -24,6 +24,7 @@ import (
 	"testing"
 
 	"github.com/accurics/terrascan/pkg/iac-providers/output"
+	"github.com/accurics/terrascan/pkg/iac-providers/terraform/commons"
 )
 
 func TestLoadIacFile(t *testing.T) {
@@ -39,7 +40,7 @@ func TestLoadIacFile(t *testing.T) {
 			name:     "invalid filepath",
 			filePath: "not-there",
 			tfv12:    TfV12{},
-			wantErr:  errLoadConfigFile,
+			wantErr:  commons.ErrLoadConfigFile,
 		},
 		{
 			name:     "empty config",
@@ -51,7 +52,13 @@ func TestLoadIacFile(t *testing.T) {
 			name:     "invalid config",
 			filePath: "./testdata/empty.tf",
 			tfv12:    TfV12{},
-			wantErr:  errLoadConfigFile,
+			wantErr:  commons.ErrLoadConfigFile,
+		},
+		{
+			name:     "destroy-provisioners",
+			filePath: "./testdata/destroy-provisioners/main.tf",
+			tfv12:    TfV12{},
+			wantErr:  commons.ErrLoadConfigFile,
 		},
 	}
 
diff --git a/pkg/iac-providers/terraform/v12/testdata/destroy-provisioners/main.tf b/pkg/iac-providers/terraform/v12/testdata/destroy-provisioners/main.tf
new file mode 100644
index 000000000..92fa066be
--- /dev/null
+++ b/pkg/iac-providers/terraform/v12/testdata/destroy-provisioners/main.tf
@@ -0,0 +1,44 @@
+locals {
+  user = "name"
+}
+
+resource "null_resource" "a" {
+  connection {
+    host = self.hostname
+    user = local.user # ERROR: Invalid reference from destroy provisioner
+  }
+
+  provisioner "remote-exec" {
+    when = destroy
+    index = count.index
+    key = each.key
+
+    // path and terraform values are static, and do not create any
+    // dependencies.
+    dir = path.module
+    workspace = terraform.workspace
+  }
+}
+
+resource "null_resource" "b" {
+  connection {
+    host = self.hostname
+    # this is OK since there is no destroy provisioner
+    user = local.user
+  }
+
+  provisioner "remote-exec" {
+  }
+}
+
+resource "null_resource" "b" {
+  provisioner "remote-exec" {
+    when = destroy
+    connection {
+      host = self.hostname
+      user = local.user # ERROR: Invalid reference from destroy provisioner
+    }
+
+    command = "echo ${local.name}" # ERROR: Invalid reference from destroy provisioner
+  }
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v12/testdata/dummyconfig/dummyconfig.tf b/pkg/iac-providers/terraform/v12/testdata/dummyconfig/dummyconfig.tf
index a2f973393..1e978ac22 100644
--- a/pkg/iac-providers/terraform/v12/testdata/dummyconfig/dummyconfig.tf
+++ b/pkg/iac-providers/terraform/v12/testdata/dummyconfig/dummyconfig.tf
@@ -14,7 +14,7 @@ resource "type2" "resource2"{
 	other = {
 		num = local.test2 + 5
 		thing = [for x in local.arr: x * 2]
-		"${local.test3}" = 4
+		local.test3 = 4
 		3 = 1
 		"local.test1" = 89
 		"a.b.c[\"hi\"][3].*" = 3
@@ -26,14 +26,14 @@ resource "type2" "resource2"{
 resource "type3" "resource3" {
 	heredoc = <<-EOF
 		This is a heredoc template.
-		It references ${local.other.3}
+		It references local.other.3
 	EOF
 	simple = 4 - 2
 	cond = test3 > 2 ? 1: 0
 	heredoc2 = <<EOF
 		Another heredoc, that
 		doesn't remove indentation
-		${local.other.3}
+		local.other.3
 		%{if true ? false : true}"gotcha"\n%{else}4%{endif}
 	EOF
 }
diff --git a/pkg/iac-providers/terraform/v12/testdata/moduleconfigs/cloudfront/main.tf b/pkg/iac-providers/terraform/v12/testdata/moduleconfigs/cloudfront/main.tf
index c047b6469..c0dba163f 100644
--- a/pkg/iac-providers/terraform/v12/testdata/moduleconfigs/cloudfront/main.tf
+++ b/pkg/iac-providers/terraform/v12/testdata/moduleconfigs/cloudfront/main.tf
@@ -6,7 +6,7 @@ module "sub-cloudfront" {
 resource "aws_cloudfront_distribution" "s3-distribution-TLS-v1" {
   origin {
     domain_name = "aws_s3_bucket.b.bucket_regional_domain_name"
-    origin_id   = "local.s3_origin_id"
+    origin_id   = local.s3_origin_id
 
     s3_origin_config {
       origin_access_identity = "origin-access-identity/cloudfront/ABCDEFG1234567"
@@ -18,7 +18,7 @@ resource "aws_cloudfront_distribution" "s3-distribution-TLS-v1" {
   default_cache_behavior {
     allowed_methods  = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
     cached_methods   = ["GET", "HEAD"]
-    target_origin_id = "local.s3_origin_id"
+    target_origin_id = local.s3_origin_id
 
     forwarded_values {
       query_string = false
@@ -34,7 +34,7 @@ resource "aws_cloudfront_distribution" "s3-distribution-TLS-v1" {
     path_pattern     = "/content/immutable/*"
     allowed_methods  = ["GET", "HEAD", "OPTIONS"]
     cached_methods   = ["GET", "HEAD", "OPTIONS"]
-    target_origin_id = "local.s3_origin_id"
+    target_origin_id = local.s3_origin_id
 
     forwarded_values {
       query_string = false
@@ -53,7 +53,7 @@ resource "aws_cloudfront_distribution" "s3-distribution-TLS-v1" {
     path_pattern     = "/content/*"
     allowed_methods  = ["GET", "HEAD", "OPTIONS"]
     cached_methods   = ["GET", "HEAD"]
-    target_origin_id = "local.s3_origin_id"
+    target_origin_id = local.s3_origin_id
 
     forwarded_values {
       query_string = false
diff --git a/pkg/iac-providers/terraform/v12/testdata/multiple-required-providers/a.tf b/pkg/iac-providers/terraform/v12/testdata/multiple-required-providers/a.tf
new file mode 100644
index 000000000..30d836188
--- /dev/null
+++ b/pkg/iac-providers/terraform/v12/testdata/multiple-required-providers/a.tf
@@ -0,0 +1,7 @@
+terraform {
+  required_providers {
+    bar = {
+      version = "~>1.0.0"
+    }
+  }
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v12/testdata/multiple-required-providers/b.tf b/pkg/iac-providers/terraform/v12/testdata/multiple-required-providers/b.tf
new file mode 100644
index 000000000..e6aa01c14
--- /dev/null
+++ b/pkg/iac-providers/terraform/v12/testdata/multiple-required-providers/b.tf
@@ -0,0 +1,7 @@
+terraform {
+  required_providers {
+    foo = {
+      version = "~>2.0.0"
+    }
+  }
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v12/testdata/required-providers/main.tf b/pkg/iac-providers/terraform/v12/testdata/required-providers/main.tf
new file mode 100644
index 000000000..068fe6835
--- /dev/null
+++ b/pkg/iac-providers/terraform/v12/testdata/required-providers/main.tf
@@ -0,0 +1,7 @@
+terraform {
+    required_providers {
+        newrelic = {
+        version = "~> 2.1.1"
+        }
+    }
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v12/testdata/tfconfigs/config1.tf b/pkg/iac-providers/terraform/v12/testdata/tfconfigs/config1.tf
index 0e92e1ac9..81fb35e78 100644
--- a/pkg/iac-providers/terraform/v12/testdata/tfconfigs/config1.tf
+++ b/pkg/iac-providers/terraform/v12/testdata/tfconfigs/config1.tf
@@ -2,20 +2,19 @@ provider "aws" {
   region = var.aws_region
 }
 
-
 resource "aws_vpc" "vpc_playground" {
   cidr_block           = var.cidr_vpc
   enable_dns_support   = true
   enable_dns_hostnames = true
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = var.environment_tag
   }
 }
 
 resource "aws_internet_gateway" "igw_playground" {
   vpc_id = aws_vpc.vpc_playground.id
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = var.environment_tag
   }
 }
 
@@ -24,7 +23,7 @@ resource "aws_subnet" "subnet_public_playground" {
   cidr_block              = var.cidr_subnet
   map_public_ip_on_launch = "true"
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = var.environment_tag
   }
 }
 
@@ -35,7 +34,7 @@ resource "aws_route_table" "rtb_public_playground" {
     gateway_id = aws_internet_gateway.igw_playground.id
   }
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = var.environment_tag
   }
 }
 
@@ -66,7 +65,7 @@ resource "aws_security_group" "sg_playground" {
     cidr_blocks = ["0.0.0.0/0"]
   }
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = var.environment_tag
   }
 }
 
@@ -82,7 +81,7 @@ resource "aws_instance" "instance_playground" {
   vpc_security_group_ids = [aws_security_group.sg_playground.id]
   key_name               = aws_key_pair.ec2key_playground.key_name
   tags = {
-    Environment = "${var.environment_tag}"
+    Environment = var.environment_tag
   }
   provisioner "remote-exec" {
 
diff --git a/pkg/iac-providers/terraform/v12/testdata/tfjson/config1.json b/pkg/iac-providers/terraform/v12/testdata/tfjson/config1.json
index 708d02fc2..2bdd20087 100644
--- a/pkg/iac-providers/terraform/v12/testdata/tfjson/config1.json
+++ b/pkg/iac-providers/terraform/v12/testdata/tfjson/config1.json
@@ -4,7 +4,7 @@
       "id": "aws_instance.instance_playground",
       "name": "instance_playground",
       "source": "config1.tf",
-      "line": 78,
+      "line": 77,
       "type": "aws_instance",
       "config": {
         "ami": "${lookup(var.aws_amis, var.aws_region)}",
@@ -47,7 +47,7 @@
       "id": "aws_internet_gateway.igw_playground",
       "name": "igw_playground",
       "source": "config1.tf",
-      "line": 15,
+      "line": 14,
       "type": "aws_internet_gateway",
       "config": {
         "tags": {
@@ -63,7 +63,7 @@
       "id": "aws_key_pair.ec2key_playground",
       "name": "ec2key_playground",
       "source": "config1.tf",
-      "line": 73,
+      "line": 72,
       "type": "aws_key_pair",
       "config": {
         "key_name": "testKey",
@@ -77,7 +77,7 @@
       "id": "aws_route_table.rtb_public_playground",
       "name": "rtb_public_playground",
       "source": "config1.tf",
-      "line": 31,
+      "line": 30,
       "type": "aws_route_table",
       "config": {
         "route": [
@@ -99,7 +99,7 @@
       "id": "aws_route_table_association.rta_subnet_public_playground",
       "name": "rta_subnet_public_playground",
       "source": "config1.tf",
-      "line": 42,
+      "line": 41,
       "type": "aws_route_table_association",
       "config": {
         "route_table_id": "${aws_route_table.rtb_public_playground.id}",
@@ -113,7 +113,7 @@
       "id": "aws_security_group.sg_playground",
       "name": "sg_playground",
       "source": "config1.tf",
-      "line": 47,
+      "line": 46,
       "type": "aws_security_group",
       "config": {
         "egress": [
@@ -158,7 +158,7 @@
       "id": "aws_subnet.subnet_public_playground",
       "name": "subnet_public_playground",
       "source": "config1.tf",
-      "line": 22,
+      "line": 21,
       "type": "aws_subnet",
       "config": {
         "cidr_block": "${var.cidr_subnet}",
@@ -176,7 +176,7 @@
       "id": "aws_vpc.vpc_playground",
       "name": "vpc_playground",
       "source": "config1.tf",
-      "line": 6,
+      "line": 5,
       "type": "aws_vpc",
       "config": {
         "cidr_block": "${var.cidr_vpc}",
diff --git a/pkg/iac-providers/terraform/v12/testdata/tfjson/dummyconfig.json b/pkg/iac-providers/terraform/v12/testdata/tfjson/dummyconfig.json
index 8f39df6e0..aa5244a40 100644
--- a/pkg/iac-providers/terraform/v12/testdata/tfjson/dummyconfig.json
+++ b/pkg/iac-providers/terraform/v12/testdata/tfjson/dummyconfig.json
@@ -53,11 +53,11 @@
       "type": "type2",
       "config": {
         "other": {
-          "${local.test3}": 4,
           "3": 1,
           "a.b.c": "True",
           "a.b.c[\"hi\"][3].*": 3,
           "local.test1": 89,
+          "local.test3": 4,
           "loop": "This has a for loop: %{for x in local.arr}x,%{endfor}",
           "num": "${local.test2 + 5}",
           "thing": "${[for x in local.arr: x * 2]}"
@@ -75,11 +75,11 @@
       "type": "type3",
       "config": {
         "cond": "${test3 \u003e 2 ? 1: 0}",
-        "heredoc": "This is a heredoc template.\nIt references ${local.other.3}\n",
-        "heredoc2": "\t\tAnother heredoc, that\n\t\tdoesn't remove indentation\n\t\t${local.other.3}\n\t\t%{if true ? false : true}\"gotcha\"\\n%{else}4%{endif}\n",
+        "heredoc": "This is a heredoc template.\nIt references local.other.3\n",
+        "heredoc2": "\t\tAnother heredoc, that\n\t\tdoesn't remove indentation\n\t\tlocal.other.3\n\t\t%{if true ? false : true}\"gotcha\"\\n%{else}4%{endif}\n",
         "simple": "${4 - 2}"
       },
       "skip_rules": null
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v12/testdata/tfjson/fullconfig.json b/pkg/iac-providers/terraform/v12/testdata/tfjson/fullconfig.json
index 8c7f7cd8a..307ab6619 100644
--- a/pkg/iac-providers/terraform/v12/testdata/tfjson/fullconfig.json
+++ b/pkg/iac-providers/terraform/v12/testdata/tfjson/fullconfig.json
@@ -4,7 +4,7 @@
       "id": "aws_instance.instance_playground",
       "name": "instance_playground",
       "source": "config1.tf",
-      "line": 78,
+      "line": 77,
       "type": "aws_instance",
       "config": {
         "ami": "${lookup(var.aws_amis, var.aws_region)}",
@@ -46,7 +46,7 @@
       "id": "aws_internet_gateway.igw_playground",
       "name": "igw_playground",
       "source": "config1.tf",
-      "line": 15,
+      "line": 14,
       "type": "aws_internet_gateway",
       "config": {
         "tags": {
@@ -61,7 +61,7 @@
       "id": "aws_key_pair.ec2key_playground",
       "name": "ec2key_playground",
       "source": "config1.tf",
-      "line": 73,
+      "line": 72,
       "type": "aws_key_pair",
       "config": {
         "key_name": "testKey",
@@ -74,7 +74,7 @@
       "id": "aws_route_table.rtb_public_playground",
       "name": "rtb_public_playground",
       "source": "config1.tf",
-      "line": 31,
+      "line": 30,
       "type": "aws_route_table",
       "config": {
         "route": [
@@ -95,7 +95,7 @@
       "id": "aws_route_table_association.rta_subnet_public_playground",
       "name": "rta_subnet_public_playground",
       "source": "config1.tf",
-      "line": 42,
+      "line": 41,
       "type": "aws_route_table_association",
       "config": {
         "route_table_id": "${aws_route_table.rtb_public_playground.id}",
@@ -108,7 +108,7 @@
       "id": "aws_security_group.sg_playground",
       "name": "sg_playground",
       "source": "config1.tf",
-      "line": 47,
+      "line": 46,
       "type": "aws_security_group",
       "config": {
         "egress": [
@@ -152,7 +152,7 @@
       "id": "aws_subnet.subnet_public_playground",
       "name": "subnet_public_playground",
       "source": "config1.tf",
-      "line": 22,
+      "line": 21,
       "type": "aws_subnet",
       "config": {
         "cidr_block": "${var.cidr_subnet}",
@@ -169,7 +169,7 @@
       "id": "aws_vpc.vpc_playground",
       "name": "vpc_playground",
       "source": "config1.tf",
-      "line": 6,
+      "line": 5,
       "type": "aws_vpc",
       "config": {
         "cidr_block": "${var.cidr_vpc}",
diff --git a/pkg/iac-providers/terraform/v12/testdata/tfjson/moduleconfigs.json b/pkg/iac-providers/terraform/v12/testdata/tfjson/moduleconfigs.json
index 0d0a0357d..24ca4acce 100644
--- a/pkg/iac-providers/terraform/v12/testdata/tfjson/moduleconfigs.json
+++ b/pkg/iac-providers/terraform/v12/testdata/tfjson/moduleconfigs.json
@@ -32,7 +32,7 @@
                 "query_string": false
               }
             ],
-            "target_origin_id": "myS3Origin",
+            "target_origin_id": "${local.s3_origin_id}",
             "viewer_protocol_policy": "https-only"
           }
         ],
@@ -64,7 +64,7 @@
               }
             ],
             "path_pattern": "/content/immutable/*",
-            "target_origin_id": "myS3Origin",
+            "target_origin_id": "${local.s3_origin_id}",
             "viewer_protocol_policy": "allow-all"
           },
           {
@@ -88,14 +88,14 @@
               }
             ],
             "path_pattern": "/content/*",
-            "target_origin_id": "myS3Origin",
+            "target_origin_id": "${local.s3_origin_id}",
             "viewer_protocol_policy": "allow-all"
           }
         ],
         "origin": [
           {
             "domain_name": "aws_s3_bucket.b.bucket_regional_domain_name",
-            "origin_id": "myS3Origin",
+            "origin_id": "${local.s3_origin_id}",
             "s3_origin_config": [
               {
                 "origin_access_identity": "origin-access-identity/cloudfront/ABCDEFG1234567"
diff --git a/pkg/iac-providers/terraform/v14/load-dir_test.go b/pkg/iac-providers/terraform/v14/load-dir_test.go
new file mode 100644
index 000000000..ba535f44c
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/load-dir_test.go
@@ -0,0 +1,131 @@
+/*
+    Copyright (C) 2020 Accurics, Inc.
+
+	Licensed 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 tfv14
+
+import (
+	"encoding/json"
+	"io/ioutil"
+	"reflect"
+	"testing"
+
+	"github.com/accurics/terrascan/pkg/iac-providers/output"
+	"github.com/accurics/terrascan/pkg/iac-providers/terraform/commons"
+	commons_test "github.com/accurics/terrascan/pkg/iac-providers/terraform/commons/test"
+)
+
+func TestLoadIacDir(t *testing.T) {
+
+	table := []struct {
+		name    string
+		dirPath string
+		tfv14   TfV14
+		want    output.AllResourceConfigs
+		wantErr error
+	}{
+		{
+			name:    "invalid dirPath",
+			dirPath: "not-there",
+			tfv14:   TfV14{},
+			wantErr: commons.ErrEmptyTFConfigDir,
+		},
+		{
+			name:    "empty config",
+			dirPath: "./testdata/testfile",
+			tfv14:   TfV14{},
+			wantErr: commons.ErrEmptyTFConfigDir,
+		},
+		{
+			name:    "incorrect module structure",
+			dirPath: "./testdata/invalid-moduleconfigs",
+			tfv14:   TfV14{},
+			wantErr: commons.ErrBuildTFConfigDir,
+		},
+		{
+			name:    "load invalid config dir",
+			dirPath: "./testdata",
+			tfv14:   TfV14{},
+			wantErr: commons.ErrLoadConfigDir,
+		},
+	}
+
+	for _, tt := range table {
+		t.Run(tt.name, func(t *testing.T) {
+			_, gotErr := tt.tfv14.LoadIacDir(tt.dirPath)
+			if !reflect.DeepEqual(gotErr, tt.wantErr) {
+				t.Errorf("unexpected error; gotErr: '%v', wantErr: '%v'", gotErr, tt.wantErr)
+			}
+		})
+	}
+
+	table2 := []struct {
+		name        string
+		tfConfigDir string
+		tfJSONFile  string
+		tfv14       TfV14
+		wantErr     error
+	}{
+		{
+			name:        "config1",
+			tfConfigDir: "./testdata/tfconfigs",
+			tfJSONFile:  "testdata/tfjson/fullconfig.json",
+			tfv14:       TfV14{},
+			wantErr:     nil,
+		},
+		{
+			name:        "module directory",
+			tfConfigDir: "./testdata/moduleconfigs",
+			tfJSONFile:  "./testdata/tfjson/moduleconfigs.json",
+			tfv14:       TfV14{},
+			wantErr:     nil,
+		},
+		{
+			name:        "nested module directory",
+			tfConfigDir: "./testdata/deep-modules",
+			tfJSONFile:  "./testdata/tfjson/deep-modules.json",
+			tfv14:       TfV14{},
+			wantErr:     nil,
+		},
+	}
+
+	for _, tt := range table2 {
+		t.Run(tt.name, func(t *testing.T) {
+			got, gotErr := tt.tfv14.LoadIacDir(tt.tfConfigDir)
+			if !reflect.DeepEqual(gotErr, tt.wantErr) {
+				t.Errorf("unexpected error; gotErr: '%v', wantErr: '%v'", gotErr, tt.wantErr)
+			}
+
+			var want output.AllResourceConfigs
+
+			// Read the expected value and unmarshal into want
+			contents, _ := ioutil.ReadFile(tt.tfJSONFile)
+			err := json.Unmarshal(contents, &want)
+			if err != nil {
+				t.Errorf("unexpected error unmarshalling want: %v", err)
+			}
+
+			match, err := commons_test.IdenticalAllResourceConfigs(got, want)
+			if err != nil {
+				t.Errorf("unexpected error checking result: %v", err)
+			}
+			if !match {
+				g, _ := json.MarshalIndent(got, "", "  ")
+				w, _ := json.MarshalIndent(want, "", "  ")
+				t.Errorf("got '%v', want: '%v'", string(g), string(w))
+			}
+		})
+	}
+}
diff --git a/pkg/iac-providers/terraform/v14/load-file_test.go b/pkg/iac-providers/terraform/v14/load-file_test.go
new file mode 100644
index 000000000..6fec250b8
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/load-file_test.go
@@ -0,0 +1,130 @@
+/*
+    Copyright (C) 2020 Accurics, Inc.
+
+	Licensed 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 tfv14
+
+import (
+	"bytes"
+	"encoding/json"
+	"io/ioutil"
+	"reflect"
+	"testing"
+
+	"github.com/accurics/terrascan/pkg/iac-providers/output"
+	"github.com/accurics/terrascan/pkg/iac-providers/terraform/commons"
+)
+
+func TestLoadIacFile(t *testing.T) {
+
+	table := []struct {
+		name     string
+		filePath string
+		tfv14    TfV14
+		want     output.AllResourceConfigs
+		wantErr  error
+	}{
+		{
+			name:     "invalid filepath",
+			filePath: "not-there",
+			tfv14:    TfV14{},
+			wantErr:  commons.ErrLoadConfigFile,
+		},
+		{
+			name:     "empty config",
+			filePath: "./testdata/testfile",
+			tfv14:    TfV14{},
+			wantErr:  nil,
+		},
+		{
+			name:     "invalid config",
+			filePath: "./testdata/empty.tf",
+			tfv14:    TfV14{},
+			wantErr:  commons.ErrLoadConfigFile,
+		},
+		{
+			name:     "depends_on",
+			filePath: "./testdata/depends_on/main.tf",
+			tfv14:    TfV14{},
+			wantErr:  nil,
+		},
+		{
+			name:     "count",
+			filePath: "./testdata/count/main.tf",
+			tfv14:    TfV14{},
+			wantErr:  nil,
+		},
+		{
+			name:     "for_each",
+			filePath: "./testdata/for_each/main.tf",
+			tfv14:    TfV14{},
+			wantErr:  nil,
+		},
+		{
+			name:     "required_providers",
+			filePath: "./testdata/required-providers/main.tf",
+			tfv14:    TfV14{},
+			wantErr:  nil,
+		},
+	}
+
+	for _, tt := range table {
+		t.Run(tt.name, func(t *testing.T) {
+			_, gotErr := tt.tfv14.LoadIacFile(tt.filePath)
+			if !reflect.DeepEqual(gotErr, tt.wantErr) {
+				t.Errorf("unexpected error; gotErr: '%v', wantErr: '%v'", gotErr, tt.wantErr)
+			}
+		})
+	}
+
+	table2 := []struct {
+		name         string
+		tfConfigFile string
+		tfJSONFile   string
+		tfv14        TfV14
+		wantErr      error
+	}{
+		{
+			name:         "config1",
+			tfConfigFile: "./testdata/tfconfigs/config1.tf",
+			tfJSONFile:   "./testdata/tfjson/config1.json",
+			tfv14:        TfV14{},
+			wantErr:      nil,
+		},
+		{
+			name:         "dummyconfig",
+			tfConfigFile: "./testdata/dummyconfig/dummyconfig.tf",
+			tfJSONFile:   "./testdata/tfjson/dummyconfig.json",
+			tfv14:        TfV14{},
+			wantErr:      nil,
+		},
+	}
+
+	for _, tt := range table2 {
+		t.Run(tt.name, func(t *testing.T) {
+			got, gotErr := tt.tfv14.LoadIacFile(tt.tfConfigFile)
+			if !reflect.DeepEqual(gotErr, tt.wantErr) {
+				t.Errorf("unexpected error; gotErr: '%v', wantErr: '%v'", gotErr, tt.wantErr)
+			}
+
+			gotBytes, _ := json.MarshalIndent(got, "", "  ")
+			gotBytes = append(gotBytes, []byte{'\n'}...)
+			wantBytes, _ := ioutil.ReadFile(tt.tfJSONFile)
+			if !reflect.DeepEqual(bytes.TrimSpace(gotBytes), bytes.TrimSpace(wantBytes)) {
+				t.Errorf("unexpected error; got '%v', want: '%v'", string(gotBytes), string(wantBytes))
+			}
+		})
+	}
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/count/main.tf b/pkg/iac-providers/terraform/v14/testdata/count/main.tf
new file mode 100644
index 000000000..911ec5677
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/count/main.tf
@@ -0,0 +1,10 @@
+resource "aws_instance" "server" {
+  count = 4 # create four similar EC2 instances
+
+  ami           = "ami-a1b2c3d4"
+  instance_type = "t2.micro"
+
+  tags = {
+    Name = "Server ${count.index}"
+  }
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m1/main.tf b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m1/main.tf
new file mode 100644
index 000000000..1eb5cc25f
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m1/main.tf
@@ -0,0 +1,23 @@
+variable "m1projectid" {
+    type = string
+    default = "asdfasdf"
+}
+
+module "m2" {
+    source = "../m2"
+    m2versionyear = "2012" 
+    m2versionmonth = "10" 
+    m2versionday = "17" 
+    m2bucketname = module.m3.fullbucketname
+}
+module "m3" {
+    source = "../m3"
+    m3bucketname = var.m1projectid
+    m3environment = "dev"
+}
+
+
+resource "aws_s3_bucket" "bucket" {
+  bucket = module.m3.fullbucketname
+  policy = module.m2.fullbucketpolicy
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m2/main.tf b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m2/main.tf
new file mode 100644
index 000000000..2d9ab4a3c
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m2/main.tf
@@ -0,0 +1,36 @@
+variable "m2versionyear" {
+    type = string
+}
+variable "m2versionmonth" {
+    type = string
+}
+variable "m2versionday" {
+    type = string
+}
+variable "m2bucketname" {
+    type = string
+}
+data "aws_iam_policy_document" "readbuckets" {
+    source_json = <<EOF
+{
+  "Version":"${var.m2versionyear}-${var.m2versionmonth}-${var.m2versionday}",
+  "Statement":[
+    {
+      "Sid": "PublicRead",
+      "Effect": "Allow",
+      "Principal": "*",
+      "Action": ["s3:GetObject"],
+      "Resource": ["arn:aws:s3:::${var.m2bucketname}/*"]
+    }
+  ]
+}
+EOF  
+}
+
+output "fullbucketpolicy" {
+    value = data.aws_iam_policy_document.readbuckets.json
+} 
+output "BucketARN" {
+    value = var.m2bucketname
+} 
+
diff --git a/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m3/main.tf b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m3/main.tf
new file mode 100644
index 000000000..96d0ba4fd
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m3/main.tf
@@ -0,0 +1,17 @@
+variable "m3bucketname" {
+    type = string
+}
+variable "m3environment" {
+    type = string
+}
+
+output "fullbucketname" {
+    value = "${var.m3bucketname}-${var.m3environment}"
+}
+output "sourcebucketname" {
+    value = var.m3bucketname
+}
+output "sourceenvironment" {
+    value = var.m3environment
+}
+
diff --git a/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/main.tf b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/main.tf
new file mode 100644
index 000000000..d923da519
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/main.tf
@@ -0,0 +1,14 @@
+variable "m4projectid" {
+    type = string
+    default = "asdfasdf"
+}
+
+module "m4a" {
+    source = "./modules/m4a"
+    m4aprojectid = var.m4projectid
+}
+
+resource "aws_s3_bucket" "bucket" {
+  bucket = var.m4projectid
+  policy = module.m4a.fullbucketpolicy
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/modules/m4a/main.tf b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/modules/m4a/main.tf
new file mode 100644
index 000000000..36b7e0ae8
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/modules/m4a/main.tf
@@ -0,0 +1,23 @@
+variable "m4aprojectid" {
+    type = string
+    default = "asdfasdf"
+}
+
+module "m4b" {
+    source = "../m4b"
+    m4bversionyear = "2012" 
+    m4bversionmonth = "10" 
+    m4bversionday = "17" 
+    m4bbucketname = module.m4c.fullbucketname
+}
+module "m4c" {
+    source = "../m4c"
+    m4cbucketname = var.m4aprojectid
+    m4cenvironment = "dev"
+}
+
+
+resource "aws_s3_bucket" "bucket4a" {
+  bucket = module.m4c.fullbucketname
+  policy = module.m4b.fullbucketpolicy
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/modules/m4b/main.tf b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/modules/m4b/main.tf
new file mode 100644
index 000000000..cd642830d
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/modules/m4b/main.tf
@@ -0,0 +1,36 @@
+variable "m4bversionyear" {
+    type = string
+}
+variable "m4bversionmonth" {
+    type = string
+}
+variable "m4bversionday" {
+    type = string
+}
+variable "m4bbucketname" {
+    type = string
+}
+data "aws_iam_policy_document" "readbuckets" {
+    source_json = <<EOF
+{
+  "Version":"${var.m4bversionyear}-${var.m4bversionmonth}-${var.m4bversionday}",
+  "Statement":[
+    {
+      "Sid": "PublicRead",
+      "Effect": "Allow",
+      "Principal": "*",
+      "Action": ["s3:GetObject"],
+      "Resource": ["arn:aws:s3:::${var.m4bbucketname}/*"]
+    }
+  ]
+}
+EOF  
+}
+
+output "fullbucketpolicy" {
+    value = data.aws_iam_policy_document.readbuckets.json
+} 
+output "BucketARN" {
+    value = var.m4bbucketname
+} 
+
diff --git a/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/modules/m4c/main.tf b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/modules/m4c/main.tf
new file mode 100644
index 000000000..7696434c5
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/deep-modules/modules/m4/modules/m4c/main.tf
@@ -0,0 +1,17 @@
+variable "m4cbucketname" {
+    type = string
+}
+variable "m4cenvironment" {
+    type = string
+}
+
+output "fullbucketname" {
+    value = "${var.m4cbucketname}-${var.m4cenvironment}"
+}
+output "sourcebucketname" {
+    value = var.m4cbucketname
+}
+output "sourceenvironment" {
+    value = var.m4cenvironment
+}
+
diff --git a/pkg/iac-providers/terraform/v14/testdata/deep-modules/template.tf b/pkg/iac-providers/terraform/v14/testdata/deep-modules/template.tf
new file mode 100644
index 000000000..ae51b5da1
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/deep-modules/template.tf
@@ -0,0 +1,19 @@
+terraform {
+  required_version = ">= 0.12.0"
+}
+
+provider "aws" {
+  version = "2.58.0"
+  region  = "us-east-1"
+}
+
+
+module "m1" {
+    source = "./modules/m1"
+    m1projectid = "tf-test-project"
+}
+
+module "m4" {
+    source = "./modules/m4"
+    m4projectid = "tf-test-project-2"
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/depends_on/main.tf b/pkg/iac-providers/terraform/v14/testdata/depends_on/main.tf
new file mode 100644
index 000000000..c13250850
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/depends_on/main.tf
@@ -0,0 +1,16 @@
+module "security" {
+  source = "./live/security"
+  providers = {
+    aws = aws.sec
+  }
+  # Set some vars
+}
+
+module "log" {
+  depends_on = [module.security]
+  source     = "./live/log"
+  providers = {
+    aws = aws.log
+  }
+  # Set some vars
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v14/testdata/dummyconfig/dummyconfig.tf b/pkg/iac-providers/terraform/v14/testdata/dummyconfig/dummyconfig.tf
new file mode 100644
index 000000000..1e978ac22
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/dummyconfig/dummyconfig.tf
@@ -0,0 +1,55 @@
+resource "type1" "resource1" {
+	test3 = 1 + 2
+	test1 = "hello"
+	test2 = 5
+	arr = [1, 2, 3, 4]
+	hyphen-test = 3
+	temp = "${1 + 2} %{if local.test2 < 3}\"4\n\"%{endif}"
+	temp2 = "${"hi"} there"
+		quoted = "\"quoted\""
+		squoted = "'quoted'"
+	}
+
+resource "type2" "resource2"{
+	other = {
+		num = local.test2 + 5
+		thing = [for x in local.arr: x * 2]
+		local.test3 = 4
+		3 = 1
+		"local.test1" = 89
+		"a.b.c[\"hi\"][3].*" = 3
+		loop = "This has a for loop: %{for x in local.arr}x,%{endfor}"
+		a.b.c = "True"
+	}
+}
+
+resource "type3" "resource3" {
+	heredoc = <<-EOF
+		This is a heredoc template.
+		It references local.other.3
+	EOF
+	simple = 4 - 2
+	cond = test3 > 2 ? 1: 0
+	heredoc2 = <<EOF
+		Another heredoc, that
+		doesn't remove indentation
+		local.other.3
+		%{if true ? false : true}"gotcha"\n%{else}4%{endif}
+	EOF
+}
+
+resource "terraform_remote_state" "remote" {
+	backend = "s3"
+	config = {
+		profile = var.profile
+		region  = var.region
+		bucket  = "mybucket"
+		key     = "mykey"
+	}
+}
+
+variable "profile" {}
+
+variable "region" {
+	default = "us-east-1"
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/empty.tf b/pkg/iac-providers/terraform/v14/testdata/empty.tf
new file mode 100644
index 000000000..f9ff3aaaf
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/empty.tf
@@ -0,0 +1,1 @@
+some invalid tf file
diff --git a/pkg/iac-providers/terraform/v14/testdata/for_each/main.tf b/pkg/iac-providers/terraform/v14/testdata/for_each/main.tf
new file mode 100644
index 000000000..1d85e39fe
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/for_each/main.tf
@@ -0,0 +1,29 @@
+resource "azurerm_resource_group" "rg" {
+  for_each = {
+    a_group = "eastus"
+    another_group = "westus2"
+  }
+  name     = each.key
+  location = each.value
+}
+
+resource "aws_iam_user" "the-accounts" {
+  for_each = toset( ["Todd", "James", "Alice", "Dottie"] )
+  name     = each.key
+}
+
+# publish_bucket/bucket-and-cloudfront.tf
+variable "name" {} # this is the input parameter of the module
+
+resource "aws_s3_bucket" "example" {
+  # Because var.name includes each.key in the calling
+  # module block, its value will be different for
+  # each instance of this module.
+  bucket = var.name
+
+  # ...
+}
+
+resource "aws_iam_user" "deploy_user" {
+  # ...
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v14/testdata/invalid-moduleconfigs/cloudfront/main.tf b/pkg/iac-providers/terraform/v14/testdata/invalid-moduleconfigs/cloudfront/main.tf
new file mode 100644
index 000000000..c047b6469
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/invalid-moduleconfigs/cloudfront/main.tf
@@ -0,0 +1,84 @@
+module "sub-cloudfront" {
+  source = "./sub-cloudfront"
+}
+
+
+resource "aws_cloudfront_distribution" "s3-distribution-TLS-v1" {
+  origin {
+    domain_name = "aws_s3_bucket.b.bucket_regional_domain_name"
+    origin_id   = "local.s3_origin_id"
+
+    s3_origin_config {
+      origin_access_identity = "origin-access-identity/cloudfront/ABCDEFG1234567"
+    }
+  }
+
+  enabled = true
+
+  default_cache_behavior {
+    allowed_methods  = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
+    cached_methods   = ["GET", "HEAD"]
+    target_origin_id = "local.s3_origin_id"
+
+    forwarded_values {
+      query_string = false
+
+      cookies {
+        forward = "none"
+      }
+    }
+    viewer_protocol_policy = "https-only"
+  }
+
+  ordered_cache_behavior {
+    path_pattern     = "/content/immutable/*"
+    allowed_methods  = ["GET", "HEAD", "OPTIONS"]
+    cached_methods   = ["GET", "HEAD", "OPTIONS"]
+    target_origin_id = "local.s3_origin_id"
+
+    forwarded_values {
+      query_string = false
+      headers      = ["Origin"]
+
+      cookies {
+        forward = "none"
+      }
+    }
+
+    compress               = true
+    viewer_protocol_policy = "allow-all"
+  }
+
+  ordered_cache_behavior {
+    path_pattern     = "/content/*"
+    allowed_methods  = ["GET", "HEAD", "OPTIONS"]
+    cached_methods   = ["GET", "HEAD"]
+    target_origin_id = "local.s3_origin_id"
+
+    forwarded_values {
+      query_string = false
+
+      cookies {
+        forward = "none"
+      }
+    }
+
+    viewer_protocol_policy = "allow-all"
+  }
+
+  restrictions {
+    geo_restriction {
+      restriction_type = "whitelist"
+      locations        = ["US", "CA", "GB", "DE"]
+    }
+  }
+
+  viewer_certificate {
+    cloudfront_default_certificate = true
+    minimum_protocol_version       = "TLSv1" #expected version is TLSv1.1 or TLSv1.2 
+  }
+}
+
+locals {
+  s3_origin_id = "myS3Origin"
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/invalid-moduleconfigs/main.tf b/pkg/iac-providers/terraform/v14/testdata/invalid-moduleconfigs/main.tf
new file mode 100644
index 000000000..ab84dcdf1
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/invalid-moduleconfigs/main.tf
@@ -0,0 +1,7 @@
+provider "aws" {
+  region = "us-east-1"
+}
+
+module "cloudfront" {
+  source = "./cloudfront"
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/cloudfront/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/cloudfront/main.tf
new file mode 100644
index 000000000..c0dba163f
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/cloudfront/main.tf
@@ -0,0 +1,84 @@
+module "sub-cloudfront" {
+  source = "./sub-cloudfront"
+}
+
+
+resource "aws_cloudfront_distribution" "s3-distribution-TLS-v1" {
+  origin {
+    domain_name = "aws_s3_bucket.b.bucket_regional_domain_name"
+    origin_id   = local.s3_origin_id
+
+    s3_origin_config {
+      origin_access_identity = "origin-access-identity/cloudfront/ABCDEFG1234567"
+    }
+  }
+
+  enabled = true
+
+  default_cache_behavior {
+    allowed_methods  = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
+    cached_methods   = ["GET", "HEAD"]
+    target_origin_id = local.s3_origin_id
+
+    forwarded_values {
+      query_string = false
+
+      cookies {
+        forward = "none"
+      }
+    }
+    viewer_protocol_policy = "https-only"
+  }
+
+  ordered_cache_behavior {
+    path_pattern     = "/content/immutable/*"
+    allowed_methods  = ["GET", "HEAD", "OPTIONS"]
+    cached_methods   = ["GET", "HEAD", "OPTIONS"]
+    target_origin_id = local.s3_origin_id
+
+    forwarded_values {
+      query_string = false
+      headers      = ["Origin"]
+
+      cookies {
+        forward = "none"
+      }
+    }
+
+    compress               = true
+    viewer_protocol_policy = "allow-all"
+  }
+
+  ordered_cache_behavior {
+    path_pattern     = "/content/*"
+    allowed_methods  = ["GET", "HEAD", "OPTIONS"]
+    cached_methods   = ["GET", "HEAD"]
+    target_origin_id = local.s3_origin_id
+
+    forwarded_values {
+      query_string = false
+
+      cookies {
+        forward = "none"
+      }
+    }
+
+    viewer_protocol_policy = "allow-all"
+  }
+
+  restrictions {
+    geo_restriction {
+      restriction_type = "whitelist"
+      locations        = ["US", "CA", "GB", "DE"]
+    }
+  }
+
+  viewer_certificate {
+    cloudfront_default_certificate = true
+    minimum_protocol_version       = "TLSv1" #expected version is TLSv1.1 or TLSv1.2 
+  }
+}
+
+locals {
+  s3_origin_id = "myS3Origin"
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/cloudfront/sub-cloudfront/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/cloudfront/sub-cloudfront/main.tf
new file mode 100644
index 000000000..58dc7aab1
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/cloudfront/sub-cloudfront/main.tf
@@ -0,0 +1,9 @@
+resource "aws_kms_key" "kmsKeyDisabled" {
+  description = "KMS key 2"
+  is_enabled  = false
+  tags = {
+    Name  = "kmsKeyDisabled"
+    Setup = "self-healing"
+  }
+}
+
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/cloudtrail/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/cloudtrail/main.tf
new file mode 100644
index 000000000..651974226
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/cloudtrail/main.tf
@@ -0,0 +1,6 @@
+resource "aws_cloudtrail" "missing-multi-region" {
+  name                          = "tf-trail-foobar"
+  s3_bucket_name                = "some-s3-bucket"
+  s3_key_prefix                 = "prefix"
+  include_global_service_events = false
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/ecs/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/ecs/main.tf
new file mode 100644
index 000000000..0c3777f31
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/ecs/main.tf
@@ -0,0 +1,5 @@
+resource "aws_ecs_task_definition" "instanceNotInVpc" {
+  family                = "service"
+  network_mode          = "bridge"
+  container_definitions = file("ecs/service.json")
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/ecs/service.json b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/ecs/service.json
new file mode 100644
index 000000000..1a7071942
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/ecs/service.json
@@ -0,0 +1,28 @@
+[
+    {
+      "name": "first",
+      "image": "service-first",
+      "cpu": 10,
+      "memory": 512,
+      "essential": true,
+      "portMappings": [
+        {
+          "containerPort": 80,
+          "hostPort": 80
+        }
+      ]
+    },
+    {
+      "name": "second",
+      "image": "service-second",
+      "cpu": 10,
+      "memory": 256,
+      "essential": true,
+      "portMappings": [
+        {
+          "containerPort": 443,
+          "hostPort": 443
+        }
+      ]
+    }
+  ]
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/efs/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/efs/main.tf
new file mode 100644
index 000000000..94833205f
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/efs/main.tf
@@ -0,0 +1,7 @@
+resource "aws_efs_file_system" "efsNotEncrypted" {
+  creation_token = "my-product"
+
+  tags = {
+    Name = "not-encrypted"
+  }
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/elb/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/elb/main.tf
new file mode 100644
index 000000000..f841a1ab3
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/elb/main.tf
@@ -0,0 +1,10 @@
+resource "aws_load_balancer_policy" "elbWeakCipher" {
+  load_balancer_name = "some-name"
+  policy_name        = "wu-tang-ssl"
+  policy_type_name   = "SSLNegotiationPolicyType"
+
+  policy_attribute {
+    name  = "ECDHE-RSA-RC4-SHA"
+    value = "true"
+  }
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/guardduty/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/guardduty/main.tf
new file mode 100644
index 000000000..99ab53f2b
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/guardduty/main.tf
@@ -0,0 +1,3 @@
+resource "aws_guardduty_detector" "gaurdDutyDisabled" {
+  enable = false
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/iam/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/iam/main.tf
new file mode 100644
index 000000000..c993f2ff0
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/iam/main.tf
@@ -0,0 +1,5 @@
+resource "aws_iam_access_key" "noAccessKeyForRootAccount" {
+  user    = "root"
+  pgp_key = "keybase:some_person_that_exists"
+  status  = "Inactive"
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/kinesis/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/kinesis/main.tf
new file mode 100644
index 000000000..ed2f59135
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/kinesis/main.tf
@@ -0,0 +1,17 @@
+resource "aws_kinesis_stream" "kinesisEncryptedWithKms" {
+  name             = "kinesisEncryptedWithKms"
+  shard_count      = 1
+  retention_period = 48
+
+  shard_level_metrics = [
+    "IncomingBytes",
+    "OutgoingBytes",
+  ]
+
+  encryption_type = "KMS"
+  kms_key_id      = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
+
+  tags = {
+    Environment = "kinesisEncryptedWithKms"
+  }
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/main.tf
new file mode 100644
index 000000000..7fcdb2293
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/main.tf
@@ -0,0 +1,51 @@
+provider "aws" {
+  region = "us-east-1"
+}
+
+module "cloudfront" {
+  source = "./cloudfront"
+}
+
+module "cloudtrail" {
+  source = "./cloudtrail"
+}
+
+module "ecs" {
+  source = "./ecs"
+}
+
+module "efs" {
+  source = "./efs"
+}
+
+module "elb" {
+  source = "./elb"
+}
+
+module "guardduty" {
+  source = "./guardduty"
+}
+
+module "iam" {
+  source = "./iam"
+}
+
+module "kinesis" {
+  source = "./kinesis"
+}
+
+module "s3" {
+  source = "./s3"
+}
+
+module "sg" {
+  source = "./sg"
+}
+
+module "sqs" {
+  source = "./sqs"
+}
+
+module "elasticcache" {
+  source = "../relative-moduleconfigs/elasticcache"
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/s3/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/s3/main.tf
new file mode 100644
index 000000000..8ab3a4082
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/s3/main.tf
@@ -0,0 +1,9 @@
+resource "aws_s3_bucket" "noS3BucketSseRules" {
+  bucket = "mybucket"
+  acl    = "private"
+
+  tags = {
+    Name        = "nos3BucketSseRules"
+    Environment = "Dev"
+  }
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/sg/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/sg/main.tf
new file mode 100644
index 000000000..c61772631
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/sg/main.tf
@@ -0,0 +1,25 @@
+resource "aws_security_group" "acme_web" {
+  name        = "acme_web"
+  description = "Used in the terraform"
+  vpc_id      = "some_dummy_vpc"
+
+  tags = {
+    Name = "acme_web"
+  }
+
+  # SSH access from anywhere
+  ingress {
+    from_port   = 22
+    to_port     = 22
+    protocol    = "tcp"
+    cidr_blocks = ["0.0.0.0/0", "19.16.0.0/24"]
+  }
+
+  # outbound internet access
+  egress {
+    from_port   = 0
+    to_port     = 0
+    protocol    = "-1"
+    cidr_blocks = ["0.0.0.0/0", "192.164.0.0/24"]
+  }
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/sqs/main.tf b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/sqs/main.tf
new file mode 100644
index 000000000..a6753377d
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/moduleconfigs/sqs/main.tf
@@ -0,0 +1,17 @@
+resource "aws_sqs_queue" "sqsQueueExposed" {
+  name                              = "terraform-example-queue"
+  kms_master_key_id                 = "alias/aws/sqs"
+  kms_data_key_reuse_period_seconds = 300
+  policy                            = <<EOF
+{
+  "Version": "2012-10-17",
+  "Statement": [{
+    "Sid":"Queue1_AnonymousAccess_AllActions_WhitelistIP",
+    "Effect": "Allow",
+    "Principal": "*",
+    "Action": "sqs:*",
+    "Resource": "arn:aws:sqs:*:111122223333:queue1"
+  }] 
+}
+EOF
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/relative-moduleconfigs/elasticcache/main.tf b/pkg/iac-providers/terraform/v14/testdata/relative-moduleconfigs/elasticcache/main.tf
new file mode 100644
index 000000000..280c0a859
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/relative-moduleconfigs/elasticcache/main.tf
@@ -0,0 +1,8 @@
+resource "aws_elasticache_cluster" "noMemcachedInElastiCache" {
+  cluster_id           = "cluster-example"
+  engine               = "memcached"
+  node_type            = "cache.m4.large"
+  num_cache_nodes      = 2
+  parameter_group_name = "default.memcached1.4"
+  port                 = 11211
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/required-providers/main.tf b/pkg/iac-providers/terraform/v14/testdata/required-providers/main.tf
new file mode 100644
index 000000000..09b16cd75
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/required-providers/main.tf
@@ -0,0 +1,8 @@
+terraform {
+    required_providers {
+        newrelic = {
+        source  = "newrelic/newrelic"
+        version = "~> 2.1.1"
+        }
+    }
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v14/testdata/testfile b/pkg/iac-providers/terraform/v14/testdata/testfile
new file mode 100644
index 000000000..e69de29bb
diff --git a/pkg/iac-providers/terraform/v14/testdata/tfconfigs/config1.tf b/pkg/iac-providers/terraform/v14/testdata/tfconfigs/config1.tf
new file mode 100644
index 000000000..81fb35e78
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/tfconfigs/config1.tf
@@ -0,0 +1,102 @@
+provider "aws" {
+  region = var.aws_region
+}
+
+resource "aws_vpc" "vpc_playground" {
+  cidr_block           = var.cidr_vpc
+  enable_dns_support   = true
+  enable_dns_hostnames = true
+  tags = {
+    Environment = var.environment_tag
+  }
+}
+
+resource "aws_internet_gateway" "igw_playground" {
+  vpc_id = aws_vpc.vpc_playground.id
+  tags = {
+    Environment = var.environment_tag
+  }
+}
+
+resource "aws_subnet" "subnet_public_playground" {
+  vpc_id                  = aws_vpc.vpc_playground.id
+  cidr_block              = var.cidr_subnet
+  map_public_ip_on_launch = "true"
+  tags = {
+    Environment = var.environment_tag
+  }
+}
+
+resource "aws_route_table" "rtb_public_playground" {
+  vpc_id = aws_vpc.vpc_playground.id
+  route {
+    cidr_block = "0.0.0.0/0"
+    gateway_id = aws_internet_gateway.igw_playground.id
+  }
+  tags = {
+    Environment = var.environment_tag
+  }
+}
+
+resource "aws_route_table_association" "rta_subnet_public_playground" {
+  subnet_id      = aws_subnet.subnet_public_playground.id
+  route_table_id = aws_route_table.rtb_public_playground.id
+}
+
+resource "aws_security_group" "sg_playground" {
+  name   = "sg"
+  vpc_id = aws_vpc.vpc_playground.id
+  ingress {
+    from_port   = 22
+    to_port     = 22
+    protocol    = "tcp"
+    cidr_blocks = ["0.0.0.0/0"]
+  }
+  ingress {
+    from_port   = 80
+    to_port     = 80
+    protocol    = "tcp"
+    cidr_blocks = ["0.0.0.0/0"]
+  }
+  egress {
+    from_port   = 0
+    to_port     = 0
+    protocol    = "-1"
+    cidr_blocks = ["0.0.0.0/0"]
+  }
+  tags = {
+    Environment = var.environment_tag
+  }
+}
+
+resource "aws_key_pair" "ec2key_playground" {
+  key_name   = "testKey"
+  public_key = file(var.public_key_path)
+}
+
+resource "aws_instance" "instance_playground" {
+  ami                    = lookup(var.aws_amis, var.aws_region)
+  instance_type          = var.instance_type
+  subnet_id              = aws_subnet.subnet_public_playground.id
+  vpc_security_group_ids = [aws_security_group.sg_playground.id]
+  key_name               = aws_key_pair.ec2key_playground.key_name
+  tags = {
+    Environment = var.environment_tag
+  }
+  provisioner "remote-exec" {
+
+    inline = [
+      "sudo apt-get -y update",
+      "sudo apt-get -y install nginx",
+      "sudo touch /var/www/html/index.html",
+      "echo HelloWorld | sudo tee -a /var/www/html/index.html",
+      "sudo service nginx start",
+    ]
+    connection {
+      host        = self.public_ip
+      type        = "ssh"
+      user        = "ubuntu"
+      private_key = file(var.privateKey)
+    }
+  }
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/tfjson/config1.json b/pkg/iac-providers/terraform/v14/testdata/tfjson/config1.json
new file mode 100644
index 000000000..2bdd20087
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/tfjson/config1.json
@@ -0,0 +1,192 @@
+{
+  "aws_instance": [
+    {
+      "id": "aws_instance.instance_playground",
+      "name": "instance_playground",
+      "source": "config1.tf",
+      "line": 77,
+      "type": "aws_instance",
+      "config": {
+        "ami": "${lookup(var.aws_amis, var.aws_region)}",
+        "instance_type": "${var.instance_type}",
+        "key_name": "${aws_key_pair.ec2key_playground.key_name}",
+        "provisioner": [
+          {
+            "remote-exec": {
+              "connection": [
+                {
+                  "host": "${self.public_ip}",
+                  "private_key": "${file(var.privateKey)}",
+                  "type": "ssh",
+                  "user": "ubuntu"
+                }
+              ],
+              "inline": [
+                "sudo apt-get -y update",
+                "sudo apt-get -y install nginx",
+                "sudo touch /var/www/html/index.html",
+                "echo HelloWorld | sudo tee -a /var/www/html/index.html",
+                "sudo service nginx start"
+              ]
+            }
+          }
+        ],
+        "subnet_id": "${aws_subnet.subnet_public_playground.id}",
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        },
+        "vpc_security_group_ids": [
+          "${aws_security_group.sg_playground.id}"
+        ]
+      },
+      "skip_rules": null
+    }
+  ],
+  "aws_internet_gateway": [
+    {
+      "id": "aws_internet_gateway.igw_playground",
+      "name": "igw_playground",
+      "source": "config1.tf",
+      "line": 14,
+      "type": "aws_internet_gateway",
+      "config": {
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        },
+        "vpc_id": "${aws_vpc.vpc_playground.id}"
+      },
+      "skip_rules": null
+    }
+  ],
+  "aws_key_pair": [
+    {
+      "id": "aws_key_pair.ec2key_playground",
+      "name": "ec2key_playground",
+      "source": "config1.tf",
+      "line": 72,
+      "type": "aws_key_pair",
+      "config": {
+        "key_name": "testKey",
+        "public_key": "${file(var.public_key_path)}"
+      },
+      "skip_rules": null
+    }
+  ],
+  "aws_route_table": [
+    {
+      "id": "aws_route_table.rtb_public_playground",
+      "name": "rtb_public_playground",
+      "source": "config1.tf",
+      "line": 30,
+      "type": "aws_route_table",
+      "config": {
+        "route": [
+          {
+            "cidr_block": "0.0.0.0/0",
+            "gateway_id": "${aws_internet_gateway.igw_playground.id}"
+          }
+        ],
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        },
+        "vpc_id": "${aws_vpc.vpc_playground.id}"
+      },
+      "skip_rules": null
+    }
+  ],
+  "aws_route_table_association": [
+    {
+      "id": "aws_route_table_association.rta_subnet_public_playground",
+      "name": "rta_subnet_public_playground",
+      "source": "config1.tf",
+      "line": 41,
+      "type": "aws_route_table_association",
+      "config": {
+        "route_table_id": "${aws_route_table.rtb_public_playground.id}",
+        "subnet_id": "${aws_subnet.subnet_public_playground.id}"
+      },
+      "skip_rules": null
+    }
+  ],
+  "aws_security_group": [
+    {
+      "id": "aws_security_group.sg_playground",
+      "name": "sg_playground",
+      "source": "config1.tf",
+      "line": 46,
+      "type": "aws_security_group",
+      "config": {
+        "egress": [
+          {
+            "cidr_blocks": [
+              "0.0.0.0/0"
+            ],
+            "from_port": 0,
+            "protocol": "-1",
+            "to_port": 0
+          }
+        ],
+        "ingress": [
+          {
+            "cidr_blocks": [
+              "0.0.0.0/0"
+            ],
+            "from_port": 22,
+            "protocol": "tcp",
+            "to_port": 22
+          },
+          {
+            "cidr_blocks": [
+              "0.0.0.0/0"
+            ],
+            "from_port": 80,
+            "protocol": "tcp",
+            "to_port": 80
+          }
+        ],
+        "name": "sg",
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        },
+        "vpc_id": "${aws_vpc.vpc_playground.id}"
+      },
+      "skip_rules": null
+    }
+  ],
+  "aws_subnet": [
+    {
+      "id": "aws_subnet.subnet_public_playground",
+      "name": "subnet_public_playground",
+      "source": "config1.tf",
+      "line": 21,
+      "type": "aws_subnet",
+      "config": {
+        "cidr_block": "${var.cidr_subnet}",
+        "map_public_ip_on_launch": "true",
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        },
+        "vpc_id": "${aws_vpc.vpc_playground.id}"
+      },
+      "skip_rules": null
+    }
+  ],
+  "aws_vpc": [
+    {
+      "id": "aws_vpc.vpc_playground",
+      "name": "vpc_playground",
+      "source": "config1.tf",
+      "line": 5,
+      "type": "aws_vpc",
+      "config": {
+        "cidr_block": "${var.cidr_vpc}",
+        "enable_dns_hostnames": true,
+        "enable_dns_support": true,
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        }
+      },
+      "skip_rules": null
+    }
+  ]
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/tfjson/deep-modules.json b/pkg/iac-providers/terraform/v14/testdata/tfjson/deep-modules.json
new file mode 100644
index 000000000..a2b624d18
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/tfjson/deep-modules.json
@@ -0,0 +1,37 @@
+{
+  "aws_s3_bucket": [
+    {
+      "id": "aws_s3_bucket.bucket",
+      "name": "bucket",
+      "source": "modules/m1/main.tf",
+      "line": 20,
+      "type": "aws_s3_bucket",
+      "config": {
+        "bucket": "${module.m3.fullbucketname}",
+        "policy": "${module.m2.fullbucketpolicy}"
+      }
+    },
+    {
+      "id": "aws_s3_bucket.bucket",
+      "name": "bucket",
+      "source": "modules/m4/main.tf",
+      "line": 11,
+      "type": "aws_s3_bucket",
+      "config": {
+        "bucket": "tf-test-project-2",
+        "policy": "${module.m4a.fullbucketpolicy}"
+      }
+    },
+    {
+      "id": "aws_s3_bucket.bucket4a",
+      "name": "bucket4a",
+      "source": "modules/m4/modules/m4a/main.tf",
+      "line": 20,
+      "type": "aws_s3_bucket",
+      "config": {
+        "bucket": "${module.m4c.fullbucketname}",
+        "policy": "${module.m4b.fullbucketpolicy}"
+      }
+    }
+  ]
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/tfjson/dummyconfig.json b/pkg/iac-providers/terraform/v14/testdata/tfjson/dummyconfig.json
new file mode 100644
index 000000000..aa5244a40
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/tfjson/dummyconfig.json
@@ -0,0 +1,85 @@
+{
+  "terraform_remote_state": [
+    {
+      "id": "terraform_remote_state.remote",
+      "name": "remote",
+      "source": "dummyconfig.tf",
+      "line": 41,
+      "type": "terraform_remote_state",
+      "config": {
+        "backend": "s3",
+        "config": {
+          "bucket": "mybucket",
+          "key": "mykey",
+          "profile": "${var.profile}",
+          "region": "${var.region}"
+        }
+      },
+      "skip_rules": null
+    }
+  ],
+  "type1": [
+    {
+      "id": "type1.resource1",
+      "name": "resource1",
+      "source": "dummyconfig.tf",
+      "line": 1,
+      "type": "type1",
+      "config": {
+        "arr": [
+          1,
+          2,
+          3,
+          4
+        ],
+        "hyphen-test": 3,
+        "quoted": "\"quoted\"",
+        "squoted": "'quoted'",
+        "temp": "${1 + 2} %{if local.test2 \u003c 3}\"4\n\"%{endif}",
+        "temp2": "hi there",
+        "test1": "hello",
+        "test2": 5,
+        "test3": "${1 + 2}"
+      },
+      "skip_rules": null
+    }
+  ],
+  "type2": [
+    {
+      "id": "type2.resource2",
+      "name": "resource2",
+      "source": "dummyconfig.tf",
+      "line": 13,
+      "type": "type2",
+      "config": {
+        "other": {
+          "3": 1,
+          "a.b.c": "True",
+          "a.b.c[\"hi\"][3].*": 3,
+          "local.test1": 89,
+          "local.test3": 4,
+          "loop": "This has a for loop: %{for x in local.arr}x,%{endfor}",
+          "num": "${local.test2 + 5}",
+          "thing": "${[for x in local.arr: x * 2]}"
+        }
+      },
+      "skip_rules": null
+    }
+  ],
+  "type3": [
+    {
+      "id": "type3.resource3",
+      "name": "resource3",
+      "source": "dummyconfig.tf",
+      "line": 26,
+      "type": "type3",
+      "config": {
+        "cond": "${test3 \u003e 2 ? 1: 0}",
+        "heredoc": "This is a heredoc template.\nIt references local.other.3\n",
+        "heredoc2": "\t\tAnother heredoc, that\n\t\tdoesn't remove indentation\n\t\tlocal.other.3\n\t\t%{if true ? false : true}\"gotcha\"\\n%{else}4%{endif}\n",
+        "simple": "${4 - 2}"
+      },
+      "skip_rules": null
+    }
+  ]
+}
\ No newline at end of file
diff --git a/pkg/iac-providers/terraform/v14/testdata/tfjson/fullconfig.json b/pkg/iac-providers/terraform/v14/testdata/tfjson/fullconfig.json
new file mode 100644
index 000000000..307ab6619
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/tfjson/fullconfig.json
@@ -0,0 +1,184 @@
+{
+  "aws_instance": [
+    {
+      "id": "aws_instance.instance_playground",
+      "name": "instance_playground",
+      "source": "config1.tf",
+      "line": 77,
+      "type": "aws_instance",
+      "config": {
+        "ami": "${lookup(var.aws_amis, var.aws_region)}",
+        "instance_type": "${var.instance_type}",
+        "key_name": "${aws_key_pair.ec2key_playground.key_name}",
+        "provisioner": [
+          {
+            "remote-exec": {
+              "connection": [
+                {
+                  "host": "${self.public_ip}",
+                  "private_key": "${file(var.privateKey)}",
+                  "type": "ssh",
+                  "user": "ubuntu"
+                }
+              ],
+              "inline": [
+                "sudo apt-get -y update",
+                "sudo apt-get -y install nginx",
+                "sudo touch /var/www/html/index.html",
+                "echo HelloWorld | sudo tee -a /var/www/html/index.html",
+                "sudo service nginx start"
+              ]
+            }
+          }
+        ],
+        "subnet_id": "${aws_subnet.subnet_public_playground.id}",
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        },
+        "vpc_security_group_ids": [
+          "${aws_security_group.sg_playground.id}"
+        ]
+      }
+    }
+  ],
+  "aws_internet_gateway": [
+    {
+      "id": "aws_internet_gateway.igw_playground",
+      "name": "igw_playground",
+      "source": "config1.tf",
+      "line": 14,
+      "type": "aws_internet_gateway",
+      "config": {
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        },
+        "vpc_id": "${aws_vpc.vpc_playground.id}"
+      }
+    }
+  ],
+  "aws_key_pair": [
+    {
+      "id": "aws_key_pair.ec2key_playground",
+      "name": "ec2key_playground",
+      "source": "config1.tf",
+      "line": 72,
+      "type": "aws_key_pair",
+      "config": {
+        "key_name": "testKey",
+        "public_key": "${file(var.public_key_path)}"
+      }
+    }
+  ],
+  "aws_route_table": [
+    {
+      "id": "aws_route_table.rtb_public_playground",
+      "name": "rtb_public_playground",
+      "source": "config1.tf",
+      "line": 30,
+      "type": "aws_route_table",
+      "config": {
+        "route": [
+          {
+            "cidr_block": "0.0.0.0/0",
+            "gateway_id": "${aws_internet_gateway.igw_playground.id}"
+          }
+        ],
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        },
+        "vpc_id": "${aws_vpc.vpc_playground.id}"
+      }
+    }
+  ],
+  "aws_route_table_association": [
+    {
+      "id": "aws_route_table_association.rta_subnet_public_playground",
+      "name": "rta_subnet_public_playground",
+      "source": "config1.tf",
+      "line": 41,
+      "type": "aws_route_table_association",
+      "config": {
+        "route_table_id": "${aws_route_table.rtb_public_playground.id}",
+        "subnet_id": "${aws_subnet.subnet_public_playground.id}"
+      }
+    }
+  ],
+  "aws_security_group": [
+    {
+      "id": "aws_security_group.sg_playground",
+      "name": "sg_playground",
+      "source": "config1.tf",
+      "line": 46,
+      "type": "aws_security_group",
+      "config": {
+        "egress": [
+          {
+            "cidr_blocks": [
+              "0.0.0.0/0"
+            ],
+            "from_port": 0,
+            "protocol": "-1",
+            "to_port": 0
+          }
+        ],
+        "ingress": [
+          {
+            "cidr_blocks": [
+              "0.0.0.0/0"
+            ],
+            "from_port": 22,
+            "protocol": "tcp",
+            "to_port": 22
+          },
+          {
+            "cidr_blocks": [
+              "0.0.0.0/0"
+            ],
+            "from_port": 80,
+            "protocol": "tcp",
+            "to_port": 80
+          }
+        ],
+        "name": "sg",
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        },
+        "vpc_id": "${aws_vpc.vpc_playground.id}"
+      }
+    }
+  ],
+  "aws_subnet": [
+    {
+      "id": "aws_subnet.subnet_public_playground",
+      "name": "subnet_public_playground",
+      "source": "config1.tf",
+      "line": 21,
+      "type": "aws_subnet",
+      "config": {
+        "cidr_block": "${var.cidr_subnet}",
+        "map_public_ip_on_launch": "true",
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        },
+        "vpc_id": "${aws_vpc.vpc_playground.id}"
+      }
+    }
+  ],
+  "aws_vpc": [
+    {
+      "id": "aws_vpc.vpc_playground",
+      "name": "vpc_playground",
+      "source": "config1.tf",
+      "line": 5,
+      "type": "aws_vpc",
+      "config": {
+        "cidr_block": "${var.cidr_vpc}",
+        "enable_dns_hostnames": true,
+        "enable_dns_support": true,
+        "tags": {
+          "Environment": "${var.environment_tag}"
+        }
+      }
+    }
+  ]
+}
diff --git a/pkg/iac-providers/terraform/v14/testdata/tfjson/moduleconfigs.json b/pkg/iac-providers/terraform/v14/testdata/tfjson/moduleconfigs.json
new file mode 100644
index 000000000..24ca4acce
--- /dev/null
+++ b/pkg/iac-providers/terraform/v14/testdata/tfjson/moduleconfigs.json
@@ -0,0 +1,348 @@
+{
+  "aws_cloudfront_distribution": [
+    {
+      "id": "aws_cloudfront_distribution.s3-distribution-TLS-v1",
+      "name": "s3-distribution-TLS-v1",
+      "source": "cloudfront/main.tf",
+      "line": 6,
+      "type": "aws_cloudfront_distribution",
+      "config": {
+        "default_cache_behavior": [
+          {
+            "allowed_methods": [
+              "DELETE",
+              "GET",
+              "HEAD",
+              "OPTIONS",
+              "PATCH",
+              "POST",
+              "PUT"
+            ],
+            "cached_methods": [
+              "GET",
+              "HEAD"
+            ],
+            "forwarded_values": [
+              {
+                "cookies": [
+                  {
+                    "forward": "none"
+                  }
+                ],
+                "query_string": false
+              }
+            ],
+            "target_origin_id": "${local.s3_origin_id}",
+            "viewer_protocol_policy": "https-only"
+          }
+        ],
+        "enabled": true,
+        "ordered_cache_behavior": [
+          {
+            "allowed_methods": [
+              "GET",
+              "HEAD",
+              "OPTIONS"
+            ],
+            "cached_methods": [
+              "GET",
+              "HEAD",
+              "OPTIONS"
+            ],
+            "compress": true,
+            "forwarded_values": [
+              {
+                "cookies": [
+                  {
+                    "forward": "none"
+                  }
+                ],
+                "headers": [
+                  "Origin"
+                ],
+                "query_string": false
+              }
+            ],
+            "path_pattern": "/content/immutable/*",
+            "target_origin_id": "${local.s3_origin_id}",
+            "viewer_protocol_policy": "allow-all"
+          },
+          {
+            "allowed_methods": [
+              "GET",
+              "HEAD",
+              "OPTIONS"
+            ],
+            "cached_methods": [
+              "GET",
+              "HEAD"
+            ],
+            "forwarded_values": [
+              {
+                "cookies": [
+                  {
+                    "forward": "none"
+                  }
+                ],
+                "query_string": false
+              }
+            ],
+            "path_pattern": "/content/*",
+            "target_origin_id": "${local.s3_origin_id}",
+            "viewer_protocol_policy": "allow-all"
+          }
+        ],
+        "origin": [
+          {
+            "domain_name": "aws_s3_bucket.b.bucket_regional_domain_name",
+            "origin_id": "${local.s3_origin_id}",
+            "s3_origin_config": [
+              {
+                "origin_access_identity": "origin-access-identity/cloudfront/ABCDEFG1234567"
+              }
+            ]
+          }
+        ],
+        "restrictions": [
+          {
+            "geo_restriction": [
+              {
+                "locations": [
+                  "US",
+                  "CA",
+                  "GB",
+                  "DE"
+                ],
+                "restriction_type": "whitelist"
+              }
+            ]
+          }
+        ],
+        "viewer_certificate": [
+          {
+            "cloudfront_default_certificate": true,
+            "minimum_protocol_version": "TLSv1"
+          }
+        ]
+      }
+    }
+  ],
+  "aws_cloudtrail": [
+    {
+      "id": "aws_cloudtrail.missing-multi-region",
+      "name": "missing-multi-region",
+      "source": "cloudtrail/main.tf",
+      "line": 1,
+      "type": "aws_cloudtrail",
+      "config": {
+        "include_global_service_events": false,
+        "name": "tf-trail-foobar",
+        "s3_bucket_name": "some-s3-bucket",
+        "s3_key_prefix": "prefix"
+      }
+    }
+  ],
+  "aws_ecs_task_definition": [
+    {
+      "id": "aws_ecs_task_definition.instanceNotInVpc",
+      "name": "instanceNotInVpc",
+      "source": "ecs/main.tf",
+      "line": 1,
+      "type": "aws_ecs_task_definition",
+      "config": {
+        "container_definitions": "${file(\"ecs/service.json\")}",
+        "family": "service",
+        "network_mode": "bridge"
+      }
+    }
+  ],
+  "aws_efs_file_system": [
+    {
+      "id": "aws_efs_file_system.efsNotEncrypted",
+      "name": "efsNotEncrypted",
+      "source": "efs/main.tf",
+      "line": 1,
+      "type": "aws_efs_file_system",
+      "config": {
+        "creation_token": "my-product",
+        "tags": {
+          "Name": "not-encrypted"
+        }
+      }
+    }
+  ],
+  "aws_elasticache_cluster": [
+    {
+      "id": "aws_elasticache_cluster.noMemcachedInElastiCache",
+      "name": "noMemcachedInElastiCache",
+      "source": "../relative-moduleconfigs/elasticcache/main.tf",
+      "line": 1,
+      "type": "aws_elasticache_cluster",
+      "config": {
+        "cluster_id": "cluster-example",
+        "engine": "memcached",
+        "node_type": "cache.m4.large",
+        "num_cache_nodes": 2,
+        "parameter_group_name": "default.memcached1.4",
+        "port": 11211
+      }
+    }
+  ],
+  "aws_guardduty_detector": [
+    {
+      "id": "aws_guardduty_detector.gaurdDutyDisabled",
+      "name": "gaurdDutyDisabled",
+      "source": "guardduty/main.tf",
+      "line": 1,
+      "type": "aws_guardduty_detector",
+      "config": {
+        "enable": false
+      }
+    }
+  ],
+  "aws_iam_access_key": [
+    {
+      "id": "aws_iam_access_key.noAccessKeyForRootAccount",
+      "name": "noAccessKeyForRootAccount",
+      "source": "iam/main.tf",
+      "line": 1,
+      "type": "aws_iam_access_key",
+      "config": {
+        "pgp_key": "keybase:some_person_that_exists",
+        "status": "Inactive",
+        "user": "root"
+      }
+    }
+  ],
+  "aws_kinesis_stream": [
+    {
+      "id": "aws_kinesis_stream.kinesisEncryptedWithKms",
+      "name": "kinesisEncryptedWithKms",
+      "source": "kinesis/main.tf",
+      "line": 1,
+      "type": "aws_kinesis_stream",
+      "config": {
+        "encryption_type": "KMS",
+        "kms_key_id": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+        "name": "kinesisEncryptedWithKms",
+        "retention_period": 48,
+        "shard_count": 1,
+        "shard_level_metrics": [
+          "IncomingBytes",
+          "OutgoingBytes"
+        ],
+        "tags": {
+          "Environment": "kinesisEncryptedWithKms"
+        }
+      }
+    }
+  ],
+  "aws_kms_key": [
+    {
+      "id": "aws_kms_key.kmsKeyDisabled",
+      "name": "kmsKeyDisabled",
+      "source": "cloudfront/sub-cloudfront/main.tf",
+      "line": 1,
+      "type": "aws_kms_key",
+      "config": {
+        "description": "KMS key 2",
+        "is_enabled": false,
+        "tags": {
+          "Name": "kmsKeyDisabled",
+          "Setup": "self-healing"
+        }
+      }
+    }
+  ],
+  "aws_load_balancer_policy": [
+    {
+      "id": "aws_load_balancer_policy.elbWeakCipher",
+      "name": "elbWeakCipher",
+      "source": "elb/main.tf",
+      "line": 1,
+      "type": "aws_load_balancer_policy",
+      "config": {
+        "load_balancer_name": "some-name",
+        "policy_attribute": [
+          {
+            "name": "ECDHE-RSA-RC4-SHA",
+            "value": "true"
+          }
+        ],
+        "policy_name": "wu-tang-ssl",
+        "policy_type_name": "SSLNegotiationPolicyType"
+      }
+    }
+  ],
+  "aws_s3_bucket": [
+    {
+      "id": "aws_s3_bucket.noS3BucketSseRules",
+      "name": "noS3BucketSseRules",
+      "source": "s3/main.tf",
+      "line": 1,
+      "type": "aws_s3_bucket",
+      "config": {
+        "acl": "private",
+        "bucket": "mybucket",
+        "tags": {
+          "Environment": "Dev",
+          "Name": "nos3BucketSseRules"
+        }
+      }
+    }
+  ],
+  "aws_security_group": [
+    {
+      "id": "aws_security_group.acme_web",
+      "name": "acme_web",
+      "source": "sg/main.tf",
+      "line": 1,
+      "type": "aws_security_group",
+      "config": {
+        "description": "Used in the terraform",
+        "egress": [
+          {
+            "cidr_blocks": [
+              "0.0.0.0/0",
+              "192.164.0.0/24"
+            ],
+            "from_port": 0,
+            "protocol": "-1",
+            "to_port": 0
+          }
+        ],
+        "ingress": [
+          {
+            "cidr_blocks": [
+              "0.0.0.0/0",
+              "19.16.0.0/24"
+            ],
+            "from_port": 22,
+            "protocol": "tcp",
+            "to_port": 22
+          }
+        ],
+        "name": "acme_web",
+        "tags": {
+          "Name": "acme_web"
+        },
+        "vpc_id": "some_dummy_vpc"
+      }
+    }
+  ],
+  "aws_sqs_queue": [
+    {
+      "id": "aws_sqs_queue.sqsQueueExposed",
+      "name": "sqsQueueExposed",
+      "source": "sqs/main.tf",
+      "line": 1,
+      "type": "aws_sqs_queue",
+      "config": {
+        "kms_data_key_reuse_period_seconds": 300,
+        "kms_master_key_id": "alias/aws/sqs",
+        "name": "terraform-example-queue",
+        "policy": "{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [{\n    \"Sid\":\"Queue1_AnonymousAccess_AllActions_WhitelistIP\",\n    \"Effect\": \"Allow\",\n    \"Principal\": \"*\",\n    \"Action\": \"sqs:*\",\n    \"Resource\": \"arn:aws:sqs:*:111122223333:queue1\"\n  }] \n}\n"
+      }
+    }
+  ]
+}
diff --git a/pkg/runtime/executor_test.go b/pkg/runtime/executor_test.go
index dcc82acad..db1a50fcc 100644
--- a/pkg/runtime/executor_test.go
+++ b/pkg/runtime/executor_test.go
@@ -25,6 +25,7 @@ import (
 	iacProvider "github.com/accurics/terrascan/pkg/iac-providers"
 	"github.com/accurics/terrascan/pkg/iac-providers/output"
 	tfv12 "github.com/accurics/terrascan/pkg/iac-providers/terraform/v12"
+	tfv14 "github.com/accurics/terrascan/pkg/iac-providers/terraform/v14"
 	"github.com/accurics/terrascan/pkg/notifications"
 	"github.com/accurics/terrascan/pkg/notifications/webhook"
 	"github.com/accurics/terrascan/pkg/policy"
@@ -179,6 +180,103 @@ func TestInit(t *testing.T) {
 		wantErr         error
 		wantIacProvider iacProvider.IacProvider
 		wantNotifiers   []notifications.Notifier
+	}{
+		{
+			name: "valid filePath",
+			executor: Executor{
+				filePath:   "./testdata/testfile",
+				dirPath:    "",
+				cloudType:  []string{"aws"},
+				iacType:    "terraform",
+				iacVersion: "v14",
+				policyPath: []string{"./testdata/testpolicies"},
+			},
+			wantErr:         nil,
+			wantIacProvider: &tfv14.TfV14{},
+			wantNotifiers:   []notifications.Notifier{},
+		},
+		{
+			name: "valid notifier",
+			executor: Executor{
+				filePath:   "./testdata/testfile",
+				dirPath:    "",
+				cloudType:  []string{"aws"},
+				iacType:    "terraform",
+				iacVersion: "v14",
+				configFile: "./testdata/webhook.toml",
+				policyPath: []string{"./testdata/testpolicies"},
+			},
+			wantErr:         nil,
+			wantIacProvider: &tfv14.TfV14{},
+			wantNotifiers:   []notifications.Notifier{&webhook.Webhook{}},
+		},
+		{
+			name: "invalid notifier",
+			executor: Executor{
+				filePath:   "./testdata/testfile",
+				dirPath:    "",
+				cloudType:  []string{"aws"},
+				iacType:    "terraform",
+				iacVersion: "v14",
+				configFile: "testdata/invalid-notifier.toml",
+			},
+			wantErr:         fmt.Errorf("notifier not supported"),
+			wantIacProvider: &tfv14.TfV14{},
+			wantNotifiers:   []notifications.Notifier{&webhook.Webhook{}},
+		},
+		{
+			name: "config not present",
+			executor: Executor{
+				filePath:   "./testdata/testfile",
+				dirPath:    "",
+				cloudType:  []string{"aws"},
+				iacType:    "terraform",
+				iacVersion: "v14",
+				configFile: "./testdata/does-not-exist",
+			},
+			wantErr:         config.ErrNotPresent,
+			wantIacProvider: nil,
+		},
+		{
+			name: "invalid policy path",
+			executor: Executor{
+				filePath:   "./testdata/testfile",
+				dirPath:    "",
+				cloudType:  []string{"aws"},
+				iacType:    "terraform",
+				iacVersion: "v14",
+				configFile: "./testdata/webhook.toml",
+				policyPath: []string{"./testdata/notthere"},
+			},
+			wantErr:         fmt.Errorf("failed to initialize OPA policy engine"),
+			wantIacProvider: &tfv14.TfV14{},
+			wantNotifiers:   []notifications.Notifier{&webhook.Webhook{}},
+		},
+	}
+
+	for _, tt := range table {
+		t.Run(tt.name, func(t *testing.T) {
+			gotErr := tt.executor.Init()
+			if !reflect.DeepEqual(gotErr, tt.wantErr) {
+				t.Errorf("unexpected error; gotErr: '%v', wantErr: '%v'", gotErr, tt.wantErr)
+			}
+			if !reflect.DeepEqual(tt.executor.iacProvider, tt.wantIacProvider) {
+				t.Errorf("got: '%v', want: '%v'", tt.executor.iacProvider, tt.wantIacProvider)
+			}
+			for i, notifier := range tt.executor.notifiers {
+				if !reflect.DeepEqual(reflect.TypeOf(notifier), reflect.TypeOf(tt.wantNotifiers[i])) {
+					t.Errorf("got: '%v', want: '%v'", reflect.TypeOf(notifier), reflect.TypeOf(tt.wantNotifiers[i]))
+				}
+			}
+		})
+	}
+
+	table = []struct {
+		name            string
+		executor        Executor
+		wantErr         error
+		wantIacProvider iacProvider.IacProvider
+		wantNotifiers   []notifications.Notifier
 	}{
 		{
 			name: "valid filePath",
diff --git a/pkg/runtime/validate_test.go b/pkg/runtime/validate_test.go
index d82de68e6..23534884b 100644
--- a/pkg/runtime/validate_test.go
+++ b/pkg/runtime/validate_test.go
@@ -35,7 +35,7 @@ func TestValidateInputs(t *testing.T) {
 				dirPath:    "",
 				cloudType:  []string{"aws"},
 				iacType:    "terraform",
-				iacVersion: "v12",
+				iacVersion: "v14",
 			},
 			wantErr: nil,
 		},
@@ -46,7 +46,7 @@ func TestValidateInputs(t *testing.T) {
 				dirPath:    "./testdata/testdir",
 				cloudType:  []string{"aws"},
 				iacType:    "terraform",
-				iacVersion: "v12",
+				iacVersion: "v14",
 			},
 			wantErr: nil,
 		},
@@ -79,7 +79,7 @@ func TestValidateInputs(t *testing.T) {
 				dirPath:    "./testdata/testdir",
 				cloudType:  []string{"aws"},
 				iacType:    "notthere",
-				iacVersion: "v12",
+				iacVersion: "v14",
 			},
 			wantErr: errIacNotSupported,
 		},