Browse Source

*: replace grpc-gateway endpoint with stable /v3

Sam Batschelet 7 years ago
parent
commit
488ee99ae8

+ 17 - 17
Documentation/dev-guide/api_grpc_gateway.md

@@ -10,7 +10,7 @@ The gateway accepts a [JSON mapping][json-mapping] for etcd's [protocol buffer][
 
 ### Put and get keys
 
-Use the `/v3beta/kv/range` and `/v3beta/kv/put` services to read and write keys:
+Use the `/v3/kv/range` and `/v3/kv/put` services to read and write keys:
 
 ```bash
 <<COMMENT
@@ -19,40 +19,40 @@ foo is 'Zm9v' in Base64
 bar is 'YmFy'
 COMMENT
 
-curl -L http://localhost:2379/v3beta/kv/put \
+curl -L http://localhost:2379/v3/kv/put \
 	-X POST -d '{"key": "Zm9v", "value": "YmFy"}'
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"3"}}
 
-curl -L http://localhost:2379/v3beta/kv/range \
+curl -L http://localhost:2379/v3/kv/range \
 	-X POST -d '{"key": "Zm9v"}'
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"3"},"kvs":[{"key":"Zm9v","create_revision":"2","mod_revision":"2","version":"1","value":"YmFy"}],"count":"1"}
 
 # get all keys prefixed with "foo"
-curl -L http://localhost:2379/v3beta/kv/range \
+curl -L http://localhost:2379/v3/kv/range \
 	-X POST -d '{"key": "Zm9v", "range_end": "Zm9w"}'
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"3"},"kvs":[{"key":"Zm9v","create_revision":"2","mod_revision":"2","version":"1","value":"YmFy"}],"count":"1"}
 ```
 
 ### Watch keys
 
-Use the `/v3beta/watch` service to watch keys:
+Use the `/v3/watch` service to watch keys:
 
 ```bash
-curl http://localhost:2379/v3beta/watch \
+curl http://localhost:2379/v3/watch \
         -X POST -d '{"create_request": {"key":"Zm9v"} }' &
 # {"result":{"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"1","raft_term":"2"},"created":true}}
 
-curl -L http://localhost:2379/v3beta/kv/put \
+curl -L http://localhost:2379/v3/kv/put \
 	-X POST -d '{"key": "Zm9v", "value": "YmFy"}' >/dev/null 2>&1
 # {"result":{"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"2"},"events":[{"kv":{"key":"Zm9v","create_revision":"2","mod_revision":"2","version":"1","value":"YmFy"}}]}}
 ```
 
 ### Transactions
 
-Issue a transaction with `/v3beta/kv/txn`:
+Issue a transaction with `/v3/kv/txn`:
 
 ```bash
-curl -L http://localhost:2379/v3beta/kv/txn \
+curl -L http://localhost:2379/v3/kv/txn \
 	-X POST \
 	-d '{"compare":[{"target":"CREATE","key":"Zm9v","createRevision":"2"}],"success":[{"requestPut":{"key":"Zm9v","value":"YmFy"}}]}'
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"3","raft_term":"2"},"succeeded":true,"responses":[{"response_put":{"header":{"revision":"3"}}}]}
@@ -60,34 +60,34 @@ curl -L http://localhost:2379/v3beta/kv/txn \
 
 ### Authentication
 
-Set up authentication with the `/v3beta/auth` service:
+Set up authentication with the `/v3/auth` service:
 
 ```bash
 # create root user
-curl -L http://localhost:2379/v3beta/auth/user/add \
+curl -L http://localhost:2379/v3/auth/user/add \
 	-X POST -d '{"name": "root", "password": "pass"}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 
 # create root role
-curl -L http://localhost:2379/v3beta/auth/role/add \
+curl -L http://localhost:2379/v3/auth/role/add \
 	-X POST -d '{"name": "root"}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 
 # grant root role
-curl -L http://localhost:2379/v3beta/auth/user/grant \
+curl -L http://localhost:2379/v3/auth/user/grant \
 	-X POST -d '{"user": "root", "role": "root"}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 
 # enable auth
-curl -L http://localhost:2379/v3beta/auth/enable -X POST -d '{}'
+curl -L http://localhost:2379/v3/auth/enable -X POST -d '{}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 ```
 
-Authenticate with etcd for an authentication token using `/v3beta/auth/authenticate`:
+Authenticate with etcd for an authentication token using `/v3/auth/authenticate`:
 
 ```bash
 # get the auth token for the root user
-curl -L http://localhost:2379/v3beta/auth/authenticate \
+curl -L http://localhost:2379/v3/auth/authenticate \
 	-X POST -d '{"name": "root", "password": "pass"}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"},"token":"sssvIpwfnLAcWAQH.9"}
 ```
@@ -95,7 +95,7 @@ curl -L http://localhost:2379/v3beta/auth/authenticate \
 Set the `Authorization` header to the authentication token to fetch a key using authentication credentials:
 
 ```bash
-curl -L http://localhost:2379/v3beta/kv/put \
+curl -L http://localhost:2379/v3/kv/put \
 	-H 'Authorization : sssvIpwfnLAcWAQH.9' \
 	-X POST -d '{"key": "Zm9v", "value": "YmFy"}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"2","raft_term":"2"}}

+ 37 - 37
Documentation/dev-guide/apispec/swagger/rpc.swagger.json

@@ -15,7 +15,7 @@
     "version": "version not set"
   },
   "paths": {
-    "/v3beta/auth/authenticate": {
+    "/v3/auth/authenticate": {
       "post": {
         "tags": [
           "Auth"
@@ -42,7 +42,7 @@
         }
       }
     },
-    "/v3beta/auth/disable": {
+    "/v3/auth/disable": {
       "post": {
         "tags": [
           "Auth"
@@ -69,7 +69,7 @@
         }
       }
     },
-    "/v3beta/auth/enable": {
+    "/v3/auth/enable": {
       "post": {
         "tags": [
           "Auth"
@@ -96,7 +96,7 @@
         }
       }
     },
-    "/v3beta/auth/role/add": {
+    "/v3/auth/role/add": {
       "post": {
         "tags": [
           "Auth"
@@ -123,7 +123,7 @@
         }
       }
     },
-    "/v3beta/auth/role/delete": {
+    "/v3/auth/role/delete": {
       "post": {
         "tags": [
           "Auth"
@@ -150,7 +150,7 @@
         }
       }
     },
-    "/v3beta/auth/role/get": {
+    "/v3/auth/role/get": {
       "post": {
         "tags": [
           "Auth"
@@ -177,7 +177,7 @@
         }
       }
     },
-    "/v3beta/auth/role/grant": {
+    "/v3/auth/role/grant": {
       "post": {
         "tags": [
           "Auth"
@@ -204,7 +204,7 @@
         }
       }
     },
-    "/v3beta/auth/role/list": {
+    "/v3/auth/role/list": {
       "post": {
         "tags": [
           "Auth"
@@ -231,7 +231,7 @@
         }
       }
     },
-    "/v3beta/auth/role/revoke": {
+    "/v3/auth/role/revoke": {
       "post": {
         "tags": [
           "Auth"
@@ -258,7 +258,7 @@
         }
       }
     },
-    "/v3beta/auth/user/add": {
+    "/v3/auth/user/add": {
       "post": {
         "tags": [
           "Auth"
@@ -285,7 +285,7 @@
         }
       }
     },
-    "/v3beta/auth/user/changepw": {
+    "/v3/auth/user/changepw": {
       "post": {
         "tags": [
           "Auth"
@@ -312,7 +312,7 @@
         }
       }
     },
-    "/v3beta/auth/user/delete": {
+    "/v3/auth/user/delete": {
       "post": {
         "tags": [
           "Auth"
@@ -339,7 +339,7 @@
         }
       }
     },
-    "/v3beta/auth/user/get": {
+    "/v3/auth/user/get": {
       "post": {
         "tags": [
           "Auth"
@@ -366,7 +366,7 @@
         }
       }
     },
-    "/v3beta/auth/user/grant": {
+    "/v3/auth/user/grant": {
       "post": {
         "tags": [
           "Auth"
@@ -393,7 +393,7 @@
         }
       }
     },
-    "/v3beta/auth/user/list": {
+    "/v3/auth/user/list": {
       "post": {
         "tags": [
           "Auth"
@@ -420,7 +420,7 @@
         }
       }
     },
-    "/v3beta/auth/user/revoke": {
+    "/v3/auth/user/revoke": {
       "post": {
         "tags": [
           "Auth"
@@ -447,7 +447,7 @@
         }
       }
     },
-    "/v3beta/cluster/member/add": {
+    "/v3/cluster/member/add": {
       "post": {
         "tags": [
           "Cluster"
@@ -474,7 +474,7 @@
         }
       }
     },
-    "/v3beta/cluster/member/list": {
+    "/v3/cluster/member/list": {
       "post": {
         "tags": [
           "Cluster"
@@ -501,7 +501,7 @@
         }
       }
     },
-    "/v3beta/cluster/member/remove": {
+    "/v3/cluster/member/remove": {
       "post": {
         "tags": [
           "Cluster"
@@ -528,7 +528,7 @@
         }
       }
     },
-    "/v3beta/cluster/member/update": {
+    "/v3/cluster/member/update": {
       "post": {
         "tags": [
           "Cluster"
@@ -555,7 +555,7 @@
         }
       }
     },
-    "/v3beta/kv/compaction": {
+    "/v3/kv/compaction": {
       "post": {
         "tags": [
           "KV"
@@ -582,7 +582,7 @@
         }
       }
     },
-    "/v3beta/kv/deleterange": {
+    "/v3/kv/deleterange": {
       "post": {
         "tags": [
           "KV"
@@ -609,7 +609,7 @@
         }
       }
     },
-    "/v3beta/kv/lease/leases": {
+    "/v3/kv/lease/leases": {
       "post": {
         "tags": [
           "Lease"
@@ -636,7 +636,7 @@
         }
       }
     },
-    "/v3beta/kv/lease/revoke": {
+    "/v3/kv/lease/revoke": {
       "post": {
         "tags": [
           "Lease"
@@ -663,7 +663,7 @@
         }
       }
     },
-    "/v3beta/kv/lease/timetolive": {
+    "/v3/kv/lease/timetolive": {
       "post": {
         "tags": [
           "Lease"
@@ -690,7 +690,7 @@
         }
       }
     },
-    "/v3beta/kv/put": {
+    "/v3/kv/put": {
       "post": {
         "tags": [
           "KV"
@@ -717,7 +717,7 @@
         }
       }
     },
-    "/v3beta/kv/range": {
+    "/v3/kv/range": {
       "post": {
         "tags": [
           "KV"
@@ -744,7 +744,7 @@
         }
       }
     },
-    "/v3beta/kv/txn": {
+    "/v3/kv/txn": {
       "post": {
         "tags": [
           "KV"
@@ -771,7 +771,7 @@
         }
       }
     },
-    "/v3beta/lease/grant": {
+    "/v3/lease/grant": {
       "post": {
         "tags": [
           "Lease"
@@ -798,7 +798,7 @@
         }
       }
     },
-    "/v3beta/lease/keepalive": {
+    "/v3/lease/keepalive": {
       "post": {
         "tags": [
           "Lease"
@@ -826,7 +826,7 @@
         }
       }
     },
-    "/v3beta/maintenance/alarm": {
+    "/v3/maintenance/alarm": {
       "post": {
         "tags": [
           "Maintenance"
@@ -853,7 +853,7 @@
         }
       }
     },
-    "/v3beta/maintenance/defragment": {
+    "/v3/maintenance/defragment": {
       "post": {
         "tags": [
           "Maintenance"
@@ -880,7 +880,7 @@
         }
       }
     },
-    "/v3beta/maintenance/hash": {
+    "/v3/maintenance/hash": {
       "post": {
         "tags": [
           "Maintenance"
@@ -907,7 +907,7 @@
         }
       }
     },
-    "/v3beta/maintenance/snapshot": {
+    "/v3/maintenance/snapshot": {
       "post": {
         "tags": [
           "Maintenance"
@@ -934,7 +934,7 @@
         }
       }
     },
-    "/v3beta/maintenance/status": {
+    "/v3/maintenance/status": {
       "post": {
         "tags": [
           "Maintenance"
@@ -961,7 +961,7 @@
         }
       }
     },
-    "/v3beta/maintenance/transfer-leadership": {
+    "/v3/maintenance/transfer-leadership": {
       "post": {
         "tags": [
           "Maintenance"
@@ -988,7 +988,7 @@
         }
       }
     },
-    "/v3beta/watch": {
+    "/v3/watch": {
       "post": {
         "tags": [
           "Watch"

+ 5 - 5
Documentation/dev-guide/apispec/swagger/v3election.swagger.json

@@ -15,7 +15,7 @@
     "application/json"
   ],
   "paths": {
-    "/v3beta/election/campaign": {
+    "/v3/election/campaign": {
       "post": {
         "summary": "Campaign waits to acquire leadership in an election, returning a LeaderKey\nrepresenting the leadership if successful. The LeaderKey can then be used\nto issue new values on the election, transactionally guard API requests on\nleadership still being held, and resign from the election.",
         "operationId": "Campaign",
@@ -42,7 +42,7 @@
         ]
       }
     },
-    "/v3beta/election/leader": {
+    "/v3/election/leader": {
       "post": {
         "summary": "Leader returns the current election proclamation, if any.",
         "operationId": "Leader",
@@ -69,7 +69,7 @@
         ]
       }
     },
-    "/v3beta/election/observe": {
+    "/v3/election/observe": {
       "post": {
         "summary": "Observe streams election proclamations in-order as made by the election's\nelected leaders.",
         "operationId": "Observe",
@@ -96,7 +96,7 @@
         ]
       }
     },
-    "/v3beta/election/proclaim": {
+    "/v3/election/proclaim": {
       "post": {
         "summary": "Proclaim updates the leader's posted value with a new value.",
         "operationId": "Proclaim",
@@ -123,7 +123,7 @@
         ]
       }
     },
-    "/v3beta/election/resign": {
+    "/v3/election/resign": {
       "post": {
         "summary": "Resign releases election leadership so other campaigners may acquire\nleadership on the election.",
         "operationId": "Resign",

+ 2 - 2
Documentation/dev-guide/apispec/swagger/v3lock.swagger.json

@@ -15,7 +15,7 @@
     "application/json"
   ],
   "paths": {
-    "/v3beta/lock/lock": {
+    "/v3/lock/lock": {
       "post": {
         "summary": "Lock acquires a distributed shared lock on a given named lock.\nOn success, it will return a unique key that exists so long as the\nlock is held by the caller. This key can be used in conjunction with\ntransactions to safely ensure updates to etcd only occur while holding\nlock ownership. The lock is held until Unlock is called on the key or the\nlease associate with the owner expires.",
         "operationId": "Lock",
@@ -42,7 +42,7 @@
         ]
       }
     },
-    "/v3beta/lock/unlock": {
+    "/v3/lock/unlock": {
       "post": {
         "summary": "Unlock takes a key returned by Lock and releases the hold on lock. The\nnext Lock caller waiting for the lock will then be woken up and given\nownership of the lock.",
         "operationId": "Unlock",

+ 5 - 0
e2e/ctl_v3_test.go

@@ -53,6 +53,7 @@ func dialWithSchemeTest(cx ctlCtx) {
 
 type ctlCtx struct {
 	t                 *testing.T
+	apiPrefix         string
 	cfg               etcdProcessClusterConfig
 	quotaBackendBytes int64
 	corruptFunc       func(string) error
@@ -121,6 +122,10 @@ func withNoStrictReconfig() ctlOption {
 	return func(cx *ctlCtx) { cx.noStrictReconfig = true }
 }
 
+func withApiPrefix(p string) ctlOption {
+	return func(cx *ctlCtx) { cx.apiPrefix = p }
+}
+
 func withFlagByEnv() ctlOption {
 	return func(cx *ctlCtx) { cx.envMap = make(map[string]struct{}) }
 }

+ 89 - 115
e2e/v3_curl_test.go

@@ -25,43 +25,51 @@ import (
 	"github.com/grpc-ecosystem/grpc-gateway/runtime"
 )
 
-// TODO: remove /v3alpha tests in 3.4 release
+// TODO: remove /v3beta tests in 3.5 release
+var apiPrefix = []string{"/v3", "/v3beta"}
 
-func TestV3CurlPutGetNoTLSAlpha(t *testing.T) { testCurlPutGetGRPCGateway(t, &configNoTLS, "/v3alpha") }
-func TestV3CurlPutGetNoTLSBeta(t *testing.T)  { testCurlPutGetGRPCGateway(t, &configNoTLS, "/v3beta") }
-func TestV3CurlPutGetAutoTLSAlpha(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configAutoTLS, "/v3alpha")
+func TestV3CurlPutGetNoTLS(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlPutGet, withApiPrefix(p), withCfg(configNoTLS))
+	}
 }
-func TestV3CurlPutGetAutoTLSBeta(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configAutoTLS, "/v3beta")
+func TestV3CurlPutGetAutoTLS(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlPutGet, withApiPrefix(p), withCfg(configAutoTLS))
+	}
 }
-func TestV3CurlPutGetAllTLSAlpha(t *testing.T) { testCurlPutGetGRPCGateway(t, &configTLS, "/v3alpha") }
-func TestV3CurlPutGetAllTLSBeta(t *testing.T)  { testCurlPutGetGRPCGateway(t, &configTLS, "/v3beta") }
-func TestV3CurlPutGetPeerTLSAlpha(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configPeerTLS, "/v3alpha")
+func TestV3CurlPutGetAllTLS(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlPutGet, withApiPrefix(p), withCfg(configTLS))
+	}
 }
-func TestV3CurlPutGetPeerTLSBeta(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configPeerTLS, "/v3beta")
+func TestV3CurlPutGetPeerTLS(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlPutGet, withApiPrefix(p), withCfg(configPeerTLS))
+	}
 }
-func TestV3CurlPutGetClientTLSAlpha(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configClientTLS, "/v3alpha")
+func TestV3CurlPutGetClientTLS(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlPutGet, withApiPrefix(p), withCfg(configClientTLS))
+	}
 }
-func TestV3CurlPutGetClientTLSBeta(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configClientTLS, "/v3beta")
+func TestV3CurlWatch(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlWatch, withApiPrefix(p))
+	}
 }
-func testCurlPutGetGRPCGateway(t *testing.T, cfg *etcdProcessClusterConfig, pathPrefix string) {
-	defer testutil.AfterTest(t)
-
-	epc, err := newEtcdProcessCluster(cfg)
-	if err != nil {
-		t.Fatalf("could not start etcd process cluster (%v)", err)
+func TestV3CurlTxn(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlTxn, withApiPrefix(p))
 	}
-	defer func() {
-		if cerr := epc.Close(); err != nil {
-			t.Fatalf("error closing etcd processes (%v)", cerr)
-		}
-	}()
+}
+func TestV3CurlAuth(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlAuth, withApiPrefix(p))
+	}
+}
 
+func testV3CurlPutGet(cx ctlCtx) {
 	var (
 		key   = []byte("foo")
 		value = []byte("bar") // this will be automatically base64-encoded by Go
@@ -74,82 +82,58 @@ func testCurlPutGetGRPCGateway(t *testing.T, cfg *etcdProcessClusterConfig, path
 		Value: value,
 	})
 	if err != nil {
-		t.Fatal(err)
+		cx.t.Fatal(err)
 	}
 	rangeData, err := json.Marshal(&pb.RangeRequest{
 		Key: key,
 	})
 	if err != nil {
-		t.Fatal(err)
+		cx.t.Fatal(err)
 	}
 
-	if err := cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/put"), value: string(putData), expected: expectPut}); err != nil {
-		t.Fatalf("failed put with curl (%v)", err)
+	p := cx.apiPrefix
+
+	if err := cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/put"), value: string(putData), expected: expectPut}); err != nil {
+		cx.t.Fatalf("failed testV3CurlPutGet put with curl using prefix (%s) (%v)", p, err)
 	}
-	if err := cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/range"), value: string(rangeData), expected: expectGet}); err != nil {
-		t.Fatalf("failed get with curl (%v)", err)
+	if err := cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/range"), value: string(rangeData), expected: expectGet}); err != nil {
+		cx.t.Fatalf("failed testV3CurlPutGet get with curl using prefix (%s) (%v)", p, err)
 	}
-
-	if cfg.clientTLS == clientTLSAndNonTLS {
-		if err := cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/range"), value: string(rangeData), expected: expectGet, isTLS: true}); err != nil {
-			t.Fatalf("failed get with curl (%v)", err)
+	if cx.cfg.clientTLS == clientTLSAndNonTLS {
+		if err := cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/range"), value: string(rangeData), expected: expectGet, isTLS: true}); err != nil {
+			cx.t.Fatalf("failed testV3CurlPutGet get with curl using prefix (%s) (%v)", p, err)
 		}
 	}
 }
 
-func TestV3CurlWatchAlpha(t *testing.T) { testV3CurlWatch(t, "/v3alpha") }
-func TestV3CurlWatchBeta(t *testing.T)  { testV3CurlWatch(t, "/v3beta") }
-func testV3CurlWatch(t *testing.T, pathPrefix string) {
-	defer testutil.AfterTest(t)
-
-	epc, err := newEtcdProcessCluster(&configNoTLS)
-	if err != nil {
-		t.Fatalf("could not start etcd process cluster (%v)", err)
-	}
-	defer func() {
-		if cerr := epc.Close(); err != nil {
-			t.Fatalf("error closing etcd processes (%v)", cerr)
-		}
-	}()
-
+func testV3CurlWatch(cx ctlCtx) {
 	// store "bar" into "foo"
 	putreq, err := json.Marshal(&pb.PutRequest{Key: []byte("foo"), Value: []byte("bar")})
 	if err != nil {
-		t.Fatal(err)
-	}
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/put"), value: string(putreq), expected: "revision"}); err != nil {
-		t.Fatalf("failed put with curl (%v)", err)
+		cx.t.Fatal(err)
 	}
 	// watch for first update to "foo"
 	wcr := &pb.WatchCreateRequest{Key: []byte("foo"), StartRevision: 1}
 	wreq, err := json.Marshal(wcr)
 	if err != nil {
-		t.Fatal(err)
+		cx.t.Fatal(err)
 	}
 	// marshaling the grpc to json gives:
 	// "{"RequestUnion":{"CreateRequest":{"key":"Zm9v","start_revision":1}}}"
 	// but the gprc-gateway expects a different format..
 	wstr := `{"create_request" : ` + string(wreq) + "}"
+	p := cx.apiPrefix
+
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/put"), value: string(putreq), expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlWatch put with curl using prefix (%s) (%v)", p, err)
+	}
 	// expects "bar", timeout after 2 seconds since stream waits forever
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/watch"), value: wstr, expected: `"YmFy"`, timeout: 2}); err != nil {
-		t.Fatal(err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/watch"), value: wstr, expected: `"YmFy"`, timeout: 2}); err != nil {
+		cx.t.Fatalf("failed testV3CurlWatch watch with curl using prefix (%s) (%v)", p, err)
 	}
 }
 
-func TestV3CurlTxnAlpha(t *testing.T) { testV3CurlTxn(t, "/v3alpha") }
-func TestV3CurlTxnBeta(t *testing.T)  { testV3CurlTxn(t, "/v3beta") }
-func testV3CurlTxn(t *testing.T, pathPrefix string) {
-	defer testutil.AfterTest(t)
-	epc, err := newEtcdProcessCluster(&configNoTLS)
-	if err != nil {
-		t.Fatalf("could not start etcd process cluster (%v)", err)
-	}
-	defer func() {
-		if cerr := epc.Close(); err != nil {
-			t.Fatalf("error closing etcd processes (%v)", cerr)
-		}
-	}()
-
+func testV3CurlTxn(cx ctlCtx) {
 	txn := &pb.TxnRequest{
 		Compare: []*pb.Compare{
 			{
@@ -173,75 +157,65 @@ func testV3CurlTxn(t *testing.T, pathPrefix string) {
 	m := &runtime.JSONPb{}
 	jsonDat, jerr := m.Marshal(txn)
 	if jerr != nil {
-		t.Fatal(jerr)
+		cx.t.Fatal(jerr)
 	}
 	expected := `"succeeded":true,"responses":[{"response_put":{"header":{"revision":"2"}}}]`
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/txn"), value: string(jsonDat), expected: expected}); err != nil {
-		t.Fatalf("failed txn with curl (%v)", err)
+	p := cx.apiPrefix
+	if err := cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/txn"), value: string(jsonDat), expected: expected}); err != nil {
+		cx.t.Fatalf("failed testV3CurlTxn txn with curl using prefix (%s) (%v)", p, err)
 	}
 
 	// was crashing etcd server
 	malformed := `{"compare":[{"result":0,"target":1,"key":"Zm9v","TargetUnion":null}],"success":[{"Request":{"RequestPut":{"key":"Zm9v","value":"YmFy"}}}]}`
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/txn"), value: malformed, expected: "error"}); err != nil {
-		t.Fatalf("failed put with curl (%v)", err)
+	if err := cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/txn"), value: malformed, expected: "error"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlTxn put with curl using prefix (%s) (%v)", p, err)
 	}
-}
 
-func TestV3CurlAuthAlpha(t *testing.T) { testV3CurlAuth(t, "/v3alpha") }
-func TestV3CurlAuthBeta(t *testing.T)  { testV3CurlAuth(t, "/v3beta") }
-func testV3CurlAuth(t *testing.T, pathPrefix string) {
-	defer testutil.AfterTest(t)
-	epc, err := newEtcdProcessCluster(&configNoTLS)
-	if err != nil {
-		t.Fatalf("could not start etcd process cluster (%v)", err)
-	}
-	defer func() {
-		if cerr := epc.Close(); err != nil {
-			t.Fatalf("error closing etcd processes (%v)", cerr)
-		}
-	}()
+}
 
+func testV3CurlAuth(cx ctlCtx) {
 	// create root user
 	userreq, err := json.Marshal(&pb.AuthUserAddRequest{Name: string("root"), Password: string("toor")})
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/auth/user/add"), value: string(userreq), expected: "revision"}); err != nil {
-		t.Fatalf("failed add user with curl (%v)", err)
+	p := cx.apiPrefix
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/auth/user/add"), value: string(userreq), expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth add user with curl (%v)", err)
 	}
 
 	// create root role
 	rolereq, err := json.Marshal(&pb.AuthRoleAddRequest{Name: string("root")})
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/auth/role/add"), value: string(rolereq), expected: "revision"}); err != nil {
-		t.Fatalf("failed create role with curl (%v)", err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/auth/role/add"), value: string(rolereq), expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth create role with curl using prefix (%s) (%v)", p, err)
 	}
 
 	// grant root role
 	grantrolereq, err := json.Marshal(&pb.AuthUserGrantRoleRequest{User: string("root"), Role: string("root")})
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/auth/user/grant"), value: string(grantrolereq), expected: "revision"}); err != nil {
-		t.Fatalf("failed grant role with curl (%v)", err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/auth/user/grant"), value: string(grantrolereq), expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth grant role with curl using prefix (%s) (%v)", p, err)
 	}
 
 	// enable auth
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/auth/enable"), value: string("{}"), expected: "revision"}); err != nil {
-		t.Fatalf("failed enable auth with curl (%v)", err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/auth/enable"), value: string("{}"), expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth enable auth with curl using prefix (%s) (%v)", p, err)
 	}
 
 	// put "bar" into "foo"
 	putreq, err := json.Marshal(&pb.PutRequest{Key: []byte("foo"), Value: []byte("bar")})
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 	// fail put no auth
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/put"), value: string(putreq), expected: "error"}); err != nil {
-		t.Fatalf("failed no auth put with curl (%v)", err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/put"), value: string(putreq), expected: "error"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth no auth put with curl using prefix (%s) (%v)", p, err)
 	}
 
 	// auth request
 	authreq, err := json.Marshal(&pb.AuthenticateRequest{Name: string("root"), Password: string("toor")})
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 	var (
 		authHeader string
@@ -249,25 +223,25 @@ func testV3CurlAuth(t *testing.T, pathPrefix string) {
 		lineFunc   = func(txt string) bool { return true }
 	)
 
-	cmdArgs = cURLPrefixArgs(epc, "POST", cURLReq{endpoint: path.Join(pathPrefix, "/auth/authenticate"), value: string(authreq)})
+	cmdArgs = cURLPrefixArgs(cx.epc, "POST", cURLReq{endpoint: path.Join(p, "/auth/authenticate"), value: string(authreq)})
 	proc, err := spawnCmd(cmdArgs)
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 	cURLRes, err := proc.ExpectFunc(lineFunc)
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 	authRes := make(map[string]interface{})
-	testutil.AssertNil(t, json.Unmarshal([]byte(cURLRes), &authRes))
+	testutil.AssertNil(cx.t, json.Unmarshal([]byte(cURLRes), &authRes))
 
 	token, ok := authRes["token"].(string)
 	if !ok {
-		t.Fatalf("failed invalid token in authenticate response with curl")
+		cx.t.Fatalf("failed invalid token in authenticate response with curl")
 	}
 
 	authHeader = "Authorization : " + token
 
 	// put with auth
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/put"), value: string(putreq), header: authHeader, expected: "revision"}); err != nil {
-		t.Fatalf("failed auth put with curl (%v)", err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/put"), value: string(putreq), header: authHeader, expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth auth put with curl using prefix (%s) (%v)", p, err)
 	}
 }

+ 5 - 5
embed/serve.go

@@ -230,7 +230,7 @@ func (sctx *serveCtx) createMux(gwmux *gw.ServeMux, handler http.Handler) *http.
 	}
 
 	httpmux.Handle(
-		"/v3beta/",
+		"/v3/",
 		wsproxy.WebsocketProxy(
 			gwmux,
 			wsproxy.WithRequestMutator(
@@ -248,8 +248,8 @@ func (sctx *serveCtx) createMux(gwmux *gw.ServeMux, handler http.Handler) *http.
 	return httpmux
 }
 
-// wraps HTTP multiplexer to mute requests to /v3alpha
-// TODO: deprecate this in 3.4 release
+// wraps HTTP multiplexer to mute requests to /v3beta
+// TODO: deprecate this in 3.5 release
 func wrapMux(mux *http.ServeMux) http.Handler { return &v3alphaMutator{mux: mux} }
 
 type v3alphaMutator struct {
@@ -257,8 +257,8 @@ type v3alphaMutator struct {
 }
 
 func (m *v3alphaMutator) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
-	if req != nil && req.URL != nil && strings.HasPrefix(req.URL.Path, "/v3alpha/") {
-		req.URL.Path = strings.Replace(req.URL.Path, "/v3alpha/", "/v3beta/", 1)
+	if req != nil && req.URL != nil && strings.HasPrefix(req.URL.Path, "/v3beta/") {
+		req.URL.Path = strings.Replace(req.URL.Path, "/v3beta/", "/v3/", 1)
 	}
 	m.mux.ServeHTTP(rw, req)
 }

+ 5 - 5
etcdserver/api/v3election/v3electionpb/gw/v3election.pb.gw.go

@@ -289,15 +289,15 @@ func RegisterElectionHandlerClient(ctx context.Context, mux *runtime.ServeMux, c
 }
 
 var (
-	pattern_Election_Campaign_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "election", "campaign"}, ""))
+	pattern_Election_Campaign_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "election", "campaign"}, ""))
 
-	pattern_Election_Proclaim_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "election", "proclaim"}, ""))
+	pattern_Election_Proclaim_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "election", "proclaim"}, ""))
 
-	pattern_Election_Leader_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "election", "leader"}, ""))
+	pattern_Election_Leader_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "election", "leader"}, ""))
 
-	pattern_Election_Observe_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "election", "observe"}, ""))
+	pattern_Election_Observe_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "election", "observe"}, ""))
 
-	pattern_Election_Resign_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "election", "resign"}, ""))
+	pattern_Election_Resign_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "election", "resign"}, ""))
 )
 
 var (

+ 35 - 35
etcdserver/api/v3election/v3electionpb/v3election.pb.go

@@ -2041,39 +2041,39 @@ var (
 func init() { proto.RegisterFile("v3election.proto", fileDescriptorV3Election) }
 
 var fileDescriptorV3Election = []byte{
-	// 544 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0xc1, 0x6e, 0xd3, 0x40,
-	0x10, 0x65, 0x9d, 0x10, 0xca, 0x90, 0xb6, 0x96, 0x55, 0xa9, 0x21, 0xa4, 0x56, 0xb4, 0x45, 0xa8,
-	0xca, 0xc1, 0x8b, 0x1a, 0x4e, 0x39, 0x21, 0x10, 0xa8, 0x52, 0x91, 0x00, 0x1f, 0x10, 0x1c, 0xd7,
-	0xee, 0xc8, 0x8d, 0xe2, 0x78, 0x8d, 0xed, 0x5a, 0xca, 0x95, 0x5f, 0xe0, 0xc2, 0x3f, 0xf0, 0x23,
-	0x1c, 0x91, 0xf8, 0x01, 0x14, 0xf8, 0x10, 0xb4, 0xbb, 0x36, 0x76, 0xdc, 0x10, 0xa1, 0xe6, 0x62,
-	0x8d, 0x67, 0x9e, 0xe7, 0xcd, 0x7b, 0x3b, 0x6b, 0x30, 0xf3, 0x31, 0x86, 0xe8, 0x67, 0x53, 0x11,
-	0x39, 0x71, 0x22, 0x32, 0x61, 0x75, 0xab, 0x4c, 0xec, 0xf5, 0x0f, 0x02, 0x11, 0x08, 0x55, 0x60,
-	0x32, 0xd2, 0x98, 0xfe, 0x23, 0xcc, 0xfc, 0x0b, 0x26, 0x1f, 0x29, 0x26, 0x39, 0x26, 0xb5, 0x30,
-	0xf6, 0x58, 0x12, 0xfb, 0x05, 0x8e, 0x2a, 0xdc, 0x34, 0xca, 0x30, 0x89, 0x78, 0xc8, 0xe6, 0xb9,
-	0xef, 0xab, 0x47, 0xec, 0xb1, 0x59, 0x5e, 0x60, 0x06, 0x81, 0x10, 0x41, 0x88, 0x8c, 0xc7, 0x53,
-	0xc6, 0xa3, 0x48, 0x64, 0x5c, 0x52, 0xa7, 0xba, 0x4a, 0xdf, 0xc2, 0xfe, 0x73, 0x3e, 0x8f, 0xf9,
-	0x34, 0x88, 0x5c, 0xfc, 0x78, 0x85, 0x69, 0x66, 0x59, 0xd0, 0x8e, 0xf8, 0x1c, 0x7b, 0x64, 0x48,
-	0x4e, 0xba, 0xae, 0x8a, 0xad, 0x03, 0xb8, 0x1d, 0x22, 0x4f, 0xb1, 0x67, 0x0c, 0xc9, 0x49, 0xcb,
-	0xd5, 0x2f, 0x32, 0x9b, 0xf3, 0xf0, 0x0a, 0x7b, 0x2d, 0x05, 0xd5, 0x2f, 0x74, 0x01, 0x66, 0xd5,
-	0x32, 0x8d, 0x45, 0x94, 0xa2, 0xf5, 0x04, 0x3a, 0x97, 0xc8, 0x2f, 0x30, 0x51, 0x5d, 0xef, 0x9d,
-	0x0e, 0x9c, 0xba, 0x22, 0xa7, 0xc4, 0x9d, 0x29, 0x8c, 0x5b, 0x60, 0x2d, 0x06, 0x9d, 0x50, 0x7f,
-	0x65, 0xa8, 0xaf, 0x0e, 0x9d, 0xba, 0x77, 0xce, 0x2b, 0x55, 0x3b, 0xc7, 0x85, 0x5b, 0xc0, 0xe8,
-	0x07, 0xb8, 0xfb, 0x37, 0xb9, 0x56, 0x87, 0x09, 0xad, 0x19, 0x2e, 0x54, 0xbb, 0xae, 0x2b, 0x43,
-	0x99, 0x49, 0x30, 0x57, 0x0a, 0x5a, 0xae, 0x0c, 0x2b, 0xad, 0xed, 0x9a, 0x56, 0x7a, 0x0c, 0xbb,
-	0xba, 0xf5, 0x06, 0x9b, 0xe8, 0x25, 0xec, 0x95, 0xa0, 0xad, 0x84, 0x0f, 0xc1, 0x98, 0xe5, 0x85,
-	0x68, 0xd3, 0xd1, 0x27, 0xea, 0x9c, 0xe3, 0xe2, 0x9d, 0x34, 0xd8, 0x35, 0x66, 0x39, 0x7d, 0x0a,
-	0xbb, 0x2e, 0xa6, 0xb5, 0x53, 0xab, 0xbc, 0x22, 0xff, 0xe7, 0xd5, 0x4b, 0xd8, 0x2b, 0x3b, 0x6c,
-	0x33, 0x2b, 0x7d, 0x0f, 0xfb, 0x6f, 0x12, 0xe1, 0x87, 0x7c, 0x3a, 0xbf, 0xe9, 0x2c, 0xd5, 0x22,
-	0x19, 0xf5, 0x45, 0x3a, 0x03, 0xb3, 0xea, 0xbc, 0xcd, 0x8c, 0xa7, 0x5f, 0xdb, 0xb0, 0xf3, 0xa2,
-	0x18, 0xc0, 0x12, 0xb0, 0x53, 0xee, 0xa7, 0x75, 0xb4, 0x3a, 0x59, 0xe3, 0x2a, 0xf4, 0xed, 0x7f,
-	0x95, 0x35, 0x0b, 0x7d, 0xf8, 0xe9, 0xc7, 0xef, 0xcf, 0x86, 0x4d, 0xef, 0xb3, 0x7c, 0xec, 0x61,
-	0xc6, 0x59, 0x09, 0x66, 0x7e, 0x01, 0x9d, 0x90, 0x91, 0x24, 0x2c, 0x75, 0x34, 0x09, 0x1b, 0xce,
-	0x35, 0x09, 0x9b, 0xf2, 0x37, 0x10, 0xc6, 0x05, 0x54, 0x12, 0x06, 0xd0, 0xd1, 0x1e, 0x5b, 0x0f,
-	0xd6, 0x39, 0x5f, 0x92, 0x0d, 0xd6, 0x17, 0x0b, 0x2a, 0xaa, 0xa8, 0x06, 0xf4, 0xf0, 0x1a, 0x95,
-	0x3e, 0x34, 0x49, 0x34, 0x83, 0x3b, 0xaf, 0x3d, 0x65, 0xfe, 0x36, 0x4c, 0xc7, 0x8a, 0xe9, 0x88,
-	0xf6, 0xae, 0x31, 0x09, 0xdd, 0x7c, 0x42, 0x46, 0x8f, 0x89, 0x54, 0xa5, 0x17, 0xb6, 0xc9, 0xb5,
-	0x72, 0x11, 0x9a, 0x5c, 0xab, 0x3b, 0xbe, 0x41, 0x55, 0xa2, 0x80, 0x13, 0x32, 0x7a, 0x66, 0x7e,
-	0x5b, 0xda, 0xe4, 0xfb, 0xd2, 0x26, 0x3f, 0x97, 0x36, 0xf9, 0xf2, 0xcb, 0xbe, 0xe5, 0x75, 0xd4,
-	0xcf, 0x72, 0xfc, 0x27, 0x00, 0x00, 0xff, 0xff, 0x10, 0xc5, 0xc8, 0x9a, 0xce, 0x05, 0x00, 0x00,
+	// 541 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x94, 0xcf, 0x6e, 0xd3, 0x40,
+	0x10, 0xc6, 0x59, 0xa7, 0x84, 0x32, 0xa4, 0xad, 0x65, 0x82, 0x08, 0x21, 0x98, 0x68, 0x91, 0x50,
+	0x95, 0x83, 0x17, 0x35, 0x9c, 0x72, 0x42, 0x20, 0x50, 0xa5, 0x22, 0x01, 0x3e, 0x20, 0x38, 0x6e,
+	0xdc, 0x91, 0x1b, 0xd9, 0xf1, 0x1a, 0xdb, 0xb5, 0x94, 0x2b, 0xaf, 0xc0, 0x01, 0x1e, 0x89, 0x23,
+	0x12, 0x2f, 0x80, 0x02, 0x0f, 0x82, 0x76, 0xd7, 0xc6, 0x7f, 0x94, 0x20, 0x44, 0x2e, 0xd6, 0x78,
+	0xe7, 0xf3, 0xfc, 0xe6, 0x9b, 0x9d, 0x04, 0xcc, 0x7c, 0x8a, 0x21, 0x7a, 0xd9, 0x42, 0x44, 0x4e,
+	0x9c, 0x88, 0x4c, 0x58, 0xbd, 0xea, 0x24, 0x9e, 0x0f, 0xfb, 0xbe, 0xf0, 0x85, 0x4a, 0x30, 0x19,
+	0x69, 0xcd, 0xf0, 0x21, 0x66, 0xde, 0x39, 0x93, 0x8f, 0x14, 0x93, 0x1c, 0x93, 0x5a, 0x18, 0xcf,
+	0x59, 0x12, 0x7b, 0x85, 0x8e, 0x2a, 0xdd, 0x22, 0xca, 0x30, 0x89, 0x78, 0xc8, 0x96, 0xb9, 0xe7,
+	0xa9, 0x47, 0x3c, 0x67, 0x41, 0x5e, 0x68, 0x46, 0xbe, 0x10, 0x7e, 0x88, 0x8c, 0xc7, 0x0b, 0xc6,
+	0xa3, 0x48, 0x64, 0x5c, 0xa2, 0x53, 0x9d, 0xa5, 0x6f, 0xe0, 0xe8, 0x19, 0x5f, 0xc6, 0x7c, 0xe1,
+	0x47, 0x2e, 0x7e, 0xb8, 0xc4, 0x34, 0xb3, 0x2c, 0xd8, 0x8b, 0xf8, 0x12, 0x07, 0x64, 0x4c, 0x8e,
+	0x7b, 0xae, 0x8a, 0xad, 0x3e, 0x5c, 0x0d, 0x91, 0xa7, 0x38, 0x30, 0xc6, 0xe4, 0xb8, 0xe3, 0xea,
+	0x17, 0x79, 0x9a, 0xf3, 0xf0, 0x12, 0x07, 0x1d, 0x25, 0xd5, 0x2f, 0x74, 0x05, 0x66, 0x55, 0x32,
+	0x8d, 0x45, 0x94, 0xa2, 0xf5, 0x18, 0xba, 0x17, 0xc8, 0xcf, 0x31, 0x51, 0x55, 0x6f, 0x9c, 0x8c,
+	0x9c, 0xba, 0x23, 0xa7, 0xd4, 0x9d, 0x2a, 0x8d, 0x5b, 0x68, 0x2d, 0x06, 0xdd, 0x50, 0x7f, 0x65,
+	0xa8, 0xaf, 0x6e, 0x3b, 0xf5, 0xd9, 0x39, 0x2f, 0x55, 0xee, 0x0c, 0x57, 0x6e, 0x21, 0xa3, 0xef,
+	0xe1, 0xfa, 0x9f, 0xc3, 0x8d, 0x3e, 0x4c, 0xe8, 0x04, 0xb8, 0x52, 0xe5, 0x7a, 0xae, 0x0c, 0xe5,
+	0x49, 0x82, 0xb9, 0x72, 0xd0, 0x71, 0x65, 0x58, 0x79, 0xdd, 0xab, 0x79, 0xa5, 0x0f, 0xe0, 0x40,
+	0x97, 0xfe, 0xcb, 0x98, 0xe8, 0x05, 0x1c, 0x96, 0xa2, 0x9d, 0x8c, 0x8f, 0xc1, 0x08, 0xf2, 0xc2,
+	0xb4, 0xe9, 0xe8, 0x1b, 0x75, 0xce, 0x70, 0xf5, 0x56, 0x0e, 0xd8, 0x35, 0x82, 0x9c, 0x3e, 0x81,
+	0x03, 0x17, 0xd3, 0xda, 0xad, 0x55, 0xb3, 0x22, 0xff, 0x36, 0xab, 0x17, 0x70, 0x58, 0x56, 0xd8,
+	0xa5, 0x57, 0xfa, 0x0e, 0x8e, 0x5e, 0x27, 0xc2, 0x0b, 0xf9, 0x62, 0xf9, 0xbf, 0xbd, 0x54, 0x8b,
+	0x64, 0xd4, 0x17, 0xe9, 0x14, 0xcc, 0xaa, 0xf2, 0x2e, 0x3d, 0x9e, 0x7c, 0xde, 0x83, 0xfd, 0xe7,
+	0x45, 0x03, 0x56, 0x00, 0xfb, 0xe5, 0x7e, 0x5a, 0xf7, 0x9a, 0x9d, 0xb5, 0x7e, 0x0a, 0x43, 0x7b,
+	0x5b, 0x5a, 0x53, 0xe8, 0xf8, 0xe3, 0xf7, 0x5f, 0x9f, 0x8c, 0x21, 0xbd, 0xc5, 0xf2, 0x29, 0x2b,
+	0x85, 0xcc, 0x2b, 0x64, 0x33, 0x32, 0x91, 0xb0, 0xd2, 0x43, 0x1b, 0xd6, 0x9a, 0x5a, 0x1b, 0xd6,
+	0xb6, 0xbe, 0x05, 0x16, 0x17, 0x32, 0x09, 0xf3, 0xa0, 0xab, 0x67, 0x6b, 0xdd, 0xdd, 0x34, 0xf1,
+	0x12, 0x34, 0xda, 0x9c, 0x2c, 0x30, 0xb6, 0xc2, 0x0c, 0xe8, 0xcd, 0x06, 0x46, 0x5f, 0x94, 0x84,
+	0xf8, 0x70, 0xed, 0xd5, 0x5c, 0x0d, 0x7c, 0x17, 0xca, 0x7d, 0x45, 0xb9, 0x43, 0xfb, 0x0d, 0x8a,
+	0xd0, 0x85, 0x67, 0x64, 0xf2, 0x88, 0x48, 0x37, 0x7a, 0x41, 0xdb, 0x9c, 0xc6, 0xe2, 0xb7, 0x39,
+	0xcd, 0x9d, 0xde, 0xe2, 0x26, 0x51, 0xa2, 0x19, 0x99, 0x3c, 0x35, 0xbf, 0xae, 0x6d, 0xf2, 0x6d,
+	0x6d, 0x93, 0x1f, 0x6b, 0x9b, 0x7c, 0xf9, 0x69, 0x5f, 0x99, 0x77, 0xd5, 0x1f, 0xe3, 0xf4, 0x77,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0xa4, 0x60, 0xb0, 0x9f, 0xba, 0x05, 0x00, 0x00,
 }

+ 5 - 5
etcdserver/api/v3election/v3electionpb/v3election.proto

@@ -19,21 +19,21 @@ service Election {
   // leadership still being held, and resign from the election.
   rpc Campaign(CampaignRequest) returns (CampaignResponse) {
       option (google.api.http) = {
-        post: "/v3beta/election/campaign"
+        post: "/v3/election/campaign"
         body: "*"
     };
   }
   // Proclaim updates the leader's posted value with a new value.
   rpc Proclaim(ProclaimRequest) returns (ProclaimResponse) {
       option (google.api.http) = {
-        post: "/v3beta/election/proclaim"
+        post: "/v3/election/proclaim"
         body: "*"
     };
   }
   // Leader returns the current election proclamation, if any.
   rpc Leader(LeaderRequest) returns (LeaderResponse) {
       option (google.api.http) = {
-        post: "/v3beta/election/leader"
+        post: "/v3/election/leader"
         body: "*"
     };
   }
@@ -41,7 +41,7 @@ service Election {
   // elected leaders.
   rpc Observe(LeaderRequest) returns (stream LeaderResponse) {
       option (google.api.http) = {
-        post: "/v3beta/election/observe"
+        post: "/v3/election/observe"
         body: "*"
     };
   }
@@ -49,7 +49,7 @@ service Election {
   // leadership on the election.
   rpc Resign(ResignRequest) returns (ResignResponse) {
       option (google.api.http) = {
-        post: "/v3beta/election/resign"
+        post: "/v3/election/resign"
         body: "*"
     };
   }

+ 2 - 2
etcdserver/api/v3lock/v3lockpb/gw/v3lock.pb.gw.go

@@ -155,9 +155,9 @@ func RegisterLockHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien
 }
 
 var (
-	pattern_Lock_Lock_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1}, []string{"v3beta", "lock"}, ""))
+	pattern_Lock_Lock_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1}, []string{"v3", "lock"}, ""))
 
-	pattern_Lock_Unlock_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "lock", "unlock"}, ""))
+	pattern_Lock_Unlock_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "lock", "unlock"}, ""))
 )
 
 var (

+ 9 - 9
etcdserver/api/v3lock/v3lockpb/v3lock.pb.go

@@ -934,7 +934,7 @@ var (
 func init() { proto.RegisterFile("v3lock.proto", fileDescriptorV3Lock) }
 
 var fileDescriptorV3Lock = []byte{
-	// 335 bytes of a gzipped FileDescriptorProto
+	// 331 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0x33, 0xce, 0xc9,
 	0x4f, 0xce, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x80, 0xf0, 0x0a, 0x92, 0xa4, 0x44,
 	0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x82, 0xfa, 0x20, 0x16, 0x44, 0x5e, 0x4a, 0x2d, 0xb5, 0x24, 0x39,
@@ -948,12 +948,12 @@ var fileDescriptorV3Lock = []byte{
 	0x98, 0x92, 0x5a, 0x04, 0xd6, 0xcb, 0x6d, 0x24, 0xa3, 0x87, 0xec, 0x1e, 0x3d, 0x98, 0x3a, 0x0f,
 	0xb0, 0x9a, 0x20, 0xa8, 0x5a, 0x21, 0x01, 0x2e, 0xe6, 0xec, 0xd4, 0x4a, 0xb0, 0xc9, 0x3c, 0x41,
 	0x20, 0xa6, 0x92, 0x22, 0x17, 0x6f, 0x68, 0x5e, 0x0e, 0x92, 0x93, 0xa0, 0x4a, 0x18, 0x11, 0x4a,
-	0xdc, 0xb8, 0xf8, 0x60, 0x4a, 0x28, 0xb1, 0xdc, 0x68, 0x07, 0x23, 0x17, 0x0b, 0xc8, 0x0f, 0x42,
-	0xc1, 0x50, 0x5a, 0x54, 0x0f, 0x16, 0xe6, 0x7a, 0x48, 0x81, 0x22, 0x25, 0x86, 0x2e, 0x0c, 0x31,
-	0x4d, 0x49, 0xa6, 0xe9, 0xf2, 0x93, 0xc9, 0x4c, 0x62, 0x4a, 0x82, 0xfa, 0x65, 0xc6, 0x49, 0xa9,
-	0x25, 0x89, 0xfa, 0x20, 0x45, 0x60, 0xc2, 0x8a, 0x51, 0x4b, 0x28, 0x9a, 0x8b, 0x0d, 0xe2, 0x4a,
-	0x21, 0x71, 0x84, 0x7e, 0x14, 0xaf, 0x49, 0x49, 0x60, 0x4a, 0x40, 0x8d, 0x96, 0x03, 0x1b, 0x2d,
-	0xa1, 0x24, 0x8c, 0x62, 0x74, 0x69, 0x1e, 0xd4, 0x70, 0x27, 0x81, 0x13, 0x8f, 0xe4, 0x18, 0x2f,
-	0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc6, 0x63, 0x39, 0x86, 0x24, 0x36, 0x70, 0x7c,
-	0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x10, 0x82, 0x89, 0xf0, 0x45, 0x02, 0x00, 0x00,
+	0xdc, 0xb8, 0xf8, 0x60, 0x4a, 0x28, 0xb1, 0xdc, 0x68, 0x03, 0x23, 0x17, 0x0b, 0xc8, 0x0f, 0x42,
+	0xfe, 0x50, 0x5a, 0x54, 0x0f, 0x16, 0xe6, 0x7a, 0x48, 0x81, 0x22, 0x25, 0x86, 0x2e, 0x0c, 0x31,
+	0x4d, 0x49, 0xa2, 0xe9, 0xf2, 0x93, 0xc9, 0x4c, 0x42, 0x4a, 0xbc, 0xfa, 0x65, 0xc6, 0xfa, 0x20,
+	0x05, 0x60, 0xc2, 0x8a, 0x51, 0x4b, 0x28, 0x9c, 0x8b, 0x0d, 0xe2, 0x42, 0x21, 0x71, 0x84, 0x5e,
+	0x14, 0x6f, 0x49, 0x49, 0x60, 0x4a, 0x40, 0x8d, 0x95, 0x02, 0x1b, 0x2b, 0xa2, 0xc4, 0x0f, 0x37,
+	0xb6, 0x34, 0x0f, 0x6a, 0xb0, 0x93, 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e,
+	0x78, 0x24, 0xc7, 0x38, 0xe3, 0xb1, 0x1c, 0x43, 0x12, 0x1b, 0x38, 0x1e, 0x8d, 0x01, 0x01, 0x00,
+	0x00, 0xff, 0xff, 0x65, 0xa8, 0x61, 0xb1, 0x3d, 0x02, 0x00, 0x00,
 }

+ 2 - 2
etcdserver/api/v3lock/v3lockpb/v3lock.proto

@@ -20,7 +20,7 @@ service Lock {
   // lease associate with the owner expires.
   rpc Lock(LockRequest) returns (LockResponse) {
       option (google.api.http) = {
-        post: "/v3beta/lock/lock"
+        post: "/v3/lock/lock"
         body: "*"
     };
   }
@@ -30,7 +30,7 @@ service Lock {
   // ownership of the lock.
   rpc Unlock(UnlockRequest) returns (UnlockResponse) {
       option (google.api.http) = {
-        post: "/v3beta/lock/unlock"
+        post: "/v3/lock/unlock"
         body: "*"
     };
   }

+ 38 - 38
etcdserver/etcdserverpb/gw/rpc.pb.gw.go

@@ -796,15 +796,15 @@ func RegisterKVHandlerClient(ctx context.Context, mux *runtime.ServeMux, client
 }
 
 var (
-	pattern_KV_Range_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "kv", "range"}, ""))
+	pattern_KV_Range_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "range"}, ""))
 
-	pattern_KV_Put_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "kv", "put"}, ""))
+	pattern_KV_Put_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "put"}, ""))
 
-	pattern_KV_DeleteRange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "kv", "deleterange"}, ""))
+	pattern_KV_DeleteRange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "deleterange"}, ""))
 
-	pattern_KV_Txn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "kv", "txn"}, ""))
+	pattern_KV_Txn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "txn"}, ""))
 
-	pattern_KV_Compact_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "kv", "compaction"}, ""))
+	pattern_KV_Compact_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "compaction"}, ""))
 )
 
 var (
@@ -890,7 +890,7 @@ func RegisterWatchHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
 }
 
 var (
-	pattern_Watch_Watch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v3beta", "watch"}, ""))
+	pattern_Watch_Watch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v3", "watch"}, ""))
 )
 
 var (
@@ -1084,15 +1084,15 @@ func RegisterLeaseHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
 }
 
 var (
-	pattern_Lease_LeaseGrant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "lease", "grant"}, ""))
+	pattern_Lease_LeaseGrant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "lease", "grant"}, ""))
 
-	pattern_Lease_LeaseRevoke_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "kv", "lease", "revoke"}, ""))
+	pattern_Lease_LeaseRevoke_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "kv", "lease", "revoke"}, ""))
 
-	pattern_Lease_LeaseKeepAlive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "lease", "keepalive"}, ""))
+	pattern_Lease_LeaseKeepAlive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "lease", "keepalive"}, ""))
 
-	pattern_Lease_LeaseTimeToLive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "kv", "lease", "timetolive"}, ""))
+	pattern_Lease_LeaseTimeToLive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "kv", "lease", "timetolive"}, ""))
 
-	pattern_Lease_LeaseLeases_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "kv", "lease", "leases"}, ""))
+	pattern_Lease_LeaseLeases_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "kv", "lease", "leases"}, ""))
 )
 
 var (
@@ -1265,13 +1265,13 @@ func RegisterClusterHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl
 }
 
 var (
-	pattern_Cluster_MemberAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "cluster", "member", "add"}, ""))
+	pattern_Cluster_MemberAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "cluster", "member", "add"}, ""))
 
-	pattern_Cluster_MemberRemove_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "cluster", "member", "remove"}, ""))
+	pattern_Cluster_MemberRemove_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "cluster", "member", "remove"}, ""))
 
-	pattern_Cluster_MemberUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "cluster", "member", "update"}, ""))
+	pattern_Cluster_MemberUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "cluster", "member", "update"}, ""))
 
-	pattern_Cluster_MemberList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "cluster", "member", "list"}, ""))
+	pattern_Cluster_MemberList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "cluster", "member", "list"}, ""))
 )
 
 var (
@@ -1529,19 +1529,19 @@ func RegisterMaintenanceHandlerClient(ctx context.Context, mux *runtime.ServeMux
 }
 
 var (
-	pattern_Maintenance_Alarm_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "alarm"}, ""))
+	pattern_Maintenance_Alarm_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "alarm"}, ""))
 
-	pattern_Maintenance_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "status"}, ""))
+	pattern_Maintenance_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "status"}, ""))
 
-	pattern_Maintenance_Defragment_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "defragment"}, ""))
+	pattern_Maintenance_Defragment_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "defragment"}, ""))
 
-	pattern_Maintenance_Hash_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "hash"}, ""))
+	pattern_Maintenance_Hash_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "hash"}, ""))
 
-	pattern_Maintenance_HashKV_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "hash"}, ""))
+	pattern_Maintenance_HashKV_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "hash"}, ""))
 
-	pattern_Maintenance_Snapshot_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "snapshot"}, ""))
+	pattern_Maintenance_Snapshot_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "snapshot"}, ""))
 
-	pattern_Maintenance_MoveLeader_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "transfer-leadership"}, ""))
+	pattern_Maintenance_MoveLeader_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "transfer-leadership"}, ""))
 )
 
 var (
@@ -2066,37 +2066,37 @@ func RegisterAuthHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien
 }
 
 var (
-	pattern_Auth_AuthEnable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "auth", "enable"}, ""))
+	pattern_Auth_AuthEnable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "auth", "enable"}, ""))
 
-	pattern_Auth_AuthDisable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "auth", "disable"}, ""))
+	pattern_Auth_AuthDisable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "auth", "disable"}, ""))
 
-	pattern_Auth_Authenticate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "auth", "authenticate"}, ""))
+	pattern_Auth_Authenticate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "auth", "authenticate"}, ""))
 
-	pattern_Auth_UserAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "add"}, ""))
+	pattern_Auth_UserAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "add"}, ""))
 
-	pattern_Auth_UserGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "get"}, ""))
+	pattern_Auth_UserGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "get"}, ""))
 
-	pattern_Auth_UserList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "list"}, ""))
+	pattern_Auth_UserList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "list"}, ""))
 
-	pattern_Auth_UserDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "delete"}, ""))
+	pattern_Auth_UserDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "delete"}, ""))
 
-	pattern_Auth_UserChangePassword_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "changepw"}, ""))
+	pattern_Auth_UserChangePassword_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "changepw"}, ""))
 
-	pattern_Auth_UserGrantRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "grant"}, ""))
+	pattern_Auth_UserGrantRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "grant"}, ""))
 
-	pattern_Auth_UserRevokeRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "revoke"}, ""))
+	pattern_Auth_UserRevokeRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "revoke"}, ""))
 
-	pattern_Auth_RoleAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "add"}, ""))
+	pattern_Auth_RoleAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "add"}, ""))
 
-	pattern_Auth_RoleGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "get"}, ""))
+	pattern_Auth_RoleGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "get"}, ""))
 
-	pattern_Auth_RoleList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "list"}, ""))
+	pattern_Auth_RoleList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "list"}, ""))
 
-	pattern_Auth_RoleDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "delete"}, ""))
+	pattern_Auth_RoleDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "delete"}, ""))
 
-	pattern_Auth_RoleGrantPermission_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "grant"}, ""))
+	pattern_Auth_RoleGrantPermission_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "grant"}, ""))
 
-	pattern_Auth_RoleRevokePermission_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "revoke"}, ""))
+	pattern_Auth_RoleRevokePermission_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "revoke"}, ""))
 )
 
 var (

+ 233 - 234
etcdserver/etcdserverpb/rpc.pb.go

@@ -18602,238 +18602,237 @@ var (
 func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) }
 
 var fileDescriptorRpc = []byte{
-	// 3724 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x4b, 0x6f, 0x1b, 0x4b,
-	0x76, 0x56, 0x93, 0xe2, 0xeb, 0xf0, 0x21, 0xba, 0x24, 0xdb, 0x34, 0x6d, 0xcb, 0x72, 0xf9, 0x25,
-	0x3f, 0xae, 0x38, 0xa3, 0x99, 0x64, 0xe1, 0x04, 0x83, 0x91, 0x25, 0x8e, 0xa5, 0x91, 0x2c, 0x69,
-	0x5a, 0x94, 0xef, 0x0d, 0x30, 0x89, 0xd0, 0x22, 0x4b, 0x52, 0x47, 0x64, 0x37, 0xd3, 0xdd, 0xa4,
-	0x25, 0x67, 0x90, 0x00, 0x93, 0x49, 0x90, 0x4d, 0x36, 0x19, 0x20, 0x48, 0xb2, 0x0d, 0x82, 0xc1,
-	0xec, 0xb2, 0xb9, 0xc8, 0x5f, 0xc8, 0x2e, 0x01, 0xf2, 0x07, 0x82, 0x9b, 0x6c, 0xf2, 0x0b, 0xf2,
-	0x58, 0x0d, 0xea, 0xd5, 0x5d, 0xfd, 0xa2, 0x74, 0x2f, 0xef, 0xbd, 0x1b, 0xb9, 0xeb, 0xd4, 0xa9,
-	0x73, 0x4e, 0x9d, 0xaa, 0x73, 0x4e, 0xd5, 0x57, 0x34, 0x94, 0x9c, 0x61, 0x77, 0x65, 0xe8, 0xd8,
-	0x9e, 0x8d, 0x2a, 0xc4, 0xeb, 0xf6, 0x5c, 0xe2, 0x8c, 0x89, 0x33, 0x3c, 0x6e, 0x2e, 0x9c, 0xda,
-	0xa7, 0x36, 0xeb, 0x68, 0xd1, 0x2f, 0xce, 0xd3, 0xc4, 0x94, 0xa7, 0x65, 0x5a, 0x1e, 0x71, 0x2c,
-	0xa3, 0xdf, 0x1a, 0x8c, 0xbb, 0x5d, 0xf6, 0x67, 0x78, 0xdc, 0x3a, 0x1f, 0x0b, 0x9e, 0xc7, 0x61,
-	0x1e, 0x63, 0xe4, 0x9d, 0xb1, 0x3f, 0xc3, 0x63, 0xf6, 0x8f, 0xe0, 0xba, 0x77, 0x6a, 0xdb, 0xa7,
-	0x7d, 0xd2, 0x32, 0x86, 0x66, 0xcb, 0xb0, 0x2c, 0xdb, 0x33, 0x3c, 0xd3, 0xb6, 0x5c, 0xde, 0x8b,
-	0xff, 0x5c, 0x83, 0x9a, 0x4e, 0xdc, 0xa1, 0x6d, 0xb9, 0x64, 0x93, 0x18, 0x3d, 0xe2, 0xa0, 0xfb,
-	0x00, 0xdd, 0xfe, 0xc8, 0xf5, 0x88, 0x73, 0x64, 0xf6, 0x1a, 0xda, 0x92, 0xb6, 0x3c, 0xab, 0x97,
-	0x04, 0x65, 0xab, 0x87, 0xee, 0x42, 0x69, 0x40, 0x06, 0xc7, 0xbc, 0x37, 0xc3, 0x7a, 0x8b, 0x9c,
-	0xb0, 0xd5, 0x43, 0x4d, 0x28, 0x3a, 0x64, 0x6c, 0xba, 0xa6, 0x6d, 0x35, 0xb2, 0x4b, 0xda, 0x72,
-	0x56, 0xf7, 0xdb, 0x74, 0xa0, 0x63, 0x9c, 0x78, 0x47, 0x1e, 0x71, 0x06, 0x8d, 0x59, 0x3e, 0x90,
-	0x12, 0x3a, 0xc4, 0x19, 0xe0, 0x5f, 0xe4, 0xa0, 0xa2, 0x1b, 0xd6, 0x29, 0xd1, 0xc9, 0x1f, 0x8d,
-	0x88, 0xeb, 0xa1, 0x3a, 0x64, 0xcf, 0xc9, 0x25, 0x53, 0x5f, 0xd1, 0xe9, 0x27, 0x1f, 0x6f, 0x9d,
-	0x92, 0x23, 0x62, 0x71, 0xc5, 0x15, 0x3a, 0xde, 0x3a, 0x25, 0x6d, 0xab, 0x87, 0x16, 0x20, 0xd7,
-	0x37, 0x07, 0xa6, 0x27, 0xb4, 0xf2, 0x46, 0xc8, 0x9c, 0xd9, 0x88, 0x39, 0xeb, 0x00, 0xae, 0xed,
-	0x78, 0x47, 0xb6, 0xd3, 0x23, 0x4e, 0x23, 0xb7, 0xa4, 0x2d, 0xd7, 0x56, 0x1f, 0xaf, 0xa8, 0x4b,
-	0xb3, 0xa2, 0x1a, 0xb4, 0x72, 0x60, 0x3b, 0xde, 0x1e, 0xe5, 0xd5, 0x4b, 0xae, 0xfc, 0x44, 0x3f,
-	0x82, 0x32, 0x13, 0xe2, 0x19, 0xce, 0x29, 0xf1, 0x1a, 0x79, 0x26, 0xe5, 0xc9, 0x15, 0x52, 0x3a,
-	0x8c, 0x59, 0x67, 0xea, 0xf9, 0x37, 0xc2, 0x50, 0x71, 0x89, 0x63, 0x1a, 0x7d, 0xf3, 0xa3, 0x71,
-	0xdc, 0x27, 0x8d, 0xc2, 0x92, 0xb6, 0x5c, 0xd4, 0x43, 0x34, 0x3a, 0xff, 0x73, 0x72, 0xe9, 0x1e,
-	0xd9, 0x56, 0xff, 0xb2, 0x51, 0x64, 0x0c, 0x45, 0x4a, 0xd8, 0xb3, 0xfa, 0x97, 0x6c, 0xd1, 0xec,
-	0x91, 0xe5, 0xf1, 0xde, 0x12, 0xeb, 0x2d, 0x31, 0x0a, 0xeb, 0x5e, 0x86, 0xfa, 0xc0, 0xb4, 0x8e,
-	0x06, 0x76, 0xef, 0xc8, 0x77, 0x08, 0x30, 0x87, 0xd4, 0x06, 0xa6, 0xf5, 0xce, 0xee, 0xe9, 0xd2,
-	0x2d, 0x94, 0xd3, 0xb8, 0x08, 0x73, 0x96, 0x05, 0xa7, 0x71, 0xa1, 0x72, 0xae, 0xc0, 0x3c, 0x95,
-	0xd9, 0x75, 0x88, 0xe1, 0x91, 0x80, 0xb9, 0xc2, 0x98, 0x6f, 0x0c, 0x4c, 0x6b, 0x9d, 0xf5, 0x84,
-	0xf8, 0x8d, 0x8b, 0x18, 0x7f, 0x55, 0xf0, 0x1b, 0x17, 0x61, 0x7e, 0xbc, 0x02, 0x25, 0xdf, 0xe7,
-	0xa8, 0x08, 0xb3, 0xbb, 0x7b, 0xbb, 0xed, 0xfa, 0x0c, 0x02, 0xc8, 0xaf, 0x1d, 0xac, 0xb7, 0x77,
-	0x37, 0xea, 0x1a, 0x2a, 0x43, 0x61, 0xa3, 0xcd, 0x1b, 0x19, 0xfc, 0x06, 0x20, 0xf0, 0x2e, 0x2a,
-	0x40, 0x76, 0xbb, 0xfd, 0x7b, 0xf5, 0x19, 0xca, 0xf3, 0xbe, 0xad, 0x1f, 0x6c, 0xed, 0xed, 0xd6,
-	0x35, 0x3a, 0x78, 0x5d, 0x6f, 0xaf, 0x75, 0xda, 0xf5, 0x0c, 0xe5, 0x78, 0xb7, 0xb7, 0x51, 0xcf,
-	0xa2, 0x12, 0xe4, 0xde, 0xaf, 0xed, 0x1c, 0xb6, 0xeb, 0xb3, 0xf8, 0x97, 0x1a, 0x54, 0xc5, 0x7a,
-	0xf1, 0x98, 0x40, 0xdf, 0x87, 0xfc, 0x19, 0x8b, 0x0b, 0xb6, 0x15, 0xcb, 0xab, 0xf7, 0x22, 0x8b,
-	0x1b, 0x8a, 0x1d, 0x5d, 0xf0, 0x22, 0x0c, 0xd9, 0xf3, 0xb1, 0xdb, 0xc8, 0x2c, 0x65, 0x97, 0xcb,
-	0xab, 0xf5, 0x15, 0x1e, 0xb9, 0x2b, 0xdb, 0xe4, 0xf2, 0xbd, 0xd1, 0x1f, 0x11, 0x9d, 0x76, 0x22,
-	0x04, 0xb3, 0x03, 0xdb, 0x21, 0x6c, 0xc7, 0x16, 0x75, 0xf6, 0x4d, 0xb7, 0x31, 0x5b, 0x34, 0xb1,
-	0x5b, 0x79, 0x03, 0xff, 0x5a, 0x03, 0xd8, 0x1f, 0x79, 0xe9, 0xa1, 0xb1, 0x00, 0xb9, 0x31, 0x15,
-	0x2c, 0xc2, 0x82, 0x37, 0x58, 0x4c, 0x10, 0xc3, 0x25, 0x7e, 0x4c, 0xd0, 0x06, 0xba, 0x0d, 0x85,
-	0xa1, 0x43, 0xc6, 0x47, 0xe7, 0x63, 0xa6, 0xa4, 0xa8, 0xe7, 0x69, 0x73, 0x7b, 0x8c, 0x1e, 0x42,
-	0xc5, 0x3c, 0xb5, 0x6c, 0x87, 0x1c, 0x71, 0x59, 0x39, 0xd6, 0x5b, 0xe6, 0x34, 0x66, 0xb7, 0xc2,
-	0xc2, 0x05, 0xe7, 0x55, 0x96, 0x1d, 0x4a, 0xc2, 0x16, 0x94, 0x99, 0xa9, 0x53, 0xb9, 0xef, 0x79,
-	0x60, 0x63, 0x86, 0x0d, 0x8b, 0xbb, 0x50, 0x58, 0x8d, 0x7f, 0x0a, 0x68, 0x83, 0xf4, 0x89, 0x47,
-	0xa6, 0xc9, 0x1e, 0x8a, 0x4f, 0xb2, 0xaa, 0x4f, 0xf0, 0x5f, 0x6b, 0x30, 0x1f, 0x12, 0x3f, 0xd5,
-	0xb4, 0x1a, 0x50, 0xe8, 0x31, 0x61, 0xdc, 0x82, 0xac, 0x2e, 0x9b, 0xe8, 0x25, 0x14, 0x85, 0x01,
-	0x6e, 0x23, 0x9b, 0xb2, 0x69, 0x0a, 0xdc, 0x26, 0x17, 0xff, 0x3a, 0x03, 0x25, 0x31, 0xd1, 0xbd,
-	0x21, 0x5a, 0x83, 0xaa, 0xc3, 0x1b, 0x47, 0x6c, 0x3e, 0xc2, 0xa2, 0x66, 0x7a, 0x12, 0xda, 0x9c,
-	0xd1, 0x2b, 0x62, 0x08, 0x23, 0xa3, 0xdf, 0x81, 0xb2, 0x14, 0x31, 0x1c, 0x79, 0xc2, 0xe5, 0x8d,
-	0xb0, 0x80, 0x60, 0xff, 0x6d, 0xce, 0xe8, 0x20, 0xd8, 0xf7, 0x47, 0x1e, 0xea, 0xc0, 0x82, 0x1c,
-	0xcc, 0x67, 0x23, 0xcc, 0xc8, 0x32, 0x29, 0x4b, 0x61, 0x29, 0xf1, 0xa5, 0xda, 0x9c, 0xd1, 0x91,
-	0x18, 0xaf, 0x74, 0xaa, 0x26, 0x79, 0x17, 0x3c, 0x79, 0xc7, 0x4c, 0xea, 0x5c, 0x58, 0x71, 0x93,
-	0x3a, 0x17, 0xd6, 0x9b, 0x12, 0x14, 0x44, 0x0b, 0xff, 0x73, 0x06, 0x40, 0xae, 0xc6, 0xde, 0x10,
-	0x6d, 0x40, 0xcd, 0x11, 0xad, 0x90, 0xb7, 0xee, 0x26, 0x7a, 0x4b, 0x2c, 0xe2, 0x8c, 0x5e, 0x95,
-	0x83, 0xb8, 0x71, 0x3f, 0x80, 0x8a, 0x2f, 0x25, 0x70, 0xd8, 0x9d, 0x04, 0x87, 0xf9, 0x12, 0xca,
-	0x72, 0x00, 0x75, 0xd9, 0xa7, 0x70, 0xd3, 0x1f, 0x9f, 0xe0, 0xb3, 0x87, 0x13, 0x7c, 0xe6, 0x0b,
-	0x9c, 0x97, 0x12, 0x54, 0xaf, 0xa9, 0x86, 0x05, 0x6e, 0xbb, 0x93, 0xe0, 0xb6, 0xb8, 0x61, 0xd4,
-	0x71, 0x40, 0xeb, 0x25, 0x6f, 0xe2, 0xff, 0xce, 0x42, 0x61, 0xdd, 0x1e, 0x0c, 0x0d, 0x87, 0xae,
-	0x46, 0xde, 0x21, 0xee, 0xa8, 0xef, 0x31, 0x77, 0xd5, 0x56, 0x1f, 0x85, 0x25, 0x0a, 0x36, 0xf9,
-	0xaf, 0xce, 0x58, 0x75, 0x31, 0x84, 0x0e, 0x16, 0xe5, 0x31, 0x73, 0x8d, 0xc1, 0xa2, 0x38, 0x8a,
-	0x21, 0x32, 0x90, 0xb3, 0x41, 0x20, 0x37, 0xa1, 0x30, 0x26, 0x4e, 0x50, 0xd2, 0x37, 0x67, 0x74,
-	0x49, 0x40, 0xcf, 0x61, 0x2e, 0x5a, 0x5e, 0x72, 0x82, 0xa7, 0xd6, 0x0d, 0x57, 0xa3, 0x47, 0x50,
-	0x09, 0xd5, 0xb8, 0xbc, 0xe0, 0x2b, 0x0f, 0x94, 0x12, 0x77, 0x4b, 0xe6, 0x55, 0x5a, 0x8f, 0x2b,
-	0x9b, 0x33, 0x32, 0xb3, 0xde, 0x92, 0x99, 0xb5, 0x28, 0x46, 0x89, 0xdc, 0x1a, 0x4a, 0x32, 0x3f,
-	0x0c, 0x27, 0x19, 0xfc, 0x43, 0xa8, 0x86, 0x1c, 0x44, 0xeb, 0x4e, 0xfb, 0x27, 0x87, 0x6b, 0x3b,
-	0xbc, 0x48, 0xbd, 0x65, 0x75, 0x49, 0xaf, 0x6b, 0xb4, 0xd6, 0xed, 0xb4, 0x0f, 0x0e, 0xea, 0x19,
-	0x54, 0x85, 0xd2, 0xee, 0x5e, 0xe7, 0x88, 0x73, 0x65, 0xf1, 0x5b, 0x5f, 0x82, 0x28, 0x72, 0x4a,
-	0x6d, 0x9b, 0x51, 0x6a, 0x9b, 0x26, 0x6b, 0x5b, 0x26, 0xa8, 0x6d, 0xac, 0xcc, 0xed, 0xb4, 0xd7,
-	0x0e, 0xda, 0xf5, 0xd9, 0x37, 0x35, 0xa8, 0x70, 0xff, 0x1e, 0x8d, 0x2c, 0x5a, 0x6a, 0xff, 0x41,
-	0x03, 0x08, 0xa2, 0x09, 0xb5, 0xa0, 0xd0, 0xe5, 0x7a, 0x1a, 0x1a, 0x4b, 0x46, 0x37, 0x13, 0x97,
-	0x4c, 0x97, 0x5c, 0xe8, 0xbb, 0x50, 0x70, 0x47, 0xdd, 0x2e, 0x71, 0x65, 0xc9, 0xbb, 0x1d, 0xcd,
-	0x87, 0x22, 0x5b, 0xe9, 0x92, 0x8f, 0x0e, 0x39, 0x31, 0xcc, 0xfe, 0x88, 0x15, 0xc0, 0xc9, 0x43,
-	0x04, 0x1f, 0xfe, 0x3b, 0x0d, 0xca, 0xca, 0xe6, 0xfd, 0x8a, 0x49, 0xf8, 0x1e, 0x94, 0x98, 0x0d,
-	0xa4, 0x27, 0xd2, 0x70, 0x51, 0x0f, 0x08, 0xe8, 0xb7, 0xa1, 0x24, 0x23, 0x40, 0x66, 0xe2, 0x46,
-	0xb2, 0xd8, 0xbd, 0xa1, 0x1e, 0xb0, 0xe2, 0x6d, 0xb8, 0xc1, 0xbc, 0xd2, 0xa5, 0x87, 0x6b, 0xe9,
-	0x47, 0xf5, 0xf8, 0xa9, 0x45, 0x8e, 0x9f, 0x4d, 0x28, 0x0e, 0xcf, 0x2e, 0x5d, 0xb3, 0x6b, 0xf4,
-	0x85, 0x15, 0x7e, 0x1b, 0xff, 0x18, 0x90, 0x2a, 0x6c, 0x9a, 0xe9, 0xe2, 0x2a, 0x94, 0x37, 0x0d,
-	0xf7, 0x4c, 0x98, 0x84, 0x5f, 0x42, 0x95, 0x36, 0xb7, 0xdf, 0x5f, 0xc3, 0x46, 0x76, 0x39, 0x90,
-	0xdc, 0x53, 0xf9, 0x1c, 0xc1, 0xec, 0x99, 0xe1, 0x9e, 0xb1, 0x89, 0x56, 0x75, 0xf6, 0x8d, 0x9e,
-	0x43, 0xbd, 0xcb, 0x27, 0x79, 0x14, 0xb9, 0x32, 0xcc, 0x09, 0xba, 0x7f, 0x12, 0xfc, 0x0c, 0x2a,
-	0x7c, 0x0e, 0x5f, 0xb7, 0x11, 0xf8, 0x06, 0xcc, 0x1d, 0x58, 0xc6, 0xd0, 0x3d, 0xb3, 0x65, 0x75,
-	0xa3, 0x93, 0xae, 0x07, 0xb4, 0xa9, 0x34, 0x3e, 0x83, 0x39, 0x87, 0x0c, 0x0c, 0xd3, 0x32, 0xad,
-	0xd3, 0xa3, 0xe3, 0x4b, 0x8f, 0xb8, 0xe2, 0xc2, 0x54, 0xf3, 0xc9, 0x6f, 0x28, 0x95, 0x9a, 0x76,
-	0xdc, 0xb7, 0x8f, 0x45, 0x9a, 0x63, 0xdf, 0xf8, 0x73, 0x0d, 0x2a, 0x9f, 0x1a, 0x5e, 0x57, 0x2e,
-	0x1d, 0xda, 0x82, 0x9a, 0x9f, 0xdc, 0x18, 0x45, 0xd8, 0x12, 0x29, 0xb1, 0x6c, 0x8c, 0x3c, 0x4a,
-	0xcb, 0xea, 0x58, 0xed, 0xaa, 0x04, 0x26, 0xca, 0xb0, 0xba, 0xa4, 0xef, 0x8b, 0xca, 0xa4, 0x8b,
-	0x62, 0x8c, 0xaa, 0x28, 0x95, 0xf0, 0x66, 0x2e, 0x38, 0x7e, 0xf0, 0x5c, 0xf2, 0x79, 0x06, 0x50,
-	0xdc, 0x86, 0x2f, 0x7b, 0x22, 0x7b, 0x02, 0x35, 0xd7, 0x33, 0x9c, 0xd8, 0xde, 0xa8, 0x32, 0xaa,
-	0x9f, 0xa0, 0x9f, 0xc1, 0xdc, 0xd0, 0xb1, 0x4f, 0x1d, 0xe2, 0xba, 0x47, 0x96, 0xed, 0x99, 0x27,
-	0x97, 0xe2, 0x50, 0x5b, 0x93, 0xe4, 0x5d, 0x46, 0x45, 0x6d, 0x28, 0x9c, 0x98, 0x7d, 0x8f, 0x38,
-	0x6e, 0x23, 0xb7, 0x94, 0x5d, 0xae, 0xad, 0xbe, 0xbc, 0xca, 0x6b, 0x2b, 0x3f, 0x62, 0xfc, 0x9d,
-	0xcb, 0x21, 0xd1, 0xe5, 0x58, 0xf5, 0xa0, 0x98, 0x0f, 0x1d, 0x9e, 0xef, 0x40, 0xf1, 0x03, 0x15,
-	0x41, 0x2f, 0xc5, 0x05, 0x7e, 0xb6, 0x63, 0xed, 0xad, 0x1e, 0x7e, 0x02, 0x10, 0x88, 0xa2, 0x59,
-	0x78, 0x77, 0x6f, 0xff, 0xb0, 0x53, 0x9f, 0x41, 0x15, 0x28, 0xee, 0xee, 0x6d, 0xb4, 0x77, 0xda,
-	0x34, 0x65, 0xe3, 0x96, 0x74, 0x9b, 0xea, 0xde, 0x90, 0x5c, 0x2d, 0x2c, 0xf7, 0xaf, 0x32, 0x50,
-	0x15, 0x1b, 0x64, 0xaa, 0x5d, 0xaa, 0xaa, 0xc8, 0x84, 0x54, 0xd0, 0x03, 0x2b, 0xdf, 0x38, 0x3d,
-	0x71, 0x2e, 0x96, 0x4d, 0x9a, 0x36, 0xf8, 0x3e, 0x20, 0x3d, 0xe1, 0x71, 0xbf, 0x9d, 0x18, 0xd9,
-	0xb9, 0xc4, 0xc8, 0x46, 0x8f, 0xa0, 0xea, 0x6f, 0x44, 0xc3, 0x15, 0x65, 0xb8, 0xa4, 0x57, 0xe4,
-	0x1e, 0xa3, 0x34, 0xf4, 0x04, 0xf2, 0x64, 0x4c, 0x2c, 0xcf, 0x6d, 0x94, 0x59, 0x42, 0xae, 0xca,
-	0xa3, 0x71, 0x9b, 0x52, 0x75, 0xd1, 0x89, 0x7f, 0x0b, 0x6e, 0xb0, 0x2b, 0xc8, 0x5b, 0xc7, 0xb0,
-	0xd4, 0xbb, 0x52, 0xa7, 0xb3, 0x23, 0x5c, 0x47, 0x3f, 0x51, 0x0d, 0x32, 0x5b, 0x1b, 0x62, 0xa2,
-	0x99, 0xad, 0x0d, 0xfc, 0x73, 0x0d, 0x90, 0x3a, 0x6e, 0x2a, 0x5f, 0x46, 0x84, 0x4b, 0xf5, 0xd9,
-	0x40, 0xfd, 0x02, 0xe4, 0x88, 0xe3, 0xd8, 0x0e, 0xf3, 0x5a, 0x49, 0xe7, 0x0d, 0xfc, 0x58, 0xd8,
-	0xa0, 0x93, 0xb1, 0x7d, 0xee, 0xc7, 0x0c, 0x97, 0xa6, 0xf9, 0xa6, 0x6e, 0xc3, 0x7c, 0x88, 0x6b,
-	0xaa, 0xc2, 0xf0, 0x0c, 0x6e, 0x32, 0x61, 0xdb, 0x84, 0x0c, 0xd7, 0xfa, 0xe6, 0x38, 0x55, 0xeb,
-	0x10, 0x6e, 0x45, 0x19, 0xbf, 0x59, 0x1f, 0xe1, 0xdf, 0x15, 0x1a, 0x3b, 0xe6, 0x80, 0x74, 0xec,
-	0x9d, 0x74, 0xdb, 0x68, 0xe2, 0x3c, 0x27, 0x97, 0xae, 0xa8, 0xa0, 0xec, 0x1b, 0xff, 0xa3, 0x06,
-	0xb7, 0x63, 0xc3, 0xbf, 0xe1, 0x55, 0x5d, 0x04, 0x38, 0xa5, 0xdb, 0x87, 0xf4, 0x68, 0x07, 0xbf,
-	0xbc, 0x2b, 0x14, 0xdf, 0x4e, 0x9a, 0x7b, 0x2a, 0xc2, 0xce, 0x05, 0xb1, 0xe6, 0xec, 0x8f, 0x2b,
-	0xcb, 0xcf, 0x7d, 0x28, 0x33, 0xc2, 0x81, 0x67, 0x78, 0x23, 0x37, 0xb6, 0x18, 0x7f, 0x22, 0xb6,
-	0x80, 0x1c, 0x34, 0xd5, 0xbc, 0xbe, 0x0b, 0x79, 0x76, 0x6e, 0x95, 0xa7, 0xb6, 0xc8, 0x45, 0x41,
-	0xb1, 0x43, 0x17, 0x8c, 0xf8, 0x0c, 0xf2, 0xef, 0x18, 0xd8, 0xa7, 0x58, 0x36, 0x2b, 0x97, 0xc2,
-	0x32, 0x06, 0x1c, 0x82, 0x28, 0xe9, 0xec, 0x9b, 0x1d, 0x72, 0x08, 0x71, 0x0e, 0xf5, 0x1d, 0x7e,
-	0x98, 0x2a, 0xe9, 0x7e, 0x9b, 0xba, 0xac, 0xdb, 0x37, 0x89, 0xe5, 0xb1, 0xde, 0x59, 0xd6, 0xab,
-	0x50, 0xf0, 0x0a, 0xd4, 0xb9, 0xa6, 0xb5, 0x5e, 0x4f, 0x39, 0xac, 0xf8, 0xf2, 0xb4, 0xb0, 0x3c,
-	0xfc, 0x2b, 0x0d, 0x6e, 0x28, 0x03, 0xa6, 0x72, 0xcc, 0x2b, 0xc8, 0x73, 0x48, 0x53, 0xd4, 0xc5,
-	0x85, 0xf0, 0x28, 0xae, 0x46, 0x17, 0x3c, 0x68, 0x05, 0x0a, 0xfc, 0x4b, 0x9e, 0x18, 0x93, 0xd9,
-	0x25, 0x13, 0x7e, 0x02, 0xf3, 0x82, 0x44, 0x06, 0x76, 0xd2, 0xde, 0x66, 0x0e, 0xc5, 0x3f, 0x83,
-	0x85, 0x30, 0xdb, 0x54, 0x53, 0x52, 0x8c, 0xcc, 0x5c, 0xc7, 0xc8, 0x35, 0x69, 0xe4, 0xe1, 0xb0,
-	0xa7, 0x94, 0xf1, 0xe8, 0xaa, 0xab, 0x2b, 0x92, 0x89, 0xac, 0x88, 0x3f, 0x01, 0x29, 0xe2, 0x5b,
-	0x9d, 0xc0, 0xbc, 0xdc, 0x0e, 0x3b, 0xa6, 0xeb, 0x1f, 0xee, 0x3e, 0x02, 0x52, 0x89, 0xdf, 0xb6,
-	0x41, 0x1b, 0xe4, 0xc4, 0x31, 0x4e, 0x07, 0xc4, 0xaf, 0x4f, 0xf4, 0xa8, 0xaf, 0x12, 0xa7, 0xca,
-	0xe8, 0x2d, 0xb8, 0xf1, 0xce, 0x1e, 0xd3, 0xd4, 0x40, 0xa9, 0x41, 0xc8, 0xf0, 0xab, 0x9e, 0xbf,
-	0x6c, 0x7e, 0x9b, 0x2a, 0x57, 0x07, 0x4c, 0xa5, 0xfc, 0x5f, 0x35, 0xa8, 0xac, 0xf5, 0x0d, 0x67,
-	0x20, 0x15, 0xff, 0x00, 0xf2, 0xfc, 0x02, 0x23, 0x30, 0x83, 0xa7, 0x61, 0x31, 0x2a, 0x2f, 0x6f,
-	0xac, 0xf1, 0xeb, 0x8e, 0x18, 0x45, 0x0d, 0x17, 0xcf, 0x0a, 0x1b, 0x91, 0x67, 0x86, 0x0d, 0xf4,
-	0x09, 0xe4, 0x0c, 0x3a, 0x84, 0xa5, 0xe0, 0x5a, 0xf4, 0xea, 0xc8, 0xa4, 0xb1, 0x73, 0x1b, 0xe7,
-	0xc2, 0xdf, 0x87, 0xb2, 0xa2, 0x81, 0x5e, 0x8e, 0xdf, 0xb6, 0xc5, 0x01, 0x6c, 0x6d, 0xbd, 0xb3,
-	0xf5, 0x9e, 0xdf, 0x99, 0x6b, 0x00, 0x1b, 0x6d, 0xbf, 0x9d, 0xc1, 0x9f, 0x89, 0x51, 0x22, 0xdf,
-	0xa9, 0xf6, 0x68, 0x69, 0xf6, 0x64, 0xae, 0x65, 0xcf, 0x05, 0x54, 0xc5, 0xf4, 0xa7, 0x4d, 0xdf,
-	0x4c, 0x5e, 0x4a, 0xfa, 0x56, 0x8c, 0xd7, 0x05, 0x23, 0x9e, 0x83, 0xaa, 0x48, 0xe8, 0x62, 0xff,
-	0xfd, 0x53, 0x06, 0x6a, 0x92, 0x32, 0x2d, 0xb6, 0x29, 0x61, 0x19, 0x5e, 0x01, 0x7c, 0x50, 0xe6,
-	0x16, 0xe4, 0x7b, 0xc7, 0x07, 0xe6, 0x47, 0x89, 0x43, 0x8b, 0x16, 0xa5, 0xf7, 0xb9, 0x1e, 0xfe,
-	0x18, 0x24, 0x5a, 0xf4, 0x82, 0xee, 0x18, 0x27, 0xde, 0x96, 0xd5, 0x23, 0x17, 0xec, 0xdc, 0x38,
-	0xab, 0x07, 0x04, 0x76, 0x5f, 0x15, 0x8f, 0x46, 0xec, 0xb0, 0xa8, 0x3c, 0x22, 0xa1, 0x17, 0x50,
-	0xa7, 0xdf, 0x6b, 0xc3, 0x61, 0xdf, 0x24, 0x3d, 0x2e, 0xa0, 0xc0, 0x78, 0x62, 0x74, 0xaa, 0x9d,
-	0x1d, 0xbd, 0xdc, 0x46, 0x91, 0xa5, 0x2d, 0xd1, 0x42, 0x4b, 0x50, 0xe6, 0xf6, 0x6d, 0x59, 0x87,
-	0x2e, 0x61, 0x2f, 0x29, 0x59, 0x5d, 0x25, 0xd1, 0x38, 0x5e, 0x1b, 0x79, 0x67, 0x6d, 0xcb, 0x38,
-	0xee, 0xcb, 0xbc, 0x48, 0x8b, 0x39, 0x25, 0x6e, 0x98, 0xae, 0x4a, 0x6d, 0xc3, 0x3c, 0xa5, 0x12,
-	0xcb, 0x33, 0xbb, 0x4a, 0x12, 0x95, 0xa5, 0x52, 0x8b, 0x94, 0x4a, 0xc3, 0x75, 0x3f, 0xd8, 0x4e,
-	0x4f, 0x38, 0xd0, 0x6f, 0xe3, 0x0d, 0x2e, 0xfc, 0xd0, 0x0d, 0x15, 0xc3, 0x2f, 0x2b, 0x65, 0x39,
-	0x90, 0xf2, 0x96, 0x78, 0x13, 0xa4, 0xe0, 0x97, 0x70, 0x53, 0x72, 0x0a, 0x74, 0x71, 0x02, 0xf3,
-	0x1e, 0xdc, 0x97, 0xcc, 0xeb, 0x67, 0xf4, 0xfa, 0xb6, 0x2f, 0x14, 0x7e, 0x55, 0x3b, 0xdf, 0x40,
-	0xc3, 0xb7, 0x93, 0x1d, 0xc9, 0xed, 0xbe, 0x6a, 0xc0, 0xc8, 0x15, 0x3b, 0xb3, 0xa4, 0xb3, 0x6f,
-	0x4a, 0x73, 0xec, 0xbe, 0x7f, 0xf0, 0xa0, 0xdf, 0x78, 0x1d, 0xee, 0x48, 0x19, 0xe2, 0xb0, 0x1c,
-	0x16, 0x12, 0x33, 0x28, 0x49, 0x88, 0x70, 0x18, 0x1d, 0x3a, 0xd9, 0xed, 0x2a, 0x67, 0xd8, 0xb5,
-	0x4c, 0xa6, 0xa6, 0xc8, 0xbc, 0xc9, 0x77, 0x04, 0x35, 0x4c, 0xad, 0x4b, 0x82, 0x4c, 0x05, 0xa8,
-	0x64, 0xb1, 0x10, 0x94, 0x1c, 0x5b, 0x88, 0x98, 0xe8, 0x9f, 0xc2, 0xa2, 0x6f, 0x04, 0xf5, 0xdb,
-	0x3e, 0x71, 0x06, 0xa6, 0xeb, 0x2a, 0x78, 0x54, 0xd2, 0xc4, 0x9f, 0xc2, 0xec, 0x90, 0x88, 0xcc,
-	0x55, 0x5e, 0x45, 0x2b, 0xfc, 0x01, 0x79, 0x45, 0x19, 0xcc, 0xfa, 0x71, 0x0f, 0x1e, 0x48, 0xe9,
-	0xdc, 0xa3, 0x89, 0xe2, 0xa3, 0x46, 0xc9, 0x6b, 0x3f, 0x77, 0x6b, 0xfc, 0xda, 0x9f, 0xe5, 0x6b,
-	0xef, 0x63, 0xa4, 0x3f, 0xe6, 0x8e, 0x94, 0xb1, 0x35, 0x55, 0x45, 0xda, 0xe6, 0x3e, 0xf5, 0x43,
-	0x72, 0x2a, 0x61, 0xc7, 0xb0, 0x10, 0x8e, 0xe4, 0xa9, 0x92, 0xe5, 0x02, 0xe4, 0x3c, 0xfb, 0x9c,
-	0xc8, 0x54, 0xc9, 0x1b, 0xd2, 0x60, 0x3f, 0xcc, 0xa7, 0x32, 0xd8, 0x08, 0x84, 0xb1, 0x2d, 0x39,
-	0xad, 0xbd, 0x74, 0x35, 0xe5, 0x11, 0x8f, 0x37, 0xf0, 0x2e, 0xdc, 0x8a, 0xa6, 0x89, 0xa9, 0x4c,
-	0x7e, 0xcf, 0x37, 0x70, 0x52, 0x26, 0x99, 0x4a, 0xee, 0x4f, 0x82, 0x64, 0xa0, 0x24, 0x94, 0xa9,
-	0x44, 0xea, 0xd0, 0x4c, 0xca, 0x2f, 0x5f, 0xc7, 0x7e, 0xf5, 0xd3, 0xcd, 0x54, 0xc2, 0xdc, 0x40,
-	0xd8, 0xf4, 0xcb, 0x1f, 0xe4, 0x88, 0xec, 0xc4, 0x1c, 0x21, 0x82, 0x24, 0xc8, 0x62, 0xdf, 0xc0,
-	0xa6, 0x13, 0x3a, 0x82, 0x04, 0x3a, 0xad, 0x0e, 0x5a, 0x43, 0x7c, 0x1d, 0xac, 0x21, 0x37, 0xb6,
-	0x9a, 0x76, 0xa7, 0x5a, 0x8c, 0x4f, 0x83, 0xdc, 0x19, 0xcb, 0xcc, 0x53, 0x09, 0xfe, 0x0c, 0x96,
-	0xd2, 0x93, 0xf2, 0x34, 0x92, 0x5f, 0xb4, 0xa0, 0xe4, 0x1f, 0x5b, 0x95, 0x1f, 0x5f, 0x94, 0xa1,
-	0xb0, 0xbb, 0x77, 0xb0, 0xbf, 0xb6, 0xde, 0xe6, 0xbf, 0xbe, 0x58, 0xdf, 0xd3, 0xf5, 0xc3, 0xfd,
-	0x4e, 0x3d, 0xb3, 0xfa, 0xbf, 0x59, 0xc8, 0x6c, 0xbf, 0x47, 0xbf, 0x0f, 0x39, 0xfe, 0x14, 0x39,
-	0xe1, 0xfd, 0xb9, 0x39, 0xe9, 0xb5, 0x15, 0xdf, 0xfd, 0xf9, 0xbf, 0xff, 0xd7, 0x2f, 0x33, 0x37,
-	0x71, 0xbd, 0x35, 0xfe, 0xde, 0x31, 0xf1, 0x8c, 0xd6, 0xf9, 0xb8, 0xc5, 0xea, 0xc3, 0x6b, 0xed,
-	0x05, 0x3a, 0x84, 0xec, 0xfe, 0xc8, 0x43, 0xa9, 0x6f, 0xd3, 0xcd, 0xf4, 0x47, 0x58, 0x7c, 0x87,
-	0x09, 0x9e, 0xc7, 0x35, 0x45, 0xf0, 0x70, 0xe4, 0x51, 0xb1, 0x23, 0x28, 0xab, 0xcf, 0xa8, 0x57,
-	0x3e, 0x5a, 0x37, 0xaf, 0x7e, 0xa2, 0xc5, 0x0f, 0x99, 0xba, 0xbb, 0xf8, 0x96, 0xa2, 0x8e, 0x3f,
-	0xf6, 0xaa, 0xb3, 0xe9, 0x5c, 0x58, 0x28, 0xf5, 0x59, 0xbb, 0x99, 0xfe, 0x72, 0x9b, 0x38, 0x1b,
-	0xef, 0xc2, 0xa2, 0x62, 0x2d, 0xf1, 0x70, 0xdb, 0xf5, 0xd0, 0x83, 0x84, 0x87, 0x3b, 0xf5, 0x89,
-	0xaa, 0xb9, 0x94, 0xce, 0x20, 0x14, 0x2d, 0x31, 0x45, 0x4d, 0x7c, 0x53, 0x51, 0xd4, 0xf5, 0xd9,
-	0x5e, 0x6b, 0x2f, 0x56, 0x4f, 0x21, 0xc7, 0x70, 0x68, 0xf4, 0x07, 0xf2, 0xa3, 0x99, 0x00, 0xae,
-	0xa7, 0x2c, 0x7e, 0x08, 0xc1, 0xc6, 0x0d, 0xa6, 0x0c, 0xe1, 0xaa, 0x54, 0xc6, 0x90, 0xe8, 0xd7,
-	0xda, 0x8b, 0x65, 0xed, 0x3b, 0xda, 0xea, 0xff, 0xcc, 0x42, 0x8e, 0x81, 0x52, 0xc8, 0x06, 0x08,
-	0x30, 0xdb, 0xe8, 0x2c, 0x63, 0x28, 0x70, 0x74, 0x96, 0x71, 0xb8, 0x17, 0x2f, 0x32, 0xc5, 0x0d,
-	0x3c, 0x2f, 0x15, 0x33, 0xbc, 0xab, 0xc5, 0x20, 0x3c, 0xea, 0xd3, 0xb1, 0x80, 0xe5, 0x78, 0x98,
-	0xa1, 0x24, 0x81, 0x21, 0xec, 0x36, 0xba, 0x43, 0x12, 0x70, 0x5b, 0x8c, 0x99, 0xce, 0x7b, 0xf8,
-	0xb6, 0xe2, 0x59, 0xae, 0xd6, 0x61, 0x8c, 0x54, 0xef, 0x9f, 0x69, 0x50, 0x0b, 0xa3, 0xaf, 0xe8,
-	0x51, 0x82, 0xe4, 0x28, 0x88, 0xdb, 0x7c, 0x3c, 0x99, 0x29, 0xcd, 0x02, 0xae, 0xfe, 0x9c, 0x90,
-	0xa1, 0x41, 0x19, 0x85, 0xe3, 0xd1, 0x5f, 0x68, 0x30, 0x17, 0x81, 0x54, 0x51, 0x92, 0x86, 0x18,
-	0x60, 0xdb, 0x7c, 0x72, 0x05, 0x97, 0x30, 0xe4, 0x29, 0x33, 0x64, 0x09, 0xdf, 0x8d, 0xb9, 0xc2,
-	0x33, 0x07, 0xc4, 0xb3, 0x85, 0x31, 0xfe, 0x32, 0x70, 0xf8, 0x33, 0x71, 0x19, 0x42, 0x70, 0x6a,
-	0xe2, 0x32, 0x84, 0xb1, 0xd3, 0x09, 0xcb, 0xc0, 0x31, 0x4f, 0xba, 0xc5, 0xff, 0x2f, 0x0b, 0x85,
-	0x75, 0xfe, 0x13, 0x48, 0xe4, 0x42, 0xc9, 0xc7, 0x19, 0xd1, 0x62, 0x12, 0xe6, 0x13, 0xdc, 0x16,
-	0x9a, 0x0f, 0x52, 0xfb, 0x85, 0xf6, 0x27, 0x4c, 0xfb, 0x03, 0xdc, 0x94, 0xda, 0xc5, 0x2f, 0x2d,
-	0x5b, 0x1c, 0x5c, 0x68, 0x19, 0xbd, 0x1e, 0x9d, 0xf8, 0x9f, 0x42, 0x45, 0x05, 0x03, 0xd1, 0xc3,
-	0x44, 0xac, 0x49, 0xc5, 0x13, 0x9b, 0x78, 0x12, 0x8b, 0xd0, 0xbe, 0xcc, 0xb4, 0x63, 0x7c, 0x3f,
-	0x45, 0xbb, 0xc3, 0xd8, 0x43, 0x06, 0x70, 0x30, 0x2f, 0xd9, 0x80, 0x10, 0x56, 0x98, 0x6c, 0x40,
-	0x18, 0x0b, 0xbc, 0xd2, 0x80, 0x11, 0x63, 0xa7, 0x06, 0x7c, 0x00, 0x08, 0xa0, 0x3b, 0x94, 0xe8,
-	0x57, 0xe5, 0xea, 0x14, 0x0d, 0xf9, 0x38, 0xea, 0x17, 0xdf, 0x73, 0x11, 0xd5, 0x7d, 0xd3, 0xa5,
-	0xa1, 0xbf, 0xfa, 0xab, 0x3c, 0x94, 0xdf, 0x19, 0xa6, 0xe5, 0x11, 0xcb, 0xb0, 0xba, 0x04, 0x9d,
-	0x40, 0x8e, 0x95, 0xc6, 0x68, 0x96, 0x53, 0x11, 0xad, 0x68, 0x96, 0x0b, 0xc1, 0x3d, 0xf8, 0x31,
-	0xd3, 0xbc, 0x88, 0xef, 0x48, 0xcd, 0x83, 0x40, 0x7c, 0x8b, 0x21, 0x35, 0x74, 0xc2, 0x7f, 0x08,
-	0x79, 0xf1, 0x08, 0x10, 0x11, 0x16, 0x42, 0x70, 0x9a, 0xf7, 0x92, 0x3b, 0xd3, 0xb6, 0x97, 0xaa,
-	0xca, 0x65, 0xbc, 0x54, 0xd7, 0x47, 0x80, 0x00, 0x86, 0x8c, 0x3a, 0x37, 0x86, 0x5a, 0x36, 0x97,
-	0xd2, 0x19, 0x84, 0xde, 0xe7, 0x4c, 0xef, 0x23, 0xbc, 0x98, 0xa4, 0xb7, 0xe7, 0xf3, 0x53, 0xdd,
-	0xc7, 0x30, 0xbb, 0x69, 0xb8, 0x67, 0x28, 0x52, 0xec, 0x94, 0x5f, 0x2d, 0x34, 0x9b, 0x49, 0x5d,
-	0x42, 0xd3, 0x23, 0xa6, 0xe9, 0x3e, 0x6e, 0x24, 0x69, 0x3a, 0x33, 0x5c, 0x5a, 0x3d, 0xd0, 0x19,
-	0xe4, 0xf9, 0x0f, 0x19, 0xa2, 0xbe, 0x0c, 0xfd, 0x18, 0x22, 0xea, 0xcb, 0xf0, 0x6f, 0x1f, 0xae,
-	0xa7, 0xc9, 0x83, 0xa2, 0xfc, 0xf5, 0x00, 0xba, 0x1f, 0x59, 0x9a, 0xf0, 0x2f, 0x0d, 0x9a, 0x8b,
-	0x69, 0xdd, 0x42, 0xdf, 0x33, 0xa6, 0xef, 0x21, 0xbe, 0x97, 0xb8, 0x76, 0x82, 0xfb, 0xb5, 0xf6,
-	0xe2, 0x3b, 0x1a, 0x2d, 0x13, 0x10, 0x40, 0xb9, 0xb1, 0xe8, 0x88, 0xa2, 0xc2, 0xb1, 0xe8, 0x88,
-	0xa1, 0xc0, 0x78, 0x95, 0x29, 0x7f, 0x85, 0x9f, 0x25, 0x29, 0xf7, 0x1c, 0xc3, 0x72, 0x4f, 0x88,
-	0xf3, 0x09, 0x87, 0xec, 0xdc, 0x33, 0x73, 0x48, 0x23, 0xe5, 0xff, 0xe7, 0x60, 0x96, 0x9e, 0x47,
-	0x69, 0x79, 0x0e, 0xae, 0xf1, 0x51, 0x6b, 0x62, 0xe0, 0x59, 0xd4, 0x9a, 0x38, 0x02, 0x10, 0x2f,
-	0xcf, 0xec, 0xc7, 0xee, 0x84, 0x31, 0x51, 0xaf, 0xbb, 0x50, 0x56, 0xee, 0xfa, 0x28, 0x41, 0x60,
-	0x18, 0x99, 0x8b, 0xd6, 0x85, 0x04, 0xa0, 0x00, 0x3f, 0x60, 0x3a, 0xef, 0xe0, 0x85, 0x90, 0xce,
-	0x1e, 0xe7, 0xa2, 0x4a, 0xff, 0x18, 0x2a, 0x2a, 0x26, 0x80, 0x12, 0x64, 0x46, 0x90, 0xbf, 0x68,
-	0x4a, 0x4c, 0x82, 0x14, 0xe2, 0xd9, 0xc1, 0xff, 0x61, 0xbf, 0x64, 0xa5, 0xca, 0x87, 0x50, 0x10,
-	0x40, 0x41, 0xd2, 0x6c, 0xc3, 0x50, 0x61, 0xd2, 0x6c, 0x23, 0x28, 0x43, 0xfc, 0x98, 0xc7, 0xb4,
-	0xd2, 0xfb, 0x90, 0x2c, 0x41, 0x42, 0xe3, 0x5b, 0xe2, 0xa5, 0x69, 0x0c, 0xb0, 0xaf, 0x34, 0x8d,
-	0xca, 0x5d, 0x74, 0x92, 0xc6, 0x53, 0xe2, 0x89, 0x58, 0x92, 0xf7, 0x3c, 0x94, 0x22, 0x50, 0x4d,
-	0xf9, 0x78, 0x12, 0x4b, 0xda, 0xa9, 0x3c, 0x50, 0x2a, 0xf2, 0x3d, 0xfa, 0x19, 0x40, 0x00, 0x69,
-	0x44, 0x4f, 0x5b, 0x89, 0xb8, 0x68, 0xf4, 0xb4, 0x95, 0x8c, 0x8a, 0xc4, 0xf3, 0x47, 0xa0, 0x9b,
-	0x5f, 0x0c, 0xa8, 0xf6, 0xbf, 0xd1, 0x00, 0xc5, 0x11, 0x10, 0xf4, 0x32, 0x59, 0x43, 0x22, 0xe2,
-	0xda, 0x7c, 0x75, 0x3d, 0xe6, 0xb4, 0x12, 0x11, 0x98, 0xd5, 0x65, 0x23, 0x86, 0x1f, 0xa8, 0x61,
-	0xbf, 0xd0, 0xa0, 0x1a, 0x82, 0x50, 0xd0, 0xd3, 0x94, 0x35, 0x8e, 0x80, 0xb6, 0xcd, 0x67, 0x57,
-	0xf2, 0xa5, 0x9d, 0xc4, 0x94, 0x1d, 0x21, 0x0f, 0xe2, 0x7f, 0xa9, 0x41, 0x2d, 0x0c, 0xbb, 0xa0,
-	0x14, 0xf9, 0x31, 0xe0, 0xb7, 0xb9, 0x7c, 0x35, 0xe3, 0xd5, 0x4b, 0x15, 0x9c, 0xcd, 0x87, 0x50,
-	0x10, 0x60, 0x4d, 0x52, 0x40, 0x84, 0x61, 0xe3, 0xa4, 0x80, 0x88, 0x20, 0x3d, 0x29, 0x01, 0xe1,
-	0xd8, 0x7d, 0xa2, 0x84, 0xa0, 0x40, 0x74, 0xd2, 0x34, 0x4e, 0x0e, 0xc1, 0x08, 0x1c, 0x34, 0x49,
-	0x63, 0x10, 0x82, 0x12, 0xce, 0x41, 0x29, 0x02, 0xaf, 0x08, 0xc1, 0x28, 0x1a, 0x94, 0x12, 0x82,
-	0x4c, 0xa9, 0x12, 0x82, 0x01, 0xf8, 0x92, 0x14, 0x82, 0x31, 0x44, 0x3c, 0x29, 0x04, 0xe3, 0xf8,
-	0x4d, 0xca, 0xba, 0x32, 0xdd, 0xa1, 0x10, 0x9c, 0x4f, 0xc0, 0x6a, 0xd0, 0xab, 0x14, 0x87, 0x26,
-	0x82, 0xed, 0xcd, 0x4f, 0xae, 0xc9, 0x3d, 0x71, 0xef, 0xf3, 0xa5, 0x90, 0x7b, 0xff, 0xef, 0x35,
-	0x58, 0x48, 0xc2, 0x7a, 0x50, 0x8a, 0xae, 0x14, 0xa0, 0xbe, 0xb9, 0x72, 0x5d, 0xf6, 0xab, 0xbd,
-	0xe6, 0x47, 0xc3, 0x9b, 0xfa, 0xbf, 0x7c, 0xb1, 0xa8, 0xfd, 0xdb, 0x17, 0x8b, 0xda, 0x7f, 0x7c,
-	0xb1, 0xa8, 0xfd, 0xed, 0x7f, 0x2e, 0xce, 0x1c, 0xe7, 0xd9, 0x7f, 0x31, 0xfb, 0xde, 0x6f, 0x02,
-	0x00, 0x00, 0xff, 0xff, 0x8e, 0x1f, 0x05, 0xf6, 0xfb, 0x36, 0x00, 0x00,
+	// 3712 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0xdd, 0x6f, 0x1b, 0xc7,
+	0x76, 0xd7, 0x92, 0xe2, 0xd7, 0xe1, 0x87, 0xa8, 0x91, 0x64, 0xd3, 0xb4, 0x2d, 0xcb, 0x63, 0x3b,
+	0x56, 0xec, 0x44, 0xbc, 0x57, 0xf7, 0xb6, 0x0f, 0x6e, 0x71, 0x71, 0x65, 0x89, 0xd7, 0xd2, 0x95,
+	0x2c, 0x29, 0x2b, 0xca, 0x49, 0x8a, 0xa0, 0xc2, 0x8a, 0x1c, 0x49, 0x5b, 0x91, 0xbb, 0xcc, 0xee,
+	0x92, 0x96, 0xd2, 0xa2, 0x29, 0x82, 0xf4, 0xa5, 0x40, 0x5f, 0x12, 0xa0, 0x68, 0x9f, 0x8b, 0xa2,
+	0xc8, 0x5b, 0x5f, 0x82, 0x02, 0xfd, 0x0b, 0xfa, 0xd6, 0x02, 0xfd, 0x07, 0x0a, 0x37, 0x2f, 0xfd,
+	0x2f, 0x2e, 0xe6, 0x6b, 0x77, 0xf6, 0x4b, 0x72, 0xc2, 0x24, 0x2f, 0xf2, 0xce, 0x99, 0x33, 0xe7,
+	0x77, 0xe6, 0xcc, 0xcc, 0x39, 0x67, 0xce, 0xd0, 0x50, 0x72, 0x86, 0xdd, 0x95, 0xa1, 0x63, 0x7b,
+	0x36, 0xaa, 0x10, 0xaf, 0xdb, 0x73, 0x89, 0x33, 0x26, 0xce, 0xf0, 0xb8, 0x39, 0x7f, 0x6a, 0x9f,
+	0xda, 0xac, 0xa3, 0x45, 0xbf, 0x38, 0x4f, 0x13, 0x53, 0x9e, 0x96, 0x69, 0x79, 0xc4, 0xb1, 0x8c,
+	0x7e, 0x6b, 0x30, 0xee, 0x76, 0xd9, 0x9f, 0xe1, 0x71, 0xeb, 0x7c, 0x2c, 0x78, 0x1e, 0x86, 0x79,
+	0x8c, 0x91, 0x77, 0xc6, 0xfe, 0x0c, 0x8f, 0xd9, 0x3f, 0x82, 0xeb, 0xce, 0xa9, 0x6d, 0x9f, 0xf6,
+	0x49, 0xcb, 0x18, 0x9a, 0x2d, 0xc3, 0xb2, 0x6c, 0xcf, 0xf0, 0x4c, 0xdb, 0x72, 0x79, 0x2f, 0xfe,
+	0x5b, 0x0d, 0x6a, 0x3a, 0x71, 0x87, 0xb6, 0xe5, 0x92, 0x4d, 0x62, 0xf4, 0x88, 0x83, 0xee, 0x02,
+	0x74, 0xfb, 0x23, 0xd7, 0x23, 0xce, 0x91, 0xd9, 0x6b, 0x68, 0x4b, 0xda, 0xf2, 0xb4, 0x5e, 0x12,
+	0x94, 0xad, 0x1e, 0xba, 0x0d, 0xa5, 0x01, 0x19, 0x1c, 0xf3, 0xde, 0x0c, 0xeb, 0x2d, 0x72, 0xc2,
+	0x56, 0x0f, 0x35, 0xa1, 0xe8, 0x90, 0xb1, 0xe9, 0x9a, 0xb6, 0xd5, 0xc8, 0x2e, 0x69, 0xcb, 0x59,
+	0xdd, 0x6f, 0xd3, 0x81, 0x8e, 0x71, 0xe2, 0x1d, 0x79, 0xc4, 0x19, 0x34, 0xa6, 0xf9, 0x40, 0x4a,
+	0xe8, 0x10, 0x67, 0x80, 0xbf, 0xcc, 0x41, 0x45, 0x37, 0xac, 0x53, 0xa2, 0x93, 0x4f, 0x47, 0xc4,
+	0xf5, 0x50, 0x1d, 0xb2, 0xe7, 0xe4, 0x92, 0xc1, 0x57, 0x74, 0xfa, 0xc9, 0xc7, 0x5b, 0xa7, 0xe4,
+	0x88, 0x58, 0x1c, 0xb8, 0x42, 0xc7, 0x5b, 0xa7, 0xa4, 0x6d, 0xf5, 0xd0, 0x3c, 0xe4, 0xfa, 0xe6,
+	0xc0, 0xf4, 0x04, 0x2a, 0x6f, 0x84, 0xd4, 0x99, 0x8e, 0xa8, 0xb3, 0x0e, 0xe0, 0xda, 0x8e, 0x77,
+	0x64, 0x3b, 0x3d, 0xe2, 0x34, 0x72, 0x4b, 0xda, 0x72, 0x6d, 0xf5, 0xe1, 0x8a, 0xba, 0x34, 0x2b,
+	0xaa, 0x42, 0x2b, 0x07, 0xb6, 0xe3, 0xed, 0x51, 0x5e, 0xbd, 0xe4, 0xca, 0x4f, 0xf4, 0x3b, 0x28,
+	0x33, 0x21, 0x9e, 0xe1, 0x9c, 0x12, 0xaf, 0x91, 0x67, 0x52, 0x1e, 0x5d, 0x23, 0xa5, 0xc3, 0x98,
+	0x75, 0x06, 0xcf, 0xbf, 0x11, 0x86, 0x8a, 0x4b, 0x1c, 0xd3, 0xe8, 0x9b, 0x9f, 0x19, 0xc7, 0x7d,
+	0xd2, 0x28, 0x2c, 0x69, 0xcb, 0x45, 0x3d, 0x44, 0xa3, 0xf3, 0x3f, 0x27, 0x97, 0xee, 0x91, 0x6d,
+	0xf5, 0x2f, 0x1b, 0x45, 0xc6, 0x50, 0xa4, 0x84, 0x3d, 0xab, 0x7f, 0xc9, 0x16, 0xcd, 0x1e, 0x59,
+	0x1e, 0xef, 0x2d, 0xb1, 0xde, 0x12, 0xa3, 0xb0, 0xee, 0x65, 0xa8, 0x0f, 0x4c, 0xeb, 0x68, 0x60,
+	0xf7, 0x8e, 0x7c, 0x83, 0x00, 0x33, 0x48, 0x6d, 0x60, 0x5a, 0x2f, 0xed, 0x9e, 0x2e, 0xcd, 0x42,
+	0x39, 0x8d, 0x8b, 0x30, 0x67, 0x59, 0x70, 0x1a, 0x17, 0x2a, 0xe7, 0x0a, 0xcc, 0x51, 0x99, 0x5d,
+	0x87, 0x18, 0x1e, 0x09, 0x98, 0x2b, 0x8c, 0x79, 0x76, 0x60, 0x5a, 0xeb, 0xac, 0x27, 0xc4, 0x6f,
+	0x5c, 0xc4, 0xf8, 0xab, 0x82, 0xdf, 0xb8, 0x08, 0xf3, 0xe3, 0x15, 0x28, 0xf9, 0x36, 0x47, 0x45,
+	0x98, 0xde, 0xdd, 0xdb, 0x6d, 0xd7, 0xa7, 0x10, 0x40, 0x7e, 0xed, 0x60, 0xbd, 0xbd, 0xbb, 0x51,
+	0xd7, 0x50, 0x19, 0x0a, 0x1b, 0x6d, 0xde, 0xc8, 0xe0, 0xe7, 0x00, 0x81, 0x75, 0x51, 0x01, 0xb2,
+	0xdb, 0xed, 0x8f, 0xeb, 0x53, 0x94, 0xe7, 0x55, 0x5b, 0x3f, 0xd8, 0xda, 0xdb, 0xad, 0x6b, 0x74,
+	0xf0, 0xba, 0xde, 0x5e, 0xeb, 0xb4, 0xeb, 0x19, 0xca, 0xf1, 0x72, 0x6f, 0xa3, 0x9e, 0x45, 0x25,
+	0xc8, 0xbd, 0x5a, 0xdb, 0x39, 0x6c, 0xd7, 0xa7, 0xf1, 0xd7, 0x1a, 0x54, 0xc5, 0x7a, 0xf1, 0x33,
+	0x81, 0x7e, 0x0d, 0xf9, 0x33, 0x76, 0x2e, 0xd8, 0x56, 0x2c, 0xaf, 0xde, 0x89, 0x2c, 0x6e, 0xe8,
+	0xec, 0xe8, 0x82, 0x17, 0x61, 0xc8, 0x9e, 0x8f, 0xdd, 0x46, 0x66, 0x29, 0xbb, 0x5c, 0x5e, 0xad,
+	0xaf, 0xf0, 0x93, 0xbb, 0xb2, 0x4d, 0x2e, 0x5f, 0x19, 0xfd, 0x11, 0xd1, 0x69, 0x27, 0x42, 0x30,
+	0x3d, 0xb0, 0x1d, 0xc2, 0x76, 0x6c, 0x51, 0x67, 0xdf, 0x74, 0x1b, 0xb3, 0x45, 0x13, 0xbb, 0x95,
+	0x37, 0xf0, 0x37, 0x1a, 0xc0, 0xfe, 0xc8, 0x4b, 0x3f, 0x1a, 0xf3, 0x90, 0x1b, 0x53, 0xc1, 0xe2,
+	0x58, 0xf0, 0x06, 0x3b, 0x13, 0xc4, 0x70, 0x89, 0x7f, 0x26, 0x68, 0x03, 0xdd, 0x84, 0xc2, 0xd0,
+	0x21, 0xe3, 0xa3, 0xf3, 0x31, 0x03, 0x29, 0xea, 0x79, 0xda, 0xdc, 0x1e, 0xa3, 0xfb, 0x50, 0x31,
+	0x4f, 0x2d, 0xdb, 0x21, 0x47, 0x5c, 0x56, 0x8e, 0xf5, 0x96, 0x39, 0x8d, 0xe9, 0xad, 0xb0, 0x70,
+	0xc1, 0x79, 0x95, 0x65, 0x87, 0x92, 0xb0, 0x05, 0x65, 0xa6, 0xea, 0x44, 0xe6, 0x7b, 0x37, 0xd0,
+	0x31, 0xc3, 0x86, 0xc5, 0x4d, 0x28, 0xb4, 0xc6, 0x9f, 0x00, 0xda, 0x20, 0x7d, 0xe2, 0x91, 0x49,
+	0xbc, 0x87, 0x62, 0x93, 0xac, 0x6a, 0x13, 0xfc, 0x95, 0x06, 0x73, 0x21, 0xf1, 0x13, 0x4d, 0xab,
+	0x01, 0x85, 0x1e, 0x13, 0xc6, 0x35, 0xc8, 0xea, 0xb2, 0x89, 0x9e, 0x42, 0x51, 0x28, 0xe0, 0x36,
+	0xb2, 0x29, 0x9b, 0xa6, 0xc0, 0x75, 0x72, 0xf1, 0x37, 0x19, 0x28, 0x89, 0x89, 0xee, 0x0d, 0xd1,
+	0x1a, 0x54, 0x1d, 0xde, 0x38, 0x62, 0xf3, 0x11, 0x1a, 0x35, 0xd3, 0x9d, 0xd0, 0xe6, 0x94, 0x5e,
+	0x11, 0x43, 0x18, 0x19, 0xfd, 0x09, 0x94, 0xa5, 0x88, 0xe1, 0xc8, 0x13, 0x26, 0x6f, 0x84, 0x05,
+	0x04, 0xfb, 0x6f, 0x73, 0x4a, 0x07, 0xc1, 0xbe, 0x3f, 0xf2, 0x50, 0x07, 0xe6, 0xe5, 0x60, 0x3e,
+	0x1b, 0xa1, 0x46, 0x96, 0x49, 0x59, 0x0a, 0x4b, 0x89, 0x2f, 0xd5, 0xe6, 0x94, 0x8e, 0xc4, 0x78,
+	0xa5, 0x53, 0x55, 0xc9, 0xbb, 0xe0, 0xce, 0x3b, 0xa6, 0x52, 0xe7, 0xc2, 0x8a, 0xab, 0xd4, 0xb9,
+	0xb0, 0x9e, 0x97, 0xa0, 0x20, 0x5a, 0xf8, 0xdf, 0x33, 0x00, 0x72, 0x35, 0xf6, 0x86, 0x68, 0x03,
+	0x6a, 0x8e, 0x68, 0x85, 0xac, 0x75, 0x3b, 0xd1, 0x5a, 0x62, 0x11, 0xa7, 0xf4, 0xaa, 0x1c, 0xc4,
+	0x95, 0xfb, 0x0d, 0x54, 0x7c, 0x29, 0x81, 0xc1, 0x6e, 0x25, 0x18, 0xcc, 0x97, 0x50, 0x96, 0x03,
+	0xa8, 0xc9, 0x3e, 0x84, 0x05, 0x7f, 0x7c, 0x82, 0xcd, 0xee, 0x5f, 0x61, 0x33, 0x5f, 0xe0, 0x9c,
+	0x94, 0xa0, 0x5a, 0x4d, 0x55, 0x2c, 0x30, 0xdb, 0xad, 0x04, 0xb3, 0xc5, 0x15, 0xa3, 0x86, 0x03,
+	0x1a, 0x2f, 0x79, 0x13, 0xff, 0x7f, 0x16, 0x0a, 0xeb, 0xf6, 0x60, 0x68, 0x38, 0x74, 0x35, 0xf2,
+	0x0e, 0x71, 0x47, 0x7d, 0x8f, 0x99, 0xab, 0xb6, 0xfa, 0x20, 0x2c, 0x51, 0xb0, 0xc9, 0x7f, 0x75,
+	0xc6, 0xaa, 0x8b, 0x21, 0x74, 0xb0, 0x08, 0x8f, 0x99, 0xb7, 0x18, 0x2c, 0x82, 0xa3, 0x18, 0x22,
+	0x0f, 0x72, 0x36, 0x38, 0xc8, 0x4d, 0x28, 0x8c, 0x89, 0x13, 0x84, 0xf4, 0xcd, 0x29, 0x5d, 0x12,
+	0xd0, 0xbb, 0x30, 0x13, 0x0d, 0x2f, 0x39, 0xc1, 0x53, 0xeb, 0x86, 0xa3, 0xd1, 0x03, 0xa8, 0x84,
+	0x62, 0x5c, 0x5e, 0xf0, 0x95, 0x07, 0x4a, 0x88, 0xbb, 0x21, 0xfd, 0x2a, 0x8d, 0xc7, 0x95, 0xcd,
+	0x29, 0xe9, 0x59, 0x6f, 0x48, 0xcf, 0x5a, 0x14, 0xa3, 0x84, 0x6f, 0x0d, 0x39, 0x99, 0xdf, 0x86,
+	0x9d, 0x0c, 0xfe, 0x2d, 0x54, 0x43, 0x06, 0xa2, 0x71, 0xa7, 0xfd, 0xc1, 0xe1, 0xda, 0x0e, 0x0f,
+	0x52, 0x2f, 0x58, 0x5c, 0xd2, 0xeb, 0x1a, 0x8d, 0x75, 0x3b, 0xed, 0x83, 0x83, 0x7a, 0x06, 0x55,
+	0xa1, 0xb4, 0xbb, 0xd7, 0x39, 0xe2, 0x5c, 0x59, 0xfc, 0xc2, 0x97, 0x20, 0x82, 0x9c, 0x12, 0xdb,
+	0xa6, 0x94, 0xd8, 0xa6, 0xc9, 0xd8, 0x96, 0x09, 0x62, 0x1b, 0x0b, 0x73, 0x3b, 0xed, 0xb5, 0x83,
+	0x76, 0x7d, 0xfa, 0x79, 0x0d, 0x2a, 0xdc, 0xbe, 0x47, 0x23, 0x8b, 0x86, 0xda, 0x7f, 0xd6, 0x00,
+	0x82, 0xd3, 0x84, 0x5a, 0x50, 0xe8, 0x72, 0x9c, 0x86, 0xc6, 0x9c, 0xd1, 0x42, 0xe2, 0x92, 0xe9,
+	0x92, 0x0b, 0xfd, 0x12, 0x0a, 0xee, 0xa8, 0xdb, 0x25, 0xae, 0x0c, 0x79, 0x37, 0xa3, 0xfe, 0x50,
+	0x78, 0x2b, 0x5d, 0xf2, 0xd1, 0x21, 0x27, 0x86, 0xd9, 0x1f, 0xb1, 0x00, 0x78, 0xf5, 0x10, 0xc1,
+	0x87, 0xff, 0x49, 0x83, 0xb2, 0xb2, 0x79, 0x7f, 0xa0, 0x13, 0xbe, 0x03, 0x25, 0xa6, 0x03, 0xe9,
+	0x09, 0x37, 0x5c, 0xd4, 0x03, 0x02, 0xfa, 0x63, 0x28, 0xc9, 0x13, 0x20, 0x3d, 0x71, 0x23, 0x59,
+	0xec, 0xde, 0x50, 0x0f, 0x58, 0xf1, 0x36, 0xcc, 0x32, 0xab, 0x74, 0x69, 0x72, 0x2d, 0xed, 0xa8,
+	0xa6, 0x9f, 0x5a, 0x24, 0xfd, 0x6c, 0x42, 0x71, 0x78, 0x76, 0xe9, 0x9a, 0x5d, 0xa3, 0x2f, 0xb4,
+	0xf0, 0xdb, 0xf8, 0xf7, 0x80, 0x54, 0x61, 0x93, 0x4c, 0x17, 0x57, 0xa1, 0xbc, 0x69, 0xb8, 0x67,
+	0x42, 0x25, 0xfc, 0x14, 0xaa, 0xb4, 0xb9, 0xfd, 0xea, 0x2d, 0x74, 0x64, 0x97, 0x03, 0xc9, 0x3d,
+	0x91, 0xcd, 0x11, 0x4c, 0x9f, 0x19, 0xee, 0x19, 0x9b, 0x68, 0x55, 0x67, 0xdf, 0xe8, 0x5d, 0xa8,
+	0x77, 0xf9, 0x24, 0x8f, 0x22, 0x57, 0x86, 0x19, 0x41, 0xf7, 0x33, 0xc1, 0x8f, 0xa0, 0xc2, 0xe7,
+	0xf0, 0x63, 0x2b, 0x81, 0x67, 0x61, 0xe6, 0xc0, 0x32, 0x86, 0xee, 0x99, 0x2d, 0xa3, 0x1b, 0x9d,
+	0x74, 0x3d, 0xa0, 0x4d, 0x84, 0xf8, 0x18, 0x66, 0x1c, 0x32, 0x30, 0x4c, 0xcb, 0xb4, 0x4e, 0x8f,
+	0x8e, 0x2f, 0x3d, 0xe2, 0x8a, 0x0b, 0x53, 0xcd, 0x27, 0x3f, 0xa7, 0x54, 0xaa, 0xda, 0x71, 0xdf,
+	0x3e, 0x16, 0x6e, 0x8e, 0x7d, 0xe3, 0x6f, 0x35, 0xa8, 0x7c, 0x68, 0x78, 0x5d, 0xb9, 0x74, 0x68,
+	0x0b, 0x6a, 0xbe, 0x73, 0x63, 0x14, 0xa1, 0x4b, 0x24, 0xc4, 0xb2, 0x31, 0x32, 0x95, 0x96, 0xd1,
+	0xb1, 0xda, 0x55, 0x09, 0x4c, 0x94, 0x61, 0x75, 0x49, 0xdf, 0x17, 0x95, 0x49, 0x17, 0xc5, 0x18,
+	0x55, 0x51, 0x2a, 0xe1, 0xf9, 0x4c, 0x90, 0x7e, 0x70, 0x5f, 0xf2, 0x6d, 0x06, 0x50, 0x5c, 0x87,
+	0xef, 0x9b, 0x91, 0x3d, 0x82, 0x9a, 0xeb, 0x19, 0x4e, 0x6c, 0x6f, 0x54, 0x19, 0xd5, 0x77, 0xd0,
+	0x8f, 0x61, 0x66, 0xe8, 0xd8, 0xa7, 0x0e, 0x71, 0xdd, 0x23, 0xcb, 0xf6, 0xcc, 0x93, 0x4b, 0x91,
+	0xd4, 0xd6, 0x24, 0x79, 0x97, 0x51, 0x51, 0x1b, 0x0a, 0x27, 0x66, 0xdf, 0x23, 0x8e, 0xdb, 0xc8,
+	0x2d, 0x65, 0x97, 0x6b, 0xab, 0x4f, 0xaf, 0xb3, 0xda, 0xca, 0xef, 0x18, 0x7f, 0xe7, 0x72, 0x48,
+	0x74, 0x39, 0x56, 0x4d, 0x14, 0xf3, 0xa1, 0xe4, 0xf9, 0x16, 0x14, 0x5f, 0x53, 0x11, 0xf4, 0x52,
+	0x5c, 0xe0, 0xb9, 0x1d, 0x6b, 0x6f, 0xf5, 0xf0, 0x23, 0x80, 0x40, 0x14, 0xf5, 0xc2, 0xbb, 0x7b,
+	0xfb, 0x87, 0x9d, 0xfa, 0x14, 0xaa, 0x40, 0x71, 0x77, 0x6f, 0xa3, 0xbd, 0xd3, 0xa6, 0x2e, 0x1b,
+	0xb7, 0xa4, 0xd9, 0x54, 0xf3, 0x86, 0xe4, 0x6a, 0x61, 0xb9, 0x7f, 0x9f, 0x81, 0xaa, 0xd8, 0x20,
+	0x13, 0xed, 0x52, 0x15, 0x22, 0x13, 0x82, 0xa0, 0x09, 0x2b, 0xdf, 0x38, 0x3d, 0x91, 0x17, 0xcb,
+	0x26, 0x75, 0x1b, 0x7c, 0x1f, 0x90, 0x9e, 0xb0, 0xb8, 0xdf, 0x4e, 0x3c, 0xd9, 0xb9, 0xc4, 0x93,
+	0x8d, 0x1e, 0x40, 0xd5, 0xdf, 0x88, 0x86, 0x2b, 0xc2, 0x70, 0x49, 0xaf, 0xc8, 0x3d, 0x46, 0x69,
+	0xe8, 0x11, 0xe4, 0xc9, 0x98, 0x58, 0x9e, 0xdb, 0x28, 0x33, 0x87, 0x5c, 0x95, 0xa9, 0x71, 0x9b,
+	0x52, 0x75, 0xd1, 0x89, 0xff, 0x08, 0x66, 0xd9, 0x15, 0xe4, 0x85, 0x63, 0x58, 0xea, 0x5d, 0xa9,
+	0xd3, 0xd9, 0x11, 0xa6, 0xa3, 0x9f, 0xa8, 0x06, 0x99, 0xad, 0x0d, 0x31, 0xd1, 0xcc, 0xd6, 0x06,
+	0xfe, 0x42, 0x03, 0xa4, 0x8e, 0x9b, 0xc8, 0x96, 0x11, 0xe1, 0x12, 0x3e, 0x1b, 0xc0, 0xcf, 0x43,
+	0x8e, 0x38, 0x8e, 0xed, 0x30, 0xab, 0x95, 0x74, 0xde, 0xc0, 0x0f, 0x85, 0x0e, 0x3a, 0x19, 0xdb,
+	0xe7, 0xfe, 0x99, 0xe1, 0xd2, 0x34, 0x5f, 0xd5, 0x6d, 0x98, 0x0b, 0x71, 0x4d, 0x14, 0x18, 0x1e,
+	0xc3, 0x02, 0x13, 0xb6, 0x4d, 0xc8, 0x70, 0xad, 0x6f, 0x8e, 0x53, 0x51, 0x87, 0x70, 0x23, 0xca,
+	0xf8, 0xd3, 0xda, 0x08, 0xff, 0xa9, 0x40, 0xec, 0x98, 0x03, 0xd2, 0xb1, 0x77, 0xd2, 0x75, 0xa3,
+	0x8e, 0xf3, 0x9c, 0x5c, 0xba, 0x22, 0x82, 0xb2, 0x6f, 0xfc, 0x2f, 0x1a, 0xdc, 0x8c, 0x0d, 0xff,
+	0x89, 0x57, 0x75, 0x11, 0xe0, 0x94, 0x6e, 0x1f, 0xd2, 0xa3, 0x1d, 0xfc, 0xf2, 0xae, 0x50, 0x7c,
+	0x3d, 0xa9, 0xef, 0xa9, 0x08, 0x3d, 0xe7, 0xc5, 0x9a, 0xb3, 0x3f, 0xae, 0x0c, 0x3f, 0x77, 0xa1,
+	0xcc, 0x08, 0x07, 0x9e, 0xe1, 0x8d, 0xdc, 0xd8, 0x62, 0xfc, 0xb5, 0xd8, 0x02, 0x72, 0xd0, 0x44,
+	0xf3, 0xfa, 0x25, 0xe4, 0x59, 0xde, 0x2a, 0xb3, 0xb6, 0xc8, 0x45, 0x41, 0xd1, 0x43, 0x17, 0x8c,
+	0xf8, 0x0c, 0xf2, 0x2f, 0x59, 0xb1, 0x4f, 0xd1, 0x6c, 0x5a, 0x2e, 0x85, 0x65, 0x0c, 0x78, 0x09,
+	0xa2, 0xa4, 0xb3, 0x6f, 0x96, 0xe4, 0x10, 0xe2, 0x1c, 0xea, 0x3b, 0x3c, 0x99, 0x2a, 0xe9, 0x7e,
+	0x9b, 0x9a, 0xac, 0xdb, 0x37, 0x89, 0xe5, 0xb1, 0xde, 0x69, 0xd6, 0xab, 0x50, 0xf0, 0x0a, 0xd4,
+	0x39, 0xd2, 0x5a, 0xaf, 0xa7, 0x24, 0x2b, 0xbe, 0x3c, 0x2d, 0x2c, 0x0f, 0xff, 0xab, 0x06, 0xb3,
+	0xca, 0x80, 0x89, 0x0c, 0xf3, 0x1e, 0xe4, 0x79, 0x49, 0x53, 0xc4, 0xc5, 0xf9, 0xf0, 0x28, 0x0e,
+	0xa3, 0x0b, 0x1e, 0xb4, 0x02, 0x05, 0xfe, 0x25, 0x33, 0xc6, 0x64, 0x76, 0xc9, 0x84, 0x1f, 0xc1,
+	0x9c, 0x20, 0x91, 0x81, 0x9d, 0xb4, 0xb7, 0x99, 0x41, 0xf1, 0x5f, 0xc1, 0x7c, 0x98, 0x6d, 0xa2,
+	0x29, 0x29, 0x4a, 0x66, 0xde, 0x46, 0xc9, 0x35, 0xa9, 0xe4, 0xe1, 0xb0, 0xa7, 0x84, 0xf1, 0xe8,
+	0xaa, 0xab, 0x2b, 0x92, 0x89, 0xac, 0x88, 0x3f, 0x01, 0x29, 0xe2, 0x67, 0x9d, 0xc0, 0x9c, 0xdc,
+	0x0e, 0x3b, 0xa6, 0xeb, 0x27, 0x77, 0x9f, 0x01, 0x52, 0x89, 0x3f, 0xb7, 0x42, 0x1b, 0xe4, 0xc4,
+	0x31, 0x4e, 0x07, 0xc4, 0x8f, 0x4f, 0x34, 0xd5, 0x57, 0x89, 0x13, 0x79, 0xf4, 0x16, 0xcc, 0xbe,
+	0xb4, 0xc7, 0xd4, 0x35, 0x50, 0x6a, 0x70, 0x64, 0xf8, 0x55, 0xcf, 0x5f, 0x36, 0xbf, 0x4d, 0xc1,
+	0xd5, 0x01, 0x13, 0x81, 0xff, 0x97, 0x06, 0x95, 0xb5, 0xbe, 0xe1, 0x0c, 0x24, 0xf0, 0x6f, 0x20,
+	0xcf, 0x2f, 0x30, 0xa2, 0x66, 0xf0, 0x4e, 0x58, 0x8c, 0xca, 0xcb, 0x1b, 0x6b, 0xfc, 0xba, 0x23,
+	0x46, 0x51, 0xc5, 0xc5, 0xb3, 0xc2, 0x46, 0xe4, 0x99, 0x61, 0x03, 0xbd, 0x0f, 0x39, 0x83, 0x0e,
+	0x61, 0x2e, 0xb8, 0x16, 0xbd, 0x3a, 0x32, 0x69, 0x2c, 0x6f, 0xe3, 0x5c, 0xf8, 0xd7, 0x50, 0x56,
+	0x10, 0xe8, 0xe5, 0xf8, 0x45, 0x5b, 0x24, 0x60, 0x6b, 0xeb, 0x9d, 0xad, 0x57, 0xfc, 0xce, 0x5c,
+	0x03, 0xd8, 0x68, 0xfb, 0xed, 0x0c, 0xfe, 0x48, 0x8c, 0x12, 0xfe, 0x4e, 0xd5, 0x47, 0x4b, 0xd3,
+	0x27, 0xf3, 0x56, 0xfa, 0x5c, 0x40, 0x55, 0x4c, 0x7f, 0x52, 0xf7, 0xcd, 0xe4, 0xa5, 0xb8, 0x6f,
+	0x45, 0x79, 0x5d, 0x30, 0xe2, 0x19, 0xa8, 0x0a, 0x87, 0x2e, 0xf6, 0xdf, 0xbf, 0x65, 0xa0, 0x26,
+	0x29, 0x93, 0xd6, 0x36, 0x65, 0x59, 0x86, 0x47, 0x00, 0xbf, 0x28, 0x73, 0x03, 0xf2, 0xbd, 0xe3,
+	0x03, 0xf3, 0x33, 0x59, 0x87, 0x16, 0x2d, 0x4a, 0xef, 0x73, 0x1c, 0xfe, 0x18, 0x24, 0x5a, 0xf4,
+	0x82, 0xee, 0x18, 0x27, 0xde, 0x96, 0xd5, 0x23, 0x17, 0x2c, 0x6f, 0x9c, 0xd6, 0x03, 0x02, 0xbb,
+	0xaf, 0x8a, 0x47, 0x23, 0x96, 0x2c, 0x2a, 0x8f, 0x48, 0xe8, 0x09, 0xd4, 0xe9, 0xf7, 0xda, 0x70,
+	0xd8, 0x37, 0x49, 0x8f, 0x0b, 0x28, 0x30, 0x9e, 0x18, 0x9d, 0xa2, 0xb3, 0xd4, 0xcb, 0x6d, 0x14,
+	0x99, 0xdb, 0x12, 0x2d, 0xb4, 0x04, 0x65, 0xae, 0xdf, 0x96, 0x75, 0xe8, 0x12, 0xf6, 0x92, 0x92,
+	0xd5, 0x55, 0x12, 0x3d, 0xc7, 0x6b, 0x23, 0xef, 0xac, 0x6d, 0x19, 0xc7, 0x7d, 0xe9, 0x17, 0x69,
+	0x30, 0xa7, 0xc4, 0x0d, 0xd3, 0x55, 0xa9, 0x6d, 0x98, 0xa3, 0x54, 0x62, 0x79, 0x66, 0x57, 0x71,
+	0xa2, 0x32, 0x54, 0x6a, 0x91, 0x50, 0x69, 0xb8, 0xee, 0x6b, 0xdb, 0xe9, 0x09, 0x03, 0xfa, 0x6d,
+	0xbc, 0xc1, 0x85, 0x1f, 0xba, 0xa1, 0x60, 0xf8, 0x7d, 0xa5, 0x2c, 0x07, 0x52, 0x5e, 0x10, 0xef,
+	0x0a, 0x29, 0xf8, 0x29, 0x2c, 0x48, 0x4e, 0x51, 0x5d, 0xbc, 0x82, 0x79, 0x0f, 0xee, 0x4a, 0xe6,
+	0xf5, 0x33, 0x7a, 0x7d, 0xdb, 0x17, 0x80, 0x3f, 0x54, 0xcf, 0xe7, 0xd0, 0xf0, 0xf5, 0x64, 0x29,
+	0xb9, 0xdd, 0x57, 0x15, 0x18, 0xb9, 0x62, 0x67, 0x96, 0x74, 0xf6, 0x4d, 0x69, 0x8e, 0xdd, 0xf7,
+	0x13, 0x0f, 0xfa, 0x8d, 0xd7, 0xe1, 0x96, 0x94, 0x21, 0x92, 0xe5, 0xb0, 0x90, 0x98, 0x42, 0x49,
+	0x42, 0x84, 0xc1, 0xe8, 0xd0, 0xab, 0xcd, 0xae, 0x72, 0x86, 0x4d, 0xcb, 0x64, 0x6a, 0x8a, 0xcc,
+	0x05, 0xbe, 0x23, 0xa8, 0x62, 0x6a, 0x5c, 0x12, 0x64, 0x2a, 0x40, 0x25, 0x8b, 0x85, 0xa0, 0xe4,
+	0xd8, 0x42, 0xc4, 0x44, 0x7f, 0x02, 0x8b, 0xbe, 0x12, 0xd4, 0x6e, 0xfb, 0xc4, 0x19, 0x98, 0xae,
+	0xab, 0xd4, 0xa3, 0x92, 0x26, 0xfe, 0x0e, 0x4c, 0x0f, 0x89, 0xf0, 0x5c, 0xe5, 0x55, 0xb4, 0xc2,
+	0x1f, 0x90, 0x57, 0x94, 0xc1, 0xac, 0x1f, 0xf7, 0xe0, 0x9e, 0x94, 0xce, 0x2d, 0x9a, 0x28, 0x3e,
+	0xaa, 0x94, 0xbc, 0xf6, 0x73, 0xb3, 0xc6, 0xaf, 0xfd, 0x59, 0xbe, 0xf6, 0x7e, 0x8d, 0xf4, 0xf7,
+	0xdc, 0x90, 0xf2, 0x6c, 0x4d, 0x14, 0x91, 0xb6, 0xb9, 0x4d, 0xfd, 0x23, 0x39, 0x91, 0xb0, 0x63,
+	0x98, 0x0f, 0x9f, 0xe4, 0x89, 0x9c, 0xe5, 0x3c, 0xe4, 0x3c, 0xfb, 0x9c, 0x48, 0x57, 0xc9, 0x1b,
+	0x52, 0x61, 0xff, 0x98, 0x4f, 0xa4, 0xb0, 0x11, 0x08, 0x63, 0x5b, 0x72, 0x52, 0x7d, 0xe9, 0x6a,
+	0xca, 0x14, 0x8f, 0x37, 0xf0, 0x2e, 0xdc, 0x88, 0xba, 0x89, 0x89, 0x54, 0x7e, 0xc5, 0x37, 0x70,
+	0x92, 0x27, 0x99, 0x48, 0xee, 0x07, 0x81, 0x33, 0x50, 0x1c, 0xca, 0x44, 0x22, 0x75, 0x68, 0x26,
+	0xf9, 0x97, 0x1f, 0x63, 0xbf, 0xfa, 0xee, 0x66, 0x22, 0x61, 0x6e, 0x20, 0x6c, 0xf2, 0xe5, 0x0f,
+	0x7c, 0x44, 0xf6, 0x4a, 0x1f, 0x21, 0x0e, 0x49, 0xe0, 0xc5, 0x7e, 0x82, 0x4d, 0x27, 0x30, 0x02,
+	0x07, 0x3a, 0x29, 0x06, 0x8d, 0x21, 0x3e, 0x06, 0x6b, 0xc8, 0x8d, 0xad, 0xba, 0xdd, 0x89, 0x16,
+	0xe3, 0xc3, 0xc0, 0x77, 0xc6, 0x3c, 0xf3, 0x44, 0x82, 0x3f, 0x82, 0xa5, 0x74, 0xa7, 0x3c, 0x89,
+	0xe4, 0x27, 0x2d, 0x28, 0xf9, 0x69, 0xab, 0xf2, 0xe3, 0x8b, 0x32, 0x14, 0x76, 0xf7, 0x0e, 0xf6,
+	0xd7, 0xd6, 0xdb, 0xfc, 0xd7, 0x17, 0xeb, 0x7b, 0xba, 0x7e, 0xb8, 0xdf, 0xa9, 0x67, 0x56, 0xbf,
+	0xcb, 0x42, 0x66, 0xfb, 0x15, 0xfa, 0x18, 0x72, 0xfc, 0x29, 0xf2, 0x8a, 0xf7, 0xe7, 0xe6, 0x55,
+	0xaf, 0xad, 0xf8, 0xe6, 0x17, 0xff, 0xf3, 0xdd, 0xd7, 0x99, 0x59, 0x5c, 0x69, 0x8d, 0x7f, 0xd5,
+	0x3a, 0x1f, 0xb7, 0x58, 0x6c, 0x78, 0xa6, 0x3d, 0x41, 0x1f, 0x40, 0x76, 0x7f, 0xe4, 0xa1, 0xd4,
+	0x77, 0xe9, 0x66, 0xfa, 0x03, 0x2c, 0x5e, 0x60, 0x42, 0x67, 0x30, 0x08, 0xa1, 0xc3, 0x91, 0x47,
+	0x45, 0x7e, 0x0a, 0x65, 0xf5, 0xf9, 0xf4, 0xda, 0xc7, 0xea, 0xe6, 0xf5, 0x4f, 0xb3, 0xf8, 0x2e,
+	0x83, 0xba, 0x89, 0x91, 0x80, 0xe2, 0x0f, 0xbc, 0xea, 0x2c, 0x3a, 0x17, 0x16, 0x4a, 0x7d, 0xca,
+	0x6e, 0xa6, 0xbf, 0xd6, 0xc6, 0x66, 0xe1, 0x5d, 0x58, 0x54, 0xe4, 0x5f, 0x88, 0x87, 0xda, 0xae,
+	0x87, 0xee, 0x25, 0x3c, 0xd4, 0xa9, 0x4f, 0x52, 0xcd, 0xa5, 0x74, 0x06, 0x01, 0x72, 0x87, 0x81,
+	0xdc, 0xc0, 0xb3, 0x02, 0xa4, 0xeb, 0xb3, 0x3c, 0xd3, 0x9e, 0xac, 0x76, 0x21, 0xc7, 0x6a, 0xce,
+	0xe8, 0xcf, 0xe4, 0x47, 0x33, 0xa1, 0x90, 0x9e, 0xb2, 0xd0, 0xa1, 0x6a, 0x35, 0x9e, 0x67, 0x40,
+	0x35, 0x5c, 0xa2, 0x40, 0xac, 0xe2, 0xfc, 0x4c, 0x7b, 0xb2, 0xac, 0xfd, 0x42, 0x5b, 0x7d, 0x33,
+	0x0d, 0x39, 0x56, 0x7c, 0x42, 0xe7, 0x00, 0x41, 0x6d, 0x36, 0x3a, 0xbb, 0x58, 0xb5, 0x37, 0x3a,
+	0xbb, 0x78, 0x59, 0x17, 0x37, 0x19, 0xe8, 0x3c, 0x9e, 0xa1, 0xa0, 0xac, 0xa6, 0xd5, 0x62, 0x65,
+	0x3a, 0x6a, 0x47, 0x47, 0x94, 0xde, 0xf8, 0x51, 0x42, 0x49, 0xc2, 0x42, 0xf5, 0xd9, 0xe8, 0x6e,
+	0x48, 0xa8, 0xcd, 0xe2, 0x45, 0x86, 0xd7, 0xc0, 0x73, 0xc2, 0x9a, 0x1c, 0xd2, 0x61, 0x4c, 0x14,
+	0xf3, 0x73, 0xa8, 0x85, 0x8b, 0xab, 0xe8, 0x41, 0x82, 0xd0, 0x68, 0x8d, 0xb6, 0xf9, 0xf0, 0x6a,
+	0xa6, 0x24, 0x70, 0x8e, 0x7c, 0x4e, 0xc8, 0xd0, 0xa0, 0x4c, 0xc2, 0xd6, 0xe8, 0x0b, 0x0d, 0x66,
+	0x22, 0xd5, 0x52, 0x94, 0x24, 0x3d, 0x56, 0x8b, 0x6d, 0x3e, 0xba, 0x86, 0x4b, 0x28, 0x81, 0x99,
+	0x12, 0x77, 0xf0, 0xcd, 0x90, 0x05, 0x3c, 0x73, 0x40, 0x3c, 0x5b, 0x28, 0xe2, 0x5b, 0x9e, 0x57,
+	0x35, 0x13, 0x2d, 0x1f, 0xaa, 0x92, 0x26, 0x5a, 0x3e, 0x5c, 0x12, 0x4d, 0xb1, 0x3c, 0x2f, 0x63,
+	0xd2, 0x9d, 0xcc, 0x7e, 0xdf, 0xc0, 0x7f, 0xd5, 0x88, 0x6c, 0x28, 0xf9, 0xa5, 0x43, 0xb4, 0x98,
+	0x54, 0xc6, 0x09, 0x2e, 0x00, 0xcd, 0x7b, 0xa9, 0xfd, 0x02, 0xf9, 0x3e, 0x43, 0xbe, 0x8d, 0x6f,
+	0x50, 0x64, 0xf1, 0xc3, 0xc9, 0x16, 0xaf, 0x15, 0xb4, 0x8c, 0x5e, 0x8f, 0x4e, 0xf8, 0x2f, 0xa1,
+	0xa2, 0xd6, 0xf6, 0xd0, 0xfd, 0xc4, 0xd2, 0x91, 0x5a, 0x1e, 0x6c, 0xe2, 0xab, 0x58, 0x04, 0xf2,
+	0x43, 0x86, 0xbc, 0x88, 0x6f, 0x25, 0x20, 0x3b, 0x8c, 0x35, 0x04, 0xce, 0xeb, 0x72, 0xc9, 0xe0,
+	0xa1, 0xb2, 0x5f, 0x32, 0x78, 0xb8, 0xac, 0x77, 0x25, 0xf8, 0x88, 0xb1, 0x52, 0x70, 0x17, 0x20,
+	0xa8, 0xc0, 0xa1, 0x44, 0x5b, 0x2a, 0x37, 0xa0, 0xe8, 0x89, 0x8e, 0x17, 0xef, 0xc2, 0xfb, 0x2b,
+	0x02, 0xdb, 0x37, 0x5d, 0x7a, 0xb2, 0x57, 0xff, 0x2e, 0x0f, 0xe5, 0x97, 0x86, 0x69, 0x79, 0xc4,
+	0x32, 0xac, 0x2e, 0x41, 0xc7, 0x90, 0x63, 0xd1, 0x2d, 0xea, 0xbc, 0xd4, 0xa2, 0x54, 0xd4, 0x79,
+	0x85, 0x2a, 0x36, 0x78, 0x89, 0xa1, 0x36, 0xf1, 0x02, 0x45, 0x1d, 0x04, 0xa2, 0x5b, 0xac, 0xd0,
+	0x42, 0x27, 0x7a, 0x02, 0x79, 0x51, 0xc3, 0x8f, 0x08, 0x0a, 0x15, 0x60, 0x9a, 0x77, 0x92, 0x3b,
+	0x93, 0xb6, 0x92, 0x0a, 0xe3, 0x32, 0x3e, 0x8a, 0x33, 0x06, 0x08, 0x2a, 0x88, 0x51, 0x83, 0xc6,
+	0x0a, 0x8e, 0xcd, 0xa5, 0x74, 0x06, 0x81, 0xf9, 0x88, 0x61, 0xde, 0xc3, 0xcd, 0x28, 0x66, 0xcf,
+	0xe7, 0xa5, 0xb8, 0x7f, 0x0e, 0xd3, 0x9b, 0x86, 0x7b, 0x86, 0x22, 0xf1, 0x4a, 0xf9, 0xb1, 0x41,
+	0xb3, 0x99, 0xd4, 0x25, 0x50, 0xee, 0x31, 0x94, 0x5b, 0x78, 0x3e, 0x8a, 0x72, 0x66, 0xb8, 0x34,
+	0x10, 0xa0, 0x1e, 0xe4, 0xf9, 0x6f, 0x0f, 0xa2, 0xf6, 0x0b, 0xfd, 0x7e, 0x21, 0x6a, 0xbf, 0xf0,
+	0xcf, 0x15, 0xae, 0x47, 0x19, 0x42, 0x51, 0x3e, 0xf6, 0xa3, 0xbb, 0x91, 0xa5, 0x08, 0xff, 0x30,
+	0xa0, 0xb9, 0x98, 0xd6, 0x2d, 0xb0, 0x1e, 0x30, 0xac, 0xbb, 0xb8, 0x11, 0x5b, 0x2b, 0xc1, 0xf9,
+	0x4c, 0x7b, 0xf2, 0x0b, 0x0d, 0x7d, 0x0e, 0x10, 0x14, 0x5d, 0x63, 0x07, 0x20, 0x5a, 0xbf, 0x8d,
+	0x1d, 0x80, 0x58, 0xbd, 0x16, 0xaf, 0x30, 0xdc, 0x65, 0xfc, 0x20, 0x8a, 0xeb, 0x39, 0x86, 0xe5,
+	0x9e, 0x10, 0xe7, 0x7d, 0x5e, 0x58, 0x73, 0xcf, 0xcc, 0x21, 0x3d, 0x0c, 0xff, 0x31, 0x03, 0xd3,
+	0x34, 0x6b, 0xa4, 0xc1, 0x35, 0xb8, 0x6c, 0x47, 0x35, 0x89, 0x95, 0xb8, 0xa2, 0x9a, 0xc4, 0xef,
+	0xe9, 0xe1, 0xe0, 0xca, 0x7e, 0x8e, 0x4e, 0x18, 0x03, 0x35, 0xb4, 0x0d, 0x65, 0xe5, 0x36, 0x8e,
+	0x12, 0x84, 0x85, 0x6b, 0x67, 0x51, 0x17, 0x9f, 0x70, 0x95, 0xc7, 0xb7, 0x19, 0xde, 0x02, 0xae,
+	0xfb, 0x78, 0x3d, 0xce, 0x41, 0x01, 0x5f, 0x43, 0x45, 0xbd, 0xb1, 0xa3, 0x04, 0x79, 0x91, 0xba,
+	0x5c, 0xd4, 0xcb, 0x25, 0x5d, 0xf8, 0xc3, 0x07, 0xdf, 0xff, 0xc9, 0xbd, 0x64, 0xa3, 0xc0, 0x7d,
+	0x28, 0x88, 0x2b, 0x7c, 0xd2, 0x2c, 0xc3, 0x45, 0xbc, 0xa4, 0x59, 0x46, 0xee, 0xff, 0xe1, 0x84,
+	0x8c, 0x21, 0xd2, 0x5b, 0x8a, 0x8c, 0x24, 0x02, 0xed, 0x05, 0xf1, 0xd2, 0xd0, 0x82, 0x8a, 0x54,
+	0x1a, 0x9a, 0x72, 0x43, 0x4c, 0x43, 0x3b, 0x25, 0x9e, 0x38, 0x2e, 0xf2, 0xe6, 0x85, 0x52, 0x84,
+	0xa9, 0xde, 0x1b, 0x5f, 0xc5, 0x92, 0x94, 0x2f, 0x07, 0x80, 0xc2, 0x75, 0xa3, 0x0b, 0x80, 0xa0,
+	0xc0, 0x10, 0x4d, 0x8e, 0x12, 0xab, 0x94, 0xd1, 0xe4, 0x28, 0xb9, 0x46, 0x11, 0x76, 0x0d, 0x01,
+	0x2e, 0x4f, 0xd7, 0x29, 0xf2, 0x57, 0x1a, 0xa0, 0x78, 0x2d, 0x02, 0x3d, 0x4d, 0x96, 0x9e, 0x58,
+	0xfb, 0x6c, 0xbe, 0xf7, 0x76, 0xcc, 0x49, 0xde, 0x3e, 0x50, 0xa9, 0xcb, 0xb8, 0x87, 0xaf, 0xa9,
+	0x52, 0x7f, 0xa3, 0x41, 0x35, 0x54, 0xc8, 0x40, 0xef, 0xa4, 0xac, 0x69, 0xa4, 0x74, 0xda, 0x7c,
+	0x7c, 0x2d, 0x5f, 0x52, 0xe2, 0xa4, 0xec, 0x00, 0x99, 0x26, 0x7f, 0xa9, 0x41, 0x2d, 0x5c, 0xf8,
+	0x40, 0x29, 0xb2, 0x63, 0xa5, 0xd7, 0xe6, 0xf2, 0xf5, 0x8c, 0x57, 0x2f, 0x4f, 0x90, 0x39, 0xf7,
+	0xa1, 0x20, 0x4a, 0x25, 0x49, 0x1b, 0x3f, 0x5c, 0xb4, 0x4d, 0xda, 0xf8, 0x91, 0x3a, 0x4b, 0xc2,
+	0xc6, 0x77, 0xec, 0x3e, 0x51, 0x8e, 0x99, 0xa8, 0xa5, 0xa4, 0xa1, 0x5d, 0x7d, 0xcc, 0x22, 0x85,
+	0x98, 0x34, 0xb4, 0xe0, 0x98, 0xc9, 0x22, 0x0a, 0x4a, 0x11, 0x76, 0xcd, 0x31, 0x8b, 0xd6, 0x60,
+	0x12, 0x8e, 0x19, 0x03, 0x54, 0x8e, 0x59, 0x50, 0xee, 0x48, 0x3a, 0x66, 0xb1, 0x1a, 0x74, 0xd2,
+	0x31, 0x8b, 0x57, 0x4c, 0x12, 0xd6, 0x91, 0xe1, 0x86, 0x8e, 0xd9, 0x5c, 0x42, 0x65, 0x04, 0xbd,
+	0x97, 0x62, 0xc4, 0xc4, 0xd2, 0x76, 0xf3, 0xfd, 0xb7, 0xe4, 0x4e, 0xdd, 0xe3, 0xdc, 0xfc, 0x72,
+	0x8f, 0xff, 0x83, 0x06, 0xf3, 0x49, 0x55, 0x15, 0x94, 0x82, 0x93, 0x52, 0x12, 0x6f, 0xae, 0xbc,
+	0x2d, 0xfb, 0xd5, 0xd6, 0xf2, 0x77, 0xfd, 0xf3, 0xfa, 0x7f, 0xbe, 0x59, 0xd4, 0xfe, 0xfb, 0xcd,
+	0xa2, 0xf6, 0xbf, 0x6f, 0x16, 0xb5, 0x7f, 0xfc, 0xbf, 0xc5, 0xa9, 0xe3, 0x3c, 0xfb, 0x8f, 0x5c,
+	0xbf, 0xfa, 0x43, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc6, 0x35, 0xa7, 0xba, 0x61, 0x36, 0x00, 0x00,
 }

+ 38 - 38
etcdserver/etcdserverpb/rpc.proto

@@ -15,7 +15,7 @@ service KV {
   // Range gets the keys in the range from the key-value store.
   rpc Range(RangeRequest) returns (RangeResponse) {
       option (google.api.http) = {
-        post: "/v3beta/kv/range"
+        post: "/v3/kv/range"
         body: "*"
     };
   }
@@ -25,7 +25,7 @@ service KV {
   // and generates one event in the event history.
   rpc Put(PutRequest) returns (PutResponse) {
       option (google.api.http) = {
-        post: "/v3beta/kv/put"
+        post: "/v3/kv/put"
         body: "*"
     };
   }
@@ -35,7 +35,7 @@ service KV {
   // and generates a delete event in the event history for every deleted key.
   rpc DeleteRange(DeleteRangeRequest) returns (DeleteRangeResponse) {
       option (google.api.http) = {
-        post: "/v3beta/kv/deleterange"
+        post: "/v3/kv/deleterange"
         body: "*"
     };
   }
@@ -46,7 +46,7 @@ service KV {
   // It is not allowed to modify the same key several times within one txn.
   rpc Txn(TxnRequest) returns (TxnResponse) {
       option (google.api.http) = {
-        post: "/v3beta/kv/txn"
+        post: "/v3/kv/txn"
         body: "*"
     };
   }
@@ -56,7 +56,7 @@ service KV {
   // indefinitely.
   rpc Compact(CompactionRequest) returns (CompactionResponse) {
       option (google.api.http) = {
-        post: "/v3beta/kv/compaction"
+        post: "/v3/kv/compaction"
         body: "*"
     };
   }
@@ -70,7 +70,7 @@ service Watch {
   // last compaction revision.
   rpc Watch(stream WatchRequest) returns (stream WatchResponse) {
       option (google.api.http) = {
-        post: "/v3beta/watch"
+        post: "/v3/watch"
         body: "*"
     };
   }
@@ -82,7 +82,7 @@ service Lease {
   // deleted if the lease expires. Each expired key generates a delete event in the event history.
   rpc LeaseGrant(LeaseGrantRequest) returns (LeaseGrantResponse) {
       option (google.api.http) = {
-        post: "/v3beta/lease/grant"
+        post: "/v3/lease/grant"
         body: "*"
     };
   }
@@ -90,7 +90,7 @@ service Lease {
   // LeaseRevoke revokes a lease. All keys attached to the lease will expire and be deleted.
   rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) {
       option (google.api.http) = {
-        post: "/v3beta/kv/lease/revoke"
+        post: "/v3/kv/lease/revoke"
         body: "*"
     };
   }
@@ -99,7 +99,7 @@ service Lease {
   // to the server and streaming keep alive responses from the server to the client.
   rpc LeaseKeepAlive(stream LeaseKeepAliveRequest) returns (stream LeaseKeepAliveResponse) {
       option (google.api.http) = {
-        post: "/v3beta/lease/keepalive"
+        post: "/v3/lease/keepalive"
         body: "*"
     };
   }
@@ -107,7 +107,7 @@ service Lease {
   // LeaseTimeToLive retrieves lease information.
   rpc LeaseTimeToLive(LeaseTimeToLiveRequest) returns (LeaseTimeToLiveResponse) {
       option (google.api.http) = {
-        post: "/v3beta/kv/lease/timetolive"
+        post: "/v3/kv/lease/timetolive"
         body: "*"
     };
   }
@@ -115,7 +115,7 @@ service Lease {
   // LeaseLeases lists all existing leases.
   rpc LeaseLeases(LeaseLeasesRequest) returns (LeaseLeasesResponse) {
       option (google.api.http) = {
-        post: "/v3beta/kv/lease/leases"
+        post: "/v3/kv/lease/leases"
         body: "*"
     };
   }
@@ -125,7 +125,7 @@ service Cluster {
   // MemberAdd adds a member into the cluster.
   rpc MemberAdd(MemberAddRequest) returns (MemberAddResponse) {
       option (google.api.http) = {
-        post: "/v3beta/cluster/member/add"
+        post: "/v3/cluster/member/add"
         body: "*"
     };
   }
@@ -133,7 +133,7 @@ service Cluster {
   // MemberRemove removes an existing member from the cluster.
   rpc MemberRemove(MemberRemoveRequest) returns (MemberRemoveResponse) {
       option (google.api.http) = {
-        post: "/v3beta/cluster/member/remove"
+        post: "/v3/cluster/member/remove"
         body: "*"
     };
   }
@@ -141,7 +141,7 @@ service Cluster {
   // MemberUpdate updates the member configuration.
   rpc MemberUpdate(MemberUpdateRequest) returns (MemberUpdateResponse) {
       option (google.api.http) = {
-        post: "/v3beta/cluster/member/update"
+        post: "/v3/cluster/member/update"
         body: "*"
     };
   }
@@ -149,7 +149,7 @@ service Cluster {
   // MemberList lists all the members in the cluster.
   rpc MemberList(MemberListRequest) returns (MemberListResponse) {
       option (google.api.http) = {
-        post: "/v3beta/cluster/member/list"
+        post: "/v3/cluster/member/list"
         body: "*"
     };
   }
@@ -159,7 +159,7 @@ service Maintenance {
   // Alarm activates, deactivates, and queries alarms regarding cluster health.
   rpc Alarm(AlarmRequest) returns (AlarmResponse) {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/alarm"
+        post: "/v3/maintenance/alarm"
         body: "*"
     };
   }
@@ -167,7 +167,7 @@ service Maintenance {
   // Status gets the status of the member.
   rpc Status(StatusRequest) returns (StatusResponse) {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/status"
+        post: "/v3/maintenance/status"
         body: "*"
     };
   }
@@ -175,7 +175,7 @@ service Maintenance {
   // Defragment defragments a member's backend database to recover storage space.
   rpc Defragment(DefragmentRequest) returns (DefragmentResponse) {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/defragment"
+        post: "/v3/maintenance/defragment"
         body: "*"
     };
   }
@@ -185,7 +185,7 @@ service Maintenance {
   // are ongoing transactions.
   rpc Hash(HashRequest) returns (HashResponse) {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/hash"
+        post: "/v3/maintenance/hash"
         body: "*"
     };
   }
@@ -193,7 +193,7 @@ service Maintenance {
   // HashKV computes the hash of all MVCC keys up to a given revision.
   rpc HashKV(HashKVRequest) returns (HashKVResponse) {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/hash"
+        post: "/v3/maintenance/hash"
         body: "*"
     };
   }
@@ -201,7 +201,7 @@ service Maintenance {
   // Snapshot sends a snapshot of the entire backend from a member over a stream to a client.
   rpc Snapshot(SnapshotRequest) returns (stream SnapshotResponse) {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/snapshot"
+        post: "/v3/maintenance/snapshot"
         body: "*"
     };
   }
@@ -209,7 +209,7 @@ service Maintenance {
   // MoveLeader requests current leader node to transfer its leadership to transferee.
   rpc MoveLeader(MoveLeaderRequest) returns (MoveLeaderResponse) {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/transfer-leadership"
+        post: "/v3/maintenance/transfer-leadership"
         body: "*"
     };
   }
@@ -219,7 +219,7 @@ service Auth {
   // AuthEnable enables authentication.
   rpc AuthEnable(AuthEnableRequest) returns (AuthEnableResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/enable"
+        post: "/v3/auth/enable"
         body: "*"
     };
   }
@@ -227,7 +227,7 @@ service Auth {
   // AuthDisable disables authentication.
   rpc AuthDisable(AuthDisableRequest) returns (AuthDisableResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/disable"
+        post: "/v3/auth/disable"
         body: "*"
     };
   }
@@ -235,7 +235,7 @@ service Auth {
   // Authenticate processes an authenticate request.
   rpc Authenticate(AuthenticateRequest) returns (AuthenticateResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/authenticate"
+        post: "/v3/auth/authenticate"
         body: "*"
     };
   }
@@ -243,7 +243,7 @@ service Auth {
   // UserAdd adds a new user.
   rpc UserAdd(AuthUserAddRequest) returns (AuthUserAddResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/add"
+        post: "/v3/auth/user/add"
         body: "*"
     };
   }
@@ -251,7 +251,7 @@ service Auth {
   // UserGet gets detailed user information.
   rpc UserGet(AuthUserGetRequest) returns (AuthUserGetResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/get"
+        post: "/v3/auth/user/get"
         body: "*"
     };
   }
@@ -259,7 +259,7 @@ service Auth {
   // UserList gets a list of all users.
   rpc UserList(AuthUserListRequest) returns (AuthUserListResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/list"
+        post: "/v3/auth/user/list"
         body: "*"
     };
   }
@@ -267,7 +267,7 @@ service Auth {
   // UserDelete deletes a specified user.
   rpc UserDelete(AuthUserDeleteRequest) returns (AuthUserDeleteResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/delete"
+        post: "/v3/auth/user/delete"
         body: "*"
     };
   }
@@ -275,7 +275,7 @@ service Auth {
   // UserChangePassword changes the password of a specified user.
   rpc UserChangePassword(AuthUserChangePasswordRequest) returns (AuthUserChangePasswordResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/changepw"
+        post: "/v3/auth/user/changepw"
         body: "*"
     };
   }
@@ -283,7 +283,7 @@ service Auth {
   // UserGrant grants a role to a specified user.
   rpc UserGrantRole(AuthUserGrantRoleRequest) returns (AuthUserGrantRoleResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/grant"
+        post: "/v3/auth/user/grant"
         body: "*"
     };
   }
@@ -291,7 +291,7 @@ service Auth {
   // UserRevokeRole revokes a role of specified user.
   rpc UserRevokeRole(AuthUserRevokeRoleRequest) returns (AuthUserRevokeRoleResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/revoke"
+        post: "/v3/auth/user/revoke"
         body: "*"
     };
   }
@@ -299,7 +299,7 @@ service Auth {
   // RoleAdd adds a new role.
   rpc RoleAdd(AuthRoleAddRequest) returns (AuthRoleAddResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/add"
+        post: "/v3/auth/role/add"
         body: "*"
     };
   }
@@ -307,7 +307,7 @@ service Auth {
   // RoleGet gets detailed role information.
   rpc RoleGet(AuthRoleGetRequest) returns (AuthRoleGetResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/get"
+        post: "/v3/auth/role/get"
         body: "*"
     };
   }
@@ -315,7 +315,7 @@ service Auth {
   // RoleList gets lists of all roles.
   rpc RoleList(AuthRoleListRequest) returns (AuthRoleListResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/list"
+        post: "/v3/auth/role/list"
         body: "*"
     };
   }
@@ -323,7 +323,7 @@ service Auth {
   // RoleDelete deletes a specified role.
   rpc RoleDelete(AuthRoleDeleteRequest) returns (AuthRoleDeleteResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/delete"
+        post: "/v3/auth/role/delete"
         body: "*"
     };
   }
@@ -331,7 +331,7 @@ service Auth {
   // RoleGrantPermission grants a permission of a specified key or range to a specified role.
   rpc RoleGrantPermission(AuthRoleGrantPermissionRequest) returns (AuthRoleGrantPermissionResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/grant"
+        post: "/v3/auth/role/grant"
         body: "*"
     };
   }
@@ -339,7 +339,7 @@ service Auth {
   // RoleRevokePermission revokes a key or range permission of a specified role.
   rpc RoleRevokePermission(AuthRoleRevokePermissionRequest) returns (AuthRoleRevokePermissionResponse) {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/revoke"
+        post: "/v3/auth/role/revoke"
         body: "*"
     };
   }