UNPKG

@stltio/stealth

Version:

Device fingerprinting library

1 lines • 151 kB
{"version":3,"sources":["../src/index.ts","../src/utils/hash.ts","../src/components/canvas.ts","../src/components/device.ts","../src/components/permissions.ts","../src/components/screen.ts","../src/components/browser.ts","../src/components/intl.ts","../src/components/audio.ts","../src/components/webgl.ts","../src/components/math.ts","../src/components/fonts.ts","../src/components/storage.ts","../src/components/devices.ts","../src/components/webrtc.ts","../src/components/gpu.ts","../src/config.ts"],"sourcesContent":["import axios from 'axios'\nimport jsSHA from 'jssha'\n\nimport canvas from './components/canvas'\nimport device from './components/device'\nimport permissions from './components/permissions'\nimport screen from './components/screen'\nimport browser from './components/browser'\nimport intl from './components/intl'\nimport audio from './components/audio'\nimport webgl from './components/webgl'\nimport math from './components/math'\nimport fonts from './components/fonts'\nimport storage from './components/storage'\nimport devices from './components/devices'\nimport webrtc from './components/webrtc'\nimport gpu from './components/gpu'\n\nimport config from './config'\n\nexport default async function stealth({\n apiKey,\n debug,\n ignore\n}: {\n apiKey?: string\n debug?: boolean\n ignore?: string[]\n} = {}) {\n const start = window.performance.now() as number\n\n if (!ignore) {\n ignore = []\n }\n\n const p = []\n if (!ignore.includes('audio')) p.push(audio())\n if (!ignore.includes('browser')) p.push(browser())\n if (!ignore.includes('canvas')) p.push(canvas())\n if (!ignore.includes('device')) p.push(device())\n if (!ignore.includes('devices')) p.push(devices())\n if (!ignore.includes('fonts')) p.push(fonts())\n if (!ignore.includes('gpu')) p.push(gpu())\n if (!ignore.includes('intl')) p.push(intl())\n if (!ignore.includes('math')) p.push(math())\n if (!ignore.includes('permissions')) p.push(permissions())\n if (!ignore.includes('screen')) p.push(screen())\n if (!ignore.includes('storage')) p.push(storage())\n if (!ignore.includes('webgl')) p.push(webgl())\n if (!ignore.includes('webrtc')) p.push(webrtc())\n\n let data: any = []\n\n for await (const f of p) {\n try {\n const d: any = await f\n data.push(d)\n } catch (e) {\n if (debug) {\n console.error(e)\n }\n }\n }\n\n const local = data.reduce((acc: any, cur: any) => {\n Object.keys(cur).forEach((key) => {\n acc[key] = cur[key]\n })\n return acc\n }, {}) as any\n\n const payload = {\n local: {\n ...local,\n hash: new jsSHA('SHA-256', 'TEXT', { encoding: 'UTF8' })\n .update(JSON.stringify(local))\n .getHash('HEX')\n }\n }\n\n if (debug) {\n console.log(payload.local.hash)\n console.log(payload.local)\n }\n\n // If apiKey is provided, send the payload to the server (more accurate results)\n // Want an API_KEY? Contact us at hello@stlt.io\n if (apiKey) {\n const axiosInstance = axios.create()\n axiosInstance.defaults.withCredentials = true\n axiosInstance.defaults.headers.common['x-api-key'] = apiKey\n return axiosInstance\n .get(`${config.apiBaseUrl}/${payload.local.hash}`)\n .then((response: any) => {\n if (debug) {\n console.log(response.data)\n }\n return {\n visitorId: response.data.visitorId,\n local: payload.local,\n ms: Math.round(window.performance.now() - start),\n remote: response.data\n }\n })\n .catch((error: Error) => {\n console.log(error.message)\n return {\n visitorId: payload.local.hash,\n local: payload.local,\n ms: Math.round(window.performance.now() - start),\n remote: {}\n }\n })\n } else {\n return {\n visitorId: payload.local.hash,\n local: payload.local,\n ms: Math.round(window.performance.now() - start),\n remote: {}\n }\n }\n}\n","const hash = (r: string) => {\n for (var a, o = [], c = 0; c < 256; c++) {\n a = c\n for (var f = 0; f < 8; f++) a = 1 & a ? 3988292384 ^ (a >>> 1) : a >>> 1\n o[c] = a\n }\n for (var n = -1, t = 0; t < r.length; t++)\n n = (n >>> 8) ^ o[255 & (n ^ r.charCodeAt(t))]\n return (-1 ^ n) >>> 0\n}\n\nexport default hash\n","import hash from '../utils/hash'\n\nconst canvas = () => {\n return new Promise((resolve) => {\n try {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D\n\n ctx.beginPath()\n ctx.rect(0, 0, 16, 16)\n ctx.font = \"16px 'Arial'\"\n ctx.textBaseline = 'top'\n ctx.textBaseline = 'alphabetic'\n ctx.rotate(0.05)\n ctx.fillStyle = '#f60'\n ctx.fillText('😀☺♨...☑✴🅰', 50.0, 70.0)\n ctx.stroke()\n\n resolve({ canvas: hash(canvas.toDataURL()) })\n } catch (error) {\n resolve({ canvas: null })\n }\n })\n}\n\nexport default canvas\n","const device = () => {\n return new Promise((resolve) => {\n try {\n resolve({\n device: {\n hardwareConcurrency: navigator.hardwareConcurrency,\n memory: navigator.deviceMemory,\n platform: navigator?.userAgentData?.platform || 'unknown',\n mobile: navigator?.userAgentData?.mobile || 'unknown',\n vendor: navigator?.userAgentData?.vendor || 'unknown',\n architecture: getArchitecture(),\n videoCard: getVideoCard()\n }\n })\n } catch {\n resolve({ device: null })\n }\n })\n}\n\nconst getVideoCard = () => {\n const canvas = document.createElement('canvas')\n const gl =\n canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl')\n if (gl && 'getParameter' in gl) {\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info')\n return {\n vendor: (gl.getParameter(gl.VENDOR) || '').toString(),\n vendorUnmasked: debugInfo\n ? (gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '').toString()\n : '',\n renderer: (gl.getParameter(gl.RENDERER) || '').toString(),\n rendererUnmasked: debugInfo\n ? (gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '').toString()\n : '',\n version: (gl.getParameter(gl.VERSION) || '').toString(),\n shadingLanguageVersion: (\n gl.getParameter(gl.SHADING_LANGUAGE_VERSION) || ''\n ).toString()\n }\n }\n return 'undefined'\n}\n\nconst getArchitecture = () => {\n const f = new Float32Array(1)\n const u8 = new Uint8Array(f.buffer)\n f[0] = Infinity\n f[0] = f[0] - f[0]\n\n return u8[3]\n}\n\nexport default device\n","const permissions = async () => {\n return new Promise((resolve) => {\n try {\n Promise.all([\n getPermissionState('accelerometer'),\n getPermissionState('ambient-light-sensor'),\n getPermissionState('background-fetch'),\n getPermissionState('background-sync'),\n getPermissionState('bluetooth'),\n getPermissionState('camera'),\n getPermissionState('clipboard'),\n getPermissionState('device-info'),\n getPermissionState('display-capture'),\n getPermissionState('gamepad'),\n getPermissionState('geolocation'),\n getPermissionState('gyroscope'),\n getPermissionState('magnetometer'),\n getPermissionState('microphone'),\n getPermissionState('midi'),\n getPermissionState('nfc'),\n getPermissionState('notifications'),\n getPermissionState('persistent-storage'),\n getPermissionState('push'),\n getPermissionState('screen-wake-lock'),\n getPermissionState('speaker'),\n getPermissionState('speaker-selection')\n ])\n .then((permissions) => {\n resolve({\n permissions: permissions.reduce((acc: any, perm: any) => {\n const { state, name } = perm || {}\n if (acc[state]) {\n acc[state].push(name)\n return acc\n }\n acc[state] = [name]\n return acc\n }, {})\n })\n })\n .catch(() => resolve({ permissions: null }))\n } catch {\n resolve({ permissions: null })\n }\n })\n}\n\nconst getPermissionState = (name: any) =>\n navigator.permissions\n .query({ name })\n .then((res) => ({ name, state: res.state }))\n .catch(() => ({ name, state: 'unknown' }))\n\nexport default permissions\n","const screenDetails = () => {\n return new Promise((resolve) => {\n try {\n resolve({\n screen: {\n isTouchscreen: navigator.maxTouchPoints > 0,\n maxTouchPoints: navigator.maxTouchPoints,\n colorDepth: screen.colorDepth,\n width: screen.width,\n height: screen.height,\n mediaMatches: matchMedias()\n }\n })\n } catch (error) {\n resolve({ screen: null })\n }\n })\n}\n\nconst matchMedias = () => {\n let results: any[] = []\n\n const mediaQueries = {\n 'prefers-contrast': [\n 'high',\n 'more',\n 'low',\n 'less',\n 'forced',\n 'no-preference'\n ],\n 'any-hover': ['hover', 'none'],\n 'any-pointer': ['none', 'coarse', 'fine'],\n pointer: ['none', 'coarse', 'fine'],\n hover: ['hover', 'none'],\n update: ['fast', 'slow'],\n 'inverted-colors': ['inverted', 'none'],\n 'prefers-reduced-motion': ['reduce', 'no-preference'],\n 'prefers-reduced-transparency': ['reduce', 'no-preference'],\n scripting: ['none', 'initial-only', 'enabled'],\n 'forced-colors': ['active', 'none']\n }\n\n Object.keys(mediaQueries).forEach((key) => {\n mediaQueries[key].forEach((value: any) => {\n if (matchMedia(`(${key}: ${value})`).matches)\n results.push(`${key}: ${value}`)\n })\n })\n return results\n}\n\nexport default screenDetails\n","const browser = () => {\n return new Promise((resolve) => {\n try {\n resolve({\n browser: {\n userAgent: navigator.userAgent,\n cookieEnabled: navigator.cookieEnabled,\n onLine: navigator.onLine,\n userAgentData: navigator.userAgentData,\n webdriver: navigator.webdriver,\n doNotTrack: navigator.doNotTrack,\n pdfViewerEnabled: navigator.pdfViewerEnabled,\n applePayVersion: getApplePayVersion(),\n ...getBrowser()\n }\n })\n } catch (error) {\n resolve({ browser: null })\n }\n })\n}\n\nconst getBrowser = () => {\n if (typeof navigator === 'undefined') {\n return {\n name: 'unknown',\n version: 'unknown'\n }\n }\n const ua = navigator.userAgent\n // Define some regular expressions to match different browsers and their versions\n const regexes = [\n // Edge\n /(?<name>Edge|Edg)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Chrome, Chromium, Opera, Vivaldi, Brave, etc.\n /(?<name>(?:Chrome|Chromium|OPR|Opera|Vivaldi|Brave))\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Firefox, Waterfox, etc.\n /(?<name>(?:Firefox|Waterfox|Iceweasel|IceCat))\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Safari, Mobile Safari, etc.\n /(?<name>Safari)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Internet Explorer, IE Mobile, etc.\n /(?<name>MSIE|Trident|IEMobile).+?(?<version>\\d+(?:\\.\\d+)?)/,\n // Other browsers that use the format \"BrowserName/version\"\n /(?<name>[A-Za-z]+)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Samsung internet browser\n /(?<name>SamsungBrowser)\\/(?<version>\\d+(?:\\.\\d+)?)/\n ]\n\n const browserNameMap = {\n Edg: 'Edge',\n OPR: 'Opera'\n }\n\n for (const regex of regexes) {\n const match = ua.match(regex)\n if (match && match.groups) {\n const name = browserNameMap[match.groups.name] || match.groups.name\n return {\n name: name,\n version: match.groups.version\n }\n }\n }\n\n return {\n name: 'unknown',\n version: 'unknown'\n }\n}\n\nconst getApplePayVersion = () => {\n if (\n window.location.protocol === 'https:' &&\n typeof window.ApplePaySession === 'function'\n ) {\n try {\n const versionCheck = window.ApplePaySession.supportsVersion\n for (let i = 15; i > 0; i--) {\n if (versionCheck(i)) {\n return i\n }\n }\n } catch (error) {\n return 0\n }\n }\n return 0\n}\n\nexport default browser\n","const intl = () => {\n return new Promise((resolve) => {\n try {\n resolve({\n intl: {\n language: navigator.language,\n numberFormat: new Intl.NumberFormat(undefined, {\n notation: 'compact',\n compactDisplay: 'long'\n }).format(21000000),\n listFormat: new Intl.ListFormat(undefined, {\n style: 'long',\n type: 'disjunction'\n }).format(['0', '1']),\n displayNames: new Intl.DisplayNames(undefined, {\n type: 'language'\n }).of(navigator.language),\n dateTimeFormat: new Intl.DateTimeFormat(undefined, {\n month: 'long',\n timeZoneName: 'long'\n }).format(974_764_800_000),\n pluralRules: new Intl.PluralRules().select(1),\n relativeFormat: new Intl.RelativeTimeFormat(undefined, {\n localeMatcher: 'best fit',\n numeric: 'auto',\n style: 'long'\n }).format(1, 'day')\n }\n })\n } catch (error) {\n resolve({ locales: null })\n }\n })\n}\n\nexport default intl\n","import hash from '../utils/hash'\r\n\r\nconst audio = () => {\r\n return new Promise((resolve) => {\r\n try {\r\n const sampleRate = 44100\r\n const numSamples = 5000\r\n const audioContext = new (window.OfflineAudioContext ||\r\n window.webkitOfflineAudioContext)(1, numSamples, sampleRate)\r\n const audioBuffer = audioContext.createBufferSource()\r\n\r\n const oscillator = audioContext.createOscillator()\r\n oscillator.frequency.value = 1000\r\n const compressor = audioContext.createDynamicsCompressor()\r\n compressor.threshold.value = -50\r\n compressor.knee.value = 40\r\n compressor.ratio.value = 12\r\n compressor.attack.value = 0\r\n compressor.release.value = 0.2\r\n oscillator.connect(compressor)\r\n compressor.connect(audioContext.destination)\r\n oscillator.start()\r\n let samples\r\n\r\n audioContext.oncomplete = (event) => {\r\n samples = event.renderedBuffer.getChannelData(0)\r\n resolve({\r\n audio: {\r\n sampleHash: hash(samples.join(',')),\r\n oscillator: oscillator.type,\r\n maxChannels: audioContext.destination.maxChannelCount,\r\n channelCountMode: audioBuffer.channelCountMode\r\n }\r\n })\r\n }\r\n\r\n audioContext.startRendering()\r\n } catch (error) {\r\n resolve({ audio: null })\r\n }\r\n })\r\n}\r\n\r\nexport default audio\r\n","import hash from '../utils/hash'\n\nconst webgl = async () => {\n return new Promise((resolve) => {\n try {\n const canvas = document.createElement('canvas')\n const width = 256\n const height = 128\n\n const ctx =\n (canvas.getContext('webgl2') as any) ||\n (canvas.getContext('experimental-webgl2') as any) ||\n (canvas.getContext('webgl') as any) ||\n canvas.getContext('experimental-webgl' as any) ||\n (canvas.getContext('moz-webgl') as any)\n\n var f =\n 'attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}'\n var g =\n 'precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}'\n var h = ctx.createBuffer()\n\n ctx.bindBuffer(ctx.ARRAY_BUFFER, h)\n\n var i = new Float32Array([-0.2, -0.9, 0, 0.4, -0.26, 0, 0, 0.7321, 0])\n\n ctx.bufferData(ctx.ARRAY_BUFFER, i, ctx.STATIC_DRAW),\n (h.itemSize = 3),\n (h.numItems = 3)\n\n var j = ctx.createProgram()\n var k = ctx.createShader(ctx.VERTEX_SHADER)\n\n ctx.shaderSource(k, f)\n ctx.compileShader(k)\n\n var l = ctx.createShader(ctx.FRAGMENT_SHADER)\n\n ctx.shaderSource(l, g)\n ctx.compileShader(l)\n ctx.attachShader(j, k)\n ctx.attachShader(j, l)\n ctx.linkProgram(j)\n ctx.useProgram(j)\n\n j.vertexPosAttrib = ctx.getAttribLocation(j, 'attrVertex')\n j.offsetUniform = ctx.getUniformLocation(j, 'uniformOffset')\n\n ctx.enableVertexAttribArray(j.vertexPosArray)\n ctx.vertexAttribPointer(\n j.vertexPosAttrib,\n h.itemSize,\n ctx.FLOAT,\n !1,\n 0,\n 0\n )\n ctx.uniform2f(j.offsetUniform, 1, 1)\n ctx.drawArrays(ctx.TRIANGLE_STRIP, 0, h.numItems)\n\n var n = new Uint8Array(width * height * 4)\n ctx.readPixels(0, 0, width, height, ctx.RGBA, ctx.UNSIGNED_BYTE, n)\n const m = JSON.stringify(n).replace(/,?\"[0-9]+\":/g, '')\n\n resolve({ webgl: hash(m) })\n } catch {\n resolve({ webgl: null })\n }\n })\n}\n\nexport default webgl\n","const math = () => {\n return new Promise((resolve) => {\n try {\n resolve({\n math: {\n acos: Math.acos(0.5),\n asin: integrate(Math.asin, -1, 1, 97),\n atan: integrate(Math.atan, -1, 1, 97),\n cos: integrate(Math.cos, 0, Math.PI, 97),\n cosh: Math.cosh(9 / 7),\n e: Math.E,\n largeCos: Math.cos(1e20),\n largeSin: Math.sin(1e20),\n largeTan: Math.tan(1e20),\n log: Math.log(1000),\n pi: Math.PI,\n sin: integrate(Math.sin, -Math.PI, Math.PI, 97),\n sinh: integrate(Math.sinh, -9 / 7, 7 / 9, 97),\n sqrt: Math.sqrt(2),\n tan: integrate(Math.tan, 0, 2 * Math.PI, 97),\n tanh: integrate(Math.tanh, -9 / 7, 7 / 9, 97)\n }\n })\n } catch {\n resolve({ math: null })\n }\n })\n}\n\nconst integrate = (fn: Function, a: number, b: number, n: number) => {\n let sum = 0\n const h = (b - a) / n\n for (let i = 0; i < n; i++) {\n sum += fn(a + i * h) * h\n }\n return sum\n}\n\nexport default math\n","import hash from '../utils/hash'\n\nconst fonts = async () => {\n return new Promise(async (resolve) => {\n try {\n const iframe = document.createElement('iframe')\n iframe.style.display = 'none'\n document.body.appendChild(iframe)\n\n const results = await Promise.all(\n fontList.map((font) => {\n return new Promise(async (resolve) => {\n const canvas = iframe.contentDocument!.createElement('canvas')\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D\n\n try {\n const fontReady = iframe.contentDocument!.fonts.check(\n `128px ${font}`\n )\n\n if (fontReady) {\n ctx.font = `128px ${font}`\n resolve(ctx.measureText('😀☺♨...☑✴🅰').width)\n } else {\n resolve(0)\n }\n } catch {\n resolve(0)\n }\n })\n })\n )\n\n document.body.removeChild(iframe)\n const unique = [...new Set(results)]\n\n resolve({\n fonts: {\n unique: unique.length,\n hash: hash(unique.sort().join('|')),\n list: unique.sort()\n }\n })\n } catch (error) {\n resolve({ fonts: null })\n }\n })\n}\n\nconst fontList = [\n 'mono',\n 'system-ui',\n '-apple-system',\n 'BlinkMacSystemFont',\n 'MS Shell Dlg',\n 'MS Shell Dlg \\\\32',\n 'aakar',\n 'Abadi MT Condensed',\n 'Abadi MT Condensed Light',\n 'ABeeZee',\n 'Abel',\n 'Abhaya Libre',\n 'Abril Fatface',\n 'Abyssinica SIL',\n 'Academy Engraved LET',\n 'AcadEref',\n 'Aclonica',\n 'Acme',\n 'Actor',\n 'Adamina',\n 'Adlam',\n 'Adobe Arabic',\n 'Adobe Caslon Pro',\n 'Adobe Caslon Pro Bold',\n 'Adobe Devanagari',\n 'Adobe Fangsong Std R',\n 'Adobe Fan Heiti Std B',\n 'Adobe Garamond',\n 'Adobe Garamond Pro',\n 'Adobe Garamond Pro Bold',\n 'Adobe Gothic Std B',\n 'Adobe Hebrew',\n 'Adobe Heiti Std R',\n 'Adobe Kaiti Std R',\n 'Adobe Ming Std L',\n 'Adobe Myungjo Std M',\n 'Adobe Naskh Medium',\n 'Adobe Song Std L',\n 'Advent Pro',\n 'Agency FB',\n 'Aguafina Script',\n 'Aharoni',\n 'Aharoni Bold',\n 'Aharoni CLM',\n 'AIGDT',\n 'Akronim',\n 'Aladin',\n 'AlArabiya',\n 'AlBattar',\n 'Al Bayan',\n 'Al Bayan Bold',\n 'Al Bayan Plain',\n 'Albertus Extra Bold',\n 'Albertus Medium',\n 'Aldhabi',\n 'Aldrich',\n 'Alef',\n 'Alegreya',\n 'Alegreya Sans',\n 'Alegreya Sans SC',\n 'Alegreya SC',\n 'Aleo',\n 'Alexandra Script',\n 'Alex Brush',\n 'Alfa Slab One',\n 'Algerian',\n 'AlHor',\n 'Alice',\n 'Alike',\n 'Alike Angular',\n 'Allan',\n 'Allerta',\n 'Allerta Stencil',\n 'Allura',\n 'AlManzomah',\n 'Almarai',\n 'Almendra',\n 'Almendra Display',\n 'Almendra SC',\n 'Al Nile',\n 'Al Nile Bold',\n 'Al Tarikh',\n 'Al Tarikh Regular',\n 'AlternateGothic2 BT',\n 'AlYarmook',\n 'Amadeus',\n 'Amarante',\n 'Amaranth',\n 'Amatic SC',\n 'Amazone BT',\n 'AmdtSymbols',\n 'American Typewriter',\n 'American Typewriter Bold',\n 'American Typewriter Condensed',\n 'American Typewriter Condensed Bold',\n 'American Typewriter Condensed Light',\n 'American Typewriter Light',\n 'American Typewriter Semibold',\n 'AmerType Md BT',\n 'Amethysta',\n 'AMGDT',\n 'Amiko',\n 'Amiri',\n 'Amiri Quran',\n 'Amiri Quran Colored',\n 'Amita',\n 'Anaheim',\n 'AnastasiaScript',\n 'Andada',\n 'Andale Mono',\n 'Andalus',\n 'Andika',\n 'Android Emoji',\n 'Angkor',\n 'Angsana New',\n 'Angsana New Bold',\n 'Angsana New Bold Italic',\n 'Angsana New Italic',\n 'AngsanaUPC',\n 'AngsanaUPC Bold',\n 'AngsanaUPC Bold Italic',\n 'AngsanaUPC Italic',\n 'Ani',\n 'AnjaliOldLipi',\n 'Annabelle',\n 'Annie Use Your Telescope',\n 'Anonymous Pro',\n 'Antic',\n 'Antic Didone',\n 'Antic Slab',\n 'Antique Olive',\n 'Anton',\n 'Aparajita',\n 'Aparajita Bold',\n 'Aparajita Bold Italic',\n 'Aparajita Italic',\n 'Apple Braille',\n 'Apple Braille Outline 6 Dot',\n 'Apple Braille Outline 8 Dot',\n 'Apple Braille Pinpoint 6 Dot',\n 'Apple Braille Pinpoint 8 Dot',\n 'Apple Chancery',\n 'Apple Color Emoji',\n 'AppleGothic',\n 'AppleGothic Regular',\n 'Apple LiGothic',\n 'Apple LiGothic Medium',\n 'Apple LiSung',\n 'Apple LiSung Light',\n 'AppleMyungjo',\n 'AppleMyungjo Regular',\n 'Apple SD Gothic Neo',\n 'Apple SD Gothic Neo Bold',\n 'Apple SD GothicNeo ExtraBold',\n 'Apple SD Gothic Neo Heavy',\n 'Apple SD Gothic Neo Light',\n 'Apple SD Gothic Neo Medium',\n 'Apple SD Gothic Neo Regular',\n 'Apple SD Gothic Neo SemiBold',\n 'Apple SD Gothic Neo Thin',\n 'Apple SD Gothic Neo UltraLight',\n 'Apple Symbols',\n 'Aqua Kana',\n 'AquaKana',\n 'Aqua Kana Bold',\n 'Arab',\n 'Arabic Transparent',\n 'Arabic Typesetting',\n 'Arapey',\n 'Arbutus',\n 'Arbutus Slab',\n 'Archer',\n 'Architects Daughter',\n 'Archivo',\n 'Archivo Black',\n 'Archivo Narrow',\n 'Aref Ruqaa',\n 'Arial',\n 'Arial Baltic',\n 'Arial Bold',\n 'Arial Bold Italic',\n 'Arial CE',\n 'Arial Cyr',\n 'Arial Greek',\n 'Arial Hebrew',\n 'Arial Hebrew Bold',\n 'Arial Hebrew Light',\n 'Arial Hebrew Scholar',\n 'Arial Hebrew Scholar Bold',\n 'Arial Hebrew Scholar Light',\n 'Arial Italic',\n 'Arial MT',\n 'Arial Narrow',\n 'Arial Narrow Bold',\n 'Arial Narrow Bold Italic',\n 'Arial Narrow Italic',\n 'Arial Nova',\n 'Arial Nova Bold',\n 'Arial Nova Bold Italic',\n 'Arial Nova Cond',\n 'Arial Nova Cond Bold',\n 'Arial Nova Cond Bold Italic',\n 'Arial Nova Cond Italic',\n 'Arial Nova Cond Light',\n 'Arial Nova Cond Light Italic',\n 'Arial Nova Italic',\n 'Arial Nova Light',\n 'Arial Nova Light Italic',\n 'Arial Rounded MT Bold',\n 'Arial TUR',\n 'Arial Unicode MS',\n 'Arima Madurai',\n 'Arimo',\n 'Ariston',\n 'Arizonia',\n 'Armata',\n 'Arno Pro',\n 'Arno Pro Caption',\n 'Arno Pro Display',\n 'Arno Pro Light Display',\n 'Arno Pro Smbd',\n 'Arno Pro Smbd Caption',\n 'Arno Pro Smbd Display',\n 'Arno Pro Smbd SmText',\n 'Arno Pro Smbd Subhead',\n 'Arno Pro SmText',\n 'Arno Pro Subhead',\n 'AR PL UKai CN',\n 'AR PL UKai HK',\n 'AR PL UKai TW',\n 'AR PL UKai TW MBE',\n 'AR PL UMing CN',\n 'AR PL UMing HK',\n 'AR PL UMing TW',\n 'AR PL UMing TW MBE',\n 'Arrus BT',\n 'Arsenal',\n 'Artifika',\n 'Arundina',\n 'Arvo',\n 'Arya',\n 'Asana Math',\n 'Asap',\n 'Asap Condensed',\n 'Asar',\n 'Asset',\n 'Assistant',\n 'Astloch',\n 'Asul',\n 'Athelas',\n 'Athelas Bold',\n 'Athelas Bold Italic',\n 'Athelas Italic',\n 'Athelas Regular',\n 'Athiti',\n 'Atma',\n 'Atomic Age',\n 'Aubrey',\n 'Audiowide',\n 'Aurora Cn BT',\n 'Autour One',\n 'AvantGarde Bk BT',\n 'AvantGarde Md BT',\n 'Avenir',\n 'Avenir Black',\n 'Avenir Black Oblique',\n 'Avenir Book',\n 'Avenir Book Oblique',\n 'Avenir Heavy',\n 'Avenir Heavy Oblique',\n 'Avenir Light',\n 'Avenir Light Oblique',\n 'Avenir Medium',\n 'Avenir Medium Oblique',\n 'Avenir Next',\n 'Avenir Next Bold',\n 'Avenir Next Bold Italic',\n 'Avenir Next Condensed',\n 'Avenir Next Condensed Bold',\n 'Avenir Next Condensed Bold Italic',\n 'Avenir Next Condensed Demi Bold',\n 'Avenir Next Condensed Demi Bold Italic',\n 'Avenir Next Condensed Heavy',\n 'Avenir Next Condensed Heavy Italic',\n 'Avenir Next Condensed Italic',\n 'Avenir Next Condensed Medium',\n 'Avenir Next Condensed Medium Italic',\n 'Avenir Next Condensed Regular',\n 'Avenir Next Condensed Ultra Light',\n 'Avenir Next Condensed Ultra Light Italic',\n 'Avenir Next Demi Bold',\n 'Avenir Next Demi Bold Italic',\n 'Avenir Next Heavy',\n 'Avenir Next Heavy Italic',\n 'Avenir Next Italic',\n 'Avenir Next Medium',\n 'Avenir Next Medium Italic',\n 'Avenir Next Regular',\n 'Avenir Next Ultra Light',\n 'Avenir Next Ultra Light Italic',\n 'Avenir Oblique',\n 'Avenir Roman',\n 'Average',\n 'Average Sans',\n 'Averia Gruesa Libre',\n 'Averia Libre',\n 'Averia Sans Libre',\n 'Averia Serif Libre',\n 'Ayuthaya',\n 'B612',\n 'B612 Mono',\n 'Bad Script',\n 'Baghdad',\n 'Baghdad Regular',\n 'Bahiana',\n 'Bahianita',\n 'Bahnschrift',\n 'Bahnschrift Light',\n 'Bahnschrift SemiBold',\n 'Bahnschrift SemiLight',\n 'Bai Jamjuree',\n 'Balinese',\n 'Baloo',\n 'Baloo Bhai',\n 'Baloo Bhaijaan',\n 'Baloo Bhaina',\n 'Baloo Chettan',\n 'Baloo Da',\n 'Baloo Paaji',\n 'Baloo Tamma',\n 'Baloo Tammudu',\n 'Baloo Thambi',\n 'Balthazar',\n 'Bamum',\n 'Bandy',\n 'Bangers',\n 'Bangla MN',\n 'Bangla MN Bold',\n 'Bangla Sangam MN',\n 'Bangla Sangam MN Bold',\n 'Bank Gothic',\n 'BankGothic Lt BT',\n 'BankGothic Md BT',\n 'Baoli SC',\n 'Baoli SC Regular',\n 'Baoli TC',\n 'Baoli TC Regular',\n 'Barlow',\n 'Barlow Condensed',\n 'Barlow Semi Condensed',\n 'Barriecito',\n 'Barrio',\n 'Basic',\n 'Baskerville',\n 'Baskerville Bold',\n 'Baskerville Bold Italic',\n 'Baskerville Italic',\n 'Baskerville Old Face',\n 'Baskerville SemiBold',\n 'Baskerville SemiBold Italic',\n 'Bassa Vah',\n 'Batak',\n 'Batang',\n 'BatangChe',\n 'Battambang',\n 'Bauer Bodoni',\n 'Bauhaus 93',\n 'Baumans',\n 'Bayon',\n 'Bazooka',\n 'Bebas Neue',\n 'Beirut',\n 'Beirut Regular',\n 'Belgrano',\n 'Bellefair',\n 'Belleza',\n 'Bell Gothic Std Black',\n 'Bell Gothic Std Light',\n 'Bell MT',\n 'Bembo',\n 'BenchNine',\n 'Bengali',\n 'Benguiat Bk BT',\n 'Bentham',\n 'Berkshire Swash',\n 'Berlin Sans FB',\n 'Berlin Sans FB Demi',\n 'Bernard MT Condensed',\n 'BernhardFashion BT',\n 'BernhardMod BT',\n 'Beth Ellen',\n 'Bevan',\n 'Be Vietnam',\n 'BiauKai',\n 'Bickham Script One',\n 'Bickham Script Pro Regular',\n 'Bickham Script Pro Semibold',\n 'Bickham Script Two',\n 'Big Caslon',\n 'Big Caslon Medium',\n 'Bigelow Rules',\n 'Bigshot One',\n 'Big Shoulders Display',\n 'Big Shoulders Text',\n 'Bilbo',\n 'Bilbo Swash Caps',\n 'BinnerD',\n 'BioRhyme',\n 'BioRhyme Expanded',\n 'Birch Std',\n 'Biryani',\n 'Bitstream Charter',\n 'Bitstream Vera Sans Mono',\n 'Bitter',\n 'BIZ UDGothic',\n 'BIZ UDGothic Bold',\n 'BIZ UDMincho',\n 'BIZ UDMincho Medium',\n 'BIZ UDPGothic',\n 'BIZ UDPGothic Bold',\n 'BIZ UDPMincho',\n 'BIZ UDPMincho Medium',\n 'BIZ UDPゴシック',\n 'Blackadder ITC',\n 'Black And White Picture',\n 'Black Han Sans',\n 'Blackoak Std',\n 'Black Ops One',\n 'BlairMdITC TT',\n 'Blinker',\n 'Bodoni 72',\n 'Bodoni 72 Bold',\n 'Bodoni 72 Book',\n 'Bodoni 72 Book Italic',\n 'Bodoni 72 Oldstyle',\n 'Bodoni 72 Oldstyle Bold',\n 'Bodoni 72 Oldstyle Book',\n 'Bodoni 72 Oldstyle Book Italic',\n 'Bodoni 72 Smallcaps',\n 'Bodoni 72 Smallcaps Book',\n 'Bodoni MT',\n 'Bodoni MT Black',\n 'Bodoni MT Condensed',\n 'Bodoni MT Poster Compressed',\n 'Bodoni Ornaments',\n 'Bokor',\n 'Bonbon',\n 'Boogaloo',\n 'Book Antiqua',\n 'Bookman Old Style',\n 'Bookshelf Symbol 7',\n 'Boulder',\n 'Bowlby One',\n 'Bowlby One SC',\n 'BPG Algeti GPL&GNU',\n 'BPG Chveulebrivi GPL&GNU',\n 'BPG Courier GPL&GNU',\n 'BPG Courier S GPL&GNU',\n 'BPG DedaEna Block GPL&GNU',\n 'BPG DejaVu Sans 2011 GNU-GPL',\n 'BPG Elite GPL&GNU',\n 'BPG Excelsior Caps GPL&GNU',\n 'BPG Excelsior Condencerd GPL&GNU',\n 'BPG Excelsior GPL&GNU',\n 'BPG Glaho GPL&GNU',\n 'BPG Gorda GPL&GNU',\n 'BPG Ingiri GPL&GNU',\n 'BPG Mrgvlovani Caps GNU&GPL',\n 'BPG Mrgvlovani GPL&GNU',\n 'BPG Nateli Caps GPL&GNU',\n 'BPG Nateli Condenced GPL&GNU',\n 'BPG Nateli GPL&GNU',\n 'BPG Nino Medium Cond GPL&GNU',\n 'BPG Nino Medium GPL&GNU',\n 'BPG Sans GPL&GNU',\n 'BPG Sans Medium GPL&GNU',\n 'BPG Sans Modern GPL&GNU',\n 'BPG Sans Regular GPL&GNU',\n 'BPG Serif GPL&GNU',\n 'BPG Serif Modern GPL&GNU',\n 'Bradley Hand',\n 'Bradley Hand Bold',\n 'Bradley Hand ITC',\n 'Brawler',\n 'Bree Serif',\n 'Bremen Bd BT',\n 'Britannic Bold',\n 'Broadway',\n 'Browallia New',\n 'Browallia New Bold',\n 'Browallia New Bold Italic',\n 'Browallia New Italic',\n 'BrowalliaUPC',\n 'BrowalliaUPC Bold',\n 'BrowalliaUPC Bold Italic',\n 'BrowalliaUPC Italic',\n 'Brush Script MT',\n 'Brush Script MT Italic',\n 'Brush Script Std',\n 'Bubblegum Sans',\n 'Bubbler One',\n 'Buda',\n 'Buenard',\n 'Buginese',\n 'Buhid',\n 'Bungee',\n 'Bungee Hairline',\n 'Bungee Inline',\n 'Bungee Outline',\n 'Bungee Shade',\n 'Butcherman',\n 'Butterfly Kids',\n 'C059',\n 'Cabin',\n 'Cabin Condensed',\n 'Cabin Sketch',\n 'Caesar Dressing',\n 'Cagliostro',\n 'Cairo',\n 'Caladea',\n 'Caladings CLM',\n 'Calibri',\n 'Calibri Bold',\n 'Calibri Bold Italic',\n 'Calibri Italic',\n 'Californian FB',\n 'Calisto MT',\n 'Calligraffitti',\n 'Calligraph',\n 'Calligrapher',\n 'Cambay',\n 'Cambo',\n 'Cambria',\n 'Cambria Bold',\n 'Cambria Bold Italic',\n 'Cambria Italic',\n 'Cambria Math',\n 'Canadian Aboriginal',\n 'Candal',\n 'Candara',\n 'Candara Bold',\n 'Candara Bold Italic',\n 'Candara Italic',\n 'Cantarell',\n 'Cantarell Extra Bold',\n 'Cantarell Light',\n 'Cantarell Thin',\n 'Cantata One',\n 'Cantora One',\n 'Capriola',\n 'Cardo',\n 'Carlito',\n 'Carme',\n 'Carolina',\n 'Carrois Gothic',\n 'Carrois Gothic SC',\n 'Carter One',\n 'Cascadia Code',\n 'Cascadia Mono',\n 'CaslonOpnface BT',\n 'Castellar',\n 'Catamaran',\n 'Caudex',\n 'Caveat',\n 'Caveat Brush',\n 'Cedarville Cursive',\n 'Centaur',\n 'Century',\n 'Century Gothic',\n 'Century Schoolbook',\n 'Century Schoolbook L',\n 'Ceremonious Two',\n 'Ceviche One',\n 'Cezanne',\n 'CG Omega',\n 'CG Times',\n 'Chakma',\n 'Chakra Petch',\n 'Chalkboard',\n 'Chalkboard Bold',\n 'Chalkboard SE',\n 'Chalkboard SE Bold',\n 'Chalkboard SE Light',\n 'Chalkboard SE Regular',\n 'Chalkduster',\n 'Cham',\n 'Chandas',\n 'Changa',\n 'Changa One',\n 'Chango',\n 'Chaparral Pro',\n 'Chaparral Pro Light',\n 'Charcoal CY',\n 'Charis SIL Compact',\n 'Charlemagne Std',\n 'Charlesworth',\n 'Charm',\n 'Charmonman',\n 'Charter',\n 'Charter Bd BT',\n 'Charter Black',\n 'Charter Black Italic',\n 'Charter Bold',\n 'Charter Bold Italic',\n 'Charter BT',\n 'Charter Italic',\n 'Charter Roman',\n 'Chathura',\n 'Chaucer',\n 'Chau Philomene One',\n 'Chela One',\n 'Chelsea Market',\n 'ChelthmITC Bk BT',\n 'Chenla',\n 'Cherokee',\n 'Cherry Cream Soda',\n 'Cherry Swash',\n 'Chewy',\n 'Chicle',\n 'Chilanka',\n 'Chiller',\n 'Chivo',\n 'Chonburi',\n 'Cinzel',\n 'Cinzel Decorative',\n 'CityBlueprint',\n 'Clarendon',\n 'Clarendon Blk BT',\n 'Clarendon BT',\n 'Clarendon Condensed',\n 'Clarendon Lt BT',\n 'Clean',\n 'Clicker Script',\n 'CloisterBlack BT',\n 'cmex10',\n 'cmmi10',\n 'cmr10',\n 'cmsy10',\n 'Cochin',\n 'Cochin Bold',\n 'Cochin Bold Italic',\n 'Cochin Italic',\n 'Coda',\n 'Coda Caption',\n 'Codystar',\n 'Coiny',\n 'Colonna MT',\n 'Combo',\n 'Comfortaa',\n 'Comfortaa Light',\n 'Comic Sans',\n 'Comic Sans MS',\n 'Comic Sans MS Bold',\n 'Comic Sans MS Bold Italic',\n 'Comic Sans MS Italic',\n 'Coming Soon',\n 'CommercialPi BT',\n 'CommercialScript BT',\n 'Complex',\n 'Concert One',\n 'Condiment',\n 'Consolas',\n 'Consolas Bold',\n 'Consolas Bold Italic',\n 'Consolas Italic',\n 'Constantia',\n 'Constantia Bold',\n 'Constantia Bold Italic',\n 'Constantia Italic',\n 'Content',\n 'Contrail One',\n 'Convergence',\n 'Cookie',\n 'Cooper Black',\n 'Cooper Std Black',\n 'Copperplate',\n 'Copperplate Bold',\n 'Copperplate Gothic',\n 'Copperplate Gothic Bold',\n 'Copperplate Gothic Light',\n 'Copperplate Light',\n 'CopperplGoth Bd BT',\n 'Copse',\n 'Coptic',\n 'Copyist',\n 'Corbel',\n 'Corbel Bold',\n 'Corbel Bold Italic',\n 'Corbel Italic',\n 'Corbel Light',\n 'Corbel Light Italic',\n 'Corben',\n 'Cordia New',\n 'Cordia New Bold',\n 'Cordia New Bold Italic',\n 'Cordia New Italic',\n 'CordiaUPC',\n 'CordiaUPC Bold',\n 'CordiaUPC Bold Italic',\n 'CordiaUPC Italic',\n 'Cormorant',\n 'Cormorant Garamond',\n 'Cormorant Infant',\n 'Cormorant SC',\n 'Cormorant Unicase',\n 'Cormorant Upright',\n 'Cornerstone',\n 'Coronet',\n 'Corsiva Hebrew',\n 'Corsiva Hebrew Bold',\n 'Cortoba',\n 'CountryBlueprint',\n 'Courgette',\n 'Courier',\n 'Courier 10 Pitch',\n 'Courier Bold',\n 'Courier Bold Oblique',\n 'Courier New',\n 'Courier New Baltic',\n 'Courier New Bold',\n 'Courier New Bold Italic',\n 'Courier New CE',\n 'Courier New Cyr',\n 'Courier New Greek',\n 'Courier New Italic',\n 'Courier New TUR',\n 'Courier Oblique',\n 'Cousine',\n 'Coustard',\n 'Covered By Your Grace',\n 'Crafty Girls',\n 'Creepster',\n 'Crete Round',\n 'Crimson Pro',\n 'Crimson Text',\n 'Croissant One',\n 'Crushed',\n 'Cuckoo',\n 'Cuprum',\n 'Curlz MT',\n 'Cursor',\n 'Cute Font',\n 'Cutive',\n 'Cutive Mono',\n 'D050000L',\n 'Damascus',\n 'Damascus Bold',\n 'Damascus Light',\n 'Damascus Medium',\n 'Damascus Regular',\n 'Damascus Semi Bold',\n 'Damion',\n 'Dancing Script',\n 'Dangrek',\n 'Darker Grotesque',\n 'DaunPenh',\n 'Dauphin',\n 'David',\n 'David Bold',\n 'David CLM',\n 'David Libre',\n 'Dawning of a New Day',\n 'Days One',\n 'DB LCD Temp',\n 'Decor',\n 'DecoType Naskh',\n 'DecoType Naskh Regular',\n 'DejaVu Math TeX Gyre',\n 'DejaVu Sans',\n 'DejaVu Sans Condensed',\n 'DejaVu Sans Light',\n 'DejaVu Sans Mono',\n 'DejaVu Serif',\n 'DejaVu Serif Condensed',\n 'Dekko',\n 'Delicious',\n 'Delius',\n 'Delius Swash Caps',\n 'Delius Unicase',\n 'Della Respira',\n 'DengXian',\n 'DengXian Bold',\n 'DengXian Light',\n 'Denk One',\n 'Denmark',\n 'Deseret',\n 'Devanagari',\n 'Devanagari MT',\n 'Devanagari MT Bold',\n 'Devanagari Sangam MN',\n 'Devanagari Sangam MN Bold',\n 'Devonshire',\n 'DFKai-SB',\n 'Dhurjati',\n 'Didact Gothic',\n 'Didot',\n 'Didot Bold',\n 'Didot Italic',\n 'DilleniaUPC',\n 'DilleniaUPC Bold',\n 'DilleniaUPC Bold Italic',\n 'DilleniaUPC Italic',\n 'Dimnah',\n 'DIN',\n 'DIN Alternate',\n 'DIN Alternate Bold',\n 'DIN Condensed',\n 'DIN Condensed Bold',\n 'Dingbats',\n 'Diplomata',\n 'Diplomata SC',\n 'Diwan Kufi',\n 'Diwan Kufi Regular',\n 'Diwan Mishafi',\n 'Diwan Thuluth',\n 'Diwan Thuluth Regular',\n 'DM Sans',\n 'DM Serif Display',\n 'DM Serif Text',\n 'Dogra',\n 'Do Hyeon',\n 'DokChampa',\n 'Dokdo',\n 'Domine',\n 'Donegal One',\n 'Doppio One',\n 'Dorsa',\n 'Dosis',\n 'Dotum',\n 'DotumChe',\n 'Droid Arabic Kufi',\n 'Droid Arabic Naskh',\n 'Droid Naskh Shift Alt',\n 'Droid Sans',\n 'Droid Sans Arabic',\n 'Droid Sans Armenian',\n 'Droid Sans Devanagari',\n 'Droid Sans Ethiopic',\n 'Droid Sans Fallback',\n 'Droid Sans Georgian',\n 'Droid Sans Hebrew',\n 'Droid Sans Japanese',\n 'Droid Sans Mono',\n 'Droid Sans Tamil',\n 'Droid Sans Thai',\n 'Droid Serif',\n 'Dr Sugiyama',\n 'Drugulin CLM',\n 'Duru Sans',\n 'Dutch801 Rm BT',\n 'Dutch801 XBd BT',\n 'Dynalight',\n 'Dyuthi',\n 'Eagle Lake',\n 'East Sea Dokdo',\n 'Eater',\n 'EB Garamond',\n 'Ebrima',\n 'Ebrima Bold',\n 'Eccentric Std',\n 'Economica',\n 'Eczar',\n 'Edwardian Script ITC',\n 'Eeyek Unicode',\n 'Elbasan',\n 'Electrolize',\n 'Electron',\n 'Elephant',\n 'Ellinia CLM',\n 'El Messiri',\n 'Elsie',\n 'Elsie Swash Caps',\n 'Emblema One',\n 'Emilys Candy',\n 'EmojiOne Mozilla',\n 'Encode Sans',\n 'Encode Sans Condensed',\n 'Encode Sans Expanded',\n 'Encode Sans Semi Condensed',\n 'Encode Sans Semi Expanded',\n 'Engagement',\n 'Englebert',\n 'English 111 Vivace BT',\n 'EngraversGothic BT',\n 'Engravers MT',\n 'Enriqueta',\n 'Eras Bold ITC',\n 'Eras Demi ITC',\n 'Eras Light ITC',\n 'Eras Medium ITC',\n 'Erica One',\n 'esint10',\n 'Esteban',\n 'Estrangelo Edessa',\n 'Ethiopic',\n 'EucrosiaUPC',\n 'EucrosiaUPC Bold',\n 'EucrosiaUPC Bold Italic',\n 'EucrosiaUPC Italic',\n 'eufm10',\n 'Euphemia',\n 'Euphemia UCAS',\n 'Euphemia UCAS Bold',\n 'Euphemia UCAS Italic',\n 'Euphoria Script',\n 'EuroRoman',\n 'Eurostile',\n 'Ewert',\n 'Exo',\n 'Exo 2',\n 'Exotc350 Bd BT',\n 'Expletus Sans',\n 'Ezra SIL',\n 'Ezra SIL SR',\n 'Fahkwang',\n 'FangSong',\n 'Fanwood Text',\n 'Farah',\n 'Farah Regular',\n 'Farisi',\n 'Farisi Regular',\n 'Farro',\n 'Farsan',\n 'Fascinate',\n 'Fascinate Inline',\n 'Faster One',\n 'Fasthand',\n 'Fauna One',\n 'Faustina',\n 'Federant',\n 'Federo',\n 'Felipa',\n 'Felix Titling',\n 'Fenix',\n 'Finger Paint',\n 'Fira Code',\n 'Fira Mono',\n 'Fira Sans',\n 'Fira Sans Condensed',\n 'Fira Sans Extra Condensed',\n 'Fixed',\n 'Fixed Miriam Transparent',\n 'Fixedsys',\n 'Fjalla One',\n 'Fjord One',\n 'Flamenco',\n 'Flavors',\n 'Fondamento',\n 'FontAwesome',\n 'Fontdiner Swanky',\n 'Fontin',\n 'Footlight MT Light',\n 'Forte',\n 'Forum',\n 'Francois One',\n 'Franklin Gothic Book',\n 'Franklin Gothic Demi',\n 'Franklin Gothic Demi Cond',\n 'Franklin Gothic Heavy',\n 'Franklin Gothic Medium',\n 'Franklin Gothic Medium Cond',\n 'Franklin Gothic Medium Italic',\n 'FrankRuehl',\n 'Frank Ruehl CLM',\n 'Frank Ruhl Libre',\n 'Fransiscan',\n 'Freckle Face',\n 'Fredericka the Great',\n 'Fredoka One',\n 'Free Avant Garde',\n 'Free Bookman',\n 'Free Chancery',\n 'Free Courier',\n 'Freefrm721 Blk BT',\n 'Freehand',\n 'Freehand521 BT',\n 'Free Helvetian',\n 'Free Helvetian Condensed',\n 'FreeMono',\n 'Free Paladin',\n 'FreeSans',\n 'Free Schoolbook',\n 'FreeSerif',\n 'FreesiaUPC',\n 'FreesiaUPC Bold',\n 'FreesiaUPC Bold Italic',\n 'FreesiaUPC Italic',\n 'Freestyle Script',\n 'Free Times',\n 'French Script MT',\n 'Fresca',\n 'Frijole',\n 'FrnkGothITC Bk BT',\n 'Fruitger',\n 'Fruktur',\n 'Frutiger',\n 'Fugaz One',\n 'Furat',\n 'Futura',\n 'Futura Bk BT',\n 'FuturaBlack BT',\n 'Futura Bold',\n 'Futura Condensed ExtraBold',\n 'Futura Condensed Medium',\n 'Futura Lt BT',\n 'Futura Md BT',\n 'Futura Medium',\n 'Futura Medium Italic',\n 'Futura ZBlk BT',\n 'Gabriela',\n 'Gabriola',\n 'Gadugi',\n 'Gadugi Bold',\n 'Gaegu',\n 'Gafata',\n 'Galada',\n 'Galdeano',\n 'Galindo',\n 'Galliard BT',\n 'Galvji',\n 'Gamja Flower',\n 'Garamond',\n 'Garamond Premr Pro',\n 'Garamond Premr Pro Smbd',\n 'Gargi',\n 'Garuda',\n 'Gautami',\n 'Gautami Bold',\n 'Gayathri',\n 'Gayathri Thin',\n 'GB18030 Bitmap',\n 'GDT',\n 'Geeza Pro',\n 'Geeza Pro Bold',\n 'Geeza Pro Regular',\n 'Geneva',\n 'Geneva CY',\n 'GENISO',\n 'Gentium',\n 'GentiumAlt',\n 'Gentium Basic',\n 'Gentium Book Basic',\n 'Geo',\n 'Geometr231 BT',\n 'Geometr231 Hv BT',\n 'Geometr231 Lt BT',\n 'Georgia',\n 'Georgia Bold',\n 'Georgia Bold Italic',\n 'Georgia Italic',\n 'Georgian',\n 'Georgia Pro',\n 'Georgia Pro Black',\n 'Georgia Pro Black Italic',\n 'Georgia Pro Bold',\n 'Georgia Pro Bold Italic',\n 'Georgia Pro Cond',\n 'Georgia Pro Cond Black',\n 'Georgia Pro Cond Black Italic',\n 'Georgia Pro Cond Bold',\n 'Georgia Pro Cond Bold Italic',\n 'Georgia Pro Cond Italic',\n 'Georgia Pro Cond Light',\n 'Georgia Pro Cond Light Italic',\n 'Georgia Pro Cond Semibold',\n 'Georgia Pro Cond Semibold Italic',\n 'Georgia Pro Italic',\n 'Georgia Pro Light',\n 'Georgia Pro Light Italic',\n 'Georgia Pro Semibold',\n 'Georgia Pro Semibold Italic',\n 'GeoSlab 703 Lt BT',\n 'GeoSlab 703 XBd BT',\n 'Geostar',\n 'Geostar Fill',\n 'Germania One',\n 'GFS Didot',\n 'GFS Neohellenic',\n 'Giddyup Std',\n 'Gidugu',\n 'Gigi',\n 'Gilda Display',\n 'Gill Sans',\n 'Gill Sans Bold',\n 'Gill Sans Bold Italic',\n 'Gill Sans Italic',\n 'Gill Sans Light',\n 'Gill Sans Light Italic',\n 'Gill Sans MT',\n 'Gill Sans MT Condensed',\n 'Gill Sans MT Ext Condensed Bold',\n 'Gill Sans Nova',\n 'Gill Sans Nova Bold',\n 'Gill Sans Nova Bold Italic',\n 'Gill Sans Nova Cond',\n 'Gill Sans Nova Cond Bold',\n 'Gill Sans Nova Cond Bold Italic',\n 'Gill Sans Nova Cond Italic',\n 'Gill Sans Nova Cond Lt',\n 'Gill Sans Nova Cond Lt Italic',\n 'Gill Sans Nova Cond Ultra Bold',\n 'Gill Sans Nova Cond XBd',\n 'Gill Sans Nova Cond XBd Italic',\n 'Gill Sans Nova Italic',\n 'Gill Sans Nova Light',\n 'Gill Sans Nova Light Italic',\n 'Gill Sans Nova Ultra Bold',\n 'Gill Sans SemiBold',\n 'Gill Sans SemiBold Italic',\n 'Gill Sans Ultra Bold',\n 'Gill Sans UltraBold',\n 'Gill Sans Ultra Bold Condensed',\n 'Gisha',\n 'Gisha Bold',\n 'Give You Glory',\n 'Glass Antiqua',\n 'Glegoo',\n 'Gloria Hallelujah',\n 'Gloucester MT Extra Condensed',\n 'Goblin One',\n 'Gochi Hand',\n 'Google Sans',\n 'Gorditas',\n 'Gotham',\n 'Gotham Bold',\n 'Gothic A1',\n 'GothicE',\n 'GothicG',\n 'GothicI',\n 'Goudy Bookletter 1911',\n 'GoudyHandtooled BT',\n 'Goudy Old Style',\n 'GoudyOLSt BT',\n 'Goudy Stout',\n 'Graduate',\n 'Granada',\n 'Grand Hotel',\n 'Grantha',\n 'Graph',\n 'Gravitas One',\n 'Great Vibes',\n 'GreekC',\n 'GreekS',\n 'Grenze',\n 'Griffy',\n 'Gruppo',\n 'Gubbi',\n 'Gudea',\n 'Gugi',\n 'Gujarati',\n 'Gujarati MT',\n 'Gujarati MT Bold',\n 'Gujarati Sangam MN',\n 'Gujarati Sangam MN Bold',\n 'Gulim',\n 'GulimChe',\n 'GungSeo',\n 'GungSeo Regular',\n 'Gungsuh',\n 'GungsuhChe',\n 'Gunjala Gondi',\n 'Gurajada',\n 'Gurmukhi',\n 'Gurmukhi MN',\n 'Gurmukhi MN Bold',\n 'Gurmukhi MT',\n 'Gurmukhi Sangam MN',\n 'Gurmukhi Sangam MN Bold',\n 'Habibi',\n 'Hadasim CLM',\n 'Haettenschweiler',\n 'Halant',\n 'Hammersmith One',\n 'Hanalei',\n 'Hanalei Fill',\n 'Handlee',\n 'Hani',\n 'Hanifi Rohingya',\n 'Hannotate SC',\n 'Hannotate SC Bold',\n 'Hannotate SC Regular',\n 'Hannotate TC',\n 'Hannotate TC Bold',\n 'Hannotate TC Regular',\n 'Hanuman',\n 'Hanunoo',\n 'HanziPen SC',\n 'HanziPen SC Bold',\n 'HanziPen SC Regular',\n 'HanziPen TC',\n 'HanziPen TC Bold',\n 'HanziPen TC Regular',\n 'Happy Monkey',\n 'Haramain',\n 'Harlow Solid Italic',\n 'Harmattan',\n 'Harrington',\n 'Headland One',\n 'HeadLineA',\n 'HeadLineA Regular',\n 'Heather',\n 'Heather Script One',\n 'Heebo',\n 'Hei',\n 'Hei Regular',\n 'Heiti SC',\n 'Heiti SC Light',\n 'Heiti SC Medium',\n 'Heiti TC',\n 'Heiti TC Light',\n 'Heiti TC Medium',\n 'Helv',\n 'Helvetica',\n 'Helvetica Bold',\n 'Helvetica Bold Oblique',\n 'Helvetica CY',\n 'Helvetica CY Bold',\n 'Helvetica CY BoldOblique',\n 'Helvetica CY Oblique',\n 'Helvetica CY Plain',\n 'Helvetica Light',\n 'Helvetica Light Oblique',\n 'Helvetica LT MM',\n 'Helvetica Neue',\n 'Helvetica Neue Bold',\n 'Helvetica Neue Bold Italic',\n 'Helvetica Neue Condensed Black',\n 'Helvetica Neue Condensed Bold',\n 'Helvetica Neue DeskInterface',\n 'Helvetica Neue Desk UI',\n 'Helvetica Neue Desk UI Bold',\n 'Helvetica Neue Desk UI Bold Italic',\n 'Helvetica Neue Desk UI Italic',\n 'Helvetica Neue Italic',\n 'Helvetica Neue Light',\n 'Helvetica Neue Light Italic',\n 'Helvetica Neue Medium',\n 'Helvetica Neue Medium Italic',\n 'Helvetica Neue Thin',\n 'Helvetica Neue Thin Italic',\n 'Helvetica Neue UltraLight',\n 'Helvetica Neue UltraLight Italic',\n 'Helvetica Oblique',\n 'Henny Penny',\n 'Hepta Slab',\n 'Herald',\n 'Herculanum',\n 'Herr Von Muellerhoff',\n 'Hershey-Gothic-English',\n 'Hershey-Gothic-German',\n 'Hershey-Gothic-Italian',\n 'Hershey-Plain-Duplex',\n 'Hershey-Plain-Duplex-Italic',\n 'Hershey-Plain-Triplex',\n 'Hershey-Plain-Triplex-Italic',\n 'Hershey-Script-Complex',\n 'Hershey-Script-Simplex',\n 'High Tower Text',\n 'Hi Melody',\n 'Hind',\n 'Hind Guntur',\n 'Hind Madurai',\n 'Hind Siliguri',\n 'Hind Vadodara',\n 'Hiragino Kaku Gothic Pro',\n 'Hiragino Kaku Gothic ProN',\n 'Hiragino Kaku Gothic ProN W3',\n 'Hiragino Kaku Gothic ProN W6',\n 'Hiragino Kaku Gothic Pro W3',\n 'Hiragino Kaku Gothic Pro W6',\n 'Hiragino Kaku Gothic Std',\n 'Hiragino Kaku Gothic StdN',\n 'Hiragino Kaku Gothic StdN W8',\n 'Hiragino Kaku Gothic Std W8',\n 'Hiragino Maru Gothic Pro',\n 'Hiragino Maru Gothic ProN',\n 'Hiragino Maru Gothic ProN W4',\n 'Hiragino Maru Gothic Pro W4',\n 'Hiragino Mincho Pro',\n 'Hiragino Mincho ProN',\n 'Hiragino Mincho ProN W3',\n 'Hiragino Mincho ProN W6',\n 'Hiragino Mincho Pro W3',\n 'Hiragino Mincho Pro W6',\n 'Hiragino Sans',\n 'Hiragino Sans CNS',\n 'Hiragino Sans CNS W3',\n 'Hiragino Sans CNS W6',\n 'Hiragino Sans GB',\n 'Hiragino Sans GB W3',\n 'Hiragino Sans GB W6',\n 'Hiragino Sans W0',\n 'Hiragino Sans W1',\n 'Hiragino Sans W2',\n 'Hiragino Sans W3',\n 'Hiragino Sans W4',\n 'Hiragino Sans W5',\n 'Hiragino Sans W6',\n 'Hiragino Sans W7',\n 'Hiragino Sans W8',\n 'Hiragino Sans W9',\n 'Hobo Std',\n 'Hoefler Text',\n 'Hoefler Text Black',\n 'Hoefler Text Black Italic',\n 'Hoefler Text Italic',\n 'Hoefler Text Ornaments',\n 'HoloLens MDL2 Assets',\n 'Holtwood One SC',\n 'Homa',\n 'Homemade Apple',\n 'Homenaje',\n 'Hor',\n 'Humanst521 BT',\n 'Humanst 521 Cn BT',\n 'Humanst521 Lt BT',\n 'IBM Plex Mono',\n 'IBM Plex Sans',\n 'IBM Plex Sans Condensed',\n 'IBM Plex Serif',\n 'Iceberg',\n 'Iceland',\n 'IM Fell Double Pica',\n 'IM Fell Double Pica SC',\n 'IM Fell DW Pica',\n 'IM Fell DW Pica SC',\n 'IM Fell English',\n 'IM Fell English SC',\n 'IM Fell French Canon',\n 'IM Fell French Canon SC',\n 'IM Fell Great Primer',\n 'IM Fell Great Primer SC',\n 'Impact',\n 'Imprima',\n 'Imprint MT Shadow',\n 'InaiMathi',\n 'InaiMathi Bold',\n 'Incised901 Bd BT',\n 'Incised901 BT',\n 'Incised901 Lt BT',\n 'Inconsolata',\n 'Inder',\n 'Indie Flower',\n 'Informal011 BT',\n 'Informal Roman',\n 'Inika',\n 'Ink Free',\n 'Inknut Antiqua',\n 'Interstate',\n 'Iowan Old Style',\n 'Iowan Old Style Black',\n 'Iowan Old Style Black Italic',\n 'Iowan Old Style Bold',\n 'Iowan Old Style Bold Italic',\n 'Iowan Old Style Italic',\n 'Iowan Old Style Roman',\n 'Iowan Old Style Titling',\n 'IPAGothic',\n 'IPAMincho',\n 'IPAPGothic',\n 'IPAPMincho',\n 'Irish Grover',\n 'IrisUPC',\n 'IrisUPC Bold',\n 'IrisUPC Bold Italic',\n 'IrisUPC Italic',\n 'Iskoola Pota',\n 'Iskoola Pota Bold',\n 'ISOCP',\n 'ISOCP2',\n 'ISOCP3',\n 'ISOCPEUR',\n 'ISOCT',\n 'ISOCT2',\n 'ISOCT3',\n 'ISOCTEUR',\n 'Istok Web',\n 'Italiana',\n 'Italianno',\n 'Italic',\n 'ItalicC',\n 'ItalicT',\n 'ITF Devanagari',\n 'ITF Devanagari Bold',\n 'ITF Devanagari Book',\n 'ITF Devanagari Demi',\n 'ITF Devanagari Light',\n 'ITF Devanagari Marathi',\n 'ITF Devanagari Marathi Bold',\n 'ITF Devanagari Marathi Book',\n 'ITF Devanagari Marathi Demi',\n 'ITF Devanagari Marathi Light',\n 'ITF Devanagari Marathi Medium',\n 'ITF Devanagari Medium',\n 'Itim',\n 'Jacques Francois',\n 'Jacques Francois Shadow',\n 'Jaldi',\n 'Jamrul',\n 'Japan',\n 'JasmineUPC',\n 'JasmineUPC Bold',\n 'JasmineUPC Bold Italic',\n 'JasmineUPC Italic',\n 'Javanese',\n 'Javanese Text',\n 'Jazz LET',\n 'Jenson',\n 'Jester',\n 'Jet',\n 'Jim Nightshade',\n 'Jockey One',\n 'Jokerman',\n 'Jolly Lodger',\n 'Jomhuria',\n 'Jomolhari',\n 'Josefin Sans',\n 'Josefin Slab',\n 'Joti One',\n 'Jua',\n 'Judson',\n 'Juice ITC',\n 'Julee',\n 'Julius Sans One',\n 'Junge',\n 'Jura',\n 'Just Another Hand',\n 'Just Me Again Down Here',\n 'K2D',\n 'Kabel Bk BT',\n 'Kabel Ult BT',\n 'KacstArt',\n 'KacstBook',\n 'KacstDecorative',\n 'KacstDigital',\n 'KacstFarsi',\n 'KacstLetter',\n 'KacstNaskh',\n 'KacstOffice',\n 'KacstOne',\n 'KacstPen',\n 'KacstPoster',\n 'KacstQurn',\n 'KacstScreen',\n 'KacstTitle',\n 'KacstTitleL',\n 'Kadwa',\n 'Kai',\n 'Kailasa',\n 'Kailasa Bold',\n 'Kailasa Regular',\n 'Kai Regular',\n 'KaiTi',\n 'Kaiti SC',\n 'Kaiti SC Black',\n 'Kaiti SC Bold',\n 'Kaiti SC Regular',\n 'Kaiti TC',\n 'Kaiti TC Bl