diff --git a/internal/check-packet-browser.mjs b/internal/check-packet-browser.mjs
index f0587495f..f408edd59 100644
--- a/internal/check-packet-browser.mjs
+++ b/internal/check-packet-browser.mjs
@@ -143,6 +143,7 @@ const r = await pg.evaluate(()=>({
// on a CORRECTLY translated packet (the same trap already fixed in
// check-packet-render).
mark5Len: (document.querySelector('.p4-passage')||{textContent:''}).textContent.trim().length,
+ heartItems: document.querySelectorAll('.p4-heart li').length,
// ★ THE SAME PACKET, EXPORTED THROUGH A DIFFERENT PATH, WAS HELD TO A WEAKER STANDARD.
// check-packet-render gained these over several ticks — the 12 points, the wheel's 12
// LABELS (not just its 12 segments), page 1's geography — each found by mutation, each
@@ -200,7 +201,7 @@ console.log(` prayer points : ${r.points} / 12`)
console.log(` wheel segments : ${r.wheel} (${r.wheelLabels}/12 labelled)`)
console.log(` map (page 1) : ${r.mapGeoPaths} geography paths`)
console.log(` printed artefact : ${(pdfBytes/1024/1024).toFixed(1)}MB, ${pdfFonts} embedded font(s)`)
-console.log(` Mark 5 in full : ${r.mark5Len} chars`) // ⚠ mark5Len, not mark5 — the latter is not a key on r and printed "undefined"
+console.log(` point 4's list : ${r.heartItems} readings`)
// beside a PASS for as long as this gate has existed. The ASSERTION below always read
// the right key, so the requirement was protected; only the display was blind.
console.log(` metacamp.org : ${r.metacamp}`)
@@ -252,11 +253,13 @@ if (pdfFonts === 0) {
}
if (r.metacamp !== 2) fails.push(`${r.metacamp} metacamp.org attributions, expected exactly 2`)
// Mark 5:1-20 in full, by LENGTH rather than an English proper noun.
-if (r.mark5Len < 1200) {
- fails.push(r.mark5Len === 0
- ? 'Mark 5:1-20 is NOT printed (no .p4-passage block)'
- : `Mark 5:1-20 looks truncated: ${r.mark5Len} chars`)
+// Point 4 prints THE HEAVENLY FATHER'S HEART (seven readings) in place of Mark 5:1-20 in full (2026-09-30).
+if (r.heartItems !== 7) {
+ fails.push(r.heartItems === 0
+ ? "point 4's reading list is NOT printed (no .p4-heart block)"
+ : `point 4's reading list prints ${r.heartItems} of 7 readings`)
}
+
// PAGE SIZE was printed and never compared. `@page{size:letter portrait}` is
// 612x792pt; a wrong PORTRAIT size (A4 is 595x842) is taller-than-wide too, so
// nothing else here would notice it.
diff --git a/internal/check-packet-render.mjs b/internal/check-packet-render.mjs
index 6c3bfce69..028d98a28 100644
--- a/internal/check-packet-render.mjs
+++ b/internal/check-packet-render.mjs
@@ -401,6 +401,10 @@ const r = await page.evaluate(() => {
// bug were locked together. Assert the STRUCTURE instead — the passage block exists
// and carries a full passage's worth of text — which holds in any language.
mark5Len: (document.querySelector('.p4-passage')?.textContent || '').trim().length,
+ // ★ POINT 4 NOW PRINTS A READING LIST, NOT THE PASSAGE (2026-09-30): THE HEAVENLY FATHER'S HEART, seven
+ // readings. Counted by STRUCTURE (the .p4-heart hook and its items), which holds in any language.
+ heartItems: document.querySelectorAll('.p4-heart li').length,
+ heartTitle: (document.querySelector('.p4-heart-h')?.textContent || '').trim().length,
// ⚠ COUNT THE POINTS. The sheet-sum invariant below already required a points PAGE —
// and a page with three points on it is still exactly one sheet, so a packet headed
// "12 Prayer Points" printed THREE and every number this gate asserted stayed correct.
@@ -532,11 +536,13 @@ if (r.rhythms !== r.rhythmsTotal) fails.push(`only ${r.rhythms}/${r.rhythmsTotal
// English passage is 2,141 chars; 1,200 is a floor that no truncation or placeholder
// survives while leaving room for languages that render the same text more compactly
// (zh is typically ~40% shorter in characters).
-const MARK5_MIN = 1200
-if (r.mark5Len < MARK5_MIN) {
- fails.push(r.mark5Len === 0
- ? 'Mark 5:1-20 is NOT printed in full (a requirement for point 4) — no .p4-passage block'
- : `Mark 5:1-20 looks truncated: ${r.mark5Len} chars, expected at least ${MARK5_MIN}`)
+// Point 4 prints THE HEAVENLY FATHER'S HEART: a heading and seven readings, each addressed in the reader's
+// own Bible. It replaced Mark 5:1-20 in full (2026-09-30), so the passage is no longer asserted; the list is.
+const HEART_ITEMS = 7
+if (r.heartItems !== HEART_ITEMS || !r.heartTitle) {
+ fails.push(r.heartItems === 0
+ ? "point 4's reading list is NOT printed (no .p4-heart block)"
+ : `point 4's reading list prints ${r.heartItems} of ${HEART_ITEMS} readings${r.heartTitle ? '' : ', and no heading'}`)
}
// THE PRODUCT IS NAMED FOR THIS NUMBER. The page header says "12 Prayer Points" in every
// locale, so 12 is a contract, not a preference — and the failure mode it guards is SILENT:
@@ -870,8 +876,7 @@ console.log(` funnel (page 2) : ${r.funnel
: 'absent' + (EXPECT_FUNNEL ? ' (REQUIRED — see FAIL above)' : ' (not required)')}`)
console.log(` prayer points : ${r.points} / ${POINTS_EXPECT}`)
console.log(` wheel segments : ${r.wheelSegs} (${r.wheelLabels}/${WHEEL_LABELS} labelled)`)
-console.log(` Mark 5 in full : ${r.mark5Len} chars`
- + `${scriptureIsEnglish ? ' ⚠ UNTRANSLATED (English fallback)' : ''}`)
+console.log(` point 4's list : ${r.heartItems} readings (the full-passage block: ${r.mark5Len} chars, retired)`)
console.log(` metacamp.org : ${r.metacamp}`)
console.log(` map (page 1) : ${r.mapFaults.length
? `${r.mapFaults.join('; ')}${expectMap ? '' : ` [declared deliberate: ${/\bnomap\b/.test(build) ? 'data-packet-build="' + build + '"' : 'PACKET_EXPECT_MAP=0'}]`}`
diff --git a/internal/check-poster-prints.mjs b/internal/check-poster-prints.mjs
index 5c44946f5..bf80b86b4 100644
--- a/internal/check-poster-prints.mjs
+++ b/internal/check-poster-prints.mjs
@@ -138,6 +138,8 @@ const r = await pg.evaluate(async ({ src, frame, packetRender, cardRender, qr, s
// and check-packet-browser. Assert the passage BLOCK and its length, which holds in
// any language.
out.packetMark5Len = (pdoc.querySelector('.p4-passage') || { textContent: '' }).textContent.trim().length
+ // Point 4 prints THE HEAVENLY FATHER'S HEART (seven readings) in place of Mark 5:1-20 in full (2026-09-30).
+ out.packetHeartItems = pdoc.querySelectorAll('.p4-heart li').length
// ── without a provider: must FAIL HONESTLY, not throw ────────────────────
const noProv = usePosterPrints({ label: (i) => i.label })
@@ -164,19 +166,18 @@ if (!/no records provider/i.test(r.noProvMsg)) {
if (r.packetSheets !== 4) fails.push(`the packet printed ${r.packetSheets} sheets, expected 4`)
if (r.packetCards !== 2) fails.push(`the packet printed ${r.packetCards} people cards, expected 2`)
if (r.packetWheel !== 12) fails.push(`the prayer wheel has ${r.packetWheel} segments, expected 12`)
-// The English passage is 2,141 chars; 1,200 is a floor no truncation or placeholder
-// survives, with room for languages that render the same text more compactly.
-if (r.packetMark5Len < 1200) {
- fails.push(r.packetMark5Len === 0
- ? 'the packet is missing Mark 5:1-20 in full (no .p4-passage block)'
- : `Mark 5:1-20 looks truncated: ${r.packetMark5Len} chars`)
+// Point 4 prints THE HEAVENLY FATHER'S HEART, seven readings, in place of Mark 5:1-20 in full (2026-09-30).
+if (r.packetHeartItems !== 7) {
+ fails.push(r.packetHeartItems === 0
+ ? "the packet is missing point 4's reading list (no .p4-heart block)"
+ : `point 4's reading list prints ${r.packetHeartItems} of 7 readings`)
}
if (errs.length) fails.push(`${errs.length} page error(s): ${errs[0]}`)
console.log(` list print : ${r.listRows} rows, checkbox=${r.listHasCheckbox}`)
console.log(` without provider : phase=${r.noProvPhase} "${r.noProvMsg.slice(0, 60)}"`)
console.log(` packet : ${r.packetSheets} sheets, ${r.packetCards} cards, `
- + `${r.packetWheel} wheel segments, Mark5=${r.packetMark5Len} chars`)
+ + `${r.packetWheel} wheel segments, point 4 list=${r.packetHeartItems}`)
console.log(` page errors : ${errs.length}`)
if (fails.length) {
diff --git a/library/packet/packet-render.js b/library/packet/packet-render.js
index 6adc5a9c9..31bee572f 100644
--- a/library/packet/packet-render.js
+++ b/library/packet/packet-render.js
@@ -85,6 +85,10 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de
// they are structure and scripture addresses, not prose.
return { ...en, ...Object.fromEntries(Object.entries(loc).filter(([, v]) => v !== undefined && v !== '')) };
});
+ // Point 4's reading list, merged the same way: English fixes the length and the scripture addresses,
+ // a locale supplies only the names (a partial block keeps the English name for the rest).
+ const LH = Array.isArray(L.point4_heart) ? L.point4_heart : [];
+ const HEART = (EN.point4_heart || []).map((en, i) => ({ ...en, who: (LH[i] && LH[i].who) || en.who }));
const fill = (s, vars) => String(s).replace(/\{(\w+)\}/g, (_, k) => (vars[k] ?? ''));
const flat = (v) => (v && typeof v === 'object' ? (v.label ?? v.value ?? '') : (v ?? ''));
@@ -1141,45 +1145,53 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de
const LIST_STYLE = { lightweight: worksheetPages };
// ── PAGE n+1: the 12 prayer points ──────────────────────────────────────────
+ // ★ LARGER TYPE (2026-09-30: the points read too small in print). The sheet prints at 0.544 (1500px →
+ // 8.5in), so the old 17px body was about 7pt on paper. Point 4's reading list below is far shorter than
+ // the full passage it replaces, and that room goes to the twelve: body 17 → 22px, heading 19 → 24px,
+ // references 14 → 17px, and 13 → 16px between points. class="points-body" is a TEST HOOK: the whole page must still fit ONE sheet
+ // in every locale (its scrollHeight within its clientHeight).
+ const PT = { head: 24, sub: 20, text: 22, refs: 17, gap: 16 };
function pointsPage() {
+ // ⚠ ISOLATE EACH REFERENCE FOR BIDI. Scripture references stay in English
+ // (a reader looks them up in their own Bible), so on an RTL page they are
+ // LTR runs inside an RTL paragraph. Without isolation the Unicode bidi
+ // algorithm reorders a run that STARTS WITH A DIGIT: measured on the Arabic
+ // page, "1 Peter 5:6–11" rendered as "Peter 5:6-11 1". dir="ltr" on each
+ // reference pins its internal order without affecting the line's direction.
+ // ★ THE BOOK NAME IS PROSE, THE ADDRESS IS NOT. refs stay canonical English in the data (one
+ // address, checkable against any Bible), and the BOOK is named in the packet's language at print
+ // time from its `books` table: a Chinese packet cited "Matthew 27:27", English in every locale.
+ // A localized name in a right-to-left script is isolated rtl, so the book reads on the right and
+ // the chapter:verse keeps its digit order; a Latin reference stays the ltr isolate described above.
+ const refSpan = (r) => {
+ const m = String(r).match(/^(.*?)\s+(\d[\d:–\-,; ]*)$/);
+ const book = m && (L.books || {})[m[1]];
+ const text = book ? `${book} ${m[2]}` : String(r);
+ const dir = book && RTL.has(lang) ? 'rtl' : 'ltr';
+ return `${esc(text)}`;
+ };
const rows = POINTS.map((p) => {
- // ⚠ ISOLATE EACH REFERENCE FOR BIDI. Scripture references stay in English
- // (a reader looks them up in their own Bible), so on an RTL page they are
- // LTR runs inside an RTL paragraph. Without isolation the Unicode bidi
- // algorithm reorders a run that STARTS WITH A DIGIT: measured on the Arabic
- // page, "1 Peter 5:6–11" rendered as "Peter 5:6-11 1". dir="ltr" on each
- // reference pins its internal order without affecting the line's direction.
- // ★ THE BOOK NAME IS PROSE, THE ADDRESS IS NOT. refs stay canonical English in the data (one
- // address, checkable against any Bible), and the BOOK is named in the packet's language at print
- // time from its `books` table: a Chinese packet cited "Matthew 27:27", English in every locale.
- // A localized name in a right-to-left script is isolated rtl, so the book reads on the right and
- // the chapter:verse keeps its digit order; a Latin reference stays the ltr isolate described above.
- const refs = (p.refs || [])
- .map((r) => {
- const m = String(r).match(/^(.*?)\s+(\d[\d:–\-,; ]*)$/);
- const book = m && (L.books || {})[m[1]];
- const text = book ? `${book} ${m[2]}` : String(r);
- const dir = book && RTL.has(lang) ? 'rtl' : 'ltr';
- return `${esc(text)}`;
- })
- .join(' · ');
- const sub = p.sub ? ` — ${esc(p.sub)}` : '';
- const passage = p.print_passage
- // Point 4 prints Mark 5:1-20 IN FULL, because prayer point four IS reading the word.
- // class="p4-passage" is a TEST HOOK, not styling — the block is styled inline.
- // Without it the only way to assert the passage rendered was to search for the
- // English word "Gadarenes", which would go red the moment this key is translated.
- ? `
- Language: ${Nt($.language||"Unknown")}
+ Language: ${zt(_.language||"Unknown")}
Family:
-
- ${Nt($.languageFamily||"Unknown")}
+
+ ${zt(_.languageFamily||"Unknown")}
- ${$.population?`
Population: ${Nt($.population)}
`:""}
- ${$.description?`
${Nt($.description)}
`:""}
+ ${_.population?`
Population: ${zt(_.population)}
`:""}
+ ${_.description?`
${zt(_.description)}
`:""}
- `}function u($){const p=$.iso_3166_1_alpha_3||"",h=$["name_"+((i==null?void 0:i.value)||"en")]||$.name_en||$.name||p,k=a(),L=p.toUpperCase(),S=k.filter(N=>{const A=(N.countryIso||N.country||"").toUpperCase();return A&&A===L}),G=S.length,W=S[0],q=(W==null?void 0:W.wagfRegionLabel)||(W==null?void 0:W.doxaRegionLabel)||(W==null?void 0:W.doxaRegion)||(W==null?void 0:W.wagfRegion)||"—",v=(W==null?void 0:W.wagfBlockLabel)||(W==null?void 0:W.wagfBlock)||"—";return`
+ `}function u(_){const p=_.iso_3166_1_alpha_3||"",f=_["name_"+((i==null?void 0:i.value)||"en")]||_.name_en||_.name||p,w=a(),A=p.toUpperCase(),P=w.filter(I=>{const S=(I.countryIso||I.country||"").toUpperCase();return S&&S===A}),G=P.length,W=P[0],q=(W==null?void 0:W.wagfRegionLabel)||(W==null?void 0:W.doxaRegionLabel)||(W==null?void 0:W.doxaRegion)||(W==null?void 0:W.wagfRegion)||"—",v=(W==null?void 0:W.wagfBlockLabel)||(W==null?void 0:W.wagfBlock)||"—";return`
- ${Nt(h)}
+ ${zt(f)}
- ${Nt(s("popup.country.wagfRegion"))}: ${Nt(q)}
+ ${zt(s("popup.country.wagfRegion"))}: ${zt(q)}
- ${Nt(s("popup.country.wagfBlock"))}: ${Nt(v)}
+ ${zt(s("popup.country.wagfBlock"))}: ${zt(v)}
- ${Nt(s("popup.country.country"))}: ${Nt(h)} (${Nt(p)})
+ ${zt(s("popup.country.country"))}: ${zt(f)} (${zt(p)})
- ${Nt(s("popup.country.uupgCount"))}: ${Nt(G)}
+ ${zt(s("popup.country.uupgCount"))}: ${zt(G)}
- `}function d($){const p=t();if(!p)return;const _=$||"language-family-pins";if(!p.getLayer(_))return;const h=k=>{try{const L=k.features[0],S=L.properties,G=L.geometry.coordinates.slice();for(;Math.abs(k.lngLat.lng-G[0])>180;)G[0]+=k.lngLat.lng>G[0]?360:-360;if(r&&r.legendMode!==void 0){r.selectPeopleGroup(L),r.isMobile&&r.legendState==="collapsed"&&r.setLegendState("open"),r.isMobile||window.dispatchEvent(new CustomEvent("dxm:openDesktopLegend",{detail:{mapId:o}}));return}new(gi(p)).Popup({maxWidth:"320px",className:"people-group-popup"}).setLngLat(G).setHTML(c(S)).addTo(p)}catch(L){console.error(` [${o}] Pin click handler error:`,L)}};p.on("click",_,h),l.value.push({event:"click",layer:_,handler:h})}function g(){const $=t();if(!$)return;const p="regions-fill";if(!$.getLayer(p))return;const _=h=>{const k=["language-family-pins","language-family-pins-hitbox","people-groups-pins"];for(const L of k)if($.getLayer(L)){const S=$.queryRenderedFeatures(h.point,{layers:[L]});if(S&&S.length>0)return}if(h.features&&h.features.length>0){const L=h.features[0].properties;new(gi($)).Popup().setLngLat(h.lngLat).setHTML(u(L)).addTo($)}};$.on("click",p,_),l.value.push({event:"click",layer:p,handler:_})}function x(){const $=t();if(!$)return;const p="clusters";if(!$.getLayer(p))return;const _=h=>{const k=$.queryRenderedFeatures(h.point,{layers:[p]});if(!k.length)return;const L=k[0].properties.cluster_id,S=k[0].source;$.getSource(S).getClusterExpansionZoom(L,(G,W)=>{G||$.easeTo({center:k[0].geometry.coordinates,zoom:W})})};$.on("click",p,_),l.value.push({event:"click",layer:p,handler:_})}function P($){const p=t();if(!p||!p.getLayer($))return;const _=()=>{p.getCanvas().style.cursor="pointer"},h=()=>{p.getCanvas().style.cursor=""};p.on("mouseenter",$,_),p.on("mouseleave",$,h),l.value.push({event:"mouseenter",layer:$,handler:_}),l.value.push({event:"mouseleave",layer:$,handler:h})}function y(){d("language-family-pins-hitbox"),P("language-family-pins"),P("language-family-pins-hitbox"),x(),P("clusters")}function f(){g(),P("regions-fill")}function b(){const $=t();$&&($.getLayer("language-family-pins")&&y(),$.getLayer("regions-fill")&&f(),$.getLayer("people-groups-pins")&&(d("people-groups-pins"),P("people-groups-pins")))}function m(){const $=t();if($){for(const{event:p,layer:_,handler:h}of l.value)try{$.off(p,_,h)}catch{}l.value=[]}}return{attachAllEventHandlers:b,attachLanguageFamilyEvents:y,attachRegionEvents:f,attachPinClickHandler:d,attachRegionClickHandler:g,attachClusterClickHandler:x,attachCursorHandlers:P,detachAllEventHandlers:m,generatePinPopupContent:c,generateRegionPopupContent:u,registeredHandlers:l}}const ht={Chamacoco:"Zamucoan",Ninam:"Yanomaman",Yagua:"Yaguan",Muinane:"Witotoan",Finnish:"Uralic","Hill Mari":"Uralic",Mansi:"Uralic","Meadow Mari":"Uralic","North Saami":"Uralic",Carabayo:"Unclassified",Kujarge:"Unclassified",Shabo:"Unclassified",Ainu:"Turkic",Kazakh:"Turkic","Khorasani Turkish":"Turkic",Kyrgyz:"Turkic","Northern Uzbek":"Turkic","South Azerbaijani":"Turkic",Turkish:"Turkic",Tuvan:"Turkic",Uyghur:"Turkic",Amundava:"Tupian",Araweté:"Tupian","Asurini of Xingú":"Tupian","Avá-Canoeiro":"Tupian",Awetí:"Tupian",Kamayurá:"Tupian",Karo:"Tupian",Morerebi:"Tupian",Tenharim:"Tupian","Uru-Eu-Wau-Wau":"Tupian","Uru-Pa-In":"Tupian",Wayampi:"Tupian","Zo’é":"Tupian",Evenki:"Tungusic",Xibe:"Tungusic",Carapana:"Tucanoan",Cubeo:"Tucanoan",Desano:"Tucanoan",Macuna:"Tucanoan",Piratapuyo:"Tucanoan",Siona:"Tucanoan",Siriano:"Tucanoan",Tucano:"Tucanoan",Tuyuca:"Tucanoan",Waimaha:"Tucanoan",Tay:"Trans-New Guinea",Adi:"Sino-Tibetan",Akha:"Sino-Tibetan","Amdo Tibetan":"Sino-Tibetan",Axi:"Sino-Tibetan",Biyo:"Sino-Tibetan","Boro (India)":"Sino-Tibetan",Brokkat:"Sino-Tibetan",Bugun:"Sino-Tibetan",Byangsi:"Sino-Tibetan","Central Lalo":"Sino-Tibetan","Central Tibetan":"Sino-Tibetan",Chak:"Sino-Tibetan",Chalikha:"Sino-Tibetan",Chaudangsi:"Sino-Tibetan",Chocangacakha:"Sino-Tibetan",Darlong:"Sino-Tibetan",Dhimal:"Sino-Tibetan","Digaro-Mishmi":"Sino-Tibetan",Dzalakha:"Sino-Tibetan","Eastern Nisu":"Sino-Tibetan",Ersu:"Sino-Tibetan",Gahri:"Sino-Tibetan",Gongduk:"Sino-Tibetan",Gyalsumdo:"Sino-Tibetan",Hani:"Sino-Tibetan","Idu-Mishmi":"Sino-Tibetan",Kaike:"Sino-Tibetan",Kanashi:"Sino-Tibetan",Katso:"Sino-Tibetan",Khamba:"Sino-Tibetan",Koireng:"Sino-Tibetan",Kucong:"Sino-Tibetan",Kurtokha:"Sino-Tibetan",Ladakhi:"Sino-Tibetan",Lakha:"Sino-Tibetan","Lang’e":"Sino-Tibetan",Lhokpu:"Sino-Tibetan",Lolopo:"Sino-Tibetan",Lunanakha:"Sino-Tibetan","Mandarin Chinese":"Sino-Tibetan",Meitei:"Sino-Tibetan","Miju-Mishmi":"Sino-Tibetan",Mpi:"Sino-Tibetan",Na:"Sino-Tibetan",Namuyi:"Sino-Tibetan",Narua:"Sino-Tibetan",Naxi:"Sino-Tibetan","Northern Muji":"Sino-Tibetan",Nuosu:"Sino-Tibetan",Nupbikha:"Sino-Tibetan",Nyenkha:"Sino-Tibetan",Olekha:"Sino-Tibetan",Pahari:"Sino-Tibetan",Pattani:"Sino-Tibetan","Phana’":"Sino-Tibetan",Phula:"Sino-Tibetan",Phunoi:"Sino-Tibetan",Puma:"Sino-Tibetan",Puroik:"Sino-Tibetan",Raji:"Sino-Tibetan",Rawat:"Sino-Tibetan",Sani:"Sino-Tibetan",Sherdukpen:"Sino-Tibetan",Sherpa:"Sino-Tibetan",Shuhi:"Sino-Tibetan",Sila:"Sino-Tibetan",Singpho:"Sino-Tibetan",Sunwar:"Sino-Tibetan","Tawang Monpa":"Sino-Tibetan",Tseku:"Sino-Tibetan",Tshangla:"Sino-Tibetan",Usoi:"Sino-Tibetan","Western Minyag":"Sino-Tibetan","Wusa Nasu":"Sino-Tibetan","Xiang Chinese":"Sino-Tibetan",Yakkha:"Sino-Tibetan","Youle Jinuo":"Sino-Tibetan","Yue Chinese":"Sino-Tibetan",Zakhring:"Sino-Tibetan","Afghan Sign Language":"Sign Language","Albanian Sign Language":"Sign Language","Algerian Sign Language":"Sign Language","American Sign Language":"Sign Language","Armenian Sign Language":"Sign Language","British Sign Language":"Sign Language","Bulgarian Sign Language":"Sign Language","Cambodian Sign Language":"Sign language","Cuban Sign Language":"Sign Language","Egyptian Sign Language":"Sign Language","Greek Sign Language":"Sign Language","Guinean Sign Language":"Sign Language","Hong Kong Sign Language":"Sign Language","Icelandic Sign Language":"Sign Language","Iranian Sign Language":"Sign Language","Israeli Sign Language":"Sign Language","Jamaican Sign Language":"Sign Language","Jordanian Sign Language":"Sign Language","Laos Sign Language":"Sign Language","Libyan Sign Language":"Sign Language","Maltese Sign Language":"Sign Language","Mauritian Sign Language":"Sign Language","Moroccan Sign Language":"Sign Language","Mozambican Sign Language":"Sign Language","Myanmar Sign Language":"Sign language","Natural Sign Language":"Sign Language","Pakistan Sign Language":"Sign Language","Papua New Guinean Sign Language":"Sign language","Russian Sign Language":"Sign Language","Saudi Arabian Sign Language":"Sign Language","Sign Language of the Netherlands":"Sign Language","Solomon Islands Sign Language":"Sign Language","Sri Lankan Sign Language":"Sign Language","Swedish Sign Language":"Sign Language","Turkish Sign Language":"Sign Language","Northern Conchucos Ancash Quechua":"Quechuan","Northern Pastaza Quichua":"Quechuan",Hupdë:"Puinavean",Amahuaca:"Panoan",Korubo:"Panoan",Sharanahua:"Panoan","Shipibo-Conibo":"Panoan",Yaminahua:"Panoan",Yawanawa:"Panoan",Afitti:"Nilo-Saharan",Assangori:"Nilo-Saharan","Beli (South Sudan)":"Nilo-Saharan",Berta:"Nilo-Saharan",Burun:"Nilo-Saharan","Dar Daju Daju":"Nilo-Saharan","Dar Fur Daju":"Nilo-Saharan","Dar Sila Daju":"Nilo-Saharan",Dazaga:"Nilo-Saharan","Dendi (Benin)":"Nilo-Saharan",Dilling:"Nilo-Saharan",Fur:"Nilo-Saharan",Gbaya:"Nilo-Saharan",Ghulfan:"Nilo-Saharan",Gwama:"Nilo-Saharan","Humburi Senni Songhay":"Nilo-Saharan",Jopadhola:"Nilo-Saharan",Kadaru:"Nilo-Saharan",Kanga:"Nilo-Saharan",Karanga:"Nilo-Saharan",Karko:"Nilo-Saharan",Kebu:"Nilo-Saharan",Keiga:"Nilo-Saharan",Keliko:"Nilo-Saharan",Kendeje:"Nilo-Saharan",Kibet:"Nilo-Saharan","Komo (Sudan)":"Nilo-Saharan",Korandje:"Nilo-Saharan",Kulfa:"Nilo-Saharan",Kwegu:"Nilo-Saharan",Laarim:"Nilo-Saharan",Logorik:"Nilo-Saharan",Majang:"Nilo-Saharan","Manga Kanuri":"Nilo-Saharan",Mango:"Nilo-Saharan",Mararit:"Nilo-Saharan",Marfa:"Nilo-Saharan",Midob:"Nilo-Saharan","Mo’da":"Nilo-Saharan",Morom:"Nilo-Saharan",Moru:"Nilo-Saharan",Naba:"Nilo-Saharan",Nara:"Nilo-Saharan",Njalgulgule:"Nilo-Saharan",Nuer:"Nilo-Saharan","Nyamusa-Molo":"Nilo-Saharan",Nyangatom:"Nilo-Saharan","Olu’bo":"Nilo-Saharan",Opo:"Nilo-Saharan",Päri:"Nilo-Saharan","Sara Kaba Naa":"Nilo-Saharan",Surbakhal:"Nilo-Saharan",Tadaksahak:"Nilo-Saharan","Tama (Chad)":"Nilo-Saharan",Temein:"Nilo-Saharan",Thuri:"Nilo-Saharan","Tirmaga-Chai Suri":"Nilo-Saharan",Toposa:"Nilo-Saharan",Tumtum:"Nilo-Saharan","Wali (Sudan)":"Nilo-Saharan","Yerwa Kanuri":"Nilo-Saharan",Yulu:"Nilo-Saharan",Zaghawa:"Nilo-Saharan","Adamawa Fulfulde":"Niger-Congo",Akaselem:"Niger-Congo","Amba (Uganda)":"Niger-Congo",Anii:"Niger-Congo",Baangi:"Niger-Congo",Badyara:"Niger-Congo","Bago-Kusuntu":"Niger-Congo",Bai:"Niger-Congo","Bainouk-Gunyaamolo":"Niger-Congo",Bamanankan:"Niger-Congo","Banda-Mbrès":"Niger-Congo",Bandial:"Niger-Congo",Bankagooma:"Niger-Congo","Belanda Viri":"Niger-Congo",Bemba:"Niger-Congo",Bolgo:"Niger-Congo","Bon Gula":"Niger-Congo",Bua:"Niger-Congo",Chichewa:"Niger-Congo","Chung (Cameroon)":"Niger-Congo","Ci Gbe":"Niger-Congo",Degema:"Niger-Congo",Dek:"Niger-Congo",Dhimba:"Niger-Congo",Dogoso:"Niger-Congo","East Limba":"Niger-Congo",Engenni:"Niger-Congo",Epie:"Niger-Congo",Éwé:"Niger-Congo",Fania:"Niger-Congo",Foodo:"Niger-Congo",Fwe:"Niger-Congo",Gciriku:"Niger-Congo",Gwa:"Niger-Congo",Herero:"Niger-Congo",Ibuoro:"Niger-Congo","Jenaama Bozo":"Niger-Congo",Jita:"Niger-Congo",Jula:"Niger-Congo",Kabiyè:"Niger-Congo",Kadung:"Niger-Congo",Kakabe:"Niger-Congo",Kalamsé:"Niger-Congo","Kami (Tanzania)":"Niger-Congo","Kango (Bas-Uélé District)":"Niger-Congo",Kasem:"Niger-Congo","Kelengaxo Bozo":"Niger-Congo",Khe:"Niger-Congo",Khisa:"Niger-Congo",Kim:"Niger-Congo",Kinyarwanda:"Niger-Congo",Kipfokomu:"Niger-Congo",Kitharaka:"Niger-Congo",Kiyombe:"Niger-Congo",Ko:"Niger-Congo",Koalib:"Niger-Congo",Koke:"Niger-Congo",Konongo:"Niger-Congo","Koro Nulu":"Niger-Congo","Koro Zuba":"Niger-Congo",Kuhane:"Niger-Congo",Kunda:"Niger-Congo",Kuranko:"Niger-Congo",Kuria:"Niger-Congo",Kwangali:"Niger-Congo",Lame:"Niger-Congo",Laru:"Niger-Congo",Lopa:"Niger-Congo","Makhuwa-Meetto":"Niger-Congo","Makhuwa-Shirima":"Niger-Congo","Malawi Nyiha":"Niger-Congo",Mandinka:"Niger-Congo",Mankanya:"Niger-Congo",Mansoanka:"Niger-Congo",Mbukushu:"Niger-Congo","Mende (Sierra Leone)":"Niger-Congo",Miyobe:"Niger-Congo",Mushungulu:"Niger-Congo","Mwali Comorian":"Niger-Congo","Mwera (Chimwera)":"Niger-Congo",Ndemli:"Niger-Congo",Ndengereko:"Niger-Congo",Ndumu:"Niger-Congo",Ndunga:"Niger-Congo","Ndzwani Comorian":"Niger-Congo",Ngile:"Niger-Congo","Northwest Gbaya":"Niger-Congo",Notre:"Niger-Congo",Nyamwanga:"Niger-Congo",Nyankore:"Niger-Congo",Nyengo:"Niger-Congo",Okpamheri:"Niger-Congo",Osatu:"Niger-Congo","Pana (Burkina Faso)":"Niger-Congo",Pulaar:"Niger-Congo",Pular:"Niger-Congo",Rufiji:"Niger-Congo","Sankaran Maninka":"Niger-Congo",Sapo:"Niger-Congo","Senara Sénoufo":"Niger-Congo",Shanga:"Niger-Congo",Sininkere:"Niger-Congo","Southern Ngbandi":"Niger-Congo",Swahili:"Niger-Congo","Syenara Sénoufo":"Niger-Congo",Tagbu:"Niger-Congo",Tagoi:"Niger-Congo",Tegali:"Niger-Congo",Tem:"Niger-Congo","Tiéyaxo Bozo":"Niger-Congo",Tiyaa:"Niger-Congo",Tocho:"Niger-Congo","Tonga (Zambia)":"Niger-Congo",Totela:"Niger-Congo","Toura (Côte d’Ivoire)":"Niger-Congo",Tswa:"Niger-Congo",Tumbuka:"Niger-Congo",Ukaan:"Niger-Congo",Uneme:"Niger-Congo",Vai:"Niger-Congo",Vute:"Niger-Congo",Waama:"Niger-Congo",Warnang:"Niger-Congo",Wolof:"Niger-Congo",Yao:"Niger-Congo",Yauma:"Niger-Congo",Yom:"Niger-Congo","Zan Gula":"Niger-Congo",Zande:"Niger-Congo",Zigula:"Niger-Congo",Mamaindê:"Nambikwara",Aghul:"Nakh-Daghestanian",Akhvakh:"Nakh-Daghestanian",Andi:"Nakh-Daghestanian",Avar:"Nakh-Daghestanian",Bagvalal:"Nakh-Daghestanian",Botlikh:"Nakh-Daghestanian",Chamalal:"Nakh-Daghestanian",Chechen:"Nakh-Daghestanian",Dargwa:"Nakh-Daghestanian",Kaitag:"Nakh-Daghestanian",Karata:"Nakh-Daghestanian",Khvarshi:"Nakh-Daghestanian",Tindi:"Nakh-Daghestanian",Pirahã:"Muran",Bonan:"Mongolic","China Buriat":"Mongolic",Daur:"Mongolic","Kalmyk-Oirat":"Mongolic","Peripheral Mongolian":"Mongolic","Russia Buriat":"Mongolic",Tagdal:"Mixed language",Wutunhua:"Mixed language","Ashéninka Perené":"Maipurean",Baniwa:"Maipurean",Cabiyarí:"Maipurean",Curripaco:"Maipurean","Enawené-Nawé":"Maipurean",Kanamarí:"Maipurean",Mehináku:"Maipurean","Pichis Ashéninka":"Maipurean",Waurá:"Maipurean",Bangime:"Language isolate",Burushaski:"Language isolate","Ai-Cham":"Kra-Dai",Aiton:"Kra-Dai","Dai Zhuang":"Kra-Dai",Duoluo:"Kra-Dai","Green Gelao":"Kra-Dai","Guibian Zhuang":"Kra-Dai",Hlai:"Kra-Dai",Jiamao:"Kra-Dai",Kang:"Kra-Dai",Khün:"Kra-Dai",Kuan:"Kra-Dai",Lachi:"Kra-Dai","Laha (Viet Nam)":"Kra-Dai",Lao:"Kra-Dai",Lü:"Kra-Dai","Mak (China)":"Kra-Dai","Northeastern Thai":"Kra-Dai","Northern Dong":"Kra-Dai","Northern Thai":"Kra-Dai",Nyaw:"Kra-Dai",Phake:"Kra-Dai","Phu Thai":"Kra-Dai",Qabiao:"Kra-Dai",Qau:"Kra-Dai","Qiubei Zhuang":"Kra-Dai",Shan:"Kra-Dai","Southern Dong":"Kra-Dai",Sui:"Kra-Dai","T’en":"Kra-Dai","Tai Daeng":"Kra-Dai","Tai Dam":"Kra-Dai","Tai Hongjin":"Kra-Dai","Tai Nüa":"Kra-Dai","Tai Ya":"Kra-Dai","Tai Yo":"Kra-Dai","Ts’ün-Lao":"Kra-Dai","Yang Zhuang":"Kra-Dai",Yerong:"Kra-Dai",Yong:"Kra-Dai",Yoy:"Kra-Dai",Khoekhoe:"Khoe-Kwadi",Karajá:"Karajá","Pará Gavião":"Jean",Suyá:"Jean",Japanese:"Japonic","Oki-No-Erabu":"Japonic","Toku-No-Shima":"Japonic",Yaeyama:"Japonic",Yoron:"Japonic","Adivasi Oriya":"Indo-European",Afrikaans:"Indo-European","Alviri-Vidari":"Indo-European",Angika:"Indo-European",Assamese:"Indo-European",Bagheli:"Indo-European",Bagri:"Indo-European",Bashkardi:"Indo-European",Bateri:"Indo-European",Bengali:"Indo-European",Bhojpuri:"Indo-European",Bhunjia:"Indo-European",Bilaspuri:"Indo-European",Bosnian:"Indo-European","Braj Bhasha":"Indo-European",Brokskat:"Indo-European",Bundeli:"Indo-European",Catalan:"Indo-European",Chambeali:"Indo-European",Chhattisgarhi:"Indo-European",Dameli:"Indo-European",Dari:"Indo-European",Dhundari:"Indo-European",Dogri:"Indo-European",Domari:"Indo-European",Dutch:"Indo-European","Eastern Balochi":"Indo-European","Eastern Panjabi":"Indo-European","Eastern Yiddish":"Indo-European",English:"Indo-European",French:"Indo-European",Gaddi:"Indo-European",Garhwali:"Indo-European",Gawri:"Indo-European",Gowro:"Indo-European",Gujarati:"Indo-European",Gujari:"Indo-European",Halbi:"Indo-European",Haroti:"Indo-European",Haryanvi:"Indo-European",Hindi:"Indo-European","Indus Kohistani":"Indo-European","Iranian Persian":"Indo-European",Ishkashimi:"Indo-European",Kacchi:"Indo-European",Kalkoti:"Indo-European",Kanauji:"Indo-European",Kangri:"Indo-European",Karingani:"Indo-European",Kashmiri:"Indo-European",Kati:"Indo-European",Khunsari:"Indo-European",Konkani:"Indo-European",Kudmali:"Indo-European",Kumaoni:"Indo-European",Kumzari:"Indo-European",Laki:"Indo-European",Lasi:"Indo-European",Luwati:"Indo-European",Magahi:"Indo-European",Maithili:"Indo-European",Maldivian:"Indo-European",Malvi:"Indo-European",Marathi:"Indo-European","Marwari (India)":"Indo-European",Mewari:"Indo-European",Munji:"Indo-European",Nepali:"Indo-European",Nimadi:"Indo-European","Northern Kurdish":"Indo-European",Odia:"Indo-European","Pahari-Potwari":"Indo-European",Palula:"Indo-European",Panchpargania:"Indo-European",Pangwali:"Indo-European",Parachi:"Indo-European",Portuguese:"Indo-European",Russian:"Indo-European",Sadri:"Indo-European",Sanglechi:"Indo-European",Sarikoli:"Indo-European",Savi:"Indo-European",Semnani:"Indo-European",Serbian:"Indo-European",Shabak:"Indo-European",Shahrudi:"Indo-European",Shekhawati:"Indo-European",Shina:"Indo-European",Shughni:"Indo-European",Shumashti:"Indo-European",Sindhi:"Indo-European",Sivandi:"Indo-European",Soi:"Indo-European","Southern Balochi":"Indo-European",Spanish:"Indo-European",Tajik:"Indo-European",Talysh:"Indo-European",Urdu:"Indo-European",Ushojo:"Indo-European",Vaghri:"Indo-European","Vlax Romani":"Indo-European",Wagdi:"Indo-European",Wakhi:"Indo-European",Waneci:"Indo-European","Western Balochi":"Indo-European",Yadgha:"Indo-European","Bu-Nao Bunu":"Hmong-Mien","Central Mashan Miao":"Hmong-Mien","Chuanqiandian Cluster Miao":"Hmong-Mien","Eastern Xiangxi Miao":"Hmong-Mien","Iu Mien":"Hmong-Mien","Luopohe Miao":"Hmong-Mien","Northern Qiandong Miao":"Hmong-Mien","Pa-Hng":"Hmong-Mien","Southwestern Huishui Miao":"Hmong-Mien","Wunai Bunu":"Hmong-Mien","Younuo Bunu":"Hmong-Mien",Amarakaeri:"Harákmbut",Huachipaeri:"Harákmbut",Cuiba:"Guajiboan",Macaguán:"Guajiboan",Tlicho:"Eyak-Athabaskan",Kannada:"Dravidian",Kodava:"Dravidian","Korra Koraga":"Dravidian","Kota (India)":"Dravidian",Kudiya:"Dravidian",Malapandaram:"Dravidian",Malayalam:"Dravidian",Muthuvan:"Dravidian",Ravula:"Dravidian",Sholaga:"Dravidian",Tamil:"Dravidian",Telugu:"Dravidian",Tulu:"Dravidian",Vishavan:"Dravidian","Andaman Hindi Creole":"Creole","Cocos Islands Malay":"Creole","Juba Arabic":"Creole",Nubi:"Creole",Barí:"Chibchan","Barro Negro Tunebo":"Chibchan","Western Tunebo":"Chibchan",Ikpeng:"Cariban","Kuikúro-Kalapálo":"Cariban",Pemon:"Cariban",Trió:"Cariban","Waimiri-Atroarí":"Cariban",Waiwai:"Cariban",Yukpa:"Cariban",Borôro:"Bororoan",Chachi:"Barbacoan","Abai Sungai":"Austronesian",Ambelau:"Austronesian",Asilulu:"Austronesian",Balaesang:"Austronesian","Batak Alas-Kluet":"Austronesian","Batak Dairi":"Austronesian","Batak Karo":"Austronesian",Bonerate:"Austronesian",Bonggi:"Austronesian",Brunei:"Austronesian","Brunei Bisaya":"Austronesian",Buol:"Austronesian","Central Malay":"Austronesian","Central Sama":"Austronesian","Coastal Konjo":"Austronesian",Dampelas:"Austronesian","Dibabawon Manobo":"Austronesian",Dondo:"Austronesian",Gane:"Austronesian","Geser-Gorom":"Austronesian","Highland Konjo":"Austronesian",Hitu:"Austronesian",Iban:"Austronesian",Indonesian:"Austronesian","Kadazan Dusun":"Austronesian",Kiput:"Austronesian",Komodo:"Austronesian",Kompane:"Austronesian",Lahanan:"Austronesian","Lampung Nyo":"Austronesian","Larike-Wakasihu":"Austronesian",Lola:"Austronesian",Luhu:"Austronesian",Malay:"Austronesian",Mariri:"Austronesian",Moronene:"Austronesian",Rukai:"Austronesian","Sabah Bisaya":"Austronesian","Seit-Kaitetu":"Austronesian",Sula:"Austronesian","Tae’":"Austronesian",Tajio:"Austronesian",Tomini:"Austronesian",Tutong:"Austronesian",Ujir:"Austronesian",Aheu:"Austro-Asiatic",Alak:"Austro-Asiatic",Bit:"Austro-Asiatic","Bo (Laos)":"Austro-Asiatic",Bondo:"Austro-Asiatic",Brao:"Austro-Asiatic",Bugan:"Austro-Asiatic",Chong:"Austro-Asiatic",Chut:"Austro-Asiatic",Danau:"Austro-Asiatic",Halang:"Austro-Asiatic","Halang Doan":"Austro-Asiatic",Hu:"Austro-Asiatic",Hung:"Austro-Asiatic",Ir:"Austro-Asiatic",Kensiu:"Austro-Asiatic",Khmu:"Austro-Asiatic",Khua:"Austro-Asiatic",Khuen:"Austro-Asiatic",Koda:"Austro-Asiatic","Kon Keu":"Austro-Asiatic",Kriang:"Austro-Asiatic",Kuay:"Austro-Asiatic",Laven:"Austro-Asiatic",Maleng:"Austro-Asiatic","Man Met":"Austro-Asiatic",Mang:"Austro-Asiatic",Minriq:"Austro-Asiatic",Mlabri:"Austro-Asiatic",Nguôn:"Austro-Asiatic",Nyaheun:"Austro-Asiatic",Nyahkur:"Austro-Asiatic","O’du":"Austro-Asiatic",Ong:"Austro-Asiatic",Oy:"Austro-Asiatic",Pacoh:"Austro-Asiatic","Phong-Kniang":"Austro-Asiatic",Prai:"Austro-Asiatic",Puoc:"Austro-Asiatic",Rengao:"Austro-Asiatic",Rmeet:"Austro-Asiatic","Rumai Palaung":"Austro-Asiatic",Sapuan:"Austro-Asiatic","Shwe Palaung":"Austro-Asiatic","So (Laos)":"Austro-Asiatic",Sou:"Austro-Asiatic","Tai Loi":"Austro-Asiatic",Talieng:"Austro-Asiatic",Tareng:"Austro-Asiatic",Tho:"Austro-Asiatic",U:"Austro-Asiatic","Upper Ta’oih":"Austro-Asiatic",Vietnamese:"Austro-Asiatic","Western Katu":"Austro-Asiatic",Suruahá:"Arauan",Jarawa:"Andamanese",Öñge:"Andamanese",Sentinel:"Andamanese",Afar:"Afro-Asiatic","Alaba-K’abeena":"Afro-Asiatic",Alagwa:"Afro-Asiatic",Ale:"Afro-Asiatic","Algerian Arabic":"Afro-Asiatic",Amharic:"Afro-Asiatic",Arbore:"Afro-Asiatic","Baharna Arabic":"Afro-Asiatic",Barein:"Afro-Asiatic",Bedawiyet:"Afro-Asiatic",Bidiyo:"Afro-Asiatic",Bilen:"Afro-Asiatic",Birgit:"Afro-Asiatic",Boor:"Afro-Asiatic","Borana-Arsi-Guji Oromo":"Afro-Asiatic",Buduma:"Afro-Asiatic","Central Atlas Tamazight":"Afro-Asiatic","Chadian Arabic":"Afro-Asiatic",Chenoua:"Afro-Asiatic",Ciwogai:"Afro-Asiatic",Daasanach:"Afro-Asiatic",Dabarre:"Afro-Asiatic",Dangaléat:"Afro-Asiatic",Deno:"Afro-Asiatic",Diri:"Afro-Asiatic",Duwai:"Afro-Asiatic","Eastern Egyptian Bedawi Arabic":"Afro-Asiatic","Eastern Oromo":"Afro-Asiatic",Garre:"Afro-Asiatic",Geruma:"Afro-Asiatic",Giiwo:"Afro-Asiatic",Gorowa:"Afro-Asiatic","Gulf Arabic":"Afro-Asiatic","Hadrami Arabic":"Afro-Asiatic",Harsusi:"Afro-Asiatic",Hassaniyya:"Afro-Asiatic",Hausa:"Afro-Asiatic",Hebrew:"Afro-Asiatic","Hijazi Arabic":"Afro-Asiatic",Hobyót:"Afro-Asiatic",Hozo:"Afro-Asiatic",Jiiddu:"Afro-Asiatic",Jimi:"Afro-Asiatic",Jina:"Afro-Asiatic","Jonkor Bourmataguil":"Afro-Asiatic","Judeo-Iraqi Arabic":"Afro-Asiatic","Judeo-Moroccan Arabic":"Afro-Asiatic",Kabalai:"Afro-Asiatic",Kajakse:"Afro-Asiatic",Kariya:"Afro-Asiatic","Karo (Ethiopia)":"Afro-Asiatic",Kutto:"Afro-Asiatic","Levantine Arabic":"Afro-Asiatic",Libido:"Afro-Asiatic","Libyan Arabic":"Afro-Asiatic","Lishana Deni":"Afro-Asiatic",Maaka:"Afro-Asiatic",Maay:"Afro-Asiatic",Majera:"Afro-Asiatic",Male:"Afro-Asiatic",Maslam:"Afro-Asiatic",Masmaje:"Afro-Asiatic",Mburku:"Afro-Asiatic",Mehri:"Afro-Asiatic","Mesopotamian Arabic":"Afro-Asiatic",Migaama:"Afro-Asiatic",Mogum:"Afro-Asiatic","Moroccan Arabic":"Afro-Asiatic",Mositacha:"Afro-Asiatic",Mubi:"Afro-Asiatic",Mukulu:"Afro-Asiatic",Nafusi:"Afro-Asiatic","Najdi Arabic":"Afro-Asiatic",Nyam:"Afro-Asiatic","Omani Arabic":"Afro-Asiatic","Pa’a":"Afro-Asiatic",Saba:"Afro-Asiatic",Saho:"Afro-Asiatic","Sanaani Arabic":"Afro-Asiatic",Seze:"Afro-Asiatic",Shehri:"Afro-Asiatic",Shekkacho:"Afro-Asiatic",Sheko:"Afro-Asiatic","Shihhi Arabic":"Afro-Asiatic",Siwi:"Afro-Asiatic",Sokoro:"Afro-Asiatic",Soqotri:"Afro-Asiatic","South Levantine Arabic":"Afro-Asiatic","Standard Arabic":"Afro-Asiatic","Sudanese Arabic":"Afro-Asiatic","Ta’izzi-Adeni Arabic":"Afro-Asiatic","Tahaggart Tamahaq":"Afro-Asiatic",Taznatit:"Afro-Asiatic",Tigré:"Afro-Asiatic",Toram:"Afro-Asiatic",Tsamai:"Afro-Asiatic",Tumzabt:"Afro-Asiatic",Tunni:"Afro-Asiatic",Waata:"Afro-Asiatic","West Central Oromo":"Afro-Asiatic",Xamtanga:"Afro-Asiatic",Zumbun:"Afro-Asiatic"},Bc=[">",["to-number",["get","peoplePraying"],0],0],Gc={0:.25,8:.4,14:.5},er={0:.1,8:.18,14:.22},tr={0:1.2,8:1.6,14:2},Qh=["interpolate",["linear"],["zoom"],0,["case",Bc,Gc[0],er[0]],8,["case",Bc,Gc[8],er[8]],14,["case",Bc,Gc[14],er[14]]],Sv=["interpolate",["linear"],["zoom"],0,tr[0],8,tr[8],14,tr[14]],ef=["==",["to-number",["get","peoplePraying"],0],0],Av={prayer:[ef],prayerProgress:[ef],engagement:[["all",["!=",["get","engagementStatus"],!0],["!=",["get","engagementStatus"],1]]],adoption:[["all",["!=",["get","adoptionStatus"],!0],["!=",["get","adoptionStatus"],1]]]};function Lv(e){const t=Av[e]||[];if(!t.length)return Sv;const o=t.length===1?t[0]:["any",...t];return["interpolate",["linear"],["zoom"],0,["case",o,er[0],tr[0]],8,["case",o,er[8],tr[8]],14,["case",o,er[14],tr[14]]]}const Cv=[[/ sign language$/i,"Sign Language"]];function Tv(e){if(!e||typeof e!="string")return null;const t=e.trim(),o=t.split(",").map(a=>a.trim()).filter(Boolean);if(o.length>=2){const a=[...o].reverse().join(" ");if(ht[a])return ht[a];if(o.length>=3){const r=[o[1],o[0]].join(" ");if(ht[r])return ht[r]}}if(ht[t])return ht[t];const n=t.replace(/\s*\(.*?\)\s*$/,"").trim();if(n!==t&&ht[n])return ht[n];for(const[a,r]of Cv)if(a.test(t))return r;return null}function Ev(e={}){const{getMap:t=()=>null,mapId:o="unknown",getLanguageFamilyColor:n=()=>"#999999",getNormalizedPeopleGroups:a=()=>[]}=e,r=()=>{const Q=t();return Q?lt(Q):null},s=Xh({getMap:r,mapId:o,getLanguageFamilyColor:n,getNormalizedPeopleGroups:a}),i=we({languageFamilyPins:!1,regions:!1,peopleGroups:!1,familyConnections:!1}),l=we({});function c(Q,Z="languageFamily"){const ue=r();if(!ue||!(Q!=null&&Q.length))return;const ke=vv(Z),M=Q.map(H=>{var ce,be,E,C,J,de,_e,$e,X,oe,xe,Te,We,nt,yt,Gt,Jt,kt,Pt;return{type:"Feature",properties:{uniqueId:H.id||H.uniqueId,slug:H.slug||((ce=H._normalized)==null?void 0:ce.slug)||"",rop3:H.rop3||H.peopleGroupId,peopleId3:H.peopleId3||"",name:H.name,language:H.language,languageFamily:H.languageFamily||((be=H._normalized)==null?void 0:be.languageFamily)||Tv(H.language)||"Unknown",affinityBlock:H.affinityBlock||H.affbloc||H.Affbloc||((E=H._normalized)==null?void 0:E.affinityBlock)||"Unknown",affinityBlockLabel:H.affinityBlockLabel||((C=H._normalized)==null?void 0:C.affinityBlockLabel)||"",cluster:H.cluster||((J=H._normalized)==null?void 0:J.cluster)||"",clusterLabel:H.clusterLabel||((de=H._normalized)==null?void 0:de.clusterLabel)||"",peopleGroup:H.peopleGroup||((_e=H._normalized)==null?void 0:_e.peopleGroup)||"",peopleGroupLabel:H.peopleGroupLabel||(($e=H._normalized)==null?void 0:$e.peopleGroupLabel)||"",doxaRegion:H.doxaRegion||((X=H._normalized)==null?void 0:X.doxaRegion)||"Unknown",wagfBlock:H.wagfBlock||((oe=H._normalized)==null?void 0:oe.wagfBlock)||"",wagfBlockLabel:H.wagfBlockLabel||((xe=H._normalized)==null?void 0:xe.wagfBlockLabel)||"",wagfRegionLabel:H.wagfRegionLabel||((Te=H._normalized)==null?void 0:Te.wagfRegionLabel)||"",country:H.country,countryIso:H.countryIso,countryIsoLabel:H.countryIsoLabel,countryName:H.countryName,religion:H.religion,religionCode:H.religionCode,religionLabel:H.religionLabel,religionName:H.religionName,population:H.population,status:H.status,description:H.description||"",imageUrl:H.imageUrl||"",peoplePraying:Number(H.peoplePraying??((We=H._normalized)==null?void 0:We.peoplePraying)??0),engagementStatus:H.engagementStatus===!0||H.engagementStatus===1||!1,adoptionStatus:H.adoptionStatus===!0||H.adoptionStatus===1||!1,bible:H.bible||((nt=H._normalized)==null?void 0:nt.bible)||"Not Available",jesusFilm:H.jesusFilm||((yt=H._normalized)==null?void 0:yt.jesusFilm)||"Not Available",radio:H.radio||((Gt=H._normalized)==null?void 0:Gt.radio)||"Not Available",gospel:H.gospel||((Jt=H._normalized)==null?void 0:Jt.gospel)||"Not Available",audio:H.audio||((kt=H._normalized)==null?void 0:kt.audio)||"Not Available",stories:H.stories||((Pt=H._normalized)==null?void 0:Pt.stories)||"Not Available",lng:parseFloat(H.longitude||H.lng)||0},geometry:{type:"Point",coordinates:[parseFloat(H.longitude||H.lng),parseFloat(H.latitude||H.lat)]}}}).filter(H=>!isNaN(H.geometry.coordinates[0])&&!isNaN(H.geometry.coordinates[1])),D=.04,B=H=>`${H.geometry.coordinates[0]},${H.geometry.coordinates[1]}`,V=new Map;for(const H of M){const ce=B(H);V.has(ce)||V.set(ce,[]),V.get(ce).push(H)}for(const H of V.values()){if(H.length<2)continue;const[ce,be]=H[0].geometry.coordinates,E=H.length;for(let C=0;C