UNPKG

@allemandi/bible-validate

Version:

Fast, type-safe utilities for parsing, validating, and normalizing Bible references.

1 lines 35.3 kB
{"version":3,"file":"index.cjs","sources":["../src/utils/normalizer.js","../src/utils/lookup.js","../src/utils/validator.js","../src/utils/formatter.js"],"sourcesContent":["/**\n * Normalizes a Bible book name or alias by trimming spaces, removing common prefixes,\n * converting ordinal prefixes to digits, and stripping non-alphanumeric characters.\n * @public\n * @param {string} name - The raw book name or alias to normalize, possibly with prefixes, punctuation, and mixed case.\n * @returns {string|null} - A cleaned lowercase alphanumeric string with numeric prefixes for ordinals, or null if input is null or undefined.\n * @example\n * // Converts ordinal prefix to digit and removes punctuation\n * normalizeBookName('1st John'); // '1john'\n * // Removes unified prefixes and lowercases the name\n * normalizeBookName('The Epistle to the Romans'); // 'romans'\n * // Strips non-alphanumeric characters and trims spaces\n * normalizeBookName(' Book of *EX* '); // 'ex'\n * // Returns null if input is null or undefined\n * normalizeBookName(null); // null\n */\nfunction normalizeBookName(name) {\n if (!name) return null;\n /** @type {Record<string, string>} */\n const prefixMap = {\n '1st': '1',\n first: '1',\n '2nd': '2',\n second: '2',\n '3rd': '3',\n third: '3',\n iii: '3',\n ii: '2',\n i: '1',\n };\n let cleaned = name.trim().toLowerCase().replace(/\\s+/g, ' ');\n cleaned = cleaned.replace(\n /^(?:the\\s+)?(?:(book|epistle|gospel|letter)\\s+(?:according\\s+)?(?:to|for|of)(?:\\s+the)?\\s*)?/,\n ''\n );\n const prefixMatch = cleaned.match(/^(first|1st|second|2nd|third|3rd|iii|ii|i)\\b/);\n if (prefixMatch) {\n const key = prefixMatch[0];\n if (key in prefixMap) {\n const prefix = prefixMap[key];\n cleaned = prefix + ' ' + cleaned.slice(key.length).trim();\n }\n }\n return cleaned.replace(/[^a-z0-9]/g, '');\n}\n\n/**\n * Parses a string representing a chapter and optional verse or verse range\n * into an object with numeric values.\n * @public\n * @param {string} str - The string containing chapter and verse references, which may include words, punctuation, and ranges.\n * @returns {{chapter: number, verseStart: number|null, verseEnd: number|null}|null} - An object with the chapter number and optional verse start and end numbers, or null if no valid numbers are found.\n * @example\n * // Parses chapter only reference\n * parseChapterVerse('12'); // { chapter: 12, verseStart: null, verseEnd: null }\n * // Parses chapter and single verse reference\n * parseChapterVerse('5:3'); // { chapter: 5, verseStart: 3, verseEnd: null }\n * // Parses chapter with verse range including words and punctuation\n * parseChapterVerse('Chapter 13 Verses 4–7'); // { chapter: 13, verseStart: 4, verseEnd: 7 }\n * // Parses chapter with verse range using \"to\" as a separator\n * parseChapterVerse('chap. 13, v3 to 8'); // { chapter: 13, verseStart: 3, verseEnd: 8 }\n * // Returns null if no numeric chapter is present\n * parseChapterVerse('nonsense'); // null\n * // Parses chapter and verse range with extra whitespace and punctuation\n * parseChapterVerse(' 10 : 2 - 6 '); // { chapter: 10, verseStart: 2, verseEnd: 6 }\n * // Handles pure whitespace and number combination\n * parseChapterVerse(' 11 1 2 '); // { chapter: 11, verseStart: 1, verseEnd: 2 }\n */\nfunction parseChapterVerse(str) {\n if (!str) return null;\n\n const cleaned = str\n .toLowerCase()\n .replace(/[–—]/g, '-')\n .replace(/\\bto\\b/g, '-')\n .replace(/[a-z.,]/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n\n const tokens = cleaned.split(/[\\s\\-:]+/).filter(Boolean);\n const nums = tokens.map((t) => parseInt(t, 10)).filter((n) => !isNaN(n));\n if (nums.length === 0) return null;\n switch (nums.length) {\n case 1:\n return { chapter: nums[0], verseStart: null, verseEnd: null };\n case 2:\n return { chapter: nums[0], verseStart: nums[1], verseEnd: null };\n default:\n return { chapter: nums[0], verseStart: nums[1], verseEnd: nums[2] };\n }\n}\n\n/**\n * Splits a Bible reference string into the book name and chapter/verse range parts,\n * trimming empty space. No further normalization.\n * @public\n * @param {string} ref - The Bible reference string containing a book name optionally followed by a chapter/verse range.\n * @returns {[string|null, string|null]} - A tuple where the first element is the extracted book name and the second is the range; returns [null, null] if input is invalid or empty.\n * @example\n * // Extracts book and range from a standard reference\n * extractBookAndRange('1st John 3:16'); // ['1st John', '3:16']\n * // Extracts book name with punctuation and range\n * extractBookAndRange(\"The Revelation 4:5\"); // [\"The Revelation\", '4:5']\n * // Returns book name with empty range when no range is given\n * extractBookAndRange('Genesis'); // ['Genesis', '']\n * // Returns [null, null] for empty or invalid input\n * extractBookAndRange(''); // [null, null]\n * // Handles leading spaces and complex ranges with simple chapter abbreviations\n * extractBookAndRange(' Exodus 12. 1 to 3'); // ['Exodus', '12. 1 to 3']\n * extractBookAndRange('Exodus Chapter 12:1-3'); // ['Exodus', 'Chapter 12:1-3']\n * extractBookAndRange(' Exodus Ch. 12. 1 to 3'); // ['Exodus', 'Ch. 12. 1 to 3']\n * extractBookAndRange('second Kings Chape 1 to 3'); // ['second Kings Chape', '1 to 3']\n */\nfunction extractBookAndRange(ref) {\n if (!ref || typeof ref !== 'string') return [null, null];\n const cleaned = ref.trim().replace(/\\s+/g, ' ');\n const pattern = /^([\\d\\w\\s.']+?)\\s*(?=\\b(ch(?:apter)?|chap\\.?)\\b|\\d)/i;\n const match = cleaned.match(pattern);\n if (match) {\n const book = match[1].trim();\n const range = cleaned.slice(match[0].length).trim();\n return [book, range];\n }\n return [cleaned, ''];\n}\n\n/**\n * @import { ParsedReference } from './types.js'\n */\n\n/**\n * Parses a Bible reference string into its book, chapter, and verse components, supporting various formats and spacing.\n * @public\n * @param { string } ref - The Bible reference string to parse, which may include ordinal prefixes, varying case, punctuation, and verse ranges.\n * @returns {ParsedReference|null} - An object with normalized book name, chapter, verseStart, and verseEnd fields, or null if the input is not a string.\n * @example\n * // Parses ordinal prefix and returns structured reference\n * parseBibleReference('2nd Kings 4:2');\n * // { book: '2kings', chapter: 4, verseStart: 2, verseEnd: null }\n * // Handles mixed casing, chapter/verse labels, and verse range\n * parseBibleReference(' Iii JohN Chap. 1 verses 9 to 11');\n * // { book: '3john', chapter: 1, verseStart: 9, verseEnd: 11 }\n * // Returns null fields when chapter and verse are omitted\n * parseBibleReference('Genesis');\n * // { book: 'genesis', chapter: null, verseStart: null, verseEnd: null }\n * // Cleans and parses input with excessive spacing\n * parseBibleReference(' 1st Samuel 17 : 4-9 ');\n * // { book: '1samuel', chapter: 17, verseStart: 4, verseEnd: 9 }\n * // Returns null for invalid or non-string input\n * parseBibleReference('!!!');\n * // { book: null, chapter: null, verseStart: null, verseEnd: null }\n * parseBibleReference(42); // null\n */\nfunction parseBibleReference(ref) {\n if (!ref || typeof ref !== 'string') return null;\n const cleanedRef = ref.trim().replace(/\\s+/g, ' ');\n const [bookRaw, chapterVerseRaw] = extractBookAndRange(cleanedRef);\n const book = bookRaw && normalizeBookName(bookRaw);\n if (!book) {\n return {\n book: null,\n chapter: null,\n verseStart: null,\n verseEnd: null,\n };\n }\n const chapVerse = chapterVerseRaw ? parseChapterVerse(chapterVerseRaw) : null;\n return {\n book,\n chapter: chapVerse?.chapter ?? null,\n verseStart: chapVerse?.verseStart ?? null,\n verseEnd: chapVerse?.verseEnd ?? null,\n };\n}\n\nexport { normalizeBookName, parseChapterVerse, extractBookAndRange, parseBibleReference };\n","/**\n * @import { BibleBook } from './types.js'\n */\nimport bibleCounts from '../data/bibleCounts.json';\nimport { normalizeBookName } from './normalizer';\n\n// Build a Map at load time for fast lookup by normalized book name or alias\nconst bookCache = new Map();\nfor (const b of bibleCounts) {\n const normalizedBook = normalizeBookName(b.book);\n if (normalizedBook) bookCache.set(normalizedBook, b);\n for (const alias of b.aliases) {\n const normalizedAlias = normalizeBookName(alias);\n if (normalizedAlias) bookCache.set(normalizedAlias, b);\n }\n}\n\n/**\n * Retrieves a book object from the Bible collection matching the given book name or its aliases, ignoring case and special characters.\n * @public\n * @param {string} book - The name or alias of the book to lookup, which will be normalized internally.\n * @returns {BibleBook|null} - The matched book object containing book name, aliases, and chapters, or null if no match is found.\n * @example\n * // Returns the Genesis book object with its aliases and 50 chapters\n * getBook('Genesis'); // { book: 'Genesis', aliases: ['Gen', 'Ge', 'Gn'], chapters: [...] }\n * // Returns the Song of Solomon book object when queried with a normalized alias ignoring punctuation and case\n * getBook('The CANticle of CantiClEs !!?*'); // { book: 'Song of Solomon', aliases: [...], chapters: [...] }\n * // Returns null for an unknown or invalid book name\n * getBook('Judas'); // null\n */\nfunction getBook(book) {\n if (!book) return null;\n const normalized = normalizeBookName(book);\n return bookCache.get(normalized) || null;\n}\n\n/**\n * Returns the number of chapters for a given Bible book name or alias, or null if the book is not found.\n * @public\n * @param {string} name - The name or alias of the book to lookup, which will be normalized internally.\n * @returns {number|null} - The total number of chapters in the matched book, or null if no book is found.\n * @example\n * // Returns 50 chapters for Genesis\n * getChapterCount('Genesis'); // 50\n * // Returns null for an unknown or invalid book name\n * getChapterCount('Judas');\n */\nfunction getChapterCount(name) {\n const book = getBook(name);\n return book ? book.chapters.length : null;\n}\n\n/**\n * Returns the number of verses in a specified chapter of a given Bible book, or null if the book or chapter is invalid.\n * @public\n * @param {string} name - The name or alias of the book to lookup, which will be normalized internally.\n * @param {number} chapter - The chapter number to retrieve the verse count for; must be within valid range.\n * @returns {number|null} - The count of verses in the specified chapter, or null if the book is unknown or chapter is out of bounds.\n * @example\n * // Returns 25, the number of verses in Genesis chapter 2\n * getVerseCount('GeN. ', 2); // 25\n * // Returns null for an invalid book name\n * getVerseCount('Judas', 1);\n * // Returns null for a chapter number that is too high\n * getVerseCount('Genesis', 999);\n * // Returns null for a chapter number less than 1\n * getVerseCount('Genesis', 0);\n */\nfunction getVerseCount(name, chapter) {\n const book = getBook(name);\n if (!book || chapter < 1 || chapter > book.chapters.length) return null;\n return book.chapters[chapter - 1];\n}\n\n/**\n * Returns an array of all Bible book names in their canonical order.\n * @public\n * @returns {string[]} - An array containing 66 book names starting with Genesis and ending with Revelation.\n * @example\n * // Returns an array of 66 Bible books\n * listBibleBooks();\n * // The first and last elements are Genesis and Revelation respectively\n * const books = listBibleBooks();\n * console.log(books[0]); // \"Genesis\"\n * console.log(books[books.length - 1]); // \"Revelation\"\n */\nfunction listBibleBooks() {\n return bibleCounts.map((b) => b.book);\n}\n\n/**\n * Returns all aliases for a given book name, including the official book title, optionally normalized.\n * @public\n * @param {string} bookName - The name or alias of the book to lookup, which will be normalized internally.\n * @param {Object} [options] - Optional settings.\n * @param {boolean} [options.normalized=false] - If true, returns all aliases normalized (lowercased and stripped of special characters).\n * @returns {string[]|null} - An array of aliases including the official book name, either normalized or in original form, or null if no matching book is found.\n * @example\n * // Returns non-normalized aliases for \"Second Corinthians\"\n * listAliases('Second Corinthians');\n * // Expected output: [\"2 Corinthians\", \"2 Co\", ...other aliases]\n * // Returns normalized aliases for \"Song\" with normalization enabled\n * listAliases('Song', { normalized: true });\n * // Expected output: [\"songofsolomon\", \"canticleofcanticles\", \"sos\", ...]\n * // Returns null for unrecognized or empty book names\n * listAliases('UnknownBook'); // null\n * listAliases(null); // null\n * listAliases(''); // null\n */\nfunction listAliases(bookName, { normalized = false } = {}) {\n const book = getBook(bookName);\n if (!book) return null;\n if (normalized) {\n return [book.book, ...book.aliases].map(normalizeBookName).filter((s) => s != null);\n }\n return [book.book, ...book.aliases];\n}\n\n/**\n * Returns an array of chapter numbers for a given Bible book, starting from 1 up to the total chapter count.\n * @public\n * @param {string} bookName - The name or alias of the book to lookup, which will be normalized internally.\n * @returns {number[]|null} - An array of chapter numbers from 1 to the book's chapter count, or null if the book is invalid or not found.\n * @example\n * // Returns an array [1, 2, ..., 40] for Exodus, which has 40 chapters\n * listChapters('Exodus'); // [1, 2, 3, ..., 40]\n * // Returns null for an invalid or unknown book\n * listChapters('UnknownBook'); // null\n */\nfunction listChapters(bookName) {\n const count = getChapterCount(bookName);\n if (count == null) return null;\n return Array.from({ length: count }, (_, i) => i + 1);\n}\n\n/**\n * Lists all verse numbers for a given book and chapter as a sequential array starting from 1.\n * @public\n * @param {string} bookName - The name or alias of the book to lookup, which will be normalized internally.\n * @param {number} chapter - The chapter number within the book.\n * @returns {number[]|null} - An array of verse numbers from 1 up to the chapter's verse count, or null if the book or chapter is invalid or out of range.\n * @example\n * // Returns an array of verses [1, 2, ..., 31] for Genesis chapter 1\n * listVerses('Genesis', 1); // [1, 2, 3, ..., 31]\n * // Returns null for a missing chapter parameter\n * listVerses('Genesis'); // null\n * // Returns null for an invalid chapter number or unknown book\n * listVerses('Genesis', 0); // null\n * listVerses('Genesis', 999); // null\n * listVerses('UnknownBook', 1); // null\n */\nfunction listVerses(bookName, chapter) {\n const verseCount = getVerseCount(bookName, chapter);\n if (verseCount == null) return null;\n return Array.from({ length: verseCount }, (_, i) => i + 1);\n}\n\nexport {\n getBook,\n getChapterCount,\n getVerseCount,\n listBibleBooks,\n listAliases,\n listChapters,\n listVerses,\n};\n","import { getBook } from './lookup.js';\n\n/**\n * Checks if a given book name or alias corresponds to a valid Bible book.\n * @public\n * @param {string|null|undefined} book - The name or alias of the book to lookup, which will be normalized internally.\n * @returns {boolean} - True if the book exists in the Bible collection, false otherwise.\n * @example\n * // Valid full book name returns true\n * isValidBook('Genesis'); // true\n * // Valid alias, case-insensitive, returns true\n * isValidBook('gEn'); // true\n * // Unknown book returns false\n * isValidBook('Judas'); // false\n * // Empty string returns false\n * isValidBook(''); // false\n * // Null or undefined input returns false\n * isValidBook(null); // false\n * isValidBook(undefined); // false\n */\nfunction isValidBook(book) {\n if (typeof book !== 'string' || book.trim() === '') return false;\n return getBook(book) !== null;\n}\n\n/**\n * Checks if the given chapter number is valid for the specified Bible book.\n * @public\n * @param {string} book - The name or alias of the book to lookup, which will be normalized internally.\n * @param {number} chapter - The chapter number to check, expected to be a positive integer.\n * @returns {boolean} - True if the chapter is within the valid range for the book; otherwise, false.\n * @example\n * // Valid chapters for Genesis include 1 and 50\n * isValidChapter('Genesis', 1); // true\n * isValidChapter('Genesis', 50); // true\n * // Invalid chapters are below 1 or above the book's chapter count\n * isValidChapter('Genesis', 0); // false\n * isValidChapter('Genesis', 51); // false\n * isValidChapter('Genesis', -1); // false\n * // Returns false if the book is unknown or input is null/undefined\n * isValidChapter('Judas', 1); // false\n * isValidChapter(null, 1); // false\n * isValidChapter('Genesis', null); // false\n */\nfunction isValidChapter(book, chapter) {\n const bookObj = getBook(book);\n if (!bookObj) return false;\n return chapter >= 1 && chapter <= bookObj.chapters.length;\n}\n\n/**\n * Validates whether a given Bible reference consisting of book, chapter, and verse(s) is valid.\n * @public\n * @param {string} book - The name or alias of the book to lookup, which will be normalized internally.\n * @param {number} chapter - The chapter number, must be a positive integer within the book's chapter count.\n * @param {number} verseStart - The starting verse number, must be a positive integer within the chapter's verse count.\n * @param {number|null} [verseEnd=null] - Optional ending verse number, must be greater than or equal to verseStart and within the chapter's verse count if provided.\n * @returns {boolean} True if the reference is valid within the book's chapter and verse bounds, otherwise false.\n * @example\n * // Valid single verse in Genesis chapter 1\n * isValidReference('Genesis', 1, 1); // true\n * // Valid last verse in Genesis chapter 1\n * isValidReference('Genesis', 1, 31); // true\n * // Invalid verse number exceeding the number of verses in chapter 1 of Genesis\n * isValidReference('Genesis', 1, 32); // false\n * // Invalid chapter number (0) in Genesis\n * isValidReference('Genesis', 0, 1); // false\n * // Invalid verse number (0) in Genesis chapter 1\n * isValidReference('Genesis', 1, 0); // false\n * // Invalid unknown book name returns false\n * isValidReference('Blah', 1, 1); // false\n * // Reference with a verse range, valid only if verseEnd >= verseStart and within chapter verse count\n * isValidReference('Genesis', 1, 1, 5); // true\n * // Case-insensitive book name input is accepted\n * isValidReference('gEnEsIs', 1, 1); // true\n */\nfunction isValidReference(book, chapter, verseStart, verseEnd = null) {\n const bookObj = getBook(book);\n if (!bookObj || !isValidChapter(book, chapter)) return false;\n const maxVerses = bookObj.chapters[chapter - 1];\n if (verseStart < 1 || verseStart > maxVerses) return false;\n if (verseEnd !== null) {\n if (verseEnd < verseStart || verseEnd > maxVerses) return false;\n }\n return true;\n}\n\nexport { isValidBook, isValidChapter, isValidReference };\n","/**\n * @import { ParseReferenceOptions, ParsedReference, SimpleResult, StructuredResult } from './types.js'\n */\nimport { parseBibleReference } from './normalizer.js';\nimport { getBook } from './lookup.js';\nimport { isValidReference } from './validator.js';\n\n/**\n * Formats a scripture reference string based on the provided input. Input is not normalized.\n * @public\n * @param {Object} reference - The reference object.\n * @param {string} reference.book - The name of the book (e.g., \"Genesis\").\n * @param {number} [reference.chapter] - The chapter number.\n * @param {number} [reference.verseStart] - The starting verse number.\n * @param {number|null} [reference.verseEnd] - The ending verse number (optional, used for ranges).\n * @returns {string} - A formatted Bible reference (e.g., \"Genesis 1:1-5\"). Returns an empty string if no input is provided.\n * @example\n * formatReference({}); // ''\n * formatReference({ book: 'Genesis' }); // 'Genesis'\n * formatReference({ book: 'Genesis', chapter: 1 }); // 'Genesis 1'\n * formatReference({ book: 'Genesis', chapter: 1, verseStart: 1 }); // 'Genesis 1:1'\n * formatReference({ book: 'Genesis', chapter: 1, verseStart: 1, verseEnd: 5 }); // 'Genesis 1:1-5'\n * formatReference({ book: 'Genesis', chapter: 1, verseStart: 3, verseEnd: 3 }); // 'Genesis 1:3'\n */\nfunction formatReference({ book, chapter, verseStart, verseEnd }) {\n if (!book || !chapter) return book || '';\n if (verseStart == null) return `${book} ${chapter}`;\n if (verseEnd == null || verseEnd === verseStart) return `${book} ${chapter}:${verseStart}`;\n return `${book} ${chapter}:${verseStart}-${verseEnd}`;\n}\n\n/**\n * Parses and validates a Bible reference string.\n * @public\n * @param {string} reference - The raw Bible reference string to be parsed, normalized, and formatted (e.g., \"Genesis 1:1\", \"Letter to the Romans. Ch 2 , 1 to 3\").\n * @param {ParseReferenceOptions} [options] - Optional configuration, return structured object or just the formatted result.\n * @returns {SimpleResult|StructuredResult} - Result object depending on options.structured.\n * @example\n * parseAndValidateReference(' GN. Ch 1 , 1 to 3');\n * // → { isValid: true, formatted: 'Genesis 1:1-3', error: null, original: ' GN. Ch 1 , 1 to 3' }\n * parseAndValidateReference('gEnEsIs 1 verse 1', { structured: true });\n * // → {\n * // isValid: true,\n * // book: 'Genesis',\n * // chapter: 1,\n * // verseStart: 1,\n * // verseEnd: null,\n * // formatted: 'Genesis 1:1',\n * // error: null,\n * // original: 'gEnEsIs 1 verse 1'\n * // }\n * parseAndValidateReference('Book of Judas 1:1');\n * // → { isValid: false, error: 'Invalid book name', original: 'Book of Judas 1:1' }\n */\nfunction parseAndValidateReference(reference, { structured = false } = {}) {\n /**\n * @private\n * @param {string} msg\n * @returns {{ isValid: false, error: string, original: string }}\n */\n const fail = (msg) => ({ isValid: false, error: msg, original: reference });\n\n if (typeof reference !== 'string' || !reference.trim()) {\n return fail('Empty or invalid input');\n }\n\n /**\n * @private\n * @type {ParsedReference|null}\n */\n const parsed = parseBibleReference(reference);\n if (!parsed?.book) return fail('Could not parse reference');\n const bookObj = getBook(parsed.book);\n if (!bookObj) return fail('Invalid book name');\n const chapter = parsed.chapter ?? null;\n const verseStart = parsed.verseStart ?? null;\n const verseEnd = parsed.verseEnd ?? null;\n if (chapter === null || verseStart === null) {\n return fail('Missing chapter or verse');\n }\n if (!isValidReference(bookObj.book, chapter, verseStart, verseEnd)) {\n return fail('Invalid chapter or verse');\n }\n const formatted = formatReference({ book: bookObj.book, chapter, verseStart, verseEnd });\n const base = {\n isValid: true,\n formatted,\n error: null,\n original: reference,\n };\n return structured\n ? {\n ...base,\n book: bookObj.book,\n chapter,\n verseStart,\n verseEnd,\n }\n : base;\n}\n\nexport { parseAndValidateReference, formatReference };\n"],"names":[],"mappings":"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Q,IAAI,IAAI;AAC7C,KAAK;AACL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}