diff --git a/client/homebrew/editor/editor.jsx b/client/homebrew/editor/editor.jsx index 7cc800b78..f5c1766a8 100644 --- a/client/homebrew/editor/editor.jsx +++ b/client/homebrew/editor/editor.jsx @@ -5,6 +5,7 @@ const createClass = require('create-react-class'); const _ = require('lodash'); const cx = require('classnames'); const dedent = require('dedent-tabs').default; +const Markdown = require('../../../shared/naturalcrit/markdown.js'); const CodeEditor = require('naturalcrit/codeEditor/codeEditor.jsx'); const SnippetBar = require('./snippetbar/snippetbar.jsx'); @@ -219,6 +220,34 @@ const Editor = createClass({ endCh = match.index+match[0].length; codeMirror.markText({ line: lineNumber, ch: 0 }, { line: lineNumber, ch: endCh }, { className: 'block' }); } + + // Emojis + if(line.match(/:[^\s:]+:/g)) { + let startIndex = line.indexOf(':'); + const emojiRegex = /:[^\s:]+:/gy; + + while (startIndex >= 0) { + emojiRegex.lastIndex = startIndex; + let match = emojiRegex.exec(line); + if (match) { + let tokens = Markdown.marked.lexer(match[0]); + tokens = tokens[0].tokens.filter(t => t.type == 'emoji') + if (!tokens.length) + return; + + let startPos = { line: lineNumber, ch: match.index }; + let endPos = { line: lineNumber, ch: match.index + match[0].length }; + + // Iterate over conflicting marks and clear them + var marks = codeMirror.findMarks(startPos, endPos); + marks.forEach(function(marker) { + marker.clear(); + }); + codeMirror.markText(startPos, endPos, { className: 'emoji' }); + } + startIndex = line.indexOf(':', Math.max(startIndex + 1, emojiRegex.lastIndex)); + } + } } }); }); diff --git a/client/homebrew/editor/editor.less b/client/homebrew/editor/editor.less index d7950ead3..f8dc249d6 100644 --- a/client/homebrew/editor/editor.less +++ b/client/homebrew/editor/editor.less @@ -43,6 +43,16 @@ font-weight : bold; color : green; } + .emoji:not(.cm-comment) { + margin-left : 2px; + color : #360034; + background : #ffc8ff; + border-radius : 6px; + font-weight : bold; + padding-bottom : 1px; + outline-offset : -2px; + outline : solid 2px #ff96fc; + } .superscript:not(.cm-comment) { font-weight : bold; color : goldenrod; diff --git a/client/homebrew/pages/errorPage/errorPage.jsx b/client/homebrew/pages/errorPage/errorPage.jsx index 33da05017..387a99b02 100644 --- a/client/homebrew/pages/errorPage/errorPage.jsx +++ b/client/homebrew/pages/errorPage/errorPage.jsx @@ -1,41 +1,25 @@ require('./errorPage.less'); -const React = require('react'); -const createClass = require('create-react-class'); -const _ = require('lodash'); -const cx = require('classnames'); - -const UIPage = require('../basePages/uiPage/uiPage.jsx'); - -const Markdown = require('../../../../shared/naturalcrit/markdown.js'); - +const React = require('react'); +const UIPage = require('../basePages/uiPage/uiPage.jsx'); +const Markdown = require('../../../../shared/naturalcrit/markdown.js'); const ErrorIndex = require('./errors/errorIndex.js'); -const ErrorPage = createClass({ - displayName : 'ErrorPage', +const ErrorPage = ({ brew })=>{ + // Retrieving the error text based on the brew's error code from ErrorIndex + const errorText = ErrorIndex({ brew })[brew.HBErrorCode.toString()] || ''; - getDefaultProps : function() { - return { - ver : '0.0.0', - errorId : '', - text : '# Oops \n We could not find a brew with that id. **Sorry!**', - error : {} - }; - }, - - render : function(){ - const errorText = ErrorIndex(this.props)[this.props.brew.HBErrorCode.toString()] || ''; - - return + return ( +
-

{`Error ${this.props.brew.status || '000'}`}

-

{this.props.brew.text || 'No error text'}

+

{`Error ${brew?.status || '000'}`}

+

{brew?.text || 'No error text'}


- ; - } -}); + + ); +}; module.exports = ErrorPage; diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 981ad0126..deb476c2e 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -47,6 +47,19 @@ const SharePage = createClass({ this.props.brew.shareId; }, + renderEditLink : function(){ + if(!this.props.brew.editId) return; + + let editLink = this.props.brew.editId; + if(this.props.brew.googleId && !this.props.brew.stubbed) { + editLink = this.props.brew.googleId + editLink; + } + + return + edit + ; + }, + render : function(){ return
@@ -64,13 +77,14 @@ const SharePage = createClass({ source - + view - + {this.renderEditLink()} + download - + clone to new diff --git a/package-lock.json b/package-lock.json index 5750674c2..79f4e34f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,11 +10,11 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.24.4", + "@babel/core": "^7.24.5", "@babel/plugin-transform-runtime": "^7.24.3", - "@babel/preset-env": "^7.24.4", + "@babel/preset-env": "^7.24.5", "@babel/preset-react": "^7.24.1", - "@googleapis/drive": "^8.7.0", + "@googleapis/drive": "^8.8.0", "body-parser": "^1.20.2", "classnames": "^2.5.1", "codemirror": "^5.65.6", @@ -31,25 +31,26 @@ "less": "^3.13.1", "lodash": "^4.17.21", "marked": "11.2.0", + "marked-emoji": "^1.4.0", "marked-extended-tables": "^1.0.8", "marked-gfm-heading-id": "^3.1.3", "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", - "mongoose": "^8.3.1", + "mongoose": "^8.3.3", "nanoid": "3.3.4", "nconf": "^0.12.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-frame-component": "^4.1.3", - "react-router-dom": "6.22.3", + "react-router-dom": "6.23.0", "sanitize-filename": "1.6.3", - "superagent": "^8.1.2", + "superagent": "^9.0.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" }, "devDependencies": { "eslint": "^8.57.0", - "eslint-plugin-jest": "^28.2.0", + "eslint-plugin-jest": "^28.5.0", "eslint-plugin-react": "^7.34.1", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", @@ -58,7 +59,7 @@ "stylelint-config-recess-order": "^4.6.0", "stylelint-config-recommended": "^13.0.0", "stylelint-stylistic": "^0.4.3", - "supertest": "^6.3.4" + "supertest": "^7.0.0" }, "engines": { "node": "^20.8.x", @@ -107,20 +108,20 @@ } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -141,11 +142,11 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -205,18 +206,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -289,11 +290,11 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -311,15 +312,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -340,9 +341,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "engines": { "node": ">=6.9.0" } @@ -380,11 +381,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -402,28 +403,28 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } @@ -450,13 +451,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -477,9 +478,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -488,12 +489,12 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -878,11 +879,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -923,17 +924,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -959,11 +960,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1258,14 +1259,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dependencies": { "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1305,11 +1306,11 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1321,11 +1322,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1350,13 +1351,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1547,11 +1548,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1620,15 +1621,15 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", "dependencies": { "@babel/compat-data": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", @@ -1655,12 +1656,12 @@ "@babel/plugin-transform-async-generator-functions": "^7.24.3", "@babel/plugin-transform-async-to-generator": "^7.24.1", "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", + "@babel/plugin-transform-block-scoping": "^7.24.5", "@babel/plugin-transform-class-properties": "^7.24.1", "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.5", "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", "@babel/plugin-transform-dotall-regex": "^7.24.1", "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-transform-dynamic-import": "^7.24.1", @@ -1680,13 +1681,13 @@ "@babel/plugin-transform-new-target": "^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", "@babel/plugin-transform-object-super": "^7.24.1", "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.24.5", "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/plugin-transform-property-literals": "^7.24.1", "@babel/plugin-transform-regenerator": "^7.24.1", "@babel/plugin-transform-reserved-words": "^7.24.1", @@ -1694,7 +1695,7 @@ "@babel/plugin-transform-spread": "^7.24.1", "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", "@babel/plugin-transform-unicode-escapes": "^7.24.1", "@babel/plugin-transform-unicode-property-regex": "^7.24.1", "@babel/plugin-transform-unicode-regex": "^7.24.1", @@ -1775,18 +1776,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1795,12 +1796,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1983,9 +1984,9 @@ } }, "node_modules/@googleapis/drive": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-8.7.0.tgz", - "integrity": "sha512-XAi6kfySIU4H3ivX2DpzTDce5UhNke5NxEWCL6tySEdcVqx+cmXJmkMqwfOAHJalEB5s9PPfdLBU29Xd5XlLSQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-8.8.0.tgz", + "integrity": "sha512-EOZ9GZCOUdej9PJVnkai7qu5RPyFLYse8FlpgijzfnZPOACXWFf4XOFuAuMcMw4Zue8xPhAPHu1qYcy8u362Xw==", "dependencies": { "googleapis-common": "^7.0.0" }, @@ -2854,9 +2855,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.0.tgz", + "integrity": "sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==", "engines": { "node": ">=14.0.0" } @@ -5748,12 +5749,12 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "28.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.2.0.tgz", - "integrity": "sha512-yRDti/a+f+SMSmNTiT9/M/MzXGkitl8CfzUxnpoQcTyfq8gUrXMriVcWU36W1X6BZSUoyUCJrDAWWUA2N4hE5g==", + "version": "28.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.5.0.tgz", + "integrity": "sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "^6.0.0" + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0" }, "engines": { "node": "^16.10.0 || ^18.12.0 || >=20.0.0" @@ -6516,14 +6517,13 @@ } }, "node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", "dependencies": { "dezalgo": "^1.0.4", "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" + "once": "^1.4.0" }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" @@ -10145,6 +10145,14 @@ "node": ">= 18" } }, + "node_modules/marked-emoji": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/marked-emoji/-/marked-emoji-1.4.0.tgz", + "integrity": "sha512-/2TJfGzXpiBBq+X3akHHbTrAjZPJDwR+7FV6SyQLECnQEfaoVkrpKZJzHhPTAq3Sl/A1l2frMT0u6b38VBBlNg==", + "peerDependencies": { + "marked": ">=4 <13" + } + }, "node_modules/marked-extended-tables": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/marked-extended-tables/-/marked-extended-tables-1.0.8.tgz", @@ -10547,9 +10555,9 @@ } }, "node_modules/mongoose": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.3.1.tgz", - "integrity": "sha512-D78C+s7QI4+pJQhs3XbOxzrHFEti4x+BDhaH94QrdV1/cmMA7fHc50LgLSXjzA/5q89TBK8DAXyf3VwDZbQJlA==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.3.3.tgz", + "integrity": "sha512-3kSk0db9DM2tLttCdS6WNRqewPleamFEa4Vz/Qldc0dB4Zow/FiZxb9GExHTJjBZQ9T2xiGleQ3GzRrES3hhsA==", "dependencies": { "bson": "^6.5.0", "kareem": "2.6.3", @@ -11937,9 +11945,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -11948,15 +11956,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-frame-component": { @@ -11976,11 +11984,11 @@ "dev": true }, "node_modules/react-router": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", - "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.0.tgz", + "integrity": "sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==", "dependencies": { - "@remix-run/router": "1.15.3" + "@remix-run/router": "1.16.0" }, "engines": { "node": ">=14.0.0" @@ -11990,12 +11998,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", - "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.0.tgz", + "integrity": "sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==", "dependencies": { - "@remix-run/router": "1.15.3", - "react-router": "6.22.3" + "@remix-run/router": "1.16.0", + "react-router": "6.23.0" }, "engines": { "node": ">=14.0.0" @@ -12523,9 +12531,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -13598,34 +13606,22 @@ } }, "node_modules/superagent": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", - "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", "debug": "^4.3.4", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.0", - "formidable": "^2.1.2", + "formidable": "^3.5.1", "methods": "^1.1.2", "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" + "qs": "^6.11.0" }, "engines": { - "node": ">=6.4.0 <13 || >=14" - } - }, - "node_modules/superagent/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "node": ">=14.18.0" } }, "node_modules/superagent/node_modules/mime": { @@ -13639,36 +13635,17 @@ "node": ">=4.0.0" } }, - "node_modules/superagent/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/superagent/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/supertest": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", - "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", + "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^8.1.2" + "superagent": "^9.0.1" }, "engines": { - "node": ">=6.4.0" + "node": ">=14.18.0" } }, "node_modules/supports-color": { diff --git a/package.json b/package.json index 490e32601..ced448158 100644 --- a/package.json +++ b/package.json @@ -27,11 +27,12 @@ "test:dev": "jest --verbose --watch", "test:basic": "jest tests/markdown/basic.test.js --verbose", "test:variables": "jest tests/markdown/variables.test.js --verbose", - "test:mustache-syntax": "jest '.*(mustache-syntax).*' --verbose --noStackTrace", - "test:mustache-syntax:inline": "jest '.*(mustache-syntax).*' -t '^Inline:.*' --verbose --noStackTrace", - "test:mustache-syntax:block": "jest '.*(mustache-syntax).*' -t '^Block:.*' --verbose --noStackTrace", - "test:mustache-syntax:injection": "jest '.*(mustache-syntax).*' -t '^Injection:.*' --verbose --noStackTrace", - "test:definition-lists": "jest tests/markdown/definition-lists.test.js --verbose --noStackTrace", + "test:mustache-syntax": "jest \".*(mustache-syntax).*\" --verbose --noStackTrace", + "test:mustache-syntax:inline": "jest \".*(mustache-syntax).*\" -t '^Inline:.*' --verbose --noStackTrace", + "test:mustache-syntax:block": "jest \".*(mustache-syntax).*\" -t '^Block:.*' --verbose --noStackTrace", + "test:mustache-syntax:injection": "jest \".*(mustache-syntax).*\" -t '^Injection:.*' --verbose --noStackTrace", + "test:definition-lists": "jest tests/markdown/definition-lists.test.js --verbose --noStackTrace", + "test:emojis": "jest tests/markdown/emojis.test.js --verbose --noStackTrace", "test:route": "jest tests/routes/static-pages.test.js --verbose", "phb": "node scripts/phb.js", "prod": "set NODE_ENV=production && npm run build", @@ -81,11 +82,11 @@ ] }, "dependencies": { - "@babel/core": "^7.24.4", + "@babel/core": "^7.24.5", "@babel/plugin-transform-runtime": "^7.24.3", - "@babel/preset-env": "^7.24.4", + "@babel/preset-env": "^7.24.5", "@babel/preset-react": "^7.24.1", - "@googleapis/drive": "^8.7.0", + "@googleapis/drive": "^8.8.0", "body-parser": "^1.20.2", "classnames": "^2.5.1", "codemirror": "^5.65.6", @@ -102,25 +103,26 @@ "less": "^3.13.1", "lodash": "^4.17.21", "marked": "11.2.0", + "marked-emoji": "^1.4.0", "marked-extended-tables": "^1.0.8", "marked-gfm-heading-id": "^3.1.3", "marked-smartypants-lite": "^1.0.2", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", - "mongoose": "^8.3.1", + "mongoose": "^8.3.3", "nanoid": "3.3.4", "nconf": "^0.12.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-frame-component": "^4.1.3", - "react-router-dom": "6.22.3", + "react-router-dom": "6.23.0", "sanitize-filename": "1.6.3", - "superagent": "^8.1.2", + "superagent": "^9.0.2", "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" }, "devDependencies": { "eslint": "^8.57.0", - "eslint-plugin-jest": "^28.2.0", + "eslint-plugin-jest": "^28.5.0", "eslint-plugin-react": "^7.34.1", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", @@ -129,6 +131,6 @@ "stylelint-config-recess-order": "^4.6.0", "stylelint-config-recommended": "^13.0.0", "stylelint-stylistic": "^0.4.3", - "supertest": "^6.3.4" + "supertest": "^7.0.0" } } diff --git a/scripts/project.json b/scripts/project.json index 4c769660f..c384ae1de 100644 --- a/scripts/project.json +++ b/scripts/project.json @@ -25,6 +25,7 @@ "codemirror/addon/edit/closetag.js", "codemirror/addon/edit/trailingspace.js", "codemirror/addon/selection/active-line.js", + "codemirror/addon/hint/show-hint.js", "moment", "superagent" ] diff --git a/server/app.js b/server/app.js index c8fec4bc4..e04df77a6 100644 --- a/server/app.js +++ b/server/app.js @@ -23,9 +23,9 @@ const { splitTextStyleAndMetadata } = require('../shared/helpers.js'); const sanitizeBrew = (brew, accessType)=>{ brew._id = undefined; brew.__v = undefined; - if(accessType !== 'edit'){ + if(accessType !== 'edit' && accessType !== 'shareAuthor') { brew.editId = undefined; - } + } return brew; }; @@ -307,7 +307,6 @@ app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{ //Share Page app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, res, next)=>{ const { brew } = req; - req.ogMeta = { ...defaultMetaTags, title : req.brew.title || 'Untitled Brew', description : req.brew.description || 'No description.', @@ -326,7 +325,8 @@ app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, r await HomebrewModel.increaseView({ shareId: brew.shareId }); } }; - sanitizeBrew(req.brew, 'share'); + + brew.authors.includes(req.account?.username) ? sanitizeBrew(req.brew, 'shareAuthor') : sanitizeBrew(req.brew, 'share'); splitTextStyleAndMetadata(req.brew); return next(); })); diff --git a/shared/naturalcrit/codeEditor/autocompleteEmoji.js b/shared/naturalcrit/codeEditor/autocompleteEmoji.js new file mode 100644 index 000000000..73e08de57 --- /dev/null +++ b/shared/naturalcrit/codeEditor/autocompleteEmoji.js @@ -0,0 +1,82 @@ +const diceFont = require('../../../themes/fonts/iconFonts/diceFont.js'); +const elderberryInn = require('../../../themes/fonts/iconFonts/elderberryInn.js'); +const fontAwesome = require('../../../themes/fonts/iconFonts/fontAwesome.js'); + +const emojis = { + ...diceFont, + ...elderberryInn, + ...fontAwesome +}; + +const showAutocompleteEmoji = function(CodeMirror, editor) { + CodeMirror.commands.autocomplete = function(editor) { + editor.showHint({ + completeSingle : false, + hint : function(editor) { + const cursor = editor.getCursor(); + const line = cursor.line; + const lineContent = editor.getLine(line); + const start = lineContent.lastIndexOf(':', cursor.ch - 1) + 1; + const end = cursor.ch; + const currentWord = lineContent.slice(start, end); + + + const list = Object.keys(emojis).filter(function(emoji) { + return emoji.toLowerCase().indexOf(currentWord.toLowerCase()) >= 0; + }).sort((a, b)=>{ + const lowerA = a.replace(/\d+/g, function(match) { // Temporarily convert any numbers in emoji string + return match.padStart(4, '0'); // to 4-digits, left-padded with 0's, to aid in + }).toLowerCase(); // sorting numbers, i.e., "d6, d10, d20", not "d10, d20, d6" + const lowerB = b.replace(/\d+/g, function(match) { // Also make lowercase for case-insensitive alpha sorting + return match.padStart(4, '0'); + }).toLowerCase(); + + if(lowerA < lowerB) + return -1; + return 1; + }).map(function(emoji) { + return { + text : `${emoji}:`, // Text to output to editor when option is selected + render : function(element, self, data) { // How to display the option in the dropdown + const div = document.createElement('div'); + div.innerHTML = ` ${emoji}`; + element.appendChild(div); + } + }; + }); + + return { + list : list.length ? list : [], + from : CodeMirror.Pos(line, start), + to : CodeMirror.Pos(line, end) + }; + } + }); + }; + + editor.on('inputRead', function(instance, change) { + const cursor = editor.getCursor(); + const line = editor.getLine(cursor.line); + + // Get the text from the start of the line to the cursor + const textToCursor = line.slice(0, cursor.ch); + + // Do not autosuggest emojis in curly span/div/injector properties + if(line.includes('{')) { + const curlyToCursor = textToCursor.slice(textToCursor.indexOf(`{`)); + const curlySpanRegex = /{(?=((?:[:=](?:"[\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"':={}\s]*)*))\1$/g; + + if(curlySpanRegex.test(curlyToCursor)) + return; + } + + // Check if the text ends with ':xyz' + if(/:[^\s:]+$/.test(textToCursor)) { + CodeMirror.commands.autocomplete(editor); + } + }); +}; + +module.exports = { + showAutocompleteEmoji +}; \ No newline at end of file diff --git a/shared/naturalcrit/codeEditor/codeEditor.jsx b/shared/naturalcrit/codeEditor/codeEditor.jsx index a5232a42b..b034d1ca9 100644 --- a/shared/naturalcrit/codeEditor/codeEditor.jsx +++ b/shared/naturalcrit/codeEditor/codeEditor.jsx @@ -5,6 +5,7 @@ const createClass = require('create-react-class'); const _ = require('lodash'); const cx = require('classnames'); const closeTag = require('./close-tag'); +const autoCompleteEmoji = require('./autocompleteEmoji'); let CodeMirror; if(typeof window !== 'undefined'){ @@ -36,6 +37,8 @@ if(typeof window !== 'undefined'){ //XML code folding is a requirement of the auto-closing tag feature and is not enabled require('codemirror/addon/fold/xml-fold.js'); require('codemirror/addon/edit/closetag.js'); + //Autocompletion + require('codemirror/addon/hint/show-hint.js'); const foldCode = require('./fold-code'); foldCode.registerHomebreweryHelper(CodeMirror); @@ -177,7 +180,10 @@ const CodeEditor = createClass({ // return el; // } }); + + // Add custom behaviors (auto-close curlies and auto-complete emojis) closeTag.autoCloseCurlyBraces(CodeMirror, this.codeMirror); + autoCompleteEmoji.showAutocompleteEmoji(CodeMirror, this.codeMirror); // Note: codeMirror passes a copy of itself in this callback. cm === this.codeMirror. Either one works. this.codeMirror.on('change', (cm)=>{this.props.onChange(cm.getValue());}); @@ -436,7 +442,7 @@ const CodeEditor = createClass({ render : function(){ return <> - +
; } diff --git a/shared/naturalcrit/codeEditor/codeEditor.less b/shared/naturalcrit/codeEditor/codeEditor.less index 2ab08a5af..349166248 100644 --- a/shared/naturalcrit/codeEditor/codeEditor.less +++ b/shared/naturalcrit/codeEditor/codeEditor.less @@ -2,6 +2,11 @@ @import (less) 'codemirror/addon/fold/foldgutter.css'; @import (less) 'codemirror/addon/search/matchesonscrollbar.css'; @import (less) 'codemirror/addon/dialog/dialog.css'; +@import (less) 'codemirror/addon/hint/show-hint.css'; + +//Icon fonts included so they can appear in emoji autosuggest dropdown +@import (less) './themes/fonts/iconFonts/diceFont.less'; +@import (less) './themes/fonts/iconFonts/elderberryInn.less'; @keyframes sourceMoveAnimation { 50% {background-color: red; color: white;} @@ -34,6 +39,7 @@ } } + //.cm-tab { // background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAQAAACOs/baAAAARUlEQVR4nGJgIAG8JkXxUAcCtDWemcGR1lY4MvgzCEKY7jSBjgxBDAG09UEQzAe0AMwMHrSOAwEGRtpaMIwAAAAA//8DAG4ID9EKs6YqAAAAAElFTkSuQmCC) no-repeat right; //} @@ -44,3 +50,8 @@ // } //} } + +.emojiPreview { + font-size: 1.5em; + line-height: 1.2em; +} \ No newline at end of file diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index f72955bf3..05518b695 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -4,6 +4,13 @@ const Marked = require('marked'); const MarkedExtendedTables = require('marked-extended-tables'); const { markedSmartypantsLite: MarkedSmartypantsLite } = require('marked-smartypants-lite'); const { gfmHeadingId: MarkedGFMHeadingId } = require('marked-gfm-heading-id'); +const { markedEmoji: MarkedEmojis } = require('marked-emoji'); + +//Icon fonts included so they can appear in emoji autosuggest dropdown +const diceFont = require('../../themes/fonts/iconFonts/diceFont.js'); +const elderberryInn = require('../../themes/fonts/iconFonts/elderberryInn.js'); +const fontAwesome = require('../../themes/fonts/iconFonts/fontAwesome.js'); + const MathParser = require('expr-eval').Parser; const renderer = new Marked.Renderer(); const tokenizer = new Marked.Tokenizer(); @@ -50,7 +57,7 @@ renderer.html = function (html) { return html; }; -// Don't wrap {{ Divs or {{ empty Spans in

tags +// Don't wrap {{ Spans alone on a line, or {{ Divs in

tags renderer.paragraph = function(text){ let match; if(text.startsWith('`${key}="${value}"`).join(' ')}` : ''}` + + `>${this.parser.parseInline(token.tokens)}`; // parseInline to turn child tokens into HTML } }; @@ -149,13 +163,13 @@ const mustacheDivs = { if(match) { //Find closing delimiter let blockCount = 0; - let tags = ''; + let tags = {}; let endTags = 0; let endToken = 0; let delim; while (delim = blockRegex.exec(match[0])?.[0].trim()) { - if(!tags) { - tags = `${processStyleTags(delim.substring(2))}`; + if(_.isEmpty(tags)) { + tags = processStyleTags(delim.substring(2)); endTags = delim.length + src.indexOf(delim); } if(delim.startsWith('{{')) { @@ -183,7 +197,14 @@ const mustacheDivs = { } }, renderer(token) { - return `

`${key}="${value}"`).join(' ')}` : ''}` + + `>${this.parser.parse(token.tokens)}
`; // parse to turn child tokens into HTML } }; @@ -199,23 +220,39 @@ const mustacheInjectInline = { if(!lastToken || lastToken.type == 'mustacheInjectInline') return false; - const tags = `${processStyleTags(match[1])}`; + const tags = processStyleTags(match[1]); lastToken.originalType = lastToken.type; lastToken.type = 'mustacheInjectInline'; - lastToken.tags = tags; + lastToken.injectedTags = tags; return { - type : 'text', // Should match "name" above + type : 'mustacheInjectInline', // Should match "name" above raw : match[0], // Text to consume from the source text : '' }; } }, renderer(token) { + if(!token.originalType){ + return; + } token.type = token.originalType; const text = this.parser.parseInline([token]); - const openingTag = /(<[^\s<>]+)([^\n<>]*>.*)/s.exec(text); + const originalTags = extractHTMLStyleTags(text); + const injectedTags = token.injectedTags; + const tags = { + id : injectedTags.id || originalTags.id || null, + classes : [originalTags.classes, injectedTags.classes].join(' ').trim() || null, + styles : [originalTags.styles, injectedTags.styles].join(' ').trim() || null, + attributes : Object.assign(originalTags.attributes ?? {}, injectedTags.attributes ?? {}) + }; + const openingTag = /(<[^\s<>]+)[^\n<>]*(>.*)/s.exec(text); if(openingTag) { - return `${openingTag[1]} class="${token.tags}${openingTag[2]}`; + return `${openingTag[1]}` + + `${tags.classes ? ` class="${tags.classes}"` : ''}` + + `${tags.id ? ` id="${tags.id}"` : ''}` + + `${tags.styles ? ` style="${tags.styles}"` : ''}` + + `${!_.isEmpty(tags.attributes) ? ` ${Object.entries(tags.attributes).map(([key, value])=>`${key}="${value}"`).join(' ')}` : ''}` + + `${openingTag[2]}`; // parse to turn child tokens into HTML } return text; } @@ -235,7 +272,7 @@ const mustacheInjectBlock = { return false; lastToken.originalType = 'mustacheInjectBlock'; - lastToken.tags = `${processStyleTags(match[1])}`; + lastToken.injectedTags = processStyleTags(match[1]); return { type : 'mustacheInjectBlock', // Should match "name" above raw : match[0], // Text to consume from the source @@ -249,9 +286,22 @@ const mustacheInjectBlock = { } token.type = token.originalType; const text = this.parser.parse([token]); - const openingTag = /(<[^\s<>]+)([^\n<>]*>.*)/s.exec(text); + const originalTags = extractHTMLStyleTags(text); + const injectedTags = token.injectedTags; + const tags = { + id : injectedTags.id || originalTags.id || null, + classes : [originalTags.classes, injectedTags.classes].join(' ').trim() || null, + styles : [originalTags.styles, injectedTags.styles].join(' ').trim() || null, + attributes : Object.assign(originalTags.attributes ?? {}, injectedTags.attributes ?? {}) + }; + const openingTag = /(<[^\s<>]+)[^\n<>]*(>.*)/s.exec(text); if(openingTag) { - return `${openingTag[1]} class="${token.tags}${openingTag[2]}`; + return `${openingTag[1]}` + + `${tags.classes ? ` class="${tags.classes}"` : ''}` + + `${tags.id ? ` id="${tags.id}"` : ''}` + + `${tags.styles ? ` style="${tags.styles}"` : ''}` + + `${!_.isEmpty(tags.attributes) ? ` ${Object.entries(tags.attributes).map(([key, value])=>`${key}="${value}"`).join(' ')}` : ''}` + + `${openingTag[2]}`; // parse to turn child tokens into HTML } return text; } @@ -304,10 +354,19 @@ const definitionListsSingleLine = { let endIndex = 0; const definitions = []; while (match = regex.exec(src)) { - definitions.push({ - dt : this.lexer.inlineTokens(match[1].trim()), - dd : this.lexer.inlineTokens(match[2].trim()) - }); + const originalLine = match[0]; // This line and below to handle conflict with emojis + let firstLine = originalLine; // Remove in V4 when definitionListsInline updated to + this.lexer.inlineTokens(firstLine.trim()) // require spaces around `::` + .filter((t)=>t.type == 'emoji') + .map((emoji)=>firstLine = firstLine.replace(emoji.raw, 'x'.repeat(emoji.raw.length))); + + const newMatch = /^([^\n]*?)::([^\n]*)(?:\n|$)/ym.exec(firstLine); + if(newMatch) { + definitions.push({ + dt : this.lexer.inlineTokens(originalLine.slice(0, newMatch[1].length).trim()), + dd : this.lexer.inlineTokens(originalLine.slice(newMatch[1].length + 2).trim()) + }); + } // End of emoji hack. endIndex = regex.lastIndex; } if(definitions.length) { @@ -616,11 +675,29 @@ function MarkedVariables() { }; //^=====--------------------< Variable Handling >-------------------=====^// +// Emoji options +// To add more icon fonts, need to do these things +// 1) Add the font file as .woff2 to themes/fonts/iconFonts folder +// 2) Create a .less file mapping CSS class names to the font character +// 3) Create a .js file mapping Autosuggest names to CSS class names +// 4) Import the .less file into shared/naturalcrit/codeEditor/codeEditor.less +// 5) Import the .less file into themes/V3/blank.style.less +// 6) Import the .js file to shared/naturalcrit/codeEditor/autocompleteEmoji.js and add to `emojis` object +// 7) Import the .js file here to markdown.js, and add to `emojis` object below +const MarkedEmojiOptions = { + emojis : { + ...diceFont, + ...elderberryInn, + ...fontAwesome + }, + renderer : (token)=>`` +}; + Marked.use(MarkedVariables()); Marked.use({ extensions: [definitionListsMultiLine, definitionListsSingleLine, superSubScripts, mustacheSpans, mustacheDivs, mustacheInjectInline] }); Marked.use(mustacheInjectBlock); Marked.use({ renderer: renderer, tokenizer: tokenizer, mangle: false }); -Marked.use(MarkedExtendedTables(), MarkedGFMHeadingId(), MarkedSmartypantsLite()); +Marked.use(MarkedExtendedTables(), MarkedGFMHeadingId(), MarkedSmartypantsLite(), MarkedEmojis(MarkedEmojiOptions)); const nonWordAndColonTest = /[^\w:]/g; const cleanUrl = function (sanitize, base, href) { @@ -687,15 +764,45 @@ const processStyleTags = (string)=>{ //TODO: can we simplify to just split on commas? const tags = string.match(/(?:[^, ":=]+|[:=](?:"[^"]*"|))+/g); - const id = _.remove(tags, (tag)=>tag.startsWith('#')).map((tag)=>tag.slice(1))[0]; - const classes = _.remove(tags, (tag)=>(!tag.includes(':')) && (!tag.includes('='))); - const attributes = _.remove(tags, (tag)=>(tag.includes('='))).map((tag)=>tag.replace(/="?([^"]*)"?/g, '="$1"')); - const styles = tags?.length ? tags.map((tag)=>tag.replace(/:"?([^"]*)"?/g, ':$1;').trim()) : []; + const id = _.remove(tags, (tag)=>tag.startsWith('#')).map((tag)=>tag.slice(1))[0] || null; + const classes = _.remove(tags, (tag)=>(!tag.includes(':')) && (!tag.includes('='))).join(' ') || null; + const attributes = _.remove(tags, (tag)=>(tag.includes('='))).map((tag)=>tag.replace(/="?([^"]*)"?/g, '="$1"')) + ?.filter((attr)=>!attr.startsWith('class="') && !attr.startsWith('style="') && !attr.startsWith('id="')) + .reduce((obj, attr)=>{ + let [key, value] = attr.split('='); + value = value.replace(/"/g, ''); + obj[key] = value; + return obj; + }, {}) || null; + const styles = tags?.length ? tags.map((tag)=>tag.replace(/:"?([^"]*)"?/g, ':$1;').trim()).join(' ') : null; - return `${classes?.length ? ` ${classes.join(' ')}` : ''}"` + - `${id ? ` id="${id}"` : ''}` + - `${styles?.length ? ` style="${styles.join(' ')}"` : ''}` + - `${attributes?.length ? ` ${attributes.join(' ')}` : ''}`; + return { + id : id, + classes : classes, + styles : styles, + attributes : _.isEmpty(attributes) ? null : attributes + }; +}; + +const extractHTMLStyleTags = (htmlString)=>{ + const id = htmlString.match(/id="([^"]*)"/)?.[1] || null; + const classes = htmlString.match(/class="([^"]*)"/)?.[1] || null; + const styles = htmlString.match(/style="([^"]*)"/)?.[1] || null; + const attributes = htmlString.match(/[a-zA-Z]+="[^"]*"/g) + ?.filter((attr)=>!attr.startsWith('class="') && !attr.startsWith('style="') && !attr.startsWith('id="')) + .reduce((obj, attr)=>{ + let [key, value] = attr.split('='); + value = value.replace(/"/g, ''); + obj[key] = value; + return obj; + }, {}) || null; + + return { + id : id, + classes : classes, + styles : styles, + attributes : _.isEmpty(attributes) ? null : attributes + }; }; const globalVarsList = {}; diff --git a/tests/markdown/emojis.test.js b/tests/markdown/emojis.test.js new file mode 100644 index 000000000..a4abbc6a4 --- /dev/null +++ b/tests/markdown/emojis.test.js @@ -0,0 +1,58 @@ +const Markdown = require('naturalcrit/markdown.js'); +const dedent = require('dedent-tabs').default; + +// Marked.js adds line returns after closing tags on some default tokens. +// This removes those line returns for comparison sake. +String.prototype.trimReturns = function(){ + return this.replace(/\r?\n|\r/g, ''); +}; + +const emoji = 'df_d12_2'; + +describe(`When emojis/icons are active`, ()=>{ + it('when a word is between two colons (:word:), and a matching emoji exists, it is rendered as an emoji', function() { + const source = `:${emoji}:`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

`); + }); + + it('when a word is between two colons (:word:), and no matching emoji exists, it is not parsed', function() { + const source = `:invalid:`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

:invalid:

`); + }); + + it('two valid emojis with no whitespace are prioritized over definition lists', function() { + const source = `:${emoji}::${emoji}:`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

`); + }); + + it('definition lists that are not also part of an emoji can coexist with normal emojis', function() { + const source = `definition :: term ${emoji}::${emoji}:`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`
definition
term df_d12_2:
`); + }); + + it('A valid emoji is compatible with curly injectors', function() { + const source = `:${emoji}:{color:blue,myClass}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

`); + }); + + it('Emojis are not parsed inside of curly span CSS blocks', function() { + const source = `{{color:${emoji} text}}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`text`); + }); + + it('Emojis are not parsed inside of curly div CSS blocks', function() { + const source = dedent`{{color:${emoji} + text + }}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

text

`); + }); + + // another test of the editor to confirm an autocomplete menu opens +}); \ No newline at end of file diff --git a/tests/markdown/mustache-syntax.test.js b/tests/markdown/mustache-syntax.test.js index 835bcc575..b32876353 100644 --- a/tests/markdown/mustache-syntax.test.js +++ b/tests/markdown/mustache-syntax.test.js @@ -130,8 +130,8 @@ describe('Inline: When using the Inline syntax {{ }}', ()=>{ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{ it('Renders a div with text only', function() { const source = dedent`{{ - text - }}`; + text + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

text

`); }); @@ -139,14 +139,14 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{ it('Renders an empty div', function() { const source = dedent`{{ - }}`; + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`
`); }); it('Renders a single paragraph with opening and closing brackets', function() { const source = dedent`{{ - }}`; + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

{{}}

`); }); @@ -154,79 +154,79 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{ it('Renders a div with a single class', function() { const source = dedent`{{cat - }}`; + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`
`); }); it('Renders a div with a single class and text', function() { const source = dedent`{{cat - Sample text. - }}`; + Sample text. + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Sample text.

`); }); it('Renders a div with two classes and text', function() { const source = dedent`{{cat,dog - Sample text. - }}`; + Sample text. + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Sample text.

`); }); it('Renders a div with a style and text', function() { const source = dedent`{{color:red - Sample text. - }}`; + Sample text. + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Sample text.

`); }); it('Renders a div with a style that has a string variable, and text', function() { const source = dedent`{{--stringVariable:"'string'" - Sample text. - }}`; + Sample text. + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Sample text.

`); }); it('Renders a div with a style that has a string variable, and text', function() { const source = dedent`{{--stringVariable:"'string'" - Sample text. - }}`; + Sample text. + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Sample text.

`); }); it('Renders a div with a class, style and text', function() { const source = dedent`{{cat,color:red - Sample text. - }}`; + Sample text. + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Sample text.

`); }); it('Renders a div with an ID, class, style and text (different order)', function() { const source = dedent`{{color:red,cat,#dog - Sample text. - }}`; + Sample text. + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Sample text.

`); }); it('Renders a div with a single ID', function() { const source = dedent`{{#cat,#dog - Sample text. - }}`; + Sample text. + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Sample text.

`); }); it('Renders a div with an ID, class, style and text, and a variable assignment', function() { const source = dedent`{{color:red,cat,#dog,a="b and c",d="e" - Sample text. - }}`; + Sample text. + }}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Sample text.

`); }); @@ -243,61 +243,91 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{ describe('Injection: When an injection tag follows an element', ()=>{ // FIXME: Most of these fail because injections currently replace attributes, rather than append to. Or just minor extra whitespace issues. describe('and that element is an inline-block', ()=>{ - it.failing('Renders a span "text" with no injection', function() { + it('Renders a span "text" with no injection', function() { const source = '{{ text}}{}'; const rendered = Markdown.render(source); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); }); - it.failing('Renders a span "text" with injected Class name', function() { + it('Renders a span "text" with injected Class name', function() { const source = '{{ text}}{ClassName}'; const rendered = Markdown.render(source); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); }); - it.failing('Renders a span "text" with injected attribute', function() { + it('Renders a span "text" with injected attribute', function() { const source = '{{ text}}{a="b and c"}'; const rendered = Markdown.render(source); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); }); - it.failing('Renders a span "text" with injected style', function() { + it('Renders a span "text" with injected style', function() { const source = '{{ text}}{color:red}'; const rendered = Markdown.render(source); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); }); - it.failing('Renders a span "text" with injected style using a string variable', function() { + it('Renders a span "text" with injected style using a string variable', function() { const source = `{{ text}}{--stringVariable:"'string'"}`; const rendered = Markdown.render(source); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`text`); }); - it.failing('Renders a span "text" with two injected styles', function() { + it('Renders a span "text" with two injected styles', function() { const source = '{{ text}}{color:red,background:blue}'; const rendered = Markdown.render(source); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); }); - it.failing('Renders an emphasis element with injected Class name', function() { + it('Renders a span "text" with its own ID, overwritten with an injected ID', function() { + const source = '{{#oldId text}}{#newId}'; + const rendered = Markdown.render(source); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); + }); + + it('Renders a span "text" with its own attributes, overwritten with an injected attribute, plus a new one', function() { + const source = '{{attrA="old",attrB="old" text}}{attrA="new",attrC="new"}'; + const rendered = Markdown.render(source); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); + }); + + it('Renders a span "text" with its own attributes, overwritten with an injected attribute, ignoring "class", "style", and "id"', function() { + const source = '{{attrA="old",attrB="old" text}}{attrA="new",attrC="new",class="new",style="new",id="new"}'; + const rendered = Markdown.render(source); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); + }); + + it('Renders a span "text" with its own styles, appended with injected styles', function() { + const source = '{{color:blue,height:10px text}}{width:10px,color:red}'; + const rendered = Markdown.render(source); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); + }); + + it('Renders a span "text" with its own classes, appended with injected classes', function() { + const source = '{{classA,classB text}}{classA,classC}'; + const rendered = Markdown.render(source); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('text'); + }); + + it('Renders an emphasis element with injected Class name', function() { const source = '*emphasis*{big}'; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

emphasis

'); }); - it.failing('Renders a code element with injected style', function() { + it('Renders a code element with injected style', function() { const source = '`code`{background:gray}'; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

code

'); }); - it.failing('Renders an image element with injected style', function() { + it('Renders an image element with injected style', function() { const source = '![alt text](http://i.imgur.com/hMna6G0.png){position:absolute}'; const rendered = Markdown.render(source).trimReturns(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

homebrew mug

'); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

alt text

'); }); - it.failing('Renders an element modified by only the first of two consecutive injections', function() { + it('Renders an element modified by only the first of two consecutive injections', function() { const source = '{{ text}}{color:red}{background:blue}'; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text{background:blue}

'); @@ -306,61 +336,106 @@ describe('Injection: When an injection tag follows an element', ()=>{ it('Renders an image with added attributes', function() { const source = `![homebrew mug](https://i.imgur.com/hMna6G0.png) {position:absolute,bottom:20px,left:130px,width:220px,a="b and c",d=e}`; const rendered = Markdown.render(source).trimReturns(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

homebrew mug

`); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

homebrew mug

`); }); }); describe('and that element is a block', ()=>{ - it.failing('renders a div "text" with no injection', function() { + it('renders a div "text" with no injection', function() { const source = '{{\ntext\n}}\n{}'; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text

'); }); - it.failing('renders a div "text" with injected Class name', function() { + it('renders a div "text" with injected Class name', function() { const source = '{{\ntext\n}}\n{ClassName}'; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text

'); }); - it.failing('renders a div "text" with injected style', function() { + it('renders a div "text" with injected style', function() { const source = '{{\ntext\n}}\n{color:red}'; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text

'); }); - it.failing('renders a div "text" with two injected styles', function() { + it('renders a div "text" with two injected styles', function() { const source = dedent`{{ - text - }} - {color:red,background:blue}`; + text + }} + {color:red,background:blue}`; const rendered = Markdown.render(source).trimReturns(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

text

`); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

text

`); }); - it.failing('renders a div "text" with injected variable string', function() { + it('renders a div "text" with injected variable string', function() { const source = dedent`{{ - text - }} - {--stringVariable:"'string'"}`; + text + }} + {--stringVariable:"'string'"}`; const rendered = Markdown.render(source).trimReturns(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

text

`); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

text

`); }); - it.failing('renders an h2 header "text" with injected class name', function() { + it('Renders a span "text" with its own ID, overwritten with an injected ID', function() { + const source = dedent`{{#oldId + text + }} + {#newId}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text

'); + }); + + it('Renders a span "text" with its own attributes, overwritten with an injected attribute, plus a new one', function() { + const source = dedent`{{attrA="old",attrB="old" + text + }} + {attrA="new",attrC="new"}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text

'); + }); + + it('Renders a span "text" with its own attributes, overwritten with an injected attribute, ignoring "class", "style", and "id"', function() { + const source = dedent`{{attrA="old",attrB="old" + text + }} + {attrA="new",attrC="new",class="new",style="new",id="new"}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text

'); + }); + + it('Renders a span "text" with its own styles, appended with injected styles', function() { + const source = dedent`{{color:blue,height:10px + text + }} + {width:10px,color:red}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text

'); + }); + + it('Renders a span "text" with its own classes, appended with injected classes', function() { + const source = dedent`{{classA,classB + text + }} + {classA,classC}`; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text

'); + }); + + it('renders an h2 header "text" with injected class name', function() { const source = dedent`## text - {ClassName}`; + {ClassName}`; const rendered = Markdown.render(source).trimReturns(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text

'); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

text

'); }); - it.failing('renders a table with injected class name', function() { + it('renders a table with injected class name', function() { const source = dedent`| Experience Points | Level | - |:------------------|:-----:| - | 0 | 1 | - | 300 | 2 | + |:------------------|:-----:| + | 0 | 1 | + | 300 | 2 | - {ClassName}`; + {ClassName}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`
Experience PointsLevel
01
3002
`); }); @@ -376,23 +451,23 @@ describe('Injection: When an injection tag follows an element', ()=>{ // expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`...`); // FIXME: expect this to be injected into
    ? Currently injects into last
  • // }); - it.failing('renders an h2 header "text" with injected class name, and "secondInjection" as regular text on the next line.', function() { + it('renders an h2 header "text" with injected class name, and "secondInjection" as regular text on the next line.', function() { const source = dedent`## text {ClassName} {secondInjection}`; const rendered = Markdown.render(source).trimReturns(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

    text

    {secondInjection}

    '); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

    text

    {secondInjection}

    '); }); - it.failing('renders a div nested into another div, the inner with class=innerDiv and the other class=outerDiv', function() { + it('renders a div nested into another div, the inner with class=innerDiv and the other class=outerDiv', function() { const source = dedent`{{ - outer text - {{ - inner text - }} - {innerDiv} - }} - {outerDiv}`; + outer text + {{ + inner text + }} + {innerDiv} + }} + {outerDiv}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('

    outer text

    inner text

    '); }); diff --git a/tests/markdown/variables.test.js b/tests/markdown/variables.test.js index c909dafec..e6018e19f 100644 --- a/tests/markdown/variables.test.js +++ b/tests/markdown/variables.test.js @@ -329,7 +329,7 @@ describe('Normal Links and Images', ()=>{ const source = `![alt text](url){width:100px}`; const rendered = Markdown.render(source).trimReturns(); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(dedent` -

    alt text

    `.trimReturns()); +

    alt text

    `.trimReturns()); }); it('Renders normal links', function() { diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 25b784cfc..f000fec15 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -1,6 +1,4 @@ @import (less) './themes/assets/assets.less'; -@import (less) './themes/fonts/icon fonts/font-icons.less'; -@import (less) './themes/fonts/icon fonts/diceFont.less'; :root { //Colors @@ -543,10 +541,8 @@ color : white; text-shadow : unset; text-transform : uppercase; - filter : drop-shadow(0 0 1.5px black) drop-shadow(0 0 0 black) - drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) - drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) - drop-shadow(0 0 0 black) drop-shadow(0 0 0 black); + -webkit-text-stroke: 0.2cm black; + paint-order:stroke; } h2 { font-family : 'NodestoCapsCondensed'; @@ -554,10 +550,8 @@ font-weight : normal; color : white; letter-spacing : 0.1cm; - filter : drop-shadow(0 0 1px black) drop-shadow(0 0 0 black) - drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) - drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) - drop-shadow(0 0 0 black) drop-shadow(0 0 0 black); + -webkit-text-stroke: 0.14cm black; + paint-order:stroke; } hr { position : relative; @@ -603,10 +597,8 @@ font-size : 0.496cm; color : white; text-align : center; - filter : drop-shadow(0 0 0.7px black) drop-shadow(0 0 0 black) - drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) - drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) - drop-shadow(0 0 0 black) drop-shadow(0 0 0 black); + -webkit-text-stroke: 0.1cm black; + paint-order:stroke; } .logo { position : absolute; diff --git a/themes/V3/Blank/style.less b/themes/V3/Blank/style.less index ec8905630..31af3769b 100644 --- a/themes/V3/Blank/style.less +++ b/themes/V3/Blank/style.less @@ -1,6 +1,7 @@ @import (less) './themes/fonts/5e/fonts.less'; @import (less) './themes/assets/assets.less'; -@import (less) './themes/fonts/icon fonts/diceFont.less'; +@import (less) './themes/fonts/iconFonts/elderberryInn.less'; +@import (less) './themes/fonts/iconFonts/diceFont.less'; :root { //Colors diff --git a/themes/fonts/icon fonts/font-icons.less b/themes/fonts/icon fonts/font-icons.less deleted file mode 100644 index be8efa734..000000000 --- a/themes/fonts/icon fonts/font-icons.less +++ /dev/null @@ -1,224 +0,0 @@ -/* Icon Font: Elderberry Inn */ -@font-face { - font-family : 'Elderberry-Inn'; - font-style : normal; - font-weight : normal; - src : url('../../../fonts/icon fonts/Elderberry-Inn-Icons.woff2'); -} - -.page { - span.ei { - display : inline-block; - margin-right : 3px; - font-family : 'Elderberry-Inn'; - line-height : 1; - vertical-align : baseline; - -moz-osx-font-smoothing : grayscale; - -webkit-font-smoothing : antialiased; - text-rendering : auto; - - &.book::before { content : '\E900'; } - &.screen::before { content : '\E901'; } - - /* Spell levels */ - &.spell-0::before { content : '\E902'; } - &.spell-1::before { content : '\E903'; } - &.spell-2::before { content : '\E904'; } - &.spell-3::before { content : '\E905'; } - &.spell-4::before { content : '\E906'; } - &.spell-5::before { content : '\E907'; } - &.spell-6::before { content : '\E908'; } - &.spell-7::before { content : '\E909'; } - &.spell-8::before { content : '\E90A'; } - &.spell-9::before { content : '\E90B'; } - - /* Damage types */ - &.acid::before { content : '\E90C'; } - &.bludgeoning::before { content : '\E90D'; } - &.cold::before { content : '\E90E'; } - &.fire::before { content : '\E90F'; } - &.force::before { content : '\E910'; } - &.lightning::before { content : '\E911'; } - &.necrotic::before { content : '\E912'; } - &.piercing::before { content : '\E914'; } - &.poison::before { content : '\E913'; } - &.psychic::before { content : '\E915'; } - &.radiant::before { content : '\E916'; } - &.slashing::before { content : '\E917'; } - &.thunder::before { content : '\E918'; } - - /* DnD Conditions */ - &.blinded::before { content : '\E919'; } - &.charmed::before { content : '\E91A'; } - &.deafened::before { content : '\E91B'; } - &.exhaust-1::before { content : '\E91C'; } - &.exhaust-2::before { content : '\E91D'; } - &.exhaust-3::before { content : '\E91E'; } - &.exhaust-4::before { content : '\E91F'; } - &.exhaust-5::before { content : '\E920'; } - &.exhaust-6::before { content : '\E921'; } - &.frightened::before { content : '\E922'; } - &.grappled::before { content : '\E923'; } - &.incapacitated::before { content : '\E924'; } - &.invisible::before { content : '\E926'; } - &.paralyzed::before { content : '\E927'; } - &.petrified::before { content : '\E928'; } - &.poisoned::before { content : '\E929'; } - &.prone::before { content : '\E92A'; } - &.restrained::before { content : '\E92B'; } - &.stunned::before { content : '\E92C'; } - &.unconscious::before { content : '\E925'; } - - /* Character Classes and Features */ - &.barbarian-rage::before { content : '\E92D'; } - &.barbarian-reckless-attack::before { content : '\E92E'; } - &.bardic-inspiration::before { content : '\E92F'; } - &.cleric-channel-divinity::before { content : '\E930'; } - &.druid-wild-shape::before { content : '\E931'; } - &.fighter-action-surge::before { content : '\E932'; } - &.fighter-second-wind::before { content : '\E933'; } - &.monk-flurry-blows::before { content : '\E934'; } - &.monk-patient-defense::before { content : '\E935'; } - &.monk-step-of-the-wind::before { content : '\E936'; } - &.monk-step-of-the-wind-2::before { content : '\E937'; } - &.monk-step-of-the-wind-3::before { content : '\E938'; } - &.monk-stunning-strike::before { content : '\E939'; } - &.monk-stunning-strike-2::before { content : '\E939'; } - &.paladin-divine-smite::before { content : '\E93B'; } - &.paladin-lay-on-hands::before { content : '\E93C'; } - &.barbarian-abilities::before { content : '\E93D'; } - &.barbarian::before { content : '\E93E'; } - &.bard-abilities::before { content : '\E93F'; } - &.bard::before { content : '\E940'; } - &.cleric-abilities::before { content : '\E941'; } - &.cleric::before { content : '\E942'; } - &.druid-abilities::before { content : '\E943'; } - &.druid::before { content : '\E944'; } - &.fighter-abilities::before { content : '\E945'; } - &.fighter::before { content : '\E946'; } - &.monk-abilities::before { content : '\E947'; } - &.monk::before { content : '\E948'; } - &.paladin-abilities::before { content : '\E949'; } - &.paladin::before { content : '\E94A'; } - &.ranger-abilities::before { content : '\E94B'; } - &.ranger::before { content : '\E94C'; } - &.rogue-abilities::before { content : '\E94D'; } - &.rogue::before { content : '\E94E'; } - &.sorcerer-abilities::before { content : '\E94F'; } - &.sorcerer::before { content : '\E950'; } - &.warlock-abilities::before { content : '\E951'; } - &.warlock::before { content : '\E952'; } - &.wizard-abilities::before { content : '\E953'; } - &.wizard::before { content : '\E954'; } - - /* Types of actions */ - &.movement::before { content : '\E955'; } - &.action::before { content : '\E956'; } - &.bonus-action::before { content : '\E957'; } - &.reaction::before { content : '\E958'; } - - /* SRD Spells */ - &.acid-arrow::before { content : '\E959'; } - &.action-1::before { content : '\E95A'; } - &.alter-self::before { content : '\E95B'; } - &.alter-self-2::before { content : '\E95C'; } - &.animal-friendship::before { content : '\E95E'; } - &.animate-dead::before { content : '\E95F'; } - &.animate-objects::before { content : '\E960'; } - &.animate-objects-2::before { content : '\E961'; } - &.bane::before { content : '\E962'; } - &.bless::before { content : '\E963'; } - &.blur::before { content : '\E964'; } - &.bonus::before { content : '\E965'; } - &.branding-smite::before { content : '\E966'; } - &.burning-hands::before { content : '\E967'; } - &.charm-person::before { content : '\E968'; } - &.chill-touch::before { content : '\E969'; } - &.cloudkill::before { content : '\E96A'; } - &.comprehend-languages::before { content : '\E96B'; } - &.cone-of-cold::before { content : '\E96C'; } - &.conjure-elemental::before { content : '\E96D'; } - &.conjure-minor-elemental::before { content : '\E96E'; } - &.control-water::before { content : '\E96F'; } - &.counterspell::before { content : '\E970'; } - &.cure-wounds::before { content : '\E971'; } - &.dancing-lights::before { content : '\E972'; } - &.darkness::before { content : '\E973'; } - &.detect-magic::before { content : '\E974'; } - &.disguise-self::before { content : '\E975'; } - &.disintegrate::before { content : '\E976'; } - &.dispel-evil-and-good::before { content : '\E977'; } - &.dispel-magic::before { content : '\E978'; } - &.dominate-monster::before { content : '\E979'; } - &.dominate-person::before { content : '\E97A'; } - &.eldritch-blast::before { content : '\E97B'; } - &.enlarge-reduce::before { content : '\E97C'; } - &.entangle::before { content : '\E97D'; } - &.faerie-fire::before { content : '\E97E'; } - &.faerie-fire2::before { content : '\E97F'; } - &.feather-fall::before { content : '\E980'; } - &.find-familiar::before { content : '\E981'; } - &.finger-of-death::before { content : '\E982'; } - &.fireball::before { content : '\E983'; } - &.floating-disk::before { content : '\E984'; } - &.fly::before { content : '\E985'; } - &.fog-cloud::before { content : '\E986'; } - &.gaseous-form::before { content : '\E987'; } - &.gaseous-form2::before { content : '\E988'; } - &.gentle-repose::before { content : '\E989'; } - &.gentle-repose2::before { content : '\E98A'; } - &.globe-of-invulnerability::before { content : '\E98B'; } - &.guiding-bolt::before { content : '\E98C'; } - &.healing-word::before { content : '\E98D'; } - &.heat-metal::before { content : '\E98E'; } - &.hellish-rebuke::before { content : '\E98F'; } - &.heroes-feast::before { content : '\E990'; } - &.heroism::before { content : '\E991'; } - &.hideous-laughter::before { content : '\E992'; } - &.identify::before { content : '\E993'; } - &.illusory-script::before { content : '\E994'; } - &.inflict-wounds::before { content : '\E995'; } - &.light::before { content : '\E996'; } - &.longstrider::before { content : '\E997'; } - &.mage-armor::before { content : '\E998'; } - &.mage-hand::before { content : '\E999'; } - &.magic-missile::before { content : '\E99A'; } - &.mass-cure-wounds::before { content : '\E99B'; } - &.mass-healing-word::before { content : '\E99C'; } - &.Mending::before { content : '\E99D'; } - &.message::before { content : '\E99E'; } - &.Minor-illusion::before { content : '\E99F'; } - &.movement1::before { content : '\E9A0'; } - &.polymorph::before { content : '\E9A1'; } - &.power-word-kill::before { content : '\E9A2'; } - &.power-word-stun::before { content : '\E9A3'; } - &.prayer-of-healing::before { content : '\E9A4'; } - &.prestidigitation::before { content : '\E9A5'; } - &.protection-from-evil-and-good::before { content : '\E9A6'; } - &.raise-read::before { content : '\E9A7'; } - &.raise-read2::before { content : '\E9A8'; } - &.reaction1::before { content : '\E9A9'; } - &.resurrection::before { content : '\E9AA'; } - &.resurrection2::before { content : '\E9AB'; } - &.revivify::before { content : '\E9AC'; } - &.revivify2::before { content : '\E9AD'; } - &.sacred-flame::before { content : '\E9AE'; } - &.sanctuary::before { content : '\E9AF'; } - &.scorching-ray::before { content : '\E9B0'; } - &.sending::before { content : '\E9B1'; } - &.shatter::before { content : '\E9B2'; } - &.shield::before { content : '\E9B3'; } - &.silent-image::before { content : '\E9B4'; } - &.sleep::before { content : '\E9B5'; } - &.speak-with-animals::before { content : '\E9B6'; } - &.telekinesis::before { content : '\E9B7'; } - &.true-strike::before { content : '\E9B8'; } - &.vicious-mockery::before { content : '\E9B9'; } - &.wall-of-fire::before { content : '\E9BA'; } - &.wall-of-force::before { content : '\E9BB'; } - &.wall-of-ice::before { content : '\E9BC'; } - &.wall-of-stone::before { content : '\E9BD'; } - &.wall-of-thorns::before { content : '\E9BE'; } - &.wish::before { content : '\E9BF'; } - } -} \ No newline at end of file diff --git a/themes/fonts/iconFonts/diceFont.js b/themes/fonts/iconFonts/diceFont.js new file mode 100644 index 000000000..6ac75ad26 --- /dev/null +++ b/themes/fonts/iconFonts/diceFont.js @@ -0,0 +1,96 @@ +const diceFont = { + 'df_f' : 'df F', + 'df_f_minus' : 'df F-minus', + 'df_f_plus' : 'df F-plus', + 'df_f_zero' : 'df F-zero', + 'df_d10' : 'df d10', + 'df_d10_1' : 'df d10-1', + 'df_d10_10' : 'df d10-10', + 'df_d10_2' : 'df d10-2', + 'df_d10_3' : 'df d10-3', + 'df_d10_4' : 'df d10-4', + 'df_d10_5' : 'df d10-5', + 'df_d10_6' : 'df d10-6', + 'df_d10_7' : 'df d10-7', + 'df_d10_8' : 'df d10-8', + 'df_d10_9' : 'df d10-9', + 'df_d12' : 'df d12', + 'df_d12_1' : 'df d12-1', + 'df_d12_10' : 'df d12-10', + 'df_d12_11' : 'df d12-11', + 'df_d12_12' : 'df d12-12', + 'df_d12_2' : 'df d12-2', + 'df_d12_3' : 'df d12-3', + 'df_d12_4' : 'df d12-4', + 'df_d12_5' : 'df d12-5', + 'df_d12_6' : 'df d12-6', + 'df_d12_7' : 'df d12-7', + 'df_d12_8' : 'df d12-8', + 'df_d12_9' : 'df d12-9', + 'df_d2' : 'df d2', + 'df_d2_1' : 'df d2-1', + 'df_d2_2' : 'df d2-2', + 'df_d20' : 'df d20', + 'df_d20_1' : 'df d20-1', + 'df_d20_10' : 'df d20-10', + 'df_d20_11' : 'df d20-11', + 'df_d20_12' : 'df d20-12', + 'df_d20_13' : 'df d20-13', + 'df_d20_14' : 'df d20-14', + 'df_d20_15' : 'df d20-15', + 'df_d20_16' : 'df d20-16', + 'df_d20_17' : 'df d20-17', + 'df_d20_18' : 'df d20-18', + 'df_d20_19' : 'df d20-19', + 'df_d20_2' : 'df d20-2', + 'df_d20_20' : 'df d20-20', + 'df_d20_3' : 'df d20-3', + 'df_d20_4' : 'df d20-4', + 'df_d20_5' : 'df d20-5', + 'df_d20_6' : 'df d20-6', + 'df_d20_7' : 'df d20-7', + 'df_d20_8' : 'df d20-8', + 'df_d20_9' : 'df d20-9', + 'df_d4' : 'df d4', + 'df_d4_1' : 'df d4-1', + 'df_d4_2' : 'df d4-2', + 'df_d4_3' : 'df d4-3', + 'df_d4_4' : 'df d4-4', + 'df_d6' : 'df d6', + 'df_d6_1' : 'df d6-1', + 'df_d6_2' : 'df d6-2', + 'df_d6_3' : 'df d6-3', + 'df_d6_4' : 'df d6-4', + 'df_d6_5' : 'df d6-5', + 'df_d6_6' : 'df d6-6', + 'df_d8' : 'df d8', + 'df_d8_1' : 'df d8-1', + 'df_d8_2' : 'df d8-2', + 'df_d8_3' : 'df d8-3', + 'df_d8_4' : 'df d8-4', + 'df_d8_5' : 'df d8-5', + 'df_d8_6' : 'df d8-6', + 'df_d8_7' : 'df d8-7', + 'df_d8_8' : 'df d8-8', + 'df_dot_d6' : 'df dot-d6', + 'df_dot_d6_1' : 'df dot-d6-1', + 'df_dot_d6_2' : 'df dot-d6-2', + 'df_dot_d6_3' : 'df dot-d6-3', + 'df_dot_d6_4' : 'df dot-d6-4', + 'df_dot_d6_5' : 'df dot-d6-5', + 'df_dot_d6_6' : 'df dot-d6-6', + 'df_small_dot_d6_1' : 'df small-dot-d6-1', + 'df_small_dot_d6_2' : 'df small-dot-d6-2', + 'df_small_dot_d6_3' : 'df small-dot-d6-3', + 'df_small_dot_d6_4' : 'df small-dot-d6-4', + 'df_small_dot_d6_5' : 'df small-dot-d6-5', + 'df_small_dot_d6_6' : 'df small-dot-d6-6', + 'df_solid_small_dot_d6_1' : 'df solid-small-dot-d6-1', + 'df_solid_small_dot_d6_2' : 'df solid-small-dot-d6-2', + 'df_solid_small_dot_d6_3' : 'df solid-small-dot-d6-3', + 'df_solid_small_dot_d6_4' : 'df solid-small-dot-d6-4', + 'df_solid_small_dot_d6_5' : 'df solid-small-dot-d6-5', + 'df_solid_small_dot_d6_6' : 'df solid-small-dot-d6-6' +}; + +module.exports = diceFont; \ No newline at end of file diff --git a/themes/fonts/icon fonts/diceFont.less b/themes/fonts/iconFonts/diceFont.less similarity index 98% rename from themes/fonts/icon fonts/diceFont.less rename to themes/fonts/iconFonts/diceFont.less index 069f6f769..6fe226a05 100644 --- a/themes/fonts/icon fonts/diceFont.less +++ b/themes/fonts/iconFonts/diceFont.less @@ -3,7 +3,7 @@ font-family : 'DiceFont'; font-style : normal; font-weight : normal; - src : url('../../../fonts/icon fonts/diceFont.woff2'); + src : url('../../../fonts/iconFonts/diceFont.woff2'); } .df { diff --git a/themes/fonts/icon fonts/diceFont.woff2 b/themes/fonts/iconFonts/diceFont.woff2 similarity index 100% rename from themes/fonts/icon fonts/diceFont.woff2 rename to themes/fonts/iconFonts/diceFont.woff2 diff --git a/themes/fonts/icon fonts/diceFont_license.md b/themes/fonts/iconFonts/diceFont_license.md similarity index 100% rename from themes/fonts/icon fonts/diceFont_license.md rename to themes/fonts/iconFonts/diceFont_license.md diff --git a/themes/fonts/iconFonts/elderberryInn.js b/themes/fonts/iconFonts/elderberryInn.js new file mode 100644 index 000000000..d23bca086 --- /dev/null +++ b/themes/fonts/iconFonts/elderberryInn.js @@ -0,0 +1,208 @@ +const elderberryInn = { + 'ei_book' : 'ei book', + 'ei_screen' : 'ei screen', + + /* Spell levels */ + 'ei_spell_0' : 'ei spell-0', + 'ei_spell_1' : 'ei spell-1', + 'ei_spell_2' : 'ei spell-2', + 'ei_spell_3' : 'ei spell-3', + 'ei_spell_4' : 'ei spell-4', + 'ei_spell_5' : 'ei spell-5', + 'ei_spell_6' : 'ei spell-6', + 'ei_spell_7' : 'ei spell-7', + 'ei_spell_8' : 'ei spell-8', + 'ei_spell_9' : 'ei spell-9', + + /* Damage types */ + 'ei_acid' : 'ei acid', + 'ei_bludgeoning' : 'ei bludgeoning', + 'ei_cold' : 'ei cold', + 'ei_fire' : 'ei fire', + 'ei_force' : 'ei force', + 'ei_lightning' : 'ei lightning', + 'ei_necrotic' : 'ei necrotic', + 'ei_piercing' : 'ei piercing', + 'ei_poison' : 'ei poison', + 'ei_psychic' : 'ei psychic', + 'ei_radiant' : 'ei radiant', + 'ei_slashing' : 'ei slashing', + 'ei_thunder' : 'ei thunder', + + /* DnD Donditions */ + 'ei_blinded' : 'ei blinded', + 'ei_charmed' : 'ei charmed', + 'ei_deafened' : 'ei deafened', + 'ei_exhaust1' : 'ei exhaust-1', + 'ei_blinded' : 'ei blinded', + 'ei_exhaust2' : 'ei exhaust-2', + 'ei_exhaust3' : 'ei exhaust-3', + 'ei_exhaust4' : 'ei exhaust-4', + 'ei_exhaust5' : 'ei exhaust-5', + 'ei_exhaust6' : 'ei exhaust-6', + 'ei_frightened' : 'ei frightened', + 'ei_grappled' : 'ei grappled', + 'ei_incapacitated' : 'ei incapacitated', + 'ei_invisible' : 'ei invisible', + 'ei_paralyzed' : 'ei paralyzed', + 'ei_petrified' : 'ei petrified', + 'ei_poisoned' : 'ei poisoned', + 'ei_prone' : 'ei prone', + 'ei_restrained' : 'ei restrained', + 'ei_stunned' : 'ei stunned', + 'ei_unconscious' : 'ei unconscious', + + /* Character Classes and Features */ + 'ei_barbarian_rage' : 'ei barbarian-rage', + 'ei_barbarian_reckless_attack' : 'ei barbarian-reckless-attack', + 'ei_bardic_inspiration' : 'ei bardic-inspiration', + 'ei_cleric_channel_divinity' : 'ei cleric-channel-divinity', + 'ei_druid_wild_shape' : 'ei druid-wild-shape', + 'ei_fighter_action_surge' : 'ei fighter-action-surge', + 'ei_fighter_second_wind' : 'ei fighter-second-wind', + 'ei_monk_flurry_blows' : 'ei monk-flurry-blows', + 'ei_monk_patient_defense' : 'ei monk-patient-defense', + 'ei_monk_step_of_the_wind' : 'ei monk-step-of-the-wind', + 'ei_monk_step_of_the_wind2' : 'ei monk-step-of-the-wind-2', + 'ei_monk_step_of_the_wind3' : 'ei monk-step-of-the-wind-3', + 'ei_monk_stunning_strike' : 'ei monk-stunning-strike', + 'ei_monk_stunning_strike2' : 'ei monk-stunning-strike-2', + 'ei_paladin_divine_smite' : 'ei paladin-divine-smite', + 'ei_paladin_lay_on_hands' : 'ei paladin-lay-on-hands', + 'ei_barbarian_abilities' : 'ei barbarian-abilities', + 'ei_barbarian' : 'ei barbarian', + 'ei_bard_abilities' : 'ei bard-abilities', + 'ei_bard' : 'ei bard', + 'ei_cleric_abilities' : 'ei cleric-abilities', + 'ei_cleric' : 'ei cleric', + 'ei_druid_abilities' : 'ei druid-abilities', + 'ei_druid' : 'ei druid', + 'ei_fighter_abilities' : 'ei fighter-abilities', + 'ei_fighter' : 'ei fighter', + 'ei_monk_abilities' : 'ei monk-abilities', + 'ei_monk' : 'ei monk', + 'ei_paladin_abilities' : 'ei paladin-abilities', + 'ei_paladin' : 'ei paladin', + 'ei_ranger_abilities' : 'ei ranger-abilities', + 'ei_ranger' : 'ei ranger', + 'ei_rogue_abilities' : 'ei rogue-abilities', + 'ei_rogue' : 'ei rogue', + 'ei_sorcerer_abilities' : 'ei sorcerer-abilities', + 'ei_sorcerer' : 'ei sorcerer', + 'ei_warlock_abilities' : 'ei warlock-abilities', + 'ei_warlock' : 'ei warlock', + 'ei_wizard_abilities' : 'ei wizard-abilities', + 'ei_wizard' : 'ei wizard', + + /* Types of actions */ + 'ei_movement' : 'ei movement', + 'ei_action' : 'ei action', + 'ei_bonus_action' : 'ei bonus-action', + 'ei_reaction' : 'ei reaction', + + /* SRD Spells */ + 'ei_acid_arrow' : 'ei acid-arrow', + 'ei_action1' : 'ei action-1', + 'ei_alter_self' : 'ei alter-self', + 'ei_alter_self2' : 'ei alter-self-2', + 'ei_animal_friendship' : 'ei animal-friendship', + 'ei_animate_dead' : 'ei animate-dead', + 'ei_animate_objects' : 'ei animate-objects', + 'ei_animate_objects2' : 'ei animate-objects-2', + 'ei_bane' : 'ei bane', + 'ei_bless' : 'ei bless', + 'ei_blur' : 'ei blur', + 'ei_bonus' : 'ei bonus', + 'ei_branding_smite' : 'ei branding-smite', + 'ei_burning_hands' : 'ei burning-hands', + 'ei_charm_person' : 'ei charm-person', + 'ei_chill_touch' : 'ei chill-touch', + 'ei_cloudkill' : 'ei cloudkill', + 'ei_comprehend_languages' : 'ei comprehend-languages', + 'ei_cone_of_cold' : 'ei cone-of-cold', + 'ei_conjure_elemental' : 'ei conjure-elemental', + 'ei_conjure_minor_elemental' : 'ei conjure-minor-elemental', + 'ei_control_water' : 'ei control-water', + 'ei_counterspell' : 'ei counterspell', + 'ei_cure_wounds' : 'ei cure-wounds', + 'ei_dancing_lights' : 'ei dancing-lights', + 'ei_darkness' : 'ei darkness', + 'ei_detect_magic' : 'ei detect-magic', + 'ei_disguise_self' : 'ei disguise-self', + 'ei_disintegrate' : 'ei disintegrate', + 'ei_dispel_evil_and_good' : 'ei dispel-evil-and-good', + 'ei_dispel_magic' : 'ei dispel-magic', + 'ei_dominate_monster' : 'ei dominate-monster', + 'ei_dominate_person' : 'ei dominate-person', + 'ei_eldritch_blast' : 'ei eldritch-blast', + 'ei_enlarge_reduce' : 'ei enlarge-reduce', + 'ei_entangle' : 'ei entangle', + 'ei_faerie_fire' : 'ei faerie-fire', + 'ei_faerie_fire2' : 'ei faerie-fire2', + 'ei_feather_fall' : 'ei feather-fall', + 'ei_find_familiar' : 'ei find-familiar', + 'ei_finger_of_death' : 'ei finger-of-death', + 'ei_fireball' : 'ei fireball', + 'ei_floating_disk' : 'ei floating-disk', + 'ei_fly' : 'ei fly', + 'ei_fog_cloud' : 'ei fog-cloud', + 'ei_gaseous_form' : 'ei gaseous-form', + 'ei_gaseous_form2' : 'ei gaseous-form2', + 'ei_gentle_repose' : 'ei gentle-repose', + 'ei_gentle_repose2' : 'ei gentle-repose2', + 'ei_globe_of_invulnerability' : 'ei globe-of-invulnerability', + 'ei_guiding_bolt' : 'ei guiding-bolt', + 'ei_healing_word' : 'ei healing-word', + 'ei_heat_metal' : 'ei heat-metal', + 'ei_hellish_rebuke' : 'ei hellish-rebuke', + 'ei_heroes_feast' : 'ei heroes-feast', + 'ei_heroism' : 'ei heroism', + 'ei_hideous_laughter' : 'ei hideous-laughter', + 'ei_identify' : 'ei identify', + 'ei_illusory_script' : 'ei illusory-script', + 'ei_inflict_wounds' : 'ei inflict-wounds', + 'ei_light' : 'ei light', + 'ei_longstrider' : 'ei longstrider', + 'ei_mage_armor' : 'ei mage-armor', + 'ei_mage_hand' : 'ei mage-hand', + 'ei_magic_missile' : 'ei magic-missile', + 'ei_mass_cure_wounds' : 'ei mass-cure-wounds', + 'ei_mass_healing_word' : 'ei mass-healing-word', + 'ei_mending' : 'ei _mending', + 'ei_message' : 'ei message', + 'ei_minor_illusion' : 'ei _minor-illusion', + 'ei_movement1' : 'ei movement1', + 'ei_polymorph' : 'ei polymorph', + 'ei_power_word_kill' : 'ei power-word-kill', + 'ei_power_word_stun' : 'ei power-word-stun', + 'ei_prayer_of_healing' : 'ei prayer-of-healing', + 'ei_prestidigitation' : 'ei prestidigitation', + 'ei_protection_from_evil_and_good' : 'ei protection-from-evil-and-good', + 'ei_raise_dead' : 'ei raise-dead', + 'ei_raise_dead2' : 'ei raise-dead2', + 'ei_reaction1' : 'ei reaction1', + 'ei_resurrection' : 'ei resurrection', + 'ei_resurrection2' : 'ei resurrection2', + 'ei_revivify' : 'ei revivify', + 'ei_revivify2' : 'ei revivify2', + 'ei_sacred_flame' : 'ei sacred-flame', + 'ei_sanctuary' : 'ei sanctuary', + 'ei_scorching_ray' : 'ei scorching-ray', + 'ei_sending' : 'ei sending', + 'ei_shatter' : 'ei shatter', + 'ei_shield' : 'ei shield', + 'ei_silent_image' : 'ei silent-image', + 'ei_sleep' : 'ei sleep', + 'ei_speak_with_animals' : 'ei speak-with-animals', + 'ei_telekinesis' : 'ei telekinesis', + 'ei_true_strike' : 'ei true-strike', + 'ei_vicious_mockery' : 'ei vicious-mockery', + 'ei_wall_of_fire' : 'ei wall-of-fire', + 'ei_wall_of_force' : 'ei wall-of-force', + 'ei_wall_of_ice' : 'ei wall-of-ice', + 'ei_wall_of_stone' : 'ei wall-of-stone', + 'ei_wall_of_thorns' : 'ei wall-of-thorns', + 'ei_wish' : 'ei wish' +}; + +module.exports = elderberryInn; \ No newline at end of file diff --git a/themes/fonts/iconFonts/elderberryInn.less b/themes/fonts/iconFonts/elderberryInn.less new file mode 100644 index 000000000..adabe5a81 --- /dev/null +++ b/themes/fonts/iconFonts/elderberryInn.less @@ -0,0 +1,222 @@ +/* Icon Font: Elderberry Inn */ +@font-face { + font-family : 'Elderberry-Inn'; + font-style : normal; + font-weight : normal; + src : url('../../../fonts/iconFonts/elderberryInn.woff2'); +} + +.ei { + display : inline-block; + margin-right : 3px; + font-family : 'Elderberry-Inn'; + line-height : 1; + vertical-align : baseline; + -moz-osx-font-smoothing : grayscale; + -webkit-font-smoothing : antialiased; + text-rendering : auto; + + &.book::before { content : '\E900'; } + &.screen::before { content : '\E901'; } + + /* Spell levels */ + &.spell-0::before { content : '\E902'; } + &.spell-1::before { content : '\E903'; } + &.spell-2::before { content : '\E904'; } + &.spell-3::before { content : '\E905'; } + &.spell-4::before { content : '\E906'; } + &.spell-5::before { content : '\E907'; } + &.spell-6::before { content : '\E908'; } + &.spell-7::before { content : '\E909'; } + &.spell-8::before { content : '\E90A'; } + &.spell-9::before { content : '\E90B'; } + + /* Damage types */ + &.acid::before { content : '\E90C'; } + &.bludgeoning::before { content : '\E90D'; } + &.cold::before { content : '\E90E'; } + &.fire::before { content : '\E90F'; } + &.force::before { content : '\E910'; } + &.lightning::before { content : '\E911'; } + &.necrotic::before { content : '\E912'; } + &.piercing::before { content : '\E913'; } + &.poison::before { content : '\E914'; } + &.psychic::before { content : '\E915'; } + &.radiant::before { content : '\E916'; } + &.slashing::before { content : '\E917'; } + &.thunder::before { content : '\E918'; } + + /* DnD Conditions */ + &.blinded::before { content : '\E919'; } + &.charmed::before { content : '\E91A'; } + &.deafened::before { content : '\E91B'; } + &.exhaust-1::before { content : '\E91C'; } + &.exhaust-2::before { content : '\E91D'; } + &.exhaust-3::before { content : '\E91E'; } + &.exhaust-4::before { content : '\E91F'; } + &.exhaust-5::before { content : '\E920'; } + &.exhaust-6::before { content : '\E921'; } + &.frightened::before { content : '\E922'; } + &.grappled::before { content : '\E923'; } + &.incapacitated::before { content : '\E924'; } + &.invisible::before { content : '\E926'; } + &.paralyzed::before { content : '\E927'; } + &.petrified::before { content : '\E928'; } + &.poisoned::before { content : '\E929'; } + &.prone::before { content : '\E92A'; } + &.restrained::before { content : '\E92B'; } + &.stunned::before { content : '\E92C'; } + &.unconscious::before { content : '\E925'; } + + /* Character Classes and Features */ + &.barbarian-rage::before { content : '\E92D'; } + &.barbarian-reckless-attack::before { content : '\E92E'; } + &.bardic-inspiration::before { content : '\E92F'; } + &.cleric-channel-divinity::before { content : '\E930'; } + &.druid-wild-shape::before { content : '\E931'; } + &.fighter-action-surge::before { content : '\E932'; } + &.fighter-second-wind::before { content : '\E933'; } + &.monk-flurry-blows::before { content : '\E934'; } + &.monk-patient-defense::before { content : '\E935'; } + &.monk-step-of-the-wind::before { content : '\E936'; } + &.monk-step-of-the-wind-2::before { content : '\E937'; } + &.monk-step-of-the-wind-3::before { content : '\E938'; } + &.monk-stunning-strike::before { content : '\E939'; } + &.monk-stunning-strike-2::before { content : '\E939'; } + &.paladin-divine-smite::before { content : '\E93B'; } + &.paladin-lay-on-hands::before { content : '\E93C'; } + &.barbarian-abilities::before { content : '\E93D'; } + &.barbarian::before { content : '\E93E'; } + &.bard-abilities::before { content : '\E93F'; } + &.bard::before { content : '\E940'; } + &.cleric-abilities::before { content : '\E941'; } + &.cleric::before { content : '\E942'; } + &.druid-abilities::before { content : '\E943'; } + &.druid::before { content : '\E944'; } + &.fighter-abilities::before { content : '\E945'; } + &.fighter::before { content : '\E946'; } + &.monk-abilities::before { content : '\E947'; } + &.monk::before { content : '\E948'; } + &.paladin-abilities::before { content : '\E949'; } + &.paladin::before { content : '\E94A'; } + &.ranger-abilities::before { content : '\E94B'; } + &.ranger::before { content : '\E94C'; } + &.rogue-abilities::before { content : '\E94D'; } + &.rogue::before { content : '\E94E'; } + &.sorcerer-abilities::before { content : '\E94F'; } + &.sorcerer::before { content : '\E950'; } + &.warlock-abilities::before { content : '\E951'; } + &.warlock::before { content : '\E952'; } + &.wizard-abilities::before { content : '\E953'; } + &.wizard::before { content : '\E954'; } + + /* Types of actions */ + &.movement::before { content : '\E955'; } + &.action::before { content : '\E956'; } + &.bonus-action::before { content : '\E957'; } + &.reaction::before { content : '\E958'; } + + /* SRD Spells */ + &.acid-arrow::before { content : '\E959'; } + &.action-1::before { content : '\E95A'; } + &.alter-self::before { content : '\E95B'; } + &.alter-self-2::before { content : '\E95C'; } + &.animal-friendship::before { content : '\E95E'; } + &.animate-dead::before { content : '\E95F'; } + &.animate-objects::before { content : '\E960'; } + &.animate-objects-2::before { content : '\E961'; } + &.bane::before { content : '\E962'; } + &.bless::before { content : '\E963'; } + &.blur::before { content : '\E964'; } + &.bonus::before { content : '\E965'; } + &.branding-smite::before { content : '\E966'; } + &.burning-hands::before { content : '\E967'; } + &.charm-person::before { content : '\E968'; } + &.chill-touch::before { content : '\E969'; } + &.cloudkill::before { content : '\E96A'; } + &.comprehend-languages::before { content : '\E96B'; } + &.cone-of-cold::before { content : '\E96C'; } + &.conjure-elemental::before { content : '\E96D'; } + &.conjure-minor-elemental::before { content : '\E96E'; } + &.control-water::before { content : '\E96F'; } + &.counterspell::before { content : '\E970'; } + &.cure-wounds::before { content : '\E971'; } + &.dancing-lights::before { content : '\E972'; } + &.darkness::before { content : '\E973'; } + &.detect-magic::before { content : '\E974'; } + &.disguise-self::before { content : '\E975'; } + &.disintegrate::before { content : '\E976'; } + &.dispel-evil-and-good::before { content : '\E977'; } + &.dispel-magic::before { content : '\E978'; } + &.dominate-monster::before { content : '\E979'; } + &.dominate-person::before { content : '\E97A'; } + &.eldritch-blast::before { content : '\E97B'; } + &.enlarge-reduce::before { content : '\E97C'; } + &.entangle::before { content : '\E97D'; } + &.faerie-fire::before { content : '\E97E'; } + &.faerie-fire2::before { content : '\E97F'; } + &.feather-fall::before { content : '\E980'; } + &.find-familiar::before { content : '\E981'; } + &.finger-of-death::before { content : '\E982'; } + &.fireball::before { content : '\E983'; } + &.floating-disk::before { content : '\E984'; } + &.fly::before { content : '\E985'; } + &.fog-cloud::before { content : '\E986'; } + &.gaseous-form::before { content : '\E987'; } + &.gaseous-form2::before { content : '\E988'; } + &.gentle-repose::before { content : '\E989'; } + &.gentle-repose2::before { content : '\E98A'; } + &.globe-of-invulnerability::before { content : '\E98B'; } + &.guiding-bolt::before { content : '\E98C'; } + &.healing-word::before { content : '\E98D'; } + &.heat-metal::before { content : '\E98E'; } + &.hellish-rebuke::before { content : '\E98F'; } + &.heroes-feast::before { content : '\E990'; } + &.heroism::before { content : '\E991'; } + &.hideous-laughter::before { content : '\E992'; } + &.identify::before { content : '\E993'; } + &.illusory-script::before { content : '\E994'; } + &.inflict-wounds::before { content : '\E995'; } + &.light::before { content : '\E996'; } + &.longstrider::before { content : '\E997'; } + &.mage-armor::before { content : '\E998'; } + &.mage-hand::before { content : '\E999'; } + &.magic-missile::before { content : '\E99A'; } + &.mass-cure-wounds::before { content : '\E99B'; } + &.mass-healing-word::before { content : '\E99C'; } + &.Mending::before { content : '\E99D'; } + &.message::before { content : '\E99E'; } + &.Minor-illusion::before { content : '\E99F'; } + &.movement1::before { content : '\E9A0'; } + &.polymorph::before { content : '\E9A1'; } + &.power-word-kill::before { content : '\E9A2'; } + &.power-word-stun::before { content : '\E9A3'; } + &.prayer-of-healing::before { content : '\E9A4'; } + &.prestidigitation::before { content : '\E9A5'; } + &.protection-from-evil-and-good::before { content : '\E9A6'; } + &.raise-dead::before { content : '\E9A7'; } + &.raise-dead2::before { content : '\E9A8'; } + &.reaction1::before { content : '\E9A9'; } + &.resurrection::before { content : '\E9AA'; } + &.resurrection2::before { content : '\E9AB'; } + &.revivify::before { content : '\E9AC'; } + &.revivify2::before { content : '\E9AD'; } + &.sacred-flame::before { content : '\E9AE'; } + &.sanctuary::before { content : '\E9AF'; } + &.scorching-ray::before { content : '\E9B0'; } + &.sending::before { content : '\E9B1'; } + &.shatter::before { content : '\E9B2'; } + &.shield::before { content : '\E9B3'; } + &.silent-image::before { content : '\E9B4'; } + &.sleep::before { content : '\E9B5'; } + &.speak-with-animals::before { content : '\E9B6'; } + &.telekinesis::before { content : '\E9B7'; } + &.true-strike::before { content : '\E9B8'; } + &.vicious-mockery::before { content : '\E9B9'; } + &.wall-of-fire::before { content : '\E9BA'; } + &.wall-of-force::before { content : '\E9BB'; } + &.wall-of-ice::before { content : '\E9BC'; } + &.wall-of-stone::before { content : '\E9BD'; } + &.wall-of-thorns::before { content : '\E9BE'; } + &.wish::before { content : '\E9BF'; } +} \ No newline at end of file diff --git a/themes/fonts/icon fonts/Elderberry-Inn-Icons.woff2 b/themes/fonts/iconFonts/elderberryInn.woff2 similarity index 100% rename from themes/fonts/icon fonts/Elderberry-Inn-Icons.woff2 rename to themes/fonts/iconFonts/elderberryInn.woff2 diff --git a/themes/fonts/iconFonts/fontAwesome.js b/themes/fonts/iconFonts/fontAwesome.js new file mode 100644 index 000000000..764bd5bc5 --- /dev/null +++ b/themes/fonts/iconFonts/fontAwesome.js @@ -0,0 +1,2054 @@ +const fontAwesome = { + // FONT-AWESOME SOLID + 'fas_0' : 'fas fa-0', + 'fas_1' : 'fas fa-1', + 'fas_2' : 'fas fa-2', + 'fas_3' : 'fas fa-3', + 'fas_4' : 'fas fa-4', + 'fas_5' : 'fas fa-5', + 'fas_6' : 'fas fa-6', + 'fas_7' : 'fas fa-7', + 'fas_8' : 'fas fa-8', + 'fas_9' : 'fas fa-9', + 'fas_a' : 'fas fa-a', + 'fas_address_book' : 'fas fa-address-book', + 'fas_address_card' : 'fas fa-address-card', + 'fas_align_center' : 'fas fa-align-center', + 'fas_align_justify' : 'fas fa-align-justify', + 'fas_align_left' : 'fas fa-align-left', + 'fas_align_right' : 'fas fa-align-right', + 'fas_anchor_circle_check' : 'fas fa-anchor-circle-check', + 'fas_anchor_circle_exclamation' : 'fas fa-anchor-circle-exclamation', + 'fas_anchor_circle_xmark' : 'fas fa-anchor-circle-xmark', + 'fas_anchor_lock' : 'fas fa-anchor-lock', + 'fas_anchor' : 'fas fa-anchor', + 'fas_angle_down' : 'fas fa-angle-down', + 'fas_angle_left' : 'fas fa-angle-left', + 'fas_angle_right' : 'fas fa-angle-right', + 'fas_angle_up' : 'fas fa-angle-up', + 'fas_angles_down' : 'fas fa-angles-down', + 'fas_angles_left' : 'fas fa-angles-left', + 'fas_angles_right' : 'fas fa-angles-right', + 'fas_angles_up' : 'fas fa-angles-up', + 'fas_ankh' : 'fas fa-ankh', + 'fas_apple_whole' : 'fas fa-apple-whole', + 'fas_archway' : 'fas fa-archway', + 'fas_arrow_down_1_9' : 'fas fa-arrow-down-1-9', + 'fas_arrow_down_9_1' : 'fas fa-arrow-down-9-1', + 'fas_arrow_down_a_z' : 'fas fa-arrow-down-a-z', + 'fas_arrow_down_long' : 'fas fa-arrow-down-long', + 'fas_arrow_down_short_wide' : 'fas fa-arrow-down-short-wide', + 'fas_arrow_down_up_across_line' : 'fas fa-arrow-down-up-across-line', + 'fas_arrow_down_up_lock' : 'fas fa-arrow-down-up-lock', + 'fas_arrow_down_wide_short' : 'fas fa-arrow-down-wide-short', + 'fas_arrow_down_z_a' : 'fas fa-arrow-down-z-a', + 'fas_arrow_down' : 'fas fa-arrow-down', + 'fas_arrow_left_long' : 'fas fa-arrow-left-long', + 'fas_arrow_left' : 'fas fa-arrow-left', + 'fas_arrow_pointer' : 'fas fa-arrow-pointer', + 'fas_arrow_right_arrow_left' : 'fas fa-arrow-right-arrow-left', + 'fas_arrow_right_from_bracket' : 'fas fa-arrow-right-from-bracket', + 'fas_arrow_right_long' : 'fas fa-arrow-right-long', + 'fas_arrow_right_to_bracket' : 'fas fa-arrow-right-to-bracket', + 'fas_arrow_right_to_city' : 'fas fa-arrow-right-to-city', + 'fas_arrow_right' : 'fas fa-arrow-right', + 'fas_arrow_rotate_left' : 'fas fa-arrow-rotate-left', + 'fas_arrow_rotate_right' : 'fas fa-arrow-rotate-right', + 'fas_arrow_trend_down' : 'fas fa-arrow-trend-down', + 'fas_arrow_trend_up' : 'fas fa-arrow-trend-up', + 'fas_arrow_turn_down' : 'fas fa-arrow-turn-down', + 'fas_arrow_turn_up' : 'fas fa-arrow-turn-up', + 'fas_arrow_up_1_9' : 'fas fa-arrow-up-1-9', + 'fas_arrow_up_9_1' : 'fas fa-arrow-up-9-1', + 'fas_arrow_up_a_z' : 'fas fa-arrow-up-a-z', + 'fas_arrow_up_from_bracket' : 'fas fa-arrow-up-from-bracket', + 'fas_arrow_up_from_ground_water' : 'fas fa-arrow-up-from-ground-water', + 'fas_arrow_up_from_water_pump' : 'fas fa-arrow-up-from-water-pump', + 'fas_arrow_up_long' : 'fas fa-arrow-up-long', + 'fas_arrow_up_right_dots' : 'fas fa-arrow-up-right-dots', + 'fas_arrow_up_right_from_square' : 'fas fa-arrow-up-right-from-square', + 'fas_arrow_up_short_wide' : 'fas fa-arrow-up-short-wide', + 'fas_arrow_up_wide_short' : 'fas fa-arrow-up-wide-short', + 'fas_arrow_up_z_a' : 'fas fa-arrow-up-z-a', + 'fas_arrow_up' : 'fas fa-arrow-up', + 'fas_arrows_down_to_line' : 'fas fa-arrows-down-to-line', + 'fas_arrows_down_to_people' : 'fas fa-arrows-down-to-people', + 'fas_arrows_left_right_to_line' : 'fas fa-arrows-left-right-to-line', + 'fas_arrows_left_right' : 'fas fa-arrows-left-right', + 'fas_arrows_rotate' : 'fas fa-arrows-rotate', + 'fas_arrows_spin' : 'fas fa-arrows-spin', + 'fas_arrows_split_up_and_left' : 'fas fa-arrows-split-up-and-left', + 'fas_arrows_to_circle' : 'fas fa-arrows-to-circle', + 'fas_arrows_to_dot' : 'fas fa-arrows-to-dot', + 'fas_arrows_to_eye' : 'fas fa-arrows-to-eye', + 'fas_arrows_turn_right' : 'fas fa-arrows-turn-right', + 'fas_arrows_turn_to_dots' : 'fas fa-arrows-turn-to-dots', + 'fas_arrows_up_down_left_right' : 'fas fa-arrows-up-down-left-right', + 'fas_arrows_up_down' : 'fas fa-arrows-up-down', + 'fas_arrows_up_to_line' : 'fas fa-arrows-up-to-line', + 'fas_asterisk' : 'fas fa-asterisk', + 'fas_at' : 'fas fa-at', + 'fas_atom' : 'fas fa-atom', + 'fas_audio_description' : 'fas fa-audio-description', + 'fas_austral_sign' : 'fas fa-austral-sign', + 'fas_award' : 'fas fa-award', + 'fas_b' : 'fas fa-b', + 'fas_baby_carriage' : 'fas fa-baby-carriage', + 'fas_baby' : 'fas fa-baby', + 'fas_backward_fast' : 'fas fa-backward-fast', + 'fas_backward_step' : 'fas fa-backward-step', + 'fas_backward' : 'fas fa-backward', + 'fas_bacon' : 'fas fa-bacon', + 'fas_bacteria' : 'fas fa-bacteria', + 'fas_bacterium' : 'fas fa-bacterium', + 'fas_bag_shopping' : 'fas fa-bag-shopping', + 'fas_bahai' : 'fas fa-bahai', + 'fas_baht_sign' : 'fas fa-baht-sign', + 'fas_ban_smoking' : 'fas fa-ban-smoking', + 'fas_ban' : 'fas fa-ban', + 'fas_bandage' : 'fas fa-bandage', + 'fas_bangladeshi_taka_sign' : 'fas fa-bangladeshi-taka-sign', + 'fas_barcode' : 'fas fa-barcode', + 'fas_bars_progress' : 'fas fa-bars-progress', + 'fas_bars_staggered' : 'fas fa-bars-staggered', + 'fas_bars' : 'fas fa-bars', + 'fas_baseball_bat_ball' : 'fas fa-baseball-bat-ball', + 'fas_baseball' : 'fas fa-baseball', + 'fas_basket_shopping' : 'fas fa-basket-shopping', + 'fas_basketball' : 'fas fa-basketball', + 'fas_bath' : 'fas fa-bath', + 'fas_battery_empty' : 'fas fa-battery-empty', + 'fas_battery_full' : 'fas fa-battery-full', + 'fas_battery_half' : 'fas fa-battery-half', + 'fas_battery_quarter' : 'fas fa-battery-quarter', + 'fas_battery_three_quarters' : 'fas fa-battery-three-quarters', + 'fas_bed_pulse' : 'fas fa-bed-pulse', + 'fas_bed' : 'fas fa-bed', + 'fas_beer_mug_empty' : 'fas fa-beer-mug-empty', + 'fas_bell_concierge' : 'fas fa-bell-concierge', + 'fas_bell_slash' : 'fas fa-bell-slash', + 'fas_bell' : 'fas fa-bell', + 'fas_bezier_curve' : 'fas fa-bezier-curve', + 'fas_bicycle' : 'fas fa-bicycle', + 'fas_binoculars' : 'fas fa-binoculars', + 'fas_biohazard' : 'fas fa-biohazard', + 'fas_bitcoin_sign' : 'fas fa-bitcoin-sign', + 'fas_blender_phone' : 'fas fa-blender-phone', + 'fas_blender' : 'fas fa-blender', + 'fas_blog' : 'fas fa-blog', + 'fas_bold' : 'fas fa-bold', + 'fas_bolt_lightning' : 'fas fa-bolt-lightning', + 'fas_bolt' : 'fas fa-bolt', + 'fas_bomb' : 'fas fa-bomb', + 'fas_bone' : 'fas fa-bone', + 'fas_bong' : 'fas fa-bong', + 'fas_book_atlas' : 'fas fa-book-atlas', + 'fas_book_bible' : 'fas fa-book-bible', + 'fas_book_bookmark' : 'fas fa-book-bookmark', + 'fas_book_journal_whills' : 'fas fa-book-journal-whills', + 'fas_book_medical' : 'fas fa-book-medical', + 'fas_book_open_reader' : 'fas fa-book-open-reader', + 'fas_book_open' : 'fas fa-book-open', + 'fas_book_quran' : 'fas fa-book-quran', + 'fas_book_skull' : 'fas fa-book-skull', + 'fas_book_tanakh' : 'fas fa-book-tanakh', + 'fas_book' : 'fas fa-book', + 'fas_bookmark' : 'fas fa-bookmark', + 'fas_border_all' : 'fas fa-border-all', + 'fas_border_none' : 'fas fa-border-none', + 'fas_border_top_left' : 'fas fa-border-top-left', + 'fas_bore_hole' : 'fas fa-bore-hole', + 'fas_bottle_droplet' : 'fas fa-bottle-droplet', + 'fas_bottle_water' : 'fas fa-bottle-water', + 'fas_bowl_food' : 'fas fa-bowl-food', + 'fas_bowl_rice' : 'fas fa-bowl-rice', + 'fas_bowling_ball' : 'fas fa-bowling-ball', + 'fas_box_archive' : 'fas fa-box-archive', + 'fas_box_open' : 'fas fa-box-open', + 'fas_box_tissue' : 'fas fa-box-tissue', + 'fas_box' : 'fas fa-box', + 'fas_boxes_packing' : 'fas fa-boxes-packing', + 'fas_boxes_stacked' : 'fas fa-boxes-stacked', + 'fas_braille' : 'fas fa-braille', + 'fas_brain' : 'fas fa-brain', + 'fas_brazilian_real_sign' : 'fas fa-brazilian-real-sign', + 'fas_bread_slice' : 'fas fa-bread-slice', + 'fas_bridge_circle_check' : 'fas fa-bridge-circle-check', + 'fas_bridge_circle_exclamation' : 'fas fa-bridge-circle-exclamation', + 'fas_bridge_circle_xmark' : 'fas fa-bridge-circle-xmark', + 'fas_bridge_lock' : 'fas fa-bridge-lock', + 'fas_bridge_water' : 'fas fa-bridge-water', + 'fas_bridge' : 'fas fa-bridge', + 'fas_briefcase_medical' : 'fas fa-briefcase-medical', + 'fas_briefcase' : 'fas fa-briefcase', + 'fas_broom_ball' : 'fas fa-broom-ball', + 'fas_broom' : 'fas fa-broom', + 'fas_brush' : 'fas fa-brush', + 'fas_bucket' : 'fas fa-bucket', + 'fas_bug_slash' : 'fas fa-bug-slash', + 'fas_bug' : 'fas fa-bug', + 'fas_bugs' : 'fas fa-bugs', + 'fas_building_circle_arrow_right' : 'fas fa-building-circle-arrow-right', + 'fas_building_circle_check' : 'fas fa-building-circle-check', + 'fas_building_circle_exclamation' : 'fas fa-building-circle-exclamation', + 'fas_building_circle_xmark' : 'fas fa-building-circle-xmark', + 'fas_building_columns' : 'fas fa-building-columns', + 'fas_building_flag' : 'fas fa-building-flag', + 'fas_building_lock' : 'fas fa-building-lock', + 'fas_building_ngo' : 'fas fa-building-ngo', + 'fas_building_shield' : 'fas fa-building-shield', + 'fas_building_un' : 'fas fa-building-un', + 'fas_building_user' : 'fas fa-building-user', + 'fas_building_wheat' : 'fas fa-building-wheat', + 'fas_building' : 'fas fa-building', + 'fas_bullhorn' : 'fas fa-bullhorn', + 'fas_bullseye' : 'fas fa-bullseye', + 'fas_burger' : 'fas fa-burger', + 'fas_burst' : 'fas fa-burst', + 'fas_bus_simple' : 'fas fa-bus-simple', + 'fas_bus' : 'fas fa-bus', + 'fas_business_time' : 'fas fa-business-time', + 'fas_c' : 'fas fa-c', + 'fas_cable_car' : 'fas fa-cable-car', + 'fas_cake_candles' : 'fas fa-cake-candles', + 'fas_calculator' : 'fas fa-calculator', + 'fas_calendar_check' : 'fas fa-calendar-check', + 'fas_calendar_day' : 'fas fa-calendar-day', + 'fas_calendar_days' : 'fas fa-calendar-days', + 'fas_calendar_minus' : 'fas fa-calendar-minus', + 'fas_calendar_plus' : 'fas fa-calendar-plus', + 'fas_calendar_week' : 'fas fa-calendar-week', + 'fas_calendar_xmark' : 'fas fa-calendar-xmark', + 'fas_calendar' : 'fas fa-calendar', + 'fas_camera_retro' : 'fas fa-camera-retro', + 'fas_camera_rotate' : 'fas fa-camera-rotate', + 'fas_camera' : 'fas fa-camera', + 'fas_campground' : 'fas fa-campground', + 'fas_candy_cane' : 'fas fa-candy-cane', + 'fas_cannabis' : 'fas fa-cannabis', + 'fas_capsules' : 'fas fa-capsules', + 'fas_car_battery' : 'fas fa-car-battery', + 'fas_car_burst' : 'fas fa-car-burst', + 'fas_car_on' : 'fas fa-car-on', + 'fas_car_rear' : 'fas fa-car-rear', + 'fas_car_side' : 'fas fa-car-side', + 'fas_car_tunnel' : 'fas fa-car-tunnel', + 'fas_car' : 'fas fa-car', + 'fas_caravan' : 'fas fa-caravan', + 'fas_caret_down' : 'fas fa-caret-down', + 'fas_caret_left' : 'fas fa-caret-left', + 'fas_caret_right' : 'fas fa-caret-right', + 'fas_caret_up' : 'fas fa-caret-up', + 'fas_carrot' : 'fas fa-carrot', + 'fas_cart_arrow_down' : 'fas fa-cart-arrow-down', + 'fas_cart_flatbed_suitcase' : 'fas fa-cart-flatbed-suitcase', + 'fas_cart_flatbed' : 'fas fa-cart-flatbed', + 'fas_cart_plus' : 'fas fa-cart-plus', + 'fas_cart_shopping' : 'fas fa-cart-shopping', + 'fas_cash_register' : 'fas fa-cash-register', + 'fas_cat' : 'fas fa-cat', + 'fas_cedi_sign' : 'fas fa-cedi-sign', + 'fas_cent_sign' : 'fas fa-cent-sign', + 'fas_certificate' : 'fas fa-certificate', + 'fas_chair' : 'fas fa-chair', + 'fas_chalkboard_user' : 'fas fa-chalkboard-user', + 'fas_chalkboard' : 'fas fa-chalkboard', + 'fas_champagne_glasses' : 'fas fa-champagne-glasses', + 'fas_charging_station' : 'fas fa-charging-station', + 'fas_chart_area' : 'fas fa-chart-area', + 'fas_chart_bar' : 'fas fa-chart-bar', + 'fas_chart_column' : 'fas fa-chart-column', + 'fas_chart_gantt' : 'fas fa-chart-gantt', + 'fas_chart_line' : 'fas fa-chart-line', + 'fas_chart_pie' : 'fas fa-chart-pie', + 'fas_chart_simple' : 'fas fa-chart-simple', + 'fas_check_double' : 'fas fa-check-double', + 'fas_check_to_slot' : 'fas fa-check-to-slot', + 'fas_check' : 'fas fa-check', + 'fas_cheese' : 'fas fa-cheese', + 'fas_chess_bishop' : 'fas fa-chess-bishop', + 'fas_chess_board' : 'fas fa-chess-board', + 'fas_chess_king' : 'fas fa-chess-king', + 'fas_chess_knight' : 'fas fa-chess-knight', + 'fas_chess_pawn' : 'fas fa-chess-pawn', + 'fas_chess_queen' : 'fas fa-chess-queen', + 'fas_chess_rook' : 'fas fa-chess-rook', + 'fas_chess' : 'fas fa-chess', + 'fas_chevron_down' : 'fas fa-chevron-down', + 'fas_chevron_left' : 'fas fa-chevron-left', + 'fas_chevron_right' : 'fas fa-chevron-right', + 'fas_chevron_up' : 'fas fa-chevron-up', + 'fas_child_combatant' : 'fas fa-child-combatant', + 'fas_child_dress' : 'fas fa-child-dress', + 'fas_child_reaching' : 'fas fa-child-reaching', + 'fas_child' : 'fas fa-child', + 'fas_children' : 'fas fa-children', + 'fas_church' : 'fas fa-church', + 'fas_circle_arrow_down' : 'fas fa-circle-arrow-down', + 'fas_circle_arrow_left' : 'fas fa-circle-arrow-left', + 'fas_circle_arrow_right' : 'fas fa-circle-arrow-right', + 'fas_circle_arrow_up' : 'fas fa-circle-arrow-up', + 'fas_circle_check' : 'fas fa-circle-check', + 'fas_circle_chevron_down' : 'fas fa-circle-chevron-down', + 'fas_circle_chevron_left' : 'fas fa-circle-chevron-left', + 'fas_circle_chevron_right' : 'fas fa-circle-chevron-right', + 'fas_circle_chevron_up' : 'fas fa-circle-chevron-up', + 'fas_circle_dollar_to_slot' : 'fas fa-circle-dollar-to-slot', + 'fas_circle_dot' : 'fas fa-circle-dot', + 'fas_circle_down' : 'fas fa-circle-down', + 'fas_circle_exclamation' : 'fas fa-circle-exclamation', + 'fas_circle_h' : 'fas fa-circle-h', + 'fas_circle_half_stroke' : 'fas fa-circle-half-stroke', + 'fas_circle_info' : 'fas fa-circle-info', + 'fas_circle_left' : 'fas fa-circle-left', + 'fas_circle_minus' : 'fas fa-circle-minus', + 'fas_circle_nodes' : 'fas fa-circle-nodes', + 'fas_circle_notch' : 'fas fa-circle-notch', + 'fas_circle_pause' : 'fas fa-circle-pause', + 'fas_circle_play' : 'fas fa-circle-play', + 'fas_circle_plus' : 'fas fa-circle-plus', + 'fas_circle_question' : 'fas fa-circle-question', + 'fas_circle_radiation' : 'fas fa-circle-radiation', + 'fas_circle_right' : 'fas fa-circle-right', + 'fas_circle_stop' : 'fas fa-circle-stop', + 'fas_circle_up' : 'fas fa-circle-up', + 'fas_circle_user' : 'fas fa-circle-user', + 'fas_circle_xmark' : 'fas fa-circle-xmark', + 'fas_circle' : 'fas fa-circle', + 'fas_city' : 'fas fa-city', + 'fas_clapperboard' : 'fas fa-clapperboard', + 'fas_clipboard_check' : 'fas fa-clipboard-check', + 'fas_clipboard_list' : 'fas fa-clipboard-list', + 'fas_clipboard_question' : 'fas fa-clipboard-question', + 'fas_clipboard_user' : 'fas fa-clipboard-user', + 'fas_clipboard' : 'fas fa-clipboard', + 'fas_clock_rotate_left' : 'fas fa-clock-rotate-left', + 'fas_clock' : 'fas fa-clock', + 'fas_clone' : 'fas fa-clone', + 'fas_closed_captioning' : 'fas fa-closed-captioning', + 'fas_cloud_arrow_down' : 'fas fa-cloud-arrow-down', + 'fas_cloud_arrow_up' : 'fas fa-cloud-arrow-up', + 'fas_cloud_bolt' : 'fas fa-cloud-bolt', + 'fas_cloud_meatball' : 'fas fa-cloud-meatball', + 'fas_cloud_moon_rain' : 'fas fa-cloud-moon-rain', + 'fas_cloud_moon' : 'fas fa-cloud-moon', + 'fas_cloud_rain' : 'fas fa-cloud-rain', + 'fas_cloud_showers_heavy' : 'fas fa-cloud-showers-heavy', + 'fas_cloud_showers_water' : 'fas fa-cloud-showers-water', + 'fas_cloud_sun_rain' : 'fas fa-cloud-sun-rain', + 'fas_cloud_sun' : 'fas fa-cloud-sun', + 'fas_cloud' : 'fas fa-cloud', + 'fas_clover' : 'fas fa-clover', + 'fas_code_branch' : 'fas fa-code-branch', + 'fas_code_commit' : 'fas fa-code-commit', + 'fas_code_compare' : 'fas fa-code-compare', + 'fas_code_fork' : 'fas fa-code-fork', + 'fas_code_merge' : 'fas fa-code-merge', + 'fas_code_pull_request' : 'fas fa-code-pull-request', + 'fas_code' : 'fas fa-code', + 'fas_coins' : 'fas fa-coins', + 'fas_colon_sign' : 'fas fa-colon-sign', + 'fas_comment_dollar' : 'fas fa-comment-dollar', + 'fas_comment_dots' : 'fas fa-comment-dots', + 'fas_comment_medical' : 'fas fa-comment-medical', + 'fas_comment_slash' : 'fas fa-comment-slash', + 'fas_comment_sms' : 'fas fa-comment-sms', + 'fas_comment' : 'fas fa-comment', + 'fas_comments_dollar' : 'fas fa-comments-dollar', + 'fas_comments' : 'fas fa-comments', + 'fas_compact_disc' : 'fas fa-compact-disc', + 'fas_compass_drafting' : 'fas fa-compass-drafting', + 'fas_compass' : 'fas fa-compass', + 'fas_compress' : 'fas fa-compress', + 'fas_computer_mouse' : 'fas fa-computer-mouse', + 'fas_computer' : 'fas fa-computer', + 'fas_cookie_bite' : 'fas fa-cookie-bite', + 'fas_cookie' : 'fas fa-cookie', + 'fas_copy' : 'fas fa-copy', + 'fas_copyright' : 'fas fa-copyright', + 'fas_couch' : 'fas fa-couch', + 'fas_cow' : 'fas fa-cow', + 'fas_credit_card' : 'fas fa-credit-card', + 'fas_crop_simple' : 'fas fa-crop-simple', + 'fas_crop' : 'fas fa-crop', + 'fas_cross' : 'fas fa-cross', + 'fas_crosshairs' : 'fas fa-crosshairs', + 'fas_crow' : 'fas fa-crow', + 'fas_crown' : 'fas fa-crown', + 'fas_crutch' : 'fas fa-crutch', + 'fas_cruzeiro_sign' : 'fas fa-cruzeiro-sign', + 'fas_cube' : 'fas fa-cube', + 'fas_cubes_stacked' : 'fas fa-cubes-stacked', + 'fas_cubes' : 'fas fa-cubes', + 'fas_d' : 'fas fa-d', + 'fas_database' : 'fas fa-database', + 'fas_delete_left' : 'fas fa-delete-left', + 'fas_democrat' : 'fas fa-democrat', + 'fas_desktop' : 'fas fa-desktop', + 'fas_dharmachakra' : 'fas fa-dharmachakra', + 'fas_diagram_next' : 'fas fa-diagram-next', + 'fas_diagram_predecessor' : 'fas fa-diagram-predecessor', + 'fas_diagram_project' : 'fas fa-diagram-project', + 'fas_diagram_successor' : 'fas fa-diagram-successor', + 'fas_diamond_turn_right' : 'fas fa-diamond-turn-right', + 'fas_diamond' : 'fas fa-diamond', + 'fas_dice_d20' : 'fas fa-dice-d20', + 'fas_dice_d6' : 'fas fa-dice-d6', + 'fas_dice_five' : 'fas fa-dice-five', + 'fas_dice_four' : 'fas fa-dice-four', + 'fas_dice_one' : 'fas fa-dice-one', + 'fas_dice_six' : 'fas fa-dice-six', + 'fas_dice_three' : 'fas fa-dice-three', + 'fas_dice_two' : 'fas fa-dice-two', + 'fas_dice' : 'fas fa-dice', + 'fas_disease' : 'fas fa-disease', + 'fas_display' : 'fas fa-display', + 'fas_divide' : 'fas fa-divide', + 'fas_dna' : 'fas fa-dna', + 'fas_dog' : 'fas fa-dog', + 'fas_dollar_sign' : 'fas fa-dollar-sign', + 'fas_dolly' : 'fas fa-dolly', + 'fas_dong_sign' : 'fas fa-dong-sign', + 'fas_door_closed' : 'fas fa-door-closed', + 'fas_door_open' : 'fas fa-door-open', + 'fas_dove' : 'fas fa-dove', + 'fas_down_left_and_up_right_to_center' : 'fas fa-down-left-and-up-right-to-center', + 'fas_down_long' : 'fas fa-down-long', + 'fas_download' : 'fas fa-download', + 'fas_dragon' : 'fas fa-dragon', + 'fas_draw_polygon' : 'fas fa-draw-polygon', + 'fas_droplet_slash' : 'fas fa-droplet-slash', + 'fas_droplet' : 'fas fa-droplet', + 'fas_drum_steelpan' : 'fas fa-drum-steelpan', + 'fas_drum' : 'fas fa-drum', + 'fas_drumstick_bite' : 'fas fa-drumstick-bite', + 'fas_dumbbell' : 'fas fa-dumbbell', + 'fas_dumpster_fire' : 'fas fa-dumpster-fire', + 'fas_dumpster' : 'fas fa-dumpster', + 'fas_dungeon' : 'fas fa-dungeon', + 'fas_e' : 'fas fa-e', + 'fas_ear_deaf' : 'fas fa-ear-deaf', + 'fas_ear_listen' : 'fas fa-ear-listen', + 'fas_earth_africa' : 'fas fa-earth-africa', + 'fas_earth_americas' : 'fas fa-earth-americas', + 'fas_earth_asia' : 'fas fa-earth-asia', + 'fas_earth_europe' : 'fas fa-earth-europe', + 'fas_earth_oceania' : 'fas fa-earth-oceania', + 'fas_egg' : 'fas fa-egg', + 'fas_eject' : 'fas fa-eject', + 'fas_elevator' : 'fas fa-elevator', + 'fas_ellipsis_vertical' : 'fas fa-ellipsis-vertical', + 'fas_ellipsis' : 'fas fa-ellipsis', + 'fas_envelope_circle_check' : 'fas fa-envelope-circle-check', + 'fas_envelope_open_text' : 'fas fa-envelope-open-text', + 'fas_envelope_open' : 'fas fa-envelope-open', + 'fas_envelope' : 'fas fa-envelope', + 'fas_envelopes_bulk' : 'fas fa-envelopes-bulk', + 'fas_equals' : 'fas fa-equals', + 'fas_eraser' : 'fas fa-eraser', + 'fas_ethernet' : 'fas fa-ethernet', + 'fas_euro_sign' : 'fas fa-euro-sign', + 'fas_exclamation' : 'fas fa-exclamation', + 'fas_expand' : 'fas fa-expand', + 'fas_explosion' : 'fas fa-explosion', + 'fas_eye_dropper' : 'fas fa-eye-dropper', + 'fas_eye_low_vision' : 'fas fa-eye-low-vision', + 'fas_eye_slash' : 'fas fa-eye-slash', + 'fas_eye' : 'fas fa-eye', + 'fas_f' : 'fas fa-f', + 'fas_face_angry' : 'fas fa-face-angry', + 'fas_face_dizzy' : 'fas fa-face-dizzy', + 'fas_face_flushed' : 'fas fa-face-flushed', + 'fas_face_frown_open' : 'fas fa-face-frown-open', + 'fas_face_frown' : 'fas fa-face-frown', + 'fas_face_grimace' : 'fas fa-face-grimace', + 'fas_face_grin_beam_sweat' : 'fas fa-face-grin-beam-sweat', + 'fas_face_grin_beam' : 'fas fa-face-grin-beam', + 'fas_face_grin_hearts' : 'fas fa-face-grin-hearts', + 'fas_face_grin_squint_tears' : 'fas fa-face-grin-squint-tears', + 'fas_face_grin_squint' : 'fas fa-face-grin-squint', + 'fas_face_grin_stars' : 'fas fa-face-grin-stars', + 'fas_face_grin_tears' : 'fas fa-face-grin-tears', + 'fas_face_grin_tongue_squint' : 'fas fa-face-grin-tongue-squint', + 'fas_face_grin_tongue_wink' : 'fas fa-face-grin-tongue-wink', + 'fas_face_grin_tongue' : 'fas fa-face-grin-tongue', + 'fas_face_grin_wide' : 'fas fa-face-grin-wide', + 'fas_face_grin_wink' : 'fas fa-face-grin-wink', + 'fas_face_grin' : 'fas fa-face-grin', + 'fas_face_kiss_beam' : 'fas fa-face-kiss-beam', + 'fas_face_kiss_wink_heart' : 'fas fa-face-kiss-wink-heart', + 'fas_face_kiss' : 'fas fa-face-kiss', + 'fas_face_laugh_beam' : 'fas fa-face-laugh-beam', + 'fas_face_laugh_squint' : 'fas fa-face-laugh-squint', + 'fas_face_laugh_wink' : 'fas fa-face-laugh-wink', + 'fas_face_laugh' : 'fas fa-face-laugh', + 'fas_face_meh_blank' : 'fas fa-face-meh-blank', + 'fas_face_meh' : 'fas fa-face-meh', + 'fas_face_rolling_eyes' : 'fas fa-face-rolling-eyes', + 'fas_face_sad_cry' : 'fas fa-face-sad-cry', + 'fas_face_sad_tear' : 'fas fa-face-sad-tear', + 'fas_face_smile_beam' : 'fas fa-face-smile-beam', + 'fas_face_smile_wink' : 'fas fa-face-smile-wink', + 'fas_face_smile' : 'fas fa-face-smile', + 'fas_face_surprise' : 'fas fa-face-surprise', + 'fas_face_tired' : 'fas fa-face-tired', + 'fas_fan' : 'fas fa-fan', + 'fas_faucet_drip' : 'fas fa-faucet-drip', + 'fas_faucet' : 'fas fa-faucet', + 'fas_fax' : 'fas fa-fax', + 'fas_feather_pointed' : 'fas fa-feather-pointed', + 'fas_feather' : 'fas fa-feather', + 'fas_ferry' : 'fas fa-ferry', + 'fas_file_arrow_down' : 'fas fa-file-arrow-down', + 'fas_file_arrow_up' : 'fas fa-file-arrow-up', + 'fas_file_audio' : 'fas fa-file-audio', + 'fas_file_circle_check' : 'fas fa-file-circle-check', + 'fas_file_circle_exclamation' : 'fas fa-file-circle-exclamation', + 'fas_file_circle_minus' : 'fas fa-file-circle-minus', + 'fas_file_circle_plus' : 'fas fa-file-circle-plus', + 'fas_file_circle_question' : 'fas fa-file-circle-question', + 'fas_file_circle_xmark' : 'fas fa-file-circle-xmark', + 'fas_file_code' : 'fas fa-file-code', + 'fas_file_contract' : 'fas fa-file-contract', + 'fas_file_csv' : 'fas fa-file-csv', + 'fas_file_excel' : 'fas fa-file-excel', + 'fas_file_export' : 'fas fa-file-export', + 'fas_file_image' : 'fas fa-file-image', + 'fas_file_import' : 'fas fa-file-import', + 'fas_file_invoice_dollar' : 'fas fa-file-invoice-dollar', + 'fas_file_invoice' : 'fas fa-file-invoice', + 'fas_file_lines' : 'fas fa-file-lines', + 'fas_file_medical' : 'fas fa-file-medical', + 'fas_file_pdf' : 'fas fa-file-pdf', + 'fas_file_pen' : 'fas fa-file-pen', + 'fas_file_powerpoint' : 'fas fa-file-powerpoint', + 'fas_file_prescription' : 'fas fa-file-prescription', + 'fas_file_shield' : 'fas fa-file-shield', + 'fas_file_signature' : 'fas fa-file-signature', + 'fas_file_video' : 'fas fa-file-video', + 'fas_file_waveform' : 'fas fa-file-waveform', + 'fas_file_word' : 'fas fa-file-word', + 'fas_file_zipper' : 'fas fa-file-zipper', + 'fas_file' : 'fas fa-file', + 'fas_fill_drip' : 'fas fa-fill-drip', + 'fas_fill' : 'fas fa-fill', + 'fas_film' : 'fas fa-film', + 'fas_filter_circle_dollar' : 'fas fa-filter-circle-dollar', + 'fas_filter_circle_xmark' : 'fas fa-filter-circle-xmark', + 'fas_filter' : 'fas fa-filter', + 'fas_fingerprint' : 'fas fa-fingerprint', + 'fas_fire_burner' : 'fas fa-fire-burner', + 'fas_fire_extinguisher' : 'fas fa-fire-extinguisher', + 'fas_fire_flame_curved' : 'fas fa-fire-flame-curved', + 'fas_fire_flame_simple' : 'fas fa-fire-flame-simple', + 'fas_fire' : 'fas fa-fire', + 'fas_fish_fins' : 'fas fa-fish-fins', + 'fas_fish' : 'fas fa-fish', + 'fas_flag_checkered' : 'fas fa-flag-checkered', + 'fas_flag_usa' : 'fas fa-flag-usa', + 'fas_flag' : 'fas fa-flag', + 'fas_flask_vial' : 'fas fa-flask-vial', + 'fas_flask' : 'fas fa-flask', + 'fas_floppy_disk' : 'fas fa-floppy-disk', + 'fas_florin_sign' : 'fas fa-florin-sign', + 'fas_folder_closed' : 'fas fa-folder-closed', + 'fas_folder_minus' : 'fas fa-folder-minus', + 'fas_folder_open' : 'fas fa-folder-open', + 'fas_folder_plus' : 'fas fa-folder-plus', + 'fas_folder_tree' : 'fas fa-folder-tree', + 'fas_folder' : 'fas fa-folder', + 'fas_font_awesome' : 'fas fa-font-awesome', + 'fas_font' : 'fas fa-font', + 'fas_football' : 'fas fa-football', + 'fas_forward_fast' : 'fas fa-forward-fast', + 'fas_forward_step' : 'fas fa-forward-step', + 'fas_forward' : 'fas fa-forward', + 'fas_franc_sign' : 'fas fa-franc-sign', + 'fas_frog' : 'fas fa-frog', + 'fas_futbol' : 'fas fa-futbol', + 'fas_g' : 'fas fa-g', + 'fas_gamepad' : 'fas fa-gamepad', + 'fas_gas_pump' : 'fas fa-gas-pump', + 'fas_gauge_high' : 'fas fa-gauge-high', + 'fas_gauge_simple_high' : 'fas fa-gauge-simple-high', + 'fas_gauge_simple' : 'fas fa-gauge-simple', + 'fas_gauge' : 'fas fa-gauge', + 'fas_gavel' : 'fas fa-gavel', + 'fas_gear' : 'fas fa-gear', + 'fas_gears' : 'fas fa-gears', + 'fas_gem' : 'fas fa-gem', + 'fas_genderless' : 'fas fa-genderless', + 'fas_ghost' : 'fas fa-ghost', + 'fas_gift' : 'fas fa-gift', + 'fas_gifts' : 'fas fa-gifts', + 'fas_glass_water_droplet' : 'fas fa-glass-water-droplet', + 'fas_glass_water' : 'fas fa-glass-water', + 'fas_glasses' : 'fas fa-glasses', + 'fas_globe' : 'fas fa-globe', + 'fas_golf_ball_tee' : 'fas fa-golf-ball-tee', + 'fas_gopuram' : 'fas fa-gopuram', + 'fas_graduation_cap' : 'fas fa-graduation-cap', + 'fas_greater_than_equal' : 'fas fa-greater-than-equal', + 'fas_greater_than' : 'fas fa-greater-than', + 'fas_grip_lines_vertical' : 'fas fa-grip-lines-vertical', + 'fas_grip_lines' : 'fas fa-grip-lines', + 'fas_grip_vertical' : 'fas fa-grip-vertical', + 'fas_grip' : 'fas fa-grip', + 'fas_group_arrows_rotate' : 'fas fa-group-arrows-rotate', + 'fas_guarani_sign' : 'fas fa-guarani-sign', + 'fas_guitar' : 'fas fa-guitar', + 'fas_gun' : 'fas fa-gun', + 'fas_h' : 'fas fa-h', + 'fas_hammer' : 'fas fa-hammer', + 'fas_hamsa' : 'fas fa-hamsa', + 'fas_hand_back_fist' : 'fas fa-hand-back-fist', + 'fas_hand_dots' : 'fas fa-hand-dots', + 'fas_hand_fist' : 'fas fa-hand-fist', + 'fas_hand_holding_dollar' : 'fas fa-hand-holding-dollar', + 'fas_hand_holding_droplet' : 'fas fa-hand-holding-droplet', + 'fas_hand_holding_hand' : 'fas fa-hand-holding-hand', + 'fas_hand_holding_heart' : 'fas fa-hand-holding-heart', + 'fas_hand_holding_medical' : 'fas fa-hand-holding-medical', + 'fas_hand_holding' : 'fas fa-hand-holding', + 'fas_hand_lizard' : 'fas fa-hand-lizard', + 'fas_hand_middle_finger' : 'fas fa-hand-middle-finger', + 'fas_hand_peace' : 'fas fa-hand-peace', + 'fas_hand_point_down' : 'fas fa-hand-point-down', + 'fas_hand_point_left' : 'fas fa-hand-point-left', + 'fas_hand_point_right' : 'fas fa-hand-point-right', + 'fas_hand_point_up' : 'fas fa-hand-point-up', + 'fas_hand_pointer' : 'fas fa-hand-pointer', + 'fas_hand_scissors' : 'fas fa-hand-scissors', + 'fas_hand_sparkles' : 'fas fa-hand-sparkles', + 'fas_hand_spock' : 'fas fa-hand-spock', + 'fas_hand' : 'fas fa-hand', + 'fas_handcuffs' : 'fas fa-handcuffs', + 'fas_hands_asl_interpreting' : 'fas fa-hands-asl-interpreting', + 'fas_hands_bound' : 'fas fa-hands-bound', + 'fas_hands_bubbles' : 'fas fa-hands-bubbles', + 'fas_hands_clapping' : 'fas fa-hands-clapping', + 'fas_hands_holding_child' : 'fas fa-hands-holding-child', + 'fas_hands_holding_circle' : 'fas fa-hands-holding-circle', + 'fas_hands_holding' : 'fas fa-hands-holding', + 'fas_hands_praying' : 'fas fa-hands-praying', + 'fas_hands' : 'fas fa-hands', + 'fas_handshake_angle' : 'fas fa-handshake-angle', + 'fas_handshake_simple_slash' : 'fas fa-handshake-simple-slash', + 'fas_handshake_simple' : 'fas fa-handshake-simple', + 'fas_handshake_slash' : 'fas fa-handshake-slash', + 'fas_handshake' : 'fas fa-handshake', + 'fas_hanukiah' : 'fas fa-hanukiah', + 'fas_hard_drive' : 'fas fa-hard-drive', + 'fas_hashtag' : 'fas fa-hashtag', + 'fas_hat_cowboy_side' : 'fas fa-hat-cowboy-side', + 'fas_hat_cowboy' : 'fas fa-hat-cowboy', + 'fas_hat_wizard' : 'fas fa-hat-wizard', + 'fas_head_side_cough_slash' : 'fas fa-head-side-cough-slash', + 'fas_head_side_cough' : 'fas fa-head-side-cough', + 'fas_head_side_mask' : 'fas fa-head-side-mask', + 'fas_head_side_virus' : 'fas fa-head-side-virus', + 'fas_heading' : 'fas fa-heading', + 'fas_headphones_simple' : 'fas fa-headphones-simple', + 'fas_headphones' : 'fas fa-headphones', + 'fas_headset' : 'fas fa-headset', + 'fas_heart_circle_bolt' : 'fas fa-heart-circle-bolt', + 'fas_heart_circle_check' : 'fas fa-heart-circle-check', + 'fas_heart_circle_exclamation' : 'fas fa-heart-circle-exclamation', + 'fas_heart_circle_minus' : 'fas fa-heart-circle-minus', + 'fas_heart_circle_plus' : 'fas fa-heart-circle-plus', + 'fas_heart_circle_xmark' : 'fas fa-heart-circle-xmark', + 'fas_heart_crack' : 'fas fa-heart-crack', + 'fas_heart_pulse' : 'fas fa-heart-pulse', + 'fas_heart' : 'fas fa-heart', + 'fas_helicopter_symbol' : 'fas fa-helicopter-symbol', + 'fas_helicopter' : 'fas fa-helicopter', + 'fas_helmet_safety' : 'fas fa-helmet-safety', + 'fas_helmet_un' : 'fas fa-helmet-un', + 'fas_highlighter' : 'fas fa-highlighter', + 'fas_hill_avalanche' : 'fas fa-hill-avalanche', + 'fas_hill_rockslide' : 'fas fa-hill-rockslide', + 'fas_hippo' : 'fas fa-hippo', + 'fas_hockey_puck' : 'fas fa-hockey-puck', + 'fas_holly_berry' : 'fas fa-holly-berry', + 'fas_horse_head' : 'fas fa-horse-head', + 'fas_horse' : 'fas fa-horse', + 'fas_hospital_user' : 'fas fa-hospital-user', + 'fas_hospital' : 'fas fa-hospital', + 'fas_hot_tub_person' : 'fas fa-hot-tub-person', + 'fas_hotdog' : 'fas fa-hotdog', + 'fas_hotel' : 'fas fa-hotel', + 'fas_hourglass_end' : 'fas fa-hourglass-end', + 'fas_hourglass_half' : 'fas fa-hourglass-half', + 'fas_hourglass_start' : 'fas fa-hourglass-start', + 'fas_hourglass' : 'fas fa-hourglass', + 'fas_house_chimney_crack' : 'fas fa-house-chimney-crack', + 'fas_house_chimney_medical' : 'fas fa-house-chimney-medical', + 'fas_house_chimney_user' : 'fas fa-house-chimney-user', + 'fas_house_chimney_window' : 'fas fa-house-chimney-window', + 'fas_house_chimney' : 'fas fa-house-chimney', + 'fas_house_circle_check' : 'fas fa-house-circle-check', + 'fas_house_circle_exclamation' : 'fas fa-house-circle-exclamation', + 'fas_house_circle_xmark' : 'fas fa-house-circle-xmark', + 'fas_house_crack' : 'fas fa-house-crack', + 'fas_house_fire' : 'fas fa-house-fire', + 'fas_house_flag' : 'fas fa-house-flag', + 'fas_house_flood_water_circle_arrow_right' : 'fas fa-house-flood-water-circle-arrow-right', + 'fas_house_flood_water' : 'fas fa-house-flood-water', + 'fas_house_laptop' : 'fas fa-house-laptop', + 'fas_house_lock' : 'fas fa-house-lock', + 'fas_house_medical_circle_check' : 'fas fa-house-medical-circle-check', + 'fas_house_medical_circle_exclamation' : 'fas fa-house-medical-circle-exclamation', + 'fas_house_medical_circle_xmark' : 'fas fa-house-medical-circle-xmark', + 'fas_house_medical_flag' : 'fas fa-house-medical-flag', + 'fas_house_medical' : 'fas fa-house-medical', + 'fas_house_signal' : 'fas fa-house-signal', + 'fas_house_tsunami' : 'fas fa-house-tsunami', + 'fas_house_user' : 'fas fa-house-user', + 'fas_house' : 'fas fa-house', + 'fas_hryvnia_sign' : 'fas fa-hryvnia-sign', + 'fas_hurricane' : 'fas fa-hurricane', + 'fas_i_cursor' : 'fas fa-i-cursor', + 'fas_i' : 'fas fa-i', + 'fas_ice_cream' : 'fas fa-ice-cream', + 'fas_icicles' : 'fas fa-icicles', + 'fas_icons' : 'fas fa-icons', + 'fas_id_badge' : 'fas fa-id-badge', + 'fas_id_card_clip' : 'fas fa-id-card-clip', + 'fas_id_card' : 'fas fa-id-card', + 'fas_igloo' : 'fas fa-igloo', + 'fas_image_portrait' : 'fas fa-image-portrait', + 'fas_image' : 'fas fa-image', + 'fas_images' : 'fas fa-images', + 'fas_inbox' : 'fas fa-inbox', + 'fas_indent' : 'fas fa-indent', + 'fas_indian_rupee_sign' : 'fas fa-indian-rupee-sign', + 'fas_industry' : 'fas fa-industry', + 'fas_infinity' : 'fas fa-infinity', + 'fas_info' : 'fas fa-info', + 'fas_italic' : 'fas fa-italic', + 'fas_j' : 'fas fa-j', + 'fas_jar_wheat' : 'fas fa-jar-wheat', + 'fas_jar' : 'fas fa-jar', + 'fas_jedi' : 'fas fa-jedi', + 'fas_jet_fighter_up' : 'fas fa-jet-fighter-up', + 'fas_jet_fighter' : 'fas fa-jet-fighter', + 'fas_joint' : 'fas fa-joint', + 'fas_jug_detergent' : 'fas fa-jug-detergent', + 'fas_k' : 'fas fa-k', + 'fas_kaaba' : 'fas fa-kaaba', + 'fas_key' : 'fas fa-key', + 'fas_keyboard' : 'fas fa-keyboard', + 'fas_khanda' : 'fas fa-khanda', + 'fas_kip_sign' : 'fas fa-kip-sign', + 'fas_kit_medical' : 'fas fa-kit-medical', + 'fas_kitchen_set' : 'fas fa-kitchen-set', + 'fas_kiwi_bird' : 'fas fa-kiwi-bird', + 'fas_l' : 'fas fa-l', + 'fas_land_mine_on' : 'fas fa-land-mine-on', + 'fas_landmark_dome' : 'fas fa-landmark-dome', + 'fas_landmark_flag' : 'fas fa-landmark-flag', + 'fas_landmark' : 'fas fa-landmark', + 'fas_language' : 'fas fa-language', + 'fas_laptop_code' : 'fas fa-laptop-code', + 'fas_laptop_file' : 'fas fa-laptop-file', + 'fas_laptop_medical' : 'fas fa-laptop-medical', + 'fas_laptop' : 'fas fa-laptop', + 'fas_lari_sign' : 'fas fa-lari-sign', + 'fas_layer_group' : 'fas fa-layer-group', + 'fas_leaf' : 'fas fa-leaf', + 'fas_left_long' : 'fas fa-left-long', + 'fas_left_right' : 'fas fa-left-right', + 'fas_lemon' : 'fas fa-lemon', + 'fas_less_than_equal' : 'fas fa-less-than-equal', + 'fas_less_than' : 'fas fa-less-than', + 'fas_life_ring' : 'fas fa-life-ring', + 'fas_lightbulb' : 'fas fa-lightbulb', + 'fas_lines_leaning' : 'fas fa-lines-leaning', + 'fas_link_slash' : 'fas fa-link-slash', + 'fas_link' : 'fas fa-link', + 'fas_lira_sign' : 'fas fa-lira-sign', + 'fas_list_check' : 'fas fa-list-check', + 'fas_list_ol' : 'fas fa-list-ol', + 'fas_list_ul' : 'fas fa-list-ul', + 'fas_list' : 'fas fa-list', + 'fas_litecoin_sign' : 'fas fa-litecoin-sign', + 'fas_location_arrow' : 'fas fa-location-arrow', + 'fas_location_crosshairs' : 'fas fa-location-crosshairs', + 'fas_location_dot' : 'fas fa-location-dot', + 'fas_location_pin_lock' : 'fas fa-location-pin-lock', + 'fas_location_pin' : 'fas fa-location-pin', + 'fas_lock_open' : 'fas fa-lock-open', + 'fas_lock' : 'fas fa-lock', + 'fas_locust' : 'fas fa-locust', + 'fas_lungs_virus' : 'fas fa-lungs-virus', + 'fas_lungs' : 'fas fa-lungs', + 'fas_m' : 'fas fa-m', + 'fas_magnet' : 'fas fa-magnet', + 'fas_magnifying_glass_arrow_right' : 'fas fa-magnifying-glass-arrow-right', + 'fas_magnifying_glass_chart' : 'fas fa-magnifying-glass-chart', + 'fas_magnifying_glass_dollar' : 'fas fa-magnifying-glass-dollar', + 'fas_magnifying_glass_location' : 'fas fa-magnifying-glass-location', + 'fas_magnifying_glass_minus' : 'fas fa-magnifying-glass-minus', + 'fas_magnifying_glass_plus' : 'fas fa-magnifying-glass-plus', + 'fas_magnifying_glass' : 'fas fa-magnifying-glass', + 'fas_manat_sign' : 'fas fa-manat-sign', + 'fas_map_location_dot' : 'fas fa-map-location-dot', + 'fas_map_location' : 'fas fa-map-location', + 'fas_map_pin' : 'fas fa-map-pin', + 'fas_map' : 'fas fa-map', + 'fas_marker' : 'fas fa-marker', + 'fas_mars_and_venus_burst' : 'fas fa-mars-and-venus-burst', + 'fas_mars_and_venus' : 'fas fa-mars-and-venus', + 'fas_mars_double' : 'fas fa-mars-double', + 'fas_mars_stroke_right' : 'fas fa-mars-stroke-right', + 'fas_mars_stroke_up' : 'fas fa-mars-stroke-up', + 'fas_mars_stroke' : 'fas fa-mars-stroke', + 'fas_mars' : 'fas fa-mars', + 'fas_martini_glass_citrus' : 'fas fa-martini-glass-citrus', + 'fas_martini_glass_empty' : 'fas fa-martini-glass-empty', + 'fas_martini_glass' : 'fas fa-martini-glass', + 'fas_mask_face' : 'fas fa-mask-face', + 'fas_mask_ventilator' : 'fas fa-mask-ventilator', + 'fas_mask' : 'fas fa-mask', + 'fas_masks_theater' : 'fas fa-masks-theater', + 'fas_mattress_pillow' : 'fas fa-mattress-pillow', + 'fas_maximize' : 'fas fa-maximize', + 'fas_medal' : 'fas fa-medal', + 'fas_memory' : 'fas fa-memory', + 'fas_menorah' : 'fas fa-menorah', + 'fas_mercury' : 'fas fa-mercury', + 'fas_message' : 'fas fa-message', + 'fas_meteor' : 'fas fa-meteor', + 'fas_microchip' : 'fas fa-microchip', + 'fas_microphone_lines_slash' : 'fas fa-microphone-lines-slash', + 'fas_microphone_lines' : 'fas fa-microphone-lines', + 'fas_microphone_slash' : 'fas fa-microphone-slash', + 'fas_microphone' : 'fas fa-microphone', + 'fas_microscope' : 'fas fa-microscope', + 'fas_mill_sign' : 'fas fa-mill-sign', + 'fas_minimize' : 'fas fa-minimize', + 'fas_minus' : 'fas fa-minus', + 'fas_mitten' : 'fas fa-mitten', + 'fas_mobile_button' : 'fas fa-mobile-button', + 'fas_mobile_retro' : 'fas fa-mobile-retro', + 'fas_mobile_screen_button' : 'fas fa-mobile-screen-button', + 'fas_mobile_screen' : 'fas fa-mobile-screen', + 'fas_mobile' : 'fas fa-mobile', + 'fas_money_bill_1_wave' : 'fas fa-money-bill-1-wave', + 'fas_money_bill_1' : 'fas fa-money-bill-1', + 'fas_money_bill_transfer' : 'fas fa-money-bill-transfer', + 'fas_money_bill_trend_up' : 'fas fa-money-bill-trend-up', + 'fas_money_bill_wave' : 'fas fa-money-bill-wave', + 'fas_money_bill_wheat' : 'fas fa-money-bill-wheat', + 'fas_money_bill' : 'fas fa-money-bill', + 'fas_money_bills' : 'fas fa-money-bills', + 'fas_money_check_dollar' : 'fas fa-money-check-dollar', + 'fas_money_check' : 'fas fa-money-check', + 'fas_monument' : 'fas fa-monument', + 'fas_moon' : 'fas fa-moon', + 'fas_mortar_pestle' : 'fas fa-mortar-pestle', + 'fas_mosque' : 'fas fa-mosque', + 'fas_mosquito_net' : 'fas fa-mosquito-net', + 'fas_mosquito' : 'fas fa-mosquito', + 'fas_motorcycle' : 'fas fa-motorcycle', + 'fas_mound' : 'fas fa-mound', + 'fas_mountain_city' : 'fas fa-mountain-city', + 'fas_mountain_sun' : 'fas fa-mountain-sun', + 'fas_mountain' : 'fas fa-mountain', + 'fas_mug_hot' : 'fas fa-mug-hot', + 'fas_mug_saucer' : 'fas fa-mug-saucer', + 'fas_music' : 'fas fa-music', + 'fas_n' : 'fas fa-n', + 'fas_naira_sign' : 'fas fa-naira-sign', + 'fas_network_wired' : 'fas fa-network-wired', + 'fas_neuter' : 'fas fa-neuter', + 'fas_newspaper' : 'fas fa-newspaper', + 'fas_not_equal' : 'fas fa-not-equal', + 'fas_notdef' : 'fas fa-notdef', + 'fas_note_sticky' : 'fas fa-note-sticky', + 'fas_notes_medical' : 'fas fa-notes-medical', + 'fas_o' : 'fas fa-o', + 'fas_object_group' : 'fas fa-object-group', + 'fas_object_ungroup' : 'fas fa-object-ungroup', + 'fas_oil_can' : 'fas fa-oil-can', + 'fas_oil_well' : 'fas fa-oil-well', + 'fas_om' : 'fas fa-om', + 'fas_otter' : 'fas fa-otter', + 'fas_outdent' : 'fas fa-outdent', + 'fas_p' : 'fas fa-p', + 'fas_pager' : 'fas fa-pager', + 'fas_paint_roller' : 'fas fa-paint-roller', + 'fas_paintbrush' : 'fas fa-paintbrush', + 'fas_palette' : 'fas fa-palette', + 'fas_pallet' : 'fas fa-pallet', + 'fas_panorama' : 'fas fa-panorama', + 'fas_paper_plane' : 'fas fa-paper-plane', + 'fas_paperclip' : 'fas fa-paperclip', + 'fas_parachute_box' : 'fas fa-parachute-box', + 'fas_paragraph' : 'fas fa-paragraph', + 'fas_passport' : 'fas fa-passport', + 'fas_paste' : 'fas fa-paste', + 'fas_pause' : 'fas fa-pause', + 'fas_paw' : 'fas fa-paw', + 'fas_peace' : 'fas fa-peace', + 'fas_pen_clip' : 'fas fa-pen-clip', + 'fas_pen_fancy' : 'fas fa-pen-fancy', + 'fas_pen_nib' : 'fas fa-pen-nib', + 'fas_pen_ruler' : 'fas fa-pen-ruler', + 'fas_pen_to_square' : 'fas fa-pen-to-square', + 'fas_pen' : 'fas fa-pen', + 'fas_pencil' : 'fas fa-pencil', + 'fas_people_arrows' : 'fas fa-people-arrows', + 'fas_people_carry_box' : 'fas fa-people-carry-box', + 'fas_people_group' : 'fas fa-people-group', + 'fas_people_line' : 'fas fa-people-line', + 'fas_people_pulling' : 'fas fa-people-pulling', + 'fas_people_robbery' : 'fas fa-people-robbery', + 'fas_people_roof' : 'fas fa-people-roof', + 'fas_pepper_hot' : 'fas fa-pepper-hot', + 'fas_percent' : 'fas fa-percent', + 'fas_person_arrow_down_to_line' : 'fas fa-person-arrow-down-to-line', + 'fas_person_arrow_up_from_line' : 'fas fa-person-arrow-up-from-line', + 'fas_person_biking' : 'fas fa-person-biking', + 'fas_person_booth' : 'fas fa-person-booth', + 'fas_person_breastfeeding' : 'fas fa-person-breastfeeding', + 'fas_person_burst' : 'fas fa-person-burst', + 'fas_person_cane' : 'fas fa-person-cane', + 'fas_person_chalkboard' : 'fas fa-person-chalkboard', + 'fas_person_circle_check' : 'fas fa-person-circle-check', + 'fas_person_circle_exclamation' : 'fas fa-person-circle-exclamation', + 'fas_person_circle_minus' : 'fas fa-person-circle-minus', + 'fas_person_circle_plus' : 'fas fa-person-circle-plus', + 'fas_person_circle_question' : 'fas fa-person-circle-question', + 'fas_person_circle_xmark' : 'fas fa-person-circle-xmark', + 'fas_person_digging' : 'fas fa-person-digging', + 'fas_person_dots_from_line' : 'fas fa-person-dots-from-line', + 'fas_person_dress_burst' : 'fas fa-person-dress-burst', + 'fas_person_dress' : 'fas fa-person-dress', + 'fas_person_drowning' : 'fas fa-person-drowning', + 'fas_person_falling_burst' : 'fas fa-person-falling-burst', + 'fas_person_falling' : 'fas fa-person-falling', + 'fas_person_half_dress' : 'fas fa-person-half-dress', + 'fas_person_harassing' : 'fas fa-person-harassing', + 'fas_person_hiking' : 'fas fa-person-hiking', + 'fas_person_military_pointing' : 'fas fa-person-military-pointing', + 'fas_person_military_rifle' : 'fas fa-person-military-rifle', + 'fas_person_military_to_person' : 'fas fa-person-military-to-person', + 'fas_person_praying' : 'fas fa-person-praying', + 'fas_person_pregnant' : 'fas fa-person-pregnant', + 'fas_person_rays' : 'fas fa-person-rays', + 'fas_person_rifle' : 'fas fa-person-rifle', + 'fas_person_running' : 'fas fa-person-running', + 'fas_person_shelter' : 'fas fa-person-shelter', + 'fas_person_skating' : 'fas fa-person-skating', + 'fas_person_skiing_nordic' : 'fas fa-person-skiing-nordic', + 'fas_person_skiing' : 'fas fa-person-skiing', + 'fas_person_snowboarding' : 'fas fa-person-snowboarding', + 'fas_person_swimming' : 'fas fa-person-swimming', + 'fas_person_through_window' : 'fas fa-person-through-window', + 'fas_person_walking_arrow_loop_left' : 'fas fa-person-walking-arrow-loop-left', + 'fas_person_walking_arrow_right' : 'fas fa-person-walking-arrow-right', + 'fas_person_walking_dashed_line_arrow_right' : 'fas fa-person-walking-dashed-line-arrow-right', + 'fas_person_walking_luggage' : 'fas fa-person-walking-luggage', + 'fas_person_walking_with_cane' : 'fas fa-person-walking-with-cane', + 'fas_person_walking' : 'fas fa-person-walking', + 'fas_person' : 'fas fa-person', + 'fas_peseta_sign' : 'fas fa-peseta-sign', + 'fas_peso_sign' : 'fas fa-peso-sign', + 'fas_phone_flip' : 'fas fa-phone-flip', + 'fas_phone_slash' : 'fas fa-phone-slash', + 'fas_phone_volume' : 'fas fa-phone-volume', + 'fas_phone' : 'fas fa-phone', + 'fas_photo_film' : 'fas fa-photo-film', + 'fas_piggy_bank' : 'fas fa-piggy-bank', + 'fas_pills' : 'fas fa-pills', + 'fas_pizza_slice' : 'fas fa-pizza-slice', + 'fas_place_of_worship' : 'fas fa-place-of-worship', + 'fas_plane_arrival' : 'fas fa-plane-arrival', + 'fas_plane_circle_check' : 'fas fa-plane-circle-check', + 'fas_plane_circle_exclamation' : 'fas fa-plane-circle-exclamation', + 'fas_plane_circle_xmark' : 'fas fa-plane-circle-xmark', + 'fas_plane_departure' : 'fas fa-plane-departure', + 'fas_plane_lock' : 'fas fa-plane-lock', + 'fas_plane_slash' : 'fas fa-plane-slash', + 'fas_plane_up' : 'fas fa-plane-up', + 'fas_plane' : 'fas fa-plane', + 'fas_plant_wilt' : 'fas fa-plant-wilt', + 'fas_plate_wheat' : 'fas fa-plate-wheat', + 'fas_play' : 'fas fa-play', + 'fas_plug_circle_bolt' : 'fas fa-plug-circle-bolt', + 'fas_plug_circle_check' : 'fas fa-plug-circle-check', + 'fas_plug_circle_exclamation' : 'fas fa-plug-circle-exclamation', + 'fas_plug_circle_minus' : 'fas fa-plug-circle-minus', + 'fas_plug_circle_plus' : 'fas fa-plug-circle-plus', + 'fas_plug_circle_xmark' : 'fas fa-plug-circle-xmark', + 'fas_plug' : 'fas fa-plug', + 'fas_plus_minus' : 'fas fa-plus-minus', + 'fas_plus' : 'fas fa-plus', + 'fas_podcast' : 'fas fa-podcast', + 'fas_poo_storm' : 'fas fa-poo-storm', + 'fas_poo' : 'fas fa-poo', + 'fas_poop' : 'fas fa-poop', + 'fas_power_off' : 'fas fa-power-off', + 'fas_prescription_bottle_medical' : 'fas fa-prescription-bottle-medical', + 'fas_prescription_bottle' : 'fas fa-prescription-bottle', + 'fas_prescription' : 'fas fa-prescription', + 'fas_print' : 'fas fa-print', + 'fas_pump_medical' : 'fas fa-pump-medical', + 'fas_pump_soap' : 'fas fa-pump-soap', + 'fas_puzzle_piece' : 'fas fa-puzzle-piece', + 'fas_q' : 'fas fa-q', + 'fas_qrcode' : 'fas fa-qrcode', + 'fas_question' : 'fas fa-question', + 'fas_quote_left' : 'fas fa-quote-left', + 'fas_quote_right' : 'fas fa-quote-right', + 'fas_r' : 'fas fa-r', + 'fas_radiation' : 'fas fa-radiation', + 'fas_radio' : 'fas fa-radio', + 'fas_rainbow' : 'fas fa-rainbow', + 'fas_ranking_star' : 'fas fa-ranking-star', + 'fas_receipt' : 'fas fa-receipt', + 'fas_record_vinyl' : 'fas fa-record-vinyl', + 'fas_rectangle_ad' : 'fas fa-rectangle-ad', + 'fas_rectangle_list' : 'fas fa-rectangle-list', + 'fas_rectangle_xmark' : 'fas fa-rectangle-xmark', + 'fas_recycle' : 'fas fa-recycle', + 'fas_registered' : 'fas fa-registered', + 'fas_repeat' : 'fas fa-repeat', + 'fas_reply_all' : 'fas fa-reply-all', + 'fas_reply' : 'fas fa-reply', + 'fas_republican' : 'fas fa-republican', + 'fas_restroom' : 'fas fa-restroom', + 'fas_retweet' : 'fas fa-retweet', + 'fas_ribbon' : 'fas fa-ribbon', + 'fas_right_from_bracket' : 'fas fa-right-from-bracket', + 'fas_right_left' : 'fas fa-right-left', + 'fas_right_long' : 'fas fa-right-long', + 'fas_right_to_bracket' : 'fas fa-right-to-bracket', + 'fas_ring' : 'fas fa-ring', + 'fas_road_barrier' : 'fas fa-road-barrier', + 'fas_road_bridge' : 'fas fa-road-bridge', + 'fas_road_circle_check' : 'fas fa-road-circle-check', + 'fas_road_circle_exclamation' : 'fas fa-road-circle-exclamation', + 'fas_road_circle_xmark' : 'fas fa-road-circle-xmark', + 'fas_road_lock' : 'fas fa-road-lock', + 'fas_road_spikes' : 'fas fa-road-spikes', + 'fas_road' : 'fas fa-road', + 'fas_robot' : 'fas fa-robot', + 'fas_rocket' : 'fas fa-rocket', + 'fas_rotate_left' : 'fas fa-rotate-left', + 'fas_rotate_right' : 'fas fa-rotate-right', + 'fas_rotate' : 'fas fa-rotate', + 'fas_route' : 'fas fa-route', + 'fas_rss' : 'fas fa-rss', + 'fas_ruble_sign' : 'fas fa-ruble-sign', + 'fas_rug' : 'fas fa-rug', + 'fas_ruler_combined' : 'fas fa-ruler-combined', + 'fas_ruler_horizontal' : 'fas fa-ruler-horizontal', + 'fas_ruler_vertical' : 'fas fa-ruler-vertical', + 'fas_ruler' : 'fas fa-ruler', + 'fas_rupee_sign' : 'fas fa-rupee-sign', + 'fas_rupiah_sign' : 'fas fa-rupiah-sign', + 'fas_s' : 'fas fa-s', + 'fas_sack_dollar' : 'fas fa-sack-dollar', + 'fas_sack_xmark' : 'fas fa-sack-xmark', + 'fas_sailboat' : 'fas fa-sailboat', + 'fas_satellite_dish' : 'fas fa-satellite-dish', + 'fas_satellite' : 'fas fa-satellite', + 'fas_scale_balanced' : 'fas fa-scale-balanced', + 'fas_scale_unbalanced_flip' : 'fas fa-scale-unbalanced-flip', + 'fas_scale_unbalanced' : 'fas fa-scale-unbalanced', + 'fas_school_circle_check' : 'fas fa-school-circle-check', + 'fas_school_circle_exclamation' : 'fas fa-school-circle-exclamation', + 'fas_school_circle_xmark' : 'fas fa-school-circle-xmark', + 'fas_school_flag' : 'fas fa-school-flag', + 'fas_school_lock' : 'fas fa-school-lock', + 'fas_school' : 'fas fa-school', + 'fas_scissors' : 'fas fa-scissors', + 'fas_screwdriver_wrench' : 'fas fa-screwdriver-wrench', + 'fas_screwdriver' : 'fas fa-screwdriver', + 'fas_scroll_torah' : 'fas fa-scroll-torah', + 'fas_scroll' : 'fas fa-scroll', + 'fas_sd_card' : 'fas fa-sd-card', + 'fas_section' : 'fas fa-section', + 'fas_seedling' : 'fas fa-seedling', + 'fas_server' : 'fas fa-server', + 'fas_shapes' : 'fas fa-shapes', + 'fas_share_from_square' : 'fas fa-share-from-square', + 'fas_share_nodes' : 'fas fa-share-nodes', + 'fas_share' : 'fas fa-share', + 'fas_sheet_plastic' : 'fas fa-sheet-plastic', + 'fas_shekel_sign' : 'fas fa-shekel-sign', + 'fas_shield_cat' : 'fas fa-shield-cat', + 'fas_shield_dog' : 'fas fa-shield-dog', + 'fas_shield_halved' : 'fas fa-shield-halved', + 'fas_shield_heart' : 'fas fa-shield-heart', + 'fas_shield_virus' : 'fas fa-shield-virus', + 'fas_shield' : 'fas fa-shield', + 'fas_ship' : 'fas fa-ship', + 'fas_shirt' : 'fas fa-shirt', + 'fas_shoe_prints' : 'fas fa-shoe-prints', + 'fas_shop_lock' : 'fas fa-shop-lock', + 'fas_shop_slash' : 'fas fa-shop-slash', + 'fas_shop' : 'fas fa-shop', + 'fas_shower' : 'fas fa-shower', + 'fas_shrimp' : 'fas fa-shrimp', + 'fas_shuffle' : 'fas fa-shuffle', + 'fas_shuttle_space' : 'fas fa-shuttle-space', + 'fas_sign_hanging' : 'fas fa-sign-hanging', + 'fas_signal' : 'fas fa-signal', + 'fas_signature' : 'fas fa-signature', + 'fas_signs_post' : 'fas fa-signs-post', + 'fas_sim_card' : 'fas fa-sim-card', + 'fas_sink' : 'fas fa-sink', + 'fas_sitemap' : 'fas fa-sitemap', + 'fas_skull_crossbones' : 'fas fa-skull-crossbones', + 'fas_skull' : 'fas fa-skull', + 'fas_slash' : 'fas fa-slash', + 'fas_sleigh' : 'fas fa-sleigh', + 'fas_sliders' : 'fas fa-sliders', + 'fas_smog' : 'fas fa-smog', + 'fas_smoking' : 'fas fa-smoking', + 'fas_snowflake' : 'fas fa-snowflake', + 'fas_snowman' : 'fas fa-snowman', + 'fas_snowplow' : 'fas fa-snowplow', + 'fas_soap' : 'fas fa-soap', + 'fas_socks' : 'fas fa-socks', + 'fas_solar_panel' : 'fas fa-solar-panel', + 'fas_sort_down' : 'fas fa-sort-down', + 'fas_sort_up' : 'fas fa-sort-up', + 'fas_sort' : 'fas fa-sort', + 'fas_spa' : 'fas fa-spa', + 'fas_spaghetti_monster_flying' : 'fas fa-spaghetti-monster-flying', + 'fas_spell_check' : 'fas fa-spell-check', + 'fas_spider' : 'fas fa-spider', + 'fas_spinner' : 'fas fa-spinner', + 'fas_splotch' : 'fas fa-splotch', + 'fas_spoon' : 'fas fa-spoon', + 'fas_spray_can_sparkles' : 'fas fa-spray-can-sparkles', + 'fas_spray_can' : 'fas fa-spray-can', + 'fas_square_arrow_up_right' : 'fas fa-square-arrow-up-right', + 'fas_square_caret_down' : 'fas fa-square-caret-down', + 'fas_square_caret_left' : 'fas fa-square-caret-left', + 'fas_square_caret_right' : 'fas fa-square-caret-right', + 'fas_square_caret_up' : 'fas fa-square-caret-up', + 'fas_square_check' : 'fas fa-square-check', + 'fas_square_envelope' : 'fas fa-square-envelope', + 'fas_square_full' : 'fas fa-square-full', + 'fas_square_h' : 'fas fa-square-h', + 'fas_square_minus' : 'fas fa-square-minus', + 'fas_square_nfi' : 'fas fa-square-nfi', + 'fas_square_parking' : 'fas fa-square-parking', + 'fas_square_pen' : 'fas fa-square-pen', + 'fas_square_person_confined' : 'fas fa-square-person-confined', + 'fas_square_phone_flip' : 'fas fa-square-phone-flip', + 'fas_square_phone' : 'fas fa-square-phone', + 'fas_square_plus' : 'fas fa-square-plus', + 'fas_square_poll_horizontal' : 'fas fa-square-poll-horizontal', + 'fas_square_poll_vertical' : 'fas fa-square-poll-vertical', + 'fas_square_root_variable' : 'fas fa-square-root-variable', + 'fas_square_rss' : 'fas fa-square-rss', + 'fas_square_share_nodes' : 'fas fa-square-share-nodes', + 'fas_square_up_right' : 'fas fa-square-up-right', + 'fas_square_virus' : 'fas fa-square-virus', + 'fas_square_xmark' : 'fas fa-square-xmark', + 'fas_square' : 'fas fa-square', + 'fas_staff_snake' : 'fas fa-staff-snake', + 'fas_stairs' : 'fas fa-stairs', + 'fas_stamp' : 'fas fa-stamp', + 'fas_stapler' : 'fas fa-stapler', + 'fas_star_and_crescent' : 'fas fa-star-and-crescent', + 'fas_star_half_stroke' : 'fas fa-star-half-stroke', + 'fas_star_half' : 'fas fa-star-half', + 'fas_star_of_david' : 'fas fa-star-of-david', + 'fas_star_of_life' : 'fas fa-star-of-life', + 'fas_star' : 'fas fa-star', + 'fas_sterling_sign' : 'fas fa-sterling-sign', + 'fas_stethoscope' : 'fas fa-stethoscope', + 'fas_stop' : 'fas fa-stop', + 'fas_stopwatch_20' : 'fas fa-stopwatch-20', + 'fas_stopwatch' : 'fas fa-stopwatch', + 'fas_store_slash' : 'fas fa-store-slash', + 'fas_store' : 'fas fa-store', + 'fas_street_view' : 'fas fa-street-view', + 'fas_strikethrough' : 'fas fa-strikethrough', + 'fas_stroopwafel' : 'fas fa-stroopwafel', + 'fas_subscript' : 'fas fa-subscript', + 'fas_suitcase_medical' : 'fas fa-suitcase-medical', + 'fas_suitcase_rolling' : 'fas fa-suitcase-rolling', + 'fas_suitcase' : 'fas fa-suitcase', + 'fas_sun_plant_wilt' : 'fas fa-sun-plant-wilt', + 'fas_sun' : 'fas fa-sun', + 'fas_superscript' : 'fas fa-superscript', + 'fas_swatchbook' : 'fas fa-swatchbook', + 'fas_synagogue' : 'fas fa-synagogue', + 'fas_syringe' : 'fas fa-syringe', + 'fas_t' : 'fas fa-t', + 'fas_table_cells_column_lock' : 'fas fa-table-cells-column-lock', + 'fas_table_cells_large' : 'fas fa-table-cells-large', + 'fas_table_cells_row_lock' : 'fas fa-table-cells-row-lock', + 'fas_table_cells' : 'fas fa-table-cells', + 'fas_table_columns' : 'fas fa-table-columns', + 'fas_table_list' : 'fas fa-table-list', + 'fas_table_tennis_paddle_ball' : 'fas fa-table-tennis-paddle-ball', + 'fas_table' : 'fas fa-table', + 'fas_tablet_button' : 'fas fa-tablet-button', + 'fas_tablet_screen_button' : 'fas fa-tablet-screen-button', + 'fas_tablet' : 'fas fa-tablet', + 'fas_tablets' : 'fas fa-tablets', + 'fas_tachograph_digital' : 'fas fa-tachograph-digital', + 'fas_tag' : 'fas fa-tag', + 'fas_tags' : 'fas fa-tags', + 'fas_tape' : 'fas fa-tape', + 'fas_tarp_droplet' : 'fas fa-tarp-droplet', + 'fas_tarp' : 'fas fa-tarp', + 'fas_taxi' : 'fas fa-taxi', + 'fas_teeth_open' : 'fas fa-teeth-open', + 'fas_teeth' : 'fas fa-teeth', + 'fas_temperature_arrow_down' : 'fas fa-temperature-arrow-down', + 'fas_temperature_arrow_up' : 'fas fa-temperature-arrow-up', + 'fas_temperature_empty' : 'fas fa-temperature-empty', + 'fas_temperature_full' : 'fas fa-temperature-full', + 'fas_temperature_half' : 'fas fa-temperature-half', + 'fas_temperature_high' : 'fas fa-temperature-high', + 'fas_temperature_low' : 'fas fa-temperature-low', + 'fas_temperature_quarter' : 'fas fa-temperature-quarter', + 'fas_temperature_three_quarters' : 'fas fa-temperature-three-quarters', + 'fas_tenge_sign' : 'fas fa-tenge-sign', + 'fas_tent_arrow_down_to_line' : 'fas fa-tent-arrow-down-to-line', + 'fas_tent_arrow_left_right' : 'fas fa-tent-arrow-left-right', + 'fas_tent_arrow_turn_left' : 'fas fa-tent-arrow-turn-left', + 'fas_tent_arrows_down' : 'fas fa-tent-arrows-down', + 'fas_tent' : 'fas fa-tent', + 'fas_tents' : 'fas fa-tents', + 'fas_terminal' : 'fas fa-terminal', + 'fas_text_height' : 'fas fa-text-height', + 'fas_text_slash' : 'fas fa-text-slash', + 'fas_text_width' : 'fas fa-text-width', + 'fas_thermometer' : 'fas fa-thermometer', + 'fas_thumbs_down' : 'fas fa-thumbs-down', + 'fas_thumbs_up' : 'fas fa-thumbs-up', + 'fas_thumbtack' : 'fas fa-thumbtack', + 'fas_ticket_simple' : 'fas fa-ticket-simple', + 'fas_ticket' : 'fas fa-ticket', + 'fas_timeline' : 'fas fa-timeline', + 'fas_toggle_off' : 'fas fa-toggle-off', + 'fas_toggle_on' : 'fas fa-toggle-on', + 'fas_toilet_paper_slash' : 'fas fa-toilet-paper-slash', + 'fas_toilet_paper' : 'fas fa-toilet-paper', + 'fas_toilet_portable' : 'fas fa-toilet-portable', + 'fas_toilet' : 'fas fa-toilet', + 'fas_toilets_portable' : 'fas fa-toilets-portable', + 'fas_toolbox' : 'fas fa-toolbox', + 'fas_tooth' : 'fas fa-tooth', + 'fas_torii_gate' : 'fas fa-torii-gate', + 'fas_tornado' : 'fas fa-tornado', + 'fas_tower_broadcast' : 'fas fa-tower-broadcast', + 'fas_tower_cell' : 'fas fa-tower-cell', + 'fas_tower_observation' : 'fas fa-tower-observation', + 'fas_tractor' : 'fas fa-tractor', + 'fas_trademark' : 'fas fa-trademark', + 'fas_traffic_light' : 'fas fa-traffic-light', + 'fas_trailer' : 'fas fa-trailer', + 'fas_train_subway' : 'fas fa-train-subway', + 'fas_train_tram' : 'fas fa-train-tram', + 'fas_train' : 'fas fa-train', + 'fas_transgender' : 'fas fa-transgender', + 'fas_trash_arrow_up' : 'fas fa-trash-arrow-up', + 'fas_trash_can_arrow_up' : 'fas fa-trash-can-arrow-up', + 'fas_trash_can' : 'fas fa-trash-can', + 'fas_trash' : 'fas fa-trash', + 'fas_tree_city' : 'fas fa-tree-city', + 'fas_tree' : 'fas fa-tree', + 'fas_triangle_exclamation' : 'fas fa-triangle-exclamation', + 'fas_trophy' : 'fas fa-trophy', + 'fas_trowel_bricks' : 'fas fa-trowel-bricks', + 'fas_trowel' : 'fas fa-trowel', + 'fas_truck_arrow_right' : 'fas fa-truck-arrow-right', + 'fas_truck_droplet' : 'fas fa-truck-droplet', + 'fas_truck_fast' : 'fas fa-truck-fast', + 'fas_truck_field_un' : 'fas fa-truck-field-un', + 'fas_truck_field' : 'fas fa-truck-field', + 'fas_truck_front' : 'fas fa-truck-front', + 'fas_truck_medical' : 'fas fa-truck-medical', + 'fas_truck_monster' : 'fas fa-truck-monster', + 'fas_truck_moving' : 'fas fa-truck-moving', + 'fas_truck_pickup' : 'fas fa-truck-pickup', + 'fas_truck_plane' : 'fas fa-truck-plane', + 'fas_truck_ramp_box' : 'fas fa-truck-ramp-box', + 'fas_truck' : 'fas fa-truck', + 'fas_tty' : 'fas fa-tty', + 'fas_turkish_lira_sign' : 'fas fa-turkish-lira-sign', + 'fas_turn_down' : 'fas fa-turn-down', + 'fas_turn_up' : 'fas fa-turn-up', + 'fas_tv' : 'fas fa-tv', + 'fas_u' : 'fas fa-u', + 'fas_umbrella_beach' : 'fas fa-umbrella-beach', + 'fas_umbrella' : 'fas fa-umbrella', + 'fas_underline' : 'fas fa-underline', + 'fas_universal_access' : 'fas fa-universal-access', + 'fas_unlock_keyhole' : 'fas fa-unlock-keyhole', + 'fas_unlock' : 'fas fa-unlock', + 'fas_up_down_left_right' : 'fas fa-up-down-left-right', + 'fas_up_down' : 'fas fa-up-down', + 'fas_up_long' : 'fas fa-up-long', + 'fas_up_right_and_down_left_from_center' : 'fas fa-up-right-and-down-left-from-center', + 'fas_up_right_from_square' : 'fas fa-up-right-from-square', + 'fas_upload' : 'fas fa-upload', + 'fas_user_astronaut' : 'fas fa-user-astronaut', + 'fas_user_check' : 'fas fa-user-check', + 'fas_user_clock' : 'fas fa-user-clock', + 'fas_user_doctor' : 'fas fa-user-doctor', + 'fas_user_gear' : 'fas fa-user-gear', + 'fas_user_graduate' : 'fas fa-user-graduate', + 'fas_user_group' : 'fas fa-user-group', + 'fas_user_injured' : 'fas fa-user-injured', + 'fas_user_large_slash' : 'fas fa-user-large-slash', + 'fas_user_large' : 'fas fa-user-large', + 'fas_user_lock' : 'fas fa-user-lock', + 'fas_user_minus' : 'fas fa-user-minus', + 'fas_user_ninja' : 'fas fa-user-ninja', + 'fas_user_nurse' : 'fas fa-user-nurse', + 'fas_user_pen' : 'fas fa-user-pen', + 'fas_user_plus' : 'fas fa-user-plus', + 'fas_user_secret' : 'fas fa-user-secret', + 'fas_user_shield' : 'fas fa-user-shield', + 'fas_user_slash' : 'fas fa-user-slash', + 'fas_user_tag' : 'fas fa-user-tag', + 'fas_user_tie' : 'fas fa-user-tie', + 'fas_user_xmark' : 'fas fa-user-xmark', + 'fas_user' : 'fas fa-user', + 'fas_users_between_lines' : 'fas fa-users-between-lines', + 'fas_users_gear' : 'fas fa-users-gear', + 'fas_users_line' : 'fas fa-users-line', + 'fas_users_rays' : 'fas fa-users-rays', + 'fas_users_rectangle' : 'fas fa-users-rectangle', + 'fas_users_slash' : 'fas fa-users-slash', + 'fas_users_viewfinder' : 'fas fa-users-viewfinder', + 'fas_users' : 'fas fa-users', + 'fas_utensils' : 'fas fa-utensils', + 'fas_v' : 'fas fa-v', + 'fas_van_shuttle' : 'fas fa-van-shuttle', + 'fas_vault' : 'fas fa-vault', + 'fas_vector_square' : 'fas fa-vector-square', + 'fas_venus_double' : 'fas fa-venus-double', + 'fas_venus_mars' : 'fas fa-venus-mars', + 'fas_venus' : 'fas fa-venus', + 'fas_vest_patches' : 'fas fa-vest-patches', + 'fas_vest' : 'fas fa-vest', + 'fas_vial_circle_check' : 'fas fa-vial-circle-check', + 'fas_vial_virus' : 'fas fa-vial-virus', + 'fas_vial' : 'fas fa-vial', + 'fas_vials' : 'fas fa-vials', + 'fas_video_slash' : 'fas fa-video-slash', + 'fas_video' : 'fas fa-video', + 'fas_vihara' : 'fas fa-vihara', + 'fas_virus_covid_slash' : 'fas fa-virus-covid-slash', + 'fas_virus_covid' : 'fas fa-virus-covid', + 'fas_virus_slash' : 'fas fa-virus-slash', + 'fas_virus' : 'fas fa-virus', + 'fas_viruses' : 'fas fa-viruses', + 'fas_voicemail' : 'fas fa-voicemail', + 'fas_volcano' : 'fas fa-volcano', + 'fas_volleyball' : 'fas fa-volleyball', + 'fas_volume_high' : 'fas fa-volume-high', + 'fas_volume_low' : 'fas fa-volume-low', + 'fas_volume_off' : 'fas fa-volume-off', + 'fas_volume_xmark' : 'fas fa-volume-xmark', + 'fas_vr_cardboard' : 'fas fa-vr-cardboard', + 'fas_w' : 'fas fa-w', + 'fas_walkie_talkie' : 'fas fa-walkie-talkie', + 'fas_wallet' : 'fas fa-wallet', + 'fas_wand_magic_sparkles' : 'fas fa-wand-magic-sparkles', + 'fas_wand_magic' : 'fas fa-wand-magic', + 'fas_wand_sparkles' : 'fas fa-wand-sparkles', + 'fas_warehouse' : 'fas fa-warehouse', + 'fas_water_ladder' : 'fas fa-water-ladder', + 'fas_water' : 'fas fa-water', + 'fas_wave_square' : 'fas fa-wave-square', + 'fas_weight_hanging' : 'fas fa-weight-hanging', + 'fas_weight_scale' : 'fas fa-weight-scale', + 'fas_wheat_awn_circle_exclamation' : 'fas fa-wheat-awn-circle-exclamation', + 'fas_wheat_awn' : 'fas fa-wheat-awn', + 'fas_wheelchair_move' : 'fas fa-wheelchair-move', + 'fas_wheelchair' : 'fas fa-wheelchair', + 'fas_whiskey_glass' : 'fas fa-whiskey-glass', + 'fas_wifi' : 'fas fa-wifi', + 'fas_wind' : 'fas fa-wind', + 'fas_window_maximize' : 'fas fa-window-maximize', + 'fas_window_minimize' : 'fas fa-window-minimize', + 'fas_window_restore' : 'fas fa-window-restore', + 'fas_wine_bottle' : 'fas fa-wine-bottle', + 'fas_wine_glass_empty' : 'fas fa-wine-glass-empty', + 'fas_wine_glass' : 'fas fa-wine-glass', + 'fas_won_sign' : 'fas fa-won-sign', + 'fas_worm' : 'fas fa-worm', + 'fas_wrench' : 'fas fa-wrench', + 'fas_x_ray' : 'fas fa-x-ray', + 'fas_x' : 'fas fa-x', + 'fas_xmark' : 'fas fa-xmark', + 'fas_xmarks_lines' : 'fas fa-xmarks-lines', + 'fas_y' : 'fas fa-y', + 'fas_yen_sign' : 'fas fa-yen-sign', + 'fas_yin_yang' : 'fas fa-yin-yang', + 'fas_z' : 'fas fa-z', + + //FONT-AWESOME REGULAR + 'far_address_book' : 'far fa-address-book', + 'far_address_card' : 'far fa-address-card', + 'far_bell_slash' : 'far fa-bell-slash', + 'far_bell' : 'far fa-bell', + 'far_bookmark' : 'far fa-bookmark', + 'far_building' : 'far fa-building', + 'far_calendar_check' : 'far fa-calendar-check', + 'far_calendar_days' : 'far fa-calendar-days', + 'far_calendar_minus' : 'far fa-calendar-minus', + 'far_calendar_plus' : 'far fa-calendar-plus', + 'far_calendar_xmark' : 'far fa-calendar-xmark', + 'far_calendar' : 'far fa-calendar', + 'far_chart_bar' : 'far fa-chart-bar', + 'far_chess_bishop' : 'far fa-chess-bishop', + 'far_chess_king' : 'far fa-chess-king', + 'far_chess_knight' : 'far fa-chess-knight', + 'far_chess_pawn' : 'far fa-chess-pawn', + 'far_chess_queen' : 'far fa-chess-queen', + 'far_chess_rook' : 'far fa-chess-rook', + 'far_circle_check' : 'far fa-circle-check', + 'far_circle_dot' : 'far fa-circle-dot', + 'far_circle_down' : 'far fa-circle-down', + 'far_circle_left' : 'far fa-circle-left', + 'far_circle_pause' : 'far fa-circle-pause', + 'far_circle_play' : 'far fa-circle-play', + 'far_circle_question' : 'far fa-circle-question', + 'far_circle_right' : 'far fa-circle-right', + 'far_circle_stop' : 'far fa-circle-stop', + 'far_circle_up' : 'far fa-circle-up', + 'far_circle_user' : 'far fa-circle-user', + 'far_circle_xmark' : 'far fa-circle-xmark', + 'far_circle' : 'far fa-circle', + 'far_clipboard' : 'far fa-clipboard', + 'far_clock' : 'far fa-clock', + 'far_clone' : 'far fa-clone', + 'far_closed_captioning' : 'far fa-closed-captioning', + 'far_comment_dots' : 'far fa-comment-dots', + 'far_comment' : 'far fa-comment', + 'far_comments' : 'far fa-comments', + 'far_compass' : 'far fa-compass', + 'far_copy' : 'far fa-copy', + 'far_copyright' : 'far fa-copyright', + 'far_credit_card' : 'far fa-credit-card', + 'far_envelope_open' : 'far fa-envelope-open', + 'far_envelope' : 'far fa-envelope', + 'far_eye_slash' : 'far fa-eye-slash', + 'far_eye' : 'far fa-eye', + 'far_face_angry' : 'far fa-face-angry', + 'far_face_dizzy' : 'far fa-face-dizzy', + 'far_face_flushed' : 'far fa-face-flushed', + 'far_face_frown_open' : 'far fa-face-frown-open', + 'far_face_frown' : 'far fa-face-frown', + 'far_face_grimace' : 'far fa-face-grimace', + 'far_face_grin_beam_sweat' : 'far fa-face-grin-beam-sweat', + 'far_face_grin_beam' : 'far fa-face-grin-beam', + 'far_face_grin_hearts' : 'far fa-face-grin-hearts', + 'far_face_grin_squint_tears' : 'far fa-face-grin-squint-tears', + 'far_face_grin_squint' : 'far fa-face-grin-squint', + 'far_face_grin_stars' : 'far fa-face-grin-stars', + 'far_face_grin_tears' : 'far fa-face-grin-tears', + 'far_face_grin_tongue_squint' : 'far fa-face-grin-tongue-squint', + 'far_face_grin_tongue_wink' : 'far fa-face-grin-tongue-wink', + 'far_face_grin_tongue' : 'far fa-face-grin-tongue', + 'far_face_grin_wide' : 'far fa-face-grin-wide', + 'far_face_grin_wink' : 'far fa-face-grin-wink', + 'far_face_grin' : 'far fa-face-grin', + 'far_face_kiss_beam' : 'far fa-face-kiss-beam', + 'far_face_kiss_wink_heart' : 'far fa-face-kiss-wink-heart', + 'far_face_kiss' : 'far fa-face-kiss', + 'far_face_laugh_beam' : 'far fa-face-laugh-beam', + 'far_face_laugh_squint' : 'far fa-face-laugh-squint', + 'far_face_laugh_wink' : 'far fa-face-laugh-wink', + 'far_face_laugh' : 'far fa-face-laugh', + 'far_face_meh_blank' : 'far fa-face-meh-blank', + 'far_face_meh' : 'far fa-face-meh', + 'far_face_rolling_eyes' : 'far fa-face-rolling-eyes', + 'far_face_sad_cry' : 'far fa-face-sad-cry', + 'far_face_sad_tear' : 'far fa-face-sad-tear', + 'far_face_smile_beam' : 'far fa-face-smile-beam', + 'far_face_smile_wink' : 'far fa-face-smile-wink', + 'far_face_smile' : 'far fa-face-smile', + 'far_face_surprise' : 'far fa-face-surprise', + 'far_face_tired' : 'far fa-face-tired', + 'far_file_audio' : 'far fa-file-audio', + 'far_file_code' : 'far fa-file-code', + 'far_file_excel' : 'far fa-file-excel', + 'far_file_image' : 'far fa-file-image', + 'far_file_lines' : 'far fa-file-lines', + 'far_file_pdf' : 'far fa-file-pdf', + 'far_file_powerpoint' : 'far fa-file-powerpoint', + 'far_file_video' : 'far fa-file-video', + 'far_file_word' : 'far fa-file-word', + 'far_file_zipper' : 'far fa-file-zipper', + 'far_file' : 'far fa-file', + 'far_flag' : 'far fa-flag', + 'far_floppy_disk' : 'far fa-floppy-disk', + 'far_folder_closed' : 'far fa-folder-closed', + 'far_folder_open' : 'far fa-folder-open', + 'far_folder' : 'far fa-folder', + 'far_font_awesome' : 'far fa-font-awesome', + 'far_futbol' : 'far fa-futbol', + 'far_gem' : 'far fa-gem', + 'far_hand_back_fist' : 'far fa-hand-back-fist', + 'far_hand_lizard' : 'far fa-hand-lizard', + 'far_hand_peace' : 'far fa-hand-peace', + 'far_hand_point_down' : 'far fa-hand-point-down', + 'far_hand_point_left' : 'far fa-hand-point-left', + 'far_hand_point_right' : 'far fa-hand-point-right', + 'far_hand_point_up' : 'far fa-hand-point-up', + 'far_hand_pointer' : 'far fa-hand-pointer', + 'far_hand_scissors' : 'far fa-hand-scissors', + 'far_hand_spock' : 'far fa-hand-spock', + 'far_hand' : 'far fa-hand', + 'far_handshake' : 'far fa-handshake', + 'far_hard_drive' : 'far fa-hard-drive', + 'far_heart' : 'far fa-heart', + 'far_hospital' : 'far fa-hospital', + 'far_hourglass_half' : 'far fa-hourglass-half', + 'far_hourglass' : 'far fa-hourglass', + 'far_id_badge' : 'far fa-id-badge', + 'far_id_card' : 'far fa-id-card', + 'far_image' : 'far fa-image', + 'far_images' : 'far fa-images', + 'far_keyboard' : 'far fa-keyboard', + 'far_lemon' : 'far fa-lemon', + 'far_life_ring' : 'far fa-life-ring', + 'far_lightbulb' : 'far fa-lightbulb', + 'far_map' : 'far fa-map', + 'far_message' : 'far fa-message', + 'far_money_bill_1' : 'far fa-money-bill-1', + 'far_moon' : 'far fa-moon', + 'far_newspaper' : 'far fa-newspaper', + 'far_note_sticky' : 'far fa-note-sticky', + 'far_object_group' : 'far fa-object-group', + 'far_object_ungroup' : 'far fa-object-ungroup', + 'far_paper_plane' : 'far fa-paper-plane', + 'far_paste' : 'far fa-paste', + 'far_pen_to_square' : 'far fa-pen-to-square', + 'far_rectangle_list' : 'far fa-rectangle-list', + 'far_rectangle_xmark' : 'far fa-rectangle-xmark', + 'far_registered' : 'far fa-registered', + 'far_share_from_square' : 'far fa-share-from-square', + 'far_snowflake' : 'far fa-snowflake', + 'far_square_caret_down' : 'far fa-square-caret-down', + 'far_square_caret_left' : 'far fa-square-caret-left', + 'far_square_caret_right' : 'far fa-square-caret-right', + 'far_square_caret_up' : 'far fa-square-caret-up', + 'far_square_check' : 'far fa-square-check', + 'far_square_full' : 'far fa-square-full', + 'far_square_minus' : 'far fa-square-minus', + 'far_square_plus' : 'far fa-square-plus', + 'far_square' : 'far fa-square', + 'far_star_half_stroke' : 'far fa-star-half-stroke', + 'far_star_half' : 'far fa-star-half', + 'far_star' : 'far fa-star', + 'far_sun' : 'far fa-sun', + 'far_thumbs_down' : 'far fa-thumbs-down', + 'far_thumbs_up' : 'far fa-thumbs-up', + 'far_trash_can' : 'far fa-trash-can', + 'far_user' : 'far fa-user', + 'far_window_maximize' : 'far fa-window-maximize', + 'far_window_minimize' : 'far fa-window-minimize', + 'far_window_restore' : 'far fa-window-restore', + + //FONT-AWESOME BRANDS + 'fab_42_group' : 'fab fa-42-group', + 'fab_500px' : 'fab fa-500px', + 'fab_accessible_icon' : 'fab fa-accessible-icon', + 'fab_accusoft' : 'fab fa-accusoft', + 'fab_adn' : 'fab fa-adn', + 'fab_adversal' : 'fab fa-adversal', + 'fab_affiliatetheme' : 'fab fa-affiliatetheme', + 'fab_airbnb' : 'fab fa-airbnb', + 'fab_algolia' : 'fab fa-algolia', + 'fab_alipay' : 'fab fa-alipay', + 'fab_amazon_pay' : 'fab fa-amazon-pay', + 'fab_amazon' : 'fab fa-amazon', + 'fab_amilia' : 'fab fa-amilia', + 'fab_android' : 'fab fa-android', + 'fab_angellist' : 'fab fa-angellist', + 'fab_angrycreative' : 'fab fa-angrycreative', + 'fab_angular' : 'fab fa-angular', + 'fab_app_store_ios' : 'fab fa-app-store-ios', + 'fab_app_store' : 'fab fa-app-store', + 'fab_apper' : 'fab fa-apper', + 'fab_apple_pay' : 'fab fa-apple-pay', + 'fab_apple' : 'fab fa-apple', + 'fab_artstation' : 'fab fa-artstation', + 'fab_asymmetrik' : 'fab fa-asymmetrik', + 'fab_atlassian' : 'fab fa-atlassian', + 'fab_audible' : 'fab fa-audible', + 'fab_autoprefixer' : 'fab fa-autoprefixer', + 'fab_avianex' : 'fab fa-avianex', + 'fab_aviato' : 'fab fa-aviato', + 'fab_aws' : 'fab fa-aws', + 'fab_bandcamp' : 'fab fa-bandcamp', + 'fab_battle_net' : 'fab fa-battle-net', + 'fab_behance' : 'fab fa-behance', + 'fab_bilibili' : 'fab fa-bilibili', + 'fab_bimobject' : 'fab fa-bimobject', + 'fab_bitbucket' : 'fab fa-bitbucket', + 'fab_bitcoin' : 'fab fa-bitcoin', + 'fab_bity' : 'fab fa-bity', + 'fab_black_tie' : 'fab fa-black-tie', + 'fab_blackberry' : 'fab fa-blackberry', + 'fab_blogger_b' : 'fab fa-blogger-b', + 'fab_blogger' : 'fab fa-blogger', + 'fab_bluesky' : 'fab fa-bluesky', + 'fab_bluetooth_b' : 'fab fa-bluetooth-b', + 'fab_bluetooth' : 'fab fa-bluetooth', + 'fab_bootstrap' : 'fab fa-bootstrap', + 'fab_bots' : 'fab fa-bots', + 'fab_brave_reverse' : 'fab fa-brave-reverse', + 'fab_brave' : 'fab fa-brave', + 'fab_btc' : 'fab fa-btc', + 'fab_buffer' : 'fab fa-buffer', + 'fab_buromobelexperte' : 'fab fa-buromobelexperte', + 'fab_buy_n_large' : 'fab fa-buy-n-large', + 'fab_buysellads' : 'fab fa-buysellads', + 'fab_canadian_maple_leaf' : 'fab fa-canadian-maple-leaf', + 'fab_cc_amazon_pay' : 'fab fa-cc-amazon-pay', + 'fab_cc_amex' : 'fab fa-cc-amex', + 'fab_cc_apple_pay' : 'fab fa-cc-apple-pay', + 'fab_cc_diners_club' : 'fab fa-cc-diners-club', + 'fab_cc_discover' : 'fab fa-cc-discover', + 'fab_cc_jcb' : 'fab fa-cc-jcb', + 'fab_cc_mastercard' : 'fab fa-cc-mastercard', + 'fab_cc_paypal' : 'fab fa-cc-paypal', + 'fab_cc_stripe' : 'fab fa-cc-stripe', + 'fab_cc_visa' : 'fab fa-cc-visa', + 'fab_centercode' : 'fab fa-centercode', + 'fab_centos' : 'fab fa-centos', + 'fab_chrome' : 'fab fa-chrome', + 'fab_chromecast' : 'fab fa-chromecast', + 'fab_cloudflare' : 'fab fa-cloudflare', + 'fab_cloudscale' : 'fab fa-cloudscale', + 'fab_cloudsmith' : 'fab fa-cloudsmith', + 'fab_cloudversify' : 'fab fa-cloudversify', + 'fab_cmplid' : 'fab fa-cmplid', + 'fab_codepen' : 'fab fa-codepen', + 'fab_codiepie' : 'fab fa-codiepie', + 'fab_confluence' : 'fab fa-confluence', + 'fab_connectdevelop' : 'fab fa-connectdevelop', + 'fab_contao' : 'fab fa-contao', + 'fab_cotton_bureau' : 'fab fa-cotton-bureau', + 'fab_cpanel' : 'fab fa-cpanel', + 'fab_creative_commons_by' : 'fab fa-creative-commons-by', + 'fab_creative_commons_nc_eu' : 'fab fa-creative-commons-nc-eu', + 'fab_creative_commons_nc_jp' : 'fab fa-creative-commons-nc-jp', + 'fab_creative_commons_nc' : 'fab fa-creative-commons-nc', + 'fab_creative_commons_nd' : 'fab fa-creative-commons-nd', + 'fab_creative_commons_pd_alt' : 'fab fa-creative-commons-pd-alt', + 'fab_creative_commons_pd' : 'fab fa-creative-commons-pd', + 'fab_creative_commons_remix' : 'fab fa-creative-commons-remix', + 'fab_creative_commons_sa' : 'fab fa-creative-commons-sa', + 'fab_creative_commons_sampling_plus' : 'fab fa-creative-commons-sampling-plus', + 'fab_creative_commons_sampling' : 'fab fa-creative-commons-sampling', + 'fab_creative_commons_share' : 'fab fa-creative-commons-share', + 'fab_creative_commons_zero' : 'fab fa-creative-commons-zero', + 'fab_creative_commons' : 'fab fa-creative-commons', + 'fab_critical_role' : 'fab fa-critical-role', + 'fab_css3_alt' : 'fab fa-css3-alt', + 'fab_css3' : 'fab fa-css3', + 'fab_cuttlefish' : 'fab fa-cuttlefish', + 'fab_d_and_d_beyond' : 'fab fa-d-and-d-beyond', + 'fab_d_and_d' : 'fab fa-d-and-d', + 'fab_dailymotion' : 'fab fa-dailymotion', + 'fab_dashcube' : 'fab fa-dashcube', + 'fab_debian' : 'fab fa-debian', + 'fab_deezer' : 'fab fa-deezer', + 'fab_delicious' : 'fab fa-delicious', + 'fab_deploydog' : 'fab fa-deploydog', + 'fab_deskpro' : 'fab fa-deskpro', + 'fab_dev' : 'fab fa-dev', + 'fab_deviantart' : 'fab fa-deviantart', + 'fab_dhl' : 'fab fa-dhl', + 'fab_diaspora' : 'fab fa-diaspora', + 'fab_digg' : 'fab fa-digg', + 'fab_digital_ocean' : 'fab fa-digital-ocean', + 'fab_discord' : 'fab fa-discord', + 'fab_discourse' : 'fab fa-discourse', + 'fab_dochub' : 'fab fa-dochub', + 'fab_docker' : 'fab fa-docker', + 'fab_draft2digital' : 'fab fa-draft2digital', + 'fab_dribbble' : 'fab fa-dribbble', + 'fab_dropbox' : 'fab fa-dropbox', + 'fab_drupal' : 'fab fa-drupal', + 'fab_dyalog' : 'fab fa-dyalog', + 'fab_earlybirds' : 'fab fa-earlybirds', + 'fab_ebay' : 'fab fa-ebay', + 'fab_edge_legacy' : 'fab fa-edge-legacy', + 'fab_edge' : 'fab fa-edge', + 'fab_elementor' : 'fab fa-elementor', + 'fab_ello' : 'fab fa-ello', + 'fab_ember' : 'fab fa-ember', + 'fab_empire' : 'fab fa-empire', + 'fab_envira' : 'fab fa-envira', + 'fab_erlang' : 'fab fa-erlang', + 'fab_ethereum' : 'fab fa-ethereum', + 'fab_etsy' : 'fab fa-etsy', + 'fab_evernote' : 'fab fa-evernote', + 'fab_expeditedssl' : 'fab fa-expeditedssl', + 'fab_facebook_f' : 'fab fa-facebook-f', + 'fab_facebook_messenger' : 'fab fa-facebook-messenger', + 'fab_facebook' : 'fab fa-facebook', + 'fab_fantasy_flight_games' : 'fab fa-fantasy-flight-games', + 'fab_fedex' : 'fab fa-fedex', + 'fab_fedora' : 'fab fa-fedora', + 'fab_figma' : 'fab fa-figma', + 'fab_firefox_browser' : 'fab fa-firefox-browser', + 'fab_firefox' : 'fab fa-firefox', + 'fab_first_order_alt' : 'fab fa-first-order-alt', + 'fab_first_order' : 'fab fa-first-order', + 'fab_firstdraft' : 'fab fa-firstdraft', + 'fab_flickr' : 'fab fa-flickr', + 'fab_flipboard' : 'fab fa-flipboard', + 'fab_fly' : 'fab fa-fly', + 'fab_font_awesome' : 'fab fa-font-awesome', + 'fab_fonticons_fi' : 'fab fa-fonticons-fi', + 'fab_fonticons' : 'fab fa-fonticons', + 'fab_fort_awesome_alt' : 'fab fa-fort-awesome-alt', + 'fab_fort_awesome' : 'fab fa-fort-awesome', + 'fab_forumbee' : 'fab fa-forumbee', + 'fab_foursquare' : 'fab fa-foursquare', + 'fab_free_code_camp' : 'fab fa-free-code-camp', + 'fab_freebsd' : 'fab fa-freebsd', + 'fab_fulcrum' : 'fab fa-fulcrum', + 'fab_galactic_republic' : 'fab fa-galactic-republic', + 'fab_galactic_senate' : 'fab fa-galactic-senate', + 'fab_get_pocket' : 'fab fa-get-pocket', + 'fab_gg_circle' : 'fab fa-gg-circle', + 'fab_gg' : 'fab fa-gg', + 'fab_git_alt' : 'fab fa-git-alt', + 'fab_git' : 'fab fa-git', + 'fab_github_alt' : 'fab fa-github-alt', + 'fab_github' : 'fab fa-github', + 'fab_gitkraken' : 'fab fa-gitkraken', + 'fab_gitlab' : 'fab fa-gitlab', + 'fab_gitter' : 'fab fa-gitter', + 'fab_glide_g' : 'fab fa-glide-g', + 'fab_glide' : 'fab fa-glide', + 'fab_gofore' : 'fab fa-gofore', + 'fab_golang' : 'fab fa-golang', + 'fab_goodreads_g' : 'fab fa-goodreads-g', + 'fab_goodreads' : 'fab fa-goodreads', + 'fab_google_drive' : 'fab fa-google-drive', + 'fab_google_pay' : 'fab fa-google-pay', + 'fab_google_play' : 'fab fa-google-play', + 'fab_google_plus_g' : 'fab fa-google-plus-g', + 'fab_google_plus' : 'fab fa-google-plus', + 'fab_google_scholar' : 'fab fa-google-scholar', + 'fab_google_wallet' : 'fab fa-google-wallet', + 'fab_google' : 'fab fa-google', + 'fab_gratipay' : 'fab fa-gratipay', + 'fab_grav' : 'fab fa-grav', + 'fab_gripfire' : 'fab fa-gripfire', + 'fab_grunt' : 'fab fa-grunt', + 'fab_guilded' : 'fab fa-guilded', + 'fab_gulp' : 'fab fa-gulp', + 'fab_hacker_news' : 'fab fa-hacker-news', + 'fab_hackerrank' : 'fab fa-hackerrank', + 'fab_hashnode' : 'fab fa-hashnode', + 'fab_hips' : 'fab fa-hips', + 'fab_hire_a_helper' : 'fab fa-hire-a-helper', + 'fab_hive' : 'fab fa-hive', + 'fab_hooli' : 'fab fa-hooli', + 'fab_hornbill' : 'fab fa-hornbill', + 'fab_hotjar' : 'fab fa-hotjar', + 'fab_houzz' : 'fab fa-houzz', + 'fab_html5' : 'fab fa-html5', + 'fab_hubspot' : 'fab fa-hubspot', + 'fab_ideal' : 'fab fa-ideal', + 'fab_imdb' : 'fab fa-imdb', + 'fab_instagram' : 'fab fa-instagram', + 'fab_instalod' : 'fab fa-instalod', + 'fab_intercom' : 'fab fa-intercom', + 'fab_internet_explorer' : 'fab fa-internet-explorer', + 'fab_invision' : 'fab fa-invision', + 'fab_ioxhost' : 'fab fa-ioxhost', + 'fab_itch_io' : 'fab fa-itch-io', + 'fab_itunes_note' : 'fab fa-itunes-note', + 'fab_itunes' : 'fab fa-itunes', + 'fab_java' : 'fab fa-java', + 'fab_jedi_order' : 'fab fa-jedi-order', + 'fab_jenkins' : 'fab fa-jenkins', + 'fab_jira' : 'fab fa-jira', + 'fab_joget' : 'fab fa-joget', + 'fab_joomla' : 'fab fa-joomla', + 'fab_js' : 'fab fa-js', + 'fab_jsfiddle' : 'fab fa-jsfiddle', + 'fab_jxl' : 'fab fa-jxl', + 'fab_kaggle' : 'fab fa-kaggle', + 'fab_keybase' : 'fab fa-keybase', + 'fab_keycdn' : 'fab fa-keycdn', + 'fab_kickstarter_k' : 'fab fa-kickstarter-k', + 'fab_kickstarter' : 'fab fa-kickstarter', + 'fab_korvue' : 'fab fa-korvue', + 'fab_laravel' : 'fab fa-laravel', + 'fab_lastfm' : 'fab fa-lastfm', + 'fab_leanpub' : 'fab fa-leanpub', + 'fab_less' : 'fab fa-less', + 'fab_letterboxd' : 'fab fa-letterboxd', + 'fab_line' : 'fab fa-line', + 'fab_linkedin_in' : 'fab fa-linkedin-in', + 'fab_linkedin' : 'fab fa-linkedin', + 'fab_linode' : 'fab fa-linode', + 'fab_linux' : 'fab fa-linux', + 'fab_lyft' : 'fab fa-lyft', + 'fab_magento' : 'fab fa-magento', + 'fab_mailchimp' : 'fab fa-mailchimp', + 'fab_mandalorian' : 'fab fa-mandalorian', + 'fab_markdown' : 'fab fa-markdown', + 'fab_mastodon' : 'fab fa-mastodon', + 'fab_maxcdn' : 'fab fa-maxcdn', + 'fab_mdb' : 'fab fa-mdb', + 'fab_medapps' : 'fab fa-medapps', + 'fab_medium' : 'fab fa-medium', + 'fab_medrt' : 'fab fa-medrt', + 'fab_meetup' : 'fab fa-meetup', + 'fab_megaport' : 'fab fa-megaport', + 'fab_mendeley' : 'fab fa-mendeley', + 'fab_meta' : 'fab fa-meta', + 'fab_microblog' : 'fab fa-microblog', + 'fab_microsoft' : 'fab fa-microsoft', + 'fab_mintbit' : 'fab fa-mintbit', + 'fab_mix' : 'fab fa-mix', + 'fab_mixcloud' : 'fab fa-mixcloud', + 'fab_mixer' : 'fab fa-mixer', + 'fab_mizuni' : 'fab fa-mizuni', + 'fab_modx' : 'fab fa-modx', + 'fab_monero' : 'fab fa-monero', + 'fab_napster' : 'fab fa-napster', + 'fab_neos' : 'fab fa-neos', + 'fab_nfc_directional' : 'fab fa-nfc-directional', + 'fab_nfc_symbol' : 'fab fa-nfc-symbol', + 'fab_nimblr' : 'fab fa-nimblr', + 'fab_node_js' : 'fab fa-node-js', + 'fab_node' : 'fab fa-node', + 'fab_npm' : 'fab fa-npm', + 'fab_ns8' : 'fab fa-ns8', + 'fab_nutritionix' : 'fab fa-nutritionix', + 'fab_octopus_deploy' : 'fab fa-octopus-deploy', + 'fab_odnoklassniki' : 'fab fa-odnoklassniki', + 'fab_odysee' : 'fab fa-odysee', + 'fab_old_republic' : 'fab fa-old-republic', + 'fab_opencart' : 'fab fa-opencart', + 'fab_openid' : 'fab fa-openid', + 'fab_opensuse' : 'fab fa-opensuse', + 'fab_opera' : 'fab fa-opera', + 'fab_optin_monster' : 'fab fa-optin-monster', + 'fab_orcid' : 'fab fa-orcid', + 'fab_osi' : 'fab fa-osi', + 'fab_padlet' : 'fab fa-padlet', + 'fab_page4' : 'fab fa-page4', + 'fab_pagelines' : 'fab fa-pagelines', + 'fab_palfed' : 'fab fa-palfed', + 'fab_patreon' : 'fab fa-patreon', + 'fab_paypal' : 'fab fa-paypal', + 'fab_perbyte' : 'fab fa-perbyte', + 'fab_periscope' : 'fab fa-periscope', + 'fab_phabricator' : 'fab fa-phabricator', + 'fab_phoenix_framework' : 'fab fa-phoenix-framework', + 'fab_phoenix_squadron' : 'fab fa-phoenix-squadron', + 'fab_php' : 'fab fa-php', + 'fab_pied_piper_alt' : 'fab fa-pied-piper-alt', + 'fab_pied_piper_hat' : 'fab fa-pied-piper-hat', + 'fab_pied_piper_pp' : 'fab fa-pied-piper-pp', + 'fab_pied_piper' : 'fab fa-pied-piper', + 'fab_pinterest_p' : 'fab fa-pinterest-p', + 'fab_pinterest' : 'fab fa-pinterest', + 'fab_pix' : 'fab fa-pix', + 'fab_pixiv' : 'fab fa-pixiv', + 'fab_playstation' : 'fab fa-playstation', + 'fab_product_hunt' : 'fab fa-product-hunt', + 'fab_pushed' : 'fab fa-pushed', + 'fab_python' : 'fab fa-python', + 'fab_qq' : 'fab fa-qq', + 'fab_quinscape' : 'fab fa-quinscape', + 'fab_quora' : 'fab fa-quora', + 'fab_r_project' : 'fab fa-r-project', + 'fab_raspberry_pi' : 'fab fa-raspberry-pi', + 'fab_ravelry' : 'fab fa-ravelry', + 'fab_react' : 'fab fa-react', + 'fab_reacteurope' : 'fab fa-reacteurope', + 'fab_readme' : 'fab fa-readme', + 'fab_rebel' : 'fab fa-rebel', + 'fab_red_river' : 'fab fa-red-river', + 'fab_reddit_alien' : 'fab fa-reddit-alien', + 'fab_reddit' : 'fab fa-reddit', + 'fab_redhat' : 'fab fa-redhat', + 'fab_renren' : 'fab fa-renren', + 'fab_replyd' : 'fab fa-replyd', + 'fab_researchgate' : 'fab fa-researchgate', + 'fab_resolving' : 'fab fa-resolving', + 'fab_rev' : 'fab fa-rev', + 'fab_rocketchat' : 'fab fa-rocketchat', + 'fab_rockrms' : 'fab fa-rockrms', + 'fab_rust' : 'fab fa-rust', + 'fab_safari' : 'fab fa-safari', + 'fab_salesforce' : 'fab fa-salesforce', + 'fab_sass' : 'fab fa-sass', + 'fab_schlix' : 'fab fa-schlix', + 'fab_screenpal' : 'fab fa-screenpal', + 'fab_scribd' : 'fab fa-scribd', + 'fab_searchengin' : 'fab fa-searchengin', + 'fab_sellcast' : 'fab fa-sellcast', + 'fab_sellsy' : 'fab fa-sellsy', + 'fab_servicestack' : 'fab fa-servicestack', + 'fab_shirtsinbulk' : 'fab fa-shirtsinbulk', + 'fab_shoelace' : 'fab fa-shoelace', + 'fab_shopify' : 'fab fa-shopify', + 'fab_shopware' : 'fab fa-shopware', + 'fab_signal_messenger' : 'fab fa-signal-messenger', + 'fab_simplybuilt' : 'fab fa-simplybuilt', + 'fab_sistrix' : 'fab fa-sistrix', + 'fab_sith' : 'fab fa-sith', + 'fab_sitrox' : 'fab fa-sitrox', + 'fab_sketch' : 'fab fa-sketch', + 'fab_skyatlas' : 'fab fa-skyatlas', + 'fab_skype' : 'fab fa-skype', + 'fab_slack' : 'fab fa-slack', + 'fab_slideshare' : 'fab fa-slideshare', + 'fab_snapchat' : 'fab fa-snapchat', + 'fab_soundcloud' : 'fab fa-soundcloud', + 'fab_sourcetree' : 'fab fa-sourcetree', + 'fab_space_awesome' : 'fab fa-space-awesome', + 'fab_speakap' : 'fab fa-speakap', + 'fab_speaker_deck' : 'fab fa-speaker-deck', + 'fab_spotify' : 'fab fa-spotify', + 'fab_square_behance' : 'fab fa-square-behance', + 'fab_square_dribbble' : 'fab fa-square-dribbble', + 'fab_square_facebook' : 'fab fa-square-facebook', + 'fab_square_font_awesome_stroke' : 'fab fa-square-font-awesome-stroke', + 'fab_square_font_awesome' : 'fab fa-square-font-awesome', + 'fab_square_git' : 'fab fa-square-git', + 'fab_square_github' : 'fab fa-square-github', + 'fab_square_gitlab' : 'fab fa-square-gitlab', + 'fab_square_google_plus' : 'fab fa-square-google-plus', + 'fab_square_hacker_news' : 'fab fa-square-hacker-news', + 'fab_square_instagram' : 'fab fa-square-instagram', + 'fab_square_js' : 'fab fa-square-js', + 'fab_square_lastfm' : 'fab fa-square-lastfm', + 'fab_square_letterboxd' : 'fab fa-square-letterboxd', + 'fab_square_odnoklassniki' : 'fab fa-square-odnoklassniki', + 'fab_square_pied_piper' : 'fab fa-square-pied-piper', + 'fab_square_pinterest' : 'fab fa-square-pinterest', + 'fab_square_reddit' : 'fab fa-square-reddit', + 'fab_square_snapchat' : 'fab fa-square-snapchat', + 'fab_square_steam' : 'fab fa-square-steam', + 'fab_square_threads' : 'fab fa-square-threads', + 'fab_square_tumblr' : 'fab fa-square-tumblr', + 'fab_square_twitter' : 'fab fa-square-twitter', + 'fab_square_upwork' : 'fab fa-square-upwork', + 'fab_square_viadeo' : 'fab fa-square-viadeo', + 'fab_square_vimeo' : 'fab fa-square-vimeo', + 'fab_square_web_awesome_stroke' : 'fab fa-square-web-awesome-stroke', + 'fab_square_web_awesome' : 'fab fa-square-web-awesome', + 'fab_square_whatsapp' : 'fab fa-square-whatsapp', + 'fab_square_x_twitter' : 'fab fa-square-x-twitter', + 'fab_square_xing' : 'fab fa-square-xing', + 'fab_square_youtube' : 'fab fa-square-youtube', + 'fab_squarespace' : 'fab fa-squarespace', + 'fab_stack_exchange' : 'fab fa-stack-exchange', + 'fab_stack_overflow' : 'fab fa-stack-overflow', + 'fab_stackpath' : 'fab fa-stackpath', + 'fab_staylinked' : 'fab fa-staylinked', + 'fab_steam_symbol' : 'fab fa-steam-symbol', + 'fab_steam' : 'fab fa-steam', + 'fab_sticker_mule' : 'fab fa-sticker-mule', + 'fab_strava' : 'fab fa-strava', + 'fab_stripe_s' : 'fab fa-stripe-s', + 'fab_stripe' : 'fab fa-stripe', + 'fab_stubber' : 'fab fa-stubber', + 'fab_studiovinari' : 'fab fa-studiovinari', + 'fab_stumbleupon_circle' : 'fab fa-stumbleupon-circle', + 'fab_stumbleupon' : 'fab fa-stumbleupon', + 'fab_superpowers' : 'fab fa-superpowers', + 'fab_supple' : 'fab fa-supple', + 'fab_suse' : 'fab fa-suse', + 'fab_swift' : 'fab fa-swift', + 'fab_symfony' : 'fab fa-symfony', + 'fab_teamspeak' : 'fab fa-teamspeak', + 'fab_telegram' : 'fab fa-telegram', + 'fab_tencent_weibo' : 'fab fa-tencent-weibo', + 'fab_the_red_yeti' : 'fab fa-the-red-yeti', + 'fab_themeco' : 'fab fa-themeco', + 'fab_themeisle' : 'fab fa-themeisle', + 'fab_think_peaks' : 'fab fa-think-peaks', + 'fab_threads' : 'fab fa-threads', + 'fab_tiktok' : 'fab fa-tiktok', + 'fab_trade_federation' : 'fab fa-trade-federation', + 'fab_trello' : 'fab fa-trello', + 'fab_tumblr' : 'fab fa-tumblr', + 'fab_twitch' : 'fab fa-twitch', + 'fab_twitter' : 'fab fa-twitter', + 'fab_typo3' : 'fab fa-typo3', + 'fab_uber' : 'fab fa-uber', + 'fab_ubuntu' : 'fab fa-ubuntu', + 'fab_uikit' : 'fab fa-uikit', + 'fab_umbraco' : 'fab fa-umbraco', + 'fab_uncharted' : 'fab fa-uncharted', + 'fab_uniregistry' : 'fab fa-uniregistry', + 'fab_unity' : 'fab fa-unity', + 'fab_unsplash' : 'fab fa-unsplash', + 'fab_untappd' : 'fab fa-untappd', + 'fab_ups' : 'fab fa-ups', + 'fab_upwork' : 'fab fa-upwork', + 'fab_usb' : 'fab fa-usb', + 'fab_usps' : 'fab fa-usps', + 'fab_ussunnah' : 'fab fa-ussunnah', + 'fab_vaadin' : 'fab fa-vaadin', + 'fab_viacoin' : 'fab fa-viacoin', + 'fab_viadeo' : 'fab fa-viadeo', + 'fab_viber' : 'fab fa-viber', + 'fab_vimeo_v' : 'fab fa-vimeo-v', + 'fab_vimeo' : 'fab fa-vimeo', + 'fab_vine' : 'fab fa-vine', + 'fab_vk' : 'fab fa-vk', + 'fab_vnv' : 'fab fa-vnv', + 'fab_vuejs' : 'fab fa-vuejs', + 'fab_watchman_monitoring' : 'fab fa-watchman-monitoring', + 'fab_waze' : 'fab fa-waze', + 'fab_web_awesome' : 'fab fa-web-awesome', + 'fab_webflow' : 'fab fa-webflow', + 'fab_weebly' : 'fab fa-weebly', + 'fab_weibo' : 'fab fa-weibo', + 'fab_weixin' : 'fab fa-weixin', + 'fab_whatsapp' : 'fab fa-whatsapp', + 'fab_whmcs' : 'fab fa-whmcs', + 'fab_wikipedia_w' : 'fab fa-wikipedia-w', + 'fab_windows' : 'fab fa-windows', + 'fab_wirsindhandwerk' : 'fab fa-wirsindhandwerk', + 'fab_wix' : 'fab fa-wix', + 'fab_wizards_of_the_coast' : 'fab fa-wizards-of-the-coast', + 'fab_wodu' : 'fab fa-wodu', + 'fab_wolf_pack_battalion' : 'fab fa-wolf-pack-battalion', + 'fab_wordpress_simple' : 'fab fa-wordpress-simple', + 'fab_wordpress' : 'fab fa-wordpress', + 'fab_wpbeginner' : 'fab fa-wpbeginner', + 'fab_wpexplorer' : 'fab fa-wpexplorer', + 'fab_wpforms' : 'fab fa-wpforms', + 'fab_wpressr' : 'fab fa-wpressr', + 'fab_x_twitter' : 'fab fa-x-twitter', + 'fab_xbox' : 'fab fa-xbox', + 'fab_xing' : 'fab fa-xing', + 'fab_y_combinator' : 'fab fa-y-combinator', + 'fab_yahoo' : 'fab fa-yahoo', + 'fab_yammer' : 'fab fa-yammer', + 'fab_yandex_international' : 'fab fa-yandex-international', + 'fab_yandex' : 'fab fa-yandex', + 'fab_yarn' : 'fab fa-yarn', + 'fab_yelp' : 'fab fa-yelp', + 'fab_yoast' : 'fab fa-yoast', + 'fab_youtube' : 'fab fa-youtube', + 'fab_zhihu' : 'fab fa-zhihu' +}; + +module.exports = fontAwesome; \ No newline at end of file