Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

Commit d24e8fe

Browse files
Craig FurmanjdpleinessChickensoupwithriceDaedalusGnelsonjr
authored
feat(appliance): backport all recent appliance changes (#64182)
Draft in case plan in https://linear.app/sourcegraph/issue/REL-309/release-process-for-appliance not agreed. Please see that first. Generated by: ``` git log --format=%H d47b4cc..origin/main -- cmd/appliance internal/appliance docker-images/appliance-frontend | tac | xargs git cherry-pick ``` d47b4cc being the commit we branched off main from to create the 5.5.x branch (https://buildkite.com/sourcegraph/sourcegraph/builds/281882). Commits (generated by `git log --format='- https://github.com/sourcegraph/sourcegraph/commit/%H' d47b4cc..origin/main -- cmd/appliance internal/appliance docker-images/appliance-frontend | tac`): - https://github.com/sourcegraph/sourcegraph/commit/a20b0650b453d11d7dc428b9f919b79465db088c - https://github.com/sourcegraph/sourcegraph/commit/b71c986c77829cfe3bdc6f2d31e8590fdb969b17 - https://github.com/sourcegraph/sourcegraph/commit/91864283bc0811928188f415e6cda7d3fe940e34 - https://github.com/sourcegraph/sourcegraph/commit/c88b57020fa49fe996e37ca9409a541d48d7a63e - https://github.com/sourcegraph/sourcegraph/commit/0491839942c3087687d0f48ade1c544f1fbcb881 - https://github.com/sourcegraph/sourcegraph/commit/619fc5707415bd50631153bcb1b01c670d44fd82 - https://github.com/sourcegraph/sourcegraph/commit/e81c39a834810a60c8827456963511213eb5f602 - https://github.com/sourcegraph/sourcegraph/commit/a61f353e0e93f848fa476ffda6d46f71060d465d - https://github.com/sourcegraph/sourcegraph/commit/0abef7b43d5dadac92a3ff318f3caf6d7b572f6a - https://github.com/sourcegraph/sourcegraph/commit/0e391a964ae8d21904bd875862759db521feb5ba - https://github.com/sourcegraph/sourcegraph/commit/daae9adfb642f2c73e7b4b2dcb7acca618ae86d3 - https://github.com/sourcegraph/sourcegraph/commit/6e31f0f4cc89ad7d3892e67bad55ab9a0b9658a7 - https://github.com/sourcegraph/sourcegraph/commit/49a600220d5eb2875ab54c87329d0a90f15c38d6 - https://github.com/sourcegraph/sourcegraph/commit/37cf4a7b7e9dfb4f09635d2e04ce30daf5d8b7a0 - https://github.com/sourcegraph/sourcegraph/commit/29fc613c376fe38055fa907c5bbd293ea6e4408f - https://github.com/sourcegraph/sourcegraph/commit/255e6387cc7854c8aed6dfa1445fcade380ec690 - https://github.com/sourcegraph/sourcegraph/commit/49b32fcf3a1ec8362e3be286de182aba76f93917 - https://github.com/sourcegraph/sourcegraph/commit/9f4c160f91838ed3167a38ba62b7ca90ad90a771 - https://github.com/sourcegraph/sourcegraph/commit/3814fd7390455354be1129cdb1b240c201ef5964 - https://github.com/sourcegraph/sourcegraph/commit/c68e92bc28b3ce0878aebe8e10471cca89010b77 - https://github.com/sourcegraph/sourcegraph/commit/7e82c27ab5de1c76f1e877ec9dee665800807cbb - https://github.com/sourcegraph/sourcegraph/commit/98c6b9703f889bb8b706855204276d3528b03356 - https://github.com/sourcegraph/sourcegraph/commit/a01ebad8417d4c14b969f61a3a6ad8e836728047 - https://github.com/sourcegraph/sourcegraph/commit/8c2d8da234cc46b529b8df92a38cdf7f7d83a7a7 - https://github.com/sourcegraph/sourcegraph/commit/ebec72d7ed7046406d22d2bf8276612945db358d - https://github.com/sourcegraph/sourcegraph/commit/d945f192852a7dc3cd2482602fe37f614f82f8a1 - https://github.com/sourcegraph/sourcegraph/commit/84e28998e9d3976b79d858439953d101ca44ab7e ## Test plan Tests pass. ## Changelog - Backport all recent appliance changes. The appliance is still pre-release. --------- Co-authored-by: Jacob Pleiness <jdpleiness@users.noreply.github.com> Co-authored-by: Anish Lakhwara <anish+github@lakhwara.com> Co-authored-by: Warren Gifford <warren@sourcegraph.com> Co-authored-by: Nelson Araujo <nelsonjr@users.noreply.github.com>
1 parent 162d383 commit d24e8fe

File tree

234 files changed

+8985
-1844
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

234 files changed

+8985
-1844
lines changed

client/web/dev/utils/create-js-context.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export const createJsContext = ({ sourcegraphBaseUrl }: { sourcegraphBaseUrl: st
3535
accessTokensExpirationDaysOptions: [7, 14, 30, 60, 90],
3636
allowSignup: true,
3737
batchChangesEnabled: true,
38+
applianceManaged: false,
3839
batchChangesDisableWebhooksWarning: false,
3940
batchChangesWebhookLogsEnabled: true,
4041
executorsEnabled: false,

client/web/src/enterprise/site-admin/SiteAdminSidebar.story.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export const AdminSidebarItems: StoryFn = () => (
3838
batchChangesExecutionEnabled={true}
3939
batchChangesWebhookLogsEnabled={true}
4040
codeInsightsEnabled={true}
41+
applianceManaged={false}
4142
endUserOnboardingEnabled={false}
4243
/>
4344
<SiteAdminSidebar
@@ -48,6 +49,7 @@ export const AdminSidebarItems: StoryFn = () => (
4849
batchChangesExecutionEnabled={true}
4950
batchChangesWebhookLogsEnabled={true}
5051
codeInsightsEnabled={true}
52+
applianceManaged={false}
5153
endUserOnboardingEnabled={false}
5254
/>
5355
<SiteAdminSidebar
@@ -58,6 +60,7 @@ export const AdminSidebarItems: StoryFn = () => (
5860
batchChangesExecutionEnabled={false}
5961
batchChangesWebhookLogsEnabled={false}
6062
codeInsightsEnabled={true}
63+
applianceManaged={false}
6164
endUserOnboardingEnabled={false}
6265
/>
6366
<SiteAdminSidebar
@@ -68,6 +71,7 @@ export const AdminSidebarItems: StoryFn = () => (
6871
batchChangesExecutionEnabled={true}
6972
batchChangesWebhookLogsEnabled={true}
7073
codeInsightsEnabled={false}
74+
applianceManaged={false}
7175
endUserOnboardingEnabled={false}
7276
/>
7377
</Grid>

client/web/src/integration/jscontext.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const createJsContext = ({ sourcegraphBaseUrl }: { sourcegraphBaseUrl: st
2727
accessTokensExpirationDaysOptions: [7, 30, 60, 90],
2828
allowSignup: false,
2929
batchChangesEnabled: true,
30+
applianceManaged: false,
3031
batchChangesDisableWebhooksWarning: false,
3132
batchChangesWebhookLogsEnabled: true,
3233
codeInsightsEnabled: true,

client/web/src/jscontext.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,11 @@ export interface SourcegraphContext extends Pick<Required<SiteConfiguration>, 'e
196196

197197
batchChangesWebhookLogsEnabled: boolean
198198

199+
/**
200+
* Whether this sourcegraph instance is managed by Appliance
201+
*/
202+
applianceManaged: boolean
203+
199204
/**
200205
* Whether Cody is enabled on this instance. Check
201206
* {@link SourcegraphContext.codyEnabledForCurrentUser} to see whether Cody is enabled for the

client/web/src/routes.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ export const routes: RouteObject[] = [
268268
sideBarGroups={props.siteAdminSideBarGroups}
269269
overviewComponents={props.siteAdminOverviewComponents}
270270
codeInsightsEnabled={window.context.codeInsightsEnabled}
271+
applianceManaged={window.context.applianceManaged}
271272
telemetryRecorder={props.platformContext.telemetryRecorder}
272273
/>
273274
)}

client/web/src/site-admin/SiteAdminArea.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export interface SiteAdminAreaRouteContext
5959
overviewComponents: readonly React.ComponentType<React.PropsWithChildren<{}>>[]
6060

6161
codeInsightsEnabled: boolean
62+
applianceManaged: boolean
6263

6364
endUserOnboardingEnabled: boolean
6465
}
@@ -77,6 +78,7 @@ interface SiteAdminAreaProps
7778
authenticatedUser: AuthenticatedUser
7879
isSourcegraphDotCom: boolean
7980
codeInsightsEnabled: boolean
81+
applianceManaged: boolean
8082
}
8183

8284
const sourcegraphOperatorSiteAdminMaintenanceBlockItems = new Set([
@@ -142,6 +144,7 @@ const AuthenticatedSiteAdminArea: React.FunctionComponent<React.PropsWithChildre
142144
telemetryService: props.telemetryService,
143145
telemetryRecorder: props.telemetryRecorder,
144146
codeInsightsEnabled: props.codeInsightsEnabled,
147+
applianceManaged: props.applianceManaged,
145148
endUserOnboardingEnabled,
146149
}
147150

@@ -161,6 +164,7 @@ const AuthenticatedSiteAdminArea: React.FunctionComponent<React.PropsWithChildre
161164
batchChangesExecutionEnabled={props.batchChangesExecutionEnabled}
162165
batchChangesWebhookLogsEnabled={props.batchChangesWebhookLogsEnabled}
163166
codeInsightsEnabled={props.codeInsightsEnabled}
167+
applianceManaged={props.applianceManaged}
164168
endUserOnboardingEnabled={endUserOnboardingEnabled}
165169
/>
166170
<div className="flex-bounded">

client/web/src/site-admin/SiteAdminSidebar.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface SiteAdminSideBarGroupContext extends BatchChangesProps {
1515
isSourcegraphDotCom: boolean
1616
codeInsightsEnabled: boolean
1717
endUserOnboardingEnabled: boolean
18+
applianceManaged: boolean
1819
}
1920

2021
export interface SiteAdminSideBarGroup extends NavGroupDescriptor<SiteAdminSideBarGroupContext> {}

client/web/src/site-admin/sidebaritems.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,12 @@ const maintenanceGroup: SiteAdminSideBarGroup = {
135135
{
136136
label: maintenanceGroupUpdatesItemLabel,
137137
to: '/site-admin/updates',
138+
condition: ({ applianceManaged }) => !applianceManaged,
139+
},
140+
{
141+
label: maintenanceGroupUpdatesItemLabel,
142+
to: '/appliance/updates',
143+
condition: ({ applianceManaged }) => applianceManaged,
138144
},
139145
{
140146
label: 'Documentation',

cmd/appliance/shared/BUILD.bazel

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ go_library(
1111
visibility = ["//visibility:public"],
1212
deps = [
1313
"//internal/appliance",
14+
"//internal/appliance/healthchecker",
1415
"//internal/appliance/reconciler",
16+
"//internal/appliance/selfupdate",
1517
"//internal/appliance/v1:appliance",
1618
"//internal/debugserver",
1719
"//internal/env",
@@ -23,6 +25,7 @@ go_library(
2325
"//lib/errors",
2426
"@com_github_sourcegraph_log//:log",
2527
"@com_github_sourcegraph_log_logr//:logr",
28+
"@io_k8s_apimachinery//pkg/types",
2629
"@io_k8s_client_go//rest",
2730
"@io_k8s_client_go//tools/clientcmd",
2831
"@io_k8s_client_go//util/homedir",

cmd/appliance/shared/config.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ import (
1616
type Config struct {
1717
env.BaseConfig
1818

19-
k8sConfig *rest.Config
20-
metrics metricsConfig
21-
grpc grpcConfig
22-
http httpConfig
23-
namespace string
24-
relregEndpoint string
25-
applianceVersion string
19+
k8sConfig *rest.Config
20+
metrics metricsConfig
21+
grpc grpcConfig
22+
http httpConfig
23+
namespace string
24+
relregEndpoint string
25+
applianceVersion string
26+
selfDeploymentName string
27+
noResourceRestrictions string
2628
}
2729

2830
func (c *Config) Load() {
@@ -43,10 +45,12 @@ func (c *Config) Load() {
4345
c.metrics.addr = c.Get("APPLIANCE_METRICS_ADDR", ":8734", "Appliance metrics server address.")
4446
c.metrics.secure = c.GetBool("APPLIANCE_METRICS_SECURE", "false", "Appliance metrics server uses https.")
4547
c.grpc.addr = c.Get("APPLIANCE_GRPC_ADDR", ":9000", "Appliance gRPC address.")
46-
c.http.addr = c.Get("APPLIANCE_HTTP_ADDR", ":8080", "Appliance http address.")
48+
c.http.addr = c.Get("APPLIANCE_HTTP_ADDR", ":8888", "Appliance http address.")
4749
c.namespace = c.Get("APPLIANCE_NAMESPACE", "default", "Namespace to monitor.")
4850
c.applianceVersion = c.Get("APPLIANCE_VERSION", version.Version(), "Version tag for the running appliance.")
51+
c.selfDeploymentName = c.Get("APPLIANCE_DEPLOYMENT_NAME", "", "Own deployment name for self-update. Default is to disable self-update.")
4952
c.relregEndpoint = c.Get("RELEASE_REGISTRY_ENDPOINT", releaseregistry.Endpoint, "Release registry endpoint.")
53+
c.noResourceRestrictions = c.Get("APPLIANCE_NO_RESOURCE_RESTRICTIONS", "false", "Remove all resource requests and limits from deployed resources. Only recommended for local development.")
5054
}
5155

5256
func (c *Config) Validate() error {

cmd/appliance/shared/shared.go

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,25 @@ import (
66
"net/http"
77
"os"
88
"os/signal"
9+
"strconv"
910
"syscall"
1011
"time"
1112

1213
"golang.org/x/sync/errgroup"
1314
"google.golang.org/grpc"
15+
"k8s.io/apimachinery/pkg/types"
1416
ctrl "sigs.k8s.io/controller-runtime"
1517
"sigs.k8s.io/controller-runtime/pkg/cache"
1618
"sigs.k8s.io/controller-runtime/pkg/client"
1719
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
1820

1921
"github.com/sourcegraph/log"
2022
sglogr "github.com/sourcegraph/log/logr"
23+
2124
"github.com/sourcegraph/sourcegraph/internal/appliance"
25+
"github.com/sourcegraph/sourcegraph/internal/appliance/healthchecker"
2226
"github.com/sourcegraph/sourcegraph/internal/appliance/reconciler"
27+
"github.com/sourcegraph/sourcegraph/internal/appliance/selfupdate"
2328
pb "github.com/sourcegraph/sourcegraph/internal/appliance/v1"
2429
"github.com/sourcegraph/sourcegraph/internal/grpc/defaults"
2530
"github.com/sourcegraph/sourcegraph/internal/observation"
@@ -44,7 +49,14 @@ func Start(ctx context.Context, observationCtx *observation.Context, ready servi
4449

4550
relregClient := releaseregistry.NewClient(config.relregEndpoint)
4651

47-
app, err := appliance.NewAppliance(k8sClient, relregClient, config.applianceVersion, config.namespace, logger)
52+
noResourceRestrictions := false
53+
noResourceRestrictions, err = strconv.ParseBool(config.noResourceRestrictions)
54+
if err != nil {
55+
logger.Error("parsing APPLIANCE_NO_RESOURCE_RESTRICTIONS as bool", log.Error(err))
56+
return err
57+
}
58+
59+
app, err := appliance.NewAppliance(k8sClient, relregClient, config.applianceVersion, config.namespace, noResourceRestrictions, logger)
4860
if err != nil {
4961
logger.Error("failed to create appliance", log.Error(err))
5062
return err
@@ -67,10 +79,13 @@ func Start(ctx context.Context, observationCtx *observation.Context, ready servi
6779
return err
6880
}
6981

82+
beginHealthCheckLoop := make(chan struct{})
83+
7084
if err = (&reconciler.Reconciler{
71-
Client: mgr.GetClient(),
72-
Scheme: mgr.GetScheme(),
73-
Recorder: mgr.GetEventRecorderFor("sourcegraph-appliance"),
85+
Client: mgr.GetClient(),
86+
Scheme: mgr.GetScheme(),
87+
Recorder: mgr.GetEventRecorderFor("sourcegraph-appliance"),
88+
BeginHealthCheckLoop: beginHealthCheckLoop,
7489
}).SetupWithManager(mgr); err != nil {
7590
logger.Error("unable to create the appliance controller", log.Error(err))
7691
return err
@@ -92,6 +107,26 @@ func Start(ctx context.Context, observationCtx *observation.Context, ready servi
92107

93108
grpcServer := makeGRPCServer(logger, app)
94109

110+
selfUpdater := &selfupdate.SelfUpdate{
111+
Interval: time.Hour,
112+
Logger: logger.Scoped("SelfUpdate"),
113+
K8sClient: k8sClient,
114+
RelregClient: relregClient,
115+
DeploymentNames: config.selfDeploymentName,
116+
Namespace: config.namespace,
117+
}
118+
119+
probe := &healthchecker.PodProbe{K8sClient: k8sClient}
120+
healthChecker := &healthchecker.HealthChecker{
121+
Probe: probe,
122+
K8sClient: k8sClient,
123+
Logger: logger.Scoped("HealthChecker"),
124+
125+
ServiceName: types.NamespacedName{Name: "sourcegraph-frontend", Namespace: config.namespace},
126+
Interval: time.Minute,
127+
Graceperiod: time.Minute,
128+
}
129+
95130
g, ctx := errgroup.WithContext(ctx)
96131
ctx = shutdownOnSignal(ctx)
97132

@@ -119,6 +154,18 @@ func Start(ctx context.Context, observationCtx *observation.Context, ready servi
119154
}
120155
return nil
121156
})
157+
g.Go(func() error {
158+
if err := healthChecker.ManageIngressFacingService(ctx, beginHealthCheckLoop, "app=sourcegraph-frontend", config.namespace); err != nil {
159+
logger.Error("problem running HealthChecker", log.Error(err))
160+
return err
161+
}
162+
return nil
163+
})
164+
if config.selfDeploymentName != "" {
165+
g.Go(func() error {
166+
return selfUpdater.Loop(ctx)
167+
})
168+
}
122169
g.Go(func() error {
123170
<-ctx.Done()
124171
grpcServer.GracefulStop()

cmd/frontend/internal/app/jscontext/jscontext.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ type JSContext struct {
233233
CodeIntelRankingDocumentReferenceCountsEnabled bool `json:"codeIntelRankingDocumentReferenceCountsEnabled"`
234234

235235
CodeInsightsEnabled bool `json:"codeInsightsEnabled"`
236+
ApplianceManaged bool `json:"applianceManaged"`
236237
CodeIntelligenceEnabled bool `json:"codeIntelligenceEnabled"`
237238
SearchContextsEnabled bool `json:"searchContextsEnabled"`
238239
NotebooksEnabled bool `json:"notebooksEnabled"`
@@ -436,6 +437,7 @@ func NewJSContextFromRequest(req *http.Request, db database.DB) JSContext {
436437
CodyRequiresVerifiedEmail: siteResolver.RequiresVerifiedEmailForCody(ctx),
437438

438439
CodeSearchEnabledOnInstance: codeSearchLicensed,
440+
ApplianceManaged: conf.IsApplianceManaged(),
439441

440442
ExecutorsEnabled: conf.ExecutorsEnabled(),
441443
CodeIntelAutoIndexingEnabled: conf.CodeIntelAutoIndexingEnabled(),

deps.bzl

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6419,13 +6419,6 @@ def go_dependencies():
64196419
sum = "h1:dH55ru2OQOIAKjZi5wwXjNnSfN0oXLFYkMQy908s+tU=",
64206420
version = "v0.2.0",
64216421
)
6422-
go_repository(
6423-
name = "com_github_wagslane_go_password_validator",
6424-
build_file_proto_mode = "disable_global",
6425-
importpath = "github.com/wagslane/go-password-validator",
6426-
sum = "h1:vfxOPzGHkz5S146HDpavl0cw1DSVP061Ry2PX0/ON6I=",
6427-
version = "v0.3.0",
6428-
)
64296422
go_repository(
64306423
name = "com_github_wk8_go_ordered_map_v2",
64316424
build_file_proto_mode = "disable_global",

dev/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,5 +127,6 @@ write_source_files(
127127
"//cmd/enterprise-portal/internal/subscriptionsservice:generate_mocks",
128128
"//dev/sg/internal/analytics:generate_mocks",
129129
"//cmd/symbols/internal/fetcher:generate_mocks",
130+
"//internal/releaseregistry/mocks:generate_mocks",
130131
],
131132
)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
load("//dev:oci_defs.bzl", "image_repository", "oci_image", "oci_push", "oci_tarball")
2+
load("@rules_pkg//:pkg.bzl", "pkg_tar")
3+
load("@container_structure_test//:defs.bzl", "container_structure_test")
4+
load("//wolfi-images:defs.bzl", "wolfi_base")
5+
6+
filegroup(
7+
name = "config",
8+
srcs = ["nginx.conf"],
9+
)
10+
11+
filegroup(
12+
name = "init_script",
13+
srcs = ["init.sh"],
14+
)
15+
16+
pkg_tar(
17+
name = "tar_config",
18+
srcs = [":config"],
19+
package_dir = "/etc/nginx",
20+
)
21+
22+
pkg_tar(
23+
name = "tar_init_script",
24+
srcs = [":init_script"],
25+
package_dir = "/",
26+
)
27+
28+
oci_image(
29+
name = "image",
30+
base = ":base_image",
31+
entrypoint = [
32+
"/init.sh",
33+
"nginx",
34+
"-g",
35+
"daemon off;",
36+
],
37+
tars = [
38+
":tar_init_script",
39+
":tar_config",
40+
"//internal/appliance/frontend/maintenance:tar_config",
41+
"//internal/appliance/frontend/maintenance:tar_frontend",
42+
],
43+
user = "sourcegraph",
44+
)
45+
46+
oci_tarball(
47+
name = "image_tarball",
48+
image = ":image",
49+
repo_tags = ["appliance-frontend:candidate"],
50+
)
51+
52+
container_structure_test(
53+
name = "image_test",
54+
timeout = "short",
55+
configs = ["image_test.yaml"],
56+
driver = "docker",
57+
image = ":image",
58+
tags = [
59+
"exclusive",
60+
"requires-network",
61+
TAG_INFRA_DEVINFRA,
62+
],
63+
)
64+
65+
oci_push(
66+
name = "candidate_push",
67+
image = ":image",
68+
repository = image_repository("appliance-frontend"),
69+
)
70+
71+
wolfi_base()

0 commit comments

Comments
 (0)