tc-checking-tool-rcl 0.9.99 → 0.9.100
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/dist/utils/selectionHelper.js +123 -0
- package/package.json +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getVerseText = getVerseText;
|
|
7
|
+
exports.normalizeString = void 0;
|
|
8
|
+
exports.validateSelectionsForAllChecks = validateSelectionsForAllChecks;
|
|
9
|
+
var _usfmJs = require("usfm-js");
|
|
10
|
+
var _bibleReferenceRange = require("bible-reference-range");
|
|
11
|
+
var _wordAlignerLib = require("word-aligner-lib");
|
|
12
|
+
/**
|
|
13
|
+
* verify all selections
|
|
14
|
+
* @param {Object} targetBible - target bible
|
|
15
|
+
* @param {Object} groupsData - all the checks keyed by catagory
|
|
16
|
+
* @param {Function} invalidateCheckCallback
|
|
17
|
+
* @return {Promise<boolean>}
|
|
18
|
+
*/
|
|
19
|
+
function validateSelectionsForAllChecks(targetBible) {
|
|
20
|
+
var groupsData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
21
|
+
var invalidateCheckCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
22
|
+
var _selectionsChanged = false;
|
|
23
|
+
var filteredVerses = {}; // for caching verse content parsed to text
|
|
24
|
+
|
|
25
|
+
var groupIds = Object.keys(groupsData);
|
|
26
|
+
for (var _i = 0, _groupIds = groupIds; _i < _groupIds.length; _i++) {
|
|
27
|
+
var groupId = _groupIds[_i];
|
|
28
|
+
var checks = groupsData[groupId];
|
|
29
|
+
for (var j = 0, lenGI = checks.length; j < lenGI; j++) {
|
|
30
|
+
var _check$contextId;
|
|
31
|
+
var check = checks[j];
|
|
32
|
+
var selections = check.selections;
|
|
33
|
+
var reference = (_check$contextId = check.contextId) === null || _check$contextId === void 0 ? void 0 : _check$contextId.reference;
|
|
34
|
+
var chapter = reference.chapter;
|
|
35
|
+
var verse = reference.verse;
|
|
36
|
+
var ref = "".concat(chapter, ":").concat(verse);
|
|
37
|
+
var targetVerse = filteredVerses[ref];
|
|
38
|
+
if (!targetVerse) {
|
|
39
|
+
targetVerse = getVerseText(targetBible, check.contextId, false);
|
|
40
|
+
targetVerse = (0, _usfmJs.removeMarker)(targetVerse); // remove USFM markers
|
|
41
|
+
filteredVerses[ref] = targetVerse;
|
|
42
|
+
}
|
|
43
|
+
if (targetVerse) {
|
|
44
|
+
if (selections && selections.length) {
|
|
45
|
+
var _validateVerseSelecti = _validateVerseSelections(targetVerse, selections),
|
|
46
|
+
currentSelectionsInvalid = _validateVerseSelecti.selectionsChanged;
|
|
47
|
+
_selectionsChanged = checkIfInvalidationChanged(check, currentSelectionsInvalid, _selectionsChanged, invalidateCheckCallback);
|
|
48
|
+
} else {
|
|
49
|
+
// no selections, so not invalid
|
|
50
|
+
var _currentSelectionsInvalid = false;
|
|
51
|
+
_selectionsChanged = checkIfInvalidationChanged(check, _currentSelectionsInvalid, _selectionsChanged, invalidateCheckCallback);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return _selectionsChanged;
|
|
57
|
+
}
|
|
58
|
+
function checkIfInvalidationChanged(check, currentSelectionsInvalid, _selectionsChanged, invalidateCheckCallback) {
|
|
59
|
+
if (!!check.invalidated !== currentSelectionsInvalid) {
|
|
60
|
+
_selectionsChanged = true;
|
|
61
|
+
// callback
|
|
62
|
+
invalidateCheckCallback && invalidateCheckCallback(check, currentSelectionsInvalid);
|
|
63
|
+
}
|
|
64
|
+
return _selectionsChanged;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Normalizes a string including whitespace
|
|
69
|
+
* @param {String} string - the string to normalize
|
|
70
|
+
* @returns {String} - The returned normalized string
|
|
71
|
+
*/
|
|
72
|
+
var normalizeString = exports.normalizeString = function normalizeString() {
|
|
73
|
+
var string = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
74
|
+
string = string.replace(/\s+/g, ' ');
|
|
75
|
+
return string;
|
|
76
|
+
};
|
|
77
|
+
function getVerseText(bookData, contextId) {
|
|
78
|
+
var addVerseRef = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
79
|
+
var unfilteredVerseText = '';
|
|
80
|
+
var verseText = '';
|
|
81
|
+
if (contextId && contextId.reference) {
|
|
82
|
+
var _contextId$reference = contextId.reference,
|
|
83
|
+
chapter = _contextId$reference.chapter,
|
|
84
|
+
verse = _contextId$reference.verse;
|
|
85
|
+
var refs = (0, _bibleReferenceRange.getVerses)(bookData, "".concat(chapter, ":").concat(verse));
|
|
86
|
+
var initialChapter;
|
|
87
|
+
if (refs && refs.length) {
|
|
88
|
+
initialChapter = refs[0].chapter;
|
|
89
|
+
}
|
|
90
|
+
for (var verseCnt = 0; verseCnt < refs.length; verseCnt++) {
|
|
91
|
+
var ref = refs[verseCnt];
|
|
92
|
+
var _chapter = ref.chapter;
|
|
93
|
+
var data = ref.verseData;
|
|
94
|
+
var label = ref.verse;
|
|
95
|
+
if (_chapter !== initialChapter) {
|
|
96
|
+
label = "".concat(_chapter, ":").concat(label);
|
|
97
|
+
}
|
|
98
|
+
if (verseCnt > 0) {
|
|
99
|
+
unfilteredVerseText += '\n';
|
|
100
|
+
if (addVerseRef) {
|
|
101
|
+
unfilteredVerseText += label + ' ';
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
unfilteredVerseText += data;
|
|
105
|
+
}
|
|
106
|
+
verseText = (0, _usfmJs.removeMarker)(unfilteredVerseText);
|
|
107
|
+
// normalize whitespace in case selection has contiguous whitespace _this isn't captured
|
|
108
|
+
verseText = normalizeString(verseText);
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
unfilteredVerseText: unfilteredVerseText,
|
|
112
|
+
verseText: verseText
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function _validateVerseSelections(filteredTargetVerse, selections) {
|
|
116
|
+
var validSelections = _wordAlignerLib.selectionsHelpers.checkSelectionOccurrences(filteredTargetVerse, selections);
|
|
117
|
+
var selectionsChanged = selections.length !== validSelections.length;
|
|
118
|
+
return {
|
|
119
|
+
selectionsChanged: selectionsChanged,
|
|
120
|
+
validSelections: validSelections
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXNmbUpzIiwicmVxdWlyZSIsIl9iaWJsZVJlZmVyZW5jZVJhbmdlIiwiX3dvcmRBbGlnbmVyTGliIiwidmFsaWRhdGVTZWxlY3Rpb25zRm9yQWxsQ2hlY2tzIiwidGFyZ2V0QmlibGUiLCJncm91cHNEYXRhIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiaW52YWxpZGF0ZUNoZWNrQ2FsbGJhY2siLCJfc2VsZWN0aW9uc0NoYW5nZWQiLCJmaWx0ZXJlZFZlcnNlcyIsImdyb3VwSWRzIiwiT2JqZWN0Iiwia2V5cyIsIl9pIiwiX2dyb3VwSWRzIiwiZ3JvdXBJZCIsImNoZWNrcyIsImoiLCJsZW5HSSIsIl9jaGVjayRjb250ZXh0SWQiLCJjaGVjayIsInNlbGVjdGlvbnMiLCJyZWZlcmVuY2UiLCJjb250ZXh0SWQiLCJjaGFwdGVyIiwidmVyc2UiLCJyZWYiLCJjb25jYXQiLCJ0YXJnZXRWZXJzZSIsImdldFZlcnNlVGV4dCIsInJlbW92ZU1hcmtlciIsIl92YWxpZGF0ZVZlcnNlU2VsZWN0aSIsIl92YWxpZGF0ZVZlcnNlU2VsZWN0aW9ucyIsImN1cnJlbnRTZWxlY3Rpb25zSW52YWxpZCIsInNlbGVjdGlvbnNDaGFuZ2VkIiwiY2hlY2tJZkludmFsaWRhdGlvbkNoYW5nZWQiLCJpbnZhbGlkYXRlZCIsIm5vcm1hbGl6ZVN0cmluZyIsImV4cG9ydHMiLCJzdHJpbmciLCJyZXBsYWNlIiwiYm9va0RhdGEiLCJhZGRWZXJzZVJlZiIsInVuZmlsdGVyZWRWZXJzZVRleHQiLCJ2ZXJzZVRleHQiLCJfY29udGV4dElkJHJlZmVyZW5jZSIsInJlZnMiLCJnZXRWZXJzZXMiLCJpbml0aWFsQ2hhcHRlciIsInZlcnNlQ250IiwiZGF0YSIsInZlcnNlRGF0YSIsImxhYmVsIiwiZmlsdGVyZWRUYXJnZXRWZXJzZSIsInZhbGlkU2VsZWN0aW9ucyIsInNlbGVjdGlvbnNIZWxwZXJzIiwiY2hlY2tTZWxlY3Rpb25PY2N1cnJlbmNlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zZWxlY3Rpb25IZWxwZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5cbmltcG9ydCB7IHJlbW92ZU1hcmtlciB9IGZyb20gXCJ1c2ZtLWpzXCI7XG5pbXBvcnQgeyBnZXRWZXJzZXMgfSBmcm9tICdiaWJsZS1yZWZlcmVuY2UtcmFuZ2UnO1xuaW1wb3J0IHsgc2VsZWN0aW9uc0hlbHBlcnMgfSBmcm9tIFwid29yZC1hbGlnbmVyLWxpYlwiO1xuLyoqXG4gKiB2ZXJpZnkgYWxsIHNlbGVjdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRCaWJsZSAtIHRhcmdldCBiaWJsZVxuICogQHBhcmFtIHtPYmplY3R9IGdyb3Vwc0RhdGEgLSBhbGwgdGhlIGNoZWNrcyBrZXllZCBieSBjYXRhZ29yeVxuICogQHBhcmFtIHtGdW5jdGlvbn0gaW52YWxpZGF0ZUNoZWNrQ2FsbGJhY2tcbiAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNlbGVjdGlvbnNGb3JBbGxDaGVja3ModGFyZ2V0QmlibGUsIGdyb3Vwc0RhdGEgPSBudWxsLCBpbnZhbGlkYXRlQ2hlY2tDYWxsYmFjayA9IG51bGwpICB7XG4gIGxldCBfc2VsZWN0aW9uc0NoYW5nZWQgPSBmYWxzZTtcbiAgY29uc3QgZmlsdGVyZWRWZXJzZXMgPSB7fSAvLyBmb3IgY2FjaGluZyB2ZXJzZSBjb250ZW50IHBhcnNlZCB0byB0ZXh0XG5cbiAgY29uc3QgZ3JvdXBJZHMgPSBPYmplY3Qua2V5cyhncm91cHNEYXRhKVxuICBmb3IgKGNvbnN0IGdyb3VwSWQgb2YgZ3JvdXBJZHMpIHtcbiAgICBjb25zdCBjaGVja3MgPSBncm91cHNEYXRhW2dyb3VwSWRdXG5cbiAgICBmb3IgKGxldCBqID0gMCwgbGVuR0kgPSBjaGVja3MubGVuZ3RoOyBqIDwgbGVuR0k7IGorKykge1xuICAgICAgY29uc3QgY2hlY2sgPSBjaGVja3Nbal07XG4gICAgICBjb25zdCBzZWxlY3Rpb25zID0gY2hlY2suc2VsZWN0aW9ucztcbiAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IGNoZWNrLmNvbnRleHRJZD8ucmVmZXJlbmNlXG4gICAgICBjb25zdCBjaGFwdGVyID0gcmVmZXJlbmNlLmNoYXB0ZXJcbiAgICAgIGNvbnN0IHZlcnNlID0gcmVmZXJlbmNlLnZlcnNlXG4gICAgICBjb25zdCByZWYgPSBgJHtjaGFwdGVyfToke3ZlcnNlfWBcblxuICAgICAgbGV0IHRhcmdldFZlcnNlID0gZmlsdGVyZWRWZXJzZXNbcmVmXVxuICAgICAgaWYgKCF0YXJnZXRWZXJzZSkge1xuICAgICAgICB0YXJnZXRWZXJzZSA9IGdldFZlcnNlVGV4dCh0YXJnZXRCaWJsZSwgY2hlY2suY29udGV4dElkLCBmYWxzZSlcbiAgICAgICAgdGFyZ2V0VmVyc2UgPSByZW1vdmVNYXJrZXIodGFyZ2V0VmVyc2UpIC8vIHJlbW92ZSBVU0ZNIG1hcmtlcnNcbiAgICAgICAgZmlsdGVyZWRWZXJzZXNbcmVmXSA9IHRhcmdldFZlcnNlXG4gICAgICB9XG5cbiAgICAgIGlmICh0YXJnZXRWZXJzZSkge1xuICAgICAgICBpZiAoc2VsZWN0aW9ucyAmJiBzZWxlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uc0NoYW5nZWQ6IGN1cnJlbnRTZWxlY3Rpb25zSW52YWxpZCB9ID0gX3ZhbGlkYXRlVmVyc2VTZWxlY3Rpb25zKHRhcmdldFZlcnNlLCBzZWxlY3Rpb25zKVxuICAgICAgICAgIF9zZWxlY3Rpb25zQ2hhbmdlZCA9IGNoZWNrSWZJbnZhbGlkYXRpb25DaGFuZ2VkKGNoZWNrLCBjdXJyZW50U2VsZWN0aW9uc0ludmFsaWQsIF9zZWxlY3Rpb25zQ2hhbmdlZCwgaW52YWxpZGF0ZUNoZWNrQ2FsbGJhY2spXG4gICAgICAgIH0gZWxzZSB7IC8vIG5vIHNlbGVjdGlvbnMsIHNvIG5vdCBpbnZhbGlkXG4gICAgICAgICAgY29uc3QgY3VycmVudFNlbGVjdGlvbnNJbnZhbGlkID0gZmFsc2VcbiAgICAgICAgICBfc2VsZWN0aW9uc0NoYW5nZWQgPSBjaGVja0lmSW52YWxpZGF0aW9uQ2hhbmdlZChjaGVjaywgY3VycmVudFNlbGVjdGlvbnNJbnZhbGlkLCBfc2VsZWN0aW9uc0NoYW5nZWQsIGludmFsaWRhdGVDaGVja0NhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9zZWxlY3Rpb25zQ2hhbmdlZFxufVxuXG5mdW5jdGlvbiBjaGVja0lmSW52YWxpZGF0aW9uQ2hhbmdlZChjaGVjaywgY3VycmVudFNlbGVjdGlvbnNJbnZhbGlkLCBfc2VsZWN0aW9uc0NoYW5nZWQsIGludmFsaWRhdGVDaGVja0NhbGxiYWNrKSB7XG4gIGlmICghIWNoZWNrLmludmFsaWRhdGVkICE9PSBjdXJyZW50U2VsZWN0aW9uc0ludmFsaWQpIHtcbiAgICBfc2VsZWN0aW9uc0NoYW5nZWQgPSB0cnVlXG4gICAgLy8gY2FsbGJhY2tcbiAgICBpbnZhbGlkYXRlQ2hlY2tDYWxsYmFjayAmJiBpbnZhbGlkYXRlQ2hlY2tDYWxsYmFjayhjaGVjaywgY3VycmVudFNlbGVjdGlvbnNJbnZhbGlkKVxuICB9XG4gIHJldHVybiBfc2VsZWN0aW9uc0NoYW5nZWRcbn1cblxuXG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHN0cmluZyBpbmNsdWRpbmcgd2hpdGVzcGFjZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyAtIHRoZSBzdHJpbmcgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7U3RyaW5nfSAtIFRoZSByZXR1cm5lZCBub3JtYWxpemVkIHN0cmluZ1xuICovXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplU3RyaW5nID0gKHN0cmluZyA9ICcnKSA9PiB7XG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gIHJldHVybiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmVyc2VUZXh0KGJvb2tEYXRhLCBjb250ZXh0SWQsIGFkZFZlcnNlUmVmPWZhbHNlKSB7XG4gIGxldCB1bmZpbHRlcmVkVmVyc2VUZXh0ID0gJyc7XG4gIGxldCB2ZXJzZVRleHQgPSAnJztcblxuICBpZiAoY29udGV4dElkICYmIGNvbnRleHRJZC5yZWZlcmVuY2UpIHtcbiAgICBjb25zdCB7IGNoYXB0ZXIsIHZlcnNlIH0gPSBjb250ZXh0SWQucmVmZXJlbmNlO1xuICAgIGNvbnN0IHJlZnMgPSBnZXRWZXJzZXMoYm9va0RhdGEsIGAke2NoYXB0ZXJ9OiR7dmVyc2V9YCk7XG4gICAgbGV0IGluaXRpYWxDaGFwdGVyO1xuICAgIGlmIChyZWZzICYmIHJlZnMubGVuZ3RoKSB7XG4gICAgICBpbml0aWFsQ2hhcHRlciA9IHJlZnNbMF0uY2hhcHRlcjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCB2ZXJzZUNudCA9IDA7IHZlcnNlQ250IDwgcmVmcy5sZW5ndGg7IHZlcnNlQ250KyspIHtcblxuICAgICAgY29uc3QgcmVmID0gcmVmc1t2ZXJzZUNudF07XG4gICAgICBjb25zdCBjaGFwdGVyID0gcmVmLmNoYXB0ZXI7XG4gICAgICBjb25zdCBkYXRhID0gcmVmLnZlcnNlRGF0YTtcbiAgICAgIGxldCBsYWJlbCA9IHJlZi52ZXJzZTtcblxuICAgICAgaWYgKGNoYXB0ZXIgIT09IGluaXRpYWxDaGFwdGVyKSB7XG4gICAgICAgIGxhYmVsID0gYCR7Y2hhcHRlcn06JHtsYWJlbH1gO1xuICAgICAgfVxuXG4gICAgICBpZiAodmVyc2VDbnQgPiAwKSB7XG4gICAgICAgIHVuZmlsdGVyZWRWZXJzZVRleHQgKz0gJ1xcbic7XG5cbiAgICAgICAgaWYgKGFkZFZlcnNlUmVmKSB7XG4gICAgICAgICAgdW5maWx0ZXJlZFZlcnNlVGV4dCArPSBsYWJlbCArICcgJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1bmZpbHRlcmVkVmVyc2VUZXh0ICs9IGRhdGE7XG4gICAgfVxuICAgIHZlcnNlVGV4dCA9IHJlbW92ZU1hcmtlcih1bmZpbHRlcmVkVmVyc2VUZXh0KTtcbiAgICAvLyBub3JtYWxpemUgd2hpdGVzcGFjZSBpbiBjYXNlIHNlbGVjdGlvbiBoYXMgY29udGlndW91cyB3aGl0ZXNwYWNlIF90aGlzIGlzbid0IGNhcHR1cmVkXG4gICAgdmVyc2VUZXh0ID0gbm9ybWFsaXplU3RyaW5nKHZlcnNlVGV4dCk7XG4gIH1cblxuICByZXR1cm4geyB1bmZpbHRlcmVkVmVyc2VUZXh0LCB2ZXJzZVRleHQgfTtcbn1cblxuZnVuY3Rpb24gX3ZhbGlkYXRlVmVyc2VTZWxlY3Rpb25zKGZpbHRlcmVkVGFyZ2V0VmVyc2UsIHNlbGVjdGlvbnMpIHtcbiAgY29uc3QgdmFsaWRTZWxlY3Rpb25zID0gc2VsZWN0aW9uc0hlbHBlcnMuY2hlY2tTZWxlY3Rpb25PY2N1cnJlbmNlcyhmaWx0ZXJlZFRhcmdldFZlcnNlLCBzZWxlY3Rpb25zKTtcbiAgY29uc3Qgc2VsZWN0aW9uc0NoYW5nZWQgPSAoc2VsZWN0aW9ucy5sZW5ndGggIT09IHZhbGlkU2VsZWN0aW9ucy5sZW5ndGgpO1xuICByZXR1cm4geyBzZWxlY3Rpb25zQ2hhbmdlZCwgdmFsaWRTZWxlY3Rpb25zIH1cbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBRUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsb0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGVBQUEsR0FBQUYsT0FBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csOEJBQThCQSxDQUFDQyxXQUFXLEVBQXNEO0VBQUEsSUFBcERDLFVBQVUsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsSUFBSTtFQUFBLElBQUVHLHVCQUF1QixHQUFBSCxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFJO0VBQzNHLElBQUlJLGtCQUFrQixHQUFHLEtBQUs7RUFDOUIsSUFBTUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUFDOztF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
|