From 312ec689bf0d5c490fdda9df4a0e13182548677a Mon Sep 17 00:00:00 2001 From: Jake Writer Date: Wed, 16 Sep 2026 22:08:33 -0600 Subject: [PATCH] feat(fonts): per-OS font model and fontconfig parity fonts.json is now generated from the bundle by scripts/gen-fonts-json.py (fc-scan + aliases + scan-time families, intersected with the per-OS manifest in scripts/data/font-manifests.json) so every reportable family is renderable; scripts/verify-fonts.py checks that invariant, the generics and the reject globs. font-groups.json lets the draw keep co-shipped families together. Linux fontconfig: stock metric aliases (Arial -> Liberation Sans, ...), 49-sansserif, urw-base35 and the non-Latin rule files in stock conf.d order, generics resolving like a stock Ubuntu (Noto Sans / Noto Serif / DejaVu Sans Mono / Z003), hintslight so advances are not pinned to whole pixels, and weak lists instead of strongly-bound generic pins so lang can promote a script face. Windows fontconfig: GDI substitution aliases, MS Shell Dlg 2, cursive/fantasy generics, duplicate-face rejects and Sitka / Segoe UI Variable optical-size families. NOTE: generated against a ~3.9 GB target font bundle that is not part of this change (one file is over GitHub's 100 MB limit); see docs/FONTS.md. Co-Authored-By: Claude Opus 5 (1M context) --- bundle/fontconfig/linux/fonts.conf | 2268 +++++++++++++++++++++++++- bundle/fontconfig/windows/fonts.conf | 711 ++++++++ docs/FONTS.md | 148 ++ pythonlib/camoufox/font-groups.json | 325 ++++ pythonlib/camoufox/fonts.json | 239 ++- scripts/data/font-manifests.json | 2125 ++++++++++++++++++++++++ scripts/gen-fonts-json.py | 281 ++++ scripts/verify-fonts.py | 322 ++++ 8 files changed, 6400 insertions(+), 19 deletions(-) create mode 100644 docs/FONTS.md create mode 100644 pythonlib/camoufox/font-groups.json create mode 100644 scripts/data/font-manifests.json create mode 100755 scripts/gen-fonts-json.py create mode 100755 scripts/verify-fonts.py diff --git a/bundle/fontconfig/linux/fonts.conf b/bundle/fontconfig/linux/fonts.conf index ae09edc..6ec7e8a 100644 --- a/bundle/fontconfig/linux/fonts.conf +++ b/bundle/fontconfig/linux/fonts.conf @@ -181,42 +181,1181 @@ PERFORMANCE OF THIS SOFTWARE. MONO - Cousine + DejaVu Sans Mono + + + Set substitutions for similar/metric-compatible families + + + + + + Set substitutions for non-Latin fonts + + + + + Nazli + serif + + + Lotoos + serif + + + Mitra + serif + + + Ferdosi + serif + + + Badr + serif + + + Zar + serif + + + Titr + serif + + + Jadid + serif + + + Kochi Mincho + serif + + + AR PL SungtiL GB + serif + + + AR PL Mingti2L Big5 + serif + + + MS 明朝 + serif + + + NanumMyeongjo + serif + + + UnBatang + serif + + + Baekmuk Batang + serif + + + MgOpen Canonica + serif + + + Sazanami Mincho + serif + + + AR PL ZenKai Uni + serif + + + ZYSong18030 + serif + + + FreeSerif + serif + + + SimSun + serif + + + + Arshia + sans-serif + + + Elham + sans-serif + + + Farnaz + sans-serif + + + Nasim + sans-serif + + + Sina + sans-serif + + + Roya + sans-serif + + + Koodak + sans-serif + + + Terafik + sans-serif + + + Kochi Gothic + sans-serif + + + AR PL KaitiM GB + sans-serif + + + AR PL KaitiM Big5 + sans-serif + + + MS ゴシック + sans-serif + + + NanumGothic + sans-serif + + + UnDotum + sans-serif + + + Baekmuk Dotum + sans-serif + + + MgOpen Moderna + sans-serif + + + MgOpen Modata + sans-serif + + + MgOpen Cosmetica + sans-serif + + + Sazanami Gothic + sans-serif + + + AR PL ShanHeiSun Uni + sans-serif + + + ZYSong18030 + sans-serif + + + FreeSans + sans-serif + + + + NSimSun + monospace + + + ZYSong18030 + monospace + + + NanumGothicCoding + monospace + + + FreeMono + monospace + + + + + Homa + fantasy + + + Kamran + fantasy + + + Fantezi + fantasy + + + Tabassom + fantasy + + + + + IranNastaliq + cursive + + + Nafees Nastaleeq + cursive + + + + + Noto Sans Arabic UI + system-ui + + + Noto Sans Bengali UI + system-ui + + + Noto Sans Devanagari UI + system-ui + + + Noto Sans Gujarati UI + system-ui + + + Noto Sans Gurmukhi UI + system-ui + + + Noto Sans Kannada UI + system-ui + + + Noto Sans Khmer UI + system-ui + + + Noto Sans Lao UI + system-ui + + + Noto Sans Malayalam UI + system-ui + + + Noto Sans Myanmar UI + system-ui + + + Noto Sans Oriya UI + system-ui + + + Noto Sans Sinhala UI + system-ui + + + Noto Sans Tamil UI + system-ui + + + Noto Sans Telugu UI + system-ui + + + Noto Sans Thai UI + system-ui + + + Leelawadee UI + system-ui + + + Nirmala UI + system-ui + + + Yu Gothic UI + system-ui + + + Meiryo UI + system-ui + + + MS UI Gothic + system-ui + + + Khmer UI + system-ui + + + Lao UI + system-ui + + + Microsoft JhengHei UI + system-ui + + + Microsoft YaHei UI + system-ui + + + + + + + + Helvetica LT Std + + Helvetica + + + + + Nimbus Sans L + + Helvetica + + + + + Nimbus Sans + + Helvetica + + + + + TeX Gyre Heros + + Helvetica + + + + + Nimbus Sans Narrow + + Helvetica Narrow + + + + + TeX Gyre Heros Cn + + Helvetica Narrow + + + + + Nimbus Roman No9 L + + Times + + + + + Nimbus Roman + + Times + + + + + TeX Gyre Termes + + Times + + + + + Courier Std + + Courier + + + + + Nimbus Mono L + + Courier + + + + + Nimbus Mono + + Courier + + + + + Nimbus Mono PS + + Courier + + + + + TeX Gyre Cursor + + Courier + + + + + Avant Garde + + ITC Avant Garde Gothic + + + + + URW Gothic L + + ITC Avant Garde Gothic + + + + + URW Gothic + + ITC Avant Garde Gothic + + + + + TeX Gyre Adventor + + ITC Avant Garde Gothic + + + + + Bookman + + ITC Bookman + + + + + URW Bookman L + + ITC Bookman + + + + + Bookman URW + + ITC Bookman + + + + + URW Bookman + + ITC Bookman + + + + + TeX Gyre Bonum + + ITC Bookman + + + + + Bookman Old Style + + ITC Bookman + + + + + Zapf Chancery + + ITC Zapf Chancery + + + + + URW Chancery L + + ITC Zapf Chancery + + + + + Chancery URW + + ITC Zapf Chancery + + + + + Z003 + + ITC Zapf Chancery + + + + + TeX Gyre Chorus + + ITC Zapf Chancery + + + + + URW Palladio L + + Palatino + + + + + Palladio URW + + Palatino + + + + + P052 + + Palatino + + + + + TeX Gyre Pagella + + Palatino + + + + + Palatino Linotype + + Palatino + + + + + Century Schoolbook L + + New Century Schoolbook + + + + + Century SchoolBook URW + + New Century Schoolbook + + + + + C059 + + New Century Schoolbook + + + + + TeX Gyre Schola + + New Century Schoolbook + + + + + Century Schoolbook + + New Century Schoolbook + + + + + + Arimo + + Arial + + + + + Liberation Sans + + Arial + + + + + Liberation Sans Narrow + + Arial Narrow + + + + + Albany + + Arial + + + + + Albany AMT + + Arial + + + + + Tinos + + Times New Roman + + + + + Liberation Serif + + Times New Roman + + + + + Thorndale + + Times New Roman + + + + + Thorndale AMT + + Times New Roman + + + + + Cousine + + Courier New + + + + + Liberation Mono + + Courier New + + + + + Cumberland + + Courier New + + + + + Cumberland AMT + + Courier New + + + + + Gelasio + + Georgia + + + + + Caladea + + Cambria + + + + + Carlito + + Calibri + + + + + SymbolNeu + + Symbol + + + + + + + + Helvetica + + Arial + + + + + Helvetica Narrow + + Arial Narrow + + + + + Times + + Times New Roman + + + + + Courier + + Courier New + + + + + + Arial + + Helvetica + + + + + Arial Narrow + + Helvetica Narrow + + + + + Times New Roman + + Times + + + + + Courier New + + Courier + + + + + + + + Helvetica + + Helvetica LT Std + + + + + Helvetica + + TeX Gyre Heros + + + + + Helvetica Narrow + + TeX Gyre Heros Cn + + + + + Times + + TeX Gyre Termes + + + + + Courier + + TeX Gyre Cursor + + + + + Courier + + Courier Std + + + + + ITC Avant Garde Gothic + + TeX Gyre Adventor + + + + + ITC Bookman + + Bookman Old Style + TeX Gyre Bonum + + + + + ITC Zapf Chancery + + TeX Gyre Chorus + + + + + Palatino + + Palatino Linotype + TeX Gyre Pagella + + + + + New Century Schoolbook + + Century Schoolbook + TeX Gyre Schola + + + + + + Arial + + Arimo + Liberation Sans + Albany + Albany AMT + + + + + Arial Narrow + + Liberation Sans Narrow + + + + + Times New Roman + + Tinos + Liberation Serif + Thorndale + Thorndale AMT + + + + + Courier New + + Cousine + Liberation Mono + Cumberland + Cumberland AMT + + + + + Georgia + + Gelasio + + + + + Cambria + + Caladea + + + + + Calibri + + Carlito + + + + + Symbol + + SymbolNeu + + + + + + + + + sans-serif + serif + monospace + sans-serif + + + + + Set preferable fonts for Latin + + serif + + Noto Serif + DejaVu Serif + Times New Roman + Thorndale AMT + Luxi Serif + Nimbus Roman No9 L + Nimbus Roman + Times + + + + sans-serif + + Noto Sans + DejaVu Sans + Verdana + Arial + Albany AMT + Luxi Sans + Nimbus Sans L + Nimbus Sans + Helvetica + Lucida Sans Unicode + BPG Glaho International + Tahoma + + + + monospace + + DejaVu Sans Mono + Noto Mono + Noto Sans Mono + Inconsolata + Andale Mono + Courier New + Cumberland AMT + Luxi Mono + Nimbus Mono L + Nimbus Mono + Nimbus Mono PS + Courier + + + + + fantasy + + Impact + Copperplate Gothic Std + Cooper Std + Bauhaus Std + + + + + cursive + + ITC Zapf Chancery Std + Zapfino + Comic Sans MS + + + + + system-ui + + Adwaita Sans + Cantarell + Noto Sans UI + Segoe UI + Segoe UI Historic + Segoe UI Symbol + + + + + - sans-serif + cursive - Arimo + Z003 - serif + fantasy - Tinos - - - - - monospace - - - Cousine + Noto Sans @@ -233,13 +1372,1110 @@ PERFORMANCE OF THIS SOFTWARE. - + true false true - hintfull + hintslight lcddefault none + + + + + + + serif + + URW Bookman + + + + + + URW Bookman + + serif + + + + + + URW Bookman + + ITC Bookman + + + + + + ITC Bookman + + URW Bookman + + + + + Bookman Old Style + + URW Bookman + + + + + TeX Gyre Bonum + + URW Bookman + + + + + + + serif + + C059 + + + + + + C059 + + serif + + + + + + C059 + + New Century Schoolbook + + + + + + New Century Schoolbook + + C059 + + + + + Century Schoolbook + + C059 + + + + + Century + + C059 + + + + + Tex Gyre Schola + + C059 + + + + + + + D050000L + + ITC Zapf Dingbats + + + + + + ITC Zapf Dingbats + + D050000L + + + + + ITC Zapf Dingbats Std + + D050000L + + + + + Zapf Dingbats + + D050000L + + + + + + + Century Schoolbook L + + C059 + + + + + Century SchoolBook URW + + C059 + + + + + Dingbats + + D050000L + + + + + Nimbus Mono + + Nimbus Mono PS + + + + + Nimbus Mono L + + Nimbus Mono PS + + + + + Nimbus Roman No9 L + + Nimbus Roman + + + + + Nimbus Sans L + + Nimbus Sans + + + + + + + Palladio URW + + P052 + + + + + URW Palladio L + + P052 + + + + + Standard Symbols L + + Standard Symbols PS + + + + + Bookman URW + + URW Bookman + + + + + URW Bookman L + + URW Bookman + + + + + URW Gothic L + + URW Gothic + + + + + Chancery URW + + Z003 + + + + + URW Chancery L + + Z003 + + + + + + + Courier + + Nimbus Mono + Nimbus Mono L + + + + + Helvetica + + Nimbus Sans L + + + + + ITC Avant Garde Gothic + + URW Gothic L + + + + + ITC Bookman + + Bookman URW + URW Bookman L + + + + + ITC Zapf Chancery + + Chancery URW + URW Chancery L + + + + + ITC Zapf Dingbats + + Dingbats + + + + + New Century Schoolbook + + Century Schoolbook L + Century SchoolBook URW + + + + + Palatino + + Palladio URW + URW Palladio L + + + + + Symbol + + Standard Symbols L + + + + + Times + + Nimbus Roman No9 L + + + + + + + sans-serif + + URW Gothic + + + + + + URW Gothic + + sans-serif + + + + + + URW Gothic + + ITC Avant Garde Gothic + + + + + + ITC Avant Garde Gothic + + URW Gothic + + + + + TeX Gyre Adventor + + URW Gothic + + + + + + + monospace + + Nimbus Mono PS + + + + + + Nimbus Mono PS + + monospace + + + + + + Nimbus Mono PS + + Courier + + + + + + Courier + + Nimbus Mono PS + + + + + TeX Gyre Cursor + + Nimbus Mono PS + + + + + + + serif + + Nimbus Roman + + + + + + Nimbus Roman + + serif + + + + + + Nimbus Roman + + Times + + + + + + Times + + Nimbus Roman + + + + + TeX Gyre Termes + + Nimbus Roman + + + + + + + sans-serif + + Nimbus Sans + + + + + sans-serif + + Nimbus Sans Narrow + + + + + + Nimbus Sans + + sans-serif + + + + + Nimbus Sans Narrow + + sans-serif + + + + + + Nimbus Sans + + Helvetica + + + + + Nimbus Sans Narrow + + Helvetica Narrow + + + + + + Helvetica + + Nimbus Sans + + + + + Helvetica Narrow + + Nimbus Sans Narrow + + + + + TeX Gyre Heros + + Nimbus Sans + + + + + TeX Gyre Heros Cn + + Nimbus Sans Narrow + + + + + + + serif + + P052 + + + + + + P052 + + serif + + + + + + P052 + + Palatino + + + + + + Palatino + + P052 + + + + + Palatino Linotype + + P052 + + + + + Tex Gyre Pagella + + P052 + + + + + + + serif + + Standard Symbols PS + + + + + + Standard Symbols PS + + serif + + + + + + Standard Symbols PS + + Symbol + + + + + + Symbol + + Standard Symbols PS + + + + + SymbolNeu + + Standard Symbols PS + + + + + Symbol Neu for Powerline + + Standard Symbols PS + + + + + + + cursive + + Z003 + + + + + + Z003 + + cursive + + + + + + Z003 + + ITC Zapf Chancery + + + + + + ITC Zapf Chancery + + Z003 + + + + + TeX Gyre Chorus + + Z003 + + + + + + + sans-serif + + Droid Sans Fallback + + + + + + Set preferable fonts for non-Latin + + serif + + Artsounk + BPG UTF8 M + Kinnari + Norasi + Frank Ruehl + Dror + JG LaoTimes + Saysettha Unicode + Pigiarniq + B Davat + B Compset + Kacst-Qr + Urdu Nastaliq Unicode + Raghindi + Mukti Narrow + padmaa + Hapax Berbère + MS Mincho + SimSun + PMingLiu + WenQuanYi Zen Hei + WenQuanYi Bitmap Song + AR PL ShanHeiSun Uni + AR PL New Sung + ZYSong18030 + HanyiSong + Hiragino Mincho ProN + Songti SC + Songti TC + SimSong + MgOpen Canonica + Sazanami Mincho + IPAMonaMincho + IPAMincho + Kochi Mincho + AR PL SungtiL GB + AR PL Mingti2L Big5 + AR PL Zenkai Uni + MS 明朝 + ZYSong18030 + NanumMyeongjo + UnBatang + Baekmuk Batang + AppleMyungjo + KacstQura + Frank Ruehl CLM + Lohit Bengali + Lohit Gujarati + Lohit Hindi + Lohit Marathi + Lohit Maithili + Lohit Kashmiri + Lohit Konkani + Lohit Nepali + Lohit Sindhi + Lohit Punjabi + Lohit Tamil + Rachana + Lohit Malayalam + Lohit Kannada + Lohit Telugu + Lohit Odia + LKLUG + + + + sans-serif + + Nachlieli + Lucida Sans Unicode + Yudit Unicode + Kerkis + ArmNet Helvetica + Artsounk + BPG UTF8 M + Waree + Loma + Garuda + Umpush + Saysettha Unicode + JG Lao Old Arial + GF Zemen Unicode + Pigiarniq + B Davat + B Compset + Kacst-Qr + Urdu Nastaliq Unicode + Raghindi + Mukti Narrow + padmaa + Hapax Berbère + MS Gothic + UmePlus P Gothic + Microsoft YaHei + Microsoft JhengHei + WenQuanYi Zen Hei + WenQuanYi Bitmap Song + AR PL ShanHeiSun Uni + AR PL New Sung + Hiragino Sans + PingFang SC + PingFang TC + PingFang HK + Hiragino Sans CNS + Hiragino Sans GB + MgOpen Moderna + MgOpen Modata + MgOpen Cosmetica + VL Gothic + IPAMonaGothic + IPAGothic + Sazanami Gothic + Kochi Gothic + AR PL KaitiM GB + AR PL KaitiM Big5 + AR PL ShanHeiSun Uni + AR PL SungtiL GB + AR PL Mingti2L Big5 + MS ゴシック + ZYSong18030 + NanumGothic + UnDotum + Baekmuk Dotum + Baekmuk Gulim + Apple SD Gothic Neo + KacstQura + Lohit Bengali + Lohit Gujarati + Lohit Hindi + Lohit Marathi + Lohit Maithili + Lohit Kashmiri + Lohit Konkani + Lohit Nepali + Lohit Sindhi + Lohit Punjabi + Lohit Tamil + Meera + Lohit Malayalam + Lohit Kannada + Lohit Telugu + Lohit Odia + LKLUG + + + + monospace + + Miriam Mono + VL Gothic + IPAMonaGothic + IPAGothic + Sazanami Gothic + Kochi Gothic + AR PL KaitiM GB + MS Gothic + UmePlus Gothic + NSimSun + MingLiu + AR PL ShanHeiSun Uni + AR PL New Sung Mono + HanyiSong + AR PL SungtiL GB + AR PL Mingti2L Big5 + ZYSong18030 + NanumGothicCoding + NanumGothic + UnDotum + Baekmuk Dotum + Baekmuk Gulim + TlwgTypo + TlwgTypist + TlwgTypewriter + TlwgMono + Hasida + GF Zemen Unicode + Hapax Berbère + Lohit Bengali + Lohit Gujarati + Lohit Hindi + Lohit Marathi + Lohit Maithili + Lohit Kashmiri + Lohit Konkani + Lohit Nepali + Lohit Sindhi + Lohit Punjabi + Lohit Tamil + Meera + Lohit Malayalam + Lohit Kannada + Lohit Telugu + Lohit Odia + LKLUG + + + + + system-ui + + Noto Sans Arabic UI + Noto Sans Bengali UI + Noto Sans Devanagari UI + Noto Sans Gujarati UI + Noto Sans Gurmukhi UI + Noto Sans Kannada UI + Noto Sans Khmer UI + Noto Sans Lao UI + Noto Sans Malayalam UI + Noto Sans Myanmar UI + Noto Sans Oriya UI + Noto Sans Sinhala UI + Noto Sans Tamil UI + Noto Sans Telugu UI + Noto Sans Thai UI + Leelawadee UI + Nirmala UI + Yu Gothic UI + Meiryo UI + MS UI Gothic + Khmer UI + Lao UI + Microsoft YaHei UI + Microsoft JhengHei UI + + + + + + + + ja + + + serif + + + Noto Serif CJK JP + + + + + + ko + + + serif + + + Noto Serif CJK KR + + + + + + zh-cn + + + serif + + + Noto Serif CJK SC + + + + + + zh-tw + + + serif + + + Noto Serif CJK TC + + + + + + zh-hk + + + serif + + + Noto Serif CJK HK + + + + + + ja + + + sans-serif + + + Noto Sans CJK JP + + + + + + ko + + + sans-serif + + + Noto Sans CJK KR + + + + + + zh-cn + + + sans-serif + + + Noto Sans CJK SC + + + + + + zh-tw + + + sans-serif + + + Noto Sans CJK TC + + + + + + zh-hk + + + sans-serif + + + Noto Sans CJK HK + + + + + + ja + + + monospace + + + Noto Sans Mono CJK JP + + + + + + ko + + + monospace + + + Noto Sans Mono CJK KR + + + + + + zh-cn + + + monospace + + + Noto Sans Mono CJK SC + + + + + + zh-tw + + + monospace + + + Noto Sans Mono CJK TC + + + + + + zh-hk + + + monospace + + + Noto Sans Mono CJK HK + + + + diff --git a/bundle/fontconfig/windows/fonts.conf b/bundle/fontconfig/windows/fonts.conf index 5cea99d..9ce1327 100644 --- a/bundle/fontconfig/windows/fonts.conf +++ b/bundle/fontconfig/windows/fonts.conf @@ -41,6 +41,126 @@ PERFORMANCE OF THIS SOFTWARE. fonts + + + + Courier + + + Courier New + + + + + Helvetica + + + Arial + + + + + MS Sans Serif + + + Microsoft Sans Serif + + + + + Small Fonts + + + Arial + + + + + MS Serif + + + Times New Roman + + + + + Roman + + + Times New Roman + + + + + Times + + + Times New Roman + + + + + Calibri Light + + + Calibri + + + + + Candara Light + + + Candara + + + + + Corbel Light + + + Corbel + + + + + Leelawadee UI Semilight + + + Leelawadee UI + + + + + Nirmala Text Semilight + + + Nirmala UI + + + + + Nirmala UI Semilight + + + Nirmala UI + + + @@ -77,6 +197,25 @@ PERFORMANCE OF THIS SOFTWARE. + + + + MS Shell Dlg 2 + + + Tahoma + + + + + + cursive + + + Comic Sans MS + + + + + fantasy + + + Arial + + @@ -250,4 +412,553 @@ PERFORMANCE OF THIS SOFTWARE. lcddefault none + + + + + */fonts/windows/0__Constani.ttf + */fonts/0__Constani.ttf + */fonts/windows/1005__MyriadPro-Bold.otf + */fonts/1005__MyriadPro-Bold.otf + */fonts/windows/1009__MyriadPro-It.otf + */fonts/1009__MyriadPro-It.otf + */fonts/windows/100__Georgia.ttf + */fonts/100__Georgia.ttf + */fonts/windows/1017__MyriadPro-BoldIt.otf + */fonts/1017__MyriadPro-BoldIt.otf + */fonts/windows/101__Tahoma.ttf + */fonts/101__Tahoma.ttf + */fonts/windows/1026__MyriadPro-Regular.otf + */fonts/1026__MyriadPro-Regular.otf + */fonts/windows/1039__SourceSans3-Bold.otf + */fonts/1039__SourceSans3-Bold.otf + */fonts/windows/1040__SourceSans3-It.otf + */fonts/1040__SourceSans3-It.otf + */fonts/windows/1044__SourceSans3-BoldIt.otf + */fonts/1044__SourceSans3-BoldIt.otf + */fonts/windows/1047__SourceSans3-Regular.otf + */fonts/1047__SourceSans3-Regular.otf + */fonts/windows/1051__MyriadPro-Bold.otf + */fonts/1051__MyriadPro-Bold.otf + */fonts/windows/1053__MyriadPro-Regular.otf + */fonts/1053__MyriadPro-Regular.otf + */fonts/windows/10__timesi.ttf + */fonts/10__timesi.ttf + */fonts/windows/11__Cambriab.ttf + */fonts/11__Cambriab.ttf + */fonts/windows/12__arialbd.ttf + */fonts/12__arialbd.ttf + */fonts/windows/14__Constan.ttf + */fonts/14__Constan.ttf + */fonts/windows/15__Consolab.ttf + */fonts/15__Consolab.ttf + */fonts/windows/18__Calibrib.ttf + */fonts/18__Calibrib.ttf + */fonts/windows/19__Consolai.ttf + */fonts/19__Consolai.ttf + */fonts/windows/1__Calibrii.ttf + */fonts/1__Calibrii.ttf + */fonts/windows/22__Calibri.ttf + */fonts/22__Calibri.ttf + */fonts/windows/23__Corbelz.ttf + */fonts/23__Corbelz.ttf + */fonts/windows/245__symbol.ttf + */fonts/245__symbol.ttf + */fonts/windows/24__timesbi.ttf + */fonts/24__timesbi.ttf + */fonts/windows/25__mmrtext.ttf + */fonts/25__mmrtext.ttf + */fonts/windows/26__ariblk.ttf + */fonts/26__ariblk.ttf + */fonts/windows/28__tahomabd.ttf + */fonts/28__tahomabd.ttf + */fonts/windows/295__wingding.ttf + */fonts/295__wingding.ttf + */fonts/windows/2__Cambria.ttc + */fonts/2__Cambria.ttc + */fonts/windows/30__seguihis.ttf + */fonts/30__seguihis.ttf + */fonts/windows/31__Corbel.ttf + */fonts/31__Corbel.ttf + */fonts/windows/329__webdings.ttf + */fonts/329__webdings.ttf + */fonts/windows/35__seguisym.ttf + */fonts/35__seguisym.ttf + */fonts/windows/36__times.ttf + */fonts/36__times.ttf + */fonts/windows/38__mmrtextb.ttf + */fonts/38__mmrtextb.ttf + */fonts/windows/3__calibril.ttf + */fonts/3__calibril.ttf + */fonts/windows/41__Constanb.ttf + */fonts/41__Constanb.ttf + */fonts/windows/42__Constanz.ttf + */fonts/42__Constanz.ttf + */fonts/windows/44__ariali.ttf + */fonts/44__ariali.ttf + */fonts/windows/45__Consola.ttf + */fonts/45__Consola.ttf + */fonts/windows/46__ntailu.ttf + */fonts/46__ntailu.ttf + */fonts/windows/47__arialbi.ttf + */fonts/47__arialbi.ttf + */fonts/windows/483__PTM55FT.ttf + */fonts/483__PTM55FT.ttf + */fonts/windows/49__msyi.ttf + */fonts/49__msyi.ttf + */fonts/windows/4__Corbeli.ttf + */fonts/4__Corbeli.ttf + */fonts/windows/50__Calibriz.ttf + */fonts/50__Calibriz.ttf + */fonts/windows/520__NotoNaskhArabic-Bold.ttf + */fonts/520__NotoNaskhArabic-Bold.ttf + */fonts/windows/52__himalaya.ttf + */fonts/52__himalaya.ttf + */fonts/windows/53__Corbelb.ttf + */fonts/53__Corbelb.ttf + */fonts/windows/56__tahoma.ttf + */fonts/56__tahoma.ttf + */fonts/windows/57__timesbd.ttf + */fonts/57__timesbd.ttf + */fonts/windows/583__Inconsolata-Expanded.ttf + */fonts/583__Inconsolata-Expanded.ttf + */fonts/windows/58__monbaiti.ttf + */fonts/58__monbaiti.ttf + */fonts/windows/5__calibrili.ttf + */fonts/5__calibrili.ttf + */fonts/windows/60__Cambriai.ttf + */fonts/60__Cambriai.ttf + */fonts/windows/611__Inconsolata-SemiCondensed.ttf + */fonts/611__Inconsolata-SemiCondensed.ttf + */fonts/windows/616__NotoKufiArabic-Bold.ttf + */fonts/616__NotoKufiArabic-Bold.ttf + */fonts/windows/626__PT_Serif-Web-BoldItalic.ttf + */fonts/626__PT_Serif-Web-BoldItalic.ttf + */fonts/windows/629__NotoSerifHebrew-Regular.ttf + */fonts/629__NotoSerifHebrew-Regular.ttf + */fonts/windows/62__Symbol.ttf + */fonts/62__Symbol.ttf + */fonts/windows/630__NotoSans-Regular.ttf + */fonts/630__NotoSans-Regular.ttf + */fonts/windows/637__NotoSansHebrew-Bold.ttf + */fonts/637__NotoSansHebrew-Bold.ttf + */fonts/windows/639__Inconsolata-SemiExpanded.ttf + */fonts/639__Inconsolata-SemiExpanded.ttf + */fonts/windows/63__Comic Sans MS Bold.ttf + */fonts/63__Comic Sans MS Bold.ttf + */fonts/windows/644__Inconsolata-Condensed.ttf + */fonts/644__Inconsolata-Condensed.ttf + */fonts/windows/65__Courier New Bold.ttf + */fonts/65__Courier New Bold.ttf + */fonts/windows/66__Trebuchet MS Italic.ttf + */fonts/66__Trebuchet MS Italic.ttf + */fonts/windows/674__Inconsolata-UltraExpanded.ttf + */fonts/674__Inconsolata-UltraExpanded.ttf + */fonts/windows/675__NotoSansGeorgian-Bold.ttf + */fonts/675__NotoSansGeorgian-Bold.ttf + */fonts/windows/679__Inconsolata[wdth,wght].ttf + */fonts/679__Inconsolata[wdth,wght].ttf + */fonts/windows/68__Arial Italic.ttf + */fonts/68__Arial Italic.ttf + */fonts/windows/690__NotoSansLao-Bold.ttf + */fonts/690__NotoSansLao-Bold.ttf + */fonts/windows/69__Tahoma Bold.ttf + */fonts/69__Tahoma Bold.ttf + */fonts/windows/6__Consolaz.ttf + */fonts/6__Consolaz.ttf + */fonts/windows/706__PT_Serif-Web-Italic.ttf + */fonts/706__PT_Serif-Web-Italic.ttf + */fonts/windows/70__Verdana Bold.ttf + */fonts/70__Verdana Bold.ttf + */fonts/windows/714__NotoSerifLao-Regular.ttf + */fonts/714__NotoSerifLao-Regular.ttf + */fonts/windows/71__Verdana.ttf + */fonts/71__Verdana.ttf + */fonts/windows/728__NotoSerif-Italic.ttf + */fonts/728__NotoSerif-Italic.ttf + */fonts/windows/729__SourceSerif4[opsz,wght].ttf + */fonts/729__SourceSerif4[opsz,wght].ttf + */fonts/windows/72__Georgia Italic.ttf + */fonts/72__Georgia Italic.ttf + */fonts/windows/73__Georgia Bold Italic.ttf + */fonts/73__Georgia Bold Italic.ttf + */fonts/windows/740__NotoSerifGeorgian-Bold.ttf + */fonts/740__NotoSerifGeorgian-Bold.ttf + */fonts/windows/745__NotoSerifArmenian-Regular.ttf + */fonts/745__NotoSerifArmenian-Regular.ttf + */fonts/windows/74__Arial Bold.ttf + */fonts/74__Arial Bold.ttf + */fonts/windows/75__Verdana Italic.ttf + */fonts/75__Verdana Italic.ttf + */fonts/windows/77__Georgia Bold.ttf + */fonts/77__Georgia Bold.ttf + */fonts/windows/788__Inconsolata-UltraCondensed.ttf + */fonts/788__Inconsolata-UltraCondensed.ttf + */fonts/windows/78__Courier New.ttf + */fonts/78__Courier New.ttf + */fonts/windows/798__NotoSansLisu-Regular.ttf + */fonts/798__NotoSansLisu-Regular.ttf + */fonts/windows/79__Trebuchet MS Bold.ttf + */fonts/79__Trebuchet MS Bold.ttf + */fonts/windows/803__SourceSerif4-Italic[opsz,wght].ttf + */fonts/803__SourceSerif4-Italic[opsz,wght].ttf + */fonts/windows/80__Webdings.ttf + */fonts/80__Webdings.ttf + */fonts/windows/819__Inconsolata-ExtraExpanded.ttf + */fonts/819__Inconsolata-ExtraExpanded.ttf + */fonts/windows/81__Impact.ttf + */fonts/81__Impact.ttf + */fonts/windows/825__PT_Serif-Web-Bold.ttf + */fonts/825__PT_Serif-Web-Bold.ttf + */fonts/windows/829__Inconsolata-Regular.ttf + */fonts/829__Inconsolata-Regular.ttf + */fonts/windows/82__Verdana Bold Italic.ttf + */fonts/82__Verdana Bold Italic.ttf + */fonts/windows/830__NotoSansArmenian-Bold.ttf + */fonts/830__NotoSansArmenian-Bold.ttf + */fonts/windows/832__Inconsolata-ExtraCondensed.ttf + */fonts/832__Inconsolata-ExtraCondensed.ttf + */fonts/windows/83__Comic Sans MS.ttf + */fonts/83__Comic Sans MS.ttf + */fonts/windows/84__Trebuchet MS.ttf + */fonts/84__Trebuchet MS.ttf + */fonts/windows/85__Times New Roman Bold.ttf + */fonts/85__Times New Roman Bold.ttf + */fonts/windows/86__Brush Script.ttf + */fonts/86__Brush Script.ttf + */fonts/windows/87__NotoSansLisu-Regular.ttf + */fonts/87__NotoSansLisu-Regular.ttf + */fonts/windows/88__Trebuchet MS Bold Italic.ttf + */fonts/88__Trebuchet MS Bold Italic.ttf + */fonts/windows/89__Courier New Bold Italic.ttf + */fonts/89__Courier New Bold Italic.ttf + */fonts/windows/8__arial.ttf + */fonts/8__arial.ttf + */fonts/windows/913__NotoSansArabic-Bold.ttf + */fonts/913__NotoSansArabic-Bold.ttf + */fonts/windows/918__PT_Serif-Web-Regular.ttf + */fonts/918__PT_Serif-Web-Regular.ttf + */fonts/windows/91__Wingdings.ttf + */fonts/91__Wingdings.ttf + */fonts/windows/92__Microsoft Sans Serif.ttf + */fonts/92__Microsoft Sans Serif.ttf + */fonts/windows/932__Comic Sans MS Bold.ttf + */fonts/932__Comic Sans MS Bold.ttf + */fonts/windows/933__PTSans.ttc + */fonts/933__PTSans.ttc + */fonts/windows/934__Courier New Bold.ttf + */fonts/934__Courier New Bold.ttf + */fonts/windows/935__Trebuchet MS Italic.ttf + */fonts/935__Trebuchet MS Italic.ttf + */fonts/windows/936__Arial Black.ttf + */fonts/936__Arial Black.ttf + */fonts/windows/937__Arial Italic.ttf + */fonts/937__Arial Italic.ttf + */fonts/windows/938__Tahoma Bold.ttf + */fonts/938__Tahoma Bold.ttf + */fonts/windows/939__Verdana Bold.ttf + */fonts/939__Verdana Bold.ttf + */fonts/windows/93__Times New Roman Italic.ttf + */fonts/93__Times New Roman Italic.ttf + */fonts/windows/940__Verdana.ttf + */fonts/940__Verdana.ttf + */fonts/windows/941__Georgia Italic.ttf + */fonts/941__Georgia Italic.ttf + */fonts/windows/942__Georgia Bold Italic.ttf + */fonts/942__Georgia Bold Italic.ttf + */fonts/windows/943__Arial Bold.ttf + */fonts/943__Arial Bold.ttf + */fonts/windows/944__Verdana Italic.ttf + */fonts/944__Verdana Italic.ttf + */fonts/windows/945__PTMono.ttc + */fonts/945__PTMono.ttc + */fonts/windows/946__Georgia Bold.ttf + */fonts/946__Georgia Bold.ttf + */fonts/windows/947__Courier New.ttf + */fonts/947__Courier New.ttf + */fonts/windows/948__Trebuchet MS Bold.ttf + */fonts/948__Trebuchet MS Bold.ttf + */fonts/windows/949__Webdings.ttf + */fonts/949__Webdings.ttf + */fonts/windows/94__Times New Roman.ttf + */fonts/94__Times New Roman.ttf + */fonts/windows/950__Impact.ttf + */fonts/950__Impact.ttf + */fonts/windows/951__Verdana Bold Italic.ttf + */fonts/951__Verdana Bold Italic.ttf + */fonts/windows/952__Comic Sans MS.ttf + */fonts/952__Comic Sans MS.ttf + */fonts/windows/953__Trebuchet MS.ttf + */fonts/953__Trebuchet MS.ttf + */fonts/windows/954__Times New Roman Bold.ttf + */fonts/954__Times New Roman Bold.ttf + */fonts/windows/955__Brush Script.ttf + */fonts/955__Brush Script.ttf + */fonts/windows/956__NotoSansLisu-Regular.ttf + */fonts/956__NotoSansLisu-Regular.ttf + */fonts/windows/957__Trebuchet MS Bold Italic.ttf + */fonts/957__Trebuchet MS Bold Italic.ttf + */fonts/windows/958__Courier New Bold Italic.ttf + */fonts/958__Courier New Bold Italic.ttf + */fonts/windows/95__Rockwell.ttc + */fonts/95__Rockwell.ttc + */fonts/windows/960__Wingdings.ttf + */fonts/960__Wingdings.ttf + */fonts/windows/961__Microsoft Sans Serif.ttf + */fonts/961__Microsoft Sans Serif.ttf + */fonts/windows/962__Times New Roman Italic.ttf + */fonts/962__Times New Roman Italic.ttf + */fonts/windows/963__Times New Roman.ttf + */fonts/963__Times New Roman.ttf + */fonts/windows/964__Rockwell.ttc + */fonts/964__Rockwell.ttc + */fonts/windows/965__Courier New Italic.ttf + */fonts/965__Courier New Italic.ttf + */fonts/windows/966__Arial Bold Italic.ttf + */fonts/966__Arial Bold Italic.ttf + */fonts/windows/967__Arial.ttf + */fonts/967__Arial.ttf + */fonts/windows/968__Times New Roman Bold Italic.ttf + */fonts/968__Times New Roman Bold Italic.ttf + */fonts/windows/969__Georgia.ttf + */fonts/969__Georgia.ttf + */fonts/windows/96__Courier New Italic.ttf + */fonts/96__Courier New Italic.ttf + */fonts/windows/970__Tahoma.ttf + */fonts/970__Tahoma.ttf + */fonts/windows/971__PTSerif.ttc + */fonts/971__PTSerif.ttc + */fonts/windows/972__MyriadPro-Bold.otf + */fonts/972__MyriadPro-Bold.otf + */fonts/windows/973__AdobeHebrew-BoldItalic.otf + */fonts/973__AdobeHebrew-BoldItalic.otf + */fonts/windows/974__AdobeDevanagari-Regular.otf + */fonts/974__AdobeDevanagari-Regular.otf + */fonts/windows/975__AdobeDevanagari-Italic.otf + */fonts/975__AdobeDevanagari-Italic.otf + */fonts/windows/976__MyriadPro-It.otf + */fonts/976__MyriadPro-It.otf + */fonts/windows/977__AdobeArabic-Bold.otf + */fonts/977__AdobeArabic-Bold.otf + */fonts/windows/978__AdobeDevanagari-Bold.otf + */fonts/978__AdobeDevanagari-Bold.otf + */fonts/windows/979__MinionPro-Regular.otf + */fonts/979__MinionPro-Regular.otf + */fonts/windows/97__Arial Bold Italic.ttf + */fonts/97__Arial Bold Italic.ttf + */fonts/windows/980__MinionPro-BoldIt.otf + */fonts/980__MinionPro-BoldIt.otf + */fonts/windows/981__AdobeArabic-Regular.otf + */fonts/981__AdobeArabic-Regular.otf + */fonts/windows/982__MinionPro-It.otf + */fonts/982__MinionPro-It.otf + */fonts/windows/983__AdobeHebrew-Italic.otf + */fonts/983__AdobeHebrew-Italic.otf + */fonts/windows/984__MyriadPro-BoldIt.otf + */fonts/984__MyriadPro-BoldIt.otf + */fonts/windows/985__AdobeThai-BoldItalic.otf + */fonts/985__AdobeThai-BoldItalic.otf + */fonts/windows/986__MinionPro-Bold.otf + */fonts/986__MinionPro-Bold.otf + */fonts/windows/987__AdobeHebrew-Regular.otf + */fonts/987__AdobeHebrew-Regular.otf + */fonts/windows/988__AdobeThai-Italic.otf + */fonts/988__AdobeThai-Italic.otf + */fonts/windows/989__AdobeDevanagari-BoldItalic.otf + */fonts/989__AdobeDevanagari-BoldItalic.otf + */fonts/windows/98__Arial.ttf + */fonts/98__Arial.ttf + */fonts/windows/990__AdobeHebrew-Bold.otf + */fonts/990__AdobeHebrew-Bold.otf + */fonts/windows/991__AdobeArabic-Italic.otf + */fonts/991__AdobeArabic-Italic.otf + */fonts/windows/992__AdobeThai-Regular.otf + */fonts/992__AdobeThai-Regular.otf + */fonts/windows/993__MyriadPro-Regular.otf + */fonts/993__MyriadPro-Regular.otf + */fonts/windows/994__AdobeArabic-BoldItalic.otf + */fonts/994__AdobeArabic-BoldItalic.otf + */fonts/windows/995__AdobeThai-Bold.otf + */fonts/995__AdobeThai-Bold.otf + */fonts/windows/99__Times New Roman Bold Italic.ttf + */fonts/99__Times New Roman Bold Italic.ttf + */fonts/windows/9__Cambriaz.ttf + */fonts/9__Cambriaz.ttf + */fonts/windows/Adobe_Devanagari-gidinject.ttf + */fonts/Adobe_Devanagari-gidinject.ttf + */fonts/windows/Amiri-gidinject.ttf + */fonts/Amiri-gidinject.ttf + */fonts/windows/Arial-gidinject.ttf + */fonts/Arial-gidinject.ttf + */fonts/windows/Bodoni_MT-gid2inject.ttf + */fonts/Bodoni_MT-gid2inject.ttf + */fonts/windows/Bodoni_MT-gidinject.ttf + */fonts/Bodoni_MT-gidinject.ttf + */fonts/windows/Calibri-gid2inject.ttf + */fonts/Calibri-gid2inject.ttf + */fonts/windows/Calibri-gidinject.ttf + */fonts/Calibri-gidinject.ttf + */fonts/windows/Cambria-gidinject.ttf + */fonts/Cambria-gidinject.ttf + */fonts/windows/Cambria_Math-gidinject.ttf + */fonts/Cambria_Math-gidinject.ttf + */fonts/windows/Candara-gidinject.ttf + */fonts/Candara-gidinject.ttf + */fonts/windows/Cascadia_Code-gidinject.ttf + */fonts/Cascadia_Code-gidinject.ttf + */fonts/windows/Consolas-gidinject.ttf + */fonts/Consolas-gidinject.ttf + */fonts/windows/Constantia-gidinject.ttf + */fonts/Constantia-gidinject.ttf + */fonts/windows/Corbel-gidinject.ttf + */fonts/Corbel-gidinject.ttf + */fonts/windows/Courier_New-gidinject.ttf + */fonts/Courier_New-gidinject.ttf + */fonts/windows/DejaVu_Sans-gid3inject.ttf + */fonts/DejaVu_Sans-gid3inject.ttf + */fonts/windows/Fira_Code-gid3inject.ttf + */fonts/Fira_Code-gid3inject.ttf + */fonts/windows/Gabriola-gid3inject.ttf + */fonts/Gabriola-gid3inject.ttf + */fonts/windows/Gentium_Basic-gid3inject.ttf + */fonts/Gentium_Basic-gid3inject.ttf + */fonts/windows/Gentium_Book_Basic-gid3inject.ttf + */fonts/Gentium_Book_Basic-gid3inject.ttf + */fonts/windows/Georgia-gid3inject.ttf + */fonts/Georgia-gid3inject.ttf + */fonts/windows/Iosevka-gid3inject.ttf + */fonts/Iosevka-gid3inject.ttf + */fonts/windows/Leelawadee_UI-gid3inject.ttf + */fonts/Leelawadee_UI-gid3inject.ttf + */fonts/windows/Malgun_Gothic-gid3inject.ttf + */fonts/Malgun_Gothic-gid3inject.ttf + */fonts/windows/Microsoft_JhengHei-gid3inject.ttf + */fonts/Microsoft_JhengHei-gid3inject.ttf + */fonts/windows/Microsoft_JhengHei_UI-gid3inject.ttf + */fonts/Microsoft_JhengHei_UI-gid3inject.ttf + */fonts/windows/Microsoft_Sans_Serif-gid3inject.ttf + */fonts/Microsoft_Sans_Serif-gid3inject.ttf + */fonts/windows/Microsoft_YaHei-gid3inject.ttf + */fonts/Microsoft_YaHei-gid3inject.ttf + */fonts/windows/Microsoft_YaHei_UI-gid3inject.ttf + */fonts/Microsoft_YaHei_UI-gid3inject.ttf + */fonts/windows/MingLiU_ExtB-gid3inject.ttf + */fonts/MingLiU_ExtB-gid3inject.ttf + */fonts/windows/MingLiU_HKSCS_ExtB-gid3inject.ttf + */fonts/MingLiU_HKSCS_ExtB-gid3inject.ttf + */fonts/windows/Montserrat-gid3inject.ttf + */fonts/Montserrat-gid3inject.ttf + */fonts/windows/Myanmar_Text-gid3inject.ttf + */fonts/Myanmar_Text-gid3inject.ttf + */fonts/windows/Myriad_Pro-gid3inject.ttf + */fonts/Myriad_Pro-gid3inject.ttf + */fonts/windows/Nirmala_UI-gid3inject.ttf + */fonts/Nirmala_UI-gid3inject.ttf + */fonts/windows/Noto_Kufi_Arabic-gid3inject.ttf + */fonts/Noto_Kufi_Arabic-gid3inject.ttf + */fonts/windows/Noto_Naskh_Arabic-gid3inject.ttf + */fonts/Noto_Naskh_Arabic-gid3inject.ttf + */fonts/windows/Noto_Sans-gid3inject.ttf + */fonts/Noto_Sans-gid3inject.ttf + */fonts/windows/Noto_Sans_Arabic-gid3inject.ttf + */fonts/Noto_Sans_Arabic-gid3inject.ttf + */fonts/windows/Noto_Sans_Lao-gid3inject.ttf + */fonts/Noto_Sans_Lao-gid3inject.ttf + */fonts/windows/Noto_Serif-gid3inject.ttf + */fonts/Noto_Serif-gid3inject.ttf + */fonts/windows/Noto_Serif_Hebrew-gid3inject.ttf + */fonts/Noto_Serif_Hebrew-gid3inject.ttf + */fonts/windows/Noto_Serif_Lao-gid3inject.ttf + */fonts/Noto_Serif_Lao-gid3inject.ttf + */fonts/windows/PMingLiU_ExtB-gid3inject.ttf + */fonts/PMingLiU_ExtB-gid3inject.ttf + */fonts/windows/PT_Mono-gid3inject.ttf + */fonts/PT_Mono-gid3inject.ttf + */fonts/windows/Quicksand-gid3inject.ttf + */fonts/Quicksand-gid3inject.ttf + */fonts/windows/Reem_Kufi-gid3inject.ttf + */fonts/Reem_Kufi-gid3inject.ttf + */fonts/windows/Rubik-gid3inject.ttf + */fonts/Rubik-gid3inject.ttf + */fonts/windows/Sans_Serif_Collection-gid3inject.ttf + */fonts/Sans_Serif_Collection-gid3inject.ttf + */fonts/windows/Scheherazade-gid3inject.ttf + */fonts/Scheherazade-gid3inject.ttf + */fonts/windows/Segoe_UI-gid3inject.ttf + */fonts/Segoe_UI-gid3inject.ttf + */fonts/windows/Segoe_UI_Emoji-gidinject.ttf + */fonts/Segoe_UI_Emoji-gidinject.ttf + */fonts/windows/Segoe_UI_Historic-gid3inject.ttf + */fonts/Segoe_UI_Historic-gid3inject.ttf + */fonts/windows/Sitka-gid3inject.ttf + */fonts/Sitka-gid3inject.ttf + */fonts/windows/Source_Code_Pro-gid3inject.ttf + */fonts/Source_Code_Pro-gid3inject.ttf + */fonts/windows/Source_Sans_3-gid3inject.ttf + */fonts/Source_Sans_3-gid3inject.ttf + */fonts/windows/Source_Serif_4-gid3inject.ttf + */fonts/Source_Serif_4-gid3inject.ttf + */fonts/windows/Tahoma-gid3inject.ttf + */fonts/Tahoma-gid3inject.ttf + */fonts/windows/Times_New_Roman-gid3inject.ttf + */fonts/Times_New_Roman-gid3inject.ttf + + + + + + + + Sitka + Sitka Small + Sitka Subheading + Sitka Heading + Sitka Display + Sitka Banner + + + Segoe UI Variable + Segoe UI Variable Small + Segoe UI Variable Text + Segoe UI Variable Display + + + diff --git a/docs/FONTS.md b/docs/FONTS.md new file mode 100644 index 0000000..0e0deb4 --- /dev/null +++ b/docs/FONTS.md @@ -0,0 +1,148 @@ +# Bundled fonts: what ships, what is reported, how to verify + +Camoufox ships one font bundle per spoofed OS (`bundle/fonts/{linux,windows,macos}`) +and a fontconfig per OS (`bundle/fontconfig//fonts.conf`). The font model in +`pythonlib/camoufox` (`fonts.json`, the `_ESSENTIAL_FONTS_*` / `_BASE_VARIANT_FONTS_*` +/ `_*_MARKER_FONTS` constants, `font-groups.json`) and the fontconfig files are +generated against a larger bundle than the one currently in git: + +| | current git bundle (files / families) | target bundle (files / families) | size | reportable (`fonts.json`) | +|--------|----------------------------------------|----------------------------------|-------|---------------------------| +| linux | 143 / 134 | 863 / 600 | 1.0 GB | 342 (was 134) | +| windows| 144 / 106 | 1074 / 541 | 1.3 GB | 339 (was 107) | +| macos | 355 / 508 | 1127 / 888 | 1.8 GB | 610 (was 574) | + +The target bundle is ~3.9 GB and contains a file over GitHub's 100 MB limit +(`Apple Color Emoji.ttc`, 183 MiB), so it is delivered separately from the code; +until it is in place, `scripts/verify-fonts.py` reports the names the current +bundle cannot render. + +"Families" = what `fc-scan` publishes for the dir plus the scan-time, alias and +browser-shipped names below; "reportable" = the per-OS list in +`pythonlib/camoufox/fonts.json`. + +## The invariant + +Every family the launcher may **report** for an OS must be one the packaged +browser can **render** under that OS's bundled fontconfig. The report side is +`fonts.json[os]` plus the constants in `pythonlib/camoufox/fingerprints.py` +(`_ESSENTIAL_FONTS_*`, `_BASE_VARIANT_FONTS_*`, `_*_MARKER_FONTS`); the render +side is what `fc-list` publishes under a runtime copy of `fonts.conf` (which +`utils._generate_fontconfig` produces by rewriting `fonts` +to the absolute package `fonts/` dir). The font allowlist patch +(`patches/font-hijacker.patch`) prunes lookups by family name AFTER fontconfig +substitution, so a reported name that fontconfig cannot resolve measures as the +fallback: a reverse leak. The old `fonts.json[mac]` carried 70 such names +(Hiragino etc.); the new lists carry none. + +The reverse direction is deliberately NOT tight: the bundle renders more +families than are ever reported (202 / 278 / 277 per OS, listed by +`scripts/gen-fonts-json.py --dump-union`). Those are names a real OS never +presents as a family: weight-variant subfamilies DirectWrite folds into their +parent ("Barlow Black"), the bare "Sitka" / "Segoe UI Variable" umbrella names +(Windows presents only their optical-size instances), and CJK families a stock +Windows install does not report. They stay renderable but unreported. + +## How `fonts.json` is derived (`scripts/gen-fonts-json.py`) + +``` +reportable[os] = fc-scan(bundle/fonts/) families fontconfig publishes + + SCAN_FAMILIES Sitka * / Segoe UI Variable * (windows conf ) + + ALIASES names fonts.conf rewrites to a bundled target (below) + + SHIPPED_BY_BROWSER Twemoji Mozilla (dist/bin/fonts, from the Firefox build) + ∩ names(scripts/data/font-manifests.json) bases + additions + MARKER_FONTS for that OS + + ALIASES, REPORTABLE_EXTRA forced in (see below) +``` + +`scripts/data/font-manifests.json` is the per-OS model: the base font set of +each OS version with its real-world share (Windows 10 / 11, macOS Sonoma, +Ubuntu / Mint) and the optional additions (Office, Pan-European, LibreOffice, +Adobe CC, developer and web fonts) with their install probability. +`--print-bases` prints the OS base lists intersected with the result, which is +what the `_ESSENTIAL_FONTS_*` constants are pasted from. Regenerate both +together whenever the bundle changes; the committed `fonts.json` is exactly what +the script produces from the target bundle. + +Deliberate choices: + +- **Windows aliases are unconditional and always reported.** The 13 + GDI-substitution / Light-Semilight rules (`Courier -> Courier New`, + `Helvetica -> Arial`, `Calibri Light -> Calibri`, ...) are in + `bundle/fontconfig/windows/fonts.conf` unconditionally, because Camoufox has no + per-launch fontconfig hook, and the names are in `_ESSENTIAL_FONTS_WINDOWS`. + That matches reality: every Windows install resolves all of them. +- **macOS TTC weight names are reported.** The confs rewrite `American + Typewriter Semibold`, `Futura Bold`, `STIX Two Math Regular`, ... to their base + family. A real Mac registers those names as families (they are in the macOS + base), but `fc-scan` cannot see them; here the 8 whose target is bundled are + reportable and essential. The three `PingFang * Light` rewrites are inert + (PingFang is not bundled). +- **`Twemoji Mozilla` is reportable on Linux** as before (it is a CreepJS + Linux marker and Firefox exposes its bundled font to content). It is not + reported on macOS. +- The same rewrite block leaves one live-but-unreported name on Linux + (`Noto Sans Canadian Aboriginal Regular`); a real Ubuntu does not report it, + so it stays unreported and `verify-fonts.py` warns rather than fails. + +## The per-launch draw (`fingerprints._generate_random_font_subset`) + +Unchanged in shape (same name and signature, same 30-78% draw), re-based on a +model of what varies between real machines: + +1. **Essential = the OS base**, always present in full: a real machine has all + of its OS defaults. `_ESSENTIAL_FONTS_WINDOWS` = the Windows 10 base with the + stock CJK families = 119 names; `_ESSENTIAL_FONTS_MACOS` = the Sonoma base ∩ + renderable + the 8 alias names = 550; `_ESSENTIAL_FONTS_LINUX` = the + Ubuntu/Mint common core = 234. +2. **OS-version variant, all-or-nothing** (`_BASE_VARIANT_FONTS_*`): the seven + Windows 11 additions with p = 0.65, `Liberation Sans Narrow` (Ubuntu, not + Mint) with p = 0.65, nothing on macOS. +3. **A random 30-78 % of the additions** (`fonts.json` minus base and variant — + Office, LibreOffice, Adobe CC, Cascadia, Meslo, developer and web fonts), + drawn as co-shipped groups (`font-groups.json`) so a family set that installs + together is never split. +4. **Marker fonts** appended if missing (`_ensure_marker_fonts`), minus the + three PingFang names on macOS, which the bundle cannot render. + +For a **native** identity (the host's own OS) on macOS and Windows the draw +claims only the OS base: the real system fonts are the right ones there, and +`font-hijacker.patch` does not activate the bundle for them. + +## fontconfig parity + +Linux: generics resolve to what a stock Ubuntu control does (Noto Sans / Noto +Serif / DejaVu Sans Mono / Z003), `hintstyle` is `hintslight`, the stock +metric aliases (30-metric-aliases), 49-sansserif, urw-base35 and the non-Latin +rule files (40-nonlatin / 60-latin / 65-* / 70-fonts-noto-cjk) are merged in +stock conf.d order. Windows: adds the `MS Shell Dlg 2 -> Tahoma` dialog family, +cursive/fantasy generics, the 243 duplicate-face rejects, the `Sitka` / +`Segoe UI Variable` scan-time instance families, plus the alias block above. +Every reject glob is listed twice, `*/fonts/windows/` for the Linux +package layout and `*/fonts/` for the flattened macOS/Windows packages +(`scripts/package.py` flattens non-Linux; no basename collides across the dirs +that share a package). The `fonts` line that `utils.py` +rewrites is kept in all three. + +## Verifying + +``` +python3 scripts/verify-fonts.py # full: builds a fontconfig cache over the bundle, minutes on first run +python3 scripts/verify-fonts.py --quick # constants + draws + layout only +cd pythonlib && python3 -m pytest -q -k "font or humanize or launch_environment" +``` + +The full run checks, per OS: `fonts.json[os]` ⊆ `fc-list` families (aliases via +`fc-match`), generics resolve to a reportable family, essential / variant / +marker ⊆ `fonts.json`, live alias rewrites are essential, 20 draws stay inside +`fonts.json`, no subfolders or cross-dir basename collisions, reject globs name +real files, and reports files over GitHub's 100 MB limit. + +## Known residue + +- The Linux package copies all three OS dirs (`--fonts windows macos linux`) + without de-duplicating identical files across them, so it is ~2x larger than + necessary; `scripts/package.py` was not changed. +- Six reject globs contain `[wdth,wght]`-style brackets that fontconfig reads as + character classes. +- `PingFang.ttc` and `holomdl2.ttf` from the old bundle are not in the target + bundle; they were dropped and are recoverable from git history if needed. diff --git a/pythonlib/camoufox/font-groups.json b/pythonlib/camoufox/font-groups.json new file mode 100644 index 0000000..344508a --- /dev/null +++ b/pythonlib/camoufox/font-groups.json @@ -0,0 +1,325 @@ +{ + "win": [ + { + "id": "office", + "fonts": [ + "Bodoni MT Condensed", + "Stencil", + "Perpetua Titling MT", + "Haettenschweiler", + "Matura MT Script Capitals", + "Elephant", + "Gill Sans MT Ext Condensed Bold", + "Palace Script MT", + "Modern No. 20", + "Perpetua", + "Wide Latin", + "Kunstler Script", + "Rockwell Extra Bold", + "Bell MT", + "Harrington", + "Vivaldi", + "Gill Sans Ultra Bold", + "Bookshelf Symbol 7", + "Rage Italic", + "Agency FB", + "Eras Bold ITC", + "Old English Text MT", + "Broadway", + "Copperplate Gothic Light", + "Snap ITC", + "Forte", + "Gigi", + "Rockwell Condensed", + "Colonna MT", + "Bauhaus 93", + "Poor Richard", + "Gill Sans MT", + "Centaur", + "MS Reference Specialty", + "Imprint MT Shadow", + "Copperplate Gothic Bold", + "Playbill", + "Harlow Solid Italic", + "Footlight MT Light", + "Viner Hand ITC", + "Bradley Hand ITC", + "Calisto MT", + "Eras Light ITC", + "Parchment", + "Bodoni MT Black", + "Engravers MT", + "Mistral", + "Goudy Stout", + "Pristina", + "Brush Script MT", + "High Tower Text", + "Niagara Solid", + "Ravie", + "Gill Sans MT Condensed", + "Informal Roman", + "Algerian", + "Maiandra GD", + "Tw Cen MT Condensed", + "Edwardian Script ITC", + "Britannic Bold", + "OCR A Extended", + "Bodoni MT Poster Compressed", + "Tempus Sans ITC", + "Eras Demi ITC", + "Jokerman", + "Niagara Engraved", + "Magneto", + "French Script MT", + "Tw Cen MT", + "Berlin Sans FB Demi", + "Tw Cen MT Condensed Extra Bold", + "Castellar", + "Script MT Bold", + "Freestyle Script", + "Blackadder ITC", + "Gloucester MT Extra Condensed", + "Bernard MT Condensed", + "Curlz MT", + "Felix Titling", + "Baskerville Old Face", + "Vladimir Script", + "Rockwell", + "Onyx", + "Kristen ITC", + "Bodoni MT", + "Cooper Black", + "Eras Medium ITC", + "Californian FB", + "Goudy Old Style", + "Gill Sans Ultra Bold Condensed", + "Papyrus", + "Chiller", + "Showcard Gothic", + "Juice ITC", + "Berlin Sans FB", + "MT Extra", + "Book Antiqua", + "Bookman Old Style", + "Century", + "Century Gothic", + "Century Schoolbook", + "Dubai", + "Franklin Gothic Book", + "Franklin Gothic Demi", + "Franklin Gothic Demi Cond", + "Franklin Gothic Heavy", + "Garamond", + "Lucida Bright", + "Lucida Calligraphy", + "Lucida Fax", + "Lucida Handwriting", + "Lucida Sans Typewriter", + "Monotype Corsiva", + "MS Outlook", + "MS Reference Sans Serif" + ] + }, + { + "id": "pan-euro", + "fonts": [ + "Arial Nova", + "Georgia Pro", + "Gill Sans Nova", + "Neue Haas Grotesk Text Pro", + "Rockwell Nova", + "Verdana Pro" + ] + }, + { + "id": "libreoffice", + "fonts": [ + "Caladea", + "Carlito", + "Liberation Sans", + "Liberation Serif", + "Liberation Mono", + "Liberation Sans Narrow", + "DejaVu Sans", + "DejaVu Serif", + "DejaVu Sans Mono", + "DejaVu Sans Condensed", + "DejaVu Serif Condensed", + "DejaVu Sans Light", + "DejaVu Math TeX Gyre", + "Source Sans 3", + "Source Serif 4", + "Source Code Pro", + "Noto Sans", + "Noto Serif", + "Noto Mono", + "Noto Sans Arabic", + "Noto Naskh Arabic", + "Noto Kufi Arabic", + "Noto Sans Hebrew", + "Noto Serif Hebrew", + "Noto Sans Armenian", + "Noto Serif Armenian", + "Noto Sans Georgian", + "Noto Serif Georgian", + "Noto Sans Lao", + "Noto Serif Lao", + "Noto Sans Lisu", + "Gentium Basic", + "Gentium Book Basic", + "Amiri", + "Amiri Quran", + "Scheherazade", + "Reem Kufi", + "David Libre", + "Alef", + "OpenSymbol", + "Rubik" + ] + }, + { + "id": "adobe-cc", + "fonts": [ + "Minion Pro", + "Myriad Pro", + "Adobe Arabic", + "Adobe Hebrew", + "Adobe Devanagari", + "Adobe Thai" + ] + }, + { + "id": "cascadia", + "fonts": [ + "Cascadia Code", + "Cascadia Mono" + ] + }, + { + "id": "meslo", + "fonts": [ + "Meslo LG S", + "Meslo LG M", + "Meslo LG L" + ] + } + ], + "mac": [ + { + "id": "adobe-cc", + "fonts": [ + "Minion Pro", + "Myriad Pro", + "Adobe Arabic", + "Adobe Hebrew", + "Adobe Devanagari", + "Adobe Thai", + "Kozuka Gothic Pr6N", + "Kozuka Mincho Pr6N", + "Adobe Ming Std", + "Adobe Song Std", + "Adobe Heiti Std", + "Adobe Fan Heiti Std", + "Adobe Gothic Std", + "Adobe Myungjo Std" + ] + }, + { + "id": "meslo", + "fonts": [ + "Meslo LG S", + "Meslo LG M", + "Meslo LG L" + ] + } + ], + "lin": [ + { + "id": "libreoffice", + "fonts": [ + "Caladea", + "Carlito", + "Liberation Sans", + "Liberation Serif", + "Liberation Mono", + "Liberation Sans Narrow", + "DejaVu Sans", + "DejaVu Serif", + "DejaVu Sans Mono", + "DejaVu Sans Condensed", + "DejaVu Serif Condensed", + "DejaVu Sans Light", + "DejaVu Math TeX Gyre", + "Source Sans 3", + "Source Serif 4", + "Source Code Pro", + "Noto Sans", + "Noto Serif", + "Noto Mono", + "Noto Sans Arabic", + "Noto Naskh Arabic", + "Noto Kufi Arabic", + "Noto Sans Hebrew", + "Noto Serif Hebrew", + "Noto Sans Armenian", + "Noto Serif Armenian", + "Noto Sans Georgian", + "Noto Serif Georgian", + "Noto Sans Lao", + "Noto Serif Lao", + "Noto Sans Lisu", + "Gentium Basic", + "Gentium Book Basic", + "Amiri", + "Amiri Quran", + "Scheherazade", + "Reem Kufi", + "David Libre", + "Alef", + "OpenSymbol", + "Rubik" + ] + }, + { + "id": "distro-i18n", + "fonts": [ + "KacstBook", + "KacstOffice", + "Frank Ruehl CLM", + "Miriam CLM", + "Miriam Mono CLM", + "David CLM", + "Linux Libertine O", + "Linux Biolinum O", + "Linux Libertine Display O" + ] + }, + { + "id": "adobe-cc", + "fonts": [ + "Minion Pro", + "Myriad Pro", + "Adobe Arabic", + "Adobe Hebrew", + "Adobe Devanagari", + "Adobe Thai", + "Kozuka Gothic Pr6N", + "Kozuka Mincho Pr6N", + "Adobe Ming Std", + "Adobe Song Std", + "Adobe Heiti Std", + "Adobe Fan Heiti Std", + "Adobe Gothic Std", + "Adobe Myungjo Std" + ] + }, + { + "id": "meslo", + "fonts": [ + "Meslo LG S", + "Meslo LG M", + "Meslo LG L" + ] + } + ] +} \ No newline at end of file diff --git a/pythonlib/camoufox/fonts.json b/pythonlib/camoufox/fonts.json index e89aab8..312d128 100644 --- a/pythonlib/camoufox/fonts.json +++ b/pythonlib/camoufox/fonts.json @@ -1,11 +1,244 @@ { "win": [ - "Arial", "Arial Black", "Bahnschrift", "Calibri", "Calibri Light", "Cambria", "Cambria Math", "Candara", "Candara Light", "Comic Sans MS", "Consolas", "Constantia", "Corbel", "Corbel Light", "Courier New", "Ebrima", "Franklin Gothic Medium", "Gabriola", "Gadugi", "Georgia", "HoloLens MDL2 Assets", "Impact", "Ink Free", "Javanese Text", "Leelawadee UI", "Leelawadee UI Semilight", "Lucida Console", "Lucida Sans Unicode", "MS Gothic", "MS PGothic", "MS UI Gothic", "MV Boli", "Malgun Gothic", "Malgun Gothic Semilight", "Marlett", "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft JhengHei Light", "Microsoft JhengHei UI", "Microsoft JhengHei UI Light", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le", "Microsoft YaHei", "Microsoft YaHei Light", "Microsoft YaHei UI", "Microsoft YaHei UI Light", "Microsoft Yi Baiti", "MingLiU-ExtB", "MingLiU_HKSCS-ExtB", "Mongolian Baiti", "Myanmar Text", "NSimSun", "Nirmala UI", "Nirmala UI Semilight", "PMingLiU-ExtB", "Palatino Linotype", "Segoe Fluent Icons", "Segoe MDL2 Assets", "Segoe Print", "Segoe Script", "Segoe UI", "Segoe UI Black", "Segoe UI Emoji", "Segoe UI Historic", "Segoe UI Light", "Segoe UI Semibold", "Segoe UI Semilight", "Segoe UI Symbol", "Segoe UI Variable", "SimSun", "SimSun-ExtB", "Sitka", "Sitka Text", "Sylfaen", "Symbol", "Tahoma", "Times New Roman", "Trebuchet MS", "Twemoji Mozilla", "Verdana", "Webdings", "Wingdings", "Yu Gothic", "Yu Gothic Light", "Yu Gothic Medium", "Yu Gothic UI", "Yu Gothic UI Light", "Yu Gothic UI Semibold", "Yu Gothic UI Semilight", "\u5b8b\u4f53", "\u5fae\u8edf\u6b63\u9ed1\u9ad4", "\u5fae\u8edf\u6b63\u9ed1\u9ad4 Light", "\u5fae\u8f6f\u96c5\u9ed1", "\u5fae\u8f6f\u96c5\u9ed1 Light", "\u65b0\u5b8b\u4f53", "\u65b0\u7d30\u660e\u9ad4-ExtB", "\u6e38\u30b4\u30b7\u30c3\u30af", "\u6e38\u30b4\u30b7\u30c3\u30af Light", "\u6e38\u30b4\u30b7\u30c3\u30af Medium", "\u7d30\u660e\u9ad4-ExtB", "\u7d30\u660e\u9ad4_HKSCS-ExtB", "\ub9d1\uc740 \uace0\ub515", "\ub9d1\uc740 \uace0\ub515 Semilight", "\uff2d\uff33 \u30b4\u30b7\u30c3\u30af", "\uff2d\uff33 \uff30\u30b4\u30b7\u30c3\u30af" + "Adobe Arabic", "Adobe Devanagari", "Adobe Hebrew", "Adobe Thai", "Agency FB", "Alef", "Algerian", + "Amiri", "Amiri Quran", "Anonymous Pro", "Arial", "Arial Black", "Arial Nova", "Bahnschrift", + "Barlow", "Baskerville Old Face", "Bauhaus 93", "Bebas Neue", "Bell MT", "Berlin Sans FB", + "Berlin Sans FB Demi", "Bernard MT Condensed", "Blackadder ITC", "Bodoni MT", "Bodoni MT Black", + "Bodoni MT Condensed", "Bodoni MT Poster Compressed", "Book Antiqua", "Bookman Old Style", + "Bookshelf Symbol 7", "Bradley Hand ITC", "Britannic Bold", "Broadway", "Brush Script MT", + "Cabin", "Caladea", "Calibri", "Calibri Light", "Californian FB", "Calisto MT", "Cambria", + "Cambria Math", "Candara", "Candara Light", "Carlito", "Cascadia Code", "Cascadia Mono", "Castellar", + "Centaur", "Century", "Century Gothic", "Century Schoolbook", "Chiller", "Colonna MT", "Comic Sans MS", + "Consolas", "Constantia", "Cooper Black", "Copperplate Gothic Bold", "Copperplate Gothic Light", + "Corbel", "Corbel Light", "Courier", "Courier New", "Curlz MT", "DM Sans", "David Libre", "DejaVu Math TeX Gyre", + "DejaVu Sans", "DejaVu Sans Condensed", "DejaVu Sans Light", "DejaVu Sans Mono", "DejaVu Serif", + "DejaVu Serif Condensed", "Dubai", "Ebrima", "Edwardian Script ITC", "Elephant", "Engravers MT", + "Eras Bold ITC", "Eras Demi ITC", "Eras Light ITC", "Eras Medium ITC", "Felix Titling", "Fira Code", + "Fira Mono", "Fira Sans", "Footlight MT Light", "Forte", "Franklin Gothic Book", "Franklin Gothic Demi", + "Franklin Gothic Demi Cond", "Franklin Gothic Heavy", "Franklin Gothic Medium", "Freestyle Script", + "French Script MT", "Gabriola", "Gadugi", "Garamond", "Gentium Basic", "Gentium Book Basic", + "Georgia", "Georgia Pro", "Gigi", "Gill Sans MT", "Gill Sans MT Condensed", "Gill Sans MT Ext Condensed Bold", + "Gill Sans Nova", "Gill Sans Ultra Bold", "Gill Sans Ultra Bold Condensed", "Gloucester MT Extra Condensed", + "Goudy Old Style", "Goudy Stout", "Hack", "Haettenschweiler", "Harlow Solid Italic", "Harrington", + "Heebo", "Helvetica", "High Tower Text", "IBM Plex Mono", "Impact", "Imprint MT Shadow", "Inconsolata", + "Informal Roman", "Ink Free", "Inter", "Iosevka", "Javanese Text", "JetBrains Mono", "Jokerman", + "Josefin Sans", "Juice ITC", "Karla", "Kristen ITC", "Kunstler Script", "Lato", "Leelawadee UI", + "Leelawadee UI Semilight", "Liberation Mono", "Liberation Sans", "Liberation Sans Narrow", + "Liberation Serif", "Lucida Bright", "Lucida Calligraphy", "Lucida Console", "Lucida Fax", + "Lucida Handwriting", "Lucida Sans Typewriter", "Lucida Sans Unicode", "MS Gothic", "MS Outlook", + "MS PGothic", "MS Reference Sans Serif", "MS Reference Specialty", "MS Sans Serif", "MS Serif", + "MS UI Gothic", "MT Extra", "MV Boli", "Magneto", "Maiandra GD", "Malgun Gothic", "Malgun Gothic Semilight", + "Manrope", "Marlett", "Matura MT Script Capitals", "Merriweather", "Meslo LG L", "Meslo LG M", + "Meslo LG S", "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft JhengHei Light", "Microsoft JhengHei UI", + "Microsoft JhengHei UI Light", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Sans Serif", + "Microsoft Tai Le", "Microsoft YaHei", "Microsoft YaHei Light", "Microsoft YaHei UI", "Microsoft YaHei UI Light", + "Microsoft Yi Baiti", "MingLiU-ExtB", "MingLiU_HKSCS-ExtB", "MingLiU_MSCS-ExtB", "Minion Pro", + "Mistral", "Modern No. 20", "Mongolian Baiti", "Monotype Corsiva", "Montserrat", "Mukta", "Myanmar Text", + "Myriad Pro", "NSimSun", "Neue Haas Grotesk Text Pro", "Niagara Engraved", "Niagara Solid", + "Nirmala Text", "Nirmala Text Semilight", "Nirmala UI", "Nirmala UI Semilight", "Noto Kufi Arabic", + "Noto Mono", "Noto Naskh Arabic", "Noto Sans", "Noto Sans Arabic", "Noto Sans Armenian", "Noto Sans Georgian", + "Noto Sans Hebrew", "Noto Sans Lao", "Noto Sans Lisu", "Noto Serif", "Noto Serif Armenian", + "Noto Serif Georgian", "Noto Serif Hebrew", "Noto Serif Lao", "Nunito", "Nunito Sans", "OCR A Extended", + "Old English Text MT", "Onyx", "Open Sans", "OpenSymbol", "Oswald", "Overpass Mono", "PMingLiU-ExtB", + "PT Mono", "PT Sans", "PT Serif", "Palace Script MT", "Palatino Linotype", "Papyrus", "Parchment", + "Perpetua", "Perpetua Titling MT", "Playbill", "Playfair Display", "Poor Richard", "Poppins", + "Pristina", "Quicksand", "Rage Italic", "Raleway", "Ravie", "Reem Kufi", "Roboto", "Roboto Condensed", + "Roboto Mono", "Roboto Slab", "Rockwell", "Rockwell Condensed", "Rockwell Extra Bold", "Rockwell Nova", + "Roman", "Rubik", "Sans Serif Collection", "Scheherazade", "Script MT Bold", "Segoe Fluent Icons", + "Segoe MDL2 Assets", "Segoe Print", "Segoe Script", "Segoe UI", "Segoe UI Black", "Segoe UI Emoji", + "Segoe UI Historic", "Segoe UI Light", "Segoe UI Semibold", "Segoe UI Semilight", "Segoe UI Symbol", + "Segoe UI Variable Display", "Segoe UI Variable Small", "Segoe UI Variable Text", "Showcard Gothic", + "SimSun", "SimSun-ExtB", "Sitka Banner", "Sitka Display", "Sitka Heading", "Sitka Small", "Sitka Subheading", + "Sitka Text", "Small Fonts", "Snap ITC", "Source Code Pro", "Source Sans 3", "Source Serif 4", + "Space Mono", "Stencil", "Sylfaen", "Symbol", "Tahoma", "Tempus Sans ITC", "Times", "Times New Roman", + "Titillium Web", "Trebuchet MS", "Tw Cen MT", "Tw Cen MT Condensed", "Tw Cen MT Condensed Extra Bold", + "Twemoji Mozilla", "Verdana", "Verdana Pro", "Victor Mono", "Viner Hand ITC", "Vivaldi", "Vladimir Script", + "Webdings", "Wide Latin", "Wingdings", "Work Sans", "Yu Gothic", "Yu Gothic Light", "Yu Gothic Medium", + "Yu Gothic UI", "Yu Gothic UI Light", "Yu Gothic UI Semibold", "Yu Gothic UI Semilight", "宋体", + "微軟正黑體", "微軟正黑體 Light", "微软雅黑", "微软雅黑 Light", "新宋体", "新細明體-ExtB", "游ゴシック", "游ゴシック Light", "游ゴシック Medium", + "細明體-ExtB", "細明體_HKSCS-ExtB", "細明體_MSCS-ExtB", "맑은 고딕", "맑은 고딕 Semilight", "MS ゴシック", "MS Pゴシック" ], "mac": [ - ".Al Bayan PUA", ".Al Nile PUA", ".Al Tarikh PUA", ".Apple Color Emoji UI", ".Apple SD Gothic NeoI", ".Aqua Kana", ".Aqua Kana Bold", ".Aqua \u304b\u306a", ".Aqua \u304b\u306a \u30dc\u30fc\u30eb\u30c9", ".Arial Hebrew Desk Interface", ".Baghdad PUA", ".Beirut PUA", ".Damascus PUA", ".DecoType Naskh PUA", ".Diwan Kufi PUA", ".Farah PUA", ".Geeza Pro Interface", ".Geeza Pro PUA", ".Helvetica LT MM", ".Hiragino Kaku Gothic Interface", ".Hiragino Sans GB Interface", ".Keyboard", ".KufiStandardGK PUA", ".LastResort", ".Lucida Grande UI", ".Muna PUA", ".Nadeem PUA", ".New York", ".Noto Nastaliq Urdu UI", ".PingFang HK", ".PingFang SC", ".PingFang TC", ".SF Arabic", ".SF Arabic Rounded", ".SF Compact", ".SF Compact Rounded", ".SF NS", ".SF NS Mono", ".SF NS Rounded", ".Sana PUA", ".Savoye LET CC.", ".ThonburiUI", ".ThonburiUIWatch", ".\u82f9\u65b9-\u6e2f", ".\u82f9\u65b9-\u7b80", ".\u82f9\u65b9-\u7e41", ".\u860b\u65b9-\u6e2f", ".\u860b\u65b9-\u7c21", ".\u860b\u65b9-\u7e41", "Academy Engraved LET", "Al Bayan", "Al Nile", "Al Tarikh", "American Typewriter", "Andale Mono", "Apple Braille", "Apple Chancery", "Apple Color Emoji", "Apple SD Gothic Neo", "Apple SD \uc0b0\ub3cc\uace0\ub515 Neo", "Apple Symbols", "AppleGothic", "AppleMyungjo", "Arial", "Arial Black", "Arial Hebrew", "Arial Hebrew Scholar", "Arial Narrow", "Arial Rounded MT Bold", "Arial Unicode MS", "Athelas", "Avenir", "Avenir Black", "Avenir Black Oblique", "Avenir Book", "Avenir Heavy", "Avenir Light", "Avenir Medium", "Avenir Next", "Avenir Next Condensed", "Avenir Next Condensed Demi Bold", "Avenir Next Condensed Heavy", "Avenir Next Condensed Medium", "Avenir Next Condensed Ultra Light", "Avenir Next Demi Bold", "Avenir Next Heavy", "Avenir Next Medium", "Avenir Next Ultra Light", "Ayuthaya", "Baghdad", "Bangla MN", "Bangla Sangam MN", "Baskerville", "Beirut", "Big Caslon", "Bodoni 72", "Bodoni 72 Oldstyle", "Bodoni 72 Smallcaps", "Bodoni Ornaments", "Bradley Hand", "Brush Script MT", "Chakra Petch", "Chalkboard", "Chalkboard SE", "Chalkduster", "Charter", "Charter Black", "Cochin", "Comic Sans MS", "Copperplate", "Corsiva Hebrew", "Courier", "Courier New", "Czcionka systemowa", "DIN Alternate", "DIN Condensed", "Damascus", "DecoType Naskh", "Devanagari MT", "Devanagari Sangam MN", "Didot", "Diwan Kufi", "Diwan Thuluth", "Euphemia UCAS", "Farah", "Farisi", "Font Sistem", "Font de sistem", "Font di sistema", "Font sustava", "Fonte do Sistema", "Futura", "GB18030 Bitmap", "Galvji", "Geeza Pro", "Geneva", "Georgia", "Gill Sans", "Grantha Sangam MN", "Gujarati MT", "Gujarati Sangam MN", "Gurmukhi MN", "Gurmukhi MT", "Gurmukhi Sangam MN", "Heiti SC", "Heiti TC", "Heiti-\uac04\uccb4", "Heiti-\ubc88\uccb4", "Helvetica", "Helvetica Neue", "Herculanum", "Hiragino Kaku Gothic Pro", "Hiragino Kaku Gothic Pro W3", "Hiragino Kaku Gothic Pro W6", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic ProN W3", "Hiragino Kaku Gothic ProN W6", "Hiragino Kaku Gothic Std", "Hiragino Kaku Gothic Std W8", "Hiragino Kaku Gothic StdN", "Hiragino Kaku Gothic StdN W8", "Hiragino Maru Gothic Pro", "Hiragino Maru Gothic Pro W4", "Hiragino Maru Gothic ProN", "Hiragino Maru Gothic ProN W4", "Hiragino Mincho Pro", "Hiragino Mincho Pro W3", "Hiragino Mincho Pro W6", "Hiragino Mincho ProN", "Hiragino Mincho ProN W3", "Hiragino Mincho ProN W6", "Hiragino Sans", "Hiragino Sans GB", "Hiragino Sans GB W3", "Hiragino Sans GB W6", "Hiragino Sans W0", "Hiragino Sans W1", "Hiragino Sans W2", "Hiragino Sans W3", "Hiragino Sans W4", "Hiragino Sans W5", "Hiragino Sans W6", "Hiragino Sans W7", "Hiragino Sans W8", "Hiragino Sans W9", "Hoefler Text", "Hoefler Text Ornaments", "ITF Devanagari", "ITF Devanagari Marathi", "Impact", "InaiMathi", "Iowan Old Style", "Iowan Old Style Black", "J\u00e4rjestelm\u00e4fontti", "Kailasa", "Kannada MN", "Kannada Sangam MN", "Kefa", "Khmer MN", "Khmer Sangam MN", "Kohinoor Bangla", "Kohinoor Devanagari", "Kohinoor Gujarati", "Kohinoor Telugu", "Kokonor", "Krungthep", "KufiStandardGK", "Lao MN", "Lao Sangam MN", "Lucida Grande", "Luminari", "Malayalam MN", "Malayalam Sangam MN", "Marion", "Marker Felt", "Menlo", "Microsoft Sans Serif", "Mishafi", "Mishafi Gold", "Monaco", "Mshtakan", "Mukta Mahee", "MuktaMahee Bold", "MuktaMahee ExtraBold", "MuktaMahee ExtraLight", "MuktaMahee Light", "MuktaMahee Medium", "MuktaMahee Regular", "MuktaMahee SemiBold", "Muna", "Myanmar MN", "Myanmar Sangam MN", "Nadeem", "New Peninim MT", "Noteworthy", "Noto Nastaliq Urdu", "Noto Sans Adlam", "Noto Sans Armenian", "Noto Sans Armenian Blk", "Noto Sans Armenian ExtBd", "Noto Sans Armenian ExtLt", "Noto Sans Armenian Light", "Noto Sans Armenian Med", "Noto Sans Armenian SemBd", "Noto Sans Armenian Thin", "Noto Sans Avestan", "Noto Sans Bamum", "Noto Sans Bassa Vah", "Noto Sans Batak", "Noto Sans Bhaiksuki", "Noto Sans Brahmi", "Noto Sans Buginese", "Noto Sans Buhid", "Noto Sans CanAborig", "Noto Sans Canadian Aboriginal", "Noto Sans Carian", "Noto Sans CaucAlban", "Noto Sans Caucasian Albanian", "Noto Sans Chakma", "Noto Sans Cham", "Noto Sans Coptic", "Noto Sans Cuneiform", "Noto Sans Cypriot", "Noto Sans Duployan", "Noto Sans EgyptHiero", "Noto Sans Egyptian Hieroglyphs", "Noto Sans Elbasan", "Noto Sans Glagolitic", "Noto Sans Gothic", "Noto Sans Gunjala Gondi", "Noto Sans Hanifi Rohingya", "Noto Sans HanifiRohg", "Noto Sans Hanunoo", "Noto Sans Hatran", "Noto Sans ImpAramaic", "Noto Sans Imperial Aramaic", "Noto Sans InsPahlavi", "Noto Sans InsParthi", "Noto Sans Inscriptional Pahlavi", "Noto Sans Inscriptional Parthian", "Noto Sans Javanese", "Noto Sans Kaithi", "Noto Sans Kannada", "Noto Sans Kannada Black", "Noto Sans Kannada ExtraBold", "Noto Sans Kannada ExtraLight", "Noto Sans Kannada Light", "Noto Sans Kannada Medium", "Noto Sans Kannada SemiBold", "Noto Sans Kannada Thin", "Noto Sans Kayah Li", "Noto Sans Kharoshthi", "Noto Sans Khojki", "Noto Sans Khudawadi", "Noto Sans Lepcha", "Noto Sans Limbu", "Noto Sans Linear A", "Noto Sans Linear B", "Noto Sans Lisu", "Noto Sans Lycian", "Noto Sans Lydian", "Noto Sans Mahajani", "Noto Sans Mandaic", "Noto Sans Manichaean", "Noto Sans Marchen", "Noto Sans Masaram Gondi", "Noto Sans Meetei Mayek", "Noto Sans Mende Kikakui", "Noto Sans Meroitic", "Noto Sans Miao", "Noto Sans Modi", "Noto Sans Mongolian", "Noto Sans Mro", "Noto Sans Multani", "Noto Sans Myanmar", "Noto Sans Myanmar Blk", "Noto Sans Myanmar ExtBd", "Noto Sans Myanmar ExtLt", "Noto Sans Myanmar Light", "Noto Sans Myanmar Med", "Noto Sans Myanmar SemBd", "Noto Sans Myanmar Thin", "Noto Sans NKo", "Noto Sans Nabataean", "Noto Sans New Tai Lue", "Noto Sans Newa", "Noto Sans Ol Chiki", "Noto Sans Old Hungarian", "Noto Sans Old Italic", "Noto Sans Old North Arabian", "Noto Sans Old Permic", "Noto Sans Old Persian", "Noto Sans Old South Arabian", "Noto Sans Old Turkic", "Noto Sans OldHung", "Noto Sans OldNorArab", "Noto Sans OldSouArab", "Noto Sans Oriya", "Noto Sans Osage", "Noto Sans Osmanya", "Noto Sans Pahawh Hmong", "Noto Sans Palmyrene", "Noto Sans Pau Cin Hau", "Noto Sans PhagsPa", "Noto Sans Phoenician", "Noto Sans PsaPahlavi", "Noto Sans Psalter Pahlavi", "Noto Sans Rejang", "Noto Sans Samaritan", "Noto Sans Saurashtra", "Noto Sans Sharada", "Noto Sans Siddham", "Noto Sans Sora Sompeng", "Noto Sans SoraSomp", "Noto Sans Sundanese", "Noto Sans Syloti Nagri", "Noto Sans Syriac", "Noto Sans Tagalog", "Noto Sans Tagbanwa", "Noto Sans Tai Le", "Noto Sans Tai Tham", "Noto Sans Tai Viet", "Noto Sans Takri", "Noto Sans Thaana", "Noto Sans Tifinagh", "Noto Sans Tirhuta", "Noto Sans Ugaritic", "Noto Sans Vai", "Noto Sans Wancho", "Noto Sans Warang Citi", "Noto Sans Yi", "Noto Sans Zawgyi", "Noto Sans Zawgyi Blk", "Noto Sans Zawgyi ExtBd", "Noto Sans Zawgyi ExtLt", "Noto Sans Zawgyi Light", "Noto Sans Zawgyi Med", "Noto Sans Zawgyi SemBd", "Noto Sans Zawgyi Thin", "Noto Serif Ahom", "Noto Serif Balinese", "Noto Serif Hmong Nyiakeng", "Noto Serif Myanmar", "Noto Serif Myanmar Blk", "Noto Serif Myanmar ExtBd", "Noto Serif Myanmar ExtLt", "Noto Serif Myanmar Light", "Noto Serif Myanmar Med", "Noto Serif Myanmar SemBd", "Noto Serif Myanmar Thin", "Noto Serif Yezidi", "Optima", "Oriya MN", "Oriya Sangam MN", "PT Mono", "PT Sans", "PT Sans Caption", "PT Sans Narrow", "PT Serif", "PT Serif Caption", "Palatino", "Papyrus", "Party LET", "Phosphate", "Ph\u00f4ng ch\u1eef H\u1ec7 th\u1ed1ng", "PingFang HK", "PingFang SC", "PingFang TC", "Plantagenet Cherokee", "Police syst\u00e8me", "Raanana", "Rendszerbet\u0171t\u00edpus", "Rockwell", "STIX Two Math", "STIX Two Text", "STIXGeneral", "STIXIntegralsD", "STIXIntegralsSm", "STIXIntegralsUp", "STIXIntegralsUpD", "STIXIntegralsUpSm", "STIXNonUnicode", "STIXSizeFiveSym", "STIXSizeFourSym", "STIXSizeOneSym", "STIXSizeThreeSym", "STIXSizeTwoSym", "STIXVariants", "STSong", "Sana", "Sathu", "Savoye LET", "Seravek", "Seravek ExtraLight", "Seravek Light", "Seravek Medium", "Shree Devanagari 714", "SignPainter", "SignPainter-HouseScript", "Silom", "Sinhala MN", "Sinhala Sangam MN", "Sistem Fontu", "Skia", "Snell Roundhand", "Songti SC", "Songti TC", "Sukhumvit Set", "Superclarendon", "Symbol", "Systeemlettertype", "System Font", "Systemschrift", "Systemskrift", "Systemtypsnitt", "Syst\u00e9mov\u00e9 p\u00edsmo", "Tahoma", "Tamil MN", "Tamil Sangam MN", "Telugu MN", "Telugu Sangam MN", "Thonburi", "Times", "Times New Roman", "Tipo de letra del sistema", "Tipo de letra do sistema", "Tipus de lletra del sistema", "Trattatello", "Trebuchet MS", "Verdana", "Waseem", "Webdings", "Wingdings", "Wingdings 2", "Wingdings 3", "Zapf Dingbats", "Zapfino", "\u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2", "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0438\u0439 \u0448\u0440\u0438\u0444\u0442", "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442", "\u05d2\u05d5\u05e4\u05df \u05de\u05e2\u05e8\u05db\u05ea", "\u0627\u0644\u0628\u064a\u0627\u0646", "\u0627\u0644\u062a\u0627\u0631\u064a\u062e", "\u0627\u0644\u0646\u064a\u0644", "\u0628\u063a\u062f\u0627\u062f", "\u0628\u064a\u0631\u0648\u062a", "\u062c\u064a\u0632\u0629", "\u062e\u0637 \u0627\u0644\u0646\u0638\u0627\u0645", "\u062f\u0645\u0634\u0642", "\u062f\u064a\u0648\u0627\u0646 \u062b\u0644\u062b", "\u062f\u064a\u0648\u0627\u0646 \u0643\u0648\u0641\u064a", "\u0635\u0646\u0639\u0627\u0621", "\u0641\u0627\u0631\u0633\u064a", "\u0641\u0631\u062d", "\u0643\u0648\u0641\u064a", "\u0645\u0646\u0649", "\u0645\u0650\u0635\u062d\u0641\u064a", "\u0645\u0650\u0635\u062d\u0641\u064a \u0630\u0647\u0628\u064a", "\u0646\u062f\u064a\u0645", "\u0646\u0633\u062e", "\u0648\u0633\u064a\u0645", "\u0906\u0908\u0970\u091f\u0940\u0970\u090f\u092b\u093c\u0970 \u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940", "\u0906\u0908\u0970\u091f\u0940\u0970\u090f\u092b\u093c\u0970 \u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940 \u092e\u0930\u093e\u0920\u0940", "\u0915\u094b\u0939\u093f\u0928\u0942\u0930 \u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940", "\u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940 \u090f\u092e\u0970\u091f\u0940\u0970", "\u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940 \u0938\u0902\u0917\u092e \u090f\u092e\u0970\u090f\u0928\u0970", "\u0936\u094d\u0930\u0940 \u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940 \u096d\u0967\u096a", "\u0e41\u0e1a\u0e1a\u0e2d\u0e31\u0e01\u0e29\u0e23\u0e23\u0e30\u0e1a\u0e1a", "\u2e41\u7175\u6120\u82a9\u82c8", "\u30b7\u30b9\u30c6\u30e0\u30d5\u30a9\u30f3\u30c8", "\u30d2\u30e9\u30ae\u30ce\u4e38\u30b4 Pro", "\u30d2\u30e9\u30ae\u30ce\u4e38\u30b4 Pro W4", "\u30d2\u30e9\u30ae\u30ce\u4e38\u30b4 ProN", "\u30d2\u30e9\u30ae\u30ce\u4e38\u30b4 ProN W4", "\u30d2\u30e9\u30ae\u30ce\u660e\u671d Pro", "\u30d2\u30e9\u30ae\u30ce\u660e\u671d Pro W3", "\u30d2\u30e9\u30ae\u30ce\u660e\u671d Pro W6", "\u30d2\u30e9\u30ae\u30ce\u660e\u671d ProN", "\u30d2\u30e9\u30ae\u30ce\u660e\u671d ProN W3", "\u30d2\u30e9\u30ae\u30ce\u660e\u671d ProN W6", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 Pro", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 Pro W3", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 Pro W6", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 ProN", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 ProN W3", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 ProN W6", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 Std", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 Std W8", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 StdN", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 StdN W8", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 \u7c21\u4f53\u4e2d\u6587", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 \u7c21\u4f53\u4e2d\u6587 W3", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 \u7c21\u4f53\u4e2d\u6587 W6", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W0", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W1", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W2", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W3", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W4", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W5", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W6", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W7", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W8", "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W9", "\u51ac\u9752\u9ed1\u4f53\u7b80\u4f53\u4e2d\u6587", "\u51ac\u9752\u9ed1\u4f53\u7b80\u4f53\u4e2d\u6587 W3", "\u51ac\u9752\u9ed1\u4f53\u7b80\u4f53\u4e2d\u6587 W6", "\u51ac\u9752\u9ed1\u9ad4\u7c21\u9ad4\u4e2d\u6587", "\u51ac\u9752\u9ed1\u9ad4\u7c21\u9ad4\u4e2d\u6587 W3", "\u51ac\u9752\u9ed1\u9ad4\u7c21\u9ad4\u4e2d\u6587 W6", "\u5b8b\u4f53-\u7b80", "\u5b8b\u4f53-\u7e41", "\u5b8b\u9ad4-\u7c21", "\u5b8b\u9ad4-\u7e41", "\u7cfb\u7d71\u5b57\u9ad4", "\u7cfb\u7edf\u5b57\u4f53", "\u82f9\u65b9-\u6e2f", "\u82f9\u65b9-\u7b80", "\u82f9\u65b9-\u7e41", "\u8371\u8389\u834d\u836d\u8a70\u8353\u2050\u726f", "\u8371\u8389\u834d\u836d\u8a70\u8353\u2053\u7464", "\u8371\u8389\u834d\u836d\u8a70\u8353\u8356\u8362\u834e", "\u8371\u8389\u834d\u836d\u8adb\u8353\u2050\u726f", "\u8371\u8389\u834d\u836d\u96be\u92a9\u2050\u726f", "\u860b\u65b9-\u6e2f", "\u860b\u65b9-\u7c21", "\u860b\u65b9-\u7e41", "\u9ed1\u4f53-\u7b80", "\u9ed1\u4f53-\u7e41", "\u9ed1\u9ad4-\u7c21", "\u9ed1\u9ad4-\u7e41", "\u9ed2\u4f53-\u7c21", "\u9ed2\u4f53-\u7e41", "\uc2dc\uc2a4\ud15c \uc11c\uccb4" + ".Al Bayan PUA", ".Al Nile PUA", ".Al Tarikh PUA", ".Apple Color Emoji UI", ".Apple SD Gothic NeoI", + ".Aqua Kana", ".Aqua Kana Bold", ".Aqua かな", ".Aqua かな ボールド", ".Arial Hebrew Desk Interface", + ".Baghdad PUA", ".Beirut PUA", ".Damascus PUA", ".DecoType Naskh PUA", ".Diwan Kufi PUA", ".Farah PUA", + ".Geeza Pro Interface", ".Geeza Pro PUA", ".Hiragino Kaku Gothic Interface", ".Hiragino Sans GB Interface", + ".Keyboard", ".KufiStandardGK PUA", ".LastResort", ".Lucida Grande UI", ".Muna PUA", ".Nadeem PUA", + ".New York", ".Noto Nastaliq Urdu UI", ".SF Arabic", ".SF Arabic Rounded", ".SF Compact", ".SF Compact Rounded", + ".SF NS", ".SF NS Mono", ".SF NS Rounded", ".Sana PUA", ".Savoye LET CC.", ".ThonburiUI", ".ThonburiUIWatch", + "Academy Engraved LET", "Adobe Arabic", "Adobe Devanagari", "Adobe Fan Heiti Std", "Adobe Gothic Std", + "Adobe Hebrew", "Adobe Heiti Std", "Adobe Ming Std", "Adobe Myungjo Std", "Adobe Song Std", + "Adobe Thai", "Al Bayan", "Al Nile", "Al Tarikh", "American Typewriter", "American Typewriter Semibold", + "Andale Mono", "Anonymous Pro", "Apple Braille", "Apple Chancery", "Apple Color Emoji", "Apple SD Gothic Neo", + "Apple SD Gothic Neo ExtraBold", "Apple SD 산돌고딕 Neo", "Apple Symbols", "AppleGothic", "AppleMyungjo", + "Arial", "Arial Black", "Arial Hebrew", "Arial Hebrew Scholar", "Arial Narrow", "Arial Rounded MT Bold", + "Arial Unicode MS", "Athelas", "Avenir", "Avenir Black", "Avenir Black Oblique", "Avenir Book", + "Avenir Heavy", "Avenir Light", "Avenir Medium", "Avenir Next", "Avenir Next Condensed", "Avenir Next Condensed Demi Bold", + "Avenir Next Condensed Heavy", "Avenir Next Condensed Medium", "Avenir Next Condensed Ultra Light", + "Avenir Next Demi Bold", "Avenir Next Heavy", "Avenir Next Medium", "Avenir Next Ultra Light", + "Ayuthaya", "Baghdad", "Bangla MN", "Bangla Sangam MN", "Barlow", "Baskerville", "Bebas Neue", + "Beirut", "Big Caslon", "Bodoni 72", "Bodoni 72 Oldstyle", "Bodoni 72 Smallcaps", "Bodoni Ornaments", + "Bradley Hand", "Brush Script MT", "Cabin", "Chalkboard", "Chalkboard SE", "Chalkduster", "Charter", + "Charter Black", "Cochin", "Comic Sans MS", "Copperplate", "Corsiva Hebrew", "Courier", "Courier New", + "Czcionka systemowa", "DIN Alternate", "DIN Condensed", "DM Sans", "Damascus", "DecoType Naskh", + "Devanagari MT", "Devanagari Sangam MN", "Didot", "Diwan Kufi", "Diwan Thuluth", "Euphemia UCAS", + "Farah", "Farisi", "Fira Code", "Fira Mono", "Fira Sans", "Font Sistem", "Font de sistem", + "Font di sistema", "Font sustava", "Fonte do Sistema", "Futura", "Futura Bold", "GB18030 Bitmap", + "Galvji", "Geeza Pro", "Geneva", "Georgia", "Gill Sans", "Grantha Sangam MN", "Gujarati MT", + "Gujarati Sangam MN", "Gurmukhi MN", "Gurmukhi MT", "Gurmukhi Sangam MN", "Hack", "Heebo", + "Heiti SC", "Heiti TC", "Heiti-간체", "Heiti-번체", "Helvetica", "Helvetica Neue", "Herculanum", + "Hiragino Kaku Gothic Pro", "Hiragino Kaku Gothic Pro W3", "Hiragino Kaku Gothic Pro W6", "Hiragino Kaku Gothic ProN", + "Hiragino Kaku Gothic ProN W3", "Hiragino Kaku Gothic ProN W6", "Hiragino Kaku Gothic Std", + "Hiragino Kaku Gothic Std W8", "Hiragino Kaku Gothic StdN", "Hiragino Kaku Gothic StdN W8", + "Hiragino Maru Gothic Pro", "Hiragino Maru Gothic Pro W4", "Hiragino Maru Gothic ProN", "Hiragino Maru Gothic ProN W4", + "Hiragino Mincho Pro", "Hiragino Mincho Pro W3", "Hiragino Mincho Pro W6", "Hiragino Mincho ProN", + "Hiragino Mincho ProN W3", "Hiragino Mincho ProN W6", "Hiragino Sans", "Hiragino Sans GB", + "Hiragino Sans GB W3", "Hiragino Sans GB W6", "Hiragino Sans W0", "Hiragino Sans W1", "Hiragino Sans W2", + "Hiragino Sans W3", "Hiragino Sans W4", "Hiragino Sans W5", "Hiragino Sans W6", "Hiragino Sans W7", + "Hiragino Sans W8", "Hiragino Sans W9", "Hoefler Text", "Hoefler Text Ornaments", "IBM Plex Mono", + "ITF Devanagari", "ITF Devanagari Marathi", "Impact", "InaiMathi", "InaiMathi Bold", "Inconsolata", + "Inter", "Iosevka", "Iowan Old Style", "Iowan Old Style Black", "JetBrains Mono", "Josefin Sans", + "Järjestelmäfontti", "Kailasa", "Kannada MN", "Kannada Sangam MN", "Karla", "Khmer MN", "Khmer Sangam MN", + "Kohinoor Bangla", "Kohinoor Devanagari", "Kohinoor Devanagari Medium", "Kohinoor Gujarati", + "Kohinoor Telugu", "Kokonor", "Kozuka Gothic Pr6N", "Kozuka Mincho Pr6N", "Krungthep", "KufiStandardGK", + "Lao MN", "Lao Sangam MN", "Lato", "Lucida Grande", "Luminari", "Malayalam MN", "Malayalam Sangam MN", + "Manrope", "Marion", "Marker Felt", "Menlo", "Merriweather", "Meslo LG L", "Meslo LG M", "Meslo LG S", + "Microsoft Sans Serif", "Minion Pro", "Mishafi", "Mishafi Gold", "Monaco", "Montserrat", "Mshtakan", + "Mukta", "Mukta Mahee", "MuktaMahee Bold", "MuktaMahee ExtraBold", "MuktaMahee ExtraLight", + "MuktaMahee Light", "MuktaMahee Medium", "MuktaMahee Regular", "MuktaMahee SemiBold", "Muna", + "Myanmar MN", "Myanmar Sangam MN", "Myriad Pro", "Nadeem", "New Peninim MT", "Noteworthy", + "Noto Nastaliq Urdu", "Noto Sans Adlam", "Noto Sans Armenian", "Noto Sans Armenian Blk", "Noto Sans Armenian ExtBd", + "Noto Sans Armenian ExtLt", "Noto Sans Armenian Light", "Noto Sans Armenian Med", "Noto Sans Armenian SemBd", + "Noto Sans Armenian Thin", "Noto Sans Avestan", "Noto Sans Bamum", "Noto Sans Bassa Vah", "Noto Sans Batak", + "Noto Sans Bhaiksuki", "Noto Sans Brahmi", "Noto Sans Buginese", "Noto Sans Buhid", "Noto Sans CanAborig", + "Noto Sans Canadian Aboriginal", "Noto Sans Canadian Aboriginal Regular", "Noto Sans Carian", + "Noto Sans CaucAlban", "Noto Sans Caucasian Albanian", "Noto Sans Chakma", "Noto Sans Cham", + "Noto Sans Coptic", "Noto Sans Cuneiform", "Noto Sans Cypriot", "Noto Sans Duployan", "Noto Sans EgyptHiero", + "Noto Sans Egyptian Hieroglyphs", "Noto Sans Elbasan", "Noto Sans Glagolitic", "Noto Sans Gothic", + "Noto Sans Gunjala Gondi", "Noto Sans Hanifi Rohingya", "Noto Sans HanifiRohg", "Noto Sans Hanunoo", + "Noto Sans Hatran", "Noto Sans ImpAramaic", "Noto Sans Imperial Aramaic", "Noto Sans InsPahlavi", + "Noto Sans InsParthi", "Noto Sans Inscriptional Pahlavi", "Noto Sans Inscriptional Parthian", + "Noto Sans Javanese", "Noto Sans Kaithi", "Noto Sans Kannada", "Noto Sans Kannada Black", "Noto Sans Kannada ExtraBold", + "Noto Sans Kannada ExtraLight", "Noto Sans Kannada Light", "Noto Sans Kannada Medium", "Noto Sans Kannada SemiBold", + "Noto Sans Kannada Thin", "Noto Sans Kayah Li", "Noto Sans Kharoshthi", "Noto Sans Khojki", + "Noto Sans Khudawadi", "Noto Sans Lepcha", "Noto Sans Limbu", "Noto Sans Linear A", "Noto Sans Linear B", + "Noto Sans Lisu", "Noto Sans Lycian", "Noto Sans Lydian", "Noto Sans Mahajani", "Noto Sans Mandaic", + "Noto Sans Manichaean", "Noto Sans Marchen", "Noto Sans Masaram Gondi", "Noto Sans Meetei Mayek", + "Noto Sans Mende Kikakui", "Noto Sans Meroitic", "Noto Sans Miao", "Noto Sans Modi", "Noto Sans Mongolian", + "Noto Sans Mro", "Noto Sans Multani", "Noto Sans Myanmar", "Noto Sans Myanmar Blk", "Noto Sans Myanmar ExtBd", + "Noto Sans Myanmar ExtLt", "Noto Sans Myanmar Light", "Noto Sans Myanmar Med", "Noto Sans Myanmar SemBd", + "Noto Sans Myanmar Thin", "Noto Sans NKo", "Noto Sans Nabataean", "Noto Sans New Tai Lue", + "Noto Sans Newa", "Noto Sans Ol Chiki", "Noto Sans Old Hungarian", "Noto Sans Old Italic", + "Noto Sans Old North Arabian", "Noto Sans Old Permic", "Noto Sans Old Persian", "Noto Sans Old South Arabian", + "Noto Sans Old Turkic", "Noto Sans OldHung", "Noto Sans OldNorArab", "Noto Sans OldSouArab", + "Noto Sans Oriya", "Noto Sans Osage", "Noto Sans Osmanya", "Noto Sans Pahawh Hmong", "Noto Sans Palmyrene", + "Noto Sans Pau Cin Hau", "Noto Sans PhagsPa", "Noto Sans Phoenician", "Noto Sans PsaPahlavi", + "Noto Sans Psalter Pahlavi", "Noto Sans Rejang", "Noto Sans Samaritan", "Noto Sans Saurashtra", + "Noto Sans Sharada", "Noto Sans Siddham", "Noto Sans Sora Sompeng", "Noto Sans SoraSomp", "Noto Sans Sundanese", + "Noto Sans Syloti Nagri", "Noto Sans Syriac", "Noto Sans Tagalog", "Noto Sans Tagbanwa", "Noto Sans Tai Le", + "Noto Sans Tai Tham", "Noto Sans Tai Viet", "Noto Sans Takri", "Noto Sans Thaana", "Noto Sans Tifinagh", + "Noto Sans Tirhuta", "Noto Sans Ugaritic", "Noto Sans Vai", "Noto Sans Wancho", "Noto Sans Warang Citi", + "Noto Sans Yi", "Noto Sans Zawgyi", "Noto Sans Zawgyi Blk", "Noto Sans Zawgyi ExtBd", "Noto Sans Zawgyi ExtLt", + "Noto Sans Zawgyi Light", "Noto Sans Zawgyi Med", "Noto Sans Zawgyi SemBd", "Noto Sans Zawgyi Thin", + "Noto Serif Ahom", "Noto Serif Balinese", "Noto Serif Hmong Nyiakeng", "Noto Serif Myanmar", + "Noto Serif Myanmar Blk", "Noto Serif Myanmar ExtBd", "Noto Serif Myanmar ExtLt", "Noto Serif Myanmar Light", + "Noto Serif Myanmar Med", "Noto Serif Myanmar SemBd", "Noto Serif Myanmar Thin", "Noto Serif Yezidi", + "Nunito", "Nunito Sans", "Open Sans", "Optima", "Oriya MN", "Oriya Sangam MN", "Oswald", "Overpass Mono", + "PT Mono", "PT Sans", "PT Sans Caption", "PT Sans Narrow", "PT Serif", "PT Serif Caption", + "Palatino", "Papyrus", "Party LET", "Phosphate", "Phông chữ Hệ thống", "Plantagenet Cherokee", + "Playfair Display", "Police système", "Poppins", "Quicksand", "Raanana", "Raleway", "Rendszerbetűtípus", + "Roboto", "Roboto Condensed", "Roboto Mono", "Roboto Slab", "Rockwell", "Rubik", "STIX Two Math", + "STIX Two Math Regular", "STIX Two Text", "STIX Two Text Regular", "STIXGeneral", "STIXIntegralsD", + "STIXIntegralsSm", "STIXIntegralsUp", "STIXIntegralsUpD", "STIXIntegralsUpSm", "STIXNonUnicode", + "STIXSizeFiveSym", "STIXSizeFourSym", "STIXSizeOneSym", "STIXSizeThreeSym", "STIXSizeTwoSym", + "STIXVariants", "STSong", "Sana", "Sathu", "Savoye LET", "Seravek", "Seravek ExtraLight", "Seravek Light", + "Seravek Medium", "Shree Devanagari 714", "SignPainter", "SignPainter-HouseScript", "Silom", + "Sinhala MN", "Sinhala Sangam MN", "Sistem Fontu", "Skia", "Snell Roundhand", "Songti SC", + "Songti TC", "Source Code Pro", "Source Sans 3", "Source Serif 4", "Space Mono", "Sukhumvit Set", + "Superclarendon", "Symbol", "Systeemlettertype", "System Font", "Systemschrift", "Systemskrift", + "Systemtypsnitt", "Systémové písmo", "Tahoma", "Tamil MN", "Tamil Sangam MN", "Telugu MN", + "Telugu Sangam MN", "Thonburi", "Times", "Times New Roman", "Tipo de letra del sistema", "Tipo de letra do sistema", + "Tipus de lletra del sistema", "Titillium Web", "Trattatello", "Trebuchet MS", "Verdana", "Victor Mono", + "Waseem", "Webdings", "Wingdings", "Wingdings 2", "Wingdings 3", "Work Sans", "Zapf Dingbats", + "Zapfino", "Γραμματοσειρά συστήματος", "Системний шрифт", "Системный шрифт", "גופן מערכת", + "البيان", "التاريخ", "النيل", "بغداد", "بيروت", "جيزة", "خط النظام", "دمشق", "ديوان ثلث", "ديوان كوفي", + "صنعاء", "فارسي", "فرح", "كوفي", "منى", "مِصحفي", "مِصحفي ذهبي", "نديم", "نسخ", "وسيم", "कोहिनूर देवनागरी", + "แบบอักษรระบบ", "システムフォント", "ヒラギノ丸ゴ Pro", "ヒラギノ丸ゴ Pro W4", "ヒラギノ丸ゴ ProN", "ヒラギノ丸ゴ ProN W4", + "ヒラギノ明朝 Pro", "ヒラギノ明朝 Pro W3", "ヒラギノ明朝 Pro W6", "ヒラギノ明朝 ProN", "ヒラギノ明朝 ProN W3", "ヒラギノ明朝 ProN W6", + "ヒラギノ角ゴ Pro", "ヒラギノ角ゴ Pro W3", "ヒラギノ角ゴ Pro W6", "ヒラギノ角ゴ ProN", "ヒラギノ角ゴ ProN W3", "ヒラギノ角ゴ ProN W6", + "ヒラギノ角ゴ Std", "ヒラギノ角ゴ Std W8", "ヒラギノ角ゴ StdN", "ヒラギノ角ゴ StdN W8", "ヒラギノ角ゴ 簡体中文", "ヒラギノ角ゴ 簡体中文 W3", + "ヒラギノ角ゴ 簡体中文 W6", "ヒラギノ角ゴシック", "ヒラギノ角ゴシック W0", "ヒラギノ角ゴシック W1", "ヒラギノ角ゴシック W2", "ヒラギノ角ゴシック W3", + "ヒラギノ角ゴシック W4", "ヒラギノ角ゴシック W5", "ヒラギノ角ゴシック W6", "ヒラギノ角ゴシック W7", "ヒラギノ角ゴシック W8", "ヒラギノ角ゴシック W9", + "冬青黑体简体中文", "冬青黑体简体中文 W3", "冬青黑体简体中文 W6", "冬青黑體簡體中文", "冬青黑體簡體中文 W3", "冬青黑體簡體中文 W6", "宋体-简", + "宋体-繁", "宋體-簡", "宋體-繁", "系統字體", "系统字体", "黑体-简", "黑体-繁", "黑體-簡", "黑體-繁", "黒体-簡", "黒体-繁", "시스템 서체" ], "lin": [ - "Arimo", "Cousine", "Noto Naskh Arabic", "Noto Sans Adlam", "Noto Sans Armenian", "Noto Sans Balinese", "Noto Sans Bamum", "Noto Sans Bassa Vah", "Noto Sans Batak", "Noto Sans Bengali", "Noto Sans Buginese", "Noto Sans Buhid", "Noto Sans Canadian Aboriginal", "Noto Sans Chakma", "Noto Sans Cham", "Noto Sans Cherokee", "Noto Sans Coptic", "Noto Sans Deseret", "Noto Sans Devanagari", "Noto Sans Elbasan", "Noto Sans Ethiopic", "Noto Sans Georgian", "Noto Sans Grantha", "Noto Sans Gujarati", "Noto Sans Gunjala Gondi", "Noto Sans Gurmukhi", "Noto Sans Hanifi Rohingya", "Noto Sans Hanunoo", "Noto Sans Hebrew", "Noto Sans JP", "Noto Sans Javanese", "Noto Sans KR", "Noto Sans Kannada", "Noto Sans Kayah Li", "Noto Sans Khmer", "Noto Sans Khojki", "Noto Sans Khudawadi", "Noto Sans Lao", "Noto Sans Lepcha", "Noto Sans Limbu", "Noto Sans Lisu", "Noto Sans Mahajani", "Noto Sans Malayalam", "Noto Sans Mandaic", "Noto Sans Masaram Gondi", "Noto Sans Medefaidrin", "Noto Sans Meetei Mayek", "Noto Sans Mende Kikakui", "Noto Sans Miao", "Noto Sans Modi", "Noto Sans Mongolian", "Noto Sans Mro", "Noto Sans Multani", "Noto Sans Myanmar", "Noto Sans NKo", "Noto Sans New Tai Lue", "Noto Sans Newa", "Noto Sans Ol Chiki", "Noto Sans Oriya", "Noto Sans Osage", "Noto Sans Osmanya", "Noto Sans Pahawh Hmong", "Noto Sans Pau Cin Hau", "Noto Sans Rejang", "Noto Sans Runic", "Noto Sans SC", "Noto Sans Samaritan", "Noto Sans Saurashtra", "Noto Sans Sharada", "Noto Sans Shavian", "Noto Sans Sinhala", "Noto Sans Sora Sompeng", "Noto Sans Soyombo", "Noto Sans Sundanese", "Noto Sans Syloti Nagri", "Noto Sans Symbols", "Noto Sans Symbols 2", "Noto Sans Syriac", "Noto Sans TC", "Noto Sans Tagalog", "Noto Sans Tagbanwa", "Noto Sans Tai Le", "Noto Sans Tai Tham", "Noto Sans Tai Viet", "Noto Sans Takri", "Noto Sans Tamil", "Noto Sans Telugu", "Noto Sans Thaana", "Noto Sans Thai", "Noto Sans Tifinagh", "Noto Sans Tifinagh APT", "Noto Sans Tifinagh Adrar", "Noto Sans Tifinagh Agraw Imazighen", "Noto Sans Tifinagh Ahaggar", "Noto Sans Tifinagh Air", "Noto Sans Tifinagh Azawagh", "Noto Sans Tifinagh Ghat", "Noto Sans Tifinagh Hawad", "Noto Sans Tifinagh Rhissa Ixa", "Noto Sans Tifinagh SIL", "Noto Sans Tifinagh Tawellemmet", "Noto Sans Tirhuta", "Noto Sans Vai", "Noto Sans Wancho", "Noto Sans Warang Citi", "Noto Sans Yi", "Noto Sans Zanabazar Square", "Noto Serif Armenian", "Noto Serif Balinese", "Noto Serif Bengali", "Noto Serif Devanagari", "Noto Serif Dogra", "Noto Serif Ethiopic", "Noto Serif Georgian", "Noto Serif Grantha", "Noto Serif Gujarati", "Noto Serif Gurmukhi", "Noto Serif Hebrew", "Noto Serif Kannada", "Noto Serif Khmer", "Noto Serif Khojki", "Noto Serif Lao", "Noto Serif Malayalam", "Noto Serif Myanmar", "Noto Serif NP Hmong", "Noto Serif Sinhala", "Noto Serif Tamil", "Noto Serif Telugu", "Noto Serif Thai", "Noto Serif Tibetan", "Noto Serif Yezidi", "STIX Two Math", "Tinos", "Twemoji Mozilla" + "Adobe Arabic", "Adobe Devanagari", "Adobe Fan Heiti Std", "Adobe Gothic Std", "Adobe Hebrew", + "Adobe Heiti Std", "Adobe Ming Std", "Adobe Myungjo Std", "Adobe Song Std", "Adobe Thai", "Alef", + "Amiri", "Amiri Quran", "Anonymous Pro", "Arial", "Arial Narrow", "Arimo", "Avant Garde", "Barlow", + "Bebas Neue", "Bookman Old Style", "C059", "Cabin", "Caladea", "Calibri", "Cambria", "Carlito", + "Century Schoolbook", "Courier", "Courier New", "Cousine", "D050000L", "DM Sans", "David CLM", + "David Libre", "DejaVu Math TeX Gyre", "DejaVu Sans", "DejaVu Sans Condensed", "DejaVu Sans Light", + "DejaVu Sans Mono", "DejaVu Serif", "DejaVu Serif Condensed", "Droid Sans Fallback", "Fira Code", + "Fira Mono", "Fira Sans", "Frank Ruehl CLM", "FreeMono", "FreeSans", "FreeSerif", "Gentium Basic", + "Gentium Book Basic", "Hack", "Heebo", "Helvetica", "Helvetica Narrow", "IBM Plex Mono", "Inconsolata", + "Inter", "Iosevka", "JetBrains Mono", "Josefin Sans", "KacstBook", "KacstOffice", "Karla", + "Kozuka Gothic Pr6N", "Kozuka Mincho Pr6N", "Lato", "Liberation Mono", "Liberation Sans", "Liberation Sans Narrow", + "Liberation Serif", "Linux Biolinum O", "Linux Libertine Display O", "Linux Libertine O", "Manrope", + "Merriweather", "Meslo LG L", "Meslo LG M", "Meslo LG S", "Minion Pro", "Miriam CLM", "Miriam Mono CLM", + "Montserrat", "Mukta", "Myriad Pro", "Nimbus Mono PS", "Nimbus Roman", "Nimbus Sans", "Nimbus Sans Narrow", + "Noto Color Emoji", "Noto Kufi Arabic", "Noto Looped Lao", "Noto Looped Thai", "Noto Mono", + "Noto Music", "Noto Naskh Arabic", "Noto Nastaliq Urdu", "Noto Rashi Hebrew", "Noto Sans", + "Noto Sans Adlam", "Noto Sans Adlam Unjoined", "Noto Sans Anatolian Hieroglyphs", "Noto Sans Arabic", + "Noto Sans Armenian", "Noto Sans Avestan", "Noto Sans Balinese", "Noto Sans Bamum", "Noto Sans Bassa Vah", + "Noto Sans Batak", "Noto Sans Bengali", "Noto Sans Bhaiksuki", "Noto Sans Brahmi", "Noto Sans Buginese", + "Noto Sans Buhid", "Noto Sans CJK HK", "Noto Sans CJK JP", "Noto Sans CJK KR", "Noto Sans CJK SC", + "Noto Sans CJK TC", "Noto Sans Canadian Aboriginal", "Noto Sans Carian", "Noto Sans Caucasian Albanian", + "Noto Sans Chakma", "Noto Sans Cham", "Noto Sans Cherokee", "Noto Sans Coptic", "Noto Sans Cuneiform", + "Noto Sans Cypriot", "Noto Sans Deseret", "Noto Sans Devanagari", "Noto Sans Display", "Noto Sans Duployan", + "Noto Sans Egyptian Hieroglyphs", "Noto Sans Elbasan", "Noto Sans Elymaic", "Noto Sans Ethiopic", + "Noto Sans Georgian", "Noto Sans Glagolitic", "Noto Sans Gothic", "Noto Sans Grantha", "Noto Sans Gujarati", + "Noto Sans Gunjala Gondi", "Noto Sans Gurmukhi", "Noto Sans Hanifi Rohingya", "Noto Sans Hanunoo", + "Noto Sans Hatran", "Noto Sans Hebrew", "Noto Sans Imperial Aramaic", "Noto Sans Indic Siyaq Numbers", + "Noto Sans Inscriptional Pahlavi", "Noto Sans Inscriptional Parthian", "Noto Sans Javanese", + "Noto Sans Kaithi", "Noto Sans Kannada", "Noto Sans Kayah Li", "Noto Sans Kharoshthi", "Noto Sans Khmer", + "Noto Sans Khojki", "Noto Sans Khudawadi", "Noto Sans Lao", "Noto Sans Lepcha", "Noto Sans Limbu", + "Noto Sans Linear A", "Noto Sans Linear B", "Noto Sans Lisu", "Noto Sans Lycian", "Noto Sans Lydian", + "Noto Sans Mahajani", "Noto Sans Malayalam", "Noto Sans Mandaic", "Noto Sans Manichaean", "Noto Sans Marchen", + "Noto Sans Masaram Gondi", "Noto Sans Math", "Noto Sans Mayan Numerals", "Noto Sans Medefaidrin", + "Noto Sans Meetei Mayek", "Noto Sans Mende Kikakui", "Noto Sans Meroitic", "Noto Sans Miao", + "Noto Sans Modi", "Noto Sans Mongolian", "Noto Sans Mono", "Noto Sans Mono CJK HK", "Noto Sans Mono CJK JP", + "Noto Sans Mono CJK KR", "Noto Sans Mono CJK SC", "Noto Sans Mono CJK TC", "Noto Sans Mro", + "Noto Sans Multani", "Noto Sans Myanmar", "Noto Sans NKo", "Noto Sans Nabataean", "Noto Sans New Tai Lue", + "Noto Sans Newa", "Noto Sans Nushu", "Noto Sans Ogham", "Noto Sans Ol Chiki", "Noto Sans Old Hungarian", + "Noto Sans Old Italic", "Noto Sans Old North Arabian", "Noto Sans Old Permic", "Noto Sans Old Persian", + "Noto Sans Old Sogdian", "Noto Sans Old South Arabian", "Noto Sans Old Turkic", "Noto Sans Oriya", + "Noto Sans Osage", "Noto Sans Osmanya", "Noto Sans Pahawh Hmong", "Noto Sans Palmyrene", "Noto Sans Pau Cin Hau", + "Noto Sans PhagsPa", "Noto Sans Phoenician", "Noto Sans Psalter Pahlavi", "Noto Sans Rejang", + "Noto Sans Runic", "Noto Sans Samaritan", "Noto Sans Saurashtra", "Noto Sans Sharada", "Noto Sans Shavian", + "Noto Sans Siddham", "Noto Sans SignWriting", "Noto Sans Sinhala", "Noto Sans Sogdian", "Noto Sans Sora Sompeng", + "Noto Sans Soyombo", "Noto Sans Sundanese", "Noto Sans Syloti Nagri", "Noto Sans Symbols", + "Noto Sans Symbols2", "Noto Sans Syriac", "Noto Sans Tagalog", "Noto Sans Tagbanwa", "Noto Sans Tai Le", + "Noto Sans Tai Tham", "Noto Sans Tai Viet", "Noto Sans Takri", "Noto Sans Tamil", "Noto Sans Tamil Supplement", + "Noto Sans Telugu", "Noto Sans Thaana", "Noto Sans Thai", "Noto Sans Tifinagh", "Noto Sans Tifinagh APT", + "Noto Sans Tifinagh Adrar", "Noto Sans Tifinagh Agraw Imazighen", "Noto Sans Tifinagh Ahaggar", + "Noto Sans Tifinagh Air", "Noto Sans Tifinagh Azawagh", "Noto Sans Tifinagh Ghat", "Noto Sans Tifinagh Hawad", + "Noto Sans Tifinagh Rhissa Ixa", "Noto Sans Tifinagh SIL", "Noto Sans Tifinagh Tawellemmet", + "Noto Sans Tirhuta", "Noto Sans Ugaritic", "Noto Sans Vai", "Noto Sans Wancho", "Noto Sans Warang Citi", + "Noto Sans Yi", "Noto Sans Zanabazar Square", "Noto Serif", "Noto Serif Ahom", "Noto Serif Armenian", + "Noto Serif Balinese", "Noto Serif Bengali", "Noto Serif CJK HK", "Noto Serif CJK JP", "Noto Serif CJK KR", + "Noto Serif CJK SC", "Noto Serif CJK TC", "Noto Serif Devanagari", "Noto Serif Display", "Noto Serif Dogra", + "Noto Serif Ethiopic", "Noto Serif Georgian", "Noto Serif Grantha", "Noto Serif Gujarati", + "Noto Serif Gurmukhi", "Noto Serif Hebrew", "Noto Serif Hmong Nyiakeng", "Noto Serif Kannada", + "Noto Serif Khmer", "Noto Serif Khojki", "Noto Serif Lao", "Noto Serif Malayalam", "Noto Serif Myanmar", + "Noto Serif Sinhala", "Noto Serif Tamil", "Noto Serif Tamil Slanted", "Noto Serif Tangut", + "Noto Serif Telugu", "Noto Serif Thai", "Noto Serif Tibetan", "Noto Serif Yezidi", "Noto Traditional Nushu", + "Nunito", "Nunito Sans", "Open Sans", "OpenSymbol", "Oswald", "Overpass Mono", "P052", "PT Mono", + "PT Sans", "PT Serif", "Palatino", "Palatino Linotype", "Playfair Display", "Poppins", "Quicksand", + "Raleway", "Reem Kufi", "Roboto", "Roboto Condensed", "Roboto Mono", "Roboto Slab", "Rubik", + "Scheherazade", "Source Code Pro", "Source Sans 3", "Source Serif 4", "Space Mono", "Standard Symbols PS", + "Symbol", "Times", "Times New Roman", "Tinos", "Titillium Web", "Twemoji Mozilla", "URW Bookman", + "URW Gothic", "Ubuntu", "Ubuntu Mono", "Ubuntu Sans", "Ubuntu Sans Mono", "Victor Mono", "Work Sans", + "Z003", "Zapf Chancery" ] } diff --git a/scripts/data/font-manifests.json b/scripts/data/font-manifests.json new file mode 100644 index 0000000..68d50a5 --- /dev/null +++ b/scripts/data/font-manifests.json @@ -0,0 +1,2125 @@ +{ + "win": { + "bases": { + "win10": { + "weight": 0.35, + "fonts": [ + "Arial", + "Arial Black", + "Bahnschrift", + "Calibri", + "Calibri Light", + "Cambria", + "Cambria Math", + "Candara", + "Candara Light", + "Comic Sans MS", + "Consolas", + "Constantia", + "Corbel", + "Corbel Light", + "Courier", + "Courier New", + "Ebrima", + "Franklin Gothic Medium", + "Gabriola", + "Gadugi", + "Georgia", + "Helvetica", + "HoloLens MDL2 Assets", + "Impact", + "Ink Free", + "Javanese Text", + "Leelawadee UI", + "Leelawadee UI Semilight", + "Lucida Console", + "Lucida Sans Unicode", + "Malgun Gothic", + "Marlett", + "Microsoft Himalaya", + "Microsoft JhengHei", + "Microsoft New Tai Lue", + "Microsoft PhagsPa", + "Microsoft Sans Serif", + "MS Sans Serif", + "MS Serif", + "Microsoft Tai Le", + "Microsoft YaHei", + "Microsoft Yi Baiti", + "MingLiU-ExtB", + "MingLiU_MSCS-ExtB", + "細明體_MSCS-ExtB", + "Mongolian Baiti", + "MS Gothic", + "MV Boli", + "Myanmar Text", + "Nirmala Text", + "Nirmala Text Semilight", + "Nirmala UI", + "Nirmala UI Semilight", + "Palatino Linotype", + "Segoe MDL2 Assets", + "Segoe Print", + "Segoe Script", + "Segoe UI", + "Segoe UI Black", + "Segoe UI Light", + "Segoe UI Semibold", + "Segoe UI Semilight", + "Segoe UI Historic", + "Segoe UI Emoji", + "Twemoji Mozilla", + "Segoe UI Symbol", + "SimSun", + "Sitka Small", + "Sitka Text", + "Sitka Subheading", + "Sitka Heading", + "Sitka Display", + "Sitka Banner", + "Sylfaen", + "Symbol", + "Tahoma", + "Roman", + "Small Fonts", + "Times", + "Times New Roman", + "Trebuchet MS", + "Verdana", + "Webdings", + "Wingdings", + "Yu Gothic", + "MS PGothic", + "MS UI Gothic", + "Malgun Gothic Semilight", + "Microsoft JhengHei Light", + "Microsoft JhengHei UI", + "Microsoft JhengHei UI Light", + "Microsoft YaHei Light", + "Microsoft YaHei UI", + "Microsoft YaHei UI Light", + "MingLiU_HKSCS-ExtB", + "NSimSun", + "PMingLiU-ExtB", + "SimSun-ExtB", + "Yu Gothic Light", + "Yu Gothic Medium", + "Yu Gothic UI", + "Yu Gothic UI Light", + "Yu Gothic UI Semibold", + "Yu Gothic UI Semilight", + "宋体", + "微軟正黑體", + "微軟正黑體 Light", + "微软雅黑", + "微软雅黑 Light", + "新宋体", + "新細明體-ExtB", + "游ゴシック", + "游ゴシック Light", + "游ゴシック Medium", + "細明體-ExtB", + "細明體_HKSCS-ExtB", + "맑은 고딕", + "맑은 고딕 Semilight", + "MS ゴシック", + "MS Pゴシック" + ] + }, + "win11": { + "weight": 0.65, + "fonts": [ + "Arial", + "Arial Black", + "Bahnschrift", + "Calibri", + "Calibri Light", + "Cambria", + "Cambria Math", + "Candara", + "Candara Light", + "Comic Sans MS", + "Consolas", + "Constantia", + "Corbel", + "Corbel Light", + "Courier", + "Courier New", + "Ebrima", + "Franklin Gothic Medium", + "Gabriola", + "Gadugi", + "Georgia", + "Helvetica", + "HoloLens MDL2 Assets", + "Impact", + "Ink Free", + "Javanese Text", + "Leelawadee UI", + "Leelawadee UI Semilight", + "Lucida Console", + "Lucida Sans Unicode", + "Malgun Gothic", + "Marlett", + "Microsoft Himalaya", + "Microsoft JhengHei", + "Microsoft New Tai Lue", + "Microsoft PhagsPa", + "Microsoft Sans Serif", + "MS Sans Serif", + "MS Serif", + "Microsoft Tai Le", + "Microsoft YaHei", + "Microsoft Yi Baiti", + "MingLiU-ExtB", + "MingLiU_MSCS-ExtB", + "細明體_MSCS-ExtB", + "Mongolian Baiti", + "MS Gothic", + "MV Boli", + "Myanmar Text", + "Nirmala Text", + "Nirmala Text Semilight", + "Nirmala UI", + "Nirmala UI Semilight", + "Palatino Linotype", + "Segoe MDL2 Assets", + "Segoe Print", + "Segoe Script", + "Segoe UI", + "Segoe UI Black", + "Segoe UI Light", + "Segoe UI Semibold", + "Segoe UI Semilight", + "Segoe UI Historic", + "Segoe UI Emoji", + "Twemoji Mozilla", + "Segoe UI Symbol", + "SimSun", + "Sitka Small", + "Sitka Text", + "Sitka Subheading", + "Sitka Heading", + "Sitka Display", + "Sitka Banner", + "Sylfaen", + "Symbol", + "Tahoma", + "Roman", + "Small Fonts", + "Times", + "Times New Roman", + "Trebuchet MS", + "Verdana", + "Webdings", + "Wingdings", + "Yu Gothic", + "Cascadia Code", + "Cascadia Mono", + "Segoe Fluent Icons", + "Segoe UI Variable Small", + "Segoe UI Variable Text", + "Segoe UI Variable Display", + "Sans Serif Collection", + "MS PGothic", + "MS UI Gothic", + "Malgun Gothic Semilight", + "Microsoft JhengHei Light", + "Microsoft JhengHei UI", + "Microsoft JhengHei UI Light", + "Microsoft YaHei Light", + "Microsoft YaHei UI", + "Microsoft YaHei UI Light", + "MingLiU_HKSCS-ExtB", + "NSimSun", + "PMingLiU-ExtB", + "SimSun-ExtB", + "Yu Gothic Light", + "Yu Gothic Medium", + "Yu Gothic UI", + "Yu Gothic UI Light", + "Yu Gothic UI Semibold", + "Yu Gothic UI Semilight", + "宋体", + "微軟正黑體", + "微軟正黑體 Light", + "微软雅黑", + "微软雅黑 Light", + "新宋体", + "新細明體-ExtB", + "游ゴシック", + "游ゴシック Light", + "游ゴシック Medium", + "細明體-ExtB", + "細明體_HKSCS-ExtB", + "맑은 고딕", + "맑은 고딕 Semilight", + "MS ゴシック", + "MS Pゴシック" + ] + } + }, + "additions": [ + { + "id": "office", + "kind": "bundle", + "prob": 0.5, + "source": "proprietary-win", + "fonts": [ + "Bodoni MT Condensed", + "Stencil", + "Perpetua Titling MT", + "Haettenschweiler", + "Matura MT Script Capitals", + "Elephant", + "Gill Sans MT Ext Condensed Bold", + "Palace Script MT", + "Modern No. 20", + "Perpetua", + "Wide Latin", + "Kunstler Script", + "Rockwell Extra Bold", + "Bell MT", + "Harrington", + "Vivaldi", + "Gill Sans Ultra Bold", + "Bookshelf Symbol 7", + "Rage Italic", + "Agency FB", + "Eras Bold ITC", + "Old English Text MT", + "Broadway", + "Copperplate Gothic Light", + "Snap ITC", + "Forte", + "Gigi", + "Rockwell Condensed", + "Colonna MT", + "Bauhaus 93", + "Poor Richard", + "Gill Sans MT", + "Centaur", + "MS Reference Specialty", + "Imprint MT Shadow", + "Copperplate Gothic Bold", + "Playbill", + "Harlow Solid Italic", + "Footlight MT Light", + "Viner Hand ITC", + "Bradley Hand ITC", + "Calisto MT", + "Eras Light ITC", + "Parchment", + "Bodoni MT Black", + "Engravers MT", + "Mistral", + "Goudy Stout", + "Pristina", + "Brush Script MT", + "High Tower Text", + "Niagara Solid", + "Ravie", + "Gill Sans MT Condensed", + "Informal Roman", + "Algerian", + "Maiandra GD", + "Tw Cen MT Condensed", + "Edwardian Script ITC", + "Britannic Bold", + "OCR A Extended", + "Bodoni MT Poster Compressed", + "Tempus Sans ITC", + "Eras Demi ITC", + "Jokerman", + "Niagara Engraved", + "Magneto", + "French Script MT", + "Tw Cen MT", + "Berlin Sans FB Demi", + "Tw Cen MT Condensed Extra Bold", + "Castellar", + "Script MT Bold", + "Freestyle Script", + "Blackadder ITC", + "Gloucester MT Extra Condensed", + "Bernard MT Condensed", + "Curlz MT", + "Felix Titling", + "Baskerville Old Face", + "Vladimir Script", + "Rockwell", + "Onyx", + "Kristen ITC", + "Bodoni MT", + "Cooper Black", + "Eras Medium ITC", + "Californian FB", + "Goudy Old Style", + "Gill Sans Ultra Bold Condensed", + "Papyrus", + "Chiller", + "Showcard Gothic", + "Juice ITC", + "Berlin Sans FB", + "MT Extra", + "Book Antiqua", + "Bookman Old Style", + "Century", + "Century Gothic", + "Century Schoolbook", + "Dubai", + "Franklin Gothic Book", + "Franklin Gothic Demi", + "Franklin Gothic Demi Cond", + "Franklin Gothic Heavy", + "Garamond", + "Lucida Bright", + "Lucida Calligraphy", + "Lucida Fax", + "Lucida Handwriting", + "Lucida Sans Typewriter", + "Monotype Corsiva", + "MS Outlook", + "MS Reference Sans Serif" + ] + }, + { + "id": "pan-euro", + "kind": "bundle", + "prob": 0.08, + "source": "proprietary-win", + "fonts": [ + "Arial Nova", + "Georgia Pro", + "Gill Sans Nova", + "Neue Haas Grotesk Text Pro", + "Rockwell Nova", + "Verdana Pro" + ] + }, + { + "id": "libreoffice", + "kind": "bundle", + "prob": 0.1, + "source": "open", + "fonts": [ + "Caladea", + "Carlito", + "Liberation Sans", + "Liberation Serif", + "Liberation Mono", + "Liberation Sans Narrow", + "DejaVu Sans", + "DejaVu Serif", + "DejaVu Sans Mono", + "DejaVu Sans Condensed", + "DejaVu Serif Condensed", + "DejaVu Sans Light", + "DejaVu Math TeX Gyre", + "Source Sans 3", + "Source Serif 4", + "Source Code Pro", + "Noto Sans", + "Noto Serif", + "Noto Mono", + "Noto Sans Arabic", + "Noto Naskh Arabic", + "Noto Kufi Arabic", + "Noto Sans Hebrew", + "Noto Serif Hebrew", + "Noto Sans Armenian", + "Noto Serif Armenian", + "Noto Sans Georgian", + "Noto Serif Georgian", + "Noto Sans Lao", + "Noto Serif Lao", + "Noto Sans Lisu", + "Gentium Basic", + "Gentium Book Basic", + "Amiri", + "Amiri Quran", + "Scheherazade", + "Reem Kufi", + "David Libre", + "Alef", + "OpenSymbol", + "Rubik" + ] + }, + { + "id": "adobe-cc", + "kind": "bundle", + "prob": 0.12, + "source": "proprietary", + "fonts": [ + "Minion Pro", + "Myriad Pro", + "Adobe Arabic", + "Adobe Hebrew", + "Adobe Devanagari", + "Adobe Thai" + ] + }, + { + "id": "cascadia", + "kind": "bundle", + "prob": 0.1, + "source": "open", + "fonts": [ + "Cascadia Code", + "Cascadia Mono" + ] + }, + { + "id": "cjk-tc", + "kind": "bundle", + "prob": 0.9, + "source": "proprietary-win", + "requiresLocale": "zh-TW", + "fonts": [ + "DFKai-SB" + ] + }, + { + "id": "meslo", + "kind": "bundle", + "prob": 0.04, + "source": "open", + "fonts": [ + "Meslo LG S", + "Meslo LG M", + "Meslo LG L" + ] + }, + { + "id": "dev", + "kind": "alacarte", + "prob": 0.35, + "source": "open", + "sizes": [ + { + "n": 1, + "w": 0.32 + }, + { + "n": 2, + "w": 0.24 + }, + { + "n": 3, + "w": 0.17 + }, + { + "n": 4, + "w": 0.11 + }, + { + "n": 5, + "w": 0.07 + }, + { + "n": 6, + "w": 0.045 + }, + { + "n": 7, + "w": 0.025 + }, + { + "n": 8, + "w": 0.015 + } + ], + "fonts": [ + "Fira Code", + "Fira Mono", + "JetBrains Mono", + "Source Code Pro", + "Inconsolata", + "Hack", + "IBM Plex Mono", + "Roboto Mono", + "Anonymous Pro", + "Iosevka", + "Space Mono", + "Victor Mono", + "PT Mono", + "Overpass Mono" + ] + }, + { + "id": "web", + "kind": "alacarte", + "prob": 0.45, + "source": "open", + "sizes": [ + { + "n": 1, + "w": 0.32 + }, + { + "n": 2, + "w": 0.24 + }, + { + "n": 3, + "w": 0.17 + }, + { + "n": 4, + "w": 0.11 + }, + { + "n": 5, + "w": 0.07 + }, + { + "n": 6, + "w": 0.045 + }, + { + "n": 7, + "w": 0.025 + }, + { + "n": 8, + "w": 0.015 + } + ], + "fonts": [ + "Roboto", + "Open Sans", + "Lato", + "Montserrat", + "Poppins", + "Oswald", + "Raleway", + "Nunito", + "Nunito Sans", + "Inter", + "Roboto Condensed", + "Roboto Slab", + "Merriweather", + "Work Sans", + "Rubik", + "Mukta", + "PT Sans", + "PT Serif", + "Fira Sans", + "Josefin Sans", + "Bebas Neue", + "Barlow", + "Karla", + "DM Sans", + "Manrope", + "Quicksand", + "Playfair Display", + "Titillium Web", + "Cabin", + "Heebo", + "Source Sans 3", + "Source Serif 4" + ] + } + ] + }, + "mac": { + "bases": { + "sonoma": { + "weight": 1, + "fonts": [ + ".Al Bayan PUA", + ".Al Nile PUA", + ".Al Tarikh PUA", + ".Apple Color Emoji UI", + ".Apple SD Gothic NeoI", + ".Aqua Kana", + ".Aqua Kana Bold", + ".Aqua かな", + ".Aqua かな ボールド", + ".Arial Hebrew Desk Interface", + ".Baghdad PUA", + ".Beirut PUA", + ".Damascus PUA", + ".DecoType Naskh PUA", + ".Diwan Kufi PUA", + ".Farah PUA", + ".Geeza Pro Interface", + ".Geeza Pro PUA", + ".Helvetica LT MM", + ".Hiragino Kaku Gothic Interface", + ".Hiragino Sans GB Interface", + ".Keyboard", + ".KufiStandardGK PUA", + ".LastResort", + ".Lucida Grande UI", + ".Muna PUA", + ".Nadeem PUA", + ".New York", + ".Noto Nastaliq Urdu UI", + ".PingFang HK", + ".PingFang SC", + ".PingFang TC", + ".SF Arabic", + ".SF Arabic Rounded", + ".SF Compact", + ".SF Compact Rounded", + ".SF NS", + ".SF NS Mono", + ".SF NS Rounded", + ".Sana PUA", + ".Savoye LET CC.", + ".ThonburiUI", + ".ThonburiUIWatch", + ".苹方-港", + ".苹方-简", + ".苹方-繁", + ".蘋方-港", + ".蘋方-簡", + ".蘋方-繁", + "Academy Engraved LET", + "Al Bayan", + "Al Nile", + "Al Tarikh", + "American Typewriter", + "American Typewriter Semibold", + "Andale Mono", + "Apple Braille", + "Apple Chancery", + "Apple Color Emoji", + "Apple SD Gothic Neo", + "Apple SD Gothic Neo ExtraBold", + "Apple SD 산돌고딕 Neo", + "Apple Symbols", + "AppleGothic", + "AppleMyungjo", + "Arial", + "Arial Black", + "Arial Hebrew", + "Arial Hebrew Scholar", + "Arial Narrow", + "Arial Rounded MT Bold", + "Arial Unicode MS", + "Athelas", + "Avenir", + "Avenir Black", + "Avenir Black Oblique", + "Avenir Book", + "Avenir Heavy", + "Avenir Light", + "Avenir Medium", + "Avenir Next", + "Avenir Next Condensed", + "Avenir Next Condensed Demi Bold", + "Avenir Next Condensed Heavy", + "Avenir Next Condensed Medium", + "Avenir Next Condensed Ultra Light", + "Avenir Next Demi Bold", + "Avenir Next Heavy", + "Avenir Next Medium", + "Avenir Next Ultra Light", + "Ayuthaya", + "Baghdad", + "Bangla MN", + "Bangla Sangam MN", + "Baskerville", + "Beirut", + "Big Caslon", + "Bodoni 72", + "Bodoni 72 Oldstyle", + "Bodoni 72 Smallcaps", + "Bodoni Ornaments", + "Bradley Hand", + "Brush Script MT", + "Chalkboard", + "Chalkboard SE", + "Chalkduster", + "Charter", + "Charter Black", + "Cochin", + "Comic Sans MS", + "Copperplate", + "Corsiva Hebrew", + "Courier", + "Courier New", + "Czcionka systemowa", + "DIN Alternate", + "DIN Condensed", + "Damascus", + "DecoType Naskh", + "Devanagari MT", + "Devanagari Sangam MN", + "Didot", + "Diwan Kufi", + "Diwan Thuluth", + "Euphemia UCAS", + "Farah", + "Farisi", + "Font Sistem", + "Font de sistem", + "Font di sistema", + "Font sustava", + "Fonte do Sistema", + "Futura", + "Futura Bold", + "GB18030 Bitmap", + "Galvji", + "Geeza Pro", + "Geneva", + "Georgia", + "Gill Sans", + "Grantha Sangam MN", + "Gujarati MT", + "Gujarati Sangam MN", + "Gurmukhi MN", + "Gurmukhi MT", + "Gurmukhi Sangam MN", + "Heiti SC", + "Heiti TC", + "Heiti-간체", + "Heiti-번체", + "Helvetica", + "Helvetica Neue", + "Herculanum", + "Hiragino Kaku Gothic Pro", + "Hiragino Kaku Gothic Pro W3", + "Hiragino Kaku Gothic Pro W6", + "Hiragino Kaku Gothic ProN", + "Hiragino Kaku Gothic ProN W3", + "Hiragino Kaku Gothic ProN W6", + "Hiragino Kaku Gothic Std", + "Hiragino Kaku Gothic Std W8", + "Hiragino Kaku Gothic StdN", + "Hiragino Kaku Gothic StdN W8", + "Hiragino Maru Gothic Pro", + "Hiragino Maru Gothic Pro W4", + "Hiragino Maru Gothic ProN", + "Hiragino Maru Gothic ProN W4", + "Hiragino Mincho Pro", + "Hiragino Mincho Pro W3", + "Hiragino Mincho Pro W6", + "Hiragino Mincho ProN", + "Hiragino Mincho ProN W3", + "Hiragino Mincho ProN W6", + "Hiragino Sans", + "Hiragino Sans GB", + "Hiragino Sans GB W3", + "Hiragino Sans GB W6", + "Hiragino Sans W0", + "Hiragino Sans W1", + "Hiragino Sans W2", + "Hiragino Sans W3", + "Hiragino Sans W4", + "Hiragino Sans W5", + "Hiragino Sans W6", + "Hiragino Sans W7", + "Hiragino Sans W8", + "Hiragino Sans W9", + "Hoefler Text", + "Hoefler Text Ornaments", + "ITF Devanagari", + "ITF Devanagari Marathi", + "Impact", + "InaiMathi", + "InaiMathi Bold", + "Iowan Old Style", + "Iowan Old Style Black", + "Järjestelmäfontti", + "Kailasa", + "Kannada MN", + "Kannada Sangam MN", + "Kefa", + "Khmer MN", + "Khmer Sangam MN", + "Kohinoor Bangla", + "Kohinoor Devanagari", + "Kohinoor Gujarati", + "Kohinoor Telugu", + "Kokonor", + "Krungthep", + "KufiStandardGK", + "Lao MN", + "Lao Sangam MN", + "Lucida Grande", + "Luminari", + "Malayalam MN", + "Malayalam Sangam MN", + "Marion", + "Marker Felt", + "Menlo", + "Microsoft Sans Serif", + "Mishafi", + "Mishafi Gold", + "Monaco", + "Mshtakan", + "Mukta Mahee", + "MuktaMahee Bold", + "MuktaMahee ExtraBold", + "MuktaMahee ExtraLight", + "MuktaMahee Light", + "MuktaMahee Medium", + "MuktaMahee Regular", + "MuktaMahee SemiBold", + "Muna", + "Myanmar MN", + "Myanmar Sangam MN", + "Nadeem", + "New Peninim MT", + "Noteworthy", + "Noto Nastaliq Urdu", + "Noto Sans Adlam", + "Noto Sans Armenian", + "Noto Sans Armenian Blk", + "Noto Sans Armenian ExtBd", + "Noto Sans Armenian ExtLt", + "Noto Sans Armenian Light", + "Noto Sans Armenian Med", + "Noto Sans Armenian SemBd", + "Noto Sans Armenian Thin", + "Noto Sans Avestan", + "Noto Sans Bamum", + "Noto Sans Bassa Vah", + "Noto Sans Batak", + "Noto Sans Bhaiksuki", + "Noto Sans Brahmi", + "Noto Sans Buginese", + "Noto Sans Buhid", + "Noto Sans CanAborig", + "Noto Sans Canadian Aboriginal", + "Noto Sans Canadian Aboriginal Regular", + "Noto Sans Carian", + "Noto Sans CaucAlban", + "Noto Sans Caucasian Albanian", + "Noto Sans Chakma", + "Noto Sans Cham", + "Noto Sans Coptic", + "Noto Sans Cuneiform", + "Noto Sans Cypriot", + "Noto Sans Duployan", + "Noto Sans EgyptHiero", + "Noto Sans Egyptian Hieroglyphs", + "Noto Sans Elbasan", + "Noto Sans Glagolitic", + "Noto Sans Gothic", + "Noto Sans Gunjala Gondi", + "Noto Sans Gunjala Gondi Regular", + "Noto Sans Hanifi Rohingya", + "Noto Sans HanifiRohg", + "Noto Sans Hanunoo", + "Noto Sans Hatran", + "Noto Sans ImpAramaic", + "Noto Sans Imperial Aramaic", + "Noto Sans InsPahlavi", + "Noto Sans InsParthi", + "Noto Sans Inscriptional Pahlavi", + "Noto Sans Inscriptional Parthian", + "Noto Sans Javanese", + "Noto Sans Kaithi", + "Noto Sans Kannada", + "Noto Sans Kannada Black", + "Noto Sans Kannada ExtraBold", + "Noto Sans Kannada ExtraLight", + "Noto Sans Kannada Light", + "Noto Sans Kannada Medium", + "Noto Sans Kannada SemiBold", + "Noto Sans Kannada Thin", + "Noto Sans Kayah Li", + "Noto Sans Kharoshthi", + "Noto Sans Khojki", + "Noto Sans Khudawadi", + "Noto Sans Lepcha", + "Noto Sans Limbu", + "Noto Sans Linear A", + "Noto Sans Linear B", + "Noto Sans Lisu", + "Noto Sans Lycian", + "Noto Sans Lydian", + "Noto Sans Mahajani", + "Noto Sans Mandaic", + "Noto Sans Manichaean", + "Noto Sans Marchen", + "Noto Sans Masaram Gondi", + "Noto Sans Masaram Gondi Regular", + "Noto Sans Meetei Mayek", + "Noto Sans Mende Kikakui", + "Noto Sans Meroitic", + "Noto Sans Miao", + "Noto Sans Modi", + "Noto Sans Mongolian", + "Noto Sans Mro", + "Noto Sans Multani", + "Noto Sans Myanmar", + "Noto Sans Myanmar Blk", + "Noto Sans Myanmar ExtBd", + "Noto Sans Myanmar ExtLt", + "Noto Sans Myanmar Light", + "Noto Sans Myanmar Med", + "Noto Sans Myanmar SemBd", + "Noto Sans Myanmar Thin", + "Noto Sans NKo", + "Noto Sans Nabataean", + "Noto Sans New Tai Lue", + "Noto Sans Newa", + "Noto Sans Ol Chiki", + "Noto Sans Old Hungarian", + "Noto Sans Old Italic", + "Noto Sans Old North Arabian", + "Noto Sans Old Permic", + "Noto Sans Old Persian", + "Noto Sans Old South Arabian", + "Noto Sans Old Turkic", + "Noto Sans OldHung", + "Noto Sans OldNorArab", + "Noto Sans OldSouArab", + "Noto Sans Oriya", + "Noto Sans Osage", + "Noto Sans Osmanya", + "Noto Sans Pahawh Hmong", + "Noto Sans Palmyrene", + "Noto Sans Pau Cin Hau", + "Noto Sans PhagsPa", + "Noto Sans Phoenician", + "Noto Sans PsaPahlavi", + "Noto Sans Psalter Pahlavi", + "Noto Sans Rejang", + "Noto Sans Samaritan", + "Noto Sans Saurashtra", + "Noto Sans Sharada", + "Noto Sans Siddham", + "Noto Sans Sora Sompeng", + "Noto Sans SoraSomp", + "Noto Sans Sundanese", + "Noto Sans Syloti Nagri", + "Noto Sans Syriac", + "Noto Sans Tagalog", + "Noto Sans Tagbanwa", + "Noto Sans Tai Le", + "Noto Sans Tai Tham", + "Noto Sans Tai Viet", + "Noto Sans Takri", + "Noto Sans Thaana", + "Noto Sans Tifinagh", + "Noto Sans Tirhuta", + "Noto Sans Ugaritic", + "Noto Sans Vai", + "Noto Sans Wancho", + "Noto Sans Warang Citi", + "Noto Sans Yi", + "Noto Sans Zawgyi", + "Noto Sans Zawgyi Blk", + "Noto Sans Zawgyi ExtBd", + "Noto Sans Zawgyi ExtLt", + "Noto Sans Zawgyi Light", + "Noto Sans Zawgyi Med", + "Noto Sans Zawgyi SemBd", + "Noto Sans Zawgyi Thin", + "Noto Serif Ahom", + "Noto Serif Balinese", + "Noto Serif Hmong Nyiakeng", + "Noto Serif Myanmar", + "Noto Serif Myanmar Blk", + "Noto Serif Myanmar ExtBd", + "Noto Serif Myanmar ExtLt", + "Noto Serif Myanmar Light", + "Noto Serif Myanmar Med", + "Noto Serif Myanmar SemBd", + "Noto Serif Myanmar Thin", + "Noto Serif Yezidi", + "Noto Serif Yezidi Regular", + "Optima", + "Oriya MN", + "Oriya Sangam MN", + "PT Mono", + "PT Sans", + "PT Sans Caption", + "PT Sans Narrow", + "PT Serif", + "PT Serif Caption", + "Palatino", + "Papyrus", + "Party LET", + "Phosphate", + "Phông chữ Hệ thống", + "PingFang HK", + "PingFang HK Light", + "PingFang SC", + "PingFang TC", + "Plantagenet Cherokee", + "Police système", + "Raanana", + "Rendszerbetűtípus", + "Rockwell", + "STIX Two Math", + "STIX Two Math Regular", + "STIX Two Text", + "STIX Two Text Regular", + "STIXGeneral", + "STIXIntegralsD", + "STIXIntegralsSm", + "STIXIntegralsUp", + "STIXIntegralsUpD", + "STIXIntegralsUpSm", + "STIXNonUnicode", + "STIXSizeFiveSym", + "STIXSizeFourSym", + "STIXSizeOneSym", + "STIXSizeThreeSym", + "STIXSizeTwoSym", + "STIXVariants", + "STSong", + "Sana", + "Sathu", + "Savoye LET", + "Seravek", + "Seravek ExtraLight", + "Seravek Light", + "Seravek Medium", + "Shree Devanagari 714", + "SignPainter", + "SignPainter-HouseScript", + "SignPainter-HouseScript Semibold", + "Silom", + "Sinhala MN", + "Sinhala Sangam MN", + "Sistem Fontu", + "Skia", + "Snell Roundhand", + "Songti SC", + "Songti TC", + "Sukhumvit Set", + "Superclarendon", + "Symbol", + "Systeemlettertype", + "System Font", + "Systemschrift", + "Systemskrift", + "Systemtypsnitt", + "Systémové písmo", + "Tahoma", + "Tamil MN", + "Tamil Sangam MN", + "Telugu MN", + "Telugu Sangam MN", + "Thonburi", + "Times", + "Times New Roman", + "Tipo de letra del sistema", + "Tipo de letra do sistema", + "Tipus de lletra del sistema", + "Trattatello", + "Trebuchet MS", + "Verdana", + "Waseem", + "Webdings", + "Wingdings", + "Wingdings 2", + "Wingdings 3", + "Zapf Dingbats", + "Zapfino", + "Γραμματοσειρά συστήματος", + "Системний шрифт", + "Системный шрифт", + "גופן מערכת", + "البيان", + "التاريخ", + "النيل", + "بغداد", + "بيروت", + "جيزة", + "خط النظام", + "دمشق", + "ديوان ثلث", + "ديوان كوفي", + "صنعاء", + "فارسي", + "فرح", + "كوفي", + "منى", + "مِصحفي", + "مِصحفي ذهبي", + "نديم", + "نسخ", + "وسيم", + "आई॰टी॰एफ़॰ देवनागरी", + "आई॰टी॰एफ़॰ देवनागरी मराठी", + "कोहिनूर देवनागरी", + "देवनागरी एम॰टी॰", + "देवनागरी संगम एम॰एन॰", + "श्री देवनागरी ७१४", + "แบบอักษรระบบ", + "⹁煵愠芩苈", + "システムフォント", + "ヒラギノ丸ゴ Pro", + "ヒラギノ丸ゴ Pro W4", + "ヒラギノ丸ゴ ProN", + "ヒラギノ丸ゴ ProN W4", + "ヒラギノ明朝 Pro", + "ヒラギノ明朝 Pro W3", + "ヒラギノ明朝 Pro W6", + "ヒラギノ明朝 ProN", + "ヒラギノ明朝 ProN W3", + "ヒラギノ明朝 ProN W6", + "ヒラギノ角ゴ Pro", + "ヒラギノ角ゴ Pro W3", + "ヒラギノ角ゴ Pro W6", + "ヒラギノ角ゴ ProN", + "ヒラギノ角ゴ ProN W3", + "ヒラギノ角ゴ ProN W6", + "ヒラギノ角ゴ Std", + "ヒラギノ角ゴ Std W8", + "ヒラギノ角ゴ StdN", + "ヒラギノ角ゴ StdN W8", + "ヒラギノ角ゴ 簡体中文", + "ヒラギノ角ゴ 簡体中文 W3", + "ヒラギノ角ゴ 簡体中文 W6", + "ヒラギノ角ゴシック", + "ヒラギノ角ゴシック W0", + "ヒラギノ角ゴシック W1", + "ヒラギノ角ゴシック W2", + "ヒラギノ角ゴシック W3", + "ヒラギノ角ゴシック W4", + "ヒラギノ角ゴシック W5", + "ヒラギノ角ゴシック W6", + "ヒラギノ角ゴシック W7", + "ヒラギノ角ゴシック W8", + "ヒラギノ角ゴシック W9", + "冬青黑体简体中文", + "冬青黑体简体中文 W3", + "冬青黑体简体中文 W6", + "冬青黑體簡體中文", + "冬青黑體簡體中文 W3", + "冬青黑體簡體中文 W6", + "宋体-简", + "宋体-繁", + "宋體-簡", + "宋體-繁", + "系統字體", + "系统字体", + "苹方-港", + "苹方-简", + "苹方-繁", + "荱莉荍荭詰荓⁐牯", + "荱莉荍荭詰荓⁓瑤", + "荱莉荍荭詰荓荖荢荎", + "荱莉荍荭諛荓⁐牯", + "荱莉荍荭难銩⁐牯", + "蘋方-港", + "蘋方-簡", + "蘋方-繁", + "黑体-简", + "黑体-繁", + "黑體-簡", + "黑體-繁", + "黒体-簡", + "黒体-繁", + "시스템 서체" + ] + }, + "ventura": { + "weight": 0, + "deferred": true, + "fonts": [] + } + }, + "additions": [ + { + "id": "adobe-cc", + "kind": "bundle", + "prob": 0.15, + "source": "proprietary", + "fonts": [ + "Minion Pro", + "Myriad Pro", + "Adobe Arabic", + "Adobe Hebrew", + "Adobe Devanagari", + "Adobe Thai", + "Kozuka Gothic Pr6N", + "Kozuka Mincho Pr6N", + "Adobe Ming Std", + "Adobe Song Std", + "Adobe Heiti Std", + "Adobe Fan Heiti Std", + "Adobe Gothic Std", + "Adobe Myungjo Std" + ] + }, + { + "id": "meslo", + "kind": "bundle", + "prob": 0.04, + "source": "open", + "fonts": [ + "Meslo LG S", + "Meslo LG M", + "Meslo LG L" + ] + }, + { + "id": "cascadia", + "kind": "bundle", + "prob": 0.06, + "source": "open", + "fonts": [ + "Cascadia Code", + "Cascadia Mono" + ] + }, + { + "id": "dev", + "kind": "alacarte", + "prob": 0.3, + "source": "open", + "sizes": [ + { + "n": 1, + "w": 0.32 + }, + { + "n": 2, + "w": 0.24 + }, + { + "n": 3, + "w": 0.17 + }, + { + "n": 4, + "w": 0.11 + }, + { + "n": 5, + "w": 0.07 + }, + { + "n": 6, + "w": 0.045 + }, + { + "n": 7, + "w": 0.025 + }, + { + "n": 8, + "w": 0.015 + } + ], + "fonts": [ + "Fira Code", + "Fira Mono", + "JetBrains Mono", + "Source Code Pro", + "Inconsolata", + "Hack", + "IBM Plex Mono", + "Roboto Mono", + "Anonymous Pro", + "Iosevka", + "Space Mono", + "Victor Mono", + "PT Mono", + "Overpass Mono" + ] + }, + { + "id": "web", + "kind": "alacarte", + "prob": 0.4, + "source": "open", + "sizes": [ + { + "n": 1, + "w": 0.32 + }, + { + "n": 2, + "w": 0.24 + }, + { + "n": 3, + "w": 0.17 + }, + { + "n": 4, + "w": 0.11 + }, + { + "n": 5, + "w": 0.07 + }, + { + "n": 6, + "w": 0.045 + }, + { + "n": 7, + "w": 0.025 + }, + { + "n": 8, + "w": 0.015 + } + ], + "fonts": [ + "Roboto", + "Open Sans", + "Lato", + "Montserrat", + "Poppins", + "Oswald", + "Raleway", + "Nunito", + "Nunito Sans", + "Inter", + "Roboto Condensed", + "Roboto Slab", + "Merriweather", + "Work Sans", + "Rubik", + "Mukta", + "PT Sans", + "PT Serif", + "Fira Sans", + "Josefin Sans", + "Bebas Neue", + "Barlow", + "Karla", + "DM Sans", + "Manrope", + "Quicksand", + "Playfair Display", + "Titillium Web", + "Cabin", + "Heebo", + "Source Sans 3", + "Source Serif 4" + ] + } + ] + }, + "lin": { + "bases": { + "ubuntu26": { + "weight": 0.65, + "fonts": [ + "C059", + "D050000L", + "DejaVu Sans", + "DejaVu Sans Mono", + "DejaVu Serif", + "Droid Sans Fallback", + "FreeMono", + "FreeSans", + "FreeSerif", + "Liberation Mono", + "Liberation Sans", + "Liberation Sans Narrow", + "Liberation Serif", + "Nimbus Mono PS", + "Nimbus Roman", + "Nimbus Sans", + "Nimbus Sans Narrow", + "Noto Color Emoji", + "Noto Kufi Arabic", + "Noto Looped Lao", + "Noto Looped Thai", + "Noto Mono", + "Noto Music", + "Noto Naskh Arabic", + "Noto Nastaliq Urdu", + "Noto Rashi Hebrew", + "Noto Sans", + "Noto Sans Adlam", + "Noto Sans Adlam Unjoined", + "Noto Sans Anatolian Hieroglyphs", + "Noto Sans Arabic", + "Noto Sans Armenian", + "Noto Sans Avestan", + "Noto Sans Balinese", + "Noto Sans Bamum", + "Noto Sans Bassa Vah", + "Noto Sans Batak", + "Noto Sans Bengali", + "Noto Sans Bhaiksuki", + "Noto Sans Brahmi", + "Noto Sans Buginese", + "Noto Sans Buhid", + "Noto Sans Canadian Aboriginal", + "Noto Sans Carian", + "Noto Sans Caucasian Albanian", + "Noto Sans Chakma", + "Noto Sans Cham", + "Noto Sans Cherokee", + "Noto Sans CJK HK", + "Noto Sans CJK JP", + "Noto Sans CJK KR", + "Noto Sans CJK SC", + "Noto Sans CJK TC", + "Noto Sans Coptic", + "Noto Sans Cuneiform", + "Noto Sans Cypriot", + "Noto Sans Deseret", + "Noto Sans Devanagari", + "Noto Sans Display", + "Noto Sans Duployan", + "Noto Sans Egyptian Hieroglyphs", + "Noto Sans Elbasan", + "Noto Sans Elymaic", + "Noto Sans Ethiopic", + "Noto Sans Georgian", + "Noto Sans Glagolitic", + "Noto Sans Gothic", + "Noto Sans Grantha", + "Noto Sans Gujarati", + "Noto Sans Gunjala Gondi", + "Noto Sans Gurmukhi", + "Noto Sans Hanifi Rohingya", + "Noto Sans Hanunoo", + "Noto Sans Hatran", + "Noto Sans Hebrew", + "Noto Sans Imperial Aramaic", + "Noto Sans Indic Siyaq Numbers", + "Noto Sans Inscriptional Pahlavi", + "Noto Sans Inscriptional Parthian", + "Noto Sans Javanese", + "Noto Sans Kaithi", + "Noto Sans Kannada", + "Noto Sans Kayah Li", + "Noto Sans Kharoshthi", + "Noto Sans Khmer", + "Noto Sans Khojki", + "Noto Sans Khudawadi", + "Noto Sans Lao", + "Noto Sans Lepcha", + "Noto Sans Limbu", + "Noto Sans Linear A", + "Noto Sans Linear B", + "Noto Sans Lisu", + "Noto Sans Lycian", + "Noto Sans Lydian", + "Noto Sans Mahajani", + "Noto Sans Malayalam", + "Noto Sans Mandaic", + "Noto Sans Manichaean", + "Noto Sans Marchen", + "Noto Sans Masaram Gondi", + "Noto Sans Math", + "Noto Sans Mayan Numerals", + "Noto Sans Medefaidrin", + "Noto Sans Meetei Mayek", + "Noto Sans Mende Kikakui", + "Noto Sans Meroitic", + "Noto Sans Miao", + "Noto Sans Modi", + "Noto Sans Mongolian", + "Noto Sans Mono", + "Noto Sans Mono CJK HK", + "Noto Sans Mono CJK JP", + "Noto Sans Mono CJK KR", + "Noto Sans Mono CJK SC", + "Noto Sans Mono CJK TC", + "Noto Sans Mro", + "Noto Sans Multani", + "Noto Sans Myanmar", + "Noto Sans Nabataean", + "Noto Sans New Tai Lue", + "Noto Sans Newa", + "Noto Sans NKo", + "Noto Sans Nushu", + "Noto Sans Ogham", + "Noto Sans Ol Chiki", + "Noto Sans Old Hungarian", + "Noto Sans Old Italic", + "Noto Sans Old North Arabian", + "Noto Sans Old Permic", + "Noto Sans Old Persian", + "Noto Sans Old Sogdian", + "Noto Sans Old South Arabian", + "Noto Sans Old Turkic", + "Noto Sans Oriya", + "Noto Sans Osage", + "Noto Sans Osmanya", + "Noto Sans Pahawh Hmong", + "Noto Sans Palmyrene", + "Noto Sans Pau Cin Hau", + "Noto Sans PhagsPa", + "Noto Sans Phoenician", + "Noto Sans Psalter Pahlavi", + "Noto Sans Rejang", + "Noto Sans Runic", + "Noto Sans Samaritan", + "Noto Sans Saurashtra", + "Noto Sans Sharada", + "Noto Sans Shavian", + "Noto Sans Siddham", + "Noto Sans SignWriting", + "Noto Sans Sinhala", + "Noto Sans Sogdian", + "Noto Sans Sora Sompeng", + "Noto Sans Soyombo", + "Noto Sans Sundanese", + "Noto Sans Syloti Nagri", + "Noto Sans Symbols", + "Noto Sans Symbols2", + "Noto Sans Syriac", + "Noto Sans Tagalog", + "Noto Sans Tagbanwa", + "Noto Sans Tai Le", + "Noto Sans Tai Tham", + "Noto Sans Tai Viet", + "Noto Sans Takri", + "Noto Sans Tamil", + "Noto Sans Tamil Supplement", + "Noto Sans Telugu", + "Noto Sans Thaana", + "Noto Sans Thai", + "Noto Sans Tifinagh", + "Noto Sans Tifinagh Adrar", + "Noto Sans Tifinagh Agraw Imazighen", + "Noto Sans Tifinagh Ahaggar", + "Noto Sans Tifinagh Air", + "Noto Sans Tifinagh APT", + "Noto Sans Tifinagh Azawagh", + "Noto Sans Tifinagh Ghat", + "Noto Sans Tifinagh Hawad", + "Noto Sans Tifinagh Rhissa Ixa", + "Noto Sans Tifinagh SIL", + "Noto Sans Tifinagh Tawellemmet", + "Noto Sans Tirhuta", + "Noto Sans Ugaritic", + "Noto Sans Vai", + "Noto Sans Wancho", + "Noto Sans Warang Citi", + "Noto Sans Yi", + "Noto Sans Zanabazar Square", + "Noto Serif", + "Noto Serif Ahom", + "Noto Serif Armenian", + "Noto Serif Balinese", + "Noto Serif Bengali", + "Noto Serif CJK HK", + "Noto Serif CJK JP", + "Noto Serif CJK KR", + "Noto Serif CJK SC", + "Noto Serif CJK TC", + "Noto Serif Devanagari", + "Noto Serif Display", + "Noto Serif Dogra", + "Noto Serif Ethiopic", + "Noto Serif Georgian", + "Noto Serif Grantha", + "Noto Serif Gujarati", + "Noto Serif Gurmukhi", + "Noto Serif Hebrew", + "Noto Serif Hmong Nyiakeng", + "Noto Serif Kannada", + "Noto Serif Khmer", + "Noto Serif Khojki", + "Noto Serif Lao", + "Noto Serif Malayalam", + "Noto Serif Myanmar", + "Noto Serif Sinhala", + "Noto Serif Tamil", + "Noto Serif Tamil Slanted", + "Noto Serif Tangut", + "Noto Serif Telugu", + "Noto Serif Thai", + "Noto Serif Tibetan", + "Noto Serif Yezidi", + "Noto Traditional Nushu", + "OpenSymbol", + "P052", + "Standard Symbols PS", + "Ubuntu", + "Ubuntu Mono", + "Ubuntu Sans", + "Ubuntu Sans Mono", + "URW Bookman", + "URW Gothic", + "Z003" + ] + }, + "mint22": { + "weight": 0.35, + "fonts": [ + "C059", + "D050000L", + "DejaVu Sans", + "DejaVu Sans Mono", + "DejaVu Serif", + "Droid Sans Fallback", + "FreeMono", + "FreeSans", + "FreeSerif", + "Liberation Mono", + "Liberation Sans", + "Liberation Serif", + "Nimbus Mono PS", + "Nimbus Roman", + "Nimbus Sans", + "Nimbus Sans Narrow", + "Noto Color Emoji", + "Noto Kufi Arabic", + "Noto Looped Lao", + "Noto Looped Thai", + "Noto Mono", + "Noto Music", + "Noto Naskh Arabic", + "Noto Nastaliq Urdu", + "Noto Rashi Hebrew", + "Noto Sans", + "Noto Sans Adlam", + "Noto Sans Adlam Unjoined", + "Noto Sans Anatolian Hieroglyphs", + "Noto Sans Arabic", + "Noto Sans Armenian", + "Noto Sans Avestan", + "Noto Sans Balinese", + "Noto Sans Bamum", + "Noto Sans Bassa Vah", + "Noto Sans Batak", + "Noto Sans Bengali", + "Noto Sans Bhaiksuki", + "Noto Sans Brahmi", + "Noto Sans Buginese", + "Noto Sans Buhid", + "Noto Sans Canadian Aboriginal", + "Noto Sans Carian", + "Noto Sans Caucasian Albanian", + "Noto Sans Chakma", + "Noto Sans Cham", + "Noto Sans Cherokee", + "Noto Sans CJK HK", + "Noto Sans CJK JP", + "Noto Sans CJK KR", + "Noto Sans CJK SC", + "Noto Sans CJK TC", + "Noto Sans Coptic", + "Noto Sans Cuneiform", + "Noto Sans Cypriot", + "Noto Sans Deseret", + "Noto Sans Devanagari", + "Noto Sans Display", + "Noto Sans Duployan", + "Noto Sans Egyptian Hieroglyphs", + "Noto Sans Elbasan", + "Noto Sans Elymaic", + "Noto Sans Ethiopic", + "Noto Sans Georgian", + "Noto Sans Glagolitic", + "Noto Sans Gothic", + "Noto Sans Grantha", + "Noto Sans Gujarati", + "Noto Sans Gunjala Gondi", + "Noto Sans Gurmukhi", + "Noto Sans Hanifi Rohingya", + "Noto Sans Hanunoo", + "Noto Sans Hatran", + "Noto Sans Hebrew", + "Noto Sans Imperial Aramaic", + "Noto Sans Indic Siyaq Numbers", + "Noto Sans Inscriptional Pahlavi", + "Noto Sans Inscriptional Parthian", + "Noto Sans Javanese", + "Noto Sans Kaithi", + "Noto Sans Kannada", + "Noto Sans Kayah Li", + "Noto Sans Kharoshthi", + "Noto Sans Khmer", + "Noto Sans Khojki", + "Noto Sans Khudawadi", + "Noto Sans Lao", + "Noto Sans Lepcha", + "Noto Sans Limbu", + "Noto Sans Linear A", + "Noto Sans Linear B", + "Noto Sans Lisu", + "Noto Sans Lycian", + "Noto Sans Lydian", + "Noto Sans Mahajani", + "Noto Sans Malayalam", + "Noto Sans Mandaic", + "Noto Sans Manichaean", + "Noto Sans Marchen", + "Noto Sans Masaram Gondi", + "Noto Sans Math", + "Noto Sans Mayan Numerals", + "Noto Sans Medefaidrin", + "Noto Sans Meetei Mayek", + "Noto Sans Mende Kikakui", + "Noto Sans Meroitic", + "Noto Sans Miao", + "Noto Sans Modi", + "Noto Sans Mongolian", + "Noto Sans Mono", + "Noto Sans Mono CJK HK", + "Noto Sans Mono CJK JP", + "Noto Sans Mono CJK KR", + "Noto Sans Mono CJK SC", + "Noto Sans Mono CJK TC", + "Noto Sans Mro", + "Noto Sans Multani", + "Noto Sans Myanmar", + "Noto Sans Nabataean", + "Noto Sans New Tai Lue", + "Noto Sans Newa", + "Noto Sans NKo", + "Noto Sans Nushu", + "Noto Sans Ogham", + "Noto Sans Ol Chiki", + "Noto Sans Old Hungarian", + "Noto Sans Old Italic", + "Noto Sans Old North Arabian", + "Noto Sans Old Permic", + "Noto Sans Old Persian", + "Noto Sans Old Sogdian", + "Noto Sans Old South Arabian", + "Noto Sans Old Turkic", + "Noto Sans Oriya", + "Noto Sans Osage", + "Noto Sans Osmanya", + "Noto Sans Pahawh Hmong", + "Noto Sans Palmyrene", + "Noto Sans Pau Cin Hau", + "Noto Sans PhagsPa", + "Noto Sans Phoenician", + "Noto Sans Psalter Pahlavi", + "Noto Sans Rejang", + "Noto Sans Runic", + "Noto Sans Samaritan", + "Noto Sans Saurashtra", + "Noto Sans Sharada", + "Noto Sans Shavian", + "Noto Sans Siddham", + "Noto Sans SignWriting", + "Noto Sans Sinhala", + "Noto Sans Sogdian", + "Noto Sans Sora Sompeng", + "Noto Sans Soyombo", + "Noto Sans Sundanese", + "Noto Sans Syloti Nagri", + "Noto Sans Symbols", + "Noto Sans Symbols2", + "Noto Sans Syriac", + "Noto Sans Tagalog", + "Noto Sans Tagbanwa", + "Noto Sans Tai Le", + "Noto Sans Tai Tham", + "Noto Sans Tai Viet", + "Noto Sans Takri", + "Noto Sans Tamil", + "Noto Sans Tamil Supplement", + "Noto Sans Telugu", + "Noto Sans Thaana", + "Noto Sans Thai", + "Noto Sans Tifinagh", + "Noto Sans Tifinagh Adrar", + "Noto Sans Tifinagh Agraw Imazighen", + "Noto Sans Tifinagh Ahaggar", + "Noto Sans Tifinagh Air", + "Noto Sans Tifinagh APT", + "Noto Sans Tifinagh Azawagh", + "Noto Sans Tifinagh Ghat", + "Noto Sans Tifinagh Hawad", + "Noto Sans Tifinagh Rhissa Ixa", + "Noto Sans Tifinagh SIL", + "Noto Sans Tifinagh Tawellemmet", + "Noto Sans Tirhuta", + "Noto Sans Ugaritic", + "Noto Sans Vai", + "Noto Sans Wancho", + "Noto Sans Warang Citi", + "Noto Sans Yi", + "Noto Sans Zanabazar Square", + "Noto Serif", + "Noto Serif Ahom", + "Noto Serif Armenian", + "Noto Serif Balinese", + "Noto Serif Bengali", + "Noto Serif CJK HK", + "Noto Serif CJK JP", + "Noto Serif CJK KR", + "Noto Serif CJK SC", + "Noto Serif CJK TC", + "Noto Serif Devanagari", + "Noto Serif Display", + "Noto Serif Dogra", + "Noto Serif Ethiopic", + "Noto Serif Georgian", + "Noto Serif Grantha", + "Noto Serif Gujarati", + "Noto Serif Gurmukhi", + "Noto Serif Hebrew", + "Noto Serif Hmong Nyiakeng", + "Noto Serif Kannada", + "Noto Serif Khmer", + "Noto Serif Khojki", + "Noto Serif Lao", + "Noto Serif Malayalam", + "Noto Serif Myanmar", + "Noto Serif Sinhala", + "Noto Serif Tamil", + "Noto Serif Tamil Slanted", + "Noto Serif Tangut", + "Noto Serif Telugu", + "Noto Serif Thai", + "Noto Serif Tibetan", + "Noto Serif Yezidi", + "Noto Traditional Nushu", + "OpenSymbol", + "P052", + "Standard Symbols PS", + "Ubuntu", + "Ubuntu Mono", + "Ubuntu Sans", + "Ubuntu Sans Mono", + "URW Bookman", + "URW Gothic", + "Z003" + ] + } + }, + "additions": [ + { + "id": "libreoffice", + "kind": "bundle", + "prob": 0.4, + "source": "open", + "fonts": [ + "Caladea", + "Carlito", + "Liberation Sans", + "Liberation Serif", + "Liberation Mono", + "Liberation Sans Narrow", + "DejaVu Sans", + "DejaVu Serif", + "DejaVu Sans Mono", + "DejaVu Sans Condensed", + "DejaVu Serif Condensed", + "DejaVu Sans Light", + "DejaVu Math TeX Gyre", + "Source Sans 3", + "Source Serif 4", + "Source Code Pro", + "Noto Sans", + "Noto Serif", + "Noto Mono", + "Noto Sans Arabic", + "Noto Naskh Arabic", + "Noto Kufi Arabic", + "Noto Sans Hebrew", + "Noto Serif Hebrew", + "Noto Sans Armenian", + "Noto Serif Armenian", + "Noto Sans Georgian", + "Noto Serif Georgian", + "Noto Sans Lao", + "Noto Serif Lao", + "Noto Sans Lisu", + "Gentium Basic", + "Gentium Book Basic", + "Amiri", + "Amiri Quran", + "Scheherazade", + "Reem Kufi", + "David Libre", + "Alef", + "OpenSymbol", + "Rubik" + ] + }, + { + "id": "distro-i18n", + "kind": "bundle", + "prob": 0.2, + "source": "open", + "fonts": [ + "KacstBook", + "KacstOffice", + "Frank Ruehl CLM", + "Miriam CLM", + "Miriam Mono CLM", + "David CLM", + "Linux Libertine O", + "Linux Biolinum O", + "Linux Libertine Display O" + ] + }, + { + "id": "adobe-cc", + "kind": "bundle", + "prob": 0.04, + "source": "proprietary", + "fonts": [ + "Minion Pro", + "Myriad Pro", + "Adobe Arabic", + "Adobe Hebrew", + "Adobe Devanagari", + "Adobe Thai", + "Kozuka Gothic Pr6N", + "Kozuka Mincho Pr6N", + "Adobe Ming Std", + "Adobe Song Std", + "Adobe Heiti Std", + "Adobe Fan Heiti Std", + "Adobe Gothic Std", + "Adobe Myungjo Std" + ] + }, + { + "id": "meslo", + "kind": "bundle", + "prob": 0.06, + "source": "open", + "fonts": [ + "Meslo LG S", + "Meslo LG M", + "Meslo LG L" + ] + }, + { + "id": "cascadia", + "kind": "bundle", + "prob": 0.08, + "source": "open", + "fonts": [ + "Cascadia Code", + "Cascadia Mono" + ] + }, + { + "id": "dev", + "kind": "alacarte", + "prob": 0.45, + "source": "open", + "sizes": [ + { + "n": 1, + "w": 0.32 + }, + { + "n": 2, + "w": 0.24 + }, + { + "n": 3, + "w": 0.17 + }, + { + "n": 4, + "w": 0.11 + }, + { + "n": 5, + "w": 0.07 + }, + { + "n": 6, + "w": 0.045 + }, + { + "n": 7, + "w": 0.025 + }, + { + "n": 8, + "w": 0.015 + } + ], + "fonts": [ + "Fira Code", + "Fira Mono", + "JetBrains Mono", + "Source Code Pro", + "Inconsolata", + "Hack", + "IBM Plex Mono", + "Roboto Mono", + "Anonymous Pro", + "Iosevka", + "Space Mono", + "Victor Mono", + "PT Mono", + "Overpass Mono", + "Ubuntu Mono" + ] + }, + { + "id": "web", + "kind": "alacarte", + "prob": 0.35, + "source": "open", + "sizes": [ + { + "n": 1, + "w": 0.32 + }, + { + "n": 2, + "w": 0.24 + }, + { + "n": 3, + "w": 0.17 + }, + { + "n": 4, + "w": 0.11 + }, + { + "n": 5, + "w": 0.07 + }, + { + "n": 6, + "w": 0.045 + }, + { + "n": 7, + "w": 0.025 + }, + { + "n": 8, + "w": 0.015 + } + ], + "fonts": [ + "Roboto", + "Open Sans", + "Lato", + "Montserrat", + "Poppins", + "Oswald", + "Raleway", + "Nunito", + "Nunito Sans", + "Inter", + "Roboto Condensed", + "Roboto Slab", + "Merriweather", + "Work Sans", + "Rubik", + "Mukta", + "PT Sans", + "PT Serif", + "Fira Sans", + "Josefin Sans", + "Bebas Neue", + "Barlow", + "Karla", + "DM Sans", + "Manrope", + "Quicksand", + "Playfair Display", + "Titillium Web", + "Cabin", + "Heebo", + "Source Sans 3", + "Source Serif 4" + ] + } + ] + } +} diff --git a/scripts/gen-fonts-json.py b/scripts/gen-fonts-json.py new file mode 100755 index 0000000..b691d8f --- /dev/null +++ b/scripts/gen-fonts-json.py @@ -0,0 +1,281 @@ +#!/usr/bin/env python3 +"""Regenerate pythonlib/camoufox/fonts.json FROM the actual bundled fonts. + +fonts.json[os] is the pool the per-launch font draw reports from +(fingerprints._generate_random_font_subset) and the list update_fonts() merges +in for callers that pass their own `fonts=`. Every name in it MUST be a family +the packaged browser can render under that OS's bundled fontconfig, or the +browser reports a font it cannot draw (a reverse leak). So this script reads +the real bundle dirs with fc-scan, and then keeps only the names the per-OS +font manifest (scripts/data/font-manifests.json) can ever report: + + reportable[os] = fc-scan(bundle/fonts/) # what fontconfig publishes + + SCAN_FAMILIES additions # opsz instance families + + ALIASES (rewritten by fonts.conf) # Courier -> Courier New ... + + SHIPPED_BY_BROWSER # Twemoji Mozilla + INTERSECT names(font-manifests.json) # bases + additions + MARKER_FONTS + + REPORTABLE_EXTRA # camoufox-only additions + +The intersection is deliberate: the bundle carries families a real OS never +presents as families (weight-variant subfamilies such as "Barlow Black" that +DirectWrite folds into "Barlow", the bare "Sitka" and "Segoe UI Variable" +umbrella names, CJK families a stock Windows install does not report), and +those stay renderable but are never reported. The renderable-but-unreported names +are written next to the output (fonts.json.unreported.txt is NOT produced in +the package; pass --dump-union to see them) so the gap stays visible. + +Usage (build machine, after the bundle changed): + python3 scripts/gen-fonts-json.py [--bundle bundle/fonts] + [--out pythonlib/camoufox/fonts.json] + [--manifest scripts/data/font-manifests.json] + [--print-bases] [--dump-union DIR] + +The manifest lists, per OS, the base font sets of each OS version (with their +real-world share) and the optional additions (Office, LibreOffice, Adobe CC, +developer and web fonts) with their install probability. --print-bases prints +the OS base lists (intersected with the result) as Python literals for the +_ESSENTIAL_FONTS_* constants in pythonlib/camoufox/fingerprints.py, which must +be kept in step with this file. +""" +import argparse +import json +import os +import subprocess +import sys + +REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +OSDIRS = {'win': 'windows', 'mac': 'macos', 'lin': 'linux'} +FONT_EXT = ('.ttf', '.otf', '.ttc', '.dfont') + +# Mirrors the block in bundle/fontconfig/windows/fonts.conf. +SCAN_FAMILIES = { + 'win': { + 'Sitka': ['Sitka Small', 'Sitka Subheading', 'Sitka Heading', 'Sitka Display', 'Sitka Banner'], + 'Segoe UI Variable': ['Segoe UI Variable Small', 'Segoe UI Variable Text', 'Segoe UI Variable Display'], + }, + 'mac': {}, + 'lin': {}, +} + +# Mirrors the alias block in bundle/fontconfig/windows/fonts.conf: names with no +# file of their own that fonts.conf rewrites to a bundled target. The target +# MUST be bundled. +ALIASES = { + 'win': { + 'Courier': 'Courier New', + 'Helvetica': 'Arial', + 'MS Sans Serif': 'Microsoft Sans Serif', + 'Small Fonts': 'Arial', + 'MS Serif': 'Times New Roman', + 'Roman': 'Times New Roman', + 'Times': 'Times New Roman', + 'Calibri Light': 'Calibri', + 'Candara Light': 'Candara', + 'Corbel Light': 'Corbel', + 'Leelawadee UI Semilight': 'Leelawadee UI', + 'Nirmala Text Semilight': 'Nirmala UI', + 'Nirmala UI Semilight': 'Nirmala UI', + }, + # macOS registers each weight of these TTCs as its own family name, so a + # real Mac reports them (they are in the macOS base manifest); fontconfig + # only registers the base family, and the block in + # bundle/fontconfig/macos/fonts.conf rewrites each to it. fc-scan cannot see + # these eight, so they are listed here and reported always (they are in + # _ESSENTIAL_FONTS_MACOS), which is what the real base does. The PingFang + # Light and MuktaMahee rewrites in that block are not listed: PingFang is + # not bundled, and "MuktaMahee Regular" is a scanned family already. + 'mac': { + 'American Typewriter Semibold': 'American Typewriter', + 'Apple SD Gothic Neo ExtraBold': 'Apple SD Gothic Neo', + 'Futura Bold': 'Futura', + 'InaiMathi Bold': 'InaiMathi', + 'Kohinoor Devanagari Medium': 'Kohinoor Devanagari', + 'Noto Sans Canadian Aboriginal Regular': 'Noto Sans Canadian Aboriginal', + 'STIX Two Math Regular': 'STIX Two Math', + 'STIX Two Text Regular': 'STIX Two Text', + }, + # The same block is copied into the linux conf, where one rewrite is live + # ("Noto Sans Canadian Aboriginal Regular"). A real Ubuntu does not report + # that name, so it stays unreported there; scripts/verify-fonts.py warns. + # Metric-compatible aliases every stock Linux fontconfig ships + # (30-metric-aliases.conf, copied into bundle/fontconfig/linux/fonts.conf): + # a page asking for Arial gets Liberation Sans at Arial's exact metrics, so + # a real Ubuntu Firefox "has" these names. Targets are all bundled. + 'lin': { + 'Arial': 'Liberation Sans', + 'Arial Narrow': 'Liberation Sans Narrow', + 'Helvetica': 'Liberation Sans', + 'Helvetica Narrow': 'Nimbus Sans Narrow', + 'Times': 'Liberation Serif', + 'Times New Roman': 'Liberation Serif', + 'Courier': 'Liberation Mono', + 'Courier New': 'Liberation Mono', + 'Calibri': 'Carlito', + 'Cambria': 'Caladea', + 'Palatino': 'P052', + 'Palatino Linotype': 'P052', + 'Bookman Old Style': 'URW Bookman', + 'Century Schoolbook': 'C059', + 'Avant Garde': 'URW Gothic', + 'Zapf Chancery': 'Z003', + 'Symbol': 'Standard Symbols PS', + }, +} + +# Families the BROWSER ships (dist/bin/fonts/TwemojiMozilla.ttf, staged by the +# Firefox build into the same fonts/ dir the bundled fontconfig scans), so an +# fc-scan over bundle/fonts cannot see them. The manifest lists it for win only +# (it is in the Windows base, measured); lin keeps camoufox's long-standing +# CreepJS marker. +SHIPPED_BY_BROWSER = {'win': ['Twemoji Mozilla'], 'mac': [], 'lin': ['Twemoji Mozilla']} + +# The CreepJS OS-marker families the font draw adds back after the random +# subset (when bundled). They are reportable even when no base or addition +# names them, so they count as wanted here. Twin of _*_MARKER_FONTS in +# pythonlib/camoufox/fingerprints.py. +MARKER_FONTS = { + 'win': ['Segoe UI', 'Tahoma', 'Cambria Math', 'Nirmala UI'], + 'mac': ['Helvetica Neue', 'PingFang HK', 'PingFang SC', 'PingFang TC'], + 'lin': ['Noto Sans', 'Noto Serif', 'DejaVu Sans Mono', 'Arimo', 'Cousine', 'Tinos', 'Twemoji Mozilla'], +} + +# Reportable names that are NOT in the manifest for that OS. Each entry is a +# deliberate camoufox deviation and must be renderable (checked below). +REPORTABLE_EXTRA = { + 'win': [], + 'mac': [], + # Firefox exposes its bundled Twemoji Mozilla to content on Linux; it has + # been a _LINUX_MARKER_FONTS entry since the font draw was introduced. + 'lin': ['Twemoji Mozilla'], +} + + +def scan_families(directory): + if not os.path.isdir(directory): + sys.exit(f'bundle dir missing: {directory}') + files = [] + for dp, _dn, fn in os.walk(directory): + for f in fn: + if f.lower().endswith(FONT_EXT): + files.append(os.path.join(dp, f)) + if not files: + sys.exit(f'no font files under {directory} (is the bundle restored?)') + fams = set() + # fc-scan takes many files at once; chunk to keep argv bounded. + for i in range(0, len(files), 200): + out = subprocess.run( + ['fc-scan', '--format', '%{family}\n', *files[i:i + 200]], + capture_output=True, text=True, check=True, + ).stdout + for line in out.splitlines(): + for fam in line.split(','): + fam = fam.strip() + if fam: + fams.add(fam) + return fams + + +def load_manifest(args): + with open(args.manifest, encoding='utf-8') as fh: + return json.load(fh) + + +def manifest_names(man, os_key): + names = set() + for base in man[os_key]['bases'].values(): + names.update(base['fonts']) + for add in man[os_key]['additions']: + names.update(add['fonts']) + return names + + +def main(): + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument('--bundle', default=os.path.join(REPO, 'bundle', 'fonts')) + ap.add_argument('--out', default=os.path.join(REPO, 'pythonlib', 'camoufox', 'fonts.json')) + ap.add_argument('--manifest', default=os.path.join(REPO, 'scripts', 'data', 'font-manifests.json'), + help='per-OS font manifest (bases + additions)') + ap.add_argument('--print-bases', action='store_true', help='print OS base lists as Python literals') + ap.add_argument('--dump-union', default=None, help='dir to write -union.txt / -unreported.txt') + args = ap.parse_args() + + man = load_manifest(args) + result = {} + bases_out = {} + for os_key, sub in OSDIRS.items(): + union = scan_families(os.path.join(args.bundle, sub)) + for src, added in SCAN_FAMILIES[os_key].items(): + if src in union: + union.update(added) + for name, target in ALIASES[os_key].items(): + if target not in union: + sys.exit(f'{os_key}: alias {name} -> {target}: target is not bundled') + union.add(name) + union.update(SHIPPED_BY_BROWSER[os_key]) + + wanted = manifest_names(man, os_key) | set(MARKER_FONTS[os_key]) + reportable = union & wanted + # An alias is rewritten unconditionally by fonts.conf, so it is renderable + # for every identity whose list has the target; report it always (the + # bases below carry it, and the real OS resolves every one of them). + reportable |= set(ALIASES[os_key]) + # Families whose mere presence makes CreepJS-class detectors infer + # Windows 11 (measured 2026-09-14: a Linux identity that drew Cascadia + # was read as "Windows 11 vs UA Linux"). The manifest models them as a + # rare developer install on Linux/macOS; the detector cost outweighs the + # realism, so they are never reported (or rendered) off Windows. + if os_key in ('lin', 'mac'): + reportable -= {'Cascadia Code', 'Cascadia Mono', 'Cascadia Code PL', 'Cascadia Mono PL'} + for name in REPORTABLE_EXTRA[os_key]: + if name not in union: + sys.exit(f'{os_key}: REPORTABLE_EXTRA {name} is not renderable') + reportable.add(name) + unbundled = sorted(wanted - union) + unreported = sorted(union - reportable) + result[os_key] = sorted(reportable) + print(f'{os_key}: {len(union)} renderable families from {sub}/, ' + f'{len(result[os_key])} reportable, {len(unreported)} renderable-but-unreported, ' + f'{len(unbundled)} manifest names unbundled', file=sys.stderr) + if args.dump_union: + os.makedirs(args.dump_union, exist_ok=True) + for tag, data in (('union', sorted(union)), ('unreported', unreported), ('unbundled', unbundled)): + with open(os.path.join(args.dump_union, f'{os_key}-{tag}.txt'), 'w', encoding='utf-8') as fh: + fh.write('\n'.join(data) + '\n') + bases_out[os_key] = { + key: sorted((set(base['fonts']) & reportable) | set(ALIASES[os_key])) + for key, base in man[os_key]['bases'].items() + if base['fonts'] and not base.get('deferred') + } + + with open(args.out, 'w', encoding='utf-8') as fh: + # Same shape as before: {"win": [...], "mac": [...], "lin": [...]}, each + # list sorted, tab-indented and wrapped so diffs stay reviewable. + fh.write('{\n') + for i, os_key in enumerate(('win', 'mac', 'lin')): + rows, row = [], [] + for name in result[os_key]: + row.append(json.dumps(name, ensure_ascii=False)) + if len(', '.join(row)) > 88: + rows.append('\t\t' + ', '.join(row)) + row = [] + if row: + rows.append('\t\t' + ', '.join(row)) + fh.write(f'\t"{os_key}": [\n' + ',\n'.join(rows) + '\n\t]' + (',' if i < 2 else '') + '\n') + fh.write('}\n') + print(f'wrote {args.out}', file=sys.stderr) + + if args.print_bases: + for os_key, bases in bases_out.items(): + for key, fonts in bases.items(): + print(f'# {os_key} base {key}: {len(fonts)} families') + print(json.dumps(fonts, ensure_ascii=False)) + # additions pools, for the record + for os_key in OSDIRS: + base_all = set() + for b in bases_out[os_key].values(): + base_all.update(b) + print(f'# {os_key} additions pool (reportable minus every base): {len(set(result[os_key]) - base_all)}') + + +if __name__ == '__main__': + main() diff --git a/scripts/verify-fonts.py b/scripts/verify-fonts.py new file mode 100755 index 0000000..4262a18 --- /dev/null +++ b/scripts/verify-fonts.py @@ -0,0 +1,322 @@ +#!/usr/bin/env python3 +"""Verify the font bundle, the per-OS fontconfig and fonts.json agree. + +The invariant this guards: every family the Python launcher can REPORT for an +OS (pythonlib/camoufox/fonts.json[os], plus the essential / variant / marker +constants in pythonlib/camoufox/fingerprints.py) is a family the packaged +browser can RENDER under that OS's bundled fontconfig. A name that fails this +is a reverse leak: the page is told the font exists and then measures the +fallback. + +For each OS it + 1. generates a runtime fonts.conf the way pythonlib/camoufox/utils.py does + (the cwd-relative rewritten to an absolute bundle/fonts, which is the + Linux package layout: fonts/{linux,windows,macos} plus the browser's own + TwemojiMozilla.ttf) and runs fc-list against it; + 2. checks fonts.json[os] is a subset of what fc-list publishes, allowing the + alias names bundle/fontconfig//fonts.conf rewrites (checked with + fc-match: the alias must resolve to its bundled target); + 3. checks the CSS generics resolve to a family in fonts.json[os]; + 4. checks every essential / variant / marker name is in fonts.json[os]; + 5. draws _generate_random_font_subset a few times (when the camoufox package + imports) and checks each draw is inside fonts.json[os] and contains the + essentials and markers; + 6. checks scripts/package.py's flattening is safe: no basename collides + across the OS dirs that share a package, and no OS dir has subfolders; + 7. lists files over GitHub's 100 MB push limit (a warning, not a failure). + +Usage: python3 scripts/verify-fonts.py [--bundle bundle] [--cache DIR] [--quick] +--quick skips the fc-list step (it builds a fontconfig cache over ~4 GB of +fonts the first time, which takes a few minutes). +Exit status is non-zero on any failure. +""" +import argparse +import ast +import glob +import json +import os +import re +import subprocess +import sys +import tempfile + +REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +OSDIRS = {'win': 'windows', 'mac': 'macos', 'lin': 'linux'} +GENERICS = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy', 'system-ui'] +# Alias names each conf rewrites (pattern rules whose test is one of these). +GIB = 1024 ** 3 +failures = [] +warnings = [] + + +def fail(msg): + failures.append(msg) + print('FAIL:', msg) + + +def warn(msg): + warnings.append(msg) + print('WARN:', msg) + + +def load_constants(): + """Read the font constants from fingerprints.py without importing it.""" + path = os.path.join(REPO, 'pythonlib', 'camoufox', 'fingerprints.py') + tree = ast.parse(open(path, encoding='utf-8').read()) + consts = {} + for node in tree.body: + if isinstance(node, ast.Assign) and len(node.targets) == 1 and isinstance(node.targets[0], ast.Name): + name = node.targets[0].id + if 'FONTS' in name and name.startswith('_'): + consts[name] = ast.literal_eval(node.value) + return consts + + +def conf_aliases(conf_text): + """(alias -> target) for every family rewrite.""" + out = {} + for m in re.finditer( + r'\s*\s*([^<]+)\s*\s*' + r'\s*([^<]+)', + conf_text, + ): + out[m.group(1)] = m.group(2) + return out + + +def conf_alias_elements(conf_text): + """Names rewritten by elements (stock 30-metric-aliases / urw-base35 + style): family -> list of candidate targets, in preference order. Which + candidate wins depends on what is bundled, so the check accepts any + reportable candidate.""" + out = {} + for m in re.finditer(r']*>\s*([^<]+)(.*?)', conf_text, re.S): + cands = re.findall(r'([^<]+)', m.group(2)) + if cands: + out.setdefault(m.group(1), []).extend(cands) + return out + + +def runtime_conf(os_key, fonts_dir, extra_dirs, cache_dir, tmpdir): + src = os.path.join(REPO, 'bundle', 'fontconfig', OSDIRS[os_key], 'fonts.conf') + text = open(src, encoding='utf-8').read() + marker = 'fonts' + if marker not in text: + fail(f'{os_key}: fonts.conf lacks {marker} (utils._generate_fontconfig rewrites exactly that)') + dirs = ''.join(f'{d}' for d in [fonts_dir, *extra_dirs]) + text = text.replace(marker, dirs) + text = text.replace('fontconfig', f'{cache_dir}') + path = os.path.join(tmpdir, f'fonts-{os_key}.conf') + open(path, 'w', encoding='utf-8').write(text) + return path, text + + +def fc_pattern(name): + # fc-match parses an unescaped '-' as the family/size separator, so + # "sans-serif" would query family "sans" and "system-ui" family "system". + return name.replace('\\', '\\\\').replace('-', '\\-').replace(':', '\\:') + + +def fc(cmd, conf): + env = dict(os.environ, FONTCONFIG_FILE=conf) + env.pop('FONTCONFIG_PATH', None) + return subprocess.run(cmd, capture_output=True, text=True, env=env, check=True).stdout + + +def main(): + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument('--bundle', default=os.path.join(REPO, 'bundle')) + ap.add_argument('--cache', default=None, help='fontconfig cache dir (default: a temp dir)') + ap.add_argument('--quick', action='store_true', help='skip fc-list / fc-match') + ap.add_argument('--draws', type=int, default=20) + args = ap.parse_args() + + fonts_root = os.path.abspath(os.path.join(args.bundle, 'fonts')) + fonts_json = json.load(open(os.path.join(REPO, 'pythonlib', 'camoufox', 'fonts.json'), encoding='utf-8')) + consts = load_constants() + + # Browser-shipped fonts live beside the bundle in the package (fonts/ holds + # TwemojiMozilla.ttf from the Firefox build plus the per-OS subdirs). + extra_dirs = sorted({os.path.dirname(p) for p in glob.glob(os.path.join(REPO, 'camoufox-*', 'browser', 'fonts', 'TwemojiMozilla.ttf'))})[:1] + if not extra_dirs: + warn('no camoufox-*/browser/fonts/TwemojiMozilla.ttf found; "Twemoji Mozilla" is treated as browser-shipped') + + # 6. flattening safety (macOS package = windows+linux flat; Windows package = macos+linux flat) + names = {} + for os_key, sub in OSDIRS.items(): + d = os.path.join(fonts_root, sub) + if not os.path.isdir(d) or not os.listdir(d): + fail(f'{sub}/ is missing or empty under {fonts_root}') + continue + names[sub] = {} + for dp, _dn, fn in os.walk(d): + for f in fn: + if dp != d: + fail(f'{sub}/{os.path.relpath(os.path.join(dp, f), d)} is in a subfolder; package.py flattens these and the reject globs assume flat') + names[sub].setdefault(f.lower(), []).append(f) + size = os.path.getsize(os.path.join(dp, f)) + if size > 100 * 1024 * 1024: + warn(f'{sub}/{f} is {size / 1024 / 1024:.1f} MiB, over GitHub\'s 100 MB push limit') + for a, b in (('windows', 'linux'), ('macos', 'linux')): + if a in names and b in names: + clash = sorted(set(names[a]) & set(names[b])) + if clash: + fail(f'{len(clash)} basenames collide between {a}/ and {b}/ (flattened package would clobber): {clash[:5]}') + else: + print(f'OK: no basename collisions between {a}/ and {b}/ ({len(names[a])} + {len(names[b])} files)') + + with tempfile.TemporaryDirectory(prefix='camoufox-verify-fonts-') as tmp: + cache = args.cache or os.path.join(tmp, 'cache') + os.makedirs(cache, exist_ok=True) + for os_key, sub in OSDIRS.items(): + print(f'\n== {os_key} ({sub}/)') + reportable = fonts_json[os_key] + if reportable != sorted(reportable) or len(set(reportable)) != len(reportable): + fail(f'{os_key}: fonts.json list is not sorted/unique') + rset = set(reportable) + conf, text = runtime_conf(os_key, fonts_root, extra_dirs, cache, tmp) + aliases = conf_aliases(text) + alias_elems = conf_alias_elements(text) + + # 4. constants + suffix = {'win': 'WINDOWS', 'mac': 'MACOS', 'lin': 'LINUX'}[os_key] + essential = consts[f'_ESSENTIAL_FONTS_{suffix}'] + markers = consts[f'_{suffix}_MARKER_FONTS'] + prob, variant = consts[f'_BASE_VARIANT_FONTS_{suffix}'] + for label, lst in (('essential', essential), ('marker', markers), ('variant', variant)): + missing = sorted(set(lst) - rset) + if missing: + fail(f'{os_key}: {label} names not in fonts.json: {missing}') + else: + print(f'OK: {len(lst)} {label} names all in fonts.json[{os_key}] ({len(reportable)})') + if set(essential) & set(variant): + fail(f'{os_key}: essential and variant overlap: {sorted(set(essential) & set(variant))}') + # An unconditional pattern rewrite whose TARGET is reportable makes the + # alias renderable for every identity, so the alias must be reported by + # every identity too (essential). Rewrites to an unbundled/unreported + # target are inert (the allowlist blocks the target) and only noted. + skip = {'MS Shell Dlg 2', 'MONO', 'mono', 'sans', 'sans serif', *GENERICS} + live = {a: t for a, t in aliases.items() if a not in skip and t in rset} + inert = sorted(a for a, t in aliases.items() if a not in skip and t not in rset) + not_always = sorted(set(live) - set(essential)) + if not_always: + msg = (f'{os_key}: fonts.conf rewrites {not_always} unconditionally to a reportable target, ' + f'so they render for every identity but are not always reported (_ESSENTIAL_FONTS_{suffix})') + # Renderable-but-unreported is the safe direction of the invariant; + # it is a hard failure only where the real OS reports the name + # (Windows: every box resolves the GDI substitutes; macOS: the TTC + # weight names are real families there). + (fail if os_key in ('win', 'mac') else warn)(msg) + elif live: + print(f'OK: {len(live)} live alias rewrites are all essential (always reported)') + if inert: + print(f'note: {len(inert)} alias rewrites are inert for {os_key} (target not reportable): {inert[:4]}...') + + # 5. draws + sys.path.insert(0, os.path.join(REPO, 'pythonlib')) + try: + from camoufox.fingerprints import _generate_random_font_subset # noqa: E402 + except Exception as e: # pragma: no cover - optional deps + warn(f'camoufox package not importable ({e.__class__.__name__}: {e}); skipping draw check') + else: + target = {'win': 'windows', 'mac': 'macos', 'lin': 'linux'}[os_key] + sizes = [] + for _ in range(args.draws): + draw = _generate_random_font_subset(target) + sizes.append(len(draw)) + if len(set(draw)) != len(draw): + fail(f'{os_key}: draw has duplicates') + extra = sorted(set(draw) - rset) + if extra: + fail(f'{os_key}: draw reports names outside fonts.json: {extra[:5]}') + missing = sorted((set(essential) | set(markers)) - set(draw)) + if missing: + fail(f'{os_key}: draw lacks essential/marker names: {missing[:5]}') + vs = set(variant) & set(draw) + if vs and vs != set(variant): + fail(f'{os_key}: variant drawn partially: {sorted(vs)}') + print(f'OK: {args.draws} draws inside fonts.json; sizes {min(sizes)}..{max(sizes)} of {len(reportable)} (base {len(essential)})') + + if args.quick: + continue + + # 1./2. fc-list + out = fc(['fc-list', '--format', '%{family}\n'], conf) + published = set() + for line in out.splitlines(): + for fam in line.split(','): + fam = fam.strip() + if fam: + published.add(fam) + pub_lower = {f.lower() for f in published} + print(f'fc-list publishes {len(published)} families under the {os_key} conf') + unrenderable = [f for f in reportable if f.lower() not in pub_lower] + resolved = [] + for name in list(unrenderable): + if name in aliases: + got = fc(['fc-match', '--format', '%{family}\n', fc_pattern(name)], conf).split(',')[0].strip() + if got.lower() == aliases[name].lower() and aliases[name] in rset: + resolved.append((name, got)) + unrenderable.remove(name) + else: + fail(f'{os_key}: alias {name} resolves to {got!r}, expected {aliases[name]!r} (must be in fonts.json)') + elif name in alias_elems: + got = fc(['fc-match', '--format', '%{family}\n', fc_pattern(name)], conf).split(',')[0].strip() + if got.lower() != name.lower() and got in rset: + resolved.append((name, got)) + unrenderable.remove(name) + else: + fail(f'{os_key}: {name} resolves to {got!r}, not a reportable candidate of {alias_elems[name][:3]}') + elif name == 'Twemoji Mozilla' and not extra_dirs: + unrenderable.remove(name) # browser-shipped; see warning above + if unrenderable: + fail(f'{os_key}: {len(unrenderable)} fonts.json names fc-list does not publish: {unrenderable[:10]}') + else: + print(f'OK: all {len(reportable)} fonts.json[{os_key}] names are published or alias-resolved ({len(resolved)} aliases)') + for name, got in resolved: + print(f' alias {name} -> {got}') + unreported = sorted(published - rset) + print(f'note: {len(unreported)} published families are not reportable (pruned by the allowlist)') + + # 3. generics (+ the Windows dialog family) + for g in GENERICS + (['MS Shell Dlg 2'] if os_key == 'win' else []): + got = fc(['fc-match', '--format', '%{family}\n', fc_pattern(g)], conf).split(',')[0].strip() + if got in rset: + print(f'OK: {g} -> {got}') + elif g == 'system-ui': + # Gecko resolves system-ui itself (the platform UI font / + # font.name-list.system-ui); the fontconfig rule is advisory. + print(f'note: {g} -> {got!r} (not reportable; Gecko resolves system-ui itself)') + else: + fail(f'{os_key}: {g} resolves to {got!r}, which is not in fonts.json[{os_key}]') + # rejects and scan-time families in the windows conf + if os_key == 'win': + for fam in ('Sitka Small', 'Segoe UI Variable Text'): + if fam.lower() not in pub_lower: + fail(f'win: scan-time family {fam} not published (check the block)') + else: + print(f'OK: scan-time family {fam} published') + rejected = re.findall(r'\*/fonts/windows/([^<]+)', text) + files = set(os.listdir(os.path.join(fonts_root, 'windows'))) + dangling = [r for r in rejected if r not in files] + if dangling: + warn(f'win: {len(dangling)} reject globs name files not in windows/: {dangling[:5]}') + else: + print(f'OK: all {len(rejected)} reject globs name existing windows/ files') + for r in rejected: + if '[' in r: + warn(f'win: reject glob {r!r} contains [ ] which fontconfig treats as a character class') + + print() + for w in warnings: + print('WARN:', w) + if failures: + print(f'\n{len(failures)} FAILURE(S)') + for f_ in failures: + print(' -', f_) + sys.exit(1) + print('\nALL CHECKS PASSED') + + +if __name__ == '__main__': + main()