UNPKG

fullfiller

Version:
789 lines (768 loc) 309 kB
'use strict'; class CustomError extends Error { /** * Create a `CustomError` (same as `Error` but with an extra property called `library`). * @param message Argument to be passed to base constructor (`Error()`). * @param library Name of the library in which error will be thrown. */ constructor(message, library) { super(message); this.library = library; } toString() { return `Error in \`${this.library}\` library:\n\t${this.message}`; } } /* max must be at least `min * 2 - 1` otherwise, min & max couldn't be used to break down any number inside range `max to (min * 2)` e.g. if min is 7, max can't be anything less than 13 - range 7 - 12 = couldn't break down 13 - range 7 - 11 = couldn't break down 12, 13 - range 7 - 10 = couldn't break down 11, 12, 13 - so on... */ const sentencesPerParagraphDefault = { min: 4, max: 8 }; // const wordsPerSentenceDefault = { min: 7, max: 13 }; // all languages in which Wikipedia is available // script used to fetch languages object is at `./languages.js` /* cSpell:disable */ const wikipediaLanguages = { aa: 'Afar', ab: 'Abkhazian', ace: 'Achinese', ady: 'Adyghe', af: 'Afrikaans', ak: 'Akan', als: 'Alemannisch', alt: 'Southern Altai', am: 'Amharic', ami: 'Amis', an: 'Aragonese', ang: 'Old English', anp: 'Angika', ar: 'Arabic', arc: 'Aramaic', ary: 'Moroccan Arabic', arz: 'Egyptian Arabic', as: 'Assamese', ast: 'Asturian', atj: 'Atikamekw', av: 'Avaric', avk: 'Kotava', awa: 'Awadhi', ay: 'Aymara', az: 'Azerbaijani', azb: 'South Azerbaijani', ba: 'Bashkir', ban: 'Balinese', bar: 'Bavarian', 'bat-smg': 'Samogitian', bcl: 'Central Bikol', be: 'Belarusian', 'be-x-old': 'Belarusian (Taraškievica orthography)', bg: 'Bulgarian', bh: 'Bhojpuri', bi: 'Bislama', bjn: 'Banjar', blk: "Pa'O", bm: 'Bambara', bn: 'Bangla', bo: 'Tibetan', bpy: 'Bishnupriya', br: 'Breton', bs: 'Bosnian', bug: 'Buginese', bxr: 'Russia Buriat', ca: 'Catalan', 'cbk-zam': 'Chavacano', cdo: 'Min Dong Chinese', ce: 'Chechen', ceb: 'Cebuano', ch: 'Chamorro', cho: 'Choctaw', chr: 'Cherokee', chy: 'Cheyenne', ckb: 'Central Kurdish', co: 'Corsican', cr: 'Cree', crh: 'Crimean Tatar', cs: 'Czech', csb: 'Kashubian', cu: 'Church Slavic', cv: 'Chuvash', cy: 'Welsh', da: 'Danish', dag: 'Dagbani', de: 'German', din: 'Dinka', diq: 'Zazaki', dsb: 'Lower Sorbian', dty: 'Doteli', dv: 'Divehi', dz: 'Dzongkha', ee: 'Ewe', el: 'Greek', eml: 'Emiliano-Romagnolo', en: 'English', eo: 'Esperanto', es: 'Spanish', et: 'Estonian', eu: 'Basque', ext: 'Extremaduran', fa: 'Persian', ff: 'Fula', fi: 'Finnish', 'fiu-vro': 'võro', fj: 'Fijian', fo: 'Faroese', fr: 'French', frp: 'Arpitan', frr: 'Northern Frisian', fur: 'Friulian', fy: 'Western Frisian', ga: 'Irish', gag: 'Gagauz', gan: 'Gan Chinese', gcr: 'Guianan Creole', gd: 'Scottish Gaelic', gl: 'Galician', glk: 'Gilaki', gn: 'Guarani', gom: 'Goan Konkani', gor: 'Gorontalo', got: 'Gothic', gu: 'Gujarati', guc: 'Wayuu', gur: 'Frafra', guw: 'Gun', gv: 'Manx', ha: 'Hausa', hak: 'Hakka Chinese', haw: 'Hawaiian', he: 'Hebrew', hi: 'Hindi', hif: 'Fiji Hindi', ho: 'Hiri Motu', hr: 'Croatian', hsb: 'Upper Sorbian', ht: 'Haitian Creole', hu: 'Hungarian', hy: 'Armenian', hyw: 'Western Armenian', hz: 'Herero', ia: 'Interlingua', id: 'Indonesian', ie: 'Interlingue', ig: 'Igbo', ii: 'Sichuan Yi', ik: 'Inupiaq', ilo: 'Iloko', inh: 'Ingush', io: 'Ido', is: 'Icelandic', it: 'Italian', iu: 'Inuktitut', ja: 'Japanese', jam: 'Jamaican Creole English', jbo: 'Lojban', jv: 'Javanese', ka: 'Georgian', kaa: 'Kara-Kalpak', kab: 'Kabyle', kbd: 'Kabardian', kbp: 'Kabiye', kcg: 'Tyap', kg: 'Kongo', ki: 'Kikuyu', kj: 'Kuanyama', kk: 'Kazakh', kl: 'Kalaallisut', km: 'Khmer', kn: 'Kannada', ko: 'Korean', koi: 'Komi-Permyak', kr: 'Kanuri', krc: 'Karachay-Balkar', ks: 'Kashmiri', ksh: 'Colognian', ku: 'Kurdish', kv: 'Komi', kw: 'Cornish', ky: 'Kyrgyz', la: 'Latin', lad: 'Ladino', lb: 'Luxembourgish', lbe: 'Lak', lez: 'Lezghian', lfn: 'Lingua Franca Nova', lg: 'Ganda', li: 'Limburgish', lij: 'Ligurian', lld: 'Ladin', lmo: 'Lombard', ln: 'Lingala', lo: 'Lao', lrc: 'Northern Luri', lt: 'Lithuanian', ltg: 'Latgalian', lv: 'Latvian', mad: 'Madurese', mai: 'Maithili', 'map-bms': 'Basa Banyumasan', mdf: 'Moksha', mg: 'Malagasy', mh: 'Marshallese', mhr: 'Eastern Mari', mi: 'Māori', min: 'Minangkabau', mk: 'Macedonian', ml: 'Malayalam', mn: 'Mongolian', mni: 'Manipuri', mnw: 'Mon', mr: 'Marathi', mrj: 'Western Mari', ms: 'Malay', mt: 'Maltese', mus: 'Muscogee', mwl: 'Mirandese', my: 'Burmese', myv: 'Erzya', mzn: 'Mazanderani', na: 'Nauru', nah: 'Nāhuatl', nap: 'Neapolitan', nds: 'Low German', 'nds-nl': 'Low Saxon', ne: 'Nepali', new: 'Newari', ng: 'Ndonga', nia: 'Nias', nl: 'Dutch', nn: 'Norwegian Nynorsk', no: 'Norwegian', nov: 'Novial', nqo: 'N’Ko', nrm: 'Norman', nso: 'Northern Sotho', nv: 'Navajo', ny: 'Nyanja', oc: 'Occitan', olo: 'Livvi-Karelian', om: 'Oromo', or: 'Odia', os: 'Ossetic', pa: 'Punjabi', pag: 'Pangasinan', pam: 'Pampanga', pap: 'Papiamento', pcd: 'Picard', pcm: 'Nigerian Pidgin', pdc: 'Pennsylvania German', pfl: 'Palatine German', pi: 'Pali', pih: 'Norfuk / Pitkern', pl: 'Polish', pms: 'Piedmontese', pnb: 'Western Punjabi', pnt: 'Pontic', ps: 'Pashto', pt: 'Portuguese', pwn: 'Paiwan', qu: 'Quechua', rm: 'Romansh', rmy: 'Vlax Romani', rn: 'Rundi', ro: 'Romanian', 'roa-rup': 'Aromanian', 'roa-tara': 'Tarantino', ru: 'Russian', rue: 'Rusyn', rw: 'Kinyarwanda', sa: 'Sanskrit', sah: 'Yakut', sat: 'Santali', sc: 'Sardinian', scn: 'Sicilian', sco: 'Scots', sd: 'Sindhi', se: 'Northern Sami', sg: 'Sango', sh: 'Serbo-Croatian', shi: 'Tachelhit', shn: 'Shan', si: 'Sinhala', simple: 'Simple English', sk: 'Slovak', skr: 'Saraiki', sl: 'Slovenian', sm: 'Samoan', smn: 'Inari Sami', sn: 'Shona', so: 'Somali', sq: 'Albanian', sr: 'Serbian', srn: 'Sranan Tongo', ss: 'Swati', st: 'Southern Sotho', stq: 'Saterland Frisian', su: 'Sundanese', sv: 'Swedish', sw: 'Swahili', szl: 'Silesian', szy: 'Sakizaya', ta: 'Tamil', tay: 'Tayal', tcy: 'Tulu', te: 'Telugu', tet: 'Tetum', tg: 'Tajik', th: 'Thai', ti: 'Tigrinya', tk: 'Turkmen', tl: 'Tagalog', tn: 'Tswana', to: 'Tongan', tpi: 'Tok Pisin', tr: 'Turkish', trv: 'Taroko', ts: 'Tsonga', tt: 'Tatar', tum: 'Tumbuka', tw: 'Twi', ty: 'Tahitian', tyv: 'Tuvinian', udm: 'Udmurt', ug: 'Uyghur', uk: 'Ukrainian', ur: 'Urdu', uz: 'Uzbek', ve: 'Venda', vec: 'Venetian', vep: 'Veps', vi: 'Vietnamese', vls: 'West Flemish', vo: 'Volapük', wa: 'Walloon', war: 'Waray', wo: 'Wolof', wuu: 'Wu Chinese', xal: 'Kalmyk', xh: 'Xhosa', xmf: 'Mingrelian', yi: 'Yiddish', yo: 'Yoruba', za: 'Zhuang', zea: 'Zeelandic', zh: 'Chinese', 'zh-classical': 'Classical Chinese', 'zh-min-nan': 'Chinese (Min Nan)', 'zh-yue': 'Cantonese', zu: 'Zulu' }; /* cSpell:enable */ // messages aren't inside an object because // tree-shaking isn't possible when exporting an object // https://medium.com/@rauschma/note-that-default-exporting-objects-is-usually-an-anti-pattern-if-you-want-to-export-the-cf674423ac38#.nibatprx3 // used at `fullfiller/src/validate` const invalidInput = 'Expected `input` argument to be one of the valid types (query string, text, words array or frequency map).'; const emptyQueryString = 'Expected non-empty query string at `input` argument.'; const textTooShort = 'Expected given text (in `input.body` argument) to have at least 150 words.'; // const invalidLanguage = (language, languages) => `Expected \`language\` argument to be one of the supported languages (${languages.join(', ')}).`; // const invalidUnit = 'Expected `unit` argument to be `words` or `paragraphs`.'; // const quantityNotNumber = 'Expected `quantity` argument to be a number.'; const quantityTooSmall = wordsMinimum => `Expected \`quantity\` argument to be greater than 1 paragraph / ${wordsMinimum} words.`; // const invalidFormat = 'Expected `format` argument to be `plain` or `html`.'; // const invalidStringify = 'Expected `stringify` argument to be a boolean (`true` or `false`).'; // const invalidSentencesPerParagraph = 'Expected `sentencesPerParagraph` argument to be an object (`{ min: number, max: number }`).'; const sentencesPerParagraphMinTooSmall = 'Expected `sentencesPerParagraph.min` argument to be at least 3.'; const sentencesPerParagraphMaxTooSmall = 'Expected `sentencesPerParagraph.max` argument to be at least 3.'; const invalidSentencesPerParagraphMax = 'Expected `sentencesPerParagraph.max` to be at least `sentencesPerParagraph.min * 2 - 1`.'; // const invalidWordsPerSentence = 'Expected `wordsPerSentence` argument to be an object (`{ min: number, max: number }`).'; const wordsPerSentenceMinTooSmall = 'Expected `wordsPerSentence.min` argument to be at least 3.'; const wordsPerSentenceMaxTooSmall = 'Expected `wordsPerSentence.max` argument to be at least 3.'; const invalidWordsPerSentenceMax = 'Expected `wordsPerSentence.max` to be at least `wordsPerSentence.min * 2 - 1`.'; const articleNotFound = 'Wikipedia does not have an article with this exact title. Try again using a different query.'; const articleIsDisambiguation = suggestions => `This query points to a Wikipedia disambiguation page. You've got to be more specific.${suggestions.length > 0 ? ` Query suggestions:\n- ${suggestions.splice(0, 10).join('\n- ')}.` : ` No query suggestions were found.`}`; const notEnoughWordsInWordsArray = (minimum, received) => `Given \`text\` doesn't have enough keywords to construct \`wordsArray\` containing the minimum quantity of words required. Minimum number of words required: ${minimum}. Number of words received: ${received}.`; const notEnoughWordsInFreqMap = (minimum, received) => `Given \`wordsArray\` doesn't have enough words to construct \`freqMap\` containing the minimum quantity of words required. Minimum number of words required: ${minimum}. Number of words received: ${received}.`; /** * Every freqMap's word in `wordsToEmphasize` will have their weight multiplied by `emphasizeBy`. */ function emphasize(freqMapWordAsKey, wordsToEmphasize, emphasizeBy) { return wordsToEmphasize.reduce((freqMap, word) => freqMap[word] === undefined ? freqMap : { ...freqMap, [word]: Math.round(freqMap[word] * emphasizeBy) }, freqMapWordAsKey); } /** **freqMapWeightAsKey** example: `{ 1: ['foo', 'bar'], 3: ['baz'] }` */ function generateFreqMapWeightAsKey(freqMapWordAsKey) { return Object.keys(freqMapWordAsKey).reduce((freqMap, word) => { const weight = freqMapWordAsKey[word]; return { ...freqMap, [weight]: (freqMap[weight] || []).concat(word) }; }, {}); } /** **freqMapWordAsKey** example: `{ foo: 1, bar: 3 }` */ function generateFreqMapWordAsKey(wordsArray, caseInsensitive) { return wordsArray.reduce((freqMap, word) => { const w = caseInsensitive ? word.toLowerCase() : word; return { ...freqMap, // using hasOwnProperty instead of check if undefined, otherwise // if `word` is a built-in object property (e.g. `constructor`) // would append 1 to this property (which would results in `NaN`) // instead of creating a new property [w]: Object.prototype.hasOwnProperty.call(freqMap, w) ? freqMap[w] + 1 : 1 }; }, {}); } function getFreqMapWordsQuantity(freqMap) { const wordsQuantity = Object.values(freqMap).reduce((acc, cur) => acc + cur.length, 0); return wordsQuantity; } /** If required by `options`, reduce the quantity of tiers in `freqMap`. */ function shortenFreqMap(freqMap, tierWeightMin, tierWeightMax, mergePosteriorTiersAt) { return Object.entries(freqMap).reduce((shortened, entry) => { const weight = Number(entry[0]); const tier = entry[1]; // if current weight is less than min or more than max, filter out current tier if (weight < tierWeightMin || tierWeightMax !== -1 && // -1 would indicate that `tierWeightMax` functionality is disabled weight > tierWeightMax) { return shortened; } // if current weight is more than mergePosteriorTiersAt // merge current tier into mergePosteriorTiersAt tier if (mergePosteriorTiersAt !== -1 && // -1 would indicate that `mergePosteriorTiersAt` functionality is disabled weight > mergePosteriorTiersAt) { return { ...shortened, [mergePosteriorTiersAt]: (shortened[mergePosteriorTiersAt] || []).concat(freqMap[weight]) }; } return { ...shortened, [weight]: tier }; }, {}); } const optionsDefault$1 = { emphasizeBy: 2, wordsQuantityMin: 0, tierWeightMin: 1, tierWeightMax: -1, mergePosteriorTiersAt: -1, caseInsensitive: false }; /** * Generate `freqMap` from `wordsArray`. * @param wordsArray * @param wordsToEmphasize Subset of `wordsArray` to emphasize. * @param optionsArg Miscellaneous options. * @throws Error if `freqMap` has less words than required by `options.wordsQuantityMin`. * @returns freqMap. */ function generateFreqMap(wordsArray, wordsToEmphasize, optionsArg) { const options = { ...optionsDefault$1, ...optionsArg }; const freqMapWordAsKey = emphasize(generateFreqMapWordAsKey(wordsArray, options.caseInsensitive), wordsToEmphasize || [], options.emphasizeBy); const freqMap = shortenFreqMap(generateFreqMapWeightAsKey(freqMapWordAsKey), options.tierWeightMin, options.tierWeightMax, options.mergePosteriorTiersAt); const freqMapWordsQuantity = getFreqMapWordsQuantity(freqMap); if (freqMapWordsQuantity < options.wordsQuantityMin) { throw new CustomError(notEnoughWordsInFreqMap(options.wordsQuantityMin, freqMapWordsQuantity), 'generate-words-freqmap'); } return freqMap; } /** * Summary is the initial chunk of text, everything before the first subtitle. * It's possible to get it with API `&action=query&prop=extracts&exintro`. * But the entire article was fetched already, so there's no need to make another API call. * * @summary Extract summary from article body. * @param body Wikipedia article body. * @param format Article format. * @returns Wikipedia article summary. */ function extractSummaryFromBody(body, format) { const plaintextRE = /^[\s\S]*?(?=\n\n\n==)/; const htmlRE = /^[\s\S]*?(?=\n\n<h2>)/; const RE = format === 'plain' ? plaintextRE : htmlRE; const summary = RE.exec(body)?.[0]; return summary; } /** * Join Wikipedia API base URL and `queries`. * @param queries Object to be converted to query string. * @returns URL to make API call. */ function generateRequestURL(language, queries) { const baseAPI = `https://${language}.wikipedia.org/w/api.php?&format=json&origin=*&`; const queryString = Object.entries(queries).map(([key, value]) => value === undefined ? key : `${key}=${value.toString()}`).join('&'); const requestURL = baseAPI + queryString; return requestURL; } /** * @summary Fetch response from Wikipedia API. * @param queries Object containing query string parameters. * @returns Object containing json.query.pages[pageID] and json.continue (if it exists) contents. */ async function fetchResource(language, queries) { const url = generateRequestURL(language, queries); const json = await (await fetch(url)).json(); // API's response isn't returned in its entirety by this function. // That's because the main part of the response is nested 3 layers deep. // As shown in the `response` interface. const { pages } = json.query; const pagesID = Object.keys(pages)[0]; const resp = { ...pages[pagesID], // some resources responses (e.g. links) include `continue` when there's more to fetch ...(json.continue && json.continue) }; return resp; } /** * Fetch Wikipedia article body. * @param title Wikipedia article title. * @param format Which one of the 2 formats available in the Wikipedia API. * @param related Wikipedia related articles titles (to recommend in case of error). * @returns Wikipedia article body. */ async function getArticleBody(language, title, format) { const queries = { action: 'query', prop: 'extracts', ...(format === 'plain' && { explaintext: undefined }), redirects: undefined, titles: encodeURIComponent(title) }; const resp = await fetchResource(language, queries); const body = resp.extract; return body; } /** * Fetch all Wikipedia categories the given article belongs to. * @param title Wikipedia article title. * @returns Array of Wikipedia categories names. */ async function getArticleCategories(language, title) { const queries = { action: 'query', prop: 'categories', redirects: undefined, cllimit: 'max', clshow: '!hidden', titles: encodeURIComponent(title) }; // There's no reason to use a recursive function like in getArticleLinks, // even the articles containing the most categories don't have more than 500 categories // (https://en.wikipedia.org/wiki/Special:MostCategories); // request below will fetch at most 500 normal (not hidden) categories const resp = await fetchResource(language, queries); const categories = resp.categories.map(obj => obj.title.replace(/^Category:/, '')); return categories; } async function getLinksRecursively(language, queries) { const resp = await fetchResource(language, queries); const links = resp.links.map(obj => obj.title); return !('plcontinue' in resp) ? links : links.concat(await getLinksRecursively(language, { ...queries, plcontinue: encodeURIComponent(resp.plcontinue) })); } /** * Fetch all Wikipedia articles that are linked in the given article. * @param title Wikipedia article title. * @returns Array of Wikipedia articles titles. */ async function getArticleLinks(language, title) { const queries = { action: 'query', prop: 'links', redirects: undefined, pllimit: 'max', plnamespace: '0', titles: encodeURIComponent(title) }; const links = await getLinksRecursively(language, queries); return links; } /** * Fetch Wikipedia article summary. * @param title Wikipedia article title. * @param format Which one of the 2 formats available in the Wikipedia API. * @param related Wikipedia related articles titles (to recommend in case of error). * @returns Wikipedia article body. */ async function getArticleSummary(language, title, format) { const queries = { action: 'query', prop: 'extracts', exintro: undefined, redirects: undefined, ...(format === 'plain' && { explaintext: undefined }), titles: encodeURIComponent(title) }; const resp = await fetchResource(language, queries); const summary = resp.extract; return summary; } /** * Fetch Wikipedia article terms. * @param title Wikipedia article title. * @param include Which terms to fetch (alias, description and/or label). * @returns Array of Wikipedia article terms. */ async function getArticleTerms(language, title, include) { const queries = { action: 'query', prop: 'pageterms', redirects: undefined, wbptlanguage: 'en', wbptterms: include.join('|'), titles: encodeURIComponent(title) }; const resp = await fetchResource(language, queries); const { terms } = resp; // if (include.length !== Object.keys(terms).length) { // const print = (array: string[]) => array.sort().join(', '); // console.warn( // `Article lacks some of the terms requested. Requested: ${print( // include // )}. Fetched: ${print(Object.keys(terms))}.` // ); // } return terms; } /** * Fetch Wikipedia article(s) title(s) that match query. * @param query Search string. * @param single Fetch only a single result. * @throws Error if no results were found. * @returns Array of title(s). */ async function getMatchingArticlesTitles(language, query, single = false) { const requestURL = generateRequestURL(language, { action: 'opensearch', limit: single ? 1 : 'max', // `redirects=resolve` is required otherwise response may contain the name of a redirect // instead of the target page; page and redirect have slight different titles // e.g. query `lord of the rings` would return `Lord of the rings` // which is the redirect for `The Lord of the Rings` redirects: 'resolve', search: encodeURIComponent(query) }); const resp = await fetch(requestURL); const json = await resp.json(); const titles = json[1]; if (titles.length === 0) throw new CustomError(articleNotFound, 'get-wikipedia-article'); return titles; } async function queryPointsToADisambiguationPage(language, title) { const queries = { action: 'query', prop: 'pageprops', ppprop: 'disambiguation', redirects: undefined, titles: encodeURIComponent(title) }; const resp = await fetchResource(language, queries); const pointsToDisambiguation = resp.pageprops?.disambiguation !== undefined; return pointsToDisambiguation; } const includeDefault = ['title', 'body']; /** * Fetch Wikipedia article's resources (e.g. title, body, links...). * @param query Search string. * @param options Miscellaneous options. * @throws Error if `query` doesn't return any results. * @throws Error if `article.title` points to a disambiguation page. * @returns Object containing requested resources. */ async function getWikipediaArticle(query, { language = 'en', include = includeDefault, format = 'plain' } = {}) { if (!Object.keys(wikipediaLanguages).includes(language)) { throw new CustomError(invalidLanguage(language, Object.keys(wikipediaLanguages)), 'get-wikipedia-article'); } if (include.length === 0) include.push(...includeDefault); const article = {}; // fetch title, related if (include.includes('title') && include.includes('related')) { // first result will be selected as the article to be fetched const [title, ...related] = await getMatchingArticlesTitles(language, query); article.title = title; article.related = related; } else if (include.includes('title')) { const [title] = await getMatchingArticlesTitles(language, query); article.title = title; } else if (include.includes('related')) { const [, ...related] = await getMatchingArticlesTitles(language, query); article.related = related; } // API calls to `action=query` using `query` instead of `article.title` // are allowed because `redirects` parameter is being used const titleQuery = article.title || query; // the only option other than to make a separate request at main function checking if page is // disambiguation, would be to check if page is disambiguation at every resource request if (await queryPointsToADisambiguationPage(language, titleQuery)) { throw new CustomError(articleIsDisambiguation(article.related || [] /* suggestions */), 'get-wikipedia-article'); } // fetch body if (include.includes('body')) { article.body = await getArticleBody(language, titleQuery, format); } // fetch summary if (include.includes('summary')) { article.summary = article.body ? extractSummaryFromBody(article.body, format) : await getArticleSummary(language, titleQuery, format); } // fetch categories if (include.includes('categories')) { article.categories = await getArticleCategories(language, titleQuery); } // fetch links if (include.includes('links')) { article.links = await getArticleLinks(language, titleQuery); } // fetch terms const termsToInclude = ['alias', 'label', 'description'].filter(term => include.includes(term)); if (termsToInclude.length > 0) { const terms = await getArticleTerms(language, titleQuery, termsToInclude); Object.keys(terms).forEach(term => { article[term] = terms[term]; }); } return article; } var af$1=["'n","aan","af","al","as","baie","by","daar","dag","dat","die","dit","een","ek","en","gaan","gesê","haar","het","hom","hulle","hy","in","is","jou","jy","kan","kom","ma","maar","met","my","na","nie","om","ons","op","saam","sal","se","sien","so","sy","te","toe","uit","van","vir","was","wat","ʼn"];var ha$1=["a","amma","ba","ban","ce","cikin","da","don","ga","in","ina","ita","ji","ka","ko","kuma","lokacin","ma","mai","na","ne","ni","sai","shi","su","suka","sun","ta","tafi","take","tana","wani","wannan","wata","ya","yake","yana","yi","za"];var so$1=["aad","albaabkii","atabo","ay","ayaa","ayee","ayuu","dhan","hadana","in","inuu","isku","jiray","jirtay","ka","kale","kasoo","ku","kuu","lakin","markii","oo","si","soo","uga","ugu","uu","waa","waxa","waxuu"];var st$1=["a","ba","bane","bona","e","ea","eaba","empa","ena","ha","hae","hape","ho","hore","ka","ke","la","le","li","me","mo","moo","ne","o","oa","re","sa","se","tloha","tsa","tse"];var sw$1=["akasema","alikuwa","alisema","baada","basi","bila","cha","chini","hadi","hapo","hata","hivyo","hiyo","huku","huo","ili","ilikuwa","juu","kama","karibu","katika","kila","kima","kisha","kubwa","kutoka","kuwa","kwa","kwamba","kwenda","kwenye","la","lakini","mara","mdogo","mimi","mkubwa","mmoja","moja","muda","mwenye","na","naye","ndani","ng","ni","nini","nonkungu","pamoja","pia","sana","sasa","sauti","tafadhali","tena","tu","vile","wa","wakati","wake","walikuwa","wao","watu","wengine","wote","ya","yake","yangu","yao","yeye","yule","za","zaidi","zake"];var yo$1=["a","an","bá","bí","bẹ̀rẹ̀","fún","fẹ́","gbogbo","inú","jù","jẹ","jẹ́","kan","kì","kí","kò","láti","lè","lọ","mi","mo","máa","mọ̀","ni","náà","ní","nígbà","nítorí","nǹkan","o","padà","pé","púpọ̀","pẹ̀lú","rẹ̀","sì","sí","sínú","ṣ","ti","tí","wà","wá","wọn","wọ́n","yìí","àti","àwọn","é","í","òun","ó","ń","ńlá","ṣe","ṣé","ṣùgbọ́n","ẹmọ́","ọjọ́","ọ̀pọ̀lọpọ̀"];var zu$1=["futhi","kahle","kakhulu","kanye","khona","kodwa","kungani","kusho","la","lakhe","lapho","mina","ngesikhathi","nje","phansi","phezulu","u","ukuba","ukuthi","ukuze","uma","wahamba","wakhe","wami","wase","wathi","yakhe","zakhe","zonke"];var da$1=["af","alle","andet","andre","at","begge","da","de","den","denne","der","deres","det","dette","dig","din","dog","du","ej","eller","en","end","ene","eneste","enhver","et","fem","fire","flere","fleste","for","fordi","forrige","fra","få","før","god","han","hans","har","hendes","her","hun","hvad","hvem","hver","hvilken","hvis","hvor","hvordan","hvorfor","hvornår","i","ikke","ind","ingen","intet","jeg","jeres","kan","kom","kommer","lav","lidt","lille","man","mand","mange","med","meget","men","mens","mere","mig","ned","ni","nogen","noget","ny","nyt","nær","næste","næsten","og","op","otte","over","på","se","seks","ses","som","stor","store","syv","ti","til","to","tre","ud","var"];var de$1=["Ernst","Ordnung","Schluss","a","ab","aber","ach","acht","achte","achten","achter","achtes","ag","alle","allein","allem","allen","aller","allerdings","alles","allgemeinen","als","also","am","an","andere","anderen","andern","anders","au","auch","auf","aus","ausser","ausserdem","außer","außerdem","b","bald","bei","beide","beiden","beim","beispiel","bekannt","bereits","besonders","besser","besten","bin","bis","bisher","bist","c","d","d.h","da","dabei","dadurch","dafür","dagegen","daher","dahin","dahinter","damals","damit","danach","daneben","dank","dann","daran","darauf","daraus","darf","darfst","darin","darum","darunter","darüber","das","dasein","daselbst","dass","dasselbe","davon","davor","dazu","dazwischen","daß","dein","deine","deinem","deiner","dem","dementsprechend","demgegenüber","demgemäss","demgemäß","demselben","demzufolge","den","denen","denn","denselben","der","deren","derjenige","derjenigen","dermassen","dermaßen","derselbe","derselben","des","deshalb","desselben","dessen","deswegen","dich","die","diejenige","diejenigen","dies","diese","dieselbe","dieselben","diesem","diesen","dieser","dieses","dir","doch","dort","drei","drin","dritte","dritten","dritter","drittes","du","durch","durchaus","durfte","durften","dürfen","dürft","e","eben","ebenso","ehrlich","ei","ei,","eigen","eigene","eigenen","eigener","eigenes","ein","einander","eine","einem","einen","einer","eines","einige","einigen","einiger","einiges","einmal","eins","elf","en","ende","endlich","entweder","er","erst","erste","ersten","erster","erstes","es","etwa","etwas","euch","euer","eure","f","folgende","früher","fünf","fünfte","fünften","fünfter","fünftes","für","g","gab","ganz","ganze","ganzen","ganzer","ganzes","gar","gedurft","gegen","gegenüber","gehabt","gehen","geht","gekannt","gekonnt","gemacht","gemocht","gemusst","genug","gerade","gern","gesagt","geschweige","gewesen","gewollt","geworden","gibt","ging","gleich","gott","gross","grosse","grossen","grosser","grosses","groß","große","großen","großer","großes","gut","gute","guter","gutes","h","habe","haben","habt","hast","hat","hatte","hatten","hattest","hattet","heisst","her","heute","hier","hin","hinter","hoch","hätte","hätten","i","ich","ihm","ihn","ihnen","ihr","ihre","ihrem","ihren","ihrer","ihres","im","immer","in","indem","infolgedessen","ins","irgend","ist","j","ja","jahr","jahre","jahren","je","jede","jedem","jeden","jeder","jedermann","jedermanns","jedes","jedoch","jemand","jemandem","jemanden","jene","jenem","jenen","jener","jenes","jetzt","k","kam","kann","kannst","kaum","kein","keine","keinem","keinen","keiner","kleine","kleinen","kleiner","kleines","kommen","kommt","konnte","konnten","kurz","können","könnt","könnte","l","lang","lange","leicht","leide","lieber","los","m","machen","macht","machte","mag","magst","mahn","mal","man","manche","manchem","manchen","mancher","manches","mann","mehr","mein","meine","meinem","meinen","meiner","meines","mensch","menschen","mich","mir","mit","mittel","mochte","mochten","morgen","muss","musst","musste","mussten","muß","mußt","möchte","mögen","möglich","mögt","müssen","müsst","müßt","n","na","nach","nachdem","nahm","natürlich","neben","nein","neue","neuen","neun","neunte","neunten","neunter","neuntes","nicht","nichts","nie","niemand","niemandem","niemanden","noch","nun","nur","o","ob","oben","oder","offen","oft","ohne","p","q","r","recht","rechte","rechten","rechter","rechtes","richtig","rund","s","sa","sache","sagt","sagte","sah","satt","schlecht","schon","sechs","sechste","sechsten","sechster","sechstes","sehr","sei","seid","seien","sein","seine","seinem","seinen","seiner","seines","seit","seitdem","selbst","sich","sie","sieben","siebente","siebenten","siebenter","siebentes","sind","so","solang","solche","solchem","solchen","solcher","solches","soll","sollen","sollst","sollt","sollte","sollten","sondern","sonst","soweit","sowie","später","startseite","statt","steht","suche","t","tag","tage","tagen","tat","teil","tel","tritt","trotzdem","tun","u","uhr","um","und","und?","uns","unser","unsere","unserer","unter","v","vergangenen","viel","viele","vielem","vielen","vielleicht","vier","vierte","vierten","vierter","viertes","vom","von","vor","w","wahr?","wann","war","waren","wart","warum","was","wegen","weil","weit","weiter","weitere","weiteren","weiteres","welche","welchem","welchen","welcher","welches","wem","wen","wenig","wenige","weniger","weniges","wenigstens","wenn","wer","werde","werden","werdet","weshalb","wessen","wie","wieder","wieso","will","willst","wir","wird","wirklich","wirst","wissen","wo","wohl","wollen","wollt","wollte","wollten","worden","wurde","wurden","während","währenddem","währenddessen","wäre","würde","würden","x","y","z","z.b","zehn","zehnte","zehnten","zehnter","zehntes","zeit","zu","zuerst","zugleich","zum","zunächst","zur","zurück","zusammen","zwanzig","zwar","zwei","zweite","zweiten","zweiter","zweites","zwischen","zwölf","über","überhaupt","übrigens"];var es$1=["a","actualmente","acuerdo","adelante","ademas","además","adrede","afirmó","agregó","ahi","ahora","ahí","al","algo","alguna","algunas","alguno","algunos","algún","alli","allí","alrededor","ambos","ampleamos","antano","antaño","ante","anterior","antes","apenas","aproximadamente","aquel","aquella","aquellas","aquello","aquellos","aqui","aquél","aquélla","aquéllas","aquéllos","aquí","arriba","arribaabajo","aseguró","asi","así","atras","aun","aunque","ayer","añadió","aún","b","bajo","bastante","bien","breve","buen","buena","buenas","bueno","buenos","c","cada","casi","cerca","cierta","ciertas","cierto","ciertos","cinco","claro","comentó","como","con","conmigo","conocer","conseguimos","conseguir","considera","consideró","consigo","consigue","consiguen","consigues","contigo","contra","cosas","creo","cual","cuales","cualquier","cuando","cuanta","cuantas","cuanto","cuantos","cuatro","cuenta","cuál","cuáles","cuándo","cuánta","cuántas","cuánto","cuántos","cómo","d","da","dado","dan","dar","de","debajo","debe","deben","debido","decir","dejó","del","delante","demasiado","demás","dentro","deprisa","desde","despacio","despues","después","detras","detrás","dia","dias","dice","dicen","dicho","dieron","diferente","diferentes","dijeron","dijo","dio","donde","dos","durante","día","días","dónde","e","ejemplo","el","ella","ellas","ello","ellos","embargo","empleais","emplean","emplear","empleas","empleo","en","encima","encuentra","enfrente","enseguida","entonces","entre","era","eramos","eran","eras","eres","es","esa","esas","ese","eso","esos","esta","estaba","estaban","estado","estados","estais","estamos","estan","estar","estará","estas","este","esto","estos","estoy","estuvo","está","están","ex","excepto","existe","existen","explicó","expresó","f","fin","final","fue","fuera","fueron","fui","fuimos","g","general","gran","grandes","gueno","h","ha","haber","habia","habla","hablan","habrá","había","habían","hace","haceis","hacemos","hacen","hacer","hacerlo","haces","hacia","haciendo","hago","han","hasta","hay","haya","he","hecho","hemos","hicieron","hizo","horas","hoy","hubo","i","igual","incluso","indicó","informo","informó","intenta","intentais","intentamos","intentan","intentar","intentas","intento","ir","j","junto","k","l","la","lado","largo","las","le","lejos","les","llegó","lleva","llevar","lo","los","luego","lugar","m","mal","manera","manifestó","mas","mayor","me","mediante","medio","mejor","mencionó","menos","menudo","mi","mia","mias","mientras","mio","mios","mis","misma","mismas","mismo","mismos","modo","momento","mucha","muchas","mucho","muchos","muy","más","mí","mía","mías","mío","míos","n","nada","nadie","ni","ninguna","ningunas","ninguno","ningunos","ningún","no","nos","nosotras","nosotros","nuestra","nuestras","nuestro","nuestros","nueva","nuevas","nuevo","nuevos","nunca","o","ocho","os","otra","otras","otro","otros","p","pais","para","parece","parte","partir","pasada","pasado","paìs","peor","pero","pesar","poca","pocas","poco","pocos","podeis","podemos","poder","podria","podriais","podriamos","podrian","podrias","podrá","podrán","podría","podrían","poner","por","porque","posible","primer","primera","primero","primeros","principalmente","pronto","propia","propias","propio","propios","proximo","próximo","próximos","pudo","pueda","puede","pueden","puedo","pues","q","qeu","que","quedó","queremos","quien","quienes","quiere","quiza","quizas","quizá","quizás","quién","quiénes","qué","r","raras","realizado","realizar","realizó","repente","respecto","s","sabe","sabeis","sabemos","saben","saber","sabes","salvo","se","sea","sean","segun","segunda","segundo","según","seis","ser","sera","será","serán","sería","señaló","si","sido","siempre","siendo","siete","sigue","siguiente","sin","sino","sobre","sois","sola","solamente","solas","solo","solos","somos","son","soy","soyos","su","supuesto","sus","suya","suyas","suyo","sé","sí","sólo","t","tal","tambien","también","tampoco","tan","tanto","tarde","te","temprano","tendrá","tendrán","teneis","tenemos","tener","tenga","tengo","tenido","tenía","tercera","ti","tiempo","tiene","tienen","toda","todas","todavia","todavía","todo","todos","total","trabaja","trabajais","trabajamos","trabajan","trabajar","trabajas","trabajo","tras","trata","través","tres","tu","tus","tuvo","tuya","tuyas","tuyo","tuyos","tú","u","ultimo","un","una","unas","uno","unos","usa","usais","usamos","usan","usar","usas","uso","usted","ustedes","v","va","vais","valor","vamos","van","varias","varios","vaya","veces","ver","verdad","verdadera","verdadero","vez","vosotras","vosotros","voy","vuestra","vuestras","vuestro","vuestros","w","x","y","ya","yo","z","él","ésa","ésas","ése","ésos","ésta","éstas","éste","éstos","última","últimas","último","últimos"];var et$1=["aga","ei","et","ja","jah","kas","kui","kõik","ma","me","mida","midagi","mind","minu","mis","mu","mul","mulle","nad","nii","oled","olen","oli","oma","on","pole","sa","seda","see","selle","siin","siis","ta","te","ära"];var fi$1=["aiemmin","aika","aikaa","aikaan","aikaisemmin","aikaisin","aikajen","aikana","aikoina","aikoo","aikovat","aina","ainakaan","ainakin","ainoa","ainoat","aiomme","aion","aiotte","aist","aivan","ajan","alas","alemmas","alkuisin","alkuun","alla","alle","aloitamme","aloitan","aloitat","aloitatte","aloitattivat","aloitettava","aloitettevaksi","aloitettu","aloitimme","aloitin","aloitit","aloititte","aloittaa","aloittamatta","aloitti","aloittivat","alta","aluksi","alussa","alusta","annettavaksi","annetteva","annettu","ansiosta","antaa","antamatta","antoi","aoua","apu","asia","asiaa","asian","asiasta","asiat","asioiden","asioihin","asioita","asti","avuksi","avulla","avun","avutta","edelle","edelleen","edellä","edeltä","edemmäs","edes","edessä","edestä","ehkä","ei","eikä","eilen","eivät","eli","ellei","elleivät","ellemme","ellen","ellet","ellette","emme","en","enemmän","eniten","ennen","ensi","ensimmäinen","ensimmäiseksi","ensimmäisen","ensimmäisenä","ensimmäiset","ensimmäisiksi","ensimmäisinä","ensimmäisiä","ensimmäistä","ensin","entinen","entisen","entisiä","entisten","entistä","enää","eri","erittäin","erityisesti","eräiden","eräs","eräät","esi","esiin","esillä","esimerkiksi","et","eteen","etenkin","etessa","ette","ettei","että","haikki","halua","haluaa","haluamatta","haluamme","haluan","haluat","haluatte","haluavat","halunnut","halusi","halusimme","halusin","halusit","halusitte","halusivat","halutessa","haluton","he","hei","heidän","heihin","heille","heiltä","heissä","heistä","heitä","helposti","heti","hetkellä","hieman","hitaasti","hoikein","huolimatta","huomenna","hyvien","hyviin","hyviksi","hyville","hyviltä","hyvin","hyvinä","hyvissä","hyvistä","hyviä","hyvä","hyvät","hyvää","hän","häneen","hänelle","hänellä","häneltä","hänen","hänessä","hänestä","hänet","ihan","ilman","ilmeisesti","itse","itsensä","itseään","ja","jo","johon","joiden","joihin","joiksi","joilla","joille","joilta","joissa","joista","joita","joka","jokainen","jokin","joko","joku","jolla","jolle","jolloin","jolta","jompikumpi","jonka","jonkin","jonne","joo","jopa","jos","joskus","jossa","josta","jota","jotain","joten","jotenkin","jotenkuten","jotka","jotta","jouduimme","jouduin","jouduit","jouduitte","joudumme","joudun","joudutte","joukkoon","joukossa","joukosta","joutua","joutui","joutuivat","joutumaan","joutuu","joutuvat","juuri","jälkeen","jälleen","jää","kahdeksan","kahdeksannen","kahdella","kahdelle","kahdelta","kahden","kahdessa","kahdesta","kahta","kahteen","kai","kaiken","kaikille","kaikilta","kaikkea","kaikki","kaikkia","kaikkiaan","kaikkialla","kaikkialle","kaikkialta","kaikkien","kaikkin","kaksi","kannalta","kannattaa","kanssa","kanssaan","kanssamme","kanssani","kanssanne","kanssasi","kauan","kauemmas","kaukana","kautta","kehen","keiden","keihin","keiksi","keille","keillä","keiltä","keinä","keissä","keistä","keitten","keittä","keitä","keneen","keneksi","kenelle","kenellä","keneltä","kenen","kenenä","kenessä","kenestä","kenet","kenettä","kennessästä","kenties","kerran","kerta","kertaa","keskellä","kesken","keskimäärin","ketkä","ketä","kiitos","kohti","koko","kokonaan","kolmas","kolme","kolmen","kolmesti","koska","koskaan","kovin","kuin","kuinka","kuinkan","kuitenkaan","kuitenkin","kuka","kukaan","kukin","kukka","kumpainen","kumpainenkaan","kumpi","kumpikaan","kumpikin","kun","kuten","kuuden","kuusi","kuutta","kylliksi","kyllä","kymmenen","kyse","liian","liki","lisäksi","lisää","lla","luo","luona","lähekkäin","lähelle","lähellä","läheltä","lähemmäs","lähes","lähinnä","lähtien","läpi","mahdollisimman","mahdollista","me","meidän","meille","meillä","melkein","melko","menee","meneet","menemme","menen","menet","menette","menevät","meni","menimme","menin","menit","menivät","mennessä","mennyt","menossa","mihin","mikin","miksi","mikä","mikäli","mikään","milloin","milloinkan","minne","minun","minut","minä","missä","mistä","miten","mitä","mitään","moi","molemmat","mones","monesti","monet","moni","moniaalla","moniaalle","moniaalta","monta","muassa","muiden","muita","muka","mukaan","mukaansa","mukana","mutta","muu","muualla","muualle","muualta","muuanne","muulloin","muun","muut","muuta","muutama","muutaman","muuten","myöhemmin","myös","myöskin","myöskään","myötä","ne","neljä","neljän","neljää","niiden","niin","niistä","niitä","noin","nopeammin","nopeasti","nopeiten","nro","nuo","nyt","näiden","näin","näissä","näissähin","näissälle","näissältä","näissästä","näitä","nämä","ohi","oikea","oikealla","oikein","ole","olemme","olen","olet","olette","oleva","olevan","olevat","oli","olimme","olin","olisi","olisimme","olisin","olisit","olisitte","olisivat","olit","olitte","olivat","olla","olleet","olli","ollut","oma","omaa","omaan","omaksi","omalle","omalta","oman","omassa","omat","omia","omien","omiin","omiksi","omille","omilta","omissa","omista","on","onkin","onko","ovat","paikoittain","paitsi","pakosti","paljon","paremmin","parempi","parhaillaan","parhaiten","perusteella","peräti","pian","pieneen","pieneksi","pienelle","pienellä","pieneltä","pienempi","pienestä","pieni","pienin","puolesta","puolestaan","päälle","runsaasti","saakka","sadam","sama","samaa","samaan","samalla","samallalta","samallassa","samallasta","saman","samat","samoin","sata","sataa","satojen","se","seitsemän","sekä","sen","seuraavat","siellä","sieltä","siihen","siinä","siis","siitä","sijaan","siksi","silloin","sillä","silti","sinne","sinua","sinulle","sinulta","sinun","sinussa","sinusta","sinut","sinä","sisäkkäin","sisällä","siten","sitten","sitä","ssa","sta","suoraan","suuntaan","suuren","suuret","suuri","suuria","suurin","suurten","taa","taas","taemmas","tahansa","tai","takaa","takaisin","takana","takia","tapauksessa","tarpeeksi","tavalla","tavoitteena","te","tietysti","todella","toinen","toisaalla","toisaalle","toisaalta","toiseen","toiseksi","toisella","toiselle","toiselta","toisemme","toisen","toisensa","toisessa","toisesta","toista","toistaiseksi","toki","tosin","tuhannen","tuhat","tule","tulee","tulemme","tulen","tulet","tulette","tulevat","tulimme","tulin","tulisi","tulisimme","tulisin","tulisit","tulisitte","tulisivat","tulit","tulitte","tulivat","tulla","tulleet","tullut","tuntuu","tuo","tuolla","tuolloin","tuolta","tuonne","tuskin","tykö","tähän","tällä","tällöin","tämä","tämän","tänne","tänä","tänään","tässä","tästä","täten","tätä","täysin","täytyvät","täytyy","täällä","täältä","ulkopuolella","usea","useasti","useimmiten","usein","useita","uudeksi","uudelleen","uuden","uudet","uusi","uusia","uusien","uusinta","uuteen","uutta","vaan","vahemmän","vai","vaiheessa","vaikea","vaikean","vaikeat","vaikeilla","vaikeille","vaikeilta","vaikeissa","vaikeista","vaikka","vain","varmasti","varsin","varsinkin","varten","vasen","vasenmalla","vasta","vastaan","vastakkain","vastan","verran","vielä","vierekkäin","vieressä","vieri","viiden","viime","viimeinen","viimeisen","viimeksi","viisi","voi","voidaan","voimme","voin","voisi","voit","voitte","voivat","vuoden","vuoksi","vuosi","vuosien","vuosina","vuotta","vähemmän","vähintään","vähiten","vähän","välillä","yhdeksän","yhden","yhdessä","yhteen","yhteensä","yhteydessä","yhteyteen","yhtä","yhtäälle","yhtäällä","yhtäältä","yhtään","yhä","yksi","yksin","yksittäin","yleensä","ylemmäs","yli","ylös","ympäri","älköön","älä"];var fr$1=["a","abord","absolument","afin","ah","ai","aie","ailleurs","ainsi","ait","allaient","allo","allons","allô","alors","anterieur","anterieure","anterieures","apres","après","as","assez","attendu","au","aucun","aucune","aujourd","aujourd'hui","aupres","auquel","aura","auraient","aurait","auront","aussi","autre","autrefois","autrement","autres","autrui","aux","auxquelles","auxquels","avaient","avais","avait","avant","avec","avoir","avons","ayant","b","bah","bas","basee","bat","beau","beaucoup","bien","bigre","boum","bravo","brrr","c","car","ce","ceci","cela","celle","celle-ci","celle-là","celles","celles-ci","celles-là","celui","celui-ci","celui-là","cent","cependant","certain","certaine","certaines","certains","certes","ces","cet","cette","ceux","ceux-ci","ceux-là","chacun","chacune","chaque","cher","chers","chez","chiche","chut","chère","chères","ci","cinq","cinquantaine","cinquante","cinquantième","cinquième","clac","clic","combien","comme","comment","comparable","comparables","compris","concernant","contre","couic","crac","d","da","dans","de","debout","dedans","dehors","deja","delà","depuis","dernier","derniere","derriere","derrière","des","desormais","desquelles","desquels","dessous","dessus","deux","deuxième","deuxièmement","devant","devers","devra","different","differentes","differents","différent","différente","différentes","différents","dire","directe","directement","dit","dite","dits","divers","diverse","diverses","dix","dix-huit","dix-neuf","dix-sept","dixième","doit","doivent","donc","dont","douze","douzième","dring","du","duquel","durant","dès","désormais","e","effet","egale","egalement","egales","eh","elle","elle-même","elles","elles-mêmes","en","encore","enfin","entre","envers","environ","es","est","et","etant","etc","etre","eu","euh","eux","eux-mêmes","exactement","excepté","extenso","exterieur","f","fais","faisaient","faisant","fait","façon","feront","fi","flac","floc","font","g","gens","h","ha","hein","hem","hep","hi","ho","holà","hop","hormis","hors","hou","houp","hue","hui","huit","huitième","hum","hurrah","hé","hélas","i","il","ils","importe","j","je","jusqu","jusque","juste","k","l","la","laisser","laquelle","las","le","lequel","les","lesquelles","lesquels","leur","leurs","longtemps","lors","lorsque","lui","lui-meme","lui-même","là","lès","m","ma","maint","maintenant","mais","malgre","malgré","maximale","me","meme","memes","merci","mes","mien","mienne","miennes","miens","mille","mince","minimale","moi","moi-meme","moi-même","moindres","moins","mon","moyennant","multiple","multiples","même","mêmes","n","na","naturel","naturelle","naturelles","ne","neanmoins","necessaire","necessairement","neuf","neuvième","ni","nombreuses","nombreux","non","nos","notamment","notre","nous","nous-mêmes","nouveau","nul","néanmoins","nôtre","nôtres","o","oh","ohé","ollé","olé","on","ont","onze","onzième","ore","ou","ouf","ouias","oust","ouste","outre","ouvert","ouverte","ouverts","o|","où","p","paf","pan","par","parce","parfois","parle","parlent","parler","parmi","parseme","partant","particulier","particulière","particulièrement","pas","passé","pendant","pense","permet","personne","peu","peut","peuvent","peux","pff","pfft","pfut","pif","pire","plein","plouf","plus","plusieurs","plutôt","possessif","possessifs","possible","possibles","pouah","pour","pourquoi","pourrais","pourrait","pouvait","prealable","precisement","premier","première","premièrement","pres","probable","probante","procedant","proche","près","psitt","pu","puis","puisque","pur","pure","q","qu","quand","quant","quant-à-soi","quanta","quarante","quatorze","quatre","quatre-vingt","quatrième","quatrièmement","que","quel","quelconque","quelle","quelles","quelqu'un","quelque","quelques","quels","qui","quiconque","quinze","quoi","quoique","r","rare","rarement","rares","relative","relativement","remarquable","rend","rendre","restant","reste","restent","restrictif","retour","revoici","revoilà","rien","s","sa","sacrebleu","sait","sans","sapristi","sauf","se","sein","seize","selon","semblable","semblaient","semble","semblent","sent","sept","septième","sera","seraient","serait","seront","ses","seul","seule","seulement","si","sien","sienne","siennes","siens","sinon","six","sixième","soi","soi-même","soit","soixante","son","sont","sous","souvent","specifique","specifiques","speculatif","stop","strictement","subtiles","suffisant","suffisante","suffit","suis","suit","suivant","suivante","suivantes","suivants","suivre","superpose","sur","surtout","t","ta","tac","tant","tardive","te","tel","telle","tellement","telles","tels","tenant","tend","tenir","tente","tes","tic","tien","tienne","tiennes","tiens","toc","toi","toi-même","ton","touchant","toujours","tous","tout","toute","toutefois","toutes","treize","trente","tres","trois","troisième","troisièmement","trop","très","tsoin","tsouin","tu","té","u","un","une","unes","uniformement","unique","uniques","uns","v","va","vais","vas","vers","via","vif","vifs","vingt","vivat","vive","vives","vlan","voici","voilà","vont","vos","votre","vous","vous-mêmes","vu","vé","vôtre","vôtres","w","x","y","z","zut","à","â","ça","ès","étaient","étais","était","étant","été","être","ô"];var hr$1=["a","ako","ali","bi","bih","bila","bili","bilo","bio","bismo","biste","biti","bumo","da","do","duž","ga","hoće","hoćemo","hoćete","hoćeš","hoću","i","iako","ih","ili","iz","ja","je","jedna","jedne","jedno","jer","jesam","jesi","jesmo","jest","jeste","jesu","jim","joj","još","ju","kada","kako","kao","koja","koje","koji","kojima","koju","kroz","li","me","mene","meni","mi","mimo","moj","moja","moje","mu","na","nad","nakon","nam","nama","nas","naš","naša","naše","našeg","ne","nego","neka","neki","nekog","neku","nema","netko","neće","nećemo","nećete","nećeš","neću","nešto","ni","nije","nikoga","nikoje","nikoju","nisam","nisi","nismo","niste","nisu","njega","njegov","n