@longsightgroup/qti3-player 0.2.1 → 0.3.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 (116) hide show
  1. package/dist/icons.d.ts +8 -0
  2. package/dist/icons.d.ts.map +1 -0
  3. package/dist/icons.js +45 -0
  4. package/dist/icons.js.map +1 -0
  5. package/dist/index.d.ts +3 -134
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -4712
  8. package/dist/index.js.map +1 -1
  9. package/dist/interaction-support.d.ts +34 -0
  10. package/dist/interaction-support.d.ts.map +1 -0
  11. package/dist/interaction-support.js +189 -0
  12. package/dist/interaction-support.js.map +1 -0
  13. package/dist/movement.d.ts +3 -0
  14. package/dist/movement.d.ts.map +1 -0
  15. package/dist/movement.js +21 -0
  16. package/dist/movement.js.map +1 -0
  17. package/dist/player-element.d.ts +60 -0
  18. package/dist/player-element.d.ts.map +1 -0
  19. package/dist/player-element.js +367 -0
  20. package/dist/player-element.js.map +1 -0
  21. package/dist/player-locale.d.ts +6 -0
  22. package/dist/player-locale.d.ts.map +1 -0
  23. package/dist/player-locale.js +205 -0
  24. package/dist/player-locale.js.map +1 -0
  25. package/dist/player-messages.d.ts +40 -0
  26. package/dist/player-messages.d.ts.map +1 -0
  27. package/dist/player-messages.js +2 -0
  28. package/dist/player-messages.js.map +1 -0
  29. package/dist/player-styles.d.ts +3 -0
  30. package/dist/player-styles.d.ts.map +1 -0
  31. package/dist/player-styles.js +24 -0
  32. package/dist/player-styles.js.map +1 -0
  33. package/dist/player-types.d.ts +71 -0
  34. package/dist/player-types.d.ts.map +1 -0
  35. package/dist/player-types.js +2 -0
  36. package/dist/player-types.js.map +1 -0
  37. package/dist/player-validation-dom.d.ts +3 -0
  38. package/dist/player-validation-dom.d.ts.map +1 -0
  39. package/dist/player-validation-dom.js +28 -0
  40. package/dist/player-validation-dom.js.map +1 -0
  41. package/dist/player-validation.d.ts +13 -0
  42. package/dist/player-validation.d.ts.map +1 -0
  43. package/dist/player-validation.js +123 -0
  44. package/dist/player-validation.js.map +1 -0
  45. package/dist/portable-custom-support.d.ts +11 -0
  46. package/dist/portable-custom-support.d.ts.map +1 -0
  47. package/dist/portable-custom-support.js +70 -0
  48. package/dist/portable-custom-support.js.map +1 -0
  49. package/dist/response-limits.d.ts +9 -0
  50. package/dist/response-limits.d.ts.map +1 -0
  51. package/dist/response-limits.js +44 -0
  52. package/dist/response-limits.js.map +1 -0
  53. package/package.json +4 -4
  54. package/src/content/content-dom.ts +274 -0
  55. package/src/content/content-renderer.ts +114 -0
  56. package/src/controls/remove-button.ts +13 -0
  57. package/src/icons.ts +47 -0
  58. package/src/index.ts +26 -5307
  59. package/src/interaction-support.ts +263 -0
  60. package/src/interactions/choice-interaction.ts +92 -0
  61. package/src/interactions/drawing-interaction.ts +447 -0
  62. package/src/interactions/end-attempt-interaction.ts +19 -0
  63. package/src/interactions/gap-match-interaction.ts +337 -0
  64. package/src/interactions/graphic-associate-interaction.ts +324 -0
  65. package/src/interactions/graphic-context.ts +33 -0
  66. package/src/interactions/hotspot-interaction.ts +87 -0
  67. package/src/interactions/hottext-interaction.ts +81 -0
  68. package/src/interactions/inline-choice-interaction.ts +45 -0
  69. package/src/interactions/inline-controls.ts +21 -0
  70. package/src/interactions/interaction-diagnostics.ts +159 -0
  71. package/src/interactions/interaction-dispatch.ts +9 -0
  72. package/src/interactions/interaction-label.ts +10 -0
  73. package/src/interactions/interaction-registry.ts +209 -0
  74. package/src/interactions/match-interaction.ts +199 -0
  75. package/src/interactions/object-asset.ts +212 -0
  76. package/src/interactions/pair-interaction.ts +147 -0
  77. package/src/interactions/point-value.ts +41 -0
  78. package/src/interactions/portable-custom-interaction.ts +139 -0
  79. package/src/interactions/position-object-interaction.ts +210 -0
  80. package/src/interactions/routing.ts +27 -0
  81. package/src/interactions/select-point-interaction.ts +185 -0
  82. package/src/interactions/shared.ts +56 -0
  83. package/src/interactions/text-interaction.ts +127 -0
  84. package/src/interactions/unsupported-interaction.ts +25 -0
  85. package/src/interactions/upload-interaction.ts +16 -0
  86. package/src/movement.ts +29 -0
  87. package/src/player/attempt-availability.ts +36 -0
  88. package/src/player/content-state.ts +63 -0
  89. package/src/player/dynamic-body.ts +40 -0
  90. package/src/player/feedback-panel.ts +23 -0
  91. package/src/player/fetch-xml.ts +8 -0
  92. package/src/player/interaction-render.ts +89 -0
  93. package/src/player/render-shell.ts +44 -0
  94. package/src/player/resolve-assets.ts +12 -0
  95. package/src/player/validation-messages.ts +42 -0
  96. package/src/player-element.ts +493 -0
  97. package/src/player-locale.ts +232 -0
  98. package/src/player-messages.ts +31 -0
  99. package/src/player-styles.ts +25 -0
  100. package/src/player-types.ts +99 -0
  101. package/src/player-validation-dom.ts +31 -0
  102. package/src/player-validation.ts +158 -0
  103. package/src/portable-custom-support.ts +74 -0
  104. package/src/reorder/a11y.ts +40 -0
  105. package/src/reorder/graphic-order-interaction.ts +260 -0
  106. package/src/reorder/list-controls.ts +114 -0
  107. package/src/reorder/order-interaction.ts +75 -0
  108. package/src/response-limits.ts +47 -0
  109. package/src/styles/base-styles.ts +117 -0
  110. package/src/styles/choice-hottext-styles.ts +75 -0
  111. package/src/styles/control-styles.ts +113 -0
  112. package/src/styles/drawing-styles.ts +29 -0
  113. package/src/styles/gap-match-styles.ts +32 -0
  114. package/src/styles/graphic-styles.ts +294 -0
  115. package/src/styles/match-pair-styles.ts +61 -0
  116. package/src/styles/text-slider-styles.ts +34 -0
@@ -0,0 +1,189 @@
1
+ import { qtiValueToIdentifierList } from "@longsightgroup/qti3-core";
2
+ import { errorView } from "./player-validation.js";
3
+ export function responseGroup(className) {
4
+ const group = document.createElement("div");
5
+ group.className = ["qti3-response-group", className].filter(Boolean).join(" ");
6
+ return group;
7
+ }
8
+ export function interactionChoices(interaction) {
9
+ return interaction.choices;
10
+ }
11
+ export function missingChoicesMessage(interaction) {
12
+ const identifier = interaction.responseIdentifier ? ` (${interaction.responseIdentifier})` : "";
13
+ return errorView(`No choices are defined for the ${interaction.type} interaction${identifier}.`);
14
+ }
15
+ export function applyGraphicSurfaceLayout(surface, width, height, ...classNames) {
16
+ surface.classList.add("qti3-graphic-surface", ...classNames);
17
+ applyResponsiveGraphicSize(surface, width, height);
18
+ }
19
+ export function applyResponsiveGraphicSize(element, width, height) {
20
+ element.style.display = "block";
21
+ element.style.inlineSize = "100%";
22
+ element.style.maxInlineSize = `${width}px`;
23
+ element.style.aspectRatio = `${width} / ${height}`;
24
+ }
25
+ export function choiceSelector(identifier) {
26
+ return `[data-choice-identifier="${CSS.escape(identifier)}"]`;
27
+ }
28
+ export function valueToStrings(value) {
29
+ return qtiValueToIdentifierList(value);
30
+ }
31
+ export function orderChoicesFromValue(choices, value) {
32
+ const identifiers = valueToStrings(value);
33
+ if (identifiers.length === 0)
34
+ return [...choices];
35
+ const byIdentifier = new Map(choices.map((choice) => [choice.identifier, choice]));
36
+ const ordered = identifiers
37
+ .map((identifier) => byIdentifier.get(identifier))
38
+ .filter((choice) => Boolean(choice));
39
+ const used = new Set(ordered.map((choice) => choice.identifier));
40
+ ordered.push(...choices.filter((choice) => !used.has(choice.identifier)));
41
+ return ordered;
42
+ }
43
+ export function readableType(type) {
44
+ return type
45
+ .replace(/[A-Z]/g, (letter) => ` ${letter.toLowerCase()}`)
46
+ .replace(/^./, (letter) => letter.toUpperCase());
47
+ }
48
+ function dimension(value, fallback) {
49
+ const parsed = Number(value);
50
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
51
+ }
52
+ export function objectWidth(interaction) {
53
+ return dimension(interaction.object?.width, 160);
54
+ }
55
+ export function objectHeight(interaction) {
56
+ return dimension(interaction.object?.height, 120);
57
+ }
58
+ export function objectIsImage(object) {
59
+ return Boolean(object.type?.startsWith("image/") ||
60
+ object.data?.startsWith("data:image/") ||
61
+ /\.(svg|png|jpg|jpeg|gif|webp)(?:[?#].*)?$/i.test(object.data ?? ""));
62
+ }
63
+ export function appendGraphicObjectImage(surface, object, alt) {
64
+ if (!object.data || !objectIsImage(object))
65
+ return;
66
+ const image = document.createElement("img");
67
+ image.className = "qti3-graphic-object-image";
68
+ image.src = object.data;
69
+ image.alt = alt;
70
+ surface.append(image);
71
+ }
72
+ function percent(value, total) {
73
+ if (total <= 0)
74
+ return 0;
75
+ return (value / total) * 100;
76
+ }
77
+ export { percent };
78
+ function hotspotCoords(choice) {
79
+ return (choice.attributes.coords ?? "")
80
+ .split(",")
81
+ .map((value) => Number(value.trim()))
82
+ .filter((value) => Number.isFinite(value));
83
+ }
84
+ export function applyGraphicRegionPlacement(element, placement) {
85
+ element.style.setProperty("--qti3-graphic-region-inline-start", placement.insetInlineStart);
86
+ element.style.setProperty("--qti3-graphic-region-block-start", placement.insetBlockStart);
87
+ if (placement.inlineSize !== undefined) {
88
+ element.style.setProperty("--qti3-graphic-region-inline-size", placement.inlineSize);
89
+ }
90
+ else {
91
+ element.style.removeProperty("--qti3-graphic-region-inline-size");
92
+ }
93
+ if (placement.blockSize !== undefined) {
94
+ element.style.setProperty("--qti3-graphic-region-block-size", placement.blockSize);
95
+ }
96
+ else {
97
+ element.style.removeProperty("--qti3-graphic-region-block-size");
98
+ }
99
+ if (placement.shape)
100
+ element.dataset.shape = placement.shape;
101
+ else
102
+ delete element.dataset.shape;
103
+ }
104
+ export function applyPointMarkerPlacement(marker, insetInlineStart, insetBlockStart) {
105
+ marker.style.setProperty("--qti3-point-marker-inline-start", insetInlineStart);
106
+ marker.style.setProperty("--qti3-point-marker-block-start", insetBlockStart);
107
+ }
108
+ export function applyPositionObjectMarkerSize(marker, inlineSize, blockSize) {
109
+ marker.style.setProperty("--qti3-position-object-marker-inline-size", `${inlineSize}px`);
110
+ marker.style.setProperty("--qti3-position-object-marker-block-size", `${blockSize}px`);
111
+ }
112
+ export function applyPositionObjectMarkerPlacement(marker, insetInlineStart, insetBlockStart) {
113
+ marker.style.setProperty("--qti3-position-object-marker-inline-start", insetInlineStart);
114
+ marker.style.setProperty("--qti3-position-object-marker-block-start", insetBlockStart);
115
+ }
116
+ export function placeHotspotButton(button, choice, width, height) {
117
+ const coords = hotspotCoords(choice);
118
+ const shape = choice.attributes.shape;
119
+ if (shape === "circle" && coords.length >= 3) {
120
+ const [x, y, radius] = coords;
121
+ applyGraphicRegionPlacement(button, {
122
+ insetInlineStart: `${percent(x - radius, width)}%`,
123
+ insetBlockStart: `${percent(y - radius, height)}%`,
124
+ inlineSize: `${percent(radius * 2, width)}%`,
125
+ blockSize: `${percent(radius * 2, height)}%`,
126
+ shape: "circle",
127
+ });
128
+ return;
129
+ }
130
+ if (shape === "rect" && coords.length >= 4) {
131
+ const [left, top, right, bottom] = coords;
132
+ applyGraphicRegionPlacement(button, {
133
+ insetInlineStart: `${percent(left, width)}%`,
134
+ insetBlockStart: `${percent(top, height)}%`,
135
+ inlineSize: `${percent(Math.max(1, right - left), width)}%`,
136
+ blockSize: `${percent(Math.max(1, bottom - top), height)}%`,
137
+ shape: "rect",
138
+ });
139
+ return;
140
+ }
141
+ if (shape === "poly" && coords.length >= 6) {
142
+ const xs = coords.filter((_, index) => index % 2 === 0);
143
+ const ys = coords.filter((_, index) => index % 2 === 1);
144
+ const left = Math.min(...xs);
145
+ const top = Math.min(...ys);
146
+ const right = Math.max(...xs);
147
+ const bottom = Math.max(...ys);
148
+ applyGraphicRegionPlacement(button, {
149
+ insetInlineStart: `${percent(left, width)}%`,
150
+ insetBlockStart: `${percent(top, height)}%`,
151
+ inlineSize: `${percent(Math.max(1, right - left), width)}%`,
152
+ blockSize: `${percent(Math.max(1, bottom - top), height)}%`,
153
+ shape: "poly",
154
+ });
155
+ return;
156
+ }
157
+ applyGraphicRegionPlacement(button, {
158
+ insetInlineStart: "0",
159
+ insetBlockStart: "0",
160
+ });
161
+ }
162
+ export function hotspotCenter(choice, width, height) {
163
+ const coords = hotspotCoords(choice);
164
+ const shape = choice.attributes.shape;
165
+ if ((shape === "circle" || shape === "ellipse") && coords.length >= 2) {
166
+ const [x, y] = coords;
167
+ return { x, y };
168
+ }
169
+ if (shape === "rect" && coords.length >= 4) {
170
+ const [left, top, right, bottom] = coords;
171
+ return { x: (left + right) / 2, y: (top + bottom) / 2 };
172
+ }
173
+ if (shape === "poly" && coords.length >= 6) {
174
+ const xs = coords.filter((_, index) => index % 2 === 0);
175
+ const ys = coords.filter((_, index) => index % 2 === 1);
176
+ return {
177
+ x: (Math.min(...xs) + Math.max(...xs)) / 2,
178
+ y: (Math.min(...ys) + Math.max(...ys)) / 2,
179
+ };
180
+ }
181
+ return { x: width / 2, y: height / 2 };
182
+ }
183
+ export function hotspotDisplayLabel(choice, choices) {
184
+ return choice.attributes["hotspot-label"] || `Region ${choices.indexOf(choice) + 1}`;
185
+ }
186
+ export function hotspotAccessibleLabel(choice, index) {
187
+ return (choice.attributes["aria-label"] || choice.attributes["hotspot-label"] || `Region ${index + 1}`);
188
+ }
189
+ //# sourceMappingURL=interaction-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-support.js","sourceRoot":"","sources":["../src/interaction-support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type MovementDirection = "up" | "down" | "left" | "right";
2
+ export declare function movementButton(direction: MovementDirection, accessibleName: string, onClick: () => void): HTMLButtonElement;
3
+ //# sourceMappingURL=movement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movement.d.ts","sourceRoot":"","sources":["../src/movement.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAajE,wBAAgB,cAAc,CAC5B,SAAS,EAAE,iBAAiB,EAC5B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,IAAI,GAClB,iBAAiB,CASnB"}
@@ -0,0 +1,21 @@
1
+ import { inlineIcon } from "./icons.js";
2
+ const movementIconPaths = {
3
+ up: ["M12 5l0 14", "M18 11l-6 -6", "M6 11l6 -6"],
4
+ down: ["M12 5l0 14", "M18 13l-6 6", "M6 13l6 6"],
5
+ left: ["M5 12l14 0", "M5 12l6 6", "M5 12l6 -6"],
6
+ right: ["M5 12l14 0", "M13 18l6 -6", "M13 6l6 6"],
7
+ };
8
+ function movementIcon(direction) {
9
+ return inlineIcon("qti3-movement-icon", movementIconPaths[direction]);
10
+ }
11
+ export function movementButton(direction, accessibleName, onClick) {
12
+ const button = document.createElement("button");
13
+ button.type = "button";
14
+ button.className = "qti3-icon-button qti3-move-button";
15
+ button.dataset.moveDirection = direction;
16
+ button.setAttribute("aria-label", accessibleName);
17
+ button.append(movementIcon(direction));
18
+ button.addEventListener("click", onClick);
19
+ return button;
20
+ }
21
+ //# sourceMappingURL=movement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movement.js","sourceRoot":"","sources":["../src/movement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxC,MAAM,iBAAiB,GAAwC;IAC7D,EAAE,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,CAAC;IAChD,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC;IAChD,IAAI,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC;IAC/C,KAAK,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC;CAClD,CAAC;AAEF,SAAS,YAAY,CAAC,SAA4B;IAChD,OAAO,UAAU,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,SAA4B,EAC5B,cAAsB,EACtB,OAAmB;IAEnB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,MAAM,CAAC,SAAS,GAAG,mCAAmC,CAAC;IACvD,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IACzC,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAClD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IACvC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { type QtiAttemptStateV1, type QtiScoreResult, type QtiCatalogSupportResolution, type QtiCatalogSupportResolutionOptions, type QtiTextToSpeechTraversal } from "@longsightgroup/qti3-core";
2
+ import type { QtiPlayerLoadOptions, QtiPlayerMessageOverrides, QtiScoreAttemptOptions } from "./player-types.js";
3
+ declare const HTMLElementBase: typeof HTMLElement;
4
+ export declare class QtiAssessmentItemPlayer extends HTMLElementBase {
5
+ static get observedAttributes(): string[];
6
+ private documentModel?;
7
+ private session?;
8
+ private resolveAsset;
9
+ private validationMessages;
10
+ private authoringDiagnostics;
11
+ private languageOfInterfaceOverride;
12
+ private messageOverrides;
13
+ private sessionControl;
14
+ get languageOfInterface(): string;
15
+ set languageOfInterface(value: string | undefined);
16
+ get locale(): string;
17
+ set locale(value: string | undefined);
18
+ get messages(): QtiPlayerMessageOverrides;
19
+ set messages(value: QtiPlayerMessageOverrides | undefined);
20
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
21
+ loadXml(xml: string, options?: QtiPlayerLoadOptions): Promise<void>;
22
+ loadUrl(url: string, options?: QtiPlayerLoadOptions): Promise<void>;
23
+ scoreAttempt(options?: QtiScoreAttemptOptions): QtiScoreResult | undefined;
24
+ reset(): void;
25
+ restore(state: QtiAttemptStateV1): void;
26
+ suspend(): void;
27
+ endAttempt(options?: QtiScoreAttemptOptions): void;
28
+ serialize(): QtiAttemptStateV1 | undefined;
29
+ getTextToSpeechTraversal(): QtiTextToSpeechTraversal | undefined;
30
+ getCatalogSupportResolution(options?: QtiCatalogSupportResolutionOptions): QtiCatalogSupportResolution | undefined;
31
+ private emitStateChange;
32
+ private dispatchPlayerEvent;
33
+ private playerMessages;
34
+ private rerenderIfLoaded;
35
+ private render;
36
+ private renderInteraction;
37
+ private bindResponseUpdate;
38
+ private contentContext;
39
+ private renderPortableCustomResponse;
40
+ private updateDynamicBodyState;
41
+ private updateAttemptAvailability;
42
+ private attemptIsCompleted;
43
+ private currentResponseValue;
44
+ private currentInteractionState;
45
+ private setPortableCustomValidity;
46
+ private applyDefaultStyles;
47
+ private validateResponses;
48
+ private visibleValidationMessages;
49
+ private renderValidationMessages;
50
+ private clearValidationMessage;
51
+ private renderFeedback;
52
+ }
53
+ export declare function defineQtiAssessmentItemPlayer(): void;
54
+ declare global {
55
+ interface HTMLElementTagNameMap {
56
+ "qti-assessment-item-player": QtiAssessmentItemPlayer;
57
+ }
58
+ }
59
+ export {};
60
+ //# sourceMappingURL=player-element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-element.d.ts","sourceRoot":"","sources":["../src/player-element.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,iBAAiB,EAMtB,KAAK,cAAc,EACnB,KAAK,2BAA2B,EAChC,KAAK,kCAAkC,EACvC,KAAK,wBAAwB,EAE9B,MAAM,2BAA2B,CAAC;AA6BnC,OAAO,KAAK,EAGV,oBAAoB,EACpB,yBAAyB,EAGzB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAQ3B,QAAA,MAAM,eAAe,EAAE,OAAO,WAOO,CAAC;AAEtC,qBAAa,uBAAwB,SAAQ,eAAe;IAC1D,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,2BAA2B,CAAqB;IACxD,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,cAAc,CAGpB;IAEF,IAAI,mBAAmB,IAAI,MAAM,CAOhC;IAED,IAAI,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAGhD;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAEnC;IAED,IAAI,QAAQ,IAAI,yBAAyB,CAExC;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,yBAAyB,GAAG,SAAS,EAGxD;IAED,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAOxF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCvE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7E,YAAY,CAAC,OAAO,GAAE,sBAA2B,GAAG,cAAc,GAAG,SAAS;IA8B9E,KAAK,IAAI,IAAI;IAUb,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAqBvC,OAAO,IAAI,IAAI;IASf,UAAU,CAAC,OAAO,GAAE,sBAA2B,GAAG,IAAI;IAgBtD,SAAS,IAAI,iBAAiB,GAAG,SAAS;IAU1C,wBAAwB,IAAI,wBAAwB,GAAG,SAAS;IAKhE,2BAA2B,CACzB,OAAO,GAAE,kCAAuC,GAC/C,2BAA2B,GAAG,SAAS;IAK1C,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,MAAM;IAcd,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,4BAA4B;IAuBpC,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,yBAAyB;IAIjC,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,cAAc;CASvB;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAIpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,4BAA4B,EAAE,uBAAuB,CAAC;KACvD;CACF"}