diff --git a/cmd/cmd_dnshelp.go b/cmd/cmd_dnshelp.go
index 37f4d6c7..33592112 100644
--- a/cmd/cmd_dnshelp.go
+++ b/cmd/cmd_dnshelp.go
@@ -2,6 +2,7 @@ package cmd
 
 import (
 	"fmt"
+	"io"
 	"os"
 	"strings"
 	"text/tabwriter"
@@ -27,22 +28,46 @@ func dnsHelp(ctx *cli.Context) error {
 	code := ctx.String("code")
 	if code == "" {
 		w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
+		ew := &errWriter{w: w}
 
-		fmt.Fprintln(w, `Credentials for DNS providers must be passed through environment variables.`)
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `To display the documentation for a DNS providers:`)
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, "\t$ lego dnshelp -c code")
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, "All DNS codes:")
-		fmt.Fprintf(w, "\t%s\n", allDNSCodes())
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, "More information: https://go-acme.github.io/lego/dns")
+		ew.writeln(`Credentials for DNS providers must be passed through environment variables.`)
+		ew.writeln()
+		ew.writeln(`To display the documentation for a DNS providers:`)
+		ew.writeln()
+		ew.writeln("\t$ lego dnshelp -c code")
+		ew.writeln()
+		ew.writeln("All DNS codes:")
+		ew.writef("\t%s\n", allDNSCodes())
+		ew.writeln()
+		ew.writeln("More information: https://go-acme.github.io/lego/dns")
+
+		if ew.err != nil {
+			return ew.err
+		}
 
 		return w.Flush()
 	}
 
-	displayDNSHelp(strings.ToLower(code))
-
-	return nil
+	return displayDNSHelp(strings.ToLower(code))
+}
+
+type errWriter struct {
+	w   io.Writer
+	err error
+}
+
+func (ew *errWriter) writeln(a ...interface{}) {
+	if ew.err != nil {
+		return
+	}
+
+	_, ew.err = fmt.Fprintln(ew.w, a...)
+}
+
+func (ew *errWriter) writef(format string, a ...interface{}) {
+	if ew.err != nil {
+		return
+	}
+
+	_, ew.err = fmt.Fprintf(ew.w, format, a...)
 }
diff --git a/cmd/zz_gen_cmd_dnshelp.go b/cmd/zz_gen_cmd_dnshelp.go
index 8ef2e4d1..dd09423d 100644
--- a/cmd/zz_gen_cmd_dnshelp.go
+++ b/cmd/zz_gen_cmd_dnshelp.go
@@ -9,8 +9,6 @@ import (
 	"sort"
 	"strings"
 	"text/tabwriter"
-
-	"github.com/go-acme/lego/log"
 )
 
 func allDNSCodes() string {
@@ -80,1257 +78,1264 @@ func allDNSCodes() string {
 	return strings.Join(providers, ", ")
 }
 
-func displayDNSHelp(name string) {
+func displayDNSHelp(name string) error {
 	w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
+	ew := &errWriter{w: w}
+
 	switch name {
 
 	case "acme-dns":
 		// generated from: providers/dns/acmedns/acmedns.toml
-		fmt.Fprintln(w, `Configuration for Joohoi's ACME-DNS.`)
-		fmt.Fprintln(w, `Code:	'acme-dns'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Joohoi's ACME-DNS.`)
+		ew.writeln(`Code:	'acme-dns'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "ACME_DNS_API_BASE":	The ACME-DNS API address`)
-		fmt.Fprintln(w, `	- "ACME_DNS_STORAGE_PATH":	The ACME-DNS JSON account data file. A per-domain account will be registered/persisted to this file and used for TXT updates.`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "ACME_DNS_API_BASE":	The ACME-DNS API address`)
+		ew.writeln(`	- "ACME_DNS_STORAGE_PATH":	The ACME-DNS JSON account data file. A per-domain account will be registered/persisted to this file and used for TXT updates.`)
+		ew.writeln()
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/acme-dns`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/acme-dns`)
 
 	case "alidns":
 		// generated from: providers/dns/alidns/alidns.toml
-		fmt.Fprintln(w, `Configuration for Alibaba Cloud DNS.`)
-		fmt.Fprintln(w, `Code:	'alidns'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Alibaba Cloud DNS.`)
+		ew.writeln(`Code:	'alidns'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "ALICLOUD_ACCESS_KEY":	Access key ID`)
-		fmt.Fprintln(w, `	- "ALICLOUD_SECRET_KEY":	Access Key secret`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "ALICLOUD_ACCESS_KEY":	Access key ID`)
+		ew.writeln(`	- "ALICLOUD_SECRET_KEY":	Access Key secret`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "ALICLOUD_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "ALICLOUD_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "ALICLOUD_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "ALICLOUD_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "ALICLOUD_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "ALICLOUD_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "ALICLOUD_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "ALICLOUD_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/alidns`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/alidns`)
 
 	case "auroradns":
 		// generated from: providers/dns/auroradns/auroradns.toml
-		fmt.Fprintln(w, `Configuration for Aurora DNS.`)
-		fmt.Fprintln(w, `Code:	'auroradns'`)
-		fmt.Fprintln(w, `Since:	'v0.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Aurora DNS.`)
+		ew.writeln(`Code:	'auroradns'`)
+		ew.writeln(`Since:	'v0.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "AURORA_ENDPOINT":	API endpoint URL`)
-		fmt.Fprintln(w, `	- "AURORA_KEY":	User API key`)
-		fmt.Fprintln(w, `	- "AURORA_USER_ID":	User ID`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "AURORA_ENDPOINT":	API endpoint URL`)
+		ew.writeln(`	- "AURORA_KEY":	User API key`)
+		ew.writeln(`	- "AURORA_USER_ID":	User ID`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "AURORA_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "AURORA_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "AURORA_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "AURORA_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "AURORA_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "AURORA_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/auroradns`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/auroradns`)
 
 	case "azure":
 		// generated from: providers/dns/azure/azure.toml
-		fmt.Fprintln(w, `Configuration for Azure.`)
-		fmt.Fprintln(w, `Code:	'azure'`)
-		fmt.Fprintln(w, `Since:	'v0.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Azure.`)
+		ew.writeln(`Code:	'azure'`)
+		ew.writeln(`Since:	'v0.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "AZURE_CLIENT_ID":	Client ID`)
-		fmt.Fprintln(w, `	- "AZURE_CLIENT_SECRET":	Client secret`)
-		fmt.Fprintln(w, `	- "AZURE_RESOURCE_GROUP":	Resource group`)
-		fmt.Fprintln(w, `	- "AZURE_SUBSCRIPTION_ID":	Subscription ID`)
-		fmt.Fprintln(w, `	- "AZURE_TENANT_ID":	Tenant ID`)
-		fmt.Fprintln(w, `	- "instance metadata service":	If the credentials are **not** set via the environment, then it will attempt to get a bearer token via the [instance metadata service](https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service).`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "AZURE_CLIENT_ID":	Client ID`)
+		ew.writeln(`	- "AZURE_CLIENT_SECRET":	Client secret`)
+		ew.writeln(`	- "AZURE_RESOURCE_GROUP":	Resource group`)
+		ew.writeln(`	- "AZURE_SUBSCRIPTION_ID":	Subscription ID`)
+		ew.writeln(`	- "AZURE_TENANT_ID":	Tenant ID`)
+		ew.writeln(`	- "instance metadata service":	If the credentials are **not** set via the environment, then it will attempt to get a bearer token via the [instance metadata service](https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service).`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "AZURE_METADATA_ENDPOINT":	Metadata Service endpoint URL`)
-		fmt.Fprintln(w, `	- "AZURE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "AZURE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "AZURE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "AZURE_METADATA_ENDPOINT":	Metadata Service endpoint URL`)
+		ew.writeln(`	- "AZURE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "AZURE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "AZURE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/azure`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/azure`)
 
 	case "bindman":
 		// generated from: providers/dns/bindman/bindman.toml
-		fmt.Fprintln(w, `Configuration for Bindman.`)
-		fmt.Fprintln(w, `Code:	'bindman'`)
-		fmt.Fprintln(w, `Since:	'v2.6.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Bindman.`)
+		ew.writeln(`Code:	'bindman'`)
+		ew.writeln(`Since:	'v2.6.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "BINDMAN_MANAGER_ADDRESS":	The server URL, should have scheme, hostname, and port (if required) of the Bindman-DNS Manager server`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "BINDMAN_MANAGER_ADDRESS":	The server URL, should have scheme, hostname, and port (if required) of the Bindman-DNS Manager server`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "BINDMAN_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "BINDMAN_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "BINDMAN_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "BINDMAN_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "BINDMAN_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "BINDMAN_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/bindman`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/bindman`)
 
 	case "bluecat":
 		// generated from: providers/dns/bluecat/bluecat.toml
-		fmt.Fprintln(w, `Configuration for Bluecat.`)
-		fmt.Fprintln(w, `Code:	'bluecat'`)
-		fmt.Fprintln(w, `Since:	'v0.5.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Bluecat.`)
+		ew.writeln(`Code:	'bluecat'`)
+		ew.writeln(`Since:	'v0.5.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "BLUECAT_CONFIG_NAME":	Configuration name`)
-		fmt.Fprintln(w, `	- "BLUECAT_DNS_VIEW":	External DNS View Name`)
-		fmt.Fprintln(w, `	- "BLUECAT_PASSWORD":	API password`)
-		fmt.Fprintln(w, `	- "BLUECAT_SERVER_URL":	The server URL, should have scheme, hostname, and port (if required) of the authoritative Bluecat BAM serve`)
-		fmt.Fprintln(w, `	- "BLUECAT_USER_NAME":	API username`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "BLUECAT_CONFIG_NAME":	Configuration name`)
+		ew.writeln(`	- "BLUECAT_DNS_VIEW":	External DNS View Name`)
+		ew.writeln(`	- "BLUECAT_PASSWORD":	API password`)
+		ew.writeln(`	- "BLUECAT_SERVER_URL":	The server URL, should have scheme, hostname, and port (if required) of the authoritative Bluecat BAM serve`)
+		ew.writeln(`	- "BLUECAT_USER_NAME":	API username`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "BLUECAT_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "BLUECAT_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "BLUECAT_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "BLUECAT_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "BLUECAT_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "BLUECAT_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "BLUECAT_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "BLUECAT_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/bluecat`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/bluecat`)
 
 	case "cloudflare":
 		// generated from: providers/dns/cloudflare/cloudflare.toml
-		fmt.Fprintln(w, `Configuration for Cloudflare.`)
-		fmt.Fprintln(w, `Code:	'cloudflare'`)
-		fmt.Fprintln(w, `Since:	'v0.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Cloudflare.`)
+		ew.writeln(`Code:	'cloudflare'`)
+		ew.writeln(`Since:	'v0.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "CF_API_EMAIL":	Account email`)
-		fmt.Fprintln(w, `	- "CF_API_KEY":	API key`)
-		fmt.Fprintln(w, `	- "CLOUDFLARE_API_KEY":	Alias to CLOUDFLARE_API_KEY`)
-		fmt.Fprintln(w, `	- "CLOUDFLARE_EMAIL":	Alias to CF_API_EMAIL`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "CF_API_EMAIL":	Account email`)
+		ew.writeln(`	- "CF_API_KEY":	API key`)
+		ew.writeln(`	- "CLOUDFLARE_API_KEY":	Alias to CLOUDFLARE_API_KEY`)
+		ew.writeln(`	- "CLOUDFLARE_EMAIL":	Alias to CF_API_EMAIL`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "CLOUDFLARE_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "CLOUDFLARE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "CLOUDFLARE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "CLOUDFLARE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "CLOUDFLARE_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "CLOUDFLARE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "CLOUDFLARE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "CLOUDFLARE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/cloudflare`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/cloudflare`)
 
 	case "cloudns":
 		// generated from: providers/dns/cloudns/cloudns.toml
-		fmt.Fprintln(w, `Configuration for ClouDNS.`)
-		fmt.Fprintln(w, `Code:	'cloudns'`)
-		fmt.Fprintln(w, `Since:	'v2.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for ClouDNS.`)
+		ew.writeln(`Code:	'cloudns'`)
+		ew.writeln(`Since:	'v2.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "CLOUDNS_AUTH_ID":	The API user ID`)
-		fmt.Fprintln(w, `	- "CLOUDNS_AUTH_PASSWORD":	The password for API user ID`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "CLOUDNS_AUTH_ID":	The API user ID`)
+		ew.writeln(`	- "CLOUDNS_AUTH_PASSWORD":	The password for API user ID`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "CLOUDNS_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "CLOUDNS_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "CLOUDNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "CLOUDNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "CLOUDNS_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "CLOUDNS_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "CLOUDNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "CLOUDNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/cloudns`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/cloudns`)
 
 	case "cloudxns":
 		// generated from: providers/dns/cloudxns/cloudxns.toml
-		fmt.Fprintln(w, `Configuration for CloudXNS.`)
-		fmt.Fprintln(w, `Code:	'cloudxns'`)
-		fmt.Fprintln(w, `Since:	'v0.5.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for CloudXNS.`)
+		ew.writeln(`Code:	'cloudxns'`)
+		ew.writeln(`Since:	'v0.5.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "CLOUDXNS_API_KEY":	The API key`)
-		fmt.Fprintln(w, `	- "CLOUDXNS_SECRET_KEY":	THe API secret key`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "CLOUDXNS_API_KEY":	The API key`)
+		ew.writeln(`	- "CLOUDXNS_SECRET_KEY":	THe API secret key`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "CLOUDXNS_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "CLOUDXNS_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "CLOUDXNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "CLOUDXNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "CLOUDXNS_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "CLOUDXNS_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "CLOUDXNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "CLOUDXNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/cloudxns`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/cloudxns`)
 
 	case "conoha":
 		// generated from: providers/dns/conoha/conoha.toml
-		fmt.Fprintln(w, `Configuration for ConoHa.`)
-		fmt.Fprintln(w, `Code:	'conoha'`)
-		fmt.Fprintln(w, `Since:	'v1.2.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for ConoHa.`)
+		ew.writeln(`Code:	'conoha'`)
+		ew.writeln(`Since:	'v1.2.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "CONOHA_API_PASSWORD":	The API password`)
-		fmt.Fprintln(w, `	- "CONOHA_API_USERNAME":	The API username`)
-		fmt.Fprintln(w, `	- "CONOHA_TENANT_ID":	Tenant ID`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "CONOHA_API_PASSWORD":	The API password`)
+		ew.writeln(`	- "CONOHA_API_USERNAME":	The API username`)
+		ew.writeln(`	- "CONOHA_TENANT_ID":	Tenant ID`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "CONOHA_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "CONOHA_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "CONOHA_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "CONOHA_REGION":	The region`)
-		fmt.Fprintln(w, `	- "CONOHA_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "CONOHA_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "CONOHA_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "CONOHA_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "CONOHA_REGION":	The region`)
+		ew.writeln(`	- "CONOHA_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/conoha`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/conoha`)
 
 	case "designate":
 		// generated from: providers/dns/designate/designate.toml
-		fmt.Fprintln(w, `Configuration for Designate DNSaaS for Openstack.`)
-		fmt.Fprintln(w, `Code:	'designate'`)
-		fmt.Fprintln(w, `Since:	'v2.2.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Designate DNSaaS for Openstack.`)
+		ew.writeln(`Code:	'designate'`)
+		ew.writeln(`Since:	'v2.2.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "OS_AUTH_URL":	Identity endpoint URL`)
-		fmt.Fprintln(w, `	- "OS_PASSWORD":	Password`)
-		fmt.Fprintln(w, `	- "OS_REGION_NAME":	Region name`)
-		fmt.Fprintln(w, `	- "OS_TENANT_NAME":	Tenant name`)
-		fmt.Fprintln(w, `	- "OS_USERNAME":	Username`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "OS_AUTH_URL":	Identity endpoint URL`)
+		ew.writeln(`	- "OS_PASSWORD":	Password`)
+		ew.writeln(`	- "OS_REGION_NAME":	Region name`)
+		ew.writeln(`	- "OS_TENANT_NAME":	Tenant name`)
+		ew.writeln(`	- "OS_USERNAME":	Username`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "DESIGNATE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "DESIGNATE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "DESIGNATE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "DESIGNATE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "DESIGNATE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "DESIGNATE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/designate`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/designate`)
 
 	case "digitalocean":
 		// generated from: providers/dns/digitalocean/digitalocean.toml
-		fmt.Fprintln(w, `Configuration for Digital Ocean.`)
-		fmt.Fprintln(w, `Code:	'digitalocean'`)
-		fmt.Fprintln(w, `Since:	'v0.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Digital Ocean.`)
+		ew.writeln(`Code:	'digitalocean'`)
+		ew.writeln(`Since:	'v0.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "DO_AUTH_TOKEN":	Authentication token`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "DO_AUTH_TOKEN":	Authentication token`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "DO_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "DO_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "DO_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "DO_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "DO_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "DO_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "DO_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "DO_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/digitalocean`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/digitalocean`)
 
 	case "dnsimple":
 		// generated from: providers/dns/dnsimple/dnsimple.toml
-		fmt.Fprintln(w, `Configuration for DNSimple.`)
-		fmt.Fprintln(w, `Code:	'dnsimple'`)
-		fmt.Fprintln(w, `Since:	'v0.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for DNSimple.`)
+		ew.writeln(`Code:	'dnsimple'`)
+		ew.writeln(`Since:	'v0.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "DNSIMPLE_BASE_URL":	API endpoint URL`)
-		fmt.Fprintln(w, `	- "DNSIMPLE_OAUTH_TOKEN":	OAuth token`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "DNSIMPLE_BASE_URL":	API endpoint URL`)
+		ew.writeln(`	- "DNSIMPLE_OAUTH_TOKEN":	OAuth token`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "DNSIMPLE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "DNSIMPLE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "DNSIMPLE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "DNSIMPLE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "DNSIMPLE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "DNSIMPLE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/dnsimple`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/dnsimple`)
 
 	case "dnsmadeeasy":
 		// generated from: providers/dns/dnsmadeeasy/dnsmadeeasy.toml
-		fmt.Fprintln(w, `Configuration for DNS Made Easy.`)
-		fmt.Fprintln(w, `Code:	'dnsmadeeasy'`)
-		fmt.Fprintln(w, `Since:	'v0.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for DNS Made Easy.`)
+		ew.writeln(`Code:	'dnsmadeeasy'`)
+		ew.writeln(`Since:	'v0.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "DNSMADEEASY_API_KEY":	The API key`)
-		fmt.Fprintln(w, `	- "DNSMADEEASY_API_SECRET":	The API Secret key`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "DNSMADEEASY_API_KEY":	The API key`)
+		ew.writeln(`	- "DNSMADEEASY_API_SECRET":	The API Secret key`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "DNSMADEEASY_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "DNSMADEEASY_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "DNSMADEEASY_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "DNSMADEEASY_SANDBOX":	Activate the sandbox (boolean)`)
-		fmt.Fprintln(w, `	- "DNSMADEEASY_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "DNSMADEEASY_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "DNSMADEEASY_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "DNSMADEEASY_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "DNSMADEEASY_SANDBOX":	Activate the sandbox (boolean)`)
+		ew.writeln(`	- "DNSMADEEASY_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/dnsmadeeasy`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/dnsmadeeasy`)
 
 	case "dnspod":
 		// generated from: providers/dns/dnspod/dnspod.toml
-		fmt.Fprintln(w, `Configuration for DNSPod.`)
-		fmt.Fprintln(w, `Code:	'dnspod'`)
-		fmt.Fprintln(w, `Since:	'v0.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for DNSPod.`)
+		ew.writeln(`Code:	'dnspod'`)
+		ew.writeln(`Since:	'v0.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "DNSPOD_API_KEY":	The user token`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "DNSPOD_API_KEY":	The user token`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "DNSPOD_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "DNSPOD_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "DNSPOD_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "DNSPOD_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "DNSPOD_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "DNSPOD_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "DNSPOD_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "DNSPOD_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/dnspod`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/dnspod`)
 
 	case "dode":
 		// generated from: providers/dns/dode/dode.toml
-		fmt.Fprintln(w, `Configuration for Domain Offensive (do.de).`)
-		fmt.Fprintln(w, `Code:	'dode'`)
-		fmt.Fprintln(w, `Since:	'v2.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Domain Offensive (do.de).`)
+		ew.writeln(`Code:	'dode'`)
+		ew.writeln(`Since:	'v2.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "DODE_TOKEN":	API token`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "DODE_TOKEN":	API token`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "DODE_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "DODE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "DODE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "DODE_SEQUENCE_INTERVAL":	Interval between iteration`)
-		fmt.Fprintln(w, `	- "DODE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "DODE_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "DODE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "DODE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "DODE_SEQUENCE_INTERVAL":	Interval between iteration`)
+		ew.writeln(`	- "DODE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/dode`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/dode`)
 
 	case "dreamhost":
 		// generated from: providers/dns/dreamhost/dreamhost.toml
-		fmt.Fprintln(w, `Configuration for DreamHost.`)
-		fmt.Fprintln(w, `Code:	'dreamhost'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for DreamHost.`)
+		ew.writeln(`Code:	'dreamhost'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "DREAMHOST_API_KEY":	The API key`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "DREAMHOST_API_KEY":	The API key`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "DREAMHOST_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "DREAMHOST_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "DREAMHOST_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "DREAMHOST_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "DREAMHOST_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "DREAMHOST_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "DREAMHOST_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "DREAMHOST_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/dreamhost`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/dreamhost`)
 
 	case "duckdns":
 		// generated from: providers/dns/duckdns/duckdns.toml
-		fmt.Fprintln(w, `Configuration for Duck DNS.`)
-		fmt.Fprintln(w, `Code:	'duckdns'`)
-		fmt.Fprintln(w, `Since:	'v0.5.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Duck DNS.`)
+		ew.writeln(`Code:	'duckdns'`)
+		ew.writeln(`Since:	'v0.5.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "DUCKDNS_TOKEN":	Account token`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "DUCKDNS_TOKEN":	Account token`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "DUCKDNS_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "DUCKDNS_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "DUCKDNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "DUCKDNS_SEQUENCE_INTERVAL":	Interval between iteration`)
-		fmt.Fprintln(w, `	- "DUCKDNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "DUCKDNS_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "DUCKDNS_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "DUCKDNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "DUCKDNS_SEQUENCE_INTERVAL":	Interval between iteration`)
+		ew.writeln(`	- "DUCKDNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/duckdns`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/duckdns`)
 
 	case "dyn":
 		// generated from: providers/dns/dyn/dyn.toml
-		fmt.Fprintln(w, `Configuration for Dyn.`)
-		fmt.Fprintln(w, `Code:	'dyn'`)
-		fmt.Fprintln(w, `Since:	'v0.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Dyn.`)
+		ew.writeln(`Code:	'dyn'`)
+		ew.writeln(`Since:	'v0.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "DYN_CUSTOMER_NAME":	Customer name`)
-		fmt.Fprintln(w, `	- "DYN_PASSWORD":	Paswword`)
-		fmt.Fprintln(w, `	- "DYN_USER_NAME":	User name`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "DYN_CUSTOMER_NAME":	Customer name`)
+		ew.writeln(`	- "DYN_PASSWORD":	Paswword`)
+		ew.writeln(`	- "DYN_USER_NAME":	User name`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "DYN_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "DYN_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "DYN_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "DYN_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "DYN_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "DYN_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "DYN_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "DYN_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/dyn`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/dyn`)
 
 	case "easydns":
 		// generated from: providers/dns/easydns/easydns.toml
-		fmt.Fprintln(w, `Configuration for EasyDNS.`)
-		fmt.Fprintln(w, `Code:	'easydns'`)
-		fmt.Fprintln(w, `Since:	'v2.6.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for EasyDNS.`)
+		ew.writeln(`Code:	'easydns'`)
+		ew.writeln(`Since:	'v2.6.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "EASYDNS_KEY":	API Key`)
-		fmt.Fprintln(w, `	- "EASYDNS_TOKEN":	API Token`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "EASYDNS_KEY":	API Key`)
+		ew.writeln(`	- "EASYDNS_TOKEN":	API Token`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "EASYDNS_ENDPOINT":	The endpoint URL of the API Server`)
-		fmt.Fprintln(w, `	- "EASYDNS_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "EASYDNS_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "EASYDNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "EASYDNS_SEQUENCE_INTERVAL":	Time between sequential requests`)
-		fmt.Fprintln(w, `	- "EASYDNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "EASYDNS_ENDPOINT":	The endpoint URL of the API Server`)
+		ew.writeln(`	- "EASYDNS_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "EASYDNS_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "EASYDNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "EASYDNS_SEQUENCE_INTERVAL":	Time between sequential requests`)
+		ew.writeln(`	- "EASYDNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/easydns`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/easydns`)
 
 	case "exec":
 		// generated from: providers/dns/exec/exec.toml
-		fmt.Fprintln(w, `Configuration for External program.`)
-		fmt.Fprintln(w, `Code:	'exec'`)
-		fmt.Fprintln(w, `Since:	'v0.5.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for External program.`)
+		ew.writeln(`Code:	'exec'`)
+		ew.writeln(`Since:	'v0.5.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/exec`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/exec`)
 
 	case "exoscale":
 		// generated from: providers/dns/exoscale/exoscale.toml
-		fmt.Fprintln(w, `Configuration for Exoscale.`)
-		fmt.Fprintln(w, `Code:	'exoscale'`)
-		fmt.Fprintln(w, `Since:	'v0.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Exoscale.`)
+		ew.writeln(`Code:	'exoscale'`)
+		ew.writeln(`Since:	'v0.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "EXOSCALE_API_KEY":	API key`)
-		fmt.Fprintln(w, `	- "EXOSCALE_API_SECRET":	API secret`)
-		fmt.Fprintln(w, `	- "EXOSCALE_ENDPOINT":	API endpoint URL`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "EXOSCALE_API_KEY":	API key`)
+		ew.writeln(`	- "EXOSCALE_API_SECRET":	API secret`)
+		ew.writeln(`	- "EXOSCALE_ENDPOINT":	API endpoint URL`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "EXOSCALE_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "EXOSCALE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "EXOSCALE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "EXOSCALE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "EXOSCALE_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "EXOSCALE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "EXOSCALE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "EXOSCALE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/exoscale`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/exoscale`)
 
 	case "fastdns":
 		// generated from: providers/dns/fastdns/fastdns.toml
-		fmt.Fprintln(w, `Configuration for FastDNS.`)
-		fmt.Fprintln(w, `Code:	'fastdns'`)
-		fmt.Fprintln(w, `Since:	'v0.5.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for FastDNS.`)
+		ew.writeln(`Code:	'fastdns'`)
+		ew.writeln(`Since:	'v0.5.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "AKAMAI_ACCESS_TOKEN":	Access token`)
-		fmt.Fprintln(w, `	- "AKAMAI_CLIENT_SECRET":	Client secret`)
-		fmt.Fprintln(w, `	- "AKAMAI_CLIENT_TOKEN":	Client token`)
-		fmt.Fprintln(w, `	- "AKAMAI_HOST":	API host`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "AKAMAI_ACCESS_TOKEN":	Access token`)
+		ew.writeln(`	- "AKAMAI_CLIENT_SECRET":	Client secret`)
+		ew.writeln(`	- "AKAMAI_CLIENT_TOKEN":	Client token`)
+		ew.writeln(`	- "AKAMAI_HOST":	API host`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "AKAMAI_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "AKAMAI_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "AKAMAI_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "AKAMAI_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "AKAMAI_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "AKAMAI_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/fastdns`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/fastdns`)
 
 	case "gandi":
 		// generated from: providers/dns/gandi/gandi.toml
-		fmt.Fprintln(w, `Configuration for Gandi.`)
-		fmt.Fprintln(w, `Code:	'gandi'`)
-		fmt.Fprintln(w, `Since:	'v0.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Gandi.`)
+		ew.writeln(`Code:	'gandi'`)
+		ew.writeln(`Since:	'v0.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "GANDI_API_KEY":	API key`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "GANDI_API_KEY":	API key`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "GANDI_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "GANDI_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "GANDI_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "GANDI_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "GANDI_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "GANDI_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "GANDI_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "GANDI_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/gandi`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/gandi`)
 
 	case "gandiv5":
 		// generated from: providers/dns/gandiv5/gandiv5.toml
-		fmt.Fprintln(w, `Configuration for Gandi Live DNS (v5).`)
-		fmt.Fprintln(w, `Code:	'gandiv5'`)
-		fmt.Fprintln(w, `Since:	'v0.5.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Gandi Live DNS (v5).`)
+		ew.writeln(`Code:	'gandiv5'`)
+		ew.writeln(`Since:	'v0.5.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "GANDIV5_API_KEY":	API key`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "GANDIV5_API_KEY":	API key`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "GANDIV5_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "GANDIV5_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "GANDIV5_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "GANDIV5_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "GANDIV5_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "GANDIV5_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "GANDIV5_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "GANDIV5_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/gandiv5`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/gandiv5`)
 
 	case "gcloud":
 		// generated from: providers/dns/gcloud/gcloud.toml
-		fmt.Fprintln(w, `Configuration for Google Cloud.`)
-		fmt.Fprintln(w, `Code:	'gcloud'`)
-		fmt.Fprintln(w, `Since:	'v0.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Google Cloud.`)
+		ew.writeln(`Code:	'gcloud'`)
+		ew.writeln(`Since:	'v0.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "Application Default Credentials":	[Documentation](https://cloud.google.com/docs/authentication/production#providing_credentials_to_your_application)`)
-		fmt.Fprintln(w, `	- "GCE_PROJECT":	Project name`)
-		fmt.Fprintln(w, `	- "GCE_SERVICE_ACCOUNT":	Account`)
-		fmt.Fprintln(w, `	- "GCE_SERVICE_ACCOUNT_FILE":	Account file path`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "Application Default Credentials":	[Documentation](https://cloud.google.com/docs/authentication/production#providing_credentials_to_your_application)`)
+		ew.writeln(`	- "GCE_PROJECT":	Project name`)
+		ew.writeln(`	- "GCE_SERVICE_ACCOUNT":	Account`)
+		ew.writeln(`	- "GCE_SERVICE_ACCOUNT_FILE":	Account file path`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "GCE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "GCE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "GCE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "GCE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "GCE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "GCE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/gcloud`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/gcloud`)
 
 	case "glesys":
 		// generated from: providers/dns/glesys/glesys.toml
-		fmt.Fprintln(w, `Configuration for Glesys.`)
-		fmt.Fprintln(w, `Code:	'glesys'`)
-		fmt.Fprintln(w, `Since:	'v0.5.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Glesys.`)
+		ew.writeln(`Code:	'glesys'`)
+		ew.writeln(`Since:	'v0.5.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "GLESYS_API_KEY":	API key`)
-		fmt.Fprintln(w, `	- "GLESYS_API_USER":	API user`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "GLESYS_API_KEY":	API key`)
+		ew.writeln(`	- "GLESYS_API_USER":	API user`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "GLESYS_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "GLESYS_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "GLESYS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "GLESYS_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "GLESYS_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "GLESYS_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "GLESYS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "GLESYS_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/glesys`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/glesys`)
 
 	case "godaddy":
 		// generated from: providers/dns/godaddy/godaddy.toml
-		fmt.Fprintln(w, `Configuration for Go Daddy.`)
-		fmt.Fprintln(w, `Code:	'godaddy'`)
-		fmt.Fprintln(w, `Since:	'v0.5.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Go Daddy.`)
+		ew.writeln(`Code:	'godaddy'`)
+		ew.writeln(`Since:	'v0.5.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "GODADDY_API_KEY":	API key`)
-		fmt.Fprintln(w, `	- "GODADDY_API_SECRET":	API secret`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "GODADDY_API_KEY":	API key`)
+		ew.writeln(`	- "GODADDY_API_SECRET":	API secret`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "GODADDY_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "GODADDY_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "GODADDY_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "GODADDY_SEQUENCE_INTERVAL":	Interval between iteration`)
-		fmt.Fprintln(w, `	- "GODADDY_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "GODADDY_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "GODADDY_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "GODADDY_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "GODADDY_SEQUENCE_INTERVAL":	Interval between iteration`)
+		ew.writeln(`	- "GODADDY_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/godaddy`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/godaddy`)
 
 	case "hostingde":
 		// generated from: providers/dns/hostingde/hostingde.toml
-		fmt.Fprintln(w, `Configuration for Hosting.de.`)
-		fmt.Fprintln(w, `Code:	'hostingde'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Hosting.de.`)
+		ew.writeln(`Code:	'hostingde'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "HOSTINGDE_API_KEY":	API key`)
-		fmt.Fprintln(w, `	- "HOSTINGDE_ZONE_NAME":	Zone name in ACE format`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "HOSTINGDE_API_KEY":	API key`)
+		ew.writeln(`	- "HOSTINGDE_ZONE_NAME":	Zone name in ACE format`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "HOSTINGDE_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "HOSTINGDE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "HOSTINGDE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "HOSTINGDE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "HOSTINGDE_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "HOSTINGDE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "HOSTINGDE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "HOSTINGDE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/hostingde`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/hostingde`)
 
 	case "httpreq":
 		// generated from: providers/dns/httpreq/httpreq.toml
-		fmt.Fprintln(w, `Configuration for HTTP request.`)
-		fmt.Fprintln(w, `Code:	'httpreq'`)
-		fmt.Fprintln(w, `Since:	'v2.0.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for HTTP request.`)
+		ew.writeln(`Code:	'httpreq'`)
+		ew.writeln(`Since:	'v2.0.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "HTTPREQ_ENDPOINT":	The URL of the server`)
-		fmt.Fprintln(w, `	- "HTTPREQ_MODE":	'RAW', none`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "HTTPREQ_ENDPOINT":	The URL of the server`)
+		ew.writeln(`	- "HTTPREQ_MODE":	'RAW', none`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "HTTPREQ_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "HTTPREQ_PASSWORD":	Basic authentication password`)
-		fmt.Fprintln(w, `	- "HTTPREQ_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "HTTPREQ_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "HTTPREQ_USERNAME":	Basic authentication username`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "HTTPREQ_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "HTTPREQ_PASSWORD":	Basic authentication password`)
+		ew.writeln(`	- "HTTPREQ_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "HTTPREQ_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "HTTPREQ_USERNAME":	Basic authentication username`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/httpreq`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/httpreq`)
 
 	case "iij":
 		// generated from: providers/dns/iij/iij.toml
-		fmt.Fprintln(w, `Configuration for Internet Initiative Japan.`)
-		fmt.Fprintln(w, `Code:	'iij'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Internet Initiative Japan.`)
+		ew.writeln(`Code:	'iij'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "IIJ_API_ACCESS_KEY":	API access key`)
-		fmt.Fprintln(w, `	- "IIJ_API_SECRET_KEY":	API secret key`)
-		fmt.Fprintln(w, `	- "IIJ_DO_SERVICE_CODE":	DO service code`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "IIJ_API_ACCESS_KEY":	API access key`)
+		ew.writeln(`	- "IIJ_API_SECRET_KEY":	API secret key`)
+		ew.writeln(`	- "IIJ_DO_SERVICE_CODE":	DO service code`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "IIJ_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "IIJ_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "IIJ_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "IIJ_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "IIJ_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "IIJ_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/iij`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/iij`)
 
 	case "inwx":
 		// generated from: providers/dns/inwx/inwx.toml
-		fmt.Fprintln(w, `Configuration for INWX.`)
-		fmt.Fprintln(w, `Code:	'inwx'`)
-		fmt.Fprintln(w, `Since:	'v2.0.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for INWX.`)
+		ew.writeln(`Code:	'inwx'`)
+		ew.writeln(`Since:	'v2.0.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "INWX_PASSWORD":	Password`)
-		fmt.Fprintln(w, `	- "INWX_USERNAME":	Username`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "INWX_PASSWORD":	Password`)
+		ew.writeln(`	- "INWX_USERNAME":	Username`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "INWX_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "INWX_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "INWX_SANDBOX":	Activate the sandbox (boolean)`)
-		fmt.Fprintln(w, `	- "INWX_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "INWX_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "INWX_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "INWX_SANDBOX":	Activate the sandbox (boolean)`)
+		ew.writeln(`	- "INWX_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/inwx`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/inwx`)
 
 	case "joker":
 		// generated from: providers/dns/joker/joker.toml
-		fmt.Fprintln(w, `Configuration for Joker.`)
-		fmt.Fprintln(w, `Code:	'joker'`)
-		fmt.Fprintln(w, `Since:	'v2.6.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Joker.`)
+		ew.writeln(`Code:	'joker'`)
+		ew.writeln(`Since:	'v2.6.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "JOKER_API_KEY":	API key`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "JOKER_API_KEY":	API key`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "JOKER_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "JOKER_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "JOKER_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "JOKER_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "JOKER_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "JOKER_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "JOKER_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "JOKER_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/joker`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/joker`)
 
 	case "lightsail":
 		// generated from: providers/dns/lightsail/lightsail.toml
-		fmt.Fprintln(w, `Configuration for Amazon Lightsail.`)
-		fmt.Fprintln(w, `Code:	'lightsail'`)
-		fmt.Fprintln(w, `Since:	'v0.5.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Amazon Lightsail.`)
+		ew.writeln(`Code:	'lightsail'`)
+		ew.writeln(`Since:	'v0.5.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "AWS_ACCESS_KEY_ID":	Access key ID`)
-		fmt.Fprintln(w, `	- "AWS_SECRET_ACCESS_KEY":	Secret access key`)
-		fmt.Fprintln(w, `	- "DNS_ZONE":	DNS zone`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "AWS_ACCESS_KEY_ID":	Access key ID`)
+		ew.writeln(`	- "AWS_SECRET_ACCESS_KEY":	Secret access key`)
+		ew.writeln(`	- "DNS_ZONE":	DNS zone`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "LIGHTSAIL_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "LIGHTSAIL_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "LIGHTSAIL_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "LIGHTSAIL_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/lightsail`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/lightsail`)
 
 	case "linode":
 		// generated from: providers/dns/linode/linode.toml
-		fmt.Fprintln(w, `Configuration for Linode (deprecated).`)
-		fmt.Fprintln(w, `Code:	'linode'`)
-		fmt.Fprintln(w, `Since:	'v0.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Linode (deprecated).`)
+		ew.writeln(`Code:	'linode'`)
+		ew.writeln(`Since:	'v0.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "LINODE_API_KEY":	API key`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "LINODE_API_KEY":	API key`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "LINODE_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "LINODE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "LINODE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "LINODE_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "LINODE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "LINODE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/linode`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/linode`)
 
 	case "linodev4":
 		// generated from: providers/dns/linodev4/linodev4.toml
-		fmt.Fprintln(w, `Configuration for Linode (v4).`)
-		fmt.Fprintln(w, `Code:	'linodev4'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Linode (v4).`)
+		ew.writeln(`Code:	'linodev4'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "LINODE_TOKEN":	API token`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "LINODE_TOKEN":	API token`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "LINODE_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "LINODE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "LINODE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "LINODE_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "LINODE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "LINODE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/linodev4`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/linodev4`)
 
 	case "mydnsjp":
 		// generated from: providers/dns/mydnsjp/mydnsjp.toml
-		fmt.Fprintln(w, `Configuration for MyDNS.jp.`)
-		fmt.Fprintln(w, `Code:	'mydnsjp'`)
-		fmt.Fprintln(w, `Since:	'v1.2.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for MyDNS.jp.`)
+		ew.writeln(`Code:	'mydnsjp'`)
+		ew.writeln(`Since:	'v1.2.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "MYDNSJP_MASTER_ID":	Master ID`)
-		fmt.Fprintln(w, `	- "MYDNSJP_PASSWORD":	Password`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "MYDNSJP_MASTER_ID":	Master ID`)
+		ew.writeln(`	- "MYDNSJP_PASSWORD":	Password`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "MYDNSJP_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "MYDNSJP_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "MYDNSJP_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "MYDNSJP_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "MYDNSJP_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "MYDNSJP_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "MYDNSJP_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "MYDNSJP_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/mydnsjp`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/mydnsjp`)
 
 	case "namecheap":
 		// generated from: providers/dns/namecheap/namecheap.toml
-		fmt.Fprintln(w, `Configuration for Namecheap.`)
-		fmt.Fprintln(w, `Code:	'namecheap'`)
-		fmt.Fprintln(w, `Since:	'v0.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Namecheap.`)
+		ew.writeln(`Code:	'namecheap'`)
+		ew.writeln(`Since:	'v0.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "NAMECHEAP_API_KEY":	API key`)
-		fmt.Fprintln(w, `	- "NAMECHEAP_API_USER":	API user`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "NAMECHEAP_API_KEY":	API key`)
+		ew.writeln(`	- "NAMECHEAP_API_USER":	API user`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "NAMECHEAP_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "NAMECHEAP_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "NAMECHEAP_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "NAMECHEAP_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "NAMECHEAP_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "NAMECHEAP_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "NAMECHEAP_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "NAMECHEAP_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/namecheap`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/namecheap`)
 
 	case "namedotcom":
 		// generated from: providers/dns/namedotcom/namedotcom.toml
-		fmt.Fprintln(w, `Configuration for Name.com.`)
-		fmt.Fprintln(w, `Code:	'namedotcom'`)
-		fmt.Fprintln(w, `Since:	'v0.5.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Name.com.`)
+		ew.writeln(`Code:	'namedotcom'`)
+		ew.writeln(`Since:	'v0.5.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "NAMECOM_API_TOKEN":	API token`)
-		fmt.Fprintln(w, `	- "NAMECOM_USERNAME":	Username`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "NAMECOM_API_TOKEN":	API token`)
+		ew.writeln(`	- "NAMECOM_USERNAME":	Username`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "NAMECOM_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "NAMECOM_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "NAMECOM_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "NAMECOM_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "NAMECOM_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "NAMECOM_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "NAMECOM_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "NAMECOM_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/namedotcom`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/namedotcom`)
 
 	case "namesilo":
 		// generated from: providers/dns/namesilo/namesilo.toml
-		fmt.Fprintln(w, `Configuration for Namesilo.`)
-		fmt.Fprintln(w, `Code:	'namesilo'`)
-		fmt.Fprintln(w, `Since:	'v2.7.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Namesilo.`)
+		ew.writeln(`Code:	'namesilo'`)
+		ew.writeln(`Since:	'v2.7.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "NAMESILO_API_KEY":	Client ID`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "NAMESILO_API_KEY":	Client ID`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "NAMESILO_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "NAMESILO_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation, it is better to set larger than 15m`)
-		fmt.Fprintln(w, `	- "NAMESILO_TTL":	The TTL of the TXT record used for the DNS challenge, should be in [3600, 2592000]`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "NAMESILO_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "NAMESILO_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation, it is better to set larger than 15m`)
+		ew.writeln(`	- "NAMESILO_TTL":	The TTL of the TXT record used for the DNS challenge, should be in [3600, 2592000]`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/namesilo`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/namesilo`)
 
 	case "netcup":
 		// generated from: providers/dns/netcup/netcup.toml
-		fmt.Fprintln(w, `Configuration for Netcup.`)
-		fmt.Fprintln(w, `Code:	'netcup'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Netcup.`)
+		ew.writeln(`Code:	'netcup'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "NETCUP_API_KEY":	API key`)
-		fmt.Fprintln(w, `	- "NETCUP_API_PASSWORD":	API password`)
-		fmt.Fprintln(w, `	- "NETCUP_CUSTOMER_NUMBER":	Customer number`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "NETCUP_API_KEY":	API key`)
+		ew.writeln(`	- "NETCUP_API_PASSWORD":	API password`)
+		ew.writeln(`	- "NETCUP_CUSTOMER_NUMBER":	Customer number`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "NETCUP_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "NETCUP_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "NETCUP_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "NETCUP_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "NETCUP_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "NETCUP_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "NETCUP_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "NETCUP_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/netcup`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/netcup`)
 
 	case "nifcloud":
 		// generated from: providers/dns/nifcloud/nifcloud.toml
-		fmt.Fprintln(w, `Configuration for NIFCloud.`)
-		fmt.Fprintln(w, `Code:	'nifcloud'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for NIFCloud.`)
+		ew.writeln(`Code:	'nifcloud'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "NIFCLOUD_ACCESS_KEY_ID":	Access key`)
-		fmt.Fprintln(w, `	- "NIFCLOUD_SECRET_ACCESS_KEY":	Secret access key`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "NIFCLOUD_ACCESS_KEY_ID":	Access key`)
+		ew.writeln(`	- "NIFCLOUD_SECRET_ACCESS_KEY":	Secret access key`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "NIFCLOUD_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "NIFCLOUD_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "NIFCLOUD_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "NIFCLOUD_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "NIFCLOUD_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "NIFCLOUD_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "NIFCLOUD_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "NIFCLOUD_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/nifcloud`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/nifcloud`)
 
 	case "ns1":
 		// generated from: providers/dns/ns1/ns1.toml
-		fmt.Fprintln(w, `Configuration for NS1.`)
-		fmt.Fprintln(w, `Code:	'ns1'`)
-		fmt.Fprintln(w, `Since:	'v0.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for NS1.`)
+		ew.writeln(`Code:	'ns1'`)
+		ew.writeln(`Since:	'v0.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "NS1_API_KEY":	API key`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "NS1_API_KEY":	API key`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "NS1_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "NS1_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "NS1_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "NS1_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "NS1_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "NS1_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "NS1_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "NS1_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/ns1`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/ns1`)
 
 	case "oraclecloud":
 		// generated from: providers/dns/oraclecloud/oraclecloud.toml
-		fmt.Fprintln(w, `Configuration for Oracle Cloud.`)
-		fmt.Fprintln(w, `Code:	'oraclecloud'`)
-		fmt.Fprintln(w, `Since:	'v2.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Oracle Cloud.`)
+		ew.writeln(`Code:	'oraclecloud'`)
+		ew.writeln(`Since:	'v2.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "OCI_COMPARTMENT_OCID":	Compartment OCID`)
-		fmt.Fprintln(w, `	- "OCI_PRIVKEY_FILE":	Private key file`)
-		fmt.Fprintln(w, `	- "OCI_PRIVKEY_PASS":	Private key password`)
-		fmt.Fprintln(w, `	- "OCI_PUBKEY_FINGERPRINT":	Public key fingerprint`)
-		fmt.Fprintln(w, `	- "OCI_REGION":	Region`)
-		fmt.Fprintln(w, `	- "OCI_TENANCY_OCID":	Tenanct OCID`)
-		fmt.Fprintln(w, `	- "OCI_USER_OCID":	User OCID`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "OCI_COMPARTMENT_OCID":	Compartment OCID`)
+		ew.writeln(`	- "OCI_PRIVKEY_FILE":	Private key file`)
+		ew.writeln(`	- "OCI_PRIVKEY_PASS":	Private key password`)
+		ew.writeln(`	- "OCI_PUBKEY_FINGERPRINT":	Public key fingerprint`)
+		ew.writeln(`	- "OCI_REGION":	Region`)
+		ew.writeln(`	- "OCI_TENANCY_OCID":	Tenanct OCID`)
+		ew.writeln(`	- "OCI_USER_OCID":	User OCID`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "OCI_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "OCI_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "OCI_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "OCI_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "OCI_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "OCI_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/oraclecloud`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/oraclecloud`)
 
 	case "otc":
 		// generated from: providers/dns/otc/otc.toml
-		fmt.Fprintln(w, `Configuration for Open Telekom Cloud.`)
-		fmt.Fprintln(w, `Code:	'otc'`)
-		fmt.Fprintln(w, `Since:	'v0.4.1'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Open Telekom Cloud.`)
+		ew.writeln(`Code:	'otc'`)
+		ew.writeln(`Since:	'v0.4.1'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "OTC_DOMAIN_NAME":	Domain name`)
-		fmt.Fprintln(w, `	- "OTC_IDENTITY_ENDPOINT":	Identity endpoint URL`)
-		fmt.Fprintln(w, `	- "OTC_PASSWORD":	Password`)
-		fmt.Fprintln(w, `	- "OTC_PROJECT_NAME":	Project name`)
-		fmt.Fprintln(w, `	- "OTC_USER_NAME":	User name`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "OTC_DOMAIN_NAME":	Domain name`)
+		ew.writeln(`	- "OTC_IDENTITY_ENDPOINT":	Identity endpoint URL`)
+		ew.writeln(`	- "OTC_PASSWORD":	Password`)
+		ew.writeln(`	- "OTC_PROJECT_NAME":	Project name`)
+		ew.writeln(`	- "OTC_USER_NAME":	User name`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "OTC_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "OTC_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "OTC_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "OTC_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "OTC_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "OTC_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "OTC_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "OTC_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/otc`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/otc`)
 
 	case "ovh":
 		// generated from: providers/dns/ovh/ovh.toml
-		fmt.Fprintln(w, `Configuration for OVH.`)
-		fmt.Fprintln(w, `Code:	'ovh'`)
-		fmt.Fprintln(w, `Since:	'v0.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for OVH.`)
+		ew.writeln(`Code:	'ovh'`)
+		ew.writeln(`Since:	'v0.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "OVH_APPLICATION_KEY":	Application key`)
-		fmt.Fprintln(w, `	- "OVH_APPLICATION_SECRET":	Application secret`)
-		fmt.Fprintln(w, `	- "OVH_CONSUMER_KEY":	Consumer key`)
-		fmt.Fprintln(w, `	- "OVH_ENDPOINT":	Endpoint URL (ovh-eu or ovh-ca)`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "OVH_APPLICATION_KEY":	Application key`)
+		ew.writeln(`	- "OVH_APPLICATION_SECRET":	Application secret`)
+		ew.writeln(`	- "OVH_CONSUMER_KEY":	Consumer key`)
+		ew.writeln(`	- "OVH_ENDPOINT":	Endpoint URL (ovh-eu or ovh-ca)`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "OVH_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "OVH_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "OVH_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "OVH_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "OVH_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "OVH_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "OVH_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "OVH_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/ovh`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/ovh`)
 
 	case "pdns":
 		// generated from: providers/dns/pdns/pdns.toml
-		fmt.Fprintln(w, `Configuration for PowerDNS.`)
-		fmt.Fprintln(w, `Code:	'pdns'`)
-		fmt.Fprintln(w, `Since:	'v0.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for PowerDNS.`)
+		ew.writeln(`Code:	'pdns'`)
+		ew.writeln(`Since:	'v0.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "PDNS_API_KEY":	API key`)
-		fmt.Fprintln(w, `	- "PDNS_API_URL":	API url`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "PDNS_API_KEY":	API key`)
+		ew.writeln(`	- "PDNS_API_URL":	API url`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "PDNS_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "PDNS_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "PDNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "PDNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "PDNS_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "PDNS_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "PDNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "PDNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/pdns`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/pdns`)
 
 	case "rackspace":
 		// generated from: providers/dns/rackspace/rackspace.toml
-		fmt.Fprintln(w, `Configuration for Rackspace.`)
-		fmt.Fprintln(w, `Code:	'rackspace'`)
-		fmt.Fprintln(w, `Since:	'v0.4.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Rackspace.`)
+		ew.writeln(`Code:	'rackspace'`)
+		ew.writeln(`Since:	'v0.4.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "RACKSPACE_API_KEY":	API key`)
-		fmt.Fprintln(w, `	- "RACKSPACE_USER":	API user`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "RACKSPACE_API_KEY":	API key`)
+		ew.writeln(`	- "RACKSPACE_USER":	API user`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "RACKSPACE_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "RACKSPACE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "RACKSPACE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "RACKSPACE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "RACKSPACE_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "RACKSPACE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "RACKSPACE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "RACKSPACE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/rackspace`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/rackspace`)
 
 	case "rfc2136":
 		// generated from: providers/dns/rfc2136/rfc2136.toml
-		fmt.Fprintln(w, `Configuration for RFC2136.`)
-		fmt.Fprintln(w, `Code:	'rfc2136'`)
-		fmt.Fprintln(w, `Since:	'v0.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for RFC2136.`)
+		ew.writeln(`Code:	'rfc2136'`)
+		ew.writeln(`Since:	'v0.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "RFC2136_NAMESERVER":	Network address in the form "host" or "host:port"`)
-		fmt.Fprintln(w, `	- "RFC2136_TSIG_ALGORITHM":	TSIG algorythm. See [miekg/dns#tsig.go](https://github.com/miekg/dns/blob/master/tsig.go) for supported values. To disable TSIG authentication, leave the 'RFC2136_TSIG*' variables unset.`)
-		fmt.Fprintln(w, `	- "RFC2136_TSIG_KEY":	Name of the secret key as defined in DNS server configuration. To disable TSIG authentication, leave the 'RFC2136_TSIG*' variables unset.`)
-		fmt.Fprintln(w, `	- "RFC2136_TSIG_SECRET":	Secret key payload. To disable TSIG authentication, leave the' RFC2136_TSIG*' variables unset.`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "RFC2136_NAMESERVER":	Network address in the form "host" or "host:port"`)
+		ew.writeln(`	- "RFC2136_TSIG_ALGORITHM":	TSIG algorythm. See [miekg/dns#tsig.go](https://github.com/miekg/dns/blob/master/tsig.go) for supported values. To disable TSIG authentication, leave the 'RFC2136_TSIG*' variables unset.`)
+		ew.writeln(`	- "RFC2136_TSIG_KEY":	Name of the secret key as defined in DNS server configuration. To disable TSIG authentication, leave the 'RFC2136_TSIG*' variables unset.`)
+		ew.writeln(`	- "RFC2136_TSIG_SECRET":	Secret key payload. To disable TSIG authentication, leave the' RFC2136_TSIG*' variables unset.`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "RFC2136_DNS_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "RFC2136_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "RFC2136_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "RFC2136_SEQUENCE_INTERVAL":	Interval between iteration`)
-		fmt.Fprintln(w, `	- "RFC2136_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "RFC2136_DNS_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "RFC2136_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "RFC2136_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "RFC2136_SEQUENCE_INTERVAL":	Interval between iteration`)
+		ew.writeln(`	- "RFC2136_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/rfc2136`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/rfc2136`)
 
 	case "route53":
 		// generated from: providers/dns/route53/route53.toml
-		fmt.Fprintln(w, `Configuration for Amazon Route 53.`)
-		fmt.Fprintln(w, `Code:	'route53'`)
-		fmt.Fprintln(w, `Since:	'v0.3.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Amazon Route 53.`)
+		ew.writeln(`Code:	'route53'`)
+		ew.writeln(`Since:	'v0.3.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "AWS_ACCESS_KEY_ID":	Managed by the AWS client`)
-		fmt.Fprintln(w, `	- "AWS_HOSTED_ZONE_ID":	Override the hosted zone ID`)
-		fmt.Fprintln(w, `	- "AWS_REGION":	Managed by the AWS client`)
-		fmt.Fprintln(w, `	- "AWS_SECRET_ACCESS_KEY":	Managed by the AWS client`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "AWS_ACCESS_KEY_ID":	Managed by the AWS client`)
+		ew.writeln(`	- "AWS_HOSTED_ZONE_ID":	Override the hosted zone ID`)
+		ew.writeln(`	- "AWS_REGION":	Managed by the AWS client`)
+		ew.writeln(`	- "AWS_SECRET_ACCESS_KEY":	Managed by the AWS client`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "AWS_MAX_RETRIES":	The number of maximum returns the service will use to make an individual API request`)
-		fmt.Fprintln(w, `	- "AWS_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "AWS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "AWS_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "AWS_MAX_RETRIES":	The number of maximum returns the service will use to make an individual API request`)
+		ew.writeln(`	- "AWS_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "AWS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "AWS_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/route53`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/route53`)
 
 	case "sakuracloud":
 		// generated from: providers/dns/sakuracloud/sakuracloud.toml
-		fmt.Fprintln(w, `Configuration for Sakura Cloud.`)
-		fmt.Fprintln(w, `Code:	'sakuracloud'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Sakura Cloud.`)
+		ew.writeln(`Code:	'sakuracloud'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "SAKURACLOUD_ACCESS_TOKEN":	Access token`)
-		fmt.Fprintln(w, `	- "SAKURACLOUD_ACCESS_TOKEN_SECRET":	Access token secret`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "SAKURACLOUD_ACCESS_TOKEN":	Access token`)
+		ew.writeln(`	- "SAKURACLOUD_ACCESS_TOKEN_SECRET":	Access token secret`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "SAKURACLOUD_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "SAKURACLOUD_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "SAKURACLOUD_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "SAKURACLOUD_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "SAKURACLOUD_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "SAKURACLOUD_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "SAKURACLOUD_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "SAKURACLOUD_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/sakuracloud`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/sakuracloud`)
 
 	case "selectel":
 		// generated from: providers/dns/selectel/selectel.toml
-		fmt.Fprintln(w, `Configuration for Selectel.`)
-		fmt.Fprintln(w, `Code:	'selectel'`)
-		fmt.Fprintln(w, `Since:	'v1.2.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Selectel.`)
+		ew.writeln(`Code:	'selectel'`)
+		ew.writeln(`Since:	'v1.2.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "SELECTEL_API_TOKEN":	API token`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "SELECTEL_API_TOKEN":	API token`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "SELECTEL_BASE_URL":	API endpoint URL`)
-		fmt.Fprintln(w, `	- "SELECTEL_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "SELECTEL_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "SELECTEL_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "SELECTEL_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "SELECTEL_BASE_URL":	API endpoint URL`)
+		ew.writeln(`	- "SELECTEL_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "SELECTEL_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "SELECTEL_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "SELECTEL_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/selectel`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/selectel`)
 
 	case "stackpath":
 		// generated from: providers/dns/stackpath/stackpath.toml
-		fmt.Fprintln(w, `Configuration for Stackpath.`)
-		fmt.Fprintln(w, `Code:	'stackpath'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Stackpath.`)
+		ew.writeln(`Code:	'stackpath'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "STACKPATH_CLIENT_ID":	Client ID`)
-		fmt.Fprintln(w, `	- "STACKPATH_CLIENT_SECRET":	Client secret`)
-		fmt.Fprintln(w, `	- "STACKPATH_STACK_ID":	Stack ID`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "STACKPATH_CLIENT_ID":	Client ID`)
+		ew.writeln(`	- "STACKPATH_CLIENT_SECRET":	Client secret`)
+		ew.writeln(`	- "STACKPATH_STACK_ID":	Stack ID`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "STACKPATH_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "STACKPATH_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "STACKPATH_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "STACKPATH_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "STACKPATH_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "STACKPATH_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/stackpath`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/stackpath`)
 
 	case "transip":
 		// generated from: providers/dns/transip/transip.toml
-		fmt.Fprintln(w, `Configuration for TransIP.`)
-		fmt.Fprintln(w, `Code:	'transip'`)
-		fmt.Fprintln(w, `Since:	'v2.0.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for TransIP.`)
+		ew.writeln(`Code:	'transip'`)
+		ew.writeln(`Since:	'v2.0.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "TRANSIP_ACCOUNT_NAME":	Account name`)
-		fmt.Fprintln(w, `	- "TRANSIP_PRIVATE_KEY_PATH":	Private key path`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "TRANSIP_ACCOUNT_NAME":	Account name`)
+		ew.writeln(`	- "TRANSIP_PRIVATE_KEY_PATH":	Private key path`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "TRANSIP_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "TRANSIP_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "TRANSIP_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "TRANSIP_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "TRANSIP_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "TRANSIP_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/transip`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/transip`)
 
 	case "vegadns":
 		// generated from: providers/dns/vegadns/vegadns.toml
-		fmt.Fprintln(w, `Configuration for VegaDNS.`)
-		fmt.Fprintln(w, `Code:	'vegadns'`)
-		fmt.Fprintln(w, `Since:	'v1.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for VegaDNS.`)
+		ew.writeln(`Code:	'vegadns'`)
+		ew.writeln(`Since:	'v1.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "SECRET_VEGADNS_KEY":	API key`)
-		fmt.Fprintln(w, `	- "SECRET_VEGADNS_SECRET":	API secret`)
-		fmt.Fprintln(w, `	- "VEGADNS_URL":	API endpoint URL`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "SECRET_VEGADNS_KEY":	API key`)
+		ew.writeln(`	- "SECRET_VEGADNS_SECRET":	API secret`)
+		ew.writeln(`	- "VEGADNS_URL":	API endpoint URL`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "VEGADNS_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "VEGADNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "VEGADNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "VEGADNS_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "VEGADNS_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "VEGADNS_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/vegadns`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/vegadns`)
 
 	case "versio":
 		// generated from: providers/dns/versio/versio.toml
-		fmt.Fprintln(w, `Configuration for Versio.[nl|eu|uk].`)
-		fmt.Fprintln(w, `Code:	'versio'`)
-		fmt.Fprintln(w, `Since:	'v2.7.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Versio.[nl|eu|uk].`)
+		ew.writeln(`Code:	'versio'`)
+		ew.writeln(`Since:	'v2.7.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "VERSIO_PASSWORD":	Basic authentication password`)
-		fmt.Fprintln(w, `	- "VERSIO_USERNAME":	Basic authentication username`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "VERSIO_PASSWORD":	Basic authentication password`)
+		ew.writeln(`	- "VERSIO_USERNAME":	Basic authentication username`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "VERSIO_ENDPOINT":	The endpoint URL of the API Server`)
-		fmt.Fprintln(w, `	- "VERSIO_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "VERSIO_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "VERSIO_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "VERSIO_SEQUENCE_INTERVAL":	Interval between iteration, default 60s`)
-		fmt.Fprintln(w, `	- "VERSIO_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "VERSIO_ENDPOINT":	The endpoint URL of the API Server`)
+		ew.writeln(`	- "VERSIO_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "VERSIO_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "VERSIO_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "VERSIO_SEQUENCE_INTERVAL":	Interval between iteration, default 60s`)
+		ew.writeln(`	- "VERSIO_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/versio`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/versio`)
 
 	case "vscale":
 		// generated from: providers/dns/vscale/vscale.toml
-		fmt.Fprintln(w, `Configuration for Vscale.`)
-		fmt.Fprintln(w, `Code:	'vscale'`)
-		fmt.Fprintln(w, `Since:	'v2.0.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Vscale.`)
+		ew.writeln(`Code:	'vscale'`)
+		ew.writeln(`Since:	'v2.0.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "VSCALE_API_TOKEN":	API token`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "VSCALE_API_TOKEN":	API token`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "VSCALE_BASE_URL":	API enddpoint URL`)
-		fmt.Fprintln(w, `	- "VSCALE_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "VSCALE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "VSCALE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "VSCALE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "VSCALE_BASE_URL":	API enddpoint URL`)
+		ew.writeln(`	- "VSCALE_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "VSCALE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "VSCALE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "VSCALE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/vscale`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/vscale`)
 
 	case "vultr":
 		// generated from: providers/dns/vultr/vultr.toml
-		fmt.Fprintln(w, `Configuration for Vultr.`)
-		fmt.Fprintln(w, `Code:	'vultr'`)
-		fmt.Fprintln(w, `Since:	'v0.3.1'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Vultr.`)
+		ew.writeln(`Code:	'vultr'`)
+		ew.writeln(`Since:	'v0.3.1'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "VULTR_API_KEY":	API key`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "VULTR_API_KEY":	API key`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "VULTR_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "VULTR_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "VULTR_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "VULTR_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "VULTR_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "VULTR_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "VULTR_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "VULTR_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/vultr`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/vultr`)
 
 	case "zoneee":
 		// generated from: providers/dns/zoneee/zoneee.toml
-		fmt.Fprintln(w, `Configuration for Zone.ee.`)
-		fmt.Fprintln(w, `Code:	'zoneee'`)
-		fmt.Fprintln(w, `Since:	'v2.1.0'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for Zone.ee.`)
+		ew.writeln(`Code:	'zoneee'`)
+		ew.writeln(`Since:	'v2.1.0'`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Credentials:`)
-		fmt.Fprintln(w, `	- "ZONEEE_API_KEY":	API key`)
-		fmt.Fprintln(w, `	- "ZONEEE_API_USER":	API user`)
-		fmt.Fprintln(w)
+		ew.writeln(`Credentials:`)
+		ew.writeln(`	- "ZONEEE_API_KEY":	API key`)
+		ew.writeln(`	- "ZONEEE_API_USER":	API user`)
+		ew.writeln()
 
-		fmt.Fprintln(w, `Additional Configuration:`)
-		fmt.Fprintln(w, `	- "ZONEEE_ENDPOINT":	API endpoint URL`)
-		fmt.Fprintln(w, `	- "ZONEEE_HTTP_TIMEOUT":	API request timeout`)
-		fmt.Fprintln(w, `	- "ZONEEE_POLLING_INTERVAL":	Time between DNS propagation check`)
-		fmt.Fprintln(w, `	- "ZONEEE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
-		fmt.Fprintln(w, `	- "ZONEEE_TTL":	The TTL of the TXT record used for the DNS challenge`)
+		ew.writeln(`Additional Configuration:`)
+		ew.writeln(`	- "ZONEEE_ENDPOINT":	API endpoint URL`)
+		ew.writeln(`	- "ZONEEE_HTTP_TIMEOUT":	API request timeout`)
+		ew.writeln(`	- "ZONEEE_POLLING_INTERVAL":	Time between DNS propagation check`)
+		ew.writeln(`	- "ZONEEE_PROPAGATION_TIMEOUT":	Maximum waiting time for DNS propagation`)
+		ew.writeln(`	- "ZONEEE_TTL":	The TTL of the TXT record used for the DNS challenge`)
 
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/zoneee`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/zoneee`)
 
 	case "manual":
-		fmt.Fprintln(w, `Solving the DNS-01 challenge using CLI prompt.`)
+		ew.writeln(`Solving the DNS-01 challenge using CLI prompt.`)
 	default:
-		log.Fatalf("%q is not yet supported.", name)
+		return fmt.Errorf("%q is not yet supported", name)
 	}
-	w.Flush()
+
+	if ew.err != nil {
+		return fmt.Errorf("error: %v", ew.err)
+	}
+
+	return w.Flush()
 }
diff --git a/internal/dnsdocs/dns.go.tmpl b/internal/dnsdocs/dns.go.tmpl
index 6d127ab6..0e70f329 100644
--- a/internal/dnsdocs/dns.go.tmpl
+++ b/internal/dnsdocs/dns.go.tmpl
@@ -9,8 +9,6 @@ import (
 	"sort"
 	"strings"
 	"text/tabwriter"
-
-	"github.com/go-acme/lego/log"
 )
 
 func allDNSCodes() string {
@@ -24,35 +22,42 @@ func allDNSCodes() string {
 	return strings.Join(providers, ", ")
 }
 
-func displayDNSHelp(name string) {
+func displayDNSHelp(name string) error {
 	w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
+	ew := &errWriter{w: w}
+
 	switch name {
 {{ range $provider := .Providers }}
 	case "{{ $provider.Code }}":
 		// generated from: {{ .GeneratedFrom }}
-		fmt.Fprintln(w, `Configuration for {{ $provider.Name }}.`)
-		fmt.Fprintln(w, `Code:	'{{ $provider.Code }}'`)
-		fmt.Fprintln(w, `Since:	'{{ $provider.Since }}'`)
-		fmt.Fprintln(w)
+		ew.writeln(`Configuration for {{ $provider.Name }}.`)
+		ew.writeln(`Code:	'{{ $provider.Code }}'`)
+		ew.writeln(`Since:	'{{ $provider.Since }}'`)
+		ew.writeln()
 {{if $provider.Configuration }}{{if $provider.Configuration.Credentials }}
-		fmt.Fprintln(w, `Credentials:`)
+		ew.writeln(`Credentials:`)
 {{- range $k, $v := $provider.Configuration.Credentials }}
-		fmt.Fprintln(w,`	- "{{ $k }}":	{{ safe $v }}`)
+		ew.writeln(`	- "{{ $k }}":	{{ safe $v }}`)
 {{- end}}
-		fmt.Fprintln(w)
+		ew.writeln()
 {{end}}{{if $provider.Configuration.Additional }}
-		fmt.Fprintln(w, `Additional Configuration:`)
+		ew.writeln(`Additional Configuration:`)
 {{- range $k, $v := $provider.Configuration.Additional }}
-		fmt.Fprintln(w, `	- "{{ $k }}":	{{ safe $v }}`)
+		ew.writeln(`	- "{{ $k }}":	{{ safe $v }}`)
 {{- end}}
 {{end}}{{end}}
-		fmt.Fprintln(w)
-		fmt.Fprintln(w, `More information: https://go-acme.github.io/lego/dns/{{ $provider.Code }}`)
+		ew.writeln()
+		ew.writeln(`More information: https://go-acme.github.io/lego/dns/{{ $provider.Code }}`)
 {{end}}
     case "manual":
-		fmt.Fprintln(w, `Solving the DNS-01 challenge using CLI prompt.`)
+		ew.writeln(`Solving the DNS-01 challenge using CLI prompt.`)
 	default:
-		log.Fatalf("%q is not yet supported.", name)
+		return fmt.Errorf("%q is not yet supported", name)
 	}
-	w.Flush()
+
+	if ew.err != nil {
+		return fmt.Errorf("error: %v", ew.err)
+	}
+
+	return w.Flush()
 }
\ No newline at end of file