@pie-element/select-text 11.0.1 → 11.0.2-esm.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.
package/esm/controller.js CHANGED
@@ -3,45 +3,22 @@ import isEmpty from 'lodash/isEmpty';
3
3
  import { getFeedbackForCorrectness } from '@pie-lib/feedback';
4
4
  import { partialScoring } from '@pie-lib/controller-utils';
5
5
 
6
- function ownKeys(object, enumerableOnly) {
7
- var keys = Object.keys(object);
8
-
9
- if (Object.getOwnPropertySymbols) {
10
- var symbols = Object.getOwnPropertySymbols(object);
11
- enumerableOnly && (symbols = symbols.filter(function (sym) {
12
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
13
- })), keys.push.apply(keys, symbols);
14
- }
15
-
16
- return keys;
17
- }
18
-
19
- function _objectSpread2(target) {
20
- for (var i = 1; i < arguments.length; i++) {
21
- var source = null != arguments[i] ? arguments[i] : {};
22
- i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
23
- _defineProperty(target, key, source[key]);
24
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
25
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
26
- });
27
- }
28
-
29
- return target;
30
- }
6
+ function _extends() {
7
+ _extends = Object.assign || function (target) {
8
+ for (var i = 1; i < arguments.length; i++) {
9
+ var source = arguments[i];
10
+
11
+ for (var key in source) {
12
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
13
+ target[key] = source[key];
14
+ }
15
+ }
16
+ }
31
17
 
32
- function _defineProperty(obj, key, value) {
33
- if (key in obj) {
34
- Object.defineProperty(obj, key, {
35
- value: value,
36
- enumerable: true,
37
- configurable: true,
38
- writable: true
39
- });
40
- } else {
41
- obj[key] = value;
42
- }
18
+ return target;
19
+ };
43
20
 
44
- return obj;
21
+ return _extends.apply(this, arguments);
45
22
  }
46
23
 
47
24
  var defaults = {
@@ -63,38 +40,29 @@ var defaults = {
63
40
  toolbarEditorPosition: 'bottom'
64
41
  };
65
42
 
66
- var log = debug('@pie-element:select-text:controller');
43
+ const log = debug('@pie-element:select-text:controller');
67
44
 
68
- var equalTokens = function equalTokens() {
69
- var token1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
70
- var token2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
71
- return (token1 === null || token1 === void 0 ? void 0 : token1.start) === (token2 === null || token2 === void 0 ? void 0 : token2.start) && (token1 === null || token1 === void 0 ? void 0 : token1.end) === (token2 === null || token2 === void 0 ? void 0 : token2.end) || // this case is used for the cases when the token's start & end were recalculated
72
- (token1 === null || token1 === void 0 ? void 0 : token1.start) === (token2 === null || token2 === void 0 ? void 0 : token2.oldStart) && (token1 === null || token1 === void 0 ? void 0 : token1.end) === (token2 === null || token2 === void 0 ? void 0 : token2.oldEnd);
73
- };
45
+ const equalTokens = (token1 = {}, token2 = {}) => (token1 == null ? void 0 : token1.start) === (token2 == null ? void 0 : token2.start) && (token1 == null ? void 0 : token1.end) === (token2 == null ? void 0 : token2.end) || // this case is used for the cases when the token's start & end were recalculated
46
+ (token1 == null ? void 0 : token1.start) === (token2 == null ? void 0 : token2.oldStart) && (token1 == null ? void 0 : token1.end) === (token2 == null ? void 0 : token2.oldEnd);
74
47
 
75
- var normalizeTokens = function normalizeTokens() {
76
- var tokens = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
77
- var selectedTokens = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
78
- var evaluateMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
79
- return (tokens || []).map(token => {
80
- var isCorrect = !!token.correct; // search if correct token is missing from session
48
+ const normalizeTokens = (tokens = [], selectedTokens = [], evaluateMode = false) => (tokens || []).map(token => {
49
+ const isCorrect = !!token.correct; // search if correct token is missing from session
81
50
 
82
- var isMissing = isCorrect && !(selectedTokens || []).find(selectedToken => equalTokens(token, selectedToken));
83
- return _objectSpread2(_objectSpread2({}, token), {}, {
84
- correct: evaluateMode ? isCorrect : undefined,
85
- isMissing: evaluateMode ? isMissing : undefined
86
- });
51
+ const isMissing = isCorrect && !(selectedTokens || []).find(selectedToken => equalTokens(token, selectedToken));
52
+ return _extends({}, token, {
53
+ correct: evaluateMode ? isCorrect : undefined,
54
+ isMissing: evaluateMode ? isMissing : undefined
87
55
  });
88
- };
56
+ });
89
57
 
90
- var getCorrectness = (tokens, selected) => {
91
- var correct = tokens.filter(t => t.correct === true);
58
+ const getCorrectness = (tokens, selected) => {
59
+ const correct = tokens.filter(t => t.correct === true);
92
60
 
93
61
  if (correct.length === 0) {
94
62
  return 'unknown';
95
63
  }
96
64
 
97
- var correctSelected = getCorrectSelected(tokens, selected);
65
+ const correctSelected = getCorrectSelected(tokens, selected);
98
66
 
99
67
  if (correctSelected.length === selected.length) {
100
68
  if (correctSelected.length === correct.length) {
@@ -111,22 +79,22 @@ var getCorrectness = (tokens, selected) => {
111
79
  return 'incorrect';
112
80
  };
113
81
 
114
- var getCorrectSelected = (tokens, selected) => (selected || []).filter(s => tokens.findIndex(token => token.correct && equalTokens(token, s)) !== -1);
82
+ const getCorrectSelected = (tokens, selected) => (selected || []).filter(s => tokens.findIndex(token => token.correct && equalTokens(token, s)) !== -1);
115
83
 
116
- var getPartialScore = (question, session, totalCorrect) => {
84
+ const getPartialScore = (question, session, totalCorrect) => {
117
85
  if (!session || isEmpty(session)) {
118
86
  return 0;
119
87
  }
120
88
 
121
- var correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;
122
- var correctTokens = (question.tokens || []).filter(t => t.correct === true);
123
- var extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;
124
- var incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;
125
- var count = correctCount - incorrectCount;
126
- var positiveCount = count < 0 ? 0 : count;
89
+ const correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;
90
+ const correctTokens = (question.tokens || []).filter(t => t.correct === true);
91
+ const extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;
92
+ const incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;
93
+ const count = correctCount - incorrectCount;
94
+ const positiveCount = count < 0 ? 0 : count;
127
95
  return totalCorrect.length ? parseFloat((positiveCount / totalCorrect.length).toFixed(2)) : 0;
128
96
  };
129
- var outcome = (question, session, env) => new Promise(resolve => {
97
+ const outcome = (question, session, env) => new Promise(resolve => {
130
98
  if (!session || isEmpty(session)) {
131
99
  resolve({
132
100
  score: 0,
@@ -142,39 +110,38 @@ var outcome = (question, session, env) => new Promise(resolve => {
142
110
  completed: undefined
143
111
  });
144
112
  } else {
145
- var enabled = partialScoring.enabled(question, env, true);
146
- var totalCorrect = question.tokens.filter(t => t.correct);
147
- var score = getPartialScore(question, session, totalCorrect);
113
+ const enabled = partialScoring.enabled(question, env, true);
114
+ const totalCorrect = question.tokens.filter(t => t.correct);
115
+ const score = getPartialScore(question, session, totalCorrect);
148
116
  resolve({
149
117
  score: enabled ? score : score === 1 ? 1 : 0
150
118
  });
151
119
  }
152
120
  });
153
- function createDefaultModel() {
154
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
121
+ function createDefaultModel(model = {}) {
155
122
  return new Promise(resolve => {
156
- resolve(_objectSpread2(_objectSpread2({}, defaults), model));
123
+ resolve(_extends({}, defaults, model));
157
124
  });
158
125
  }
159
- var normalizeSession = session => _objectSpread2({
126
+ const normalizeSession = session => _extends({
160
127
  selectedTokens: []
161
128
  }, session);
162
- var normalize = question => _objectSpread2(_objectSpread2({}, defaults), question);
163
- var model = (question, session, env) => {
129
+ const normalize = question => _extends({}, defaults, question);
130
+ const model = (question, session, env) => {
164
131
  session = session || {
165
132
  selectedToken: []
166
133
  };
167
134
  session.selectedTokens = session.selectedTokens || [];
168
- var normalizedQuestion = normalize(question);
135
+ const normalizedQuestion = normalize(question);
169
136
  return new Promise(resolve => {
170
137
  log('[model]', 'normalizedQuestion: ', normalizedQuestion);
171
138
  log('[model]', 'session: ', session);
172
- var tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');
139
+ const tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');
173
140
  log('[model] tokens:', tokens);
174
- var correctness = env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;
175
- var fb = env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback) : Promise.resolve(undefined);
141
+ const correctness = env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;
142
+ const fb = env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback) : Promise.resolve(undefined);
176
143
  fb.then(feedback => {
177
- var out = {
144
+ const out = {
178
145
  tokens,
179
146
  highlightChoices: normalizedQuestion.highlightChoices,
180
147
  prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
@@ -201,13 +168,13 @@ var model = (question, session, env) => {
201
168
  });
202
169
  });
203
170
  };
204
- var createCorrectResponseSession = (question, env) => {
171
+ const createCorrectResponseSession = (question, env) => {
205
172
  return new Promise(resolve => {
206
173
  if (env.mode !== 'evaluate' && env.role === 'instructor') {
207
- var {
174
+ const {
208
175
  tokens
209
176
  } = question;
210
- var selectedTokens = tokens.filter(t => t.correct);
177
+ const selectedTokens = tokens.filter(t => t.correct);
211
178
  resolve({
212
179
  id: '1',
213
180
  selectedTokens
@@ -219,40 +186,38 @@ var createCorrectResponseSession = (question, env) => {
219
186
  }; // remove all html tags
220
187
 
221
188
 
222
- var getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
189
+ const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
223
190
 
224
- var validate = function validate() {
225
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
226
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
227
- var {
191
+ const validate = (model = {}, config = {}) => {
192
+ const {
228
193
  tokens
229
194
  } = model;
230
- var {
195
+ const {
231
196
  minTokens = 2,
232
197
  maxTokens,
233
198
  maxSelections
234
199
  } = config;
235
- var errors = {};
236
- var nbOfTokens = (tokens || []).length;
200
+ const errors = {};
201
+ const nbOfTokens = (tokens || []).length;
237
202
  ['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
238
203
  var _config$field;
239
204
 
240
- if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
205
+ if ((_config$field = config[field]) != null && _config$field.required && !getContent(model[field])) {
241
206
  errors[field] = 'This field is required.';
242
207
  }
243
208
  });
244
- var nbOfSelections = (tokens || []).reduce((acc, token) => token.correct ? acc + 1 : acc, 0);
209
+ const nbOfSelections = (tokens || []).reduce((acc, token) => token.correct ? acc + 1 : acc, 0);
245
210
 
246
211
  if (nbOfTokens < minTokens) {
247
- errors.tokensError = "There should be at least ".concat(minTokens, " tokens defined.");
212
+ errors.tokensError = `There should be at least ${minTokens} tokens defined.`;
248
213
  } else if (nbOfTokens > maxTokens) {
249
- errors.tokensError = "No more than ".concat(maxTokens, " tokens should be defined.");
214
+ errors.tokensError = `No more than ${maxTokens} tokens should be defined.`;
250
215
  }
251
216
 
252
217
  if (nbOfSelections < 1) {
253
218
  errors.selectionsError = 'There should be at least 1 token selected.';
254
219
  } else if (nbOfSelections > maxSelections) {
255
- errors.selectionsError = "No more than ".concat(maxSelections, " tokens should be selected.");
220
+ errors.selectionsError = `No more than ${maxSelections} tokens should be selected.`;
256
221
  }
257
222
 
258
223
  return errors;
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sources":["../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["export default {\n feedbackEnabled: false,\n highlightChoices: false,\n maxSelections: 0,\n mode: 'sentence',\n partialScoring: false,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n scoringType: 'auto',\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n text: '',\n tokens: [],\n toolbarEditorPosition: 'bottom',\n};\n","import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\nconst log = debug('@pie-element:select-text:controller');\n\nconst equalTokens = (token1 = {}, token2 = {}) =>\n (token1?.start === token2?.start && token1?.end === token2?.end) ||\n // this case is used for the cases when the token's start & end were recalculated\n (token1?.start === token2?.oldStart && token1?.end === token2?.oldEnd);\n\nconst normalizeTokens = (tokens = [], selectedTokens = [], evaluateMode = false) =>\n (tokens || []).map((token) => {\n const isCorrect = !!token.correct;\n // search if correct token is missing from session\n const isMissing = isCorrect && !(selectedTokens || []).find((selectedToken) => equalTokens(token, selectedToken));\n\n return {\n ...token,\n correct: evaluateMode ? isCorrect : undefined,\n isMissing: evaluateMode ? isMissing : undefined,\n };\n });\n\nexport const getCorrectness = (tokens, selected) => {\n const correct = tokens.filter((t) => t.correct === true);\n\n if (correct.length === 0) {\n return 'unknown';\n }\n\n const correctSelected = getCorrectSelected(tokens, selected);\n\n if (correctSelected.length === selected.length) {\n if (correctSelected.length === correct.length) {\n return 'correct';\n } else if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n }\n\n if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n\n return 'incorrect';\n};\n\nconst getCorrectSelected = (tokens, selected) =>\n (selected || []).filter((s) => tokens.findIndex((token) => token.correct && equalTokens(token, s)) !== -1);\n\nexport const getPartialScore = (question, session, totalCorrect) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;\n const correctTokens = (question.tokens || []).filter((t) => t.correct === true);\n const extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;\n const incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;\n const count = correctCount - incorrectCount;\n const positiveCount = count < 0 ? 0 : count;\n\n return totalCorrect.length ? parseFloat((positiveCount / totalCorrect.length).toFixed(2)) : 0;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const enabled = partialScoring.enabled(question, env, true);\n const totalCorrect = question.tokens.filter((t) => t.correct);\n const score = getPartialScore(question, session, totalCorrect);\n resolve({\n score: enabled ? score : score === 1 ? 1 : 0,\n });\n }\n });\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({ ...defaults, ...model });\n });\n}\n\nexport const normalizeSession = (session) => ({ selectedTokens: [], ...session });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport const model = (question, session, env) => {\n session = session || { selectedToken: [] };\n session.selectedTokens = session.selectedTokens || [];\n const normalizedQuestion = normalize(question);\n\n return new Promise((resolve) => {\n log('[model]', 'normalizedQuestion: ', normalizedQuestion);\n log('[model]', 'session: ', session);\n\n const tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');\n log('[model] tokens:', tokens);\n\n const correctness =\n env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;\n\n const fb =\n env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled\n ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedback) => {\n const out = {\n tokens,\n highlightChoices: normalizedQuestion.highlightChoices,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n text: normalizedQuestion.text,\n disabled: env.mode !== 'gather',\n maxSelections: normalizedQuestion.maxSelections,\n correctness,\n env,\n feedback,\n incorrect: env.mode === 'evaluate' ? correctness !== 'correct' : undefined,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n });\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { tokens } = question;\n const selectedTokens = tokens.filter((t) => t.correct);\n\n resolve({\n id: '1',\n selectedTokens,\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { tokens } = model;\n const { minTokens = 2, maxTokens, maxSelections } = config;\n const errors = {};\n const nbOfTokens = (tokens || []).length;\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const nbOfSelections = (tokens || []).reduce((acc, token) => (token.correct ? acc + 1 : acc), 0);\n\n if (nbOfTokens < minTokens) {\n errors.tokensError = `There should be at least ${minTokens} tokens defined.`;\n } else if (nbOfTokens > maxTokens) {\n errors.tokensError = `No more than ${maxTokens} tokens should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selectionsError = 'There should be at least 1 token selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selectionsError = `No more than ${maxSelections} tokens should be selected.`;\n }\n\n return errors;\n};\n"],"names":["feedbackEnabled","highlightChoices","maxSelections","mode","partialScoring","prompt","promptEnabled","rationale","rationaleEnabled","scoringType","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","text","tokens","toolbarEditorPosition","log","debug","equalTokens","token1","token2","start","end","oldStart","oldEnd","normalizeTokens","selectedTokens","evaluateMode","map","token","isCorrect","correct","isMissing","find","selectedToken","_objectSpread","undefined","getCorrectness","selected","filter","t","length","correctSelected","getCorrectSelected","s","findIndex","getPartialScore","question","session","totalCorrect","isEmpty","correctCount","correctTokens","extraSelected","incorrectCount","count","positiveCount","parseFloat","toFixed","outcome","env","Promise","resolve","score","empty","normalizeSession","completed","enabled","createDefaultModel","model","defaults","normalize","normalizedQuestion","correctness","fb","getFeedbackForCorrectness","feedback","then","out","disabled","incorrect","language","extraCSSRules","role","createCorrectResponseSession","id","getContent","html","replace","validate","config","minTokens","maxTokens","errors","nbOfTokens","forEach","field","required","nbOfSelections","reduce","acc","tokensError","selectionsError"],"mappings":"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"}
1
+ {"version":3,"file":"controller.js","sources":["../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["export default {\n feedbackEnabled: false,\n highlightChoices: false,\n maxSelections: 0,\n mode: 'sentence',\n partialScoring: false,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n scoringType: 'auto',\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n text: '',\n tokens: [],\n toolbarEditorPosition: 'bottom',\n};\n","import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\nconst log = debug('@pie-element:select-text:controller');\n\nconst equalTokens = (token1 = {}, token2 = {}) =>\n (token1?.start === token2?.start && token1?.end === token2?.end) ||\n // this case is used for the cases when the token's start & end were recalculated\n (token1?.start === token2?.oldStart && token1?.end === token2?.oldEnd);\n\nconst normalizeTokens = (tokens = [], selectedTokens = [], evaluateMode = false) =>\n (tokens || []).map((token) => {\n const isCorrect = !!token.correct;\n // search if correct token is missing from session\n const isMissing = isCorrect && !(selectedTokens || []).find((selectedToken) => equalTokens(token, selectedToken));\n\n return {\n ...token,\n correct: evaluateMode ? isCorrect : undefined,\n isMissing: evaluateMode ? isMissing : undefined,\n };\n });\n\nexport const getCorrectness = (tokens, selected) => {\n const correct = tokens.filter((t) => t.correct === true);\n\n if (correct.length === 0) {\n return 'unknown';\n }\n\n const correctSelected = getCorrectSelected(tokens, selected);\n\n if (correctSelected.length === selected.length) {\n if (correctSelected.length === correct.length) {\n return 'correct';\n } else if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n }\n\n if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n\n return 'incorrect';\n};\n\nconst getCorrectSelected = (tokens, selected) =>\n (selected || []).filter((s) => tokens.findIndex((token) => token.correct && equalTokens(token, s)) !== -1);\n\nexport const getPartialScore = (question, session, totalCorrect) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;\n const correctTokens = (question.tokens || []).filter((t) => t.correct === true);\n const extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;\n const incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;\n const count = correctCount - incorrectCount;\n const positiveCount = count < 0 ? 0 : count;\n\n return totalCorrect.length ? parseFloat((positiveCount / totalCorrect.length).toFixed(2)) : 0;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const enabled = partialScoring.enabled(question, env, true);\n const totalCorrect = question.tokens.filter((t) => t.correct);\n const score = getPartialScore(question, session, totalCorrect);\n resolve({\n score: enabled ? score : score === 1 ? 1 : 0,\n });\n }\n });\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({ ...defaults, ...model });\n });\n}\n\nexport const normalizeSession = (session) => ({ selectedTokens: [], ...session });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport const model = (question, session, env) => {\n session = session || { selectedToken: [] };\n session.selectedTokens = session.selectedTokens || [];\n const normalizedQuestion = normalize(question);\n\n return new Promise((resolve) => {\n log('[model]', 'normalizedQuestion: ', normalizedQuestion);\n log('[model]', 'session: ', session);\n\n const tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');\n log('[model] tokens:', tokens);\n\n const correctness =\n env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;\n\n const fb =\n env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled\n ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedback) => {\n const out = {\n tokens,\n highlightChoices: normalizedQuestion.highlightChoices,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n text: normalizedQuestion.text,\n disabled: env.mode !== 'gather',\n maxSelections: normalizedQuestion.maxSelections,\n correctness,\n env,\n feedback,\n incorrect: env.mode === 'evaluate' ? correctness !== 'correct' : undefined,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n });\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { tokens } = question;\n const selectedTokens = tokens.filter((t) => t.correct);\n\n resolve({\n id: '1',\n selectedTokens,\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { tokens } = model;\n const { minTokens = 2, maxTokens, maxSelections } = config;\n const errors = {};\n const nbOfTokens = (tokens || []).length;\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const nbOfSelections = (tokens || []).reduce((acc, token) => (token.correct ? acc + 1 : acc), 0);\n\n if (nbOfTokens < minTokens) {\n errors.tokensError = `There should be at least ${minTokens} tokens defined.`;\n } else if (nbOfTokens > maxTokens) {\n errors.tokensError = `No more than ${maxTokens} tokens should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selectionsError = 'There should be at least 1 token selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selectionsError = `No more than ${maxSelections} tokens should be selected.`;\n }\n\n return errors;\n};\n"],"names":["feedbackEnabled","highlightChoices","maxSelections","mode","partialScoring","prompt","promptEnabled","rationale","rationaleEnabled","scoringType","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","text","tokens","toolbarEditorPosition","log","debug","equalTokens","token1","token2","start","end","oldStart","oldEnd","normalizeTokens","selectedTokens","evaluateMode","map","token","isCorrect","correct","isMissing","find","selectedToken","undefined","getCorrectness","selected","filter","t","length","correctSelected","getCorrectSelected","s","findIndex","getPartialScore","question","session","totalCorrect","isEmpty","correctCount","correctTokens","extraSelected","incorrectCount","count","positiveCount","parseFloat","toFixed","outcome","env","Promise","resolve","score","empty","normalizeSession","completed","enabled","createDefaultModel","model","defaults","normalize","normalizedQuestion","correctness","fb","getFeedbackForCorrectness","feedback","then","out","disabled","incorrect","language","extraCSSRules","role","createCorrectResponseSession","id","getContent","html","replace","validate","config","minTokens","maxTokens","errors","nbOfTokens","forEach","field","required","nbOfSelections","reduce","acc","tokensError","selectionsError"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,eAAe;AACbA,EAAAA,eAAe,EAAE,KADJ;AAEbC,EAAAA,gBAAgB,EAAE,KAFL;AAGbC,EAAAA,aAAa,EAAE,CAHF;AAIbC,EAAAA,IAAI,EAAE,UAJO;AAKbC,EAAAA,cAAc,EAAE,KALH;AAMbC,EAAAA,MAAM,EAAE,EANK;AAObC,EAAAA,aAAa,EAAE,IAPF;AAQbC,EAAAA,SAAS,EAAE,EARE;AASbC,EAAAA,gBAAgB,EAAE,IATL;AAUbC,EAAAA,WAAW,EAAE,MAVA;AAWbC,EAAAA,0BAA0B,EAAE,IAXf;AAYbC,EAAAA,mBAAmB,EAAE,EAZR;AAabC,EAAAA,0BAA0B,EAAE,IAbf;AAcbC,EAAAA,IAAI,EAAE,EAdO;AAebC,EAAAA,MAAM,EAAE,EAfK;AAgBbC,EAAAA,qBAAqB,EAAE,QAAA;AAhBV,CAAf;;ACMA,MAAMC,GAAG,GAAGC,KAAK,CAAC,qCAAD,CAAjB,CAAA;;AAEA,MAAMC,WAAW,GAAG,CAACC,MAAM,GAAG,EAAV,EAAcC,MAAM,GAAG,EAAvB,KACjB,CAAAD,MAAM,QAAN,GAAAA,KAAAA,CAAAA,GAAAA,MAAM,CAAEE,KAAR,OAAkBD,MAAlB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAkBA,MAAM,CAAEC,KAA1B,KAAmC,CAAAF,MAAM,QAAN,GAAAA,KAAAA,CAAAA,GAAAA,MAAM,CAAEG,GAAR,OAAgBF,MAAhB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAgBA,MAAM,CAAEE,GAAxB,CAApC;AAEC,CAAAH,MAAM,IAAN,IAAA,GAAA,KAAA,CAAA,GAAAA,MAAM,CAAEE,KAAR,OAAkBD,MAAlB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAkBA,MAAM,CAAEG,QAA1B,CAAA,IAAsC,CAAAJ,MAAM,IAAA,IAAN,GAAAA,KAAAA,CAAAA,GAAAA,MAAM,CAAEG,GAAR,OAAgBF,MAAhB,IAAgBA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,MAAM,CAAEI,MAAxB,CAHzC,CAAA;;AAKA,MAAMC,eAAe,GAAG,CAACX,MAAM,GAAG,EAAV,EAAcY,cAAc,GAAG,EAA/B,EAAmCC,YAAY,GAAG,KAAlD,KACtB,CAACb,MAAM,IAAI,EAAX,EAAec,GAAf,CAAoBC,KAAD,IAAW;AAC5B,EAAMC,MAAAA,SAAS,GAAG,CAAC,CAACD,KAAK,CAACE,OAA1B,CAD4B;;AAG5B,EAAMC,MAAAA,SAAS,GAAGF,SAAS,IAAI,CAAC,CAACJ,cAAc,IAAI,EAAnB,EAAuBO,IAAvB,CAA6BC,aAAD,IAAmBhB,WAAW,CAACW,KAAD,EAAQK,aAAR,CAA1D,CAAhC,CAAA;AAEA,EAAA,OAAA,QAAA,CAAA,EAAA,EACKL,KADL,EAAA;AAEEE,IAAAA,OAAO,EAAEJ,YAAY,GAAGG,SAAH,GAAeK,SAFtC;AAGEH,IAAAA,SAAS,EAAEL,YAAY,GAAGK,SAAH,GAAeG,SAAAA;AAHxC,GAAA,CAAA,CAAA;AAKD,CAVD,CADF,CAAA;;MAaaC,cAAc,GAAG,CAACtB,MAAD,EAASuB,QAAT,KAAsB;AAClD,EAAA,MAAMN,OAAO,GAAGjB,MAAM,CAACwB,MAAP,CAAeC,CAAD,IAAOA,CAAC,CAACR,OAAF,KAAc,IAAnC,CAAhB,CAAA;;AAEA,EAAA,IAAIA,OAAO,CAACS,MAAR,KAAmB,CAAvB,EAA0B;AACxB,IAAA,OAAO,SAAP,CAAA;AACD,GAAA;;AAED,EAAA,MAAMC,eAAe,GAAGC,kBAAkB,CAAC5B,MAAD,EAASuB,QAAT,CAA1C,CAAA;;AAEA,EAAA,IAAII,eAAe,CAACD,MAAhB,KAA2BH,QAAQ,CAACG,MAAxC,EAAgD;AAC9C,IAAA,IAAIC,eAAe,CAACD,MAAhB,KAA2BT,OAAO,CAACS,MAAvC,EAA+C;AAC7C,MAAA,OAAO,SAAP,CAAA;AACD,KAFD,MAEO,IAAIC,eAAe,CAACD,MAAhB,GAAyB,CAA7B,EAAgC;AACrC,MAAA,OAAO,mBAAP,CAAA;AACD,KAAA;AACF,GAAA;;AAED,EAAA,IAAIC,eAAe,CAACD,MAAhB,GAAyB,CAA7B,EAAgC;AAC9B,IAAA,OAAO,mBAAP,CAAA;AACD,GAAA;;AAED,EAAA,OAAO,WAAP,CAAA;AACD,EAtBM;;AAwBP,MAAME,kBAAkB,GAAG,CAAC5B,MAAD,EAASuB,QAAT,KACzB,CAACA,QAAQ,IAAI,EAAb,EAAiBC,MAAjB,CAAyBK,CAAD,IAAO7B,MAAM,CAAC8B,SAAP,CAAkBf,KAAD,IAAWA,KAAK,CAACE,OAAN,IAAiBb,WAAW,CAACW,KAAD,EAAQc,CAAR,CAAxD,CAAwE,KAAA,CAAC,CAAxG,CADF,CAAA;;AAGO,MAAME,eAAe,GAAG,CAACC,QAAD,EAAWC,OAAX,EAAoBC,YAApB,KAAqC;AAClE,EAAA,IAAI,CAACD,OAAD,IAAYE,OAAO,CAACF,OAAD,CAAvB,EAAkC;AAChC,IAAA,OAAO,CAAP,CAAA;AACD,GAAA;;AAED,EAAA,MAAMG,YAAY,GAAGR,kBAAkB,CAACI,QAAQ,CAAChC,MAAV,EAAkBiC,OAAO,CAACrB,cAA1B,CAAlB,CAA4Dc,MAAjF,CAAA;AACA,EAAA,MAAMW,aAAa,GAAG,CAACL,QAAQ,CAAChC,MAAT,IAAmB,EAApB,EAAwBwB,MAAxB,CAAgCC,CAAD,IAAOA,CAAC,CAACR,OAAF,KAAc,IAApD,CAAtB,CAAA;AACA,EAAA,MAAMqB,aAAa,GAAGL,OAAO,CAACrB,cAAR,GAAyBqB,OAAO,CAACrB,cAAR,CAAuBc,MAAvB,GAAgCW,aAAa,CAACX,MAAvE,GAAgF,CAAtG,CAAA;AACA,EAAA,MAAMa,cAAc,GAAGD,aAAa,GAAGL,OAAO,CAACrB,cAAR,IAA0BqB,OAAO,CAACrB,cAAR,CAAuBc,MAAvB,GAAgCU,YAA7D,GAA4E,CAAhH,CAAA;AACA,EAAA,MAAMI,KAAK,GAAGJ,YAAY,GAAGG,cAA7B,CAAA;AACA,EAAME,MAAAA,aAAa,GAAGD,KAAK,GAAG,CAAR,GAAY,CAAZ,GAAgBA,KAAtC,CAAA;AAEA,EAAA,OAAON,YAAY,CAACR,MAAb,GAAsBgB,UAAU,CAAC,CAACD,aAAa,GAAGP,YAAY,CAACR,MAA9B,EAAsCiB,OAAtC,CAA8C,CAA9C,CAAD,CAAhC,GAAqF,CAA5F,CAAA;AACD,EAbM;AAeMC,MAAAA,OAAO,GAAG,CAACZ,QAAD,EAAWC,OAAX,EAAoBY,GAApB,KACrB,IAAIC,OAAJ,CAAaC,OAAD,IAAa;AACvB,EAAA,IAAI,CAACd,OAAD,IAAYE,OAAO,CAACF,OAAD,CAAvB,EAAkC;AAChCc,IAAAA,OAAO,CAAC;AAAEC,MAAAA,KAAK,EAAE,CAAT;AAAYC,MAAAA,KAAK,EAAE,IAAA;AAAnB,KAAD,CAAP,CAAA;AACD,GAAA;;AAEDhB,EAAAA,OAAO,GAAGiB,gBAAgB,CAACjB,OAAD,CAA1B,CAAA;;AAEA,EAAA,IAAIY,GAAG,CAACxD,IAAJ,KAAa,UAAjB,EAA6B;AAC3B0D,IAAAA,OAAO,CAAC;AAAEC,MAAAA,KAAK,EAAE3B,SAAT;AAAoB8B,MAAAA,SAAS,EAAE9B,SAAAA;AAA/B,KAAD,CAAP,CAAA;AACD,GAFD,MAEO;AACL,IAAM+B,MAAAA,OAAO,GAAG9D,cAAc,CAAC8D,OAAf,CAAuBpB,QAAvB,EAAiCa,GAAjC,EAAsC,IAAtC,CAAhB,CAAA;AACA,IAAA,MAAMX,YAAY,GAAGF,QAAQ,CAAChC,MAAT,CAAgBwB,MAAhB,CAAwBC,CAAD,IAAOA,CAAC,CAACR,OAAhC,CAArB,CAAA;AACA,IAAM+B,MAAAA,KAAK,GAAGjB,eAAe,CAACC,QAAD,EAAWC,OAAX,EAAoBC,YAApB,CAA7B,CAAA;AACAa,IAAAA,OAAO,CAAC;AACNC,MAAAA,KAAK,EAAEI,OAAO,GAAGJ,KAAH,GAAWA,KAAK,KAAK,CAAV,GAAc,CAAd,GAAkB,CAAA;AADrC,KAAD,CAAP,CAAA;AAGD,GAAA;AACF,CAjBD,EADK;AAoBA,SAASK,kBAAT,CAA4BC,KAAK,GAAG,EAApC,EAAwC;AAC7C,EAAA,OAAO,IAAIR,OAAJ,CAAaC,OAAD,IAAa;AAC9BA,IAAAA,OAAO,CAAA,QAAA,CAAA,EAAA,EAAMQ,QAAN,EAAmBD,KAAnB,CAAP,CAAA,CAAA;AACD,GAFM,CAAP,CAAA;AAGD,CAAA;AAEM,MAAMJ,gBAAgB,GAAIjB,OAAD,IAAA,QAAA,CAAA;AAAgBrB,EAAAA,cAAc,EAAE,EAAA;AAAhC,CAAA,EAAuCqB,OAAvC,EAAzB;AAEA,MAAMuB,SAAS,GAAIxB,QAAD,iBAAoBuB,QAApB,EAAiCvB,QAAjC,EAAlB;AAEA,MAAMsB,KAAK,GAAG,CAACtB,QAAD,EAAWC,OAAX,EAAoBY,GAApB,KAA4B;AAC/CZ,EAAAA,OAAO,GAAGA,OAAO,IAAI;AAAEb,IAAAA,aAAa,EAAE,EAAA;AAAjB,GAArB,CAAA;AACAa,EAAAA,OAAO,CAACrB,cAAR,GAAyBqB,OAAO,CAACrB,cAAR,IAA0B,EAAnD,CAAA;AACA,EAAA,MAAM6C,kBAAkB,GAAGD,SAAS,CAACxB,QAAD,CAApC,CAAA;AAEA,EAAA,OAAO,IAAIc,OAAJ,CAAaC,OAAD,IAAa;AAC9B7C,IAAAA,GAAG,CAAC,SAAD,EAAY,sBAAZ,EAAoCuD,kBAApC,CAAH,CAAA;AACAvD,IAAAA,GAAG,CAAC,SAAD,EAAY,WAAZ,EAAyB+B,OAAzB,CAAH,CAAA;AAEA,IAAA,MAAMjC,MAAM,GAAGW,eAAe,CAAC8C,kBAAkB,CAACzD,MAApB,EAA4BiC,OAAO,CAACrB,cAApC,EAAoDiC,GAAG,CAACxD,IAAJ,KAAa,UAAjE,CAA9B,CAAA;AACAa,IAAAA,GAAG,CAAC,iBAAD,EAAoBF,MAApB,CAAH,CAAA;AAEA,IAAA,MAAM0D,WAAW,GACfb,GAAG,CAACxD,IAAJ,KAAa,UAAb,GAA0BiC,cAAc,CAACmC,kBAAkB,CAACzD,MAApB,EAA4BiC,OAAO,CAACrB,cAApC,CAAxC,GAA8FS,SADhG,CAAA;AAGA,IAAMsC,MAAAA,EAAE,GACNd,GAAG,CAACxD,IAAJ,KAAa,UAAb,IAA2BoE,kBAAkB,CAACvE,eAA9C,GACI0E,yBAAyB,CAACF,WAAD,EAAcD,kBAAkB,CAACI,QAAjC,CAD7B,GAEIf,OAAO,CAACC,OAAR,CAAgB1B,SAAhB,CAHN,CAAA;AAKAsC,IAAAA,EAAE,CAACG,IAAH,CAASD,QAAD,IAAc;AACpB,MAAA,MAAME,GAAG,GAAG;AACV/D,QAAAA,MADU;AAEVb,QAAAA,gBAAgB,EAAEsE,kBAAkB,CAACtE,gBAF3B;AAGVI,QAAAA,MAAM,EAAEkE,kBAAkB,CAACjE,aAAnB,GAAmCiE,kBAAkB,CAAClE,MAAtD,GAA+D,IAH7D;AAIVQ,QAAAA,IAAI,EAAE0D,kBAAkB,CAAC1D,IAJf;AAKViE,QAAAA,QAAQ,EAAEnB,GAAG,CAACxD,IAAJ,KAAa,QALb;AAMVD,QAAAA,aAAa,EAAEqE,kBAAkB,CAACrE,aANxB;AAOVsE,QAAAA,WAPU;AAQVb,QAAAA,GARU;AASVgB,QAAAA,QATU;AAUVI,QAAAA,SAAS,EAAEpB,GAAG,CAACxD,IAAJ,KAAa,UAAb,GAA0BqE,WAAW,KAAK,SAA1C,GAAsDrC,SAVvD;AAWV6C,QAAAA,QAAQ,EAAET,kBAAkB,CAACS,QAXnB;AAYVC,QAAAA,aAAa,EAAEV,kBAAkB,CAACU,aAAAA;AAZxB,OAAZ,CAAA;;AAeA,MAAA,IAAItB,GAAG,CAACuB,IAAJ,KAAa,YAAb,KAA8BvB,GAAG,CAACxD,IAAJ,KAAa,MAAb,IAAuBwD,GAAG,CAACxD,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjF0E,QAAAA,GAAG,CAACtE,SAAJ,GAAgBgE,kBAAkB,CAAC/D,gBAAnB,GAAsC+D,kBAAkB,CAAChE,SAAzD,GAAqE,IAArF,CAAA;AACAsE,QAAAA,GAAG,CAAClE,mBAAJ,GAA0B4D,kBAAkB,CAAC3D,0BAAnB,GACtB2D,kBAAkB,CAAC5D,mBADG,GAEtB,IAFJ,CAAA;AAGD,OALD,MAKO;AACLkE,QAAAA,GAAG,CAACtE,SAAJ,GAAgB,IAAhB,CAAA;AACAsE,QAAAA,GAAG,CAAClE,mBAAJ,GAA0B,IAA1B,CAAA;AACD,OAAA;;AAEDkD,MAAAA,OAAO,CAACgB,GAAD,CAAP,CAAA;AACD,KA3BD,CAAA,CAAA;AA4BD,GA3CM,CAAP,CAAA;AA4CD,EAjDM;MAmDMM,4BAA4B,GAAG,CAACrC,QAAD,EAAWa,GAAX,KAAmB;AAC7D,EAAA,OAAO,IAAIC,OAAJ,CAAaC,OAAD,IAAa;AAC9B,IAAIF,IAAAA,GAAG,CAACxD,IAAJ,KAAa,UAAb,IAA2BwD,GAAG,CAACuB,IAAJ,KAAa,YAA5C,EAA0D;AACxD,MAAM,MAAA;AAAEpE,QAAAA,MAAAA;AAAF,OAAA,GAAagC,QAAnB,CAAA;AACA,MAAMpB,MAAAA,cAAc,GAAGZ,MAAM,CAACwB,MAAP,CAAeC,CAAD,IAAOA,CAAC,CAACR,OAAvB,CAAvB,CAAA;AAEA8B,MAAAA,OAAO,CAAC;AACNuB,QAAAA,EAAE,EAAE,GADE;AAEN1D,QAAAA,cAAAA;AAFM,OAAD,CAAP,CAAA;AAID,KARD,MAQO;AACLmC,MAAAA,OAAO,CAAC,IAAD,CAAP,CAAA;AACD,KAAA;AACF,GAZM,CAAP,CAAA;AAaD;;;AAMD,MAAMwB,UAAU,GAAIC,IAAD,IAAU,CAACA,IAAI,IAAI,EAAT,EAAaC,OAAb,CAAqB,oCAArB,EAA2D,EAA3D,CAA7B,CAAA;;AAEO,MAAMC,QAAQ,GAAG,CAACpB,KAAK,GAAG,EAAT,EAAaqB,MAAM,GAAG,EAAtB,KAA6B;AACnD,EAAM,MAAA;AAAE3E,IAAAA,MAAAA;AAAF,GAAA,GAAasD,KAAnB,CAAA;AACA,EAAM,MAAA;AAAEsB,IAAAA,SAAS,GAAG,CAAd;AAAiBC,IAAAA,SAAjB;AAA4BzF,IAAAA,aAAAA;AAA5B,GAAA,GAA8CuF,MAApD,CAAA;AACA,EAAMG,MAAAA,MAAM,GAAG,EAAf,CAAA;AACA,EAAA,MAAMC,UAAU,GAAG,CAAC/E,MAAM,IAAI,EAAX,EAAe0B,MAAlC,CAAA;AAEA,EAAC,CAAA,qBAAD,EAAwB,QAAxB,EAAkC,WAAlC,CAA+CsD,CAAAA,OAA/C,CAAwDC,KAAD,IAAW;AAAA,IAAA,IAAA,aAAA,CAAA;;AAChE,IAAA,IAAI,iBAAAN,MAAM,CAACM,KAAD,CAAN,2BAAeC,QAAf,IAA2B,CAACX,UAAU,CAACjB,KAAK,CAAC2B,KAAD,CAAN,CAA1C,EAA0D;AACxDH,MAAAA,MAAM,CAACG,KAAD,CAAN,GAAgB,yBAAhB,CAAA;AACD,KAAA;AACF,GAJD,CAAA,CAAA;AAMA,EAAME,MAAAA,cAAc,GAAG,CAACnF,MAAM,IAAI,EAAX,EAAeoF,MAAf,CAAsB,CAACC,GAAD,EAAMtE,KAAN,KAAiBA,KAAK,CAACE,OAAN,GAAgBoE,GAAG,GAAG,CAAtB,GAA0BA,GAAjE,EAAuE,CAAvE,CAAvB,CAAA;;AAEA,EAAIN,IAAAA,UAAU,GAAGH,SAAjB,EAA4B;AAC1BE,IAAAA,MAAM,CAACQ,WAAP,GAAsB,CAAA,yBAAA,EAA2BV,SAAU,CAA3D,gBAAA,CAAA,CAAA;AACD,GAFD,MAEO,IAAIG,UAAU,GAAGF,SAAjB,EAA4B;AACjCC,IAAAA,MAAM,CAACQ,WAAP,GAAsB,CAAA,aAAA,EAAeT,SAAU,CAA/C,0BAAA,CAAA,CAAA;AACD,GAAA;;AAED,EAAIM,IAAAA,cAAc,GAAG,CAArB,EAAwB;AACtBL,IAAAA,MAAM,CAACS,eAAP,GAAyB,4CAAzB,CAAA;AACD,GAFD,MAEO,IAAIJ,cAAc,GAAG/F,aAArB,EAAoC;AACzC0F,IAAAA,MAAM,CAACS,eAAP,GAA0B,CAAA,aAAA,EAAenG,aAAc,CAAvD,2BAAA,CAAA,CAAA;AACD,GAAA;;AAED,EAAA,OAAO0F,MAAP,CAAA;AACD;;;;"}