Remove tap from public API and associated test infrastructure (#3240)

### Summary

After the addition of the tap APIServer, all the logic related to tap in the public API no longer needs to be there. The servers and clients that are created but not used, as well as all the old testing infrastrucure related to tap can be removed.

This deprecates TapByResource and therefore required an update to the protobuf files with `bin/protoc-go.sh`. While the change to deprecate this method was extremely small, a lot of protobuf fils were updated in the process. These changes to the code and protobuf files should probably remain coupled since `TapByResource` is officially deprecated in the public API, but a majority of the additions/deletions are related to those files.

This draft passes `go test` as well as a local run of the integration tests.

Signed-off-by: Kevin Leimkuhler <kleimkuhler@icloud.com>
This commit is contained in:
Kevin Leimkuhler 2019-08-14 17:27:37 -04:00 committed by GitHub
parent 8ef4104c95
commit cc3c53fa73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 252 additions and 403 deletions

View File

@ -80,7 +80,6 @@ spec:
- args: - args:
- public-api - public-api
- -prometheus-url=http://linkerd-prometheus.{{.Namespace}}.svc.{{.ClusterDomain}}:9090 - -prometheus-url=http://linkerd-prometheus.{{.Namespace}}.svc.{{.ClusterDomain}}:9090
- -tap-addr=linkerd-tap.{{.Namespace}}.svc.{{.ClusterDomain}}:8088
- -controller-namespace={{.Namespace}} - -controller-namespace={{.Namespace}}
- -log-level={{.ControllerLogLevel}} - -log-level={{.ControllerLogLevel}}
image: {{.ControllerImage}}:{{default .LinkerdVersion .ControllerImageVersion}} image: {{.ControllerImage}}:{{default .LinkerdVersion .ControllerImageVersion}}

View File

@ -318,7 +318,6 @@ spec:
- args: - args:
- public-api - public-api
- -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090 - -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090
- -tap-addr=linkerd-tap.linkerd.svc.cluster.local:8088
- -controller-namespace=linkerd - -controller-namespace=linkerd
- -log-level=info - -log-level=info
image: gcr.io/linkerd-io/controller:install-control-plane-version image: gcr.io/linkerd-io/controller:install-control-plane-version

View File

@ -999,7 +999,6 @@ spec:
- args: - args:
- public-api - public-api
- -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090 - -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090
- -tap-addr=linkerd-tap.linkerd.svc.cluster.local:8088
- -controller-namespace=linkerd - -controller-namespace=linkerd
- -log-level=info - -log-level=info
image: gcr.io/linkerd-io/controller:install-control-plane-version image: gcr.io/linkerd-io/controller:install-control-plane-version

View File

@ -1051,7 +1051,6 @@ spec:
- args: - args:
- public-api - public-api
- -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090 - -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090
- -tap-addr=linkerd-tap.linkerd.svc.cluster.local:8088
- -controller-namespace=linkerd - -controller-namespace=linkerd
- -log-level=info - -log-level=info
image: gcr.io/linkerd-io/controller:install-control-plane-version image: gcr.io/linkerd-io/controller:install-control-plane-version

View File

@ -1051,7 +1051,6 @@ spec:
- args: - args:
- public-api - public-api
- -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090 - -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090
- -tap-addr=linkerd-tap.linkerd.svc.cluster.local:8088
- -controller-namespace=linkerd - -controller-namespace=linkerd
- -log-level=info - -log-level=info
image: gcr.io/linkerd-io/controller:install-control-plane-version image: gcr.io/linkerd-io/controller:install-control-plane-version

View File

@ -963,7 +963,6 @@ spec:
- args: - args:
- public-api - public-api
- -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090 - -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090
- -tap-addr=linkerd-tap.linkerd.svc.cluster.local:8088
- -controller-namespace=linkerd - -controller-namespace=linkerd
- -log-level=info - -log-level=info
image: gcr.io/linkerd-io/controller:install-control-plane-version image: gcr.io/linkerd-io/controller:install-control-plane-version

View File

@ -997,7 +997,6 @@ spec:
- args: - args:
- public-api - public-api
- -prometheus-url=http://linkerd-prometheus.Namespace.svc.cluster.local:9090 - -prometheus-url=http://linkerd-prometheus.Namespace.svc.cluster.local:9090
- -tap-addr=linkerd-tap.Namespace.svc.cluster.local:8088
- -controller-namespace=Namespace - -controller-namespace=Namespace
- -log-level=ControllerLogLevel - -log-level=ControllerLogLevel
image: ControllerImage:ControllerImageVersion image: ControllerImage:ControllerImageVersion

View File

@ -1000,7 +1000,6 @@ spec:
- args: - args:
- public-api - public-api
- -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090 - -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090
- -tap-addr=linkerd-tap.linkerd.svc.cluster.local:8088
- -controller-namespace=linkerd - -controller-namespace=linkerd
- -log-level=info - -log-level=info
image: gcr.io/linkerd-io/controller:UPGRADE-CONTROL-PLANE-VERSION image: gcr.io/linkerd-io/controller:UPGRADE-CONTROL-PLANE-VERSION

View File

@ -1052,7 +1052,6 @@ spec:
- args: - args:
- public-api - public-api
- -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090 - -prometheus-url=http://linkerd-prometheus.linkerd.svc.cluster.local:9090
- -tap-addr=linkerd-tap.linkerd.svc.cluster.local:8088
- -controller-namespace=linkerd - -controller-namespace=linkerd
- -log-level=info - -log-level=info
image: gcr.io/linkerd-io/controller:UPGRADE-CONTROL-PLANE-VERSION image: gcr.io/linkerd-io/controller:UPGRADE-CONTROL-PLANE-VERSION

View File

@ -97,22 +97,11 @@ func (c *grpcOverHTTPClient) ListServices(ctx context.Context, req *pb.ListServi
} }
func (c *grpcOverHTTPClient) Tap(ctx context.Context, req *pb.TapRequest, _ ...grpc.CallOption) (pb.Api_TapClient, error) { func (c *grpcOverHTTPClient) Tap(ctx context.Context, req *pb.TapRequest, _ ...grpc.CallOption) (pb.Api_TapClient, error) {
return nil, status.Error(codes.Unimplemented, "Tap is deprecated, use TapByResource") return nil, status.Error(codes.Unimplemented, "Tap is deprecated in public API, use tap APIServer")
} }
func (c *grpcOverHTTPClient) TapByResource(ctx context.Context, req *pb.TapByResourceRequest, _ ...grpc.CallOption) (pb.Api_TapByResourceClient, error) { func (c *grpcOverHTTPClient) TapByResource(ctx context.Context, req *pb.TapByResourceRequest, _ ...grpc.CallOption) (pb.Api_TapByResourceClient, error) {
url := c.endpointNameToPublicAPIURL("TapByResource") return nil, status.Error(codes.Unimplemented, "Tap is deprecated in public API, use tap APIServer")
httpRsp, err := c.post(ctx, url, req)
if err != nil {
return nil, err
}
client, err := getStreamClient(ctx, httpRsp)
if err != nil {
return nil, err
}
return &tapClient{client}, nil
} }
func (c *grpcOverHTTPClient) Get(ctx context.Context, req *destinationPb.GetDestination, _ ...grpc.CallOption) (destinationPb.Destination_GetClient, error) { func (c *grpcOverHTTPClient) Get(ctx context.Context, req *destinationPb.GetDestination, _ ...grpc.CallOption) (destinationPb.Destination_GetClient, error) {
@ -189,16 +178,6 @@ func (c *grpcOverHTTPClient) endpointNameToPublicAPIURL(endpoint string) *url.UR
return c.serverURL.ResolveReference(&url.URL{Path: endpoint}) return c.serverURL.ResolveReference(&url.URL{Path: endpoint})
} }
type tapClient struct {
streamClient
}
func (c tapClient) Recv() (*pb.TapEvent, error) {
var msg pb.TapEvent
err := protohttp.FromByteStreamToProtocolBuffers(c.reader, &msg)
return &msg, err
}
type destinationClient struct { type destinationClient struct {
streamClient streamClient
} }

View File

@ -13,7 +13,6 @@ import (
healthcheckPb "github.com/linkerd/linkerd2/controller/gen/common/healthcheck" healthcheckPb "github.com/linkerd/linkerd2/controller/gen/common/healthcheck"
configPb "github.com/linkerd/linkerd2/controller/gen/config" configPb "github.com/linkerd/linkerd2/controller/gen/config"
discoveryPb "github.com/linkerd/linkerd2/controller/gen/controller/discovery" discoveryPb "github.com/linkerd/linkerd2/controller/gen/controller/discovery"
tapPb "github.com/linkerd/linkerd2/controller/gen/controller/tap"
pb "github.com/linkerd/linkerd2/controller/gen/public" pb "github.com/linkerd/linkerd2/controller/gen/public"
"github.com/linkerd/linkerd2/controller/k8s" "github.com/linkerd/linkerd2/controller/k8s"
"github.com/linkerd/linkerd2/pkg/config" "github.com/linkerd/linkerd2/pkg/config"
@ -37,7 +36,6 @@ type APIServer interface {
type grpcServer struct { type grpcServer struct {
prometheusAPI promv1.API prometheusAPI promv1.API
tapClient tapPb.TapClient
discoveryClient discoveryPb.DiscoveryClient discoveryClient discoveryPb.DiscoveryClient
destinationClient destinationPb.DestinationClient destinationClient destinationPb.DestinationClient
k8sAPI *k8s.API k8sAPI *k8s.API
@ -62,7 +60,6 @@ const (
func newGrpcServer( func newGrpcServer(
promAPI promv1.API, promAPI promv1.API,
tapClient tapPb.TapClient,
discoveryClient discoveryPb.DiscoveryClient, discoveryClient discoveryPb.DiscoveryClient,
destinationClient destinationPb.DestinationClient, destinationClient destinationPb.DestinationClient,
k8sAPI *k8s.API, k8sAPI *k8s.API,
@ -72,7 +69,6 @@ func newGrpcServer(
grpcServer := &grpcServer{ grpcServer := &grpcServer{
prometheusAPI: promAPI, prometheusAPI: promAPI,
tapClient: tapClient,
discoveryClient: discoveryClient, discoveryClient: discoveryClient,
destinationClient: destinationClient, destinationClient: destinationClient,
k8sAPI: k8sAPI, k8sAPI: k8sAPI,
@ -244,29 +240,11 @@ func (s *grpcServer) Config(ctx context.Context, req *pb.Empty) (*configPb.All,
} }
func (s *grpcServer) Tap(req *pb.TapRequest, stream pb.Api_TapServer) error { func (s *grpcServer) Tap(req *pb.TapRequest, stream pb.Api_TapServer) error {
return status.Error(codes.Unimplemented, "Tap is deprecated, use TapByResource") return status.Error(codes.Unimplemented, "Tap is deprecated in public API, use tap APIServer")
} }
// Pass through to tap service
func (s *grpcServer) TapByResource(req *pb.TapByResourceRequest, stream pb.Api_TapByResourceServer) error { func (s *grpcServer) TapByResource(req *pb.TapByResourceRequest, stream pb.Api_TapByResourceServer) error {
tapStream := stream.(tapServer) return status.Error(codes.Unimplemented, "Tap is deprecated in public API, use tap APIServer")
tapClient, err := s.tapClient.TapByResource(tapStream.Context(), req)
if err != nil {
log.Errorf("Unexpected error tapping [%v]: %v", req, err)
return err
}
for {
select {
case <-tapStream.Context().Done():
return nil
default:
event, err := tapClient.Recv()
if err != nil {
return err
}
tapStream.Send(event)
}
}
} }
// Pass through to Destination service // Pass through to Destination service

View File

@ -400,7 +400,6 @@ status:
&mProm, &mProm,
nil, nil,
nil, nil,
nil,
k8sAPI, k8sAPI,
"linkerd", "linkerd",
[]string{}, []string{},
@ -503,7 +502,6 @@ metadata:
&MockProm{}, &MockProm{},
nil, nil,
nil, nil,
nil,
k8sAPI, k8sAPI,
"linkerd", "linkerd",
[]string{}, []string{},
@ -534,7 +532,6 @@ func TestConfig(t *testing.T) {
&MockProm{}, &MockProm{},
nil, nil,
nil, nil,
nil,
k8sAPI, k8sAPI,
"linkerd", "linkerd",
[]string{}, []string{},

View File

@ -9,7 +9,6 @@ import (
destinationPb "github.com/linkerd/linkerd2-proxy-api/go/destination" destinationPb "github.com/linkerd/linkerd2-proxy-api/go/destination"
healthcheckPb "github.com/linkerd/linkerd2/controller/gen/common/healthcheck" healthcheckPb "github.com/linkerd/linkerd2/controller/gen/common/healthcheck"
discoveryPb "github.com/linkerd/linkerd2/controller/gen/controller/discovery" discoveryPb "github.com/linkerd/linkerd2/controller/gen/controller/discovery"
tapPb "github.com/linkerd/linkerd2/controller/gen/controller/tap"
pb "github.com/linkerd/linkerd2/controller/gen/public" pb "github.com/linkerd/linkerd2/controller/gen/public"
"github.com/linkerd/linkerd2/controller/k8s" "github.com/linkerd/linkerd2/controller/k8s"
"github.com/linkerd/linkerd2/pkg/prometheus" "github.com/linkerd/linkerd2/pkg/prometheus"
@ -21,17 +20,16 @@ import (
) )
var ( var (
statSummaryPath = fullURLPathFor("StatSummary") statSummaryPath = fullURLPathFor("StatSummary")
topRoutesPath = fullURLPathFor("TopRoutes") topRoutesPath = fullURLPathFor("TopRoutes")
versionPath = fullURLPathFor("Version") versionPath = fullURLPathFor("Version")
listPodsPath = fullURLPathFor("ListPods") listPodsPath = fullURLPathFor("ListPods")
listServicesPath = fullURLPathFor("ListServices") listServicesPath = fullURLPathFor("ListServices")
tapByResourcePath = fullURLPathFor("TapByResource") selfCheckPath = fullURLPathFor("SelfCheck")
selfCheckPath = fullURLPathFor("SelfCheck") endpointsPath = fullURLPathFor("Endpoints")
endpointsPath = fullURLPathFor("Endpoints") edgesPath = fullURLPathFor("Edges")
edgesPath = fullURLPathFor("Edges") destGetPath = fullURLPathFor("DestinationGet")
destGetPath = fullURLPathFor("DestinationGet") configPath = fullURLPathFor("Config")
configPath = fullURLPathFor("Config")
) )
type handler struct { type handler struct {
@ -60,8 +58,6 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
h.handleListPods(w, req) h.handleListPods(w, req)
case listServicesPath: case listServicesPath:
h.handleListServices(w, req) h.handleListServices(w, req)
case tapByResourcePath:
h.handleTapByResource(w, req)
case selfCheckPath: case selfCheckPath:
h.handleSelfCheck(w, req) h.handleSelfCheck(w, req)
case endpointsPath: case endpointsPath:
@ -226,28 +222,6 @@ func (h *handler) handleListServices(w http.ResponseWriter, req *http.Request) {
} }
} }
func (h *handler) handleTapByResource(w http.ResponseWriter, req *http.Request) {
flushableWriter, err := protohttp.NewStreamingWriter(w)
if err != nil {
protohttp.WriteErrorToHTTPResponse(w, err)
return
}
var protoRequest pb.TapByResourceRequest
err = protohttp.HTTPRequestToProto(req, &protoRequest)
if err != nil {
protohttp.WriteErrorToHTTPResponse(w, err)
return
}
server := tapServer{streamServer{w: flushableWriter, req: req}}
err = h.grpcServer.TapByResource(&protoRequest, server)
if err != nil {
protohttp.WriteErrorToHTTPResponse(w, err)
return
}
}
func (h *handler) handleDestGet(w http.ResponseWriter, req *http.Request) { func (h *handler) handleDestGet(w http.ResponseWriter, req *http.Request) {
flushableWriter, err := protohttp.NewStreamingWriter(w) flushableWriter, err := protohttp.NewStreamingWriter(w)
if err != nil { if err != nil {
@ -315,14 +289,6 @@ func (s streamServer) Send(msg proto.Message) error {
return nil return nil
} }
type tapServer struct {
streamServer
}
func (s tapServer) Send(msg *pb.TapEvent) error {
return s.streamServer.Send(msg)
}
type destinationServer struct { type destinationServer struct {
streamServer streamServer
} }
@ -352,7 +318,6 @@ func (h *handler) handleEndpoints(w http.ResponseWriter, req *http.Request) {
func NewServer( func NewServer(
addr string, addr string,
prometheusClient promApi.Client, prometheusClient promApi.Client,
tapClient tapPb.TapClient,
discoveryClient discoveryPb.DiscoveryClient, discoveryClient discoveryPb.DiscoveryClient,
destinationClient destinationPb.DestinationClient, destinationClient destinationPb.DestinationClient,
k8sAPI *k8s.API, k8sAPI *k8s.API,
@ -362,7 +327,6 @@ func NewServer(
baseHandler := &handler{ baseHandler := &handler{
grpcServer: newGrpcServer( grpcServer: newGrpcServer(
promv1.NewAPI(prometheusClient), promv1.NewAPI(prometheusClient),
tapClient,
discoveryClient, discoveryClient,
destinationClient, destinationClient,
k8sAPI, k8sAPI,

View File

@ -18,14 +18,12 @@ import (
type mockServer struct { type mockServer struct {
LastRequestReceived proto.Message LastRequestReceived proto.Message
ResponseToReturn proto.Message ResponseToReturn proto.Message
TapStreamsToReturn []*pb.TapEvent
DestinationStreamsToReturn []*destinationPb.Update DestinationStreamsToReturn []*destinationPb.Update
ErrorToReturn error ErrorToReturn error
} }
type mockGrpcServer struct { type mockGrpcServer struct {
mockServer mockServer
TapStreamsToReturn []*pb.TapEvent
DestinationStreamsToReturn []*destinationPb.Update DestinationStreamsToReturn []*destinationPb.Update
} }
@ -71,10 +69,9 @@ func (m *mockGrpcServer) Config(ctx context.Context, req *pb.Empty) (*configPb.A
func (m *mockGrpcServer) Tap(req *pb.TapRequest, tapServer pb.Api_TapServer) error { func (m *mockGrpcServer) Tap(req *pb.TapRequest, tapServer pb.Api_TapServer) error {
m.LastRequestReceived = req m.LastRequestReceived = req
if m.ErrorToReturn == nil { if m.ErrorToReturn != nil {
for _, msg := range m.TapStreamsToReturn { // Not implemented in public API. Instead, use tap APIServer.
tapServer.Send(msg) return errors.New("Not implemented")
}
} }
return m.ErrorToReturn return m.ErrorToReturn
@ -82,10 +79,9 @@ func (m *mockGrpcServer) Tap(req *pb.TapRequest, tapServer pb.Api_TapServer) err
func (m *mockGrpcServer) TapByResource(req *pb.TapByResourceRequest, tapServer pb.Api_TapByResourceServer) error { func (m *mockGrpcServer) TapByResource(req *pb.TapByResourceRequest, tapServer pb.Api_TapByResourceServer) error {
m.LastRequestReceived = req m.LastRequestReceived = req
if m.ErrorToReturn == nil { if m.ErrorToReturn != nil {
for _, msg := range m.TapStreamsToReturn { // Not implemented in public API. Instead, use tap APIServer.
tapServer.Send(msg) return errors.New("Not implemented")
}
} }
return m.ErrorToReturn return m.ErrorToReturn
@ -164,46 +160,6 @@ func TestServer(t *testing.T) {
} }
}) })
t.Run("Delegates all streaming tap RPC messages to the underlying grpc server", func(t *testing.T) {
mockGrpcServer, client := getServerClient(t)
expectedTapResponses := []*pb.TapEvent{
{
Destination: &pb.TcpAddress{
Port: 9999,
},
Source: &pb.TcpAddress{
Port: 6666,
},
}, {
Destination: &pb.TcpAddress{
Port: 2102,
},
Source: &pb.TcpAddress{
Port: 1983,
},
},
}
mockGrpcServer.TapStreamsToReturn = expectedTapResponses
mockGrpcServer.ErrorToReturn = nil
tapClient, err := client.TapByResource(context.TODO(), &pb.TapByResourceRequest{})
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
for _, expectedTapEvent := range expectedTapResponses {
actualTapEvent, err := tapClient.Recv()
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if !proto.Equal(actualTapEvent, expectedTapEvent) {
t.Fatalf("Expecting tap event to be [%v], but was [%v]", expectedTapEvent, actualTapEvent)
}
}
})
t.Run("Delegates all streaming Destination RPC messages to the underlying grpc server", func(t *testing.T) { t.Run("Delegates all streaming Destination RPC messages to the underlying grpc server", func(t *testing.T) {
mockGrpcServer, client := getServerClient(t) mockGrpcServer, client := getServerClient(t)
@ -263,7 +219,7 @@ func TestServer(t *testing.T) {
} }
}) })
t.Run("Handles errors before opening keep-alive response", func(t *testing.T) { t.Run("Handles Tap route errors before opening keep-alive response", func(t *testing.T) {
mockGrpcServer, client := getServerClient(t) mockGrpcServer, client := getServerClient(t)
mockGrpcServer.ErrorToReturn = errors.New("expected error") mockGrpcServer.ErrorToReturn = errors.New("expected error")
@ -273,6 +229,18 @@ func TestServer(t *testing.T) {
t.Fatalf("Expecting error, got nothing") t.Fatalf("Expecting error, got nothing")
} }
}) })
t.Run("Handles TapByResource route errors before opening keep-alive response", func(t *testing.T) {
mockGrpcServer, client := getServerClient(t)
mockGrpcServer.ErrorToReturn = errors.New("expected error")
_, err := client.TapByResource(context.TODO(), &pb.TapByResourceRequest{})
if err == nil {
t.Fatalf("Expecting error, got nothing")
}
})
} }
func getServerClient(t *testing.T) (*mockGrpcServer, APIClient) { func getServerClient(t *testing.T) (*mockGrpcServer, APIClient) {

View File

@ -1303,7 +1303,6 @@ status:
&MockProm{Res: exp.mockPromResponse}, &MockProm{Res: exp.mockPromResponse},
nil, nil,
nil, nil,
nil,
k8sAPI, k8sAPI,
"linkerd", "linkerd",
[]string{}, []string{},
@ -1329,7 +1328,6 @@ status:
&MockProm{Res: model.Vector{}}, &MockProm{Res: model.Vector{}},
nil, nil,
nil, nil,
nil,
k8sAPI, k8sAPI,
"linkerd", "linkerd",
[]string{}, []string{},

View File

@ -100,30 +100,6 @@ func (c *MockAPIClient) Config(ctx context.Context, in *pb.Empty, _ ...grpc.Call
return c.ConfigResponseToReturn, c.ErrorToReturn return c.ConfigResponseToReturn, c.ErrorToReturn
} }
// MockAPITapByResourceClient satisfies the TapByResourceClient gRPC interface.
type MockAPITapByResourceClient struct {
TapEventsToReturn []pb.TapEvent
ErrorsToReturn []error
grpc.ClientStream
}
// Recv satisfies the TapByResourceClient.Recv() gRPC method.
func (a *MockAPITapByResourceClient) Recv() (*pb.TapEvent, error) {
var eventPopped pb.TapEvent
var errorPopped error
if len(a.TapEventsToReturn) == 0 && len(a.ErrorsToReturn) == 0 {
return nil, io.EOF
}
if len(a.TapEventsToReturn) != 0 {
eventPopped, a.TapEventsToReturn = a.TapEventsToReturn[0], a.TapEventsToReturn[1:]
}
if len(a.ErrorsToReturn) != 0 {
errorPopped, a.ErrorsToReturn = a.ErrorsToReturn[0], a.ErrorsToReturn[1:]
}
return &eventPopped, errorPopped
}
// MockDestinationGetClient satisfies the Destination_GetClient gRPC interface. // MockDestinationGetClient satisfies the Destination_GetClient gRPC interface.
type MockDestinationGetClient struct { type MockDestinationGetClient struct {
UpdatesToReturn []destinationPb.Update UpdatesToReturn []destinationPb.Update
@ -497,7 +473,6 @@ func newMockGrpcServer(exp expectedStatRPC) (*MockProm, *grpcServer, error) {
mockProm, mockProm,
nil, nil,
nil, nil,
nil,
k8sAPI, k8sAPI,
"linkerd", "linkerd",
[]string{}, []string{},

View File

@ -12,7 +12,6 @@ import (
"github.com/linkerd/linkerd2/controller/api/discovery" "github.com/linkerd/linkerd2/controller/api/discovery"
"github.com/linkerd/linkerd2/controller/api/public" "github.com/linkerd/linkerd2/controller/api/public"
"github.com/linkerd/linkerd2/controller/k8s" "github.com/linkerd/linkerd2/controller/k8s"
"github.com/linkerd/linkerd2/controller/tap"
"github.com/linkerd/linkerd2/pkg/admin" "github.com/linkerd/linkerd2/pkg/admin"
"github.com/linkerd/linkerd2/pkg/flags" "github.com/linkerd/linkerd2/pkg/flags"
promApi "github.com/prometheus/client_golang/api" promApi "github.com/prometheus/client_golang/api"
@ -25,7 +24,6 @@ func main() {
prometheusURL := flag.String("prometheus-url", "http://127.0.0.1:9090", "prometheus url") prometheusURL := flag.String("prometheus-url", "http://127.0.0.1:9090", "prometheus url")
metricsAddr := flag.String("metrics-addr", ":9995", "address to serve scrapable metrics on") metricsAddr := flag.String("metrics-addr", ":9995", "address to serve scrapable metrics on")
destinationAPIAddr := flag.String("destination-addr", "127.0.0.1:8086", "address of destination service") destinationAPIAddr := flag.String("destination-addr", "127.0.0.1:8086", "address of destination service")
tapAddr := flag.String("tap-addr", "127.0.0.1:8088", "address of tap service")
controllerNamespace := flag.String("controller-namespace", "linkerd", "namespace in which Linkerd is installed") controllerNamespace := flag.String("controller-namespace", "linkerd", "namespace in which Linkerd is installed")
ignoredNamespaces := flag.String("ignore-namespaces", "kube-system", "comma separated list of namespaces to not list pods from") ignoredNamespaces := flag.String("ignore-namespaces", "kube-system", "comma separated list of namespaces to not list pods from")
flags.ConfigureAndParse() flags.ConfigureAndParse()
@ -33,12 +31,6 @@ func main() {
stop := make(chan os.Signal, 1) stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt, syscall.SIGTERM) signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
tapClient, tapConn, err := tap.NewClient(*tapAddr)
if err != nil {
log.Fatal(err.Error())
}
defer tapConn.Close()
discoveryClient, discoveryConn, err := discovery.NewClient(*destinationAPIAddr) discoveryClient, discoveryConn, err := discovery.NewClient(*destinationAPIAddr)
if err != nil { if err != nil {
log.Fatal(err.Error()) log.Fatal(err.Error())
@ -67,7 +59,6 @@ func main() {
server := public.NewServer( server := public.NewServer(
*addr, *addr,
prometheusClient, prometheusClient,
tapClient,
discoveryClient, discoveryClient,
destinationClient, destinationClient,
k8sAPI, k8sAPI,

View File

@ -26,19 +26,19 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("controller/tap.proto", fileDescriptor_d1a304d4ff6ff27b) } func init() { proto.RegisterFile("controller/tap.proto", fileDescriptor_d1a304d4ff6ff27b) }
var fileDescriptor_d1a304d4ff6ff27b = []byte{ var fileDescriptor_d1a304d4ff6ff27b = []byte{
// 180 bytes of a gzipped FileDescriptorProto // 177 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x49, 0xce, 0xcf, 0x2b, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x49, 0xce, 0xcf, 0x2b,
0x29, 0xca, 0xcf, 0xc9, 0x49, 0x2d, 0xd2, 0x2f, 0x49, 0x2c, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x29, 0xca, 0xcf, 0xc9, 0x49, 0x2d, 0xd2, 0x2f, 0x49, 0x2c, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9,
0x17, 0x12, 0xcf, 0xc9, 0xcc, 0xcb, 0x4e, 0x2d, 0x4a, 0x31, 0xd2, 0x43, 0x48, 0xeb, 0x95, 0x24, 0x17, 0x12, 0xcf, 0xc9, 0xcc, 0xcb, 0x4e, 0x2d, 0x4a, 0x31, 0xd2, 0x43, 0x48, 0xeb, 0x95, 0x24,
0x16, 0x48, 0xf1, 0x14, 0x94, 0x26, 0xe5, 0x64, 0x26, 0x43, 0x94, 0x19, 0x2d, 0x62, 0xe4, 0x62, 0x16, 0x48, 0xf1, 0x14, 0x94, 0x26, 0xe5, 0x64, 0x26, 0x43, 0x94, 0x19, 0x2d, 0x65, 0xe4, 0x62,
0x0e, 0x49, 0x2c, 0x10, 0x72, 0x81, 0x50, 0xd2, 0x7a, 0x70, 0x6d, 0x50, 0x65, 0x21, 0x89, 0x05, 0x0e, 0x49, 0x2c, 0x10, 0x72, 0x81, 0x50, 0xd2, 0x7a, 0x70, 0x6d, 0x50, 0x65, 0x21, 0x89, 0x05,
0x41, 0xa9, 0x85, 0xa5, 0xa9, 0xc5, 0x25, 0x52, 0x92, 0xd8, 0x24, 0x5d, 0xcb, 0x52, 0xf3, 0x4a, 0x41, 0xa9, 0x85, 0xa5, 0xa9, 0xc5, 0x25, 0x52, 0x92, 0xd8, 0x24, 0x5d, 0xcb, 0x52, 0xf3, 0x4a,
0x94, 0x98, 0x3b, 0x98, 0x18, 0x0d, 0x18, 0x85, 0x42, 0xb9, 0x78, 0x43, 0x12, 0x0b, 0x9c, 0x2a, 0x94, 0x98, 0x3b, 0x98, 0x18, 0x0d, 0x18, 0x85, 0x22, 0xb8, 0x78, 0x43, 0x12, 0x0b, 0x9c, 0x2a,
0x83, 0x52, 0x8b, 0xf3, 0x4b, 0x8b, 0x92, 0x53, 0x85, 0x54, 0xb1, 0x69, 0x41, 0xc8, 0x13, 0x61, 0x83, 0x52, 0x8b, 0xf3, 0x4b, 0x8b, 0x92, 0x53, 0x85, 0x54, 0xb1, 0x69, 0x41, 0xc8, 0x13, 0x6d,
0x32, 0x83, 0x01, 0xa3, 0x93, 0x75, 0x94, 0x65, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0xb2, 0x93, 0x75, 0x94, 0x65, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e,
0x7e, 0xae, 0x3e, 0x54, 0x29, 0x8c, 0x36, 0xd2, 0x47, 0xf2, 0x7f, 0x7a, 0x6a, 0x9e, 0x3e, 0x6a, 0x54, 0x35, 0x8c, 0x36, 0xd2, 0x47, 0x0a, 0x82, 0xf4, 0xd4, 0x3c, 0x7d, 0xd4, 0x10, 0x49, 0x62,
0x70, 0x24, 0xb1, 0x81, 0x3d, 0x6a, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x4e, 0xdc, 0xd1, 0x03, 0xfb, 0xd5, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x28, 0x0a, 0x8e, 0x2a, 0x01, 0x00,
0x27, 0x01, 0x00, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -98,6 +98,7 @@ func (x *tapTapClient) Recv() (*public.TapEvent, error) {
return m, nil return m, nil
} }
// Deprecated: Do not use.
func (c *tapClient) TapByResource(ctx context.Context, in *public.TapByResourceRequest, opts ...grpc.CallOption) (Tap_TapByResourceClient, error) { func (c *tapClient) TapByResource(ctx context.Context, in *public.TapByResourceRequest, opts ...grpc.CallOption) (Tap_TapByResourceClient, error) {
stream, err := c.cc.NewStream(ctx, &_Tap_serviceDesc.Streams[1], "/linkerd2.controller.tap.Tap/TapByResource", opts...) stream, err := c.cc.NewStream(ctx, &_Tap_serviceDesc.Streams[1], "/linkerd2.controller.tap.Tap/TapByResource", opts...)
if err != nil { if err != nil {

View File

@ -805,6 +805,8 @@ func (*TapRequest) XXX_OneofWrappers() []interface{} {
} }
// A tap request over kubernetes resources. // A tap request over kubernetes resources.
//
// This is used only by the tap APIServer.
type TapByResourceRequest struct { type TapByResourceRequest struct {
// Describes the kubernetes pods that should be tapped. // Describes the kubernetes pods that should be tapped.
Target *ResourceSelection `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` Target *ResourceSelection `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"`
@ -1551,6 +1553,7 @@ func (*Eos) XXX_OneofWrappers() []interface{} {
} }
} }
// This is used only by the tap APIServer.
type TapEvent struct { type TapEvent struct {
Source *TcpAddress `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` Source *TcpAddress `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"`
SourceMeta *TapEvent_EndpointMeta `protobuf:"bytes,5,opt,name=source_meta,json=sourceMeta,proto3" json:"source_meta,omitempty"` SourceMeta *TapEvent_EndpointMeta `protobuf:"bytes,5,opt,name=source_meta,json=sourceMeta,proto3" json:"source_meta,omitempty"`
@ -3739,204 +3742,204 @@ func init() {
func init() { proto.RegisterFile("public.proto", fileDescriptor_413a91106d7bcce8) } func init() { proto.RegisterFile("public.proto", fileDescriptor_413a91106d7bcce8) }
var fileDescriptor_413a91106d7bcce8 = []byte{ var fileDescriptor_413a91106d7bcce8 = []byte{
// 3146 bytes of a gzipped FileDescriptorProto // 3141 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0xcd, 0x73, 0x1b, 0xc7, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0xcd, 0x73, 0x1b, 0x49,
0xb1, 0xc7, 0xe2, 0x1b, 0x0d, 0x90, 0x84, 0x46, 0xb4, 0x1e, 0x0c, 0xdb, 0xb2, 0xb4, 0xfa, 0x30, 0x15, 0xd7, 0xf7, 0xc7, 0x93, 0x6c, 0x2b, 0x1d, 0x6f, 0xd0, 0x6a, 0x77, 0xb3, 0xc9, 0xe4, 0x63,
0x9f, 0xf4, 0x1e, 0x48, 0x51, 0x96, 0x2c, 0x59, 0xf6, 0x7b, 0x21, 0x48, 0x58, 0x64, 0x22, 0x91, 0x4d, 0x02, 0xb2, 0xe3, 0x6c, 0xb2, 0xc9, 0x66, 0x17, 0xb0, 0x6c, 0x6d, 0x2c, 0x48, 0x6c, 0x6d,
0xf0, 0x00, 0x8a, 0xab, 0x5c, 0x4e, 0xa1, 0x96, 0xd8, 0x21, 0xb8, 0xe1, 0x62, 0x67, 0xb5, 0x3b, 0x4b, 0x61, 0xa9, 0xad, 0xa5, 0x54, 0x63, 0x4d, 0x5b, 0x1e, 0x3c, 0x9a, 0x9e, 0xcc, 0xb4, 0xec,
0x10, 0x8d, 0xff, 0x20, 0x55, 0xa9, 0x54, 0x4e, 0x39, 0xe7, 0x90, 0x53, 0x52, 0xb9, 0xe4, 0x92, 0xd5, 0x7f, 0x40, 0x15, 0x45, 0x71, 0xe2, 0xcc, 0x81, 0x13, 0x14, 0x17, 0x2e, 0x5c, 0xa8, 0xe2,
0x8b, 0x6f, 0xb9, 0xe6, 0x9c, 0x4a, 0xe5, 0x92, 0xdc, 0x72, 0x71, 0xe5, 0x96, 0x53, 0x0e, 0xae, 0xc0, 0x95, 0x33, 0x45, 0x71, 0x81, 0x1b, 0x97, 0x2d, 0x6e, 0x9c, 0x38, 0x6c, 0x51, 0xfd, 0x35,
0xd4, 0x7c, 0x2d, 0x76, 0x09, 0x80, 0x1f, 0x72, 0x0e, 0xc9, 0x09, 0xd3, 0x3d, 0xbf, 0xee, 0xe9, 0x9a, 0xb1, 0x24, 0x7f, 0x64, 0x39, 0xc0, 0x49, 0xfd, 0x5e, 0xff, 0xde, 0xeb, 0xd7, 0xdd, 0xaf,
0x99, 0xe9, 0xe9, 0xee, 0x19, 0x2c, 0x54, 0xfc, 0xd1, 0xbe, 0xeb, 0xf4, 0x1b, 0x7e, 0x40, 0x19, 0xdf, 0x7b, 0xdd, 0x1a, 0x28, 0x7b, 0xa3, 0x3d, 0xc7, 0xee, 0xd7, 0x3d, 0x9f, 0x32, 0x8a, 0x96,
0x45, 0x4b, 0xae, 0xe3, 0x1d, 0x91, 0xc0, 0x5e, 0x6f, 0x48, 0x76, 0xfd, 0xea, 0x80, 0xd2, 0x81, 0x1c, 0xdb, 0x3d, 0x24, 0xbe, 0xb5, 0x5e, 0x97, 0xec, 0xda, 0xd5, 0x01, 0xa5, 0x03, 0x87, 0xac,
0x4b, 0x56, 0x45, 0xf7, 0xfe, 0xe8, 0x60, 0xd5, 0x1e, 0x05, 0x16, 0x73, 0xa8, 0x27, 0x05, 0xea, 0x8a, 0xee, 0xbd, 0xd1, 0xfe, 0xaa, 0x35, 0xf2, 0x4d, 0x66, 0x53, 0x57, 0x0a, 0xd4, 0xaa, 0x7d,
0xb5, 0x3e, 0x1d, 0x0e, 0xa9, 0xb7, 0x7a, 0x48, 0x2c, 0x97, 0x1d, 0xf6, 0x0f, 0x49, 0xff, 0x48, 0x3a, 0x1c, 0x52, 0x77, 0xf5, 0x80, 0x98, 0x0e, 0x3b, 0xe8, 0x1f, 0x90, 0xfe, 0xa1, 0xea, 0xb9,
0xf5, 0x5c, 0xee, 0x53, 0xef, 0xc0, 0x19, 0xac, 0xca, 0x1f, 0xc9, 0x34, 0x0b, 0x90, 0x6b, 0x0d, 0xdc, 0xa7, 0xee, 0xbe, 0x3d, 0x58, 0x95, 0x3f, 0x92, 0x69, 0xe4, 0x21, 0xdb, 0x1c, 0x7a, 0x6c,
0x7d, 0x36, 0x36, 0x5f, 0x42, 0xf9, 0xfb, 0x24, 0x08, 0x1d, 0xea, 0xed, 0x78, 0x07, 0x14, 0xbd, 0x6c, 0xbc, 0x84, 0xd2, 0xf7, 0x89, 0x1f, 0xd8, 0xd4, 0x6d, 0xb9, 0xfb, 0x14, 0xbd, 0x09, 0xc5,
0x0d, 0xa5, 0x01, 0x55, 0x8c, 0x9a, 0x71, 0xcd, 0x58, 0x29, 0xe1, 0x09, 0x83, 0xf7, 0xee, 0x8f, 0x01, 0x55, 0x8c, 0x6a, 0xf2, 0x5a, 0x72, 0xa5, 0x88, 0x27, 0x0c, 0xde, 0xbb, 0x37, 0xb2, 0x1d,
0x1c, 0xd7, 0xde, 0xb2, 0x18, 0xa9, 0xa5, 0x65, 0x6f, 0xc4, 0x40, 0xb7, 0x61, 0x31, 0x20, 0x2e, 0x6b, 0xcb, 0x64, 0xa4, 0x9a, 0x92, 0xbd, 0x21, 0x03, 0xdd, 0x86, 0x45, 0x9f, 0x38, 0xc4, 0x0c,
0xb1, 0x42, 0xa2, 0x15, 0x64, 0x04, 0xe4, 0x04, 0xd7, 0xbc, 0x0f, 0x97, 0x9f, 0x39, 0x21, 0xeb, 0x88, 0x56, 0x90, 0x16, 0x90, 0x13, 0x5c, 0xe3, 0x3e, 0x5c, 0x7e, 0x66, 0x07, 0xac, 0x43, 0xfc,
0x90, 0xe0, 0x95, 0xd3, 0x27, 0x21, 0x26, 0x2f, 0x47, 0x24, 0x64, 0x5c, 0xb9, 0x67, 0x0d, 0x49, 0x23, 0xbb, 0x4f, 0x02, 0x4c, 0x5e, 0x8e, 0x48, 0xc0, 0xb8, 0x72, 0xd7, 0x1c, 0x92, 0xc0, 0x33,
0xe8, 0x5b, 0x7d, 0xa2, 0x87, 0x8e, 0x18, 0xe6, 0x33, 0x58, 0x4e, 0x0a, 0x85, 0x3e, 0xf5, 0x42, 0xfb, 0x44, 0x0f, 0x1d, 0x32, 0x8c, 0x67, 0xb0, 0x1c, 0x17, 0x0a, 0x3c, 0xea, 0x06, 0x04, 0xbd,
0x82, 0xde, 0x87, 0x62, 0xa8, 0x78, 0x35, 0xe3, 0x5a, 0x66, 0xa5, 0xbc, 0x5e, 0x6b, 0x9c, 0x58, 0x0b, 0x85, 0x40, 0xf1, 0xaa, 0xc9, 0x6b, 0xe9, 0x95, 0xd2, 0x7a, 0xb5, 0x7e, 0x62, 0xed, 0xea,
0xbb, 0x86, 0x12, 0xc2, 0x11, 0xd2, 0x7c, 0x02, 0x05, 0xc5, 0x44, 0x08, 0xb2, 0x7c, 0x14, 0x35, 0x4a, 0x08, 0x87, 0x48, 0xe3, 0x09, 0xe4, 0x15, 0x13, 0x21, 0xc8, 0xf0, 0x51, 0xd4, 0x88, 0xa2,
0xa2, 0x68, 0x27, 0x4d, 0x49, 0x9f, 0x34, 0x25, 0x84, 0x25, 0x6e, 0x4a, 0x9b, 0xda, 0x91, 0xed, 0x1d, 0x37, 0x25, 0x75, 0xd2, 0x94, 0x00, 0x96, 0xb8, 0x29, 0x6d, 0x6a, 0x85, 0xb6, 0x5f, 0x9b,
0xd7, 0xa6, 0x6c, 0x6f, 0xa6, 0x6b, 0x46, 0x4c, 0x08, 0xfd, 0x1f, 0xb7, 0xd3, 0x25, 0x7d, 0x46, 0xb2, 0xbd, 0x91, 0xaa, 0x26, 0x23, 0x42, 0xe8, 0x5b, 0xdc, 0x4e, 0x87, 0xf4, 0x19, 0xf5, 0x85,
0x03, 0xa1, 0xb1, 0xbc, 0x6e, 0x4e, 0xd9, 0x89, 0x49, 0x48, 0x47, 0x41, 0x9f, 0x74, 0x04, 0xd0, 0xc6, 0xd2, 0xba, 0x31, 0x65, 0x27, 0x26, 0x01, 0x1d, 0xf9, 0x7d, 0xd2, 0x11, 0x40, 0x9b, 0xba,
0xa1, 0x1e, 0x8e, 0x64, 0xcc, 0x8f, 0xa0, 0x3a, 0x19, 0x54, 0xcd, 0x7d, 0x05, 0xb2, 0x3e, 0xb5, 0x38, 0x94, 0x31, 0x3e, 0x80, 0xca, 0x64, 0x50, 0x35, 0xf7, 0x15, 0xc8, 0x78, 0xd4, 0xd2, 0xf3,
0xf5, 0xbc, 0x97, 0xa7, 0xf4, 0xb5, 0xa9, 0x8d, 0x05, 0xc2, 0xfc, 0x47, 0x16, 0x32, 0x6d, 0x6a, 0x5e, 0x9e, 0xd2, 0xd7, 0xa6, 0x16, 0x16, 0x08, 0xe3, 0xdf, 0x19, 0x48, 0xb7, 0xa9, 0x35, 0x73,
0xcf, 0x9c, 0xec, 0x32, 0xe4, 0x7c, 0x6a, 0xef, 0xb4, 0xd5, 0x44, 0x25, 0x81, 0xae, 0x01, 0xd8, 0xb2, 0xcb, 0x90, 0xf5, 0xa8, 0xd5, 0x6a, 0xab, 0x89, 0x4a, 0x02, 0x5d, 0x03, 0xb0, 0x88, 0xe7,
0xc4, 0x77, 0xe9, 0x78, 0x48, 0x3c, 0x26, 0x37, 0x72, 0x3b, 0x85, 0x63, 0x3c, 0x74, 0x1d, 0xca, 0xd0, 0xf1, 0x90, 0xb8, 0x4c, 0x6e, 0xe4, 0x76, 0x02, 0x47, 0x78, 0xe8, 0x3a, 0x94, 0x7c, 0xe2,
0x01, 0xf1, 0x5d, 0xa7, 0x6f, 0xf5, 0x42, 0xc2, 0x6a, 0xa0, 0x21, 0x8a, 0xd9, 0x21, 0x0c, 0x7d, 0x39, 0x76, 0xdf, 0xec, 0x05, 0x84, 0x55, 0x41, 0x43, 0x14, 0xb3, 0x43, 0x18, 0x7a, 0x0f, 0xae,
0x00, 0x57, 0x14, 0xc5, 0x67, 0xd3, 0xeb, 0x53, 0x8f, 0x05, 0xd4, 0x75, 0x49, 0x50, 0x2b, 0x2b, 0x28, 0x8a, 0xcf, 0xa6, 0xd7, 0xa7, 0x2e, 0xf3, 0xa9, 0xe3, 0x10, 0xbf, 0x5a, 0x52, 0xe8, 0xd7,
0xf4, 0x1b, 0xb1, 0xfe, 0xcd, 0xa8, 0x1b, 0xdd, 0x80, 0x4a, 0xc8, 0x2c, 0x46, 0x0e, 0x46, 0xae, 0x22, 0xfd, 0x9b, 0x61, 0x37, 0xba, 0x01, 0xe5, 0x80, 0x99, 0x8c, 0xec, 0x8f, 0x1c, 0xa1, 0xbc,
0x50, 0x5e, 0x51, 0xf0, 0xb2, 0xe6, 0x72, 0xed, 0xef, 0x02, 0xd8, 0x16, 0x19, 0x52, 0x4f, 0x40, 0xac, 0xe0, 0x25, 0xcd, 0xe5, 0xda, 0xdf, 0x06, 0xb0, 0x4c, 0x32, 0xa4, 0xae, 0x80, 0x2c, 0x28,
0x16, 0x14, 0xa4, 0x24, 0x79, 0x1c, 0x80, 0x20, 0xf3, 0x43, 0xba, 0x5f, 0x5b, 0x54, 0x3d, 0x9c, 0x48, 0x51, 0xf2, 0x38, 0x00, 0x41, 0xfa, 0x47, 0x74, 0xaf, 0xba, 0xa8, 0x7a, 0x38, 0x81, 0xae,
0x40, 0x57, 0x20, 0xcf, 0x75, 0x8c, 0xc2, 0x5a, 0x56, 0x4c, 0x57, 0x51, 0x7c, 0x15, 0x2c, 0xdb, 0x40, 0x8e, 0xeb, 0x18, 0x05, 0xd5, 0x8c, 0x98, 0xae, 0xa2, 0xf8, 0x2a, 0x98, 0x96, 0x45, 0xac,
0x26, 0x76, 0x2d, 0x77, 0xcd, 0x58, 0x29, 0x62, 0x49, 0xa0, 0x4d, 0x58, 0x0a, 0x1d, 0xaf, 0x4f, 0x6a, 0xf6, 0x5a, 0x72, 0xa5, 0x80, 0x25, 0x81, 0x36, 0x61, 0x29, 0xb0, 0xdd, 0x3e, 0x79, 0x66,
0x9e, 0x59, 0x21, 0xc3, 0xc4, 0xa7, 0x01, 0xab, 0xe5, 0xc5, 0xe6, 0xbd, 0xd9, 0x90, 0xe7, 0xb1, 0x06, 0x0c, 0x13, 0x8f, 0xfa, 0xac, 0x9a, 0x13, 0x9b, 0xf7, 0x7a, 0x5d, 0x9e, 0xc7, 0xba, 0x3e,
0xa1, 0xcf, 0x63, 0x63, 0x4b, 0x9d, 0x47, 0x7c, 0x52, 0x02, 0xad, 0xc1, 0xe5, 0xc9, 0xcc, 0x77, 0x8f, 0xf5, 0x2d, 0x75, 0x1e, 0xf1, 0x49, 0x09, 0xb4, 0x06, 0x97, 0x27, 0x33, 0xdf, 0x09, 0xdd,
0x23, 0x37, 0x29, 0x88, 0xf1, 0x67, 0x75, 0x21, 0x13, 0x2a, 0x8a, 0xdd, 0x76, 0x2d, 0x8f, 0xd4, 0x24, 0x2f, 0xc6, 0x9f, 0xd5, 0x85, 0x0c, 0x28, 0x2b, 0x76, 0xdb, 0x31, 0x5d, 0x52, 0x2d, 0x08,
0x8a, 0xc2, 0xa6, 0x04, 0x0f, 0xdd, 0x83, 0xfc, 0xc8, 0x67, 0xce, 0x90, 0xd4, 0x4a, 0x67, 0x59, 0x9b, 0x62, 0x3c, 0x74, 0x0f, 0x72, 0x23, 0x8f, 0xd9, 0x43, 0x52, 0x2d, 0x9e, 0x65, 0x91, 0x02,
0xa4, 0x80, 0xe8, 0x2a, 0x80, 0x1f, 0xd0, 0x2f, 0xc7, 0x98, 0x58, 0xf6, 0xb8, 0xb6, 0x24, 0x94, 0xa2, 0xab, 0x00, 0x9e, 0x4f, 0x3f, 0x1f, 0x63, 0x62, 0x5a, 0xe3, 0xea, 0x92, 0x50, 0x1a, 0xe1,
0xc6, 0x38, 0x7c, 0x58, 0x41, 0xe9, 0xe3, 0x5b, 0x15, 0x16, 0x26, 0x78, 0x68, 0x05, 0x96, 0x02, 0xf0, 0x61, 0x05, 0xa5, 0x8f, 0x6f, 0x45, 0x58, 0x18, 0xe3, 0xa1, 0x15, 0x58, 0xf2, 0x95, 0x9b,
0xe5, 0xa6, 0x1a, 0x76, 0x49, 0xc0, 0x4e, 0xb2, 0x9b, 0x05, 0xc8, 0xd1, 0x63, 0x8f, 0x04, 0xe6, 0x6a, 0xd8, 0x25, 0x01, 0x3b, 0xc9, 0x6e, 0xe4, 0x21, 0x4b, 0x8f, 0x5d, 0xe2, 0x1b, 0xbf, 0x4e,
0xaf, 0xd2, 0x00, 0x5d, 0xcb, 0xd7, 0x67, 0x05, 0x41, 0xc6, 0xa7, 0xb6, 0x74, 0x41, 0xbe, 0x2b, 0x01, 0x74, 0x4d, 0x4f, 0x9f, 0x15, 0x04, 0x69, 0x8f, 0x5a, 0xd2, 0x05, 0xf9, 0xae, 0x78, 0xd4,
0x3e, 0xb5, 0x4f, 0x78, 0x5b, 0x7a, 0x86, 0xb7, 0x5d, 0x81, 0xfc, 0xd0, 0xfa, 0x12, 0xfb, 0xa1, 0x3a, 0xe1, 0x6d, 0xa9, 0x19, 0xde, 0x76, 0x05, 0x72, 0x43, 0xf3, 0x73, 0xec, 0x05, 0xc2, 0x17,
0xf0, 0xc5, 0x34, 0x56, 0x14, 0xe7, 0x33, 0xda, 0xe6, 0x1b, 0xc3, 0xf7, 0x73, 0x01, 0x2b, 0x8a, 0x53, 0x58, 0x51, 0x9c, 0xcf, 0x68, 0x9b, 0x6f, 0x0c, 0xdf, 0xcf, 0x05, 0xac, 0x28, 0xee, 0xe9,
0x7b, 0x3a, 0xa3, 0x3b, 0x6d, 0xb1, 0x9d, 0x25, 0x2c, 0xda, 0xa8, 0x0e, 0xc5, 0x83, 0x80, 0x0e, 0x8c, 0xb6, 0xda, 0x62, 0x3b, 0x8b, 0x58, 0xb4, 0x51, 0x0d, 0x0a, 0xfb, 0x3e, 0x1d, 0xb6, 0xf5,
0xdb, 0x7a, 0x1b, 0x17, 0x70, 0x44, 0x73, 0x3d, 0xbc, 0xbd, 0xd3, 0x56, 0xfb, 0xa2, 0x28, 0xe1, 0x36, 0x2e, 0xe0, 0x90, 0xe6, 0x7a, 0x78, 0xbb, 0xd5, 0x56, 0xfb, 0xa2, 0x28, 0xe1, 0x2f, 0xfd,
0x2f, 0xfd, 0x43, 0x32, 0x94, 0x9b, 0xc0, 0xfd, 0x45, 0x50, 0xc2, 0x1e, 0xc2, 0x0e, 0xa9, 0x2d, 0x03, 0x32, 0x94, 0x9b, 0xc0, 0xfd, 0x45, 0x50, 0xc2, 0x1e, 0xc2, 0x0e, 0xa8, 0x25, 0x96, 0xbf,
0x96, 0xbf, 0x84, 0x15, 0xc5, 0x43, 0x87, 0x35, 0x62, 0x87, 0x34, 0x70, 0xd8, 0x58, 0x9e, 0x09, 0x88, 0x15, 0xc5, 0x43, 0x87, 0x39, 0x62, 0x07, 0xd4, 0xb7, 0xd9, 0x58, 0x9e, 0x09, 0x3c, 0x61,
0x3c, 0x61, 0x70, 0xab, 0x7c, 0x8b, 0x1d, 0x4a, 0xf7, 0xc7, 0xa2, 0xfd, 0x61, 0xba, 0x66, 0x34, 0x70, 0xab, 0x3c, 0x93, 0x1d, 0x48, 0xf7, 0xc7, 0xa2, 0xfd, 0x7e, 0xaa, 0x9a, 0x6c, 0x14, 0x20,
0x8b, 0x90, 0x67, 0x56, 0x30, 0x20, 0xcc, 0xfc, 0x6b, 0x0e, 0x96, 0xbb, 0x96, 0xdf, 0x1c, 0xeb, 0xc7, 0x4c, 0x7f, 0x40, 0x98, 0xf1, 0x8f, 0x2c, 0x2c, 0x77, 0x4d, 0xaf, 0x31, 0xd6, 0xc1, 0x40,
0x60, 0xa0, 0x97, 0xed, 0x43, 0x0d, 0x11, 0x2b, 0x77, 0xbe, 0xf0, 0xa1, 0x24, 0xd0, 0x06, 0xe4, 0x2f, 0xdb, 0xfb, 0x1a, 0x22, 0x56, 0xee, 0x7c, 0xe1, 0x43, 0x49, 0xa0, 0x0d, 0xc8, 0x0e, 0x4d,
0x86, 0x16, 0xeb, 0x1f, 0xaa, 0xc8, 0x73, 0x77, 0x4a, 0x74, 0xd6, 0x88, 0x8d, 0xe7, 0x5c, 0x04, 0xd6, 0x3f, 0x50, 0x91, 0xe7, 0xee, 0x94, 0xe8, 0xac, 0x11, 0xeb, 0xcf, 0xb9, 0x08, 0x96, 0x92,
0x4b, 0xc9, 0x79, 0xeb, 0x5f, 0xff, 0x6d, 0x16, 0x72, 0x02, 0x88, 0x36, 0x21, 0x63, 0xb9, 0xae, 0xf3, 0xd6, 0xbf, 0xf6, 0xbb, 0x0c, 0x64, 0x05, 0x10, 0x6d, 0x42, 0xda, 0x74, 0x1c, 0x65, 0xdd,
0xb2, 0x6e, 0xf5, 0x02, 0x43, 0x34, 0x3a, 0xe4, 0x25, 0x77, 0x04, 0xcb, 0x75, 0x85, 0x12, 0x6f, 0xea, 0x05, 0x86, 0xa8, 0x77, 0xc8, 0x4b, 0xee, 0x08, 0xa6, 0xe3, 0x08, 0x25, 0xee, 0x58, 0xd9,
0xac, 0xec, 0x7c, 0x2d, 0x25, 0xde, 0x18, 0xfd, 0x3f, 0x64, 0x3c, 0x2a, 0x83, 0xd6, 0xc5, 0x26, 0xf9, 0x4a, 0x4a, 0xdc, 0x31, 0xfa, 0x36, 0xa4, 0x5d, 0x2a, 0x83, 0xd6, 0xc5, 0x26, 0xcb, 0x15,
0xcb, 0x15, 0x78, 0x94, 0xa1, 0x6d, 0xa8, 0xd8, 0x24, 0x64, 0x8e, 0x27, 0xce, 0x8f, 0x0c, 0x15, 0xb8, 0x94, 0xa1, 0x6d, 0x28, 0x5b, 0x24, 0x60, 0xb6, 0x2b, 0xce, 0x8f, 0x0c, 0x15, 0xe7, 0x5a,
0xe7, 0x5a, 0xf1, 0xed, 0x14, 0x4e, 0x48, 0xa2, 0x4f, 0x20, 0x7b, 0xc8, 0x98, 0x2f, 0xdc, 0xb0, 0xf1, 0xed, 0x04, 0x8e, 0x49, 0xa2, 0x8f, 0x20, 0x73, 0xc0, 0x98, 0x27, 0xdc, 0xb0, 0xb4, 0xbe,
0xbc, 0xbe, 0x76, 0x91, 0x09, 0x6d, 0x33, 0xe6, 0x6f, 0xa7, 0xb0, 0x90, 0xaf, 0x3f, 0x83, 0x4c, 0x76, 0x91, 0x09, 0x6d, 0x33, 0xe6, 0x6d, 0x27, 0xb0, 0x90, 0xaf, 0x3d, 0x83, 0x74, 0x87, 0xbc,
0x87, 0xbc, 0x44, 0x2d, 0x28, 0x88, 0xed, 0x88, 0x92, 0xdd, 0x85, 0xb6, 0x52, 0xcb, 0xd6, 0xc7, 0x44, 0x4d, 0xc8, 0x8b, 0xed, 0x08, 0x93, 0xdd, 0x85, 0xb6, 0x52, 0xcb, 0xd6, 0xc6, 0x90, 0xe1,
0x90, 0xe5, 0xda, 0x51, 0x2d, 0x72, 0x6e, 0x7d, 0x1a, 0xb5, 0x7b, 0xd7, 0x22, 0xf7, 0xd6, 0x87, 0xda, 0x51, 0x35, 0x74, 0x6e, 0x7d, 0x1a, 0xb5, 0x7b, 0x57, 0x43, 0xf7, 0xd6, 0x87, 0x51, 0x3b,
0x51, 0x3b, 0xf8, 0xd5, 0xb8, 0x83, 0xeb, 0xbc, 0x10, 0x73, 0xf1, 0x65, 0xe5, 0xe2, 0x59, 0xd5, 0xf8, 0xd5, 0xa8, 0x83, 0xeb, 0xbc, 0x10, 0x71, 0xf1, 0x65, 0xe5, 0xe2, 0x19, 0xd5, 0x25, 0x28,
0x25, 0x28, 0x1e, 0x0c, 0xc4, 0xe0, 0x51, 0xc3, 0xfc, 0xbb, 0x01, 0xc0, 0x8d, 0x78, 0x2e, 0xd5, 0x1e, 0x0c, 0xc4, 0xe0, 0x61, 0xc3, 0xf8, 0x57, 0x12, 0x80, 0x1b, 0xf1, 0x5c, 0xaa, 0xdd, 0x06,
0x6e, 0x03, 0x04, 0x64, 0xe0, 0x84, 0x8c, 0x04, 0x44, 0x06, 0x87, 0xc5, 0xf5, 0xdb, 0x53, 0x93, 0xf0, 0xc9, 0xc0, 0x0e, 0x18, 0xf1, 0x89, 0x0c, 0x0e, 0x8b, 0xeb, 0xb7, 0xa7, 0x26, 0x37, 0x11,
0x9b, 0x08, 0x34, 0x70, 0x84, 0x96, 0x49, 0x47, 0x53, 0xe8, 0x26, 0x54, 0x46, 0x5e, 0x4c, 0x97, 0xa8, 0xe3, 0x10, 0x2d, 0x93, 0x8e, 0xa6, 0xd0, 0x4d, 0x28, 0x8f, 0xdc, 0x88, 0x2e, 0x3d, 0x81,
0x9e, 0x40, 0x82, 0x6b, 0x7a, 0x00, 0x13, 0x0d, 0xa8, 0x00, 0x99, 0xa7, 0xad, 0x6e, 0x35, 0x85, 0x18, 0xd7, 0x70, 0x01, 0x26, 0x1a, 0x50, 0x1e, 0xd2, 0x4f, 0x9b, 0xdd, 0x4a, 0x02, 0x15, 0x20,
0x8a, 0x90, 0x6d, 0xef, 0x75, 0xba, 0x55, 0x83, 0xb3, 0xda, 0x2f, 0xba, 0xd5, 0x34, 0x02, 0xc8, 0xd3, 0xde, 0xed, 0x74, 0x2b, 0x49, 0xce, 0x6a, 0xbf, 0xe8, 0x56, 0x52, 0x08, 0x20, 0xb7, 0xd5,
0x6f, 0xb5, 0x9e, 0xb5, 0xba, 0xad, 0x6a, 0x06, 0x95, 0x20, 0xd7, 0xde, 0xe8, 0x6e, 0x6e, 0x57, 0x7c, 0xd6, 0xec, 0x36, 0x2b, 0x69, 0x54, 0x84, 0x6c, 0x7b, 0xa3, 0xbb, 0xb9, 0x5d, 0xc9, 0xa0,
0xb3, 0xa8, 0x0c, 0x85, 0xbd, 0x76, 0x77, 0x67, 0x6f, 0xb7, 0x53, 0xcd, 0x71, 0x62, 0x73, 0x6f, 0x12, 0xe4, 0x77, 0xdb, 0xdd, 0xd6, 0xee, 0x4e, 0xa7, 0x92, 0xe5, 0xc4, 0xe6, 0xee, 0xce, 0x4e,
0x77, 0xb7, 0xb5, 0xd9, 0xad, 0xe6, 0xb9, 0x8e, 0xed, 0xd6, 0xc6, 0x56, 0xb5, 0xc0, 0xe1, 0x5d, 0x73, 0xb3, 0x5b, 0xc9, 0x71, 0x1d, 0xdb, 0xcd, 0x8d, 0xad, 0x4a, 0x9e, 0xc3, 0xbb, 0x78, 0x63,
0xbc, 0xb1, 0xd9, 0xaa, 0x16, 0x9b, 0x79, 0xc8, 0xb2, 0xb1, 0x4f, 0xcc, 0x9f, 0x1b, 0x90, 0xef, 0xb3, 0x59, 0x29, 0x34, 0x72, 0x90, 0x61, 0x63, 0x8f, 0x18, 0xbf, 0x48, 0x42, 0xae, 0x23, 0xd7,
0xc8, 0x35, 0xde, 0x9a, 0x31, 0xe5, 0x69, 0x1f, 0x93, 0xe0, 0x6f, 0x3b, 0xdd, 0xeb, 0x89, 0xe9, 0x78, 0x6b, 0xc6, 0x94, 0xa7, 0x7d, 0x4c, 0x82, 0xbf, 0xea, 0x74, 0xaf, 0xc7, 0xa6, 0xcb, 0x2d,
0x72, 0x0b, 0xbb, 0xdd, 0x76, 0x35, 0xc5, 0x2d, 0xe4, 0xad, 0x4e, 0xd5, 0x88, 0x2c, 0xec, 0x42, 0xec, 0x76, 0xdb, 0x95, 0x04, 0xb7, 0x90, 0xb7, 0x3a, 0x95, 0x64, 0x68, 0x61, 0x17, 0x8a, 0xad,
0x69, 0xa7, 0xbd, 0x61, 0xdb, 0x01, 0x09, 0x79, 0x5a, 0xcc, 0x3a, 0xfe, 0xab, 0xf7, 0x85, 0x75, 0xf6, 0x86, 0x65, 0xf9, 0x24, 0xe0, 0x69, 0x31, 0x63, 0x7b, 0x47, 0xef, 0x0a, 0xeb, 0xf2, 0x7c,
0x05, 0xbe, 0x9b, 0x9c, 0x42, 0x77, 0x05, 0xf7, 0xa1, 0x3a, 0xa6, 0x6f, 0x4c, 0xd9, 0xbc, 0xd3, 0x37, 0x39, 0x85, 0xee, 0x0a, 0xee, 0x43, 0x75, 0x4c, 0x5f, 0x9b, 0xb2, 0xb9, 0xd5, 0x3e, 0x7a,
0x7e, 0xf5, 0x50, 0x81, 0x1f, 0x36, 0xb3, 0x90, 0x76, 0x7c, 0x73, 0x0d, 0xb2, 0x9c, 0xcb, 0xf3, 0xa8, 0xc0, 0x0f, 0x1b, 0x19, 0x48, 0xd9, 0x9e, 0xb1, 0x06, 0x19, 0xce, 0xe5, 0x79, 0x76, 0xdf,
0xec, 0x81, 0x13, 0x84, 0x32, 0x8a, 0xe5, 0xb1, 0x24, 0x78, 0x5c, 0x74, 0xad, 0x50, 0x46, 0xfe, 0xf6, 0x03, 0x19, 0xc5, 0x72, 0x58, 0x12, 0x3c, 0x2e, 0x3a, 0x66, 0x20, 0x23, 0x7f, 0x0e, 0x8b,
0x3c, 0x16, 0x6d, 0xf3, 0x19, 0x40, 0xb7, 0xef, 0x6b, 0x43, 0xee, 0x70, 0x2d, 0x2a, 0xb8, 0xd4, 0xb6, 0xf1, 0x0c, 0xa0, 0xdb, 0xf7, 0xb4, 0x21, 0x77, 0xb8, 0x16, 0x15, 0x5c, 0x6a, 0x33, 0x06,
0x67, 0x0c, 0xa8, 0x70, 0x38, 0xed, 0xf8, 0x22, 0xca, 0xf2, 0x18, 0x9f, 0x16, 0x31, 0x5e, 0xb4, 0x54, 0x38, 0x9c, 0xb2, 0x3d, 0x11, 0x65, 0x79, 0x8c, 0x4f, 0x89, 0x18, 0x2f, 0xda, 0x86, 0x05,
0x4d, 0x1b, 0x32, 0x2d, 0xca, 0xd5, 0x54, 0x07, 0x81, 0xdf, 0xef, 0xc9, 0xac, 0xdf, 0xeb, 0x53, 0xe9, 0x26, 0xe5, 0x6a, 0x2a, 0x03, 0xdf, 0xeb, 0xf7, 0x64, 0xd6, 0xef, 0xf5, 0xa9, 0x25, 0x7d,
0x5b, 0xfa, 0xfe, 0xc2, 0x76, 0x0a, 0x2f, 0xf2, 0x9e, 0x8e, 0xe8, 0xd8, 0xa4, 0x36, 0xe1, 0xd8, 0x7f, 0x61, 0x3b, 0x81, 0x17, 0x79, 0x4f, 0x47, 0x74, 0x6c, 0x52, 0x8b, 0x70, 0xac, 0x4f, 0x02,
0x80, 0x84, 0x84, 0xf5, 0x48, 0x10, 0xd0, 0x40, 0x62, 0xd3, 0x1a, 0x2b, 0x7a, 0x5a, 0xbc, 0x83, 0xc2, 0x7a, 0xc4, 0xf7, 0xa9, 0x2f, 0xb1, 0x29, 0x8d, 0x15, 0x3d, 0x4d, 0xde, 0xc1, 0xb1, 0x8d,
0x63, 0x9b, 0x39, 0xc8, 0x10, 0xcf, 0x36, 0xff, 0xb0, 0x08, 0xc5, 0xae, 0xe5, 0xb7, 0x5e, 0xf1, 0x2c, 0xa4, 0x89, 0x6b, 0x19, 0x7f, 0x5e, 0x84, 0x42, 0xd7, 0xf4, 0x9a, 0x47, 0x3c, 0x65, 0xdd,
0x94, 0x75, 0x1f, 0xf2, 0xf2, 0x14, 0x2a, 0xb3, 0xdf, 0x9a, 0x3e, 0xab, 0xd1, 0xfc, 0xb0, 0x82, 0x87, 0x9c, 0x3c, 0x85, 0xca, 0xec, 0x37, 0xa6, 0xcf, 0x6a, 0x38, 0x3f, 0xac, 0xa0, 0xe8, 0x29,
0xa2, 0xa7, 0x50, 0x96, 0xad, 0xde, 0x90, 0x30, 0x4b, 0xc5, 0x8d, 0xdb, 0xb3, 0x4e, 0xb9, 0x18, 0x94, 0x64, 0xab, 0x37, 0x24, 0xcc, 0x54, 0x71, 0xe3, 0xf6, 0xac, 0x53, 0x2e, 0x06, 0xa9, 0x37,
0xa4, 0xd1, 0xf2, 0x6c, 0x9f, 0x3a, 0x1e, 0x7b, 0x4e, 0x98, 0x85, 0x41, 0x8a, 0xf2, 0x36, 0xfa, 0x5d, 0xcb, 0xa3, 0xb6, 0xcb, 0x9e, 0x13, 0x66, 0x62, 0x90, 0xa2, 0xbc, 0x8d, 0x3e, 0x84, 0x52,
0x18, 0xca, 0xb1, 0x48, 0xa4, 0xb6, 0xea, 0x54, 0x13, 0xe2, 0x78, 0xf4, 0x29, 0x54, 0x63, 0xa4, 0x24, 0x12, 0xa9, 0xad, 0x3a, 0xd5, 0x84, 0x28, 0x1e, 0x7d, 0x0c, 0x95, 0x08, 0x29, 0x8d, 0xc9,
0x34, 0x26, 0x7b, 0x21, 0x63, 0x96, 0x62, 0xf2, 0xc2, 0xa2, 0x26, 0x40, 0x40, 0x47, 0x4c, 0xcd, 0x5c, 0xc8, 0x98, 0xa5, 0x88, 0xbc, 0xb0, 0xa8, 0x01, 0xe0, 0xd3, 0x11, 0x53, 0x33, 0xcb, 0x0b,
0xac, 0x20, 0x94, 0xdd, 0x98, 0xaf, 0x0c, 0x73, 0xac, 0xd0, 0x54, 0x0a, 0x74, 0x13, 0x7d, 0x0a, 0x65, 0x37, 0xe6, 0x2b, 0xc3, 0x1c, 0x2b, 0x34, 0x15, 0x7d, 0xdd, 0x44, 0x1f, 0xc3, 0x92, 0x28,
0x4b, 0xa2, 0x1c, 0xe9, 0xd9, 0x4e, 0x20, 0x43, 0xae, 0xc8, 0xe4, 0x8b, 0xeb, 0x2b, 0xf3, 0x15, 0x47, 0x7a, 0x96, 0xed, 0xcb, 0x90, 0x2b, 0x32, 0xf9, 0xe2, 0xfa, 0xca, 0x7c, 0x45, 0x6d, 0x2e,
0xb5, 0xb9, 0xc0, 0x96, 0xc6, 0xe3, 0x45, 0x3f, 0x41, 0xa3, 0xf7, 0x55, 0x88, 0x96, 0xe9, 0xe2, 0xb0, 0xa5, 0xf1, 0x78, 0xd1, 0x8b, 0xd1, 0xe8, 0x5d, 0x15, 0xa2, 0x65, 0xba, 0xb8, 0x3a, 0x5f,
0xea, 0x7c, 0x3d, 0x89, 0x80, 0xfc, 0x33, 0x03, 0x2a, 0xf1, 0xe9, 0xa2, 0xef, 0x42, 0xde, 0xb5, 0x4f, 0x2c, 0x20, 0xff, 0x3c, 0x09, 0xe5, 0xe8, 0x74, 0xd1, 0x77, 0x21, 0xe7, 0x98, 0x7b, 0xc4,
0xf6, 0x89, 0xab, 0x23, 0xf3, 0xfa, 0xf9, 0x96, 0xa9, 0xf1, 0x4c, 0x08, 0xb5, 0x3c, 0x16, 0x8c, 0xd1, 0x91, 0x79, 0xfd, 0x7c, 0xcb, 0x54, 0x7f, 0x26, 0x84, 0x9a, 0x2e, 0xf3, 0xc7, 0x58, 0x69,
0xb1, 0xd2, 0x50, 0x7f, 0x0c, 0xe5, 0x18, 0x1b, 0x55, 0x21, 0x73, 0x44, 0xc6, 0xaa, 0x68, 0xe7, 0xa8, 0x3d, 0x86, 0x52, 0x84, 0x8d, 0x2a, 0x90, 0x3e, 0x24, 0x63, 0x55, 0xb4, 0xf3, 0x26, 0x3f,
0x4d, 0x7e, 0x8a, 0x5e, 0x59, 0xee, 0x48, 0x5f, 0x4e, 0x24, 0xf1, 0x61, 0xfa, 0x91, 0x51, 0xff, 0x45, 0x47, 0xa6, 0x33, 0xd2, 0x97, 0x13, 0x49, 0xbc, 0x9f, 0x7a, 0x94, 0xac, 0xfd, 0x2c, 0x09,
0xa9, 0x01, 0xa5, 0x68, 0xe5, 0xd0, 0xd3, 0x13, 0x46, 0xad, 0x9e, 0x63, 0xb9, 0xff, 0xd5, 0x16, 0xc5, 0x70, 0xe5, 0xd0, 0xd3, 0x13, 0x46, 0xad, 0x9e, 0x63, 0xb9, 0xff, 0xdb, 0x16, 0x7d, 0x99,
0x7d, 0x53, 0x50, 0xd9, 0x66, 0x0f, 0x2a, 0x81, 0xcc, 0x47, 0x3d, 0xc7, 0x73, 0x74, 0x1d, 0x73, 0x57, 0xd9, 0x66, 0x17, 0xca, 0xbe, 0xcc, 0x47, 0x3d, 0xdb, 0xb5, 0x75, 0x1d, 0x73, 0xe7, 0xf4,
0xe7, 0xf4, 0x05, 0x6f, 0xa8, 0x14, 0xb6, 0xe3, 0x39, 0x8c, 0x5f, 0x00, 0x82, 0x09, 0x89, 0x30, 0x05, 0xaf, 0xab, 0x14, 0xd6, 0x72, 0x6d, 0xc6, 0x2f, 0x00, 0xfe, 0x84, 0x44, 0x18, 0x16, 0x7c,
0x2c, 0x04, 0xea, 0x2e, 0x24, 0x35, 0x9e, 0x52, 0xde, 0x24, 0x34, 0x4a, 0x19, 0xa5, 0xb2, 0x12, 0x75, 0x17, 0x92, 0x1a, 0x4f, 0x29, 0x6f, 0x62, 0x1a, 0xa5, 0x8c, 0x52, 0x59, 0xf6, 0x23, 0xb4,
0xc4, 0x68, 0x69, 0xa4, 0xd2, 0x49, 0x3c, 0x5b, 0x79, 0xc5, 0x9d, 0x73, 0xaa, 0x6c, 0x79, 0xb6, 0x34, 0x52, 0xe9, 0x24, 0xae, 0xa5, 0xbc, 0xe2, 0xce, 0x39, 0x55, 0x36, 0x5d, 0x4b, 0x1a, 0x19,
0x34, 0x32, 0x22, 0xeb, 0x0f, 0xa1, 0xd8, 0x61, 0x01, 0xb1, 0x86, 0x3b, 0xe2, 0xfa, 0xb5, 0x6f, 0x92, 0xb5, 0x87, 0x50, 0xe8, 0x30, 0x9f, 0x98, 0xc3, 0x96, 0xb8, 0x7e, 0xed, 0x99, 0x81, 0x8a,
0x85, 0x2a, 0xe2, 0x60, 0xd1, 0x96, 0x17, 0x12, 0xde, 0x2f, 0xac, 0xcf, 0x62, 0x45, 0xd5, 0xff, 0x38, 0x58, 0xb4, 0xe5, 0x85, 0x84, 0xf7, 0x0b, 0xeb, 0x33, 0x58, 0x51, 0xb5, 0xbf, 0x25, 0xa1,
0x6c, 0x40, 0x39, 0x36, 0x77, 0xf4, 0x01, 0xa4, 0x1d, 0x5b, 0xad, 0xd9, 0x7b, 0x67, 0x98, 0xa3, 0x14, 0x99, 0x3b, 0x7a, 0x0f, 0x52, 0xb6, 0xa5, 0xd6, 0xec, 0x9d, 0x33, 0xcc, 0xd1, 0x03, 0xe2,
0x07, 0xc4, 0x69, 0xc7, 0xe6, 0x61, 0x28, 0x96, 0xca, 0x67, 0xc5, 0x80, 0x49, 0x56, 0x8d, 0xb2, 0x94, 0x6d, 0xf1, 0x30, 0x14, 0x49, 0xe5, 0xb3, 0x62, 0xc0, 0x24, 0xab, 0x86, 0x59, 0x7e, 0x35,
0xfc, 0x6a, 0x54, 0x19, 0xc8, 0x05, 0xf8, 0xaf, 0x39, 0x79, 0x29, 0x2a, 0x18, 0x12, 0x75, 0x6f, 0xac, 0x0c, 0xe4, 0x02, 0x7c, 0x6d, 0x4e, 0x5e, 0x0a, 0x0b, 0x86, 0x58, 0xdd, 0x9b, 0x99, 0x57,
0x76, 0x5e, 0xdd, 0x9b, 0x9b, 0xd4, 0xbd, 0xf5, 0xdf, 0x18, 0x50, 0x89, 0x6f, 0xc5, 0xeb, 0xcf, 0xf7, 0x66, 0x27, 0x75, 0x6f, 0xed, 0xb7, 0x49, 0x28, 0x47, 0xb7, 0xe2, 0xd5, 0x67, 0xf8, 0x14,
0xf0, 0x29, 0x20, 0x71, 0xe7, 0xea, 0x25, 0xdc, 0x2b, 0x7d, 0xd6, 0xb5, 0xa8, 0x2a, 0x84, 0xe2, 0x90, 0xb8, 0x73, 0xf5, 0x62, 0xee, 0x95, 0x3a, 0xeb, 0x5a, 0x54, 0x11, 0x42, 0xd1, 0x35, 0x7e,
0x6b, 0xfc, 0x2e, 0x94, 0xf9, 0xe1, 0x56, 0xd9, 0x41, 0x4c, 0x7d, 0x01, 0x03, 0x67, 0xc9, 0xb4, 0x1b, 0x4a, 0xfc, 0x70, 0xab, 0xec, 0x20, 0xa6, 0xbe, 0x80, 0x81, 0xb3, 0x64, 0x5a, 0xa8, 0xfd,
0x50, 0xff, 0x65, 0x9a, 0x6f, 0x4a, 0xb4, 0xb9, 0xff, 0x06, 0x26, 0xef, 0xc0, 0x65, 0xad, 0x28, 0x2a, 0xc5, 0x37, 0x25, 0xdc, 0xdc, 0xff, 0x01, 0x93, 0x5b, 0x70, 0x59, 0x2b, 0x8a, 0x9e, 0x84,
0x7e, 0x12, 0x32, 0x67, 0x69, 0xba, 0xa4, 0x34, 0xc5, 0xd6, 0xff, 0x16, 0x2c, 0x46, 0x4a, 0xf6, 0xf4, 0x59, 0x9a, 0x2e, 0x29, 0x4d, 0x91, 0xf5, 0xbf, 0x05, 0x8b, 0xa1, 0x92, 0xbd, 0x31, 0x23,
0xc7, 0x8c, 0xc8, 0xba, 0x37, 0x8b, 0xa3, 0x43, 0xd6, 0xe4, 0x4c, 0x74, 0x1b, 0x32, 0x84, 0x86, 0xb2, 0xee, 0xcd, 0xe0, 0xf0, 0x90, 0x35, 0x38, 0x13, 0xdd, 0x86, 0x34, 0xa1, 0x81, 0xca, 0x4c,
0x2a, 0x33, 0x4d, 0x3f, 0x3a, 0xb4, 0x68, 0x88, 0x39, 0x80, 0x57, 0x7a, 0x84, 0xcf, 0xde, 0x7c, 0xd3, 0x8f, 0x0e, 0x4d, 0x1a, 0x60, 0x0e, 0xe0, 0x95, 0x1e, 0xe1, 0xb3, 0x37, 0x1e, 0xc1, 0x62,
0x04, 0x8b, 0xc9, 0x10, 0xcc, 0xcb, 0xa5, 0x17, 0xbb, 0xdf, 0xdb, 0xdd, 0xfb, 0x6c, 0xb7, 0x9a, 0x3c, 0x04, 0xf3, 0x72, 0xe9, 0xc5, 0xce, 0xf7, 0x76, 0x76, 0x3f, 0xd9, 0xa9, 0x24, 0x38, 0xd1,
0xe2, 0xc4, 0xce, 0x6e, 0x73, 0xef, 0xc5, 0xee, 0x56, 0xd5, 0x40, 0x15, 0x28, 0xee, 0xbd, 0xe8, 0xda, 0x69, 0xec, 0xbe, 0xd8, 0xd9, 0xaa, 0x24, 0x51, 0x19, 0x0a, 0xbb, 0x2f, 0xba, 0x92, 0x4a,
0x4a, 0x2a, 0x3d, 0x51, 0x71, 0x0d, 0x8a, 0x1b, 0xbe, 0x23, 0xd2, 0x2d, 0x8f, 0x34, 0x22, 0x21, 0x4d, 0x54, 0x5c, 0x83, 0xc2, 0x86, 0x67, 0x8b, 0x74, 0xcb, 0x23, 0x8d, 0x48, 0xc8, 0x2a, 0xfa,
0xab, 0xe8, 0x23, 0x09, 0x7e, 0xc9, 0x2c, 0xb5, 0xa9, 0x2d, 0x20, 0x21, 0x7a, 0x02, 0x79, 0xc1, 0x48, 0x82, 0x5f, 0x32, 0x8b, 0x6d, 0x6a, 0x09, 0x48, 0x80, 0x9e, 0x40, 0x4e, 0xb0, 0x75, 0xdc,
0xd6, 0x71, 0xef, 0xc6, 0xac, 0xb7, 0x11, 0x89, 0x8d, 0x5a, 0x58, 0x89, 0xd4, 0xff, 0x62, 0x40, 0xbb, 0x31, 0xeb, 0x6d, 0x44, 0x62, 0xc3, 0x16, 0x56, 0x22, 0xb5, 0xbf, 0x27, 0xa1, 0xa0, 0x99,
0x51, 0x33, 0x11, 0x86, 0x12, 0xbf, 0x76, 0x5b, 0x8e, 0x47, 0x02, 0xb5, 0xd1, 0xeb, 0xe7, 0x50, 0x08, 0x43, 0x91, 0x5f, 0xbb, 0x4d, 0xdb, 0x25, 0xbe, 0xda, 0xe8, 0xf5, 0x73, 0x28, 0xab, 0x6f,
0xd6, 0xd8, 0xd4, 0x42, 0x82, 0xe4, 0x25, 0x72, 0xa4, 0xa6, 0xfe, 0x0a, 0x16, 0x93, 0xdd, 0xa8, 0x6a, 0x21, 0x41, 0xf2, 0x12, 0x39, 0x54, 0x53, 0x3b, 0x82, 0xc5, 0x78, 0x37, 0xaa, 0x42, 0x7e,
0x06, 0x85, 0x21, 0x09, 0x43, 0x6b, 0xa0, 0x9f, 0x66, 0x34, 0xc9, 0xcf, 0xd5, 0x64, 0x7c, 0xf5, 0x48, 0x82, 0xc0, 0x1c, 0xe8, 0xa7, 0x19, 0x4d, 0xf2, 0x73, 0x35, 0x19, 0x5f, 0x3d, 0x45, 0x85,
0x14, 0x15, 0x31, 0xf8, 0x5a, 0x38, 0x43, 0x2e, 0x25, 0x5f, 0xda, 0x24, 0xc1, 0x43, 0x4a, 0x40, 0x0c, 0xbe, 0x16, 0xf6, 0x90, 0x4b, 0xc9, 0x97, 0x36, 0x49, 0xf0, 0x90, 0xe2, 0x13, 0x33, 0xa0,
0xac, 0x90, 0x7a, 0xfa, 0x8d, 0x43, 0x52, 0x62, 0x39, 0xc5, 0x62, 0xb5, 0xa1, 0xa8, 0x6f, 0x08, 0xae, 0x7e, 0xe3, 0x90, 0x94, 0x58, 0x4e, 0xb1, 0x58, 0x6d, 0x28, 0xe8, 0x1b, 0xc2, 0xe9, 0xcf,
0xa7, 0x3f, 0xbb, 0x89, 0x6b, 0xf4, 0xd8, 0xd7, 0x51, 0x5d, 0xb4, 0xa3, 0x47, 0xa4, 0xcc, 0xe4, 0x6e, 0xe2, 0x1a, 0x3d, 0xf6, 0x74, 0x54, 0x17, 0xed, 0xf0, 0x11, 0x29, 0x3d, 0x79, 0x44, 0x32,
0x11, 0xc9, 0x7c, 0x09, 0x97, 0xa6, 0x2e, 0x43, 0xe8, 0x01, 0x14, 0xf5, 0xa3, 0x80, 0x5a, 0xba, 0x5e, 0xc2, 0xa5, 0xa9, 0xcb, 0x10, 0x7a, 0x00, 0x05, 0xfd, 0x28, 0xa0, 0x96, 0xee, 0xf5, 0xb9,
0x37, 0xe7, 0x5e, 0xa1, 0x70, 0x04, 0xe5, 0x7e, 0x28, 0xb2, 0x4e, 0x2f, 0xf1, 0x60, 0x56, 0xc2, 0x57, 0x28, 0x1c, 0x42, 0xb9, 0x1f, 0x8a, 0xac, 0xd3, 0x8b, 0x3d, 0x98, 0x15, 0xf1, 0x82, 0xe0,
0x0b, 0x82, 0xdb, 0xd1, 0x2f, 0x62, 0x5f, 0xc0, 0x82, 0x16, 0x96, 0x8b, 0xf8, 0x9a, 0xc3, 0x45, 0x76, 0xf4, 0x8b, 0xd8, 0x67, 0xb0, 0xa0, 0x85, 0xe5, 0x22, 0xbe, 0xe2, 0x70, 0xa1, 0x3f, 0xa5,
0xfe, 0x94, 0x8e, 0xfb, 0xd3, 0xd7, 0x69, 0x40, 0xfc, 0xd0, 0x77, 0x46, 0xc3, 0xa1, 0x15, 0x8c, 0xa2, 0xfe, 0xf4, 0x45, 0x0a, 0x10, 0x3f, 0xf4, 0x9d, 0xd1, 0x70, 0x68, 0xfa, 0x63, 0x7d, 0x0b,
0xf5, 0x2d, 0x3c, 0xfe, 0x8c, 0x67, 0x5c, 0xfc, 0x19, 0x8f, 0x47, 0x18, 0xe6, 0x0c, 0x49, 0xef, 0x8f, 0x3e, 0xe3, 0x25, 0x2f, 0xfe, 0x8c, 0xc7, 0x23, 0x0c, 0xb3, 0x87, 0xa4, 0x77, 0x6c, 0xbb,
0xd8, 0xf1, 0x6c, 0x7a, 0xac, 0x86, 0x04, 0xce, 0xfa, 0x4c, 0x70, 0xd0, 0xff, 0x40, 0xd6, 0xa3, 0x16, 0x3d, 0x56, 0x43, 0x02, 0x67, 0x7d, 0x22, 0x38, 0xe8, 0x1b, 0x90, 0x71, 0xa9, 0xab, 0xc3,
0x9e, 0x0e, 0xbb, 0x57, 0xa6, 0x8f, 0xd7, 0xd0, 0x67, 0x63, 0x5e, 0x85, 0x70, 0x14, 0xfa, 0x08, 0xee, 0x95, 0xe9, 0xe3, 0x35, 0xf4, 0xd8, 0x98, 0x57, 0x21, 0x1c, 0x85, 0x3e, 0x80, 0x12, 0xa3,
0xca, 0x8c, 0xf6, 0xa2, 0x59, 0x67, 0xcf, 0x98, 0x35, 0xbf, 0x3a, 0x30, 0x1a, 0x6d, 0xfd, 0x77, 0xbd, 0x70, 0xd6, 0x99, 0x33, 0x66, 0xcd, 0xaf, 0x0e, 0x8c, 0x86, 0x5b, 0xff, 0x1d, 0x58, 0xd8,
0x60, 0xe1, 0x20, 0xa0, 0xc3, 0x89, 0x7c, 0xee, 0x6c, 0xf9, 0x0a, 0x97, 0x88, 0x34, 0xbc, 0x03, 0xf7, 0xe9, 0x70, 0x22, 0x9f, 0x3d, 0x5b, 0xbe, 0xcc, 0x25, 0x42, 0x0d, 0x6f, 0x01, 0x04, 0x87,
0x10, 0x1e, 0x39, 0x32, 0x60, 0x86, 0xa2, 0x12, 0x2b, 0xe2, 0x12, 0xe7, 0xf0, 0xa5, 0x0b, 0xd1, 0xb6, 0x0c, 0x98, 0x81, 0xa8, 0xc4, 0x0a, 0xb8, 0xc8, 0x39, 0x7c, 0xe9, 0x02, 0xf4, 0x06, 0x14,
0x5b, 0x50, 0x62, 0x7d, 0xdd, 0x5b, 0x10, 0xbd, 0x45, 0xd6, 0x97, 0x9d, 0x4d, 0x80, 0x22, 0x1d, 0x59, 0x5f, 0xf7, 0xe6, 0x45, 0x6f, 0x81, 0xf5, 0x65, 0x67, 0x03, 0xa0, 0x40, 0x47, 0x6c, 0x8f,
0xb1, 0x7d, 0x3a, 0xf2, 0x6c, 0xf3, 0x8f, 0x06, 0x5c, 0x4e, 0xac, 0xb6, 0x7a, 0xe1, 0x7c, 0x0c, 0x8e, 0x5c, 0xcb, 0xf8, 0x4b, 0x12, 0x2e, 0xc7, 0x56, 0x5b, 0xbd, 0x70, 0x3e, 0x86, 0x14, 0x3d,
0x69, 0x7a, 0x34, 0x37, 0xbe, 0xce, 0x90, 0x68, 0xec, 0x1d, 0x6d, 0xa7, 0x70, 0x9a, 0x1e, 0xa1, 0x9c, 0x1b, 0x5f, 0x67, 0x48, 0xd4, 0x77, 0x0f, 0xb7, 0x13, 0x38, 0x45, 0x0f, 0xd1, 0xc3, 0xe8,
0x87, 0xf1, 0x6d, 0x9d, 0x55, 0xd7, 0x25, 0x9c, 0x67, 0x3b, 0xa5, 0x36, 0xbe, 0xbe, 0x01, 0xe9, 0xb6, 0xce, 0xaa, 0xeb, 0x62, 0xce, 0xb3, 0x9d, 0x50, 0x1b, 0x5f, 0xdb, 0x80, 0xd4, 0xee, 0x21,
0xbd, 0x23, 0xf4, 0x04, 0xc4, 0x53, 0x63, 0x8f, 0x59, 0xfb, 0x6e, 0x74, 0xd9, 0xae, 0xcf, 0xb4, 0x7a, 0x02, 0xe2, 0xa9, 0xb1, 0xc7, 0xcc, 0x3d, 0x27, 0xbc, 0x6c, 0xd7, 0x66, 0x5a, 0xd0, 0xe5,
0xa0, 0xcb, 0x21, 0x18, 0x42, 0xdd, 0x14, 0x33, 0xd3, 0x21, 0xd3, 0xfc, 0x75, 0x1a, 0xa0, 0x69, 0x10, 0x0c, 0x81, 0x6e, 0x8a, 0x99, 0xe9, 0x90, 0x69, 0xfc, 0x26, 0x05, 0xd0, 0x30, 0x03, 0xbb,
0x85, 0x4e, 0x5f, 0xae, 0xc8, 0x0d, 0x58, 0x08, 0x47, 0xfd, 0x3e, 0x09, 0xf9, 0xdd, 0x63, 0xe4, 0x2f, 0x57, 0xe4, 0x06, 0x2c, 0x04, 0xa3, 0x7e, 0x9f, 0x04, 0xfc, 0xee, 0x31, 0x72, 0x65, 0x11,
0xc9, 0x22, 0x28, 0x8b, 0x2b, 0x8a, 0xb9, 0xc9, 0x79, 0x1c, 0x74, 0x60, 0x39, 0xee, 0x28, 0x20, 0x94, 0xc1, 0x65, 0xc5, 0xdc, 0xe4, 0x3c, 0x0e, 0xda, 0x37, 0x6d, 0x67, 0xe4, 0x13, 0x05, 0x92,
0x0a, 0x24, 0x2b, 0x83, 0x8a, 0x62, 0x4a, 0xd0, 0x4d, 0x7e, 0x4a, 0x18, 0xf1, 0xfa, 0xe3, 0xde, 0x95, 0x41, 0x59, 0x31, 0x25, 0xe8, 0x26, 0x3f, 0x25, 0x8c, 0xb8, 0xfd, 0x71, 0x6f, 0x18, 0xf4,
0x30, 0xec, 0xf9, 0x0f, 0xd6, 0x84, 0xcb, 0x64, 0x71, 0x45, 0x71, 0x9f, 0x87, 0xed, 0x07, 0x6b, 0xbc, 0x07, 0x6b, 0xc2, 0x65, 0x32, 0xb8, 0xac, 0xb8, 0xcf, 0x83, 0xf6, 0x83, 0xb5, 0x93, 0xa8,
0x27, 0x51, 0x8f, 0x1f, 0xa8, 0x98, 0x1e, 0x43, 0x3d, 0x7e, 0x30, 0x85, 0x7a, 0x2c, 0x3c, 0x21, 0xc7, 0x0f, 0x54, 0x4c, 0x8f, 0xa0, 0x1e, 0x3f, 0x98, 0x42, 0x3d, 0x16, 0x9e, 0x10, 0x47, 0x3d,
0x89, 0x7a, 0x8c, 0xd6, 0x60, 0xd9, 0xea, 0xb3, 0x91, 0xe5, 0xf6, 0x92, 0x53, 0xc8, 0x0b, 0x2c, 0x46, 0x6b, 0xb0, 0x6c, 0xf6, 0xd9, 0xc8, 0x74, 0x7a, 0xf1, 0x29, 0xe4, 0x04, 0x16, 0xc9, 0xbe,
0x92, 0x7d, 0x9d, 0xf8, 0x44, 0x26, 0x12, 0xc9, 0xf9, 0x14, 0xe2, 0x12, 0x9f, 0xc4, 0x66, 0x65, 0x4e, 0x74, 0x22, 0x13, 0x89, 0xf8, 0x7c, 0xf2, 0x51, 0x89, 0x8f, 0x22, 0xb3, 0x32, 0x7e, 0x92,
0xfe, 0xd8, 0x80, 0x62, 0x57, 0x79, 0x08, 0xfa, 0x6f, 0xa8, 0x52, 0x9f, 0x88, 0x77, 0x63, 0x4f, 0x84, 0x42, 0x57, 0x79, 0x08, 0xfa, 0x3a, 0x54, 0xa8, 0x47, 0xc4, 0xbb, 0xb1, 0x2b, 0x4f, 0x52,
0x9e, 0xa4, 0x50, 0xad, 0xd7, 0x12, 0xe7, 0x6f, 0x4e, 0xd8, 0x68, 0x85, 0xdf, 0xd5, 0x2c, 0x5b, 0xa0, 0xd6, 0x6b, 0x89, 0xf3, 0x37, 0x27, 0x6c, 0xb4, 0xc2, 0xef, 0x6a, 0xa6, 0x25, 0xf3, 0x56,
0xe6, 0xad, 0x1e, 0xa3, 0xcc, 0x72, 0xd5, 0xaa, 0x2d, 0x72, 0xbe, 0xc8, 0x5c, 0x5d, 0xce, 0x45, 0x8f, 0x51, 0x66, 0x3a, 0x6a, 0xd5, 0x16, 0x39, 0x5f, 0x64, 0xae, 0x2e, 0xe7, 0xa2, 0x3b, 0x70,
0x77, 0xe0, 0xd2, 0x71, 0xe0, 0x30, 0x92, 0x80, 0xca, 0xa5, 0x5b, 0x12, 0x1d, 0x13, 0xac, 0xd9, 0xe9, 0xd8, 0xb7, 0x19, 0x89, 0x41, 0xe5, 0xd2, 0x2d, 0x89, 0x8e, 0x09, 0xd6, 0xe8, 0xc0, 0xa5,
0x81, 0x4b, 0xdd, 0xc0, 0x3a, 0x38, 0x70, 0xfa, 0x1d, 0xdf, 0x75, 0x98, 0xb4, 0x0a, 0x41, 0xd6, 0xae, 0x6f, 0xee, 0xef, 0xdb, 0xfd, 0x8e, 0xe7, 0xd8, 0x4c, 0x5a, 0x85, 0x20, 0x63, 0x7a, 0xe4,
0xf2, 0xc9, 0x97, 0x3a, 0x24, 0xf2, 0xb6, 0xb8, 0xbf, 0x12, 0xeb, 0x40, 0x87, 0x44, 0xde, 0xe6, 0x73, 0x1d, 0x12, 0x79, 0x5b, 0xdc, 0x5f, 0x89, 0xb9, 0xaf, 0x43, 0x22, 0x6f, 0xf3, 0x28, 0x7c,
0x51, 0xf8, 0x98, 0x38, 0x83, 0x43, 0xa6, 0xa3, 0xb0, 0xa4, 0xcc, 0x6f, 0x72, 0x50, 0x8a, 0xfc, 0x4c, 0xec, 0xc1, 0x01, 0xd3, 0x51, 0x58, 0x52, 0xc6, 0x97, 0x59, 0x28, 0x86, 0x7e, 0x83, 0x1a,
0x06, 0x35, 0xa1, 0xe4, 0x53, 0xbb, 0x37, 0x08, 0xe8, 0x48, 0x5f, 0x6f, 0x6f, 0xcc, 0x77, 0x33, 0x50, 0xf4, 0xa8, 0xd5, 0x1b, 0xf8, 0x74, 0xa4, 0xaf, 0xb7, 0x37, 0xe6, 0xbb, 0x19, 0xcf, 0x2f,
0x9e, 0x5f, 0x9e, 0x72, 0xe8, 0x76, 0x0a, 0x17, 0x7d, 0xd5, 0xae, 0xff, 0x22, 0x27, 0x12, 0x96, 0x4f, 0x39, 0x74, 0x3b, 0x81, 0x0b, 0x9e, 0x6a, 0xd7, 0x7e, 0x99, 0x15, 0x09, 0x4b, 0x10, 0xe8,
0x20, 0xd0, 0x13, 0xc8, 0x06, 0xf4, 0x58, 0xbb, 0xec, 0x7b, 0xe7, 0xd0, 0xd5, 0xc0, 0xf4, 0x18, 0x09, 0x64, 0x7c, 0x7a, 0xac, 0x5d, 0xf6, 0x9d, 0x73, 0xe8, 0xaa, 0x63, 0x7a, 0x8c, 0x85, 0x50,
0x0b, 0xa1, 0xfa, 0x9f, 0xb2, 0x90, 0xc1, 0xf4, 0xf8, 0x75, 0x43, 0xe9, 0x99, 0xd1, 0x6d, 0xf2, 0xed, 0xaf, 0x19, 0x48, 0x63, 0x7a, 0xfc, 0xaa, 0xa1, 0xf4, 0xcc, 0xe8, 0x36, 0x79, 0x7d, 0x2f,
0xfa, 0x5e, 0x4a, 0xbc, 0xbe, 0xaf, 0x40, 0x75, 0x48, 0xc2, 0x43, 0x62, 0xf7, 0xf8, 0x62, 0x48, 0xc6, 0x5e, 0xdf, 0x57, 0xa0, 0x32, 0x24, 0xc1, 0x01, 0xb1, 0x7a, 0x7c, 0x31, 0xa4, 0x93, 0xc8,
0x27, 0x91, 0x7b, 0xb2, 0x28, 0xf9, 0x6d, 0x6a, 0x4b, 0x97, 0xba, 0x03, 0x97, 0x82, 0x91, 0xe7, 0x3d, 0x59, 0x94, 0xfc, 0x36, 0xb5, 0xa4, 0x4b, 0xdd, 0x81, 0x4b, 0xfe, 0xc8, 0x75, 0x6d, 0x77,
0x39, 0xde, 0x20, 0x06, 0x95, 0x3e, 0xbd, 0xa4, 0x3a, 0x22, 0xec, 0x0a, 0x54, 0xb9, 0xdf, 0x25, 0x10, 0x81, 0x4a, 0x9f, 0x5e, 0x52, 0x1d, 0x21, 0x76, 0x05, 0x2a, 0xdc, 0xef, 0x62, 0x5a, 0xa5,
0xb4, 0x4a, 0x67, 0x5d, 0x94, 0xfc, 0x08, 0x79, 0x0f, 0x72, 0x32, 0x48, 0xe5, 0xe6, 0x94, 0xc8, 0xb3, 0x2e, 0x4a, 0x7e, 0x88, 0xbc, 0x07, 0x59, 0x19, 0xa4, 0xb2, 0x73, 0x4a, 0xe4, 0xc9, 0x11,
0x93, 0x23, 0x8c, 0x25, 0x12, 0x3d, 0x8c, 0xc7, 0xb6, 0xe2, 0x9c, 0x35, 0xd2, 0xae, 0x3c, 0x09, 0xc6, 0x12, 0x89, 0x1e, 0x46, 0x63, 0x5b, 0x61, 0xce, 0x1a, 0x69, 0x57, 0x9e, 0x84, 0x3d, 0xf4,
0x7b, 0xe8, 0x63, 0x28, 0xb2, 0x50, 0x89, 0xc1, 0x9c, 0x0c, 0x32, 0xe5, 0x74, 0xb8, 0xc0, 0x42, 0x21, 0x14, 0x58, 0xa0, 0xc4, 0x60, 0x4e, 0x06, 0x99, 0x72, 0x3a, 0x9c, 0x67, 0x81, 0x14, 0xff,
0x29, 0xfe, 0x05, 0x2c, 0xc8, 0x32, 0xa5, 0xb7, 0x3f, 0xe6, 0xd3, 0xaa, 0x15, 0xc4, 0x3e, 0x3f, 0x0c, 0x16, 0x64, 0x99, 0xd2, 0xdb, 0x1b, 0xf3, 0x69, 0x55, 0xf3, 0x62, 0x9f, 0x1f, 0x9d, 0x73,
0x3a, 0xe7, 0x3e, 0x37, 0x64, 0x9d, 0xd2, 0x1c, 0xf3, 0x42, 0x45, 0xdc, 0xf0, 0xca, 0x64, 0xc2, 0x9f, 0xeb, 0xb2, 0x4e, 0x69, 0x8c, 0x79, 0xa1, 0x22, 0x6e, 0x78, 0x25, 0x32, 0xe1, 0xd4, 0x3e,
0xa9, 0x7f, 0x0e, 0xd5, 0x93, 0x80, 0x19, 0x77, 0xbd, 0xb5, 0xf8, 0x5d, 0x6f, 0x56, 0x58, 0x8c, 0x85, 0xca, 0x49, 0xc0, 0x8c, 0xbb, 0xde, 0x5a, 0xf4, 0xae, 0x37, 0x2b, 0x2c, 0x86, 0xf5, 0x50,
0xea, 0xa1, 0xd8, 0x3d, 0x90, 0x57, 0x1f, 0x22, 0x9a, 0x9a, 0xbb, 0x50, 0x69, 0xd9, 0x83, 0xc9, 0xe4, 0x1e, 0xc8, 0xab, 0x0f, 0x11, 0x4d, 0x8d, 0x1d, 0x28, 0x37, 0xad, 0xc1, 0xe4, 0x8f, 0xbf,
0x1f, 0x7f, 0xdf, 0x32, 0xa7, 0x9a, 0x5f, 0x19, 0xb0, 0xa0, 0x14, 0xaa, 0xb4, 0x71, 0x3f, 0x96, 0xaf, 0x98, 0x53, 0x8d, 0xdf, 0x27, 0x61, 0x41, 0x29, 0x54, 0x69, 0xe3, 0x7e, 0x24, 0x6d, 0x5c,
0x36, 0xae, 0x4f, 0xa7, 0xd0, 0x38, 0xf6, 0xdb, 0x27, 0x8c, 0x7b, 0x22, 0x61, 0xdc, 0x85, 0x1c, 0x9f, 0x4e, 0xa1, 0x51, 0xec, 0x57, 0x4f, 0x18, 0xf7, 0x44, 0xc2, 0xb8, 0x0b, 0x59, 0xc2, 0xf5,
0xe1, 0x7a, 0xd5, 0xb9, 0x7b, 0x63, 0xe6, 0xa8, 0x58, 0x62, 0x12, 0x09, 0xe2, 0x77, 0x06, 0x64, 0xaa, 0x73, 0xf7, 0xda, 0xcc, 0x51, 0xb1, 0xc4, 0xc4, 0x12, 0xc4, 0x1f, 0x93, 0x90, 0xe1, 0x7d,
0x79, 0x1f, 0xba, 0x0b, 0x99, 0x30, 0xe8, 0x9f, 0x7d, 0xdc, 0x38, 0x8a, 0x83, 0xed, 0x70, 0x72, 0xe8, 0x2e, 0xa4, 0x03, 0xbf, 0x7f, 0xf6, 0x71, 0xe3, 0x28, 0x0e, 0xb6, 0x82, 0xc9, 0x85, 0x61,
0x61, 0x98, 0x0f, 0xb6, 0x43, 0xc6, 0xd3, 0x70, 0xdf, 0x75, 0x88, 0xc7, 0x7a, 0x8e, 0xad, 0x42, 0x3e, 0xd8, 0x0a, 0x18, 0x4f, 0xc3, 0x7d, 0xc7, 0x26, 0x2e, 0xeb, 0xd9, 0x96, 0x0a, 0x51, 0x05,
0x54, 0x51, 0x32, 0x76, 0x6c, 0xde, 0x19, 0x92, 0xe0, 0x15, 0x09, 0x78, 0xa7, 0x8c, 0x54, 0x45, 0xc9, 0x68, 0x59, 0xbc, 0x33, 0x20, 0xfe, 0x11, 0xf1, 0x79, 0xa7, 0x8c, 0x54, 0x05, 0xc9, 0x68,
0xc9, 0xd8, 0xb1, 0xd1, 0x6d, 0x58, 0xf2, 0x68, 0xcf, 0xb1, 0x89, 0xc7, 0x1c, 0xc6, 0x93, 0xc3, 0x59, 0xe8, 0x36, 0x2c, 0xb9, 0xb4, 0x67, 0x5b, 0xc4, 0x65, 0x36, 0xe3, 0xc9, 0x61, 0xa0, 0xae,
0x40, 0x5d, 0xe1, 0x16, 0x3c, 0xba, 0xa3, 0xb8, 0xcf, 0xc3, 0x81, 0xf9, 0xb5, 0x01, 0xd5, 0x2e, 0x70, 0x0b, 0x2e, 0x6d, 0x29, 0xee, 0xf3, 0x60, 0x60, 0x7c, 0x91, 0x84, 0x4a, 0x97, 0x7a, 0xe2,
0xf5, 0xc5, 0x1b, 0x42, 0xf8, 0x9f, 0x51, 0x2b, 0x15, 0x2e, 0x54, 0x2b, 0x25, 0xaa, 0x95, 0xdf, 0x0d, 0x21, 0xf8, 0xff, 0xa8, 0x95, 0xf2, 0x17, 0xaa, 0x95, 0x62, 0xd5, 0xca, 0x9f, 0x92, 0x70,
0x1b, 0x70, 0x29, 0x36, 0x5b, 0xe5, 0x74, 0xaf, 0xe9, 0x3f, 0xfc, 0x0e, 0x49, 0x8f, 0xd4, 0x1c, 0x29, 0x32, 0x5b, 0xe5, 0x74, 0xaf, 0xe8, 0x3f, 0xfc, 0x0e, 0x49, 0x0f, 0xd5, 0x1c, 0x6e, 0x4d,
0x6e, 0x4d, 0x87, 0x82, 0x93, 0xe3, 0x44, 0x0e, 0x5b, 0x7f, 0x2c, 0x1c, 0xef, 0x3e, 0xe4, 0xc5, 0x87, 0x82, 0x93, 0xe3, 0x84, 0x0e, 0x5b, 0x7b, 0x2c, 0x1c, 0xef, 0x3e, 0xe4, 0xc4, 0xf3, 0x98,
0xf3, 0x98, 0xf6, 0xbc, 0xe9, 0xd8, 0x25, 0xe4, 0x65, 0x95, 0xa2, 0xa0, 0x09, 0x07, 0xfc, 0x9b, 0xf6, 0xbc, 0xe9, 0xd8, 0x25, 0xe4, 0x65, 0x95, 0xa2, 0xa0, 0x31, 0x07, 0xfc, 0x67, 0x12, 0x60,
0x01, 0x30, 0x81, 0xa0, 0xfb, 0x89, 0xfc, 0xf1, 0xee, 0x29, 0xda, 0x26, 0x79, 0x03, 0xd5, 0x63, 0x02, 0x41, 0xf7, 0x63, 0xf9, 0xe3, 0xed, 0x53, 0xb4, 0x4d, 0xf2, 0x06, 0xaa, 0x45, 0xf2, 0x85,
0xf9, 0x42, 0xee, 0x53, 0x44, 0xd7, 0x7f, 0x62, 0xc8, 0x9c, 0xb2, 0x0c, 0x39, 0x31, 0xba, 0xbe, 0xdc, 0xa7, 0x90, 0xae, 0xfd, 0x34, 0x29, 0x73, 0xca, 0x32, 0x64, 0xc5, 0xe8, 0xfa, 0xde, 0x26,
0xb7, 0x09, 0xe2, 0xec, 0x4d, 0x4e, 0x3c, 0x2c, 0xe4, 0x4f, 0x3e, 0x2c, 0x5c, 0x3c, 0x70, 0xaf, 0x88, 0xb3, 0x37, 0x39, 0xf6, 0xb0, 0x90, 0x3b, 0xf9, 0xb0, 0x70, 0xf1, 0xc0, 0xbd, 0xfe, 0x87,
0x7f, 0x95, 0x87, 0xcc, 0x86, 0xef, 0xa0, 0xcf, 0xa1, 0x1c, 0x2b, 0x20, 0xd1, 0x8d, 0xd3, 0xcb, 0x1c, 0xa4, 0x37, 0x3c, 0x1b, 0x7d, 0x0a, 0xa5, 0x48, 0x01, 0x89, 0x6e, 0x9c, 0x5e, 0x5e, 0x0a,
0x4b, 0xe1, 0xd2, 0xf5, 0x9b, 0xe7, 0xa9, 0x41, 0xcd, 0x14, 0xda, 0x86, 0x9c, 0x88, 0x32, 0xe8, 0x97, 0xae, 0xdd, 0x3c, 0x4f, 0x0d, 0x6a, 0x24, 0xd0, 0x36, 0x64, 0x45, 0x94, 0x41, 0x6f, 0xcd,
0x9d, 0x79, 0xd1, 0x47, 0xea, 0xbb, 0x7a, 0x7a, 0x70, 0x32, 0x53, 0xa8, 0x0b, 0xa5, 0xc8, 0x05, 0x8b, 0x3e, 0x52, 0xdf, 0xd5, 0xd3, 0x83, 0x93, 0x91, 0x40, 0x5d, 0x28, 0x86, 0x2e, 0x80, 0xae,
0xd0, 0xf5, 0xd3, 0xdc, 0x43, 0x6a, 0x34, 0xcf, 0xf6, 0x20, 0x33, 0x85, 0x3e, 0x85, 0xa2, 0xfe, 0x9f, 0xe6, 0x1e, 0x52, 0xa3, 0x71, 0xb6, 0x07, 0x19, 0x09, 0xf4, 0x31, 0x14, 0xf4, 0xd7, 0x04,
0x9a, 0x00, 0x5d, 0x9b, 0x92, 0x38, 0xf1, 0x75, 0x43, 0xfd, 0xfa, 0x29, 0x88, 0x48, 0xe5, 0x0f, 0xe8, 0xda, 0x94, 0xc4, 0x89, 0xaf, 0x1b, 0x6a, 0xd7, 0x4f, 0x41, 0x84, 0x2a, 0x7f, 0x08, 0xe5,
0xa0, 0x12, 0xff, 0x40, 0x03, 0xdd, 0x9c, 0x29, 0x74, 0xe2, 0xa3, 0x8f, 0xfa, 0xad, 0x33, 0x50, 0xe8, 0x07, 0x1a, 0xe8, 0xe6, 0x4c, 0xa1, 0x13, 0x1f, 0x7d, 0xd4, 0x6e, 0x9d, 0x81, 0x0a, 0xd5,
0x91, 0xfa, 0x2d, 0xc8, 0x74, 0x2d, 0x1f, 0xbd, 0x35, 0xeb, 0x91, 0x45, 0x2b, 0x7b, 0x73, 0xee, 0x6f, 0x41, 0xba, 0x6b, 0x7a, 0xe8, 0x8d, 0x59, 0x8f, 0x2c, 0x5a, 0xd9, 0xeb, 0x73, 0x5f, 0x60,
0x0b, 0x8c, 0x99, 0xf9, 0x51, 0xda, 0x58, 0x33, 0xd0, 0x0b, 0x58, 0x48, 0xfc, 0x3f, 0x86, 0x6e, 0x8c, 0xf4, 0x8f, 0x53, 0xc9, 0xb5, 0x24, 0xfa, 0x01, 0x2c, 0xc4, 0xfe, 0x1f, 0x43, 0xb7, 0xce,
0x9d, 0xeb, 0xff, 0xb3, 0xd3, 0x34, 0xa7, 0xd6, 0x0c, 0xb4, 0x01, 0x05, 0xfd, 0xff, 0xf8, 0x9c, 0xf5, 0xff, 0xd9, 0x39, 0x34, 0x6f, 0x40, 0x5e, 0xff, 0x45, 0x3e, 0x27, 0x10, 0xd5, 0xde, 0x9c,
0x28, 0x54, 0x7f, 0x7b, 0x8a, 0x1f, 0xfb, 0xec, 0xc6, 0x4c, 0x21, 0x17, 0x4a, 0x1d, 0xe2, 0x1e, 0xe2, 0x47, 0xbe, 0xbc, 0x31, 0x12, 0xc8, 0x81, 0x62, 0x87, 0x38, 0xfb, 0x9b, 0x07, 0xa4, 0x7f,
0x6c, 0x1e, 0x92, 0xfe, 0x11, 0xfa, 0xdf, 0x09, 0x58, 0x7e, 0xd6, 0xd3, 0x88, 0x7f, 0xd6, 0x13, 0x88, 0xbe, 0x39, 0x01, 0xcb, 0x2f, 0x7b, 0xea, 0xd1, 0x2f, 0x7b, 0x42, 0x9c, 0x36, 0xb0, 0x7e,
0xe1, 0xb4, 0x75, 0x8d, 0xf3, 0xc2, 0xa3, 0xd5, 0x7c, 0x04, 0xf9, 0x4d, 0xf1, 0x39, 0xd0, 0x5c, 0x5e, 0x78, 0xb8, 0xa0, 0x8f, 0x20, 0xb7, 0x29, 0xbe, 0x08, 0x9a, 0x6b, 0xef, 0x72, 0x54, 0xa7,
0x7b, 0x97, 0xe3, 0x3a, 0xc5, 0x87, 0x43, 0x1b, 0xae, 0x6b, 0xa6, 0x9a, 0xf7, 0x3f, 0xbf, 0x37, 0xf8, 0x76, 0x68, 0xc3, 0x71, 0x8c, 0x44, 0xe3, 0xfe, 0xa7, 0xf7, 0x06, 0x36, 0x3b, 0x18, 0xed,
0x70, 0xd8, 0xe1, 0x68, 0x9f, 0x0f, 0xb5, 0xaa, 0x30, 0xfa, 0x77, 0x7d, 0x75, 0xf2, 0x35, 0xc3, 0xf1, 0xa1, 0x56, 0x15, 0x46, 0xff, 0xae, 0xaf, 0x4e, 0x3e, 0x68, 0x58, 0x1d, 0x10, 0x77, 0x55,
0xea, 0x80, 0x78, 0xab, 0x52, 0xe5, 0x7e, 0x5e, 0xbc, 0x3f, 0xdd, 0xff, 0x67, 0x00, 0x00, 0x00, 0xaa, 0xdc, 0xcb, 0x89, 0x27, 0xa8, 0xfb, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xd7, 0xe9, 0x50,
0xff, 0xff, 0x19, 0x79, 0xb2, 0x41, 0xe4, 0x24, 0x00, 0x00, 0x16, 0xe7, 0x24, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -3958,7 +3961,7 @@ type ApiClient interface {
ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error)
// Superceded by `TapByResource`. // Superceded by `TapByResource`.
Tap(ctx context.Context, in *TapRequest, opts ...grpc.CallOption) (Api_TapClient, error) Tap(ctx context.Context, in *TapRequest, opts ...grpc.CallOption) (Api_TapClient, error)
// Executes tapping over Kubernetes resources. // Superceded by tap APIServer.
TapByResource(ctx context.Context, in *TapByResourceRequest, opts ...grpc.CallOption) (Api_TapByResourceClient, error) TapByResource(ctx context.Context, in *TapByResourceRequest, opts ...grpc.CallOption) (Api_TapByResourceClient, error)
Version(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*VersionInfo, error) Version(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*VersionInfo, error)
SelfCheck(ctx context.Context, in *healthcheck.SelfCheckRequest, opts ...grpc.CallOption) (*healthcheck.SelfCheckResponse, error) SelfCheck(ctx context.Context, in *healthcheck.SelfCheckRequest, opts ...grpc.CallOption) (*healthcheck.SelfCheckResponse, error)
@ -4051,6 +4054,7 @@ func (x *apiTapClient) Recv() (*TapEvent, error) {
return m, nil return m, nil
} }
// Deprecated: Do not use.
func (c *apiClient) TapByResource(ctx context.Context, in *TapByResourceRequest, opts ...grpc.CallOption) (Api_TapByResourceClient, error) { func (c *apiClient) TapByResource(ctx context.Context, in *TapByResourceRequest, opts ...grpc.CallOption) (Api_TapByResourceClient, error) {
stream, err := c.cc.NewStream(ctx, &_Api_serviceDesc.Streams[1], "/linkerd2.public.Api/TapByResource", opts...) stream, err := c.cc.NewStream(ctx, &_Api_serviceDesc.Streams[1], "/linkerd2.public.Api/TapByResource", opts...)
if err != nil { if err != nil {
@ -4119,7 +4123,7 @@ type ApiServer interface {
ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error)
// Superceded by `TapByResource`. // Superceded by `TapByResource`.
Tap(*TapRequest, Api_TapServer) error Tap(*TapRequest, Api_TapServer) error
// Executes tapping over Kubernetes resources. // Superceded by tap APIServer.
TapByResource(*TapByResourceRequest, Api_TapByResourceServer) error TapByResource(*TapByResourceRequest, Api_TapByResourceServer) error
Version(context.Context, *Empty) (*VersionInfo, error) Version(context.Context, *Empty) (*VersionInfo, error)
SelfCheck(context.Context, *healthcheck.SelfCheckRequest) (*healthcheck.SelfCheckResponse, error) SelfCheck(context.Context, *healthcheck.SelfCheckRequest) (*healthcheck.SelfCheckResponse, error)

View File

@ -8,5 +8,5 @@ option go_package = "github.com/linkerd/linkerd2/controller/gen/controller/tap";
service Tap { service Tap {
rpc Tap(public.TapRequest) returns (stream public.TapEvent) { option deprecated = true; } rpc Tap(public.TapRequest) returns (stream public.TapEvent) { option deprecated = true; }
rpc TapByResource(public.TapByResourceRequest) returns (stream public.TapEvent) {} rpc TapByResource(public.TapByResourceRequest) returns (stream public.TapEvent) { option deprecated = true; }
} }

View File

@ -79,6 +79,8 @@ message TapRequest {
} }
// A tap request over kubernetes resources. // A tap request over kubernetes resources.
//
// This is used only by the tap APIServer.
message TapByResourceRequest { message TapByResourceRequest {
// Describes the kubernetes pods that should be tapped. // Describes the kubernetes pods that should be tapped.
ResourceSelection target = 1; ResourceSelection target = 1;
@ -177,6 +179,7 @@ message Eos {
} }
} }
// This is used only by the tap APIServer.
message TapEvent { message TapEvent {
TcpAddress source = 1; TcpAddress source = 1;
EndpointMeta source_meta = 5; EndpointMeta source_meta = 5;
@ -458,8 +461,8 @@ service Api {
// Superceded by `TapByResource`. // Superceded by `TapByResource`.
rpc Tap(TapRequest) returns (stream TapEvent) { option deprecated = true; } rpc Tap(TapRequest) returns (stream TapEvent) { option deprecated = true; }
// Executes tapping over Kubernetes resources. // Superceded by tap APIServer.
rpc TapByResource(TapByResourceRequest) returns (stream TapEvent) {} rpc TapByResource(TapByResourceRequest) returns (stream TapEvent) { option deprecated = true; }
rpc Version(Empty) returns (VersionInfo) {} rpc Version(Empty) returns (VersionInfo) {}
rpc SelfCheck(common.healthcheck.SelfCheckRequest) returns (common.healthcheck.SelfCheckResponse) {} rpc SelfCheck(common.healthcheck.SelfCheckRequest) returns (common.healthcheck.SelfCheckResponse) {}