@getuserfeedback/protocol 0.5.12 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/app-event.d.ts +274 -274
  2. package/dist/app-event.d.ts.map +1 -1
  3. package/dist/app-event.js +16 -16
  4. package/dist/client-meta.d.ts +13 -13
  5. package/dist/client-meta.d.ts.map +1 -1
  6. package/dist/client-meta.js +6 -6
  7. package/dist/errors.d.ts +73 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +43 -0
  10. package/dist/flow-assignments.d.ts +262 -183
  11. package/dist/flow-assignments.d.ts.map +1 -1
  12. package/dist/flow-assignments.js +17 -16
  13. package/dist/identity-type.d.ts +2 -2
  14. package/dist/identity-type.d.ts.map +1 -1
  15. package/dist/identity-type.js +13 -15
  16. package/dist/index.d.ts +87 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +7 -1
  19. package/dist/public-grant-scope.d.ts +3 -3
  20. package/dist/public-grant-scope.d.ts.map +1 -1
  21. package/dist/public-grant-scope.js +1 -1
  22. package/dist/runtime-endpoints.d.ts +4 -4
  23. package/dist/runtime-endpoints.d.ts.map +1 -1
  24. package/dist/runtime-endpoints.js +4 -6
  25. package/dist/scopes.d.ts +2 -2
  26. package/dist/scopes.d.ts.map +1 -1
  27. package/dist/scopes.js +1 -1
  28. package/dist/trpc-envelope.d.ts +4 -4
  29. package/dist/trpc-envelope.d.ts.map +1 -1
  30. package/dist/trpc-envelope.js +1 -1
  31. package/dist/version-resolution.d.ts +5 -5
  32. package/dist/version-resolution.d.ts.map +1 -1
  33. package/dist/version-resolution.js +2 -2
  34. package/dist/widget-commands.d.ts +108 -108
  35. package/dist/widget-commands.d.ts.map +1 -1
  36. package/dist/widget-commands.js +30 -56
  37. package/dist/widget-config.d.ts +161 -245
  38. package/dist/widget-config.d.ts.map +1 -1
  39. package/dist/widget-config.js +22 -36
  40. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"app-event.d.ts","sourceRoot":"","sources":["../src/app-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAC;AAEH,KAAK,iBAAiB,GACnB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,iBAAiB,EAAE,GACnB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAA;CAAE,CAAC;AAaxC,eAAO,MAAM,0BAA0B;;;;iBAIrC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;iBAY7B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;iBAInC,CAAC;AAQH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAMhC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAM7B,CAAC;AAMH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGrC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGtC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAG9B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAGhC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACrE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"app-event.d.ts","sourceRoot":"","sources":["../src/app-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAG9B,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAC;AAEH,KAAK,iBAAiB,GACnB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,iBAAiB,EAAE,GACnB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAA;CAAE,CAAC;AAaxC,eAAO,MAAM,0BAA0B;;;;iBAIrC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;iBAY7B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;iBAInC,CAAC;AAQH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAMhC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAM7B,CAAC;AAMH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGrC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGtC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAG9B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAGhC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACrE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
package/dist/app-event.js CHANGED
@@ -1,9 +1,9 @@
1
- import * as z from "zod";
1
+ import * as z from "zod/mini";
2
2
  import { appEventIdentityTypeSchema } from "./identity-type.js";
3
3
  export { appEventIdentityTypeSchema } from "./identity-type.js";
4
4
  export const appEventIdentitySchema = z.object({
5
5
  type: appEventIdentityTypeSchema,
6
- value: z.string().trim().min(1),
6
+ value: z.string().check(z.trim(), z.minLength(1)),
7
7
  });
8
8
  const appEventFlagValueSchema = z.lazy(() => z.union([
9
9
  z.string(),
@@ -14,24 +14,24 @@ const appEventFlagValueSchema = z.lazy(() => z.union([
14
14
  z.record(z.string(), appEventFlagValueSchema),
15
15
  ]));
16
16
  export const appEventFlagProviderSchema = z.object({
17
- name: z.string().trim().min(1),
18
- project: z.optional(z.string().trim().min(1)),
19
- environment: z.optional(z.string().trim().min(1)),
17
+ name: z.string().check(z.trim(), z.minLength(1)),
18
+ project: z.optional(z.string().check(z.trim(), z.minLength(1))),
19
+ environment: z.optional(z.string().check(z.trim(), z.minLength(1))),
20
20
  });
21
21
  export const appEventFlagSchema = z.object({
22
- key: z.string().trim().min(1),
23
- target: z.optional(z.string().trim().min(1)),
22
+ key: z.string().check(z.trim(), z.minLength(1)),
23
+ target: z.optional(z.string().check(z.trim(), z.minLength(1))),
24
24
  value: appEventFlagValueSchema,
25
- variant: z.optional(z.string().trim().min(1)),
25
+ variant: z.optional(z.string().check(z.trim(), z.minLength(1))),
26
26
  origin: z.optional(z.enum(["runtime_config", "trigger_context", "provider_sync", "api"])),
27
27
  provider: z.optional(appEventFlagProviderSchema),
28
- status: z.optional(z.string().trim().min(1)),
29
- reason: z.optional(z.string().trim().min(1)),
30
- evaluatedAt: z.optional(z.string().trim().min(1)),
28
+ status: z.optional(z.string().check(z.trim(), z.minLength(1))),
29
+ reason: z.optional(z.string().check(z.trim(), z.minLength(1))),
30
+ evaluatedAt: z.optional(z.string().check(z.trim(), z.minLength(1))),
31
31
  });
32
32
  export const appEventCapabilitySchema = z.object({
33
- key: z.string().trim().min(1),
34
- source: z.optional(z.string().trim().min(1)),
33
+ key: z.string().check(z.trim(), z.minLength(1)),
34
+ source: z.optional(z.string().check(z.trim(), z.minLength(1))),
35
35
  provider: z.optional(appEventFlagProviderSchema),
36
36
  });
37
37
  const appEventPageSchema = z.object({
@@ -56,15 +56,15 @@ export const appEventBaseSchema = z.object({
56
56
  const appEventSurveyReferenceSchema = z.object({
57
57
  surveyId: z.string(),
58
58
  });
59
- export const appEventSurveyViewedSchema = appEventBaseSchema.extend({
59
+ export const appEventSurveyViewedSchema = z.extend(appEventBaseSchema, {
60
60
  event: z.literal("Flow Viewed"),
61
61
  references: appEventSurveyReferenceSchema,
62
62
  });
63
- export const appEventFlowDismissedSchema = appEventBaseSchema.extend({
63
+ export const appEventFlowDismissedSchema = z.extend(appEventBaseSchema, {
64
64
  event: z.literal("Flow Dismissed"),
65
65
  references: appEventSurveyReferenceSchema,
66
66
  });
67
- export const appEventTrackSchema = appEventBaseSchema.extend({
67
+ export const appEventTrackSchema = z.extend(appEventBaseSchema, {
68
68
  event: z.enum(["Flow Viewed", "Flow Dismissed"]),
69
69
  references: appEventSurveyReferenceSchema,
70
70
  });
@@ -1,6 +1,6 @@
1
- import * as z from "zod";
2
- export declare const clientMetaSchema: z.ZodObject<{
3
- loader: z.ZodEnum<{
1
+ import * as z from "zod/mini";
2
+ export declare const clientMetaSchema: z.ZodMiniObject<{
3
+ loader: z.ZodMiniEnum<{
4
4
  custom: "custom";
5
5
  sdk: "sdk";
6
6
  gtm: "gtm";
@@ -8,32 +8,32 @@ export declare const clientMetaSchema: z.ZodObject<{
8
8
  rudderstack: "rudderstack";
9
9
  tealium: "tealium";
10
10
  }>;
11
- clientName: z.ZodOptional<z.ZodString>;
12
- clientVersion: z.ZodOptional<z.ZodString>;
13
- integrator: z.ZodOptional<z.ZodObject<{
14
- name: z.ZodOptional<z.ZodString>;
15
- version: z.ZodOptional<z.ZodString>;
11
+ clientName: z.ZodMiniOptional<z.ZodMiniString<string>>;
12
+ clientVersion: z.ZodMiniOptional<z.ZodMiniString<string>>;
13
+ integrator: z.ZodMiniOptional<z.ZodMiniObject<{
14
+ name: z.ZodMiniOptional<z.ZodMiniString<string>>;
15
+ version: z.ZodMiniOptional<z.ZodMiniString<string>>;
16
16
  }, z.core.$strip>>;
17
- transport: z.ZodOptional<z.ZodEnum<{
17
+ transport: z.ZodMiniOptional<z.ZodMiniEnum<{
18
18
  loader: "loader";
19
19
  "script-tag": "script-tag";
20
20
  esm: "esm";
21
21
  "tag-manager": "tag-manager";
22
22
  snippet: "snippet";
23
23
  }>>;
24
- runtime: z.ZodOptional<z.ZodObject<{
25
- framework: z.ZodOptional<z.ZodEnum<{
24
+ runtime: z.ZodMiniOptional<z.ZodMiniObject<{
25
+ framework: z.ZodMiniOptional<z.ZodMiniEnum<{
26
26
  next: "next";
27
27
  vite: "vite";
28
28
  webpack: "webpack";
29
29
  plain: "plain";
30
30
  }>>;
31
- runtime: z.ZodOptional<z.ZodEnum<{
31
+ runtime: z.ZodMiniOptional<z.ZodMiniEnum<{
32
32
  browser: "browser";
33
33
  edge: "edge";
34
34
  }>>;
35
35
  }, z.core.$strip>>;
36
- notes: z.ZodOptional<z.ZodString>;
36
+ notes: z.ZodMiniOptional<z.ZodMiniString<string>>;
37
37
  }, z.core.$strip>;
38
38
  export type ClientMeta = z.output<typeof clientMetaSchema>;
39
39
  //# sourceMappingURL=client-meta.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-meta.d.ts","sourceRoot":"","sources":["../src/client-meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoB3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"client-meta.d.ts","sourceRoot":"","sources":["../src/client-meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoB3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -1,16 +1,16 @@
1
- import * as z from "zod";
1
+ import * as z from "zod/mini";
2
2
  export const clientMetaSchema = z.object({
3
3
  loader: z.enum(["sdk", "gtm", "segment", "rudderstack", "tealium", "custom"]),
4
- clientName: z.optional(z.string().trim().min(1)),
5
- clientVersion: z.optional(z.string().trim().min(1)),
4
+ clientName: z.optional(z.string().check(z.trim(), z.minLength(1))),
5
+ clientVersion: z.optional(z.string().check(z.trim(), z.minLength(1))),
6
6
  integrator: z.optional(z.object({
7
- name: z.optional(z.string().trim().min(1)),
8
- version: z.optional(z.string().trim().min(1)),
7
+ name: z.optional(z.string().check(z.trim(), z.minLength(1))),
8
+ version: z.optional(z.string().check(z.trim(), z.minLength(1))),
9
9
  })),
10
10
  transport: z.optional(z.enum(["script-tag", "esm", "loader", "tag-manager", "snippet"])),
11
11
  runtime: z.optional(z.object({
12
12
  framework: z.optional(z.enum(["next", "vite", "webpack", "plain"])),
13
13
  runtime: z.optional(z.enum(["browser", "edge"])),
14
14
  })),
15
- notes: z.optional(z.string().trim().min(1)),
15
+ notes: z.optional(z.string().check(z.trim(), z.minLength(1))),
16
16
  });
@@ -0,0 +1,73 @@
1
+ import * as z from "zod/mini";
2
+ export declare const ErrorCategory: {
3
+ readonly INTERNAL: "INTERNAL";
4
+ readonly INVALID_USAGE: "INVALID_USAGE";
5
+ readonly HOST: "HOST";
6
+ };
7
+ export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory];
8
+ export declare const ErrorCategorySchema: z.ZodMiniEnum<{
9
+ INTERNAL: "INTERNAL";
10
+ INVALID_USAGE: "INVALID_USAGE";
11
+ HOST: "HOST";
12
+ }>;
13
+ export declare const ErrorEventSchema: z.ZodMiniObject<{
14
+ id: z.ZodMiniString<string>;
15
+ name: z.ZodMiniString<string>;
16
+ message: z.ZodMiniString<string>;
17
+ stack: z.ZodMiniOptional<z.ZodMiniString<string>>;
18
+ category: z.ZodMiniEnum<{
19
+ INTERNAL: "INTERNAL";
20
+ INVALID_USAGE: "INVALID_USAGE";
21
+ HOST: "HOST";
22
+ }>;
23
+ timestamp: z.ZodMiniNumber<number>;
24
+ probability: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
25
+ context: z.ZodMiniObject<{
26
+ widgetVersion: z.ZodMiniString<string>;
27
+ clientMeta: z.ZodMiniOptional<z.ZodMiniObject<{
28
+ loader: z.ZodMiniEnum<{
29
+ custom: "custom";
30
+ sdk: "sdk";
31
+ gtm: "gtm";
32
+ segment: "segment";
33
+ rudderstack: "rudderstack";
34
+ tealium: "tealium";
35
+ }>;
36
+ clientName: z.ZodMiniOptional<z.ZodMiniString<string>>;
37
+ clientVersion: z.ZodMiniOptional<z.ZodMiniString<string>>;
38
+ integrator: z.ZodMiniOptional<z.ZodMiniObject<{
39
+ name: z.ZodMiniOptional<z.ZodMiniString<string>>;
40
+ version: z.ZodMiniOptional<z.ZodMiniString<string>>;
41
+ }, z.core.$strip>>;
42
+ transport: z.ZodMiniOptional<z.ZodMiniEnum<{
43
+ loader: "loader";
44
+ "script-tag": "script-tag";
45
+ esm: "esm";
46
+ "tag-manager": "tag-manager";
47
+ snippet: "snippet";
48
+ }>>;
49
+ runtime: z.ZodMiniOptional<z.ZodMiniObject<{
50
+ framework: z.ZodMiniOptional<z.ZodMiniEnum<{
51
+ next: "next";
52
+ vite: "vite";
53
+ webpack: "webpack";
54
+ plain: "plain";
55
+ }>>;
56
+ runtime: z.ZodMiniOptional<z.ZodMiniEnum<{
57
+ browser: "browser";
58
+ edge: "edge";
59
+ }>>;
60
+ }, z.core.$strip>>;
61
+ notes: z.ZodMiniOptional<z.ZodMiniString<string>>;
62
+ }, z.core.$strip>>;
63
+ debug: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
64
+ }, z.core.$strip>;
65
+ }, z.core.$strip>;
66
+ export type ErrorEvent = z.output<typeof ErrorEventSchema>;
67
+ export type ProtocolErrorCode = "PARSE" | "VERSION" | "UNKNOWN_TYPE";
68
+ export declare class ProtocolError extends Error {
69
+ code: ProtocolErrorCode;
70
+ details: string;
71
+ constructor(code: ProtocolErrorCode, details: string);
72
+ }
73
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAQ9B,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE/E,eAAO,MAAM,mBAAmB;;;;EAI9B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAc3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE3D,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,SAAS,GAAG,cAAc,CAAC;AAIrE,qBAAa,aAAc,SAAQ,KAAK;IACvC,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;gBAEJ,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM;CASpD"}
package/dist/errors.js ADDED
@@ -0,0 +1,43 @@
1
+ import * as z from "zod/mini";
2
+ import { clientMetaSchema } from "./client-meta.js";
3
+ // ---------------------------------------------------------------------------
4
+ // Error-telemetry definitions shared across widget / host.
5
+ // ---------------------------------------------------------------------------
6
+ export const ErrorCategory = {
7
+ INTERNAL: "INTERNAL",
8
+ INVALID_USAGE: "INVALID_USAGE",
9
+ HOST: "HOST",
10
+ };
11
+ export const ErrorCategorySchema = z.enum([
12
+ ErrorCategory.INTERNAL,
13
+ ErrorCategory.INVALID_USAGE,
14
+ ErrorCategory.HOST,
15
+ ]);
16
+ export const ErrorEventSchema = z.object({
17
+ id: z.string(),
18
+ name: z.string(),
19
+ message: z.string(),
20
+ stack: z.optional(z.string()),
21
+ category: ErrorCategorySchema,
22
+ timestamp: z.number(),
23
+ probability: z.optional(z.number()),
24
+ context: z.object({
25
+ widgetVersion: z.string(),
26
+ clientMeta: z.optional(clientMetaSchema),
27
+ /** When true, telemetry was captured with debug mode on (affects how to interpret context). */
28
+ debug: z.optional(z.boolean()),
29
+ }),
30
+ });
31
+ const MAX_DETAIL_LENGTH = 80;
32
+ export class ProtocolError extends Error {
33
+ code;
34
+ details;
35
+ constructor(code, details) {
36
+ const short = details.length > MAX_DETAIL_LENGTH
37
+ ? details.slice(0, MAX_DETAIL_LENGTH)
38
+ : details;
39
+ super(short);
40
+ this.code = code;
41
+ this.details = short;
42
+ }
43
+ }