emailengine-app 1.14.8 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2154) hide show
  1. package/.env.development +49 -0
  2. package/.env.example +82 -0
  3. package/.env.production +87 -0
  4. package/.eslintignore +1 -0
  5. package/.github/workflows/deploy.yml +104 -0
  6. package/.github/workflows/release.yaml +107 -0
  7. package/.github/workflows/test.yml +82 -0
  8. package/.ncurc.js +19 -5
  9. package/.prettierignore +44 -0
  10. package/CHANGELOG.md +1129 -0
  11. package/DOCKER_DEPLOYMENT.md +495 -0
  12. package/Dockerfile +53 -6
  13. package/Dockerfile-legacy +18 -0
  14. package/Fluid-Attacks-Results.csv +1 -0
  15. package/Gruntfile.js +46 -5
  16. package/LICENSE_EMAILENGINE.txt +110 -0
  17. package/README.md +72 -344
  18. package/app.json +40 -0
  19. package/bin/emailengine.js +671 -46
  20. package/config/default.toml +9 -11
  21. package/config/test.toml +45 -0
  22. package/copy-static-files.sh +34 -0
  23. package/data/google-crawlers.json +797 -0
  24. package/docker-compose.yml +103 -31
  25. package/encrypt.js +85 -10
  26. package/eslint.config.js +110 -0
  27. package/examples/auth-server.js +121 -69
  28. package/examples/grafana-dashboard.json +2375 -0
  29. package/install.sh +426 -0
  30. package/lib/account.js +2348 -124
  31. package/lib/add-trackers.js +119 -0
  32. package/lib/api-routes/bull-board-routes.js +60 -0
  33. package/lib/api-routes/chat-routes.js +519 -0
  34. package/lib/api-routes/template-routes.js +490 -0
  35. package/lib/append-list.js +9 -2
  36. package/lib/arf-detect.js +202 -0
  37. package/lib/autodetect-imap-settings.js +781 -0
  38. package/lib/bounce-detect.js +511 -50
  39. package/lib/capa.js +97 -0
  40. package/lib/consts.js +210 -1
  41. package/lib/db.js +227 -8
  42. package/lib/document-store.js +54 -0
  43. package/lib/email-client/base-client.js +3715 -0
  44. package/lib/email-client/gmail-client.js +2796 -0
  45. package/lib/email-client/imap/mailbox.js +3760 -0
  46. package/lib/email-client/imap/subconnection.js +269 -0
  47. package/lib/email-client/imap-client.js +2628 -0
  48. package/lib/email-client/outlook-client.js +3805 -0
  49. package/lib/encrypt.js +85 -14
  50. package/lib/es.js +784 -0
  51. package/lib/feature-flags.js +42 -0
  52. package/lib/gateway.js +271 -0
  53. package/lib/generate-text-preview.js +56 -0
  54. package/lib/get-raw-email.js +302 -42
  55. package/lib/get-secret.js +23 -67
  56. package/lib/headers-rewriter.js +33 -0
  57. package/lib/imapproxy/imap-core/index.js +4 -0
  58. package/lib/imapproxy/imap-core/lib/commands/append.js +187 -0
  59. package/lib/imapproxy/imap-core/lib/commands/authenticate-plain.js +145 -0
  60. package/lib/imapproxy/imap-core/lib/commands/capability.js +13 -0
  61. package/lib/imapproxy/imap-core/lib/commands/check.js +10 -0
  62. package/lib/imapproxy/imap-core/lib/commands/close.js +44 -0
  63. package/lib/imapproxy/imap-core/lib/commands/compress.js +102 -0
  64. package/lib/imapproxy/imap-core/lib/commands/copy.js +109 -0
  65. package/lib/imapproxy/imap-core/lib/commands/create.js +93 -0
  66. package/lib/imapproxy/imap-core/lib/commands/delete.js +84 -0
  67. package/lib/imapproxy/imap-core/lib/commands/enable.js +36 -0
  68. package/lib/imapproxy/imap-core/lib/commands/expunge.js +68 -0
  69. package/lib/imapproxy/imap-core/lib/commands/fetch.js +385 -0
  70. package/lib/imapproxy/imap-core/lib/commands/getquota.js +85 -0
  71. package/lib/imapproxy/imap-core/lib/commands/getquotaroot.js +111 -0
  72. package/lib/imapproxy/imap-core/lib/commands/id.js +111 -0
  73. package/lib/imapproxy/imap-core/lib/commands/idle.js +45 -0
  74. package/lib/imapproxy/imap-core/lib/commands/list.js +218 -0
  75. package/lib/imapproxy/imap-core/lib/commands/login.js +135 -0
  76. package/lib/imapproxy/imap-core/lib/commands/logout.js +26 -0
  77. package/lib/imapproxy/imap-core/lib/commands/lsub.js +102 -0
  78. package/lib/imapproxy/imap-core/lib/commands/move.js +106 -0
  79. package/lib/imapproxy/imap-core/lib/commands/namespace.js +14 -0
  80. package/lib/imapproxy/imap-core/lib/commands/noop.js +10 -0
  81. package/lib/imapproxy/imap-core/lib/commands/rename.js +102 -0
  82. package/lib/imapproxy/imap-core/lib/commands/search.js +306 -0
  83. package/lib/imapproxy/imap-core/lib/commands/select.js +248 -0
  84. package/lib/imapproxy/imap-core/lib/commands/setquota.js +24 -0
  85. package/lib/imapproxy/imap-core/lib/commands/starttls.js +100 -0
  86. package/lib/imapproxy/imap-core/lib/commands/status.js +149 -0
  87. package/lib/imapproxy/imap-core/lib/commands/store.js +208 -0
  88. package/lib/imapproxy/imap-core/lib/commands/subscribe.js +69 -0
  89. package/lib/imapproxy/imap-core/lib/commands/uid-expunge.js +71 -0
  90. package/lib/imapproxy/imap-core/lib/commands/uid-store.js +170 -0
  91. package/lib/imapproxy/imap-core/lib/commands/unselect.js +14 -0
  92. package/lib/imapproxy/imap-core/lib/commands/unsubscribe.js +69 -0
  93. package/lib/imapproxy/imap-core/lib/handler/README.md +146 -0
  94. package/lib/imapproxy/imap-core/lib/handler/imap-compile-stream.js +252 -0
  95. package/lib/imapproxy/imap-core/lib/handler/imap-compiler.js +134 -0
  96. package/lib/imapproxy/imap-core/lib/handler/imap-formal-syntax.js +147 -0
  97. package/lib/imapproxy/imap-core/lib/handler/imap-handler.js +11 -0
  98. package/lib/imapproxy/imap-core/lib/handler/imap-parser.js +678 -0
  99. package/lib/imapproxy/imap-core/lib/imap-command.js +381 -0
  100. package/lib/imapproxy/imap-core/lib/imap-composer.js +71 -0
  101. package/lib/imapproxy/imap-core/lib/imap-connection.js +929 -0
  102. package/lib/imapproxy/imap-core/lib/imap-server.js +426 -0
  103. package/lib/imapproxy/imap-core/lib/imap-stream.js +172 -0
  104. package/lib/imapproxy/imap-core/lib/imap-tools.js +789 -0
  105. package/lib/imapproxy/imap-core/lib/indexer/body-structure.js +295 -0
  106. package/lib/imapproxy/imap-core/lib/indexer/create-envelope.js +103 -0
  107. package/lib/imapproxy/imap-core/lib/indexer/indexer.js +904 -0
  108. package/lib/imapproxy/imap-core/lib/indexer/parse-mime-tree.js +340 -0
  109. package/lib/imapproxy/imap-core/lib/length-limiter.js +76 -0
  110. package/lib/imapproxy/imap-core/lib/parse-date.js +225 -0
  111. package/lib/imapproxy/imap-core/lib/search.js +330 -0
  112. package/lib/imapproxy/imap-core/lib/tls-options.js +69 -0
  113. package/lib/imapproxy/imap-core/memory-notifier.js +129 -0
  114. package/lib/imapproxy/imap-core/test/client.js +46 -0
  115. package/lib/imapproxy/imap-core/test/fixtures/append.eml +1196 -0
  116. package/lib/imapproxy/imap-core/test/fixtures/chunks.js +44 -0
  117. package/lib/imapproxy/imap-core/test/fixtures/fix1.eml +6 -0
  118. package/lib/imapproxy/imap-core/test/fixtures/fix2.eml +599 -0
  119. package/lib/imapproxy/imap-core/test/fixtures/fix3.eml +32 -0
  120. package/lib/imapproxy/imap-core/test/fixtures/fix4.eml +6 -0
  121. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.eml +599 -0
  122. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.js +2740 -0
  123. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.json +1411 -0
  124. package/lib/imapproxy/imap-core/test/fixtures/mimetree.js +85 -0
  125. package/lib/imapproxy/imap-core/test/fixtures/nodemailer.eml +582 -0
  126. package/lib/imapproxy/imap-core/test/fixtures/ryan_finnie_mime_torture.eml +599 -0
  127. package/lib/imapproxy/imap-core/test/fixtures/simple.eml +42 -0
  128. package/lib/imapproxy/imap-core/test/fixtures/simple.json +164 -0
  129. package/lib/imapproxy/imap-core/test/imap-compile-stream-test.js +671 -0
  130. package/lib/imapproxy/imap-core/test/imap-compiler-test.js +272 -0
  131. package/lib/imapproxy/imap-core/test/imap-indexer-test.js +236 -0
  132. package/lib/imapproxy/imap-core/test/imap-parser-test.js +922 -0
  133. package/lib/imapproxy/imap-core/test/memory-notifier.js +129 -0
  134. package/lib/imapproxy/imap-core/test/prepare.sh +74 -0
  135. package/lib/imapproxy/imap-core/test/protocol-test.js +1756 -0
  136. package/lib/imapproxy/imap-core/test/search-test.js +1356 -0
  137. package/lib/imapproxy/imap-core/test/test-client.js +152 -0
  138. package/lib/imapproxy/imap-core/test/test-server.js +623 -0
  139. package/lib/imapproxy/imap-core/test/tools-test.js +22 -0
  140. package/lib/imapproxy/imap-server.js +577 -0
  141. package/lib/lists.js +92 -0
  142. package/lib/llm-pre-process.js +141 -0
  143. package/lib/logger.js +43 -4
  144. package/lib/lua/ee-get-idempotency.lua +74 -0
  145. package/lib/lua/ee-list-add.lua +34 -0
  146. package/lib/lua/ee-list-remove.lua +37 -0
  147. package/lib/lua/h-incrby-exists.lua +28 -0
  148. package/lib/lua/h-push.lua +32 -0
  149. package/lib/lua/h-set-bigger.lua +40 -0
  150. package/lib/lua/h-set-exists.lua +29 -0
  151. package/lib/lua/h-set-new.lua +29 -0
  152. package/lib/lua/h-update-bigger.lua +45 -0
  153. package/lib/lua/s-list-accounts.lua +64 -14
  154. package/lib/lua/z-expunge.lua +86 -10
  155. package/lib/lua/z-get-by-uid.lua +28 -5
  156. package/lib/lua/z-get-mailbox-id.lua +24 -2
  157. package/lib/lua/z-get-mailbox-path.lua +16 -0
  158. package/lib/lua/z-get.lua +27 -4
  159. package/lib/lua/z-set.lua +24 -2
  160. package/lib/metrics-collector.js +209 -0
  161. package/lib/oauth/gmail.js +663 -0
  162. package/lib/oauth/mail-ru.js +310 -0
  163. package/lib/oauth/outlook.js +541 -0
  164. package/lib/oauth/pubsub/google.js +247 -0
  165. package/lib/oauth2-apps.js +1420 -0
  166. package/lib/outbox.js +140 -0
  167. package/lib/payload-examples-documents.json +404 -0
  168. package/lib/payload-examples-webhooks.json +266 -0
  169. package/lib/pre-process.js +193 -0
  170. package/lib/rate-limit.js +32 -0
  171. package/lib/reconnection-manager.js +106 -0
  172. package/lib/redis-scan-delete.js +82 -0
  173. package/lib/redis-url.js +78 -0
  174. package/lib/rewrite-text-nodes.js +267 -0
  175. package/lib/routes-ui.js +10247 -0
  176. package/lib/schemas.js +1576 -187
  177. package/lib/settings.js +263 -12
  178. package/lib/sub-script.js +109 -0
  179. package/lib/templates.js +240 -0
  180. package/lib/threads.js +155 -0
  181. package/lib/tokens.js +353 -0
  182. package/lib/tools.js +1773 -41
  183. package/lib/translations.js +33 -0
  184. package/lib/webhooks.js +605 -0
  185. package/list-generate.js +96 -0
  186. package/package.json +129 -54
  187. package/render.yaml +44 -0
  188. package/sbom.json +1 -0
  189. package/scan.js +14 -2
  190. package/scripts/README.md +50 -0
  191. package/scripts/refresh-test-tokens.js +180 -0
  192. package/server.js +2902 -376
  193. package/setup-production.sh +201 -0
  194. package/static/{bootstrap-4.6.0-dist → bootstrap-4.6.2-dist}/css/bootstrap-grid.css +3 -3
  195. package/static/bootstrap-4.6.2-dist/css/bootstrap-grid.css.map +1 -0
  196. package/static/{bootstrap-4.6.0-dist → bootstrap-4.6.2-dist}/css/bootstrap-grid.min.css +3 -3
  197. package/static/{bootstrap-4.6.0-dist → bootstrap-4.6.2-dist}/css/bootstrap-grid.min.css.map +1 -1
  198. package/static/{bootstrap-4.6.0-dist → bootstrap-4.6.2-dist}/css/bootstrap-reboot.css +3 -3
  199. package/static/bootstrap-4.6.2-dist/css/bootstrap-reboot.css.map +1 -0
  200. package/static/{bootstrap-4.6.0-dist → bootstrap-4.6.2-dist}/css/bootstrap-reboot.min.css +3 -3
  201. package/static/bootstrap-4.6.2-dist/css/bootstrap-reboot.min.css.map +1 -0
  202. package/static/{bootstrap-4.6.0-dist → bootstrap-4.6.2-dist}/css/bootstrap.css +60 -26
  203. package/static/bootstrap-4.6.2-dist/css/bootstrap.css.map +1 -0
  204. package/static/bootstrap-4.6.2-dist/css/bootstrap.min.css +7 -0
  205. package/static/bootstrap-4.6.2-dist/css/bootstrap.min.css.map +1 -0
  206. package/static/bootstrap-4.6.2-dist/js/bootstrap.bundle.js +7155 -0
  207. package/static/bootstrap-4.6.2-dist/js/bootstrap.bundle.js.map +784 -0
  208. package/static/bootstrap-4.6.2-dist/js/bootstrap.bundle.min.js +7 -0
  209. package/static/bootstrap-4.6.2-dist/js/bootstrap.bundle.min.js.map +959 -0
  210. package/static/{bootstrap-4.6.0-dist → bootstrap-4.6.2-dist}/js/bootstrap.js +792 -868
  211. package/static/bootstrap-4.6.2-dist/js/bootstrap.js.map +1 -0
  212. package/static/bootstrap-4.6.2-dist/js/bootstrap.min.js +7 -0
  213. package/static/bootstrap-4.6.2-dist/js/bootstrap.min.js.map +1 -0
  214. package/static/css/app.css +146 -0
  215. package/static/css/arena.css +777 -0
  216. package/static/css/default.min.css +9 -0
  217. package/static/css/highlight.min.css +9 -0
  218. package/static/css/sb-admin-2.min.css +10 -0
  219. package/static/emailengine.ico +0 -0
  220. package/static/favicon/android-chrome-192x192.png +0 -0
  221. package/static/favicon/android-chrome-512x512.png +0 -0
  222. package/static/favicon/apple-touch-icon.png +0 -0
  223. package/static/favicon/favicon-16x16.png +0 -0
  224. package/static/favicon/favicon-32x32.png +0 -0
  225. package/static/favicon/favicon.ico +0 -0
  226. package/static/favicon.ico +0 -0
  227. package/static/fonts/nunito/OFL.txt +93 -0
  228. package/static/fonts/nunito/XRXV3I6Li01BKofINeaBTMnFcQ.woff2 +0 -0
  229. package/static/fonts/nunito-font.css +66 -0
  230. package/static/front/EmailEngine_logo_horiz.png +0 -0
  231. package/static/front/EmailEngine_logo_vert.png +0 -0
  232. package/static/front/index.html +57 -0
  233. package/static/front/logo.png +0 -0
  234. package/static/imap-capabilities-1.csv +71 -0
  235. package/static/index.html +30 -713
  236. package/static/js/ace/README.txt +1 -0
  237. package/static/js/ace/ace.js +23 -0
  238. package/static/js/ace/ext-language_tools.js +8 -0
  239. package/static/js/ace/ext-searchbox.js +8 -0
  240. package/static/js/ace/mode-handlebars.js +8 -0
  241. package/static/js/ace/mode-html.js +8 -0
  242. package/static/js/ace/mode-javascript.js +8 -0
  243. package/static/js/ace/mode-json.js +8 -0
  244. package/static/js/ace/mode-markdown.js +8 -0
  245. package/static/js/ace/snippets/javascript.js +8 -0
  246. package/static/js/ace/snippets/markdown.js +8 -0
  247. package/static/js/ace/theme-kuroir.js +8 -0
  248. package/static/js/ace/theme-xcode.js +8 -0
  249. package/static/js/ace/worker-html.js +1 -0
  250. package/static/js/ace/worker-javascript.js +1 -0
  251. package/static/js/ace/worker-json.js +1 -0
  252. package/static/js/app.js +526 -0
  253. package/static/js/bootstrap-autocomplete.min.js +1 -0
  254. package/static/js/clipboard.min.js +517 -0
  255. package/static/js/ee-client.js +1977 -0
  256. package/static/js/evaluation-worker.js +47 -0
  257. package/static/js/highlight.min.js +1173 -0
  258. package/static/js/jquery-3.6.0.min.js +2 -0
  259. package/static/js/sb-admin-2.min.js +7 -0
  260. package/static/licenses.html +6606 -50
  261. package/static/logo/EmailEngine_logo_horiz.png +0 -0
  262. package/static/logo/EmailEngine_logo_vert.png +0 -0
  263. package/static/logo.png +0 -0
  264. package/static/logo_transparent.png +0 -0
  265. package/static/logo_transparent_small.png +0 -0
  266. package/static/logo_wide.png +0 -0
  267. package/static/preview/header-template.png +0 -0
  268. package/static/preview/render.png +0 -0
  269. package/static/preview/translation.png +0 -0
  270. package/static/providers/google_dark.png +0 -0
  271. package/static/providers/google_dark_edited.png +0 -0
  272. package/static/providers/google_light.png +0 -0
  273. package/static/providers/ms_dark.svg +1 -0
  274. package/static/providers/ms_light.svg +1 -0
  275. package/static/robots.txt +4 -0
  276. package/static/undraw_profile.svg +38 -0
  277. package/static/vendor/fontawesome-free/LICENSE.txt +34 -0
  278. package/static/vendor/fontawesome-free/attribution.js +3 -0
  279. package/static/vendor/fontawesome-free/css/all.css +4619 -0
  280. package/static/vendor/fontawesome-free/css/all.min.css +5 -0
  281. package/static/vendor/fontawesome-free/css/brands.css +15 -0
  282. package/static/vendor/fontawesome-free/css/brands.min.css +5 -0
  283. package/static/vendor/fontawesome-free/css/fontawesome.css +4585 -0
  284. package/static/vendor/fontawesome-free/css/fontawesome.min.css +5 -0
  285. package/static/vendor/fontawesome-free/css/regular.css +15 -0
  286. package/static/vendor/fontawesome-free/css/regular.min.css +5 -0
  287. package/static/vendor/fontawesome-free/css/solid.css +16 -0
  288. package/static/vendor/fontawesome-free/css/solid.min.css +5 -0
  289. package/static/vendor/fontawesome-free/css/svg-with-js.css +371 -0
  290. package/static/vendor/fontawesome-free/css/svg-with-js.min.css +5 -0
  291. package/static/vendor/fontawesome-free/css/v4-shims.css +2172 -0
  292. package/static/vendor/fontawesome-free/css/v4-shims.min.css +5 -0
  293. package/static/vendor/fontawesome-free/js/all.js +4467 -0
  294. package/static/vendor/fontawesome-free/js/all.min.js +5 -0
  295. package/static/vendor/fontawesome-free/js/brands.js +586 -0
  296. package/static/vendor/fontawesome-free/js/brands.min.js +5 -0
  297. package/static/vendor/fontawesome-free/js/conflict-detection.js +998 -0
  298. package/static/vendor/fontawesome-free/js/conflict-detection.min.js +5 -0
  299. package/static/vendor/fontawesome-free/js/fontawesome.js +2483 -0
  300. package/static/vendor/fontawesome-free/js/fontawesome.min.js +5 -0
  301. package/static/vendor/fontawesome-free/js/regular.js +280 -0
  302. package/static/vendor/fontawesome-free/js/regular.min.js +5 -0
  303. package/static/vendor/fontawesome-free/js/solid.js +1130 -0
  304. package/static/vendor/fontawesome-free/js/solid.min.js +5 -0
  305. package/static/vendor/fontawesome-free/js/v4-shims.js +68 -0
  306. package/static/vendor/fontawesome-free/js/v4-shims.min.js +5 -0
  307. package/static/vendor/fontawesome-free/less/_animated.less +19 -0
  308. package/static/vendor/fontawesome-free/less/_bordered-pulled.less +16 -0
  309. package/static/vendor/fontawesome-free/less/_core.less +12 -0
  310. package/static/vendor/fontawesome-free/less/_fixed-width.less +6 -0
  311. package/static/vendor/fontawesome-free/less/_icons.less +1462 -0
  312. package/static/vendor/fontawesome-free/less/_larger.less +27 -0
  313. package/static/vendor/fontawesome-free/less/_list.less +18 -0
  314. package/static/vendor/fontawesome-free/less/_mixins.less +56 -0
  315. package/static/vendor/fontawesome-free/less/_rotated-flipped.less +24 -0
  316. package/static/vendor/fontawesome-free/less/_screen-reader.less +5 -0
  317. package/static/vendor/fontawesome-free/less/_shims.less +2066 -0
  318. package/static/vendor/fontawesome-free/less/_stacked.less +22 -0
  319. package/static/vendor/fontawesome-free/less/_variables.less +1474 -0
  320. package/static/vendor/fontawesome-free/less/brands.less +23 -0
  321. package/static/vendor/fontawesome-free/less/fontawesome.less +16 -0
  322. package/static/vendor/fontawesome-free/less/regular.less +23 -0
  323. package/static/vendor/fontawesome-free/less/solid.less +24 -0
  324. package/static/vendor/fontawesome-free/less/v4-shims.less +6 -0
  325. package/static/vendor/fontawesome-free/metadata/categories.yml +2572 -0
  326. package/static/vendor/fontawesome-free/metadata/icons.yml +21783 -0
  327. package/static/vendor/fontawesome-free/metadata/shims.yml +298 -0
  328. package/static/vendor/fontawesome-free/metadata/sponsors.yml +744 -0
  329. package/static/vendor/fontawesome-free/package.json +58 -0
  330. package/static/vendor/fontawesome-free/scss/_animated.scss +20 -0
  331. package/static/vendor/fontawesome-free/scss/_bordered-pulled.scss +20 -0
  332. package/static/vendor/fontawesome-free/scss/_core.scss +21 -0
  333. package/static/vendor/fontawesome-free/scss/_fixed-width.scss +6 -0
  334. package/static/vendor/fontawesome-free/scss/_icons.scss +1462 -0
  335. package/static/vendor/fontawesome-free/scss/_larger.scss +23 -0
  336. package/static/vendor/fontawesome-free/scss/_list.scss +18 -0
  337. package/static/vendor/fontawesome-free/scss/_mixins.scss +56 -0
  338. package/static/vendor/fontawesome-free/scss/_rotated-flipped.scss +24 -0
  339. package/static/vendor/fontawesome-free/scss/_screen-reader.scss +5 -0
  340. package/static/vendor/fontawesome-free/scss/_shims.scss +2066 -0
  341. package/static/vendor/fontawesome-free/scss/_stacked.scss +31 -0
  342. package/static/vendor/fontawesome-free/scss/_variables.scss +1479 -0
  343. package/static/vendor/fontawesome-free/scss/brands.scss +23 -0
  344. package/static/vendor/fontawesome-free/scss/fontawesome.scss +16 -0
  345. package/static/vendor/fontawesome-free/scss/regular.scss +23 -0
  346. package/static/vendor/fontawesome-free/scss/solid.scss +24 -0
  347. package/static/vendor/fontawesome-free/scss/v4-shims.scss +6 -0
  348. package/static/vendor/fontawesome-free/sprites/brands.svg +1381 -0
  349. package/static/vendor/fontawesome-free/sprites/regular.svg +463 -0
  350. package/static/vendor/fontawesome-free/sprites/solid.svg +3013 -0
  351. package/static/vendor/fontawesome-free/svgs/brands/500px.svg +1 -0
  352. package/static/vendor/fontawesome-free/svgs/brands/accessible-icon.svg +1 -0
  353. package/static/vendor/fontawesome-free/svgs/brands/accusoft.svg +1 -0
  354. package/static/vendor/fontawesome-free/svgs/brands/acquisitions-incorporated.svg +1 -0
  355. package/static/vendor/fontawesome-free/svgs/brands/adn.svg +1 -0
  356. package/static/vendor/fontawesome-free/svgs/brands/adversal.svg +1 -0
  357. package/static/vendor/fontawesome-free/svgs/brands/affiliatetheme.svg +1 -0
  358. package/static/vendor/fontawesome-free/svgs/brands/airbnb.svg +1 -0
  359. package/static/vendor/fontawesome-free/svgs/brands/algolia.svg +1 -0
  360. package/static/vendor/fontawesome-free/svgs/brands/alipay.svg +1 -0
  361. package/static/vendor/fontawesome-free/svgs/brands/amazon-pay.svg +1 -0
  362. package/static/vendor/fontawesome-free/svgs/brands/amazon.svg +1 -0
  363. package/static/vendor/fontawesome-free/svgs/brands/amilia.svg +1 -0
  364. package/static/vendor/fontawesome-free/svgs/brands/android.svg +1 -0
  365. package/static/vendor/fontawesome-free/svgs/brands/angellist.svg +1 -0
  366. package/static/vendor/fontawesome-free/svgs/brands/angrycreative.svg +1 -0
  367. package/static/vendor/fontawesome-free/svgs/brands/angular.svg +1 -0
  368. package/static/vendor/fontawesome-free/svgs/brands/app-store-ios.svg +1 -0
  369. package/static/vendor/fontawesome-free/svgs/brands/app-store.svg +1 -0
  370. package/static/vendor/fontawesome-free/svgs/brands/apper.svg +1 -0
  371. package/static/vendor/fontawesome-free/svgs/brands/apple-pay.svg +1 -0
  372. package/static/vendor/fontawesome-free/svgs/brands/apple.svg +1 -0
  373. package/static/vendor/fontawesome-free/svgs/brands/artstation.svg +1 -0
  374. package/static/vendor/fontawesome-free/svgs/brands/asymmetrik.svg +1 -0
  375. package/static/vendor/fontawesome-free/svgs/brands/atlassian.svg +1 -0
  376. package/static/vendor/fontawesome-free/svgs/brands/audible.svg +1 -0
  377. package/static/vendor/fontawesome-free/svgs/brands/autoprefixer.svg +1 -0
  378. package/static/vendor/fontawesome-free/svgs/brands/avianex.svg +1 -0
  379. package/static/vendor/fontawesome-free/svgs/brands/aviato.svg +1 -0
  380. package/static/vendor/fontawesome-free/svgs/brands/aws.svg +1 -0
  381. package/static/vendor/fontawesome-free/svgs/brands/bandcamp.svg +1 -0
  382. package/static/vendor/fontawesome-free/svgs/brands/battle-net.svg +1 -0
  383. package/static/vendor/fontawesome-free/svgs/brands/behance-square.svg +1 -0
  384. package/static/vendor/fontawesome-free/svgs/brands/behance.svg +1 -0
  385. package/static/vendor/fontawesome-free/svgs/brands/bimobject.svg +1 -0
  386. package/static/vendor/fontawesome-free/svgs/brands/bitbucket.svg +1 -0
  387. package/static/vendor/fontawesome-free/svgs/brands/bitcoin.svg +1 -0
  388. package/static/vendor/fontawesome-free/svgs/brands/bity.svg +1 -0
  389. package/static/vendor/fontawesome-free/svgs/brands/black-tie.svg +1 -0
  390. package/static/vendor/fontawesome-free/svgs/brands/blackberry.svg +1 -0
  391. package/static/vendor/fontawesome-free/svgs/brands/blogger-b.svg +1 -0
  392. package/static/vendor/fontawesome-free/svgs/brands/blogger.svg +1 -0
  393. package/static/vendor/fontawesome-free/svgs/brands/bluetooth-b.svg +1 -0
  394. package/static/vendor/fontawesome-free/svgs/brands/bluetooth.svg +1 -0
  395. package/static/vendor/fontawesome-free/svgs/brands/bootstrap.svg +1 -0
  396. package/static/vendor/fontawesome-free/svgs/brands/btc.svg +1 -0
  397. package/static/vendor/fontawesome-free/svgs/brands/buffer.svg +1 -0
  398. package/static/vendor/fontawesome-free/svgs/brands/buromobelexperte.svg +1 -0
  399. package/static/vendor/fontawesome-free/svgs/brands/buy-n-large.svg +1 -0
  400. package/static/vendor/fontawesome-free/svgs/brands/buysellads.svg +1 -0
  401. package/static/vendor/fontawesome-free/svgs/brands/canadian-maple-leaf.svg +1 -0
  402. package/static/vendor/fontawesome-free/svgs/brands/cc-amazon-pay.svg +1 -0
  403. package/static/vendor/fontawesome-free/svgs/brands/cc-amex.svg +1 -0
  404. package/static/vendor/fontawesome-free/svgs/brands/cc-apple-pay.svg +1 -0
  405. package/static/vendor/fontawesome-free/svgs/brands/cc-diners-club.svg +1 -0
  406. package/static/vendor/fontawesome-free/svgs/brands/cc-discover.svg +1 -0
  407. package/static/vendor/fontawesome-free/svgs/brands/cc-jcb.svg +1 -0
  408. package/static/vendor/fontawesome-free/svgs/brands/cc-mastercard.svg +1 -0
  409. package/static/vendor/fontawesome-free/svgs/brands/cc-paypal.svg +1 -0
  410. package/static/vendor/fontawesome-free/svgs/brands/cc-stripe.svg +1 -0
  411. package/static/vendor/fontawesome-free/svgs/brands/cc-visa.svg +1 -0
  412. package/static/vendor/fontawesome-free/svgs/brands/centercode.svg +1 -0
  413. package/static/vendor/fontawesome-free/svgs/brands/centos.svg +1 -0
  414. package/static/vendor/fontawesome-free/svgs/brands/chrome.svg +1 -0
  415. package/static/vendor/fontawesome-free/svgs/brands/chromecast.svg +1 -0
  416. package/static/vendor/fontawesome-free/svgs/brands/cloudflare.svg +1 -0
  417. package/static/vendor/fontawesome-free/svgs/brands/cloudscale.svg +1 -0
  418. package/static/vendor/fontawesome-free/svgs/brands/cloudsmith.svg +1 -0
  419. package/static/vendor/fontawesome-free/svgs/brands/cloudversify.svg +1 -0
  420. package/static/vendor/fontawesome-free/svgs/brands/codepen.svg +1 -0
  421. package/static/vendor/fontawesome-free/svgs/brands/codiepie.svg +1 -0
  422. package/static/vendor/fontawesome-free/svgs/brands/confluence.svg +1 -0
  423. package/static/vendor/fontawesome-free/svgs/brands/connectdevelop.svg +1 -0
  424. package/static/vendor/fontawesome-free/svgs/brands/contao.svg +1 -0
  425. package/static/vendor/fontawesome-free/svgs/brands/cotton-bureau.svg +1 -0
  426. package/static/vendor/fontawesome-free/svgs/brands/cpanel.svg +1 -0
  427. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-by.svg +1 -0
  428. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-nc-eu.svg +1 -0
  429. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-nc-jp.svg +1 -0
  430. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-nc.svg +1 -0
  431. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-nd.svg +1 -0
  432. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-pd-alt.svg +1 -0
  433. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-pd.svg +1 -0
  434. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-remix.svg +1 -0
  435. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-sa.svg +1 -0
  436. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-sampling-plus.svg +1 -0
  437. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-sampling.svg +1 -0
  438. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-share.svg +1 -0
  439. package/static/vendor/fontawesome-free/svgs/brands/creative-commons-zero.svg +1 -0
  440. package/static/vendor/fontawesome-free/svgs/brands/creative-commons.svg +1 -0
  441. package/static/vendor/fontawesome-free/svgs/brands/critical-role.svg +1 -0
  442. package/static/vendor/fontawesome-free/svgs/brands/css3-alt.svg +1 -0
  443. package/static/vendor/fontawesome-free/svgs/brands/css3.svg +1 -0
  444. package/static/vendor/fontawesome-free/svgs/brands/cuttlefish.svg +1 -0
  445. package/static/vendor/fontawesome-free/svgs/brands/d-and-d-beyond.svg +1 -0
  446. package/static/vendor/fontawesome-free/svgs/brands/d-and-d.svg +1 -0
  447. package/static/vendor/fontawesome-free/svgs/brands/dailymotion.svg +1 -0
  448. package/static/vendor/fontawesome-free/svgs/brands/dashcube.svg +1 -0
  449. package/static/vendor/fontawesome-free/svgs/brands/deezer.svg +1 -0
  450. package/static/vendor/fontawesome-free/svgs/brands/delicious.svg +1 -0
  451. package/static/vendor/fontawesome-free/svgs/brands/deploydog.svg +1 -0
  452. package/static/vendor/fontawesome-free/svgs/brands/deskpro.svg +1 -0
  453. package/static/vendor/fontawesome-free/svgs/brands/dev.svg +1 -0
  454. package/static/vendor/fontawesome-free/svgs/brands/deviantart.svg +1 -0
  455. package/static/vendor/fontawesome-free/svgs/brands/dhl.svg +1 -0
  456. package/static/vendor/fontawesome-free/svgs/brands/diaspora.svg +1 -0
  457. package/static/vendor/fontawesome-free/svgs/brands/digg.svg +1 -0
  458. package/static/vendor/fontawesome-free/svgs/brands/digital-ocean.svg +1 -0
  459. package/static/vendor/fontawesome-free/svgs/brands/discord.svg +1 -0
  460. package/static/vendor/fontawesome-free/svgs/brands/discourse.svg +1 -0
  461. package/static/vendor/fontawesome-free/svgs/brands/dochub.svg +1 -0
  462. package/static/vendor/fontawesome-free/svgs/brands/docker.svg +1 -0
  463. package/static/vendor/fontawesome-free/svgs/brands/draft2digital.svg +1 -0
  464. package/static/vendor/fontawesome-free/svgs/brands/dribbble-square.svg +1 -0
  465. package/static/vendor/fontawesome-free/svgs/brands/dribbble.svg +1 -0
  466. package/static/vendor/fontawesome-free/svgs/brands/dropbox.svg +1 -0
  467. package/static/vendor/fontawesome-free/svgs/brands/drupal.svg +1 -0
  468. package/static/vendor/fontawesome-free/svgs/brands/dyalog.svg +1 -0
  469. package/static/vendor/fontawesome-free/svgs/brands/earlybirds.svg +1 -0
  470. package/static/vendor/fontawesome-free/svgs/brands/ebay.svg +1 -0
  471. package/static/vendor/fontawesome-free/svgs/brands/edge-legacy.svg +1 -0
  472. package/static/vendor/fontawesome-free/svgs/brands/edge.svg +1 -0
  473. package/static/vendor/fontawesome-free/svgs/brands/elementor.svg +1 -0
  474. package/static/vendor/fontawesome-free/svgs/brands/ello.svg +1 -0
  475. package/static/vendor/fontawesome-free/svgs/brands/ember.svg +1 -0
  476. package/static/vendor/fontawesome-free/svgs/brands/empire.svg +1 -0
  477. package/static/vendor/fontawesome-free/svgs/brands/envira.svg +1 -0
  478. package/static/vendor/fontawesome-free/svgs/brands/erlang.svg +1 -0
  479. package/static/vendor/fontawesome-free/svgs/brands/ethereum.svg +1 -0
  480. package/static/vendor/fontawesome-free/svgs/brands/etsy.svg +1 -0
  481. package/static/vendor/fontawesome-free/svgs/brands/evernote.svg +1 -0
  482. package/static/vendor/fontawesome-free/svgs/brands/expeditedssl.svg +1 -0
  483. package/static/vendor/fontawesome-free/svgs/brands/facebook-f.svg +1 -0
  484. package/static/vendor/fontawesome-free/svgs/brands/facebook-messenger.svg +1 -0
  485. package/static/vendor/fontawesome-free/svgs/brands/facebook-square.svg +1 -0
  486. package/static/vendor/fontawesome-free/svgs/brands/facebook.svg +1 -0
  487. package/static/vendor/fontawesome-free/svgs/brands/fantasy-flight-games.svg +1 -0
  488. package/static/vendor/fontawesome-free/svgs/brands/fedex.svg +1 -0
  489. package/static/vendor/fontawesome-free/svgs/brands/fedora.svg +1 -0
  490. package/static/vendor/fontawesome-free/svgs/brands/figma.svg +1 -0
  491. package/static/vendor/fontawesome-free/svgs/brands/firefox-browser.svg +1 -0
  492. package/static/vendor/fontawesome-free/svgs/brands/firefox.svg +1 -0
  493. package/static/vendor/fontawesome-free/svgs/brands/first-order-alt.svg +1 -0
  494. package/static/vendor/fontawesome-free/svgs/brands/first-order.svg +1 -0
  495. package/static/vendor/fontawesome-free/svgs/brands/firstdraft.svg +1 -0
  496. package/static/vendor/fontawesome-free/svgs/brands/flickr.svg +1 -0
  497. package/static/vendor/fontawesome-free/svgs/brands/flipboard.svg +1 -0
  498. package/static/vendor/fontawesome-free/svgs/brands/fly.svg +1 -0
  499. package/static/vendor/fontawesome-free/svgs/brands/font-awesome-alt.svg +1 -0
  500. package/static/vendor/fontawesome-free/svgs/brands/font-awesome-flag.svg +1 -0
  501. package/static/vendor/fontawesome-free/svgs/brands/font-awesome-logo-full.svg +1 -0
  502. package/static/vendor/fontawesome-free/svgs/brands/font-awesome.svg +1 -0
  503. package/static/vendor/fontawesome-free/svgs/brands/fonticons-fi.svg +1 -0
  504. package/static/vendor/fontawesome-free/svgs/brands/fonticons.svg +1 -0
  505. package/static/vendor/fontawesome-free/svgs/brands/fort-awesome-alt.svg +1 -0
  506. package/static/vendor/fontawesome-free/svgs/brands/fort-awesome.svg +1 -0
  507. package/static/vendor/fontawesome-free/svgs/brands/forumbee.svg +1 -0
  508. package/static/vendor/fontawesome-free/svgs/brands/foursquare.svg +1 -0
  509. package/static/vendor/fontawesome-free/svgs/brands/free-code-camp.svg +1 -0
  510. package/static/vendor/fontawesome-free/svgs/brands/freebsd.svg +1 -0
  511. package/static/vendor/fontawesome-free/svgs/brands/fulcrum.svg +1 -0
  512. package/static/vendor/fontawesome-free/svgs/brands/galactic-republic.svg +1 -0
  513. package/static/vendor/fontawesome-free/svgs/brands/galactic-senate.svg +1 -0
  514. package/static/vendor/fontawesome-free/svgs/brands/get-pocket.svg +1 -0
  515. package/static/vendor/fontawesome-free/svgs/brands/gg-circle.svg +1 -0
  516. package/static/vendor/fontawesome-free/svgs/brands/gg.svg +1 -0
  517. package/static/vendor/fontawesome-free/svgs/brands/git-alt.svg +1 -0
  518. package/static/vendor/fontawesome-free/svgs/brands/git-square.svg +1 -0
  519. package/static/vendor/fontawesome-free/svgs/brands/git.svg +1 -0
  520. package/static/vendor/fontawesome-free/svgs/brands/github-alt.svg +1 -0
  521. package/static/vendor/fontawesome-free/svgs/brands/github-square.svg +1 -0
  522. package/static/vendor/fontawesome-free/svgs/brands/github.svg +1 -0
  523. package/static/vendor/fontawesome-free/svgs/brands/gitkraken.svg +1 -0
  524. package/static/vendor/fontawesome-free/svgs/brands/gitlab.svg +1 -0
  525. package/static/vendor/fontawesome-free/svgs/brands/gitter.svg +1 -0
  526. package/static/vendor/fontawesome-free/svgs/brands/glide-g.svg +1 -0
  527. package/static/vendor/fontawesome-free/svgs/brands/glide.svg +1 -0
  528. package/static/vendor/fontawesome-free/svgs/brands/gofore.svg +1 -0
  529. package/static/vendor/fontawesome-free/svgs/brands/goodreads-g.svg +1 -0
  530. package/static/vendor/fontawesome-free/svgs/brands/goodreads.svg +1 -0
  531. package/static/vendor/fontawesome-free/svgs/brands/google-drive.svg +1 -0
  532. package/static/vendor/fontawesome-free/svgs/brands/google-pay.svg +1 -0
  533. package/static/vendor/fontawesome-free/svgs/brands/google-play.svg +1 -0
  534. package/static/vendor/fontawesome-free/svgs/brands/google-plus-g.svg +1 -0
  535. package/static/vendor/fontawesome-free/svgs/brands/google-plus-square.svg +1 -0
  536. package/static/vendor/fontawesome-free/svgs/brands/google-plus.svg +1 -0
  537. package/static/vendor/fontawesome-free/svgs/brands/google-wallet.svg +1 -0
  538. package/static/vendor/fontawesome-free/svgs/brands/google.svg +1 -0
  539. package/static/vendor/fontawesome-free/svgs/brands/gratipay.svg +1 -0
  540. package/static/vendor/fontawesome-free/svgs/brands/grav.svg +1 -0
  541. package/static/vendor/fontawesome-free/svgs/brands/gripfire.svg +1 -0
  542. package/static/vendor/fontawesome-free/svgs/brands/grunt.svg +1 -0
  543. package/static/vendor/fontawesome-free/svgs/brands/guilded.svg +1 -0
  544. package/static/vendor/fontawesome-free/svgs/brands/gulp.svg +1 -0
  545. package/static/vendor/fontawesome-free/svgs/brands/hacker-news-square.svg +1 -0
  546. package/static/vendor/fontawesome-free/svgs/brands/hacker-news.svg +1 -0
  547. package/static/vendor/fontawesome-free/svgs/brands/hackerrank.svg +1 -0
  548. package/static/vendor/fontawesome-free/svgs/brands/hips.svg +1 -0
  549. package/static/vendor/fontawesome-free/svgs/brands/hire-a-helper.svg +1 -0
  550. package/static/vendor/fontawesome-free/svgs/brands/hive.svg +1 -0
  551. package/static/vendor/fontawesome-free/svgs/brands/hooli.svg +1 -0
  552. package/static/vendor/fontawesome-free/svgs/brands/hornbill.svg +1 -0
  553. package/static/vendor/fontawesome-free/svgs/brands/hotjar.svg +1 -0
  554. package/static/vendor/fontawesome-free/svgs/brands/houzz.svg +1 -0
  555. package/static/vendor/fontawesome-free/svgs/brands/html5.svg +1 -0
  556. package/static/vendor/fontawesome-free/svgs/brands/hubspot.svg +1 -0
  557. package/static/vendor/fontawesome-free/svgs/brands/ideal.svg +1 -0
  558. package/static/vendor/fontawesome-free/svgs/brands/imdb.svg +1 -0
  559. package/static/vendor/fontawesome-free/svgs/brands/innosoft.svg +1 -0
  560. package/static/vendor/fontawesome-free/svgs/brands/instagram-square.svg +1 -0
  561. package/static/vendor/fontawesome-free/svgs/brands/instagram.svg +1 -0
  562. package/static/vendor/fontawesome-free/svgs/brands/instalod.svg +1 -0
  563. package/static/vendor/fontawesome-free/svgs/brands/intercom.svg +1 -0
  564. package/static/vendor/fontawesome-free/svgs/brands/internet-explorer.svg +1 -0
  565. package/static/vendor/fontawesome-free/svgs/brands/invision.svg +1 -0
  566. package/static/vendor/fontawesome-free/svgs/brands/ioxhost.svg +1 -0
  567. package/static/vendor/fontawesome-free/svgs/brands/itch-io.svg +1 -0
  568. package/static/vendor/fontawesome-free/svgs/brands/itunes-note.svg +1 -0
  569. package/static/vendor/fontawesome-free/svgs/brands/itunes.svg +1 -0
  570. package/static/vendor/fontawesome-free/svgs/brands/java.svg +1 -0
  571. package/static/vendor/fontawesome-free/svgs/brands/jedi-order.svg +1 -0
  572. package/static/vendor/fontawesome-free/svgs/brands/jenkins.svg +1 -0
  573. package/static/vendor/fontawesome-free/svgs/brands/jira.svg +1 -0
  574. package/static/vendor/fontawesome-free/svgs/brands/joget.svg +1 -0
  575. package/static/vendor/fontawesome-free/svgs/brands/joomla.svg +1 -0
  576. package/static/vendor/fontawesome-free/svgs/brands/js-square.svg +1 -0
  577. package/static/vendor/fontawesome-free/svgs/brands/js.svg +1 -0
  578. package/static/vendor/fontawesome-free/svgs/brands/jsfiddle.svg +1 -0
  579. package/static/vendor/fontawesome-free/svgs/brands/kaggle.svg +1 -0
  580. package/static/vendor/fontawesome-free/svgs/brands/keybase.svg +1 -0
  581. package/static/vendor/fontawesome-free/svgs/brands/keycdn.svg +1 -0
  582. package/static/vendor/fontawesome-free/svgs/brands/kickstarter-k.svg +1 -0
  583. package/static/vendor/fontawesome-free/svgs/brands/kickstarter.svg +1 -0
  584. package/static/vendor/fontawesome-free/svgs/brands/korvue.svg +1 -0
  585. package/static/vendor/fontawesome-free/svgs/brands/laravel.svg +1 -0
  586. package/static/vendor/fontawesome-free/svgs/brands/lastfm-square.svg +1 -0
  587. package/static/vendor/fontawesome-free/svgs/brands/lastfm.svg +1 -0
  588. package/static/vendor/fontawesome-free/svgs/brands/leanpub.svg +1 -0
  589. package/static/vendor/fontawesome-free/svgs/brands/less.svg +1 -0
  590. package/static/vendor/fontawesome-free/svgs/brands/line.svg +1 -0
  591. package/static/vendor/fontawesome-free/svgs/brands/linkedin-in.svg +1 -0
  592. package/static/vendor/fontawesome-free/svgs/brands/linkedin.svg +1 -0
  593. package/static/vendor/fontawesome-free/svgs/brands/linode.svg +1 -0
  594. package/static/vendor/fontawesome-free/svgs/brands/linux.svg +1 -0
  595. package/static/vendor/fontawesome-free/svgs/brands/lyft.svg +1 -0
  596. package/static/vendor/fontawesome-free/svgs/brands/magento.svg +1 -0
  597. package/static/vendor/fontawesome-free/svgs/brands/mailchimp.svg +1 -0
  598. package/static/vendor/fontawesome-free/svgs/brands/mandalorian.svg +1 -0
  599. package/static/vendor/fontawesome-free/svgs/brands/markdown.svg +1 -0
  600. package/static/vendor/fontawesome-free/svgs/brands/mastodon.svg +1 -0
  601. package/static/vendor/fontawesome-free/svgs/brands/maxcdn.svg +1 -0
  602. package/static/vendor/fontawesome-free/svgs/brands/mdb.svg +1 -0
  603. package/static/vendor/fontawesome-free/svgs/brands/medapps.svg +1 -0
  604. package/static/vendor/fontawesome-free/svgs/brands/medium-m.svg +1 -0
  605. package/static/vendor/fontawesome-free/svgs/brands/medium.svg +1 -0
  606. package/static/vendor/fontawesome-free/svgs/brands/medrt.svg +1 -0
  607. package/static/vendor/fontawesome-free/svgs/brands/meetup.svg +1 -0
  608. package/static/vendor/fontawesome-free/svgs/brands/megaport.svg +1 -0
  609. package/static/vendor/fontawesome-free/svgs/brands/mendeley.svg +1 -0
  610. package/static/vendor/fontawesome-free/svgs/brands/microblog.svg +1 -0
  611. package/static/vendor/fontawesome-free/svgs/brands/microsoft.svg +1 -0
  612. package/static/vendor/fontawesome-free/svgs/brands/mix.svg +1 -0
  613. package/static/vendor/fontawesome-free/svgs/brands/mixcloud.svg +1 -0
  614. package/static/vendor/fontawesome-free/svgs/brands/mixer.svg +1 -0
  615. package/static/vendor/fontawesome-free/svgs/brands/mizuni.svg +1 -0
  616. package/static/vendor/fontawesome-free/svgs/brands/modx.svg +1 -0
  617. package/static/vendor/fontawesome-free/svgs/brands/monero.svg +1 -0
  618. package/static/vendor/fontawesome-free/svgs/brands/napster.svg +1 -0
  619. package/static/vendor/fontawesome-free/svgs/brands/neos.svg +1 -0
  620. package/static/vendor/fontawesome-free/svgs/brands/nimblr.svg +1 -0
  621. package/static/vendor/fontawesome-free/svgs/brands/node-js.svg +1 -0
  622. package/static/vendor/fontawesome-free/svgs/brands/node.svg +1 -0
  623. package/static/vendor/fontawesome-free/svgs/brands/npm.svg +1 -0
  624. package/static/vendor/fontawesome-free/svgs/brands/ns8.svg +1 -0
  625. package/static/vendor/fontawesome-free/svgs/brands/nutritionix.svg +1 -0
  626. package/static/vendor/fontawesome-free/svgs/brands/octopus-deploy.svg +1 -0
  627. package/static/vendor/fontawesome-free/svgs/brands/odnoklassniki-square.svg +1 -0
  628. package/static/vendor/fontawesome-free/svgs/brands/odnoklassniki.svg +1 -0
  629. package/static/vendor/fontawesome-free/svgs/brands/old-republic.svg +1 -0
  630. package/static/vendor/fontawesome-free/svgs/brands/opencart.svg +1 -0
  631. package/static/vendor/fontawesome-free/svgs/brands/openid.svg +1 -0
  632. package/static/vendor/fontawesome-free/svgs/brands/opera.svg +1 -0
  633. package/static/vendor/fontawesome-free/svgs/brands/optin-monster.svg +1 -0
  634. package/static/vendor/fontawesome-free/svgs/brands/orcid.svg +1 -0
  635. package/static/vendor/fontawesome-free/svgs/brands/osi.svg +1 -0
  636. package/static/vendor/fontawesome-free/svgs/brands/page4.svg +1 -0
  637. package/static/vendor/fontawesome-free/svgs/brands/pagelines.svg +1 -0
  638. package/static/vendor/fontawesome-free/svgs/brands/palfed.svg +1 -0
  639. package/static/vendor/fontawesome-free/svgs/brands/patreon.svg +1 -0
  640. package/static/vendor/fontawesome-free/svgs/brands/paypal.svg +1 -0
  641. package/static/vendor/fontawesome-free/svgs/brands/penny-arcade.svg +1 -0
  642. package/static/vendor/fontawesome-free/svgs/brands/perbyte.svg +1 -0
  643. package/static/vendor/fontawesome-free/svgs/brands/periscope.svg +1 -0
  644. package/static/vendor/fontawesome-free/svgs/brands/phabricator.svg +1 -0
  645. package/static/vendor/fontawesome-free/svgs/brands/phoenix-framework.svg +1 -0
  646. package/static/vendor/fontawesome-free/svgs/brands/phoenix-squadron.svg +1 -0
  647. package/static/vendor/fontawesome-free/svgs/brands/php.svg +1 -0
  648. package/static/vendor/fontawesome-free/svgs/brands/pied-piper-alt.svg +1 -0
  649. package/static/vendor/fontawesome-free/svgs/brands/pied-piper-hat.svg +1 -0
  650. package/static/vendor/fontawesome-free/svgs/brands/pied-piper-pp.svg +1 -0
  651. package/static/vendor/fontawesome-free/svgs/brands/pied-piper-square.svg +1 -0
  652. package/static/vendor/fontawesome-free/svgs/brands/pied-piper.svg +1 -0
  653. package/static/vendor/fontawesome-free/svgs/brands/pinterest-p.svg +1 -0
  654. package/static/vendor/fontawesome-free/svgs/brands/pinterest-square.svg +1 -0
  655. package/static/vendor/fontawesome-free/svgs/brands/pinterest.svg +1 -0
  656. package/static/vendor/fontawesome-free/svgs/brands/playstation.svg +1 -0
  657. package/static/vendor/fontawesome-free/svgs/brands/product-hunt.svg +1 -0
  658. package/static/vendor/fontawesome-free/svgs/brands/pushed.svg +1 -0
  659. package/static/vendor/fontawesome-free/svgs/brands/python.svg +1 -0
  660. package/static/vendor/fontawesome-free/svgs/brands/qq.svg +1 -0
  661. package/static/vendor/fontawesome-free/svgs/brands/quinscape.svg +1 -0
  662. package/static/vendor/fontawesome-free/svgs/brands/quora.svg +1 -0
  663. package/static/vendor/fontawesome-free/svgs/brands/r-project.svg +1 -0
  664. package/static/vendor/fontawesome-free/svgs/brands/raspberry-pi.svg +1 -0
  665. package/static/vendor/fontawesome-free/svgs/brands/ravelry.svg +1 -0
  666. package/static/vendor/fontawesome-free/svgs/brands/react.svg +1 -0
  667. package/static/vendor/fontawesome-free/svgs/brands/reacteurope.svg +1 -0
  668. package/static/vendor/fontawesome-free/svgs/brands/readme.svg +1 -0
  669. package/static/vendor/fontawesome-free/svgs/brands/rebel.svg +1 -0
  670. package/static/vendor/fontawesome-free/svgs/brands/red-river.svg +1 -0
  671. package/static/vendor/fontawesome-free/svgs/brands/reddit-alien.svg +1 -0
  672. package/static/vendor/fontawesome-free/svgs/brands/reddit-square.svg +1 -0
  673. package/static/vendor/fontawesome-free/svgs/brands/reddit.svg +1 -0
  674. package/static/vendor/fontawesome-free/svgs/brands/redhat.svg +1 -0
  675. package/static/vendor/fontawesome-free/svgs/brands/renren.svg +1 -0
  676. package/static/vendor/fontawesome-free/svgs/brands/replyd.svg +1 -0
  677. package/static/vendor/fontawesome-free/svgs/brands/researchgate.svg +1 -0
  678. package/static/vendor/fontawesome-free/svgs/brands/resolving.svg +1 -0
  679. package/static/vendor/fontawesome-free/svgs/brands/rev.svg +1 -0
  680. package/static/vendor/fontawesome-free/svgs/brands/rocketchat.svg +1 -0
  681. package/static/vendor/fontawesome-free/svgs/brands/rockrms.svg +1 -0
  682. package/static/vendor/fontawesome-free/svgs/brands/rust.svg +1 -0
  683. package/static/vendor/fontawesome-free/svgs/brands/safari.svg +1 -0
  684. package/static/vendor/fontawesome-free/svgs/brands/salesforce.svg +1 -0
  685. package/static/vendor/fontawesome-free/svgs/brands/sass.svg +1 -0
  686. package/static/vendor/fontawesome-free/svgs/brands/schlix.svg +1 -0
  687. package/static/vendor/fontawesome-free/svgs/brands/scribd.svg +1 -0
  688. package/static/vendor/fontawesome-free/svgs/brands/searchengin.svg +1 -0
  689. package/static/vendor/fontawesome-free/svgs/brands/sellcast.svg +1 -0
  690. package/static/vendor/fontawesome-free/svgs/brands/sellsy.svg +1 -0
  691. package/static/vendor/fontawesome-free/svgs/brands/servicestack.svg +1 -0
  692. package/static/vendor/fontawesome-free/svgs/brands/shirtsinbulk.svg +1 -0
  693. package/static/vendor/fontawesome-free/svgs/brands/shopify.svg +1 -0
  694. package/static/vendor/fontawesome-free/svgs/brands/shopware.svg +1 -0
  695. package/static/vendor/fontawesome-free/svgs/brands/simplybuilt.svg +1 -0
  696. package/static/vendor/fontawesome-free/svgs/brands/sistrix.svg +1 -0
  697. package/static/vendor/fontawesome-free/svgs/brands/sith.svg +1 -0
  698. package/static/vendor/fontawesome-free/svgs/brands/sketch.svg +1 -0
  699. package/static/vendor/fontawesome-free/svgs/brands/skyatlas.svg +1 -0
  700. package/static/vendor/fontawesome-free/svgs/brands/skype.svg +1 -0
  701. package/static/vendor/fontawesome-free/svgs/brands/slack-hash.svg +1 -0
  702. package/static/vendor/fontawesome-free/svgs/brands/slack.svg +1 -0
  703. package/static/vendor/fontawesome-free/svgs/brands/slideshare.svg +1 -0
  704. package/static/vendor/fontawesome-free/svgs/brands/snapchat-ghost.svg +1 -0
  705. package/static/vendor/fontawesome-free/svgs/brands/snapchat-square.svg +1 -0
  706. package/static/vendor/fontawesome-free/svgs/brands/snapchat.svg +1 -0
  707. package/static/vendor/fontawesome-free/svgs/brands/soundcloud.svg +1 -0
  708. package/static/vendor/fontawesome-free/svgs/brands/sourcetree.svg +1 -0
  709. package/static/vendor/fontawesome-free/svgs/brands/speakap.svg +1 -0
  710. package/static/vendor/fontawesome-free/svgs/brands/speaker-deck.svg +1 -0
  711. package/static/vendor/fontawesome-free/svgs/brands/spotify.svg +1 -0
  712. package/static/vendor/fontawesome-free/svgs/brands/squarespace.svg +1 -0
  713. package/static/vendor/fontawesome-free/svgs/brands/stack-exchange.svg +1 -0
  714. package/static/vendor/fontawesome-free/svgs/brands/stack-overflow.svg +1 -0
  715. package/static/vendor/fontawesome-free/svgs/brands/stackpath.svg +1 -0
  716. package/static/vendor/fontawesome-free/svgs/brands/staylinked.svg +1 -0
  717. package/static/vendor/fontawesome-free/svgs/brands/steam-square.svg +1 -0
  718. package/static/vendor/fontawesome-free/svgs/brands/steam-symbol.svg +1 -0
  719. package/static/vendor/fontawesome-free/svgs/brands/steam.svg +1 -0
  720. package/static/vendor/fontawesome-free/svgs/brands/sticker-mule.svg +1 -0
  721. package/static/vendor/fontawesome-free/svgs/brands/strava.svg +1 -0
  722. package/static/vendor/fontawesome-free/svgs/brands/stripe-s.svg +1 -0
  723. package/static/vendor/fontawesome-free/svgs/brands/stripe.svg +1 -0
  724. package/static/vendor/fontawesome-free/svgs/brands/studiovinari.svg +1 -0
  725. package/static/vendor/fontawesome-free/svgs/brands/stumbleupon-circle.svg +1 -0
  726. package/static/vendor/fontawesome-free/svgs/brands/stumbleupon.svg +1 -0
  727. package/static/vendor/fontawesome-free/svgs/brands/superpowers.svg +1 -0
  728. package/static/vendor/fontawesome-free/svgs/brands/supple.svg +1 -0
  729. package/static/vendor/fontawesome-free/svgs/brands/suse.svg +1 -0
  730. package/static/vendor/fontawesome-free/svgs/brands/swift.svg +1 -0
  731. package/static/vendor/fontawesome-free/svgs/brands/symfony.svg +1 -0
  732. package/static/vendor/fontawesome-free/svgs/brands/teamspeak.svg +1 -0
  733. package/static/vendor/fontawesome-free/svgs/brands/telegram-plane.svg +1 -0
  734. package/static/vendor/fontawesome-free/svgs/brands/telegram.svg +1 -0
  735. package/static/vendor/fontawesome-free/svgs/brands/tencent-weibo.svg +1 -0
  736. package/static/vendor/fontawesome-free/svgs/brands/the-red-yeti.svg +1 -0
  737. package/static/vendor/fontawesome-free/svgs/brands/themeco.svg +1 -0
  738. package/static/vendor/fontawesome-free/svgs/brands/themeisle.svg +1 -0
  739. package/static/vendor/fontawesome-free/svgs/brands/think-peaks.svg +1 -0
  740. package/static/vendor/fontawesome-free/svgs/brands/tiktok.svg +1 -0
  741. package/static/vendor/fontawesome-free/svgs/brands/trade-federation.svg +1 -0
  742. package/static/vendor/fontawesome-free/svgs/brands/trello.svg +1 -0
  743. package/static/vendor/fontawesome-free/svgs/brands/tripadvisor.svg +1 -0
  744. package/static/vendor/fontawesome-free/svgs/brands/tumblr-square.svg +1 -0
  745. package/static/vendor/fontawesome-free/svgs/brands/tumblr.svg +1 -0
  746. package/static/vendor/fontawesome-free/svgs/brands/twitch.svg +1 -0
  747. package/static/vendor/fontawesome-free/svgs/brands/twitter-square.svg +1 -0
  748. package/static/vendor/fontawesome-free/svgs/brands/twitter.svg +1 -0
  749. package/static/vendor/fontawesome-free/svgs/brands/typo3.svg +1 -0
  750. package/static/vendor/fontawesome-free/svgs/brands/uber.svg +1 -0
  751. package/static/vendor/fontawesome-free/svgs/brands/ubuntu.svg +1 -0
  752. package/static/vendor/fontawesome-free/svgs/brands/uikit.svg +1 -0
  753. package/static/vendor/fontawesome-free/svgs/brands/umbraco.svg +1 -0
  754. package/static/vendor/fontawesome-free/svgs/brands/uncharted.svg +1 -0
  755. package/static/vendor/fontawesome-free/svgs/brands/uniregistry.svg +1 -0
  756. package/static/vendor/fontawesome-free/svgs/brands/unity.svg +1 -0
  757. package/static/vendor/fontawesome-free/svgs/brands/unsplash.svg +1 -0
  758. package/static/vendor/fontawesome-free/svgs/brands/untappd.svg +1 -0
  759. package/static/vendor/fontawesome-free/svgs/brands/ups.svg +1 -0
  760. package/static/vendor/fontawesome-free/svgs/brands/usb.svg +1 -0
  761. package/static/vendor/fontawesome-free/svgs/brands/usps.svg +1 -0
  762. package/static/vendor/fontawesome-free/svgs/brands/ussunnah.svg +1 -0
  763. package/static/vendor/fontawesome-free/svgs/brands/vaadin.svg +1 -0
  764. package/static/vendor/fontawesome-free/svgs/brands/viacoin.svg +1 -0
  765. package/static/vendor/fontawesome-free/svgs/brands/viadeo-square.svg +1 -0
  766. package/static/vendor/fontawesome-free/svgs/brands/viadeo.svg +1 -0
  767. package/static/vendor/fontawesome-free/svgs/brands/viber.svg +1 -0
  768. package/static/vendor/fontawesome-free/svgs/brands/vimeo-square.svg +1 -0
  769. package/static/vendor/fontawesome-free/svgs/brands/vimeo-v.svg +1 -0
  770. package/static/vendor/fontawesome-free/svgs/brands/vimeo.svg +1 -0
  771. package/static/vendor/fontawesome-free/svgs/brands/vine.svg +1 -0
  772. package/static/vendor/fontawesome-free/svgs/brands/vk.svg +1 -0
  773. package/static/vendor/fontawesome-free/svgs/brands/vnv.svg +1 -0
  774. package/static/vendor/fontawesome-free/svgs/brands/vuejs.svg +1 -0
  775. package/static/vendor/fontawesome-free/svgs/brands/watchman-monitoring.svg +1 -0
  776. package/static/vendor/fontawesome-free/svgs/brands/waze.svg +1 -0
  777. package/static/vendor/fontawesome-free/svgs/brands/weebly.svg +1 -0
  778. package/static/vendor/fontawesome-free/svgs/brands/weibo.svg +1 -0
  779. package/static/vendor/fontawesome-free/svgs/brands/weixin.svg +1 -0
  780. package/static/vendor/fontawesome-free/svgs/brands/whatsapp-square.svg +1 -0
  781. package/static/vendor/fontawesome-free/svgs/brands/whatsapp.svg +1 -0
  782. package/static/vendor/fontawesome-free/svgs/brands/whmcs.svg +1 -0
  783. package/static/vendor/fontawesome-free/svgs/brands/wikipedia-w.svg +1 -0
  784. package/static/vendor/fontawesome-free/svgs/brands/windows.svg +1 -0
  785. package/static/vendor/fontawesome-free/svgs/brands/wix.svg +1 -0
  786. package/static/vendor/fontawesome-free/svgs/brands/wizards-of-the-coast.svg +1 -0
  787. package/static/vendor/fontawesome-free/svgs/brands/wodu.svg +1 -0
  788. package/static/vendor/fontawesome-free/svgs/brands/wolf-pack-battalion.svg +1 -0
  789. package/static/vendor/fontawesome-free/svgs/brands/wordpress-simple.svg +1 -0
  790. package/static/vendor/fontawesome-free/svgs/brands/wordpress.svg +1 -0
  791. package/static/vendor/fontawesome-free/svgs/brands/wpbeginner.svg +1 -0
  792. package/static/vendor/fontawesome-free/svgs/brands/wpexplorer.svg +1 -0
  793. package/static/vendor/fontawesome-free/svgs/brands/wpforms.svg +1 -0
  794. package/static/vendor/fontawesome-free/svgs/brands/wpressr.svg +1 -0
  795. package/static/vendor/fontawesome-free/svgs/brands/xbox.svg +1 -0
  796. package/static/vendor/fontawesome-free/svgs/brands/xing-square.svg +1 -0
  797. package/static/vendor/fontawesome-free/svgs/brands/xing.svg +1 -0
  798. package/static/vendor/fontawesome-free/svgs/brands/y-combinator.svg +1 -0
  799. package/static/vendor/fontawesome-free/svgs/brands/yahoo.svg +1 -0
  800. package/static/vendor/fontawesome-free/svgs/brands/yammer.svg +1 -0
  801. package/static/vendor/fontawesome-free/svgs/brands/yandex-international.svg +1 -0
  802. package/static/vendor/fontawesome-free/svgs/brands/yandex.svg +1 -0
  803. package/static/vendor/fontawesome-free/svgs/brands/yarn.svg +1 -0
  804. package/static/vendor/fontawesome-free/svgs/brands/yelp.svg +1 -0
  805. package/static/vendor/fontawesome-free/svgs/brands/yoast.svg +1 -0
  806. package/static/vendor/fontawesome-free/svgs/brands/youtube-square.svg +1 -0
  807. package/static/vendor/fontawesome-free/svgs/brands/youtube.svg +1 -0
  808. package/static/vendor/fontawesome-free/svgs/brands/zhihu.svg +1 -0
  809. package/static/vendor/fontawesome-free/svgs/regular/address-book.svg +1 -0
  810. package/static/vendor/fontawesome-free/svgs/regular/address-card.svg +1 -0
  811. package/static/vendor/fontawesome-free/svgs/regular/angry.svg +1 -0
  812. package/static/vendor/fontawesome-free/svgs/regular/arrow-alt-circle-down.svg +1 -0
  813. package/static/vendor/fontawesome-free/svgs/regular/arrow-alt-circle-left.svg +1 -0
  814. package/static/vendor/fontawesome-free/svgs/regular/arrow-alt-circle-right.svg +1 -0
  815. package/static/vendor/fontawesome-free/svgs/regular/arrow-alt-circle-up.svg +1 -0
  816. package/static/vendor/fontawesome-free/svgs/regular/bell-slash.svg +1 -0
  817. package/static/vendor/fontawesome-free/svgs/regular/bell.svg +1 -0
  818. package/static/vendor/fontawesome-free/svgs/regular/bookmark.svg +1 -0
  819. package/static/vendor/fontawesome-free/svgs/regular/building.svg +1 -0
  820. package/static/vendor/fontawesome-free/svgs/regular/calendar-alt.svg +1 -0
  821. package/static/vendor/fontawesome-free/svgs/regular/calendar-check.svg +1 -0
  822. package/static/vendor/fontawesome-free/svgs/regular/calendar-minus.svg +1 -0
  823. package/static/vendor/fontawesome-free/svgs/regular/calendar-plus.svg +1 -0
  824. package/static/vendor/fontawesome-free/svgs/regular/calendar-times.svg +1 -0
  825. package/static/vendor/fontawesome-free/svgs/regular/calendar.svg +1 -0
  826. package/static/vendor/fontawesome-free/svgs/regular/caret-square-down.svg +1 -0
  827. package/static/vendor/fontawesome-free/svgs/regular/caret-square-left.svg +1 -0
  828. package/static/vendor/fontawesome-free/svgs/regular/caret-square-right.svg +1 -0
  829. package/static/vendor/fontawesome-free/svgs/regular/caret-square-up.svg +1 -0
  830. package/static/vendor/fontawesome-free/svgs/regular/chart-bar.svg +1 -0
  831. package/static/vendor/fontawesome-free/svgs/regular/check-circle.svg +1 -0
  832. package/static/vendor/fontawesome-free/svgs/regular/check-square.svg +1 -0
  833. package/static/vendor/fontawesome-free/svgs/regular/circle.svg +1 -0
  834. package/static/vendor/fontawesome-free/svgs/regular/clipboard.svg +1 -0
  835. package/static/vendor/fontawesome-free/svgs/regular/clock.svg +1 -0
  836. package/static/vendor/fontawesome-free/svgs/regular/clone.svg +1 -0
  837. package/static/vendor/fontawesome-free/svgs/regular/closed-captioning.svg +1 -0
  838. package/static/vendor/fontawesome-free/svgs/regular/comment-alt.svg +1 -0
  839. package/static/vendor/fontawesome-free/svgs/regular/comment-dots.svg +1 -0
  840. package/static/vendor/fontawesome-free/svgs/regular/comment.svg +1 -0
  841. package/static/vendor/fontawesome-free/svgs/regular/comments.svg +1 -0
  842. package/static/vendor/fontawesome-free/svgs/regular/compass.svg +1 -0
  843. package/static/vendor/fontawesome-free/svgs/regular/copy.svg +1 -0
  844. package/static/vendor/fontawesome-free/svgs/regular/copyright.svg +1 -0
  845. package/static/vendor/fontawesome-free/svgs/regular/credit-card.svg +1 -0
  846. package/static/vendor/fontawesome-free/svgs/regular/dizzy.svg +1 -0
  847. package/static/vendor/fontawesome-free/svgs/regular/dot-circle.svg +1 -0
  848. package/static/vendor/fontawesome-free/svgs/regular/edit.svg +1 -0
  849. package/static/vendor/fontawesome-free/svgs/regular/envelope-open.svg +1 -0
  850. package/static/vendor/fontawesome-free/svgs/regular/envelope.svg +1 -0
  851. package/static/vendor/fontawesome-free/svgs/regular/eye-slash.svg +1 -0
  852. package/static/vendor/fontawesome-free/svgs/regular/eye.svg +1 -0
  853. package/static/vendor/fontawesome-free/svgs/regular/file-alt.svg +1 -0
  854. package/static/vendor/fontawesome-free/svgs/regular/file-archive.svg +1 -0
  855. package/static/vendor/fontawesome-free/svgs/regular/file-audio.svg +1 -0
  856. package/static/vendor/fontawesome-free/svgs/regular/file-code.svg +1 -0
  857. package/static/vendor/fontawesome-free/svgs/regular/file-excel.svg +1 -0
  858. package/static/vendor/fontawesome-free/svgs/regular/file-image.svg +1 -0
  859. package/static/vendor/fontawesome-free/svgs/regular/file-pdf.svg +1 -0
  860. package/static/vendor/fontawesome-free/svgs/regular/file-powerpoint.svg +1 -0
  861. package/static/vendor/fontawesome-free/svgs/regular/file-video.svg +1 -0
  862. package/static/vendor/fontawesome-free/svgs/regular/file-word.svg +1 -0
  863. package/static/vendor/fontawesome-free/svgs/regular/file.svg +1 -0
  864. package/static/vendor/fontawesome-free/svgs/regular/flag.svg +1 -0
  865. package/static/vendor/fontawesome-free/svgs/regular/flushed.svg +1 -0
  866. package/static/vendor/fontawesome-free/svgs/regular/folder-open.svg +1 -0
  867. package/static/vendor/fontawesome-free/svgs/regular/folder.svg +1 -0
  868. package/static/vendor/fontawesome-free/svgs/regular/font-awesome-logo-full.svg +1 -0
  869. package/static/vendor/fontawesome-free/svgs/regular/frown-open.svg +1 -0
  870. package/static/vendor/fontawesome-free/svgs/regular/frown.svg +1 -0
  871. package/static/vendor/fontawesome-free/svgs/regular/futbol.svg +1 -0
  872. package/static/vendor/fontawesome-free/svgs/regular/gem.svg +1 -0
  873. package/static/vendor/fontawesome-free/svgs/regular/grimace.svg +1 -0
  874. package/static/vendor/fontawesome-free/svgs/regular/grin-alt.svg +1 -0
  875. package/static/vendor/fontawesome-free/svgs/regular/grin-beam-sweat.svg +1 -0
  876. package/static/vendor/fontawesome-free/svgs/regular/grin-beam.svg +1 -0
  877. package/static/vendor/fontawesome-free/svgs/regular/grin-hearts.svg +1 -0
  878. package/static/vendor/fontawesome-free/svgs/regular/grin-squint-tears.svg +1 -0
  879. package/static/vendor/fontawesome-free/svgs/regular/grin-squint.svg +1 -0
  880. package/static/vendor/fontawesome-free/svgs/regular/grin-stars.svg +1 -0
  881. package/static/vendor/fontawesome-free/svgs/regular/grin-tears.svg +1 -0
  882. package/static/vendor/fontawesome-free/svgs/regular/grin-tongue-squint.svg +1 -0
  883. package/static/vendor/fontawesome-free/svgs/regular/grin-tongue-wink.svg +1 -0
  884. package/static/vendor/fontawesome-free/svgs/regular/grin-tongue.svg +1 -0
  885. package/static/vendor/fontawesome-free/svgs/regular/grin-wink.svg +1 -0
  886. package/static/vendor/fontawesome-free/svgs/regular/grin.svg +1 -0
  887. package/static/vendor/fontawesome-free/svgs/regular/hand-lizard.svg +1 -0
  888. package/static/vendor/fontawesome-free/svgs/regular/hand-paper.svg +1 -0
  889. package/static/vendor/fontawesome-free/svgs/regular/hand-peace.svg +1 -0
  890. package/static/vendor/fontawesome-free/svgs/regular/hand-point-down.svg +1 -0
  891. package/static/vendor/fontawesome-free/svgs/regular/hand-point-left.svg +1 -0
  892. package/static/vendor/fontawesome-free/svgs/regular/hand-point-right.svg +1 -0
  893. package/static/vendor/fontawesome-free/svgs/regular/hand-point-up.svg +1 -0
  894. package/static/vendor/fontawesome-free/svgs/regular/hand-pointer.svg +1 -0
  895. package/static/vendor/fontawesome-free/svgs/regular/hand-rock.svg +1 -0
  896. package/static/vendor/fontawesome-free/svgs/regular/hand-scissors.svg +1 -0
  897. package/static/vendor/fontawesome-free/svgs/regular/hand-spock.svg +1 -0
  898. package/static/vendor/fontawesome-free/svgs/regular/handshake.svg +1 -0
  899. package/static/vendor/fontawesome-free/svgs/regular/hdd.svg +1 -0
  900. package/static/vendor/fontawesome-free/svgs/regular/heart.svg +1 -0
  901. package/static/vendor/fontawesome-free/svgs/regular/hospital.svg +1 -0
  902. package/static/vendor/fontawesome-free/svgs/regular/hourglass.svg +1 -0
  903. package/static/vendor/fontawesome-free/svgs/regular/id-badge.svg +1 -0
  904. package/static/vendor/fontawesome-free/svgs/regular/id-card.svg +1 -0
  905. package/static/vendor/fontawesome-free/svgs/regular/image.svg +1 -0
  906. package/static/vendor/fontawesome-free/svgs/regular/images.svg +1 -0
  907. package/static/vendor/fontawesome-free/svgs/regular/keyboard.svg +1 -0
  908. package/static/vendor/fontawesome-free/svgs/regular/kiss-beam.svg +1 -0
  909. package/static/vendor/fontawesome-free/svgs/regular/kiss-wink-heart.svg +1 -0
  910. package/static/vendor/fontawesome-free/svgs/regular/kiss.svg +1 -0
  911. package/static/vendor/fontawesome-free/svgs/regular/laugh-beam.svg +1 -0
  912. package/static/vendor/fontawesome-free/svgs/regular/laugh-squint.svg +1 -0
  913. package/static/vendor/fontawesome-free/svgs/regular/laugh-wink.svg +1 -0
  914. package/static/vendor/fontawesome-free/svgs/regular/laugh.svg +1 -0
  915. package/static/vendor/fontawesome-free/svgs/regular/lemon.svg +1 -0
  916. package/static/vendor/fontawesome-free/svgs/regular/life-ring.svg +1 -0
  917. package/static/vendor/fontawesome-free/svgs/regular/lightbulb.svg +1 -0
  918. package/static/vendor/fontawesome-free/svgs/regular/list-alt.svg +1 -0
  919. package/static/vendor/fontawesome-free/svgs/regular/map.svg +1 -0
  920. package/static/vendor/fontawesome-free/svgs/regular/meh-blank.svg +1 -0
  921. package/static/vendor/fontawesome-free/svgs/regular/meh-rolling-eyes.svg +1 -0
  922. package/static/vendor/fontawesome-free/svgs/regular/meh.svg +1 -0
  923. package/static/vendor/fontawesome-free/svgs/regular/minus-square.svg +1 -0
  924. package/static/vendor/fontawesome-free/svgs/regular/money-bill-alt.svg +1 -0
  925. package/static/vendor/fontawesome-free/svgs/regular/moon.svg +1 -0
  926. package/static/vendor/fontawesome-free/svgs/regular/newspaper.svg +1 -0
  927. package/static/vendor/fontawesome-free/svgs/regular/object-group.svg +1 -0
  928. package/static/vendor/fontawesome-free/svgs/regular/object-ungroup.svg +1 -0
  929. package/static/vendor/fontawesome-free/svgs/regular/paper-plane.svg +1 -0
  930. package/static/vendor/fontawesome-free/svgs/regular/pause-circle.svg +1 -0
  931. package/static/vendor/fontawesome-free/svgs/regular/play-circle.svg +1 -0
  932. package/static/vendor/fontawesome-free/svgs/regular/plus-square.svg +1 -0
  933. package/static/vendor/fontawesome-free/svgs/regular/question-circle.svg +1 -0
  934. package/static/vendor/fontawesome-free/svgs/regular/registered.svg +1 -0
  935. package/static/vendor/fontawesome-free/svgs/regular/sad-cry.svg +1 -0
  936. package/static/vendor/fontawesome-free/svgs/regular/sad-tear.svg +1 -0
  937. package/static/vendor/fontawesome-free/svgs/regular/save.svg +1 -0
  938. package/static/vendor/fontawesome-free/svgs/regular/share-square.svg +1 -0
  939. package/static/vendor/fontawesome-free/svgs/regular/smile-beam.svg +1 -0
  940. package/static/vendor/fontawesome-free/svgs/regular/smile-wink.svg +1 -0
  941. package/static/vendor/fontawesome-free/svgs/regular/smile.svg +1 -0
  942. package/static/vendor/fontawesome-free/svgs/regular/snowflake.svg +1 -0
  943. package/static/vendor/fontawesome-free/svgs/regular/square.svg +1 -0
  944. package/static/vendor/fontawesome-free/svgs/regular/star-half.svg +1 -0
  945. package/static/vendor/fontawesome-free/svgs/regular/star.svg +1 -0
  946. package/static/vendor/fontawesome-free/svgs/regular/sticky-note.svg +1 -0
  947. package/static/vendor/fontawesome-free/svgs/regular/stop-circle.svg +1 -0
  948. package/static/vendor/fontawesome-free/svgs/regular/sun.svg +1 -0
  949. package/static/vendor/fontawesome-free/svgs/regular/surprise.svg +1 -0
  950. package/static/vendor/fontawesome-free/svgs/regular/thumbs-down.svg +1 -0
  951. package/static/vendor/fontawesome-free/svgs/regular/thumbs-up.svg +1 -0
  952. package/static/vendor/fontawesome-free/svgs/regular/times-circle.svg +1 -0
  953. package/static/vendor/fontawesome-free/svgs/regular/tired.svg +1 -0
  954. package/static/vendor/fontawesome-free/svgs/regular/trash-alt.svg +1 -0
  955. package/static/vendor/fontawesome-free/svgs/regular/user-circle.svg +1 -0
  956. package/static/vendor/fontawesome-free/svgs/regular/user.svg +1 -0
  957. package/static/vendor/fontawesome-free/svgs/regular/window-close.svg +1 -0
  958. package/static/vendor/fontawesome-free/svgs/regular/window-maximize.svg +1 -0
  959. package/static/vendor/fontawesome-free/svgs/regular/window-minimize.svg +1 -0
  960. package/static/vendor/fontawesome-free/svgs/regular/window-restore.svg +1 -0
  961. package/static/vendor/fontawesome-free/svgs/solid/ad.svg +1 -0
  962. package/static/vendor/fontawesome-free/svgs/solid/address-book.svg +1 -0
  963. package/static/vendor/fontawesome-free/svgs/solid/address-card.svg +1 -0
  964. package/static/vendor/fontawesome-free/svgs/solid/adjust.svg +1 -0
  965. package/static/vendor/fontawesome-free/svgs/solid/air-freshener.svg +1 -0
  966. package/static/vendor/fontawesome-free/svgs/solid/align-center.svg +1 -0
  967. package/static/vendor/fontawesome-free/svgs/solid/align-justify.svg +1 -0
  968. package/static/vendor/fontawesome-free/svgs/solid/align-left.svg +1 -0
  969. package/static/vendor/fontawesome-free/svgs/solid/align-right.svg +1 -0
  970. package/static/vendor/fontawesome-free/svgs/solid/allergies.svg +1 -0
  971. package/static/vendor/fontawesome-free/svgs/solid/ambulance.svg +1 -0
  972. package/static/vendor/fontawesome-free/svgs/solid/american-sign-language-interpreting.svg +1 -0
  973. package/static/vendor/fontawesome-free/svgs/solid/anchor.svg +1 -0
  974. package/static/vendor/fontawesome-free/svgs/solid/angle-double-down.svg +1 -0
  975. package/static/vendor/fontawesome-free/svgs/solid/angle-double-left.svg +1 -0
  976. package/static/vendor/fontawesome-free/svgs/solid/angle-double-right.svg +1 -0
  977. package/static/vendor/fontawesome-free/svgs/solid/angle-double-up.svg +1 -0
  978. package/static/vendor/fontawesome-free/svgs/solid/angle-down.svg +1 -0
  979. package/static/vendor/fontawesome-free/svgs/solid/angle-left.svg +1 -0
  980. package/static/vendor/fontawesome-free/svgs/solid/angle-right.svg +1 -0
  981. package/static/vendor/fontawesome-free/svgs/solid/angle-up.svg +1 -0
  982. package/static/vendor/fontawesome-free/svgs/solid/angry.svg +1 -0
  983. package/static/vendor/fontawesome-free/svgs/solid/ankh.svg +1 -0
  984. package/static/vendor/fontawesome-free/svgs/solid/apple-alt.svg +1 -0
  985. package/static/vendor/fontawesome-free/svgs/solid/archive.svg +1 -0
  986. package/static/vendor/fontawesome-free/svgs/solid/archway.svg +1 -0
  987. package/static/vendor/fontawesome-free/svgs/solid/arrow-alt-circle-down.svg +1 -0
  988. package/static/vendor/fontawesome-free/svgs/solid/arrow-alt-circle-left.svg +1 -0
  989. package/static/vendor/fontawesome-free/svgs/solid/arrow-alt-circle-right.svg +1 -0
  990. package/static/vendor/fontawesome-free/svgs/solid/arrow-alt-circle-up.svg +1 -0
  991. package/static/vendor/fontawesome-free/svgs/solid/arrow-circle-down.svg +1 -0
  992. package/static/vendor/fontawesome-free/svgs/solid/arrow-circle-left.svg +1 -0
  993. package/static/vendor/fontawesome-free/svgs/solid/arrow-circle-right.svg +1 -0
  994. package/static/vendor/fontawesome-free/svgs/solid/arrow-circle-up.svg +1 -0
  995. package/static/vendor/fontawesome-free/svgs/solid/arrow-down.svg +1 -0
  996. package/static/vendor/fontawesome-free/svgs/solid/arrow-left.svg +1 -0
  997. package/static/vendor/fontawesome-free/svgs/solid/arrow-right.svg +1 -0
  998. package/static/vendor/fontawesome-free/svgs/solid/arrow-up.svg +1 -0
  999. package/static/vendor/fontawesome-free/svgs/solid/arrows-alt-h.svg +1 -0
  1000. package/static/vendor/fontawesome-free/svgs/solid/arrows-alt-v.svg +1 -0
  1001. package/static/vendor/fontawesome-free/svgs/solid/arrows-alt.svg +1 -0
  1002. package/static/vendor/fontawesome-free/svgs/solid/assistive-listening-systems.svg +1 -0
  1003. package/static/vendor/fontawesome-free/svgs/solid/asterisk.svg +1 -0
  1004. package/static/vendor/fontawesome-free/svgs/solid/at.svg +1 -0
  1005. package/static/vendor/fontawesome-free/svgs/solid/atlas.svg +1 -0
  1006. package/static/vendor/fontawesome-free/svgs/solid/atom.svg +1 -0
  1007. package/static/vendor/fontawesome-free/svgs/solid/audio-description.svg +1 -0
  1008. package/static/vendor/fontawesome-free/svgs/solid/award.svg +1 -0
  1009. package/static/vendor/fontawesome-free/svgs/solid/baby-carriage.svg +1 -0
  1010. package/static/vendor/fontawesome-free/svgs/solid/baby.svg +1 -0
  1011. package/static/vendor/fontawesome-free/svgs/solid/backspace.svg +1 -0
  1012. package/static/vendor/fontawesome-free/svgs/solid/backward.svg +1 -0
  1013. package/static/vendor/fontawesome-free/svgs/solid/bacon.svg +1 -0
  1014. package/static/vendor/fontawesome-free/svgs/solid/bacteria.svg +1 -0
  1015. package/static/vendor/fontawesome-free/svgs/solid/bacterium.svg +1 -0
  1016. package/static/vendor/fontawesome-free/svgs/solid/bahai.svg +1 -0
  1017. package/static/vendor/fontawesome-free/svgs/solid/balance-scale-left.svg +1 -0
  1018. package/static/vendor/fontawesome-free/svgs/solid/balance-scale-right.svg +1 -0
  1019. package/static/vendor/fontawesome-free/svgs/solid/balance-scale.svg +1 -0
  1020. package/static/vendor/fontawesome-free/svgs/solid/ban.svg +1 -0
  1021. package/static/vendor/fontawesome-free/svgs/solid/band-aid.svg +1 -0
  1022. package/static/vendor/fontawesome-free/svgs/solid/barcode.svg +1 -0
  1023. package/static/vendor/fontawesome-free/svgs/solid/bars.svg +1 -0
  1024. package/static/vendor/fontawesome-free/svgs/solid/baseball-ball.svg +1 -0
  1025. package/static/vendor/fontawesome-free/svgs/solid/basketball-ball.svg +1 -0
  1026. package/static/vendor/fontawesome-free/svgs/solid/bath.svg +1 -0
  1027. package/static/vendor/fontawesome-free/svgs/solid/battery-empty.svg +1 -0
  1028. package/static/vendor/fontawesome-free/svgs/solid/battery-full.svg +1 -0
  1029. package/static/vendor/fontawesome-free/svgs/solid/battery-half.svg +1 -0
  1030. package/static/vendor/fontawesome-free/svgs/solid/battery-quarter.svg +1 -0
  1031. package/static/vendor/fontawesome-free/svgs/solid/battery-three-quarters.svg +1 -0
  1032. package/static/vendor/fontawesome-free/svgs/solid/bed.svg +1 -0
  1033. package/static/vendor/fontawesome-free/svgs/solid/beer.svg +1 -0
  1034. package/static/vendor/fontawesome-free/svgs/solid/bell-slash.svg +1 -0
  1035. package/static/vendor/fontawesome-free/svgs/solid/bell.svg +1 -0
  1036. package/static/vendor/fontawesome-free/svgs/solid/bezier-curve.svg +1 -0
  1037. package/static/vendor/fontawesome-free/svgs/solid/bible.svg +1 -0
  1038. package/static/vendor/fontawesome-free/svgs/solid/bicycle.svg +1 -0
  1039. package/static/vendor/fontawesome-free/svgs/solid/biking.svg +1 -0
  1040. package/static/vendor/fontawesome-free/svgs/solid/binoculars.svg +1 -0
  1041. package/static/vendor/fontawesome-free/svgs/solid/biohazard.svg +1 -0
  1042. package/static/vendor/fontawesome-free/svgs/solid/birthday-cake.svg +1 -0
  1043. package/static/vendor/fontawesome-free/svgs/solid/blender-phone.svg +1 -0
  1044. package/static/vendor/fontawesome-free/svgs/solid/blender.svg +1 -0
  1045. package/static/vendor/fontawesome-free/svgs/solid/blind.svg +1 -0
  1046. package/static/vendor/fontawesome-free/svgs/solid/blog.svg +1 -0
  1047. package/static/vendor/fontawesome-free/svgs/solid/bold.svg +1 -0
  1048. package/static/vendor/fontawesome-free/svgs/solid/bolt.svg +1 -0
  1049. package/static/vendor/fontawesome-free/svgs/solid/bomb.svg +1 -0
  1050. package/static/vendor/fontawesome-free/svgs/solid/bone.svg +1 -0
  1051. package/static/vendor/fontawesome-free/svgs/solid/bong.svg +1 -0
  1052. package/static/vendor/fontawesome-free/svgs/solid/book-dead.svg +1 -0
  1053. package/static/vendor/fontawesome-free/svgs/solid/book-medical.svg +1 -0
  1054. package/static/vendor/fontawesome-free/svgs/solid/book-open.svg +1 -0
  1055. package/static/vendor/fontawesome-free/svgs/solid/book-reader.svg +1 -0
  1056. package/static/vendor/fontawesome-free/svgs/solid/book.svg +1 -0
  1057. package/static/vendor/fontawesome-free/svgs/solid/bookmark.svg +1 -0
  1058. package/static/vendor/fontawesome-free/svgs/solid/border-all.svg +1 -0
  1059. package/static/vendor/fontawesome-free/svgs/solid/border-none.svg +1 -0
  1060. package/static/vendor/fontawesome-free/svgs/solid/border-style.svg +1 -0
  1061. package/static/vendor/fontawesome-free/svgs/solid/bowling-ball.svg +1 -0
  1062. package/static/vendor/fontawesome-free/svgs/solid/box-open.svg +1 -0
  1063. package/static/vendor/fontawesome-free/svgs/solid/box-tissue.svg +1 -0
  1064. package/static/vendor/fontawesome-free/svgs/solid/box.svg +1 -0
  1065. package/static/vendor/fontawesome-free/svgs/solid/boxes.svg +1 -0
  1066. package/static/vendor/fontawesome-free/svgs/solid/braille.svg +1 -0
  1067. package/static/vendor/fontawesome-free/svgs/solid/brain.svg +1 -0
  1068. package/static/vendor/fontawesome-free/svgs/solid/bread-slice.svg +1 -0
  1069. package/static/vendor/fontawesome-free/svgs/solid/briefcase-medical.svg +1 -0
  1070. package/static/vendor/fontawesome-free/svgs/solid/briefcase.svg +1 -0
  1071. package/static/vendor/fontawesome-free/svgs/solid/broadcast-tower.svg +1 -0
  1072. package/static/vendor/fontawesome-free/svgs/solid/broom.svg +1 -0
  1073. package/static/vendor/fontawesome-free/svgs/solid/brush.svg +1 -0
  1074. package/static/vendor/fontawesome-free/svgs/solid/bug.svg +1 -0
  1075. package/static/vendor/fontawesome-free/svgs/solid/building.svg +1 -0
  1076. package/static/vendor/fontawesome-free/svgs/solid/bullhorn.svg +1 -0
  1077. package/static/vendor/fontawesome-free/svgs/solid/bullseye.svg +1 -0
  1078. package/static/vendor/fontawesome-free/svgs/solid/burn.svg +1 -0
  1079. package/static/vendor/fontawesome-free/svgs/solid/bus-alt.svg +1 -0
  1080. package/static/vendor/fontawesome-free/svgs/solid/bus.svg +1 -0
  1081. package/static/vendor/fontawesome-free/svgs/solid/business-time.svg +1 -0
  1082. package/static/vendor/fontawesome-free/svgs/solid/calculator.svg +1 -0
  1083. package/static/vendor/fontawesome-free/svgs/solid/calendar-alt.svg +1 -0
  1084. package/static/vendor/fontawesome-free/svgs/solid/calendar-check.svg +1 -0
  1085. package/static/vendor/fontawesome-free/svgs/solid/calendar-day.svg +1 -0
  1086. package/static/vendor/fontawesome-free/svgs/solid/calendar-minus.svg +1 -0
  1087. package/static/vendor/fontawesome-free/svgs/solid/calendar-plus.svg +1 -0
  1088. package/static/vendor/fontawesome-free/svgs/solid/calendar-times.svg +1 -0
  1089. package/static/vendor/fontawesome-free/svgs/solid/calendar-week.svg +1 -0
  1090. package/static/vendor/fontawesome-free/svgs/solid/calendar.svg +1 -0
  1091. package/static/vendor/fontawesome-free/svgs/solid/camera-retro.svg +1 -0
  1092. package/static/vendor/fontawesome-free/svgs/solid/camera.svg +1 -0
  1093. package/static/vendor/fontawesome-free/svgs/solid/campground.svg +1 -0
  1094. package/static/vendor/fontawesome-free/svgs/solid/candy-cane.svg +1 -0
  1095. package/static/vendor/fontawesome-free/svgs/solid/cannabis.svg +1 -0
  1096. package/static/vendor/fontawesome-free/svgs/solid/capsules.svg +1 -0
  1097. package/static/vendor/fontawesome-free/svgs/solid/car-alt.svg +1 -0
  1098. package/static/vendor/fontawesome-free/svgs/solid/car-battery.svg +1 -0
  1099. package/static/vendor/fontawesome-free/svgs/solid/car-crash.svg +1 -0
  1100. package/static/vendor/fontawesome-free/svgs/solid/car-side.svg +1 -0
  1101. package/static/vendor/fontawesome-free/svgs/solid/car.svg +1 -0
  1102. package/static/vendor/fontawesome-free/svgs/solid/caravan.svg +1 -0
  1103. package/static/vendor/fontawesome-free/svgs/solid/caret-down.svg +1 -0
  1104. package/static/vendor/fontawesome-free/svgs/solid/caret-left.svg +1 -0
  1105. package/static/vendor/fontawesome-free/svgs/solid/caret-right.svg +1 -0
  1106. package/static/vendor/fontawesome-free/svgs/solid/caret-square-down.svg +1 -0
  1107. package/static/vendor/fontawesome-free/svgs/solid/caret-square-left.svg +1 -0
  1108. package/static/vendor/fontawesome-free/svgs/solid/caret-square-right.svg +1 -0
  1109. package/static/vendor/fontawesome-free/svgs/solid/caret-square-up.svg +1 -0
  1110. package/static/vendor/fontawesome-free/svgs/solid/caret-up.svg +1 -0
  1111. package/static/vendor/fontawesome-free/svgs/solid/carrot.svg +1 -0
  1112. package/static/vendor/fontawesome-free/svgs/solid/cart-arrow-down.svg +1 -0
  1113. package/static/vendor/fontawesome-free/svgs/solid/cart-plus.svg +1 -0
  1114. package/static/vendor/fontawesome-free/svgs/solid/cash-register.svg +1 -0
  1115. package/static/vendor/fontawesome-free/svgs/solid/cat.svg +1 -0
  1116. package/static/vendor/fontawesome-free/svgs/solid/certificate.svg +1 -0
  1117. package/static/vendor/fontawesome-free/svgs/solid/chair.svg +1 -0
  1118. package/static/vendor/fontawesome-free/svgs/solid/chalkboard-teacher.svg +1 -0
  1119. package/static/vendor/fontawesome-free/svgs/solid/chalkboard.svg +1 -0
  1120. package/static/vendor/fontawesome-free/svgs/solid/charging-station.svg +1 -0
  1121. package/static/vendor/fontawesome-free/svgs/solid/chart-area.svg +1 -0
  1122. package/static/vendor/fontawesome-free/svgs/solid/chart-bar.svg +1 -0
  1123. package/static/vendor/fontawesome-free/svgs/solid/chart-line.svg +1 -0
  1124. package/static/vendor/fontawesome-free/svgs/solid/chart-pie.svg +1 -0
  1125. package/static/vendor/fontawesome-free/svgs/solid/check-circle.svg +1 -0
  1126. package/static/vendor/fontawesome-free/svgs/solid/check-double.svg +1 -0
  1127. package/static/vendor/fontawesome-free/svgs/solid/check-square.svg +1 -0
  1128. package/static/vendor/fontawesome-free/svgs/solid/check.svg +1 -0
  1129. package/static/vendor/fontawesome-free/svgs/solid/cheese.svg +1 -0
  1130. package/static/vendor/fontawesome-free/svgs/solid/chess-bishop.svg +1 -0
  1131. package/static/vendor/fontawesome-free/svgs/solid/chess-board.svg +1 -0
  1132. package/static/vendor/fontawesome-free/svgs/solid/chess-king.svg +1 -0
  1133. package/static/vendor/fontawesome-free/svgs/solid/chess-knight.svg +1 -0
  1134. package/static/vendor/fontawesome-free/svgs/solid/chess-pawn.svg +1 -0
  1135. package/static/vendor/fontawesome-free/svgs/solid/chess-queen.svg +1 -0
  1136. package/static/vendor/fontawesome-free/svgs/solid/chess-rook.svg +1 -0
  1137. package/static/vendor/fontawesome-free/svgs/solid/chess.svg +1 -0
  1138. package/static/vendor/fontawesome-free/svgs/solid/chevron-circle-down.svg +1 -0
  1139. package/static/vendor/fontawesome-free/svgs/solid/chevron-circle-left.svg +1 -0
  1140. package/static/vendor/fontawesome-free/svgs/solid/chevron-circle-right.svg +1 -0
  1141. package/static/vendor/fontawesome-free/svgs/solid/chevron-circle-up.svg +1 -0
  1142. package/static/vendor/fontawesome-free/svgs/solid/chevron-down.svg +1 -0
  1143. package/static/vendor/fontawesome-free/svgs/solid/chevron-left.svg +1 -0
  1144. package/static/vendor/fontawesome-free/svgs/solid/chevron-right.svg +1 -0
  1145. package/static/vendor/fontawesome-free/svgs/solid/chevron-up.svg +1 -0
  1146. package/static/vendor/fontawesome-free/svgs/solid/child.svg +1 -0
  1147. package/static/vendor/fontawesome-free/svgs/solid/church.svg +1 -0
  1148. package/static/vendor/fontawesome-free/svgs/solid/circle-notch.svg +1 -0
  1149. package/static/vendor/fontawesome-free/svgs/solid/circle.svg +1 -0
  1150. package/static/vendor/fontawesome-free/svgs/solid/city.svg +1 -0
  1151. package/static/vendor/fontawesome-free/svgs/solid/clinic-medical.svg +1 -0
  1152. package/static/vendor/fontawesome-free/svgs/solid/clipboard-check.svg +1 -0
  1153. package/static/vendor/fontawesome-free/svgs/solid/clipboard-list.svg +1 -0
  1154. package/static/vendor/fontawesome-free/svgs/solid/clipboard.svg +1 -0
  1155. package/static/vendor/fontawesome-free/svgs/solid/clock.svg +1 -0
  1156. package/static/vendor/fontawesome-free/svgs/solid/clone.svg +1 -0
  1157. package/static/vendor/fontawesome-free/svgs/solid/closed-captioning.svg +1 -0
  1158. package/static/vendor/fontawesome-free/svgs/solid/cloud-download-alt.svg +1 -0
  1159. package/static/vendor/fontawesome-free/svgs/solid/cloud-meatball.svg +1 -0
  1160. package/static/vendor/fontawesome-free/svgs/solid/cloud-moon-rain.svg +1 -0
  1161. package/static/vendor/fontawesome-free/svgs/solid/cloud-moon.svg +1 -0
  1162. package/static/vendor/fontawesome-free/svgs/solid/cloud-rain.svg +1 -0
  1163. package/static/vendor/fontawesome-free/svgs/solid/cloud-showers-heavy.svg +1 -0
  1164. package/static/vendor/fontawesome-free/svgs/solid/cloud-sun-rain.svg +1 -0
  1165. package/static/vendor/fontawesome-free/svgs/solid/cloud-sun.svg +1 -0
  1166. package/static/vendor/fontawesome-free/svgs/solid/cloud-upload-alt.svg +1 -0
  1167. package/static/vendor/fontawesome-free/svgs/solid/cloud.svg +1 -0
  1168. package/static/vendor/fontawesome-free/svgs/solid/cocktail.svg +1 -0
  1169. package/static/vendor/fontawesome-free/svgs/solid/code-branch.svg +1 -0
  1170. package/static/vendor/fontawesome-free/svgs/solid/code.svg +1 -0
  1171. package/static/vendor/fontawesome-free/svgs/solid/coffee.svg +1 -0
  1172. package/static/vendor/fontawesome-free/svgs/solid/cog.svg +1 -0
  1173. package/static/vendor/fontawesome-free/svgs/solid/cogs.svg +1 -0
  1174. package/static/vendor/fontawesome-free/svgs/solid/coins.svg +1 -0
  1175. package/static/vendor/fontawesome-free/svgs/solid/columns.svg +1 -0
  1176. package/static/vendor/fontawesome-free/svgs/solid/comment-alt.svg +1 -0
  1177. package/static/vendor/fontawesome-free/svgs/solid/comment-dollar.svg +1 -0
  1178. package/static/vendor/fontawesome-free/svgs/solid/comment-dots.svg +1 -0
  1179. package/static/vendor/fontawesome-free/svgs/solid/comment-medical.svg +1 -0
  1180. package/static/vendor/fontawesome-free/svgs/solid/comment-slash.svg +1 -0
  1181. package/static/vendor/fontawesome-free/svgs/solid/comment.svg +1 -0
  1182. package/static/vendor/fontawesome-free/svgs/solid/comments-dollar.svg +1 -0
  1183. package/static/vendor/fontawesome-free/svgs/solid/comments.svg +1 -0
  1184. package/static/vendor/fontawesome-free/svgs/solid/compact-disc.svg +1 -0
  1185. package/static/vendor/fontawesome-free/svgs/solid/compass.svg +1 -0
  1186. package/static/vendor/fontawesome-free/svgs/solid/compress-alt.svg +1 -0
  1187. package/static/vendor/fontawesome-free/svgs/solid/compress-arrows-alt.svg +1 -0
  1188. package/static/vendor/fontawesome-free/svgs/solid/compress.svg +1 -0
  1189. package/static/vendor/fontawesome-free/svgs/solid/concierge-bell.svg +1 -0
  1190. package/static/vendor/fontawesome-free/svgs/solid/cookie-bite.svg +1 -0
  1191. package/static/vendor/fontawesome-free/svgs/solid/cookie.svg +1 -0
  1192. package/static/vendor/fontawesome-free/svgs/solid/copy.svg +1 -0
  1193. package/static/vendor/fontawesome-free/svgs/solid/copyright.svg +1 -0
  1194. package/static/vendor/fontawesome-free/svgs/solid/couch.svg +1 -0
  1195. package/static/vendor/fontawesome-free/svgs/solid/credit-card.svg +1 -0
  1196. package/static/vendor/fontawesome-free/svgs/solid/crop-alt.svg +1 -0
  1197. package/static/vendor/fontawesome-free/svgs/solid/crop.svg +1 -0
  1198. package/static/vendor/fontawesome-free/svgs/solid/cross.svg +1 -0
  1199. package/static/vendor/fontawesome-free/svgs/solid/crosshairs.svg +1 -0
  1200. package/static/vendor/fontawesome-free/svgs/solid/crow.svg +1 -0
  1201. package/static/vendor/fontawesome-free/svgs/solid/crown.svg +1 -0
  1202. package/static/vendor/fontawesome-free/svgs/solid/crutch.svg +1 -0
  1203. package/static/vendor/fontawesome-free/svgs/solid/cube.svg +1 -0
  1204. package/static/vendor/fontawesome-free/svgs/solid/cubes.svg +1 -0
  1205. package/static/vendor/fontawesome-free/svgs/solid/cut.svg +1 -0
  1206. package/static/vendor/fontawesome-free/svgs/solid/database.svg +1 -0
  1207. package/static/vendor/fontawesome-free/svgs/solid/deaf.svg +1 -0
  1208. package/static/vendor/fontawesome-free/svgs/solid/democrat.svg +1 -0
  1209. package/static/vendor/fontawesome-free/svgs/solid/desktop.svg +1 -0
  1210. package/static/vendor/fontawesome-free/svgs/solid/dharmachakra.svg +1 -0
  1211. package/static/vendor/fontawesome-free/svgs/solid/diagnoses.svg +1 -0
  1212. package/static/vendor/fontawesome-free/svgs/solid/dice-d20.svg +1 -0
  1213. package/static/vendor/fontawesome-free/svgs/solid/dice-d6.svg +1 -0
  1214. package/static/vendor/fontawesome-free/svgs/solid/dice-five.svg +1 -0
  1215. package/static/vendor/fontawesome-free/svgs/solid/dice-four.svg +1 -0
  1216. package/static/vendor/fontawesome-free/svgs/solid/dice-one.svg +1 -0
  1217. package/static/vendor/fontawesome-free/svgs/solid/dice-six.svg +1 -0
  1218. package/static/vendor/fontawesome-free/svgs/solid/dice-three.svg +1 -0
  1219. package/static/vendor/fontawesome-free/svgs/solid/dice-two.svg +1 -0
  1220. package/static/vendor/fontawesome-free/svgs/solid/dice.svg +1 -0
  1221. package/static/vendor/fontawesome-free/svgs/solid/digital-tachograph.svg +1 -0
  1222. package/static/vendor/fontawesome-free/svgs/solid/directions.svg +1 -0
  1223. package/static/vendor/fontawesome-free/svgs/solid/disease.svg +1 -0
  1224. package/static/vendor/fontawesome-free/svgs/solid/divide.svg +1 -0
  1225. package/static/vendor/fontawesome-free/svgs/solid/dizzy.svg +1 -0
  1226. package/static/vendor/fontawesome-free/svgs/solid/dna.svg +1 -0
  1227. package/static/vendor/fontawesome-free/svgs/solid/dog.svg +1 -0
  1228. package/static/vendor/fontawesome-free/svgs/solid/dollar-sign.svg +1 -0
  1229. package/static/vendor/fontawesome-free/svgs/solid/dolly-flatbed.svg +1 -0
  1230. package/static/vendor/fontawesome-free/svgs/solid/dolly.svg +1 -0
  1231. package/static/vendor/fontawesome-free/svgs/solid/donate.svg +1 -0
  1232. package/static/vendor/fontawesome-free/svgs/solid/door-closed.svg +1 -0
  1233. package/static/vendor/fontawesome-free/svgs/solid/door-open.svg +1 -0
  1234. package/static/vendor/fontawesome-free/svgs/solid/dot-circle.svg +1 -0
  1235. package/static/vendor/fontawesome-free/svgs/solid/dove.svg +1 -0
  1236. package/static/vendor/fontawesome-free/svgs/solid/download.svg +1 -0
  1237. package/static/vendor/fontawesome-free/svgs/solid/drafting-compass.svg +1 -0
  1238. package/static/vendor/fontawesome-free/svgs/solid/dragon.svg +1 -0
  1239. package/static/vendor/fontawesome-free/svgs/solid/draw-polygon.svg +1 -0
  1240. package/static/vendor/fontawesome-free/svgs/solid/drum-steelpan.svg +1 -0
  1241. package/static/vendor/fontawesome-free/svgs/solid/drum.svg +1 -0
  1242. package/static/vendor/fontawesome-free/svgs/solid/drumstick-bite.svg +1 -0
  1243. package/static/vendor/fontawesome-free/svgs/solid/dumbbell.svg +1 -0
  1244. package/static/vendor/fontawesome-free/svgs/solid/dumpster-fire.svg +1 -0
  1245. package/static/vendor/fontawesome-free/svgs/solid/dumpster.svg +1 -0
  1246. package/static/vendor/fontawesome-free/svgs/solid/dungeon.svg +1 -0
  1247. package/static/vendor/fontawesome-free/svgs/solid/edit.svg +1 -0
  1248. package/static/vendor/fontawesome-free/svgs/solid/egg.svg +1 -0
  1249. package/static/vendor/fontawesome-free/svgs/solid/eject.svg +1 -0
  1250. package/static/vendor/fontawesome-free/svgs/solid/ellipsis-h.svg +1 -0
  1251. package/static/vendor/fontawesome-free/svgs/solid/ellipsis-v.svg +1 -0
  1252. package/static/vendor/fontawesome-free/svgs/solid/envelope-open-text.svg +1 -0
  1253. package/static/vendor/fontawesome-free/svgs/solid/envelope-open.svg +1 -0
  1254. package/static/vendor/fontawesome-free/svgs/solid/envelope-square.svg +1 -0
  1255. package/static/vendor/fontawesome-free/svgs/solid/envelope.svg +1 -0
  1256. package/static/vendor/fontawesome-free/svgs/solid/equals.svg +1 -0
  1257. package/static/vendor/fontawesome-free/svgs/solid/eraser.svg +1 -0
  1258. package/static/vendor/fontawesome-free/svgs/solid/ethernet.svg +1 -0
  1259. package/static/vendor/fontawesome-free/svgs/solid/euro-sign.svg +1 -0
  1260. package/static/vendor/fontawesome-free/svgs/solid/exchange-alt.svg +1 -0
  1261. package/static/vendor/fontawesome-free/svgs/solid/exclamation-circle.svg +1 -0
  1262. package/static/vendor/fontawesome-free/svgs/solid/exclamation-triangle.svg +1 -0
  1263. package/static/vendor/fontawesome-free/svgs/solid/exclamation.svg +1 -0
  1264. package/static/vendor/fontawesome-free/svgs/solid/expand-alt.svg +1 -0
  1265. package/static/vendor/fontawesome-free/svgs/solid/expand-arrows-alt.svg +1 -0
  1266. package/static/vendor/fontawesome-free/svgs/solid/expand.svg +1 -0
  1267. package/static/vendor/fontawesome-free/svgs/solid/external-link-alt.svg +1 -0
  1268. package/static/vendor/fontawesome-free/svgs/solid/external-link-square-alt.svg +1 -0
  1269. package/static/vendor/fontawesome-free/svgs/solid/eye-dropper.svg +1 -0
  1270. package/static/vendor/fontawesome-free/svgs/solid/eye-slash.svg +1 -0
  1271. package/static/vendor/fontawesome-free/svgs/solid/eye.svg +1 -0
  1272. package/static/vendor/fontawesome-free/svgs/solid/fan.svg +1 -0
  1273. package/static/vendor/fontawesome-free/svgs/solid/fast-backward.svg +1 -0
  1274. package/static/vendor/fontawesome-free/svgs/solid/fast-forward.svg +1 -0
  1275. package/static/vendor/fontawesome-free/svgs/solid/faucet.svg +1 -0
  1276. package/static/vendor/fontawesome-free/svgs/solid/fax.svg +1 -0
  1277. package/static/vendor/fontawesome-free/svgs/solid/feather-alt.svg +1 -0
  1278. package/static/vendor/fontawesome-free/svgs/solid/feather.svg +1 -0
  1279. package/static/vendor/fontawesome-free/svgs/solid/female.svg +1 -0
  1280. package/static/vendor/fontawesome-free/svgs/solid/fighter-jet.svg +1 -0
  1281. package/static/vendor/fontawesome-free/svgs/solid/file-alt.svg +1 -0
  1282. package/static/vendor/fontawesome-free/svgs/solid/file-archive.svg +1 -0
  1283. package/static/vendor/fontawesome-free/svgs/solid/file-audio.svg +1 -0
  1284. package/static/vendor/fontawesome-free/svgs/solid/file-code.svg +1 -0
  1285. package/static/vendor/fontawesome-free/svgs/solid/file-contract.svg +1 -0
  1286. package/static/vendor/fontawesome-free/svgs/solid/file-csv.svg +1 -0
  1287. package/static/vendor/fontawesome-free/svgs/solid/file-download.svg +1 -0
  1288. package/static/vendor/fontawesome-free/svgs/solid/file-excel.svg +1 -0
  1289. package/static/vendor/fontawesome-free/svgs/solid/file-export.svg +1 -0
  1290. package/static/vendor/fontawesome-free/svgs/solid/file-image.svg +1 -0
  1291. package/static/vendor/fontawesome-free/svgs/solid/file-import.svg +1 -0
  1292. package/static/vendor/fontawesome-free/svgs/solid/file-invoice-dollar.svg +1 -0
  1293. package/static/vendor/fontawesome-free/svgs/solid/file-invoice.svg +1 -0
  1294. package/static/vendor/fontawesome-free/svgs/solid/file-medical-alt.svg +1 -0
  1295. package/static/vendor/fontawesome-free/svgs/solid/file-medical.svg +1 -0
  1296. package/static/vendor/fontawesome-free/svgs/solid/file-pdf.svg +1 -0
  1297. package/static/vendor/fontawesome-free/svgs/solid/file-powerpoint.svg +1 -0
  1298. package/static/vendor/fontawesome-free/svgs/solid/file-prescription.svg +1 -0
  1299. package/static/vendor/fontawesome-free/svgs/solid/file-signature.svg +1 -0
  1300. package/static/vendor/fontawesome-free/svgs/solid/file-upload.svg +1 -0
  1301. package/static/vendor/fontawesome-free/svgs/solid/file-video.svg +1 -0
  1302. package/static/vendor/fontawesome-free/svgs/solid/file-word.svg +1 -0
  1303. package/static/vendor/fontawesome-free/svgs/solid/file.svg +1 -0
  1304. package/static/vendor/fontawesome-free/svgs/solid/fill-drip.svg +1 -0
  1305. package/static/vendor/fontawesome-free/svgs/solid/fill.svg +1 -0
  1306. package/static/vendor/fontawesome-free/svgs/solid/film.svg +1 -0
  1307. package/static/vendor/fontawesome-free/svgs/solid/filter.svg +1 -0
  1308. package/static/vendor/fontawesome-free/svgs/solid/fingerprint.svg +1 -0
  1309. package/static/vendor/fontawesome-free/svgs/solid/fire-alt.svg +1 -0
  1310. package/static/vendor/fontawesome-free/svgs/solid/fire-extinguisher.svg +1 -0
  1311. package/static/vendor/fontawesome-free/svgs/solid/fire.svg +1 -0
  1312. package/static/vendor/fontawesome-free/svgs/solid/first-aid.svg +1 -0
  1313. package/static/vendor/fontawesome-free/svgs/solid/fish.svg +1 -0
  1314. package/static/vendor/fontawesome-free/svgs/solid/fist-raised.svg +1 -0
  1315. package/static/vendor/fontawesome-free/svgs/solid/flag-checkered.svg +1 -0
  1316. package/static/vendor/fontawesome-free/svgs/solid/flag-usa.svg +1 -0
  1317. package/static/vendor/fontawesome-free/svgs/solid/flag.svg +1 -0
  1318. package/static/vendor/fontawesome-free/svgs/solid/flask.svg +1 -0
  1319. package/static/vendor/fontawesome-free/svgs/solid/flushed.svg +1 -0
  1320. package/static/vendor/fontawesome-free/svgs/solid/folder-minus.svg +1 -0
  1321. package/static/vendor/fontawesome-free/svgs/solid/folder-open.svg +1 -0
  1322. package/static/vendor/fontawesome-free/svgs/solid/folder-plus.svg +1 -0
  1323. package/static/vendor/fontawesome-free/svgs/solid/folder.svg +1 -0
  1324. package/static/vendor/fontawesome-free/svgs/solid/font-awesome-logo-full.svg +1 -0
  1325. package/static/vendor/fontawesome-free/svgs/solid/font.svg +1 -0
  1326. package/static/vendor/fontawesome-free/svgs/solid/football-ball.svg +1 -0
  1327. package/static/vendor/fontawesome-free/svgs/solid/forward.svg +1 -0
  1328. package/static/vendor/fontawesome-free/svgs/solid/frog.svg +1 -0
  1329. package/static/vendor/fontawesome-free/svgs/solid/frown-open.svg +1 -0
  1330. package/static/vendor/fontawesome-free/svgs/solid/frown.svg +1 -0
  1331. package/static/vendor/fontawesome-free/svgs/solid/funnel-dollar.svg +1 -0
  1332. package/static/vendor/fontawesome-free/svgs/solid/futbol.svg +1 -0
  1333. package/static/vendor/fontawesome-free/svgs/solid/gamepad.svg +1 -0
  1334. package/static/vendor/fontawesome-free/svgs/solid/gas-pump.svg +1 -0
  1335. package/static/vendor/fontawesome-free/svgs/solid/gavel.svg +1 -0
  1336. package/static/vendor/fontawesome-free/svgs/solid/gem.svg +1 -0
  1337. package/static/vendor/fontawesome-free/svgs/solid/genderless.svg +1 -0
  1338. package/static/vendor/fontawesome-free/svgs/solid/ghost.svg +1 -0
  1339. package/static/vendor/fontawesome-free/svgs/solid/gift.svg +1 -0
  1340. package/static/vendor/fontawesome-free/svgs/solid/gifts.svg +1 -0
  1341. package/static/vendor/fontawesome-free/svgs/solid/glass-cheers.svg +1 -0
  1342. package/static/vendor/fontawesome-free/svgs/solid/glass-martini-alt.svg +1 -0
  1343. package/static/vendor/fontawesome-free/svgs/solid/glass-martini.svg +1 -0
  1344. package/static/vendor/fontawesome-free/svgs/solid/glass-whiskey.svg +1 -0
  1345. package/static/vendor/fontawesome-free/svgs/solid/glasses.svg +1 -0
  1346. package/static/vendor/fontawesome-free/svgs/solid/globe-africa.svg +1 -0
  1347. package/static/vendor/fontawesome-free/svgs/solid/globe-americas.svg +1 -0
  1348. package/static/vendor/fontawesome-free/svgs/solid/globe-asia.svg +1 -0
  1349. package/static/vendor/fontawesome-free/svgs/solid/globe-europe.svg +1 -0
  1350. package/static/vendor/fontawesome-free/svgs/solid/globe.svg +1 -0
  1351. package/static/vendor/fontawesome-free/svgs/solid/golf-ball.svg +1 -0
  1352. package/static/vendor/fontawesome-free/svgs/solid/gopuram.svg +1 -0
  1353. package/static/vendor/fontawesome-free/svgs/solid/graduation-cap.svg +1 -0
  1354. package/static/vendor/fontawesome-free/svgs/solid/greater-than-equal.svg +1 -0
  1355. package/static/vendor/fontawesome-free/svgs/solid/greater-than.svg +1 -0
  1356. package/static/vendor/fontawesome-free/svgs/solid/grimace.svg +1 -0
  1357. package/static/vendor/fontawesome-free/svgs/solid/grin-alt.svg +1 -0
  1358. package/static/vendor/fontawesome-free/svgs/solid/grin-beam-sweat.svg +1 -0
  1359. package/static/vendor/fontawesome-free/svgs/solid/grin-beam.svg +1 -0
  1360. package/static/vendor/fontawesome-free/svgs/solid/grin-hearts.svg +1 -0
  1361. package/static/vendor/fontawesome-free/svgs/solid/grin-squint-tears.svg +1 -0
  1362. package/static/vendor/fontawesome-free/svgs/solid/grin-squint.svg +1 -0
  1363. package/static/vendor/fontawesome-free/svgs/solid/grin-stars.svg +1 -0
  1364. package/static/vendor/fontawesome-free/svgs/solid/grin-tears.svg +1 -0
  1365. package/static/vendor/fontawesome-free/svgs/solid/grin-tongue-squint.svg +1 -0
  1366. package/static/vendor/fontawesome-free/svgs/solid/grin-tongue-wink.svg +1 -0
  1367. package/static/vendor/fontawesome-free/svgs/solid/grin-tongue.svg +1 -0
  1368. package/static/vendor/fontawesome-free/svgs/solid/grin-wink.svg +1 -0
  1369. package/static/vendor/fontawesome-free/svgs/solid/grin.svg +1 -0
  1370. package/static/vendor/fontawesome-free/svgs/solid/grip-horizontal.svg +1 -0
  1371. package/static/vendor/fontawesome-free/svgs/solid/grip-lines-vertical.svg +1 -0
  1372. package/static/vendor/fontawesome-free/svgs/solid/grip-lines.svg +1 -0
  1373. package/static/vendor/fontawesome-free/svgs/solid/grip-vertical.svg +1 -0
  1374. package/static/vendor/fontawesome-free/svgs/solid/guitar.svg +1 -0
  1375. package/static/vendor/fontawesome-free/svgs/solid/h-square.svg +1 -0
  1376. package/static/vendor/fontawesome-free/svgs/solid/hamburger.svg +1 -0
  1377. package/static/vendor/fontawesome-free/svgs/solid/hammer.svg +1 -0
  1378. package/static/vendor/fontawesome-free/svgs/solid/hamsa.svg +1 -0
  1379. package/static/vendor/fontawesome-free/svgs/solid/hand-holding-heart.svg +1 -0
  1380. package/static/vendor/fontawesome-free/svgs/solid/hand-holding-medical.svg +1 -0
  1381. package/static/vendor/fontawesome-free/svgs/solid/hand-holding-usd.svg +1 -0
  1382. package/static/vendor/fontawesome-free/svgs/solid/hand-holding-water.svg +1 -0
  1383. package/static/vendor/fontawesome-free/svgs/solid/hand-holding.svg +1 -0
  1384. package/static/vendor/fontawesome-free/svgs/solid/hand-lizard.svg +1 -0
  1385. package/static/vendor/fontawesome-free/svgs/solid/hand-middle-finger.svg +1 -0
  1386. package/static/vendor/fontawesome-free/svgs/solid/hand-paper.svg +1 -0
  1387. package/static/vendor/fontawesome-free/svgs/solid/hand-peace.svg +1 -0
  1388. package/static/vendor/fontawesome-free/svgs/solid/hand-point-down.svg +1 -0
  1389. package/static/vendor/fontawesome-free/svgs/solid/hand-point-left.svg +1 -0
  1390. package/static/vendor/fontawesome-free/svgs/solid/hand-point-right.svg +1 -0
  1391. package/static/vendor/fontawesome-free/svgs/solid/hand-point-up.svg +1 -0
  1392. package/static/vendor/fontawesome-free/svgs/solid/hand-pointer.svg +1 -0
  1393. package/static/vendor/fontawesome-free/svgs/solid/hand-rock.svg +1 -0
  1394. package/static/vendor/fontawesome-free/svgs/solid/hand-scissors.svg +1 -0
  1395. package/static/vendor/fontawesome-free/svgs/solid/hand-sparkles.svg +1 -0
  1396. package/static/vendor/fontawesome-free/svgs/solid/hand-spock.svg +1 -0
  1397. package/static/vendor/fontawesome-free/svgs/solid/hands-helping.svg +1 -0
  1398. package/static/vendor/fontawesome-free/svgs/solid/hands-wash.svg +1 -0
  1399. package/static/vendor/fontawesome-free/svgs/solid/hands.svg +1 -0
  1400. package/static/vendor/fontawesome-free/svgs/solid/handshake-alt-slash.svg +1 -0
  1401. package/static/vendor/fontawesome-free/svgs/solid/handshake-slash.svg +1 -0
  1402. package/static/vendor/fontawesome-free/svgs/solid/handshake.svg +1 -0
  1403. package/static/vendor/fontawesome-free/svgs/solid/hanukiah.svg +1 -0
  1404. package/static/vendor/fontawesome-free/svgs/solid/hard-hat.svg +1 -0
  1405. package/static/vendor/fontawesome-free/svgs/solid/hashtag.svg +1 -0
  1406. package/static/vendor/fontawesome-free/svgs/solid/hat-cowboy-side.svg +1 -0
  1407. package/static/vendor/fontawesome-free/svgs/solid/hat-cowboy.svg +1 -0
  1408. package/static/vendor/fontawesome-free/svgs/solid/hat-wizard.svg +1 -0
  1409. package/static/vendor/fontawesome-free/svgs/solid/hdd.svg +1 -0
  1410. package/static/vendor/fontawesome-free/svgs/solid/head-side-cough-slash.svg +1 -0
  1411. package/static/vendor/fontawesome-free/svgs/solid/head-side-cough.svg +1 -0
  1412. package/static/vendor/fontawesome-free/svgs/solid/head-side-mask.svg +1 -0
  1413. package/static/vendor/fontawesome-free/svgs/solid/head-side-virus.svg +1 -0
  1414. package/static/vendor/fontawesome-free/svgs/solid/heading.svg +1 -0
  1415. package/static/vendor/fontawesome-free/svgs/solid/headphones-alt.svg +1 -0
  1416. package/static/vendor/fontawesome-free/svgs/solid/headphones.svg +1 -0
  1417. package/static/vendor/fontawesome-free/svgs/solid/headset.svg +1 -0
  1418. package/static/vendor/fontawesome-free/svgs/solid/heart-broken.svg +1 -0
  1419. package/static/vendor/fontawesome-free/svgs/solid/heart.svg +1 -0
  1420. package/static/vendor/fontawesome-free/svgs/solid/heartbeat.svg +1 -0
  1421. package/static/vendor/fontawesome-free/svgs/solid/helicopter.svg +1 -0
  1422. package/static/vendor/fontawesome-free/svgs/solid/highlighter.svg +1 -0
  1423. package/static/vendor/fontawesome-free/svgs/solid/hiking.svg +1 -0
  1424. package/static/vendor/fontawesome-free/svgs/solid/hippo.svg +1 -0
  1425. package/static/vendor/fontawesome-free/svgs/solid/history.svg +1 -0
  1426. package/static/vendor/fontawesome-free/svgs/solid/hockey-puck.svg +1 -0
  1427. package/static/vendor/fontawesome-free/svgs/solid/holly-berry.svg +1 -0
  1428. package/static/vendor/fontawesome-free/svgs/solid/home.svg +1 -0
  1429. package/static/vendor/fontawesome-free/svgs/solid/horse-head.svg +1 -0
  1430. package/static/vendor/fontawesome-free/svgs/solid/horse.svg +1 -0
  1431. package/static/vendor/fontawesome-free/svgs/solid/hospital-alt.svg +1 -0
  1432. package/static/vendor/fontawesome-free/svgs/solid/hospital-symbol.svg +1 -0
  1433. package/static/vendor/fontawesome-free/svgs/solid/hospital-user.svg +1 -0
  1434. package/static/vendor/fontawesome-free/svgs/solid/hospital.svg +1 -0
  1435. package/static/vendor/fontawesome-free/svgs/solid/hot-tub.svg +1 -0
  1436. package/static/vendor/fontawesome-free/svgs/solid/hotdog.svg +1 -0
  1437. package/static/vendor/fontawesome-free/svgs/solid/hotel.svg +1 -0
  1438. package/static/vendor/fontawesome-free/svgs/solid/hourglass-end.svg +1 -0
  1439. package/static/vendor/fontawesome-free/svgs/solid/hourglass-half.svg +1 -0
  1440. package/static/vendor/fontawesome-free/svgs/solid/hourglass-start.svg +1 -0
  1441. package/static/vendor/fontawesome-free/svgs/solid/hourglass.svg +1 -0
  1442. package/static/vendor/fontawesome-free/svgs/solid/house-damage.svg +1 -0
  1443. package/static/vendor/fontawesome-free/svgs/solid/house-user.svg +1 -0
  1444. package/static/vendor/fontawesome-free/svgs/solid/hryvnia.svg +1 -0
  1445. package/static/vendor/fontawesome-free/svgs/solid/i-cursor.svg +1 -0
  1446. package/static/vendor/fontawesome-free/svgs/solid/ice-cream.svg +1 -0
  1447. package/static/vendor/fontawesome-free/svgs/solid/icicles.svg +1 -0
  1448. package/static/vendor/fontawesome-free/svgs/solid/icons.svg +1 -0
  1449. package/static/vendor/fontawesome-free/svgs/solid/id-badge.svg +1 -0
  1450. package/static/vendor/fontawesome-free/svgs/solid/id-card-alt.svg +1 -0
  1451. package/static/vendor/fontawesome-free/svgs/solid/id-card.svg +1 -0
  1452. package/static/vendor/fontawesome-free/svgs/solid/igloo.svg +1 -0
  1453. package/static/vendor/fontawesome-free/svgs/solid/image.svg +1 -0
  1454. package/static/vendor/fontawesome-free/svgs/solid/images.svg +1 -0
  1455. package/static/vendor/fontawesome-free/svgs/solid/inbox.svg +1 -0
  1456. package/static/vendor/fontawesome-free/svgs/solid/indent.svg +1 -0
  1457. package/static/vendor/fontawesome-free/svgs/solid/industry.svg +1 -0
  1458. package/static/vendor/fontawesome-free/svgs/solid/infinity.svg +1 -0
  1459. package/static/vendor/fontawesome-free/svgs/solid/info-circle.svg +1 -0
  1460. package/static/vendor/fontawesome-free/svgs/solid/info.svg +1 -0
  1461. package/static/vendor/fontawesome-free/svgs/solid/italic.svg +1 -0
  1462. package/static/vendor/fontawesome-free/svgs/solid/jedi.svg +1 -0
  1463. package/static/vendor/fontawesome-free/svgs/solid/joint.svg +1 -0
  1464. package/static/vendor/fontawesome-free/svgs/solid/journal-whills.svg +1 -0
  1465. package/static/vendor/fontawesome-free/svgs/solid/kaaba.svg +1 -0
  1466. package/static/vendor/fontawesome-free/svgs/solid/key.svg +1 -0
  1467. package/static/vendor/fontawesome-free/svgs/solid/keyboard.svg +1 -0
  1468. package/static/vendor/fontawesome-free/svgs/solid/khanda.svg +1 -0
  1469. package/static/vendor/fontawesome-free/svgs/solid/kiss-beam.svg +1 -0
  1470. package/static/vendor/fontawesome-free/svgs/solid/kiss-wink-heart.svg +1 -0
  1471. package/static/vendor/fontawesome-free/svgs/solid/kiss.svg +1 -0
  1472. package/static/vendor/fontawesome-free/svgs/solid/kiwi-bird.svg +1 -0
  1473. package/static/vendor/fontawesome-free/svgs/solid/landmark.svg +1 -0
  1474. package/static/vendor/fontawesome-free/svgs/solid/language.svg +1 -0
  1475. package/static/vendor/fontawesome-free/svgs/solid/laptop-code.svg +1 -0
  1476. package/static/vendor/fontawesome-free/svgs/solid/laptop-house.svg +1 -0
  1477. package/static/vendor/fontawesome-free/svgs/solid/laptop-medical.svg +1 -0
  1478. package/static/vendor/fontawesome-free/svgs/solid/laptop.svg +1 -0
  1479. package/static/vendor/fontawesome-free/svgs/solid/laugh-beam.svg +1 -0
  1480. package/static/vendor/fontawesome-free/svgs/solid/laugh-squint.svg +1 -0
  1481. package/static/vendor/fontawesome-free/svgs/solid/laugh-wink.svg +1 -0
  1482. package/static/vendor/fontawesome-free/svgs/solid/laugh.svg +1 -0
  1483. package/static/vendor/fontawesome-free/svgs/solid/layer-group.svg +1 -0
  1484. package/static/vendor/fontawesome-free/svgs/solid/leaf.svg +1 -0
  1485. package/static/vendor/fontawesome-free/svgs/solid/lemon.svg +1 -0
  1486. package/static/vendor/fontawesome-free/svgs/solid/less-than-equal.svg +1 -0
  1487. package/static/vendor/fontawesome-free/svgs/solid/less-than.svg +1 -0
  1488. package/static/vendor/fontawesome-free/svgs/solid/level-down-alt.svg +1 -0
  1489. package/static/vendor/fontawesome-free/svgs/solid/level-up-alt.svg +1 -0
  1490. package/static/vendor/fontawesome-free/svgs/solid/life-ring.svg +1 -0
  1491. package/static/vendor/fontawesome-free/svgs/solid/lightbulb.svg +1 -0
  1492. package/static/vendor/fontawesome-free/svgs/solid/link.svg +1 -0
  1493. package/static/vendor/fontawesome-free/svgs/solid/lira-sign.svg +1 -0
  1494. package/static/vendor/fontawesome-free/svgs/solid/list-alt.svg +1 -0
  1495. package/static/vendor/fontawesome-free/svgs/solid/list-ol.svg +1 -0
  1496. package/static/vendor/fontawesome-free/svgs/solid/list-ul.svg +1 -0
  1497. package/static/vendor/fontawesome-free/svgs/solid/list.svg +1 -0
  1498. package/static/vendor/fontawesome-free/svgs/solid/location-arrow.svg +1 -0
  1499. package/static/vendor/fontawesome-free/svgs/solid/lock-open.svg +1 -0
  1500. package/static/vendor/fontawesome-free/svgs/solid/lock.svg +1 -0
  1501. package/static/vendor/fontawesome-free/svgs/solid/long-arrow-alt-down.svg +1 -0
  1502. package/static/vendor/fontawesome-free/svgs/solid/long-arrow-alt-left.svg +1 -0
  1503. package/static/vendor/fontawesome-free/svgs/solid/long-arrow-alt-right.svg +1 -0
  1504. package/static/vendor/fontawesome-free/svgs/solid/long-arrow-alt-up.svg +1 -0
  1505. package/static/vendor/fontawesome-free/svgs/solid/low-vision.svg +1 -0
  1506. package/static/vendor/fontawesome-free/svgs/solid/luggage-cart.svg +1 -0
  1507. package/static/vendor/fontawesome-free/svgs/solid/lungs-virus.svg +1 -0
  1508. package/static/vendor/fontawesome-free/svgs/solid/lungs.svg +1 -0
  1509. package/static/vendor/fontawesome-free/svgs/solid/magic.svg +1 -0
  1510. package/static/vendor/fontawesome-free/svgs/solid/magnet.svg +1 -0
  1511. package/static/vendor/fontawesome-free/svgs/solid/mail-bulk.svg +1 -0
  1512. package/static/vendor/fontawesome-free/svgs/solid/male.svg +1 -0
  1513. package/static/vendor/fontawesome-free/svgs/solid/map-marked-alt.svg +1 -0
  1514. package/static/vendor/fontawesome-free/svgs/solid/map-marked.svg +1 -0
  1515. package/static/vendor/fontawesome-free/svgs/solid/map-marker-alt.svg +1 -0
  1516. package/static/vendor/fontawesome-free/svgs/solid/map-marker.svg +1 -0
  1517. package/static/vendor/fontawesome-free/svgs/solid/map-pin.svg +1 -0
  1518. package/static/vendor/fontawesome-free/svgs/solid/map-signs.svg +1 -0
  1519. package/static/vendor/fontawesome-free/svgs/solid/map.svg +1 -0
  1520. package/static/vendor/fontawesome-free/svgs/solid/marker.svg +1 -0
  1521. package/static/vendor/fontawesome-free/svgs/solid/mars-double.svg +1 -0
  1522. package/static/vendor/fontawesome-free/svgs/solid/mars-stroke-h.svg +1 -0
  1523. package/static/vendor/fontawesome-free/svgs/solid/mars-stroke-v.svg +1 -0
  1524. package/static/vendor/fontawesome-free/svgs/solid/mars-stroke.svg +1 -0
  1525. package/static/vendor/fontawesome-free/svgs/solid/mars.svg +1 -0
  1526. package/static/vendor/fontawesome-free/svgs/solid/mask.svg +1 -0
  1527. package/static/vendor/fontawesome-free/svgs/solid/medal.svg +1 -0
  1528. package/static/vendor/fontawesome-free/svgs/solid/medkit.svg +1 -0
  1529. package/static/vendor/fontawesome-free/svgs/solid/meh-blank.svg +1 -0
  1530. package/static/vendor/fontawesome-free/svgs/solid/meh-rolling-eyes.svg +1 -0
  1531. package/static/vendor/fontawesome-free/svgs/solid/meh.svg +1 -0
  1532. package/static/vendor/fontawesome-free/svgs/solid/memory.svg +1 -0
  1533. package/static/vendor/fontawesome-free/svgs/solid/menorah.svg +1 -0
  1534. package/static/vendor/fontawesome-free/svgs/solid/mercury.svg +1 -0
  1535. package/static/vendor/fontawesome-free/svgs/solid/meteor.svg +1 -0
  1536. package/static/vendor/fontawesome-free/svgs/solid/microchip.svg +1 -0
  1537. package/static/vendor/fontawesome-free/svgs/solid/microphone-alt-slash.svg +1 -0
  1538. package/static/vendor/fontawesome-free/svgs/solid/microphone-alt.svg +1 -0
  1539. package/static/vendor/fontawesome-free/svgs/solid/microphone-slash.svg +1 -0
  1540. package/static/vendor/fontawesome-free/svgs/solid/microphone.svg +1 -0
  1541. package/static/vendor/fontawesome-free/svgs/solid/microscope.svg +1 -0
  1542. package/static/vendor/fontawesome-free/svgs/solid/minus-circle.svg +1 -0
  1543. package/static/vendor/fontawesome-free/svgs/solid/minus-square.svg +1 -0
  1544. package/static/vendor/fontawesome-free/svgs/solid/minus.svg +1 -0
  1545. package/static/vendor/fontawesome-free/svgs/solid/mitten.svg +1 -0
  1546. package/static/vendor/fontawesome-free/svgs/solid/mobile-alt.svg +1 -0
  1547. package/static/vendor/fontawesome-free/svgs/solid/mobile.svg +1 -0
  1548. package/static/vendor/fontawesome-free/svgs/solid/money-bill-alt.svg +1 -0
  1549. package/static/vendor/fontawesome-free/svgs/solid/money-bill-wave-alt.svg +1 -0
  1550. package/static/vendor/fontawesome-free/svgs/solid/money-bill-wave.svg +1 -0
  1551. package/static/vendor/fontawesome-free/svgs/solid/money-bill.svg +1 -0
  1552. package/static/vendor/fontawesome-free/svgs/solid/money-check-alt.svg +1 -0
  1553. package/static/vendor/fontawesome-free/svgs/solid/money-check.svg +1 -0
  1554. package/static/vendor/fontawesome-free/svgs/solid/monument.svg +1 -0
  1555. package/static/vendor/fontawesome-free/svgs/solid/moon.svg +1 -0
  1556. package/static/vendor/fontawesome-free/svgs/solid/mortar-pestle.svg +1 -0
  1557. package/static/vendor/fontawesome-free/svgs/solid/mosque.svg +1 -0
  1558. package/static/vendor/fontawesome-free/svgs/solid/motorcycle.svg +1 -0
  1559. package/static/vendor/fontawesome-free/svgs/solid/mountain.svg +1 -0
  1560. package/static/vendor/fontawesome-free/svgs/solid/mouse-pointer.svg +1 -0
  1561. package/static/vendor/fontawesome-free/svgs/solid/mouse.svg +1 -0
  1562. package/static/vendor/fontawesome-free/svgs/solid/mug-hot.svg +1 -0
  1563. package/static/vendor/fontawesome-free/svgs/solid/music.svg +1 -0
  1564. package/static/vendor/fontawesome-free/svgs/solid/network-wired.svg +1 -0
  1565. package/static/vendor/fontawesome-free/svgs/solid/neuter.svg +1 -0
  1566. package/static/vendor/fontawesome-free/svgs/solid/newspaper.svg +1 -0
  1567. package/static/vendor/fontawesome-free/svgs/solid/not-equal.svg +1 -0
  1568. package/static/vendor/fontawesome-free/svgs/solid/notes-medical.svg +1 -0
  1569. package/static/vendor/fontawesome-free/svgs/solid/object-group.svg +1 -0
  1570. package/static/vendor/fontawesome-free/svgs/solid/object-ungroup.svg +1 -0
  1571. package/static/vendor/fontawesome-free/svgs/solid/oil-can.svg +1 -0
  1572. package/static/vendor/fontawesome-free/svgs/solid/om.svg +1 -0
  1573. package/static/vendor/fontawesome-free/svgs/solid/otter.svg +1 -0
  1574. package/static/vendor/fontawesome-free/svgs/solid/outdent.svg +1 -0
  1575. package/static/vendor/fontawesome-free/svgs/solid/pager.svg +1 -0
  1576. package/static/vendor/fontawesome-free/svgs/solid/paint-brush.svg +1 -0
  1577. package/static/vendor/fontawesome-free/svgs/solid/paint-roller.svg +1 -0
  1578. package/static/vendor/fontawesome-free/svgs/solid/palette.svg +1 -0
  1579. package/static/vendor/fontawesome-free/svgs/solid/pallet.svg +1 -0
  1580. package/static/vendor/fontawesome-free/svgs/solid/paper-plane.svg +1 -0
  1581. package/static/vendor/fontawesome-free/svgs/solid/paperclip.svg +1 -0
  1582. package/static/vendor/fontawesome-free/svgs/solid/parachute-box.svg +1 -0
  1583. package/static/vendor/fontawesome-free/svgs/solid/paragraph.svg +1 -0
  1584. package/static/vendor/fontawesome-free/svgs/solid/parking.svg +1 -0
  1585. package/static/vendor/fontawesome-free/svgs/solid/passport.svg +1 -0
  1586. package/static/vendor/fontawesome-free/svgs/solid/pastafarianism.svg +1 -0
  1587. package/static/vendor/fontawesome-free/svgs/solid/paste.svg +1 -0
  1588. package/static/vendor/fontawesome-free/svgs/solid/pause-circle.svg +1 -0
  1589. package/static/vendor/fontawesome-free/svgs/solid/pause.svg +1 -0
  1590. package/static/vendor/fontawesome-free/svgs/solid/paw.svg +1 -0
  1591. package/static/vendor/fontawesome-free/svgs/solid/peace.svg +1 -0
  1592. package/static/vendor/fontawesome-free/svgs/solid/pen-alt.svg +1 -0
  1593. package/static/vendor/fontawesome-free/svgs/solid/pen-fancy.svg +1 -0
  1594. package/static/vendor/fontawesome-free/svgs/solid/pen-nib.svg +1 -0
  1595. package/static/vendor/fontawesome-free/svgs/solid/pen-square.svg +1 -0
  1596. package/static/vendor/fontawesome-free/svgs/solid/pen.svg +1 -0
  1597. package/static/vendor/fontawesome-free/svgs/solid/pencil-alt.svg +1 -0
  1598. package/static/vendor/fontawesome-free/svgs/solid/pencil-ruler.svg +1 -0
  1599. package/static/vendor/fontawesome-free/svgs/solid/people-arrows.svg +1 -0
  1600. package/static/vendor/fontawesome-free/svgs/solid/people-carry.svg +1 -0
  1601. package/static/vendor/fontawesome-free/svgs/solid/pepper-hot.svg +1 -0
  1602. package/static/vendor/fontawesome-free/svgs/solid/percent.svg +1 -0
  1603. package/static/vendor/fontawesome-free/svgs/solid/percentage.svg +1 -0
  1604. package/static/vendor/fontawesome-free/svgs/solid/person-booth.svg +1 -0
  1605. package/static/vendor/fontawesome-free/svgs/solid/phone-alt.svg +1 -0
  1606. package/static/vendor/fontawesome-free/svgs/solid/phone-slash.svg +1 -0
  1607. package/static/vendor/fontawesome-free/svgs/solid/phone-square-alt.svg +1 -0
  1608. package/static/vendor/fontawesome-free/svgs/solid/phone-square.svg +1 -0
  1609. package/static/vendor/fontawesome-free/svgs/solid/phone-volume.svg +1 -0
  1610. package/static/vendor/fontawesome-free/svgs/solid/phone.svg +1 -0
  1611. package/static/vendor/fontawesome-free/svgs/solid/photo-video.svg +1 -0
  1612. package/static/vendor/fontawesome-free/svgs/solid/piggy-bank.svg +1 -0
  1613. package/static/vendor/fontawesome-free/svgs/solid/pills.svg +1 -0
  1614. package/static/vendor/fontawesome-free/svgs/solid/pizza-slice.svg +1 -0
  1615. package/static/vendor/fontawesome-free/svgs/solid/place-of-worship.svg +1 -0
  1616. package/static/vendor/fontawesome-free/svgs/solid/plane-arrival.svg +1 -0
  1617. package/static/vendor/fontawesome-free/svgs/solid/plane-departure.svg +1 -0
  1618. package/static/vendor/fontawesome-free/svgs/solid/plane-slash.svg +1 -0
  1619. package/static/vendor/fontawesome-free/svgs/solid/plane.svg +1 -0
  1620. package/static/vendor/fontawesome-free/svgs/solid/play-circle.svg +1 -0
  1621. package/static/vendor/fontawesome-free/svgs/solid/play.svg +1 -0
  1622. package/static/vendor/fontawesome-free/svgs/solid/plug.svg +1 -0
  1623. package/static/vendor/fontawesome-free/svgs/solid/plus-circle.svg +1 -0
  1624. package/static/vendor/fontawesome-free/svgs/solid/plus-square.svg +1 -0
  1625. package/static/vendor/fontawesome-free/svgs/solid/plus.svg +1 -0
  1626. package/static/vendor/fontawesome-free/svgs/solid/podcast.svg +1 -0
  1627. package/static/vendor/fontawesome-free/svgs/solid/poll-h.svg +1 -0
  1628. package/static/vendor/fontawesome-free/svgs/solid/poll.svg +1 -0
  1629. package/static/vendor/fontawesome-free/svgs/solid/poo-storm.svg +1 -0
  1630. package/static/vendor/fontawesome-free/svgs/solid/poo.svg +1 -0
  1631. package/static/vendor/fontawesome-free/svgs/solid/poop.svg +1 -0
  1632. package/static/vendor/fontawesome-free/svgs/solid/portrait.svg +1 -0
  1633. package/static/vendor/fontawesome-free/svgs/solid/pound-sign.svg +1 -0
  1634. package/static/vendor/fontawesome-free/svgs/solid/power-off.svg +1 -0
  1635. package/static/vendor/fontawesome-free/svgs/solid/pray.svg +1 -0
  1636. package/static/vendor/fontawesome-free/svgs/solid/praying-hands.svg +1 -0
  1637. package/static/vendor/fontawesome-free/svgs/solid/prescription-bottle-alt.svg +1 -0
  1638. package/static/vendor/fontawesome-free/svgs/solid/prescription-bottle.svg +1 -0
  1639. package/static/vendor/fontawesome-free/svgs/solid/prescription.svg +1 -0
  1640. package/static/vendor/fontawesome-free/svgs/solid/print.svg +1 -0
  1641. package/static/vendor/fontawesome-free/svgs/solid/procedures.svg +1 -0
  1642. package/static/vendor/fontawesome-free/svgs/solid/project-diagram.svg +1 -0
  1643. package/static/vendor/fontawesome-free/svgs/solid/pump-medical.svg +1 -0
  1644. package/static/vendor/fontawesome-free/svgs/solid/pump-soap.svg +1 -0
  1645. package/static/vendor/fontawesome-free/svgs/solid/puzzle-piece.svg +1 -0
  1646. package/static/vendor/fontawesome-free/svgs/solid/qrcode.svg +1 -0
  1647. package/static/vendor/fontawesome-free/svgs/solid/question-circle.svg +1 -0
  1648. package/static/vendor/fontawesome-free/svgs/solid/question.svg +1 -0
  1649. package/static/vendor/fontawesome-free/svgs/solid/quidditch.svg +1 -0
  1650. package/static/vendor/fontawesome-free/svgs/solid/quote-left.svg +1 -0
  1651. package/static/vendor/fontawesome-free/svgs/solid/quote-right.svg +1 -0
  1652. package/static/vendor/fontawesome-free/svgs/solid/quran.svg +1 -0
  1653. package/static/vendor/fontawesome-free/svgs/solid/radiation-alt.svg +1 -0
  1654. package/static/vendor/fontawesome-free/svgs/solid/radiation.svg +1 -0
  1655. package/static/vendor/fontawesome-free/svgs/solid/rainbow.svg +1 -0
  1656. package/static/vendor/fontawesome-free/svgs/solid/random.svg +1 -0
  1657. package/static/vendor/fontawesome-free/svgs/solid/receipt.svg +1 -0
  1658. package/static/vendor/fontawesome-free/svgs/solid/record-vinyl.svg +1 -0
  1659. package/static/vendor/fontawesome-free/svgs/solid/recycle.svg +1 -0
  1660. package/static/vendor/fontawesome-free/svgs/solid/redo-alt.svg +1 -0
  1661. package/static/vendor/fontawesome-free/svgs/solid/redo.svg +1 -0
  1662. package/static/vendor/fontawesome-free/svgs/solid/registered.svg +1 -0
  1663. package/static/vendor/fontawesome-free/svgs/solid/remove-format.svg +1 -0
  1664. package/static/vendor/fontawesome-free/svgs/solid/reply-all.svg +1 -0
  1665. package/static/vendor/fontawesome-free/svgs/solid/reply.svg +1 -0
  1666. package/static/vendor/fontawesome-free/svgs/solid/republican.svg +1 -0
  1667. package/static/vendor/fontawesome-free/svgs/solid/restroom.svg +1 -0
  1668. package/static/vendor/fontawesome-free/svgs/solid/retweet.svg +1 -0
  1669. package/static/vendor/fontawesome-free/svgs/solid/ribbon.svg +1 -0
  1670. package/static/vendor/fontawesome-free/svgs/solid/ring.svg +1 -0
  1671. package/static/vendor/fontawesome-free/svgs/solid/road.svg +1 -0
  1672. package/static/vendor/fontawesome-free/svgs/solid/robot.svg +1 -0
  1673. package/static/vendor/fontawesome-free/svgs/solid/rocket.svg +1 -0
  1674. package/static/vendor/fontawesome-free/svgs/solid/route.svg +1 -0
  1675. package/static/vendor/fontawesome-free/svgs/solid/rss-square.svg +1 -0
  1676. package/static/vendor/fontawesome-free/svgs/solid/rss.svg +1 -0
  1677. package/static/vendor/fontawesome-free/svgs/solid/ruble-sign.svg +1 -0
  1678. package/static/vendor/fontawesome-free/svgs/solid/ruler-combined.svg +1 -0
  1679. package/static/vendor/fontawesome-free/svgs/solid/ruler-horizontal.svg +1 -0
  1680. package/static/vendor/fontawesome-free/svgs/solid/ruler-vertical.svg +1 -0
  1681. package/static/vendor/fontawesome-free/svgs/solid/ruler.svg +1 -0
  1682. package/static/vendor/fontawesome-free/svgs/solid/running.svg +1 -0
  1683. package/static/vendor/fontawesome-free/svgs/solid/rupee-sign.svg +1 -0
  1684. package/static/vendor/fontawesome-free/svgs/solid/sad-cry.svg +1 -0
  1685. package/static/vendor/fontawesome-free/svgs/solid/sad-tear.svg +1 -0
  1686. package/static/vendor/fontawesome-free/svgs/solid/satellite-dish.svg +1 -0
  1687. package/static/vendor/fontawesome-free/svgs/solid/satellite.svg +1 -0
  1688. package/static/vendor/fontawesome-free/svgs/solid/save.svg +1 -0
  1689. package/static/vendor/fontawesome-free/svgs/solid/school.svg +1 -0
  1690. package/static/vendor/fontawesome-free/svgs/solid/screwdriver.svg +1 -0
  1691. package/static/vendor/fontawesome-free/svgs/solid/scroll.svg +1 -0
  1692. package/static/vendor/fontawesome-free/svgs/solid/sd-card.svg +1 -0
  1693. package/static/vendor/fontawesome-free/svgs/solid/search-dollar.svg +1 -0
  1694. package/static/vendor/fontawesome-free/svgs/solid/search-location.svg +1 -0
  1695. package/static/vendor/fontawesome-free/svgs/solid/search-minus.svg +1 -0
  1696. package/static/vendor/fontawesome-free/svgs/solid/search-plus.svg +1 -0
  1697. package/static/vendor/fontawesome-free/svgs/solid/search.svg +1 -0
  1698. package/static/vendor/fontawesome-free/svgs/solid/seedling.svg +1 -0
  1699. package/static/vendor/fontawesome-free/svgs/solid/server.svg +1 -0
  1700. package/static/vendor/fontawesome-free/svgs/solid/shapes.svg +1 -0
  1701. package/static/vendor/fontawesome-free/svgs/solid/share-alt-square.svg +1 -0
  1702. package/static/vendor/fontawesome-free/svgs/solid/share-alt.svg +1 -0
  1703. package/static/vendor/fontawesome-free/svgs/solid/share-square.svg +1 -0
  1704. package/static/vendor/fontawesome-free/svgs/solid/share.svg +1 -0
  1705. package/static/vendor/fontawesome-free/svgs/solid/shekel-sign.svg +1 -0
  1706. package/static/vendor/fontawesome-free/svgs/solid/shield-alt.svg +1 -0
  1707. package/static/vendor/fontawesome-free/svgs/solid/shield-virus.svg +1 -0
  1708. package/static/vendor/fontawesome-free/svgs/solid/ship.svg +1 -0
  1709. package/static/vendor/fontawesome-free/svgs/solid/shipping-fast.svg +1 -0
  1710. package/static/vendor/fontawesome-free/svgs/solid/shoe-prints.svg +1 -0
  1711. package/static/vendor/fontawesome-free/svgs/solid/shopping-bag.svg +1 -0
  1712. package/static/vendor/fontawesome-free/svgs/solid/shopping-basket.svg +1 -0
  1713. package/static/vendor/fontawesome-free/svgs/solid/shopping-cart.svg +1 -0
  1714. package/static/vendor/fontawesome-free/svgs/solid/shower.svg +1 -0
  1715. package/static/vendor/fontawesome-free/svgs/solid/shuttle-van.svg +1 -0
  1716. package/static/vendor/fontawesome-free/svgs/solid/sign-in-alt.svg +1 -0
  1717. package/static/vendor/fontawesome-free/svgs/solid/sign-language.svg +1 -0
  1718. package/static/vendor/fontawesome-free/svgs/solid/sign-out-alt.svg +1 -0
  1719. package/static/vendor/fontawesome-free/svgs/solid/sign.svg +1 -0
  1720. package/static/vendor/fontawesome-free/svgs/solid/signal.svg +1 -0
  1721. package/static/vendor/fontawesome-free/svgs/solid/signature.svg +1 -0
  1722. package/static/vendor/fontawesome-free/svgs/solid/sim-card.svg +1 -0
  1723. package/static/vendor/fontawesome-free/svgs/solid/sink.svg +1 -0
  1724. package/static/vendor/fontawesome-free/svgs/solid/sitemap.svg +1 -0
  1725. package/static/vendor/fontawesome-free/svgs/solid/skating.svg +1 -0
  1726. package/static/vendor/fontawesome-free/svgs/solid/skiing-nordic.svg +1 -0
  1727. package/static/vendor/fontawesome-free/svgs/solid/skiing.svg +1 -0
  1728. package/static/vendor/fontawesome-free/svgs/solid/skull-crossbones.svg +1 -0
  1729. package/static/vendor/fontawesome-free/svgs/solid/skull.svg +1 -0
  1730. package/static/vendor/fontawesome-free/svgs/solid/slash.svg +1 -0
  1731. package/static/vendor/fontawesome-free/svgs/solid/sleigh.svg +1 -0
  1732. package/static/vendor/fontawesome-free/svgs/solid/sliders-h.svg +1 -0
  1733. package/static/vendor/fontawesome-free/svgs/solid/smile-beam.svg +1 -0
  1734. package/static/vendor/fontawesome-free/svgs/solid/smile-wink.svg +1 -0
  1735. package/static/vendor/fontawesome-free/svgs/solid/smile.svg +1 -0
  1736. package/static/vendor/fontawesome-free/svgs/solid/smog.svg +1 -0
  1737. package/static/vendor/fontawesome-free/svgs/solid/smoking-ban.svg +1 -0
  1738. package/static/vendor/fontawesome-free/svgs/solid/smoking.svg +1 -0
  1739. package/static/vendor/fontawesome-free/svgs/solid/sms.svg +1 -0
  1740. package/static/vendor/fontawesome-free/svgs/solid/snowboarding.svg +1 -0
  1741. package/static/vendor/fontawesome-free/svgs/solid/snowflake.svg +1 -0
  1742. package/static/vendor/fontawesome-free/svgs/solid/snowman.svg +1 -0
  1743. package/static/vendor/fontawesome-free/svgs/solid/snowplow.svg +1 -0
  1744. package/static/vendor/fontawesome-free/svgs/solid/soap.svg +1 -0
  1745. package/static/vendor/fontawesome-free/svgs/solid/socks.svg +1 -0
  1746. package/static/vendor/fontawesome-free/svgs/solid/solar-panel.svg +1 -0
  1747. package/static/vendor/fontawesome-free/svgs/solid/sort-alpha-down-alt.svg +1 -0
  1748. package/static/vendor/fontawesome-free/svgs/solid/sort-alpha-down.svg +1 -0
  1749. package/static/vendor/fontawesome-free/svgs/solid/sort-alpha-up-alt.svg +1 -0
  1750. package/static/vendor/fontawesome-free/svgs/solid/sort-alpha-up.svg +1 -0
  1751. package/static/vendor/fontawesome-free/svgs/solid/sort-amount-down-alt.svg +1 -0
  1752. package/static/vendor/fontawesome-free/svgs/solid/sort-amount-down.svg +1 -0
  1753. package/static/vendor/fontawesome-free/svgs/solid/sort-amount-up-alt.svg +1 -0
  1754. package/static/vendor/fontawesome-free/svgs/solid/sort-amount-up.svg +1 -0
  1755. package/static/vendor/fontawesome-free/svgs/solid/sort-down.svg +1 -0
  1756. package/static/vendor/fontawesome-free/svgs/solid/sort-numeric-down-alt.svg +1 -0
  1757. package/static/vendor/fontawesome-free/svgs/solid/sort-numeric-down.svg +1 -0
  1758. package/static/vendor/fontawesome-free/svgs/solid/sort-numeric-up-alt.svg +1 -0
  1759. package/static/vendor/fontawesome-free/svgs/solid/sort-numeric-up.svg +1 -0
  1760. package/static/vendor/fontawesome-free/svgs/solid/sort-up.svg +1 -0
  1761. package/static/vendor/fontawesome-free/svgs/solid/sort.svg +1 -0
  1762. package/static/vendor/fontawesome-free/svgs/solid/spa.svg +1 -0
  1763. package/static/vendor/fontawesome-free/svgs/solid/space-shuttle.svg +1 -0
  1764. package/static/vendor/fontawesome-free/svgs/solid/spell-check.svg +1 -0
  1765. package/static/vendor/fontawesome-free/svgs/solid/spider.svg +1 -0
  1766. package/static/vendor/fontawesome-free/svgs/solid/spinner.svg +1 -0
  1767. package/static/vendor/fontawesome-free/svgs/solid/splotch.svg +1 -0
  1768. package/static/vendor/fontawesome-free/svgs/solid/spray-can.svg +1 -0
  1769. package/static/vendor/fontawesome-free/svgs/solid/square-full.svg +1 -0
  1770. package/static/vendor/fontawesome-free/svgs/solid/square-root-alt.svg +1 -0
  1771. package/static/vendor/fontawesome-free/svgs/solid/square.svg +1 -0
  1772. package/static/vendor/fontawesome-free/svgs/solid/stamp.svg +1 -0
  1773. package/static/vendor/fontawesome-free/svgs/solid/star-and-crescent.svg +1 -0
  1774. package/static/vendor/fontawesome-free/svgs/solid/star-half-alt.svg +1 -0
  1775. package/static/vendor/fontawesome-free/svgs/solid/star-half.svg +1 -0
  1776. package/static/vendor/fontawesome-free/svgs/solid/star-of-david.svg +1 -0
  1777. package/static/vendor/fontawesome-free/svgs/solid/star-of-life.svg +1 -0
  1778. package/static/vendor/fontawesome-free/svgs/solid/star.svg +1 -0
  1779. package/static/vendor/fontawesome-free/svgs/solid/step-backward.svg +1 -0
  1780. package/static/vendor/fontawesome-free/svgs/solid/step-forward.svg +1 -0
  1781. package/static/vendor/fontawesome-free/svgs/solid/stethoscope.svg +1 -0
  1782. package/static/vendor/fontawesome-free/svgs/solid/sticky-note.svg +1 -0
  1783. package/static/vendor/fontawesome-free/svgs/solid/stop-circle.svg +1 -0
  1784. package/static/vendor/fontawesome-free/svgs/solid/stop.svg +1 -0
  1785. package/static/vendor/fontawesome-free/svgs/solid/stopwatch-20.svg +1 -0
  1786. package/static/vendor/fontawesome-free/svgs/solid/stopwatch.svg +1 -0
  1787. package/static/vendor/fontawesome-free/svgs/solid/store-alt-slash.svg +1 -0
  1788. package/static/vendor/fontawesome-free/svgs/solid/store-alt.svg +1 -0
  1789. package/static/vendor/fontawesome-free/svgs/solid/store-slash.svg +1 -0
  1790. package/static/vendor/fontawesome-free/svgs/solid/store.svg +1 -0
  1791. package/static/vendor/fontawesome-free/svgs/solid/stream.svg +1 -0
  1792. package/static/vendor/fontawesome-free/svgs/solid/street-view.svg +1 -0
  1793. package/static/vendor/fontawesome-free/svgs/solid/strikethrough.svg +1 -0
  1794. package/static/vendor/fontawesome-free/svgs/solid/stroopwafel.svg +1 -0
  1795. package/static/vendor/fontawesome-free/svgs/solid/subscript.svg +1 -0
  1796. package/static/vendor/fontawesome-free/svgs/solid/subway.svg +1 -0
  1797. package/static/vendor/fontawesome-free/svgs/solid/suitcase-rolling.svg +1 -0
  1798. package/static/vendor/fontawesome-free/svgs/solid/suitcase.svg +1 -0
  1799. package/static/vendor/fontawesome-free/svgs/solid/sun.svg +1 -0
  1800. package/static/vendor/fontawesome-free/svgs/solid/superscript.svg +1 -0
  1801. package/static/vendor/fontawesome-free/svgs/solid/surprise.svg +1 -0
  1802. package/static/vendor/fontawesome-free/svgs/solid/swatchbook.svg +1 -0
  1803. package/static/vendor/fontawesome-free/svgs/solid/swimmer.svg +1 -0
  1804. package/static/vendor/fontawesome-free/svgs/solid/swimming-pool.svg +1 -0
  1805. package/static/vendor/fontawesome-free/svgs/solid/synagogue.svg +1 -0
  1806. package/static/vendor/fontawesome-free/svgs/solid/sync-alt.svg +1 -0
  1807. package/static/vendor/fontawesome-free/svgs/solid/sync.svg +1 -0
  1808. package/static/vendor/fontawesome-free/svgs/solid/syringe.svg +1 -0
  1809. package/static/vendor/fontawesome-free/svgs/solid/table-tennis.svg +1 -0
  1810. package/static/vendor/fontawesome-free/svgs/solid/table.svg +1 -0
  1811. package/static/vendor/fontawesome-free/svgs/solid/tablet-alt.svg +1 -0
  1812. package/static/vendor/fontawesome-free/svgs/solid/tablet.svg +1 -0
  1813. package/static/vendor/fontawesome-free/svgs/solid/tablets.svg +1 -0
  1814. package/static/vendor/fontawesome-free/svgs/solid/tachometer-alt.svg +1 -0
  1815. package/static/vendor/fontawesome-free/svgs/solid/tag.svg +1 -0
  1816. package/static/vendor/fontawesome-free/svgs/solid/tags.svg +1 -0
  1817. package/static/vendor/fontawesome-free/svgs/solid/tape.svg +1 -0
  1818. package/static/vendor/fontawesome-free/svgs/solid/tasks.svg +1 -0
  1819. package/static/vendor/fontawesome-free/svgs/solid/taxi.svg +1 -0
  1820. package/static/vendor/fontawesome-free/svgs/solid/teeth-open.svg +1 -0
  1821. package/static/vendor/fontawesome-free/svgs/solid/teeth.svg +1 -0
  1822. package/static/vendor/fontawesome-free/svgs/solid/temperature-high.svg +1 -0
  1823. package/static/vendor/fontawesome-free/svgs/solid/temperature-low.svg +1 -0
  1824. package/static/vendor/fontawesome-free/svgs/solid/tenge.svg +1 -0
  1825. package/static/vendor/fontawesome-free/svgs/solid/terminal.svg +1 -0
  1826. package/static/vendor/fontawesome-free/svgs/solid/text-height.svg +1 -0
  1827. package/static/vendor/fontawesome-free/svgs/solid/text-width.svg +1 -0
  1828. package/static/vendor/fontawesome-free/svgs/solid/th-large.svg +1 -0
  1829. package/static/vendor/fontawesome-free/svgs/solid/th-list.svg +1 -0
  1830. package/static/vendor/fontawesome-free/svgs/solid/th.svg +1 -0
  1831. package/static/vendor/fontawesome-free/svgs/solid/theater-masks.svg +1 -0
  1832. package/static/vendor/fontawesome-free/svgs/solid/thermometer-empty.svg +1 -0
  1833. package/static/vendor/fontawesome-free/svgs/solid/thermometer-full.svg +1 -0
  1834. package/static/vendor/fontawesome-free/svgs/solid/thermometer-half.svg +1 -0
  1835. package/static/vendor/fontawesome-free/svgs/solid/thermometer-quarter.svg +1 -0
  1836. package/static/vendor/fontawesome-free/svgs/solid/thermometer-three-quarters.svg +1 -0
  1837. package/static/vendor/fontawesome-free/svgs/solid/thermometer.svg +1 -0
  1838. package/static/vendor/fontawesome-free/svgs/solid/thumbs-down.svg +1 -0
  1839. package/static/vendor/fontawesome-free/svgs/solid/thumbs-up.svg +1 -0
  1840. package/static/vendor/fontawesome-free/svgs/solid/thumbtack.svg +1 -0
  1841. package/static/vendor/fontawesome-free/svgs/solid/ticket-alt.svg +1 -0
  1842. package/static/vendor/fontawesome-free/svgs/solid/times-circle.svg +1 -0
  1843. package/static/vendor/fontawesome-free/svgs/solid/times.svg +1 -0
  1844. package/static/vendor/fontawesome-free/svgs/solid/tint-slash.svg +1 -0
  1845. package/static/vendor/fontawesome-free/svgs/solid/tint.svg +1 -0
  1846. package/static/vendor/fontawesome-free/svgs/solid/tired.svg +1 -0
  1847. package/static/vendor/fontawesome-free/svgs/solid/toggle-off.svg +1 -0
  1848. package/static/vendor/fontawesome-free/svgs/solid/toggle-on.svg +1 -0
  1849. package/static/vendor/fontawesome-free/svgs/solid/toilet-paper-slash.svg +1 -0
  1850. package/static/vendor/fontawesome-free/svgs/solid/toilet-paper.svg +1 -0
  1851. package/static/vendor/fontawesome-free/svgs/solid/toilet.svg +1 -0
  1852. package/static/vendor/fontawesome-free/svgs/solid/toolbox.svg +1 -0
  1853. package/static/vendor/fontawesome-free/svgs/solid/tools.svg +1 -0
  1854. package/static/vendor/fontawesome-free/svgs/solid/tooth.svg +1 -0
  1855. package/static/vendor/fontawesome-free/svgs/solid/torah.svg +1 -0
  1856. package/static/vendor/fontawesome-free/svgs/solid/torii-gate.svg +1 -0
  1857. package/static/vendor/fontawesome-free/svgs/solid/tractor.svg +1 -0
  1858. package/static/vendor/fontawesome-free/svgs/solid/trademark.svg +1 -0
  1859. package/static/vendor/fontawesome-free/svgs/solid/traffic-light.svg +1 -0
  1860. package/static/vendor/fontawesome-free/svgs/solid/trailer.svg +1 -0
  1861. package/static/vendor/fontawesome-free/svgs/solid/train.svg +1 -0
  1862. package/static/vendor/fontawesome-free/svgs/solid/tram.svg +1 -0
  1863. package/static/vendor/fontawesome-free/svgs/solid/transgender-alt.svg +1 -0
  1864. package/static/vendor/fontawesome-free/svgs/solid/transgender.svg +1 -0
  1865. package/static/vendor/fontawesome-free/svgs/solid/trash-alt.svg +1 -0
  1866. package/static/vendor/fontawesome-free/svgs/solid/trash-restore-alt.svg +1 -0
  1867. package/static/vendor/fontawesome-free/svgs/solid/trash-restore.svg +1 -0
  1868. package/static/vendor/fontawesome-free/svgs/solid/trash.svg +1 -0
  1869. package/static/vendor/fontawesome-free/svgs/solid/tree.svg +1 -0
  1870. package/static/vendor/fontawesome-free/svgs/solid/trophy.svg +1 -0
  1871. package/static/vendor/fontawesome-free/svgs/solid/truck-loading.svg +1 -0
  1872. package/static/vendor/fontawesome-free/svgs/solid/truck-monster.svg +1 -0
  1873. package/static/vendor/fontawesome-free/svgs/solid/truck-moving.svg +1 -0
  1874. package/static/vendor/fontawesome-free/svgs/solid/truck-pickup.svg +1 -0
  1875. package/static/vendor/fontawesome-free/svgs/solid/truck.svg +1 -0
  1876. package/static/vendor/fontawesome-free/svgs/solid/tshirt.svg +1 -0
  1877. package/static/vendor/fontawesome-free/svgs/solid/tty.svg +1 -0
  1878. package/static/vendor/fontawesome-free/svgs/solid/tv.svg +1 -0
  1879. package/static/vendor/fontawesome-free/svgs/solid/umbrella-beach.svg +1 -0
  1880. package/static/vendor/fontawesome-free/svgs/solid/umbrella.svg +1 -0
  1881. package/static/vendor/fontawesome-free/svgs/solid/underline.svg +1 -0
  1882. package/static/vendor/fontawesome-free/svgs/solid/undo-alt.svg +1 -0
  1883. package/static/vendor/fontawesome-free/svgs/solid/undo.svg +1 -0
  1884. package/static/vendor/fontawesome-free/svgs/solid/universal-access.svg +1 -0
  1885. package/static/vendor/fontawesome-free/svgs/solid/university.svg +1 -0
  1886. package/static/vendor/fontawesome-free/svgs/solid/unlink.svg +1 -0
  1887. package/static/vendor/fontawesome-free/svgs/solid/unlock-alt.svg +1 -0
  1888. package/static/vendor/fontawesome-free/svgs/solid/unlock.svg +1 -0
  1889. package/static/vendor/fontawesome-free/svgs/solid/upload.svg +1 -0
  1890. package/static/vendor/fontawesome-free/svgs/solid/user-alt-slash.svg +1 -0
  1891. package/static/vendor/fontawesome-free/svgs/solid/user-alt.svg +1 -0
  1892. package/static/vendor/fontawesome-free/svgs/solid/user-astronaut.svg +1 -0
  1893. package/static/vendor/fontawesome-free/svgs/solid/user-check.svg +1 -0
  1894. package/static/vendor/fontawesome-free/svgs/solid/user-circle.svg +1 -0
  1895. package/static/vendor/fontawesome-free/svgs/solid/user-clock.svg +1 -0
  1896. package/static/vendor/fontawesome-free/svgs/solid/user-cog.svg +1 -0
  1897. package/static/vendor/fontawesome-free/svgs/solid/user-edit.svg +1 -0
  1898. package/static/vendor/fontawesome-free/svgs/solid/user-friends.svg +1 -0
  1899. package/static/vendor/fontawesome-free/svgs/solid/user-graduate.svg +1 -0
  1900. package/static/vendor/fontawesome-free/svgs/solid/user-injured.svg +1 -0
  1901. package/static/vendor/fontawesome-free/svgs/solid/user-lock.svg +1 -0
  1902. package/static/vendor/fontawesome-free/svgs/solid/user-md.svg +1 -0
  1903. package/static/vendor/fontawesome-free/svgs/solid/user-minus.svg +1 -0
  1904. package/static/vendor/fontawesome-free/svgs/solid/user-ninja.svg +1 -0
  1905. package/static/vendor/fontawesome-free/svgs/solid/user-nurse.svg +1 -0
  1906. package/static/vendor/fontawesome-free/svgs/solid/user-plus.svg +1 -0
  1907. package/static/vendor/fontawesome-free/svgs/solid/user-secret.svg +1 -0
  1908. package/static/vendor/fontawesome-free/svgs/solid/user-shield.svg +1 -0
  1909. package/static/vendor/fontawesome-free/svgs/solid/user-slash.svg +1 -0
  1910. package/static/vendor/fontawesome-free/svgs/solid/user-tag.svg +1 -0
  1911. package/static/vendor/fontawesome-free/svgs/solid/user-tie.svg +1 -0
  1912. package/static/vendor/fontawesome-free/svgs/solid/user-times.svg +1 -0
  1913. package/static/vendor/fontawesome-free/svgs/solid/user.svg +1 -0
  1914. package/static/vendor/fontawesome-free/svgs/solid/users-cog.svg +1 -0
  1915. package/static/vendor/fontawesome-free/svgs/solid/users-slash.svg +1 -0
  1916. package/static/vendor/fontawesome-free/svgs/solid/users.svg +1 -0
  1917. package/static/vendor/fontawesome-free/svgs/solid/utensil-spoon.svg +1 -0
  1918. package/static/vendor/fontawesome-free/svgs/solid/utensils.svg +1 -0
  1919. package/static/vendor/fontawesome-free/svgs/solid/vector-square.svg +1 -0
  1920. package/static/vendor/fontawesome-free/svgs/solid/venus-double.svg +1 -0
  1921. package/static/vendor/fontawesome-free/svgs/solid/venus-mars.svg +1 -0
  1922. package/static/vendor/fontawesome-free/svgs/solid/venus.svg +1 -0
  1923. package/static/vendor/fontawesome-free/svgs/solid/vest-patches.svg +1 -0
  1924. package/static/vendor/fontawesome-free/svgs/solid/vest.svg +1 -0
  1925. package/static/vendor/fontawesome-free/svgs/solid/vial.svg +1 -0
  1926. package/static/vendor/fontawesome-free/svgs/solid/vials.svg +1 -0
  1927. package/static/vendor/fontawesome-free/svgs/solid/video-slash.svg +1 -0
  1928. package/static/vendor/fontawesome-free/svgs/solid/video.svg +1 -0
  1929. package/static/vendor/fontawesome-free/svgs/solid/vihara.svg +1 -0
  1930. package/static/vendor/fontawesome-free/svgs/solid/virus-slash.svg +1 -0
  1931. package/static/vendor/fontawesome-free/svgs/solid/virus.svg +1 -0
  1932. package/static/vendor/fontawesome-free/svgs/solid/viruses.svg +1 -0
  1933. package/static/vendor/fontawesome-free/svgs/solid/voicemail.svg +1 -0
  1934. package/static/vendor/fontawesome-free/svgs/solid/volleyball-ball.svg +1 -0
  1935. package/static/vendor/fontawesome-free/svgs/solid/volume-down.svg +1 -0
  1936. package/static/vendor/fontawesome-free/svgs/solid/volume-mute.svg +1 -0
  1937. package/static/vendor/fontawesome-free/svgs/solid/volume-off.svg +1 -0
  1938. package/static/vendor/fontawesome-free/svgs/solid/volume-up.svg +1 -0
  1939. package/static/vendor/fontawesome-free/svgs/solid/vote-yea.svg +1 -0
  1940. package/static/vendor/fontawesome-free/svgs/solid/vr-cardboard.svg +1 -0
  1941. package/static/vendor/fontawesome-free/svgs/solid/walking.svg +1 -0
  1942. package/static/vendor/fontawesome-free/svgs/solid/wallet.svg +1 -0
  1943. package/static/vendor/fontawesome-free/svgs/solid/warehouse.svg +1 -0
  1944. package/static/vendor/fontawesome-free/svgs/solid/water.svg +1 -0
  1945. package/static/vendor/fontawesome-free/svgs/solid/wave-square.svg +1 -0
  1946. package/static/vendor/fontawesome-free/svgs/solid/weight-hanging.svg +1 -0
  1947. package/static/vendor/fontawesome-free/svgs/solid/weight.svg +1 -0
  1948. package/static/vendor/fontawesome-free/svgs/solid/wheelchair.svg +1 -0
  1949. package/static/vendor/fontawesome-free/svgs/solid/wifi.svg +1 -0
  1950. package/static/vendor/fontawesome-free/svgs/solid/wind.svg +1 -0
  1951. package/static/vendor/fontawesome-free/svgs/solid/window-close.svg +1 -0
  1952. package/static/vendor/fontawesome-free/svgs/solid/window-maximize.svg +1 -0
  1953. package/static/vendor/fontawesome-free/svgs/solid/window-minimize.svg +1 -0
  1954. package/static/vendor/fontawesome-free/svgs/solid/window-restore.svg +1 -0
  1955. package/static/vendor/fontawesome-free/svgs/solid/wine-bottle.svg +1 -0
  1956. package/static/vendor/fontawesome-free/svgs/solid/wine-glass-alt.svg +1 -0
  1957. package/static/vendor/fontawesome-free/svgs/solid/wine-glass.svg +1 -0
  1958. package/static/vendor/fontawesome-free/svgs/solid/won-sign.svg +1 -0
  1959. package/static/vendor/fontawesome-free/svgs/solid/wrench.svg +1 -0
  1960. package/static/vendor/fontawesome-free/svgs/solid/x-ray.svg +1 -0
  1961. package/static/vendor/fontawesome-free/svgs/solid/yen-sign.svg +1 -0
  1962. package/static/vendor/fontawesome-free/svgs/solid/yin-yang.svg +1 -0
  1963. package/static/vendor/fontawesome-free/webfonts/fa-brands-400.eot +0 -0
  1964. package/static/vendor/fontawesome-free/webfonts/fa-brands-400.svg +3717 -0
  1965. package/static/vendor/fontawesome-free/webfonts/fa-brands-400.ttf +0 -0
  1966. package/static/vendor/fontawesome-free/webfonts/fa-brands-400.woff +0 -0
  1967. package/static/vendor/fontawesome-free/webfonts/fa-brands-400.woff2 +0 -0
  1968. package/static/vendor/fontawesome-free/webfonts/fa-regular-400.eot +0 -0
  1969. package/static/vendor/fontawesome-free/webfonts/fa-regular-400.svg +801 -0
  1970. package/static/vendor/fontawesome-free/webfonts/fa-regular-400.ttf +0 -0
  1971. package/static/vendor/fontawesome-free/webfonts/fa-regular-400.woff +0 -0
  1972. package/static/vendor/fontawesome-free/webfonts/fa-regular-400.woff2 +0 -0
  1973. package/static/vendor/fontawesome-free/webfonts/fa-solid-900.eot +0 -0
  1974. package/static/vendor/fontawesome-free/webfonts/fa-solid-900.svg +5034 -0
  1975. package/static/vendor/fontawesome-free/webfonts/fa-solid-900.ttf +0 -0
  1976. package/static/vendor/fontawesome-free/webfonts/fa-solid-900.woff +0 -0
  1977. package/static/vendor/fontawesome-free/webfonts/fa-solid-900.woff2 +0 -0
  1978. package/static/vendor/handlebars/handlebars.min-v4.7.7.js +29 -0
  1979. package/static/vendor/jquery/jquery.js +10881 -0
  1980. package/static/vendor/jquery/jquery.min.js +2 -0
  1981. package/static/vendor/jquery/jquery.min.map +1 -0
  1982. package/static/vendor/jquery/jquery.slim.js +8782 -0
  1983. package/static/vendor/jquery/jquery.slim.min.js +2 -0
  1984. package/static/vendor/jquery/jquery.slim.min.map +1 -0
  1985. package/static/vendor/jquery-easing/jquery.easing.min.js +1 -0
  1986. package/systemd/emailengine.service +11 -3
  1987. package/systemd/nginx-proxy.conf +1 -1
  1988. package/test/api-test.js +899 -0
  1989. package/test/autoreply-test.js +327 -0
  1990. package/test/bounce-test.js +151 -0
  1991. package/test/complaint-test.js +256 -0
  1992. package/test/fixtures/autoreply/LICENSE +27 -0
  1993. package/test/fixtures/autoreply/rfc3834-01.eml +23 -0
  1994. package/test/fixtures/autoreply/rfc3834-02.eml +24 -0
  1995. package/test/fixtures/autoreply/rfc3834-03.eml +26 -0
  1996. package/test/fixtures/autoreply/rfc3834-04.eml +48 -0
  1997. package/test/fixtures/autoreply/rfc3834-05.eml +19 -0
  1998. package/test/fixtures/autoreply/rfc3834-06.eml +59 -0
  1999. package/test/fixtures/bounces/163.eml +2521 -0
  2000. package/test/fixtures/bounces/fastmail.eml +242 -0
  2001. package/test/fixtures/bounces/gmail.eml +252 -0
  2002. package/test/fixtures/bounces/hotmail.eml +655 -0
  2003. package/test/fixtures/bounces/mailru.eml +121 -0
  2004. package/test/fixtures/bounces/outlook.eml +1107 -0
  2005. package/test/fixtures/bounces/postfix.eml +101 -0
  2006. package/test/fixtures/bounces/rambler.eml +116 -0
  2007. package/test/fixtures/bounces/workmail.eml +142 -0
  2008. package/test/fixtures/bounces/yahoo.eml +139 -0
  2009. package/test/fixtures/bounces/zoho.eml +83 -0
  2010. package/test/fixtures/bounces/zonemta.eml +100 -0
  2011. package/test/fixtures/complaints/LICENSE +27 -0
  2012. package/test/fixtures/complaints/amazonses.eml +72 -0
  2013. package/test/fixtures/complaints/dmarc.eml +59 -0
  2014. package/test/fixtures/complaints/hotmail.eml +49 -0
  2015. package/test/fixtures/complaints/optout.eml +40 -0
  2016. package/test/fixtures/complaints/standard-arf.eml +68 -0
  2017. package/test/fixtures/complaints/yahoo.eml +68 -0
  2018. package/test/oauth2-apps-test.js +301 -0
  2019. package/test/sendonly-test.js +160 -0
  2020. package/test/test-config.js +34 -0
  2021. package/test/webhooks-server.js +39 -0
  2022. package/translations/README.md +16 -0
  2023. package/translations/de.mo +0 -0
  2024. package/translations/de.po +335 -0
  2025. package/translations/en.mo +0 -0
  2026. package/translations/en.po +310 -0
  2027. package/translations/et.mo +0 -0
  2028. package/translations/et.po +331 -0
  2029. package/translations/fr.mo +0 -0
  2030. package/translations/fr.po +333 -0
  2031. package/translations/ja.mo +0 -0
  2032. package/translations/ja.po +322 -0
  2033. package/translations/locales.json +43 -0
  2034. package/translations/messages.pot +323 -0
  2035. package/translations/nl.mo +0 -0
  2036. package/translations/nl.po +325 -0
  2037. package/translations/pl.mo +0 -0
  2038. package/translations/pl.po +328 -0
  2039. package/update-info.sh +10 -0
  2040. package/views/account/login.hbs +54 -0
  2041. package/views/account/password.hbs +88 -0
  2042. package/views/account/security.hbs +269 -0
  2043. package/views/account/totp.hbs +30 -0
  2044. package/views/accounts/account.hbs +1254 -0
  2045. package/views/accounts/browse.hbs +102 -0
  2046. package/views/accounts/edit.hbs +332 -0
  2047. package/views/accounts/index.hbs +143 -0
  2048. package/views/accounts/register/imap-server.hbs +507 -0
  2049. package/views/accounts/register/imap.hbs +56 -0
  2050. package/views/accounts/register/index.hbs +52 -0
  2051. package/views/arena/index.hbs +4 -0
  2052. package/views/config/ai.hbs +820 -0
  2053. package/views/config/document-store/chat.hbs +362 -0
  2054. package/views/config/document-store/index.hbs +231 -0
  2055. package/views/config/document-store/mappings/index.hbs +116 -0
  2056. package/views/config/document-store/mappings/new.hbs +95 -0
  2057. package/views/config/document-store/pre-processing/index.hbs +459 -0
  2058. package/views/config/imap-proxy.hbs +479 -0
  2059. package/views/config/license.hbs +256 -0
  2060. package/views/config/logging.hbs +61 -0
  2061. package/views/config/network.hbs +334 -0
  2062. package/views/config/oauth/app.hbs +309 -0
  2063. package/views/config/oauth/edit.hbs +92 -0
  2064. package/views/config/oauth/index.hbs +150 -0
  2065. package/views/config/oauth/new.hbs +90 -0
  2066. package/views/config/oauth.hbs +354 -0
  2067. package/views/config/service-preview.hbs +14 -0
  2068. package/views/config/service.hbs +718 -0
  2069. package/views/config/smtp.hbs +525 -0
  2070. package/views/config/webhooks.hbs +404 -0
  2071. package/views/dashboard.hbs +315 -0
  2072. package/views/error.hbs +6 -1
  2073. package/views/gateways/edit.hbs +52 -0
  2074. package/views/gateways/gateway.hbs +120 -0
  2075. package/views/gateways/index.hbs +152 -0
  2076. package/views/gateways/new.hbs +61 -0
  2077. package/views/index.hbs +21 -0
  2078. package/views/internals/index.hbs +170 -0
  2079. package/views/internals/thread.hbs +143 -0
  2080. package/views/layout/app.hbs +516 -0
  2081. package/views/layout/login.hbs +78 -0
  2082. package/views/layout/main.hbs +67 -0
  2083. package/views/layout/public.hbs +90 -0
  2084. package/views/legal.hbs +83 -0
  2085. package/views/license.hbs +5 -0
  2086. package/views/partials/accounts_header.hbs +6 -0
  2087. package/views/partials/add_account_modal.hbs +60 -0
  2088. package/views/partials/address_list.hbs +37 -0
  2089. package/views/partials/alerts.hbs +33 -0
  2090. package/views/partials/document_store_header.hbs +52 -0
  2091. package/views/partials/editor_scope_info.hbs +10 -0
  2092. package/views/partials/gateway_form.hbs +65 -0
  2093. package/views/partials/gateway_js.hbs +90 -0
  2094. package/views/partials/gateways_header.hbs +6 -0
  2095. package/views/partials/oauth_config_header.hbs +10 -0
  2096. package/views/partials/oauth_form.hbs +1204 -0
  2097. package/views/partials/scope_info.hbs +134 -0
  2098. package/views/partials/security_header.hbs +11 -0
  2099. package/views/partials/side_menu.hbs +114 -0
  2100. package/views/partials/template_form.hbs +121 -0
  2101. package/views/partials/templates_header.hbs +6 -0
  2102. package/views/partials/test_send.hbs +327 -0
  2103. package/views/partials/tokens_header.hbs +6 -0
  2104. package/views/partials/webhook_form.hbs +151 -0
  2105. package/views/partials/webhooks_editor_functions.hbs +372 -0
  2106. package/views/partials/webhooks_header.hbs +6 -0
  2107. package/views/redirect.hbs +1 -0
  2108. package/views/swagger/index.hbs +76 -0
  2109. package/views/templates/edit.hbs +87 -0
  2110. package/views/templates/index.hbs +208 -0
  2111. package/views/templates/new.hbs +85 -0
  2112. package/views/templates/template.hbs +423 -0
  2113. package/views/tokens/index.hbs +207 -0
  2114. package/views/tokens/new.hbs +230 -0
  2115. package/views/unsubscribe.hbs +93 -0
  2116. package/views/upgrade.hbs +56 -0
  2117. package/views/webhooks/edit.hbs +31 -0
  2118. package/views/webhooks/index.hbs +144 -0
  2119. package/views/webhooks/new.hbs +27 -0
  2120. package/views/webhooks/webhook.hbs +265 -0
  2121. package/winconf.js +93 -0
  2122. package/workers/api.js +8246 -1256
  2123. package/workers/documents.js +1120 -0
  2124. package/workers/imap-proxy.js +91 -0
  2125. package/workers/imap.js +552 -161
  2126. package/workers/smtp.js +355 -82
  2127. package/workers/submit.js +319 -54
  2128. package/workers/webhooks.js +542 -80
  2129. package/.eslintrc +0 -14
  2130. package/.github/FUNDING.yml +0 -4
  2131. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  2132. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  2133. package/LICENSE.txt +0 -661
  2134. package/examples/api.md +0 -137
  2135. package/lib/connection.js +0 -1769
  2136. package/lib/lua/z-push.lua +0 -14
  2137. package/lib/mailbox.js +0 -1546
  2138. package/license-report-config.json +0 -3
  2139. package/licenses.txt +0 -37
  2140. package/static/bootstrap-4.6.0-dist/css/bootstrap-grid.css.map +0 -1
  2141. package/static/bootstrap-4.6.0-dist/css/bootstrap-reboot.css.map +0 -1
  2142. package/static/bootstrap-4.6.0-dist/css/bootstrap-reboot.min.css.map +0 -1
  2143. package/static/bootstrap-4.6.0-dist/css/bootstrap.css.map +0 -1
  2144. package/static/bootstrap-4.6.0-dist/css/bootstrap.min.css +0 -7
  2145. package/static/bootstrap-4.6.0-dist/css/bootstrap.min.css.map +0 -1
  2146. package/static/bootstrap-4.6.0-dist/js/bootstrap.bundle.js +0 -7045
  2147. package/static/bootstrap-4.6.0-dist/js/bootstrap.bundle.js.map +0 -1
  2148. package/static/bootstrap-4.6.0-dist/js/bootstrap.bundle.min.js +0 -7
  2149. package/static/bootstrap-4.6.0-dist/js/bootstrap.bundle.min.js.map +0 -1
  2150. package/static/bootstrap-4.6.0-dist/js/bootstrap.js.map +0 -1
  2151. package/static/bootstrap-4.6.0-dist/js/bootstrap.min.js +0 -7
  2152. package/static/bootstrap-4.6.0-dist/js/bootstrap.min.js.map +0 -1
  2153. package/static/js/emailengine.js +0 -581
  2154. package/workers/arena.js +0 -89
package/lib/schemas.js CHANGED
@@ -1,67 +1,506 @@
1
1
  'use strict';
2
2
 
3
3
  const Joi = require('joi');
4
+ const config = require('@zone-eu/wild-config');
5
+ const { getByteSize } = require('./tools');
6
+ const { locales } = require('./translations');
4
7
 
5
8
  const RESYNC_DELAY = 15 * 60;
6
9
 
7
- // allowed configuration keys
10
+ config.api = config.api || {
11
+ port: 3000,
12
+ host: '127.0.0.1',
13
+ proxy: false
14
+ };
15
+
16
+ const DEFAULT_MAX_ATTACHMENT_SIZE = 5 * 1024 * 1024;
17
+ const MAX_ATTACHMENT_SIZE = getByteSize(process.env.EENGINE_MAX_SIZE || config.api.maxSize) || DEFAULT_MAX_ATTACHMENT_SIZE;
18
+
19
+ const ADDRESS_STRATEGIES = [
20
+ { key: 'default', title: 'Default' },
21
+ { key: 'dedicated', title: 'Dedicated' },
22
+ { key: 'random', title: 'Random' }
23
+ ];
24
+
25
+ const OAUTH_PROVIDERS = {
26
+ gmail: 'Gmail',
27
+ gmailService: 'Gmail Service Accounts',
28
+ outlook: 'Outlook',
29
+ mailRu: 'Mail.ru'
30
+ };
31
+
32
+ const accountIdSchema = Joi.string().empty('').trim().max(256).example('user123').description('Unique identifier for the email account');
33
+
34
+ // Allowed configuration keys
8
35
  const settingsSchema = {
36
+ /* ────────────── Webhooks ────────────── */
37
+
38
+ webhooksEnabled: Joi.boolean().truthy('Y', 'true', '1').falsy('N', 'false', 0).description('Enable or disable webhook delivery for all accounts'),
39
+
9
40
  webhooks: Joi.string()
10
- .uri({
11
- scheme: ['http', 'https'],
12
- allowRelative: false
13
- })
41
+ .uri({ scheme: ['http', 'https'], allowRelative: false })
14
42
  .allow('')
15
- .example('https://myservice.com/imap/webhooks')
16
- .description('Webhook URL'),
43
+ .example('https://api.example.com/email/webhooks')
44
+ .description('Target URL that will receive webhook notifications via POST requests'),
45
+
46
+ webhookEvents: Joi.array().items(Joi.string().max(256).example('messageNew')).description('List of event types that will trigger webhook notifications'),
47
+
48
+ webhooksCustomHeaders: Joi.array()
49
+ .items(
50
+ Joi.object({
51
+ key: Joi.string().trim().empty('').max(1024).required().example('Authorization'),
52
+ value: Joi.string()
53
+ .trim()
54
+ .empty('')
55
+ .max(10 * 1024)
56
+ .default('')
57
+ .example('Bearer <token>')
58
+ }).label('WebhooksCustomHeader')
59
+ )
60
+ .description('Additional HTTP headers to include with every webhook request for authentication or tracking')
61
+ .label('WebhooksCustomHeaders'),
17
62
 
18
- webhookEvents: Joi.array().items(Joi.string().max(256).example('messageNew')),
63
+ notifyHeaders: Joi.array()
64
+ .items(Joi.string().max(256).example('List-ID'))
65
+ .description('Email headers to include in webhook payloads for additional context'),
19
66
 
20
- notifyHeaders: Joi.array().items(Joi.string().max(256).example('List-ID')),
67
+ /* ────────────── URLs ────────────── */
68
+
69
+ serviceUrl: Joi.string()
70
+ .uri({ scheme: ['http', 'https'], allowRelative: false })
71
+ .allow('')
72
+ .example('https://emailengine.example.com')
73
+ .description('Base URL of this EmailEngine instance (used for generating public URLs, path component is ignored)')
74
+ .label('ServiceURL'),
75
+
76
+ notificationBaseUrl: Joi.string()
77
+ .uri({ scheme: ['http', 'https'], allowRelative: false })
78
+ .allow('', null)
79
+ .example('https://emailengine.example.com/notifications')
80
+ .description('Public callback URL for external OAuth providers. Falls back to serviceUrl if not set')
81
+ .label('NotificationBaseUrl'),
82
+
83
+ /* ────────────── Tracking ────────────── */
84
+
85
+ trackSentMessages: Joi.boolean()
86
+ .truthy('Y', 'true', '1', 'on')
87
+ .falsy('N', 'false', 0, '')
88
+ .description('Enable tracking features for outgoing messages (deprecated - use trackClicks and trackOpens instead)')
89
+ .meta({ swaggerHidden: true }),
90
+
91
+ trackClicks: Joi.boolean()
92
+ .truthy('Y', 'true', '1', 'on')
93
+ .falsy('N', 'false', 0, '')
94
+ .description('Rewrite links in outgoing HTML emails to track click-through rates'),
95
+
96
+ trackOpens: Joi.boolean()
97
+ .truthy('Y', 'true', '1', 'on')
98
+ .falsy('N', 'false', 0, '')
99
+ .description('Insert a tracking pixel in outgoing HTML emails to detect when messages are opened'),
100
+
101
+ /* ────────────── IMAP ────────────── */
102
+
103
+ imapIndexer: Joi.string()
104
+ .empty('')
105
+ .trim()
106
+ .valid('full', 'fast')
107
+ .example('full')
108
+ .description(
109
+ 'IMAP indexing strategy:\n * full - Detect new, changed, and deleted messages (slower but complete)\n * fast - Detect only new messages'
110
+ ),
111
+
112
+ resolveGmailCategories: Joi.boolean()
113
+ .truthy('Y', 'true', '1', 'on')
114
+ .falsy('N', 'false', 0, '')
115
+ .description('Automatically detect and categorize Gmail tabs (Primary, Social, Promotions, etc.) for IMAP connections'),
116
+
117
+ ignoreMailCertErrors: Joi.boolean()
118
+ .truthy('Y', 'true', '1', 'on')
119
+ .falsy('N', 'false', 0, '')
120
+ .description('Allow connections to mail servers with self-signed or invalid TLS certificates (not recommended for production)'),
121
+
122
+ /* ────────────── OpenAI ────────────── */
123
+
124
+ generateEmailSummary: Joi.boolean()
125
+ .truthy('Y', 'true', '1', 'on')
126
+ .falsy('N', 'false', 0, '')
127
+ .description('Generate AI-powered summaries for incoming emails using OpenAI'),
128
+
129
+ generateRiskAssessment: Joi.boolean()
130
+ .truthy('Y', 'true', '1', 'on')
131
+ .falsy('N', 'false', 0, '')
132
+ .description('Deprecated - This feature has been removed')
133
+ .meta({ swaggerHidden: true }),
134
+
135
+ openAiAPIKey: Joi.string().allow('').example('sk-…').description('Your OpenAI API key for AI features').label('OpenAiAPIKey'),
136
+ openAiModel: Joi.string().allow('').example('gpt-3.5-turbo').description('OpenAI model to use for text generation').label('OpenAiModel'),
137
+
138
+ openAiAPIUrl: Joi.string()
139
+ .uri({ scheme: ['http', 'https'], allowRelative: false })
140
+ .allow('')
141
+ .example('https://api.openai.com')
142
+ .description('Base URL for OpenAI API (change for OpenAI-compatible services)')
143
+ .label('OpenAiAPIUrl'),
144
+
145
+ documentStoreChatModel: Joi.string()
146
+ .allow('')
147
+ .example('gpt-3.5-turbo')
148
+ .description('OpenAI model for Document Store chat (deprecated feature)')
149
+ .label('DocumentStoreChatModel')
150
+ .meta({ swaggerHidden: true }),
151
+
152
+ openAiTemperature: Joi.number()
153
+ .allow('')
154
+ .min(0)
155
+ .max(2)
156
+ .example(0.8)
157
+ .description('Controls randomness in AI responses (0 = deterministic, 2 = very creative)')
158
+ .label('OpenAiTemperature'),
159
+
160
+ openAiTopP: Joi.number()
161
+ .allow('')
162
+ .min(0)
163
+ .max(1)
164
+ .example(0.1)
165
+ .description('Nucleus sampling parameter for AI text generation (0-1, lower = more focused)')
166
+ .label('OpenAiTopP'),
167
+
168
+ openAiMaxTokens: Joi.number()
169
+ .allow('')
170
+ .min(0)
171
+ .example(3000)
172
+ .description('Maximum tokens limit for OpenAI API requests (defaults: GPT-5: 18000, GPT-4: 6500, GPT-3.5: 3000)')
173
+ .label('OpenAiMaxTokens'),
174
+
175
+ openAiPrompt: Joi.string()
176
+ .allow('')
177
+ .max(1024 * 1024)
178
+ .example('You are an assistant scanning incoming emails…')
179
+ .description('Custom system prompt to guide AI behavior when processing emails')
180
+ .label('OpenAiPrompt'),
181
+
182
+ openAiGenerateEmbeddings: Joi.boolean()
183
+ .truthy('Y', 'true', '1', 'on')
184
+ .falsy('N', 'false', 0, '')
185
+ .description('Generate vector embeddings for semantic search and similarity matching'),
186
+
187
+ /* ────────────── Webhook Filters ────────────── */
188
+
189
+ inboxNewOnly: Joi.boolean()
190
+ .truthy('Y', 'true', '1', 'on')
191
+ .falsy('N', 'false', 0, '')
192
+ .description('Trigger "messageNew" webhooks only for messages arriving in the Inbox folder'),
193
+
194
+ /* ────────────── Security ────────────── */
195
+
196
+ serviceSecret: Joi.string()
197
+ .allow('')
198
+ .example('verysecret')
199
+ .description('HMAC secret for signing API requests and validating webhooks')
200
+ .label('ServiceSecret'),
21
201
 
22
202
  authServer: Joi.string()
23
- .uri({
24
- scheme: ['http', 'https'],
25
- allowRelative: false
26
- })
203
+ .uri({ scheme: ['http', 'https'], allowRelative: false })
27
204
  .allow('')
28
- .example('https://myservice.com/authentication')
29
- .description('URL to fetch authentication data from')
205
+ .example('https://api.example.com/email/auth')
206
+ .description('External authentication service URL for retrieving mailbox credentials dynamically')
30
207
  .label('AuthServer'),
31
208
 
32
- notifyText: Joi.boolean().truthy('Y', 'true', '1').falsy('N', 'false', 0).description('Include message text in webhook notification'),
209
+ /* ────────────── Proxy ────────────── */
210
+
211
+ proxyEnabled: Joi.boolean().truthy('Y', 'true', '1', 'on').falsy('N', 'false', 0, '').description('Route outbound connections through a proxy server'),
212
+ proxyUrl: Joi.string()
213
+ .uri({ scheme: ['http', 'https', 'socks', 'socks4', 'socks5'], allowRelative: false })
214
+ .allow('')
215
+ .example('socks5://proxy.example.com:1080')
216
+ .description('Proxy server URL for outbound connections')
217
+ .label('ProxyURL'),
218
+
219
+ /* ────────────── SMTP ────────────── */
220
+
221
+ smtpEhloName: Joi.string()
222
+ .hostname()
223
+ .allow('', null)
224
+ .example('relay.example.com')
225
+ .description('Hostname to use in SMTP EHLO/HELO commands (defaults to system hostname)'),
33
226
 
34
- notifyTextSize: Joi.number().min(0),
227
+ /* ────────────── Webhook Payload ────────────── */
35
228
 
36
- gmailClientId: Joi.string().allow('').max(256).description('Gmail OAuth2 Client ID'),
37
- gmailClientSecret: Joi.string().empty('').max(256).description('Gmail OAuth2 Client Secret'),
229
+ notifyText: Joi.boolean().truthy('Y', 'true', '1', 'on').falsy('N', 'false', 0, '').description('Include plain text message content in webhook payloads'),
230
+ notifyWebSafeHtml: Joi.boolean()
231
+ .truthy('Y', 'true', '1', 'on')
232
+ .falsy('N', 'false', 0, '')
233
+ .description('Sanitize HTML content to remove potentially dangerous elements before including in webhooks'),
234
+ notifyTextSize: Joi.number().integer().min(0).description('Maximum size (in bytes) of text content to include in webhook payloads'),
235
+ notifyAttachments: Joi.boolean().truthy('Y', 'true', '1', 'on').falsy('N', 'false', 0, '').description('Include attachment data in webhook payloads'),
236
+ notifyAttachmentSize: Joi.number().integer().min(0).description('Maximum size (in bytes) per attachment to include in webhook payloads'),
237
+ notifyCalendarEvents: Joi.boolean()
238
+ .truthy('Y', 'true', '1', 'on')
239
+ .falsy('N', 'false', 0, '')
240
+ .description('Include parsed calendar event data in webhook payloads'),
241
+
242
+ /* ────────────── OAuth - Gmail (Deprecated) ────────────── */
243
+
244
+ gmailEnabled: Joi.boolean()
245
+ .truthy('Y', 'true', '1')
246
+ .falsy('N', 'false', 0)
247
+ .description('Deprecated - Controls visibility of Gmail account type')
248
+ .meta({ swaggerHidden: true }),
249
+
250
+ gmailClientId: Joi.string().allow('').max(256).description('Deprecated - Use OAuth2 Applications instead').meta({ swaggerHidden: true }),
251
+ gmailClientSecret: Joi.string().empty('').max(256).description('Deprecated - Use OAuth2 Applications instead').meta({ swaggerHidden: true }),
38
252
  gmailRedirectUrl: Joi.string()
39
253
  .allow('')
40
254
  .uri({ scheme: ['http', 'https'], allowRelative: false })
41
- .description('Gmail OAuth2 Callback URL'),
255
+ .description('Deprecated - Use OAuth2 Applications instead')
256
+ .meta({ swaggerHidden: true }),
257
+ gmailExtraScopes: Joi.array()
258
+ .items(Joi.string().empty('').trim().max(256).example('https://mail.google.com/'))
259
+ .description('Deprecated - Use OAuth2 Applications instead')
260
+ .meta({ swaggerHidden: true }),
261
+
262
+ /* ────────────── OAuth - Outlook (Deprecated) ────────────── */
263
+
264
+ outlookEnabled: Joi.boolean()
265
+ .truthy('Y', 'true', '1')
266
+ .falsy('N', 'false', 0)
267
+ .description('Deprecated - Controls visibility of Outlook account type')
268
+ .meta({ swaggerHidden: true }),
269
+ outlookClientId: Joi.string().allow('').max(256).description('Deprecated - Use OAuth2 Applications instead').meta({ swaggerHidden: true }),
270
+ outlookClientSecret: Joi.string().empty('').max(256).description('Deprecated - Use OAuth2 Applications instead').meta({ swaggerHidden: true }),
271
+ outlookRedirectUrl: Joi.string()
272
+ .allow('')
273
+ .uri({ scheme: ['http', 'https'], allowRelative: false })
274
+ .description('Deprecated - Use OAuth2 Applications instead')
275
+ .meta({ swaggerHidden: true }),
276
+ outlookAuthority: Joi.string()
277
+ .empty('')
278
+ .allow('consumers', 'organizations', 'common')
279
+ .example('consumers')
280
+ .description('Deprecated - Use OAuth2 Applications instead')
281
+ .meta({ swaggerHidden: true }),
282
+ outlookExtraScopes: Joi.array()
283
+ .items(Joi.string().empty('').trim().max(256).example('offline_access'))
284
+ .description('Deprecated - Use OAuth2 Applications instead')
285
+ .meta({ swaggerHidden: true }),
286
+
287
+ /* ────────────── OAuth - Mail.ru (Deprecated) ────────────── */
288
+
289
+ mailRuEnabled: Joi.boolean()
290
+ .truthy('Y', 'true', '1')
291
+ .falsy('N', 'false', 0)
292
+ .description('Deprecated - Controls visibility of Mail.ru account type')
293
+ .meta({ swaggerHidden: true }),
294
+ mailRuClientId: Joi.string().allow('').max(256).description('Deprecated - Use OAuth2 Applications instead').meta({ swaggerHidden: true }),
295
+ mailRuClientSecret: Joi.string().empty('').max(256).description('Deprecated - Use OAuth2 Applications instead').meta({ swaggerHidden: true }),
296
+ mailRuRedirectUrl: Joi.string()
297
+ .allow('')
298
+ .uri({ scheme: ['http', 'https'], allowRelative: false })
299
+ .description('Deprecated - Use OAuth2 Applications instead')
300
+ .meta({ swaggerHidden: true }),
301
+ mailRuExtraScopes: Joi.array()
302
+ .items(Joi.string().empty('').trim().max(256).example('offline_access'))
303
+ .description('Deprecated - Use OAuth2 Applications instead')
304
+ .meta({ swaggerHidden: true }),
305
+
306
+ /* ────────────── Generic OAuth2 Service (Deprecated) ────────────── */
307
+
308
+ serviceClient: Joi.string().trim().allow('').max(256).description('Deprecated - Use OAuth2 Applications instead').meta({ swaggerHidden: true }),
309
+ serviceKey: Joi.string()
310
+ .trim()
311
+ .empty('')
312
+ .max(100 * 1024)
313
+ .description('Deprecated - Use OAuth2 Applications instead')
314
+ .meta({ swaggerHidden: true }),
315
+ serviceExtraScopes: Joi.array()
316
+ .items(Joi.string().empty('').trim().max(256).example('https://mail.google.com/'))
317
+ .description('Deprecated - Use OAuth2 Applications instead')
318
+ .meta({ swaggerHidden: true }),
319
+
320
+ /* ────────────── Document Store (Deprecated) ────────────── */
321
+
322
+ documentStoreEnabled: Joi.boolean()
323
+ .truthy('Y', 'true', '1', 'on')
324
+ .falsy('N', 'false', 0, '')
325
+ .description('Deprecated - Document Store feature has been removed')
326
+ .meta({ swaggerHidden: true }),
327
+
328
+ documentStoreUrl: Joi.string()
329
+ .uri({ scheme: ['http', 'https'], allowRelative: false })
330
+ .allow('')
331
+ .example('https://localhost:9200')
332
+ .description('Deprecated - Document Store feature has been removed')
333
+ .meta({ swaggerHidden: true }),
334
+
335
+ documentStoreIndex: Joi.string().empty('').max(1024).description('Deprecated - Document Store feature has been removed').meta({ swaggerHidden: true }),
336
+
337
+ documentStoreAuthEnabled: Joi.boolean()
338
+ .truthy('Y', 'true', '1', 'on')
339
+ .falsy('N', 'false', 0, '')
340
+ .description('Deprecated - Document Store feature has been removed')
341
+ .meta({ swaggerHidden: true }),
342
+
343
+ documentStoreUsername: Joi.string().empty('').max(1024).description('Deprecated - Document Store feature has been removed').meta({ swaggerHidden: true }),
344
+
345
+ documentStorePassword: Joi.string().empty('').max(1024).description('Deprecated - Document Store feature has been removed').meta({ swaggerHidden: true }),
346
+
347
+ documentStoreGenerateEmbeddings: Joi.boolean()
348
+ .truthy('Y', 'true', '1', 'on')
349
+ .falsy('N', 'false', 0, '')
350
+ .description('Deprecated - Document Store feature has been removed')
351
+ .meta({ swaggerHidden: true }),
352
+
353
+ documentStorePreProcessingEnabled: Joi.boolean()
354
+ .truthy('Y', 'true', '1', 'on')
355
+ .falsy('N', 'false', 0, '')
356
+ .description('Deprecated - Document Store feature has been removed')
357
+ .meta({ swaggerHidden: true }),
358
+
359
+ /* ────────────── Logging ────────────── */
42
360
 
43
361
  logs: Joi.object({
44
- all: Joi.boolean().truthy('Y', 'true', '1').falsy('N', 'false', 0).default(false).description('Enable logs for all accounts'),
45
- resetLoggedAccounts: Joi.boolean().truthy('Y', 'true', '1').falsy('N', 'false', 0).default(false).description('Reconnect logged accounts'),
46
- accounts: Joi.array()
47
- .items(Joi.string().max(256))
48
- .default([])
49
- .example(['account-id-1', 'account-id-2'])
50
- .description('Enable logs for listed accounts')
51
- .label('LoggedAccounts'),
52
- maxLogLines: Joi.number().min(0).max(1000000).default(10000)
53
- }).label('LogSettings')
362
+ all: Joi.boolean()
363
+ .truthy('Y', 'true', '1')
364
+ .falsy('N', 'false', 0)
365
+ .default(false)
366
+ .example(false)
367
+ .description('Enable detailed logging for all email accounts'),
368
+ maxLogLines: Joi.number().integer().min(0).max(1000000).default(10000).description('Maximum number of log entries to retain per account')
369
+ }).label('LogSettings'),
370
+
371
+ /* ────────────── Local Address Strategy ────────────── */
372
+
373
+ imapStrategy: Joi.string()
374
+ .empty('')
375
+ .valid(...ADDRESS_STRATEGIES.map(entry => entry.key))
376
+ .description('IP address selection strategy for outbound IMAP connections when multiple local addresses are available'),
377
+
378
+ smtpStrategy: Joi.string()
379
+ .empty('')
380
+ .valid(...ADDRESS_STRATEGIES.map(entry => entry.key))
381
+ .description('IP address selection strategy for outbound SMTP connections when multiple local addresses are available'),
382
+
383
+ localAddresses: Joi.array()
384
+ .items(Joi.string().ip({ version: ['ipv4', 'ipv6'], cidr: 'forbidden' }))
385
+ .single()
386
+ .description('List of local IP addresses to use for outbound connections (requires appropriate network configuration)'),
387
+
388
+ /* ────────────── Built-in SMTP Server ────────────── */
389
+
390
+ smtpServerEnabled: Joi.boolean()
391
+ .truthy('Y', 'true', '1', 'on')
392
+ .falsy('N', 'false', 0, '')
393
+ .description('Enable the built-in SMTP server for receiving emails'),
394
+ smtpServerPort: Joi.number().integer().min(0).max(65535).empty('').description('Port number for the built-in SMTP server'),
395
+ smtpServerHost: Joi.string()
396
+ .ip({ version: ['ipv4', 'ipv6'], cidr: 'forbidden' })
397
+ .empty('')
398
+ .description('IP address to bind the SMTP server to (empty = all interfaces)'),
399
+ smtpServerProxy: Joi.boolean().truthy('Y', 'true', '1', 'on').falsy('N', 'false', 0, '').description('Enable PROXY protocol support for the SMTP server'),
400
+ smtpServerAuthEnabled: Joi.boolean()
401
+ .truthy('Y', 'true', '1', 'on')
402
+ .falsy('N', 'false', 0, '')
403
+ .description('Require SMTP authentication for incoming connections'),
404
+ smtpServerPassword: Joi.string().empty('').allow(null).max(1024).description('Password for SMTP authentication (null = disable authentication)'),
405
+ smtpServerTLSEnabled: Joi.boolean()
406
+ .truthy('Y', 'true', '1', 'on')
407
+ .falsy('N', 'false', 0, '')
408
+ .description('Enable TLS/STARTTLS support for the SMTP server'),
409
+
410
+ /* ────────────── IMAP Proxy ────────────── */
411
+
412
+ imapProxyServerEnabled: Joi.boolean().truthy('Y', 'true', '1', 'on').falsy('N', 'false', 0, '').description('Enable the IMAP proxy server'),
413
+ imapProxyServerPort: Joi.number().integer().min(0).max(65535).empty('').description('Port number for the IMAP proxy server'),
414
+ imapProxyServerHost: Joi.string()
415
+ .ip({ version: ['ipv4', 'ipv6'], cidr: 'forbidden' })
416
+ .empty('')
417
+ .description('IP address to bind the IMAP proxy to (empty = all interfaces)'),
418
+ imapProxyServerProxy: Joi.boolean()
419
+ .truthy('Y', 'true', '1', 'on')
420
+ .falsy('N', 'false', 0, '')
421
+ .description('Enable PROXY protocol support for the IMAP proxy'),
422
+ imapProxyServerPassword: Joi.string().empty('').allow(null).max(1024).description('Password for IMAP proxy authentication (null = disable authentication)'),
423
+ imapProxyServerTLSEnabled: Joi.boolean().truthy('Y', 'true', '1', 'on').falsy('N', 'false', 0, '').description('Enable TLS support for the IMAP proxy'),
424
+
425
+ /* ────────────── Queue & Delivery ────────────── */
426
+
427
+ queueKeep: Joi.number().integer().empty('').min(0).description('Number of completed and failed queue entries to retain for debugging'),
428
+ deliveryAttempts: Joi.number().integer().empty('').min(0).description('Maximum number of delivery attempts before marking a message as permanently failed'),
429
+
430
+ /* ────────────── Templates ────────────── */
431
+
432
+ templateHeader: Joi.string()
433
+ .empty('')
434
+ .trim()
435
+ .max(1024 * 1024)
436
+ .description('Custom HTML to inject at the top of hosted pages (e.g., for branding)'),
437
+ templateHtmlHead: Joi.string()
438
+ .empty('')
439
+ .trim()
440
+ .max(1024 * 1024)
441
+ .description('Custom HTML to inject into the <head> section of hosted pages (e.g., for analytics)'),
442
+
443
+ /* ────────────── Pre-processing ────────────── */
444
+
445
+ scriptEnv: Joi.string()
446
+ .empty('')
447
+ .trim()
448
+ .max(1024 * 1024)
449
+ .custom(value => {
450
+ if (!value?.trim()) return value;
451
+ let parsed;
452
+ try {
453
+ parsed = JSON.parse(value);
454
+ } catch {
455
+ throw new Error('Value must be valid JSON');
456
+ }
457
+ if (typeof parsed !== 'object' || parsed === null) throw new Error('Value must be a JSON object');
458
+ return value;
459
+ }, 'JSON validation')
460
+ .example('{"key":"value"}')
461
+ .description('JSON object containing environment variables available to pre-processing scripts'),
462
+
463
+ /* ────────────── Reverse Proxy ────────────── */
464
+
465
+ enableApiProxy: Joi.boolean()
466
+ .truthy('Y', 'true', '1', 'on')
467
+ .falsy('N', 'false', 0, '')
468
+ .description('Trust X-Forwarded-* headers when behind a reverse proxy'),
469
+
470
+ /* ────────────── Locale & Branding ────────────── */
471
+
472
+ locale: Joi.string()
473
+ .max(100)
474
+ .example('fr')
475
+ .valid(...locales.map(l => l.locale))
476
+ .description('Default language/locale for the user interface'),
477
+ timezone: Joi.string().max(100).example('Europe/Tallinn').description('Default timezone for date/time display (IANA timezone identifier)'),
478
+ pageBrandName: Joi.string().allow('', null).max(1024).example('EmailEngine').description('Brand name displayed in page titles'),
479
+
480
+ /* ────────────── LLM Pre-processing ────────────── */
481
+
482
+ openAiPreProcessingFn: Joi.string()
483
+ .allow('')
484
+ .max(512 * 1024)
485
+ .example('return true; // pass every email')
486
+ .description('JavaScript function to filter emails before AI processing (return true to process, false to skip)'),
487
+
488
+ /* ────────────── IMAP ID Extension ────────────── */
489
+
490
+ imapClientName: Joi.string().allow('').max(1024).example('EmailEngine').description('Client name advertised via IMAP ID extension'),
491
+ imapClientVersion: Joi.string().allow('').max(1024).example('1.3.45').description('Client version advertised via IMAP ID extension'),
492
+ imapClientVendor: Joi.string().allow('').max(1024).example('Postal Systems').description('Vendor name advertised via IMAP ID extension'),
493
+ imapClientSupportUrl: Joi.string()
494
+ .allow('')
495
+ .uri({ scheme: ['http', 'https', 'mailto'], allowRelative: false })
496
+ .example('https://github.com/postalsys/emailengine/issues')
497
+ .description('Support URL advertised via IMAP ID extension')
54
498
  };
55
499
 
56
500
  const addressSchema = Joi.object({
57
- name: Joi.string().max(256).example('Some Name'),
58
- address: Joi.string()
59
- .email({
60
- ignoreLength: false
61
- })
62
- .example('user@example.com')
63
- .required()
64
- }).label('Address');
501
+ name: Joi.string().trim().empty('').max(256).example('Some Name').description('Display name for the email address'),
502
+ address: Joi.string().email({ ignoreLength: false }).example('user@example.com').required().description('Email address')
503
+ }).description('Email address with optional display name');
65
504
 
66
505
  // generate a list of boolean values
67
506
  const settingsQuerySchema = Object.fromEntries(
@@ -73,240 +512,1190 @@ const settingsQuerySchema = Object.fromEntries(
73
512
 
74
513
  const imapSchema = {
75
514
  auth: Joi.object({
76
- user: Joi.string().max(256).required().example('myuser@gmail.com').description('Account username'),
77
- pass: Joi.string().max(256).example('verysecret').description('Account password'),
78
- accessToken: Joi.string().max(4096).description('Access Token for OAuth2')
515
+ user: Joi.string().max(256).required().example('myuser@gmail.com').description('Username or email address for IMAP authentication'),
516
+ pass: Joi.string()
517
+ .max(256)
518
+ .example('verysecret')
519
+ .description('Password for IMAP authentication')
520
+ .when('accessToken', {
521
+ is: Joi.exist().not(false, null),
522
+ then: Joi.optional().valid(false, null),
523
+ otherwise: Joi.required()
524
+ }),
525
+ accessToken: Joi.string()
526
+ .allow(false)
527
+ .max(4 * 4096)
528
+ .example(false)
529
+ .description('OAuth2 access token (when using OAuth2 instead of password authentication)')
79
530
  })
80
- .xor('pass', 'accessToken')
81
- .description('Authentication info')
531
+ .allow(false)
532
+ .when('useAuthServer', {
533
+ is: true,
534
+ then: Joi.optional().valid(false, null),
535
+ otherwise: Joi.optional()
536
+ })
537
+ .description('Authentication credentials for the IMAP server')
82
538
  .label('Authentication'),
83
539
 
84
- useAuthServer: Joi.boolean().example(false).description('Set to true to use authentication server instead of username/password'),
540
+ useAuthServer: Joi.boolean().example(false).description('Use external authentication server to retrieve credentials dynamically'),
85
541
 
86
- host: Joi.string().hostname().required().example('imap.gmail.com').description('Hostname to connect to'),
542
+ host: Joi.string()
543
+ .hostname()
544
+ .when('disabled', {
545
+ is: true,
546
+ then: Joi.optional().allow(false, null),
547
+ otherwise: Joi.required()
548
+ })
549
+ .example('imap.gmail.com')
550
+ .description('IMAP server hostname'),
87
551
  port: Joi.number()
552
+ .integer()
88
553
  .min(1)
89
- .max(64 * 1024)
90
- .required()
554
+ .max(65535)
555
+ .when('disabled', {
556
+ is: true,
557
+ then: Joi.optional().allow(false, null),
558
+ otherwise: Joi.required()
559
+ })
91
560
  .example(993)
92
- .description('Service port number'),
93
- secure: Joi.boolean().default(false).example(true).description('Should connection use TLS. Usually true for port 993'),
561
+ .description('IMAP server port (typically 993 for IMAP over TLS, 143 for STARTTLS)'),
562
+ secure: Joi.boolean().default(false).example(true).description('Use TLS encryption for the connection (true for port 993, false for STARTTLS on port 143)'),
94
563
  tls: Joi.object({
95
- rejectUnauthorized: Joi.boolean().default(true).example(true).description('How to treat invalid certificates'),
96
- minVersion: Joi.string().max(256).example('TLSv1.2').description('Minimal TLS version')
564
+ rejectUnauthorized: Joi.boolean().default(true).example(true).description('Reject connections to servers with invalid TLS certificates'),
565
+ minVersion: Joi.string().max(256).example('TLSv1.2').description('Minimum TLS version to accept (e.g., "TLSv1.2", "TLSv1.3")')
97
566
  })
98
- .description('Optional TLS configuration')
567
+ .unknown()
568
+ .description('Advanced TLS configuration options')
99
569
  .label('TLS'),
100
- resyncDelay: Joi.number().example(RESYNC_DELAY).description('Full resync delay in seconds').default(RESYNC_DELAY)
570
+ resyncDelay: Joi.number().integer().example(RESYNC_DELAY).description('Delay in seconds between full mailbox resynchronizations').default(RESYNC_DELAY),
571
+ disabled: Joi.boolean().example(false).description('Temporarily disable IMAP operations for this account'),
572
+
573
+ sentMailPath: Joi.string()
574
+ .allow(null)
575
+ .max(1024)
576
+ .example('Sent Mail')
577
+ .description('Custom folder path for sent messages. Defaults to auto-detected "Sent" folder. Set to null to use default.'),
578
+ draftsMailPath: Joi.string()
579
+ .allow(null)
580
+ .max(1024)
581
+ .example('Drafts')
582
+ .description('Custom folder path for draft messages. Defaults to auto-detected "Drafts" folder. Set to null to use default.'),
583
+ junkMailPath: Joi.string()
584
+ .allow(null)
585
+ .max(1024)
586
+ .example('Junk')
587
+ .description('Custom folder path for spam/junk messages. Defaults to auto-detected "Junk" folder. Set to null to use default.'),
588
+ trashMailPath: Joi.string()
589
+ .allow(null)
590
+ .max(1024)
591
+ .example('Trash')
592
+ .description('Custom folder path for deleted messages. Defaults to auto-detected "Trash" folder. Set to null to use default.'),
593
+ archiveMailPath: Joi.string()
594
+ .allow(null)
595
+ .max(1024)
596
+ .example('Archive')
597
+ .description('Custom folder path for archived messages. Defaults to auto-detected "Archive" folder. Set to null to use default.')
101
598
  };
102
599
 
103
600
  const smtpSchema = {
104
601
  auth: Joi.object({
105
- user: Joi.string().max(256).required().example('myuser@gmail.com').description('Account username'),
106
- pass: Joi.string().max(256).example('verysecret').description('Account password'),
107
- accessToken: Joi.string().max(4096).description('Access Token for OAuth2')
602
+ user: Joi.string().max(256).required().example('myuser@gmail.com').description('Username or email address for SMTP authentication'),
603
+ pass: Joi.string()
604
+ .max(256)
605
+ .example('verysecret')
606
+ .description('Password for SMTP authentication')
607
+ .when('accessToken', {
608
+ is: Joi.exist().not(false, null),
609
+ then: Joi.optional().valid(false, null),
610
+ otherwise: Joi.required()
611
+ }),
612
+ accessToken: Joi.string()
613
+ .allow(false)
614
+ .max(4 * 4096)
615
+ .example(false)
616
+ .description('OAuth2 access token (when using OAuth2 instead of password authentication)')
108
617
  })
109
618
  .allow(false)
110
- .xor('pass', 'accessToken')
111
- .description('Authentication info')
619
+ .when('useAuthServer', {
620
+ is: true,
621
+ then: Joi.optional().valid(false, null),
622
+ otherwise: Joi.optional()
623
+ })
624
+ .description('Authentication credentials for the SMTP server')
112
625
  .label('Authentication'),
113
626
 
114
- useAuthServer: Joi.boolean().example(false).description('Set to true to use authentication server instead of username/password'),
627
+ useAuthServer: Joi.boolean().example(false).description('Use external authentication server to retrieve credentials dynamically'),
115
628
 
116
- host: Joi.string().hostname().required().example('smtp.gmail.com').description('Hostname to connect to'),
629
+ host: Joi.string().hostname().required().example('smtp.gmail.com').description('SMTP server hostname'),
117
630
  port: Joi.number()
631
+ .integer()
118
632
  .min(1)
119
- .max(64 * 1024)
633
+ .max(65535)
120
634
  .required()
121
635
  .example(587)
122
- .description('Service port number'),
123
- secure: Joi.boolean().default(false).example(false).description('Should connection use TLS. Usually true for port 465'),
636
+ .description('SMTP server port (typically 587 for STARTTLS, 465 for SMTP over TLS, 25 for unencrypted)'),
637
+ secure: Joi.boolean()
638
+ .default(false)
639
+ .example(false)
640
+ .description('Use TLS encryption from the start (true for port 465, false for STARTTLS on ports 587/25)'),
124
641
  tls: Joi.object({
125
- rejectUnauthorized: Joi.boolean().default(true).example(true).description('How to treat invalid certificates'),
126
- minVersion: Joi.string().max(256).example('TLSv1.2').description('Minimal TLS version')
642
+ rejectUnauthorized: Joi.boolean().default(true).example(true).description('Reject connections to servers with invalid TLS certificates'),
643
+ minVersion: Joi.string().max(256).example('TLSv1.2').description('Minimum TLS version to accept (e.g., "TLSv1.2", "TLSv1.3")')
127
644
  })
128
- .description('Optional TLS configuration')
645
+ .unknown()
646
+ .description('Advanced TLS configuration options')
129
647
  .label('TLS')
130
648
  };
131
649
 
132
- const oauth2Schema = Joi.object({
133
- authorize: Joi.boolean().example(true).description('Return a redirect link to the OAuth2 consent screen'),
134
- provider: Joi.string().default('gmail').valid('gmail').description('OAuth provider'),
135
- auth: Joi.object({
136
- user: Joi.string().max(256).required().example('myuser@gmail.com').description('Account username')
137
- }),
138
- accessToken: Joi.string().max(1024).example('ya29.a0ARrdaM8a...'),
139
- refreshToken: Joi.string().max(1024).example('1//09Ie3CtORQYm...'),
140
- expires: Joi.date().iso().example('2021-03-22T13:13:31.000Z').description('Token expiration date')
650
+ const oauth2AuthSchema = Joi.object({
651
+ user: Joi.string().max(256).example('user@outlook.com').description('Primary email account username'),
652
+ delegatedUser: Joi.string().max(256).optional().example('shared.mailbox@outlook.com').description('Shared mailbox username (Microsoft 365 delegation)'),
653
+ delegatedAccount: accountIdSchema
654
+ .when('delegatedUser', {
655
+ is: Joi.exist().not(false, null),
656
+ then: Joi.optional(),
657
+ otherwise: Joi.forbidden()
658
+ })
659
+ .description(
660
+ "Account ID to use for authenticating the shared mailbox. When provided, EmailEngine uses this account's credentials instead of creating new ones."
661
+ )
141
662
  })
142
- .xor('authorize', 'auth')
143
- .label('OAuth2Auth');
663
+ .required()
664
+ .when('authorize', {
665
+ is: true,
666
+ then: Joi.optional()
667
+ })
668
+ .label('OAuth2Authentication');
669
+
670
+ const oauth2Schema = {
671
+ authorize: Joi.boolean().example(false).description('Request an OAuth2 authorization URL instead of directly configuring credentials'),
672
+ redirectUrl: Joi.string()
673
+ .empty('')
674
+ .uri({ scheme: ['http', 'https'], allowRelative: false })
675
+ .example('https://myapp/account/settings.php')
676
+ .description('URL to redirect to after OAuth2 authorization completes (only used when authorize=true)')
677
+ .when('authorize', {
678
+ is: true,
679
+ then: Joi.optional(),
680
+ otherwise: Joi.optional().valid(false, null)
681
+ }),
682
+
683
+ provider: Joi.string().max(256).example('AAABhaBPHscAAAAH').description('OAuth2 Application ID configured in EmailEngine'),
684
+
685
+ auth: oauth2AuthSchema,
686
+
687
+ useAuthServer: Joi.boolean().example(false).description('Use external authentication server for token management instead of EmailEngine'),
688
+
689
+ accessToken: Joi.string()
690
+ .max(4 * 4096)
691
+ .example('ya29.a0ARrdaM8a...')
692
+ .description('OAuth2 access token for the email account'),
693
+ refreshToken: Joi.string()
694
+ .max(4 * 4096)
695
+ .example('1//09Ie3CtORQYm...')
696
+ .description('OAuth2 refresh token for obtaining new access tokens'),
697
+
698
+ authority: Joi.string()
699
+ .trim()
700
+ .empty('')
701
+ .max(1024)
702
+ .example('consumers')
703
+ .description('Deprecated - Authority is set by the OAuth2 application configuration')
704
+ .label('SupportedAccountTypes')
705
+ .meta({ swaggerHidden: true }),
706
+
707
+ expires: Joi.date().iso().example('2021-03-22T13:13:31.000Z').description('Access token expiration timestamp')
708
+ };
709
+
710
+ const partialSchema = Joi.boolean().example(false).description('Update only the provided fields instead of replacing the entire configuration').default(false);
711
+
712
+ const imapUpdateSchema = {
713
+ partial: partialSchema,
714
+
715
+ auth: Joi.object({
716
+ user: Joi.string().max(256).required().example('myuser@gmail.com').description('Username or email address for IMAP authentication'),
717
+ pass: Joi.string()
718
+ .max(256)
719
+ .example('verysecret')
720
+ .description('Password for IMAP authentication')
721
+ .when('accessToken', {
722
+ is: Joi.exist().not(false, null),
723
+ then: Joi.optional().valid(false, null),
724
+ otherwise: Joi.required()
725
+ }),
726
+ accessToken: Joi.string()
727
+ .allow(false)
728
+ .max(4 * 4096)
729
+ .example(false)
730
+ .description('OAuth2 access token (when using OAuth2 instead of password authentication)')
731
+ })
732
+ .allow(false)
733
+ .when('useAuthServer', {
734
+ is: true,
735
+ then: Joi.optional().valid(false, null),
736
+ otherwise: Joi.optional()
737
+ })
738
+ .description('Authentication credentials for the IMAP server')
739
+ .label('Authentication'),
740
+
741
+ useAuthServer: Joi.boolean().example(false).description('Use external authentication server to retrieve credentials dynamically'),
742
+
743
+ host: Joi.string().hostname().example('imap.gmail.com').description('IMAP server hostname'),
744
+ port: Joi.number().integer().min(1).max(65535).example(993).description('IMAP server port'),
745
+ secure: Joi.boolean().example(true).description('Use TLS encryption for the connection'),
746
+ tls: Joi.object({
747
+ rejectUnauthorized: Joi.boolean().example(true).description('Reject connections to servers with invalid TLS certificates'),
748
+ minVersion: Joi.string().max(256).example('TLSv1.2').description('Minimum TLS version to accept')
749
+ })
750
+ .unknown()
751
+ .description('Advanced TLS configuration options')
752
+ .label('TLS'),
753
+ resyncDelay: Joi.number().integer().example(RESYNC_DELAY).description('Delay in seconds between full mailbox resynchronizations'),
754
+
755
+ disabled: Joi.boolean().example(false).description('Temporarily disable IMAP operations for this account'),
756
+
757
+ sentMailPath: Joi.string().allow(null).max(1024).example('Sent Mail').description('Custom folder path for sent messages. Set to null to use default.'),
758
+ draftsMailPath: Joi.string().allow(null).max(1024).example('Drafts').description('Custom folder path for draft messages. Set to null to use default.'),
759
+ junkMailPath: Joi.string().allow(null).max(1024).example('Junk').description('Custom folder path for spam/junk messages. Set to null to use default.'),
760
+ trashMailPath: Joi.string().allow(null).max(1024).example('Trash').description('Custom folder path for deleted messages. Set to null to use default.'),
761
+ archiveMailPath: Joi.string().allow(null).max(1024).example('Archive').description('Custom folder path for archived messages. Set to null to use default.')
762
+ };
763
+
764
+ const smtpUpdateSchema = {
765
+ partial: partialSchema,
766
+ auth: Joi.object({
767
+ user: Joi.string().max(256).required().example('myuser@gmail.com').description('Username or email address for SMTP authentication'),
768
+ pass: Joi.string()
769
+ .max(256)
770
+ .example('verysecret')
771
+ .description('Password for SMTP authentication')
772
+ .when('accessToken', {
773
+ is: Joi.exist().not(false, null),
774
+ then: Joi.optional().valid(false, null),
775
+ otherwise: Joi.required()
776
+ }),
777
+ accessToken: Joi.string()
778
+ .allow(false)
779
+ .max(4 * 4096)
780
+ .example(false)
781
+ .description('OAuth2 access token (when using OAuth2 instead of password authentication)')
782
+ })
783
+ .allow(false)
784
+ .when('useAuthServer', {
785
+ is: true,
786
+ then: Joi.optional().valid(false, null),
787
+ otherwise: Joi.optional()
788
+ })
789
+ .description('Authentication credentials for the SMTP server')
790
+ .label('Authentication'),
791
+
792
+ useAuthServer: Joi.boolean().example(false).description('Use external authentication server to retrieve credentials dynamically'),
793
+
794
+ host: Joi.string().hostname().example('smtp.gmail.com').description('SMTP server hostname'),
795
+ port: Joi.number().integer().min(1).max(65535).example(587).description('SMTP server port'),
796
+ secure: Joi.boolean().example(false).description('Use TLS encryption from the start'),
797
+ tls: Joi.object({
798
+ rejectUnauthorized: Joi.boolean().example(true).description('Reject connections to servers with invalid TLS certificates'),
799
+ minVersion: Joi.string().max(256).example('TLSv1.2').description('Minimum TLS version to accept')
800
+ })
801
+ .unknown()
802
+ .description('Advanced TLS configuration options')
803
+ .label('TLS')
804
+ };
805
+
806
+ const oauth2UpdateSchema = {
807
+ partial: partialSchema,
808
+
809
+ authorize: Joi.boolean().example(false).description('Request an OAuth2 authorization URL instead of directly configuring credentials'),
810
+ provider: Joi.string().max(256).example('AAABhaBPHscAAAAH').description('OAuth2 Application ID configured in EmailEngine'),
811
+
812
+ auth: oauth2AuthSchema,
813
+
814
+ useAuthServer: Joi.boolean().example(false).description('Use external authentication server for token management instead of EmailEngine'),
815
+
816
+ accessToken: Joi.string()
817
+ .max(4 * 4096)
818
+ .example('ya29.a0ARrdaM8a...')
819
+ .description('OAuth2 access token for the email account'),
820
+ refreshToken: Joi.string()
821
+ .max(4 * 4096)
822
+ .example('1//09Ie3CtORQYm...')
823
+ .description('OAuth2 refresh token for obtaining new access tokens'),
824
+ authority: Joi.string()
825
+ .trim()
826
+ .empty('')
827
+ .max(1024)
828
+ .example('consumers')
829
+ .description('Deprecated - Authority is set by the OAuth2 application configuration')
830
+ .label('SupportedAccountTypes')
831
+ .meta({ swaggerHidden: true }),
832
+
833
+ expires: Joi.date().iso().example('2021-03-22T13:13:31.000Z').description('Access token expiration timestamp')
834
+ };
144
835
 
145
836
  const attachmentSchema = Joi.object({
146
- id: Joi.string().example('AAAAAgAACrIyLjI').description('Attachment ID').label('AttachmentId'),
147
- contentType: Joi.string().example('image/gif').description('Mime type of the attachment'),
148
- encodedSize: Joi.number().example(48).description('Encoded size of the attachment. Actual file size is usually smaller depending on the encoding'),
149
- embedded: Joi.boolean().example(true).description('Is this image used in HTML img tag'),
150
- inline: Joi.boolean().example(true).description('Should this file be included in the message preview somehow'),
151
- contentId: Joi.string().example('<unique-image-id@localhost>').description('Usually used only for embedded images')
152
- });
837
+ id: Joi.string().example('AAAAAgAACrIyLjI').description('Unique identifier for the attachment').label('AttachmentId'),
838
+ contentType: Joi.string().example('image/gif').description('MIME type of the attachment'),
839
+ encodedSize: Joi.number()
840
+ .integer()
841
+ .example(48)
842
+ .description('Size of the attachment as stored in the email (base64 encoded). The actual decoded file size is approximately 75% of this value.'),
843
+ embedded: Joi.boolean().example(true).description('Whether the attachment is embedded in the HTML content'),
844
+ inline: Joi.boolean().example(true).description('Whether the attachment should be displayed inline rather than as a download'),
845
+ contentId: Joi.string().example('<unique-image-id@localhost>').description('Content-ID header value used for embedding images in HTML'),
846
+ filename: Joi.string().example('image.png').description('Original filename of the attachment'),
847
+ method: Joi.string().example('REQUEST').description('Calendar method (REQUEST, REPLY, CANCEL, etc.) for iCalendar attachments')
848
+ }).label('AttachmentEntry');
153
849
 
154
- const messageEntrySchema = Joi.object({
155
- id: Joi.string().example('AAAAAgAACrI').description('Message ID').label('MessageEntryId'),
156
- uid: Joi.number().example(12345).description('UID of the message').label('MessageUid'),
157
- emailId: Joi.string().example('1694937972638499881').description('Globally unique ID (if server supports it)').label('MessageEmailId'),
158
- threadId: Joi.string().example('1694936993596975454').description('Thread ID (if server supports it)').label('MessageThreadId'),
159
- date: Joi.date().iso().example('2021-03-22T13:13:31.000Z').description('Date (internal)'),
160
- draft: Joi.boolean().example(false).description('Is this message marked as a draft'),
161
- unseen: Joi.boolean().example(true).description('Is this message unseen'),
162
- flagged: Joi.boolean().example(true).description('Is this message marked as flagged'),
163
- size: Joi.number().example(1040).description('Message size in bytes'),
164
- subject: Joi.string().example('What a wonderful message').description('Message subject (decoded into unicode, applies to other string values as well)'),
850
+ const AddressListSchema = Joi.array().items(addressSchema.label('RcptAddressEntry')).description('List of email addresses').label('AddressList');
165
851
 
166
- from: addressSchema.example({ name: 'From Me', address: 'sender@example.com' }),
852
+ const fromAddressSchema = addressSchema.example({ name: 'From Me', address: 'sender@example.com' }).description('Sender email address').label('FromAddress');
167
853
 
168
- to: Joi.array()
169
- .items(addressSchema)
170
- .description('List of addresses')
171
- .example([{ address: 'recipient@example.com' }])
172
- .label('AddressList'),
854
+ const emailIdSchema = Joi.string()
855
+ .max(256)
856
+ .example('1278455344230334865')
857
+ .description('Globally unique email identifier (when supported by the email server)')
858
+ .label('MessageEmailId');
173
859
 
174
- cc: Joi.array().items(addressSchema).description('List of addresses').label('AddressList'),
860
+ const threadIdSchema = Joi.string()
861
+ .example('1694936993596975454')
862
+ .description('Thread identifier for email conversations (when supported by the email server)')
863
+ .label('MessageThreadId');
175
864
 
176
- bcc: Joi.array().items(addressSchema).description('List of addresses').label('AddressList'),
177
- messageId: Joi.string().example('<test123@example.com>').description('Message ID'),
178
- inReplyTo: Joi.string().example('<7JBUMt0WOn+_==MOkaCOQ@mail.gmail.com>').description('Replied Message ID'),
865
+ const messageEntrySchema = Joi.object({
866
+ id: Joi.string().example('AAAAAgAACrI').description('EmailEngine message identifier').label('MessageEntryId'),
867
+ uid: Joi.number().integer().example(12345).description('IMAP UID (unique identifier within the mailbox)').label('MessageUid'),
868
+ emailId: emailIdSchema,
869
+ threadId: threadIdSchema,
870
+ date: Joi.date().iso().example('2021-03-22T13:13:31.000Z').description('Date when the message was received by the mail server'),
871
+ draft: Joi.boolean().example(false).description('Whether this message is a draft'),
872
+ unseen: Joi.boolean().example(true).description('Whether this message is unread'),
873
+ flagged: Joi.boolean().example(true).description('Whether this message is flagged/starred'),
874
+ size: Joi.number().integer().example(1040).description('Message size in bytes'),
875
+ subject: Joi.string().allow('').example('What a wonderful message').description('Message subject line'),
179
876
 
180
- labels: Joi.array().items(Joi.string().example('\\Important')).description('Gmail labels').label('LabelList'),
877
+ from: fromAddressSchema,
878
+ replyTo: AddressListSchema,
879
+ to: AddressListSchema,
880
+ cc: AddressListSchema,
881
+ bcc: AddressListSchema,
882
+ messageId: Joi.string().example('<test123@example.com>').description('Message-ID header value'),
883
+ inReplyTo: Joi.string().example('<7JBUMt0WOn+_==MOkaCOQ@mail.gmail.com>').description('Message-ID of the message this is replying to'),
884
+
885
+ flags: Joi.array().items(Joi.string().example('\\Seen')).description('IMAP flags set on this message').label('FlagList'),
886
+ labels: Joi.array().items(Joi.string().example('\\Important')).description('Gmail labels applied to this message').label('LabelList'),
181
887
 
182
888
  attachments: Joi.array().items(attachmentSchema).description('List of attachments').label('AttachmentList'),
183
889
 
184
890
  text: Joi.object({
185
- id: Joi.string().example('AAAAAgAACqiTkaExkaEykA').description('Pointer to message text content'),
891
+ id: Joi.string().example('AAAAAgAACqiTkaExkaEykA').description('Identifier for fetching the full message text'),
186
892
  encodedSize: Joi.object({
187
- plain: Joi.number().example(1013).description('How many bytes for plain text'),
188
- html: Joi.number().example(1013).description('How many bytes for html content')
189
- }).description('Encoded message part sizes')
190
- }).label('TextInfo')
893
+ plain: Joi.number().integer().example(1013).description('Size of the plain text part in bytes'),
894
+ html: Joi.number().integer().example(1013).description('Size of the HTML part in bytes')
895
+ }).description('Sizes of different message parts')
896
+ }).label('TextInfo'),
897
+
898
+ preview: Joi.string().description('Short preview of the message content')
191
899
  }).label('MessageListEntry');
192
900
 
901
+ const messageSpecialUseSchema = Joi.string()
902
+ .example('\\Sent')
903
+ .valid('\\Drafts', '\\Junk', '\\Sent', '\\Trash', '\\Inbox')
904
+ .description('Special folder type where this message is stored')
905
+ .label('MessageSpecialUse');
906
+
193
907
  const messageDetailsSchema = Joi.object({
194
- id: Joi.string().example('AAAAAgAACrI').description('Message ID').label('MessageEntryId'),
195
- uid: Joi.number().example(12345).description('UID of the message').label('MessageUid'),
196
- emailId: Joi.string().example('1694937972638499881').description('Globally unique ID (if server supports it)').label('MessageEmailId'),
197
- threadId: Joi.string().example('1694936993596975454').description('Thread ID (if server supports it)').label('MessageThreadId'),
198
- date: Joi.date().iso().example('2021-03-22T13:13:31.000Z').description('Date (internal)'),
199
- draft: Joi.boolean().example(false).description('Is this message marked as a draft'),
200
- unseen: Joi.boolean().example(true).description('Is this message unseen'),
201
- flagged: Joi.boolean().example(true).description('Is this message marked as flagged'),
202
- size: Joi.number().example(1040).description('Message size in bytes'),
203
- subject: Joi.string().example('What a wonderful message').description('Message subject (decoded into unicode, applies to other string values as well)'),
204
-
205
- from: addressSchema.example({ name: 'From Me', address: 'sender@example.com' }),
206
- sender: addressSchema.example({ name: 'From Me', address: 'sender@example.com' }),
207
-
208
- to: Joi.array()
209
- .items(addressSchema)
210
- .description('List of addresses')
211
- .example([{ address: 'recipient@example.com' }])
212
- .label('AddressList'),
213
-
214
- cc: Joi.array().items(addressSchema).description('List of addresses').label('AddressList'),
215
-
216
- bcc: Joi.array().items(addressSchema).description('List of addresses').label('AddressList'),
217
- messageId: Joi.string().example('<test123@example.com>').description('Message ID'),
218
- inReplyTo: Joi.string().example('<7JBUMt0WOn+_==MOkaCOQ@mail.gmail.com>').description('Replied Message ID'),
219
-
220
- flags: Joi.array().items(Joi.string().example('\\Seen')).description('IMAP flags').label('FlagList'),
221
- labels: Joi.array().items(Joi.string().example('\\Important')).description('Gmail labels').label('LabelList'),
908
+ id: Joi.string().example('AAAAAgAACrI').description('EmailEngine message identifier').label('MessageEntryId'),
909
+ uid: Joi.number().integer().example(12345).description('IMAP UID (unique identifier within the mailbox)').label('MessageUid'),
910
+ emailId: emailIdSchema,
911
+ threadId: threadIdSchema,
912
+ date: Joi.date().iso().example('2021-03-22T13:13:31.000Z').description('Date when the message was received by the mail server'),
913
+ draft: Joi.boolean().example(false).description('Whether this message is a draft'),
914
+ unseen: Joi.boolean().example(true).description('Whether this message is unread'),
915
+ flagged: Joi.boolean().example(true).description('Whether this message is flagged/starred'),
916
+ size: Joi.number().integer().example(1040).description('Message size in bytes'),
917
+ subject: Joi.string().allow('').example('What a wonderful message').description('Message subject line'),
918
+
919
+ from: fromAddressSchema,
920
+ sender: fromAddressSchema,
921
+
922
+ to: AddressListSchema,
923
+
924
+ cc: AddressListSchema,
925
+
926
+ bcc: AddressListSchema,
927
+ replyTo: AddressListSchema,
928
+
929
+ messageId: Joi.string().example('<test123@example.com>').description('Message-ID header value'),
930
+ inReplyTo: Joi.string().example('<7JBUMt0WOn+_==MOkaCOQ@mail.gmail.com>').description('Message-ID of the message this is replying to'),
931
+
932
+ flags: Joi.array().items(Joi.string().example('\\Seen')).description('IMAP flags set on this message').label('FlagList'),
933
+ labels: Joi.array().items(Joi.string().example('\\Important')).description('Gmail labels applied to this message').label('LabelList'),
222
934
 
223
935
  attachments: Joi.array().items(attachmentSchema).description('List of attachments').label('AttachmentList'),
224
936
 
225
937
  headers: Joi.object()
226
938
  .example({ from: ['From Me <sender@example.com>'], subject: ['What a wonderful message'] })
227
- .description('Object where header key is object key and value is an array'),
939
+ .label('MessageHeaders')
940
+ .description(
941
+ 'Raw email headers as key-value pairs (arrays contain multiple values for headers that appear multiple times). Not available for MS Graph API.'
942
+ )
943
+ .unknown(),
228
944
 
229
945
  text: Joi.object({
230
- id: Joi.string().example('AAAAAgAACqiTkaExkaEykA').description('Pointer to message text content'),
946
+ id: Joi.string().example('AAAAAgAACqiTkaExkaEykA').description('Identifier for fetching additional text content'),
231
947
  encodedSize: Joi.object({
232
- plain: Joi.number().example(1013).description('How many bytes for plain text'),
233
- html: Joi.number().example(1013).description('How many bytes for html content')
234
- }).description('Encoded message part sizes'),
235
- plain: Joi.string().example('Hello from myself!').description('Plaintext content of the message'),
236
- html: Joi.string().example('<p>Hello from myself!</p>').description('HTML content of the message'),
237
- hasMore: Joi.boolean()
238
- .example(false)
239
- .description('If partial message content was requested then this value indicates if it includes all the content or there is more')
240
- }).label('TextInfo'),
948
+ plain: Joi.number().integer().example(1013).description('Size of the plain text part in bytes'),
949
+ html: Joi.number().integer().example(1013).description('Size of the HTML part in bytes')
950
+ }).description('Sizes of different message parts'),
951
+ plain: Joi.string().example('Hello from myself!').description('Plain text version of the message'),
952
+ html: Joi.string().example('<p>Hello from myself!</p>').description('HTML version of the message'),
953
+ hasMore: Joi.boolean().example(false).description('Whether the message content was truncated (true if more content is available via separate API call)')
954
+ }).label('TextInfoDetails'),
241
955
 
242
956
  bounces: Joi.array()
243
957
  .items(
244
958
  Joi.object({
245
- message: Joi.string().max(256).required().example('AAAAAQAACnA').description('Bounce email ID'),
246
- recipient: Joi.string().email().example('recipient@example.com'),
247
- action: Joi.string().example('failed'),
959
+ message: Joi.string().max(256).required().example('AAAAAQAACnA').description('EmailEngine identifier of the bounce notification'),
960
+ recipient: Joi.string().email().example('recipient@example.com').description('Email address that bounced'),
961
+ action: Joi.string().example('failed').description('Bounce action (failed, delayed, etc.)'),
248
962
  response: Joi.object({
249
- message: Joi.string().example('550 5.1.1 No such user'),
250
- status: Joi.string().example('5.1.1')
963
+ message: Joi.string().example('550 5.1.1 No such user').description('Error message from the receiving server'),
964
+ status: Joi.string().example('5.1.1').description('SMTP status code')
251
965
  }).label('BounceResponse'),
252
- date: Joi.date().iso().example('2021-03-22T13:13:31.000Z').description('Time the bounce was registered by EmailEngine')
966
+ date: Joi.date().iso().example('2021-03-22T13:13:31.000Z').description('When the bounce was detected')
253
967
  }).label('BounceEntry')
254
968
  )
255
- .label('BounceList')
256
- }).label('MessageListEntry');
969
+ .label('BounceList'),
970
+
971
+ isAutoReply: Joi.boolean().example(false).description('Whether this message appears to be an automatic reply (out of office, vacation responder, etc.)'),
972
+
973
+ specialUse: Joi.string()
974
+ .example('\\Sent')
975
+ .valid('\\All', '\\Archive', '\\Drafts', '\\Flagged', '\\Junk', '\\Sent', '\\Trash', '\\Inbox')
976
+ .description('Special folder type of the mailbox containing this message')
977
+ .label('MailboxSpecialUse'),
978
+ messageSpecialUse: messageSpecialUseSchema
979
+ }).label('MessageDetails');
257
980
 
258
981
  const messageListSchema = Joi.object({
259
- total: Joi.number().example(120).description('How many matching entries').label('TotalNumber'),
260
- page: Joi.number().example(0).description('Current page (0-based index)').label('PageNumber'),
261
- pages: Joi.number().example(24).description('Total page count').label('PagesNumber'),
982
+ total: Joi.number()
983
+ .integer()
984
+ .example(120)
985
+ .description('Total number of messages matching the query (exact for IMAP, approximate for Gmail API)')
986
+ .label('TotalNumber'),
987
+ page: Joi.number().integer().example(0).description('Current page number (zero-based)').label('PageNumber'),
988
+ pages: Joi.number().integer().example(24).description('Total number of pages available (exact for IMAP, approximate for Gmail API)').label('PagesNumber'),
989
+ nextPageCursor: Joi.string()
990
+ .allow(null)
991
+ .example('imap_kcQIji3UobDDTxc')
992
+ .description('Cursor for fetching the next page (null when no more pages)')
993
+ .label('NextPageCursor'),
994
+ prevPageCursor: Joi.string().allow(null).example('imap_kcQIji3UobDDTxc').description('Cursor for fetching the previous page').label('PrevPageCursor'),
262
995
  messages: Joi.array().items(messageEntrySchema).label('PageMessages')
263
996
  }).label('MessageList');
264
997
 
265
- const mailboxesSchema = Joi.array().items(
266
- Joi.object({
267
- path: Joi.string().required().example('Kalender/S&APw-nnip&AOQ-evad').description('Full path to mailbox').label('MailboxPath'),
268
- delimiter: Joi.string().example('/'),
269
- parentPath: Joi.string().required().example('Kalender').description('Full path to parent mailbox').label('MailboxParentPath'),
270
- name: Joi.string().required().example('Sünnipäevad').description('Maibox name').label('MailboxName'),
271
- listed: Joi.boolean().example(true).description('Was the mailbox found from the output of LIST command').label('MailboxListed'),
272
- subscribed: Joi.boolean().example(true).description('Was the mailbox found from the output of LSUB command').label('MailboxSubscribed'),
273
- specialUse: Joi.string()
274
- .example('\\Sent')
275
- .valid('\\All', '\\Archive', '\\Drafts', '\\Flagged', '\\Junk', '\\Sent', '\\Trash', '\\Inbox')
276
- .description('Special use flag of the mailbox if set')
277
- .label('MailboxSpecialUse'),
278
- messages: Joi.number().example(120).description('Count of messages in mailbox').label('MailboxMessages'),
279
- uidNext: Joi.number().example(121).description('Next expected UID').label('MailboxMUidNext')
280
- }).label('MailboxResponseItem')
281
- );
998
+ const mailboxesSchema = Joi.array()
999
+ .items(
1000
+ Joi.object({
1001
+ path: Joi.string().required().example('Kalender/S&APw-nnip&AOQ-evad').description('Full path to the mailbox').label('MailboxPath'),
1002
+ delimiter: Joi.string().example('/').description('Hierarchy delimiter character used in paths'),
1003
+ parentPath: Joi.string().required().example('Kalender').description('Path to the parent mailbox').label('MailboxParentPath'),
1004
+ name: Joi.string().required().example('Sünnipäevad').description('Display name of the mailbox').label('MailboxName'),
1005
+ listed: Joi.boolean().example(true).description('Whether this mailbox appears in LIST command results').label('MailboxListed'),
1006
+ subscribed: Joi.boolean().example(true).description('Whether the user is subscribed to this mailbox').label('MailboxSubscribed'),
1007
+ specialUse: Joi.string()
1008
+ .example('\\Sent')
1009
+ .valid('\\All', '\\Archive', '\\Drafts', '\\Flagged', '\\Junk', '\\Sent', '\\Trash', '\\Inbox')
1010
+ .description('Special folder type (Inbox, Sent, Drafts, etc.)')
1011
+ .label('MailboxSpecialUse'),
1012
+ specialUseSource: Joi.string()
1013
+ .example('extension')
1014
+ .valid('user', 'extension', 'name')
1015
+ .description('How the special use was determined: "user" (set via API), "extension" (server-provided), or "name" (guessed from folder name)')
1016
+ .label('MailboxSpecialUseSource'),
1017
+ noInferiors: Joi.boolean().example(false).description('Whether this mailbox can contain child mailboxes').label('MailboxNoInferiors'),
1018
+ messages: Joi.number().integer().example(120).description('Total number of messages in the mailbox').label('MailboxMessages'),
1019
+ uidNext: Joi.number().integer().example(121).description('Next UID value that will be assigned').label('MailboxUidNext'),
1020
+ status: Joi.object({
1021
+ messages: Joi.number().integer().example(120).description('Message count from STATUS command').label('StatusMessages'),
1022
+ unseen: Joi.number().integer().example(120).description('Unread message count from STATUS command').label('StatusUnseenMessages')
1023
+ })
1024
+ .description('Additional mailbox statistics')
1025
+ .label('MailboxResponseStatus')
1026
+ }).label('MailboxResponseItem')
1027
+ )
1028
+ .label('MailboxesList');
282
1029
 
283
1030
  const shortMailboxesSchema = Joi.array().items(
284
1031
  Joi.object({
285
- path: Joi.string().required().example('Kalender/S&APw-nnip&AOQ-evad').description('Full path to mailbox').label('MailboxPath'),
286
- delimiter: Joi.string().example('/'),
287
- parentPath: Joi.string().required().example('Kalender').description('Full path to parent mailbox').label('MailboxParentPath'),
288
- name: Joi.string().required().example('Sünnipäevad').description('Maibox name').label('MailboxName'),
289
- listed: Joi.boolean().example(true).description('Was the mailbox found from the output of LIST command').label('MailboxListed'),
290
- subscribed: Joi.boolean().example(true).description('Was the mailbox found from the output of LSUB command').label('MailboxSubscribed'),
1032
+ path: Joi.string().required().example('Kalender/S&APw-nnip&AOQ-evad').description('Full path to the mailbox').label('MailboxPath'),
1033
+ delimiter: Joi.string().example('/').description('Hierarchy delimiter character used in paths'),
1034
+ parentPath: Joi.string().required().example('Kalender').description('Path to the parent mailbox').label('MailboxParentPath'),
1035
+ name: Joi.string().required().example('Sünnipäevad').description('Display name of the mailbox').label('MailboxName'),
1036
+ listed: Joi.boolean().example(true).description('Whether this mailbox appears in LIST command results').label('MailboxListed'),
1037
+ subscribed: Joi.boolean().example(true).description('Whether the user is subscribed to this mailbox').label('MailboxSubscribed'),
291
1038
  specialUse: Joi.string()
292
1039
  .example('\\Sent')
293
1040
  .valid('\\All', '\\Archive', '\\Drafts', '\\Flagged', '\\Junk', '\\Sent', '\\Trash', '\\Inbox')
294
- .description('Special use flag of the mailbox if set')
1041
+ .description('Special folder type (Inbox, Sent, Drafts, etc.)')
295
1042
  .label('MailboxSpecialUse')
296
- }).label('MailboxResponseItem')
1043
+ }).label('MailboxShortResponseItem')
297
1044
  );
298
1045
 
1046
+ const licenseSchema = Joi.object({
1047
+ active: Joi.boolean().example(true).description('Whether a valid license is currently active'),
1048
+ type: Joi.string().example('EmailEngine License').description('License type/product name'),
1049
+ details: Joi.object({
1050
+ application: Joi.string().example('@postalsys/emailengine-app').description('Licensed application identifier'),
1051
+ key: Joi.string().hex().example('1edf01e35e75ed3425808eba').description('License key'),
1052
+ licensedTo: Joi.string().example('Kreata OÜ').description('Organization or individual the license is issued to'),
1053
+ hostname: Joi.string().example('emailengine.example.com').description('Licensed hostname or environment'),
1054
+ created: Joi.date().example('2021-10-13T07:47:42.695Z').description('License creation date')
1055
+ })
1056
+ .allow(false)
1057
+ .label('LicenseDetails'),
1058
+ suspended: Joi.boolean().example(false).description('Whether email operations are suspended due to license issues')
1059
+ });
1060
+
1061
+ const lastErrorSchema = Joi.object({
1062
+ response: Joi.string().example('Token request failed').description('Human-readable error message'),
1063
+ serverResponseCode: Joi.string().example('OauthRenewError').description('Error code or classification'),
1064
+ tokenRequest: Joi.object({
1065
+ grant: Joi.string().valid('refresh_token', 'authorization_code').example('refresh_token').description('OAuth2 grant type being requested'),
1066
+ provider: Joi.string().max(256).example('gmail').description('OAuth2 provider name'),
1067
+ status: Joi.number().integer().example(400).description('HTTP status code from the OAuth2 server'),
1068
+ clientId: Joi.string()
1069
+ .example('1023289917884-h3nu00e9cb7h252e24c23sv19l8k57ah.apps.googleusercontent.com')
1070
+ .description('OAuth2 client ID used for authentication'),
1071
+ scopes: Joi.array()
1072
+ .items(Joi.string().example('https://mail.google.com/').label('ScopeEntry').description('OAuth2 permission scope'))
1073
+ .description('Requested OAuth2 permission scopes')
1074
+ .label('OauthScopes'),
1075
+ response: Joi.object()
1076
+ .example({
1077
+ error: 'invalid_grant',
1078
+ error_description: 'Bad Request'
1079
+ })
1080
+ .description('Raw error response from the OAuth2 server')
1081
+ .unknown()
1082
+ }).description('Details about the failed OAuth2 token request')
1083
+ }).label('AccountErrorEntry');
1084
+
1085
+ const templateSchemas = {
1086
+ subject: Joi.string()
1087
+ .allow('')
1088
+ .trim()
1089
+ .max(10 * 1024)
1090
+ .example('What a wonderful message')
1091
+ .description('Email subject line'),
1092
+ text: Joi.string().allow('').trim().max(MAX_ATTACHMENT_SIZE).example('Hello from myself!').description('Plain text message content'),
1093
+ html: Joi.string().allow('').trim().max(MAX_ATTACHMENT_SIZE).example('<p>Hello from myself!</p>').description('HTML message content'),
1094
+ previewText: Joi.string()
1095
+ .allow('')
1096
+ .max(1024)
1097
+ .example('Welcome to our newsletter!')
1098
+ .description('Preview text shown in email clients after the subject line')
1099
+ };
1100
+
1101
+ const documentStoreSchema = Joi.boolean()
1102
+ .empty('')
1103
+ .truthy('Y', 'true', '1')
1104
+ .falsy('N', 'false', 0)
1105
+ .description('Deprecated feature - Document Store has been removed')
1106
+ .label('UseDocumentStore')
1107
+ .meta({ swaggerHidden: true });
1108
+
1109
+ const searchSchema = Joi.object({
1110
+ seq: Joi.string()
1111
+ .max(8 * 1024)
1112
+ .description('Sequence number range (e.g., "1:10" or "1,3,5"). Only supported for IMAP.'),
1113
+
1114
+ answered: Joi.boolean()
1115
+ .truthy('Y', 'true', '1')
1116
+ .falsy('N', 'false', 0)
1117
+ .description('Filter for messages that have been replied to. Only supported for IMAP.')
1118
+ .label('AnsweredFlag'),
1119
+ deleted: Joi.boolean()
1120
+ .truthy('Y', 'true', '1')
1121
+ .falsy('N', 'false', 0)
1122
+ .description('Filter for messages marked for deletion. Only supported for IMAP.')
1123
+ .label('DeletedFlag'),
1124
+ draft: Joi.boolean().truthy('Y', 'true', '1').falsy('N', 'false', 0).description('Filter for draft messages').label('DraftFlag'),
1125
+ unseen: Joi.boolean().truthy('Y', 'true', '1').falsy('N', 'false', 0).description('Filter for unread messages').label('UnseenFlag'),
1126
+ flagged: Joi.boolean().truthy('Y', 'true', '1').falsy('N', 'false', 0).description('Filter for flagged/starred messages').label('Flagged'),
1127
+ seen: Joi.boolean().truthy('Y', 'true', '1').falsy('N', 'false', 0).description('Filter for read messages').label('SeenFlag'),
1128
+
1129
+ from: Joi.string().max(256).description('Search in From addresses').label('From'),
1130
+ to: Joi.string().max(256).description('Search in To addresses. Not supported for MS Graph API.').label('To'),
1131
+ cc: Joi.string().max(256).description('Search in Cc addresses. Not supported for MS Graph API.').label('Cc'),
1132
+ bcc: Joi.string().max(256).description('Search in Bcc addresses. Not supported for MS Graph API.').label('Bcc'),
1133
+
1134
+ body: Joi.string().max(256).description('Search in message body content').label('MessageBody'),
1135
+ subject: Joi.string()
1136
+ .allow('')
1137
+ .max(10 * 256)
1138
+ .example('Hello world')
1139
+ .description('Search in message subject')
1140
+ .label('Subject'),
1141
+
1142
+ larger: Joi.number()
1143
+ .integer()
1144
+ .min(0)
1145
+ .max(1024 * 1024 * 1024)
1146
+ .description('Find messages larger than specified size in bytes. Not supported for MS Graph API.')
1147
+ .label('MessageLarger'),
1148
+
1149
+ smaller: Joi.number()
1150
+ .integer()
1151
+ .min(0)
1152
+ .max(1024 * 1024 * 1024)
1153
+ .description('Find messages smaller than specified size in bytes. Not supported for MS Graph API.')
1154
+ .label('MessageSmaller'),
1155
+
1156
+ uid: Joi.string()
1157
+ .max(8 * 1024)
1158
+ .description('UID range (e.g., "100:200" or "150,200,250"). Only supported for IMAP.')
1159
+ .label('UIDRange'),
1160
+
1161
+ modseq: Joi.number()
1162
+ .integer()
1163
+ .min(0)
1164
+ .description('Find messages with modification sequence higher than specified value. Only supported for IMAP with CONDSTORE.')
1165
+ .label('ModseqLarger'),
1166
+
1167
+ before: Joi.date().description('Find messages received before this date').label('EnvelopeBefore'),
1168
+ since: Joi.date().description('Find messages received after this date').label('EnvelopeSince'),
1169
+
1170
+ sentBefore: Joi.date().description('Find messages sent before this date').label('HeaderBefore'),
1171
+ sentSince: Joi.date().description('Find messages sent after this date').label('HeaderSince'),
1172
+
1173
+ emailId: emailIdSchema,
1174
+ threadId: threadIdSchema,
1175
+
1176
+ header: Joi.object().description('Search specific email headers').label('Headers').unknown().example({ 'Message-ID': '<1DAF52A51E674A2@example.com>' }),
1177
+
1178
+ gmailRaw: Joi.string().max(1024).example('has:attachment in:unread').description('Gmail search syntax (only works with Gmail accounts)'),
1179
+
1180
+ emailIds: Joi.array()
1181
+ .items(emailIdSchema)
1182
+ .single()
1183
+ .description('List of specific email IDs to fetch. When provided, other search criteria are ignored. Useful for bulk operations on known messages.')
1184
+ .example(['1278455344230334865'])
1185
+ .label('EmailIds')
1186
+ })
1187
+ .required()
1188
+ .description('Search criteria for filtering messages')
1189
+ .label('SearchQuery');
1190
+
1191
+ const messageUpdateSchema = Joi.object({
1192
+ flags: Joi.object({
1193
+ add: Joi.array().items(Joi.string().max(128)).single().description('Flags to add to the message').example(['\\Seen']).label('AddFlags'),
1194
+ delete: Joi.array().items(Joi.string().max(128)).single().description('Flags to remove from the message').example(['\\Flagged']).label('DeleteFlags'),
1195
+ set: Joi.array()
1196
+ .items(Joi.string().max(128))
1197
+ .single()
1198
+ .description('Replace all flags with this list')
1199
+ .example(['\\Seen', '\\Flagged'])
1200
+ .label('SetFlags')
1201
+ })
1202
+ .description('Flag operations to perform')
1203
+ .label('FlagUpdate'),
1204
+
1205
+ labels: Joi.object({
1206
+ add: Joi.array()
1207
+ .items(Joi.string().max(128))
1208
+ .single()
1209
+ .description('Gmail labels to add (use label ID or path)')
1210
+ .example(['Label_971539351003152516'])
1211
+ .label('AddLabels'),
1212
+ delete: Joi.array()
1213
+ .items(Joi.string().max(128))
1214
+ .single()
1215
+ .description('Gmail labels to remove (use label ID or path)')
1216
+ .example(['Label_971539351003152516'])
1217
+ .label('DeleteLabels'),
1218
+ set: Joi.array()
1219
+ .items(Joi.string().max(128))
1220
+ .single()
1221
+ .description('Replace all labels with this list')
1222
+ .example(['Inbox', 'Important'])
1223
+ .label('SetLabels')
1224
+ .meta({ swaggerHidden: true })
1225
+ })
1226
+ .description('Label operations to perform (Gmail only)')
1227
+ .label('LabelUpdate')
1228
+ })
1229
+ .label('MessageUpdate')
1230
+ .example({
1231
+ flags: {
1232
+ add: '\\Seen',
1233
+ delete: '\\Flagged'
1234
+ }
1235
+ });
1236
+
1237
+ const accountSchemas = {
1238
+ syncFrom: Joi.date()
1239
+ .iso()
1240
+ .allow(null)
1241
+ .example('2021-07-08T07:06:34.336Z')
1242
+ .description('Deprecated - Document Store sync start date')
1243
+ .meta({ swaggerHidden: true }),
1244
+
1245
+ notifyFrom: Joi.date()
1246
+ .iso()
1247
+ .allow(null)
1248
+ .example('2021-07-08T07:06:34.336Z')
1249
+ .description('Only send webhooks for messages received after this date. Defaults to account creation time. IMAP only.'),
1250
+
1251
+ subconnections: Joi.array()
1252
+ .items(Joi.string().max(256))
1253
+ .single()
1254
+ .example(['[Gmail]/Spam', '\\Sent'])
1255
+ .description(
1256
+ 'Additional mailbox paths to monitor with dedicated IMAP connections for faster change detection. Use sparingly as connection limits are strict.'
1257
+ )
1258
+ .label('SubconnectionPaths'),
1259
+
1260
+ imapIndexer: Joi.string()
1261
+ .empty('')
1262
+ .trim()
1263
+ .allow(null)
1264
+ .valid('full', 'fast')
1265
+ .example('full')
1266
+ .description(
1267
+ 'Override global IMAP indexing strategy for this account. "full" tracks all changes including deletions, "fast" only detects new messages.'
1268
+ )
1269
+ .label('IMAPIndexer')
1270
+ };
1271
+
1272
+ const googleProjectIdSchema = Joi.string().trim().allow('', false, null).max(256).example('project-name-425411').description('Google Cloud Project ID');
1273
+ const googleTopicNameSchema = Joi.string()
1274
+ .trim()
1275
+ .allow('', false, null)
1276
+ .pattern(/^(?!goog)[A-Za-z][A-Za-z0-9\-_.~+%]{2,254}$/)
1277
+ .max(256)
1278
+ .example('ee-pub-12345')
1279
+ .description('Google Pub/Sub topic name for Gmail push notifications');
1280
+
1281
+ const googleSubscriptionNameSchema = Joi.string()
1282
+ .trim()
1283
+ .allow('', false, null)
1284
+ .pattern(/^(?!goog)[A-Za-z][A-Za-z0-9\-_.~+%]{2,254}$/)
1285
+ .max(256)
1286
+ .example('ee-sub-12345')
1287
+ .description('Google Pub/Sub subscription name');
1288
+
1289
+ const googleWorkspaceAccountsSchema = Joi.boolean()
1290
+ .truthy('Y', 'true', '1', 'on')
1291
+ .falsy('N', 'false', 0, '')
1292
+ .example(false)
1293
+ .description('Restrict OAuth2 login to Google Workspace accounts only');
1294
+
1295
+ const oauthCreateSchema = {
1296
+ name: Joi.string().trim().empty('').max(256).example('My Gmail App').required().description('Display name for the OAuth2 application'),
1297
+ description: Joi.string().trim().allow('').max(1024).example('My cool app').description('Detailed description of the application'),
1298
+ title: Joi.string().allow('').trim().max(256).example('App title').description('Short title shown on the OAuth2 button'),
1299
+
1300
+ provider: Joi.string()
1301
+ .trim()
1302
+ .empty('')
1303
+ .max(256)
1304
+ .valid(...Object.keys(OAUTH_PROVIDERS))
1305
+ .example('gmail')
1306
+ .required()
1307
+ .description('OAuth2 provider type'),
1308
+
1309
+ enabled: Joi.boolean()
1310
+ .truthy('Y', 'true', '1', 'on')
1311
+ .falsy('N', 'false', 0, '')
1312
+ .default(false)
1313
+ .example(true)
1314
+ .description('Whether this OAuth2 app is active'),
1315
+
1316
+ clientId: Joi.string()
1317
+ .trim()
1318
+ .allow('')
1319
+ .max(256)
1320
+ .when('provider', {
1321
+ not: 'gmailService',
1322
+ then: Joi.required(),
1323
+ otherwise: Joi.optional().valid(false, null)
1324
+ })
1325
+ .example('52422112755-3uov8bjwlrullq122rdm6l8ui25ho7qf.apps.googleusercontent.com')
1326
+ .description('OAuth2 client ID from the provider'),
1327
+
1328
+ clientSecret: Joi.string()
1329
+ .trim()
1330
+ .empty('')
1331
+ .max(256)
1332
+ .when('provider', {
1333
+ not: 'gmailService',
1334
+ then: Joi.required(),
1335
+ otherwise: Joi.optional().valid(false, null)
1336
+ })
1337
+ .example('boT7Q~dUljnfFdVuqpC11g8nGMjO8kpRAv-ZB')
1338
+ .description('OAuth2 client secret from the provider'),
1339
+
1340
+ baseScopes: Joi.string().empty('').trim().valid('imap', 'api', 'pubsub').example('imap').description('Connection type (IMAP, API, or Pub/Sub)'),
1341
+
1342
+ pubSubApp: Joi.string()
1343
+ .empty('')
1344
+ .base64({ paddingRequired: false, urlSafe: true })
1345
+ .max(512)
1346
+ .example('AAAAAQAACnA')
1347
+ .allow(false, null)
1348
+ .description('Pub/Sub application ID for Gmail push notifications'),
1349
+
1350
+ extraScopes: Joi.any()
1351
+ .alter({
1352
+ web: () =>
1353
+ Joi.string()
1354
+ .allow('')
1355
+ .trim()
1356
+ .example('User.Read')
1357
+ .max(10 * 1024),
1358
+ api: () => Joi.array().items(Joi.string().trim().max(255).example('User.Read'))
1359
+ })
1360
+ .description('Additional OAuth2 permission scopes'),
1361
+
1362
+ skipScopes: Joi.any()
1363
+ .alter({
1364
+ web: () =>
1365
+ Joi.string()
1366
+ .allow('')
1367
+ .trim()
1368
+ .example('SMTP.Send')
1369
+ .max(10 * 1024),
1370
+ api: () => Joi.array().items(Joi.string().trim().max(255).example('SMTP.Send'))
1371
+ })
1372
+ .description('OAuth2 scopes to exclude from the default set'),
1373
+
1374
+ serviceClient: Joi.string()
1375
+ .trim()
1376
+ .allow('')
1377
+ .max(256)
1378
+ .when('provider', {
1379
+ is: 'gmailService',
1380
+ then: Joi.required(),
1381
+ otherwise: Joi.optional().valid(false, null)
1382
+ })
1383
+ .example('7103296518315821565203')
1384
+ .description('Service account unique ID (for 2-legged OAuth2)'),
1385
+
1386
+ googleProjectId: googleProjectIdSchema,
1387
+ googleWorkspaceAccounts: googleWorkspaceAccountsSchema,
1388
+ googleTopicName: googleTopicNameSchema,
1389
+ googleSubscriptionName: googleSubscriptionNameSchema,
1390
+
1391
+ serviceClientEmail: Joi.string()
1392
+ .trim()
1393
+ .allow('')
1394
+ .email()
1395
+ .when('provider', {
1396
+ is: 'gmailService',
1397
+ then: Joi.required(),
1398
+ otherwise: Joi.optional().valid(false, null)
1399
+ })
1400
+ .example('name@project-123.iam.gserviceaccount.com')
1401
+ .description('Service account email address'),
1402
+
1403
+ serviceKey: Joi.string()
1404
+ .trim()
1405
+ .empty('')
1406
+ .max(100 * 1024)
1407
+ .when('provider', {
1408
+ is: 'gmailService',
1409
+ then: Joi.required(),
1410
+ otherwise: Joi.optional().valid(false, null)
1411
+ })
1412
+ .example('-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgk...')
1413
+ .description('Service account private key in PEM format'),
1414
+
1415
+ authority: Joi.string()
1416
+ .trim()
1417
+ .empty('')
1418
+ .max(1024)
1419
+ .when('provider', {
1420
+ is: 'outlook',
1421
+ then: Joi.required(),
1422
+ otherwise: Joi.optional().valid(false, null)
1423
+ })
1424
+ .example('common')
1425
+ .description('Microsoft tenant configuration (common, organizations, consumers, or tenant ID)')
1426
+ .label('Authority'),
1427
+
1428
+ cloud: Joi.string()
1429
+ .trim()
1430
+ .empty('')
1431
+ .when('provider', {
1432
+ is: 'outlook',
1433
+ then: Joi.valid('global', 'gcc-high', 'dod', 'china').default('global'),
1434
+ otherwise: Joi.optional().valid(false, null)
1435
+ })
1436
+ .example('global')
1437
+ .description('Microsoft Azure cloud environment')
1438
+ .label('AzureCloud'),
1439
+
1440
+ tenant: Joi.any().alter({
1441
+ web: () =>
1442
+ Joi.string()
1443
+ .trim()
1444
+ .empty('')
1445
+ .max(1024)
1446
+ .example('f8cdef31-a31e-4b4a-93e4-5f571e91255a')
1447
+ .description('Azure Active Directory tenant ID')
1448
+ .label('DirectoryTenantId'),
1449
+ api: schema => schema.forbidden().meta({ swaggerHidden: true })
1450
+ }),
1451
+
1452
+ redirectUrl: Joi.string()
1453
+ .allow('')
1454
+ .uri({ scheme: ['http', 'https'], allowRelative: false })
1455
+ .when('provider', {
1456
+ not: 'gmailService',
1457
+ then: Joi.required(),
1458
+ otherwise: Joi.optional().valid(false, null)
1459
+ })
1460
+ .example('https://myservice.com/oauth')
1461
+ .description('OAuth2 redirect URI configured in the provider')
1462
+ };
1463
+
1464
+ const tokenRestrictionsSchema = Joi.object({
1465
+ referrers: Joi.array()
1466
+ .items(Joi.string())
1467
+ .empty('')
1468
+ .single()
1469
+ .allow(false)
1470
+ .default(false)
1471
+ .example(['*web.domain.org/*', '*.domain.org/*', 'https://domain.org/*'])
1472
+ .label('ReferrerAllowlist')
1473
+ .description('HTTP referrer patterns that are allowed to use this token (wildcards supported)'),
1474
+ addresses: Joi.array()
1475
+ .items(
1476
+ Joi.string().ip({
1477
+ version: ['ipv4', 'ipv6'],
1478
+ cidr: 'optional'
1479
+ })
1480
+ )
1481
+ .empty('')
1482
+ .single()
1483
+ .allow(false)
1484
+ .default(false)
1485
+ .example(['1.2.3.4', '5.6.7.8', '127.0.0.0/8'])
1486
+ .label('AddressAllowlist')
1487
+ .description('IP addresses or CIDR ranges allowed to use this token'),
1488
+ rateLimit: Joi.object({
1489
+ maxRequests: Joi.number().integer().min(1).example(20).description('Maximum requests allowed in the time window'),
1490
+ timeWindow: Joi.number().integer().min(1).example(2).description('Time window duration in seconds')
1491
+ })
1492
+ .allow(false)
1493
+ .default(false)
1494
+ .example({ maxRequests: 20, timeWindow: 2 })
1495
+ .label('AddressRateLimit')
1496
+ .description('Rate limiting configuration for this token')
1497
+ })
1498
+ .empty('')
1499
+ .allow(false)
1500
+ .label('TokenRestrictions')
1501
+ .description('Security restrictions for API token usage');
1502
+
1503
+ const ipSchema = Joi.string()
1504
+ .empty('')
1505
+ .trim()
1506
+ .ip({
1507
+ version: ['ipv4', 'ipv6'],
1508
+ cidr: 'forbidden'
1509
+ })
1510
+ .example('127.0.0.1');
1511
+
1512
+ const accountCountersSchema = Joi.object({
1513
+ events: Joi.object()
1514
+ .unknown()
1515
+ .description('Cumulative event counters for the account lifetime')
1516
+ .label('AccountCountersEvents')
1517
+ .example({ messageNew: 30, messageDeleted: 5 })
1518
+ }).label('AccountCounters');
1519
+
1520
+ const pathSchemaDescription =
1521
+ 'Mailbox paths to monitor for changes. Use folder names, special-use flags like "\\Sent", or "*" for all folders. Set to null to reset to default.';
1522
+ const pathSchema = Joi.string().empty('').max(1024).example('INBOX').description(pathSchemaDescription);
1523
+ const accountPathSchema = Joi.array()
1524
+ .items(pathSchema)
1525
+ .single()
1526
+ .allow(null)
1527
+ .description(
1528
+ 'Mailbox folders to monitor for changes (IMAP only). Use "*" to monitor all folders (default). While you can still access unmonitored folders via API, you won\'t receive webhooks for changes in those folders.'
1529
+ );
1530
+
1531
+ const defaultAccountTypeSchema = Joi.string()
1532
+ .empty('')
1533
+ .allow(false)
1534
+ .default(false)
1535
+ .example('imap')
1536
+ .description('Pre-select a specific account type (use "imap" or an OAuth2 app ID) instead of showing the selection screen')
1537
+ .label('DefaultAccountType');
1538
+
1539
+ const outboxEntrySchema = Joi.object({
1540
+ queueId: Joi.string().example('1869c5692565f756b33').description('Unique queue entry identifier'),
1541
+ account: accountIdSchema.required(),
1542
+ source: Joi.string().example('smtp').valid('smtp', 'api').description('How this message entered the queue'),
1543
+
1544
+ messageId: Joi.string().max(996).example('<test123@example.com>').description('Message-ID header value'),
1545
+ envelope: Joi.object({
1546
+ from: Joi.string().email().allow('').example('sender@example.com'),
1547
+ to: Joi.array().items(Joi.string().email().required().example('recipient@example.com'))
1548
+ }).description('SMTP envelope information'),
1549
+
1550
+ subject: Joi.string()
1551
+ .allow('')
1552
+ .max(10 * 1024)
1553
+ .example('What a wonderful message')
1554
+ .description('Email subject line'),
1555
+
1556
+ created: Joi.date().iso().example('2021-02-17T13:43:18.860Z').description('When this message was added to the queue'),
1557
+ scheduled: Joi.date().iso().example('2021-02-17T13:43:18.860Z').description('Scheduled delivery time'),
1558
+ nextAttempt: Joi.date().iso().example('2021-02-17T13:43:18.860Z').description('Next delivery attempt time'),
1559
+
1560
+ attemptsMade: Joi.number().integer().example(3).description('Number of delivery attempts made'),
1561
+ attempts: Joi.number().integer().example(3).description('Maximum delivery attempts before marking as failed'),
1562
+
1563
+ progress: Joi.object({
1564
+ status: Joi.string().valid('queued', 'processing', 'submitted', 'error').example('queued').description('Current delivery status'),
1565
+ response: Joi.string().example('250 Message Accepted').description('SMTP server response (when status is "processing")'),
1566
+ error: Joi.object({
1567
+ message: Joi.string().example('Authentication failed').description('Error description'),
1568
+ code: Joi.string().example('EAUTH').description('Error code'),
1569
+ statusCode: Joi.string().example(502).description('SMTP response code')
1570
+ })
1571
+ .label('OutboxListProgressError')
1572
+ .description('Error details (when status is "error")')
1573
+ }).label('OutboxEntryProgress')
1574
+ }).label('OutboxEntry');
1575
+
1576
+ const messageReferenceSchema = Joi.object({
1577
+ message: Joi.string()
1578
+ .base64({ paddingRequired: false, urlSafe: true })
1579
+ .max(256)
1580
+ .required()
1581
+ .example('AAAAAQAACnA')
1582
+ .description('EmailEngine message ID to reply to or forward'),
1583
+
1584
+ action: Joi.string()
1585
+ .lowercase()
1586
+ .valid('forward', 'reply', 'reply-all')
1587
+ .example('reply')
1588
+ .default('reply')
1589
+ .description('Action type: "reply" (reply to sender), "reply-all" (reply to all recipients), or "forward" (forward to new recipients)'),
1590
+
1591
+ inline: Joi.boolean()
1592
+ .truthy('Y', 'true', '1')
1593
+ .falsy('N', 'false', 0)
1594
+ .default(false)
1595
+ .description('Include the original message as quoted text in the response')
1596
+ .label('InlineReply'),
1597
+
1598
+ forwardAttachments: Joi.boolean()
1599
+ .truthy('Y', 'true', '1')
1600
+ .falsy('N', 'false', 0)
1601
+ .default(false)
1602
+ .description('Include original attachments when forwarding')
1603
+ .when('action', {
1604
+ is: 'forward',
1605
+ then: Joi.optional(),
1606
+ otherwise: Joi.forbidden()
1607
+ })
1608
+ .label('ForwardAttachments'),
1609
+
1610
+ ignoreMissing: Joi.boolean()
1611
+ .truthy('Y', 'true', '1')
1612
+ .falsy('N', 'false', 0)
1613
+ .default(false)
1614
+ .description('Continue sending even if the referenced message cannot be found')
1615
+ .label('IgnoreMissing'),
1616
+
1617
+ messageId: Joi.string()
1618
+ .max(996)
1619
+ .example('<test123@example.com>')
1620
+ .description('Verify the Message-ID of the referenced email matches this value before proceeding'),
1621
+
1622
+ documentStore: documentStoreSchema.default(false).meta({ swaggerHidden: true })
1623
+ })
1624
+ .description('Configuration for replying to or forwarding an existing message')
1625
+ .label('MessageReference');
1626
+
1627
+ const idempotencyKeySchema = Joi.string()
1628
+ .empty('')
1629
+ .trim()
1630
+ .min(0)
1631
+ .max(1024)
1632
+ .optional()
1633
+ .replace(/^\s*"\s*|\s*"\s*$|/g, '')
1634
+ .replace(/\\([\\"])/g, '$1')
1635
+ .description('Unique key to prevent duplicate processing of the same request')
1636
+ .label('Idempotency-Key');
1637
+
1638
+ const headerTimeoutSchema = Joi.number()
1639
+ .integer()
1640
+ .min(0)
1641
+ .max(2 * 3600 * 1000)
1642
+ .optional()
1643
+ .description('Request timeout in milliseconds (overrides EENGINE_TIMEOUT environment variable)')
1644
+ .label('X-EE-Timeout');
1645
+
299
1646
  module.exports = {
1647
+ ADDRESS_STRATEGIES,
1648
+
300
1649
  settingsSchema,
1650
+ accountSchemas,
301
1651
  addressSchema,
302
1652
  settingsQuerySchema,
303
1653
  imapSchema,
304
1654
  smtpSchema,
305
1655
  oauth2Schema,
1656
+ imapUpdateSchema,
1657
+ smtpUpdateSchema,
1658
+ oauth2UpdateSchema,
306
1659
  attachmentSchema,
307
1660
  messageEntrySchema,
308
1661
  messageDetailsSchema,
309
1662
  messageListSchema,
310
1663
  mailboxesSchema,
311
- shortMailboxesSchema
1664
+ shortMailboxesSchema,
1665
+ licenseSchema,
1666
+ lastErrorSchema,
1667
+ templateSchemas,
1668
+ documentStoreSchema,
1669
+ searchSchema,
1670
+ messageUpdateSchema,
1671
+ oauthCreateSchema,
1672
+ tokenRestrictionsSchema,
1673
+ accountIdSchema,
1674
+ ipSchema,
1675
+ accountCountersSchema,
1676
+ accountPathSchema,
1677
+ messageSpecialUseSchema,
1678
+ defaultAccountTypeSchema,
1679
+ fromAddressSchema,
1680
+ outboxEntrySchema,
1681
+ googleProjectIdSchema,
1682
+ googleTopicNameSchema,
1683
+ googleSubscriptionNameSchema,
1684
+ googleWorkspaceAccountsSchema,
1685
+ messageReferenceSchema,
1686
+ idempotencyKeySchema,
1687
+ headerTimeoutSchema
312
1688
  };
1689
+
1690
+ /*
1691
+ let schema = Joi.object(imapSchema);
1692
+ let res = schema.validate({
1693
+ host: false,
1694
+ port: 124,
1695
+ auth: { user: 'tere', pass: 'kere', accessToken: false },
1696
+ useAuthServer: false,
1697
+ disabled: false
1698
+ });
1699
+ console.log(res);
1700
+ process.exit();
1701
+ */