@happyvertical/smrt-content 0.51.39 → 0.52.0

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 (72) hide show
  1. package/AGENTS.md +6 -0
  2. package/README.md +76 -0
  3. package/dist/body-format.d.ts +104 -0
  4. package/dist/body-format.d.ts.map +1 -1
  5. package/dist/body-format.js +439 -48
  6. package/dist/body-format.js.map +1 -1
  7. package/dist/chunks/content-query-BqLHbZYv.js +4131 -0
  8. package/dist/chunks/content-query-BqLHbZYv.js.map +1 -0
  9. package/dist/chunks/{content-versions-CvOoDLSK.js → content-versions-DatN0G28.js} +2 -2
  10. package/dist/chunks/{content-versions-CvOoDLSK.js.map → content-versions-DatN0G28.js.map} +1 -1
  11. package/dist/chunks/{contents-BB7RIBx2.js → contents-xas83N8M.js} +4 -6
  12. package/dist/chunks/contents-xas83N8M.js.map +1 -0
  13. package/dist/content-query.d.ts.map +1 -1
  14. package/dist/content.d.ts +13 -1
  15. package/dist/content.d.ts.map +1 -1
  16. package/dist/contents.d.ts.map +1 -1
  17. package/dist/index.d.ts +2 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +6 -6
  20. package/dist/manifest.json +113 -23
  21. package/dist/server/content-list-data-surface.d.ts +1 -1
  22. package/dist/server/content-list-data-surface.d.ts.map +1 -1
  23. package/dist/server.js +3 -3
  24. package/dist/server.js.map +1 -1
  25. package/dist/smrt-knowledge.json +92 -10
  26. package/dist/svelte/components/ContentBodyEditor.svelte +898 -38
  27. package/dist/svelte/components/ContentBodyEditor.svelte.d.ts +67 -0
  28. package/dist/svelte/components/ContentBodyEditor.svelte.d.ts.map +1 -1
  29. package/dist/svelte/components/ContentBodyRenderer.svelte +36 -11
  30. package/dist/svelte/components/ContentBodyRenderer.svelte.d.ts +2 -0
  31. package/dist/svelte/components/ContentBodyRenderer.svelte.d.ts.map +1 -1
  32. package/dist/svelte/components/ContentClaimAuditTool.svelte +45 -2
  33. package/dist/svelte/components/ContentCorrectionsTool.svelte +24 -2
  34. package/dist/svelte/components/ContentEditor.svelte +67 -17
  35. package/dist/svelte/components/ContentEditor.svelte.d.ts +12 -0
  36. package/dist/svelte/components/ContentEditor.svelte.d.ts.map +1 -1
  37. package/dist/svelte/components/ContentGovernancePanel.svelte +4 -2
  38. package/dist/svelte/components/ContentMetadataFields.svelte +141 -51
  39. package/dist/svelte/components/ContentMetadataFields.svelte.d.ts +20 -0
  40. package/dist/svelte/components/ContentMetadataFields.svelte.d.ts.map +1 -1
  41. package/dist/svelte/components/ContentPictureDrawer.svelte +611 -0
  42. package/dist/svelte/components/ContentPictureDrawer.svelte.d.ts +68 -0
  43. package/dist/svelte/components/ContentPictureDrawer.svelte.d.ts.map +1 -0
  44. package/dist/svelte/components/ContentReviewStatusTray.svelte +2 -2
  45. package/dist/svelte/components/ContentStatusFields.svelte +85 -38
  46. package/dist/svelte/components/ContentStatusFields.svelte.d.ts +10 -0
  47. package/dist/svelte/components/ContentStatusFields.svelte.d.ts.map +1 -1
  48. package/dist/svelte/components/ContentTitleField.svelte +109 -12
  49. package/dist/svelte/components/ContentTitleField.svelte.d.ts +12 -0
  50. package/dist/svelte/components/ContentTitleField.svelte.d.ts.map +1 -1
  51. package/dist/svelte/components/ContentTransparencyReport.svelte +3 -1
  52. package/dist/svelte/components/ContentTransparencyTool.svelte +18 -3
  53. package/dist/svelte/components/ContentVersionsTool.svelte +26 -2
  54. package/dist/svelte/components/content-field-mode.d.ts +20 -0
  55. package/dist/svelte/components/content-field-mode.d.ts.map +1 -0
  56. package/dist/svelte/components/content-field-mode.js +26 -0
  57. package/dist/svelte/content-editor-media.d.ts +14 -0
  58. package/dist/svelte/content-editor-media.d.ts.map +1 -1
  59. package/dist/svelte/content-editor-media.js +41 -0
  60. package/dist/svelte/content-editor-state.svelte.d.ts +17 -0
  61. package/dist/svelte/content-editor-state.svelte.d.ts.map +1 -1
  62. package/dist/svelte/content-editor-state.svelte.js +46 -0
  63. package/dist/svelte/i18n.editor.d.ts +49 -0
  64. package/dist/svelte/i18n.editor.d.ts.map +1 -1
  65. package/dist/svelte/i18n.editor.js +53 -1
  66. package/dist/svelte/index.d.ts +10 -5
  67. package/dist/svelte/index.d.ts.map +1 -1
  68. package/dist/svelte/index.js +5 -3
  69. package/package.json +27 -25
  70. package/dist/chunks/content-query-DPJCcD1V.js +0 -4092
  71. package/dist/chunks/content-query-DPJCcD1V.js.map +0 -1
  72. package/dist/chunks/contents-BB7RIBx2.js.map +0 -1
package/AGENTS.md CHANGED
@@ -89,6 +89,12 @@ Three strategies via ThumbnailGenerator:
89
89
  ### Content Management
90
90
  `ContentList`, `ContentEditor`, `GovernedContentEditor`, `ContentAgentChat`, `ContentTitleField`, `ContentStatusFields`, `ContentMetadataFields`, `ContentReferencesPanel`, `ContentImageBrowser`, `ContentReviewStatusTray`, `ArticleCard`, `ArticleList`, `ImageThumbnail`, `Markdown`
91
91
 
92
+ The editor fields (`ContentTitleField`, `ContentStatusFields`,
93
+ `ContentMetadataFields`, `ContentBodyEditor`) must keep a `name`, an `id`, and
94
+ a plain label on every control so they register for agents, and honour
95
+ `mode: 'simple' | 'full'` (+ `fields` allow-list; rules in
96
+ `components/content-field-mode.ts`). `full` stays the default.
97
+
92
98
  ### Governance
93
99
  `ContentGovernanceManager`, `ContentGovernancePanel`, `ContentGovernancePolicyEditor`, `ContentGovernanceProfileEditor`, `ContentGovernanceAssignmentEditor`, `ContentTransparencyReport`
94
100
 
package/README.md CHANGED
@@ -476,15 +476,91 @@ startup and seeds sample content (3 items) for immediate testing.
476
476
  | `ImageThumbnail` | `src`, `alt` | Thumbnail image display |
477
477
  | `Markdown` | `source` | Markdown renderer |
478
478
 
479
+ The governance panels (`ContentGovernancePanel`, the corrections, versions and
480
+ transparency tools, `ContentTransparencyReport`) lay out by their own width:
481
+ each is a `container-type: inline-size` container. A size container takes its
482
+ width from its host, not its content, so inside a shrink-to-fit host (an
483
+ absolutely positioned popover, an `auto` grid track, an inline-block) give the
484
+ panel or its host a definite width, or it collapses.
485
+
479
486
  `ContentList` retry handlers must return a new job attempt with a distinct
480
487
  `jobId`. The controller retains the failed attempt as immutable history so a
481
488
  late event from it cannot overwrite the retry result.
482
489
 
490
+ #### Simple mode and agent-ready editor fields
491
+
492
+ `ContentTitleField`, `ContentStatusFields`, `ContentMetadataFields`, and
493
+ `ContentBodyEditor` render smrt-ui fields with a stable `name`, an `id`, and a
494
+ plain label, so inside any `Form`, rich `<Form webmcp>`, or `FormScope` they
495
+ register with the control registry and an agent can propose a title, status,
496
+ story, author, summary, or tags for the person to review (`ContentBodyEditor`
497
+ registers the whole story as one `body` control in its own HTML/Markdown
498
+ format). `ContentTitleField` registers once you give it a `name` (e.g.
499
+ `name="title"`). Pass `idPrefix` to the status and metadata fields, and
500
+ `id`/`name` to the title and body, when two editors share a page.
501
+
502
+ `mode` (`'full'` by default, or `'simple'`) sets how much of the editor an
503
+ everyday editor sees; `fields` is an explicit allow-list that overrides it:
504
+
505
+ | | `full` | `simple` |
506
+ |---|---|---|
507
+ | `ContentStatusFields` | Type, State, Status, Published | Status, Publish date (optional) |
508
+ | `ContentMetadataFields` | Author, Description, Tags, URL, File key | Author, Summary, Tags — each "(optional)" — in a collapsed **Details** section (`details` controls it) |
509
+ | `ContentEditor` | every field and drawer | Type, State and References (with URL/File key) hidden; Metadata becomes a collapsed "Details" |
510
+
511
+ Simple mode uses plain labels ("Ready for review", "Summary", "Story").
512
+
483
513
  Applications that compose their own article editor can use
484
514
  `createContentEditorState`, `getContentEditorAssetImageSource`, and
485
515
  `resolveContentEditorImageSelection` to share the same form normalization,
486
516
  thumbnail selection, and save payload behavior as the package editors.
487
517
 
518
+ #### Body format picker
519
+
520
+ The toolbar's "Save as" HTML/Markdown picker is hidden by default. Pass
521
+ `showFormatPicker` to `ContentBodyEditor` (or `showBodyFormatPicker` to
522
+ `ContentEditor`) to offer it to technical editors. Without it the body keeps
523
+ the `format` it was given.
524
+
525
+ #### Image panel and thumbnail block
526
+
527
+ `ContentBodyEditor` takes an `imagePanel` snippet with `imagePanelOpen` and
528
+ `onCloseImagePanel`: the application's picture chooser/editor opens between
529
+ the toolbar and the text (full width, in the page flow, no modal), the image
530
+ button reports `aria-expanded`/`aria-controls`, focus moves into the panel on
531
+ open and back to the button on close, and Escape inside it asks to close.
532
+
533
+ When content gets a thumbnail, `placeThumbnailInBody(body, format, image)`
534
+ also shows it in the body at the standard spot for its shape
535
+ (`thumbnailPlacementForSize`: width ÷ height ≥ 1.3 is a full-width header at
536
+ the top; portrait or square floats right of the first paragraph, stacking full
537
+ width on phones). The block is marked (`data-smrt-thumbnail` in HTML, the
538
+ image title `smrt-thumbnail:<placement>` in Markdown) so placing again
539
+ replaces it and `removeThumbnailFromBody` clears it.
540
+ `resolveContentEditorImageDimensions(asset, src)` reads the size from the
541
+ asset or by loading the image. Public pages render stored bodies of either
542
+ format with `renderContentBodyHtml(body, format, { thumbnailSrc })` (or
543
+ `ContentBodyRenderer`), which sanitizes, turns the Markdown token into the same
544
+ marked `<img>`, and can point the thumbnail at the page's own asset URL.
545
+
546
+ #### Body sanitizing
547
+
548
+ `sanitizeHtml`, `renderMarkdownToHtml`, `renderContentBodyHtml`, and the
549
+ editor load/save helpers parse bodies with
550
+ [sanitize-html](https://github.com/apostrophecms/sanitize-html) (htmlparser2,
551
+ no DOM — identical in Node SSR/prerender and the browser) against an
552
+ allowlist: headings, paragraphs, lists, blockquote, `pre`/`code`, tables,
553
+ figures, inline emphasis, links (`http(s)`, `mailto`, `tel`, relative;
554
+ `target="_blank"` gets `rel="noopener noreferrer"`), and images (`http(s)`,
555
+ relative, raster `data:image/*` — never SVG) with the editor's
556
+ `data-smrt-*` layout and thumbnail markers and a `width`/`max-width`/
557
+ `height: auto` style. Everything else is removed: scripts, event handlers,
558
+ `javascript:`/`vbscript:` URLs, iframes and embeds (there is no embed
559
+ feature), SVG/MathML, forms, media, classes, ids, and other CSS. Raw-text and
560
+ foreign-content elements are dropped with their content, and the output is
561
+ re-serialized with escaped text, so nested or malformed markup cannot
562
+ reassemble into a live tag.
563
+
488
564
  ### Governance
489
565
 
490
566
  | Component | Props | Description |
@@ -7,6 +7,13 @@ export interface ContentBodyImage {
7
7
  assetId?: string;
8
8
  placement?: ContentBodyImagePlacement;
9
9
  width?: number;
10
+ /** True for the content's thumbnail block (see `placeThumbnailInBody`). */
11
+ thumbnail?: boolean;
12
+ /**
13
+ * True for a picture in the story the person chose as the main picture
14
+ * (see `setBodyMainImage`).
15
+ */
16
+ main?: boolean;
10
17
  index: number;
11
18
  }
12
19
  export declare const DEFAULT_CONTENT_BODY_FORMAT: ContentBodyFormat;
@@ -15,6 +22,14 @@ export declare function looksLikeHtml(value: unknown): boolean;
15
22
  export declare function resolveBodyFormat(format: unknown, body?: unknown): ContentBodyFormat;
16
23
  export declare function escapeHtml(value: string): string;
17
24
  export declare function escapeAttribute(value: string): string;
25
+ /**
26
+ * Allowlist-sanitize body HTML for rendering with `{@html}`: headings,
27
+ * paragraphs, lists, quotes, links (`http(s)`/`mailto`/`tel`/relative),
28
+ * images (`http(s)`/relative/raster `data:`) with the editor's layout and
29
+ * thumbnail markers, figures, tables, code, and inline emphasis. Everything
30
+ * else — scripts, event handlers, `javascript:` URLs, iframes/embeds,
31
+ * SVG/MathML, forms, classes, and all CSS except image width — is removed.
32
+ */
18
33
  export declare function sanitizeHtml(value: string): string;
19
34
  export declare function renderMarkdownToHtml(markdown: string): string;
20
35
  export declare function stripHtml(value: string): string;
@@ -41,4 +56,93 @@ export interface ImageAssetLike {
41
56
  export declare function getImageSource(asset: ImageAssetLike | null | undefined): string;
42
57
  export declare function getImageAlt(asset: ImageAssetLike | null | undefined): string;
43
58
  export declare function imageAssetToHtml(asset: ImageAssetLike | null | undefined): string;
59
+ /** Where the thumbnail block sits: header (`full`) or floated `right`. */
60
+ export type ContentBodyThumbnailPlacement = 'full' | 'right';
61
+ /** Width ÷ height at or above which a thumbnail counts as wide (a header). */
62
+ export declare const THUMBNAIL_WIDE_ASPECT_RATIO = 1.3;
63
+ /** Attribute that marks the thumbnail block's `<img>` in HTML bodies. */
64
+ export declare const BODY_THUMBNAIL_ATTRIBUTE = "data-smrt-thumbnail";
65
+ /**
66
+ * Attribute that marks a picture already in the story as the one the person
67
+ * chose as the main picture (HTML bodies). It travels with the picture, so a
68
+ * choice sticks when pictures are moved or reordered.
69
+ */
70
+ export declare const BODY_MAIN_IMAGE_ATTRIBUTE = "data-smrt-main";
71
+ export interface ContentBodyThumbnail {
72
+ /** Image URL written into the body. */
73
+ src: string;
74
+ /** Alternative text (default: empty — the article title usually says it). */
75
+ alt?: string | null;
76
+ /** Asset id, kept on the HTML `<img>` as `data-smrt-asset-id`. */
77
+ assetId?: string | null;
78
+ /** Natural width in pixels, used with `height` to choose the placement. */
79
+ width?: number | null;
80
+ /** Natural height in pixels. */
81
+ height?: number | null;
82
+ /** Force a placement instead of deriving it from `width`/`height`. */
83
+ placement?: ContentBodyThumbnailPlacement;
84
+ }
85
+ /**
86
+ * The standard thumbnail placement for an image of this size: wide
87
+ * (ratio ≥ {@link THUMBNAIL_WIDE_ASPECT_RATIO}) → `full` header; portrait or
88
+ * square → `right`. Unknown sizes default to `full`.
89
+ */
90
+ export declare function thumbnailPlacementForSize(width: unknown, height: unknown): ContentBodyThumbnailPlacement;
91
+ /** True when the body already contains a thumbnail block. */
92
+ export declare function bodyHasThumbnail(body: string | null | undefined, format?: ContentBodyFormat | null): boolean;
93
+ /** The body without its thumbnail block (unchanged when it has none). */
94
+ export declare function removeThumbnailFromBody(body: string | null | undefined, format?: ContentBodyFormat | null): string;
95
+ /**
96
+ * Put `thumbnail` into `body` at its standard spot, replacing any previous
97
+ * thumbnail block: `full` goes first in the body; `right` goes immediately
98
+ * before the first paragraph, floated so that paragraph wraps beside it.
99
+ * The placement comes from `thumbnail.placement` or its width/height
100
+ * ({@link thumbnailPlacementForSize}). Returns the body unchanged (minus any
101
+ * old block) when the image has no usable `src`.
102
+ */
103
+ export declare function placeThumbnailInBody(body: string | null | undefined, format: ContentBodyFormat | null | undefined, thumbnail: ContentBodyThumbnail): string;
104
+ export interface RenderContentBodyOptions {
105
+ /**
106
+ * Replace the thumbnail block's image URL — for renderers (e.g. a public
107
+ * site) that serve assets from a different origin than the editor that
108
+ * wrote the body.
109
+ */
110
+ thumbnailSrc?: string | null;
111
+ }
112
+ /**
113
+ * Sanitized HTML for a stored body in either format — what a public page
114
+ * renders. Markdown thumbnail blocks come out as the same marked `<img>` as
115
+ * HTML ones, so one stylesheet handles both.
116
+ */
117
+ export declare function renderContentBodyHtml(body: string | null | undefined, format?: ContentBodyFormat | null, options?: RenderContentBodyOptions): string;
118
+ /** How the main picture was decided. */
119
+ export type ContentMainPictureMode = 'chosen' | 'automatic' | 'none';
120
+ export interface ContentMainPicture {
121
+ /** The main picture's asset id, or null when there is none. */
122
+ assetId: string | null;
123
+ /**
124
+ * `chosen`: the person picked it. `automatic`: the first picture in the
125
+ * story. `none`: the story has no pictures with an asset id, so the
126
+ * current value (passed in) is kept as it is.
127
+ */
128
+ mode: ContentMainPictureMode;
129
+ }
130
+ /**
131
+ * The content's main picture according to its body: the chosen picture when
132
+ * there is one, otherwise the first picture in the story. Returns `none`
133
+ * with `currentAssetId` when the story has no pictures with asset ids, so
134
+ * a caller never clears a thumbnail set some other way.
135
+ */
136
+ export declare function resolveBodyMainPicture(body: string | null | undefined, format?: ContentBodyFormat | null, currentAssetId?: string | null): ContentMainPicture;
137
+ /**
138
+ * Mark the first picture in the story with `assetId` as the chosen main
139
+ * picture, clearing the mark from every other picture. `null` clears the
140
+ * choice, so the first picture is the main picture again. Works on HTML
141
+ * bodies and on Markdown ones (where the mark is the image title
142
+ * `smrt-image <id> main`); a body without that picture is returned with only
143
+ * the old marks cleared.
144
+ */
145
+ export declare function setBodyMainImage(body: string | null | undefined, format: ContentBodyFormat | null | undefined, assetId: string | null): string;
146
+ /** True when the story contains the picture with this asset id (not the thumbnail block). */
147
+ export declare function bodyHasImage(body: string | null | undefined, format: ContentBodyFormat | null | undefined, assetId: string): boolean;
44
148
  //# sourceMappingURL=body-format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"body-format.d.ts","sourceRoot":"","sources":["../src/body-format.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,MAAM,CAAC;AACpD,MAAM,MAAM,yBAAyB,GACjC,OAAO,GACP,MAAM,GACN,OAAO,GACP,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,2BAA2B,EAAE,iBAA0B,CAAC;AAqErE,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,iBAAiB,CAE5B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,EACf,IAAI,GAAE,OAAY,GACjB,iBAAiB,CAcnB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBhD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAsGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAyFlD;AAgCD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqE7D;AAuGD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AA6ED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgCnD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAIR;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAIR;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,iBAAsD,GAC7D,gBAAgB,EAAE,CAyFpB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GACvC,MAAM,CAER;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE5E;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GACvC,MAAM,CAeR"}
1
+ {"version":3,"file":"body-format.d.ts","sourceRoot":"","sources":["../src/body-format.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,MAAM,CAAC;AACpD,MAAM,MAAM,yBAAyB,GACjC,OAAO,GACP,MAAM,GACN,OAAO,GACP,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,2BAA2B,EAAE,iBAA0B,CAAC;AAwCrE,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,iBAAiB,CAE5B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,EACf,IAAI,GAAE,OAAY,GACjB,iBAAiB,CAcnB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBhD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAyaD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AA6CD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqE7D;AA6GD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAmFD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgCnD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAIR;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAIR;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,iBAAsD,GAC7D,gBAAgB,EAAE,CAmHpB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GACvC,MAAM,CAER;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE5E;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GACvC,MAAM,CAeR;AAiBD,0EAA0E;AAC1E,MAAM,MAAM,6BAA6B,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7D,8EAA8E;AAC9E,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,yEAAyE;AACzE,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAE9D;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,mBAAmB,CAAC;AAI1D,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sEAAsE;IACtE,SAAS,CAAC,EAAE,6BAA6B,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,GACd,6BAA6B,CAO/B;AA4ED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAChC,OAAO,CAOT;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAChC,MAAM,CAsBR;AA8CD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EAC5C,SAAS,EAAE,oBAAoB,GAC9B,MAAM,CAqCR;AAED,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,EACjC,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAcR;AAcD,wCAAwC;AACxC,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAErE,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;OAIG;IACH,IAAI,EAAE,sBAAsB,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,EACjC,cAAc,GAAE,MAAM,GAAG,IAAW,GACnC,kBAAkB,CAiBpB;AASD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EAC5C,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,MAAM,CA0CR;AAED,6FAA6F;AAC7F,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EAC5C,OAAO,EAAE,MAAM,GACd,OAAO,CAQT"}