@sonicjs-cms/core 3.0.0-beta.22 → 3.0.0-beta.24

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 (108) hide show
  1. package/dist/adapters.cjs +512 -0
  2. package/dist/adapters.cjs.map +1 -0
  3. package/dist/adapters.d.cts +342 -0
  4. package/dist/adapters.d.ts +342 -0
  5. package/dist/adapters.js +501 -0
  6. package/dist/adapters.js.map +1 -0
  7. package/dist/admin-documents-form.template-55V2ZGWT.js +6 -0
  8. package/dist/{admin-documents-form.template-DDSH6ROU.js.map → admin-documents-form.template-55V2ZGWT.js.map} +1 -1
  9. package/dist/admin-documents-form.template-YNAVMJCV.cjs +19 -0
  10. package/dist/{admin-layout-catalyst.template-YQ4EMF2J.js.map → admin-documents-form.template-YNAVMJCV.cjs.map} +1 -1
  11. package/dist/admin-layout-catalyst.template-3XZXDGF7.cjs +21 -0
  12. package/dist/{admin-layout-catalyst.template-KDHKVLXR.cjs.map → admin-layout-catalyst.template-3XZXDGF7.cjs.map} +1 -1
  13. package/dist/admin-layout-catalyst.template-6UQGLCKI.js +7 -0
  14. package/dist/{admin-documents-form.template-LSZKGA5J.cjs.map → admin-layout-catalyst.template-6UQGLCKI.js.map} +1 -1
  15. package/dist/{chunk-FTXGZ3BF.cjs → chunk-37V3RET3.cjs} +21 -37
  16. package/dist/chunk-37V3RET3.cjs.map +1 -0
  17. package/dist/{chunk-3CT3SUR4.cjs → chunk-A2SN3RVL.cjs} +3 -3
  18. package/dist/chunk-A2SN3RVL.cjs.map +1 -0
  19. package/dist/{chunk-CRGUD4KC.cjs → chunk-BBEKHLTW.cjs} +9 -9
  20. package/dist/{chunk-CRGUD4KC.cjs.map → chunk-BBEKHLTW.cjs.map} +1 -1
  21. package/dist/{chunk-RMRJGMDE.js → chunk-BHND5PEV.js} +3 -3
  22. package/dist/{chunk-RMRJGMDE.js.map → chunk-BHND5PEV.js.map} +1 -1
  23. package/dist/{chunk-OBA2RYZN.js → chunk-BJROXF4N.js} +3 -3
  24. package/dist/{chunk-OBA2RYZN.js.map → chunk-BJROXF4N.js.map} +1 -1
  25. package/dist/{chunk-EUJAEB6W.cjs → chunk-BP52BFIV.cjs} +53 -4
  26. package/dist/chunk-BP52BFIV.cjs.map +1 -0
  27. package/dist/{chunk-PXNTCCPE.cjs → chunk-E66UVONV.cjs} +8 -8
  28. package/dist/{chunk-PXNTCCPE.cjs.map → chunk-E66UVONV.cjs.map} +1 -1
  29. package/dist/{chunk-CHWT5KBK.js → chunk-FHPEM77Y.js} +9 -25
  30. package/dist/chunk-FHPEM77Y.js.map +1 -0
  31. package/dist/{chunk-JFLZHOQP.cjs → chunk-I767LVN7.cjs} +531 -419
  32. package/dist/chunk-I767LVN7.cjs.map +1 -0
  33. package/dist/{chunk-N32OWET6.cjs → chunk-JMJM7DMM.cjs} +5 -5
  34. package/dist/{chunk-N32OWET6.cjs.map → chunk-JMJM7DMM.cjs.map} +1 -1
  35. package/dist/{chunk-QWSR4THH.cjs → chunk-KKNEYIZJ.cjs} +12 -5
  36. package/dist/chunk-KKNEYIZJ.cjs.map +1 -0
  37. package/dist/{chunk-73O4GPJ6.js → chunk-LNI3FYSI.js} +12 -5
  38. package/dist/chunk-LNI3FYSI.js.map +1 -0
  39. package/dist/{chunk-PYZYU7EK.cjs → chunk-QCJHCSOK.cjs} +36 -2
  40. package/dist/chunk-QCJHCSOK.cjs.map +1 -0
  41. package/dist/{chunk-MGHHPNJN.cjs → chunk-QJUJNTIU.cjs} +11 -59
  42. package/dist/chunk-QJUJNTIU.cjs.map +1 -0
  43. package/dist/{chunk-DOMXI5PM.js → chunk-RJ2O5IIE.js} +36 -2
  44. package/dist/chunk-RJ2O5IIE.js.map +1 -0
  45. package/dist/{chunk-5V62WT6M.js → chunk-THFZSDIU.js} +4 -2
  46. package/dist/chunk-THFZSDIU.js.map +1 -0
  47. package/dist/{chunk-2FCKKOA5.js → chunk-UIHIXTIS.js} +3 -3
  48. package/dist/chunk-UIHIXTIS.js.map +1 -0
  49. package/dist/{chunk-JQISFW6U.js → chunk-URIBTX27.js} +3 -3
  50. package/dist/{chunk-JQISFW6U.js.map → chunk-URIBTX27.js.map} +1 -1
  51. package/dist/{chunk-K623Q6WD.cjs → chunk-UYJQDDEE.cjs} +4 -2
  52. package/dist/chunk-UYJQDDEE.cjs.map +1 -0
  53. package/dist/{chunk-6KNTZ67K.js → chunk-VC5XVPLM.js} +234 -126
  54. package/dist/chunk-VC5XVPLM.js.map +1 -0
  55. package/dist/{chunk-I2DM27HP.js → chunk-VGEZNFWH.js} +49 -4
  56. package/dist/chunk-VGEZNFWH.js.map +1 -0
  57. package/dist/{chunk-GB2Q2DNK.js → chunk-VYQVDL2M.js} +5 -49
  58. package/dist/chunk-VYQVDL2M.js.map +1 -0
  59. package/dist/{define-plugin-DsKiGu1q.d.cts → define-plugin-DMcvEy_C.d.cts} +33 -0
  60. package/dist/{define-plugin-BYIey6sp.d.ts → define-plugin-D_6D9vVZ.d.ts} +33 -0
  61. package/dist/index.cjs +2587 -326
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.d.cts +30 -3
  64. package/dist/index.d.ts +30 -3
  65. package/dist/index.js +2281 -22
  66. package/dist/index.js.map +1 -1
  67. package/dist/middleware.cjs +34 -34
  68. package/dist/middleware.js +5 -5
  69. package/dist/migrations-FGXZPKDC.cjs +13 -0
  70. package/dist/{migrations-UIMA6ZL6.cjs.map → migrations-FGXZPKDC.cjs.map} +1 -1
  71. package/dist/migrations-Z6D27NAW.js +4 -0
  72. package/dist/{migrations-HLK2QF4T.js.map → migrations-Z6D27NAW.js.map} +1 -1
  73. package/dist/plugins.cjs +40 -40
  74. package/dist/plugins.d.cts +1 -1
  75. package/dist/plugins.d.ts +1 -1
  76. package/dist/plugins.js +3 -3
  77. package/dist/routes.cjs +29 -29
  78. package/dist/routes.js +9 -9
  79. package/dist/services.cjs +18 -18
  80. package/dist/services.js +2 -2
  81. package/dist/templates.cjs +17 -17
  82. package/dist/templates.js +3 -3
  83. package/dist/utils.cjs +3 -3
  84. package/dist/utils.js +1 -1
  85. package/migrations/0001_core.sql +7 -1
  86. package/package.json +10 -3
  87. package/dist/admin-documents-form.template-DDSH6ROU.js +0 -6
  88. package/dist/admin-documents-form.template-LSZKGA5J.cjs +0 -19
  89. package/dist/admin-layout-catalyst.template-KDHKVLXR.cjs +0 -21
  90. package/dist/admin-layout-catalyst.template-YQ4EMF2J.js +0 -7
  91. package/dist/chunk-2FCKKOA5.js.map +0 -1
  92. package/dist/chunk-3CT3SUR4.cjs.map +0 -1
  93. package/dist/chunk-5V62WT6M.js.map +0 -1
  94. package/dist/chunk-6KNTZ67K.js.map +0 -1
  95. package/dist/chunk-73O4GPJ6.js.map +0 -1
  96. package/dist/chunk-CHWT5KBK.js.map +0 -1
  97. package/dist/chunk-DOMXI5PM.js.map +0 -1
  98. package/dist/chunk-EUJAEB6W.cjs.map +0 -1
  99. package/dist/chunk-FTXGZ3BF.cjs.map +0 -1
  100. package/dist/chunk-GB2Q2DNK.js.map +0 -1
  101. package/dist/chunk-I2DM27HP.js.map +0 -1
  102. package/dist/chunk-JFLZHOQP.cjs.map +0 -1
  103. package/dist/chunk-K623Q6WD.cjs.map +0 -1
  104. package/dist/chunk-MGHHPNJN.cjs.map +0 -1
  105. package/dist/chunk-PYZYU7EK.cjs.map +0 -1
  106. package/dist/chunk-QWSR4THH.cjs.map +0 -1
  107. package/dist/migrations-HLK2QF4T.js +0 -4
  108. package/dist/migrations-UIMA6ZL6.cjs +0 -13
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { B as Bindings, a as BootIsolateFn, b as SonicJSApp, S as SonicJSConfig, V as Variables, c as createSonicJSApp, s as setupCoreMiddleware, d as setupCoreRoutes } from './app-aj39TGHB.cjs';
2
- import { o as DefinedPlugin } from './define-plugin-DsKiGu1q.cjs';
3
- export { B as BooleanField, e as ConfigSchema, f as ConfigSchemaField, h as CronContext, i as CronDeclaration, j as CronDispatchResult, k as CronTickEvent, l as CronablePlugin, H as HookSystemImpl, r as HookUtils, N as NumberField, P as ParsedField, v as PluginManagerClass, an as PluginMenuEntry, x as PluginRegistryImpl, y as PluginValidatorClass, z as PluginsRegistry, A as RegisterPluginsError, G as RegisterPluginsErrorReason, I as RegisterPluginsHostContext, J as RegisterablePlugin, K as RegistryEntry, ao as ResolvedPluginMenuEntry, L as ScopedHookSystemClass, O as SelectField, Q as SettingsFor, U as StringField, Y as applySchemaDefaults, _ as collectCronSchedules, $ as collectCrons, a2 as createScheduledHandler, a3 as definePlugin, a4 as dispatchCronTick, a5 as getHookSystem, ap as getPluginMenu, a6 as getTypedHooks, a8 as hasHookSystem, a9 as isDefinedPlugin, ae as parseConfigSchema, af as parseFormDataToSettings, ah as registerPlugins, ai as renderSchemaFields, aj as resetHookSystem, aq as resetPluginMenu, ar as resolvePluginMenuItems, ak as setHookSystem, as as setPluginMenu } from './define-plugin-DsKiGu1q.cjs';
2
+ import { o as DefinedPlugin } from './define-plugin-DMcvEy_C.cjs';
3
+ export { B as BooleanField, e as ConfigSchema, f as ConfigSchemaField, h as CronContext, i as CronDeclaration, j as CronDispatchResult, k as CronTickEvent, l as CronablePlugin, H as HookSystemImpl, r as HookUtils, N as NumberField, P as ParsedField, v as PluginManagerClass, an as PluginMenuEntry, x as PluginRegistryImpl, y as PluginValidatorClass, z as PluginsRegistry, A as RegisterPluginsError, G as RegisterPluginsErrorReason, I as RegisterPluginsHostContext, J as RegisterablePlugin, K as RegistryEntry, ao as ResolvedPluginMenuEntry, L as ScopedHookSystemClass, O as SelectField, Q as SettingsFor, U as StringField, Y as applySchemaDefaults, _ as collectCronSchedules, $ as collectCrons, a2 as createScheduledHandler, a3 as definePlugin, a4 as dispatchCronTick, a5 as getHookSystem, ap as getPluginMenu, a6 as getTypedHooks, a8 as hasHookSystem, a9 as isDefinedPlugin, ae as parseConfigSchema, af as parseFormDataToSettings, ah as registerPlugins, ai as renderSchemaFields, aj as resetHookSystem, aq as resetPluginMenu, ar as resolvePluginMenuItems, ak as setHookSystem, as as setPluginMenu } from './define-plugin-DMcvEy_C.cjs';
4
4
  import { D1Database as D1Database$1 } from '@cloudflare/workers-types';
5
5
  import { z } from 'zod';
6
6
  import { E as EmailProvider, N as NormalizedEmailMessage, t as SendResult } from './types-DT7XN5TX.cjs';
@@ -352,6 +352,7 @@ declare class DocumentRepository {
352
352
  getById(id: string): Promise<Document | null>;
353
353
  getCurrentDraft(rootId: string): Promise<Document | null>;
354
354
  getPublished(rootId: string): Promise<Document | null>;
355
+ getBySlug(typeId: string, slug: string): Promise<Document | null>;
355
356
  list(opts?: ListDocumentsOptions): Promise<Document[]>;
356
357
  listPublished(opts?: ListDocumentsOptions): Promise<Document[]>;
357
358
  listDrafts(opts?: ListDocumentsOptions): Promise<Document[]>;
@@ -709,6 +710,32 @@ declare function getUserProfileConfig(): UserProfileConfig | null;
709
710
  declare const userProfilesPlugin: DefinedPlugin;
710
711
  declare function createUserProfilesPlugin(): DefinedPlugin;
711
712
 
713
+ /**
714
+ * MCP plugin configuration.
715
+ *
716
+ * Config is supplied in code when the operator adds `mcpPlugin({...})` to the app's
717
+ * plugin register array — captured in a closure and resolved against the live
718
+ * CollectionRegistry on each request (so newly registered collections appear
719
+ * without a restart). All fields are optional with safe defaults.
720
+ */
721
+
722
+ declare const mcpConfigSchema: z.ZodObject<{
723
+ expose: z.ZodOptional<z.ZodArray<z.ZodString>>;
724
+ types: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
725
+ read: z.ZodDefault<z.ZodBoolean>;
726
+ write: z.ZodDefault<z.ZodBoolean>;
727
+ }, z.core.$strip>>>;
728
+ redactFields: z.ZodDefault<z.ZodArray<z.ZodString>>;
729
+ listLimit: z.ZodDefault<z.ZodNumber>;
730
+ }, z.core.$strip>;
731
+ type McpConfigInput = z.input<typeof mcpConfigSchema>;
732
+ type McpConfig = z.infer<typeof mcpConfigSchema>;
733
+
734
+ /** Build an MCP plugin instance bound to the given config. */
735
+ declare function mcpPlugin(options?: McpConfigInput): DefinedPlugin;
736
+ /** Alias matching the repo's `createXPlugin` convention. */
737
+ declare function createMcpPlugin(options?: McpConfigInput): DefinedPlugin;
738
+
712
739
  /**
713
740
  * @sonicjs/core - Main Entry Point
714
741
  *
@@ -729,4 +756,4 @@ declare function createUserProfilesPlugin(): DefinedPlugin;
729
756
 
730
757
  declare const VERSION: string;
731
758
 
732
- export { BUILT_IN_PROVIDERS, type CFSendEmailBinding, CloudflareEmailProvider, type CloudflareEmailProviderOptions, DocumentRepository, DocumentsService, FieldType, OAuthService, PluginDependencyCycleError, type ProfileFieldDefinition, RbacService, type SortablePlugin, type TopoSortOptions, type UserProfileConfig, VERSION, bootstrapDocumentTypes, createDb, createHelloWorldPlugin, createOAuthProvidersPlugin, createRedirectPlugin, createUserProfilesPlugin, defineUserProfile, emailReconciliationPlugin, generateTriggersComment, getUserProfileConfig, helloWorldPlugin, oauthProvidersPlugin, parseCronTriggers, redirectPlugin, _default as siteSettingsCollection, topoSort, updateWranglerTriggers, userProfilesPlugin };
759
+ export { BUILT_IN_PROVIDERS, type CFSendEmailBinding, CloudflareEmailProvider, type CloudflareEmailProviderOptions, DocumentRepository, DocumentsService, FieldType, type McpConfig, type McpConfigInput, OAuthService, PluginDependencyCycleError, type ProfileFieldDefinition, RbacService, type SortablePlugin, type TopoSortOptions, type UserProfileConfig, VERSION, bootstrapDocumentTypes, createDb, createHelloWorldPlugin, createMcpPlugin, createOAuthProvidersPlugin, createRedirectPlugin, createUserProfilesPlugin, defineUserProfile, emailReconciliationPlugin, generateTriggersComment, getUserProfileConfig, helloWorldPlugin, mcpPlugin, oauthProvidersPlugin, parseCronTriggers, redirectPlugin, _default as siteSettingsCollection, topoSort, updateWranglerTriggers, userProfilesPlugin };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { B as Bindings, a as BootIsolateFn, b as SonicJSApp, S as SonicJSConfig, V as Variables, c as createSonicJSApp, s as setupCoreMiddleware, d as setupCoreRoutes } from './app-01M0dIwt.js';
2
- import { o as DefinedPlugin } from './define-plugin-BYIey6sp.js';
3
- export { B as BooleanField, e as ConfigSchema, f as ConfigSchemaField, h as CronContext, i as CronDeclaration, j as CronDispatchResult, k as CronTickEvent, l as CronablePlugin, H as HookSystemImpl, r as HookUtils, N as NumberField, P as ParsedField, v as PluginManagerClass, an as PluginMenuEntry, x as PluginRegistryImpl, y as PluginValidatorClass, z as PluginsRegistry, A as RegisterPluginsError, G as RegisterPluginsErrorReason, I as RegisterPluginsHostContext, J as RegisterablePlugin, K as RegistryEntry, ao as ResolvedPluginMenuEntry, L as ScopedHookSystemClass, O as SelectField, Q as SettingsFor, U as StringField, Y as applySchemaDefaults, _ as collectCronSchedules, $ as collectCrons, a2 as createScheduledHandler, a3 as definePlugin, a4 as dispatchCronTick, a5 as getHookSystem, ap as getPluginMenu, a6 as getTypedHooks, a8 as hasHookSystem, a9 as isDefinedPlugin, ae as parseConfigSchema, af as parseFormDataToSettings, ah as registerPlugins, ai as renderSchemaFields, aj as resetHookSystem, aq as resetPluginMenu, ar as resolvePluginMenuItems, ak as setHookSystem, as as setPluginMenu } from './define-plugin-BYIey6sp.js';
2
+ import { o as DefinedPlugin } from './define-plugin-D_6D9vVZ.js';
3
+ export { B as BooleanField, e as ConfigSchema, f as ConfigSchemaField, h as CronContext, i as CronDeclaration, j as CronDispatchResult, k as CronTickEvent, l as CronablePlugin, H as HookSystemImpl, r as HookUtils, N as NumberField, P as ParsedField, v as PluginManagerClass, an as PluginMenuEntry, x as PluginRegistryImpl, y as PluginValidatorClass, z as PluginsRegistry, A as RegisterPluginsError, G as RegisterPluginsErrorReason, I as RegisterPluginsHostContext, J as RegisterablePlugin, K as RegistryEntry, ao as ResolvedPluginMenuEntry, L as ScopedHookSystemClass, O as SelectField, Q as SettingsFor, U as StringField, Y as applySchemaDefaults, _ as collectCronSchedules, $ as collectCrons, a2 as createScheduledHandler, a3 as definePlugin, a4 as dispatchCronTick, a5 as getHookSystem, ap as getPluginMenu, a6 as getTypedHooks, a8 as hasHookSystem, a9 as isDefinedPlugin, ae as parseConfigSchema, af as parseFormDataToSettings, ah as registerPlugins, ai as renderSchemaFields, aj as resetHookSystem, aq as resetPluginMenu, ar as resolvePluginMenuItems, ak as setHookSystem, as as setPluginMenu } from './define-plugin-D_6D9vVZ.js';
4
4
  import { D1Database as D1Database$1 } from '@cloudflare/workers-types';
5
5
  import { z } from 'zod';
6
6
  import { E as EmailProvider, N as NormalizedEmailMessage, t as SendResult } from './types-DT7XN5TX.js';
@@ -352,6 +352,7 @@ declare class DocumentRepository {
352
352
  getById(id: string): Promise<Document | null>;
353
353
  getCurrentDraft(rootId: string): Promise<Document | null>;
354
354
  getPublished(rootId: string): Promise<Document | null>;
355
+ getBySlug(typeId: string, slug: string): Promise<Document | null>;
355
356
  list(opts?: ListDocumentsOptions): Promise<Document[]>;
356
357
  listPublished(opts?: ListDocumentsOptions): Promise<Document[]>;
357
358
  listDrafts(opts?: ListDocumentsOptions): Promise<Document[]>;
@@ -709,6 +710,32 @@ declare function getUserProfileConfig(): UserProfileConfig | null;
709
710
  declare const userProfilesPlugin: DefinedPlugin;
710
711
  declare function createUserProfilesPlugin(): DefinedPlugin;
711
712
 
713
+ /**
714
+ * MCP plugin configuration.
715
+ *
716
+ * Config is supplied in code when the operator adds `mcpPlugin({...})` to the app's
717
+ * plugin register array — captured in a closure and resolved against the live
718
+ * CollectionRegistry on each request (so newly registered collections appear
719
+ * without a restart). All fields are optional with safe defaults.
720
+ */
721
+
722
+ declare const mcpConfigSchema: z.ZodObject<{
723
+ expose: z.ZodOptional<z.ZodArray<z.ZodString>>;
724
+ types: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
725
+ read: z.ZodDefault<z.ZodBoolean>;
726
+ write: z.ZodDefault<z.ZodBoolean>;
727
+ }, z.core.$strip>>>;
728
+ redactFields: z.ZodDefault<z.ZodArray<z.ZodString>>;
729
+ listLimit: z.ZodDefault<z.ZodNumber>;
730
+ }, z.core.$strip>;
731
+ type McpConfigInput = z.input<typeof mcpConfigSchema>;
732
+ type McpConfig = z.infer<typeof mcpConfigSchema>;
733
+
734
+ /** Build an MCP plugin instance bound to the given config. */
735
+ declare function mcpPlugin(options?: McpConfigInput): DefinedPlugin;
736
+ /** Alias matching the repo's `createXPlugin` convention. */
737
+ declare function createMcpPlugin(options?: McpConfigInput): DefinedPlugin;
738
+
712
739
  /**
713
740
  * @sonicjs/core - Main Entry Point
714
741
  *
@@ -729,4 +756,4 @@ declare function createUserProfilesPlugin(): DefinedPlugin;
729
756
 
730
757
  declare const VERSION: string;
731
758
 
732
- export { BUILT_IN_PROVIDERS, type CFSendEmailBinding, CloudflareEmailProvider, type CloudflareEmailProviderOptions, DocumentRepository, DocumentsService, FieldType, OAuthService, PluginDependencyCycleError, type ProfileFieldDefinition, RbacService, type SortablePlugin, type TopoSortOptions, type UserProfileConfig, VERSION, bootstrapDocumentTypes, createDb, createHelloWorldPlugin, createOAuthProvidersPlugin, createRedirectPlugin, createUserProfilesPlugin, defineUserProfile, emailReconciliationPlugin, generateTriggersComment, getUserProfileConfig, helloWorldPlugin, oauthProvidersPlugin, parseCronTriggers, redirectPlugin, _default as siteSettingsCollection, topoSort, updateWranglerTriggers, userProfilesPlugin };
759
+ export { BUILT_IN_PROVIDERS, type CFSendEmailBinding, CloudflareEmailProvider, type CloudflareEmailProviderOptions, DocumentRepository, DocumentsService, FieldType, type McpConfig, type McpConfigInput, OAuthService, PluginDependencyCycleError, type ProfileFieldDefinition, RbacService, type SortablePlugin, type TopoSortOptions, type UserProfileConfig, VERSION, bootstrapDocumentTypes, createDb, createHelloWorldPlugin, createMcpPlugin, createOAuthProvidersPlugin, createRedirectPlugin, createUserProfilesPlugin, defineUserProfile, emailReconciliationPlugin, generateTriggersComment, getUserProfileConfig, helloWorldPlugin, mcpPlugin, oauthProvidersPlugin, parseCronTriggers, redirectPlugin, _default as siteSettingsCollection, topoSort, updateWranglerTriggers, userProfilesPlugin };