@citolab/qti-components 8.0.2 → 8.2.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 (64) hide show
  1. package/cdn/index.global.js +1 -1
  2. package/cdn/index.js +751 -813
  3. package/dist/base.d.ts +63 -6
  4. package/dist/base.js +7 -1
  5. package/dist/{chunk-CK7AV2UJ.js → chunk-43XBJ47H.js} +3 -3
  6. package/dist/{chunk-7V4HJFHW.js → chunk-6ITD55QE.js} +2 -2
  7. package/dist/{chunk-HQESINXH.js → chunk-7D3NKAGZ.js} +137 -3
  8. package/dist/chunk-7D3NKAGZ.js.map +1 -0
  9. package/dist/{chunk-HBSWJC3B.js → chunk-CRLXQZFA.js} +595 -260
  10. package/dist/chunk-CRLXQZFA.js.map +1 -0
  11. package/dist/{chunk-IJD53WY6.js → chunk-HDEG6BAZ.js} +15 -15
  12. package/dist/{chunk-IJD53WY6.js.map → chunk-HDEG6BAZ.js.map} +1 -1
  13. package/dist/{chunk-RSVRS5AK.js → chunk-LMGJOBJA.js} +4 -4
  14. package/dist/{chunk-ZII6M3SN.js → chunk-M7K5C522.js} +2 -2
  15. package/dist/{chunk-J5SQLKNP.js → chunk-OIUK5BFU.js} +22 -6
  16. package/dist/{chunk-J5SQLKNP.js.map → chunk-OIUK5BFU.js.map} +1 -1
  17. package/dist/{chunk-VAE6HBKR.js → chunk-OVBG223G.js} +88 -62
  18. package/dist/chunk-OVBG223G.js.map +1 -0
  19. package/dist/{chunk-TWPXES3S.js → chunk-Q6ZK4LRH.js} +30 -6
  20. package/dist/chunk-Q6ZK4LRH.js.map +1 -0
  21. package/dist/chunk-TLTYXWW7.js +7 -0
  22. package/dist/chunk-TLTYXWW7.js.map +1 -0
  23. package/dist/{chunk-NJQHUUTN.js → chunk-U7YCXDYC.js} +2 -2
  24. package/dist/{chunk-BQFWCZFH.js → chunk-UC3T3NI3.js} +2 -2
  25. package/dist/{chunk-7AVWRQIS.js → chunk-YLRMOX6C.js} +63 -77
  26. package/dist/chunk-YLRMOX6C.js.map +1 -0
  27. package/dist/{computed.types.d-DpKIYO6e.d.ts → computed.types.d-CJarqC6s.d.ts} +12 -0
  28. package/dist/corrections.d.ts +14 -4
  29. package/dist/corrections.js +8 -8
  30. package/dist/elements.d.ts +1 -2
  31. package/dist/elements.js +4 -4
  32. package/dist/index.d.ts +7 -7
  33. package/dist/index.js +30 -14
  34. package/dist/interactions.js +3 -3
  35. package/dist/item.css +451 -532
  36. package/dist/item.d.ts +1 -1
  37. package/dist/item.js +5 -5
  38. package/dist/loader.d.ts +1 -1
  39. package/dist/loader.js +2 -2
  40. package/dist/processing.d.ts +64 -14
  41. package/dist/processing.js +10 -2
  42. package/dist/qti-components-jsx.d.ts +8139 -7358
  43. package/dist/{qti-condition-expression.d-aMvBvpc6.d.ts → qti-condition-expression.d-CYwXOUb1.d.ts} +1 -1
  44. package/dist/{qti-expression.d-BietT_8b.d.ts → qti-expression.d-B_-m9emA.d.ts} +11 -1
  45. package/dist/{qti-feedback.d-DZbad0RN.d.ts → qti-feedback.d-B1EIF-fU.d.ts} +1 -0
  46. package/dist/{qti-test.d-_YAlhDbt.d.ts → qti-test.d-C6lCEMRB.d.ts} +38 -3
  47. package/dist/test.d.ts +5 -5
  48. package/dist/test.js +8 -6
  49. package/dist/transformers.d.ts +1 -1
  50. package/dist/transformers.js +1 -1
  51. package/package.json +9 -9
  52. package/dist/chunk-7AVWRQIS.js.map +0 -1
  53. package/dist/chunk-G6GFQDVN.js +0 -7
  54. package/dist/chunk-G6GFQDVN.js.map +0 -1
  55. package/dist/chunk-HBSWJC3B.js.map +0 -1
  56. package/dist/chunk-HQESINXH.js.map +0 -1
  57. package/dist/chunk-TWPXES3S.js.map +0 -1
  58. package/dist/chunk-VAE6HBKR.js.map +0 -1
  59. /package/dist/{chunk-CK7AV2UJ.js.map → chunk-43XBJ47H.js.map} +0 -0
  60. /package/dist/{chunk-7V4HJFHW.js.map → chunk-6ITD55QE.js.map} +0 -0
  61. /package/dist/{chunk-RSVRS5AK.js.map → chunk-LMGJOBJA.js.map} +0 -0
  62. /package/dist/{chunk-ZII6M3SN.js.map → chunk-M7K5C522.js.map} +0 -0
  63. /package/dist/{chunk-NJQHUUTN.js.map → chunk-U7YCXDYC.js.map} +0 -0
  64. /package/dist/{chunk-BQFWCZFH.js.map → chunk-UC3T3NI3.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  qtiContentElements
3
- } from "./chunk-7AVWRQIS.js";
3
+ } from "./chunk-YLRMOX6C.js";
4
4
 
5
5
  // ../qti-elements/dist/register.js
6
6
  for (const { tag, ctor } of qtiContentElements) {
@@ -8,4 +8,4 @@ for (const { tag, ctor } of qtiContentElements) {
8
8
  customElements.define(tag, ctor);
9
9
  }
10
10
  }
11
- //# sourceMappingURL=chunk-NJQHUUTN.js.map
11
+ //# sourceMappingURL=chunk-U7YCXDYC.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  qtiTestElements
3
- } from "./chunk-HBSWJC3B.js";
3
+ } from "./chunk-CRLXQZFA.js";
4
4
 
5
5
  // ../qti-test/dist/register.js
6
6
  for (const { tag, ctor } of qtiTestElements) {
@@ -8,4 +8,4 @@ for (const { tag, ctor } of qtiTestElements) {
8
8
  customElements.define(tag, ctor);
9
9
  }
10
10
  }
11
- //# sourceMappingURL=chunk-BQFWCZFH.js.map
11
+ //# sourceMappingURL=chunk-UC3T3NI3.js.map
@@ -3,13 +3,13 @@ import {
3
3
  } from "./chunk-4DB4SC5K.js";
4
4
  import {
5
5
  qtiTransformItem
6
- } from "./chunk-IJD53WY6.js";
6
+ } from "./chunk-HDEG6BAZ.js";
7
7
  import {
8
8
  QtiFeedback,
9
9
  QtiVariableDeclaration,
10
10
  itemContext,
11
11
  itemContextVariables
12
- } from "./chunk-HQESINXH.js";
12
+ } from "./chunk-7D3NKAGZ.js";
13
13
 
14
14
  // ../qti-elements/dist/components/qti-assessment-item/qti-assessment-item.js
15
15
  import { provide } from "@lit/context";
@@ -269,7 +269,7 @@ var QtiAssessmentItem = class extends LitElement {
269
269
  this.dispatchEvent(new CustomEvent("qti-item-context-updated", {
270
270
  bubbles: true,
271
271
  composed: true,
272
- detail: { itemContext: this._context }
272
+ detail: { itemContext: this._context, responseProcessed: true }
273
273
  }));
274
274
  return canProcess;
275
275
  }
@@ -1068,60 +1068,59 @@ __decorate7([
1068
1068
  import { css as css8, html as html11, LitElement as LitElement8 } from "lit";
1069
1069
 
1070
1070
  // ../qti-elements/dist/internal/template-strings.js
1071
- var matchCorrect = `<qti-response-processing>
1072
- <qti-response-condition>
1073
- <qti-response-if>
1074
- <qti-match>
1075
- <qti-variable identifier="RESPONSE"></qti-variable>
1076
- <qti-correct identifier="RESPONSE"></qti-correct>
1077
- </qti-match>
1078
- <qti-set-outcome-value identifier="SCORE">
1079
- <qti-base-value base-type="float">1</qti-base-value>
1080
- </qti-set-outcome-value>
1081
- </qti-response-if>
1082
- <qti-response-else>
1083
- <qti-set-outcome-value identifier="SCORE">
1084
- <qti-base-value base-type="float">0</qti-base-value>
1085
- </qti-set-outcome-value>
1086
- </qti-response-else>
1087
- </qti-response-condition>
1088
- </qti-response-processing>`;
1089
- var mapResponse = `<qti-response-processing>
1090
- <qti-response-condition>
1091
- <qti-response-if>
1092
- <qti-is-null>
1093
- <qti-variable identifier="RESPONSE"></qti-variable>
1094
- </qti-is-null>
1095
- <qti-set-outcome-value identifier="SCORE">
1096
- <qti-base-value base-type="float">0.0</qti-base-value>
1097
- </qti-set-outcome-value>
1098
- </qti-response-if>
1099
- <qti-response-else>
1100
- <qti-set-outcome-value identifier="SCORE">
1101
- <qti-map-response identifier="RESPONSE"> </qti-map-response>
1102
- </qti-set-outcome-value>
1103
- </qti-response-else>
1104
- </qti-response-condition>
1105
- </qti-response-processing>`;
1106
- var mapResponsePoint = `<qti-response-processing>
1107
- <qti-response-condition>
1108
- <qti-response-if>
1109
- <qti-is-null>
1110
- <qti-variable identifier="RESPONSE"></qti-variable>
1111
- </qti-is-null>
1112
- <qti-set-outcome-value identifier="SCORE">
1113
- <qti-base-value base-type="float">0</qti-base-value>
1114
- </qti-set-outcome-value>
1115
- </qti-response-if>
1116
- <qti-response-else>
1117
- <qti-set-outcome-value identifier="SCORE">
1118
- <qti-map-response-point identifier="RESPONSE"></qti-map-response-point>
1119
- </qti-set-outcome-value>
1120
- </qti-response-else>
1121
- </qti-response-condition>
1122
- </qti-response-processing>`;
1071
+ var matchCorrect = `<qti-response-condition>
1072
+ <qti-response-if>
1073
+ <qti-match>
1074
+ <qti-variable identifier="RESPONSE"></qti-variable>
1075
+ <qti-correct identifier="RESPONSE"></qti-correct>
1076
+ </qti-match>
1077
+ <qti-set-outcome-value identifier="SCORE">
1078
+ <qti-base-value base-type="float">1</qti-base-value>
1079
+ </qti-set-outcome-value>
1080
+ </qti-response-if>
1081
+ <qti-response-else>
1082
+ <qti-set-outcome-value identifier="SCORE">
1083
+ <qti-base-value base-type="float">0</qti-base-value>
1084
+ </qti-set-outcome-value>
1085
+ </qti-response-else>
1086
+ </qti-response-condition>`;
1087
+ var mapResponse = `<qti-response-condition>
1088
+ <qti-response-if>
1089
+ <qti-is-null>
1090
+ <qti-variable identifier="RESPONSE"></qti-variable>
1091
+ </qti-is-null>
1092
+ <qti-set-outcome-value identifier="SCORE">
1093
+ <qti-base-value base-type="float">0.0</qti-base-value>
1094
+ </qti-set-outcome-value>
1095
+ </qti-response-if>
1096
+ <qti-response-else>
1097
+ <qti-set-outcome-value identifier="SCORE">
1098
+ <qti-map-response identifier="RESPONSE"> </qti-map-response>
1099
+ </qti-set-outcome-value>
1100
+ </qti-response-else>
1101
+ </qti-response-condition>`;
1102
+ var mapResponsePoint = `<qti-response-condition>
1103
+ <qti-response-if>
1104
+ <qti-is-null>
1105
+ <qti-variable identifier="RESPONSE"></qti-variable>
1106
+ </qti-is-null>
1107
+ <qti-set-outcome-value identifier="SCORE">
1108
+ <qti-base-value base-type="float">0</qti-base-value>
1109
+ </qti-set-outcome-value>
1110
+ </qti-response-if>
1111
+ <qti-response-else>
1112
+ <qti-set-outcome-value identifier="SCORE">
1113
+ <qti-map-response-point identifier="RESPONSE"></qti-map-response-point>
1114
+ </qti-set-outcome-value>
1115
+ </qti-response-else>
1116
+ </qti-response-condition>`;
1123
1117
 
1124
1118
  // ../qti-elements/dist/components/qti-response-processing/qti-response-processing.js
1119
+ var responseProcessingTemplates = {
1120
+ map_response: mapResponse,
1121
+ map_response_point: mapResponsePoint,
1122
+ match_correct: matchCorrect
1123
+ };
1125
1124
  var QtiResponseProcessing = class extends LitElement8 {
1126
1125
  static {
1127
1126
  this.styles = [
@@ -1145,27 +1144,14 @@ var QtiResponseProcessing = class extends LitElement8 {
1145
1144
  }
1146
1145
  }
1147
1146
  firstUpdated(_changedProperties) {
1148
- if (this.getAttribute("template")) {
1149
- const splittedTemplateName = this.getAttribute("template").split("/");
1150
- const templateName = splittedTemplateName[splittedTemplateName.length - 1].replace(".xml", "");
1151
- this.innerHTML = "";
1152
- switch (templateName) {
1153
- case "map_response": {
1154
- this.appendChild(this.#fragmentFromString(mapResponse).firstElementChild.firstElementChild);
1155
- break;
1156
- }
1157
- case "map_response_point": {
1158
- this.appendChild(this.#fragmentFromString(mapResponsePoint).firstElementChild.firstElementChild);
1159
- break;
1160
- }
1161
- case "match_correct":
1162
- this.appendChild(this.#fragmentFromString(matchCorrect).firstElementChild.firstElementChild);
1163
- break;
1164
- }
1165
- }
1166
- }
1167
- #fragmentFromString(strHTML) {
1168
- return document.createRange().createContextualFragment(strHTML);
1147
+ const template = this.getAttribute("template");
1148
+ if (!template)
1149
+ return;
1150
+ const templateName = template.split("/").pop().replace(".xml", "");
1151
+ const rules = responseProcessingTemplates[templateName];
1152
+ if (!rules)
1153
+ return;
1154
+ this.innerHTML = rules;
1169
1155
  }
1170
1156
  };
1171
1157
 
@@ -1555,4 +1541,4 @@ export {
1555
1541
  QtiTemplateProcessing,
1556
1542
  qtiContentElements
1557
1543
  };
1558
- //# sourceMappingURL=chunk-7AVWRQIS.js.map
1544
+ //# sourceMappingURL=chunk-YLRMOX6C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../qti-elements/src/components/qti-assessment-item/qti-assessment-item.ts","../../qti-elements/src/components/qti-assessment-stimulus-ref/qti-assessment-stimulus-ref.ts","../../qti-elements/src/components/qti-companion-materials-info/qti-companion-materials-info.ts","../../qti-elements/src/components/qti-content-body/qti-content-body.ts","../../qti-elements/src/components/qti-context-declaration/qti-context-declaration.ts","../../qti-elements/src/components/qti-custom-operator/qti-custom-operator.ts","../../qti-elements/src/components/qti-feedback-block/qti-feedback-block.ts","../../qti-elements/src/components/qti-feedback-inline/qti-feedback-inline.ts","../../qti-elements/src/components/qti-item-body/qti-item-body.ts","../../qti-elements/src/components/qti-item-body/qti-item-body.styles.ts","../../qti-elements/src/components/qti-modal-feedback/qti-modal-feedback.ts","../../qti-elements/src/components/qti-outcome-declaration/qti-outcome-declaration.ts","../../qti-elements/src/components/qti-response-declaration/qti-response-declaration.ts","../../qti-elements/src/components/qti-response-processing/qti-response-processing.ts","../../qti-elements/src/internal/template-strings.ts","../../qti-elements/src/components/qti-rubric-block/qti-rubric-block.ts","../../qti-elements/src/components/qti-stylesheet/qti-stylesheet.ts","../../qti-elements/src/components/qti-template-constraint/qti-template-constraint.ts","../../qti-elements/src/components/qti-template-declaration/qti-template-declaration.ts","../../qti-elements/src/components/qti-template-processing/qti-template-processing.ts","../../qti-elements/src/elements.ts"],"sourcesContent":["import { provide } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { property } from 'lit/decorators.js';\n\nimport { itemContext, itemContextVariables } from '@qti-components/base';\nimport { watch } from '@qti-components/utilities';\n\nimport type { QtiTemplateProcessing } from '../qti-template-processing/qti-template-processing.js';\nimport type { InteractionChangedDetails, OutcomeChangedDetails } from '../../internal/event-types.ts';\nimport type { QtiFeedback, ResponseInteraction } from '@qti-components/base';\nimport type { RegisteredInteraction } from '@qti-components/base';\nimport type { VariableDeclaration, VariableValue } from '@qti-components/base';\nimport type { OutcomeVariable, ResponseVariable, TemplateVariable } from '@qti-components/base';\nimport type { QtiResponseProcessing } from '../qti-response-processing/qti-response-processing.ts';\nimport type QtiRegisterVariable from '../../internal/events/qti-register-variable.ts';\nimport type { ItemContext } from '@qti-components/base';\n\n/**\n * @summary The qti-assessment-item element contains all the other QTI 3 item structures.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.dltnnj87l0yj\n *\n * @dependency qti-feedback\n * @dependency qti-responseprocessing\n *\n * @event qti-item-context-updated - Emitted when through a user action the itemContext is updated,\n * typically on interaction with the interactions, or calling response processing.\n */\n\nexport class QtiAssessmentItem extends LitElement {\n #itemTitle: string | undefined;\n #templateProcessing: QtiTemplateProcessing | null = null;\n\n @property({ type: String }) identifier: string = '';\n @property({ type: String }) adaptive: 'true' | 'false' = 'false';\n @property({ type: String }) timeDependent: 'true' | 'false' | null = null;\n\n @property({ type: String })\n override get title(): string {\n return this.#itemTitle;\n }\n override set title(value: string) {\n this.#itemTitle = value;\n this.removeAttribute('title');\n this.setAttribute('data-title', value);\n }\n\n @property({ type: Boolean }) disabled: boolean;\n @watch('disabled', { waitUntilFirstUpdate: true })\n protected _handleDisabledChange = (_: boolean, disabled: boolean) => {\n this.interactionElements.forEach(ch => (ch.disabled = disabled));\n };\n\n @property({ type: Boolean }) readonly: boolean;\n @watch('readonly', { waitUntilFirstUpdate: true })\n protected _handleReadonlyChange = (_: boolean, readonly: boolean) =>\n this.interactionElements.forEach(ch => (ch.readonly = readonly));\n\n @provide({ context: itemContext })\n private _context: ItemContext = {\n variables: itemContextVariables\n };\n\n /**\n * Sets the identifier for the assessment item reference if this item is in a test.\n *\n * @param identifier - The identifier for the assessment item reference.\n */\n public set assessmentItemRefId(identifier: string) {\n this._context = { ...this._context, identifier };\n }\n\n public get assessmentItemRefId(): string {\n return this._context.identifier;\n }\n\n public get variables(): VariableValue<string | string[] | null>[] {\n return this._context.variables.map(v => ({\n identifier: v.identifier,\n value: v.value,\n type: v.type,\n // add externalscored, a fixed prop to the test, so the testcontext can read and decide how to score this item\n ...(v.type === 'outcome' && v.identifier === 'SCORE'\n ? { externalScored: (v as OutcomeVariable).externalScored }\n : {})\n }));\n }\n\n public set variables(value: VariableValue<string | string[] | null>[]) {\n if (!Array.isArray(value) || value.some(v => !('identifier' in v))) {\n console.warn('variables property should be an array of VariableDeclaration');\n return;\n }\n this._context = {\n ...this._context,\n variables: this._context.variables.map(variable => {\n const matchingValue = value.find(v => v.identifier === variable.identifier);\n if (matchingValue) {\n return {\n ...variable,\n ...matchingValue,\n interpolationTable: (variable as OutcomeVariable).interpolationTable\n };\n }\n return variable;\n })\n };\n\n this._context.variables.forEach(variable => {\n if (variable.type === 'response') {\n const interactionElement = this.interactionElements.find(\n (el: RegisteredInteraction) => el.responseIdentifier === variable.identifier\n );\n if (interactionElement) {\n interactionElement.response = variable.value as string | string[];\n }\n }\n });\n\n this.variables.forEach(variable => {\n if (variable.type === 'outcome') {\n this.#feedbackElements.forEach(fe => fe.checkShowFeedback(variable.identifier));\n }\n });\n }\n\n public get state(): ItemContext['state'] {\n return this._context.state;\n }\n\n public set state(value: ItemContext['state']) {\n this._context = {\n ...this._context,\n state: value ? { ...value } : undefined\n };\n }\n\n #initialContext: Readonly<ItemContext> = { ...this._context, variables: this._context.variables };\n #feedbackElements: QtiFeedback[] = [];\n /** Registered candidate-input interactions. Correction packages may extend their presentation behavior. */\n protected interactionElements: RegisteredInteraction[] = [];\n\n /** @deprecated use variables property instead */\n set responses(myResponses: ResponseInteraction[]) {\n if (myResponses) {\n for (const response of myResponses) {\n const responseVariable = this.getResponse(response.responseIdentifier);\n if (responseVariable) {\n this.updateResponseVariable(response.responseIdentifier, response.response);\n }\n\n const interaction: RegisteredInteraction | undefined = this.interactionElements.find(\n i => i.getAttribute('response-identifier') === response.responseIdentifier\n );\n if (interaction) {\n interaction.response = response.response;\n }\n }\n }\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n\n override connectedCallback(): void {\n this.#attachEventListeners();\n super.connectedCallback();\n this.updateComplete.then(() => {\n this.dispatchEvent(\n new CustomEvent<QtiAssessmentItem>('qti-assessment-item-connected', {\n bubbles: true,\n composed: true,\n detail: this\n })\n );\n this.#processTemplates();\n });\n }\n\n override disconnectedCallback(): void {\n this.#removeEventListeners();\n super.disconnectedCallback();\n }\n\n #attachEventListeners() {\n this.addEventListener('qti-register-variable', this.#handleRegisterVariable);\n this.addEventListener('qti-register-feedback', this.#handleRegisterFeedback);\n this.addEventListener('qti-register-interaction', this.#handleRegisterInteraction);\n this.addEventListener('end-attempt', this.#handleEndAttempt);\n this.addEventListener('qti-set-outcome-value', this.#handleSetOutcomeValue);\n this.addEventListener('qti-set-template-value', this.#handleSetTemplateValue);\n this.addEventListener('qti-set-correct-response', this.#handleSetCorrectResponse);\n this.addEventListener('qti-interaction-response', this.#handleUpdateResponseVariable);\n }\n\n #removeEventListeners() {\n this.removeEventListener('qti-register-variable', this.#handleRegisterVariable);\n this.removeEventListener('qti-register-feedback', this.#handleRegisterFeedback);\n this.removeEventListener('qti-register-interaction', this.#handleRegisterInteraction);\n this.removeEventListener('end-attempt', this.#handleEndAttempt);\n this.removeEventListener('qti-set-outcome-value', this.#handleSetOutcomeValue);\n this.removeEventListener('qti-set-template-value', this.#handleSetTemplateValue);\n this.removeEventListener('qti-set-correct-response', this.#handleSetCorrectResponse);\n this.removeEventListener('qti-interaction-response', this.#handleUpdateResponseVariable);\n }\n\n #handleRegisterVariable = (e: QtiRegisterVariable) => {\n e.stopImmediatePropagation();\n this._context = { ...this._context, variables: [...this._context.variables, e.detail.variable] };\n this.#initialContext = this._context;\n e.stopPropagation();\n };\n\n #handleRegisterFeedback = (e: CustomEvent<QtiFeedback>) => {\n e.stopImmediatePropagation();\n const feedbackElement = e.detail;\n this.#feedbackElements.push(feedbackElement);\n const numAttempts = Number(this._context.variables.find(v => v.identifier === 'numAttempts')?.value) || 0;\n if (numAttempts > 0) {\n feedbackElement.checkShowFeedback(feedbackElement.outcomeIdentifier);\n }\n };\n\n #handleRegisterInteraction = (e: CustomEvent<{ interaction: string; interactionElement: RegisteredInteraction }>) => {\n e.stopImmediatePropagation();\n this.interactionElements.push(e.detail.interactionElement);\n };\n\n #handleEndAttempt = (e: CustomEvent<{ responseIdentifier: string; countAttempt: boolean }>) => {\n e.stopImmediatePropagation();\n const { responseIdentifier, countAttempt } = e.detail;\n this.validate();\n this.updateResponseVariable(responseIdentifier, 'true');\n this.processResponse(countAttempt);\n };\n\n #handleSetOutcomeValue = (e: CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>) => {\n e.stopImmediatePropagation();\n const { outcomeIdentifier, value } = e.detail;\n this.updateOutcomeVariable(outcomeIdentifier, value);\n e.stopPropagation();\n };\n\n #handleSetTemplateValue = (e: CustomEvent<{ templateIdentifier: string; value: string | string[] | null }>) => {\n e.stopImmediatePropagation();\n const { templateIdentifier, value } = e.detail;\n this.updateTemplateVariable(templateIdentifier, value ?? undefined);\n e.stopPropagation();\n };\n\n #handleSetCorrectResponse = (e: CustomEvent<{ responseIdentifier: string; value: string | string[] | null }>) => {\n e.stopImmediatePropagation();\n const { responseIdentifier, value } = e.detail;\n this.updateCorrectResponse(responseIdentifier, value ?? undefined);\n e.stopPropagation();\n };\n\n #handleUpdateResponseVariable = (e: CustomEvent<ResponseInteraction>) => {\n e.stopImmediatePropagation();\n\n const { responseIdentifier, response, state } = e.detail;\n this.updateResponseVariable(responseIdentifier, response);\n if (state !== undefined) {\n this._context = {\n ...this._context,\n state: {\n ...(this._context.state || {}),\n [responseIdentifier]: state\n }\n };\n }\n\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n };\n\n async #processTemplates(): Promise<void> {\n const templateDeclarations = Array.from(this.querySelectorAll<LitElement>('qti-template-declaration'));\n if (templateDeclarations.length > 0) {\n await Promise.all(templateDeclarations.map(declaration => declaration.updateComplete));\n await Promise.resolve();\n }\n\n this.#templateProcessing = this.querySelector<QtiTemplateProcessing>('qti-template-processing');\n if (this.#templateProcessing) {\n // Run template processing before first presentation\n this.#templateProcessing.process();\n this.#initialContext = { ...this._context, variables: this._context.variables };\n }\n }\n\n public processResponse(countNumAttempts = true, reportValidityAfterScoring = true): boolean {\n this.validate(reportValidityAfterScoring);\n\n if (countNumAttempts) {\n this.updateOutcomeVariable(\n 'numAttempts',\n (+this._context.variables.find(v => v.identifier === 'numAttempts')?.value + 1).toString()\n );\n }\n\n if (this.adaptive === 'false') {\n this.#resetOutcomeVariablesBeforeResponseProcessing();\n }\n\n const responseProcessor = this.querySelector<QtiResponseProcessing>('qti-response-processing');\n const canProcess = !!(responseProcessor && typeof responseProcessor.process === 'function');\n if (canProcess) {\n responseProcessor.process();\n }\n if (this.adaptive === 'false') {\n // if adaptive, completionStatus is set by the processing template\n this.updateOutcomeVariable('completionStatus', this.#getCompletionStatus());\n }\n\n // `responseProcessed` marks this as the end of an attempt (vs. a plain\n // selection, which fires the same event without the flag). Lets listeners\n // react only when an attempt actually ends.\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext; responseProcessed: boolean }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context, responseProcessed: true }\n })\n );\n\n return canProcess;\n }\n\n public resetResponses() {\n this._context = this.#initialContext;\n }\n\n protected getResponse(identifier: string): Readonly<ResponseVariable> {\n return this.getVariable(identifier) as ResponseVariable;\n }\n\n public getOutcome(identifier: string): Readonly<OutcomeVariable> {\n return this.getVariable(identifier) as OutcomeVariable;\n }\n\n protected getVariable(identifier: string): Readonly<VariableDeclaration<string | string[] | null>> {\n return this._context.variables.find(v => v.identifier === identifier) || null;\n }\n\n /** Extension point for presentation packages reacting to a candidate response change. */\n protected afterResponseVariableUpdated(): void {}\n\n // saving privates here: ------------------------------------------------------------------------------\n\n /**\n * Updates the response variable with the specified identifier to the given value.\n *\n * @protected\n *\n * This method is intended for internal use within the class and subclasses.\n * It should not be called externally by third parties.\n *\n * @param identifier - The identifier of the response variable to update.\n * @param value - The new value for the response variable.\n */\n public updateResponseVariable(identifier: string, value: string | string[] | undefined) {\n this._context = {\n ...this._context,\n variables: this._context.variables.map(v => (v.identifier !== identifier ? v : { ...v, value: value }))\n };\n\n this.afterResponseVariableUpdated();\n\n this.dispatchEvent(\n new CustomEvent<InteractionChangedDetails>('qti-interaction-changed', {\n bubbles: true,\n composed: true,\n detail: {\n item: this.identifier,\n responseIdentifier: identifier,\n response: Array.isArray(value) ? [...value] : value\n }\n })\n );\n\n if (this.adaptive === 'false') {\n // if adaptive, completionStatus is set by the processing template\n this.updateOutcomeVariable('completionStatus', this.#getCompletionStatus());\n }\n }\n\n /**\n * Updates the template variable with the specified identifier to the given value.\n */\n public updateTemplateVariable(identifier: string, value: string | string[] | undefined) {\n const templateVariable = this._context.variables.find(v => v.identifier === identifier && v.type === 'template') as\n | TemplateVariable\n | undefined;\n\n if (!templateVariable) {\n console.warn(`Can not set qti-template-identifier: ${identifier}, it is not available`);\n return;\n }\n\n const normalizedValue =\n templateVariable.cardinality === 'single'\n ? Array.isArray(value)\n ? value[0]\n : (value ?? null)\n : value === undefined || value === null\n ? null\n : Array.isArray(value)\n ? value\n : [value];\n\n this._context = {\n ...this._context,\n variables: this._context.variables.map(v =>\n v.identifier !== identifier\n ? v\n : {\n ...v,\n value: normalizedValue\n }\n )\n };\n\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n }\n\n /**\n * Updates the correct response for the specified response variable.\n */\n public updateCorrectResponse(identifier: string, value: string | string[] | undefined) {\n const responseVariable = this.getResponse(identifier);\n\n if (!responseVariable) {\n console.warn(`Can not set correct response for identifier: ${identifier}, it is not available`);\n return;\n }\n\n const normalizedValue =\n responseVariable.cardinality === 'single'\n ? Array.isArray(value)\n ? value[0]\n : (value ?? null)\n : value === undefined || value === null\n ? null\n : Array.isArray(value)\n ? value\n : [value];\n\n this._context = {\n ...this._context,\n variables: this._context.variables.map(v =>\n v.identifier !== identifier\n ? v\n : {\n ...v,\n correctResponse: normalizedValue\n }\n )\n };\n\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n }\n\n public setOutcomeVariable(identifier: string, value: string | string[] | undefined) {\n this.updateOutcomeVariable(identifier, value);\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n }\n\n /**\n * Updates the outcome variable with the specified identifier to the given value.\n *\n * @protected\n *\n * This method is intended for internal use within the class and subclasses.\n * It should not be called externally by third parties.\n *\n * @param identifier - The identifier of the response variable to update.\n * @param value - The new value for the response variable.\n */\n public updateOutcomeVariable(identifier: string, value: string | string[] | undefined) {\n const outcomeVariable = this.getOutcome(identifier);\n\n if (!outcomeVariable) {\n console.warn(`Can not set qti-outcome-identifier: ${identifier}, it is not available`);\n return;\n }\n\n this._context = {\n ...this._context,\n variables: this._context.variables.map(v => {\n if (v.identifier !== identifier) {\n return v;\n }\n return {\n ...v,\n value: outcomeVariable.cardinality === 'single' ? value : Array.isArray(value) ? value : [value]\n };\n })\n };\n this.#feedbackElements.forEach(fe => fe.checkShowFeedback(identifier));\n\n this.dispatchEvent(\n new CustomEvent<OutcomeChangedDetails>('qti-outcome-changed', {\n bubbles: true,\n composed: true,\n detail: {\n item: this.identifier,\n outcomeIdentifier: identifier,\n value: this._context.variables.find(v => v.identifier === identifier)?.value\n }\n })\n );\n }\n\n public validate(reportValidity = true): boolean {\n const isValid = this.interactionElements.every(interactionElement => interactionElement.validate());\n\n if (reportValidity) {\n this.reportValidity();\n }\n\n return isValid;\n }\n\n public reportValidity() {\n for (const interactionElement of this.interactionElements) {\n interactionElement.reportValidity();\n }\n }\n\n #getCompletionStatus(): 'completed' | 'incomplete' | 'not_attempted' | 'unknown' {\n const valid = this.validate(false);\n if (valid === true) return 'completed';\n if (valid === false) return 'incomplete';\n return 'not_attempted';\n }\n\n #resetOutcomeVariablesBeforeResponseProcessing(): void {\n this._context = {\n ...this._context,\n variables: this._context.variables.map(variable => {\n if (variable.type !== 'outcome') {\n return variable;\n }\n\n const hasDefaultValue = 'defaultValue' in variable;\n const declaredDefault = hasDefaultValue ? variable.defaultValue : null;\n\n let value = declaredDefault ?? null;\n if (\n (value === null || value === undefined) &&\n (variable.baseType === 'integer' || variable.baseType === 'float')\n ) {\n value = '0';\n }\n\n return {\n ...variable,\n value\n };\n })\n };\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-item': QtiAssessmentItem;\n }\n}\n","import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\n\nimport { qtiTransformItem } from '@qti-components/transformers';\n\nimport type { QtiAssessmentItem } from '../qti-assessment-item/qti-assessment-item';\n\nexport class QtiAssessmentStimulusRefConnectedEvent extends Event {\n public static eventName = 'qti-assessment-stimulus-ref-connected';\n constructor(\n public element: QtiAssessmentStimulusRef,\n public item: QtiAssessmentItem\n ) {\n super(QtiAssessmentStimulusRefConnectedEvent.eventName, { bubbles: true, composed: true, cancelable: true });\n }\n}\n\n/**\n * Represents a custom element for referencing an assessment stimulus.\n */\n\nexport class QtiAssessmentStimulusRef extends LitElement {\n @property({ type: String }) identifier = '';\n @property({ type: String }) href = '';\n\n /**\n * Lifecycle method called when the element is connected to the DOM.\n * First checks if there's a data-stimulus-idref element. If found, loads the stimulus directly.\n * If not found, delegates to the delivery platform via an event.\n */\n public override async connectedCallback(): Promise<void> {\n super.connectedCallback();\n // VERY important to wait for updateComplete to ensure that the stimulusRef is connected after item\n // for the test-navigation to correctly process everything in order\n await this.updateComplete;\n\n const item = this.closest<QtiAssessmentItem>('qti-assessment-item');\n\n const event = new QtiAssessmentStimulusRefConnectedEvent(this, item);\n this.dispatchEvent(event);\n\n const stimulusRef = item?.querySelector(`[data-stimulus-idref=\"${this.identifier}\"]`);\n if (!event.defaultPrevented && stimulusRef) {\n await this.updateStimulusRef(stimulusRef);\n }\n }\n\n /**\n * Loads and appends the stimulus to the specified element.\n * @param stimulusRef - The element to which the stimulus will be appended.\n */\n public async updateStimulusRef(stimulusRef: Element) {\n const stimulus = await qtiTransformItem()\n .load(this.href)\n .then(api => api.htmlDoc());\n if (stimulus) {\n const elements = stimulus.querySelectorAll('qti-stimulus-body, qti-stylesheet');\n stimulusRef.innerHTML = '';\n stimulusRef.append(...elements);\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-stimulus-ref': QtiAssessmentStimulusRef;\n }\n}\n","import { LitElement } from 'lit';\n\nexport class QtiCompanionMaterialsInfo extends LitElement {\n // static override styles = css`\n // slot {\n // display: hidden;\n // }\n // `;\n // override render() {\n // return html` <slot></slot> `;\n // }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-companion-materials-info': QtiCompanionMaterialsInfo;\n }\n}\n","import { consume } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { state } from 'lit/decorators.js';\n\nimport { itemContext } from '@qti-components/base';\n\nimport type { ItemContext, TemplateVariable } from '@qti-components/base';\n\nexport class QtiContentBody extends LitElement {\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n override render() {\n return html`<slot @slotchange=${this.#expandMathVariables}></slot>`;\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.updateComplete.then(() => this.#expandMathVariables());\n }\n\n protected override updated(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('context')) {\n this.#expandMathVariables();\n }\n }\n\n #expandMathVariables(): void {\n const mathVariables = new Map<string, string>();\n const templateVariables = (this.context?.variables ?? []).filter(variable => variable.type === 'template');\n\n for (const variable of templateVariables) {\n const templateVariable = variable as TemplateVariable;\n if (\n templateVariable.mathVariable !== true ||\n templateVariable.value === null ||\n templateVariable.value === undefined\n ) {\n continue;\n }\n\n mathVariables.set(templateVariable.identifier, this.#stringifyValue(templateVariable.value));\n }\n\n if (mathVariables.size === 0) {\n return;\n }\n\n const mathIdentifiers = Array.from(this.querySelectorAll('*')).filter(\n element => element.localName.toLowerCase() === 'mi' || element.localName.toLowerCase() === 'mn'\n );\n\n for (const element of mathIdentifiers) {\n const identifier = element.getAttribute('data-qti-math-variable-source') ?? element.textContent?.trim() ?? '';\n const value = mathVariables.get(identifier);\n\n if (!value) {\n continue;\n }\n\n if (element.localName.toLowerCase() === 'mn') {\n element.textContent = value;\n element.setAttribute('data-qti-math-variable-source', identifier);\n continue;\n }\n\n const replacement = document.createElement('mn');\n replacement.textContent = value;\n replacement.setAttribute('data-qti-math-variable-source', identifier);\n element.replaceWith(replacement);\n }\n }\n\n #stringifyValue(value: string | readonly string[] | number | boolean | null): string {\n if (Array.isArray(value)) {\n return value.join(' ');\n }\n\n return value?.toString() ?? '';\n }\n}\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-content-body': QtiContentBody;\n }\n}\n","import { css, LitElement, html } from 'lit';\nimport { property } from 'lit/decorators.js';\n\n/**\n * @summary The qti-context-declaration element declares context variables for an item.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.qti-context-declaration\n */\n\nexport class QtiContextDeclaration extends LitElement {\n @property({ type: String }) identifier: string = '';\n @property({ type: String }) cardinality: 'single' | 'multiple' | 'ordered' | 'record' = 'record';\n\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-context-declaration': QtiContextDeclaration;\n }\n}\n","import { consume } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { state } from 'lit/decorators.js';\n\nimport { itemContext } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\nimport type { Calculate } from '@qti-components/base';\nimport type { ItemContext } from '@qti-components/base';\n\n/**\n * https://www.imsglobal.org/spec/qti/v3p0/impl#h.fi29q8dubjgw\n * <qti-custom-operator class=\"js.org\">\n <qti-base-value base-type=\"string\"><![CDATA[\n console.log(context.variables);\n return 'B'\n document.querySelector('qti-end-attempt-interaction').disabled = true;\n ]]></qti-base-value>\n </qti-custom-operator>\n </qti-set-outcome-value>\n */\n\nexport class QtiCustomOperator extends LitElement implements Calculate {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n #operatorFunction: Function;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n private _context?: ItemContext;\n\n override render() {\n return html`<slot @slotchange=${this.handleSlotChange}></slot>`;\n }\n\n handleSlotChange() {\n // expecting <[!CDATA[ ... ]]> is converted into <!-- ... --> with qti-transform: cDataToComment\n const commentNode = Array.from(this.firstElementChild?.childNodes ?? []).find(\n node => node.nodeType === Node.COMMENT_NODE\n );\n try {\n this.#operatorFunction = new Function('context', 'fn', 'item', commentNode?.textContent ?? '');\n } catch (e) {\n console.error('custom-operator contains invalid javascript code', e);\n }\n }\n\n public calculate() {\n const fn = {\n variable: (responseIdentifier: string) =>\n this._context?.variables.find(v => v.identifier === responseIdentifier)?.value ?? '',\n correct: (responseIdentifier: string) =>\n (this._context?.variables.find(v => v.identifier === responseIdentifier) as ResponseVariable)\n ?.correctResponse ?? ''\n };\n const item = {\n getVariable: (variableIdentifier: string) =>\n this._context?.variables.find(v => v.identifier === variableIdentifier),\n updateOutcomeVariable: (outcomeIdentifier: string, value: string | string[]) => {\n this.dispatchEvent(\n new CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>('qti-set-outcome-value', {\n bubbles: true,\n composed: true,\n detail: {\n outcomeIdentifier,\n value\n }\n })\n );\n },\n updateResponseVariable: (responseIdentifier: string, response: string | string[]) => {\n this.dispatchEvent(\n new CustomEvent<{ responseIdentifier: string; response: string | string[] }>('qti-interaction-response', {\n bubbles: true,\n composed: true,\n detail: {\n responseIdentifier,\n response\n }\n })\n );\n }\n };\n\n return this.#operatorFunction(this._context, fn, item);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-custom-operator': QtiCustomOperator;\n }\n}\n","import { css, html } from 'lit';\n\nimport { QtiFeedback } from '@qti-components/base';\n\nexport class QtiFeedbackBlock extends QtiFeedback {\n static override styles = css`\n :host {\n display: block;\n }\n .on {\n display: block;\n }\n .off {\n display: none;\n }\n `;\n\n override render() {\n return html` <slot part=\"feedback\" class=\"feedback ${this.showStatus}\"></slot> `;\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.checkShowFeedback(this.outcomeIdentifier);\n }\n}\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-feedback-block': QtiFeedbackBlock;\n }\n}\n","import { css, html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { QtiFeedback } from '@qti-components/base';\n\nexport class QtiFeedbackInline extends QtiFeedback {\n static override styles = css`\n .on {\n display: inline-block;\n }\n .off {\n display: none;\n }\n `;\n\n override render = () => html` <slot part=\"feedback\" class=\"${ifDefined(this.showStatus)}\"></slot> `;\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.checkShowFeedback(this.outcomeIdentifier);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-feedback-inline': QtiFeedbackInline;\n }\n}\n","import { html, LitElement } from 'lit';\n\nimport styles from './qti-item-body.styles';\n\nimport type { CSSResultGroup } from 'lit';\n\n/**\n * @summary The qti-item-body node contains the text, graphics, media objects and interactions that describe the item's content and information about how it is structured.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.sphpo6lu6zqi\n * @status stable\n * @since 4.0\n *\n * @slot - item body content.\n * @slot qti-rubric-block - the qti rubric block is placed above the item\n * @part qti-rubric-block - the qti rubric block part\n */\n\nexport class QtiItemBody extends LitElement {\n static override styles: CSSResultGroup = styles;\n\n override render() {\n return html`<slot part=\"qti-rubric-blocks\" name=\"qti-rubric-block\"></slot><slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-item-body': QtiItemBody;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: block;\n }\n`;\n","import { css, html } from 'lit';\n\nimport { QtiFeedback } from '@qti-components/base';\n\nexport class QtiModalFeedback extends QtiFeedback {\n static override styles = css`\n .cito-dialog {\n background: var(--qti-bg);\n border: var(--qti-border-thickness) var(--qti-border-style) var(--qti-border-color);\n border-radius: var(--qti-border-radius);\n padding: var(--qti-padding-box);\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1000;\n width: auto;\n max-width: 90%;\n }\n\n .button {\n border-radius: var(--qti-border-radius);\n padding: var(--qti-padding-box);\n background-color: var(--qti-bg-active);\n border: var(--qti-border-active);\n cursor: pointer;\n position: relative;\n display: inline-block;\n }\n\n /* Inlined from --qti-disabled-bg / --qti-disabled-color, which this button was the only reader\n of anywhere in the repo. They were named as a global disabled vocabulary but no interaction\n ever used them: the theme's disabled treatment is cursor only (see the note in qti-mixins.css). */\n .button:disabled {\n background-color: transparent;\n color: var(--qti-fg);\n cursor: not-allowed;\n }\n\n .button:focus {\n outline: var(--qti-focus-border-width) solid var(--qti-focus-color);\n }\n `;\n\n override render() {\n return html`\n <dialog class=\"cito-dialog\" part=\"feedback\" ?open=\"${this.showStatus === 'on'}\">\n <slot></slot>\n <div style=\"margin-top: var(--qti-gap); text-align: center;\">\n <button class=\"button close-button\" @click=\"${this.closeFeedback}\">Close</button>\n </div>\n </dialog>\n `;\n }\n\n openFeedback() {\n const dialog = this.shadowRoot?.querySelector('dialog') as HTMLDialogElement | null;\n if (dialog && !dialog.open) {\n dialog.showModal();\n }\n }\n\n closeFeedback() {\n const dialog = this.shadowRoot?.querySelector('dialog') as HTMLDialogElement | null;\n if (dialog && dialog.open) {\n dialog.close();\n this.showStatus = 'off';\n }\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n if (this.showStatus === 'on') {\n this.openFeedback();\n }\n }\n\n protected override updated(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('showStatus')) {\n if (this.showStatus === 'on') {\n this.openFeedback();\n } else {\n this.closeFeedback();\n }\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-modal-feedback': QtiModalFeedback;\n }\n}\n","import { consume } from '@lit/context';\nimport { css, html } from 'lit';\nimport { property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '@qti-components/base';\nimport { QtiVariableDeclaration } from '@qti-components/base';\n\nimport type { BaseType, Cardinality } from '@qti-components/base';\nimport type { OutcomeVariable } from '@qti-components/base';\nimport type { ItemContext } from '@qti-components/base';\n\nexport class QtiOutcomeDeclaration extends QtiVariableDeclaration {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType;\n @property({ type: String, attribute: 'external-scored' }) externalScored: 'human' | 'externalMachine' | null = null;\n @property({ type: String }) identifier: string;\n @property({ type: String }) cardinality: Cardinality;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n public itemContext?: ItemContext;\n\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n const value = this.itemContext?.variables.find(v => v.identifier === this.identifier)?.value;\n return html`${JSON.stringify(value, null, 2)}`;\n }\n\n get interpolationTable(): Map<number, number> | null {\n const table = this.querySelector('qti-interpolation-table');\n if (table) {\n const entries = new Map<number, number>();\n for (const entry of table.querySelectorAll('qti-interpolation-table-entry')) {\n if (!entry.getAttribute('source-value') && entry.getAttribute('target-value')) {\n console.error('source-value or target-value is missing in qti-interpolation-table-entry');\n }\n const sourceValue = parseFloat(entry.getAttribute('source-value'));\n const targetValue = parseFloat(entry.getAttribute('target-value'));\n if (isNaN(sourceValue) || isNaN(targetValue)) {\n console.error('source-value or target-value is not a number in qti-interpolation-table-entry');\n }\n entries.set(sourceValue, targetValue);\n }\n return entries;\n }\n return null;\n }\n\n public override connectedCallback() {\n super.connectedCallback();\n\n const defaultValue = this.defaultValues(this.cardinality);\n\n const outcomeVariable: OutcomeVariable = {\n identifier: this.identifier,\n cardinality: this.cardinality,\n baseType: this.baseType,\n defaultValue: defaultValue,\n type: 'outcome',\n value: null,\n interpolationTable: this.interpolationTable,\n externalScored: this.externalScored\n };\n // At runtime, outcome variables are instantiated as part of an item session.\n // Their values may be initialized with a default value and/or set during response processing.\n // If no default value is given in the declaration then the outcome variable is initialized to NULL unless the outcome is of a numeric type (integer or float) in which case it is initialized to 0.\n outcomeVariable.value = defaultValue;\n if (\n (outcomeVariable.value === null || outcomeVariable.value == undefined) &&\n (outcomeVariable.baseType === 'integer' || outcomeVariable.baseType === 'float')\n ) {\n outcomeVariable.value = '0';\n }\n this.dispatchEvent(\n new CustomEvent('qti-register-variable', {\n bubbles: true,\n composed: true,\n detail: { variable: outcomeVariable }\n })\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-outcome-declaration': QtiOutcomeDeclaration;\n }\n}\n","import { consume } from '@lit/context';\nimport { css, html } from 'lit';\nimport { property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '@qti-components/base';\nimport { QtiVariableDeclaration } from '@qti-components/base';\n\nimport type { QtiAreaMapping } from '@qti-components/base';\nimport type { BaseType, Cardinality } from '@qti-components/base';\nimport type { ResponseVariable } from '@qti-components/base';\nimport type { QtiMapping } from '@qti-components/base';\nimport type { ItemContext } from '@qti-components/base';\n\nexport class QtiResponseDeclaration extends QtiVariableDeclaration {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType;\n\n @property({ type: String }) identifier: string;\n\n @property({ type: String }) cardinality: Cardinality;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n public itemContext?: ItemContext;\n\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n const value = this.itemContext?.variables.find(v => v.identifier === this.identifier)?.value;\n return html`${JSON.stringify(value, null, 2)}`;\n }\n\n public override connectedCallback() {\n super.connectedCallback();\n const defaultValue = this.defaultValues(this.cardinality);\n\n const responseVariable: ResponseVariable = {\n baseType: this.baseType,\n identifier: this.identifier,\n correctResponse: this.#correctResponse,\n cardinality: this.cardinality || 'single',\n mapping: this.#mapping,\n defaultValue,\n areaMapping: this.#areaMapping,\n value: null,\n type: 'response',\n candidateResponse: null\n };\n responseVariable.value = defaultValue;\n\n this.dispatchEvent(\n new CustomEvent('qti-register-variable', {\n bubbles: true,\n composed: true,\n detail: { variable: responseVariable }\n })\n );\n }\n\n get #correctResponse(): string | string[] {\n let result: string | string[];\n const correctResponse = this.querySelector('qti-correct-response');\n if (correctResponse) {\n const values = correctResponse.querySelectorAll('qti-value');\n if (this.cardinality === 'single' && values.length > 0) {\n result = values[0].textContent.trim();\n values[0].remove();\n } else if (this.cardinality !== 'single') {\n result = [];\n for (let i = 0; i < values.length; i++) {\n result.push(values[i].textContent.trim());\n values[i].remove();\n }\n }\n }\n return result;\n }\n\n get #mapping(): QtiMapping {\n const mappingElement = this.querySelector('qti-mapping');\n const lowerBound = parseFloat(mappingElement?.getAttribute('lower-bound'));\n const uppperBound = parseFloat(mappingElement?.getAttribute('upper-bound'));\n const mappingValue = {\n defaultValue: Number(mappingElement?.getAttribute('default-value')) || 0,\n lowerBound: isNaN(lowerBound) ? null : lowerBound,\n upperBound: isNaN(uppperBound) ? null : uppperBound,\n mapEntries: Array.from(mappingElement?.querySelectorAll('qti-map-entry') || []).map(el => ({\n mapKey: el.getAttribute('map-key') || '',\n mappedValue: Number(el.getAttribute('mapped-value')) || 0,\n caseSensitive: el.hasAttribute('case-sensitive') ? el.getAttribute('case-sensitive') !== 'false' : false\n }))\n };\n return mappingValue;\n }\n\n get #areaMapping(): QtiAreaMapping {\n const areaMappingElement = this.querySelector('qti-area-mapping') as HTMLElement;\n\n const defaultValue = Number(areaMappingElement?.getAttribute('default-value')) || 0;\n const lowerBound = parseFloat(areaMappingElement?.getAttribute('lower-bound'));\n const uppperBound = parseFloat(areaMappingElement?.getAttribute('upper-bound'));\n\n const areaMapEntries = Array.from(areaMappingElement?.querySelectorAll('qti-area-map-entry') || []).map(\n (el: HTMLElement) => ({\n shape: (el.getAttribute('shape') as 'default' | 'circle' | 'rect' | 'ellipse' | 'poly') || 'default',\n coords: el.getAttribute('coords') || '',\n mappedValue: Number(el.getAttribute('mapped-value')) || 0,\n defaultValue: Number(el.getAttribute('default-value')) || 0\n })\n );\n\n return {\n defaultValue,\n lowerBound: isNaN(lowerBound) ? null : lowerBound,\n upperBound: isNaN(uppperBound) ? null : uppperBound,\n areaMapEntries\n };\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-response-declaration': QtiResponseDeclaration;\n }\n}\n","import { css, html, LitElement } from 'lit';\n\nimport { type QtiRuleBase } from '@qti-components/base';\n\nimport { mapResponse, mapResponsePoint, matchCorrect } from '../../internal/template-strings';\n\nimport type { PropertyValueMap } from 'lit';\n\n/** The response processing templates we substitute for, keyed by the file name in `template`. */\nconst responseProcessingTemplates: Record<string, string> = {\n map_response: mapResponse,\n map_response_point: mapResponsePoint,\n match_correct: matchCorrect\n};\n\nexport class QtiResponseProcessing extends LitElement {\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n return html`<slot></slot>`;\n }\n\n public process() {\n const assessmentItem = this.closest('qti-assessment-item');\n if (!assessmentItem) return;\n const rules = [...this.children] as unknown as QtiRuleBase[];\n for (const rule of rules) {\n rule.process();\n }\n }\n\n public override firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n const template = this.getAttribute('template');\n if (!template) return;\n\n const templateName = template.split('/').pop()!.replace('.xml', '');\n const rules = responseProcessingTemplates[templateName];\n // Leave an unknown template's authored children alone; there is nothing to substitute.\n if (!rules) return;\n\n // Parsed through this element's own `innerHTML` rather than a fragment created off `document`:\n // the HTML fragment parsing algorithm takes its custom element registry from the context\n // element, so the rules are upgraded with the registry this element lives in. A fragment from\n // `document.createRange()` is parsed against the global registry, which leaves every rule an\n // unupgraded HTMLElement when the item was rendered into a scoped registry.\n this.innerHTML = rules;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-response-processing': QtiResponseProcessing;\n }\n}\n","export const matchCorrect = `<qti-response-condition>\n <qti-response-if>\n <qti-match>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n <qti-correct identifier=\"RESPONSE\"></qti-correct>\n </qti-match>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">1</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-else>\n</qti-response-condition>`;\n\nexport const mapResponse = `<qti-response-condition>\n <qti-response-if>\n <qti-is-null>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n </qti-is-null>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0.0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-map-response identifier=\"RESPONSE\"> </qti-map-response>\n </qti-set-outcome-value>\n </qti-response-else>\n</qti-response-condition>`;\n\nexport const mapResponsePoint = `<qti-response-condition>\n <qti-response-if>\n <qti-is-null>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n </qti-is-null>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-map-response-point identifier=\"RESPONSE\"></qti-map-response-point>\n </qti-set-outcome-value>\n </qti-response-else>\n</qti-response-condition>`;\n","import { LitElement, css, html } from 'lit';\nimport { property } from 'lit/decorators.js';\n\nimport { watch } from '@qti-components/utilities';\n\nexport class QtiRubricBlock extends LitElement {\n @property({ type: String }) override id: string; // =\"qtiAspectInhoudRubricBlock\"\n\n @property({ type: String }) use: 'instructions' | 'scoring' | 'navigation'; // = \"scoring\"\n\n @property({ type: String }) view: 'author' | 'candidate' | 'proctor' | 'scorer' | 'testConstructor' | 'tutor';\n\n @property({ type: String, attribute: 'class' }) classNames: string;\n @watch('classNames', { waitUntilFirstUpdate: true })\n handleclassNamesChange() {\n const classNames = this.classNames.split(' ');\n classNames.forEach((className: string) => {\n switch (className) {\n case 'qti-rubric-discretionary-placement':\n {\n const event = new CustomEvent('qti-rubric:discretionary-placement', {\n detail: { className, element: this },\n bubbles: true,\n composed: true,\n cancelable: true\n });\n const notCancelled = this.dispatchEvent(event);\n if (!notCancelled) return;\n this.setAttribute('slot', 'qti-rubric-block');\n }\n break;\n case 'qti-rubric-inline':\n this.setAttribute('slot', '');\n break;\n default:\n break;\n }\n });\n }\n\n static override styles = css`\n :host {\n display: block;\n }\n `;\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-rubric-block': QtiRubricBlock;\n }\n}\n","import { LitElement } from 'lit';\n\nimport type { PropertyValueMap } from 'lit';\n\nexport class QtiStylesheet extends LitElement {\n #styleElement: HTMLStyleElement | null = null;\n\n protected override firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n super.firstUpdated(_changedProperties);\n\n const link = this.getAttribute('href');\n\n if (link !== null) {\n // Fetch the stylesheet content\n fetch(link)\n .then(response => response.text())\n .then(cssContent => {\n // Minify the CSS content by removing whitespace and comments\n const minifiedCss = this.#minifyCss(cssContent);\n\n // Create a <style> element with @scope surrounding the minified CSS\n this.#styleElement = document.createElement('style');\n this.#styleElement.media = 'screen';\n this.#styleElement.textContent = `@scope {${minifiedCss}}`;\n\n // Append the style element to the parent element of this component\n if (this.parentElement) {\n this.parentElement.appendChild(this.#styleElement);\n } else {\n console.warn('No parent element to append the scoped stylesheet to.');\n }\n })\n .catch(error => {\n console.error('Failed to load stylesheet:', error);\n });\n }\n\n if (this.textContent !== null && this.textContent.trim() !== '') {\n // Minify the inline CSS content\n const minifiedCss = this.#minifyCss(this.textContent);\n\n // Directly create a <style> element with the @scope surrounding the minified inline styles\n this.#styleElement = document.createElement('style');\n this.#styleElement.media = 'screen';\n this.#styleElement.textContent = `@scope {${minifiedCss}}`;\n\n // Append the style element to the parent element of this component\n if (this.parentElement) {\n this.parentElement.appendChild(this.#styleElement);\n } else {\n console.warn('No parent element to append the scoped stylesheet to.');\n }\n }\n }\n\n #minifyCss(cssContent: string): string {\n // Remove comments, whitespace, and newline characters\n return cssContent\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Remove comments\n .replace(/\\s+/g, ' ') // Collapse whitespace\n .replace(/\\s*([{}:;])\\s*/g, '$1') // Remove spaces around {}, :, ;\n .trim(); // Trim leading/trailing whitespace\n }\n\n override disconnectedCallback() {\n if (this.#styleElement) {\n try {\n this.#styleElement.remove();\n } catch (error) {\n console.error('Could not remove stylesheet:', error);\n }\n }\n super.disconnectedCallback();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-stylesheet': QtiStylesheet;\n }\n}\n","import { LitElement, html } from 'lit';\n\nimport type { QtiExpression } from '@qti-components/base';\nimport type { QtiRuleBase } from '@qti-components/base';\n\n/**\n * @summary The qti-template-constraint element is a processing rule available only in Template Processing.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.template-constraint\n *\n * It terminates Template Processing and re-runs it from the beginning if the condition\n * specified in the template constraint is not satisfied. This can be used to iterate\n * the Template Processing with different randomly-generated values until a predetermined\n * condition is satisfied.\n */\n\nexport class QtiTemplateConstraint extends LitElement implements QtiRuleBase {\n override render() {\n return html`<slot></slot>`;\n }\n\n /**\n * Evaluates the constraint condition\n * @returns true if constraint is satisfied, false if template processing should restart\n */\n public calculate(): boolean {\n const expressions = [...this.children] as QtiExpression<boolean>[];\n\n if (expressions.length !== 1) {\n console.error('qti-template-constraint must have exactly one child expression');\n return true; // Don't restart on error\n }\n\n try {\n const result = expressions[0].calculate();\n return Boolean(result);\n } catch (error) {\n console.error('Error evaluating template constraint:', error);\n return true; // Don't restart on error\n }\n }\n\n /**\n * Template constraints don't have sub-rules like conditions\n */\n public getSubRules(): QtiRuleBase[] {\n return [];\n }\n\n /**\n * Process the template constraint\n * @returns true if constraint is satisfied, false if template processing should restart\n */\n public process(): boolean {\n const constraintSatisfied = this.calculate();\n\n if (!constraintSatisfied) {\n console.debug('Template constraint not satisfied, restarting template processing');\n }\n\n return constraintSatisfied;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-template-constraint': QtiTemplateConstraint;\n }\n}\n","import { css, LitElement, html } from 'lit';\nimport { property } from 'lit/decorators.js';\n\nimport type { TemplateVariable } from '@qti-components/base';\nimport type { BaseType } from '@qti-components/base';\n\n/**\n * @summary The qti-template-declaration element declares template variables for item cloning.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.template-declaration\n */\n\nexport class QtiTemplateDeclaration extends LitElement {\n @property({ type: String }) identifier: string = '';\n @property({ type: String }) cardinality: 'single' | 'multiple' | 'ordered' | 'record' = 'single';\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType = 'string';\n @property({ type: Boolean, attribute: 'math-variable' }) mathVariable: boolean = false;\n @property({ type: Boolean, attribute: 'param-variable' }) paramVariable: boolean = false;\n\n #defaultValue: any = null;\n\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n return html`<slot></slot>`;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.updateComplete.then(() => {\n this.#processDefaultValue();\n this.#registerTemplateVariable();\n });\n }\n\n /**\n * Process qti-default-value to extract the default value\n */\n #processDefaultValue(): void {\n const defaultValueElement = this.querySelector('qti-default-value');\n if (!defaultValueElement) {\n return;\n }\n\n // For now, just get the text content - this could be enhanced to handle expressions\n const textContent = defaultValueElement.textContent?.trim() || '';\n this.#defaultValue = this.#convertValue(textContent);\n }\n\n /**\n * Convert string value based on base-type\n */\n #convertValue(value: string): any {\n if (!value) return null;\n\n switch (this.baseType) {\n case 'integer':\n return parseInt(value, 10);\n case 'float':\n case 'duration':\n return parseFloat(value);\n case 'boolean':\n return value.toLowerCase() === 'true';\n case 'string':\n default:\n return value;\n }\n }\n\n /**\n * Register this template variable with the assessment item\n */\n #registerTemplateVariable(): void {\n const templateVariable: TemplateVariable = {\n identifier: this.identifier,\n cardinality: this.cardinality,\n baseType: this.baseType,\n defaultValue: this.#defaultValue,\n value: this.#defaultValue,\n type: 'template',\n mathVariable: this.mathVariable,\n paramVariable: this.paramVariable\n };\n\n // Dispatch event to register the variable\n\n // value must string or string[]\n const variable = { ...templateVariable, value: this.#defaultValue?.toString() || '' };\n this.dispatchEvent(\n new CustomEvent('qti-register-variable', {\n bubbles: true,\n composed: true,\n detail: { variable }\n })\n );\n }\n\n /**\n * Get the template variable definition\n */\n public getTemplateVariable(): TemplateVariable {\n return {\n identifier: this.identifier,\n cardinality: this.cardinality,\n baseType: this.baseType,\n value: this.#defaultValue,\n type: 'template',\n mathVariable: this.mathVariable,\n paramVariable: this.paramVariable\n };\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-template-declaration': QtiTemplateDeclaration;\n }\n}\n","import { css, html, LitElement } from 'lit';\n\nimport type { QtiRuleBase } from '@qti-components/base';\nimport type { QtiTemplateConstraint } from '../qti-template-constraint/qti-template-constraint';\nimport type { PropertyValueMap } from 'lit';\n\n/**\n * @summary The qti-template-processing element contains template processing rules.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.template-processing\n */\n\nexport class QtiTemplateProcessing extends LitElement {\n static override styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n #maxIterations = 100; // Prevent infinite loops in template constraints\n\n override render() {\n return html`<slot></slot>`;\n }\n\n /**\n * Process template rules to set template variable values\n */\n public process(): void {\n const assessmentItem = this.closest('qti-assessment-item');\n if (!assessmentItem) {\n console.warn('qti-template-processing must be inside qti-assessment-item');\n return;\n }\n\n let iterations = 0;\n let shouldReprocess = false;\n\n do {\n shouldReprocess = false;\n iterations++;\n\n if (iterations > this.#maxIterations) {\n console.error('Template processing exceeded maximum iterations. Possible infinite loop.');\n break;\n }\n\n try {\n const rules = [...this.children] as unknown as (Element & QtiRuleBase)[];\n for (const rule of rules) {\n // Check if this is a template constraint that failed\n if (rule.tagName.toLowerCase() === 'qti-template-constraint') {\n const constraintResult = (rule as QtiTemplateConstraint).calculate();\n if (constraintResult === false) {\n // Template constraint failed, restart processing\n shouldReprocess = true;\n break;\n }\n } else {\n rule.process();\n }\n }\n } catch (error) {\n console.error('Error during template processing:', error);\n break;\n }\n } while (shouldReprocess);\n\n // Dispatch event that template processing is complete\n this.dispatchEvent(\n new CustomEvent('qti-template-processing-complete', {\n bubbles: true,\n composed: true,\n detail: { iterations }\n })\n );\n }\n\n public override firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n // Template processing doesn't typically use external templates like response processing\n // But we could add support for common template processing patterns here if needed\n if (this.getAttribute('template')) {\n console.info('Template processing with external template not yet implemented');\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-template-processing': QtiTemplateProcessing;\n }\n}\n","import { QtiAssessmentItem } from './components/qti-assessment-item/qti-assessment-item';\nimport { QtiAssessmentStimulusRef } from './components/qti-assessment-stimulus-ref/qti-assessment-stimulus-ref';\nimport { QtiCompanionMaterialsInfo } from './components/qti-companion-materials-info/qti-companion-materials-info';\nimport { QtiContentBody } from './components/qti-content-body/qti-content-body';\nimport { QtiContextDeclaration } from './components/qti-context-declaration/qti-context-declaration';\nimport { QtiCustomOperator } from './components/qti-custom-operator/qti-custom-operator';\nimport { QtiFeedbackBlock } from './components/qti-feedback-block/qti-feedback-block';\nimport { QtiFeedbackInline } from './components/qti-feedback-inline/qti-feedback-inline';\nimport { QtiItemBody } from './components/qti-item-body/qti-item-body';\nimport { QtiModalFeedback } from './components/qti-modal-feedback/qti-modal-feedback';\nimport { QtiOutcomeDeclaration } from './components/qti-outcome-declaration/qti-outcome-declaration';\nimport { QtiResponseDeclaration } from './components/qti-response-declaration/qti-response-declaration';\nimport { QtiResponseProcessing } from './components/qti-response-processing/qti-response-processing';\nimport { QtiRubricBlock } from './components/qti-rubric-block/qti-rubric-block';\nimport { QtiStylesheet } from './components/qti-stylesheet/qti-stylesheet';\nimport { QtiTemplateConstraint } from './components/qti-template-constraint/qti-template-constraint';\nimport { QtiTemplateDeclaration } from './components/qti-template-declaration/qti-template-declaration';\nimport { QtiTemplateProcessing } from './components/qti-template-processing/qti-template-processing';\n\nexport {\n QtiAssessmentItem,\n QtiAssessmentStimulusRef,\n QtiCompanionMaterialsInfo,\n QtiContentBody,\n QtiContextDeclaration,\n QtiCustomOperator,\n QtiFeedbackBlock,\n QtiFeedbackInline,\n QtiItemBody,\n QtiModalFeedback,\n QtiOutcomeDeclaration,\n QtiResponseDeclaration,\n QtiResponseProcessing,\n QtiRubricBlock,\n QtiStylesheet,\n QtiTemplateConstraint,\n QtiTemplateDeclaration,\n QtiTemplateProcessing\n};\n\nexport const qtiContentElements = [\n { tag: 'qti-assessment-item', ctor: QtiAssessmentItem },\n { tag: 'qti-assessment-stimulus-ref', ctor: QtiAssessmentStimulusRef },\n { tag: 'qti-companion-materials-info', ctor: QtiCompanionMaterialsInfo },\n { tag: 'qti-content-body', ctor: QtiContentBody },\n { tag: 'qti-context-declaration', ctor: QtiContextDeclaration },\n { tag: 'qti-custom-operator', ctor: QtiCustomOperator },\n { tag: 'qti-feedback-block', ctor: QtiFeedbackBlock },\n { tag: 'qti-feedback-inline', ctor: QtiFeedbackInline },\n { tag: 'qti-item-body', ctor: QtiItemBody },\n { tag: 'qti-modal-feedback', ctor: QtiModalFeedback },\n { tag: 'qti-outcome-declaration', ctor: QtiOutcomeDeclaration },\n { tag: 'qti-response-declaration', ctor: QtiResponseDeclaration },\n { tag: 'qti-response-processing', ctor: QtiResponseProcessing },\n { tag: 'qti-rubric-block', ctor: QtiRubricBlock },\n { tag: 'qti-stylesheet', ctor: QtiStylesheet },\n { tag: 'qti-template-constraint', ctor: QtiTemplateConstraint },\n { tag: 'qti-template-declaration', ctor: QtiTemplateDeclaration },\n { tag: 'qti-template-processing', ctor: QtiTemplateProcessing }\n] as const;\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,eAAe;AACxB,SAAS,YAAY,YAAY;AACjC,SAAS,gBAAgB;;;;;;;AA0BnB,IAAO,oBAAP,cAAiC,WAAU;EAAjD,cAAA;;AAEE,SAAA,sBAAoD;AAExB,SAAA,aAAqB;AACrB,SAAA,WAA6B;AAC7B,SAAA,gBAAyC;AAc3D,SAAA,wBAAwB,CAAC,GAAY,aAAqB;AAClE,WAAK,oBAAoB,QAAQ,QAAO,GAAG,WAAW,QAAS;IACjE;AAIU,SAAA,wBAAwB,CAAC,GAAY,aAC7C,KAAK,oBAAoB,QAAQ,QAAO,GAAG,WAAW,QAAS;AAGzD,SAAA,WAAwB;MAC9B,WAAW;;AA6Eb,SAAA,kBAAyC,EAAE,GAAG,KAAK,UAAU,WAAW,KAAK,SAAS,UAAS;AAC/F,SAAA,oBAAmC,CAAA;AAEzB,SAAA,sBAA+C,CAAA;AAmEzD,SAAA,0BAA0B,CAAC,MAA0B;AACnD,QAAE,yBAAwB;AAC1B,WAAK,WAAW,EAAE,GAAG,KAAK,UAAU,WAAW,CAAC,GAAG,KAAK,SAAS,WAAW,EAAE,OAAO,QAAQ,EAAC;AAC9F,WAAK,kBAAkB,KAAK;AAC5B,QAAE,gBAAe;IACnB;AAEA,SAAA,0BAA0B,CAAC,MAA+B;AACxD,QAAE,yBAAwB;AAC1B,YAAM,kBAAkB,EAAE;AAC1B,WAAK,kBAAkB,KAAK,eAAe;AAC3C,YAAM,cAAc,OAAO,KAAK,SAAS,UAAU,KAAK,OAAK,EAAE,eAAe,aAAa,GAAG,KAAK,KAAK;AACxG,UAAI,cAAc,GAAG;AACnB,wBAAgB,kBAAkB,gBAAgB,iBAAiB;MACrE;IACF;AAEA,SAAA,6BAA6B,CAAC,MAAsF;AAClH,QAAE,yBAAwB;AAC1B,WAAK,oBAAoB,KAAK,EAAE,OAAO,kBAAkB;IAC3D;AAEA,SAAA,oBAAoB,CAAC,MAAyE;AAC5F,QAAE,yBAAwB;AAC1B,YAAM,EAAE,oBAAoB,aAAY,IAAK,EAAE;AAC/C,WAAK,SAAQ;AACb,WAAK,uBAAuB,oBAAoB,MAAM;AACtD,WAAK,gBAAgB,YAAY;IACnC;AAEA,SAAA,yBAAyB,CAAC,MAA2E;AACnG,QAAE,yBAAwB;AAC1B,YAAM,EAAE,mBAAmB,MAAK,IAAK,EAAE;AACvC,WAAK,sBAAsB,mBAAmB,KAAK;AACnD,QAAE,gBAAe;IACnB;AAEA,SAAA,0BAA0B,CAAC,MAAmF;AAC5G,QAAE,yBAAwB;AAC1B,YAAM,EAAE,oBAAoB,MAAK,IAAK,EAAE;AACxC,WAAK,uBAAuB,oBAAoB,SAAS,MAAS;AAClE,QAAE,gBAAe;IACnB;AAEA,SAAA,4BAA4B,CAAC,MAAmF;AAC9G,QAAE,yBAAwB;AAC1B,YAAM,EAAE,oBAAoB,MAAK,IAAK,EAAE;AACxC,WAAK,sBAAsB,oBAAoB,SAAS,MAAS;AACjE,QAAE,gBAAe;IACnB;AAEA,SAAA,gCAAgC,CAAC,MAAuC;AACtE,QAAE,yBAAwB;AAE1B,YAAM,EAAE,oBAAoB,UAAU,OAAAA,OAAK,IAAK,EAAE;AAClD,WAAK,uBAAuB,oBAAoB,QAAQ;AACxD,UAAIA,WAAU,QAAW;AACvB,aAAK,WAAW;UACd,GAAG,KAAK;UACR,OAAO;YACL,GAAI,KAAK,SAAS,SAAS,CAAA;YAC3B,CAAC,kBAAkB,GAAGA;;;MAG5B;AAEA,WAAK,cACH,IAAI,YAA0C,4BAA4B;QACxE,SAAS;QACT,UAAU;QACV,QAAQ,EAAE,aAAa,KAAK,SAAQ;OACrC,CAAC;IAEN;EAmTF;EA7iBE;EACA;EAOA,IAAa,QAAK;AAChB,WAAO,KAAK;EACd;EACA,IAAa,MAAM,OAAa;AAC9B,SAAK,aAAa;AAClB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,aAAa,cAAc,KAAK;EACvC;;;;;;EAuBA,IAAW,oBAAoB,YAAkB;AAC/C,SAAK,WAAW,EAAE,GAAG,KAAK,UAAU,WAAU;EAChD;EAEA,IAAW,sBAAmB;AAC5B,WAAO,KAAK,SAAS;EACvB;EAEA,IAAW,YAAS;AAClB,WAAO,KAAK,SAAS,UAAU,IAAI,QAAM;MACvC,YAAY,EAAE;MACd,OAAO,EAAE;MACT,MAAM,EAAE;;MAER,GAAI,EAAE,SAAS,aAAa,EAAE,eAAe,UACzC,EAAE,gBAAiB,EAAsB,eAAc,IACvD,CAAA;MACJ;EACJ;EAEA,IAAW,UAAU,OAAgD;AACnE,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,OAAK,EAAE,gBAAgB,EAAE,GAAG;AAClE,cAAQ,KAAK,8DAA8D;AAC3E;IACF;AACA,SAAK,WAAW;MACd,GAAG,KAAK;MACR,WAAW,KAAK,SAAS,UAAU,IAAI,cAAW;AAChD,cAAM,gBAAgB,MAAM,KAAK,OAAK,EAAE,eAAe,SAAS,UAAU;AAC1E,YAAI,eAAe;AACjB,iBAAO;YACL,GAAG;YACH,GAAG;YACH,oBAAqB,SAA6B;;QAEtD;AACA,eAAO;MACT,CAAC;;AAGH,SAAK,SAAS,UAAU,QAAQ,cAAW;AACzC,UAAI,SAAS,SAAS,YAAY;AAChC,cAAM,qBAAqB,KAAK,oBAAoB,KAClD,CAAC,OAA8B,GAAG,uBAAuB,SAAS,UAAU;AAE9E,YAAI,oBAAoB;AACtB,6BAAmB,WAAW,SAAS;QACzC;MACF;IACF,CAAC;AAED,SAAK,UAAU,QAAQ,cAAW;AAChC,UAAI,SAAS,SAAS,WAAW;AAC/B,aAAK,kBAAkB,QAAQ,QAAM,GAAG,kBAAkB,SAAS,UAAU,CAAC;MAChF;IACF,CAAC;EACH;EAEA,IAAW,QAAK;AACd,WAAO,KAAK,SAAS;EACvB;EAEA,IAAW,MAAM,OAA2B;AAC1C,SAAK,WAAW;MACd,GAAG,KAAK;MACR,OAAO,QAAQ,EAAE,GAAG,MAAK,IAAK;;EAElC;EAEA;EACA;;EAKA,IAAI,UAAU,aAAkC;AAC9C,QAAI,aAAa;AACf,iBAAW,YAAY,aAAa;AAClC,cAAM,mBAAmB,KAAK,YAAY,SAAS,kBAAkB;AACrE,YAAI,kBAAkB;AACpB,eAAK,uBAAuB,SAAS,oBAAoB,SAAS,QAAQ;QAC5E;AAEA,cAAM,cAAiD,KAAK,oBAAoB,KAC9E,OAAK,EAAE,aAAa,qBAAqB,MAAM,SAAS,kBAAkB;AAE5E,YAAI,aAAa;AACf,sBAAY,WAAW,SAAS;QAClC;MACF;IACF;EACF;EAES,SAAM;AACb,WAAO;EACT;EAES,oBAAiB;AACxB,SAAK,sBAAqB;AAC1B,UAAM,kBAAiB;AACvB,SAAK,eAAe,KAAK,MAAK;AAC5B,WAAK,cACH,IAAI,YAA+B,iCAAiC;QAClE,SAAS;QACT,UAAU;QACV,QAAQ;OACT,CAAC;AAEJ,WAAK,kBAAiB;IACxB,CAAC;EACH;EAES,uBAAoB;AAC3B,SAAK,sBAAqB;AAC1B,UAAM,qBAAoB;EAC5B;EAEA,wBAAqB;AACnB,SAAK,iBAAiB,yBAAyB,KAAK,uBAAuB;AAC3E,SAAK,iBAAiB,yBAAyB,KAAK,uBAAuB;AAC3E,SAAK,iBAAiB,4BAA4B,KAAK,0BAA0B;AACjF,SAAK,iBAAiB,eAAe,KAAK,iBAAiB;AAC3D,SAAK,iBAAiB,yBAAyB,KAAK,sBAAsB;AAC1E,SAAK,iBAAiB,0BAA0B,KAAK,uBAAuB;AAC5E,SAAK,iBAAiB,4BAA4B,KAAK,yBAAyB;AAChF,SAAK,iBAAiB,4BAA4B,KAAK,6BAA6B;EACtF;EAEA,wBAAqB;AACnB,SAAK,oBAAoB,yBAAyB,KAAK,uBAAuB;AAC9E,SAAK,oBAAoB,yBAAyB,KAAK,uBAAuB;AAC9E,SAAK,oBAAoB,4BAA4B,KAAK,0BAA0B;AACpF,SAAK,oBAAoB,eAAe,KAAK,iBAAiB;AAC9D,SAAK,oBAAoB,yBAAyB,KAAK,sBAAsB;AAC7E,SAAK,oBAAoB,0BAA0B,KAAK,uBAAuB;AAC/E,SAAK,oBAAoB,4BAA4B,KAAK,yBAAyB;AACnF,SAAK,oBAAoB,4BAA4B,KAAK,6BAA6B;EACzF;EAEA;EAOA;EAUA;EAKA;EAQA;EAOA;EAOA;EAOA;EAwBA,MAAM,oBAAiB;AACrB,UAAM,uBAAuB,MAAM,KAAK,KAAK,iBAA6B,0BAA0B,CAAC;AACrG,QAAI,qBAAqB,SAAS,GAAG;AACnC,YAAM,QAAQ,IAAI,qBAAqB,IAAI,iBAAe,YAAY,cAAc,CAAC;AACrF,YAAM,QAAQ,QAAO;IACvB;AAEA,SAAK,sBAAsB,KAAK,cAAqC,yBAAyB;AAC9F,QAAI,KAAK,qBAAqB;AAE5B,WAAK,oBAAoB,QAAO;AAChC,WAAK,kBAAkB,EAAE,GAAG,KAAK,UAAU,WAAW,KAAK,SAAS,UAAS;IAC/E;EACF;EAEO,gBAAgB,mBAAmB,MAAM,6BAA6B,MAAI;AAC/E,SAAK,SAAS,0BAA0B;AAExC,QAAI,kBAAkB;AACpB,WAAK,sBACH,gBACC,CAAC,KAAK,SAAS,UAAU,KAAK,OAAK,EAAE,eAAe,aAAa,GAAG,QAAQ,GAAG,SAAQ,CAAE;IAE9F;AAEA,QAAI,KAAK,aAAa,SAAS;AAC7B,WAAK,+CAA8C;IACrD;AAEA,UAAM,oBAAoB,KAAK,cAAqC,yBAAyB;AAC7F,UAAM,aAAa,CAAC,EAAE,qBAAqB,OAAO,kBAAkB,YAAY;AAChF,QAAI,YAAY;AACd,wBAAkB,QAAO;IAC3B;AACA,QAAI,KAAK,aAAa,SAAS;AAE7B,WAAK,sBAAsB,oBAAoB,KAAK,qBAAoB,CAAE;IAC5E;AAKA,SAAK,cACH,IAAI,YAAsE,4BAA4B;MACpG,SAAS;MACT,UAAU;MACV,QAAQ,EAAE,aAAa,KAAK,UAAU,mBAAmB,KAAI;KAC9D,CAAC;AAGJ,WAAO;EACT;EAEO,iBAAc;AACnB,SAAK,WAAW,KAAK;EACvB;EAEU,YAAY,YAAkB;AACtC,WAAO,KAAK,YAAY,UAAU;EACpC;EAEO,WAAW,YAAkB;AAClC,WAAO,KAAK,YAAY,UAAU;EACpC;EAEU,YAAY,YAAkB;AACtC,WAAO,KAAK,SAAS,UAAU,KAAK,OAAK,EAAE,eAAe,UAAU,KAAK;EAC3E;;EAGU,+BAA4B;EAAU;;;;;;;;;;;;;EAezC,uBAAuB,YAAoB,OAAoC;AACpF,SAAK,WAAW;MACd,GAAG,KAAK;MACR,WAAW,KAAK,SAAS,UAAU,IAAI,OAAM,EAAE,eAAe,aAAa,IAAI,EAAE,GAAG,GAAG,MAAY,CAAG;;AAGxG,SAAK,6BAA4B;AAEjC,SAAK,cACH,IAAI,YAAuC,2BAA2B;MACpE,SAAS;MACT,UAAU;MACV,QAAQ;QACN,MAAM,KAAK;QACX,oBAAoB;QACpB,UAAU,MAAM,QAAQ,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI;;KAEjD,CAAC;AAGJ,QAAI,KAAK,aAAa,SAAS;AAE7B,WAAK,sBAAsB,oBAAoB,KAAK,qBAAoB,CAAE;IAC5E;EACF;;;;EAKO,uBAAuB,YAAoB,OAAoC;AACpF,UAAM,mBAAmB,KAAK,SAAS,UAAU,KAAK,OAAK,EAAE,eAAe,cAAc,EAAE,SAAS,UAAU;AAI/G,QAAI,CAAC,kBAAkB;AACrB,cAAQ,KAAK,wCAAwC,UAAU,uBAAuB;AACtF;IACF;AAEA,UAAM,kBACJ,iBAAiB,gBAAgB,WAC7B,MAAM,QAAQ,KAAK,IACjB,MAAM,CAAC,IACN,SAAS,OACZ,UAAU,UAAa,UAAU,OAC/B,OACA,MAAM,QAAQ,KAAK,IACjB,QACA,CAAC,KAAK;AAEhB,SAAK,WAAW;MACd,GAAG,KAAK;MACR,WAAW,KAAK,SAAS,UAAU,IAAI,OACrC,EAAE,eAAe,aACb,IACA;QACE,GAAG;QACH,OAAO;OACR;;AAIT,SAAK,cACH,IAAI,YAA0C,4BAA4B;MACxE,SAAS;MACT,UAAU;MACV,QAAQ,EAAE,aAAa,KAAK,SAAQ;KACrC,CAAC;EAEN;;;;EAKO,sBAAsB,YAAoB,OAAoC;AACnF,UAAM,mBAAmB,KAAK,YAAY,UAAU;AAEpD,QAAI,CAAC,kBAAkB;AACrB,cAAQ,KAAK,gDAAgD,UAAU,uBAAuB;AAC9F;IACF;AAEA,UAAM,kBACJ,iBAAiB,gBAAgB,WAC7B,MAAM,QAAQ,KAAK,IACjB,MAAM,CAAC,IACN,SAAS,OACZ,UAAU,UAAa,UAAU,OAC/B,OACA,MAAM,QAAQ,KAAK,IACjB,QACA,CAAC,KAAK;AAEhB,SAAK,WAAW;MACd,GAAG,KAAK;MACR,WAAW,KAAK,SAAS,UAAU,IAAI,OACrC,EAAE,eAAe,aACb,IACA;QACE,GAAG;QACH,iBAAiB;OAClB;;AAIT,SAAK,cACH,IAAI,YAA0C,4BAA4B;MACxE,SAAS;MACT,UAAU;MACV,QAAQ,EAAE,aAAa,KAAK,SAAQ;KACrC,CAAC;EAEN;EAEO,mBAAmB,YAAoB,OAAoC;AAChF,SAAK,sBAAsB,YAAY,KAAK;AAC5C,SAAK,cACH,IAAI,YAA0C,4BAA4B;MACxE,SAAS;MACT,UAAU;MACV,QAAQ,EAAE,aAAa,KAAK,SAAQ;KACrC,CAAC;EAEN;;;;;;;;;;;;EAaO,sBAAsB,YAAoB,OAAoC;AACnF,UAAM,kBAAkB,KAAK,WAAW,UAAU;AAElD,QAAI,CAAC,iBAAiB;AACpB,cAAQ,KAAK,uCAAuC,UAAU,uBAAuB;AACrF;IACF;AAEA,SAAK,WAAW;MACd,GAAG,KAAK;MACR,WAAW,KAAK,SAAS,UAAU,IAAI,OAAI;AACzC,YAAI,EAAE,eAAe,YAAY;AAC/B,iBAAO;QACT;AACA,eAAO;UACL,GAAG;UACH,OAAO,gBAAgB,gBAAgB,WAAW,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;;MAEnG,CAAC;;AAEH,SAAK,kBAAkB,QAAQ,QAAM,GAAG,kBAAkB,UAAU,CAAC;AAErE,SAAK,cACH,IAAI,YAAmC,uBAAuB;MAC5D,SAAS;MACT,UAAU;MACV,QAAQ;QACN,MAAM,KAAK;QACX,mBAAmB;QACnB,OAAO,KAAK,SAAS,UAAU,KAAK,OAAK,EAAE,eAAe,UAAU,GAAG;;KAE1E,CAAC;EAEN;EAEO,SAAS,iBAAiB,MAAI;AACnC,UAAM,UAAU,KAAK,oBAAoB,MAAM,wBAAsB,mBAAmB,SAAQ,CAAE;AAElG,QAAI,gBAAgB;AAClB,WAAK,eAAc;IACrB;AAEA,WAAO;EACT;EAEO,iBAAc;AACnB,eAAW,sBAAsB,KAAK,qBAAqB;AACzD,yBAAmB,eAAc;IACnC;EACF;EAEA,uBAAoB;AAClB,UAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,QAAI,UAAU;AAAM,aAAO;AAC3B,QAAI,UAAU;AAAO,aAAO;AAC5B,WAAO;EACT;EAEA,iDAA8C;AAC5C,SAAK,WAAW;MACd,GAAG,KAAK;MACR,WAAW,KAAK,SAAS,UAAU,IAAI,cAAW;AAChD,YAAI,SAAS,SAAS,WAAW;AAC/B,iBAAO;QACT;AAEA,cAAM,kBAAkB,kBAAkB;AAC1C,cAAM,kBAAkB,kBAAkB,SAAS,eAAe;AAElE,YAAI,QAAQ,mBAAmB;AAC/B,aACG,UAAU,QAAQ,UAAU,YAC5B,SAAS,aAAa,aAAa,SAAS,aAAa,UAC1D;AACA,kBAAQ;QACV;AAEA,eAAO;UACL,GAAG;UACH;;MAEJ,CAAC;;EAEL;;AAziB4B,WAAA;EAA3B,SAAS,EAAE,MAAM,OAAM,CAAE;;AACE,WAAA;EAA3B,SAAS,EAAE,MAAM,OAAM,CAAE;;AACE,WAAA;EAA3B,SAAS,EAAE,MAAM,OAAM,CAAE;;AAG1B,WAAA;EADC,SAAS,EAAE,MAAM,OAAM,CAAE;;AAUG,WAAA;EAA5B,SAAS,EAAE,MAAM,QAAO,CAAE;;AAEjB,WAAA;EADT,MAAM,YAAY,EAAE,sBAAsB,KAAI,CAAE;;AAKpB,WAAA;EAA5B,SAAS,EAAE,MAAM,QAAO,CAAE;;AAEjB,WAAA;EADT,MAAM,YAAY,EAAE,sBAAsB,KAAI,CAAE;;AAKzC,WAAA;EADP,QAAQ,EAAE,SAAS,YAAW,CAAE;;;;ACzDnC,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,YAAAC,iBAAgB;;;;;;;AAMnB,IAAO,yCAAP,MAAO,gDAA+C,MAAK;;AACjD,SAAA,YAAY;EAAwC;EAClE,YACS,SACA,MAAuB;AAE9B,UAAM,wCAAuC,WAAW,EAAE,SAAS,MAAM,UAAU,MAAM,YAAY,KAAI,CAAE;AAHpG,SAAA,UAAA;AACA,SAAA,OAAA;EAGT;;AAOI,IAAO,2BAAP,cAAwCC,YAAU;EAAxD,cAAA;;AAC8B,SAAA,aAAa;AACb,SAAA,OAAO;EAsCrC;;;;;;EA/BkB,MAAM,oBAAiB;AACrC,UAAM,kBAAiB;AAGvB,UAAM,KAAK;AAEX,UAAM,OAAO,KAAK,QAA2B,qBAAqB;AAElE,UAAM,QAAQ,IAAI,uCAAuC,MAAM,IAAI;AACnE,SAAK,cAAc,KAAK;AAExB,UAAM,cAAc,MAAM,cAAc,yBAAyB,KAAK,UAAU,IAAI;AACpF,QAAI,CAAC,MAAM,oBAAoB,aAAa;AAC1C,YAAM,KAAK,kBAAkB,WAAW;IAC1C;EACF;;;;;EAMO,MAAM,kBAAkB,aAAoB;AACjD,UAAM,WAAW,MAAM,iBAAgB,EACpC,KAAK,KAAK,IAAI,EACd,KAAK,SAAO,IAAI,QAAO,CAAE;AAC5B,QAAI,UAAU;AACZ,YAAM,WAAW,SAAS,iBAAiB,mCAAmC;AAC9E,kBAAY,YAAY;AACxB,kBAAY,OAAO,GAAG,QAAQ;IAChC;EACF;;AAtC4BC,YAAA;EAA3BC,UAAS,EAAE,MAAM,OAAM,CAAE;;AACED,YAAA;EAA3BC,UAAS,EAAE,MAAM,OAAM,CAAE;;;;ACvB5B,SAAS,cAAAC,mBAAkB;AAErB,IAAO,4BAAP,cAAyCA,YAAU;;;;ACFzD,SAAS,eAAe;AACxB,SAAS,cAAAC,aAAY,QAAAC,aAAY;AACjC,SAAS,aAAa;;;;;;;AAMhB,IAAO,iBAAP,cAA8BC,YAAU;EAKnC,SAAM;AACb,WAAOC,0BAAyB,KAAK,oBAAoB;EAC3D;EAEgB,oBAAiB;AAC/B,UAAM,kBAAiB;AACvB,SAAK,eAAe,KAAK,MAAM,KAAK,qBAAoB,CAAE;EAC5D;EAEmB,QAAQ,mBAAyD;AAClF,QAAI,kBAAkB,IAAI,SAAS,GAAG;AACpC,WAAK,qBAAoB;IAC3B;EACF;EAEA,uBAAoB;AAClB,UAAM,gBAAgB,oBAAI,IAAG;AAC7B,UAAM,qBAAqB,KAAK,SAAS,aAAa,CAAA,GAAI,OAAO,cAAY,SAAS,SAAS,UAAU;AAEzG,eAAW,YAAY,mBAAmB;AACxC,YAAM,mBAAmB;AACzB,UACE,iBAAiB,iBAAiB,QAClC,iBAAiB,UAAU,QAC3B,iBAAiB,UAAU,QAC3B;AACA;MACF;AAEA,oBAAc,IAAI,iBAAiB,YAAY,KAAK,gBAAgB,iBAAiB,KAAK,CAAC;IAC7F;AAEA,QAAI,cAAc,SAAS,GAAG;AAC5B;IACF;AAEA,UAAM,kBAAkB,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC,EAAE,OAC7D,aAAW,QAAQ,UAAU,YAAW,MAAO,QAAQ,QAAQ,UAAU,YAAW,MAAO,IAAI;AAGjG,eAAW,WAAW,iBAAiB;AACrC,YAAM,aAAa,QAAQ,aAAa,+BAA+B,KAAK,QAAQ,aAAa,KAAI,KAAM;AAC3G,YAAM,QAAQ,cAAc,IAAI,UAAU;AAE1C,UAAI,CAAC,OAAO;AACV;MACF;AAEA,UAAI,QAAQ,UAAU,YAAW,MAAO,MAAM;AAC5C,gBAAQ,cAAc;AACtB,gBAAQ,aAAa,iCAAiC,UAAU;AAChE;MACF;AAEA,YAAM,cAAc,SAAS,cAAc,IAAI;AAC/C,kBAAY,cAAc;AAC1B,kBAAY,aAAa,iCAAiC,UAAU;AACpE,cAAQ,YAAY,WAAW;IACjC;EACF;EAEA,gBAAgB,OAA2D;AACzE,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,MAAM,KAAK,GAAG;IACvB;AAEA,WAAO,OAAO,SAAQ,KAAM;EAC9B;;AArEUC,YAAA;EAFT,QAAQ,EAAE,SAAS,aAAa,WAAW,KAAI,CAAE;EACjD,MAAK;;;;ACVR,SAAS,KAAK,cAAAC,aAAY,QAAAC,aAAY;AACtC,SAAS,YAAAC,iBAAgB;;;;;;;AAOnB,IAAO,wBAAP,cAAqCF,YAAU;EAArD,cAAA;;AAC8B,SAAA,aAAqB;AACrB,SAAA,cAA4D;EAa1F;;AAXkB,SAAA,SAAS;MACvB;;;;;;EAKA;EAEO,SAAM;AACb,WAAOC;EACT;;AAb4BE,YAAA;EAA3BD,UAAS,EAAE,MAAM,OAAM,CAAE;;AACEC,YAAA;EAA3BD,UAAS,EAAE,MAAM,OAAM,CAAE;;;;ACV5B,SAAS,WAAAE,gBAAe;AACxB,SAAS,cAAAC,aAAY,QAAAC,aAAY;AACjC,SAAS,SAAAC,cAAa;;;;;;;AAoBhB,IAAO,oBAAP,cAAiCC,YAAU;;EAE/C;EAMS,SAAM;AACb,WAAOC,0BAAyB,KAAK,gBAAgB;EACvD;EAEA,mBAAgB;AAEd,UAAM,cAAc,MAAM,KAAK,KAAK,mBAAmB,cAAc,CAAA,CAAE,EAAE,KACvE,UAAQ,KAAK,aAAa,KAAK,YAAY;AAE7C,QAAI;AACF,WAAK,oBAAoB,IAAI,SAAS,WAAW,MAAM,QAAQ,aAAa,eAAe,EAAE;IAC/F,SAAS,GAAG;AACV,cAAQ,MAAM,oDAAoD,CAAC;IACrE;EACF;EAEO,YAAS;AACd,UAAM,KAAK;MACT,UAAU,CAAC,uBACT,KAAK,UAAU,UAAU,KAAK,OAAK,EAAE,eAAe,kBAAkB,GAAG,SAAS;MACpF,SAAS,CAAC,uBACP,KAAK,UAAU,UAAU,KAAK,OAAK,EAAE,eAAe,kBAAkB,GACnE,mBAAmB;;AAE3B,UAAM,OAAO;MACX,aAAa,CAAC,uBACZ,KAAK,UAAU,UAAU,KAAK,OAAK,EAAE,eAAe,kBAAkB;MACxE,uBAAuB,CAAC,mBAA2B,UAA4B;AAC7E,aAAK,cACH,IAAI,YAAqE,yBAAyB;UAChG,SAAS;UACT,UAAU;UACV,QAAQ;YACN;YACA;;SAEH,CAAC;MAEN;MACA,wBAAwB,CAAC,oBAA4B,aAA+B;AAClF,aAAK,cACH,IAAI,YAAyE,4BAA4B;UACvG,SAAS;UACT,UAAU;UACV,QAAQ;YACN;YACA;;SAEH,CAAC;MAEN;;AAGF,WAAO,KAAK,kBAAkB,KAAK,UAAU,IAAI,IAAI;EACvD;;AAxDQC,YAAA;EAFPC,SAAQ,EAAE,SAAS,aAAa,WAAW,KAAI,CAAE;EACjDC,OAAK;;;;AC3BR,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAIpB,IAAO,mBAAP,cAAgC,YAAW;;AAC/B,SAAA,SAASC;;;;;;;;;;;EAUvB;EAEO,SAAM;AACb,WAAOC,+CAA8C,KAAK,UAAU;EACtE;EAEgB,oBAAiB;AAC/B,UAAM,kBAAiB;AACvB,SAAK,kBAAkB,KAAK,iBAAiB;EAC/C;;;;ACxBF,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,SAAS,iBAAiB;AAIpB,IAAO,oBAAP,cAAiC,YAAW;EAAlD,cAAA;;AAUW,SAAA,SAAS,MAAMC,sCAAqC,UAAU,KAAK,UAAU,CAAC;EAMzF;;AAfkB,SAAA,SAASC;;;;;;;;EAOvB;EAIc,oBAAiB;AAC/B,UAAM,kBAAiB;AACvB,SAAK,kBAAkB,KAAK,iBAAiB;EAC/C;;;;ACpBF,SAAS,QAAAC,OAAM,cAAAC,mBAAkB;;;ACAjC,SAAS,OAAAC,YAAW;AAEpB,IAAA,+BAAeA;;;;;;;ADeT,IAAO,cAAP,cAA2BC,YAAU;;AACzB,SAAA,SAAyB;EAAO;EAEvC,SAAM;AACb,WAAOC;EACT;;;;AEtBF,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAIpB,IAAO,mBAAP,cAAgC,YAAW;;AAC/B,SAAA,SAASC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCvB;EAEO,SAAM;AACb,WAAOC;2DACgD,KAAK,eAAe,IAAI;;;wDAG3B,KAAK,aAAa;;;;EAIxE;EAEA,eAAY;AACV,UAAM,SAAS,KAAK,YAAY,cAAc,QAAQ;AACtD,QAAI,UAAU,CAAC,OAAO,MAAM;AAC1B,aAAO,UAAS;IAClB;EACF;EAEA,gBAAa;AACX,UAAM,SAAS,KAAK,YAAY,cAAc,QAAQ;AACtD,QAAI,UAAU,OAAO,MAAM;AACzB,aAAO,MAAK;AACZ,WAAK,aAAa;IACpB;EACF;EAEgB,oBAAiB;AAC/B,UAAM,kBAAiB;AACvB,QAAI,KAAK,eAAe,MAAM;AAC5B,WAAK,aAAY;IACnB;EACF;EAEmB,QAAQ,mBAAyD;AAClF,QAAI,kBAAkB,IAAI,YAAY,GAAG;AACvC,UAAI,KAAK,eAAe,MAAM;AAC5B,aAAK,aAAY;MACnB,OAAO;AACL,aAAK,cAAa;MACpB;IACF;EACF;;;;ACtFF,SAAS,WAAAC,gBAAe;AACxB,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,SAAS,YAAAC,WAAU,SAAAC,cAAa;;;;;;;AAS1B,IAAO,wBAAP,cAAqC,uBAAsB;EAAjE,cAAA;;AAE4D,SAAA,iBAAqD;EA0EjH;;AAlEkB,SAAA,SAAS;MACvBC;;;;;;EAKA;EAEO,SAAM;AACb,UAAM,QAAQ,KAAK,aAAa,UAAU,KAAK,OAAK,EAAE,eAAe,KAAK,UAAU,GAAG;AACvF,WAAOC,QAAO,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;EAC9C;EAEA,IAAI,qBAAkB;AACpB,UAAM,QAAQ,KAAK,cAAc,yBAAyB;AAC1D,QAAI,OAAO;AACT,YAAM,UAAU,oBAAI,IAAG;AACvB,iBAAW,SAAS,MAAM,iBAAiB,+BAA+B,GAAG;AAC3E,YAAI,CAAC,MAAM,aAAa,cAAc,KAAK,MAAM,aAAa,cAAc,GAAG;AAC7E,kBAAQ,MAAM,0EAA0E;QAC1F;AACA,cAAM,cAAc,WAAW,MAAM,aAAa,cAAc,CAAC;AACjE,cAAM,cAAc,WAAW,MAAM,aAAa,cAAc,CAAC;AACjE,YAAI,MAAM,WAAW,KAAK,MAAM,WAAW,GAAG;AAC5C,kBAAQ,MAAM,+EAA+E;QAC/F;AACA,gBAAQ,IAAI,aAAa,WAAW;MACtC;AACA,aAAO;IACT;AACA,WAAO;EACT;EAEgB,oBAAiB;AAC/B,UAAM,kBAAiB;AAEvB,UAAM,eAAe,KAAK,cAAc,KAAK,WAAW;AAExD,UAAM,kBAAmC;MACvC,YAAY,KAAK;MACjB,aAAa,KAAK;MAClB,UAAU,KAAK;MACf;MACA,MAAM;MACN,OAAO;MACP,oBAAoB,KAAK;MACzB,gBAAgB,KAAK;;AAKvB,oBAAgB,QAAQ;AACxB,SACG,gBAAgB,UAAU,QAAQ,gBAAgB,SAAS,YAC3D,gBAAgB,aAAa,aAAa,gBAAgB,aAAa,UACxE;AACA,sBAAgB,QAAQ;IAC1B;AACA,SAAK,cACH,IAAI,YAAY,yBAAyB;MACvC,SAAS;MACT,UAAU;MACV,QAAQ,EAAE,UAAU,gBAAe;KACpC,CAAC;EAEN;;AA1EoDC,YAAA;EAAnDC,UAAS,EAAE,MAAM,QAAQ,WAAW,YAAW,CAAE;;AACQD,YAAA;EAAzDC,UAAS,EAAE,MAAM,QAAQ,WAAW,kBAAiB,CAAE;;AAC5BD,YAAA;EAA3BC,UAAS,EAAE,MAAM,OAAM,CAAE;;AACED,YAAA;EAA3BC,UAAS,EAAE,MAAM,OAAM,CAAE;;AAInBD,YAAA;EAFNE,SAAQ,EAAE,SAAS,aAAa,WAAW,KAAI,CAAE;EACjDC,OAAK;;;;AClBR,SAAS,WAAAC,gBAAe;AACxB,SAAS,OAAAC,MAAK,QAAAC,cAAY;AAC1B,SAAS,YAAAC,WAAU,SAAAC,cAAa;;;;;;;AAW1B,IAAO,yBAAP,cAAsC,uBAAsB;;AAWhD,SAAA,SAAS;MACvBC;;;;;;EAKA;EAEO,SAAM;AACb,UAAM,QAAQ,KAAK,aAAa,UAAU,KAAK,OAAK,EAAE,eAAe,KAAK,UAAU,GAAG;AACvF,WAAOC,SAAO,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;EAC9C;EAEgB,oBAAiB;AAC/B,UAAM,kBAAiB;AACvB,UAAM,eAAe,KAAK,cAAc,KAAK,WAAW;AAExD,UAAM,mBAAqC;MACzC,UAAU,KAAK;MACf,YAAY,KAAK;MACjB,iBAAiB,KAAK;MACtB,aAAa,KAAK,eAAe;MACjC,SAAS,KAAK;MACd;MACA,aAAa,KAAK;MAClB,OAAO;MACP,MAAM;MACN,mBAAmB;;AAErB,qBAAiB,QAAQ;AAEzB,SAAK,cACH,IAAI,YAAY,yBAAyB;MACvC,SAAS;MACT,UAAU;MACV,QAAQ,EAAE,UAAU,iBAAgB;KACrC,CAAC;EAEN;EAEA,IAAI,mBAAgB;AAClB,QAAI;AACJ,UAAM,kBAAkB,KAAK,cAAc,sBAAsB;AACjE,QAAI,iBAAiB;AACnB,YAAM,SAAS,gBAAgB,iBAAiB,WAAW;AAC3D,UAAI,KAAK,gBAAgB,YAAY,OAAO,SAAS,GAAG;AACtD,iBAAS,OAAO,CAAC,EAAE,YAAY,KAAI;AACnC,eAAO,CAAC,EAAE,OAAM;MAClB,WAAW,KAAK,gBAAgB,UAAU;AACxC,iBAAS,CAAA;AACT,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,iBAAO,KAAK,OAAO,CAAC,EAAE,YAAY,KAAI,CAAE;AACxC,iBAAO,CAAC,EAAE,OAAM;QAClB;MACF;IACF;AACA,WAAO;EACT;EAEA,IAAI,WAAQ;AACV,UAAM,iBAAiB,KAAK,cAAc,aAAa;AACvD,UAAM,aAAa,WAAW,gBAAgB,aAAa,aAAa,CAAC;AACzE,UAAM,cAAc,WAAW,gBAAgB,aAAa,aAAa,CAAC;AAC1E,UAAM,eAAe;MACnB,cAAc,OAAO,gBAAgB,aAAa,eAAe,CAAC,KAAK;MACvE,YAAY,MAAM,UAAU,IAAI,OAAO;MACvC,YAAY,MAAM,WAAW,IAAI,OAAO;MACxC,YAAY,MAAM,KAAK,gBAAgB,iBAAiB,eAAe,KAAK,CAAA,CAAE,EAAE,IAAI,SAAO;QACzF,QAAQ,GAAG,aAAa,SAAS,KAAK;QACtC,aAAa,OAAO,GAAG,aAAa,cAAc,CAAC,KAAK;QACxD,eAAe,GAAG,aAAa,gBAAgB,IAAI,GAAG,aAAa,gBAAgB,MAAM,UAAU;QACnG;;AAEJ,WAAO;EACT;EAEA,IAAI,eAAY;AACd,UAAM,qBAAqB,KAAK,cAAc,kBAAkB;AAEhE,UAAM,eAAe,OAAO,oBAAoB,aAAa,eAAe,CAAC,KAAK;AAClF,UAAM,aAAa,WAAW,oBAAoB,aAAa,aAAa,CAAC;AAC7E,UAAM,cAAc,WAAW,oBAAoB,aAAa,aAAa,CAAC;AAE9E,UAAM,iBAAiB,MAAM,KAAK,oBAAoB,iBAAiB,oBAAoB,KAAK,CAAA,CAAE,EAAE,IAClG,CAAC,QAAqB;MACpB,OAAQ,GAAG,aAAa,OAAO,KAA4D;MAC3F,QAAQ,GAAG,aAAa,QAAQ,KAAK;MACrC,aAAa,OAAO,GAAG,aAAa,cAAc,CAAC,KAAK;MACxD,cAAc,OAAO,GAAG,aAAa,eAAe,CAAC,KAAK;MAC1D;AAGJ,WAAO;MACL;MACA,YAAY,MAAM,UAAU,IAAI,OAAO;MACvC,YAAY,MAAM,WAAW,IAAI,OAAO;MACxC;;EAEJ;;AA5GoDC,YAAA;EAAnDC,UAAS,EAAE,MAAM,QAAQ,WAAW,YAAW,CAAE;;AAEtBD,YAAA;EAA3BC,UAAS,EAAE,MAAM,OAAM,CAAE;;AAEED,YAAA;EAA3BC,UAAS,EAAE,MAAM,OAAM,CAAE;;AAInBD,YAAA;EAFNE,SAAQ,EAAE,SAAS,aAAa,WAAW,KAAI,CAAE;EACjDC,OAAK;;;;ACrBR,SAAS,OAAAC,MAAK,QAAAC,QAAM,cAAAC,mBAAkB;;;ACA/B,IAAM,eAAe;;;;;;;;;;;;;;;;AAiBrB,IAAM,cAAc;;;;;;;;;;;;;;;AAgBpB,IAAM,mBAAmB;;;;;;;;;;;;;;;;;ADxBhC,IAAM,8BAAsD;EAC1D,cAAc;EACd,oBAAoB;EACpB,eAAe;;AAGX,IAAO,wBAAP,cAAqCC,YAAU;;AACnC,SAAA,SAAS;MACvBC;;;;;;EAKA;EAEO,SAAM;AACb,WAAOC;EACT;EAEO,UAAO;AACZ,UAAM,iBAAiB,KAAK,QAAQ,qBAAqB;AACzD,QAAI,CAAC;AAAgB;AACrB,UAAM,QAAQ,CAAC,GAAG,KAAK,QAAQ;AAC/B,eAAW,QAAQ,OAAO;AACxB,WAAK,QAAO;IACd;EACF;EAEgB,aAAa,oBAAqE;AAChG,UAAM,WAAW,KAAK,aAAa,UAAU;AAC7C,QAAI,CAAC;AAAU;AAEf,UAAM,eAAe,SAAS,MAAM,GAAG,EAAE,IAAG,EAAI,QAAQ,QAAQ,EAAE;AAClE,UAAM,QAAQ,4BAA4B,YAAY;AAEtD,QAAI,CAAC;AAAO;AAOZ,SAAK,YAAY;EACnB;;;;AEpDF,SAAS,cAAAC,aAAY,OAAAC,MAAK,QAAAC,cAAY;AACtC,SAAS,YAAAC,iBAAgB;;;;;;;AAInB,IAAO,iBAAP,cAA8BC,YAAU;EAS5C,yBAAsB;AACpB,UAAM,aAAa,KAAK,WAAW,MAAM,GAAG;AAC5C,eAAW,QAAQ,CAAC,cAAqB;AACvC,cAAQ,WAAW;QACjB,KAAK;AACH;AACE,kBAAM,QAAQ,IAAI,YAAY,sCAAsC;cAClE,QAAQ,EAAE,WAAW,SAAS,KAAI;cAClC,SAAS;cACT,UAAU;cACV,YAAY;aACb;AACD,kBAAM,eAAe,KAAK,cAAc,KAAK;AAC7C,gBAAI,CAAC;AAAc;AACnB,iBAAK,aAAa,QAAQ,kBAAkB;UAC9C;AACA;QACF,KAAK;AACH,eAAK,aAAa,QAAQ,EAAE;AAC5B;QACF;AACE;MACJ;IACF,CAAC;EACH;;AAEgB,SAAA,SAASC;;;;;EAIvB;EAEO,SAAM;AACb,WAAOC;EACT;;AA1CqCC,YAAA;EAApCC,UAAS,EAAE,MAAM,OAAM,CAAE;;AAEED,YAAA;EAA3BC,UAAS,EAAE,MAAM,OAAM,CAAE;;AAEED,YAAA;EAA3BC,UAAS,EAAE,MAAM,OAAM,CAAE;;AAEsBD,YAAA;EAA/CC,UAAS,EAAE,MAAM,QAAQ,WAAW,QAAO,CAAE;;AAE9CD,YAAA;EADC,MAAM,cAAc,EAAE,sBAAsB,KAAI,CAAE;;;;ACbrD,SAAS,cAAAE,oBAAkB;AAIrB,IAAO,gBAAP,cAA6BA,aAAU;EAC3C,gBAAyC;EAEtB,aAAa,oBAAqE;AACnG,UAAM,aAAa,kBAAkB;AAErC,UAAM,OAAO,KAAK,aAAa,MAAM;AAErC,QAAI,SAAS,MAAM;AAEjB,YAAM,IAAI,EACP,KAAK,cAAY,SAAS,KAAI,CAAE,EAChC,KAAK,gBAAa;AAEjB,cAAM,cAAc,KAAK,WAAW,UAAU;AAG9C,aAAK,gBAAgB,SAAS,cAAc,OAAO;AACnD,aAAK,cAAc,QAAQ;AAC3B,aAAK,cAAc,cAAc,WAAW,WAAW;AAGvD,YAAI,KAAK,eAAe;AACtB,eAAK,cAAc,YAAY,KAAK,aAAa;QACnD,OAAO;AACL,kBAAQ,KAAK,uDAAuD;QACtE;MACF,CAAC,EACA,MAAM,WAAQ;AACb,gBAAQ,MAAM,8BAA8B,KAAK;MACnD,CAAC;IACL;AAEA,QAAI,KAAK,gBAAgB,QAAQ,KAAK,YAAY,KAAI,MAAO,IAAI;AAE/D,YAAM,cAAc,KAAK,WAAW,KAAK,WAAW;AAGpD,WAAK,gBAAgB,SAAS,cAAc,OAAO;AACnD,WAAK,cAAc,QAAQ;AAC3B,WAAK,cAAc,cAAc,WAAW,WAAW;AAGvD,UAAI,KAAK,eAAe;AACtB,aAAK,cAAc,YAAY,KAAK,aAAa;MACnD,OAAO;AACL,gBAAQ,KAAK,uDAAuD;MACtE;IACF;EACF;EAEA,WAAW,YAAkB;AAE3B,WAAO,WACJ,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,QAAQ,GAAG,EACnB,QAAQ,mBAAmB,IAAI,EAC/B,KAAI;EACT;EAES,uBAAoB;AAC3B,QAAI,KAAK,eAAe;AACtB,UAAI;AACF,aAAK,cAAc,OAAM;MAC3B,SAAS,OAAO;AACd,gBAAQ,MAAM,gCAAgC,KAAK;MACrD;IACF;AACA,UAAM,qBAAoB;EAC5B;;;;ACzEF,SAAS,cAAAC,cAAY,QAAAC,cAAY;AAe3B,IAAO,wBAAP,cAAqCD,aAAU;EAC1C,SAAM;AACb,WAAOC;EACT;;;;;EAMO,YAAS;AACd,UAAM,cAAc,CAAC,GAAG,KAAK,QAAQ;AAErC,QAAI,YAAY,WAAW,GAAG;AAC5B,cAAQ,MAAM,gEAAgE;AAC9E,aAAO;IACT;AAEA,QAAI;AACF,YAAM,SAAS,YAAY,CAAC,EAAE,UAAS;AACvC,aAAO,QAAQ,MAAM;IACvB,SAAS,OAAO;AACd,cAAQ,MAAM,yCAAyC,KAAK;AAC5D,aAAO;IACT;EACF;;;;EAKO,cAAW;AAChB,WAAO,CAAA;EACT;;;;;EAMO,UAAO;AACZ,UAAM,sBAAsB,KAAK,UAAS;AAE1C,QAAI,CAAC,qBAAqB;AACxB,cAAQ,MAAM,mEAAmE;IACnF;AAEA,WAAO;EACT;;;;AC5DF,SAAS,OAAAC,OAAK,cAAAC,cAAY,QAAAC,cAAY;AACtC,SAAS,YAAAC,iBAAgB;;;;;;;AAUnB,IAAO,yBAAP,cAAsCF,aAAU;EAAtD,cAAA;;AAC8B,SAAA,aAAqB;AACrB,SAAA,cAA4D;AACpC,SAAA,WAAqB;AAChB,SAAA,eAAwB;AACvB,SAAA,gBAAyB;AAEnF,SAAA,gBAAqB;EAkGvB;EAlGE;;AAEgB,SAAA,SAAS;MACvBD;;;;;;EAKA;EAEO,SAAM;AACb,WAAOE;EACT;EAES,oBAAiB;AACxB,UAAM,kBAAiB;AACvB,SAAK,eAAe,KAAK,MAAK;AAC5B,WAAK,qBAAoB;AACzB,WAAK,0BAAyB;IAChC,CAAC;EACH;;;;EAKA,uBAAoB;AAClB,UAAM,sBAAsB,KAAK,cAAc,mBAAmB;AAClE,QAAI,CAAC,qBAAqB;AACxB;IACF;AAGA,UAAM,cAAc,oBAAoB,aAAa,KAAI,KAAM;AAC/D,SAAK,gBAAgB,KAAK,cAAc,WAAW;EACrD;;;;EAKA,cAAc,OAAa;AACzB,QAAI,CAAC;AAAO,aAAO;AAEnB,YAAQ,KAAK,UAAU;MACrB,KAAK;AACH,eAAO,SAAS,OAAO,EAAE;MAC3B,KAAK;MACL,KAAK;AACH,eAAO,WAAW,KAAK;MACzB,KAAK;AACH,eAAO,MAAM,YAAW,MAAO;MACjC,KAAK;MACL;AACE,eAAO;IACX;EACF;;;;EAKA,4BAAyB;AACvB,UAAM,mBAAqC;MACzC,YAAY,KAAK;MACjB,aAAa,KAAK;MAClB,UAAU,KAAK;MACf,cAAc,KAAK;MACnB,OAAO,KAAK;MACZ,MAAM;MACN,cAAc,KAAK;MACnB,eAAe,KAAK;;AAMtB,UAAM,WAAW,EAAE,GAAG,kBAAkB,OAAO,KAAK,eAAe,SAAQ,KAAM,GAAE;AACnF,SAAK,cACH,IAAI,YAAY,yBAAyB;MACvC,SAAS;MACT,UAAU;MACV,QAAQ,EAAE,SAAQ;KACnB,CAAC;EAEN;;;;EAKO,sBAAmB;AACxB,WAAO;MACL,YAAY,KAAK;MACjB,aAAa,KAAK;MAClB,UAAU,KAAK;MACf,OAAO,KAAK;MACZ,MAAM;MACN,cAAc,KAAK;MACnB,eAAe,KAAK;;EAExB;;AAvG4BE,YAAA;EAA3BD,UAAS,EAAE,MAAM,OAAM,CAAE;;AACEC,YAAA;EAA3BD,UAAS,EAAE,MAAM,OAAM,CAAE;;AAC0BC,YAAA;EAAnDD,UAAS,EAAE,MAAM,QAAQ,WAAW,YAAW,CAAE;;AACOC,YAAA;EAAxDD,UAAS,EAAE,MAAM,SAAS,WAAW,gBAAe,CAAE;;AACGC,YAAA;EAAzDD,UAAS,EAAE,MAAM,SAAS,WAAW,iBAAgB,CAAE;;;;AChB1D,SAAS,OAAAE,OAAK,QAAAC,QAAM,cAAAC,oBAAkB;AAWhC,IAAO,wBAAP,cAAqCA,aAAU;;AACnC,SAAA,SAAS;MACvBF;;;;;;EAKA;EAEF,iBAAiB;;EAER,SAAM;AACb,WAAOC;EACT;;;;EAKO,UAAO;AACZ,UAAM,iBAAiB,KAAK,QAAQ,qBAAqB;AACzD,QAAI,CAAC,gBAAgB;AACnB,cAAQ,KAAK,4DAA4D;AACzE;IACF;AAEA,QAAI,aAAa;AACjB,QAAI,kBAAkB;AAEtB,OAAG;AACD,wBAAkB;AAClB;AAEA,UAAI,aAAa,KAAK,gBAAgB;AACpC,gBAAQ,MAAM,0EAA0E;AACxF;MACF;AAEA,UAAI;AACF,cAAM,QAAQ,CAAC,GAAG,KAAK,QAAQ;AAC/B,mBAAW,QAAQ,OAAO;AAExB,cAAI,KAAK,QAAQ,YAAW,MAAO,2BAA2B;AAC5D,kBAAM,mBAAoB,KAA+B,UAAS;AAClE,gBAAI,qBAAqB,OAAO;AAE9B,gCAAkB;AAClB;YACF;UACF,OAAO;AACL,iBAAK,QAAO;UACd;QACF;MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,qCAAqC,KAAK;AACxD;MACF;IACF,SAAS;AAGT,SAAK,cACH,IAAI,YAAY,oCAAoC;MAClD,SAAS;MACT,UAAU;MACV,QAAQ,EAAE,WAAU;KACrB,CAAC;EAEN;EAEgB,aAAa,oBAAqE;AAGhG,QAAI,KAAK,aAAa,UAAU,GAAG;AACjC,cAAQ,KAAK,gEAAgE;IAC/E;EACF;;;;AC7CK,IAAM,qBAAqB;EAChC,EAAE,KAAK,uBAAuB,MAAM,kBAAiB;EACrD,EAAE,KAAK,+BAA+B,MAAM,yBAAwB;EACpE,EAAE,KAAK,gCAAgC,MAAM,0BAAyB;EACtE,EAAE,KAAK,oBAAoB,MAAM,eAAc;EAC/C,EAAE,KAAK,2BAA2B,MAAM,sBAAqB;EAC7D,EAAE,KAAK,uBAAuB,MAAM,kBAAiB;EACrD,EAAE,KAAK,sBAAsB,MAAM,iBAAgB;EACnD,EAAE,KAAK,uBAAuB,MAAM,kBAAiB;EACrD,EAAE,KAAK,iBAAiB,MAAM,YAAW;EACzC,EAAE,KAAK,sBAAsB,MAAM,iBAAgB;EACnD,EAAE,KAAK,2BAA2B,MAAM,sBAAqB;EAC7D,EAAE,KAAK,4BAA4B,MAAM,uBAAsB;EAC/D,EAAE,KAAK,2BAA2B,MAAM,sBAAqB;EAC7D,EAAE,KAAK,oBAAoB,MAAM,eAAc;EAC/C,EAAE,KAAK,kBAAkB,MAAM,cAAa;EAC5C,EAAE,KAAK,2BAA2B,MAAM,sBAAqB;EAC7D,EAAE,KAAK,4BAA4B,MAAM,uBAAsB;EAC/D,EAAE,KAAK,2BAA2B,MAAM,sBAAqB;;","names":["state","LitElement","property","LitElement","__decorate","property","LitElement","LitElement","html","LitElement","html","__decorate","LitElement","html","property","__decorate","consume","LitElement","html","state","LitElement","html","__decorate","consume","state","css","html","css","html","css","html","html","css","html","LitElement","css","LitElement","html","css","html","css","html","consume","css","html","property","state","css","html","__decorate","property","consume","state","consume","css","html","property","state","css","html","__decorate","property","consume","state","css","html","LitElement","LitElement","css","html","LitElement","css","html","property","LitElement","css","html","__decorate","property","LitElement","LitElement","html","css","LitElement","html","property","__decorate","css","html","LitElement"]}
@@ -19,6 +19,16 @@ type ComputedItem = ComputedItemContext & {
19
19
  type?: 'info' | 'regular';
20
20
  index?: number;
21
21
  active?: boolean;
22
+ allowSkipping?: boolean;
23
+ maxAttempts?: number;
24
+ showFeedback?: boolean;
25
+ showSolution?: boolean;
26
+ numAttempts?: number;
27
+ valid?: boolean;
28
+ isDefaultResponse?: boolean;
29
+ done?: boolean;
30
+ /** Last *ended attempt* reached the optimal outcome (best achievable score / correct response). */
31
+ optimal?: boolean;
22
32
  };
23
33
  type ComputedContext = {
24
34
  view: View;
@@ -29,6 +39,7 @@ type ComputedContext = {
29
39
  identifier: string;
30
40
  navigationMode: 'linear' | 'nonlinear';
31
41
  submissionMode: 'individual' | 'simultaneous';
42
+ allowSkipping?: boolean;
32
43
  sections: {
33
44
  active?: boolean;
34
45
  identifier: string;
@@ -37,6 +48,7 @@ type ComputedContext = {
37
48
  items: ComputedItem[];
38
49
  navigationMode: 'linear' | 'nonlinear';
39
50
  submissionMode: 'individual' | 'simultaneous';
51
+ allowSkipping?: boolean;
40
52
  }[];
41
53
  }[];
42
54
  };
@@ -5,19 +5,19 @@ import { LitElement } from 'lit';
5
5
  import { g as QtiGapText, k as QtiHotspotChoice, m as QtiHottext, v as QtiSimpleAssociableChoice, w as QtiSimpleChoice, a as QtiAssociateInteraction, b as QtiChoiceInteraction, c as QtiExtendedTextInteraction, f as QtiGapMatchInteraction, h as QtiGraphicAssociateInteraction, i as QtiGraphicGapMatchInteraction, j as QtiGraphicOrderInteraction, C as Choice, l as QtiHotspotInteraction, n as QtiHottextInteraction, p as QtiInlineChoiceInteraction, q as QtiMatchInteraction, r as QtiOrderInteraction, s as QtiPortableCustomInteraction, u as QtiSelectPointInteraction, x as QtiSliderInteraction, y as QtiTextEntryInteraction } from './qti-text-entry-interaction.d-BGdfV9qG.js';
6
6
  import { QtiAssessmentItem } from './elements.js';
7
7
  import { QtiItem } from './item.js';
8
- import { e as QtiTest, T as TestCheckItem, n as TestNavigation } from './qti-test.d-_YAlhDbt.js';
9
- import { V as View, C as ComputedContext } from './computed.types.d-DpKIYO6e.js';
8
+ import { f as QtiTest, T as TestCheckItem, o as TestNavigation } from './qti-test.d-C6lCEMRB.js';
9
+ import { V as View, a as ComputedItem, C as ComputedContext } from './computed.types.d-CJarqC6s.js';
10
10
  import { C as ComputedItemContext } from './computed-item.types.d-BKZdSLLJ.js';
11
11
  import './config.context.d-BvU9r-Mg.js';
12
12
  import './interaction.interface.d-CvjHM2bi.js';
13
13
  import './item.types.d-QU7LljEK.js';
14
14
  import './qti.context.d-CejJMlfZ.js';
15
15
  import 'lit/directives/ref.js';
16
- import './qti-feedback.d-DZbad0RN.js';
16
+ import './qti-feedback.d-B1EIF-fU.js';
17
17
  import './qti-rule-base.d-ajOnfGXY.js';
18
18
  import './qti-transform-test.d-BL7GGFJj.js';
19
19
  import '@heximal/templates';
20
- import './qti-expression.d-BietT_8b.js';
20
+ import './qti-expression.d-B_-m9emA.js';
21
21
 
22
22
  type AbstractConstructor$2<T = {}> = abstract new (...args: any[]) => T;
23
23
  declare enum Correctness {
@@ -159,6 +159,16 @@ declare class TestNavigationCorrection extends TestNavigation {
159
159
  #private;
160
160
  constructor();
161
161
  disconnectedCallback(): void;
162
+ /**
163
+ * Reflect correctness back to the candidate after an ended attempt, for items
164
+ * the assessment opted in via the standard `qti-item-session-control
165
+ * show-solution` (QTI 3.0 ItemSessionControl.show-solution) — the player takes
166
+ * no opinion of its own:
167
+ * - candidate correction (a mark on the learner's selection) after every attempt;
168
+ * - the correct response (a mark on the right answer) once the item is done —
169
+ * the candidate reached the optimal outcome, or ran out of attempts.
170
+ */
171
+ protected afterAttemptEnded(assessmentItem: QtiAssessmentItem | undefined, computedItem: ComputedItem | undefined, done: boolean): void;
162
172
  }
163
173
  /** Test host extension that shows correct responses in scorer view. */
164
174
  declare class QtiTestCorrection extends QtiTest {
@@ -34,15 +34,15 @@ import {
34
34
  TestNavigationCorrection,
35
35
  TestShowCorrectResponse,
36
36
  correctionPart
37
- } from "./chunk-J5SQLKNP.js";
38
- import "./chunk-HBSWJC3B.js";
39
- import "./chunk-7AVWRQIS.js";
40
- import "./chunk-TWPXES3S.js";
41
- import "./chunk-RSVRS5AK.js";
42
- import "./chunk-G6GFQDVN.js";
37
+ } from "./chunk-OIUK5BFU.js";
38
+ import "./chunk-CRLXQZFA.js";
39
+ import "./chunk-YLRMOX6C.js";
40
+ import "./chunk-Q6ZK4LRH.js";
41
+ import "./chunk-LMGJOBJA.js";
42
+ import "./chunk-TLTYXWW7.js";
43
43
  import "./chunk-4DB4SC5K.js";
44
- import "./chunk-IJD53WY6.js";
45
- import "./chunk-HQESINXH.js";
44
+ import "./chunk-HDEG6BAZ.js";
45
+ import "./chunk-7D3NKAGZ.js";
46
46
  export {
47
47
  CandidateCorrectionMixin,
48
48
  ChoiceCorrectionMixin,
@@ -2,7 +2,7 @@ import * as lit from 'lit';
2
2
  import { LitElement, CSSResultGroup, PropertyValueMap } from 'lit';
3
3
  import { g as VariableValue, I as ItemContext, R as ResponseInteraction, f as ResponseVariable, b as OutcomeVariable, V as VariableDeclaration, C as Calculate, B as BaseType, a as Cardinality, T as TemplateVariable } from './item.types.d-QU7LljEK.js';
4
4
  import { a as RegisteredInteraction } from './interaction.interface.d-CvjHM2bi.js';
5
- import { Q as QtiFeedback, a as QtiVariableDeclaration } from './qti-feedback.d-DZbad0RN.js';
5
+ import { Q as QtiFeedback, a as QtiVariableDeclaration } from './qti-feedback.d-B1EIF-fU.js';
6
6
  import { Q as QtiRuleBase } from './qti-rule-base.d-ajOnfGXY.js';
7
7
 
8
8
  /**
@@ -275,7 +275,6 @@ declare global {
275
275
  }
276
276
 
277
277
  declare class QtiResponseProcessing extends LitElement {
278
- #private;
279
278
  static styles: lit.CSSResult[];
280
279
  render(): lit.TemplateResult<1>;
281
280
  process(): void;
package/dist/elements.js CHANGED
@@ -1,4 +1,4 @@
1
- import "./chunk-NJQHUUTN.js";
1
+ import "./chunk-U7YCXDYC.js";
2
2
  import {
3
3
  QtiAssessmentItem,
4
4
  QtiAssessmentStimulusRef,
@@ -19,10 +19,10 @@ import {
19
19
  QtiTemplateConstraint,
20
20
  QtiTemplateDeclaration,
21
21
  QtiTemplateProcessing
22
- } from "./chunk-7AVWRQIS.js";
22
+ } from "./chunk-YLRMOX6C.js";
23
23
  import "./chunk-4DB4SC5K.js";
24
- import "./chunk-IJD53WY6.js";
25
- import "./chunk-HQESINXH.js";
24
+ import "./chunk-HDEG6BAZ.js";
25
+ import "./chunk-7D3NKAGZ.js";
26
26
  export {
27
27
  QtiAssessmentItem,
28
28
  QtiAssessmentStimulusRef,