Compare commits

..

454 Commits

Author SHA1 Message Date
Michael Teeuw
8010e6220d Merge pull request #586 from MichMich/develop
Release 2.1.0
2016-12-31 21:17:54 +01:00
Michael Teeuw
09e6a6a4ad Merge branch 'master' into develop 2016-12-31 21:16:09 +01:00
Michael Teeuw
da772e6649 Add release date. 2016-12-31 21:12:53 +01:00
Michael Teeuw
65b8f78ca1 Merge pull request #579 from brosy/handle-newsfeed-errors
Add error handling to newsfeed
2016-12-31 19:13:01 +01:00
Michael Teeuw
23bcac2e55 Merge pull request #585 from roramirez/extra-spaces
fix tabs, remove extra spaces and lines.
2016-12-31 19:12:24 +01:00
Michael Teeuw
e6a88eef35 Merge pull request #584 from roramirez/js-use-root-path
global.root_path for js core
2016-12-31 19:11:21 +01:00
Michael Teeuw
6654c461a6 Merge pull request #582 from henglert/patch-1
Fix repeating count of yearly calendar events
2016-12-31 19:10:21 +01:00
Rodrigo Ramírez Norambuena
a48cb052c2 resolv some missing fix eslint rules no-trailing-spaces 2016-12-30 17:47:33 -03:00
Rodrigo Ramírez Norambuena
809d932087 add rules "no-trailing-spaces" and "no-irregular-whitespace" for ESLint 2016-12-30 17:44:41 -03:00
Rodrigo Ramírez Norambuena
19d906c5e4 fix tabs, remove extra spaces and lines. 2016-12-29 22:23:08 -03:00
Rodrigo Ramírez Norambuena
2f933a90fd global.root_path for js core
Use global.root_path instead of "/../" syntax to go back directory
2016-12-29 19:09:28 -03:00
henglert
3607875714 Fix repeating count of yearly calendar events
The occurrence counter for a yearly repeating event e was calculated by "current year" - "e.firstYear", instead of "e.year" - "e.firstYear". That leads to a repeating event counter - 1 at the end of the year. E.g.
event e: first Date: 2015-01-02, yearly repetition
repeating count evaluated on 2015-12-31: 2015-2015 = 0 => incorrect
repeating count evaluated on 2016-01-01: 2016-2015 = 1 => correct
Fix: repeating count has to be calculated from event date instead of current date.
2016-12-29 15:31:01 +01:00
Michael Teeuw
fec8829041 Merge pull request #580 from roramirez/root_path
global: Add the root_path variable in global.
2016-12-28 13:33:47 +01:00
Rodrigo Ramírez Norambuena
f58e758a41 global: Add the root_path variable in global.
This will can be help for work the better way in use the path into
the core and modules.
2016-12-27 14:31:35 -03:00
Ben Brosnahan
cebed0824f Fix lint error 2016-12-26 11:35:37 +00:00
Ben Brosnahan
97120bd1f1 Add error handling to newsfeed 2016-12-26 01:17:45 +00:00
Michael Teeuw
4237d0c7e3 Merge pull request #547 from dbahn25/hidePrivate
Hide private
2016-12-24 14:23:47 +01:00
Daniel Buecheler
243cdfefa2 Fix failed linter test 2016-12-22 22:00:59 +01:00
Daniel Buecheler
a12a4cd8f2 Merge remote-tracking branch 'mich/develop' into hidePrivate
Resolved merge conflict
2016-12-22 21:53:47 +01:00
Michael Teeuw
989dca5792 Merge pull request #563 from aschulz90/mm-fixes
Mm fixes
2016-12-14 10:05:20 +01:00
Michael Teeuw
c9eb06bb70 Merge pull request #560 from berlincount/develop
make electronOptions configurable
2016-12-14 10:04:27 +01:00
Michael Teeuw
af89906b81 Merge pull request #559 from roramirez/user-agent
newsfeed, calendar: Standardize user-agent.
2016-12-14 10:03:31 +01:00
Andreas
de71b1b397 Revert calendar default value and add documentation 2016-12-13 17:16:46 +01:00
Rodrigo Ramírez Norambuena
2decee1d87 Merge branch 'develop' into user-agent fix conflict. 2016-12-13 10:40:10 -03:00
Andreas 'count' Kotes
6a184b069b make electronOptions configurable, remove kioskmode from documentation 2016-12-13 13:59:24 +01:00
Michael Teeuw
48db615ac8 Merge pull request #553 from roramirez/grunt-eslint-modules
Grunt eslint modules
2016-12-13 12:58:43 +01:00
Michael Teeuw
bb9caa4838 Merge pull request #566 from roramirez/flag-plymouth
splashscreen: remove flag not used into script plymouth
2016-12-13 12:49:53 +01:00
Rodrigo Ramírez Norambuena
3c11c3fc16 splashscreen: remove flag not used into script plymouth 2016-12-13 00:33:29 -03:00
Andreas
6c1dbc5e61 Updated module READMEs with current default values 2016-12-12 14:55:07 +01:00
Andreas
21bf1dd1a3 Updated module READMEs with current default values 2016-12-12 14:52:00 +01:00
Michael Teeuw
78aa2b491c Merge pull request #558 from roramirez/size-for-compliments-text
Size for compliments text
2016-12-09 14:54:29 +01:00
Rodrigo Ramírez Norambuena
53d2c7e89f compliments: add abilty to set classes for compliments module 2016-12-09 10:49:49 -03:00
Michael Teeuw
cdf78db629 Merge pull request #552 from olexs/electron-zoom-factor
Option to scale the whole display using Electron's zoom factor
2016-12-08 15:57:47 +01:00
Olexandr Savchuk
15c5725829 Merge branch 'develop' into electron-zoom-factor 2016-12-08 15:54:52 +01:00
Michael Teeuw
96653170a2 Merge pull request #551 from olexs/round-temps
Option to display temperatures rounded to nearest integer
2016-12-08 15:47:44 +01:00
Michael Teeuw
eade89da48 Merge pull request #555 from qistoph/remoteonly
Check updates (in updatenotification) only for repos with remote
2016-12-08 15:29:17 +01:00
Rodrigo Ramírez Norambuena
9b86049964 newsfeed, calendar: Standardize user-agent.
Add node and MagicMirror version.
2016-12-08 01:29:55 -03:00
Rodrigo Ramírez Norambuena
9e2bbd50b6 README compliments: Close code tag and fix tabs 2016-12-07 22:03:32 -03:00
Chris van Marle
0d18266ad1 Fetch remote git only if repo has a remote 2016-12-07 08:38:45 +01:00
Rodrigo Ramírez Norambuena
83ee0534f2 fixed eslint error into modules for Javascript files 2016-12-02 23:23:54 -03:00
Rodrigo Ramírez Norambuena
8ad00025ad use Gruntfile into modules/default/* 2016-12-02 23:23:48 -03:00
Olexandr Savchuk
7d08a7c9cd Added documentation and changelog entry. 2016-12-02 21:14:41 +01:00
Olexandr Savchuk
c8d5a5319e Clean up duplicate code in Electron options 2016-12-02 21:09:16 +01:00
Olexandr Savchuk
a08fa721cf Added zoom factor config value and Electron option 2016-12-02 21:05:36 +01:00
Olexandr Savchuk
89bc3137ba Fixed method description. 2016-12-02 20:56:10 +01:00
Olexandr Savchuk
4d8d30f897 Moved misplaced method signature 2016-12-02 20:53:02 +01:00
Olexandr Savchuk
d67e9468c0 Changed roundTemp implementation to a cleaner one 2016-12-02 20:52:36 +01:00
Olexandr Savchuk
7dda36ab97 Merge branch 'round-temps' of github.com:olexs/MagicMirror into round-temps 2016-12-02 17:38:04 +01:00
Olexandr Savchuk
32df3e80b1 Renamed roundTemperature option to roundTemp
Added changelog entry
2016-12-02 17:33:41 +01:00
Olexandr Savchuk
3c33969d23 implemented roundTemperature in weather modules 2016-12-02 17:27:45 +01:00
Olexandr Savchuk
c2aec5ae36 implemented roundTemperature in weather modules 2016-12-02 17:17:58 +01:00
Daniel Bücheler
7afc908c32 Added hidePrivate option of calendar module 2016-11-30 21:28:49 +01:00
Daniel Bücheler
c66ecbdd29 Added hidePrivate to README.md
Added explanation of hidePrivate option to the Calendar Module's README
2016-11-30 21:28:44 +01:00
Daniel Buecheler
e61bccab36 Calendar Module: Added false as default for hidePrivate 2016-11-30 21:24:04 +01:00
Daniel Buecheler
cfeef98261 Private events are hidden
Events with the class:PRIVATE iCal property are not shown in the
calendar module. They are not added to the array of calendar
events in createEventList.

This feature can be turned on and off in the config via the property
hidePrivate: true/false.
2016-11-30 21:09:57 +01:00
Michael Teeuw
c949548150 Merge pull request #546 from BrianHepler/load_compliments_from_remote_file
Load compliments from remote file
2016-11-30 16:43:14 +01:00
Brian
829ccfca88 Updated changelog and compliments documentation. 2016-11-30 10:31:19 -05:00
Brian
950fa84d1c Added capability to load compliments from the host file system. 2016-11-30 10:30:49 -05:00
Michael Teeuw
5666729fcf Merge pull request #543 from roramirez/pulled-clock
clock: remove statement of repetead code.
2016-11-29 10:41:29 +01:00
Michael Teeuw
3a13886af9 Merge pull request #542 from aschulz90/mm-fixes
Fixed Global Default Config Being Modified
2016-11-26 16:17:14 +01:00
Rodrigo Ramírez Norambuena
db6e0ccf63 clock: remove statement of repetead code. 2016-11-26 11:45:12 -03:00
Andreas
35f2ebc2aa Fixed Global Default Config Being Modified 2016-11-26 15:33:10 +01:00
Michael Teeuw
60ac4a3e86 Merge pull request #541 from roramirez/bind-address
Add option to set bind address
2016-11-26 13:23:27 +01:00
Rodrigo Ramírez Norambuena
c966d34b07 fix camelCase detected eslint 2016-11-25 21:55:51 -03:00
Rodrigo Ramírez Norambuena
a05d7059fb Update CHANGELOG 2016-11-25 21:54:03 -03:00
Rodrigo Ramírez Norambuena
facc1dc944 add label where is bind serveronly 2016-11-25 21:48:36 -03:00
Rodrigo Ramírez Norambuena
df2ebbf384 Add option to set bind address 2016-11-25 21:41:05 -03:00
Michael Teeuw
e210471c7a Merge pull request #539 from roramirez/fix_tab_config.js_sample
fix tab into config.js.sample
2016-11-24 15:48:03 +01:00
Michael Teeuw
f42d552dad Merge pull request #540 from roramirez/space_comment_js_main
fix comments and space js/main.js
2016-11-24 15:47:49 +01:00
Rodrigo Ramírez Norambuena
edfd9e46b6 fix comments and space js/main.js 2016-11-24 00:26:40 -03:00
Rodrigo Ramírez Norambuena
27644776f3 fix tab into config.js.sample 2016-11-24 00:20:04 -03:00
Michael Teeuw
a4797dcc73 Merge pull request #537 from roramirez/comment-fix
comments fix for js/module.js
2016-11-22 23:09:35 +01:00
Rodrigo Ramírez Norambuena
677312648b comments fix for js/module.js 2016-11-22 18:53:46 -03:00
Michael Teeuw
ace460c69b Merge pull request #535 from Platimir/patch-3
Added update info translation
2016-11-22 07:51:48 +01:00
Platimir
b922fe35ab Added update info translation
Added 2/3 update info translation
2016-11-21 22:14:16 +01:00
Michael Teeuw
222e2166ff Merge pull request #530 from Jopyth/patch-3
update documentation to module default config
2016-11-21 11:03:10 +01:00
Michael Teeuw
7dc25ec425 Merge pull request #532 from roramirez/default_value_animation_newsfeed
newsfeed: fix set default value for animationSpeed option in README
2016-11-21 11:02:52 +01:00
Michael Teeuw
980835981f Merge pull request #533 from roramirez/onlyTemp
Only temp
2016-11-21 11:02:30 +01:00
Rodrigo Ramírez Norambuena
e425adc230 fix some tabs 2016-11-20 22:19:55 -03:00
Rodrigo Ramez Norambuena
2ea7ef327e currentweather: add option onlyTemp.
Is added option onlyTemp for show only current temperature and weather
icon.
2016-11-20 22:19:51 -03:00
Rodrigo Ramírez Norambuena
6c9d33f05c newsfeed: fix set default value for animationSpeed option in README 2016-11-20 20:06:58 -03:00
Jopyth
c584b51726 Update CHANGELOG.md 2016-11-20 16:49:30 +01:00
Jopyth
3c8fa3382b update documentation to module default config 2016-11-20 16:47:49 +01:00
Michael Teeuw
e5c75259e0 Merge pull request #524 from qistoph/moduleupdates
Check updates for configured modules only
2016-11-19 11:37:02 +01:00
Michael Teeuw
f78e437a42 Merge pull request #526 from roramirez/UPDATE_NOTIFICATION_MODULE-es
Update translations module es
2016-11-19 11:35:54 +01:00
Michael Teeuw
8f61b1d320 Merge pull request #527 from roramirez/standarize-tab-translations
fix tabs translations
2016-11-19 11:35:40 +01:00
Michael Teeuw
84f3c6f7e6 Merge pull request #528 from Jopyth/patch-2
add German translation for module update
2016-11-19 11:35:16 +01:00
Jopyth
bfb6c001a0 add german translation for module update 2016-11-19 07:46:30 +01:00
Rodrigo Ramírez Norambuena
f0fa9f2033 translations: Fix massive tabs into translations files. 2016-11-18 22:19:45 -03:00
Rodrigo Ramírez Norambuena
c82cc30968 translations: Add UPDATE_NOTIFICATION_MODULE string for spanish. 2016-11-18 19:23:04 -03:00
Michael Teeuw
b0cb14b515 Merge pull request #525 from Jopyth/patch-2
Fix typo
2016-11-18 17:13:11 +01:00
Jopyth
7f86d2aa0a Fix typo 2016-11-18 17:07:55 +01:00
Chris van Marle
482dd4db76 Check updates for configured modules only 2016-11-18 12:57:45 +01:00
Michael Teeuw
0f44fd2290 Merge pull request #523 from nhubbard/develop
Update Dependencies and Improve Security
2016-11-17 19:36:14 +01:00
Nicholas Hubbard
690d461693 Update CHANGELOG 2016-11-17 10:33:13 -05:00
Nicholas Hubbard
f1ca72aee9 Improve Security and Update Dependencies 2016-11-17 09:34:11 -05:00
Michael Teeuw
a3a6fc0d15 Merge pull request #521 from nhubbard/develop
Update Electron
2016-11-17 08:47:29 +01:00
Nicholas Hubbard
4f4fe5f06b Update Electron: Part II
Add the change to the changelog.
2016-11-16 20:04:56 -05:00
Nicholas Hubbard
c59f47f4b5 Update Electron: Part I
Replace `electron-prebuilt` with `electron`.
2016-11-16 20:02:37 -05:00
Michael Teeuw
0ae810b8c6 Merge pull request #519 from StefanBols/develop
Updated da translation file
2016-11-16 20:47:10 +01:00
Stefan Bols
ac9f42a8fe Updated da translationfile 2016-11-16 20:35:55 +01:00
Michael Teeuw
eab7e56ece Merge pull request #518 from qistoph/moduleupdates
Module Updates
2016-11-16 18:57:44 +01:00
Chris van Marle
7329515a4d Check for module updates 2016-11-16 18:19:44 +01:00
Michael Teeuw
6d6bf2df3a Merge pull request #516 from StefanBols/develop
Added UPDATE INFO to da.json
2016-11-16 07:03:29 +01:00
Stefan Bols
3008bfbe0a Added UPDATE INFO to da.json 2016-11-15 22:54:47 +01:00
Michael Teeuw
9399517cfb Merge pull request #512 from roramirez/readme-calendar-format-fix
calendar: little fix format README
2016-11-15 19:40:43 +01:00
Michael Teeuw
b117fe222d Merge pull request #515 from roramirez/disabled_module
Config: Add option disabled for modules configuration
2016-11-15 09:33:07 +01:00
Rodrigo Ramírez Norambuena
62567264f0 Config: Add option disabled for modules configuration 2016-11-14 14:45:59 -03:00
Michael Teeuw
c054b3b0de Merge pull request #514 from roramirez/log_line_number
logger: Show line number where is called the function for the log
2016-11-14 17:26:59 +01:00
Rodrigo Ramez Norambuena
83fb5b4d1b logger: Show line number where is called the function for the log 2016-11-14 00:04:23 -03:00
Rodrigo Ramírez Norambuena
07a86800c9 calendar: little fix format README 2016-11-12 21:10:37 -03:00
Michael Teeuw
688b5f29b6 Cleanup. 2016-11-12 20:03:56 +01:00
Michael Teeuw
e311f17062 Temp fix for wrapper issue. 2016-11-12 11:19:58 +01:00
Michael Teeuw
b4cdb22e24 Merge pull request #509 from roramirez/extra_log
remove extra console.log introduced in commit e419701
2016-11-11 14:20:38 +01:00
Rodrigo Ramez Norambuena
b63194c0aa remove extra console.log introduced in commit e419701 2016-11-11 10:18:29 -03:00
Michael Teeuw
0bab32315c Merge PR 2016-11-10 20:06:00 +01:00
Michael Teeuw
7e881dd850 Merge branch 'compliments_from_currentweather' of https://github.com/roramirez/MagicMirror into roramirez-compliments_from_currentweather 2016-11-10 20:03:58 +01:00
Michael Teeuw
d6aaafb069 Merge pull request #508 from roramirez/var_updateTimer
currentweather: Remove variable updateTimer not used
2016-11-10 20:01:25 +01:00
Michael Teeuw
731fcb8829 Merge pull request #507 from roramirez/update_es_translations
Update es translations
2016-11-10 19:39:37 +01:00
Michael Teeuw
af0e94a4b7 Merge pull request #506 from qistoph/dateformat
Dateformat
2016-11-10 19:38:51 +01:00
Rodrigo Ramírez Norambuena
deda869cc5 currentweather: Remove variable updateTimer not used 2016-11-10 15:33:16 -03:00
Rodrigo Ramírez Norambuena
434089395a translations: add DAYAFTERTOMORROW key Spanish language. 2016-11-10 15:27:10 -03:00
Rodrigo Ramírez Norambuena
048985bdf4 translations: add Spanish translations for alert module 2016-11-10 15:26:55 -03:00
Rodrigo Ramez Norambuena
70d6d4246d compliments: Add feature use current weather.
Possibility the use the actual type of currentweather to show the
compliments.
2016-11-10 15:11:18 -03:00
Chris van Marle
70befe900c Update changelog 2016-11-10 17:28:39 +01:00
Chris van Marle
9fd81bf6c7 Add dateFormat to calendar module 2016-11-10 17:26:29 +01:00
Michael Teeuw
a388fe3acb Merge pull request #505 from StefanBols/develop
Added keys to EN and DA translations files
2016-11-09 19:29:02 +01:00
Stefan Bols
d4946d931a Create da.json 2016-11-09 17:40:51 +01:00
Stefan Bols
9812654bfa Update CHANGELOG.md 2016-11-09 17:30:20 +01:00
Stefan Bols
557426246c Added key DAYAFTERTOMORROW to translation file
The key was found in the NL translation file, and were missing in the EN file
2016-11-09 17:22:33 +01:00
Stefan Bols
d0a3e8f789 Added DAYAFTERTOMORROW key to translation file
Key found at NL translation file, and are missing in the Danish translation
2016-11-09 17:20:35 +01:00
Michael Teeuw
50b37f2ddd Update changelog. 2016-11-08 20:11:46 +01:00
Michael Teeuw
e4197012f6 updateWrapperStates to hide unused regions. 2016-11-08 20:07:31 +01:00
Michael Teeuw
df00a1e0a3 Merge pull request #503 from derwehr/develop
added url to the newsfeed fetcher
2016-11-07 20:48:29 +01:00
derwehr
41327bfb03 quick fix to prevent issues with feeds that omit url and link 2016-11-07 20:46:28 +01:00
derwehr
66ef72a040 added url to the newsfeed fetcher 2016-11-07 17:49:32 +01:00
Michael Teeuw
af660bc631 Fix typo. 2016-11-06 12:54:00 +01:00
Michael Teeuw
18edb13e76 Remove Snyk since it gives to many NPM issues. 2016-11-06 12:37:04 +01:00
Michael Teeuw
e05431c847 Merge pull request #482 from roramirez/fix_change_log_pr_479
Fix the position for the feature note added in the Pull Request #479
2016-11-06 12:34:43 +01:00
Michael Teeuw
5c61f95093 Merge pull request #485 from roramirez/url_example_cities
currentweather, weatherforecast: sample URL for LocationID:
2016-11-06 12:33:20 +01:00
Michael Teeuw
9a407c727a Merge pull request #497 from roramirez/error_missing_coma-lang-es
error missing coma into es translations
2016-11-06 12:31:22 +01:00
Michael Teeuw
cad655a15b Merge pull request #500 from roramirez/space_vs_tab_calendar
calendar: fix space vs tab into caledarfetcher.js
2016-11-06 12:29:44 +01:00
Rodrigo Ramez Norambuena
1fa5c53b72 calendar: fix space vs tab into caledarfetcher.js 2016-11-05 21:23:37 -03:00
Rodrigo Ramez Norambuena
d01b1a706c error missing coma into es translations 2016-11-03 17:56:06 -03:00
Rodrigo Ramírez Norambuena
678d5fc532 currentweather, weatherforecast: sample URL for LocationID:
Changed from README the sample URLs for get the LocationID.
The http://bulk.openweather.org/sample/ doesn't work
2016-11-03 15:36:04 -03:00
Michael Teeuw
c4e01fa566 Merge pull request #494 from onuryilmaz/develop
Turkish translation added
2016-11-03 08:14:27 +01:00
Michael Teeuw
e694622b83 Merge pull request #495 from roramirez/update-es
Update: translations es
2016-11-03 08:13:44 +01:00
Rodrigo Ramírez Norambuena
1d16c96ca4 Update: translations es 2016-11-03 00:19:32 -03:00
Onur Yilmaz
ab1f34726b Turkish translation added 2016-11-02 22:03:17 +00:00
Onur Yilmaz
c9f201755e Turkish translation added 2016-11-02 22:01:14 +00:00
Michael Teeuw
094ef592a7 Merge pull request #492 from aschulz90/mm-fixes
Mm fixes
2016-10-31 20:39:00 +01:00
Andreas
e7493c38d1 Update CHANGELOG.md 2016-10-31 20:16:55 +01:00
Andreas
6fd0fcfdb5 Update module.js 2016-10-31 20:10:52 +01:00
Michael Teeuw
6da534a961 Merge pull request #491 from dougshamoo/patch-1
Fix typo in readme
2016-10-29 21:44:18 +02:00
Doug Shamoo
f26e43144e Fix typo in README 2016-10-29 12:27:34 -07:00
Michael Teeuw
427529171c Merge pull request #489 from roramirez/README-weathers-times
README Fix updateInterval for currentweather, weatherforecast:
2016-10-27 16:41:08 +02:00
Rodrigo Ramírez Norambuena
cd146cf822 README Fix updateInterval for currentweather, weatherforecast:
Fix milliseconds in the example for the updateInterval option
2016-10-27 11:12:15 -03:00
Michael Teeuw
ced412372c Merge pull request #486 from roramirez/fix_location_id_empty
currentweather, weatherforecast: fix locationID empty
2016-10-26 21:29:26 +02:00
Rodrigo Ramez Norambuena
2f6e650c1b currentweather, weatherforecast: fix locationID empty
Fix when the option locationID the value = ''

If you have the next config

 config: {
            // See 'Configuration options' for more information.
            location: 'Chillan, Chile',
            locationID: '',
            appid: 'abcde12345abcde12345abcde12345ab'
        }

The modules dont get the data, because the parameters of query is created
in id=''
2016-10-26 16:15:42 -03:00
Rodrigo Ramírez Norambuena
5c125ca9b4 Fix position note for add the feature into Pull Request #479 2016-10-25 16:14:59 -03:00
Michael Teeuw
89c0939d58 Fix needs update check. 2016-10-25 12:30:24 +02:00
Michael Teeuw
8ea955fb23 Fix type. 2016-10-25 12:24:01 +02:00
Michael Teeuw
73a297f23f Merge pull request #479 from roramirez/timezone-clock-module
add support to enable set timezone for show in clock module.
2016-10-25 11:39:19 +02:00
Rodrigo Ramírez Norambuena
95f1382fbf add support to enable set timezone for show in clock module. 2016-10-24 23:55:40 -03:00
Michael Teeuw
80df01c8ee Fix unit for display time. 2016-10-22 12:04:58 +02:00
Michael Teeuw
c2df864119 Merge pull request #475 from RedNax67/develop
Deliver additional information in calendar broadcasts
2016-10-20 09:20:30 +02:00
xander
2cc9356c32 Push location, geo and description on events stack for single and repeating events. 2016-10-20 09:05:12 +02:00
RedNax67
89234c0163 Merge pull request #1 from MichMich/develop
Develop
2016-10-20 08:41:40 +02:00
Michael Teeuw
1b7fe286a6 remove logging 2016-10-17 17:03:10 +02:00
Michael Teeuw
7c2d797ed0 Merge pull request #470 from Jopyth/patch-1
Change position from absolute to fixed
2016-10-17 16:50:48 +02:00
Jopyth
4d2eedc56b Update CHANGELOG.md 2016-10-16 17:32:17 +02:00
Jopyth
ece0d9301f Update CHANGELOG.md 2016-10-16 17:32:05 +02:00
Jopyth
cc10cd88d3 change position from absolute to fixed 2016-10-16 17:24:21 +02:00
Michael Teeuw
b9f308c832 Stylelint fixes 2016-10-15 17:11:03 +02:00
Michael Teeuw
6816bd8bad Solve margin issue. 2016-10-15 17:06:52 +02:00
Michael Teeuw
0e026de5bd Merge pull request #469 from fewieden/develop
added german translation for updatenotification
2016-10-15 15:43:01 +02:00
fewieden
a419ad201d added german translation for updatenotification 2016-10-15 13:39:42 +02:00
Michael Teeuw
a66a4f62bd Add module 'updatenotification'. 2016-10-15 13:08:46 +02:00
Michael Teeuw
e721d2204b Fix typo. 2016-10-15 11:27:34 +02:00
Michael Teeuw
f293cf6e81 Merge pull request #468 from Jopyth/patch-rain
Add option to show rain amount
2016-10-15 08:57:53 +02:00
Jopyth
0cde1d4969 Update CHANGELOG.md 2016-10-14 23:13:13 +02:00
Joseph Bethge
bd49bd6e33 option to show rain amount 2016-10-14 23:07:18 +02:00
Michael Teeuw
84dc1fa151 Possibility to use the the calendar feed as the source for the weather. 2016-10-14 17:42:07 +02:00
Michael Teeuw
5858e862d9 Broadcast calendar eventlist to other modules. 2016-10-14 15:23:03 +02:00
Michael Teeuw
8b004a549a Change Newsfeed logging. 2016-10-14 14:19:03 +02:00
Michael Teeuw
4a53e4207c Small visual change. 2016-10-13 21:05:48 +02:00
Michael Teeuw
6510de5d29 Fix logger issue on electron. 2016-10-13 20:22:30 +02:00
Michael Teeuw
a6191320a1 Improve documentation. 2016-10-13 16:47:00 +02:00
Michael Teeuw
a75ff0c061 Improve documentation. 2016-10-13 16:45:23 +02:00
Michael Teeuw
0d45eb91db Fix typo. 2016-10-13 16:43:43 +02:00
Michael Teeuw
95edbc16bb Add requiresVersion property to module API. 2016-10-13 16:42:15 +02:00
Michael Teeuw
15a5e3c779 Fix typo. 2016-10-13 15:19:12 +02:00
Michael Teeuw
0433432e62 Add information about recent changes. 2016-10-13 15:15:38 +02:00
Michael Teeuw
e7ca73bbad Merge branch 'develop' of https://github.com/MichMich/MagicMirror into develop
# Conflicts:
#	modules/README.md
2016-10-13 15:07:19 +02:00
Michael Teeuw
8d8374b8e2 First implementation of Visibility locking. 2016-10-13 15:03:52 +02:00
Michael Teeuw
4dc5bbe601 First implementation of Visibility locking. 2016-10-13 15:00:59 +02:00
Michael Teeuw
55371f9c78 Improve object instantiation to prevent reference errors. 2016-10-13 14:25:53 +02:00
Michael Teeuw
af63f4098f Improve logger. 2016-10-13 13:24:56 +02:00
Michael Teeuw
2b4939a875 Add VSCode IntelliSense support. 2016-10-13 13:10:33 +02:00
Michael Teeuw
d5d22844ab Fix info about default setting. 2016-10-04 16:27:06 +02:00
Michael Teeuw
7dab00be87 Fix info about default setting. 2016-10-04 16:26:35 +02:00
Michael Teeuw
67582d388a Fix Table. 2016-10-04 16:25:39 +02:00
Michael Teeuw
0671e7d456 Add update information. 2016-10-04 16:21:53 +02:00
Michael Teeuw
c9e6af96d0 Change update information. 2016-10-04 16:19:33 +02:00
Michael Teeuw
ee48a56603 Add info about humidity. 2016-10-01 14:08:15 +02:00
Michael Teeuw
4c03f39437 Merge branch 'amcolash-current_humidity' into develop 2016-10-01 14:06:45 +02:00
Michael Teeuw
d8d425c963 Visual changes. 2016-10-01 14:06:10 +02:00
Michael Teeuw
ec64ac9f1d Merge branch 'current_humidity' of https://github.com/amcolash/MagicMirror into amcolash-current_humidity 2016-10-01 13:56:46 +02:00
Michael Teeuw
7ed682c186 Merge branch 'develop' of https://github.com/MichMich/MagicMirror into develop 2016-10-01 13:55:54 +02:00
Michael Teeuw
9dcb579741 Merge branch 'fewieden-develop' into develop 2016-10-01 13:55:31 +02:00
Michael Teeuw
19f837aa41 Merge changes. 2016-10-01 13:55:08 +02:00
Michael Teeuw
b267491934 Add IPv6 loopback IP address to default whitelist. 2016-10-01 13:49:41 +02:00
Michael Teeuw
a369dddde8 Merge branch 'yo-less-patch-4' into develop 2016-10-01 11:03:16 +02:00
Michael Teeuw
29d87d7c48 Merge branch 'patch-4' of https://github.com/yo-less/MagicMirror into yo-less-patch-4
# Conflicts:
#	CHANGELOG.md
2016-10-01 11:03:05 +02:00
Michael Teeuw
4847f50093 Merge branch 'kasperwandahl-master' into develop 2016-10-01 10:53:08 +02:00
Michael Teeuw
7c848b1253 Merge changes 2016-10-01 10:52:46 +02:00
Michael Teeuw
607aa46032 Merge branch 'develop' of https://github.com/MichMich/MagicMirror into develop 2016-10-01 10:35:33 +02:00
Michael Teeuw
430193891f Fix Config keys. 2016-10-01 10:35:22 +02:00
fewieden
cbb82ed635 replace system output with MagicMirror splash screen on boot 2016-10-01 00:38:14 +02:00
Michael Teeuw
1dfb72703a Merge pull request #461 from hkapanen/Finnish
Finnish translation
2016-09-30 20:10:31 +02:00
Harri Kapanen
5edf377f4b Finnish translation 2016-09-30 20:44:53 +03:00
Michael Teeuw
43a33d267a Merge pull request #453 from dmcinnes/patch-1
Fix typos in the module dev docs
2016-09-30 09:30:43 +02:00
Doug McInnes
c4048f4c7b fix typos in the module dev docs 2016-09-29 21:40:45 -07:00
Michael Teeuw
501c89ae3a Merge pull request #457 from Jopyth/patch-limited-access
Patch limited access
2016-09-29 17:58:06 +02:00
Joseph Bethge
5899497aa7 log denied access attempts on server 2016-09-29 17:55:32 +02:00
Joseph Bethge
2c758a9981 remove warning message 2016-09-29 17:52:22 +02:00
Joseph Bethge
66eb99e506 transfer usage information to readme 2016-09-29 17:49:54 +02:00
Joseph Bethge
b583140077 fix double quotes and config.js.sample 2016-09-29 17:43:57 +02:00
Joseph Bethge
f378c93dd3 replace ugly error message 2016-09-29 17:07:22 +02:00
Joseph Bethge
5d29fa5e62 ip address filtering 2016-09-29 16:34:57 +02:00
Michael Teeuw
54f04c9141 Fix ESLint issues 2016-09-29 11:12:49 +02:00
Michael Teeuw
fc0c706100 Add MagPi Logo 2016-09-29 11:05:37 +02:00
Kasper Wandahl Fogh
02ac9fa0d7 Added danish in translations.js and updated changelog 2016-09-24 10:57:02 +02:00
Kasper Wandahl Fogh
ca95c75df3 Added danish translation 2016-09-24 10:41:44 +02:00
Michael Teeuw
4ff86795b9 Snyk security update. 2016-09-22 19:56:54 +02:00
Michael Teeuw
30eaec29d3 Modified translations for Frysk. 2016-09-21 10:29:34 +02:00
Michael Teeuw
742d38c9ec Merge pull request #450 from Wilco89/patch-1
Patch 1
2016-09-21 10:28:23 +02:00
Wilco Land
56a4597784 Update fy.json
Added "DAYAFTERTOMORROW"
2016-09-21 09:57:47 +02:00
Michael Teeuw
b2a7d3584b Add getHeader functionlity.. 2016-09-20 17:22:24 +02:00
Michael Teeuw
b8167f89e5 Merge pull request #448 from MichMich/develop
Release 2.0.5
2016-09-20 16:41:12 +02:00
Michael Teeuw
c916472b22 Release 2.0.5 2016-09-20 16:32:45 +02:00
Michael Teeuw
bdfe7c5e69 Merge pull request #447 from valmassoi/develop
Fix default weather forecast module api URL
2016-09-19 15:27:32 +02:00
valmassoi
749475799a Fix default weather forecast module api URL 2016-09-18 10:54:20 -07:00
Michael Teeuw
daf9c807b5 Merge pull request #446 from contra/patch-1
fix typo
2016-09-18 08:42:03 +02:00
contra
5dfecfdee3 fix typo 2016-09-17 17:54:38 -04:00
Michael Teeuw
d267c03ee2 Merge pull request #435 from nhubbard/develop
Add all the linters!
2016-09-13 09:33:06 +02:00
Michael Teeuw
864e3c7a50 Merge pull request #437 from andyipod1437/develop
Able to turn off and on the date display the clock module.
2016-09-11 21:16:07 +02:00
Andrew Chumchal
747e1a818d Able to turn off and on the clock module 2016-09-11 08:14:28 -07:00
Andrew Chumchal
f468dbf427 Update CHANGELOG.md 2016-09-11 08:04:33 -07:00
Nicholas Hubbard
88572e90d4 Add all the linters 2016-09-10 16:41:57 -04:00
Michael Teeuw
41fc7dd73d Merge pull request #434 from nhubbard/develop
Clean Up the Contributing Documentation and Process: An Opera, Reincarnated
2016-09-09 08:56:34 +02:00
Nicholas Hubbard
c87c588c79 Clean Up the Contributing Documentation and Process: Part VII.LXVI.IV
* Fix yet another out-of-the-blue error that Stylelint found.
2016-09-08 16:00:48 -04:00
Nicholas Hubbard
5ab4b57411 Clean Up the Contributing Documentation and Process: Part VII.LXVI.III
* Fix the errors that popped up out of the blue from Stylelint.
2016-09-08 15:57:25 -04:00
Michael Teeuw
3c936c6957 Merge pull request #433 from icewind1991/webcal-auth
add support for http basic auth for calendars
2016-09-08 21:54:53 +02:00
Nicholas Hubbard
0ca903a146 Clean Up the Contributing Documentation and Process: Part VII.LXVI.II
* Fix the indentation in the clock CSS.
2016-09-08 15:51:58 -04:00
Nicholas Hubbard
4e91919990 Clean Up the Contributing Documentation and Process: Part VII.LXVI.I
* Fix the StyleLint config to allow the empty blocks in the clock module CSS.
2016-09-08 15:49:24 -04:00
Nicholas Hubbard
e023a68780 Clean Up the Contributing Documentation and Process: Part VII.LXVI
* Fix the issues in css/main.css.
2016-09-08 15:47:16 -04:00
Nicholas Hubbard
17452cd5b6 Clean Up the Contributing Documentation and Process: Part VII.XXXIII
* Fix the css/custom.css issues.
2016-09-08 15:44:43 -04:00
Nicholas Hubbard
c76f2c8483 Clean Up the Contributing Documentation and Process: Part VII
* Fix the globbing error in the previous commits.
2016-09-08 15:41:12 -04:00
Robin Appelman
90207f9b68 add support for http basic auth for calendars 2016-09-08 21:29:17 +02:00
Nicholas Hubbard
0ec5371b61 Clean Up the Contributing Documentation and Process: Part VII
* Update the changelog to mention my changes.
2016-09-08 15:26:50 -04:00
Nicholas Hubbard
8549aeb466 Clean Up the Contributing Documentation and Process: Part VI
* Alter the pull request template to look a little better.
2016-09-08 15:24:52 -04:00
Nicholas Hubbard
504d3cd131 Clean Up the Contributing Documentation and Process: Part V
* Replace the contribution instructions with the ones from CONTRIBUTING.md.
2016-09-08 15:23:45 -04:00
Nicholas Hubbard
83ed298eba Clean Up the Contributing Documentation and Process: Part IV
* Replace `postcss:lint` with `stylelint`.
* Update the contribution instructions.
2016-09-08 15:22:40 -04:00
Nicholas Hubbard
a90f2cb156 Clean Up the Contributing Documentation and Process: Part III
* Remove PostCSS from Grunt.
* Add StyleLint to Grunt.
2016-09-08 15:17:20 -04:00
Nicholas Hubbard
1a54bafdd5 Clean Up the Contributing Documentation and Process: Part II
* Add `grunt-stylelint` over the complicated PostCSS method previously used.
* Remove PostCSS dependencies.
2016-09-08 15:14:00 -04:00
Nicholas Hubbard
3cc186f7e4 Clean Up the Contributing Documentation and Process: Part I
* Remove the HTML Validator
* Replace JSCS with ESLint
* Replace `npm` commands with equivalent `grunt` commands
2016-09-08 15:10:17 -04:00
Michael Teeuw
a2497d7564 Merge pull request #430 from nhubbard/develop
Close #374
2016-09-07 08:31:06 +02:00
Nicholas Hubbard
c01c882081 Update the Changelog 2016-09-06 19:25:16 -04:00
Nicholas Hubbard
af279df5c9 Closes #374.
ARMv6 is not supported by recent versions of Chrome, and by extent, this means recent versions of Electron as well.
2016-09-06 19:23:52 -04:00
Michael Teeuw
1ea7ce2589 Fix typo. 2016-09-06 10:09:11 +02:00
Michael Teeuw
476c577bc1 Add fixes. 2016-09-06 10:08:12 +02:00
Michael Teeuw
e3b91c4d71 Merge pull request #428 from callumdmay/master
Fix typos in raspberry.sh
2016-09-06 10:06:52 +02:00
Michael Teeuw
1e2d7acf4a Merge pull request #427 from pOakley/patch-1
currentweather module api url bugfix
2016-09-06 10:06:17 +02:00
Callum
1def120616 Fix typos in raspberry.sh 2016-09-05 22:47:49 -04:00
Phil Oakley
25ddf2c651 currentweather module api url bugfix
Running this on Raspberry Pi 2, node version v6.5.0, magicmirror@2.0.0

The current url created has a typo that causes the module to only display default weather units (Kelvin). After checking the website (http://openweathermap.org/current), there is no "/" at this location in the url. Removing it fixes the issue and allows the user to see the specified units in config.js.
2016-09-05 19:06:21 -06:00
Michael Teeuw
e5d384e808 Merge pull request #426 from nhubbard/develop
CII Best Practices
2016-09-05 10:44:03 +02:00
Jens
63351553d8 calendar.js doesn't overcapitalize future events 2016-09-04 14:24:49 +02:00
Jens
4630740ac7 Added 'getRelative' tag 2016-09-04 00:05:02 +02:00
Jens
0ff4884d3a Added 'getRelative' tag 2016-09-03 23:42:24 +02:00
Jens
2dfdedf7b0 Update README.md 2016-09-03 23:40:29 +02:00
Jens
e1fa5fb180 Added 'getRelative' tag 2016-09-03 23:39:32 +02:00
Jens
4e47f9eb68 Added 'getRelative' tag 2016-09-03 23:37:09 +02:00
Jens
c4c8955bc2 Added 'getRelative' tag 2016-09-03 23:36:29 +02:00
Jens
f47b808478 Added calendar.js tweaks (capitalization / 'getRelative' tag) 2016-09-03 23:28:07 +02:00
Jens
493367da5e point of time when calendar event gets relative now customizable 2016-09-03 23:22:51 +02:00
Jens
4ca185cf45 point of time when calendar event gets relative now customizable 2016-09-03 23:22:37 +02:00
Jens
8f4effbb8d poinst of time when calendar event gets relative now customizable 2016-09-03 23:17:46 +02:00
Nicholas Hubbard
a4ba7f277e Add Change to Changelog 2016-09-02 22:00:37 -04:00
Nicholas Hubbard
c3f97a0cf1 Add CII Badge, Remove Node Version 2016-09-02 21:58:22 -04:00
Jens
c1b8fc1233 calendar dates are uniformly capitalized
This is an attempt at standardizing the calendar layout. Currently the calendar times are only partly capitalized, some time phrases start with lower-case letters, some don't (The ones pulled from the TRANSLATIONS folder start with upper-case letters, the others don't). Behavior has been changed to create a more standardized layout.
2016-09-03 00:39:46 +02:00
Michael Teeuw
a481638c03 Add dutch translation 2016-09-01 09:42:33 +02:00
Michael Teeuw
c12dfc7b4d Merge branch 'yo-less-patch-2' into develop 2016-09-01 09:39:34 +02:00
Michael Teeuw
34bc527709 Merge branch 'patch-2' of https://github.com/yo-less/MagicMirror into yo-less-patch-2 2016-09-01 09:38:06 +02:00
yo-less
ee134d0d7c Merge branch 'patch-2' of https://github.com/yo-less/MagicMirror into patch-2 2016-08-31 22:50:09 +02:00
yo-less
f795ee7fd9 Added "day after tomorrow" changes to calendar.js 2016-08-31 22:49:31 +02:00
yo-less
1bba75881f Added 'day after tomorrow'changes to calendar.js 2016-08-31 22:46:54 +02:00
yo-less
34db2d9efa commit changes 2016-08-31 22:45:12 +02:00
yo-less
91dd308952 Added 'day after tomorrow' changes to calendar.js 2016-08-31 22:43:27 +02:00
Jens
3d97e26cde Delete CHANGELOG.md 2016-08-31 22:40:50 +02:00
Jens
104c1ecbec Added "day after tomorrow" changes to calendar.js 2016-08-31 22:18:30 +02:00
Jens
88266ec4e3 Added "day after tomorrow" changes to calendar.js 2016-08-31 22:17:43 +02:00
Jens
f5be159187 Added "DAYAFTERTOMORROW" tag if available 2016-08-31 22:11:31 +02:00
Jens
1194d86460 Merge pull request #1 from yo-less/patch-1
Added "DAYAFTERTOMORROW" tag if config language is German
2016-08-31 14:49:44 +02:00
Jens
76d6dca63f Added "Übermorgen" to show in calendar.js 2016-08-31 14:41:49 +02:00
Jens
1b69e62e2e Added "DAYAFTERTOMORROW" tag if config language is German 2016-08-31 14:39:37 +02:00
Michael Teeuw
e89839359f Merge pull request #422 from Platimir/patch-1
Update README.md
2016-08-30 16:08:01 +02:00
Platimir
177d113cd9 Update README.md 2016-08-30 15:57:52 +02:00
Andrew McOlash
853fa87012 Slight change to padding of humidity icon, just too much before 2016-08-28 01:58:56 -05:00
Andrew McOlash
a592ca25ff Add in icon for the current humidity 2016-08-28 01:52:08 -05:00
Michael Teeuw
a8c9926fa7 Merge pull request #420 from yo-less/patch-1
Updated README.md
2016-08-27 20:58:21 +02:00
Jens
bf5587fe09 Updated README.md
Fixed minor typo
2016-08-27 20:35:00 +02:00
Michael Teeuw
7c8a27e894 Merge pull request #419 from yo-less/patch-1
Updated README.md
2016-08-27 13:55:28 +02:00
Jens
d248b11ffc Updated README.md
Fixed inconsistencies in tag removal instructions.
2016-08-27 13:48:33 +02:00
Michael Teeuw
1282e010ee Merge pull request #417 from yo-less/patch-1
Updated README.md
2016-08-27 13:29:06 +02:00
Michael Teeuw
d5d1ca948e Merge pull request #418 from yo-less/patch-2
Updated CHANGELOG.md
2016-08-27 13:28:55 +02:00
Jens
a08704e8ed Updated CHANGELOG.md
Added tag removal description for newsfeed items
2016-08-27 13:12:08 +02:00
Jens
2a8c0c0c08 Updated README.md
Fixed inconsistencies in tag removal instructions.
2016-08-27 12:59:00 +02:00
Michael Teeuw
2ae0c98b4c Merge pull request #416 from yo-less/master
Tags at the beginning and/or end of newsfeed items
2016-08-27 12:00:28 +02:00
yo-less
c427050a92 Allow for the removal of feed tags
Added options: both, description, title
2016-08-27 01:16:31 +02:00
yo-less
43a0829f44 Allow for the removal of feed tags
legibility update
2016-08-27 00:37:19 +02:00
yo-less
e9b8b91861 Allow for removal of feed tags
Updated README.md for legibility
2016-08-27 00:35:27 +02:00
yo-less
6f104f5056 Allow for the removal of feed tags
User-specified feed tags in description and title can be removed
2016-08-27 00:32:47 +02:00
yo-less
e720efabdc Updated readme.md / Included more tag 2016-08-26 22:08:23 +02:00
yo-less
45cb770e41 Added option to remove "more" tags in description
Many feed descriptions end with with a link tag to the actual article
online (see http://www.deutschlandfunk.de/die-nachrichten.353.de.rss,
for example). The mirror news description looks strange with this tag in
the end.

I have added an option to remove the tag from the description and
updated the readme.md accordingly.
2016-08-26 22:06:03 +02:00
Michael Teeuw
3f1cc66767 Merge pull request #414 from MichMich/master
Fix typo in NL.json
2016-08-24 09:39:09 +02:00
Michael Teeuw
d1f5118bb5 Merge pull request #413 from mrvanes/patch-1
Update nl.json
2016-08-24 09:35:38 +02:00
Martin
b90f1f786e Update nl.json
Corrected typo
2016-08-24 08:51:49 +02:00
Andrew McOlash
c6f424201b Fix indentation and spacing 2016-08-18 09:32:19 -05:00
Andrew McOlash
a7db8cf7cd Humidity data to the current weather module 2016-08-17 21:51:48 -05:00
Michael Teeuw
e2ed0f5e55 Cleanup 2016-08-09 10:33:34 +02:00
Michael Teeuw
d000e3c8a9 Force fullscreen when kioskmode is active 2016-08-09 10:22:29 +02:00
Michael Teeuw
cf465a1184 Merge pull request #394 from MichMich/develop
Release 2.0.4
2016-08-07 16:03:22 +02:00
Michael Teeuw
f3119824f4 Release 2.0.4 2016-08-07 15:58:07 +02:00
Michael Teeuw
ef069c1689 Updated: More detailed error message. 2016-08-05 20:03:18 +02:00
Michael Teeuw
68e5a9dfda Merge pull request #391 from ssenge/master
More detailed error message in case config file couldn't be loaded.
2016-08-05 19:53:13 +02:00
sese
fd1a31afb6 More precise error messages in case configuration couldn't be loaded. 2016-08-05 19:18:31 +02:00
Michael Teeuw
6d7d4a15d9 Cleanup. 2016-08-03 20:58:49 +02:00
Michael Teeuw
518a7d0dcc Merge pull request #389 from RedNax67/develop
Updated weathericons to latest version and fixed weatherforecast.js w…
2016-08-03 20:57:33 +02:00
xander
a4bdfe6b7d Updated CHANGELOG.md 2016-08-03 20:37:30 +02:00
xander
281269aa0d Updated weathericons to latest version and fixed weatherforecast.js which got broken because of it. 2016-08-03 11:43:28 +02:00
Michael Teeuw
33521ebd31 Fix #388 2016-08-02 22:58:27 +02:00
Michael Teeuw
18ae08de8f Possible fix for #388 2016-08-02 20:14:24 +00:00
Michael Teeuw
3d3c4ba02f Prevent currentweather module from crashing. 2016-07-31 17:13:49 +02:00
Michael Teeuw
89917c1582 Updated package.json to fix vulnerabilities. 2016-07-30 16:09:42 +02:00
Michael Teeuw
90c6758562 Upgrade vulnerabilities. 2016-07-30 16:06:48 +02:00
Michael Teeuw
5be8084473 Fix formatting. 2016-07-30 15:58:51 +02:00
Michael Teeuw
8a066a4ec0 Merge pull request #387 from alexyak/develop
Added dev parameter
2016-07-30 15:57:39 +02:00
Alex Yakhnin
b98237fa44 Added dev parameter 2016-07-30 09:42:31 -04:00
Michael Teeuw
c4f9388668 Fix openweathermap url 2016-07-28 17:53:48 +02:00
Michael Teeuw
0f44b27e54 Add kioskmode to changelog 2016-07-27 12:52:36 +02:00
Michael Teeuw
10d05e1870 Merge branch 'develop' of https://github.com/MichMich/MagicMirror into develop 2016-07-27 12:51:18 +02:00
Michael Teeuw
921557161d Add option to enable kios mode 2016-07-27 12:50:59 +02:00
Michael Teeuw
eb092b9f20 Merge pull request #381 from diego-vieira/develop
Brazilian Portuguese Translation
2016-07-26 12:33:25 +02:00
Diego Vieira
28ca8a9f9f added Greek translation back 2016-07-26 07:31:31 -03:00
Diego Vieira
d7be56df7a Update CHANGELOG.md 2016-07-25 16:12:28 -03:00
Diego Vieira
ce2c163f4b brazilian portuguese translation 2016-07-25 16:11:01 -03:00
Michael Teeuw
5272462368 Add header 2016-07-23 17:43:37 +02:00
Michael Teeuw
42354a6728 Merge pull request #380 from kapsolas/develop
Greek Translation
2016-07-23 17:41:26 +02:00
Dimitrios Kapsalis
754fe3df91 Greek Translation 2016-07-23 10:35:14 -05:00
Dimitrios Kapsalis
a7a0350c1a Update CHANGELOG.md 2016-07-21 13:45:14 -05:00
Dimitrios Kapsalis
a8b2ca7cfe Added Greek translation 2016-07-21 13:42:48 -05:00
Michael Teeuw
e82867820b Merge pull request #378 from KirAsh4/upstream-dev
Ability ot turn off date view on analog clock & small grammer error f…
2016-07-20 22:05:26 +02:00
Ashley M. Kirchner
13305d111e Ability ot turn off date view on analog clock & small grammer error fix in module.js 2016-07-20 13:31:46 -06:00
Michael Teeuw
ae37fa2bc5 Append slash to endpoint. (Fix issue #337) 2016-07-20 18:51:34 +02:00
Michael Teeuw
c81db752f6 Prevent getModules() selectors from returning duplicate entries. 2016-07-14 11:48:37 +02:00
Michael Teeuw
5d9d71dee8 Merge pull request #373 from MichMich/develop
Release of 2.0.3.
2016-07-12 15:55:34 +02:00
Michael Teeuw
1f558d46a4 Add version number for 2.0.3 release. 2016-07-12 15:42:10 +02:00
Michael Teeuw
36eb899c3b Merge pull request #372 from KirAsh4/upstream-dev
Analog clock addition
2016-07-10 13:39:19 +02:00
Ashley M. Kirchner
e223d752cb Fixed README typo
(cherry picked from commit 368dc5d9b87da7ebdbc80f2fe7fcfc6a86e04b71)
2016-07-09 19:40:54 -06:00
Ashley M. Kirchner
fcb503e885 Switched to SVG graphics for scalability
(cherry picked from commit 15f0956b60ec0d16302875bd53dcc037581ad96b)
2016-07-09 19:37:00 -06:00
Ashley M. Kirchner
c1055234d8 Switched to SVG graphics for scalability
(cherry picked from commit 6cb43cac824d57e0ebafc3b00bb15104ff78d4be)
2016-07-09 19:36:52 -06:00
Ashley M. Kirchner
35ec98cf13 Analog clock addition
(cherry picked from commit 5032967343aec2d1a1d66f2ed26dce8b84d8cf37)
2016-07-09 19:36:44 -06:00
Ashley M. Kirchner
66a9138666 Analog clock addition
(cherry picked from commit 6af2ce07a17c6456c3a328133db48c2201345f6d)
2016-07-09 19:36:36 -06:00
Ashley M. Kirchner
279582ff21 Analog clock addition
(cherry picked from commit 9c7da4c24ee50b51e1e3ab513f73caadf3985e84)
2016-07-09 19:36:28 -06:00
Ashley M. Kirchner
a9540ffabe Analog clock addition
(cherry picked from commit 7bae93fdb2744b0deab84882506a333ff809b3a3)
2016-07-09 19:36:20 -06:00
Ashley M. Kirchner
8f02cb83ed Analog clock addition
(cherry picked from commit e7e7c6494d2cbf739069f8d77278b9241ae6aeec)
2016-07-09 19:36:13 -06:00
Ashley M. Kirchner
5e94c8be7b Analog clock addition
(cherry picked from commit f01b6325ed1784f1bebc3fc755da01e6fda60070)
2016-07-09 19:36:02 -06:00
Michael Teeuw
ea6e9af5da Change Requirements. 2016-07-09 17:22:06 +02:00
Michael Teeuw
1bb72262ba Merge pull request #366 from KirAsh4/upstream-dev
Removed 'null' setting
2016-07-01 19:58:43 +02:00
Ashley M. Kirchner
61ace7bd97 CHANGELOG update 2016-07-01 11:57:24 -06:00
Ashley M. Kirchner
1a417cc36f CHANGELOG update 2016-07-01 11:51:42 -06:00
Ashley M. Kirchner
00a11f4343 Removed 'null' setting 2016-07-01 11:33:32 -06:00
Michael Teeuw
491bbacddd Merge pull request #365 from gzot/develop
Fix issue #300
2016-06-27 18:46:33 +02:00
GzoT
1b9daa0adb Fix #300 2016-06-27 16:34:51 +00:00
GzoT
ccdc981756 small fix 2016-06-27 16:15:53 +00:00
GzoT
b44dcc9f30 Not display title and/or message if they are not provided (alert module) 2016-06-24 09:15:12 +00:00
Michael Teeuw
479ceb14e4 Merge pull request #361 from matt08/patch-2
Added polish translation
2016-06-09 20:40:50 +02:00
matt08
50e41d1999 Update CHANGELOG.md 2016-06-09 13:57:46 +02:00
matt08
f6e2073de0 Added polish translation 2016-06-09 13:56:41 +02:00
matt08
271aab9746 Polish translation 2016-06-09 13:53:55 +02:00
Michael Teeuw
8d9bf5cf17 Update CHANGELOG.md 2016-06-07 16:46:32 +02:00
Michael Teeuw
ceb7ed093e Merge pull request #359 from simonsmh/patch-1
Simplified Chinese, Traditional Chinese, Japanese
2016-06-07 16:44:15 +02:00
Simon Shi
abdbcbb741 Update ja.json
@aidasan
2016-06-07 22:24:58 +08:00
Simon Shi
51ac07cd34 Update translations.js
@aidasan
2016-06-07 22:23:17 +08:00
Simon Shi
4b29698c6c Create ja.json 2016-06-07 22:22:22 +08:00
Simon Shi
f93285846a Update translations.js 2016-06-07 21:51:35 +08:00
Simon Shi
44347db52e Rename zh_cn.js to zh_cn.json 2016-06-07 21:50:21 +08:00
Simon Shi
f2749ff17f Create zh_tw.json 2016-06-07 21:50:18 +08:00
Simon Shi
3735342dfa Create zh_cn.js 2016-06-07 21:44:34 +08:00
Michael Teeuw
fed6e1e82f Update CHANGELOG.md 2016-06-06 12:09:17 +02:00
Michael Teeuw
58a59b624a Merge pull request #356 from MichMich/master
Update default titleReplace.
2016-06-06 12:08:02 +02:00
Michael Teeuw
1338918a89 Update default titleReplace. 2016-06-06 12:05:41 +02:00
Michael Teeuw
831e7cdb3f Update CHANGELOG.md 2016-06-06 11:35:31 +02:00
Michael Teeuw
2b8583e652 Merge pull request #355 from Sonaryr/add-max-newsitems-parameter
Add max newsitems parameter to the newsfeed module
2016-06-06 11:34:07 +02:00
Maarten Schroeven
b0220e4200 Update README to explain new parameter 2016-06-06 00:18:01 +02:00
Maarten Schroeven
0d94ef10ce add maxNewsItems config
Added extra config parameter to limit the amount of news items this module cycles through.
2016-06-06 00:16:49 +02:00
Michael Teeuw
544a1381fc Merge pull request #353 from MichMich/develop
Update to 2.0.2
2016-06-05 12:06:27 +02:00
Michael Teeuw
bc17ef896e Update CHANGELOG.md 2016-06-05 12:03:00 +02:00
Michael Teeuw
0bcbf999fb Update CHANGELOG.md 2016-06-05 09:25:36 +02:00
Michael Teeuw
0c4c44f4b6 Merge pull request #352 from KirAsh4/develop
Added proper User-Agent string to Facebook calendar call, and various…
2016-06-05 09:24:47 +02:00
Ashley M. Kirchner
486956b762 Added proper User-Agent string to Facebook calendar call, and various fixed spelling of 'exist'. 2016-06-04 20:32:55 -06:00
Michael Teeuw
8d1ef5291f Add Fix info and. 2016-06-04 21:42:05 +02:00
Michael Teeuw
611627ca97 Fix NE translations for all languages. 2016-06-04 21:36:03 +02:00
Michael Teeuw
732225b781 Merge pull request #345 from OskarKlintrot/patch-1
Adding reference to the Italian language file
2016-06-04 20:18:48 +02:00
Oskar Klintrot
58f88075c8 Adding reference to the Italian language file 2016-05-29 13:15:04 +02:00
Michael Teeuw
e17ef5eccf Merge pull request #343 from OskarKlintrot/develop
Added Swedish translation
2016-05-28 07:58:40 +02:00
OskarKlintrot
70c697f094 Added Swedish translation 2016-05-27 19:04:53 +02:00
Michael Teeuw
4b5625e0b4 Update CHANGELOG.md 2016-05-26 12:03:29 +02:00
Michael Teeuw
7df48870df Merge pull request #341 from mochman/weather-update
Weather update
2016-05-26 12:01:55 +02:00
mochman
4a309c49e5 Updated README.md 2016-05-25 15:47:22 -05:00
mochman
b45899bf90 Updated weather to get a locationID 2016-05-25 15:23:29 -05:00
Michael Teeuw
5ae3c8acfe Merge pull request #337 from EdgardosReis/develop
Portuguese translation
2016-05-21 16:41:38 +02:00
EdgardosReis
ef5df5f01b Update CHANGELOG.md 2016-05-21 15:37:00 +01:00
EdgardosReis
9af7451a61 Update translations.js
portuguese translation
2016-05-21 15:33:47 +01:00
EdgardosReis
7048c550b7 Create pt.json
portuguese translation
2016-05-21 15:33:04 +01:00
Michael Teeuw
f035627f42 Update CHANGELOG.md 2016-05-20 12:32:14 +02:00
Michael Teeuw
7659ff1f77 Merge pull request #335 from RemiHansen/master
Norwegian translations
2016-05-20 12:31:52 +02:00
RemiHansen
3df4062a55 Norwegian translation (nb and nn) 2016-05-20 01:22:45 +02:00
RemiHansen
02bbbe668b Changelog updated 2016-05-19 23:37:32 +02:00
RemiHansen
2b82c8fdc9 Norwegian translation for MM2 2016-05-19 23:26:56 +02:00
Michael Teeuw
93abaed0c2 Merge pull request #333 from MichMich/develop
v2.0.1
2016-05-18 11:04:31 +02:00
Michael Teeuw
b7fff6d452 Update CHANGELOG.md 2016-05-18 11:03:19 +02:00
Michael Teeuw
d09f01db90 Update PULL_REQUEST_TEMPLATE.md 2016-05-13 22:06:07 +02:00
Michael Teeuw
e0c1a58b84 Italian Translation 2016-05-13 22:01:51 +02:00
Michael Teeuw
1b82649cca Merge pull request #326 from MichMich/master
Italian translation.
2016-05-13 22:00:28 +02:00
Michael Teeuw
9317e2a36b Merge pull request #325 from iosonopersia/master
Italian translation
2016-05-13 21:54:48 +02:00
iosonopersia
51aff8ccdc Italian translation 2016-05-13 20:45:55 +02:00
iosonopersia
bdd3ea45af Added italian language 2016-05-13 20:42:56 +02:00
Michael Teeuw
3eb5c77ac4 Merge pull request #323 from MichMich/master
Remove BETA warning.
2016-05-13 10:21:19 +02:00
Michael Teeuw
ccc85784c6 Remove BETA warning. 2016-05-13 10:20:37 +02:00
Michael Teeuw
46806e8607 Merge pull request #322 from MichMich/master
Update PULL_REQUEST_TEMPLATE.md
2016-05-13 09:13:15 +02:00
Michael Teeuw
95f914d6bd Update PULL_REQUEST_TEMPLATE.md 2016-05-13 09:12:26 +02:00
Michael Teeuw
0f86011106 Create CHANGELOG.md 2016-05-13 09:10:54 +02:00
Michael Teeuw
acdd3c0602 Merge pull request #321 from jordi2830/patch-1
Fetch the latest Node.js without any 3rd party interferences
2016-05-13 07:35:04 +02:00
Jordi De Poortere
05b7237add Fixing various typo's in the installer 2016-05-13 00:02:36 +02:00
Jordi De Poortere
51f4e9e160 Get the latest Node.js
This will get the latest Node.js from the selected branch.
I do recommend only using a stable and tested version as newer ones might break MM.
Branch can be changed by simply editing the NODE_STABLE_BRANCH variable.

By using this setup script, Node.js will be downloaded from the official repository provided by NodeSource.
2016-05-12 23:39:11 +02:00
Michael Teeuw
7bbac35d6b Merge pull request #317 from MichMich/master
Fix installer URL.
2016-05-12 14:47:53 +02:00
Michael Teeuw
d280fe457c Fix installer URL. 2016-05-12 14:47:36 +02:00
Michael Teeuw
b5772af4c3 Merge pull request #316 from MichMich/master
Merge master changes.
2016-05-12 13:31:35 +02:00
Michael Teeuw
7ab79bb76e Update PULL_REQUEST_TEMPLATE.md 2016-05-12 13:30:41 +02:00
Michael Teeuw
00e3cc26de Update ISSUE_TEMPLATE.md 2016-05-12 13:29:59 +02:00
Michael Teeuw
4b491c43ff Update CONTRIBUTING.md 2016-05-12 13:29:36 +02:00
Michael Teeuw
41233a933e Merge pull request #315 from MichMich/master
v2-beta references.
2016-05-12 13:04:45 +02:00
108 changed files with 11675 additions and 1170 deletions

View File

@@ -1,6 +1,5 @@
vendor/
!/vendor/vendor.js
/modules/**
!/modules/default/**
!/modules/node_helper
!/modules/node_helper/**

View File

@@ -4,11 +4,13 @@
"quotes": ["error", "double"],
"max-len": ["error", 250],
"curly": "error",
"camelcase": ["error", {"properties": "never"}]
"camelcase": ["error", {"properties": "never"}],
"no-trailing-spaces": ["error"],
"no-irregular-whitespace": ["error"]
},
"env": {
"browser": true,
"node": true,
"es6": true
}
}
}

View File

@@ -3,31 +3,47 @@ Contribution Policy for MagicMirror²
Thanks for contributing to MagicMirror²!
We hold our code to standard, and these standards are documented below.
We hold our code to standard, and these standards are documented below.
First, before you run the linters, you will need to install them all **and** install the development dependencies:
If you wish to run both linters, use `grunt` without any arguments.
```bash
(sudo) npm install -g jscs stylelint html-validator-cli
npm install
```
### JavaScript: Run ESLint
### JavaScript: Run JSCS
We use [ESLint](http://eslint.org) on our JavaScript files.
We use [JSCS](http://jscs.info) on our JavaScript files.
Our ESLint configuration is in our .eslintrc.json and .eslintignore files.
Our JSCS configuration is in our .jscsrc file.
To run JSCS, use `npm run jscs`.
To run ESLint, use `grunt eslint`.
### CSS: Run StyleLint
We use [StyleLint](http://stylelint.io) to lint our CSS. Our configuration is in our .stylelintrc file.
To run StyleLint, use `npm run stylelint`.
To run StyleLint, use `grunt stylelint`.
### HTML: Run HTML Validator
### Submitting Issues
We use [NU Validator](https://validator.w3.org/nu) to validate our HTML. The configuration is in the command in the package.json file.
Please only submit reproducible issues.
To run HTML Validator, use `npm run htmlvalidator`.
If you're not sure if it's a real bug or if it's just you, please open a topic on the forum: [https://forum.magicmirror.builders/category/15/bug-hunt](https://forum.magicmirror.builders/category/15/bug-hunt)
Problems installing or configuring your MagicMirror? Check out: [https://forum.magicmirror.builders/category/10/troubleshooting](https://forum.magicmirror.builders/category/10/troubleshooting)
When submitting a new issue, please supply the following information:
**Platform**: Place your platform here... give us your web browser/Electron version *and* your hardware (Raspberry Pi 2/3, Windows, Mac, Linux, System V UNIX).
**Node Version**: Make sure it's version 0.12.13 or later.
**MagicMirror Version**: Now that the versions have split, tell us if you are using the PHP version (v1) or the newer JavaScript version (v2).
**Description**: Provide a detailed description about the issue and include specific details to help us understand the problem. Adding screenshots will help describing the problem.
**Steps to Reproduce**: List the step by step process to reproduce the issue.
**Expected Results**: Describe what you expected to see.
**Actual Results**: Describe what you actually saw.
**Configuration**: What does the used config.js file look like? Don't forget to remove any sensitive information!
**Additional Notes**: Provide any other relevant notes not previously mentioned. This is optional.

View File

@@ -1,2 +1,24 @@
* **Platform** [ Raspberry Pi 2/3, Windows, Mac OS X, Linux]:
* **Node Version** [ 0.12.13 or later ]:
Please only submit reproducible issues.
If you're not sure if it's a real bug or if it's just you, please open a topic on the forum: [https://forum.magicmirror.builders/category/15/bug-hunt](https://forum.magicmirror.builders/category/15/bug-hunt)
Problems installing or configuring your MagicMirror? Check out: [https://forum.magicmirror.builders/category/10/troubleshooting](https://forum.magicmirror.builders/category/10/troubleshooting)
When submitting a new issue, please supply the following information:
**Platform**: Place your platform here... give us your web browser/Electron version *and* your hardware (Raspberry Pi 2/3, Windows, Mac, Linux, System V UNIX).
**Node Version**: Make sure it's version 0.12.13 or later.
**MagicMirror Version**: Now that the versions have split, tell us if you are using the PHP version (v1) or the newer JavaScript version (v2).
**Description**: Provide a detailed description about the issue and include specific details to help us understand the problem. Adding screenshots will help describing the problem.
**Steps to Reproduce**: List the step by step process to reproduce the issue.
**Expected Results**: Describe what you expected to see.
**Actual Results**: Describe what you actually saw.
**Configuration**: What does the used config.js file look like? Don't forget to remove any sensitive information!
**Additional Notes**: Provide any other relevant notes not previously mentioned. This is optional.

View File

@@ -1,5 +1,7 @@
* Does the pull request solve a **related** issue? [yes | no]
> Please send your pull requests the develop branch.
> Don't forget to add the change to CHANGELOG.md.
* Does the pull request solve a **related** issue?
* If so, can you reference the issue?
* What does the pull request accomplish? (please list)
* What does the pull request accomplish? Use a list if needed.
* If it includes major visual changes please add screenshots.

15
.snyk
View File

@@ -1 +1,14 @@
version: v1
version: v1.5.2
ignore: {}
patch:
'npm:minimatch:20160620':
- snyk > recursive-readdir > minimatch:
patched: '2016-07-30T14:02:31.280Z'
'npm:negotiator:20160616':
- socket.io > engine.io > accepts > negotiator:
patched: '2016-07-30T14:02:31.280Z'
'npm:ws:20160624':
- socket.io > engine.io > ws:
patched: '2016-07-30T14:02:31.280Z'
- socket.io > socket.io-client > engine.io-client > ws:
patched: '2016-07-30T14:02:31.280Z'

View File

@@ -1,4 +1,5 @@
{
"extends": "stylelint-config-standard",
"font-family-name-quotes": "double-where-recommended"
}
"font-family-name-quotes": "double-where-recommended",
"block-no-empty": false
}

View File

@@ -2,8 +2,6 @@ language: node_js
node_js:
- "6"
- "5.1"
- "4"
- "0.12"
before_script:
- npm install grunt-cli -g
script: grunt
script: grunt

145
CHANGELOG.md Normal file
View File

@@ -0,0 +1,145 @@
# MagicMirror² Change Log
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
## [2.1.0] - 2016-12-31
**Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install`
### Added
- Finnish translation.
- Danish translation.
- Turkish translation.
- Option to limit access to certain IP addresses based on the value of `ipWhitelist` in the `config.js`, default is access from localhost only (Issue [#456](https://github.com/MichMich/MagicMirror/issues/456)).
- Added ability to change the point of time when calendar events get relative.
- Add Splash screen on boot.
- Add option to show humidity in currentWeather module.
- Add VSCode IntelliSense support.
- Module API: Add Visibility locking to module system. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules#visibility-locking) for more information.
- Module API: Method to overwrite the module's header. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules#getheader) for more information.
- Module API: Option to define the minimum MagicMirror version to run a module. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules#requiresversion) for more information.
- Calendar module now broadcasts the event list to all other modules using the notification system. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules/default/calendar) for more information.
- Possibility to use the the calendar feed as the source for the weather (currentweather & weatherforecast) location data. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules/default/weatherforecast) for more information.
- Added option to show rain amount in the weatherforecast default module
- Add module `updatenotification` to get an update whenever a new version is availabe. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules/default/updatenotification) for more information.
- Add the abilty to set timezone on the date display in the Clock Module
- Ability to set date format in calendar module
- Possibility to use currentweather for the compliments
- Added option `disabled` for modules.
- Added option `address` to set bind address.
- Added option `onlyTemp` for currentweather module to show show only current temperature and weather icon.
- Added option `remoteFile` to compliments module to load compliment array from filesystem.
- Added option `zoom` to scale the whole mirror display with a given factor.
- Added option `roundTemp` for currentweather and weatherforecast modules to display temperatures rounded to nearest integer.
- Added abilty set the classes option to compliments module for style and text size of compliments.
- Added ability to configure electronOptions
- Calendar module: option to hide private events
- Add root_path for global vars
### Updated
- Modified translations for Frysk.
- Modified core English translations.
- Updated package.json as a result of Snyk security update.
- Improve object instantiation to prevent reference errors.
- Improve logger. `Log.log()` now accepts multiple arguments.
- Remove extensive logging in newsfeed node helper.
- Calendar times are now uniformly capitalized.
- Modules are now secure, and Helmet is now used to prevent abuse of the Mirror's API.
### Fixed
- Solve an issue where module margins would appear when the first module of a section was hidden.
- Solved visual display errors on chrome, if all modules in one of the right sections are hidden.
- Global and Module default config values are no longer modified when setting config values.
- Hide a region if all modules in a region are hidden. Prevention unwanted margins.
- Replaced `electron-prebuilt` package with `electron` in order to fix issues that would happen after 2017.
- Documentation of alert module
## [2.0.5] - 2016-09-20
### Added
- Added ability to remove tags from the beginning or end of newsfeed items in 'newsfeed.js'.
- Added ability to define "the day after tomorrow" for calendar events (Definition for German and Dutch already included).
- Added CII Badge (we are compliant with the CII Best Practices)
- Add support for doing http basic auth when loading calendars
- Add the abilty to turn off and on the date display in the Clock Module
### Fixed
- Fix typo in installer.
- Add message to unsupported Pi error to mention that Pi Zeros must use server only mode, as ARMv6 is unsupported. Closes #374.
- Fix API url for weather API.
### Updated
- Force fullscreen when kioskmode is active.
- Update the .github templates and information with more modern information.
- Update the Gruntfile with a more functional StyleLint implementation.
## [2.0.4] - 2016-08-07
### Added
- Brazilian Portuguese Translation.
- Option to enable Kiosk mode.
- Added ability to start the app with Dev Tools.
- Added ability to turn off the date display in `clock.js` when in analog mode.
- Greek Translation
### Fixed
- Prevent `getModules()` selectors from returning duplicate entries.
- Append endpoints of weather modules with `/` to retreive the correct data. (Issue [#337](https://github.com/MichMich/MagicMirror/issues/337))
- Corrected grammer in `module.js` from 'suspend' to 'suspended'.
- Fixed openweathermap.org URL in config sample.
- Prevent currentweather module from crashing when received data object is incorrect.
- Fix issue where translation loading prevented the UI start-up when the language was set to 'en'. (Issue [#388](https://github.com/MichMich/MagicMirror/issues/388))
### Updated
- Updated package.json to fix possible vulnerabilities. (Using Snyk)
- Updated weathericons
- Updated default weatherforecast to work with the new icons.
- More detailed error message in case config file couldn't be loaded.
## [2.0.3] - 2016-07-12
### Added
- Add max newsitems parameter to the newsfeed module.
- Translations for Simplified Chinese, Traditional Chinese and Japanese.
- Polish Translation
- Add an analog clock in addition to the digital one.
### Fixed
- Edit Alert Module to display title & message if they are provided in the notification (Issue [#300](https://github.com/MichMich/MagicMirror/issues/300))
- Removed 'null' reference from updateModuleContent(). This fixes recent Edge and Internet Explorer browser displays (Issue [#319](https://github.com/MichMich/MagicMirror/issues/319))
### Changed
- Added default string to calendar titleReplace.
## [2.0.2] - 2016-06-05
### Added
- Norwegian Translations (nb and nn)
- Portuguese Translation
- Swedish Translation
### Fixed
- Added reference to Italian Translation.
- Added the missing NE translation to all languages. [#334](https://github.com/MichMich/MagicMirror/issues/344)
- Added proper User-Agent string to calendar call.
### Changed
- Add option to use locationID in weather modules.
## [2.0.1] - 2016-05-18
### Added
- Changelog
- Italian Translation
### Changed
- Improve the installer by fetching the latest Node.js without any 3rd party interferences.
## [2.0.0] - 2016-05-03
### Initial release of MagicMirror²
It includes (but is not limited to) the following features:
- Modular system allowing 3rd party plugins.
- An Node/Electron based application taking away the need for external servers or browsers.
- A complete development API documentation.
- Small cute fairies that kiss you while you sleep.
## [1.0.0] - 2014-02-16
### Initial release of MagicMirror.
This was part of the blogpost: [http://michaelteeuw.nl/post/83916869600/magic-mirror-part-vi-production-of-the](http://michaelteeuw.nl/post/83916869600/magic-mirror-part-vi-production-of-the)

View File

@@ -6,23 +6,64 @@ module.exports = function(grunt) {
options: {
configFile: ".eslintrc.json"
},
target: ["js/*.js", "modules/default/*.js", "serveronly/*.js", "*.js"]
target: ["js/*.js", "modules/default/*.js", "modules/default/*/*.js",
"serveronly/*.js", "*.js", "!modules/default/alert/notificationFx.js",
"!modules/default/alert/modernizr.custom.js", "!modules/default/alert/classie.js"
]
},
postcss: {
lint: {
stylelint: {
simple: {
options: {
processors: [
require("stylelint")({"extends": "stylelint-config-standard", "font-family-name-quotes": "double-where-recommended"}),
require("postcss-reporter")({ clearMessages: true })
]
configFile: ".stylelintrc"
},
dist: {
src: "**/**/**/**/**/**/**/**.css"
src: ["css/main.css", "modules/default/calendar/calendar.css", "modules/default/clock/clock_styles.css", "modules/default/currentweather/currentweather.css", "modules/default/weatherforcast/weatherforcast.css"]
}
},
jsonlint: {
main: {
src: ["package.json", ".eslintrc.json", ".stylelint"],
options: {
reporter: "jshint"
}
}
},
markdownlint: {
all: {
options: {
config: {
"default": true,
"line-length": false,
"blanks-around-headers": false,
"no-duplicate-header": false,
"no-inline-html": false,
"MD010": false,
"MD001": false,
"MD031": false,
"MD040": false,
"MD002": false,
"MD029": false,
"MD041": false,
"MD032": false,
"MD036": false,
"MD037": false,
"MD009": false,
"MD018": false,
"MD012": false,
"MD026": false,
"MD038": false
}
},
src: ["README.md", "CHANGELOG.md", "LICENSE.md", "modules/README.md", "modules/default/**/*.md", "!modules/default/calendar/vendor/ical.js/readme.md"]
}
},
yamllint: {
all: [".travis.yml"]
}
});
grunt.loadNpmTasks("grunt-eslint");
grunt.loadNpmTasks("grunt-postcss");
grunt.registerTask("default", ["eslint", "postcss:lint"]);
};
grunt.loadNpmTasks("grunt-stylelint");
grunt.loadNpmTasks("grunt-jsonlint");
grunt.loadNpmTasks("grunt-yamllint");
grunt.loadNpmTasks("grunt-markdownlint");
grunt.registerTask("default", ["eslint", "stylelint", "jsonlint", "markdownlint", "yamllint"]);
};

View File

@@ -3,18 +3,16 @@
<p align="center">
<a href="https://david-dm.org/MichMich/MagicMirror"><img src="https://david-dm.org/MichMich/MagicMirror.svg" alt="Dependency Status"></a>
<a href="https://david-dm.org/MichMich/MagicMirror#info=devDependencies"><img src="https://david-dm.org/MichMich/MagicMirror/dev-status.svg" alt="devDependency Status"></a>
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-v5.10.1-brightgreen.svg" alt="Node Version"></a>
<a href="https://bestpractices.coreinfrastructure.org/projects/347"><img src="https://bestpractices.coreinfrastructure.org/projects/347/badge"></a>
<a href="http://choosealicense.com/licenses/mit"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License"></a>
<a href="https://travis-ci.org/MichMich/MagicMirror"><img src="https://travis-ci.org/MichMich/MagicMirror.svg" alt="Travis"></a>
<a href="https://snyk.io/test/github/MichMich/MagicMirror"><img src="https://snyk.io/test/github/MichMich/MagicMirror/badge.svg" alt="Known Vulnerabilities" data-canonical-src="https://snyk.io/test/github/MichMich/MagicMirror" style="max-width:100%;"></a>
</p>
**MagicMirror²** is an open source modular smart mirror platform. With a growing list of installable modules, the **MagicMirror²** allows you to convert your hallway or bathroom mirror into your personal assistant. **MagicMirror²** is built by the creator of [the original MagicMirror](http://michaelteeuw.nl/tagged/magicmirror) with the incredible help of a [growing community of contributors](https://github.com/MichMich/MagicMirror/graphs/contributors).
**MagicMirror²** is an open source modular smart mirror platform. With a growing list of installable modules, the **MagicMirror²** allows you to convert your hallway or bathroom mirror into your personal assistant. **MagicMirror²** is built by the creator of [the original MagicMirror](http://michaelteeuw.nl/tagged/magicmirror) with the incredible help of a [growing community of contributors](https://github.com/MichMich/MagicMirror/graphs/contributors).
MagicMirror² focuses on a modular plugin system and uses [Electron](http://electron.atom.io/) as an application wrapper. So no more web server or browser installs necessary!
**NOTE:** This version is in currently in beta stage. Please use the master branch if you need a thoroughly tested version.
## Table Of Contents
- [Usage](#usage)
@@ -24,19 +22,19 @@ MagicMirror² focuses on a modular plugin system and uses [Electron](http://elec
- [community](#community)
- [Contributing Guidelines](#contributing-guidelines)
## Usage
## Usage
#### Raspberry Pi Support
### Raspberry Pi Support
Electron, the app wrapper around MagicMirror², only supports the Raspberry Pi 2 & 3. The Raspberry Pi 1 is currently **not** supported. If you want to run this on a Raspberry Pi 1, use the [server only](#server-only) feature and setup a fullscreen browser yourself.
#### Automatic Installer (Raspberry Pi Only!)
### Automatic Installer (Raspberry Pi Only!)
Execute the following command on your Raspberry Pi to install MagicMirror²:
````
curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/installers/raspberry.sh | bash
curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/master/installers/raspberry.sh | bash
````
#### Manual Installation
### Manual Installation
1. Download and install the latest Node.js version.
2. Clone the repository and check out the beta branch: `git clone https://github.com/MichMich/MagicMirror`
@@ -45,25 +43,27 @@ curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/installers/raspb
**Important:** `npm start` does **not** work via SSH, use `DISPLAY=:0 nohup npm start &` instead. This starts the mirror on the remote display.
#### Server Only
**Note:** if you want to debug on Raspberry Pi you can use `npm start dev` which will start the MagicMirror app with Dev Tools enabled.
### Server Only
In some cases, you want to start the application without an actual app window. In this case, execute the following command from the MagicMirror folder: `node serveronly`. This will start the server, after which you can open the application in your browser of choice.
#### Raspberry Configuration & Auto Start.
### Raspberry Configuration & Auto Start.
The following wiki links are helpful in the configuration of your MagicMirror² operating system:
- [Configuring the Raspberry Pi](https://github.com/MichMich/MagicMirror/wiki/Configuring-the-Raspberry-Pi)
- [Auto Starting MagicMirror](https://github.com/MichMich/MagicMirror/wiki/Auto-Starting-MagicMirror)
#### Updating you MagicMirror²
### Updating your MagicMirror²
If you want to update your MagicMirror² to the latest version, use your terminal to go to your Magic Mirror folder and type the following command:
````
git pull
````
```bash
git pull && npm install
```
If you changed nothing more than the config or the modules, this should work without any problems.
If you changed nothing more than the config or the modules, this should work without any problems.
Type `git status` to see your changes, if there are any, you can reset them with `git reset --hard`. After that, git pull should be possible.
## Configuration
@@ -73,14 +73,18 @@ Type `git status` to see your changes, if there are any, you can reset them with
The following properties can be configured:
| **Option** | **Description** |
| --- | --- |
| `port` | The port on which the MagicMirror² server will run on. The default value is `8080`. |
| `address` | The ip address the accept connections. The default open bind `::` is IPv6 is available or `0.0.0.0` IPv4 run on. Example config: `192.168.10.100`. |
| `ipWhitelist` | The list of IPs from which you are allowed to access the MagicMirror². The default value is `["127.0.0.1", "::ffff:127.0.0.1", "::1"]`. It is possible to specify IPs with subnet masks (`["127.0.0.1", "127.0.0.1/24"]`) or define ip ranges (`["127.0.0.1", ["192.168.0.1", "192.168.0.100"]]`).|
| `zoom` | This allows to scale the mirror contents with a given zoom factor. The default value is `1.0`|
| `language` | The language of the interface. (Note: Not all elements will be localized.) Possible values are `en`, `nl`, `ru`, `fr`, etc., but the default value is `en`. |
| `timeFormat` | The form of time notation that will be used. Possible values are `12` or `24`. The default is `24`. |
| `units` | The units that will be used in the default weather modules. Possible values are `metric` or `imperial`. The default is `metric`. |
| `modules` | An array of active modules. **The array must contain objects. See the next table below for more information.** |
| `electronOptions` | An optional array of Electron (browser) options. This allows configuration of e.g. the browser screen size and position (defaults `.width = 800` & `.height = 600`). Kiosk mode can be enabled by setting `.kiosk = true`, `.autoHideMenuBar = false`, `.fullscreen = false`. More options can be found [here](https://github.com/electron/electron/blob/master/docs/api/browser-window.md). |
Module configuration:
@@ -90,6 +94,7 @@ Module configuration:
| `position` | The location of the module in which the module will be loaded. Possible values are `top_ bar`, `top_left`, `top_center`, `top_right`, `upper_third`, `middle_center`, `lower_third`, `bottom_left`, `bottom_center`, `bottom_right`, `bottom_bar`, `fullscreen_above`, and `fullscreen_below`. This field is optional but most modules require this field to set. Check the documentation of the module for more information. Multiple modules with the same position will be ordered based on the order in the configuration file. |
| `classes` | Additional classes which are passed to the module. The field is optional. |
| `header` | To display a header text above the module, add the header property. This field is optional. |
| `disabled` | Set disabled to `true` to skip creating the module. This field is optional. |
| `config` | An object with the module configuration properties. Check the documentation of the module for more information. This field is optional, unless the module requires extra configuration. |
## Modules
@@ -110,7 +115,7 @@ For more available modules, check out out the wiki page: [MagicMirror² Modules]
## Known issues
- Electron seems to have some issues on certain Raspberry Pi 2's. See [#145](https://github.com/MichMich/MagicMirror/issues/145).
- MagicMirror² (Electron) sometimes quits without an error after an extended period of use. See [#150](https://github.com/MichMich/MagicMirror/issues/150).
- MagicMirror² (Electron) sometimes quits without an error after an extended period of use. See [#150](https://github.com/MichMich/MagicMirror/issues/150).
## Community
@@ -122,10 +127,14 @@ Contributions of all kinds are welcome, not only in the form of code but also wi
Please keep the following in mind:
- **Bug Reports**: Make sure you're running the latest version. If the issue(s) still persist: please open a clearly documented issue with a clear title.
- **Bug Reports**: Make sure you're running the latest version. If the issue(s) still persist: please open a clearly documented issue with a clear title.
- **Minor Bug Fixes**: Please send a pull request with a clear explanation of the issue or a link to the issue it solves.
- **Major Bug Fixes**: please discuss your approach in an GitHub issue before you start to alter a big part of the code.
- **New Features**: please please discuss in a GitHub issue before you start to alter a big part of the code. Without discussion upfront, the pull request will not be accepted / merged.
Thanks for your help in making MagicMirror² better!
Thanks for your help in making MagicMirror² better!
<p align="center">
<br>
<a href="https://forum.magicmirror.builders/topic/728/magicmirror-is-voted-number-1-in-the-magpi-top-50"><img src="https://magicmirror.builders/img/magpi-best-watermark-custom.png" width="150" alt="MagPi Top 50"></a>
</p>

View File

@@ -6,6 +6,7 @@
var config = {
port: 8080,
ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"],
language: 'en',
timeFormat: 24,
@@ -15,6 +16,10 @@ var config = {
{
module: 'alert',
},
{
module: "updatenotification",
position: "top_bar"
},
{
module: 'clock',
position: 'top_left'
@@ -41,6 +46,7 @@ var config = {
position: 'top_right',
config: {
location: 'New York',
locationID: '', //ID from http://www.openweathermap.org
appid: 'YOUR_OPENWEATHER_API_KEY'
}
},
@@ -49,8 +55,9 @@ var config = {
position: 'top_right',
header: 'Weather Forecast',
config: {
location: 'New York',
appid: 'YOUR_OPENWEATHER_API_KEY'
location: 'New York',
locationID: '5128581', //ID from http://www.openweathermap.org
appid: 'YOUR_OPENWEATHER_API_KEY'
}
},
{

View File

@@ -1,10 +1,10 @@
html {
cursor: none;
overflow:hidden;
overflow: hidden;
}
::-webkit-scrollbar {
display: none;
::-webkit-scrollbar {
display: none;
}
body {
@@ -113,11 +113,12 @@ sup {
*/
.module {
margin-top: 30px;
margin-bottom: 30px;
}
.module:first-child {
margin-top: 0;
.region.bottom .module {
margin-top: 30px;
margin-bottom: 0;
}
/**

View File

@@ -8,6 +8,10 @@
<link rel="stylesheet" type="text/css" href="css/main.css">
<link rel="stylesheet" type="text/css" href="fonts/roboto.css">
<!-- custom.css is loaded by the loader.js to make sure it's loaded after the module css files. -->
<script type="text/javascript">
var version = "#VERSION#";
</script>
</head>
<body>
<div class="region fullscreen below"><div class="container"></div></div>

View File

@@ -18,7 +18,7 @@ echo ' \$$$$$$ |'
echo ' \______/'
echo -e "\e[0m"
# Define the tested version of node.
# Define the tested version of Node.js.
NODE_TESTED="v5.1.0"
#Determine which Pi is running.
@@ -28,6 +28,7 @@ ARM=$(uname -m)
if [ "$ARM" != "armv7l" ]; then
echo -e "\e[91mSorry, your Raspberry Pi is not supported."
echo -e "\e[91mPlease run MagicMirror on a Raspberry Pi 2 or 3."
echo -e "\e[91mIf this is a Pi Zero, you are in the same boat as the original Raspberry Pi. You must run in server only mode."
exit;
fi
@@ -39,7 +40,7 @@ function command_exists () { type "$1" &> /dev/null ;}
echo -e "\e[96mInstalling helper tools ...\e[90m"
sudo apt-get install curl wget git build-essential unzip || exit
# Check if we need to install or upgrade node.
# Check if we need to install or upgrade Node.js.
echo -e "\e[96mCheck current Node installation ...\e[0m"
NODE_INSTALL=false
if command_exists node; then
@@ -48,75 +49,45 @@ if command_exists node; then
echo -e "\e[0mMinimum Node version: \e[1m$NODE_TESTED\e[0m"
echo -e "\e[0mInstalled Node version: \e[1m$NODE_CURRENT\e[0m"
if version_gt $NODE_TESTED $NODE_CURRENT; then
echo -e "\e[96mNode should be upgraded.\e[0m"
NODE_INSTALL=true
echo -e "\e[96mNode should be upgraded.\e[0m"
NODE_INSTALL=true
#Check if a node process is currenlty running.
#If so abort installation.
if pgrep "node" > /dev/null; then
echo -e "\e[91mA Node process is currently running. Can't upgrade."
echo "Please quit all Node processes and restart the installer."
exit;
#Check if a node process is currenlty running.
#If so abort installation.
if pgrep "node" > /dev/null; then
echo -e "\e[91mA Node process is currently running. Can't upgrade."
echo "Please quit all Node processes and restart the installer."
exit;
fi
else
echo -e "\e[92mNo Node upgrade nessecery.\e[0m"
else
echo -e "\e[92mNo Node.js upgrade nessecery.\e[0m"
fi
else
echo -e "\e[93mNode is not installed.\e[0m";
echo -e "\e[93mNode.js is not installed.\e[0m";
NODE_INSTALL=true
fi
# Install or upgare node if nessecery.
# Install or upgrade node if necessary.
if $NODE_INSTALL; then
echo -e "\e[96mInstalling Node.js ...\e[90m"
echo -e "\e[96mStart Node download ...\e[0m"
#Fetch the latest version of Node.js.
#TODO: Is there a native way to fetch the latest node version?
echo -e "\e[39mRetrieving latest node version."
NODE_LATEST=$(curl -l http://api.jordidepoortere.com/nodejs-latest/ 2> /dev/null)
if [ "$NODE_LATEST" == "" ]; then
echo -e "\e[91mCould not retreive latest node version."
echo -e "\e[91mPlease try again or open an issue on GitHub."
exit
fi
echo -e "Latest node version: \e[1m$NODE_LATEST\e[0m"
#Construct the download URL.
DOWNLOAD_URL="https://nodejs.org/dist/latest/node-$NODE_LATEST-linux-$ARM.tar.gz"
#Create Download Directory
rm -Rf ~/.MagicMirrorNodeInstaller || exit
mkdir ~/.MagicMirrorNodeInstaller || exit
cd ~/.MagicMirrorNodeInstaller || exit
#Download Installer
echo -e "\e[39mDownloading node ... \e[90m"
if wget $DOWNLOAD_URL --no-verbose --show-progress; then
echo -e "\e[39mDownload complete."
else
echo -e "\e[91mCould not download node."
exit;
fi
#Unpack and copy.
echo -e "\e[96mStart Node installation ...\e[90m"
tar xvf node-$NODE_LATEST-linux-$ARM.tar.gz || exit
cd node* || exit
sudo cp -R * /usr/local || exit
#Cleanup
rm -Rf ~/.MagicMirrorNodeInstaller || exit
#Fetch the latest version of Node.js from the selected branch
#The NODE_STABLE_BRANCH variable will need to be manually adjusted when a new branch is released. (e.g. 7.x)
#Only tested (stable) versions are recommended as newer versions could break MagicMirror.
NODE_STABLE_BRANCH="6.x"
curl -sL https://deb.nodesource.com/setup_$NODE_STABLE_BRANCH | sudo -E bash -
sudo apt-get install -y nodejs
echo -e "\e[92mNode.js installation Done!\e[0m"
fi
#Install magic mirror
cd ~
if [ -d "$HOME/MagicMirror" ] ; then
echo -e "\e[93mIt seems like MagicMirror is allready installed."
echo -e "\e[93mIt seems like MagicMirror is already installed."
echo -e "To prevent overwriting, the installer will be aborted."
echo -e "Please rename the \e[1m~/MagicMirror\e[0m\e[93m folder and try again.\e[0m"
echo ""
@@ -142,7 +113,35 @@ else
exit;
fi
# Check if plymouth is installed (default with PIXEL desktop environment), then install custom splashscreen.
echo -e "\e[96mCheck plymouth installation ...\e[0m"
if command_exists plymouth; then
THEME_DIR="/usr/share/plymouth/themes"
echo -e "\e[90mSplashscreen: Checking themes directory.\e[0m"
if [ -d $THEME_DIR ]; then
echo -e "\e[90mSplashscreen: Create theme directory if not exists.\e[0m"
if [ ! -d $THEME_DIR/MagicMirror ]; then
sudo mkdir $THEME_DIR/MagicMirror
fi
if sudo cp ~/MagicMirror/splashscreen/splash.png $THEME_DIR/MagicMirror/splash.png && sudo cp ~/MagicMirror/splashscreen/MagicMirror.plymouth $THEME_DIR/MagicMirror/MagicMirror.plymouth && sudo cp ~/MagicMirror/splashscreen/MagicMirror.script $THEME_DIR/MagicMirror/MagicMirror.script; then
echo -e "\e[90mSplashscreen: Theme copied successfully.\e[0m"
if sudo plymouth-set-default-theme -R MagicMirror; then
echo -e "\e[92mSplashscreen: Changed theme to MagicMirror successfully.\e[0m"
else
echo -e "\e[91mSplashscreen: Couldn't change theme to MagicMirror!\e[0m"
fi
else
echo -e "\e[91mSplashscreen: Copying theme failed!\e[0m"
fi
else
echo -e "\e[91mSplashscreen: Themes folder doesn't exist!\e[0m"
fi
else
echo -e "\e[93mplymouth is not installed.\e[0m";
fi
echo " "
echo -e "\e[92mWe're ready! Run \e[1m\e[97mDISPLAY=:0 npm start\e[0m\e[92m from the ~/MagicMirror directory to start your MagicMirror."
echo -e "\e[92mWe're ready! Run \e[1m\e[97mDISPLAY=:0 npm start\e[0m\e[92m from the ~/MagicMirror directory to start your MagicMirror.\e[0m"
echo " "
echo " "

View File

@@ -10,6 +10,13 @@ var Server = require(__dirname + "/server.js");
var defaultModules = require(__dirname + "/../modules/default/defaultmodules.js");
var path = require("path");
// Get version number.
global.version = JSON.parse(fs.readFileSync("package.json", "utf8")).version;
console.log("Starting MagicMirror: v" + global.version);
// global absolute root path
global.root_path = path.resolve(__dirname + "/../");
// The next part is here to prevent a major exception when there
// is no internet connection. This could probable be solved better.
process.on("uncaughtException", function (err) {
@@ -34,15 +41,23 @@ var App = function() {
var loadConfig = function(callback) {
console.log("Loading config ...");
var defaults = require(__dirname + "/defaults.js");
var configFilename = path.resolve(__dirname + "/../config/config.js");
var configFilename = path.resolve(global.root_path + "/config/config.js");
try {
fs.accessSync(configFilename, fs.F_OK);
var c = require(configFilename);
var config = Object.assign(defaults, c);
callback(config);
} catch (e) {
console.error("WARNING! Could not find config. Please create one.");
callback(defaults);
if (e.code == "ENOENT") {
console.error("WARNING! Could not find config file. Please create one. Starting with default configuration.");
callback(defaults);
} else if (e instanceof ReferenceError || e instanceof SyntaxError) {
console.error("WARNING! Could not validate config file. Please correct syntax errors. Starting with default configuration.");
callback(defaults);
} else {
console.error("WARNING! Could not load config file. Starting with default configuration. Error found: " + e);
callback(defaults);
}
}
};
@@ -74,6 +89,17 @@ var App = function() {
if (loadModule) {
var Module = require(helperPath);
var m = new Module();
if (m.requiresVersion) {
console.log("Check MagicMirror version for node helper '" + moduleName + "' - Minimum version: " + m.requiresVersion + " - Current version: " + global.version);
if (cmpVersions(global.version, m.requiresVersion) >= 0) {
console.log("Version is ok!");
} else {
console.log("Version is incorrect. Skip module: '" + moduleName + "'");
return;
}
}
m.setName(moduleName);
m.setPath(path.resolve(moduleFolder));
nodeHelpers.push(m);
@@ -95,6 +121,28 @@ var App = function() {
console.log("All module helpers loaded.");
};
/* cmpVersions(a,b)
* Compare two symantic version numbers and return the difference.
*
* argument a string - Version number a.
* argument a string - Version number b.
*/
function cmpVersions(a, b) {
var i, diff;
var regExStrip0 = /(\.0+)+$/;
var segmentsA = a.replace(regExStrip0, "").split(".");
var segmentsB = b.replace(regExStrip0, "").split(".");
var l = Math.min(segmentsA.length, segmentsB.length);
for (i = 0; i < l; i++) {
diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);
if (diff) {
return diff;
}
}
return segmentsA.length - segmentsB.length;
}
/* start(callback)
* This methods starts the core app.
* It loads the config, then it loads all modules.
@@ -111,7 +159,7 @@ var App = function() {
for (var m in config.modules) {
var module = config.modules[m];
if (modules.indexOf(module.module) === -1) {
if (modules.indexOf(module.module) === -1 && !module.disabled) {
modules.push(module.module);
}
}
@@ -139,4 +187,4 @@ var App = function() {
};
};
module.exports = new App();
module.exports = new App();

View File

@@ -21,28 +21,32 @@
var prototype = new this();
initializing = false;
// Make a copy of all prototype properies, to prevent reference issues.
for (var name in prototype) {
prototype[name] = cloneObject(prototype[name]);
}
// Copy the properties over onto the new prototype
for (var name in prop) {
// Check if we're overwriting an existing function
prototype[name] = typeof prop[name] == "function" &&
typeof _super[name] == "function" && fnTest.test(prop[name]) ?
(function(name, fn) {
return function() {
var tmp = this._super;
typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn) {
return function() {
var tmp = this._super;
// Add a new ._super() method that is the same method
// but on the super-class
this._super = _super[name];
// Add a new ._super() method that is the same method
// but on the super-class
this._super = _super[name];
// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super = tmp;
// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super = tmp;
return ret;
};
})(name, prop[name]) :
prop[name];
return ret;
};
})(name, prop[name]) : prop[name];
}
// The dummy class constructor
@@ -66,5 +70,24 @@
};
})();
//Define the clone method for later use.
//Helper Method
function cloneObject(obj) {
if (obj === null || typeof obj !== "object") {
return obj;
}
var temp = obj.constructor(); // give temp the original obj's constructor
for (var key in obj) {
temp[key] = cloneObject(obj[key]);
if (key === "lockStrings") {
Log.log(key);
}
}
return temp;
}
/*************** DO NOT EDIT THE LINE BELOW ***************/
if (typeof module !== "undefined") {module.exports = Class;}

View File

@@ -9,12 +9,20 @@
var defaults = {
port: 8080,
kioskmode: false,
electronOptions: {},
ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"],
language: "en",
timeFormat: 24,
units: "metric",
zoom: 1,
modules: [
{
module: "updatenotification",
position: "top_center"
},
{
module: "helloworld",
position: "upper_third",

View File

@@ -1,3 +1,5 @@
/* jshint esversion: 6 */
"use strict";
const Server = require(__dirname + "/server.js");
@@ -16,23 +18,62 @@ const BrowserWindow = electron.BrowserWindow;
let mainWindow;
function createWindow() {
var electronOptionsDefaults = {
width: 800,
height: 600,
x: 0,
y: 0,
darkTheme: true,
webPreferences: {
nodeIntegration: false,
zoomFactor: config.zoom
}
}
// DEPRECATED: "kioskmode" backwards compatibility, to be removed
// settings these options directly instead provides cleaner interface
if (config.kioskmode) {
electronOptionsDefaults.kiosk = true;
} else {
electronOptionsDefaults.fullscreen = true;
electronOptionsDefaults.autoHideMenuBar = true;
}
var electronOptions = Object.assign({}, electronOptionsDefaults, config.electronOptions);
// Create the browser window.
mainWindow = new BrowserWindow({width: 800, height: 600, fullscreen: true, autoHideMenuBar: true, darkTheme: true, webPreferences: {nodeIntegration: false}});
mainWindow = new BrowserWindow(electronOptions);
// and load the index.html of the app.
//mainWindow.loadURL('file://' + __dirname + '../../index.html');
mainWindow.loadURL("http://localhost:" + config.port);
// Open the DevTools.
//mainWindow.webContents.openDevTools();
// Open the DevTools if run with "npm start dev"
if(process.argv[2] == "dev") {
mainWindow.webContents.openDevTools();
}
// Emitted when the window is closed.
// Set responders for window events.
mainWindow.on("closed", function() {
// Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
mainWindow = null;
});
if (config.kioskmode) {
mainWindow.on("blur", function() {
mainWindow.focus();
});
mainWindow.on("leave-full-screen", function() {
mainWindow.setFullScreen(true);
});
mainWindow.on("resize", function() {
setTimeout(function() {
mainWindow.reload();
}, 1000);
});
}
}
// This method will be called when Electron has finished
@@ -44,11 +85,7 @@ app.on("ready", function() {
// Quit when all windows are closed.
app.on("window-all-closed", function() {
// On OS X it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== "darwin") {
app.quit();
}
createWindow();
});
app.on("activate", function() {

View File

@@ -89,6 +89,10 @@ var Loader = (function() {
moduleFolder = config.paths.modules + "/default/" + module;
}
if (moduleData.disabled === true) {
continue;
}
moduleFiles.push({
index: m,
identifier: "module_" + m + "_" + module,
@@ -117,9 +121,13 @@ var Loader = (function() {
var afterLoad = function() {
var moduleObject = Module.create(module.name);
bootstrapModule(module, moduleObject, function() {
if (moduleObject) {
bootstrapModule(module, moduleObject, function() {
callback();
});
} else {
callback();
});
}
};
if (loadedModuleFiles.indexOf(url) !== -1) {

View File

@@ -13,35 +13,15 @@
var Log = (function() {
return {
info: function(message) {
console.info(message);
},
log: function(message) {
console.log(message);
},
error: function(message) {
console.error(message);
},
warn: function(message) {
console.warn(message);
},
group: function(message) {
console.group(message);
},
groupCollapsed: function(message) {
console.groupCollapsed(message);
},
groupEnd: function() {
console.groupEnd();
},
time: function(message) {
console.time(message);
},
timeEnd: function(message) {
console.timeEnd(message);
},
timeStamp: function(message) {
console.timeStamp(message);
}
info: Function.prototype.bind.call(console.info, console),
log: Function.prototype.bind.call(console.log, console),
error: Function.prototype.bind.call(console.error, console),
warn: Function.prototype.bind.call(console.warn, console),
group: Function.prototype.bind.call(console.group, console),
groupCollapsed: Function.prototype.bind.call(console.groupCollapsed, console),
groupEnd: Function.prototype.bind.call(console.groupEnd, console),
time: Function.prototype.bind.call(console.time, console),
timeEnd: Function.prototype.bind.call(console.timeEnd, console),
timeStamp: Function.prototype.bind.call(console.timeStamp, console)
};
})();

View File

@@ -1,4 +1,5 @@
/* global Log, Loader, Module, config, defaults */
/* jshint -W020 */
/* Magic Mirror
* Main System
@@ -39,6 +40,7 @@ var MM = (function() {
if (typeof module.data.header !== "undefined" && module.data.header !== "") {
var moduleHeader = document.createElement("header");
moduleHeader.innerHTML = module.data.header;
moduleHeader.className = "module-header";
dom.appendChild(moduleHeader);
}
@@ -50,6 +52,8 @@ var MM = (function() {
}
}
updateWrapperStates();
sendNotification("DOM_OBJECTS_CREATED");
};
@@ -72,7 +76,7 @@ var MM = (function() {
/* sendNotification(notification, payload, sender)
* Send a notification to all modules.
*
* argument notification string - The identifier of the noitication.
* argument notification string - The identifier of the notification.
* argument payload mixed - The payload of the notification.
* argument sender Module - The module that sent the notification.
*/
@@ -93,26 +97,27 @@ var MM = (function() {
*/
var updateDom = function(module, speed) {
var newContent = module.getDom();
var newHeader = module.getHeader();
if (!module.hidden) {
if (!moduleNeedsUpdate(module, newContent)) {
if (!moduleNeedsUpdate(module, newHeader, newContent)) {
return;
}
if (!speed) {
updateModuleContent(module, newContent);
updateModuleContent(module, newHeader, newContent);
return;
}
hideModule(module, speed / 2, function() {
updateModuleContent(module, newContent);
updateModuleContent(module, newHeader, newContent);
if (!module.hidden) {
showModule(module, speed / 2);
}
});
} else {
updateModuleContent(module, newContent);
updateModuleContent(module, newHeader, newContent);
}
};
@@ -124,14 +129,23 @@ var MM = (function() {
*
* return bool - Does the module need an update?
*/
var moduleNeedsUpdate = function(module, newContent) {
var moduleNeedsUpdate = function(module, newHeader, newContent) {
var moduleWrapper = document.getElementById(module.identifier);
var contentWrapper = moduleWrapper.getElementsByClassName("module-content")[0];
var contentWrapper = moduleWrapper.getElementsByClassName("module-content");
var headerWrapper = moduleWrapper.getElementsByClassName("module-header");
var tempWrapper = document.createElement("div");
tempWrapper.appendChild(newContent);
var headerNeedsUpdate = false;
var contentNeedsUpdate = false;
return tempWrapper.innerHTML !== contentWrapper.innerHTML;
if (headerWrapper.length > 0) {
headerNeedsUpdate = newHeader !== headerWrapper[0].innerHTML;
}
var tempContentWrapper = document.createElement("div");
tempContentWrapper.appendChild(newContent);
contentNeedsUpdate = tempContentWrapper.innerHTML !== contentWrapper[0].innerHTML;
return headerNeedsUpdate || contentNeedsUpdate;
};
/* moduleNeedsUpdate(module, newContent)
@@ -140,12 +154,19 @@ var MM = (function() {
* argument module Module - The module to check.
* argument newContent Domobject - The new content that is generated.
*/
var updateModuleContent = function(module, content) {
var updateModuleContent = function(module, newHeader, newContent) {
var moduleWrapper = document.getElementById(module.identifier);
var contentWrapper = moduleWrapper.getElementsByClassName("module-content")[0];
var headerWrapper = moduleWrapper.getElementsByClassName("module-header");
var contentWrapper = moduleWrapper.getElementsByClassName("module-content");
contentWrapper[0].innerHTML = "";
contentWrapper[0].appendChild(newContent);
if( headerWrapper.length > 0 && newHeader) {
headerWrapper[0].innerHTML = newHeader;
}
contentWrapper.innerHTML = null;
contentWrapper.appendChild(content);
};
/* hideModule(module, speed, callback)
@@ -155,7 +176,17 @@ var MM = (function() {
* argument speed Number - The speed of the hide animation.
* argument callback function - Called when the animation is done.
*/
var hideModule = function(module, speed, callback) {
var hideModule = function(module, speed, callback, options) {
options = options || {};
// set lockString if set in options.
if (options.lockString) {
// Log.log("Has lockstring: " + options.lockString);
if (module.lockStrings.indexOf(options.lockString) === -1) {
module.lockStrings.push(options.lockString);
}
}
var moduleWrapper = document.getElementById(module.identifier);
if (moduleWrapper !== null) {
moduleWrapper.style.transition = "opacity " + speed / 1000 + "s";
@@ -164,10 +195,12 @@ var MM = (function() {
clearTimeout(module.showHideTimer);
module.showHideTimer = setTimeout(function() {
// To not take up any space, we just make the position absolute.
// since it"s fade out anyway, we can see it lay above or
// since it's fade out anyway, we can see it lay above or
// below other modules. This works way better than adjusting
// the .display property.
moduleWrapper.style.position = "absolute";
moduleWrapper.style.position = "fixed";
updateWrapperStates();
if (typeof callback === "function") { callback(); }
}, speed);
@@ -181,7 +214,30 @@ var MM = (function() {
* argument speed Number - The speed of the show animation.
* argument callback function - Called when the animation is done.
*/
var showModule = function(module, speed, callback) {
var showModule = function(module, speed, callback, options) {
options = options || {};
// remove lockString if set in options.
if (options.lockString) {
var index = module.lockStrings.indexOf(options.lockString)
if ( index !== -1) {
module.lockStrings.splice(index, 1);
}
}
// Check if there are no more lockstrings set, or the force option is set.
// Otherwise cancel show action.
if (module.lockStrings.length !== 0 && options.force !== true) {
Log.log("Will not show " + module.name + ". LockStrings active: " + module.lockStrings.join(","));
return;
}
// If forced show, clean current lockstrings.
if (module.lockStrings.length !== 0 && options.force === true) {
Log.log("Force show of module: " + module.name);
module.lockStrings = [];
}
var moduleWrapper = document.getElementById(module.identifier);
if (moduleWrapper !== null) {
moduleWrapper.style.transition = "opacity " + speed / 1000 + "s";
@@ -189,6 +245,8 @@ var MM = (function() {
moduleWrapper.style.position = "static";
moduleWrapper.style.opacity = 1;
updateWrapperStates();
clearTimeout(module.showHideTimer);
module.showHideTimer = setTimeout(function() {
if (typeof callback === "function") { callback(); }
@@ -197,6 +255,36 @@ var MM = (function() {
}
};
/* updateWrapperStates()
* Checks for all positions if it has visible content.
* If not, if will hide the position to prevent unwanted margins.
* This method schould be called by the show and hide methods.
*
* Example:
* If the top_bar only contains the update notification. And no update is available,
* the update notification is hidden. The top bar still occupies space making for
* an ugly top margin. By using this function, the top bar will be hidden if the
* update notification is not visible.
*/
var updateWrapperStates = function() {
var positions = ["top_bar", "top_left", "top_center", "top_right", "upper_third", "middle_center", "lower_third", "bottom_left", "bottom_center", "bottom_right", "bottom_bar", "fullscreen_above", "fullscreen_below"];
positions.forEach(function(position) {
var wrapper = selectWrapper(position);
var moduleWrappers = wrapper.getElementsByClassName("module");
var showWrapper = false;
Array.prototype.forEach.call(moduleWrappers, function(moduleWrapper) {
if (moduleWrapper.style.position == "" || moduleWrapper.style.position == "static") {
showWrapper = true;
}
});
wrapper.style.display = showWrapper ? "block" : "none";
});
};
/* loadConfig()
* Loads the core config and combines it with de system defaults.
*/
@@ -207,7 +295,7 @@ var MM = (function() {
return;
}
config = Object.assign(defaults, config);
config = Object.assign({}, defaults, config);
};
/* setSelectionMethodsForModules()
@@ -220,29 +308,28 @@ var MM = (function() {
/* withClass(className)
* filters a collection of modules based on classname(s).
*
* argument className string/array - one or multiple classnames. (array or space devided)
* argument className string/array - one or multiple classnames. (array or space divided)
*
* return array - Filtered collection of modules.
*/
var withClass = function(className) {
var newModules = [];
var searchClasses = className;
if (typeof className === "string") {
searchClasses = className.split(" ");
}
for (var m in modules) {
var module = modules[m];
var newModules = modules.filter(function(module) {
var classes = module.data.classes.toLowerCase().split(" ");
for (var c in searchClasses) {
var searchClass = searchClasses[c];
if (classes.indexOf(searchClass.toLowerCase()) !== -1) {
newModules.push(module);
return true;
}
}
}
return false;
});
setSelectionMethodsForModules(newModules);
return newModules;
@@ -251,33 +338,28 @@ var MM = (function() {
/* exceptWithClass(className)
* filters a collection of modules based on classname(s). (NOT)
*
* argument className string/array - one or multiple classnames. (array or space devided)
* argument className string/array - one or multiple classnames. (array or space divided)
*
* return array - Filtered collection of modules.
*/
var exceptWithClass = function(className) {
var newModules = [];
var searchClasses = className;
if (typeof className === "string") {
searchClasses = className.split(" ");
}
for (var m in modules) {
var module = modules[m];
var newModules = modules.filter(function(module) {
var classes = module.data.classes.toLowerCase().split(" ");
var foundClass = false;
for (var c in searchClasses) {
var searchClass = searchClasses[c];
if (classes.indexOf(searchClass.toLowerCase()) !== -1) {
foundClass = true;
break;
return false;
}
}
if (!foundClass) {
newModules.push(module);
}
}
return true;
});
setSelectionMethodsForModules(newModules);
return newModules;
@@ -291,14 +373,9 @@ var MM = (function() {
* return array - Filtered collection of modules.
*/
var exceptModule = function(module) {
var newModules = [];
for (var m in modules) {
var mod = modules[m];
if (mod.identifier !== module.identifier) {
newModules.push(mod);
}
}
var newModules = modules.filter(function(mod) {
return mod.identifier !== module.identifier;
});
setSelectionMethodsForModules(newModules);
return newModules;
@@ -310,10 +387,9 @@ var MM = (function() {
* argument callback function - The function to execute with the module as an argument.
*/
var enumerate = function(callback) {
for (var m in modules) {
var module = modules[m];
modules.map(function(module) {
callback(module);
}
});
};
if (typeof modules.withClass === "undefined") { Object.defineProperty(modules, "withClass", {value: withClass, enumerable: false}); }
@@ -412,10 +488,11 @@ var MM = (function() {
* argument module Module - The module hide.
* argument speed Number - The speed of the hide animation.
* argument callback function - Called when the animation is done.
* argument options object - Optional settings for the hide method.
*/
hideModule: function(module, speed, callback) {
hideModule: function(module, speed, callback, options) {
module.hidden = true;
hideModule(module, speed, callback);
hideModule(module, speed, callback, options);
},
/* showModule(module, speed, callback)
@@ -424,10 +501,11 @@ var MM = (function() {
* argument module Module - The module show.
* argument speed Number - The speed of the show animation.
* argument callback function - Called when the animation is done.
* argument options object - Optional settings for the hide method.
*/
showModule: function(module, speed, callback) {
showModule: function(module, speed, callback, options) {
module.hidden = false;
showModule(module, speed, callback);
showModule(module, speed, callback, options);
}
};

View File

@@ -14,23 +14,30 @@ var Module = Class.extend({
* All methods (and properties) below can be subclassed. *
*********************************************************/
// Set the minimum MagicMirror module version for this module.
requiresVersion: "2.0.0",
// Module config defaults.
defaults: {},
// Timer reference used for showHide animation callbacks.
showHideTimer: null,
// Array to store lockStrings. These strings are used to lock
// visibility when hiding and showing module.
lockStrings: [],
/* init()
* Is called when the module is instantiated.
*/
init: function() {
init: function () {
//Log.log(this.defaults);
},
/* start()
* Is called when the module is started.
*/
start: function() {
start: function () {
Log.info("Starting module: " + this.name);
},
@@ -39,7 +46,7 @@ var Module = Class.extend({
*
* return Array<String> - An array with filenames.
*/
getScripts: function() {
getScripts: function () {
return [];
},
@@ -48,7 +55,7 @@ var Module = Class.extend({
*
* return Array<String> - An array with filenames.
*/
getStyles: function() {
getStyles: function () {
return [];
},
@@ -57,7 +64,7 @@ var Module = Class.extend({
*
* return Map<String, String> - A map with langKeys and filenames.
*/
getTranslations: function() {
getTranslations: function () {
return false;
},
@@ -67,7 +74,7 @@ var Module = Class.extend({
*
* return domobject - The dom to display.
*/
getDom: function() {
getDom: function () {
var nameWrapper = document.createElement("div");
var name = document.createTextNode(this.name);
nameWrapper.appendChild(name);
@@ -84,15 +91,26 @@ var Module = Class.extend({
return div;
},
/* getHeader()
* This method generates the header string which needs to be displayed if a user has a header configured for this module.
* This method is called by the Magic Mirror core, but only if the user has configured a default header for the module.
* This method needs to be subclassed if the module wants to display modified headers on the mirror.
*
* return string - The header to display above the header.
*/
getHeader: function () {
return this.data.header;
},
/* notificationReceived(notification, payload, sender)
* This method is called when a notification arrives.
* This method is called by the Magic Mirror core.
*
* argument notification string - The identifier of the noitication.
* argument notification string - The identifier of the notification.
* argument payload mixed - The payload of the notification.
* argument sender Module - The module that sent the notification.
*/
notificationReceived: function(notification, payload, sender) {
notificationReceived: function (notification, payload, sender) {
if (sender) {
Log.log(this.name + " received a module notification: " + notification + " from sender: " + sender.name);
} else {
@@ -103,24 +121,24 @@ var Module = Class.extend({
/* socketNotificationReceived(notification, payload)
* This method is called when a socket notification arrives.
*
* argument notification string - The identifier of the noitication.
* argument notification string - The identifier of the notification.
* argument payload mixed - The payload of the notification.
*/
socketNotificationReceived: function(notification, payload) {
socketNotificationReceived: function (notification, payload) {
Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload);
},
/* suspend()
* This method is called when a module is hidden.
*/
suspend: function() {
Log.log(this.name + " is suspend.");
suspend: function () {
Log.log(this.name + " is suspended.");
},
/* resume()
* This method is called when a module is shown.
*/
resume: function() {
resume: function () {
Log.log(this.name + " is resumed.");
},
@@ -133,7 +151,7 @@ var Module = Class.extend({
*
* argument data obejct - Module data.
*/
setData: function(data) {
setData: function (data) {
this.data = data;
this.name = data.name;
this.identifier = data.identifier;
@@ -147,21 +165,21 @@ var Module = Class.extend({
*
* argument config obejct - Module config.
*/
setConfig: function(config) {
this.config = Object.assign(this.defaults, config);
setConfig: function (config) {
this.config = Object.assign({}, this.defaults, config);
},
/* socket()
* Returns a socket object. If it doesn"t exsist, it"s created.
* Returns a socket object. If it doesn"t exist, it"s created.
* It also registers the notification callback.
*/
socket: function() {
socket: function () {
if (typeof this._socket === "undefined") {
this._socket = this._socket = new MMSocket(this.name);
}
var self = this;
this._socket.setNotificationCallback(function(notification, payload) {
this._socket.setNotificationCallback(function (notification, payload) {
self.socketNotificationReceived(notification, payload);
});
@@ -175,7 +193,7 @@ var Module = Class.extend({
*
* return string - File path.
*/
file: function(file) {
file: function (file) {
return this.data.path + "/" + file;
},
@@ -184,14 +202,14 @@ var Module = Class.extend({
*
* argument callback function - Function called when done.
*/
loadStyles: function(callback) {
loadStyles: function (callback) {
var self = this;
var styles = this.getStyles();
var loadNextStyle = function() {
var loadNextStyle = function () {
if (styles.length > 0) {
var nextStyle = styles[0];
Loader.loadFile(nextStyle, self, function() {
Loader.loadFile(nextStyle, self, function () {
styles = styles.slice(1);
loadNextStyle();
});
@@ -208,14 +226,14 @@ var Module = Class.extend({
*
* argument callback function - Function called when done.
*/
loadScripts: function(callback) {
loadScripts: function (callback) {
var self = this;
var scripts = this.getScripts();
var loadNextScript = function() {
var loadNextScript = function () {
if (scripts.length > 0) {
var nextScript = scripts[0];
Loader.loadFile(nextScript, self, function() {
Loader.loadFile(nextScript, self, function () {
scripts = scripts.slice(1);
loadNextScript();
});
@@ -232,14 +250,14 @@ var Module = Class.extend({
*
* argument callback function - Function called when done.
*/
loadTranslations: function(callback) {
loadTranslations: function (callback) {
var self = this;
var translations = this.getTranslations();
var lang = config.language.toLowerCase();
// The variable `first` will contain the first
// defined translation after the following line.
for (var first in translations) {break;}
for (var first in translations) { break; }
if (translations) {
var translationFile = translations[lang] || undefined;
@@ -247,8 +265,8 @@ var Module = Class.extend({
// If a translation file is set, load it and then also load the fallback translation file.
// Otherwise only load the fallback translation file.
if (translationFile !== undefined) {
Translator.load(self, translationFile, false, function() {
if (translationFile !== undefined && translationFile !== translationsFallbackFile) {
Translator.load(self, translationFile, false, function () {
Translator.load(self, translationsFallbackFile, true, callback);
});
} else {
@@ -259,13 +277,13 @@ var Module = Class.extend({
}
},
/* translate(key, defaultValue)
* Request the translation for a given key.
*
* argument key string - The key of the string to translage
* argument defaultValue string - The default value if no translation was found. (Optional)
*/
translate: function(key, defaultValue) {
/* translate(key, defaultValue)
* Request the translation for a given key.
*
* argument key string - The key of the string to translage
* argument defaultValue string - The default value if no translation was found. (Optional)
*/
translate: function (key, defaultValue) {
return Translator.translate(this, key) || defaultValue || "";
},
@@ -274,27 +292,27 @@ var Module = Class.extend({
*
* argument speed Number - The speed of the animation. (Optional)
*/
updateDom: function(speed) {
updateDom: function (speed) {
MM.updateDom(this, speed);
},
/* sendNotification(notification, payload)
* Send a notification to all modules.
*
* argument notification string - The identifier of the noitication.
* argument notification string - The identifier of the notification.
* argument payload mixed - The payload of the notification.
*/
sendNotification: function(notification, payload) {
sendNotification: function (notification, payload) {
MM.sendNotification(notification, payload, this);
},
/* sendSocketNotification(notification, payload)
* Send a socket notification to the node helper.
*
* argument notification string - The identifier of the noitication.
* argument notification string - The identifier of the notification.
* argument payload mixed - The payload of the notification.
*/
sendSocketNotification: function(notification, payload) {
sendSocketNotification: function (notification, payload) {
this.socket().sendNotification(notification, payload);
},
@@ -303,15 +321,22 @@ var Module = Class.extend({
*
* argument speed Number - The speed of the hide animation.
* argument callback function - Called when the animation is done.
* argument options object - Optional settings for the hide method.
*/
hide: function(speed, callback) {
callback = callback || function() {};
hide: function (speed, callback, options) {
if (typeof callback === "object") {
options = callback;
callback = function () { };
}
callback = callback || function () { };
options = options || {};
var self = this;
MM.hideModule(self, speed, function() {
MM.hideModule(self, speed, function () {
self.suspend();
callback();
});
}, options);
},
/* showModule(module, speed, callback)
@@ -319,29 +344,29 @@ var Module = Class.extend({
*
* argument speed Number - The speed of the show animation.
* argument callback function - Called when the animation is done.
* argument options object - Optional settings for the hide method.
*/
show: function(speed, callback) {
show: function (speed, callback, options) {
if (typeof callback === "object") {
options = callback;
callback = function () { };
}
callback = callback || function () { };
options = options || {};
this.resume();
MM.showModule(this, speed, callback);
MM.showModule(this, speed, callback, options);
}
});
Module.definitions = {};
Module.create = function(name) {
Module.create = function (name) {
//Define the clone method for later use.
function cloneObject(obj) {
if (obj === null || typeof obj !== "object") {
return obj;
}
var temp = obj.constructor(); // give temp the original obj"s constructor
for (var key in obj) {
temp[key] = cloneObject(obj[key]);
}
return temp;
// Make sure module definition is available.
if (!Module.definitions[name]) {
return;
}
var moduleDefinition = Module.definitions[name];
@@ -354,7 +379,39 @@ Module.create = function(name) {
};
Module.register = function(name, moduleDefinition) {
/* cmpVersions(a,b)
* Compare two symantic version numbers and return the difference.
*
* argument a string - Version number a.
* argument a string - Version number b.
*/
function cmpVersions(a, b) {
var i, diff;
var regExStrip0 = /(\.0+)+$/;
var segmentsA = a.replace(regExStrip0, "").split(".");
var segmentsB = b.replace(regExStrip0, "").split(".");
var l = Math.min(segmentsA.length, segmentsB.length);
for (i = 0; i < l; i++) {
diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);
if (diff) {
return diff;
}
}
return segmentsA.length - segmentsB.length;
}
Module.register = function (name, moduleDefinition) {
if (moduleDefinition.requiresVersion) {
Log.log("Check MagicMirror version for module '" + name + "' - Minimum version: " + moduleDefinition.requiresVersion + " - Current version: " + version);
if (cmpVersions(version, moduleDefinition.requiresVersion) >= 0) {
Log.log("Version is ok!");
} else {
Log.log("Version is incorrect. Skip module: '" + name + "'");
return;
}
}
Log.log("Module registered: " + name);
Module.definitions[name] = moduleDefinition;
};

View File

@@ -10,21 +10,43 @@ var app = require("express")();
var server = require("http").Server(app);
var io = require("socket.io")(server);
var path = require("path");
var ipfilter = require("express-ipfilter").IpFilter;
var fs = require("fs");
var helmet = require("helmet");
var Server = function(config, callback) {
console.log("Starting server op port " + config.port + " ... ");
server.listen(config.port);
server.listen(config.port, config.address ? config.address : null);
app.use(function(req, res, next) {
var result = ipfilter(config.ipWhitelist, {mode: "allow", log: false})(req, res, function(err) {
if (err === undefined) {
return next();
}
console.log(err.message);
res.status(403).send("This device is not allowed to access your mirror. <br> Please check your config.js or config.js.sample to change this.");
});
});
app.use(helmet());
app.use("/js", express.static(__dirname));
app.use("/config", express.static(path.resolve(__dirname + "/../config")));
app.use("/css", express.static(path.resolve(__dirname + "/../css")));
app.use("/fonts", express.static(path.resolve(__dirname + "/../fonts")));
app.use("/modules", express.static(path.resolve(__dirname + "/../modules")));
app.use("/vendor", express.static(path.resolve(__dirname + "/../vendor")));
app.use("/translations", express.static(path.resolve(__dirname + "/../translations")));
app.use("/config", express.static(path.resolve(global.root_path + "/config")));
app.use("/css", express.static(path.resolve(global.root_path + "/css")));
app.use("/fonts", express.static(path.resolve(global.root_path + "/fonts")));
app.use("/modules", express.static(path.resolve(global.root_path + "/modules")));
app.use("/vendor", express.static(path.resolve(global.root_path + "/vendor")));
app.use("/translations", express.static(path.resolve(global.root_path + "/translations")));
app.get("/version", function(req,res) {
res.send(global.version);
});
app.get("/", function(req, res) {
res.sendFile(path.resolve(__dirname + "/../index.html"));
var html = fs.readFileSync(path.resolve(global.root_path + "/index.html"), {encoding: "utf8"});
html = html.replace("#VERSION#", global.version);
res.send(html);
});
if (typeof callback === "function") {

13
jsconfig.json Normal file
View File

@@ -0,0 +1,13 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=759670
// for the documentation about the jsconfig.json format
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"allowSyntheticDefaultImports": true
},
"exclude": [
"modules",
"node_modules"
]
}

View File

@@ -4,13 +4,13 @@ This document describes the way to develop your own MagicMirror² modules.
## Module structure
All modules are loaded in de `modules` folder. The default modules are grouped together in the `modules/default` folder. Your module should be placed in a subfolder of `modules`. Note that any file or folder your create in the `modules` folder will be ignored by git, allowing you to upgrade the MagicMirror² without the loss of your files.
All modules are loaded in the `modules` folder. The default modules are grouped together in the `modules/default` folder. Your module should be placed in a subfolder of `modules`. Note that any file or folder your create in the `modules` folder will be ignored by git, allowing you to upgrade the MagicMirror² without the loss of your files.
A module can be placed in one single folder. Or multiple modules can be grouped in a subfoler. Note that name of the module must be unique. Even when a module with a similar name is placed in a different folder, they can't be loaded at the same time.
A module can be placed in one single folder. Or multiple modules can be grouped in a subfolder. Note that name of the module must be unique. Even when a module with a similar name is placed in a different folder, they can't be loaded at the same time.
### Files
- **modulename/modulename.js** - This is your core module script.
- **modulename/node_helper.js** - This is an optional helper that whill be loaded by the node script. The node helper and module script can communicate with each other using an intergrated socket system.
- **modulename/node_helper.js** - This is an optional helper that will be loaded by the node script. The node helper and module script can communicate with each other using an intergrated socket system.
- **modulename/public** - Any files in this folder can be accesed via the browser on `/modulename/filename.ext`.
- **modulename/anyfileorfolder** Any other file or folder in the module folder can be used by the core module script. For example: *modulename/css/modulename.css* would be a good path for your additional module styles.
@@ -78,6 +78,19 @@ The data object contains additional metadata about the module instance:
####`defaults: {}`
Any properties defined in the defaults object, will be merged with the module config as defined in the user's config.js file. This is the best place to set your modules's configuration defaults. Any of the module configuration properties can be accessed using `this.config.propertyName`, but more about that later.
####'requiresVersion:'
*Introduced in version: 2.1.0.*
A string that defines the minimum version of the MagicMirror framework. If it is set, the system compares the required version with the users version. If the version of the user is out of date, it won't run the module. Make sure to also set this value in the Node helper.
**Note:** Since this check is introduced in version 2.1.0, this check will not be run in older versions. Keep this in mind if you get issue reports on your module.
Example:
````javascript
requiresVersion: "2.1.0",
````
### Subclassable module methods
####`init()`
@@ -104,7 +117,7 @@ The getScripts method is called to request any additional scripts that need to b
getScripts: function() {
return [
'script.js', // will try to load it from the vendor folder, otherwise it will load is from the module folder.
'moment.js', // this file is available in the vendor folder, so it doesn't need to be avialable in the module folder.
'moment.js', // this file is available in the vendor folder, so it doesn't need to be available in the module folder.
this.file('anotherfile.js'), // this file will be loaded straight from the module folder.
'https://code.jquery.com/jquery-2.2.3.min.js', // this file will be loaded from the jquery servers.
]
@@ -154,7 +167,7 @@ getTranslations: function() {
####`getDom()`
**Should return:** Dom Object
Whenever the MagicMirror needs to update the information on screen (because it starts, or because your module asked a refresh using `this.updateDom()`), the system calls the getDom method. This method should therefor return a dom object.
Whenever the MagicMirror needs to update the information on screen (because it starts, or because your module asked a refresh using `this.updateDom()`), the system calls the getDom method. This method should therefore return a dom object.
**Example:**
````javascript
@@ -166,6 +179,23 @@ getDom: function() {
````
####`getHeader()`
**Should return:** String
Whenever the MagicMirror needs to update the information on screen (because it starts, or because your module asked a refresh using `this.updateDom()`), the system calls the getHeader method to retrieve the module's header. This method should therefor return a string. If this method is not subclassed, this function will return the user's configured header.
If you want to use the original user's configured header, reference `this.data.header`.
**NOTE:** If the user did not configure a default header, no header will be displayed and thus this method will not be called.
**Example:**
````javascript
getHeader: function() {
return this.data.header + ' Foo Bar';
}
````
####`notificationReceived(notification, payload, sender)`
That MagicMirror core has the ability to send notifications to modules. Or even better: the modules have the possibility to send notifications to other modules. When this module is called, it has 3 arguments:
@@ -185,7 +215,7 @@ notificationReceived: function(notification, payload, sender) {
}
````
**Note:** the system sends two notifiations when starting up. These notifications could come in handy!
**Note:** the system sends two notifications when starting up. These notifications could come in handy!
- `ALL_MODULES_STARTED` - All modules are started. You can now send notifications to other modules.
@@ -198,8 +228,8 @@ When using a node_helper, the node helper can send your module notifications. Wh
- `notification` - String - The notification identifier.
- `payload` - AnyType - The payload of a notification.
**Note 1:** When a node helper send a notification, all modules of that module type receive the same notifications. <br>
**Note 2:** The socket connection is established as soon as the module sends it's first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
**Note 1:** When a node helper sends a notification, all modules of that module type receive the same notifications. <br>
**Note 2:** The socket connection is established as soon as the module sends its first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
**Example:**
````javascript
@@ -217,7 +247,7 @@ When a module will be shown after it was previously hidden (using the `module.sh
### Module instance methods
Each module instance has some handy methods which can be helpfull building your module.
Each module instance has some handy methods which can be helpful building your module.
####`this.file(filename)`
@@ -229,7 +259,7 @@ If you want to create a path to a file in your module folder, use the `file()` m
####`this.updateDom(speed)`
***speed* Number** - Optional. Animation speed in milliseconds.<br>
Whenever your module need to be updated, call the `updateDom(speed)` method. It requests the MagicMirror core to update it's dom object. If you define the speed, the content update will be animated, but only if the content will realy change.
Whenever your module need to be updated, call the `updateDom(speed)` method. It requests the MagicMirror core to update its dom object. If you define the speed, the content update will be animated, but only if the content will really change.
As an example: the clock modules calls this method every second:
@@ -248,7 +278,7 @@ start: function() {
***notification* String** - The notification identifier.<br>
***payload* AnyType** - Optional. A notification payload.<br>
If you want to send a notification to all other modules, use the `sendNotification(notification, payload)`. All other modules will receive the message via the [notificationReceived](#notificationreceivednotification-payload-sender) method. In that case, the sender is automaticly set to the instance calling the sendNotification method.
If you want to send a notification to all other modules, use the `sendNotification(notification, payload)`. All other modules will receive the message via the [notificationReceived](#notificationreceivednotification-payload-sender) method. In that case, the sender is automatically set to the instance calling the sendNotification method.
**Example:**
````javascript
@@ -259,33 +289,103 @@ this.sendNotification('MYMODULE_READY_FOR_ACTION', {foo:bar});
***notification* String** - The notification identifier.<br>
***payload* AnyType** - Optional. A notification payload.<br>
If you want to send a notification to the node_helper, use the `sendSocketNotification(notification, payload)`. Only the node_helper of this module will recieve the socket notification.
If you want to send a notification to the node_helper, use the `sendSocketNotification(notification, payload)`. Only the node_helper of this module will receive the socket notification.
**Example:**
````javascript
this.sendSocketNotification('SET_CONFIG', this.config);
````
####`this.hide(speed, callback)`
***speed* Number** - Optional, The speed of the hide animation in milliseconds.
####`this.hide(speed, callback, options)`
***speed* Number** - Optional (Required when setting callback or options), The speed of the hide animation in milliseconds.
***callback* Function** - Optional, The callback after the hide animation is finished.
***options* Function** - Optional, Object with additional options for the hide action (see below). (*Introduced in version: 2.1.0.*)
To hide a module, you can call the `hide(speed, callback)` method. You can call the hide method on the module instance itself using `this.hide()`, but of course you can also hide another module using `anOtherModule.hide()`.
Possible configurable options:
- `lockString` - String - When setting lock string, the module can not be shown without passing the correct lockstring. This way (multiple) modules can prevent a module from showing. It's considered best practice to use your modules identifier as the locksString: `this.identifier`. See *visibility locking* below.
To hide a module, you can call the `hide(speed, callback)` method. You can call the hide method on the module instance itselve using `this.hide()`, but of course you can also hide an other module using `anOtherModule.hide()`.
**Note 1:** If the hide animation is canceled, for instance because the show method is called before the hide animation was finished, the callback will not be called.<br>
**Note 2:** If the hide animation is hijacked (an other method calls hide on the same module), the callback will not be called.<br>
**Note 3:** If the dom is not yet created, the hide method won't work. Wait for the `DOM_OBJECTS_CREATED` [notification](#notificationreceivednotification-payload-sender).
####`this.show(speed, callback)`
***speed* Number** - Optional, The speed of the show animation in milliseconds.
***callback* Function** - Optional, The callback after the show animation is finished.
To show a module, you can call the `show(speed, callback)` method. You can call the show method on the module instance itselve using `this.show()`, but of course you can also show an other module using `anOtherModule.show()`.
####`this.show(speed, callback, options)`
***speed* Number** - Optional (Required when setting callback or options), The speed of the show animation in milliseconds.
***callback* Function** - Optional, The callback after the show animation is finished.
***options* Function** - Optional, Object with additional options for the show action (see below). (*Introduced in version: 2.1.0.*)
To show a module, you can call the `show(speed, callback)` method. You can call the show method on the module instance itself using `this.show()`, but of course you can also show another module using `anOtherModule.show()`.
Possible configurable options:
- `lockString` - String - When setting lock string, the module can not be shown without passing the correct lockstring. This way (multiple) modules can prevent a module from showing. See *visibility locking* below.
- `force` - Boolean - When setting the force tag to `true`, the locking mechanism will be overwritten. Use this option with caution. It's considered best practice to let the usage of the force option be use- configurable. See *visibility locking* below.
**Note 1:** If the show animation is canceled, for instance because the hide method is called before the show animation was finished, the callback will not be called.<br>
**Note 2:** If the show animation is hijacked (an other method calls show on the same module), the callback will not be called.<br>
**Note 3:** If the dom is not yet created, the show method won't work. Wait for the `DOM_OBJECTS_CREATED` [notification](#notificationreceivednotification-payload-sender).
####Visibility locking
(*Introduced in version: 2.1.0.*)
Visiblity locking helps the module system to prevent unwanted hide/show actions. The following scenario explains the concept:
**Module B asks module A to hide:**
````javascript
moduleA.hide(0, {lockString: "module_b_identifier"});
````
Module A is now hidden, and has an lock array with the following strings:
````javascript
moduleA.lockStrings == ["module_b_identifier"]
moduleA.hidden == true
````
**Module C asks module A to hide:**
````javascript
moduleA.hide(0, {lockString: "module_c_identifier"});
````
Module A is now hidden, and has an lock array with the following strings:
````javascript
moduleA.lockStrings == ["module_b_identifier", "module_c_identifier"]
moduleA.hidden == true
````
**Module B asks module A to show:**
````javascript
moduleA.show(0, {lockString: "module_b_identifier"});
````
The lockString will be removed from moduleAs locks array, but since there still is an other lock string available, the module remains hidden:
````javascript
moduleA.lockStrings == ["module_c_identifier"]
moduleA.hidden == true
````
**Module C asks module A to show:**
````javascript
moduleA.show(0, {lockString: "module_c_identifier"});
````
The lockString will be removed from moduleAs locks array, and since this will result in an empty lock array, the module will be visible:
````javascript
moduleA.lockStrings == []
moduleA.hidden == false
````
**Note:** The locking mechanism can be overwritten by using the force tag:
````javascript
moduleA.show(0, {force: true});
````
This will reset the lockstring array, and will show the module.
````javascript
moduleA.lockStrings == []
moduleA.hidden == false
````
Use this `force` method with caution. See `show()` method for more information.
####`this.translate(identifier)`
***identifier* String** - Identifier of the string that should be translated.
@@ -298,7 +398,7 @@ If no translation is found, a fallback will be used. The fallback sequence is as
- 4. Translation as defined in core translation file of the fallback language (the first defined core translation file).
- 5. The key (identifier) of the translation.
When adding translations to your module, it's a good idea to see if an apropriate translation is already available in the [core translation files](https://github.com/MichMich/MagicMirror/tree/master/translations). This way, your module can benefit from the exsisting translations.
When adding translations to your module, it's a good idea to see if an apropriate translation is already available in the [core translation files](https://github.com/MichMich/MagicMirror/tree/master/translations). This way, your module can benefit from the existing translations.
**Example:**
````javascript
@@ -328,7 +428,7 @@ var NodeHelper = require("node_helper");
module.exports = NodeHelper.create({});
````
Of course, the above helper would not do anything usefull. So with the information above, you should be able to make it a bit more sophisticated.
Of course, the above helper would not do anything useful. So with the information above, you should be able to make it a bit more sophisticated.
### Available module instance properties
@@ -356,7 +456,7 @@ start: function() {
}
````
**Note: ** By default, a public path to your module's public folder will be created:
**Note:** By default, a public path to your module's public folder will be created:
````javascript
this.expressApp.use("/" + this.name, express.static(this.path + "/public"));
````
@@ -366,13 +466,26 @@ this.expressApp.use("/" + this.name, express.static(this.path + "/public"));
This is a link to the IO instance. It will allow you to do some Socket.IO magic. In most cases you won't need this, since the Node Helper has a few convenience methods to make this simple.
####'requiresVersion:'
*Introduced in version: 2.1.0.*
A string that defines the minimum version of the MagicMirror framework. If it is set, the system compares the required version with the users version. If the version of the user is out of date, it won't run the module.
**Note:** Since this check is introduced in version 2.1.0, this check will not be run in older versions. Keep this in mind if you get issue reports on your module.
Example:
````javascript
requiresVersion: "2.1.0",
````
### Subclassable module methods
####`init()`
This method is called when a node helper gets instantiated. In most cases you do not need to subclass this method.
####`start()`
This method is called when all node helper are loaded an the system is ready to boot up. The start method is a perfect place to define any additional module properties:
This method is called when all node helpers are loaded and the system is ready to boot up. The start method is a perfect place to define any additional module properties:
**Example:**
````javascript
@@ -383,12 +496,12 @@ start: function() {
````
####`socketNotificationReceived: function(notification, payload)`
With this method, your node helper can receive notifications form your modules. When this method is called, it has 2 arguments:
With this method, your node helper can receive notifications from your modules. When this method is called, it has 2 arguments:
- `notification` - String - The notification identifier.
- `payload` - AnyType - The payload of a notification.
**Note:** The socket connection is established as soon as the module sends it's first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
**Note:** The socket connection is established as soon as the module sends its first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
**Example:**
````javascript
@@ -399,15 +512,15 @@ socketNotificationReceived: function(notification, payload) {
### Module instance methods
Each node helper has some handy methods which can be helpfull building your module.
Each node helper has some handy methods which can be helpful building your module.
####`this.sendSocketNotification(notification, payload)`
***notification* String** - The notification identifier.<br>
***payload* AnyType** - Optional. A notification payload.<br>
If you want to send a notification to all your modules, use the `sendSocketNotification(notification, payload)`. Only the module of your module type will recieve the socket notification.
If you want to send a notification to all your modules, use the `sendSocketNotification(notification, payload)`. Only the module of your module type will receive the socket notification.
**Note:** Since all instances of you module will receive the notifications, it's your task to make sure the right module responds to your messages.
**Note:** Since all instances of your module will receive the notifications, it's your task to make sure the right module responds to your messages.
**Example:**
````javascript
@@ -430,10 +543,10 @@ To make a selection of all currently loaded module instances, run the `MM.getMod
#####`.withClass(classnames)`
***classnames* String or Array** - The class names on which you want to filer.
***classnames* String or Array** - The class names on which you want to filter.
**Returns Array** - An array with module instances.<br>
If you want to make a selection based on one ore more class names, use the withClass method on a result of the `MM.getModules()` method. The argument of the `withClass(classname)` method can be an array, or space separated string.
If you want to make a selection based on one or more class names, use the withClass method on a result of the `MM.getModules()` method. The argument of the `withClass(classname)` method can be an array, or space separated string.
**Examples:**
````javascript
@@ -459,7 +572,7 @@ var modules = MM.getModules().exceptWithClass(['classname1','classname2']);
***module* Module Object** - The reference to a module you want to remove from the results.
**Returns Array** - An array with module instances.<br>
If you to remove a specific module instance from a selection based on a classname, use the exceptWithClass method on a result of the `MM.getModules()` method. This can be helpfull if you want to select all module instances except the instance of your module.
If you to remove a specific module instance from a selection based on a classname, use the exceptWithClass method on a result of the `MM.getModules()` method. This can be helpful if you want to select all module instances except the instance of your module.
**Examples:**
````javascript

View File

@@ -45,9 +45,9 @@ The following properties can be configured:
</tr>
<tr>
<td><code>display_time</code></td>
<td>Time a notification is displayed in seconds.<br>
<br><b>Possible values:</b> <code>float</code> <code>int</code>
<br><b>Default value:</b> <code>3.5</code>
<td>Time a notification is displayed in milliseconds.<br>
<br><b>Possible values:</b> <code>int</code>
<br><b>Default value:</b> <code>3500</code>
</td>
</tr>
<tr>
@@ -62,7 +62,7 @@ The following properties can be configured:
<td><code>welcome_message</code></td>
<td>Message shown at startup.<br>
<br><b>Possible values:</b> <code>string</code> <code>false</code>
<br><b>Default value:</b> <code>Welcome, start was successfull!</code>
<br><b>Default value:</b> <code>false</code> (no message at startup)
</td>
</tr>
</tbody>
@@ -162,4 +162,4 @@ self.sendNotification("SHOW_ALERT", {});
## Open Source Licenses
###[NotificationStyles](https://github.com/codrops/NotificationStyles)
See [ympanus.net](http://tympanus.net/codrops/licensing/) for license.
See [ympanus.net](http://tympanus.net/codrops/licensing/) for license.

View File

@@ -35,9 +35,19 @@ Module.register("alert",{
},
show_notification: function(message) {
if (this.config.effect == "slide") {this.config.effect = this.config.effect + "-" + this.config.position;}
message = "<span class='thin' style='line-height: 35px; font-size:24px' color='#4A4A4A'>" + message.title + "</span><br /><span class='light' style='font-size:28px;line-height: 30px;'>" + message.message + "</span>";
msg = "";
if (message.title) {
msg += "<span class='thin' style='line-height: 35px; font-size:24px' color='#4A4A4A'>" + message.title + "</span>";
}
if (message.message){
if (msg != ""){
msg+= "<br />";
}
msg += "<span class='light' style='font-size:28px;line-height: 30px;'>" + message.message + "</span>";
}
new NotificationFx({
message: message,
message: msg,
layout: "growl",
effect: this.config.effect,
ttl: this.config.display_time
@@ -67,7 +77,19 @@ Module.register("alert",{
this.hide_alert(sender);
}
message = "<span class='light' style='line-height: 35px; font-size:30px' color='#4A4A4A'>" + params.title + "</span><br /><span class='thin' style='font-size:22px;line-height: 30px;'>" + params.message + "</span>";
//Display title and message only if they are provided in notification parameters
message ="";
if (params.title) {
message += "<span class='light' style='line-height: 35px; font-size:30px' color='#4A4A4A'>" + params.title + "</span>"
}
if (params.message) {
if (message != ""){
message += "<br />";
}
message += "<span class='thin' style='font-size:22px;line-height: 30px;'>" + params.message + "</span>";
}
//Store alert in this.alerts
this.alerts[sender.name] = new NotificationFx({
message: image + message,

View File

@@ -0,0 +1,4 @@
{
"sysTitle": "MagicMirror Notifikation",
"welcome": "Velkommen, modulet er succesfuldt startet!"
}

View File

@@ -0,0 +1,4 @@
{
"sysTitle": "MagicMirror Notificaciones",
"welcome": "Bienvenido, ¡se iniciado correctamente!"
}

View File

@@ -106,10 +106,16 @@ The following properties can be configured:
<td><code>titleReplace</code></td>
<td>An object of textual replacements applied to the tile of the event. This allow to remove or replace certains words in the title.<br>
<br><b>Example:</b> <br>
<code>
titleReplace: {'Birthday of ' : '', 'foo':'bar'}
</code>
<br><b>Default value:</b>
<code>
{
"De verjaardag van ": "",
"'s birthday": ""
}
</code>
</td>
</tr>
<tr>
@@ -119,6 +125,13 @@ The following properties can be configured:
<br><b>Default value:</b> <code>false</code>
</td>
</tr>
<tr>
<td><code>dateFormat</code></td>
<td>Format to use for the date of events (when using absolute dates)<br>
<br><b>Possible values:</b> See <a href="http://momentjs.com/docs/#/parsing/string-format/">Moment.js formats</a>
<br><b>Default value:</b> <code>MMM Do</code> (e.g. Jan 18th)
</td>
</tr>
<tr>
<td><code>timeFormat</code></td>
<td>Display event times as absolute dates, or relative time<br>
@@ -126,12 +139,33 @@ The following properties can be configured:
<br><b>Default value:</b> <code>relative</code>
</td>
</tr>
<tr>
<td><code>getRelative</code></td>
<td>How much time (in hours) should be left until calendar events start getting relative?<br>
<br><b>Possible values:</b> <code>0</code> (events stay absolute) - <code>48</code> (48 hours before the event starts)
<br><b>Default value:</b> <code>6</code>
</td>
</tr>
<tr>
<td><code>urgency</code></td>
<td>When using a timeFormat of <code>absolute</code>, the <code>urgency</code> setting allows you to display events within a specific time frame as <code>relative</code>
This allows events within a certain time frame to be displayed as relative (in xx days) while others are displayed as absolute dates<br>
<br><b>Possible values:</b> a positive integer representing the number of days for which you want a relative date, for example <code>7</code> (for 7 days)<br>
<br><b>Default value:</b> <code>0</code> (disabled)
<br><b>Default value:</b> <code>7</code>
</td>
</tr>
<tr>
<td><code>broadcastEvents</code></td>
<td>If this property is set to true, the calendar will broadcast all the events to all other modules with the notification message: <code>CALENDAR_EVENTS</code>. The event objects are stored in an array and contain the following fields: <code>title</code>, <code>startDate</code>, <code>endDate</code>, <code>fullDayEvent</code>, <code>location</code> and <code>geo</code>.<br>
<br><b>Possible values:</b> <code>true</code>, <code>false</code> <br>
<br><b>Default value:</b> <code>true</code>
</td>
</tr>
<tr>
<td><code>hidePrivate</code></td>
<td>Hides private calendar events.<br>
<br><b>Possible values:</b> <code>true</code> or <code>false</code>
<br><b>Default value:</b> <code>false</code>
</td>
</tr>
</tbody>
@@ -171,17 +205,25 @@ config: {
</td>
</tr>
<tr>
<td><code> symbol </code></td>
<td><code>symbol</code></td>
<td>The symbol to show in front of an event. This property is optional.<br>
<br><b>Possible values:</b> See <a href="http://fontawesome.io/icons/" target="_blank">Font Awsome</a> website.
<br><b>Possible values:</b> See <a href="http://fontawesome.io/icons/" target="_blank">Font Awesome</a> website.
</td>
</tr>
<tr>
<td><code> repeatingCountTitle </code></td>
<td><code>repeatingCountTitle</code></td>
<td>The count title for yearly repating events in this calendar. <br>
<br><b>Example:</b> <br>
<code>'Birthday'</code>
</td>
</tr>
<tr>
<td><code>user</code></td>
<td>The username for HTTP Basic authentication.</td>
</tr>
<tr>
<td><code>pass</code></td>
<td>The password for HTTP Basic authentication.</td>
</tr>
</tbody>
</table>

View File

@@ -7,7 +7,7 @@
* MIT Licensed.
*/
Module.register("calendar",{
Module.register("calendar", {
// Define module defaults
defaults: {
@@ -16,14 +16,17 @@ Module.register("calendar",{
displaySymbol: true,
defaultSymbol: "calendar", // Fontawesome Symbol see http://fontawesome.io/cheatsheet/
displayRepeatingCountTitle: false,
defaultRepeatingCountTitle: '',
defaultRepeatingCountTitle: "",
maxTitleLength: 25,
fetchInterval: 5 * 60 * 1000, // Update every 5 minutes.
animationSpeed: 2000,
fade: true,
urgency: 7,
timeFormat: "relative",
dateFormat: "MMM Do",
getRelative: 6,
fadePoint: 0.25, // Start on 1/4th of the list.
hidePrivate: false,
calendars: [
{
symbol: "calendar",
@@ -31,30 +34,32 @@ Module.register("calendar",{
},
],
titleReplace: {
"De verjaardag van ": ""
"De verjaardag van ": "",
"'s birthday": ""
},
broadcastEvents: true
},
// Define required scripts.
getStyles: function() {
getStyles: function () {
return ["calendar.css", "font-awesome.css"];
},
// Define required scripts.
getScripts: function() {
getScripts: function () {
return ["moment.js"];
},
// Define required translations.
getTranslations: function() {
getTranslations: function () {
// The translations for the defaut modules are defined in the core translation files.
// Therefor we can just return false. Otherwise we should have returned a dictionairy.
// If you're trying to build yiur own module including translations, check out the documentation.
// If you're trying to build your own module including translations, check out the documentation.
return false;
},
// Override start method.
start: function() {
start: function () {
Log.log("Starting module: " + this.name);
// Set locale.
@@ -63,7 +68,7 @@ Module.register("calendar",{
for (var c in this.config.calendars) {
var calendar = this.config.calendars[c];
calendar.url = calendar.url.replace("webcal://", "http://");
this.addCalendar(calendar.url);
this.addCalendar(calendar.url, calendar.user, calendar.pass);
}
this.calendarData = {};
@@ -71,11 +76,15 @@ Module.register("calendar",{
},
// Override socket notification handler.
socketNotificationReceived: function(notification, payload) {
socketNotificationReceived: function (notification, payload) {
if (notification === "CALENDAR_EVENTS") {
if (this.hasCalendarURL(payload.url)) {
this.calendarData[payload.url] = payload.events;
this.loaded = true;
if (this.config.broadcastEvents) {
this.broadcastEvents();
}
}
} else if (notification === "FETCH_ERROR") {
Log.error("Calendar Error. Could not fetch calendar: " + payload.url);
@@ -89,7 +98,7 @@ Module.register("calendar",{
},
// Override dom generator.
getDom: function() {
getDom: function () {
var events = this.createEventList();
var wrapper = document.createElement("table");
@@ -108,27 +117,27 @@ Module.register("calendar",{
eventWrapper.className = "normal";
if (this.config.displaySymbol) {
var symbolWrapper = document.createElement("td");
var symbolWrapper = document.createElement("td");
symbolWrapper.className = "symbol";
var symbol = document.createElement("span");
var symbol = document.createElement("span");
symbol.className = "fa fa-" + this.symbolForUrl(event.url);
symbolWrapper.appendChild(symbol);
eventWrapper.appendChild(symbolWrapper);
}
var titleWrapper = document.createElement("td"),
repeatingCountTitle = '';
repeatingCountTitle = "";
if (this.config.displayRepeatingCountTitle) {
repeatingCountTitle = this.countTitleForUrl(event.url);
if(repeatingCountTitle !== '') {
var thisYear = new Date().getFullYear(),
if (repeatingCountTitle !== "") {
var thisYear = new Date(parseInt(event.startDate)).getFullYear(),
yearDiff = thisYear - event.firstYear;
repeatingCountTitle = ', '+ yearDiff + '. ' + repeatingCountTitle;
repeatingCountTitle = ", " + yearDiff + ". " + repeatingCountTitle;
}
}
@@ -136,19 +145,25 @@ Module.register("calendar",{
titleWrapper.className = "title bright";
eventWrapper.appendChild(titleWrapper);
var timeWrapper = document.createElement("td");
var timeWrapper = document.createElement("td");
//console.log(event.today);
var now = new Date();
// Define second, minute, hour, and day variables
var one_second = 1000; // 1,000 milliseconds
var one_minute = one_second * 60;
var one_hour = one_minute * 60;
var one_day = one_hour * 24;
var oneSecond = 1000; // 1,000 milliseconds
var oneMinute = oneSecond * 60;
var oneHour = oneMinute * 60;
var oneDay = oneHour * 24;
if (event.fullDayEvent) {
if (event.today) {
timeWrapper.innerHTML = this.translate("TODAY");
} else if (event.startDate - now < one_day && event.startDate - now > 0) {
timeWrapper.innerHTML = this.translate("TOMORROW");
timeWrapper.innerHTML = this.capFirst(this.translate("TODAY"));
} else if (event.startDate - now < oneDay && event.startDate - now > 0) {
timeWrapper.innerHTML = this.capFirst(this.translate("TOMORROW"));
} else if (event.startDate - now < 2 * oneDay && event.startDate - now > 0) {
if (this.translate("DAYAFTERTOMORROW") !== "DAYAFTERTOMORROW") {
timeWrapper.innerHTML = this.capFirst(this.translate("DAYAFTERTOMORROW"));
} else {
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
}
} else {
/* Check to see if the user displays absolute or relative dates with their events
* Also check to see if an event is happening within an 'urgency' time frameElement
@@ -158,26 +173,26 @@ Module.register("calendar",{
* Note: this needs to be put in its own function, as the whole thing repeats again verbatim
*/
if (this.config.timeFormat === "absolute") {
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * one_day))) {
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * oneDay))) {
// This event falls within the config.urgency period that the user has set
timeWrapper.innerHTML = moment(event.startDate, "x").fromNow();
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} else {
timeWrapper.innerHTML = moment(event.startDate, "x").format("MMM Do");
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat));
}
} else {
timeWrapper.innerHTML = moment(event.startDate, "x").fromNow();
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
}
}
} else {
if (event.startDate >= new Date()) {
if (event.startDate - now < 2 * one_day) {
if (event.startDate - now < 2 * oneDay) {
// This event is within the next 48 hours (2 days)
if (event.startDate - now < 6 * one_hour) {
if (event.startDate - now < this.config.getRelative * oneHour) {
// If event is within 6 hour, display 'in xxx' time format or moment.fromNow()
timeWrapper.innerHTML = moment(event.startDate, "x").fromNow();
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} else {
// Otherwise just say 'Today/Tomorrow at such-n-such time'
timeWrapper.innerHTML = moment(event.startDate, "x").calendar();
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").calendar());
}
} else {
/* Check to see if the user displays absolute or relative dates with their events
@@ -188,18 +203,18 @@ Module.register("calendar",{
* Note: this needs to be put in its own function, as the whole thing repeats again verbatim
*/
if (this.config.timeFormat === "absolute") {
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * one_day))) {
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * oneDay))) {
// This event falls within the config.urgency period that the user has set
timeWrapper.innerHTML = moment(event.startDate, "x").fromNow();
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} else {
timeWrapper.innerHTML = moment(event.startDate, "x").format("MMM Do");
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat));
}
} else {
timeWrapper.innerHTML = moment(event.startDate, "x").fromNow();
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
}
}
} else {
timeWrapper.innerHTML = this.translate("RUNNING") + ' ' + moment(event.endDate,"x").fromNow(true);
timeWrapper.innerHTML = this.capFirst(this.translate("RUNNING")) + " " + moment(event.endDate, "x").fromNow(true);
}
}
//timeWrapper.innerHTML += ' - '+ moment(event.startDate,'x').format('lll');
@@ -233,7 +248,7 @@ Module.register("calendar",{
*
* return bool - Has calendar url
*/
hasCalendarURL: function(url) {
hasCalendarURL: function (url) {
for (var c in this.config.calendars) {
var calendar = this.config.calendars[c];
if (calendar.url === url) {
@@ -249,20 +264,26 @@ Module.register("calendar",{
*
* return array - Array with events.
*/
createEventList: function() {
createEventList: function () {
var events = [];
var today = moment().startOf("day");
for (var c in this.calendarData) {
var calendar = this.calendarData[c];
for (var e in calendar) {
var event = calendar[e];
if(this.config.hidePrivate) {
if(event.class === "PRIVATE") {
// do not add the current event, skip it
continue;
}
}
event.url = c;
event.today = event.startDate >= today && event.startDate < (today + 24 * 60 * 60 * 1000);
events.push(event);
}
}
events.sort(function(a, b) {
events.sort(function (a, b) {
return a.startDate - b.startDate;
});
@@ -274,12 +295,14 @@ Module.register("calendar",{
*
* argument url sting - Url to add.
*/
addCalendar: function(url) {
addCalendar: function (url, user, pass) {
this.sendSocketNotification("ADD_CALENDAR", {
url: url,
maximumEntries: this.config.maximumEntries,
maximumNumberOfDays: this.config.maximumNumberOfDays,
fetchInterval: this.config.fetchInterval
fetchInterval: this.config.fetchInterval,
user: user,
pass: pass
});
},
@@ -290,10 +313,10 @@ Module.register("calendar",{
*
* return string - The Symbol
*/
symbolForUrl: function(url) {
symbolForUrl: function (url) {
for (var c in this.config.calendars) {
var calendar = this.config.calendars[c];
if (calendar.url === url && typeof calendar.symbol === "string") {
if (calendar.url === url && typeof calendar.symbol === "string") {
return calendar.symbol;
}
}
@@ -307,10 +330,10 @@ Module.register("calendar",{
*
* return string - The Symbol
*/
countTitleForUrl: function(url) {
countTitleForUrl: function (url) {
for (var c in this.config.calendars) {
var calendar = this.config.calendars[c];
if (calendar.url === url && typeof calendar.repeatingCountTitle === "string") {
if (calendar.url === url && typeof calendar.repeatingCountTitle === "string") {
return calendar.repeatingCountTitle;
}
}
@@ -327,14 +350,23 @@ Module.register("calendar",{
*
* return string - The shortened string.
*/
shorten: function(string, maxLength) {
shorten: function (string, maxLength) {
if (string.length > maxLength) {
return string.slice(0,maxLength) + "&hellip;";
return string.slice(0, maxLength) + "&hellip;";
}
return string;
},
/* capFirst(string)
* Capitalize the first letter of a string
* Eeturn capitalized string
*/
capFirst: function (string) {
return string.charAt(0).toUpperCase() + string.slice(1);
},
/* titleTransform(title)
* Transforms the title of an event for usage.
* Replaces parts of the text as defined in config.titleReplace.
@@ -344,7 +376,7 @@ Module.register("calendar",{
*
* return string - The transformed title.
*/
titleTransform: function(title) {
titleTransform: function (title) {
for (var needle in this.config.titleReplace) {
var replacement = this.config.titleReplace[needle];
title = title.replace(needle, replacement);
@@ -352,5 +384,28 @@ Module.register("calendar",{
title = this.shorten(title, this.config.maxTitleLength);
return title;
},
/* broadcastEvents()
* Broadcasts the events to all other modules for reuse.
* The all events available in one array, sorted on startdate.
*/
broadcastEvents: function () {
var eventList = [];
for (url in this.calendarData) {
var calendar = this.calendarData[url];
for (e in calendar) {
var event = cloneObject(calendar[e]);
delete event.url;
eventList.push(event);
}
}
eventList.sort(function(a,b) {
return a.startDate - b.startDate;
});
this.sendNotification("CALENDAR_EVENTS", eventList);
}
});

View File

@@ -8,7 +8,7 @@
var ical = require("./vendor/ical.js");
var moment = require("moment");
var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumberOfDays) {
var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumberOfDays, user, pass) {
var self = this;
var reloadTimer = null;
@@ -25,7 +25,22 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
clearTimeout(reloadTimer);
reloadTimer = null;
ical.fromURL(url, {}, function(err, data) {
nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]);
var opts = {
headers: {
"User-Agent": "Mozilla/5.0 (Node.js "+ nodeVersion + ") MagicMirror/" + global.version + " (https://github.com/MichMich/MagicMirror/)"
}
};
if (user && pass) {
opts.auth = {
user: user,
pass: pass,
sendImmediately: true
}
}
ical.fromURL(url, opts, function(err, data) {
if (err) {
fetchFailedCallback(self, err);
scheduleTimer();
@@ -63,10 +78,11 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
if (!isFacebookBirthday) {
endDate = startDate;
} else {
endDate = moment(startDate).add(1, 'days');
endDate = moment(startDate).add(1, "days");
}
}
// calculate the duration f the event for use with recurring events.
var duration = parseInt(endDate.format("x")) - parseInt(startDate.format("x"));
@@ -81,20 +97,28 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
title = event.description;
}
var location = event.location || false;
var geo = event.geo || false;
var description = event.description || false;
if (typeof event.rrule != "undefined" && !isFacebookBirthday) {
var rule = event.rrule;
var dates = rule.between(today, future, true, limitFunction);
for (var d in dates) {
startDate = moment(new Date(dates[d]));
endDate = moment(parseInt(startDate.format("x")) + duration, 'x');
endDate = moment(parseInt(startDate.format("x")) + duration, "x");
if (endDate.format("x") > now) {
newEvents.push({
title: title,
startDate: startDate.format("x"),
endDate: endDate.format("x"),
fullDayEvent: isFullDayEvent(event),
firstYear: event.start.getFullYear()
class: event.class,
firstYear: event.start.getFullYear(),
location: location,
geo: geo,
description: description
});
}
}
@@ -118,14 +142,19 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
continue;
}
// Every thing is good. Add it to the list.
// Every thing is good. Add it to the list.
newEvents.push({
title: title,
startDate: startDate.format("x"),
endDate: endDate.format("x"),
fullDayEvent: fullDayEvent
fullDayEvent: fullDayEvent,
class: event.class,
location: location,
geo: geo,
description: description
});
}
}
}
@@ -172,7 +201,7 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
if (end - start === 24 * 60 * 60 * 1000 && startDate.getHours() === 0 && startDate.getMinutes() === 0) {
// Is 24 hours, and starts on the middle of the night.
return true;
return true;
}
return false;
@@ -188,7 +217,7 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
};
/* broadcastItems()
* Broadcast the exsisting events.
* Broadcast the existing events.
*/
this.broadcastEvents = function() {
//console.log('Broadcasting ' + events.length + ' events.');
@@ -234,4 +263,4 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
};
module.exports = CalendarFetcher;
module.exports = CalendarFetcher;

View File

@@ -1,5 +1,5 @@
/* CalendarFetcher Tester
* use this script with `node debug.js` to test the fetcher without the need
* use this script with `node debug.js` to test the fetcher without the need
* of starting the MagicMirror core. Adjust the values below to your desire.
*
* By Michael Teeuw http://michaelteeuw.nl
@@ -8,18 +8,18 @@
var CalendarFetcher = require("./calendarfetcher.js");
var url = 'https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics';
var url = "https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics";
var fetchInterval = 60 * 60 * 1000;
var maximumEntries = 10;
var maximumNumberOfDays = 365;
console.log('Create fetcher ...');
console.log("Create fetcher ...");
fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays);
fetcher.onReceive(function(fetcher) {
console.log(fetcher.events());
console.log('------------------------------------------------------------');
console.log(fetcher.events());
console.log("------------------------------------------------------------");
});
fetcher.onError(function(fetcher, error) {
@@ -29,5 +29,4 @@ fetcher.onError(function(fetcher, error) {
fetcher.startFetch();
console.log('Create fetcher done! ');
console.log("Create fetcher done! ");

View File

@@ -25,19 +25,19 @@ module.exports = NodeHelper.create({
socketNotificationReceived: function(notification, payload) {
if (notification === "ADD_CALENDAR") {
//console.log('ADD_CALENDAR: ');
this.createFetcher(payload.url, payload.fetchInterval, payload.maximumEntries, payload.maximumNumberOfDays);
this.createFetcher(payload.url, payload.fetchInterval, payload.maximumEntries, payload.maximumNumberOfDays, payload.user, payload.pass);
}
},
/* createFetcher(url, reloadInterval)
* Creates a fetcher for a new url if it doesn't exsist yet.
* Otherwise it reuses the exsisting one.
* Creates a fetcher for a new url if it doesn't exist yet.
* Otherwise it reuses the existing one.
*
* attribute url string - URL of the news feed.
* attribute reloadInterval number - Reload interval in milliseconds.
*/
createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays) {
createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays, user, pass) {
var self = this;
if (!validUrl.isUri(url)) {
@@ -48,7 +48,7 @@ module.exports = NodeHelper.create({
var fetcher;
if (typeof self.fetchers[url] === "undefined") {
console.log("Create new calendar fetcher for url: " + url + " - Interval: " + fetchInterval);
fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays);
fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays, user, pass);
fetcher.onReceive(function(fetcher) {
//console.log('Broadcast events.');
@@ -69,7 +69,7 @@ module.exports = NodeHelper.create({
self.fetchers[url] = fetcher;
} else {
//console.log('Use exsisting news fetcher for url: ' + url);
//console.log('Use existing news fetcher for url: ' + url);
fetcher = self.fetchers[url];
fetcher.broadcastEvents();
}

View File

@@ -66,5 +66,62 @@ The following properties can be configured:
<br><b>Default value:</b> <code>false</code>
</td>
</tr>
<tr>
<td><code>showDate</code></td>
<td>Turn off or on the Date section.<br>
<br><b>Possible values:</b> <code>true</code> or <code>false</code>
<br><b>Default value:</b> <code>true</code>
</td>
</tr>
<tr>
<td><code>displayType</code></td>
<td>Display a digital clock, analog clock, or both together.<br>
<br><b>Possible values:</b> <code>digital</code>, <code>analog</code>, or <code>both</code>
<br><b>Default value:</b> <code>digital</code>
</td>
</tr>
<tr>
<td><code>analogSize</code></td>
<td><strong>Specific to the analog clock.</strong> Defines how large the analog display is.<br>
<br><b>Possible values:</b> A positive number of pixels</code>
<br><b>Default value:</b> <code>200px</code>
</td>
</tr>
<tr>
<td><code>analogFace</code></td>
<td><strong>Specific to the analog clock.</strong> Specifies which clock face to use.<br>
<br><b>Possible values:</b> <code>simple</code> for a simple border, <code>none</code> for no face or border, or <code>face-###</code> (where ### is currently a value between 001 and 012, inclusive)
<br><b>Default value:</b> <code>simple</code>
</td>
</tr>
<tr>
<td><code>secondsColor</code></td>
<td><strong>Specific to the analog clock.</strong> Specifies what color to make the 'seconds' hand.<br>
<br><b>Possible values:</b> <code>any HTML RGB Color</code>
<br><b>Default value:</b> <code>#888888</code>
</td>
</tr>
<tr>
<td><code>analogPlacement</code></td>
<td><strong>Specific to the analog clock. <em>(requires displayType set to <code>'both'</code>)</em></strong> Specifies where the analog clock is in relation to the digital clock<br>
<br><b>Possible values:</b> <code>top</code>, <code>right</code>, <code>bottom</code>, or <code>left</code>
<br><b>Default value:</b> <code>bottom</code>
</td>
</tr>
<tr>
<td><code>analogShowDate</code></td>
<td><strong>Specific to the analog clock.</strong> If the clock is used as a separate module and set to analog only, this configures whether a date is also displayed with the clock.<br>
<br><b>Possible values:</b> <code>false</code>, <code>top</code>, or <code>bottom</code>
<br><b>Default value:</b> <code>top</code>
</td>
</tr>
<tr>
<td><code>timezone</code></td>
<td>Specific a timezone to show clock.<br>
<br><b>Possible examples values:</b> <code>America/New_York</code>, <code>America/Santiago</code>, <code>Etc/GMT+10</code>
<br><b>Default value:</b> <code>none</code>
</td>
</tr>
</tbody>
</table>

View File

@@ -8,31 +8,54 @@
Module.register("clock",{
// Module config defaults.
defaults: {
displayType: "digital", // options: digital, analog, both
timeFormat: config.timeFormat,
displaySeconds: true,
showPeriod: true,
showPeriodUpper: false,
clockBold: false
clockBold: false,
showDate: true,
/* specific to the analog clock */
analogSize: "200px",
analogFace: "simple", // options: 'none', 'simple', 'face-###' (where ### is 001 to 012 inclusive)
analogPlacement: "bottom", // options: 'top', 'bottom', 'left', 'right'
analogShowDate: "top", // options: false, 'top', or 'bottom'
secondsColor: "#888888",
timezone: null,
},
// Define required scripts.
getScripts: function() {
return ["moment.js"];
return ["moment.js", "moment-timezone.js"];
},
// Define styles.
getStyles: function() {
return ["clock_styles.css"];
},
// Define start sequence.
start: function() {
Log.info("Starting module: " + this.name);
// Schedule update interval.
var self = this;
setInterval(function() {
self.updateDom();
}, 1000);
// Set locale.
moment.locale(config.language);
},
// Override dom generator.
getDom: function() {
// Create wrappers.
var wrapper = document.createElement("div");
/************************************
* Create wrappers for DIGITAL clock
*/
var dateWrapper = document.createElement("div");
var timeWrapper = document.createElement("div");
var secondsWrapper = document.createElement("sup");
@@ -47,10 +70,14 @@ Module.register("clock",{
// So we need to generate the timestring manually.
// See issue: https://github.com/MichMich/MagicMirror/issues/181
var timeString;
var now = moment();
if (this.config.timezone) {
now.tz(this.config.timezone);
}
if (this.config.clockBold === true) {
timeString = moment().format("HH[<span class=\"bold\">]mm[</span>]");
timeString = now.format("HH[<span class=\"bold\">]mm[</span>]");
} else {
timeString = moment().format("HH:mm");
timeString = now.format("HH:mm");
}
if (this.config.timeFormat !== 24) {
@@ -58,29 +85,147 @@ Module.register("clock",{
// var hours = now.getHours() % 12 || 12;
if (this.config.clockBold === true) {
//timeString = hours + moment().format("[<span class=\"bold\">]mm[</span>]");
timeString = moment().format("h[<span class=\"bold\">]mm[</span>]");
timeString = now.format("h[<span class=\"bold\">]mm[</span>]");
} else {
//timeString = hours + moment().format(":mm");
timeString = moment().format("h:mm");
timeString = now.format("h:mm");
}
}
dateWrapper.innerHTML = moment().format("dddd, LL");
timeWrapper.innerHTML = timeString;
secondsWrapper.innerHTML = moment().format("ss");
if (this.config.showPeriodUpper) {
periodWrapper.innerHTML = moment().format("A");
} else {
periodWrapper.innerHTML = moment().format("a");
if(this.config.showDate){
dateWrapper.innerHTML = now.format("dddd, LL");
}
timeWrapper.innerHTML = timeString;
secondsWrapper.innerHTML = now.format("ss");
if (this.config.showPeriodUpper) {
periodWrapper.innerHTML = now.format("A");
} else {
periodWrapper.innerHTML = now.format("a");
}
// Combine wrappers.
wrapper.appendChild(dateWrapper);
wrapper.appendChild(timeWrapper);
if (this.config.displaySeconds) {
timeWrapper.appendChild(secondsWrapper);
}
if (this.config.showPeriod && this.config.timeFormat !== 24) {
timeWrapper.appendChild(periodWrapper);
}
/****************************************************************
* Create wrappers for ANALOG clock, only if specified in config
*/
if (this.config.displayType !== "digital") {
// If it isn't 'digital', then an 'analog' clock was also requested
// Calculate the degree offset for each hand of the clock
var now = moment();
if (this.config.timezone) {
now.tz(this.config.timezone);
}
var second = now.seconds() * 6,
minute = now.minute() * 6 + second / 60,
hour = ((now.hours() % 12) / 12) * 360 + 90 + minute / 12;
// Create wrappers
var wrapper = document.createElement("div");
var clockCircle = document.createElement("div");
clockCircle.className = "clockCircle";
clockCircle.style.width = this.config.analogSize;
clockCircle.style.height = this.config.analogSize;
if (this.config.analogFace != "" && this.config.analogFace != "simple" && this.config.analogFace != "none") {
clockCircle.style.background = "url("+ this.data.path + "faces/" + this.config.analogFace + ".svg)";
clockCircle.style.backgroundSize = "100%";
} else if (this.config.analogFace != "none") {
clockCircle.style.border = "2px solid white";
}
var clockFace = document.createElement("div");
clockFace.className = "clockFace";
var clockHour = document.createElement("div");
clockHour.id = "clockHour";
clockHour.style.transform = "rotate(" + hour + "deg)";
clockHour.className = "clockHour";
var clockMinute = document.createElement("div");
clockMinute.id = "clockMinute";
clockMinute.style.transform = "rotate(" + minute + "deg)";
clockMinute.className = "clockMinute";
// Combine analog wrappers
clockFace.appendChild(clockHour);
clockFace.appendChild(clockMinute);
if (this.config.displaySeconds) {
var clockSecond = document.createElement("div");
clockSecond.id = "clockSecond";
clockSecond.style.transform = "rotate(" + second + "deg)";
clockSecond.className = "clockSecond";
clockSecond.style.backgroundColor = this.config.secondsColor;
clockFace.appendChild(clockSecond);
}
clockCircle.appendChild(clockFace);
}
/*******************************************
* Combine wrappers, check for .displayType
*/
if (this.config.displayType === "digital") {
// Display only a digital clock
wrapper.appendChild(dateWrapper);
wrapper.appendChild(timeWrapper);
} else if (this.config.displayType === "analog") {
// Display only an analog clock
dateWrapper.style.textAlign = "center";
dateWrapper.style.paddingBottom = "15px";
if (this.config.analogShowDate === "top") {
wrapper.appendChild(dateWrapper);
wrapper.appendChild(clockCircle);
} else if (this.config.analogShowDate === "bottom") {
wrapper.appendChild(clockCircle);
wrapper.appendChild(dateWrapper);
} else {
wrapper.appendChild(clockCircle);
}
} else {
// Both clocks have been configured, check position
var placement = this.config.analogPlacement;
analogWrapper = document.createElement("div");
analogWrapper.id = "analog";
analogWrapper.style.cssFloat = "none";
analogWrapper.appendChild(clockCircle);
digitalWrapper = document.createElement("div");
digitalWrapper.id = "digital";
digitalWrapper.style.cssFloat = "none";
digitalWrapper.appendChild(dateWrapper);
digitalWrapper.appendChild(timeWrapper);
if (placement === "left" || placement === "right") {
digitalWrapper.style.display = "inline-block";
digitalWrapper.style.verticalAlign = "top";
analogWrapper.style.display = "inline-block";
if (placement === "left") {
analogWrapper.style.padding = "0 20px 0 0";
wrapper.appendChild(analogWrapper);
wrapper.appendChild(digitalWrapper);
} else {
analogWrapper.style.padding = "0 0 0 20px";
wrapper.appendChild(digitalWrapper);
wrapper.appendChild(analogWrapper);
}
} else {
digitalWrapper.style.textAlign = "center";
if (placement === "top") {
analogWrapper.style.padding = "0 0 20px 0";
wrapper.appendChild(analogWrapper);
wrapper.appendChild(digitalWrapper);
} else {
analogWrapper.style.padding = "20px 0 0 0";
wrapper.appendChild(digitalWrapper);
wrapper.appendChild(analogWrapper);
}
}
}
// Return the wrapper to the dom.
return wrapper;
}

View File

@@ -0,0 +1,68 @@
.clockCircle {
margin: 0 auto;
position: relative;
border-radius: 50%;
background-size: 100%;
}
.clockFace {
width: 100%;
height: 100%;
}
.clockFace::after {
position: absolute;
top: 50%;
left: 50%;
width: 6px;
height: 6px;
margin: -3px 0 0 -3px;
background: white;
border-radius: 3px;
content: "";
display: block;
}
.clockHour {
width: 0;
height: 0;
position: absolute;
top: 50%;
left: 50%;
margin: -2px 0 -2px -25%; /* numbers much match negative length & thickness */
padding: 2px 0 2px 25%; /* indicator length & thickness */
background: white;
-webkit-transform-origin: 100% 50%;
-ms-transform-origin: 100% 50%;
transform-origin: 100% 50%;
border-radius: 3px 0 0 3px;
}
.clockMinute {
width: 0;
height: 0;
position: absolute;
top: 50%;
left: 50%;
margin: -35% -2px 0; /* numbers must match negative length & thickness */
padding: 35% 2px 0; /* indicator length & thickness */
background: white;
-webkit-transform-origin: 50% 100%;
-ms-transform-origin: 50% 100%;
transform-origin: 50% 100%;
border-radius: 3px 0 0 3px;
}
.clockSecond {
width: 0;
height: 0;
position: absolute;
top: 50%;
left: 50%;
margin: -38% -1px 0 0; /* numbers must match negative length & thickness */
padding: 38% 1px 0 0; /* indicator length & thickness */
background: #888;
-webkit-transform-origin: 50% 100%;
-ms-transform-origin: 50% 100%;
transform-origin: 50% 100%;
}

View File

@@ -0,0 +1 @@
<svg id="Hour_Markers_-_Singlets" data-name="Hour Markers - Singlets" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250"><defs><style>.cls-1,.cls-2{fill:none;stroke:#fff;stroke-linecap:round;stroke-miterlimit:10;}.cls-2{stroke-width:0.5px;}</style></defs><title>face-001</title><line class="cls-1" x1="125" y1="1.25" x2="125" y2="16.23"/><line class="cls-1" x1="186.87" y1="17.83" x2="179.39" y2="30.8"/><line class="cls-1" x1="232.17" y1="63.12" x2="219.2" y2="70.61"/><line class="cls-1" x1="248.75" y1="125" x2="233.77" y2="125"/><line class="cls-1" x1="232.17" y1="186.87" x2="219.2" y2="179.39"/><line class="cls-1" x1="186.88" y1="232.17" x2="179.39" y2="219.2"/><line class="cls-1" x1="125" y1="248.75" x2="125" y2="233.77"/><line class="cls-1" x1="63.13" y1="232.17" x2="70.61" y2="219.2"/><line class="cls-1" x1="17.83" y1="186.88" x2="30.8" y2="179.39"/><line class="cls-1" x1="1.25" y1="125" x2="16.23" y2="125"/><line class="cls-1" x1="17.83" y1="63.13" x2="30.8" y2="70.61"/><line class="cls-1" x1="63.12" y1="17.83" x2="70.61" y2="30.8"/><line class="cls-2" x1="138.01" y1="1.25" x2="136.96" y2="11.23"/><line class="cls-2" x1="150.87" y1="3.29" x2="148.78" y2="13.11"/><line class="cls-2" x1="163.45" y1="6.66" x2="160.35" y2="16.21"/><line class="cls-2" x1="175.61" y1="11.33" x2="171.53" y2="20.5"/><line class="cls-2" x1="198.14" y1="24.33" x2="192.24" y2="32.45"/><line class="cls-2" x1="208.26" y1="32.53" x2="201.54" y2="39.99"/><line class="cls-2" x1="217.47" y1="41.74" x2="210.01" y2="48.46"/><line class="cls-2" x1="225.67" y1="51.86" x2="217.55" y2="57.76"/><line class="cls-2" x1="238.67" y1="74.39" x2="229.5" y2="78.47"/><line class="cls-2" x1="243.34" y1="86.55" x2="233.79" y2="89.65"/><line class="cls-2" x1="246.71" y1="99.13" x2="236.89" y2="101.22"/><line class="cls-2" x1="248.75" y1="111.99" x2="238.77" y2="113.04"/><line class="cls-2" x1="248.75" y1="138.01" x2="238.77" y2="136.96"/><line class="cls-2" x1="246.71" y1="150.87" x2="236.89" y2="148.78"/><line class="cls-2" x1="243.34" y1="163.45" x2="233.79" y2="160.35"/><line class="cls-2" x1="238.67" y1="175.61" x2="229.5" y2="171.53"/><line class="cls-2" x1="225.67" y1="198.14" x2="217.55" y2="192.24"/><line class="cls-2" x1="217.47" y1="208.26" x2="210.01" y2="201.54"/><line class="cls-2" x1="208.26" y1="217.47" x2="201.54" y2="210.01"/><line class="cls-2" x1="198.14" y1="225.67" x2="192.24" y2="217.55"/><line class="cls-2" x1="175.61" y1="238.67" x2="171.53" y2="229.5"/><line class="cls-2" x1="163.45" y1="243.34" x2="160.35" y2="233.79"/><line class="cls-2" x1="150.87" y1="246.71" x2="148.78" y2="236.89"/><line class="cls-2" x1="138.01" y1="248.75" x2="136.96" y2="238.77"/><line class="cls-2" x1="111.99" y1="248.75" x2="113.04" y2="238.77"/><line class="cls-2" x1="99.13" y1="246.71" x2="101.22" y2="236.89"/><line class="cls-2" x1="86.55" y1="243.34" x2="89.65" y2="233.79"/><line class="cls-2" x1="74.39" y1="238.67" x2="78.47" y2="229.5"/><line class="cls-2" x1="51.86" y1="225.67" x2="57.76" y2="217.55"/><line class="cls-2" x1="41.74" y1="217.47" x2="48.46" y2="210.01"/><line class="cls-2" x1="32.53" y1="208.26" x2="39.99" y2="201.54"/><line class="cls-2" x1="24.33" y1="198.14" x2="32.45" y2="192.24"/><line class="cls-2" x1="11.33" y1="175.61" x2="20.5" y2="171.53"/><line class="cls-2" x1="6.66" y1="163.45" x2="16.21" y2="160.35"/><line class="cls-2" x1="3.29" y1="150.87" x2="13.11" y2="148.78"/><line class="cls-2" x1="1.25" y1="138.01" x2="11.23" y2="136.96"/><line class="cls-2" x1="1.25" y1="111.99" x2="11.23" y2="113.04"/><line class="cls-2" x1="3.29" y1="99.13" x2="13.11" y2="101.22"/><line class="cls-2" x1="6.66" y1="86.55" x2="16.21" y2="89.65"/><line class="cls-2" x1="11.33" y1="74.39" x2="20.5" y2="78.47"/><line class="cls-2" x1="24.33" y1="51.86" x2="32.45" y2="57.76"/><line class="cls-2" x1="32.53" y1="41.74" x2="39.99" y2="48.46"/><line class="cls-2" x1="41.74" y1="32.53" x2="48.46" y2="39.99"/><line class="cls-2" x1="51.86" y1="24.33" x2="57.76" y2="32.45"/><line class="cls-2" x1="74.39" y1="11.33" x2="78.47" y2="20.5"/><line class="cls-2" x1="86.55" y1="6.66" x2="89.65" y2="16.21"/><line class="cls-2" x1="99.13" y1="3.29" x2="101.22" y2="13.11"/><line class="cls-2" x1="111.99" y1="1.25" x2="113.04" y2="11.23"/></svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1 @@
<svg id="Hour_Markers_-_Doubles" data-name="Hour Markers - Doubles" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250"><defs><style>.cls-1{fill:none;stroke:#fff;stroke-linecap:round;stroke-miterlimit:10;stroke-width:2.98px;}</style></defs><title>face-002</title><line class="cls-1" x1="122.01" y1="1.75" x2="122.01" y2="16.67"/><line class="cls-1" x1="186.62" y1="18.26" x2="179.17" y2="31.18"/><line class="cls-1" x1="231.74" y1="63.37" x2="218.82" y2="70.83"/><line class="cls-1" x1="248.25" y1="127.99" x2="233.33" y2="127.99"/><line class="cls-1" x1="231.74" y1="186.62" x2="218.82" y2="179.17"/><line class="cls-1" x1="186.63" y1="231.74" x2="179.17" y2="218.82"/><line class="cls-1" x1="127.99" y1="248.25" x2="127.99" y2="233.33"/><line class="cls-1" x1="63.38" y1="231.74" x2="70.83" y2="218.82"/><line class="cls-1" x1="18.26" y1="186.63" x2="31.18" y2="179.17"/><line class="cls-1" x1="1.75" y1="122.01" x2="16.67" y2="122.01"/><line class="cls-1" x1="18.26" y1="63.38" x2="31.18" y2="70.83"/><line class="cls-1" x1="63.37" y1="18.26" x2="70.83" y2="31.18"/><line class="cls-1" x1="127.99" y1="1.75" x2="127.99" y2="16.67"/><line class="cls-1" x1="248.25" y1="122.01" x2="233.33" y2="122.01"/><line class="cls-1" x1="122.01" y1="248.25" x2="122.01" y2="233.33"/><line class="cls-1" x1="1.75" y1="127.99" x2="16.67" y2="127.99"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -56,6 +56,15 @@ The following properties can be configured:
<br><b>Default value:</b> See <i>compliment configuration</i> below.
</td>
</tr>
<tr>
<td><code>remoteFile</code></td>
<td>External file from which to load the compliments<br>
<br><b>Possible values:</b>Path to a JSON file containing compliments, configured
as per the value of the <i>compliments configuration</i> (see below). An object with three arrays:
morning, afternoon and evening. - <code>compliments.json</code>
<br><b>Default value:</b> <code>null</code> (Do not load from file)
</td>
</tr>
</tbody>
</table>
@@ -63,6 +72,44 @@ The following properties can be configured:
The `compliments` property contains an object with three arrays: <code>morning</code>, <code>afternoon</code> and<code>evening</code>. Based on the time of the day, the compliments will be picked out of one of these arrays. The arrays contain one or multiple compliments.
If use the currentweather is possible use a actual weather for set compliments. The availables properties are:
* <code>day_sunny</code>
* <code>day_cloudy</code>
* <code>cloudy</code>
* <code>cloudy_windy</code>
* <code>showers</code>
* <code>rain</code>
* <code>thunderstorm</code>
* <code>snow</code>
* <code>fog</code>
* <code>night_clear</code>
* <code>night_cloudy</code>
* <code>night_showers</code>
* <code>night_rain</code>
* <code>night_thunderstorm</code>
* <code>night_snow</code>
* <code>night_alt_cloudy_windy</code>
#### Example use with currentweather module
````javascript
config: {
compliments: {
day_sunny: [
'Today is a sunny day',
'It\'s a beautiful day'
],
snow: [
'Snowball battle!'
],
rain: [
'Don\'t forget your umbrella'
]
}
}
````
#### Default value:
````javascript
config: {
@@ -85,3 +132,32 @@ config: {
}
}
````
### External Compliment File
You may specify an external file that contains the three compliment arrays. This is particularly useful if you have a
large number of compliments and do not wish to crowd your `config.js` file with a large array of compliments.
Adding the `remoteFile` variable will override an array you specify in the configuration file.
This file must be straight JSON. Note that the array names need quotes
around them ("morning", "afternoon", "evening", "snow", "rain", etc.).
#### Example compliments.json file:
````json
{
"morning" : [
"Good morning, sunshine!",
"Who needs coffee when you have your smile?",
"Go get 'em, Tiger!"
],
"afternoon" : [
"Hitting your stride!",
"You are making a difference!",
"You're more fun than bubble wrap!"
],
"evening" : [
"You made someone smile today, I know it.",
"You are making a difference.",
"The day was better for your efforts."
]
}
````

View File

@@ -29,9 +29,13 @@ Module.register("compliments",{
]
},
updateInterval: 30000,
remoteFile: null,
fadeSpeed: 4000
},
// Set currentweather from module
currentWeatherType: "",
// Define required scripts.
getScripts: function() {
return ["moment.js"];
@@ -43,6 +47,12 @@ Module.register("compliments",{
this.lastComplimentIndex = -1;
if (this.config.remoteFile != null) {
this.complimentFile((response) => {
this.config.compliments = JSON.parse(response);
});
}
// Schedule update timer.
var self = this;
setInterval(function() {
@@ -84,14 +94,36 @@ Module.register("compliments",{
*/
complimentArray: function() {
var hour = moment().hour();
var compliments = null;
if (hour >= 3 && hour < 12) {
return this.config.compliments.morning;
compliments = this.config.compliments.morning;
} else if (hour >= 12 && hour < 17) {
return this.config.compliments.afternoon;
compliments = this.config.compliments.afternoon;
} else {
return this.config.compliments.evening;
compliments = this.config.compliments.evening;
}
if ( this.currentWeatherType in this.config.compliments) {
compliments.push.apply(compliments, this.config.compliments[this.currentWeatherType]);
}
return compliments;
},
/* complimentFile(callback)
* Retrieve a file from the local filesystem
*/
complimentFile: function(callback) {
var xobj = new XMLHttpRequest();
xobj.overrideMimeType("application/json");
xobj.open("GET", this.file(this.config.remoteFile), true);
xobj.onreadystatechange = function () {
if (xobj.readyState == 4 && xobj.status == "200") {
callback(xobj.responseText);
}
};
xobj.send(null);
},
/* complimentArray()
@@ -112,10 +144,44 @@ Module.register("compliments",{
var compliment = document.createTextNode(complimentText);
var wrapper = document.createElement("div");
wrapper.className = "thin xlarge bright";
wrapper.className = this.config.classes ? this.config.classes : "thin xlarge bright";
wrapper.appendChild(compliment);
return wrapper;
}
},
// From data currentweather set weather type
setCurrentWeatherType: function(data) {
var weatherIconTable = {
"01d": "day_sunny",
"02d": "day_cloudy",
"03d": "cloudy",
"04d": "cloudy_windy",
"09d": "showers",
"10d": "rain",
"11d": "thunderstorm",
"13d": "snow",
"50d": "fog",
"01n": "night_clear",
"02n": "night_cloudy",
"03n": "night_cloudy",
"04n": "night_cloudy",
"09n": "night_showers",
"10n": "night_rain",
"11n": "night_thunderstorm",
"13n": "night_snow",
"50n": "night_alt_cloudy_windy"
};
this.currentWeatherType = weatherIconTable[data.weather[0].icon];
},
// Override notification handler.
notificationReceived: function(notification, payload, sender) {
if (notification == "CURRENTWEATHER_DATA") {
this.setCurrentWeatherType(payload.data);
}
},
});

View File

@@ -14,6 +14,7 @@ modules: [
config: {
// See 'Configuration options' for more information.
location: 'Amsterdam,Netherlands',
locationID: '', //Location ID from http://openweathermap.org/help/city_list.txt
appid: 'abcde12345abcde12345abcde12345ab' //openweathermap.org API key.
}
}
@@ -34,12 +35,20 @@ The following properties can be configured:
</tr>
<thead>
<tbody>
<tr>
<td><code>location</code></td>
<td>The location used for weather information.<br>
<br><b>Example:</b> <code>Amsterdam,Netherlands</code>
<br><b>Default value:</b> <code>New York</code>
<br><b>Example:</b> <code>'Amsterdam,Netherlands'</code>
<br><b>Default value:</b> <code>false</code><br><br>
<strong>Note:</strong> When the <code>location</code> and <code>locationID</code> are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used.
</td>
</tr>
<tr>
<td><code>locationID</code></td>
<td>Location ID from <a href="http://openweathermap.org/help/city_list.txt">OpenWeatherMap</a> <b>This will override anything you put in location.</b><br>Leave blank if you want to use location.
<br><b>Example:</b> <code>1234567</code>
<br><b>Default value:</b> <code>false</code><br><br>
<strong>Note:</strong> When the <code>location</code> and <code>locationID</code> are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used.
</td>
</tr>
<tr>
@@ -55,18 +64,25 @@ The following properties can be configured:
<br><b>Default value:</b> <code>config.units</code>
</td>
</tr>
<tr>
<td><code>roundTemp</code></td>
<td>Round temperature value to nearest integer.<br>
<br><b>Possible values:</b> <code>true</code> (round to integer) or <code>false</code> (display exact value with decimal point)
<br><b>Default value:</b> <code>false</code>
</td>
</tr>
<tr>
<td><code>updateInterval</code></td>
<td>How often does the content needs to be fetched? (Milliseconds)<br>
<br><b>Possible values:</b> <code>1000</code> - <code>86400000</code>
<br><b>Default value:</b> <code>300000</code> (10 minutes)
<br><b>Default value:</b> <code>600000</code> (10 minutes)
</td>
</tr>
<tr>
<td><code>animationSpeed</code></td>
<td>Speed of the update animation. (Milliseconds)<br>
<br><b>Possible values:</b><code>0</code> - <code>5000</code>
<br><b>Default value:</b> <code>2000</code> (2 seconds)
<br><b>Default value:</b> <code>1000</code> (1 second)
</td>
</tr>
<tr>
@@ -97,6 +113,20 @@ The following properties can be configured:
<br><b>Default value:</b> <code>true</code>
</td>
</tr>
<tr>
<td><code>showHumidity</code></td>
<td>Show the current humidity<br>
<br><b>Possible values:</b> <code>true</code> or <code>false</code>
<br><b>Default value:</b> <code>false</code>
</td>
</tr>
<tr>
<td><code>onlyTemp</code></td>
<td>Show only current Temperature and weather icon.<br>
<br><b>Possible values:</b> <code>true</code> or <code>false</code>
<br><b>Default value:</b> <code>false</code>
</td>
</tr>
<tr>
<td><code>useBeaufort</code></td>
<td>Pick between using the Beaufort scale for wind speed or using the default units.<br>
@@ -143,6 +173,18 @@ The following properties can be configured:
<br><b>Default value:</b> <code>'weather'</code>
</td>
</tr>
<tr>
<td><code>appendLocationNameToHeader</code></td>
<td>If set to <code>true</code>, the returned location name will be appended to the header of the module, if the header is enabled. This is mainly intresting when using calender based weather.<br>
<br><b>Default value:</b> <code>true</code>
</td>
</tr>
<tr>
<td><code>calendarClass</code></td>
<td>The class for the calender module to base the event based weather information on.<br>
<br><b>Default value:</b> <code>'calendar'</code>
</td>
</tr>
<tr>
<td><code>iconTable</code></td>
<td>The conversion table to convert the weather conditions to weather-icons.<br>

View File

@@ -6,3 +6,11 @@
-webkit-transform: translate(0, -3px); /* Safari */
transform: translate(0, -3px);
}
.currentweather .humidityIcon {
padding-right: 4px;
}
.currentweather .humidity-padding {
padding-bottom: 6px;
}

View File

@@ -11,7 +11,8 @@ Module.register("currentweather",{
// Default module config.
defaults: {
location: "",
location: false,
locationID: false,
appid: "",
units: config.units,
updateInterval: 10 * 60 * 1000, // every 10 minutes
@@ -22,6 +23,7 @@ Module.register("currentweather",{
showWindDirection: true,
useBeaufort: true,
lang: config.language,
showHumidity: false,
initialLoadDelay: 0, // 0 seconds delay
retryDelay: 2500,
@@ -30,6 +32,12 @@ Module.register("currentweather",{
apiBase: "http://api.openweathermap.org/data/",
weatherEndpoint: "weather",
appendLocationNameToHeader: true,
calendarClass: "calendar",
onlyTemp: false,
roundTemp: false,
iconTable: {
"01d": "wi-day-sunny",
"02d": "wi-day-cloudy",
@@ -52,6 +60,12 @@ Module.register("currentweather",{
},
},
// create a variable for the first upcoming calendaar event. Used if no location is specified.
firstEvent: false,
// create a variable to hold the location name based on the API result.
fetchedLocatioName: "",
// Define required scripts.
getScripts: function() {
return ["moment.js"];
@@ -87,35 +101,16 @@ Module.register("currentweather",{
this.loaded = false;
this.scheduleUpdate(this.config.initialLoadDelay);
this.updateTimer = null;
},
// Override dom generator.
getDom: function() {
var wrapper = document.createElement("div");
if (this.config.appid === "") {
wrapper.innerHTML = "Please set the correct openweather <i>appid</i> in the config for module: " + this.name + ".";
wrapper.className = "dimmed light small";
return wrapper;
}
if (this.config.location === "") {
wrapper.innerHTML = "Please set the openweather <i>location</i> in the config for module: " + this.name + ".";
wrapper.className = "dimmed light small";
return wrapper;
}
if (!this.loaded) {
wrapper.innerHTML = this.translate('LOADING');
wrapper.className = "dimmed light small";
return wrapper;
}
// add extra information of current weather
// windDirection, humidity, sunrise and sunset
addExtraInfoWeather: function(wrapper) {
var small = document.createElement("div");
small.className = "normal medium";
var windIcon = document.createElement("span");
windIcon.className = "wi wi-strong-wind dimmed";
small.appendChild(windIcon);
@@ -133,6 +128,22 @@ Module.register("currentweather",{
spacer.innerHTML = "&nbsp;";
small.appendChild(spacer);
if (this.config.showHumidity) {
var humidity = document.createElement("span");
humidity.innerHTML = this.humidity;
var spacer = document.createElement("sup");
spacer.innerHTML = "&nbsp;";
var humidityIcon = document.createElement("sup");
humidityIcon.className = "wi wi-humidity humidityIcon";
humidityIcon.innerHTML = "&nbsp;";
small.appendChild(humidity);
small.appendChild(spacer);
small.appendChild(humidityIcon);
}
var sunriseSunsetIcon = document.createElement("span");
sunriseSunsetIcon.className = "wi dimmed " + this.sunriseSunsetIcon;
small.appendChild(sunriseSunsetIcon);
@@ -141,6 +152,29 @@ Module.register("currentweather",{
sunriseSunsetTime.innerHTML = " " + this.sunriseSunsetTime;
small.appendChild(sunriseSunsetTime);
wrapper.appendChild(small);
},
// Override dom generator.
getDom: function() {
var wrapper = document.createElement("div");
if (this.config.appid === "") {
wrapper.innerHTML = "Please set the correct openweather <i>appid</i> in the config for module: " + this.name + ".";
wrapper.className = "dimmed light small";
return wrapper;
}
if (!this.loaded) {
wrapper.innerHTML = this.translate("LOADING");
wrapper.className = "dimmed light small";
return wrapper;
}
if (this.config.onlyTemp === false) {
this.addExtraInfoWeather(wrapper);
}
var large = document.createElement("div");
large.className = "large light";
@@ -153,16 +187,54 @@ Module.register("currentweather",{
temperature.innerHTML = " " + this.temperature + "&deg;";
large.appendChild(temperature);
wrapper.appendChild(small);
wrapper.appendChild(large);
return wrapper;
},
// Override getHeader method.
getHeader: function() {
if (this.config.appendLocationNameToHeader) {
return this.data.header + " " + this.fetchedLocatioName;
}
return this.data.header;
},
// Override notification handler.
notificationReceived: function(notification, payload, sender) {
if (notification === "DOM_OBJECTS_CREATED") {
if (this.config.appendLocationNameToHeader) {
this.hide(0, {lockString: this.identifier});
}
}
if (notification === "CALENDAR_EVENTS") {
var senderClasses = sender.data.classes.toLowerCase().split(" ");
if (senderClasses.indexOf(this.config.calendarClass.toLowerCase()) !== -1) {
var lastEvent = this.firstEvent;
this.firstEvent = false;
for (e in payload) {
var event = payload[e];
if (event.location || event.geo) {
this.firstEvent = event;
//Log.log("First upcoming event with location: ", event);
break;
}
}
}
}
},
/* updateWeather(compliments)
* Requests new data from openweather.org.
* Calls processWeather on succesfull response.
*/
updateWeather: function() {
if (this.config.appid === "") {
Log.error("CurrentWeather: APPID not set!");
return;
}
var url = this.config.apiBase + this.config.apiVersion + "/" + this.config.weatherEndpoint + this.getParams();
var self = this;
var retry = true;
@@ -174,11 +246,10 @@ Module.register("currentweather",{
if (this.status === 200) {
self.processWeather(JSON.parse(this.response));
} else if (this.status === 401) {
self.config.appid = "";
self.updateDom(self.config.animationSpeed);
Log.error(self.name + ": Incorrect APPID.");
retry = false;
retry = true;
} else {
Log.error(self.name + ": Could not load weather.");
}
@@ -198,7 +269,19 @@ Module.register("currentweather",{
*/
getParams: function() {
var params = "?";
params += "q=" + this.config.location;
if(this.config.locationID) {
params += "id=" + this.config.locationID;
} else if(this.config.location) {
params += "q=" + this.config.location;
} else if (this.firstEvent && this.firstEvent.geo) {
params += "lat=" + this.firstEvent.geo.lat + "&lon=" + this.firstEvent.geo.lon
} else if (this.firstEvent && this.firstEvent.location) {
params += "q=" + this.firstEvent.location;
} else {
this.hide(this.config.animationSpeed, {lockString:this.identifier});
return;
}
params += "&units=" + this.config.units;
params += "&lang=" + this.config.lang;
params += "&APPID=" + this.config.appid;
@@ -212,6 +295,14 @@ Module.register("currentweather",{
* argument data object - Weather information received form openweather.org.
*/
processWeather: function(data) {
if (!data || !data.main || !data.main.temp) {
// Did not receive usable new data.
// Maybe this needs a better check?
return;
}
this.humidity = parseFloat(data.main.humidity);
this.temperature = this.roundValue(data.main.temp);
if (this.config.useBeaufort){
@@ -232,20 +323,20 @@ Module.register("currentweather",{
// So we need to generate the timestring manually.
// See issue: https://github.com/MichMich/MagicMirror/issues/181
var sunriseSunsetDateObject = (sunrise < now && sunset > now) ? sunset : sunrise;
var timeString = moment(sunriseSunsetDateObject).format('HH:mm');
var timeString = moment(sunriseSunsetDateObject).format("HH:mm");
if (this.config.timeFormat !== 24) {
//var hours = sunriseSunsetDateObject.getHours() % 12 || 12;
if (this.config.showPeriod) {
if (this.config.showPeriodUpper) {
//timeString = hours + moment(sunriseSunsetDateObject).format(':mm A');
timeString = moment(sunriseSunsetDateObject).format('h:mm A');
timeString = moment(sunriseSunsetDateObject).format("h:mm A");
} else {
//timeString = hours + moment(sunriseSunsetDateObject).format(':mm a');
timeString = moment(sunriseSunsetDateObject).format('h:mm a');
timeString = moment(sunriseSunsetDateObject).format("h:mm a");
}
} else {
//timeString = hours + moment(sunriseSunsetDateObject).format(':mm');
timeString = moment(sunriseSunsetDateObject).format('h:mm');
timeString = moment(sunriseSunsetDateObject).format("h:mm");
}
}
@@ -253,9 +344,10 @@ Module.register("currentweather",{
this.sunriseSunsetIcon = (sunrise < now && sunset > now) ? "wi-sunset" : "wi-sunrise";
this.show(this.config.animationSpeed, {lockString:this.identifier});
this.loaded = true;
this.updateDom(this.config.animationSpeed);
this.sendNotification("CURRENTWEATHER_DATA", {data: data});
},
/* scheduleUpdate()
@@ -294,52 +386,51 @@ Module.register("currentweather",{
return 12;
},
deg2Cardinal: function(deg) {
if (deg>11.25 && deg<=33.75){
return "NNE";
} else if (deg > 33.75 && deg <= 56.25) {
return "NE";
} else if (deg > 56.25 && deg <= 78.75) {
return "ENE";
} else if (deg > 78.75 && deg <= 101.25) {
return "E";
} else if (deg > 101.25 && deg <= 123.75) {
return "ESE";
} else if (deg > 123.75 && deg <= 146.25) {
return "SE";
} else if (deg > 146.25 && deg <= 168.75) {
return "SSE";
} else if (deg > 168.75 && deg <= 191.25) {
return "S";
} else if (deg > 191.25 && deg <= 213.75) {
return "SSW";
} else if (deg > 213.75 && deg <= 236.25) {
return "SW";
} else if (deg > 236.25 && deg <= 258.75) {
return "WSW";
} else if (deg > 258.75 && deg <= 281.25) {
return "W";
} else if (deg > 281.25 && deg <= 303.75) {
return "WNW";
} else if (deg > 303.75 && deg <= 326.25) {
return "NW";
} else if (deg > 326.25 && deg <= 348.75) {
return "NNW";
} else {
return "N";
}
},
/* function(temperature)
* Rounds a temperature to 1 decimal.
* Rounds a temperature to 1 decimal or integer (depending on config.roundTemp).
*
* argument temperature number - Temperature.
*
* return number - Rounded Temperature.
*/
deg2Cardinal: function(deg) {
if (deg>11.25 && deg<=33.75){
return "NNE";
} else if (deg > 33.75 && deg <= 56.25) {
return "NE";
} else if (deg > 56.25 && deg <= 78.75) {
return "ENE";
} else if (deg > 78.75 && deg <= 101.25) {
return "E";
} else if (deg > 101.25 && deg <= 123.75) {
return "ESE";
} else if (deg > 123.75 && deg <= 146.25) {
return "SE";
} else if (deg > 146.25 && deg <= 168.75) {
return "SSE";
} else if (deg > 168.75 && deg <= 191.25) {
return "S";
} else if (deg > 191.25 && deg <= 213.75) {
return "SSW";
} else if (deg > 213.75 && deg <= 236.25) {
return "SW";
} else if (deg > 236.25 && deg <= 258.75) {
return "WSW";
} else if (deg > 258.75 && deg <= 281.25) {
return "W";
} else if (deg > 281.25 && deg <= 303.75) {
return "WNW";
} else if (deg > 303.75 && deg <= 326.25) {
return "NW";
} else if (deg > 326.25 && deg <= 348.75) {
return "NNW";
} else {
return "N";
}
},
roundValue: function(temperature) {
return parseFloat(temperature).toFixed(1);
var decimals = this.config.roundTemp ? 0 : 1;
return parseFloat(temperature).toFixed(decimals);
}
});

View File

@@ -15,7 +15,8 @@ var defaultModules = [
"currentweather",
"helloworld",
"newsfeed",
"weatherforecast"
"weatherforecast",
"updatenotification"
];
/*************** DO NOT EDIT THE LINE BELOW ***************/

View File

@@ -53,6 +53,7 @@ The following properties can be configured:
{
title: "New York Times",
url: "http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml",
encoding: "UTF-8"
}
]</code>
</td>
@@ -98,11 +99,47 @@ The following properties can be configured:
<td><code>animationSpeed</code></td>
<td>Speed of the update animation. (Milliseconds)<br>
<br><b>Possible values:</b><code>0</code> - <code>5000</code>
<br><b>Default value:</b> <code>2000</code> (2.5 seconds)
<br><b>Default value:</b> <code>2500</code> (2.5 seconds)
</td>
</tr>
<tr>
<td><code>maxNewsItems</code></td>
<td>Total amount of news items to cycle through. (0 for unlimited)<br>
<br><b>Possible values:</b><code>0</code> - <code>...</code>
<br><b>Default value:</b> <code>0</code>
</td>
</tr>
removeStartTags: false,
removeEndTags: false,
startTags: [],
endTags: []
<tr>
<td><code>removeStartTags</code></td>
<td>Some newsfeeds feature tags at the <B>beginning</B> of their titles or descriptions, such as <em>[VIDEO]</em>.
This setting allows for the removal of specified tags from the beginning of an item's description and/or title.<br>
<br><b>Possible values:</b><code>'title'</code>, <code>'description'</code>, <code>'both'</code>
</td>
</tr>
<tr>
<td><code>startTags</code></td>
<td>List the tags you would like to have removed at the beginning of the feed item<br>
<br><b>Possible values:</b> <code>['TAG']</code> or <code>['TAG1','TAG2',...]</code>
</td>
</tr>
<tr>
<td><code>removeEndTags</code></td>
<td>Remove specified tags from the <B>end</B> of an item's description and/or title.<br>
<br><b>Possible values:</b><code>'title'</code>, <code>'description'</code>, <code>'both'</code>
</td>
</tr>
<tr>
<td><code>endTags</code></td>
<td>List the tags you would like to have removed at the end of the feed item<br>
<br><b>Possible values:</b> <code>['TAG']</code> or <code>['TAG1','TAG2',...]</code>
</td>
</tr>
</tbody>
</table>
@@ -136,7 +173,7 @@ The `feeds` property contains an array with multiple objects. These objects have
<td>The encoding of the news feed.<br>
<br>This property is optional.
<br><b>Possible values:</b><code>'UTF-8'</code>, <code>'ISO-8859-1'</code>, etc ...
<br><b>Default value:</b> <code>'UTF-8'</code>
<br><b>Default value:</b> <code>'UTF-8'</code>
</td>
</tr>

View File

@@ -44,8 +44,9 @@ var Fetcher = function(url, reloadInterval, encoding) {
parser.on("item", function(item) {
var title = item.title;
var description = item.description || item.summary || item.content || '';
var description = item.description || item.summary || item.content || "";
var pubdate = item.pubdate || item.published || item.updated;
var url = item.url || item.link || "";
if (title && pubdate) {
@@ -56,15 +57,16 @@ var Fetcher = function(url, reloadInterval, encoding) {
title: title,
description: description,
pubdate: pubdate,
url: url,
});
} else {
console.log("Can't parse feed item:");
console.log(item);
console.log('Title: ' + title);
console.log('Description: ' + description);
console.log('Pubdate: ' + pubdate);
// console.log("Can't parse feed item:");
// console.log(item);
// console.log('Title: ' + title);
// console.log('Description: ' + description);
// console.log('Pubdate: ' + pubdate);
}
});
@@ -79,7 +81,10 @@ var Fetcher = function(url, reloadInterval, encoding) {
scheduleTimer();
});
var headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A'};
nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]);
headers = {"User-Agent": "Mozilla/5.0 (Node.js "+ nodeVersion + ") MagicMirror/" + global.version + " (https://github.com/MichMich/MagicMirror/)"}
request({uri: url, encoding: null, headers: headers}).pipe(iconv.decodeStream(encoding)).pipe(parser);
};
@@ -117,7 +122,7 @@ var Fetcher = function(url, reloadInterval, encoding) {
};
/* broadcastItems()
* Broadcast the exsisting items.
* Broadcast the existing items.
*/
this.broadcastItems = function() {
if (items.length <= 0) {

View File

@@ -24,6 +24,12 @@ Module.register("newsfeed",{
reloadInterval: 5 * 60 * 1000, // every 5 minutes
updateInterval: 10 * 1000,
animationSpeed: 2.5 * 1000,
maxNewsItems: 0, // 0 for unlimited
removeStartTags: "",
removeEndTags: "",
startTags: [],
endTags: []
},
// Define required scripts.
@@ -87,14 +93,65 @@ Module.register("newsfeed",{
var sourceAndTimestamp = document.createElement("div");
sourceAndTimestamp.className = "light small dimmed";
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== '') sourceAndTimestamp.innerHTML = this.newsItems[this.activeItem].sourceTitle;
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== '' && this.config.showPublishDate) sourceAndTimestamp.innerHTML += ', ';
if (this.config.showPublishDate) sourceAndTimestamp.innerHTML += moment(new Date(this.newsItems[this.activeItem].pubdate)).fromNow();
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== '' || this.config.showPublishDate) sourceAndTimestamp.innerHTML += ':';
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== "") {
sourceAndTimestamp.innerHTML = this.newsItems[this.activeItem].sourceTitle;
}
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== "" && this.config.showPublishDate) {
sourceAndTimestamp.innerHTML += ", ";
}
if (this.config.showPublishDate) {
sourceAndTimestamp.innerHTML += moment(new Date(this.newsItems[this.activeItem].pubdate)).fromNow();
}
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== "" || this.config.showPublishDate) {
sourceAndTimestamp.innerHTML += ":";
}
wrapper.appendChild(sourceAndTimestamp);
}
//Remove selected tags from the beginning of rss feed items (title or description)
if (this.config.removeStartTags == "title" || "both") {
for (f=0; f<this.config.startTags.length;f++) {
if (this.newsItems[this.activeItem].title.slice(0,this.config.startTags[f].length) == this.config.startTags[f]) {
this.newsItems[this.activeItem].title = this.newsItems[this.activeItem].title.slice(this.config.startTags[f].length,this.newsItems[this.activeItem].title.length);
}
}
}
if (this.config.removeStartTags == "description" || "both") {
if (this.config.showDescription) {
for (f=0; f<this.config.startTags.length;f++) {
if (this.newsItems[this.activeItem].description.slice(0,this.config.startTags[f].length) == this.config.startTags[f]) {
this.newsItems[this.activeItem].title = this.newsItems[this.activeItem].description.slice(this.config.startTags[f].length,this.newsItems[this.activeItem].description.length);
}
}
}
}
//Remove selected tags from the end of rss feed items (title or description)
if (this.config.removeEndTags) {
for (f=0; f<this.config.endTags.length;f++) {
if (this.newsItems[this.activeItem].title.slice(-this.config.endTags[f].length)==this.config.endTags[f]) {
this.newsItems[this.activeItem].title = this.newsItems[this.activeItem].title.slice(0,-this.config.endTags[f].length);
}
}
if (this.config.showDescription) {
for (f=0; f<this.config.endTags.length;f++) {
if (this.newsItems[this.activeItem].description.slice(-this.config.endTags[f].length)==this.config.endTags[f]) {
this.newsItems[this.activeItem].description = this.newsItems[this.activeItem].description.slice(0,-this.config.endTags[f].length);
}
}
}
}
var title = document.createElement("div");
title.className = "bright medium light";
title.innerHTML = this.newsItems[this.activeItem].title;
@@ -151,7 +208,9 @@ Module.register("newsfeed",{
var dateB = new Date(b.pubdate);
return dateB - dateA;
});
if(this.config.maxNewsItems > 0) {
newsItems = newsItems.slice(0, this.config.maxNewsItems);
}
this.newsItems = newsItems;
},
@@ -183,10 +242,10 @@ Module.register("newsfeed",{
for (var f in this.config.feeds) {
var feed = this.config.feeds[f];
if (feed.url === feedUrl) {
return feed.title || '';
return feed.title || "";
}
}
return '';
return "";
},
/* scheduleUpdateInterval()
@@ -212,5 +271,7 @@ Module.register("newsfeed",{
*/
capitalizeFirstLetter: function(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
},
});

View File

@@ -25,8 +25,8 @@ module.exports = NodeHelper.create({
},
/* createFetcher(url, reloadInterval)
* Creates a fetcher for a new url if it doesn't exsist yet.
* Otherwise it reoses the exsisting one.
* Creates a fetcher for a new url if it doesn't exist yet.
* Otherwise it reoses the existing one.
*
* attribute url string - URL of the news feed.
* attribute reloadInterval number - Reload interval in milliseconds.
@@ -35,8 +35,8 @@ module.exports = NodeHelper.create({
createFetcher: function(feed, config) {
var self = this;
var url = feed.url || '';
var encoding = feed.encoding || 'UTF-8';
var url = feed.url || "";
var encoding = feed.encoding || "UTF-8";
var reloadInterval = config.reloadInterval || 5 * 60 * 1000;
if (!validUrl.isUri(url)) {
@@ -62,7 +62,7 @@ module.exports = NodeHelper.create({
self.fetchers[url] = fetcher;
} else {
console.log("Use exsisting news fetcher for url: " + url);
console.log("Use existing news fetcher for url: " + url);
fetcher = self.fetchers[url];
fetcher.setReloadInterval(reloadInterval);
fetcher.broadcastItems();
@@ -72,7 +72,7 @@ module.exports = NodeHelper.create({
},
/* broadcastFeeds()
* Creates an object with all feed items of the different registered feeds,
* Creates an object with all feed items of the different registered feeds,
* and broadcasts these using sendSocketNotification.
*/
broadcastFeeds: function() {

View File

@@ -0,0 +1,42 @@
# Module: Update Notification
The `updatenotification` module is one of the default modules of the MagicMirror.
This will display a message whenever a new version of the MagicMirror application is available.
## Using the module
To use this module, add it to the modules array in the `config/config.js` file:
````javascript
modules: [
{
module: 'updatenotification',
position: 'top_center', // This can be any of the regions.
config: {
// The config property is optional.
// See 'Configuration options' for more information.
}
}
]
````
## Configuration options
The following properties can be configured:
<table width="100%">
<!-- why, markdown... -->
<thead>
<tr>
<th>Option</th>
<th width="100%">Description</th>
</tr>
<thead>
<tbody>
<tr>
<td><code>updateInterval</code></td>
<td>How often do you want to check for a new version? This value represents the interval in milliseconds.<br>
<br><b>Possible values:</b> Any value above <code>60000</code> (1 minute);
<br><b>Default value:</b> <code>600000</code> (10 minutes);
</td>
</tr>
</tbody>
</table>

View File

@@ -0,0 +1,87 @@
var SimpleGit = require("simple-git");
var simpleGits = [];
var fs = require("fs");
var path = require("path");
var defaultModules = require(__dirname + "/../defaultmodules.js");
var NodeHelper = require("node_helper");
module.exports = NodeHelper.create({
config: {},
updateTimer: null,
start: function () {
},
configureModules: function(modules) {
for (moduleName in modules) {
if (defaultModules.indexOf(moduleName) < 0) {
// Default modules are included in the main MagicMirror repo
var moduleFolder = path.normalize(__dirname + "/../../" + moduleName);
var stat;
try {
stat = fs.statSync(path.join(moduleFolder, ".git"));
} catch(err) {
// Error when directory .git doesn't exist
// This module is not managed with git, skip
continue;
}
var res = function(mn, mf) {
var git = SimpleGit(mf);
git.getRemotes(true, function(err, remotes) {
if (remotes.length < 1 || remotes[0].name.length < 1) {
// No valid remote for folder, skip
return;
}
// Folder has .git and has at least one git remote, watch this folder
simpleGits.push({"module": mn, "git": git});
});
}(moduleName, moduleFolder);
}
}
// Push MagicMirror itself last, biggest chance it'll show up last in UI and isn't overwritten
simpleGits.push({"module": "default", "git": SimpleGit(path.normalize(__dirname + "/../../../"))});
},
socketNotificationReceived: function (notification, payload) {
if (notification === "CONFIG") {
this.config = payload;
} else if(notification === "MODULES") {
this.configureModules(payload);
this.preformFetch();
}
},
preformFetch() {
var self = this;
simpleGits.forEach(function(sg) {
sg.git.fetch().status(function(err, data) {
data.module = sg.module;
if (!err) {
self.sendSocketNotification("STATUS", data);
}
});
});
this.scheduleNextFetch(this.config.updateInterval);
},
scheduleNextFetch: function(delay) {
if (delay < 60 * 1000) {
delay = 60 * 1000
}
var self = this;
clearTimeout(this.updateTimer);
this.updateTimer = setTimeout(function() {
self.preformFetch();
}, delay);
}
});

View File

@@ -0,0 +1,70 @@
Module.register("updatenotification", {
defaults: {
updateInterval: 10 * 60 * 1000, // every 10 minutes
},
status: false,
start: function () {
Log.log("Start updatenotification");
},
notificationReceived: function(notification, payload, sender) {
if (notification === "DOM_OBJECTS_CREATED") {
this.sendSocketNotification("CONFIG", this.config);
this.sendSocketNotification("MODULES", Module.definitions);
this.hide(0,{lockString: self.identifier});
}
},
socketNotificationReceived: function (notification, payload) {
if (notification === "STATUS") {
this.status = payload;
this.updateUI();
}
},
updateUI: function() {
var self = this;
if (this.status && this.status.behind > 0) {
self.updateDom(0);
self.show(1000, {lockString: self.identifier});
}
},
// Override dom generator.
getDom: function () {
var wrapper = document.createElement("div");
if (this.status && this.status.behind > 0) {
var message = document.createElement("div");
message.className = "small bright";
var icon = document.createElement("i");
icon.className = "fa fa-exclamation-circle";
icon.innerHTML = "&nbsp;";
message.appendChild(icon);
var text = document.createElement("span");
if (this.status.module == "default") {
text.innerHTML = this.translate("UPDATE_NOTIFICATION");
} else {
text.innerHTML = this.translate("UPDATE_NOTIFICATION_MODULE").replace("MODULE_NAME", this.status.module);
}
message.appendChild(text);
wrapper.appendChild(message);
var subtext = document.createElement("div");
subtext.innerHTML = this.translate("UPDATE_INFO")
.replace("COMMIT_COUNT", this.status.behind + " " + ((this.status.behind == 1)? "commit" : "commits"))
.replace("BRANCH_NAME", this.status.current);
subtext.className = "xsmall dimmed";
wrapper.appendChild(subtext);
}
return wrapper;
}
});

View File

@@ -14,6 +14,7 @@ modules: [
config: {
// See 'Configuration options' for more information.
location: 'Amsterdam,Netherlands',
locationID: '', //Location ID from http://openweathermap.org/help/city_list.txt
appid: 'abcde12345abcde12345abcde12345ab' //openweathermap.org API key.
}
}
@@ -34,12 +35,20 @@ The following properties can be configured:
</tr>
<thead>
<tbody>
<tr>
<td><code>location</code></td>
<td>The location used for weather information.<br>
<br><b>Example:</b> <code>Amsterdam,Netherlands</code>
<br><b>Default value:</b> <code>New York</code>
<br><b>Example:</b> <code>'Amsterdam,Netherlands'</code>
<br><b>Default value:</b> <code>false</code><br><br>
<strong>Note:</strong> When the <code>location</code> and <code>locationID</code> are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used.
</td>
</tr>
<tr>
<td><code>locationID</code></td>
<td>Location ID from <a href="http://openweathermap.org/help/city_list.txt">OpenWeatherMap</a> <b>This will override anything you put in location.</b><br>Leave blank if you want to use location.
<br><b>Example:</b> <code>1234567</code>
<br><b>Default value:</b> <code>false</code><br><br>
<strong>Note:</strong> When the <code>location</code> and <code>locationID</code> are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used.
</td>
</tr>
<tr>
@@ -55,6 +64,13 @@ The following properties can be configured:
<br><b>Default value:</b> <code>config.units</code>
</td>
</tr>
<tr>
<td><code>roundTemp</code></td>
<td>Round temperature values to nearest integer.<br>
<br><b>Possible values:</b> <code>true</code> (round to integer) or <code>false</code> (display exact value with decimal point)
<br><b>Default value:</b> <code>false</code>
</td>
</tr>
<tr>
<td><code>maxNumberOfDays</code></td>
<td>How many days of forecast to return. Specified by config.js<br>
@@ -63,21 +79,28 @@ The following properties can be configured:
<br>This value is optional. By default the weatherforecast module will return 7 days.
</td>
</tr>
<tr>
<td><code>showRainAmount</code></td>
<td>Should the predicted rain amount be displayed?<br>
<br><b>Possible values:</b> <code>true</code> or <code>false</code>
<br><b>Default value:</b> <code>false</code>
<br>This value is optional. By default the weatherforecast module will not display the predicted amount of rain.
</td>
</tr>
<tr>
<td><code>updateInterval</code></td>
<td>How often does the content needs to be fetched? (Milliseconds)<br>
<br><b>Possible values:</b> <code>1000</code> - <code>86400000</code>
<br><b>Default value:</b> <code>300000</code> (10 minutes)
<br><b>Default value:</b> <code>600000</code> (10 minutes)
</td>
</tr>
<tr>
<td><code>animationSpeed</code></td>
<td>Speed of the update animation. (Milliseconds)<br>
<br><b>Possible values:</b><code>0</code> - <code>5000</code>
<br><b>Default value:</b> <code>2000</code> (2 seconds)
<br><b>Default value:</b> <code>1000</code> (1 second)
</td>
</tr>
<tr>
<td><code>lang</code></td>
<td>The language of the days.<br>
@@ -103,7 +126,7 @@ The following properties can be configured:
<td><code>initialLoadDelay</code></td>
<td>The initial delay before loading. If you have multiple modules that use the same API key, you might want to delay one of the requests. (Milliseconds)<br>
<br><b>Possible values:</b> <code>1000</code> - <code>5000</code>
<br><b>Default value:</b> <code>0</code>
<br><b>Default value:</b> <code>2500</code> (2.5 seconds delay. This delay is used to keep the OpenWeather API happy.)
</td>
</tr>
<tr>
@@ -126,11 +149,23 @@ The following properties can be configured:
</td>
</tr>
<tr>
<td><code>weatherEndpoint</code></td>
<td><code>forecastEndpoint</code></td>
<td>The OpenWeatherMap API endPoint.<br>
<br><b>Default value:</b> <code>'forecast/daily'</code>
</td>
</tr>
<tr>
<td><code>appendLocationNameToHeader</code></td>
<td>If set to <code>true</code>, the returned location name will be appended to the header of the module, if the header is enabled. This is mainly intresting when using calender based weather.<br>
<br><b>Default value:</b> <code>true</code>
</td>
</tr>
<tr>
<td><code>calendarClass</code></td>
<td>The class for the calender module to base the event based weather information on.<br>
<br><b>Default value:</b> <code>'calendar'</code>
</td>
</tr>
<tr>
<td><code>iconTable</code></td>
<td>The conversion table to convert the weather conditions to weather-icons.<br>
@@ -156,6 +191,5 @@ The following properties can be configured:
}</code>
</td>
</tr>
</tbody>
</table>

View File

@@ -12,3 +12,8 @@
padding-left: 20px;
padding-right: 0;
}
.weatherforecast .rain {
padding-left: 20px;
padding-right: 0;
}

View File

@@ -11,10 +11,12 @@ Module.register("weatherforecast",{
// Default module config.
defaults: {
location: "",
location: false,
locationID: false,
appid: "",
units: config.units,
maxNumberOfDays: 7,
showRainAmount: false,
updateInterval: 10 * 60 * 1000, // every 10 minutes
animationSpeed: 1000,
timeFormat: config.timeFormat,
@@ -29,6 +31,11 @@ Module.register("weatherforecast",{
apiBase: "http://api.openweathermap.org/data/",
forecastEndpoint: "forecast/daily",
appendLocationNameToHeader: true,
calendarClass: "calendar",
roundTemp: false,
iconTable: {
"01d": "wi-day-sunny",
"02d": "wi-day-cloudy",
@@ -51,6 +58,12 @@ Module.register("weatherforecast",{
},
},
// create a variable for the first upcoming calendaar event. Used if no location is specified.
firstEvent: false,
// create a variable to hold the location name based on the API result.
fetchedLocatioName: "",
// Define required scripts.
getScripts: function() {
return ["moment.js"];
@@ -94,14 +107,8 @@ Module.register("weatherforecast",{
return wrapper;
}
if (this.config.location === "") {
wrapper.innerHTML = "Please set the openweather <i>location</i> in the config for module: " + this.name + ".";
wrapper.className = "dimmed light small";
return wrapper;
}
if (!this.loaded) {
wrapper.innerHTML = this.translate('LOADING');
wrapper.innerHTML = this.translate("LOADING");
wrapper.className = "dimmed light small";
return wrapper;
}
@@ -125,7 +132,7 @@ Module.register("weatherforecast",{
row.appendChild(iconCell);
var icon = document.createElement("span");
icon.className = forecast.icon;
icon.className = "wi weathericon " + forecast.icon;
iconCell.appendChild(icon);
var maxTempCell = document.createElement("td");
@@ -138,6 +145,17 @@ Module.register("weatherforecast",{
minTempCell.className = "align-right min-temp";
row.appendChild(minTempCell);
if (this.config.showRainAmount) {
var rainCell = document.createElement("td");
if (isNaN(forecast.rain)) {
rainCell.innerHTML = "";
} else {
rainCell.innerHTML = forecast.rain + " mm";
}
rainCell.className = "align-right bright rain";
row.appendChild(rainCell);
}
if (this.config.fade && this.config.fadePoint < 1) {
if (this.config.fadePoint < 0) {
this.config.fadePoint = 0;
@@ -155,11 +173,50 @@ Module.register("weatherforecast",{
return table;
},
// Override getHeader method.
getHeader: function() {
if (this.config.appendLocationNameToHeader) {
return this.data.header + " " + this.fetchedLocatioName;
}
return this.data.header;
},
// Override notification handler.
notificationReceived: function(notification, payload, sender) {
if (notification === "DOM_OBJECTS_CREATED") {
if (this.config.appendLocationNameToHeader) {
this.hide(0, {lockString: this.identifier});
}
}
if (notification === "CALENDAR_EVENTS") {
var senderClasses = sender.data.classes.toLowerCase().split(" ");
if (senderClasses.indexOf(this.config.calendarClass.toLowerCase()) !== -1) {
var lastEvent = this.firstEvent;
this.firstEvent = false;
for (e in payload) {
var event = payload[e];
if (event.location || event.geo) {
this.firstEvent = event;
//Log.log("First upcoming event with location: ", event);
break;
}
}
}
}
},
/* updateWeather(compliments)
* Requests new data from openweather.org.
* Calls processWeather on succesfull response.
*/
updateWeather: function() {
if (this.config.appid === "") {
Log.error("WeatherForecast: APPID not set!");
return;
}
var url = this.config.apiBase + this.config.apiVersion + "/" + this.config.forecastEndpoint + this.getParams();
var self = this;
var retry = true;
@@ -171,11 +228,10 @@ Module.register("weatherforecast",{
if (this.status === 200) {
self.processWeather(JSON.parse(this.response));
} else if (this.status === 401) {
self.config.appid = "";
self.updateDom(self.config.animationSpeed);
Log.error(self.name + ": Incorrect APPID.");
retry = false;
retry = true;
} else {
Log.error(self.name + ": Could not load weather.");
}
@@ -195,7 +251,19 @@ Module.register("weatherforecast",{
*/
getParams: function() {
var params = "?";
params += "q=" + this.config.location;
if(this.config.locationID) {
params += "id=" + this.config.locationID;
} else if(this.config.location) {
params += "q=" + this.config.location;
} else if (this.firstEvent && this.firstEvent.geo) {
params += "lat=" + this.firstEvent.geo.lat + "&lon=" + this.firstEvent.geo.lon
} else if (this.firstEvent && this.firstEvent.location) {
params += "q=" + this.firstEvent.location;
} else {
this.hide(this.config.animationSpeed, {lockString:this.identifier});
return;
}
params += "&units=" + this.config.units;
params += "&lang=" + this.config.lang;
/*
@@ -215,6 +283,7 @@ Module.register("weatherforecast",{
* argument data object - Weather information received form openweather.org.
*/
processWeather: function(data) {
this.fetchedLocatioName = data.city.name + ", " + data.city.country;
this.forecast = [];
for (var i = 0, count = data.list.length; i < count; i++) {
@@ -225,13 +294,14 @@ Module.register("weatherforecast",{
day: moment(forecast.dt, "X").format("ddd"),
icon: this.config.iconTable[forecast.weather[0].icon],
maxTemp: this.roundValue(forecast.temp.max),
minTemp: this.roundValue(forecast.temp.min)
minTemp: this.roundValue(forecast.temp.min),
rain: this.roundValue(forecast.rain)
});
}
//Log.log(this.forecast);
this.show(this.config.animationSpeed, {lockString:this.identifier});
this.loaded = true;
this.updateDom(this.config.animationSpeed);
},
@@ -274,13 +344,14 @@ Module.register("weatherforecast",{
},
/* function(temperature)
* Rounds a temperature to 1 decimal.
* Rounds a temperature to 1 decimal or integer (depending on config.roundTemp).
*
* argument temperature number - Temperature.
*
* return number - Rounded Temperature.
*/
roundValue: function(temperature) {
return parseFloat(temperature).toFixed(1);
var decimals = this.config.roundTemp ? 0 : 1;
return parseFloat(temperature).toFixed(decimals);
}
});

View File

@@ -1,14 +1,10 @@
{
"name": "magicmirror",
"version": "2.0.0",
"version": "2.1.0",
"description": "A modular interface for smart mirrors.",
"main": "js/electron.js",
"scripts": {
"start": "electron js/electron.js",
"jscs": "jscs **/**/**/**/*.js",
"stylelint": "stylelint css/main.css fonts/roboto.css",
"htmlvalidator": "html-validator --file=index.html",
"test": "snyk test"
"start": "electron js/electron.js"
},
"repository": {
"type": "git",
@@ -21,32 +17,37 @@
"modular"
],
"author": "Michael Teeuw",
"contributors": "https://github.com/MichMich/MagicMirror/graphs/contributors",
"contributors": [
"https://github.com/MichMich/MagicMirror/graphs/contributors"
],
"license": "MIT",
"bugs": {
"url": "https://github.com/MichMich/MagicMirror/issues"
},
"homepage": "https://github.com/MichMich/MagicMirror#readme",
"devDependencies": {
"electron-prebuilt": "latest",
"grunt": "latest",
"grunt-eslint": "latest",
"grunt-postcss": "latest",
"postcss-reporter": "latest",
"stylelint": "latest",
"grunt-jsonlint": "latest",
"grunt-markdownlint": "^1.0.13",
"grunt-stylelint": "latest",
"grunt-yamllint": "latest",
"stylelint-config-standard": "latest",
"time-grunt": "latest"
},
"dependencies": {
"express": "latest",
"electron": "^1.4.7",
"express": "^4.14.0",
"express-ipfilter": "latest",
"feedme": "latest",
"helmet": "^3.1.0",
"iconv-lite": "latest",
"moment": "latest",
"request": "latest",
"snyk": "latest",
"socket.io": "latest",
"request": "^2.78.0",
"rrule": "latest",
"simple-git": "^1.62.0",
"socket.io": "^1.5.1",
"valid-url": "latest",
"walk": "latest",
"rrule": "latest"
"walk": "latest"
}
}

View File

@@ -1,5 +1,6 @@
var app = require("../js/app.js");
app.start(function(config) {
console.log("");
console.log("Ready to go! Please point your browser to: http://localhost:" + config.port);
var bindAddress = config.address ? config.address : "localhost";
console.log("Ready to go! Please point your browser to: http://" + bindAddress + ":" + config.port);
});

View File

@@ -0,0 +1,8 @@
[Plymouth Theme]
Name=MagicMirror
Description=Mirror Splash
ModuleName=script
[script]
ImageDir=/usr/share/plymouth/themes/MagicMirror
ScriptFile=/usr/share/plymouth/themes/MagicMirror/MagicMirror.script

View File

@@ -0,0 +1,48 @@
screen_width = Window.GetWidth();
screen_height = Window.GetHeight();
theme_image = Image("splash.png");
image_width = theme_image.GetWidth();
image_height = theme_image.GetHeight();
scale_x = image_width / screen_width;
scale_y = image_height / screen_height;
if (scale_x > 1 || scale_y > 1)
{
if (scale_x > scale_y)
{
resized_image = theme_image.Scale (screen_width, image_height / scale_x);
image_x = 0;
image_y = (screen_height - ((image_height * screen_width) / image_width)) / 2;
}
else
{
resized_image = theme_image.Scale (image_width / scale_y, screen_height);
image_x = (screen_width - ((image_width * screen_height) / image_height)) / 2;
image_y = 0;
}
}
else
{
resized_image = theme_image.Scale (image_width, image_height);
image_x = (screen_width - image_width) / 2;
image_y = (screen_height - image_height) / 2;
}
if (Plymouth.GetMode() != "shutdown")
{
sprite = Sprite (resized_image);
sprite.SetPosition (image_x, image_y, -100);
}
message_sprite = Sprite();
message_sprite.SetPosition(screen_width * 0.1, screen_height * 0.9, 10000);
fun message_callback (text) {
my_image = Image.Text(text, 1, 1, 1);
message_sprite.SetImage(my_image);
sprite.SetImage (resized_image);
}
Plymouth.SetUpdateStatusFunction(message_callback);

BIN
splashscreen/splash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

35
translations/da.json Normal file
View File

@@ -0,0 +1,35 @@
{
/* GENERAL */
"LOADING": "Indlæser &hellip;",
/* CALENDAR */
"TODAY": "I dag",
"TOMORROW": "I morgen",
"DAYAFTERTOMORROW": "I overmorgen",
"RUNNING": "Slutter om",
"EMPTY": "Ingen kommende begivenheder.",
/* WEATHER */
"N": "N",
"NNE": "NNØ",
"NE": "NØ",
"ENE": "ØNØ",
"E": "Ø",
"ESE": "ØSØ",
"SE": "SØ",
"SSE": "SSØ",
"S": "S",
"SSW": "SSV",
"SW": "SV",
"WSW": "VSV",
"W": "V",
"WNW": "VNV",
"NW": "NV",
"NNW": "NNV"
/* UPDATE INFO */
"UPDATE_NOTIFICATION": "MagicMirror² opdatering tilgængelig.",
"UPDATE_NOTIFICATION_MODULE": "Opdatering tilgængelig for MODULE_NAME modulet.",
"UPDATE_INFO": "Den nuværende installation er COMMIT_COUNT bagud på BRANCH_NAME branch'en."
}

View File

@@ -1,27 +1,34 @@
{
/* GENERAL */
"LOADING": "Lade &hellip;",
/* GENERAL */
"LOADING": "Lade &hellip;",
/* CALENDAR */
"TODAY": "Heute",
"TOMORROW": "Morgen",
"RUNNING": "noch",
"EMPTY": "Keine Termine.",
/* CALENDAR */
"TODAY": "Heute",
"TOMORROW": "Morgen",
"DAYAFTERTOMORROW": "&Uuml;bermorgen",
"RUNNING": "noch",
"EMPTY": "Keine Termine.",
/* WEATHER */
"N": "N",
"NNE": "NNO",
"ENE": "ONO",
"E": "O",
"ESE": "OSO",
"SE": "SO",
"SSE": "SSO",
"S": "S",
"SSW": "SSW",
"SW": "SW",
"WSW": "WSW",
"W": "W",
"WNW": "WNW",
"NW": "NW",
"NNW": "NNW"
/* WEATHER */
"N": "N",
"NNE": "NNO",
"NE": "NO",
"ENE": "ONO",
"E": "O",
"ESE": "OSO",
"SE": "SO",
"SSE": "SSO",
"S": "S",
"SSW": "SSW",
"SW": "SW",
"WSW": "WSW",
"W": "W",
"WNW": "WNW",
"NW": "NW",
"NNW": "NNW",
/* UPDATE INFO */
"UPDATE_NOTIFICATION": "Aktualisierung für MagicMirror² verfügbar.",
"UPDATE_NOTIFICATION_MODULE": "Aktualisierung für das MODULE_NAME Modul verfügbar.",
"UPDATE_INFO": "Die aktuelle Installation ist COMMIT_COUNT hinter dem BRANCH_NAME branch."
}

View File

@@ -1,27 +1,34 @@
{
/* GENERAL */
"LOADING": "Loading &hellip;",
/* GENERAL */
"LOADING": "Loading &hellip;",
/* CALENDAR */
"TODAY": "Today",
"TOMORROW": "Tomorrow",
"RUNNING": "Ends in",
"EMPTY": "No upcoming events.",
/* CALENDAR */
"TODAY": "Today",
"TOMORROW": "Tomorrow",
"DAYAFTERTOMORROW": "The day after tomorrow",
"RUNNING": "Ends in",
"EMPTY": "No upcoming events.",
/* WEATHER */
"N": "N",
"NNE": "NNE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSW",
"SW": "SW",
"WSW": "WSW",
"W": "W",
"WNW": "WNW",
"NW": "NW",
"NNW": "NNW"
/* WEATHER */
"N": "N",
"NNE": "NNE",
"NE": "NE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSW",
"SW": "SW",
"WSW": "WSW",
"W": "W",
"WNW": "WNW",
"NW": "NW",
"NNW": "NNW",
/* UPDATE INFO */
"UPDATE_NOTIFICATION": "MagicMirror² update available.",
"UPDATE_NOTIFICATION_MODULE": "Update available for MODULE_NAME module.",
"UPDATE_INFO": "The current installation is COMMIT_COUNT behind on the BRANCH_NAME branch."
}

View File

@@ -5,23 +5,30 @@
/* CALENDAR */
"TODAY": "Hoy",
"TOMORROW": "Mañana",
"DAYAFTERTOMORROW": "Pasado mañana",
"RUNNING": "Termina en",
"EMPTY": "No hay eventos programados.",
/* WEATHER */
"N": "N",
"NNE": "NNE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSO",
"SW": "SO",
"WSW": "OSO",
"W": "O",
"WNW": "ONO",
"NW": "NO",
"NNW": "NNO"
"N": "N",
"NNE": "NNE",
"NE": "NE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSO",
"SW": "SO",
"WSW": "OSO",
"W": "O",
"WNW": "ONO",
"NW": "NO",
"NNW": "NNO",
/* UPDATE INFO */
"UPDATE_NOTIFICATION": "MagicMirror² actualización disponible.",
"UPDATE_NOTIFICATION_MODULE": "Disponible una actualización para el módulo MODULE_NAME.",
"UPDATE_INFO": "Tu actual instalación está COMMIT_COUNT cambios detrás de la rama BRANCH_NAME."
}

28
translations/fi.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "Lataa &hellip;",
/* CALENDAR */
"TODAY": "Tänään",
"TOMORROW": "Huomenna",
"RUNNING": "Meneillään",
"EMPTY": "Ei tulevia tapahtumia.",
/* WEATHER */
"N": "P",
"NNE": "PPI",
"NE": "PI",
"ENE": "IPI",
"E": "I",
"ESE": "IEI",
"SE": "EI",
"SSE": "EEI",
"S": "E",
"SSW": "EEL",
"SW": "EL",
"WSW": "LEL",
"W": "L",
"WNW": "LPL",
"NW": "PL",
"NNW": "PPL"
}

View File

@@ -1,27 +1,28 @@
{
/* GENERAL */
"LOADING": "Chargement &hellip;",
/* GENERAL */
"LOADING": "Chargement &hellip;",
/* CALENDAR */
"TODAY": "Aujourd'hui",
"TOMORROW": "Demain",
"RUNNING": "Se termine dans",
"EMPTY": "Aucun RDV.",
/* CALENDAR */
"TODAY": "Aujourd'hui",
"TOMORROW": "Demain",
"RUNNING": "Se termine dans",
"EMPTY": "Aucun RDV.",
/* WEATHER */
"N": "N",
"NNE": "NNE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSO",
"SW": "SO",
"WSW": "OSO",
"W": "O",
"WNW": "ONO",
"NW": "NO",
"NNW": "NNO"
/* WEATHER */
"N": "N",
"NNE": "NNE",
"NE": "NE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSO",
"SW": "SO",
"WSW": "OSO",
"W": "O",
"WNW": "ONO",
"NW": "NO",
"NNW": "NNO"
}

View File

@@ -5,23 +5,25 @@
/* CALENDAR */
"TODAY": "Hjoed",
"TOMORROW": "Moarn",
"DAYAFTERTOMORROW": "Oaremoarn",
"RUNNING": "Einigest oer",
"EMPTY": "Gjin plande &ocirc;fspraken.",
/* WEATHER */
"N": "N",
"NNE": "NNE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSW",
"SW": "SW",
"WSW": "WSW",
"W": "W",
"WNW": "WNW",
"NW": "NW",
"NNW": "NNW"
"N": "N",
"NNE": "NNE",
"NE": "NE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSW",
"SW": "SW",
"WSW": "WSW",
"W": "W",
"WNW": "WNW",
"NW": "NW",
"NNW": "NNW"
}

28
translations/gr.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "Φόρτωση &hellip;",
/* CALENDAR */
"TODAY": "Σήμερα",
"TOMORROW": "Αύριο",
"RUNNING": "Λήγει σε",
"EMPTY": "Δεν υπάρχουν προσεχείς εκδηλώσεις.",
/* WEATHER */
"N": "B",
"NNE": "BBA",
"NE": "BA",
"ENE": "ABA",
"E": "A",
"ESE": "ANA",
"SE": "NA",
"SSE": "NNA",
"S": "N",
"SSW": "NNΔ",
"SW": "NΔ",
"WSW": "ΔNΔ",
"W": "Δ",
"WNW": "ΔΒΔ",
"NW": "ΒΔ",
"NNW": "ΒΒΔ"
}

28
translations/it.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "Caricamento in corso &hellip;",
/* CALENDAR */
"TODAY": "Oggi",
"TOMORROW": "Domani",
"RUNNING": "Termina entro",
"EMPTY": "Nessun evento in arrivo.",
/* WEATHER */
"N": "N",
"NNE": "NNE",
"NE": "NE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSW",
"SW": "SW",
"WSW": "WSW",
"W": "W",
"WNW": "WNW",
"NW": "NW",
"NNW": "NNW"
}

28
translations/ja.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "ローディング &hellip;",
/* CALENDAR */
"TODAY": "今日",
"TOMORROW": "明日",
"RUNNING": "で終わります",
"EMPTY": "直近のイベントはありません",
/* WEATHER */
"N": "北",
"NNE": "北北東",
"NE": "北東",
"ENE": "東北東",
"E": "東",
"ESE": "東南東",
"SE": "南東",
"SSE": "南南東",
"S": "南",
"SSW": "南南西",
"SW": "南西",
"WSW": "西南西",
"W": "西",
"WNW": "西北西",
"NW": "北西",
"NNW": "北北西"
}

28
translations/nb.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "Laster &hellip;",
/* CALENDAR */
"TODAY": "I dag",
"TOMORROW": "I morgen",
"RUNNING": "Slutter om",
"EMPTY": "Ingen kommende arrangementer.",
/* WEATHER */
"N": "N",
"NNE": "NNØ",
"NE": "NØ",
"ENE": "ØNØ",
"E": "Ø",
"ESE": "ØSØ",
"SE": "SØ",
"SSE": "SSØ",
"S": "S",
"SSW": "SSV",
"SW": "SV",
"WSW": "VSV",
"W": "V",
"WNW": "VNV",
"NW": "NV",
"NNW": "NNV"
}

View File

@@ -5,23 +5,30 @@
/* CALENDAR */
"TODAY": "Vandaag",
"TOMORROW": "Morgen",
"RUNNING": "Eindigd over",
"DAYAFTERTOMORROW": "Overmorgen",
"RUNNING": "Eindigt over",
"EMPTY": "Geen geplande afspraken.",
/* WEATHER */
"N": "N",
"NNE": "NNO",
"ENE": "ONO",
"E": "O",
"ESE": "OZO",
"SE": "ZO",
"SSE": "ZZO",
"S": "Z",
"SSW": "ZZW",
"SW": "ZW",
"WSW": "WZW",
"W": "W",
"WNW": "WNW",
"NW": "NW",
"NNW": "NNW"
"N": "N",
"NNE": "NNO",
"NE": "NO",
"ENE": "ONO",
"E": "O",
"ESE": "OZO",
"SE": "ZO",
"SSE": "ZZO",
"S": "Z",
"SSW": "ZZW",
"SW": "ZW",
"WSW": "WZW",
"W": "W",
"WNW": "WNW",
"NW": "NW",
"NNW": "NNW",
/* UPDATE INFO */
"UPDATE_NOTIFICATION": "MagicMirror² update beschikbaar.",
"UPDATE_NOTIFICATION_MODULE": "Update beschikbaar voor MODULE_NAME module.",
"UPDATE_INFO": "De huidige installatie loopt COMMIT_COUNT achter op de BRANCH_NAME branch."
}

28
translations/nn.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "Lastar &hellip;",
/* CALENDAR */
"TODAY": "I dag",
"TOMORROW": "I morgon",
"RUNNING": "Sluttar om",
"EMPTY": "Ingen komande hendingar.",
/* WEATHER */
"N": "N",
"NNE": "NNA",
"NE": "NA",
"ENE": "ANA",
"E": "A",
"ESE": "ASA",
"SE": "SA",
"SSE": "SSA",
"S": "S",
"SSW": "SSV",
"SW": "SV",
"WSW": "VSV",
"W": "V",
"WNW": "VNV",
"NW": "NV",
"NNW": "NNV"
}

33
translations/pl.json Normal file
View File

@@ -0,0 +1,33 @@
{
/* GENERAL */
"LOADING": "Ładowanie &hellip;",
/* CALENDAR */
"TODAY": "Dziś",
"TOMORROW": "Jutro",
"RUNNING": "Koniec za",
"EMPTY": "Brak wydarzeń.",
/* WEATHER */
"N": "N",
"NNE": "NNE",
"NE": "NE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSW",
"SW": "SW",
"WSW": "WSW",
"W": "W",
"WNW": "WNW",
"NW": "NW",
"NNW": "NNW"
/* UPDATE INFO */
"UPDATE_NOTIFICATION": "Dostępna jest aktualizacja MagicMirror².",
"UPDATE_NOTIFICATION_MODULE": "Dostępna jest aktualizacja modułu MODULE_NAME.",
"UPDATE_INFO": "The current installation is COMMIT_COUNT behind on the BRANCH_NAME branch."
}

28
translations/pt.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "A carregar &hellip;",
/* CALENDAR */
"TODAY": "Hoje",
"TOMORROW": "Amanhã",
"RUNNING": "Termina em",
"EMPTY": "Sem eventos a chegar.",
/* WEATHER */
"N": "N",
"NNE": "NNE",
"NE": "NE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSO",
"SW": "SO",
"WSW": "OSO",
"W": "O",
"WNW": "ONO",
"NW": "NO",
"NNW": "NNO"
}

28
translations/pt_br.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "Carregando &hellip;",
/* CALENDAR */
"TODAY": "Hoje",
"TOMORROW": "Amanhã",
"RUNNING": "Acaba em",
"EMPTY": "Nenhum evento novo.",
/* WEATHER */
"N": "N",
"NNE": "NNE",
"NE": "NE",
"ENE": "ENE",
"E": "E",
"ESE": "ESE",
"SE": "SE",
"SSE": "SSE",
"S": "S",
"SSW": "SSO",
"SW": "SO",
"WSW": "OSO",
"W": "O",
"WNW": "ONO",
"NW": "NO",
"NNW": "NNO"
}

28
translations/sv.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "Laddar &hellip;",
/* CALENDAR */
"TODAY": "Idag",
"TOMORROW": "Imorgon",
"RUNNING": "Slutar",
"EMPTY": "Inga kommande händelser.",
/* WEATHER */
"N": "N",
"NNE": "NNO",
"NE": "NO",
"ENE": "ONO",
"E": "Ö",
"ESE": "OSO",
"SE": "SO",
"SSE": "SSO",
"S": "S",
"SSW": "SSV",
"SW": "SV",
"WSW": "VSV",
"W": "V",
"WNW": "VNV",
"NW": "NV",
"NNW": "NNV"
}

28
translations/tr.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "Yükleniyor &hellip;",
/* CALENDAR */
"TODAY": "Bugün",
"TOMORROW": "Yarın",
"RUNNING": "Biten",
"EMPTY": "Yakında etkinlik yok.",
/* WEATHER */
"N": "K",
"NNE": "KKD",
"NE": "KD",
"ENE": "DKD",
"E": "D",
"ESE": "DGD",
"SE": "GD",
"SSE": "GGD",
"S": "G",
"SSW": "GGB",
"SW": "GB",
"WSW": "BGB",
"W": "B",
"WNW": "BKB",
"NW": "KB",
"NNW": "KKB"
}

View File

@@ -6,10 +6,24 @@
*/
var translations = {
"en" : "translations/en.json",
"nl" : "translations/nl.json",
"de" : "translations/de.json",
"fr" : "translations/fr.json",
"fy" : "translations/fy.json",
"es" : "translations/es.json",
"en" : "translations/en.json", // English
"nl" : "translations/nl.json", // Dutch
"de" : "translations/de.json", // German
"fi" : "translations/fi.json", // Suomi
"fr" : "translations/fr.json", // French
"fy" : "translations/fy.json", // Frysk
"es" : "translations/es.json", // Spanish
"nb" : "translations/nb.json", // Norsk bokmål
"nn" : "translations/nn.json", // Norsk nynorsk
"pt" : "translations/pt.json", // Português
"pt_br" : "translations/pt_br.json", // Português Brasileiro
"sv" : "translations/sv.json", // Svenska
"it" : "translations/it.json", // Italian
"zh_cn" : "translations/zh_cn.json", // Simplified Chinese
"zh_tw" : "translations/zh_tw.json", // Traditional Chinese
"ja" : "translations/ja.json", // Japanese
"pl" : "translations/pl.json", // Polish
"gr" : "translations/gr.json", // Greek
"da" : "translations/da.json", // Danish
"tr" : "translations/tr.json", // Turkish
};

28
translations/zh_cn.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "正在加载 &hellip;",
/* CALENDAR */
"TODAY": "今天",
"TOMORROW": "明天",
"RUNNING": "结束日期",
"EMPTY": "没有更多的活动。",
/* WEATHER */
"N": "北风",
"NNE": "北偏东风",
"NE": "东北风",
"ENE": "东偏北风",
"E": "东风",
"ESE": "东偏南风",
"SE": "东南风",
"SSE": "南偏东风",
"S": "南风",
"SSW": "南偏西风",
"SW": "西南风",
"WSW": "西偏南风",
"W": "西风",
"WNW": "西偏北风",
"NW": "西北风",
"NNW": "北偏西风"
}

28
translations/zh_tw.json Normal file
View File

@@ -0,0 +1,28 @@
{
/* GENERAL */
"LOADING": "正在加載 &hellip;",
/* CALENDAR */
"TODAY": "今天",
"TOMORROW": "明天",
"RUNNING": "結束日期",
"EMPTY": "沒有更多的活動。",
/* WEATHER */
"N": "北風",
"NNE": "北偏東風",
"NE": "東北風",
"ENE": "東偏北風",
"E": "東風",
"ESE": "東偏南風",
"SE": "東南風",
"SSE": "南偏東風",
"S": "南風",
"SSW": "南偏西風",
"SW": "西南風",
"WSW": "西偏南風",
"W": "西風",
"WNW": "西偏北風",
"NW": "西北風",
"NNW": "北偏西風"
}

1197
vendor/moment/moment-timezone.js vendored Normal file

File diff suppressed because it is too large Load Diff

4
vendor/vendor.js vendored
View File

@@ -9,6 +9,8 @@
var vendor = {
'moment.js' : 'moment/moment-with-locales.js',
'weather-icons.css': 'weather-icons/weather-icons.css',
'moment-timezone.js' : 'moment/moment-timezone.js',
'weather-icons.css': 'weather-icons/css/weather-icons.css',
'weather-icons-wind.css': 'weather-icons/css/weather-icons-wind.css',
'font-awesome.css': 'font-awesome-4.5.0/css/font-awesome.min.css'
};

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

1838
vendor/weather-icons/css/weather-icons.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -0,0 +1,257 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="weather_iconsregular" horiz-adv-x="1537" >
<font-face units-per-em="2048" ascent="1755" descent="-293" />
<missing-glyph horiz-adv-x="685" />
<glyph horiz-adv-x="0" />
<glyph horiz-adv-x="682" />
<glyph unicode=" " horiz-adv-x="685" />
<glyph unicode="&#x09;" horiz-adv-x="685" />
<glyph unicode="&#xa0;" horiz-adv-x="685" />
<glyph unicode="&#x2000;" horiz-adv-x="1122" />
<glyph unicode="&#x2001;" horiz-adv-x="2245" />
<glyph unicode="&#x2002;" horiz-adv-x="1122" />
<glyph unicode="&#x2003;" horiz-adv-x="2245" />
<glyph unicode="&#x2004;" horiz-adv-x="748" />
<glyph unicode="&#x2005;" horiz-adv-x="561" />
<glyph unicode="&#x2006;" horiz-adv-x="374" />
<glyph unicode="&#x2007;" horiz-adv-x="374" />
<glyph unicode="&#x2008;" horiz-adv-x="280" />
<glyph unicode="&#x2009;" horiz-adv-x="449" />
<glyph unicode="&#x200a;" horiz-adv-x="124" />
<glyph unicode="&#x202f;" horiz-adv-x="449" />
<glyph unicode="&#x205f;" horiz-adv-x="561" />
<glyph unicode="&#x25fc;" horiz-adv-x="571" d="M0 0z" />
<glyph unicode="&#xf000;" horiz-adv-x="3126" d="M0 90q0 -38 29 -64q27 -27 65 -27h627q41 0 72.5 -30t31.5 -73t-31.5 -74t-72.5 -31t-73 32q-29 26 -65 26q-38 0 -64 -25.5t-26 -63.5t26 -64q85 -85 202 -85q118 0 201 83.5t83 201.5t-83 202t-201 84h-627q-38 0 -66 -27.5t-28 -64.5zM0 411q0 -35 29 -61 q27 -27 65 -27h1170q118 0 201.5 83.5t83.5 201.5t-83 200t-202 82q-121 0 -201 -81q-25 -26 -25 -65t24.5 -63.5t63.5 -24.5q38 0 66 25q30 30 72 30t72.5 -30t30.5 -73t-30.5 -74t-72.5 -31h-1170q-38 0 -66 -27.5t-28 -64.5zM283 662q0 -13 18 -13h153q11 0 21 15 q36 87 111.5 143.5t170.5 63.5l56 8q20 0 20 18l7 55q17 173 146 289t304 116q176 0 305.5 -115.5t147.5 -289.5l7 -62q0 -19 19 -19h174q144 0 245.5 -100.5t101.5 -242.5q0 -143 -101.5 -244.5t-245.5 -101.5h-736q-20 0 -20 -19v-146q0 -18 20 -18h736q143 0 264.5 71 t192 193t70.5 265q0 118 -45 216q121 159 121 353q0 150 -75.5 279t-204.5 204.5t-279 75.5q-247 0 -412 -185q-128 65 -285 65q-225 0 -398 -139.5t-220 -356.5q-136 -32 -240.5 -131t-145.5 -234v-4q-3 -5 -3 -9zM1155 1838q0 -37 29 -64l65 -69q26 -26 65 -26 q40 0 65.5 24.5t25.5 64.5q0 38 -24 64l-70 69q-25 28 -63 28t-65.5 -27t-27.5 -64zM1723 1368q115 109 264 109q155 0 267.5 -112t112.5 -268q0 -104 -55 -195q-153 153 -369 153h-36q-38 173 -184 313zM1896 1927q0 -37 26.5 -62.5t64.5 -25.5t65 25.5t27 62.5v218 q0 38 -27 65t-65 27t-64.5 -27t-26.5 -65v-218zM2488 1685q0 -39 24 -64q27 -27 65 -27.5t61 27.5l156 153q27 27 27 65q0 37 -27 64t-65 27t-64 -26l-153 -157q-24 -25 -24 -62zM2570 423q0 -37 27 -64l68 -69q32 -26 66 -26q31 0 63 26q27 27 27 64q0 35 -27 65l-68 69 q-26 26 -62 26q-40 0 -67 -26.5t-27 -64.5zM2731 1097q0 -38 27 -63q24 -28 61 -28h216q38 0 65 27t27 64t-27.5 64.5t-64.5 27.5h-216q-38 0 -63 -27t-25 -65z" />
<glyph unicode="&#xf001;" horiz-adv-x="3105" d="M0 94q0 -39 26 -65q70 -29 94 -29h840q38 0 64.5 27.5t26.5 65.5q0 37 -26.5 62.5t-64.5 25.5h-840q-42 0 -81 -25.5t-39 -61.5zM149 414q0 -38 27 -63q24 -28 62 -28h1003q38 0 65 26.5t27 64.5t-27 65t-65 27h-1003q-37 0 -63 -27t-26 -65zM261 667q0 -14 18 -14h148 q19 0 23 14q41 85 116 140.5t169 66.5h58q17 0 17 20l8 60q11 114 74 207.5t163.5 146.5t215.5 53q174 0 304 -117t148 -290l8 -60q0 -20 19 -20h171q142 0 245.5 -102t103.5 -242q0 -144 -103 -246.5t-246 -102.5h-735q-18 0 -18 -20v-142q0 -19 18 -19h735q144 0 266 71 t193 193t71 266q0 116 -46 214q124 154 124 350q0 150 -75.5 279t-205 204.5t-280.5 75.5q-117 0 -223.5 -47.5t-185.5 -133.5q-132 69 -288 69q-226 0 -401 -140t-223 -358q-136 -34 -239.5 -133.5t-144.5 -235.5q-2 -2 -2 -7zM337 -246q0 -38 28 -63q25 -27 62 -27h1005 q37 0 63 26.5t26 63.5q0 40 -25.5 66.5t-63.5 26.5h-1005q-38 0 -64 -26.5t-26 -66.5zM1135 1835q0 -40 26 -64l68 -70q26 -26 64 -26q41 0 66.5 25.5t25.5 65.5q0 37 -26 63l-69 69q-27 27 -61 27q-40 0 -67 -26.5t-27 -63.5zM1707 1368q106 101 261 101 q156 0 265.5 -109.5t109.5 -265.5q0 -107 -49 -193q-151 152 -373 152h-32q-46 184 -182 315zM1878 1925q0 -38 26.5 -63t63.5 -25q40 0 64.5 24.5t24.5 63.5v218q0 39 -25 65.5t-64 26.5q-37 0 -63.5 -27t-26.5 -65v-218zM2467 1681q0 -39 27 -64q20 -26 64 -26q43 0 63 26 l156 154q26 24 26 66q0 37 -26.5 63.5t-64.5 26.5t-65 -25l-153 -158q-27 -26 -27 -63zM2552 416q0 -39 25 -64l70 -67q39 -29 65 -29t65 29q26 26 26 64q0 37 -26 65l-68 65q-30 28 -69 28q-38 0 -63 -26t-25 -65zM2706 1090q0 -39 29 -65q29 -27 64 -27h217q36 0 62.5 27 t26.5 65q0 36 -26 60.5t-63 24.5h-217q-39 0 -66 -24.5t-27 -60.5z" />
<glyph unicode="&#xf002;" horiz-adv-x="2867" d="M0 528q0 -144 70.5 -266t191.5 -192.5t264 -70.5h1155q143 0 265 70.5t193 192.5t71 266q0 106 -45 213q122 149 122 353q0 114 -44 217.5t-119 178.5t-178.5 119t-217.5 44q-237 0 -414 -186q-124 70 -288 70q-225 0 -398 -139.5t-222 -357.5q-179 -41 -292.5 -184 t-113.5 -328zM182 528q0 134 89.5 231t224.5 113l53 3q20 0 20 19l7 58q22 173 150 289.5t300 116.5q176 0 306.5 -117t146.5 -289l8 -62q4 -18 22 -18h172q141 0 243 -102t102 -242q0 -145 -101.5 -247.5t-243.5 -102.5h-1155q-140 0 -242 103.5t-102 246.5zM897 1837 q0 -39 26 -67l70 -68q40 -30 68 -27q33 0 59 27.5t26 66.5t-28 63l-63 70q-29 26 -65 26q-39 0 -66 -26.5t-27 -64.5zM1467 1365q111 107 261 107q158 0 268.5 -110t110.5 -268q0 -100 -54 -196q-155 153 -372 153h-34q-40 174 -180 314zM1640 1928q0 -41 25 -66t63 -25 q41 0 66 25t25 66v218q0 38 -25.5 63t-65.5 25q-38 0 -63 -25t-25 -63v-218zM2229 1683q0 -41 24 -66q34 -26 66 -26q29 0 63 26l153 153q26 29 26 68q0 38 -26 64t-63 26q-38 0 -62 -26l-157 -153q-24 -29 -24 -66zM2314 421q0 -38 27 -67l69 -67q24 -26 62 -26t63.5 26.5 t25.5 66.5q0 36 -26 62l-69 69q-26 26 -61 26q-38 0 -64.5 -26t-26.5 -64zM2470 1094q0 -37 28 -62q26 -26 65 -26h218q37 0 61.5 25t24.5 63t-24.5 64.5t-61.5 26.5h-218q-38 0 -65.5 -27t-27.5 -64z" />
<glyph unicode="&#xf003;" horiz-adv-x="3132" d="M0 85q0 -37 27 -62.5t67 -25.5h1996q38 0 65 25.5t27 62.5q0 38 -27 64.5t-65 26.5h-1996q-40 0 -67 -26.5t-27 -64.5zM280 419q0 -37 27 -62q27 -29 64 -29h1997q37 0 62.5 26.5t25.5 64.5q0 37 -25 62.5t-63 25.5h-1997q-38 0 -64.5 -25.5t-26.5 -62.5zM293 675 q0 -14 17 -14h153q11 0 22 17q38 83 113.5 136t166.5 60l58 8q18 0 18 19l7 54q17 173 146.5 289t304.5 116q173 0 302.5 -115t147.5 -286l8 -62q0 -18 20 -18h172q103 0 187.5 -55t125.5 -146q11 -17 21 -17h154q21 0 14 24l-21 59q121 150 121 353q0 113 -44 216t-118 178 t-178 119t-218 44q-247 0 -408 -179q-135 67 -286 67q-224 0 -398.5 -140.5t-223.5 -359.5q-285 -75 -382 -357q-2 -3 -2 -10zM466 -243q0 -38 29 -64q25 -28 63 -28h1999q37 0 64 27t27 65q0 37 -26.5 61.5t-64.5 24.5h-1999q-38 0 -65 -24.5t-27 -61.5zM1167 1834 q0 -38 25 -63l69 -68q27 -29 62 -29q36 0 63.5 26.5t27.5 65.5q0 38 -27 67l-68 65q-26 28 -64 28q-39 0 -63.5 -26.5t-24.5 -65.5zM1734 1367q108 108 259 108q157 0 267.5 -111t110.5 -267q0 -104 -52 -192q-152 152 -370 152h-36q-45 188 -179 310zM1905 1925 q0 -37 25.5 -62.5t62.5 -25.5q40 0 67 25.5t27 62.5v218q0 37 -28 64t-66 27q-37 0 -62.5 -26.5t-25.5 -64.5v-218zM2491 1682q0 -36 26 -64q59 -57 131 0l152 153q26 28 26 68q0 37 -26 63t-63 26q-38 0 -64 -26l-156 -157q-26 -28 -26 -63zM2577 424q0 -38 28 -64l68 -69 q26 -26 62 -26q33 0 65 26q26 28 26 68q0 36 -26 60l-69 70q-28 26 -64 26q-38 0 -64 -26.5t-26 -64.5zM2735 1097q0 -39 28 -64q24 -27 63 -27h219q37 0 62.5 26.5t25.5 64.5t-25.5 64t-62.5 26h-219q-38 0 -64.5 -26.5t-26.5 -63.5z" />
<glyph unicode="&#xf004;" horiz-adv-x="2884" d="M0 530q0 -214 149 -367.5t363 -163.5q19 0 19 18v143q0 19 -19 19q-137 7 -233.5 109.5t-96.5 241.5q0 133 90.5 231t224.5 114l57 4q21 0 21 19l7 59q17 173 146.5 289.5t305.5 116.5q174 0 305.5 -116.5t149.5 -289.5l8 -62q0 -20 18 -20h173q143 0 247.5 -102.5 t104.5 -242.5q0 -139 -97 -241.5t-234 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q214 7 362 161.5t148 369.5q0 119 -44 214q126 154 126 355q0 151 -76 280.5t-205.5 205.5t-280.5 76q-250 0 -416 -187q-128 70 -289 70q-226 0 -401.5 -140t-225.5 -359q-177 -42 -292 -186 t-115 -329zM569 -223q16 -35 49 -48q32 -16 67.5 -2.5t47.5 47.5q16 35 2.5 69t-47.5 47q-32 17 -66.5 3t-50.5 -50q-15 -27 -2 -66zM638 80q0 -22 10 -41q31 -49 95 -49q51 0 74 69l111 343q13 39 -7.5 71.5t-58.5 39.5q-35 11 -67.5 -6.5t-43.5 -53.5l-110 -344 q-3 -15 -3 -29zM837 -519q0 -21 5 -31q14 -35 48 -48q15 -8 37 -8q10 0 32 6q35 13 50.5 48.5t-0.5 70.5t-48 48.5t-66 -0.5q-31 -12 -44.5 -37.5t-13.5 -48.5zM902 1843q0 -40 26 -64l69 -69q26 -26 58 -29q33 -5 65.5 24.5t32.5 68.5q0 38 -26 64l-68 68q-30 27 -66 27 q-39 0 -65 -26t-26 -64zM915 -232q0 -26 17 -51t51 -35q18 -4 26 -4q24 0 41 8q32 13 46 61l192 655q11 38 -6 69.5t-53 41.5q-38 11 -70.5 -6t-43.5 -54l-196 -660q-4 -20 -4 -25zM1283 -191q0 -20 7 -33q14 -33 48 -47q17 -8 37 -8q10 0 32 6q36 14 49 47q13 35 0 67.5 t-45 48.5q-36 17 -70 3t-51 -50q-7 -13 -7 -34zM1360 83q0 -25 16.5 -48.5t49.5 -33.5q14 -3 27 -3q62 0 84 65l110 339q12 37 -7 69t-55 42q-38 11 -68.5 -6t-42.5 -54l-109 -341q-5 -22 -5 -29zM1474 1371q107 103 265 103q156 0 267 -109.5t111 -265.5q0 -100 -55 -197 q-153 154 -374 154h-33q-47 185 -181 315zM1647 1933q0 -38 27 -65t65 -27q37 0 62.5 27t25.5 65v220q0 38 -25.5 65t-62.5 27q-38 0 -65 -27t-27 -65v-220zM2239 1689q0 -39 27 -64q24 -28 61.5 -27.5t64.5 27.5l154 154q29 24 29 64q0 38 -27.5 65t-65.5 27q-35 0 -61 -29 l-155 -153q-27 -25 -27 -64zM2325 419q0 -36 26 -64l70 -67q23 -29 64 -29q38 0 61 29q29 26 29 64t-29 65l-69 66q-25 28 -62 28t-63.5 -27t-26.5 -65zM2481 1099q0 -38 28 -64q28 -28 66 -28h217q38 0 65.5 27t27.5 65q0 37 -27 62.5t-66 25.5h-217q-40 0 -67 -25.5 t-27 -62.5z" />
<glyph unicode="&#xf005;" horiz-adv-x="2868" d="M0 528q0 -213 148.5 -366t362.5 -163q18 0 18 18v146q0 19 -18 19q-139 11 -234 110.5t-95 235.5q0 134 90.5 233.5t223.5 110.5l56 8q21 0 21 18l6 54q17 173 146.5 289.5t305.5 116.5q174 0 303.5 -116t148.5 -290l7 -62q0 -18 20 -18h171q145 0 247.5 -101t102.5 -243 q0 -136 -95 -235.5t-234 -110.5q-21 0 -21 -19v-146q0 -18 21 -18q213 7 360.5 161t147.5 368q0 108 -50 221q127 151 127 349q0 114 -44.5 217.5t-119.5 178.5t-178.5 119t-216.5 44q-247 0 -414 -185q-137 66 -283 66q-227 0 -401.5 -139t-223.5 -359 q-176 -41 -291 -184.5t-115 -327.5zM800 -674h32l567 837q6 7 2.5 14.5t-14.5 7.5h-233l245 449q12 23 -15 23h-314q-13 0 -23 -15l-230 -610q-4 -22 15 -22h231zM894 1841q0 -40 26 -66l70 -69q67 -51 129 0q26 29 26 68q0 37 -26 63l-68 69q-30 27 -66 27q-37 0 -64 -27 t-27 -65zM1464 1369q109 109 264 109q156 0 266 -111t110 -269q0 -97 -54 -193q-156 150 -369 150h-33q-43 182 -184 314zM1637 1933q0 -40 25.5 -66t65.5 -26q38 0 63 25.5t25 66.5v218q0 38 -25 63t-63 25t-64.5 -25t-26.5 -63v-218zM2225 1686q0 -37 29 -64t59 -27 q26 0 66 27l154 153q27 29 27 67q0 39 -26.5 65t-64.5 26q-35 0 -62 -27l-153 -153q-29 -31 -29 -67zM2312 425q0 -37 26 -65l69 -70q26 -26 62 -26q38 0 64.5 27t26.5 67q0 36 -27 61l-66 70q-30 25 -66 25q-37 0 -63 -26t-26 -63zM2467 1098q0 -35 28 -61q27 -27 64 -27 h218q38 0 65 25.5t27 62.5q0 38 -27.5 65t-64.5 27h-218q-37 0 -64.5 -27t-27.5 -65z" />
<glyph unicode="&#xf006;" horiz-adv-x="2885" d="M0 523q0 -212 146 -363t360 -161q19 0 19 18v142q0 19 -19 19q-137 7 -231 106.5t-94 238.5q0 135 90 234t224 110l56 8q17 0 17 15l8 59q20 175 147.5 290t302.5 115t305.5 -115t147.5 -287l7 -62q4 -18 23 -18h171q142 0 244 -102.5t102 -246.5q0 -139 -94 -238.5 t-231 -106.5q-21 0 -21 -19v-142q0 -18 21 -18q213 7 359 159t146 365q0 108 -41 214q124 154 124 357q0 113 -44 216.5t-119 178.5t-178.5 119.5t-217.5 44.5q-246 0 -412 -186q-143 70 -292 70q-226 0 -398.5 -140t-221.5 -360q-180 -41 -293 -184.5t-113 -329.5z M571 -227q0 -27 17.5 -54t50.5 -37q37 -11 68.5 4t42.5 60l15 65q8 36 -10.5 67.5t-55.5 42.5q-36 11 -68 -8t-42 -57l-15 -63q-3 -9 -3 -20zM653 82q0 -35 26 -61q25 -27 60 -27q38 0 64.5 25.5t26.5 62.5t-26.5 62.5t-64.5 25.5q-37 0 -61.5 -25t-24.5 -63zM718 325 q-2 -25 14 -48.5t51 -34.5q33 -10 66.5 7.5t44.5 54.5l29 96q12 39 -7 69.5t-58 41.5q-35 11 -67.5 -7t-43.5 -53l-26 -98q-3 -27 -3 -28zM841 -560q0 -27 17 -52.5t52 -35.5q14 -3 26 -3q69 0 85 65l14 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-14 -63 q-4 -18 -4 -24zM901 1834q0 -38 26 -64l70 -68q22 -25 57.5 -27.5t66.5 27.5q26 26 26 63q0 38 -26 64l-67 69q-25 25 -63 28q-37 0 -63.5 -27t-26.5 -65zM925 -250q0 -36 26 -62t62 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM991 -8q-2 -24 14.5 -50 t48.5 -32q37 -10 68 6t44 60l28 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1286 -237q0 -27 16 -51.5t49 -34.5q5 0 15 -2t15 -2q65 0 81 70l15 64q11 34 -7.5 67t-54.5 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -2 -1.5 -12 t-1.5 -15zM1365 78q0 -37 26 -61q24 -26 62 -26t63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1430 325q0 -27 17 -51.5t52 -34.5q3 0 13 -2t15 -2q17 0 39 10q33 17 43 56l26 96q10 36 -7.5 67.5t-53.5 42.5q-37 11 -68.5 -6t-42.5 -54l-30 -97q0 -3 -1.5 -11.5 t-1.5 -13.5zM1467 1361q106 106 263 106q158 0 269 -108.5t111 -264.5q0 -106 -57 -200q-157 157 -373 157h-33q-45 175 -180 310zM1643 1923q0 -37 24.5 -61.5t62.5 -24.5q39 0 66 24.5t27 61.5v220q0 37 -27.5 64t-65.5 27q-37 0 -62 -26.5t-25 -64.5v-220zM2232 1681 q0 -40 24 -64q57 -57 129 0l153 153q27 27 27 67q0 38 -26.5 64.5t-64.5 26.5q-37 0 -65 -26l-153 -158q-24 -23 -24 -63zM2315 417q0 -37 29 -63l65 -67q32 -26 65 -26q32 0 64 26q27 25 27 63q0 36 -27 66l-69 65q-24 27 -61 27t-64 -27q-29 -27 -29 -64zM2473 1094 q0 -38 28 -63q29 -29 66 -29h216q37 0 62.5 27t25.5 65t-25.5 64.5t-62.5 26.5h-216q-38 0 -66 -27t-28 -64z" />
<glyph unicode="&#xf007;" horiz-adv-x="2885" d="M0 527q0 -180 107 -321.5t275 -188.5q15 -2 26 8l125 150q-143 0 -245 103.5t-102 248.5q0 133 90.5 231t225.5 114l52 3q21 0 21 20l8 58q17 173 147 290t305 117q176 0 307 -117t148 -290l7 -63q7 -18 23 -18h175q141 0 243 -101.5t102 -243.5q0 -135 -90.5 -236 t-220.5 -112q-78 -9 -96 -30l-234 -301q-22 -30 -17 -67t33 -60q24 -27 63.5 -22t63.5 38l205 262q131 13 239.5 87t171.5 191t63 250q0 115 -45 214q126 153 126 355q0 113 -45 217t-120.5 179t-179.5 120t-218 45q-240 0 -414 -186q-127 70 -290 70q-226 0 -400 -140.5 t-221 -359.5q-181 -41 -297.5 -185t-116.5 -329zM416 -352q12 -35 49 -51q35 -16 71 -1t49 50q15 33 0.5 66.5t-47.5 49.5q-35 16 -70.5 2t-48.5 -49q-13 -41 -3 -67zM609 -59v-12q3 -35 32 -59q28 -24 67 -21t61 31l233 301q23 29 20 67.5t-31 60.5q-29 24 -67.5 20 t-64.5 -33l-229 -299q-21 -26 -21 -56zM664 -578q0 -10 6 -32q14 -35 49 -49q18 -7 38 -7q15 0 33 5q34 13 47 47q16 35 2.5 71t-47.5 49q-35 16 -71.5 1.5t-48.5 -48.5q-8 -17 -8 -37zM842 -325v-11q3 -36 35 -62q24 -26 64 -21.5t64 36.5l442 558q22 32 18 68.5t-33 62.5 q-29 23 -66 18.5t-60 -33.5l-444 -561q-20 -24 -20 -55zM904 1839q0 -39 29 -63l65 -70q25 -25 58 -28q33 -5 65.5 24t32.5 68q0 36 -26 64l-69 69q-24 26 -62 26q-39 0 -66 -26t-27 -64zM1218 -447q0 -19 7 -33q14 -35 48 -49q17 -8 37 -8q10 0 32 6q36 14 49 49 q16 35 2.5 70.5t-47.5 48.5q-35 16 -71.5 2t-49.5 -48q-7 -18 -7 -38zM1475 1368q113 103 264 103q158 0 270 -109.5t112 -265.5q0 -106 -55 -198q-155 155 -371 155h-36q-44 184 -184 315zM1648 1929q0 -37 26.5 -62.5t64.5 -25.5q39 0 66 25.5t27 62.5v221q0 37 -27.5 64 t-65.5 27q-37 0 -64 -26.5t-27 -64.5v-221zM2243 1686q0 -38 24 -64q28 -27 65.5 -27.5t60.5 27.5l159 154q26 26 26 65q0 38 -27.5 65.5t-64.5 27.5q-35 0 -64 -27l-155 -157q-24 -26 -24 -64zM2326 416q0 -38 26 -64l70 -67q26 -26 58 -29h6q28 0 66 29q26 26 26 62 q0 38 -26 67l-70 66q-26 27 -63 27q-39 0 -66 -26.5t-27 -64.5zM2486 1096q0 -38 26 -64q26 -29 64 -29h218q38 0 65 27.5t27 65.5q0 37 -27 62.5t-65 25.5h-218q-38 0 -64 -25.5t-26 -62.5z" />
<glyph unicode="&#xf008;" horiz-adv-x="2877" d="M0 529q0 -213 148.5 -366.5t363.5 -163.5q18 0 18 18v143q0 18 -18 18q-137 7 -233.5 109.5t-96.5 241.5q0 132 90.5 230t224.5 114l56 5q21 0 21 18l7 58q17 173 146.5 290t304.5 117q174 0 305 -117t149 -290l8 -61q0 -20 18 -20h173q142 0 245.5 -102t103.5 -242 q0 -139 -96 -241.5t-233 -109.5q-20 0 -20 -18v-143q0 -18 20 -18q213 7 361.5 161.5t148.5 368.5q0 115 -45 214q125 155 125 353q0 152 -75.5 281.5t-204.5 204.5t-280 75q-249 0 -414 -186q-131 70 -289 70q-226 0 -401 -140.5t-224 -358.5q-177 -42 -292 -185.5 t-115 -327.5zM576 -202q0 -27 17.5 -52.5t52.5 -35.5q18 -4 29 -4q63 0 82 68l169 627q11 38 -8.5 71t-56.5 40q-35 11 -67.5 -7t-43.5 -54l-169 -630q-5 -20 -5 -23zM854 -531q0 -30 16 -55.5t55 -31.5q18 -4 28 -4q25 0 48 18.5t29 51.5l256 953q10 37 -7.5 68.5 t-53.5 42.5q-37 11 -69.5 -7t-42.5 -54l-256 -953q-3 -27 -3 -29zM899 1840q0 -38 27 -65l69 -70q31 -24 66 -24q34 0 62 25t28 63q0 39 -26 68l-68 69q-29 27 -64 27q-39 0 -66.5 -27.5t-27.5 -65.5zM1297 -205q0 -26 16.5 -50.5t49.5 -34.5q18 -4 27 -4q28 0 52.5 15.5 t31.5 52.5l169 627q10 37 -7.5 68.5t-53.5 42.5q-38 11 -69.5 -7t-41.5 -54l-169 -630q-5 -23 -5 -26zM1471 1368q113 107 264 107q157 0 267 -110.5t110 -268.5q0 -100 -55 -197q-155 155 -372 155h-35q-45 186 -179 314zM1643 1928q0 -37 27 -62.5t65 -25.5q37 0 62.5 25 t25.5 63v219q0 41 -25 67t-63 26q-40 0 -66 -26.5t-26 -66.5v-219zM2233 1685q0 -39 29 -63q22 -25 58.5 -27.5t66.5 27.5l154 153q28 27 28 67q0 39 -26.5 65t-65.5 26q-33 0 -62 -27l-153 -154q-29 -27 -29 -67zM2320 421q0 -38 26 -67l69 -67q28 -22 64 -22l2 -2 q36 0 62 26t26 65q0 38 -28 62l-66 70q-29 26 -66 26t-63 -26.5t-26 -64.5zM2475 1096q0 -38 28 -63q28 -28 66 -28h217q38 0 65 27t27 64q0 38 -27 65.5t-65 27.5h-217q-38 0 -66 -27.5t-28 -65.5z" />
<glyph unicode="&#xf009;" horiz-adv-x="2868" d="M0 530q0 -213 148.5 -365.5t362.5 -163.5q18 0 18 18v143q0 19 -18 19q-136 7 -231 108.5t-95 240.5q0 134 89.5 231t224.5 113l53 4q21 0 21 19l6 57q17 173 146.5 289.5t305.5 116.5q175 0 305 -116.5t146 -289.5l8 -61q0 -19 19 -19h178q140 0 242 -102t102 -242 q0 -136 -95.5 -237t-230.5 -112q-18 0 -18 -19v-143q0 -18 18 -18q140 4 256 76.5t182.5 192t66.5 260.5q0 114 -44 209q121 150 121 350q0 114 -44 217.5t-119 178.5t-178.5 119t-217.5 44q-241 0 -406 -177q-127 68 -291 68q-226 0 -399.5 -139.5t-220.5 -357.5 q-180 -41 -295.5 -184t-115.5 -328zM578 -184q0 -29 17 -57t48 -38q31 -11 65.5 6.5t46.5 58.5l27 112q11 33 -7.5 66.5t-54.5 44.5q-40 10 -72 -9t-39 -57l-30 -106q-1 -7 -1 -21zM717 319q0 -61 68 -84q35 -12 68 5.5t44 56.5l26 110q11 33 -7 66t-54 45q-39 10 -71 -8.5 t-39 -55.5l-32 -109q-3 -13 -3 -26zM847 -522q0 -26 18 -53t52 -38q1 0 10.5 -1.5t15.5 -1.5q22 0 39 8q30 13 44 62l29 106q11 37 -7.5 69.5t-54.5 42.5q-37 11 -69.5 -7.5t-42.5 -54.5l-30 -109q-4 -16 -4 -23zM896 1832q0 -40 27 -66l70 -69q54 -54 125 0q26 28 26 65 t-26 65l-67 70q-26 26 -64 26q-37 0 -64 -26.5t-27 -64.5zM991 -11q0 -27 17 -54t50 -37q37 -11 68 5t43 60l26 108q11 37 -6.5 69.5t-53.5 43.5q-40 11 -72.5 -8.5t-39.5 -56.5l-30 -110q-2 -6 -2 -20zM1288 -195q4 -60 67 -88l27 -4q26 0 50.5 17t34.5 53l31 108 q10 38 -9.5 70.5t-56.5 39.5q-33 11 -66 -7.5t-44 -54.5l-29 -109q-1 -4 -2 -9t-2 -8.5t-1 -7.5zM1437 313q0 -26 16.5 -51.5t48.5 -34.5l27 -3q31 0 55 19t30 50l29 106q11 38 -7 69.5t-54 41.5q-37 11 -68.5 -6.5t-41.5 -53.5l-32 -113q-3 -13 -3 -24zM1472 1365 q106 102 256 102q157 0 268 -110.5t111 -267.5q0 -90 -50 -188q-153 153 -370 153h-36q-43 181 -179 311zM1637 1923q0 -40 25.5 -65.5t65.5 -25.5t65.5 25.5t25.5 65.5v215q0 40 -25.5 66t-65.5 26t-65.5 -26t-25.5 -66v-215zM2229 1678q0 -40 24 -65q33 -27 66 -27 q30 0 63 27l153 153q26 29 26 67t-26 64t-63 26t-65 -26l-154 -153q-24 -28 -24 -66zM2313 416q0 -37 28 -67l66 -68q33 -33 66 -33q31 0 62 33q29 29 28 65.5t-28 63.5l-69 70q-26 26 -61 26q-38 0 -65 -26.5t-27 -63.5zM2470 1089q0 -36 26 -62t62 -26h218q41 0 67 25 t26 63q0 40 -26.5 66t-66.5 26h-218q-37 0 -62.5 -27t-25.5 -65z" />
<glyph unicode="&#xf00a;" horiz-adv-x="2864" d="M0 525q0 -138 68 -257t185.5 -191t256.5 -76q18 0 18 18v142q0 20 -18 20q-136 7 -232.5 108.5t-96.5 235.5q0 132 90.5 230t223.5 114l56 6q19 0 19 20l8 54q17 175 145.5 291.5t303.5 116.5q174 0 304.5 -116.5t147.5 -288.5l8 -62q0 -18 18 -18h172q144 0 246 -102.5 t102 -244.5q0 -134 -96.5 -235.5t-231.5 -108.5q-20 0 -20 -20v-142q0 -18 20 -18q212 7 360 160t148 364q0 121 -46 217q126 151 126 352q0 150 -75 278.5t-204 203.5t-279 75q-246 0 -413 -185q-130 70 -287 70q-225 0 -399 -139.5t-223 -356.5q-179 -44 -292 -187 t-113 -328zM677 93q0 -38 25.5 -65t62.5 -27t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-62.5 -26t-25.5 -62zM677 -294q0 -33 26 -61q28 -26 62 -26q38 0 63 25t25 62q0 38 -25.5 63t-62.5 25t-62.5 -25t-25.5 -63zM895 1832q0 -39 26 -63l70 -70q26 -26 57 -27 q33 -5 65 23.5t32 67.5t-26 68l-68 65q-24 27 -62 27q-40 0 -67 -26.5t-27 -64.5zM1016 -112q0 -36 26 -64q26 -26 62 -26q38 0 64.5 26t26.5 64q0 37 -26.5 63.5t-64.5 26.5q-36 0 -62 -26.5t-26 -63.5zM1016 272q0 -36 26 -62t62 -26q38 0 64.5 25.5t26.5 62.5t-26.5 63 t-64.5 26q-36 0 -62 -26t-26 -63zM1016 -502q0 -35 26 -61q27 -27 62 -27q38 0 64.5 25t26.5 63t-26.5 64.5t-64.5 26.5q-35 0 -61.5 -27t-26.5 -64zM1360 93q0 -38 26 -65t63 -27t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-63 -26t-26 -62zM1360 -294q0 -34 25 -61 q28 -26 64 -26q38 0 63 25t25 62q0 38 -25.5 63t-62.5 25q-38 0 -63.5 -25.5t-25.5 -62.5zM1464 1365q110 106 263 106q155 0 265 -111t110 -266q0 -100 -54 -196q-153 153 -371 153h-34q-47 187 -179 314zM1635 1921q0 -37 27 -62t65 -25t63 25t25 62v218q0 38 -25.5 65 t-62.5 27t-64.5 -27.5t-27.5 -64.5v-218zM2223 1679q0 -37 27 -63q24 -25 59.5 -27.5t66.5 27.5l153 153q28 28 28 65q0 38 -27.5 65t-64.5 27q-35 0 -62 -27l-153 -156q-27 -25 -27 -64zM2309 421q0 -40 26 -66l68 -67q39 -26 68 -26q33 0 59.5 27.5t26.5 65.5q0 36 -28 62 l-66 69q-28 26 -65 26t-63 -26.5t-26 -64.5zM2463 1094q0 -38 28 -63q27 -29 66 -29h216q37 0 64 27t27 65t-27 64.5t-64 26.5h-216q-38 0 -66 -27t-28 -64z" />
<glyph unicode="&#xf00b;" horiz-adv-x="2864" d="M0 529q0 -139 68 -258.5t185 -191.5t256 -78q19 0 19 18v142q0 20 -19 20q-136 7 -232 108.5t-96 239.5q0 132 90 229.5t223 113.5l56 3q20 0 20 19l8 58q17 173 145.5 289t303.5 116q172 0 302.5 -116.5t149.5 -288.5l7 -62q0 -18 18 -18h173q141 0 244.5 -102 t103.5 -241q0 -138 -96 -239.5t-233 -108.5q-19 0 -19 -20v-142q0 -18 19 -18q139 4 256 76.5t184 192.5t67 259q0 118 -44 213q124 152 124 352q0 151 -75 279.5t-203 203t-278 74.5q-248 0 -413 -185q-131 70 -287 70q-225 0 -399 -139.5t-223 -356.5 q-176 -42 -290.5 -185t-114.5 -326zM630 435q0 -61 45 -104t108 -43q64 0 107 42.5t43 104.5q0 39 -37.5 107t-69.5 106q-34 36 -43 45l-38 -43q-43 -46 -79 -110t-36 -105zM895 1834q0 -41 26 -65l69 -70q67 -50 129 0q26 31 26 68t-26 63l-68 69q-30 27 -65 27 q-39 0 -65 -27t-26 -65zM947 13q0 -105 72.5 -176.5t175.5 -71.5q104 0 177 73t73 175q0 86 -86 210q-74 97 -136 159q-13 9 -28 24l-25 -24q-57 -52 -136 -157q-87 -121 -87 -212zM1104 719q0 -40 30.5 -69t73.5 -29q41 0 70 29t29 69q0 66 -99 171l-26 -27 q-29 -32 -53.5 -74.5t-24.5 -69.5zM1464 1365q106 106 263 106q156 0 265.5 -110t109.5 -267q0 -94 -55 -196q-155 153 -370 153h-35q-46 186 -178 314zM1635 1926q0 -38 27.5 -65t64.5 -27t62 27t25 65v217q0 38 -24.5 63t-62.5 25t-65 -25t-27 -63v-217zM2223 1679 q0 -39 27 -63q28 -26 60 -26q28 0 65 26l153 153q29 29 29 66q0 39 -27 65t-65 26q-35 0 -62 -27l-153 -153q-27 -27 -27 -67zM2309 423q0 -40 25 -68l69 -62q23 -29 63 -29q39 0 62 29q29 26 29 62q0 35 -29 62l-65 69q-28 26 -65 26q-38 0 -63.5 -26t-25.5 -63zM2463 1094 q0 -36 27 -62q28 -26 67 -26h216q38 0 64.5 25.5t26.5 62.5q0 38 -27 64.5t-64 26.5h-216q-38 0 -66 -27t-28 -64z" />
<glyph unicode="&#xf00c;" horiz-adv-x="2541" d="M0 899q0 -43 30 -71t77 -28h180q43 0 73.5 28.5t30.5 70.5q0 46 -30 76t-74 30h-180q-47 0 -77 -29.5t-30 -76.5zM189 239q0 -155 113 -268.5t268 -113.5h732q155 0 265.5 112t110.5 270q0 77 -22 131q133 85 210.5 226.5t77.5 302.5q0 130 -51 248.5t-136.5 204 t-204 136.5t-247.5 51q-175 0 -322.5 -86t-232 -233t-84.5 -321v-36q-160 -91 -211 -266q-121 -38 -193.5 -135t-72.5 -223zM355 1750q0 -45 28 -72l172 -180q75 -57 150 0q30 30 30 75q0 43 -30 75l-176 175q-34 31 -74 31q-45 0 -72.5 -30t-27.5 -74zM400 239q0 67 43 115 t109 54l66 9q21 0 21 24l10 60q11 92 78 154t158 62q93 0 161.5 -62t79.5 -154l9 -69q10 -24 26 -24h141q69 0 119.5 -50t50.5 -119q0 -72 -50.5 -123t-119.5 -51h-732q-72 0 -121 51t-49 123zM872 921q11 175 135 294t298 119q178 0 303 -127t125 -308q0 -112 -54.5 -207.5 t-147.5 -154.5q-94 78 -217 78q-47 140 -164 223t-265 83h-13zM1201 1854q0 -44 30.5 -74.5t73.5 -30.5q44 0 74.5 30.5t30.5 74.5v250q0 42 -30.5 70.5t-74.5 28.5q-43 0 -73.5 -28.5t-30.5 -70.5v-250zM1875 230q0 -43 29 -75l175 -173q67 -68 150 0q28 27 28 72 q0 43 -28 71l-180 179q-29 27 -73 27t-72.5 -29t-28.5 -72zM1875 1575q0 -45 29 -77q29 -29 72 -29q44 0 73 29l180 180q28 27 28 72q0 44 -30.5 74t-74.5 30q-42 0 -73 -31l-175 -175q-29 -29 -29 -73zM2151 899q0 -43 30 -71t77 -28h180q43 0 73.5 28.5t30.5 70.5 q0 46 -30 76t-74 30h-180q-47 0 -77 -29.5t-30 -76.5z" />
<glyph unicode="&#xf00d;" horiz-adv-x="2267" d="M0 771q0 39 27 66q28 26 64 26h218q37 0 61.5 -27t24.5 -65t-24.5 -64.5t-61.5 -26.5h-218q-37 0 -64 27t-27 64zM305 32q0 37 25 65l157 152q24 25 63 25q38 0 63.5 -24t25.5 -61q0 -39 -26 -68l-152 -152q-65 -51 -131 0q-25 27 -25 63zM305 1509q0 37 25 65 q31 26 68 26q35 0 63 -26l152 -157q26 -24 26 -63q0 -38 -25.5 -63.5t-63.5 -25.5q-39 0 -63 26l-157 152q-25 27 -25 66zM577 771q0 149 75 277.5t203.5 203.5t277.5 75q112 0 215 -44.5t177.5 -119t118.5 -177.5t44 -215q0 -150 -74.5 -278t-202.5 -202.5t-278 -74.5 t-278 74.5t-203 202.5t-75 278zM758 771q0 -156 109.5 -266.5t265.5 -110.5t266.5 110.5t110.5 266.5q0 154 -110.5 263t-266.5 109q-155 0 -265 -109t-110 -263zM1042 -58q0 38 26.5 64t64.5 26q39 0 65 -26t26 -64v-212q0 -39 -26.5 -66t-64.5 -27t-64.5 27t-26.5 66v212z M1042 1595v218q0 37 27 64t64 27t64 -27t27 -64v-218q0 -37 -26.5 -61.5t-64.5 -24.5t-64.5 24.5t-26.5 61.5zM1631 189q0 37 24 60q24 25 60 25q39 0 64 -25l156 -152q26 -28 26 -65t-26 -63q-64 -50 -128 0l-152 152q-24 27 -24 68zM1631 1354q0 40 24 63l152 157 q28 26 63 26q38 0 64.5 -27t26.5 -64q0 -40 -26 -66l-156 -152q-29 -26 -64 -26q-36 0 -60 25.5t-24 63.5zM1872 771q0 38 26 66q26 26 61 26h216q37 0 64.5 -27.5t27.5 -64.5t-27.5 -64t-64.5 -27h-216q-37 0 -62 26.5t-25 64.5z" />
<glyph unicode="&#xf00e;" horiz-adv-x="2883" d="M0 530q0 -179 106.5 -320t275.5 -188l-70 -181q-8 -23 15 -23h227l-152 -449h31l465 604q6 7 2 14.5t-15 7.5h-234l266 496q12 23 -15 23h-316q-15 0 -25 -16l-114 -307q-115 29 -190 123.5t-75 215.5q0 135 90 233t225 114l54 3q19 0 24 15l8 63q17 173 146.5 290.5 t305.5 117.5q174 0 305.5 -117.5t149.5 -290.5l8 -63q0 -18 19 -18h172q143 0 246 -102.5t103 -244.5q0 -139 -95.5 -241.5t-232.5 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185.5 193t68 261.5q0 117 -46 215q122 154 122 351q0 152 -75.5 281.5t-205 205 t-281.5 75.5q-115 0 -223.5 -48t-187.5 -133q-129 69 -290 69q-227 0 -402.5 -140.5t-224.5 -359.5q-177 -41 -292.5 -186t-115.5 -330zM873 -528q0 -24 17 -50t49 -36q18 -4 27 -4q24 0 41 8q34 13 46 61l29 110q10 40 -9 71.5t-57 39.5q-33 11 -66 -8t-45 -55l-27 -111 q-5 -22 -5 -26zM898 1841q0 -37 27 -64l69 -70q25 -25 59 -28q33 -5 65 24t32 68q0 37 -27 64l-67 70q-26 26 -64 26q-40 0 -67 -26t-27 -64zM1016 -16q-1 -26 15 -50.5t51 -34.5q34 -11 66.5 6.5t44.5 59.5l32 110q11 35 -8.5 67.5t-57.5 43.5q-36 11 -68.5 -7.5 t-43.5 -56.5l-26 -112q-5 -22 -5 -26zM1318 -195q0 -23 11 -42q21 -34 58 -46q18 -6 30 -6q20 0 33 8q32 12 48 64l27 108q11 38 -7 69.5t-54 41.5q-37 11 -69.5 -7t-43.5 -54l-30 -111q-3 -14 -3 -25zM1464 319q0 -28 17.5 -53.5t52.5 -35.5q27 -9 65 5q32 14 46 61l29 107 q10 40 -8.5 71.5t-56.5 39.5q-36 11 -68 -6.5t-43 -53.5l-31 -113q-3 -21 -3 -22zM1475 1369q107 103 261 103q157 0 267.5 -109.5t110.5 -266.5q0 -105 -50 -193q-154 154 -375 154h-33q-47 190 -181 312zM1645 1931q0 -38 26.5 -65t64.5 -27t63.5 26.5t25.5 65.5v220 q0 39 -25.5 65.5t-63.5 26.5t-64.5 -27t-26.5 -65v-220zM2240 1687q0 -39 25 -64q22 -25 58.5 -27.5t67.5 27.5l154 154q28 26 28 64t-28 64q-26 28 -64 28q-37 0 -62 -28l-154 -154q-25 -25 -25 -64zM2323 416q0 -37 27 -64l69 -67q29 -27 66 -27l2 -2q35 0 58 29 q28 26 28 64q0 37 -28 65l-66 66q-29 29 -65 29q-38 0 -64.5 -27.5t-26.5 -65.5zM2479 1096q0 -39 28 -63q25 -28 64 -28h220q38 0 65 26.5t27 64.5t-26.5 63.5t-65.5 25.5h-220q-39 0 -65.5 -25.5t-26.5 -63.5z" />
<glyph unicode="&#xf010;" horiz-adv-x="2875" d="M0 528q0 -177 105 -316t274 -190l-68 -181q-7 -22 15 -22h226l-133 -421h31l445 575q6 7 1.5 14.5t-15.5 7.5h-232l264 494q11 23 -15 23h-314q-15 0 -25 -15l-114 -307q-114 29 -189 124t-75 214q0 133 90.5 231t224.5 114l56 7q21 0 21 19l6 54q17 173 147 290t305 117 q174 0 304.5 -117t149.5 -290l6 -62q0 -18 19 -18h172q145 0 247.5 -101t102.5 -244q0 -136 -95 -235.5t-234 -110.5q-21 0 -21 -19v-146q0 -18 21 -18q213 7 361.5 161t148.5 368q0 118 -46 214q126 153 126 354q0 150 -75.5 279t-204.5 204.5t-280 75.5q-247 0 -414 -185 q-129 69 -288 69q-226 0 -401 -140t-224 -358q-177 -41 -291.5 -184.5t-114.5 -328.5zM863 -494q-2 -24 14.5 -47t49.5 -35q11 -3 22 -3q27 0 54 16t36 50l244 914q10 37 -7 68.5t-52 42.5q-37 11 -69.5 -7t-42.5 -54l-246 -917q-3 -13 -3 -28zM898 1837q0 -38 27 -63 l68 -70q27 -27 65 -27.5t61 27.5q30 24 30 64q0 38 -27 63l-67 70q-28 26 -65 26q-40 0 -66 -26t-26 -64zM1306 -168q0 -19 12 -40q20 -32 53 -46q11 -5 32 -5q24 0 35 6q32 13 44 62l159 592q10 38 -8 69t-54 42q-37 11 -68.5 -7t-41.5 -54l-159 -595q0 -4 -2 -12t-2 -12z M1469 1367q107 103 264 103q156 0 266.5 -109t110.5 -265q0 -100 -55 -197q-159 157 -373 157h-33q-49 188 -180 311zM1641 1927q0 -37 27.5 -64.5t64.5 -27.5q38 0 63 27t25 65v219q0 38 -25 65t-63 27q-37 0 -64.5 -27t-27.5 -65v-219zM2231 1683q0 -39 28 -64 q23 -27 60.5 -27t64.5 27l154 155q28 25 28 63t-27 65t-65 27q-35 0 -61 -28l-154 -154q-28 -25 -28 -64zM2317 418q0 -36 26 -64l70 -67q20 -23 58 -26l1 -1q2 0 5 -0.5t5 -0.5q30 0 56 28q28 26 28 64q0 37 -28 65l-69 65q-26 29 -62 29q-37 0 -63.5 -27t-26.5 -65z M2472 1096q0 -37 29 -64q29 -29 65 -29h217q37 0 64.5 27.5t27.5 65.5q0 37 -27 62.5t-65 25.5h-217q-40 0 -67 -25.5t-27 -62.5z" />
<glyph unicode="&#xf011;" horiz-adv-x="2428" d="M0 90q0 40 27 67q28 26 64 26h578q118 0 201.5 -84.5t83.5 -202.5q0 -119 -83 -202.5t-202 -83.5t-203 84q-25 25 -25 64t24.5 64.5t64.5 25.5q37 0 65 -26q32 -31 74 -31t73 30.5t31 74.5q0 42 -31 72.5t-73 30.5h-578q-37 0 -64 26.5t-27 64.5zM0 414q0 39 27 66 q28 26 64 26h1125q42 0 73 31t31 74t-31 73.5t-73 30.5q-44 0 -73 -30q-29 -24 -68 -24t-63.5 24.5t-24.5 63.5q0 40 24 65q81 81 205 81q119 0 202.5 -83t83.5 -201t-83.5 -201.5t-202.5 -83.5h-1125q-38 0 -64.5 25.5t-26.5 62.5zM229 666q0 -13 17 -13h154q13 0 23 16 q36 87 112 144t170 64l56 8q21 0 21 18l8 55q17 173 146.5 290.5t305.5 117.5q177 0 307 -116.5t148 -291.5l8 -63q0 -18 18 -18h173q145 0 248.5 -102t103.5 -245t-103.5 -245t-248.5 -102h-737q-20 0 -20 -18v-148q0 -18 20 -18h737q145 0 267.5 71t194 193.5t71.5 266.5 q0 145 -71.5 267t-194 193t-267.5 71h-33q-50 213 -223.5 349t-397.5 136q-226 0 -400 -140.5t-221 -359.5q-137 -32 -243 -131.5t-147 -235.5v-4q-2 -5 -2 -9z" />
<glyph unicode="&#xf012;" horiz-adv-x="2539" d="M0 87q0 39 27 65t67 26h957q38 0 63 -25.5t25 -65.5q0 -38 -25.5 -63.5t-62.5 -25.5h-957q-40 0 -67 25.5t-27 63.5zM281 413q0 38 29 64q23 24 63 24h960q37 0 61.5 -25t24.5 -63t-24.5 -65t-61.5 -27h-960q-37 0 -64.5 27.5t-27.5 64.5zM347 662q0 -15 18 -15h152 q15 0 25 15q36 87 111 144t168 64l58 7q18 0 18 19l7 55q18 174 148.5 290t306.5 116q174 0 302 -114.5t150 -288.5l8 -63q0 -17 19 -17h171q145 0 247.5 -102t102.5 -247q0 -140 -104 -243.5t-246 -103.5h-735q-19 0 -19 -18v-143q0 -19 19 -19h735q108 0 206.5 41.5 t169 112.5t112.5 168.5t42 204.5q0 144 -70.5 265.5t-192.5 192t-267 70.5h-33q-52 215 -224.5 351.5t-392.5 136.5q-227 0 -401.5 -141.5t-221.5 -361.5q-138 -31 -242 -129.5t-145 -236.5v-2q-2 -4 -2 -8zM469 -243q0 39 28 64q24 25 63 25h959q39 0 65.5 -25.5 t26.5 -63.5t-27 -65t-65 -27h-959q-37 0 -64 27t-27 65z" />
<glyph unicode="&#xf013;" horiz-adv-x="2370" d="M0 454q0 159 99 282.5t254 158.5q41 188 190 307.5t343 119.5q189 0 337.5 -116.5t192.5 -298.5h29q188 0 321 -132.5t133 -320.5t-133 -321.5t-321 -133.5h-990q-92 0 -176.5 36t-145.5 97t-97 145.5t-36 176.5zM155 454q0 -122 88 -209.5t212 -87.5h990q124 0 212 87.5 t88 209.5t-88 209t-212 87h-148q-16 0 -16 16l-7 52q-16 151 -126.5 250.5t-261.5 99.5t-262.5 -100t-125.5 -250l-7 -45q0 -16 -17 -16l-48 -7q-115 -10 -193 -95t-78 -201zM1099 1384q-16 -15 8 -22q69 -30 115 -59q18 -5 24 3q97 92 226 92t223.5 -86.5t105.5 -213.5 l10 -68h151q104 0 179 -74.5t75 -177.5q0 -96 -66 -167t-163 -82q-16 0 -16 -17v-121q0 -17 16 -17q161 10 272 127t111 277q0 169 -119.5 288.5t-288.5 119.5h-16q-42 160 -175.5 263.5t-298.5 103.5q-226 0 -373 -169z" />
<glyph unicode="&#xf014;" horiz-adv-x="2641" d="M0 86q0 39 27 65t67 26h1991q40 0 65.5 -25.5t25.5 -65.5q0 -37 -26.5 -62t-64.5 -25h-1991q-40 0 -67 25t-27 62zM279 421q0 39 28 64q24 24 63 24h1992q37 0 62 -25.5t25 -62.5q0 -38 -25 -64.5t-62 -26.5h-1992q-38 0 -64.5 27t-26.5 64zM293 675q0 -14 16 -14h153 q10 0 21 17q38 83 113.5 136t165.5 60l59 8q18 0 18 19l7 53q17 173 146.5 288.5t303.5 115.5q173 0 301.5 -114t146.5 -286l8 -61q0 -18 21 -18h170q103 0 187.5 -55t125.5 -146q11 -17 22 -17h153q19 0 15 24q-47 164 -186 268t-317 104h-34q-53 213 -223.5 348.5 t-389.5 135.5q-224 0 -398 -140.5t-223 -358.5q-136 -32 -238.5 -129t-142.5 -232v4q-1 -3 -1 -10zM465 -241q0 38 28 63q24 24 64 24h1993q38 0 64.5 -25t26.5 -62q0 -38 -27 -65t-64 -27h-1993q-37 0 -64.5 27.5t-27.5 64.5z" />
<glyph unicode="&#xf015;" horiz-adv-x="2210" d="M0 528q0 -213 148.5 -366t362.5 -163q18 0 18 18v143q0 18 -18 18q-137 7 -233 109t-96 241q0 132 90 230t223 114l57 3q21 0 21 20l6 57q17 173 146.5 289.5t304.5 116.5q174 0 304 -116.5t148 -289.5l8 -62q0 -18 19 -18h172q142 0 246 -102t104 -242 q0 -139 -96.5 -241t-232.5 -109q-21 0 -21 -18v-143q0 -18 21 -18q139 4 256 76t184.5 192.5t67.5 260.5q0 143 -71 263.5t-193 190t-265 69.5h-34q-52 214 -224.5 350t-392.5 136q-225 0 -400 -139.5t-224 -357.5q-177 -41 -291.5 -184.5t-114.5 -327.5zM581 -240 q15 -34 49 -49q32 -16 66.5 -2t47.5 48q16 35 2.5 68.5t-48.5 46.5q-32 17 -65.5 3t-49.5 -50q-15 -26 -2 -65zM648 61q0 -25 16.5 -48.5t49.5 -34.5q31 -18 66 -1.5t47 63.5l96 361q10 40 -8.5 71.5t-56.5 38.5q-13 3 -26 3q-26 0 -50.5 -16t-34.5 -47l-94 -362 q-5 -23 -5 -28zM847 -535q0 -19 6 -31q14 -35 48 -48q15 -8 35 -8q10 0 32 6q35 13 50.5 48t-0.5 70t-47.5 49t-66.5 0q-30 -13 -43.5 -38t-13.5 -48zM925 -257q0 -59 67 -78q18 -4 26 -4q24 0 41 8q33 13 45 61l178 671q10 38 -6.5 69t-52.5 41q-13 3 -29 3 q-26 0 -51.5 -16t-31.5 -47l-182 -676q-4 -22 -4 -32zM1291 -208q0 -19 8 -34q13 -31 47 -47q18 -7 37 -7q10 0 32 6q34 13 49 47q12 35 -1 67t-45 48q-36 17 -69.5 3t-49.5 -50q-8 -15 -8 -33zM1368 66q0 -23 17 -48t48 -35q25 -5 29 -5q15 0 39 11q32 15 43 56l96 356 q3 27 3 28q0 25 -16.5 49t-48.5 33q-14 3 -28 3q-26 0 -50 -15.5t-33 -47.5l-96 -358z" />
<glyph unicode="&#xf016;" horiz-adv-x="1502" d="M0 -283h42l734 1086q15 29 -16 29h-303l319 581q14 29 -21 29h-406q-17 0 -31 -19l-296 -789q-4 -29 20 -29h293zM907 392h29l557 818q8 13 4 21t-18 8h-224l233 430q19 32 -19 32h-292q-21 0 -32 -20l-222 -585q-5 -14 1 -22t20 -8h218z" />
<glyph unicode="&#xf017;" horiz-adv-x="2209" d="M0 522q0 -211 149 -364t361 -160q19 0 19 18v142q0 19 -19 19q-135 7 -232 108.5t-97 236.5q0 134 90.5 233.5t223.5 110.5l56 8q20 0 20 19l8 53q16 175 145.5 293t305.5 118q173 0 303 -117t149 -289l7 -62q0 -19 20 -19h171q144 0 247 -103t103 -245 q0 -135 -96.5 -236.5t-232.5 -108.5q-21 0 -21 -19v-142q0 -18 21 -18q213 7 360.5 159.5t147.5 364.5q0 143 -71 264.5t-193 192t-265 70.5h-33q-53 214 -225 350.5t-392 136.5q-225 0 -400 -140t-224 -357q-180 -46 -293 -188.5t-113 -328.5zM577 -227q0 -27 17.5 -54 t50.5 -37q37 -11 68 4t42 60l15 65q8 36 -10 67.5t-55 42.5q-36 11 -68.5 -8t-42.5 -57l-15 -63q-2 -6 -2 -20zM658 82q0 -34 27 -61q25 -27 60 -27q38 0 64 25.5t26 62.5t-26 62.5t-64 25.5q-37 0 -62 -25t-25 -63zM723 325q-2 -25 14.5 -48.5t51.5 -34.5q33 -10 66 7.5 t44 54.5l30 96q12 39 -7 69.5t-58 41.5q-35 11 -67.5 -7t-43.5 -53l-26 -98q0 -3 -2 -12.5t-2 -15.5zM847 -560q0 -28 16.5 -53t51.5 -35q13 -3 27 -3q68 0 84 65l15 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-15 -63q-3 -14 -3 -24zM930 -250q0 -35 27 -62 q26 -26 61 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM997 -8q-2 -24 14 -50t48 -32q37 -10 68 6t44 60l29 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1291 -237q0 -26 16.5 -51t49.5 -35q5 0 14.5 -2t14.5 -2 q65 0 81 70l15 64q11 34 -7 67t-54 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -4 -2 -13t-2 -14zM1370 78q0 -36 27 -61q24 -26 61 -26q38 0 63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1435 325q0 -27 17.5 -51.5t52.5 -34.5q3 0 13 -2t15 -2q16 0 38 10 q34 18 44 56l26 96q10 36 -8 67.5t-54 42.5q-37 11 -68 -6t-42 -54l-30 -97q0 -4 -2 -12.5t-2 -12.5z" />
<glyph unicode="&#xf018;" horiz-adv-x="2213" d="M0 525q0 -179 104.5 -318.5t272.5 -190.5q14 -3 26 8l124 153q-142 0 -243 102t-101 246q0 135 90 234.5t224 110.5l56 7q17 0 17 14l8 59q20 176 148.5 291.5t303.5 115.5q176 0 306.5 -116.5t146.5 -290.5l8 -62q4 -18 23 -18h173q144 0 245 -101t101 -244 q0 -133 -90 -232.5t-221 -115.5q-19 0 -52 -6q-31 -3 -44 -24l-252 -298q-23 -29 -17.5 -67t33.5 -61q17 -20 60 -20q42 0 65 37l226 260q199 20 336 172t137 355q0 108 -41.5 206t-112 168.5t-168 112.5t-205.5 42h-34q-53 212 -226.5 347.5t-396.5 135.5 q-149 0 -280.5 -63.5t-221.5 -177t-121 -258.5q-180 -40 -293.5 -183.5t-113.5 -329.5zM361 -330q0 -10 6 -32q14 -34 47 -47q35 -16 71 -2t49 48q16 35 2 69t-49 46q-36 17 -69 3t-49 -50q-8 -17 -8 -35zM558 -70v-11q3 -36 32 -60q36 -20 66 -20q36 0 65 35l248 295 q23 28 21 70q-4 34 -29.5 57t-55.5 23q-9 0 -15 -1q-37 -7 -60 -35l-252 -296q-20 -23 -20 -57zM640 -573q0 -19 8 -34q13 -34 47 -50q17 -8 35 -8q20 0 33 8q37 15 50 44q16 35 2.5 71t-47.5 49q-35 16 -71.5 2t-48.5 -48q-8 -15 -8 -34zM818 -323v-12q4 -35 33 -58.5 t59 -23.5q36 0 67 35l464 559q18 20 18 55v13q-4 36 -29 57t-56 21h-14q-37 -2 -59 -33l-464 -555q-19 -28 -19 -58zM1193 -446q0 -14 6 -32q14 -35 49 -50q22 -6 33 -6q23 0 36 8q36 14 49 45q16 27 2 71q-13 33 -47 47l-38 10q-14 -3 -34 -8q-35 -13 -48 -47 q-8 -19 -8 -38z" />
<glyph unicode="&#xf019;" horiz-adv-x="2211" d="M0 527q0 184 115 327.5t291 184.5q50 218 225 358t400 140q220 0 392.5 -136.5t224.5 -350.5h34q143 0 265 -69.5t193 -190t71 -263.5q0 -140 -67.5 -260.5t-184.5 -192.5t-256 -76q-21 0 -21 18v142q0 19 21 19q136 7 232.5 109t96.5 241t-104 241.5t-246 102.5h-172 q-19 0 -19 18l-8 62q-18 173 -148.5 289.5t-303.5 116.5q-175 0 -304.5 -116.5t-145.5 -289.5l-8 -57q0 -20 -21 -20l-56 -3q-133 -16 -223.5 -114t-90.5 -230q0 -139 96 -241t233 -109q18 0 18 -19v-142q0 -18 -18 -18q-214 10 -362.5 163t-148.5 366zM571 -186q0 7 4 21 l174 615q10 31 34.5 47t49.5 16q11 0 26 -3q38 -7 57.5 -39t8.5 -71l-174 -611q-20 -68 -88 -68q-6 0 -12 2q-9 3 -11 3q-35 10 -52 35.5t-17 52.5zM851 -486l260 936q7 31 32 47t52 16q14 0 29 -3q35 -10 52 -41.5t7 -68.5l-259 -937q-6 -27 -31 -46t-54 -19q-15 0 -27 5 q-32 8 -55 42q-18 28 -6 69zM1291 -189q0 6 4 24l174 615q9 31 32.5 47t49.5 16q13 0 28 -3q33 -9 49.5 -33t16.5 -50q0 -5 -2 -14.5t-2 -12.5l-174 -611q-6 -31 -30 -49.5t-54 -18.5l-26 5q-32 9 -49 34.5t-17 50.5z" />
<glyph unicode="&#xf01a;" horiz-adv-x="2218" d="M0 525q0 185 116 329t297 185q47 220 221 361.5t400 141.5q223 0 396.5 -136t226.5 -352h36q144 0 265 -70.5t190.5 -192.5t69.5 -266q0 -214 -146.5 -367t-359.5 -160q-19 0 -19 18v143q0 18 19 18q135 11 231 111.5t96 236.5q0 143 -102 246t-244 103h-174 q-19 0 -23 19l-8 61q-11 114 -74.5 206.5t-163.5 145t-216 52.5q-176 0 -305.5 -116.5t-146.5 -290.5l-7 -58q0 -15 -17 -15l-56 -8q-135 -11 -225.5 -110t-90.5 -235q0 -139 94.5 -239.5t231.5 -108.5q19 0 19 -18v-143q0 -18 -19 -18q-105 5 -200 48t-163.5 113 t-108.5 165.5t-40 200.5zM578 -197q0 5 2 14t2 12l29 110q11 36 42.5 54.5t68.5 7.5q36 -11 55 -42.5t8 -68.5l-26 -108q-21 -70 -81 -70q-4 0 -9.5 0.5t-12 1.5t-10.5 1q-34 10 -51 36.5t-17 51.5zM719 317q0 4 1.5 12t1.5 10l32 112q10 31 34 47.5t50 16.5q4 0 8.5 -0.5 t10 -1.5t8.5 -1q36 -11 54.5 -42.5t7.5 -68.5l-26 -107q-11 -44 -43 -62.5t-69 -2.5q-35 10 -52.5 36t-17.5 52zM850 -531q0 5 2 13.5t2 12.5l31 106q10 38 42.5 57.5t69.5 8.5q36 -11 54 -43.5t7 -69.5l-27 -111q-17 -65 -85 -65q-8 0 -26 4q-35 6 -52.5 32.5t-17.5 54.5z M993 -22q0 9 4 27l29 110q11 36 43.5 54.5t69.5 7.5q36 -10 54 -41.5t6 -69.5l-26 -106q-20 -72 -77 -72q-7 0 -33 6q-35 7 -52.5 31.5t-17.5 52.5zM1294 -201q0 11 3 26l30 106q11 38 43.5 57.5t67.5 9.5q37 -11 56.5 -43.5t9.5 -67.5l-31 -113q-16 -65 -84 -65 q-15 0 -28 3q-32 6 -49 32.5t-18 54.5zM1441 307q0 5 5 28l32 110q6 34 31 50.5t52 14.5q7 1 26 -3q35 -8 55 -41q19 -27 8 -69l-26 -110q-21 -69 -81 -69q-10 0 -36 6q-33 10 -49.5 33.5t-16.5 49.5z" />
<glyph unicode="&#xf01b;" horiz-adv-x="2211" d="M0 523q0 185 113.5 328.5t292.5 187.5q50 218 224.5 358t400.5 140q220 0 392.5 -136.5t224.5 -350.5h34q143 0 265 -70.5t193 -192t71 -264.5q0 -212 -148 -365t-360 -160q-21 0 -21 18v142q0 19 21 19q136 7 232.5 108.5t96.5 237.5q0 142 -103 245t-247 103h-172 q-19 0 -19 18l-8 62q-18 173 -148.5 290t-303.5 117q-176 0 -305.5 -118t-146.5 -293l-6 -53q0 -20 -21 -20l-56 -7q-133 -11 -223.5 -110.5t-90.5 -233.5q0 -136 96.5 -237.5t232.5 -108.5q18 0 18 -19v-142q0 -18 -18 -18q-214 7 -362.5 160t-148.5 365zM679 89 q0 36 25.5 62t62.5 26t62.5 -26t25.5 -62q0 -38 -25.5 -64.5t-62.5 -26.5t-62.5 26.5t-25.5 64.5zM679 -298q0 38 26 64q25 24 62 24t62.5 -25t25.5 -63t-25.5 -63t-62.5 -25t-62.5 25t-25.5 63zM1019 -117q0 37 27 66q26 26 61 26q37 0 64.5 -27.5t27.5 -64.5t-27 -63.5 t-65 -26.5q-36 0 -62 26.5t-26 63.5zM1019 269q0 37 27 64q28 26 61 26q38 0 65 -26.5t27 -63.5t-27 -62.5t-65 -25.5q-36 0 -62 25.5t-26 62.5zM1019 -507q0 36 27 65q26 26 61 26q38 0 65 -27t27 -64t-27 -62.5t-65 -25.5q-36 0 -62 25.5t-26 62.5zM1363 89q0 35 27 61.5 t64 26.5t62.5 -26t25.5 -62q0 -38 -25.5 -64.5t-62.5 -26.5q-38 0 -64.5 27t-26.5 64zM1363 -298q0 35 27 64q26 24 64 24t63 -25t25 -63t-25 -63t-63 -25t-64.5 25.5t-26.5 62.5z" />
<glyph unicode="&#xf01c;" horiz-adv-x="2210" d="M0 527q0 184 115 327.5t291 184.5q49 218 224 357.5t401 139.5q220 0 392 -136t225 -350h33q143 0 265 -69.5t193 -190t71 -263.5q0 -214 -147.5 -368t-360.5 -161q-21 0 -21 18v142q0 19 21 19q137 7 233 109t96 241t-104 241.5t-246 102.5h-171q-20 0 -20 18l-7 62 q-17 172 -147.5 289t-304.5 117q-175 0 -305 -116.5t-147 -289.5l-6 -58q0 -19 -21 -19l-56 -3q-131 -6 -222.5 -107t-91.5 -237q0 -139 96 -241t233 -109q18 0 18 -19v-142q0 -18 -18 -18q-214 10 -362.5 163t-148.5 366zM632 433q0 39 39 105.5t73 107.5q34 38 41 45 l38 -43q41 -44 76.5 -108.5t35.5 -106.5q0 -63 -43 -105t-107 -42q-63 0 -108 43t-45 104zM950 8q0 44 25.5 102t62.5 109q29 41 71 89.5t64 69.5q11 10 26 25l26 -25q60 -53 136 -156q38 -53 63 -111t25 -103q0 -103 -72.5 -175.5t-177.5 -72.5q-103 0 -176 72t-73 176z M1107 718q0 67 104 171l26 -27q28 -34 51 -75.5t23 -68.5q0 -41 -29.5 -70.5t-70.5 -29.5q-43 0 -73.5 29.5t-30.5 70.5z" />
<glyph unicode="&#xf01d;" horiz-adv-x="2212" d="M0 527q0 -177 105.5 -317t273.5 -191l-69 -179q-5 -23 15 -23h227l-111 -403h30l423 557q6 7 2 14.5t-15 7.5h-232l264 495q10 22 -15 22h-314q-15 0 -24 -15l-115 -306q-114 29 -188.5 124t-74.5 214q0 133 90 230.5t224 113.5l56 8q21 0 21 18l8 55q16 173 145.5 290 t304.5 117q174 0 304.5 -117t149.5 -290l6 -62q0 -19 20 -19h172q145 0 247.5 -101t102.5 -243q0 -136 -95 -235.5t-234 -109.5q-21 0 -21 -20v-146q0 -18 21 -18q104 3 198.5 47t162.5 114.5t108 167t40 200.5q0 144 -71.5 265.5t-193.5 192t-265 70.5h-34 q-53 213 -225 348t-393 135q-226 0 -401 -140t-224 -358q-176 -41 -291 -184.5t-115 -328.5zM870 -525q0 -25 16.5 -49.5t49.5 -34.5q22 -5 27 -5q14 0 40 11q34 15 45 56l30 112q10 35 -8.5 67t-56.5 43q-35 10 -67.5 -8.5t-43.5 -56.5l-29 -107q-3 -27 -3 -28zM1013 -16 q0 -23 16.5 -46.5t48.5 -35.5q36 -12 68 5t43 56l32 111q10 35 -9 67.5t-57 43.5q-36 10 -69 -8.5t-44 -55.5l-26 -108q-3 -27 -3 -29zM1314 -192q0 -27 17.5 -54t50.5 -37q4 0 12.5 -2t12.5 -2q21 0 40 8q30 11 44 61l27 108q11 37 -6.5 70.5t-53.5 44.5q-40 10 -72.5 -9 t-39.5 -57l-29 -110q-3 -9 -3 -21zM1459 319q-1 -25 16 -50t52 -40q12 -6 28 -6q17 0 36 9q33 16 47 61l31 110q3 21 3 23q0 27 -17.5 52.5t-52.5 35.5q-4 0 -12 2t-12 2q-27 0 -52 -16.5t-35 -51.5l-29 -108q-3 -12 -3 -23z" />
<glyph unicode="&#xf01e;" horiz-adv-x="2213" d="M0 527q0 -177 106 -317t275 -191l-70 -179q-5 -23 15 -23h227l-105 -459h30l418 613q6 7 1.5 14.5t-15.5 7.5h-232l264 495q11 23 -15 23h-314q-15 0 -25 -16l-114 -306q-114 29 -189 124t-75 214q0 133 90.5 231t224.5 114l56 7q21 0 21 19l7 54q17 173 146.5 290 t304.5 117q174 0 304.5 -117t149.5 -290l7 -62q0 -18 19 -18h171q145 0 248 -101.5t103 -243.5q0 -136 -95 -235.5t-235 -110.5q-21 0 -21 -19v-146q0 -18 21 -18q213 7 361.5 161t148.5 368q0 144 -71 265.5t-193.5 192t-266.5 70.5h-33q-53 213 -225.5 348t-392.5 135 q-226 0 -401 -140t-224 -358q-177 -41 -292 -184.5t-115 -328.5zM869 -509q0 -63 62 -82q2 0 12 -1.5t15 -1.5q27 0 52.5 15.5t34.5 51.5l240 927q10 38 -7 69t-53 42q-27 3 -28 3q-26 0 -50.5 -16t-33.5 -48l-241 -930q-3 -14 -3 -29zM1312 -182q0 -21 11 -40 q22 -35 54 -47q17 -5 32 -5t34 8q33 14 45 61l154 605q5 23 5 29q0 24 -17 48t-49 34q-27 3 -28 3q-27 0 -50 -15.5t-32 -48.5l-156 -608q0 -3 -1.5 -11.5t-1.5 -12.5z" />
<glyph unicode="&#xf021;" horiz-adv-x="2209" d="M0 678q0 36 25 60t61 24h1289q35 0 58 -23.5t23 -60.5q0 -35 -23 -58t-58 -23h-1289q-36 0 -61 23t-25 58zM258 987q0 35 25 59q24 24 60 24h1290q34 0 57.5 -24t23.5 -59t-23.5 -59.5t-57.5 -24.5h-1290q-35 0 -60 24.5t-25 59.5zM430 375q0 34 26 58q23 23 58 23h1291 q36 0 60 -23t24 -58t-24.5 -60t-59.5 -25h-1291q-35 0 -59.5 25t-24.5 60zM1559 678q0 37 23.5 60.5t60.5 23.5h482q37 0 60.5 -24t23.5 -60q0 -35 -24 -58t-60 -23h-482q-37 0 -60.5 23t-23.5 58z" />
<glyph unicode="&#xf022;" horiz-adv-x="2564" d="M0 89q0 -37 29 -64q27 -27 65 -27h612q42 0 73.5 -30.5t31.5 -72.5q0 -43 -31.5 -74t-73.5 -31q-41 0 -73 32q-29 26 -65 26q-38 0 -64 -26t-26 -64q0 -36 26 -64q84 -84 202 -84t201.5 83t83.5 202q0 118 -83.5 202t-201.5 84h-612q-38 0 -66 -27.5t-28 -64.5zM0 411 q0 -35 29 -62q28 -26 65 -26h1157q118 0 201.5 83t83.5 201t-83.5 200.5t-201.5 82.5q-122 0 -202 -81q-24 -25 -24 -65t24.5 -64t62.5 -24t66 24q30 30 73 30q41 0 72 -30t31 -73q0 -42 -31 -73t-72 -31h-1157q-38 0 -66 -27.5t-28 -64.5zM269 662q0 -14 17 -14h153 q13 0 23 16q36 87 111.5 143.5t168.5 63.5l56 8q20 0 20 18l8 55q17 173 147 289.5t305 116.5t304.5 -116t147.5 -290l7 -62q0 -19 20 -19h173q145 0 247 -101t102 -243t-102.5 -244t-246.5 -102h-737q-18 0 -18 -19v-146q0 -18 18 -18h737q143 0 264.5 71t192.5 193t71 265 q0 141 -73 264q117 113 161 275l16 72q3 3 3 8q0 7 -15 17l-64 22q-134 41 -204.5 145t-70.5 215q0 39 10 84l14 66q4 16 -14 24l-85 26q-70 17 -133 17q-59 0 -120 -14t-125.5 -43.5t-125.5 -85t-107 -130.5q-113 48 -247 48q-226 0 -399.5 -140t-220.5 -357 q-137 -32 -242 -131t-145 -235v-3q-2 -3 -2 -9zM1680 1397q50 88 138 134.5t182 46.5q22 0 33 -1q-2 -14 -2 -38q0 -151 84 -289t232 -207q-25 -60 -80 -110q-142 122 -337 122h-35q-43 201 -215 342z" />
<glyph unicode="&#xf023;" horiz-adv-x="2699" d="M0 86q0 -38 27 -63t67 -25h1003q38 0 63 25t25 63q0 40 -25 65.5t-63 25.5h-1003q-40 0 -67 -26t-27 -65zM281 411q0 -38 28 -64q26 -27 64 -27h1005q37 0 62.5 26.5t25.5 64.5q0 37 -25 62.5t-63 25.5h-1005q-38 0 -65 -25.5t-27 -62.5zM392 661q0 -15 19 -15h152 q14 0 24 15q36 87 111 144t168 64l59 8q19 0 19 18l7 55q17 174 147.5 290.5t306.5 116.5q175 0 303 -115t150 -289l8 -62q0 -18 19 -18h172q145 0 247 -102t102 -246q0 -141 -103.5 -244.5t-245.5 -103.5h-737q-18 0 -18 -18v-143q0 -18 18 -18h737q144 0 266 70t193 191.5 t71 265.5t-69 264q115 103 161 275l19 73q1 2 1 7q0 13 -16 17l-66 23q-70 21 -124 61t-85.5 89.5t-47 100.5t-15.5 101q0 38 12 93l14 65q7 15 -14 24l-88 26q-70 17 -133 17q-60 0 -121 -14t-126 -43.5t-125.5 -85t-105.5 -130.5q-124 51 -253 51q-226 0 -400.5 -140.5 t-221.5 -360.5q-139 -32 -243.5 -130.5t-145.5 -235.5v-3q-2 -2 -2 -8zM469 -245q0 -39 27 -64q26 -27 64 -27h1006q38 0 65 27t27 64t-27 62.5t-65 25.5h-1006q-38 0 -64.5 -25.5t-26.5 -62.5zM1811 1394q55 88 143.5 136.5t181.5 46.5q18 0 27 -1v-26q0 -156 84.5 -297.5 t231.5 -211.5q-28 -64 -81 -114q-141 126 -341 126h-34q-40 193 -212 341z" />
<glyph unicode="&#xf024;" horiz-adv-x="2325" d="M0 527q0 -213 148.5 -366t362.5 -163q19 0 19 18v143q0 18 -19 18q-137 7 -233 109t-96 241q0 133 90 231t224 114l56 3q21 0 21 19l8 58q17 173 146.5 290t304.5 117q173 0 304 -117t149 -290l8 -62q0 -18 18 -18h172q142 0 246 -102.5t104 -242.5q0 -139 -96 -241 t-233 -109q-21 0 -21 -18v-143q0 -18 21 -18q213 7 361 161t148 368q0 137 -69 257q126 119 165 279l14 73q3 2 3 7q0 12 -17 17l-60 18q-91 27 -155.5 90.5t-91.5 133t-27 140.5q-1 39 8 84l15 62q5 14 -15 23l-85 27q-67 20 -140 20q-56 0 -115.5 -13.5t-124.5 -43 t-126.5 -85t-106.5 -130.5q-120 52 -253 52q-226 0 -401 -140t-224 -358q-177 -41 -292 -184.5t-115 -328.5zM584 -223q14 -34 49 -48q31 -16 66 -2.5t48 47.5q16 35 2.5 69t-47.5 47q-32 16 -66 2t-50 -49q-16 -25 -2 -66zM651 79q0 -24 17 -48t49 -34q41 -16 71.5 0.5 t42.5 60.5l94 342q11 40 -8.5 71.5t-57.5 39.5q-35 11 -67 -7t-43 -54l-94 -343q0 -3 -2 -13t-2 -15zM850 -518q0 -20 6 -31q14 -35 48 -48q15 -8 35 -8q10 0 32 6q36 13 51.5 48t-0.5 70t-47.5 49t-65.5 0q-31 -13 -45 -38t-14 -48zM929 -235q0 -61 68 -83q15 -5 25 -5 q18 0 37 9q37 13 50 61l176 653q10 38 -7.5 69t-53.5 42q-37 11 -69.5 -7t-42.5 -54l-179 -658q-4 -18 -4 -27zM1296 -191q0 -20 7 -33q13 -32 47 -47q19 -8 37 -8q10 0 32 6q35 14 48 47q13 35 0.5 67.5t-44.5 48.5q-35 16 -69.5 2.5t-50.5 -49.5q-7 -13 -7 -34zM1373 82 q0 -26 16.5 -49t48.5 -33q27 -3 29 -3q65 0 82 65l93 338q10 38 -7.5 69t-53.5 42q-37 11 -68.5 -7t-42.5 -54l-94 -339q-3 -14 -3 -29zM1442 1389q50 92 138.5 140t187.5 47q18 0 27 -2v-33q0 -156 83.5 -293.5t231.5 -207.5q-31 -70 -80 -114q-141 125 -347 125h-34 q-41 200 -207 338z" />
<glyph unicode="&#xf025;" horiz-adv-x="2320" d="M0 527q0 -213 148.5 -366t362.5 -163q18 0 18 18v146q0 19 -18 19q-139 11 -234 110.5t-95 235.5q0 134 90.5 233.5t223.5 110.5l56 8q21 0 21 18l8 55q17 173 146 289.5t304 116.5q174 0 304 -116t148 -290l8 -62q0 -19 19 -19h172q145 0 247.5 -101t102.5 -243 q0 -136 -95 -235.5t-234 -110.5q-21 0 -21 -19v-146q0 -18 21 -18q213 7 360.5 161t147.5 368q0 143 -73 264q128 116 165 275l16 77q1 1 1 7q0 12 -17 17l-62 18q-91 26 -155 88t-91 131.5t-27 140.5q0 39 10 84l15 66q5 15 -15 24l-84 26q-70 17 -133 17q-58 0 -119 -14 t-127 -43.5t-128 -85t-107 -130.5q-113 48 -249 48q-226 0 -400.5 -139.5t-224.5 -357.5q-176 -42 -291 -185.5t-115 -327.5zM818 31q-8 -23 15 -23h230l-140 -442h32l445 596q6 7 3 14.5t-14 7.5h-235l246 449q11 23 -15 23h-314q-13 0 -23 -15zM1437 1391q53 91 141.5 139 t183.5 48q20 0 29 -2v-33q0 -154 83 -291t231 -209q-25 -59 -80 -114q-147 126 -343 126h-34q-45 200 -211 336z" />
<glyph unicode="&#xf026;" horiz-adv-x="2332" d="M0 525q0 -212 149 -366t363 -161q19 0 19 18v143q0 18 -19 18q-136 7 -233 110t-97 238q0 136 90.5 235.5t224.5 110.5l57 7q21 0 21 19l7 54q17 176 146.5 293.5t305.5 117.5q174 0 305.5 -117t149.5 -290l8 -61q0 -20 18 -20h173q145 0 248.5 -103t103.5 -246 q0 -88 -44 -166.5t-120.5 -127.5t-166.5 -54q-21 0 -21 -18v-143q0 -18 21 -18q141 4 258 76t184.5 191.5t67.5 259.5q0 141 -73 268q133 119 169 280l15 73q3 3 3 8q0 9 -18 17l-59 19q-92 27 -157 90.5t-92.5 133t-27.5 137.5q-3 34 10 88l14 62q7 16 -14 25l-85 26 q-65 18 -138 18q-58 0 -119.5 -14t-127 -44t-127.5 -86.5t-107 -131.5q-130 49 -251 49q-226 0 -401.5 -140.5t-225.5 -359.5q-180 -46 -293.5 -189t-113.5 -329zM577 -227q0 -27 17.5 -54t50.5 -37q37 -11 68 4t42 60l15 65q8 36 -10 67.5t-55 42.5q-36 11 -68.5 -8 t-42.5 -57l-15 -63q-2 -6 -2 -20zM658 82q0 -34 27 -61q25 -27 60 -27q38 0 64 25.5t26 62.5t-26 62.5t-64 25.5q-37 0 -62 -25t-25 -63zM723 325q-2 -25 14.5 -48.5t51.5 -34.5q33 -10 66 7.5t44 54.5l30 96q12 39 -7 69.5t-58 41.5q-35 11 -67.5 -7t-43.5 -53l-26 -98 q0 -3 -2 -12.5t-2 -15.5zM847 -560q0 -28 16.5 -53t51.5 -35q13 -3 27 -3q68 0 84 65l15 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-15 -63q-3 -14 -3 -24zM930 -250q0 -35 27 -62q26 -26 61 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM997 -8 q-2 -24 14 -50t48 -32q37 -10 68 6t44 60l29 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1291 -237q0 -26 16.5 -51t49.5 -35q5 0 14.5 -2t14.5 -2q65 0 81 70l15 64q11 34 -7 67t-54 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63 q0 -4 -2 -13t-2 -14zM1370 78q0 -36 27 -61q24 -26 61 -26q38 0 63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1435 325q0 -27 17.5 -51.5t52.5 -34.5q3 0 13 -2t15 -2q16 0 38 10q34 18 44 56l26 96q10 36 -8 67.5t-54 42.5q-37 11 -68 -6t-42 -54l-30 -97 q0 -4 -2 -12.5t-2 -12.5zM1442 1397q51 92 140 142.5t184 49.5q15 0 32 -3v-34q-2 -157 82.5 -294.5t236.5 -206.5q-31 -65 -85 -118q-148 122 -344 122h-33q-50 208 -213 342z" />
<glyph unicode="&#xf027;" horiz-adv-x="2333" d="M0 525q0 -179 106.5 -320.5t274.5 -188.5q14 -3 26 8l120 150q-140 0 -242.5 104t-102.5 247q0 134 90 231.5t225 109.5l53 7q20 0 20 20l8 57q20 174 150 291t305 117q174 0 305 -117.5t150 -290.5l7 -62q0 -18 19 -18h173q141 0 243.5 -102t102.5 -243 q0 -136 -90 -236.5t-221 -111.5q-72 -9 -92 -30l-249 -310q-25 -28 -20 -67q4 -38 33.5 -63t60.5 -25q36 0 68 40l218 276q99 10 187.5 55.5t151.5 115.5t100 163t37 193q0 139 -73 260q130 118 169 280v10l21 82l-81 28q-92 27 -156.5 89t-92 131t-27.5 140q0 41 9 85 l20 83l-89 25q-1 0 -3 1.5t-4 2.5t-4.5 2t-3.5 1q-70 17 -133 17q-61 -1 -122.5 -15t-128 -44t-128.5 -86t-107 -132q-120 52 -250 52q-226 0 -401 -140t-225 -358q-181 -44 -294 -186.5t-113 -327.5zM395 -327q0 -21 7 -33q14 -35 46 -49q35 -16 71 -3t49 47 q16 35 1.5 71.5t-48.5 48.5q-35 16 -70.5 2.5t-48.5 -48.5q-7 -15 -7 -36zM592 -66v-12q3 -36 35 -59q21 -24 58 -23t70 34l248 311q22 28 18 66.5t-32 61.5t-67 19t-61 -36l-248 -305q-21 -24 -21 -57zM653 -622q14 -34 49 -48q17 -8 35 -8q10 0 32 6q34 14 47 47 q13 35 1 69t-47 51q-35 13 -67 -0.5t-48 -46.5q-17 -30 -2 -70zM823 -338v-9q4 -36 34 -61.5t60 -25.5q35 0 64 36l460 572q23 27 20 66t-31 62q-32 23 -70.5 19.5t-60.5 -31.5l-456 -572q-20 -25 -20 -56zM1197 -456q0 -18 8 -35q13 -36 50 -50q36 -14 65 -2q35 14 49 49 q16 35 3.5 68.5t-47.5 49.5q-35 13 -69.5 0t-50.5 -45q-8 -19 -8 -35zM1441 1391q50 92 138.5 140.5t187.5 46.5q19 0 28 -1v-32q0 -155 85.5 -293.5t233.5 -209.5q-40 -75 -84 -119q-142 126 -343 126h-34q-48 205 -212 342z" />
<glyph unicode="&#xf028;" horiz-adv-x="2331" d="M0 528q0 -213 149 -366.5t363 -163.5q19 0 19 18v143q0 18 -19 18q-137 8 -233.5 110t-96.5 241q0 133 90.5 231.5t224.5 114.5l57 4q21 0 21 18l7 58q17 173 147 290.5t305 117.5q174 0 305 -117.5t149 -290.5l8 -61q0 -19 18 -19h173q143 0 247.5 -102.5t104.5 -243.5 q0 -139 -96.5 -241t-233.5 -110q-22 0 -22 -18v-143q0 -18 22 -18q213 7 361 161.5t148 368.5q0 141 -73 262q129 117 169 279l15 77q2 1 2 7q0 12 -17 17l-60 19q-91 26 -156 88.5t-92.5 131.5t-27.5 137q-3 36 9 88l15 65q7 16 -15 26l-84 26q-72 16 -135 16 q-60 0 -122 -14t-128 -43.5t-128 -85t-107 -130.5q-132 48 -249 48q-226 0 -401.5 -140.5t-225.5 -359.5q-177 -41 -292 -185t-115 -329zM593 -201q0 -27 17.5 -52.5t52.5 -35.5q37 -11 68.5 4.5t42.5 59.5l153 626q10 40 -9 72t-56 39q-35 11 -67.5 -7t-43.5 -54l-154 -629 q0 -2 -2 -10t-2 -13zM871 -529q0 -25 16.5 -49t47.5 -33q18 -4 26 -4q70 0 87 63l240 953q10 39 -7.5 69.5t-53.5 41.5q-37 11 -70.5 -7.5t-41.5 -53.5l-241 -952q0 -2 -1.5 -12.5t-1.5 -15.5zM1315 -210q0 -57 67 -79q22 -6 32 -6q18 0 37 8q33 13 42 62l153 626 q10 38 -8 69t-54 42q-37 11 -70 -7t-41 -54l-153 -629q-5 -28 -5 -32zM1441 1395q51 93 139.5 141.5t187.5 46.5q19 0 29 -1v-32q-2 -155 82 -293t236 -210q-36 -73 -84 -114q-147 121 -344 121h-33q-44 203 -213 341z" />
<glyph unicode="&#xf029;" horiz-adv-x="2331" d="M0 527q0 -213 148.5 -366t362.5 -163q18 0 18 18v146q0 19 -18 19q-139 11 -234 110.5t-95 235.5q0 132 90 230t224 114l56 8q21 0 21 18l8 55q17 173 146 289.5t304 116.5q174 0 304 -116t148 -290l8 -62q0 -19 19 -19h172q144 0 247 -101t103 -243q0 -136 -95 -235.5 t-234 -110.5q-21 0 -21 -19v-146q0 -18 21 -18q213 7 360.5 161t147.5 368q0 139 -69 259q130 117 169 279v14l20 84l-81 22q-130 39 -202 144.5t-72 216.5q0 42 9 83l21 85l-91 27l-14 4q-75 15 -133 15q-60 0 -122 -14t-128.5 -44t-128 -85.5t-106.5 -131.5 q-119 52 -252 52q-226 0 -399.5 -140t-220.5 -358q-180 -41 -295.5 -184t-115.5 -328zM576 -195q0 -24 16 -47.5t48 -35.5q35 -12 68 5.5t44 54.5l30 113q11 33 -7.5 66t-54.5 44q-37 10 -69.5 -9t-44.5 -57l-25 -106q-5 -25 -5 -28zM714 310q0 -18 11 -38q12 -28 57 -41 q39 -10 70 6.5t43 55.5l30 110q11 37 -7.5 68.5t-54.5 41.5q-39 10 -71 -7.5t-43 -55.5l-29 -108q-6 -22 -6 -32zM848 -528q0 -27 16.5 -52.5t48.5 -35.5q17 -5 24 -5q14 0 40 11q32 13 46 59l32 112q11 34 -7.5 67t-54.5 44q-39 10 -71.5 -8.5t-43.5 -56.5l-27 -108 q-3 -13 -3 -27zM990 -19q0 -24 16 -47.5t49 -35.5q36 -11 68 6t43 56l29 111q11 34 -6.5 66.5t-52.5 43.5q-39 10 -72.5 -9t-44.5 -57l-26 -107zM1289 -207q0 -60 68 -80q14 -3 26 -3q24 0 39 7q34 13 47 61l29 109q10 40 -8.5 71.5t-56.5 39.5q-37 11 -68.5 -7.5 t-42.5 -54.5l-29 -111q0 -4 -2 -15.5t-2 -16.5zM1437 307q0 -25 16.5 -49t49.5 -34q23 -5 25 -5q14 0 40 11q33 13 47 59l30 111q10 35 -9 67t-57 43q-35 11 -67 -7.5t-43 -55.5l-28 -113q-4 -18 -4 -27zM1441 1391q51 90 141.5 140t193.5 50h22q-1 -14 -1 -40 q0 -152 83.5 -289t231.5 -209q-35 -69 -83 -117q-149 129 -347 129h-34q-40 189 -207 336z" />
<glyph unicode="&#xf02a;" horiz-adv-x="2331" d="M0 525q0 -212 149 -366t363 -161q19 0 19 18v143q0 18 -19 18q-136 7 -233 109.5t-97 238.5t90.5 235t224.5 110l57 8q21 0 21 18l7 55q17 175 146.5 293t305.5 118q174 0 305 -117.5t149 -290.5l8 -61q0 -19 18 -19h173q145 0 248.5 -103t103.5 -246q0 -136 -97 -238.5 t-233 -109.5q-22 0 -22 -18v-143q0 -18 22 -18q140 4 257 76t184.5 192t67.5 259q0 146 -69 265q118 106 162 275l18 77q2 2 2 8q0 12 -17 17l-65 18q-70 21 -124.5 61t-86 89.5t-47 101t-15.5 101.5q0 43 11 92l12 66q4 15 -15 24l-85 26q-70 17 -133 17q-59 0 -120 -14 t-126 -44t-126 -85.5t-106 -130.5q-129 53 -254 53q-226 0 -401.5 -140.5t-225.5 -359.5q-180 -45 -293.5 -188t-113.5 -329zM681 89q0 -38 25.5 -64.5t62.5 -26.5q38 0 63.5 26.5t25.5 64.5q0 36 -25.5 62t-63.5 26q-37 0 -62.5 -26t-25.5 -62zM681 -299q0 -36 26 -62 t62 -26q38 0 63.5 25t25.5 63t-25.5 63t-63.5 25t-63 -25t-25 -63zM1023 -118q0 -39 26 -63q26 -26 62 -26q38 0 65 26t27 63q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1023 270q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5 q-36 0 -62 -26.5t-26 -63.5zM1023 -510q0 -35 26 -61q27 -27 62 -27q38 0 65 25.5t27 62.5q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1368 89q0 -38 26.5 -64.5t63.5 -26.5t62.5 26.5t25.5 64.5q0 36 -25.5 62t-62.5 26t-63.5 -26t-26.5 -62zM1368 -299 q0 -36 26 -62t64 -26t63 25.5t25 62.5q0 38 -25 63t-63 25t-64 -25t-26 -63zM1441 1395q50 87 138.5 134.5t182.5 49.5q24 0 35 -2v-33q0 -155 83.5 -292.5t231.5 -209.5q-25 -58 -81 -114q-142 126 -344 126h-33q-44 197 -213 341z" />
<glyph unicode="&#xf02b;" horiz-adv-x="2323" d="M0 529q0 -213 148.5 -366t362.5 -164q19 0 19 19v142q0 19 -19 19q-137 7 -233 109t-96 241q0 133 90 231t224 114l56 4q21 0 21 19l8 58q17 173 146.5 289.5t304.5 116.5q174 0 305 -117t149 -289l7 -61q0 -20 19 -20h173q142 0 245.5 -102.5t103.5 -242.5 q0 -139 -96 -241t-233 -109q-20 0 -20 -19v-142q0 -19 20 -19q140 5 257.5 77t185 192.5t67.5 260.5q0 139 -73 261q125 119 164 275l15 78q2 1 2 7q0 12 -17 17l-61 18q-91 26 -156 87.5t-92.5 129.5t-27.5 137q0 46 12 91l14 65q4 16 -14 25l-85 26q-72 16 -135 16 q-58 0 -119 -14t-126.5 -43t-127.5 -84t-107 -128q-130 49 -249 49q-226 0 -401 -140.5t-225 -358.5q-177 -42 -291.5 -185.5t-114.5 -328.5zM633 435q0 -61 44.5 -104t108.5 -43t107 42.5t43 104.5q0 41 -37 109t-69 105q-17 19 -44 46l-37 -44q-43 -47 -79.5 -110.5 t-36.5 -105.5zM952 10q0 -105 73 -177t176 -72q105 0 177.5 73t72.5 176q0 88 -85 213q-71 93 -137 159q-13 9 -28 24l-25 -24q-63 -58 -136 -158q-38 -53 -63 -111t-25 -103zM1109 721q0 -41 30.5 -70t74.5 -29q41 0 70 29t29 70q0 68 -99 173l-27 -29q-29 -32 -53.5 -74.5 t-24.5 -69.5zM1435 1395q56 91 143 137.5t183 46.5q19 0 29 -2v-32q0 -154 84 -292t233 -210q-25 -60 -80 -110q-148 122 -342 122h-35q-49 210 -215 340z" />
<glyph unicode="&#xf02c;" horiz-adv-x="2328" d="M0 529q0 -177 106 -316.5t275 -190.5l-69 -181q-7 -22 15 -22h226l-138 -446h30l451 600q6 7 2 14.5t-15 7.5h-232l264 495q11 23 -14 23h-316q-14 0 -24 -16l-114 -307q-114 29 -189.5 124.5t-75.5 214.5q0 133 90.5 231t224.5 114l56 8q21 0 21 19l8 54 q17 173 146.5 290t304.5 117q174 0 305 -117.5t149 -289.5l8 -61q0 -20 18 -20h173q145 0 248 -101.5t103 -243.5q0 -136 -96 -236t-235 -110q-20 0 -20 -20v-145q0 -19 20 -19q213 7 361.5 161.5t148.5 368.5q0 139 -70 261q122 118 161 280l20 73q1 1 1 7q0 13 -16 17 l-66 18q-92 27 -156 89.5t-90.5 130t-25.5 134.5q0 44 11 91l12 65q4 16 -15 25l-85 26q-75 15 -132 15q-59 1 -120.5 -12.5t-126.5 -43t-125.5 -84t-105.5 -128.5q-136 49 -254 49q-226 0 -401 -140.5t-225 -358.5q-177 -42 -292 -185.5t-115 -328.5zM872 -523 q0 -25 16.5 -50t48.5 -35q25 -5 29 -5q15 0 39 11q33 16 45 56l30 112q10 35 -8.5 67.5t-56.5 43.5q-35 10 -67.5 -9t-43.5 -57l-29 -107zM1015 -16q0 -69 65 -80q22 -5 29 -5q60 0 82 67l32 109q10 35 -9 67.5t-57 43.5q-36 11 -68.5 -7.5t-43.5 -56.5l-27 -108 q-3 -14 -3 -30zM1314 -194q2 -27 19 -51.5t51 -36.5q26 -6 35 -6q55 0 76 72l26 109q11 37 -6.5 70t-53.5 44q-40 10 -72.5 -9t-39.5 -57l-31 -110q0 -4 -2 -12.5t-2 -12.5zM1440 1395q53 89 143 137.5t188 48.5h23v-34q0 -102 36 -198t108.5 -177t171.5 -129 q-27 -60 -81 -110q-146 125 -343 125h-35q-45 201 -211 337zM1461 318q0 -69 69 -88q22 -4 32 -4q58 0 79 69l30 111q1 8 1 23q2 27 -15 52.5t-52 35.5q-2 0 -10.5 1.5t-13.5 1.5q-26 0 -51 -16.5t-35 -50.5l-31 -109q0 -1 -1.5 -11t-1.5 -15z" />
<glyph unicode="&#xf02d;" horiz-adv-x="2330" d="M0 531q0 -178 106 -317.5t275 -190.5l-70 -180q-4 -22 16 -22h226l-104 -374h31l417 527q6 8 1.5 15.5t-15.5 7.5h-232l264 494q11 23 -14 23h-316q-14 0 -24 -15l-114 -307q-115 29 -190 124.5t-75 214.5q0 133 90.5 231.5t224.5 114.5l56 8q21 0 21 18l8 55 q17 173 146.5 290t304.5 117q173 0 304.5 -117.5t150.5 -289.5l7 -63q0 -18 19 -18h173q145 0 248 -101.5t103 -244.5q0 -136 -96 -236t-235 -111q-20 0 -20 -18v-147q0 -19 20 -19q140 5 257.5 77t185 192.5t67.5 261.5q0 139 -70 261q127 121 166 280l15 77q2 2 2 8 q0 11 -17 16l-60 19q-91 26 -156 87.5t-92.5 131.5t-27.5 141q0 42 9 85l15 65q7 16 -15 25q-34 14 -96.5 28t-122.5 14q-58 0 -119 -14t-126.5 -43.5t-127.5 -85t-107 -130.5q-132 48 -254 48q-226 0 -401 -140t-225 -358q-177 -42 -292 -186t-115 -329zM864 -517 q0 -26 15.5 -49.5t47.5 -32.5q17 -3 32 -3q65 0 81 67l247 938q10 38 -7.5 69.5t-53.5 41.5q-37 11 -69.5 -6.5t-42.5 -52.5l-247 -943q-3 -14 -3 -29zM1309 -195q0 -26 15.5 -49t49.5 -33q5 0 16.5 -1.5t17.5 -1.5q61 0 77 67l160 616q10 39 -8 70t-54 41q-37 11 -69 -6 t-42 -53l-160 -621q-3 -16 -3 -29zM1441 1398q53 91 141.5 139t187.5 48q20 0 29 -1v-34q0 -154 83.5 -291t231.5 -210q-29 -67 -84 -114q-147 126 -343 126h-34q-45 199 -212 337z" />
<glyph unicode="&#xf02e;" horiz-adv-x="1512" d="M0 786q0 153 60 293t161.5 241.5t242 162t293.5 60.5h122q25 -7 25 -30l5 -94q6 -203 146 -346t340 -151l88 -7q26 0 26 -25v-104q1 -205 -99.5 -379.5t-274 -276t-378.5 -101.5q-156 0 -296.5 60t-241 161.5t-160 241.5t-59.5 294zM195 786q0 -122 48.5 -230t127 -181 t180 -115.5t206.5 -42.5q93 0 187.5 36.5t175.5 102t139.5 167.5t75.5 223q-261 54 -418.5 223.5t-181.5 398.5q-151 -8 -276.5 -93t-194.5 -215.5t-69 -273.5z" />
<glyph unicode="&#xf02f;" horiz-adv-x="2548" d="M0 93q0 -38 29 -64q29 -29 65 -29h627q42 0 73.5 -30t31.5 -73q0 -41 -32 -72.5t-73 -31.5q-40 0 -72 32q-30 28 -66 28q-37 0 -63 -27t-26 -65t26 -64q83 -83 201 -83q119 0 202 82.5t83 200.5q0 119 -83.5 203t-201.5 84h-627q-38 0 -66 -27t-28 -64zM0 414 q0 -36 29 -62q24 -26 65 -26h1172q118 0 201.5 83t83.5 201t-83.5 200.5t-201.5 82.5q-122 0 -202 -80q-24 -27 -24 -67q0 -38 24 -62.5t64 -24.5t65 24q30 30 73 30q41 0 72 -30t31 -73t-31 -74t-72 -31h-1172q-38 0 -66 -27t-28 -64zM283 664q0 -13 18 -13h153q13 0 23 15 q36 87 111.5 144t169.5 64l56 7q20 0 20 20l7 53q17 173 147 289.5t305 116.5t304 -115.5t148 -290.5l7 -61q0 -19 19 -19h174q144 0 246 -101t102 -243q0 -143 -102 -244.5t-246 -101.5h-737q-18 0 -18 -19v-146q0 -19 18 -19h737q143 0 264.5 71t192 193t70.5 266 q0 119 -45 216q122 160 122 355q0 114 -44.5 217.5t-119.5 178t-178.5 118.5t-216.5 44q-247 0 -414 -185q-125 65 -283 65q-226 0 -399.5 -139.5t-220.5 -357.5q-136 -32 -241 -131t-146 -233v-4q-3 -8 -3 -10zM1726 1371q115 109 264 109q156 0 267.5 -112t111.5 -267 q0 -97 -54 -197q-153 153 -370 153h-35q-37 171 -184 314z" />
<glyph unicode="&#xf030;" horiz-adv-x="2681" d="M0 91q0 -40 29 -64q27 -28 65 -28h1018q37 0 62.5 27t25.5 65t-25.5 65t-62.5 27h-1018q-38 0 -66 -27.5t-28 -64.5zM281 414q0 -36 29 -62q26 -26 64 -26h1019q38 0 63 25t25 63t-25.5 64.5t-62.5 26.5h-1019q-38 0 -65.5 -27t-27.5 -64zM403 663q0 -12 21 -12h152 q14 0 24 15q36 87 112 144t169 64l58 8q19 0 19 19l8 54q17 173 147 290t306 117t306 -116t148 -291l8 -61q0 -20 18 -20h173q146 0 248.5 -101t102.5 -244q0 -142 -102.5 -244t-248.5 -102h-737q-18 0 -18 -18v-147q0 -19 18 -19h737q145 0 267.5 71t194 193t71.5 266 q0 113 -47 214q123 161 123 351q0 152 -75.5 281.5t-204.5 204.5t-282 75q-244 0 -410 -178q-136 65 -290 65q-149 0 -280.5 -63t-221 -177t-120.5 -259q-140 -32 -244.5 -128.5t-145.5 -231.5zM469 -239q0 -37 28 -62q26 -26 64 -26h1020q38 0 64.5 25t26.5 63t-27 65 t-64 27h-1020q-37 0 -64.5 -27.5t-27.5 -64.5zM1856 1369q108 104 263 104q158 0 269 -110.5t111 -268.5q0 -101 -52 -189q-157 153 -375 153h-34q-39 175 -182 311z" />
<glyph unicode="&#xf031;" horiz-adv-x="2282" d="M0 529q0 -143 70 -264.5t191 -192.5t264 -71h1153q143 0 264.5 71t192.5 192.5t71 264.5q0 102 -45 213q121 148 121 352q0 152 -74 280.5t-202.5 203.5t-280.5 75q-239 0 -413 -186q-122 69 -287 69q-225 0 -397.5 -139t-221.5 -357q-179 -40 -292.5 -183t-113.5 -328z M182 529q0 133 89 230t224 113l73 3l7 77q22 173 150 289.5t300 116.5q175 0 305 -117t147 -289l11 -80h190q141 0 243 -101.5t102 -241.5q0 -144 -101.5 -247t-243.5 -103h-1153q-139 0 -241 104t-102 246zM1465 1365q110 106 260 106q158 0 268.5 -109.5t110.5 -267.5 q0 -99 -55 -196q-153 153 -371 153h-33q-44 178 -180 314z" />
<glyph unicode="&#xf032;" horiz-adv-x="2294" d="M0 529q0 -213 148.5 -366t362.5 -164q19 0 19 19v142q0 19 -19 19q-137 7 -233 109t-96 241q0 133 90 231t224 114l56 8q21 0 21 19l8 54q17 173 146.5 289.5t304.5 116.5q174 0 305 -117t149 -289l7 -62q0 -19 19 -19h173q145 0 247 -101t102 -244q0 -139 -96 -241 t-233 -109q-20 0 -20 -19v-142q0 -19 20 -19q140 5 257.5 77t185 192.5t67.5 260.5q0 118 -46 214q126 153 126 354q0 151 -75.5 280t-204.5 204.5t-280 75.5q-249 0 -414 -185q-131 70 -289 70q-226 0 -401 -140.5t-225 -358.5q-176 -42 -291 -185.5t-115 -328.5zM573 -215 q14 -35 49 -49q32 -16 66.5 -2.5t47.5 47.5q14 35 1 69.5t-47 50.5q-32 13 -65.5 -1t-49.5 -46q-16 -27 -2 -69zM640 87q0 -25 16.5 -49t49.5 -33q36 -11 69 6t46 59l105 332q12 39 -8 71t-59 40q-35 11 -66.5 -6.5t-42.5 -53.5l-107 -339zM839 -511q0 -11 6 -31 q15 -36 49 -48q13 -8 35 -8q10 0 32 6q35 13 50.5 48.5t-0.5 70.5t-48 49t-66 1q-31 -13 -44.5 -38.5t-13.5 -49.5zM918 -226q0 -28 16 -51t51 -30q3 0 12 -2t14 -2q69 5 86 66l188 647q11 39 -6.5 69.5t-53.5 41.5q-37 11 -69 -6.5t-43 -53.5l-192 -647q0 -4 -1 -10.5 t-1.5 -12t-0.5 -9.5zM1285 -183q0 -16 5 -34q13 -34 49 -47q15 -7 38 -7q19 0 31 6q36 14 49 46q13 35 0.5 69t-44.5 51q-35 13 -69.5 -1t-50.5 -46q-8 -17 -8 -37zM1361 88q0 -57 66 -80q22 -6 32 -6q19 0 36 9q28 14 43 59l105 332q12 37 -6.5 68.5t-54.5 42.5 q-37 11 -68 -6.5t-43 -53.5l-105 -334q-5 -28 -5 -31zM1471 1369q110 106 264 106q156 0 266.5 -111t110.5 -267q0 -99 -55 -196q-157 157 -372 157h-35q-49 185 -179 311z" />
<glyph unicode="&#xf033;" horiz-adv-x="2285" d="M0 525q0 -105 40 -200.5t108.5 -165t162.5 -112.5t199 -48q19 0 19 18v143q0 18 -19 18q-139 10 -234 110t-95 237q0 134 90.5 233t223.5 111l56 6q20 0 20 19l8 55q11 114 74 207t162 145.5t215 52.5q174 0 303.5 -115t148.5 -287l7 -62q0 -18 20 -18h171 q144 0 247 -102.5t103 -244.5q0 -137 -95 -237t-234 -110q-21 0 -21 -18v-143q0 -18 21 -18q214 10 361 161.5t147 364.5q0 102 -50 220q127 159 127 349q0 152 -75.5 281t-204 204t-279.5 75q-254 0 -413 -185q-130 68 -284 68q-225 0 -400 -140.5t-224 -359.5 q-179 -41 -292.5 -184t-113.5 -328zM816 32q-4 -22 15 -22h231l-141 -445h31l446 595q6 7 2.5 14.5t-14.5 7.5h-233l245 452q12 23 -15 23h-314q-12 0 -22 -15zM1463 1366q107 106 264 106t266.5 -110t109.5 -268q0 -95 -55 -192q-155 149 -368 149h-33q-47 190 -184 315z " />
<glyph unicode="&#xf034;" horiz-adv-x="2307" d="M0 527q0 -139 68 -259t186 -192.5t259 -76.5q20 0 20 18v143q0 19 -20 19q-137 7 -234 109.5t-97 238.5t91 235.5t225 110.5l56 8q21 0 21 18l8 55q17 176 147.5 294.5t306.5 118.5q174 0 305 -117.5t149 -291.5l8 -62q0 -18 19 -18h173q144 0 247.5 -103.5t103.5 -247.5 q0 -136 -97 -238.5t-233 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185 192.5t67.5 259q0 116 -45 215q129 159 129 359q0 153 -75.5 282.5t-205 205t-281.5 75.5q-119 0 -229 -49.5t-190 -136.5q-141 69 -289 69q-227 0 -403 -140.5t-226 -359.5 q-180 -46 -294 -190t-114 -330zM569 -227q0 -27 17.5 -54t50.5 -37q37 -11 68 4t42 60l15 65q8 36 -10 67.5t-55 42.5q-36 11 -68.5 -8t-42.5 -57l-15 -63q-2 -6 -2 -20zM650 82q0 -34 27 -61q25 -27 60 -27q38 0 64 25.5t26 62.5t-26 62.5t-64 25.5q-37 0 -62 -25t-25 -63z M715 325q-2 -25 14.5 -48.5t51.5 -34.5q33 -10 66 7.5t44 54.5l30 96q12 39 -7 69.5t-58 41.5q-35 11 -67.5 -7t-43.5 -53l-26 -98q0 -3 -2 -12.5t-2 -15.5zM839 -560q0 -28 16.5 -53t51.5 -35q13 -3 27 -3q68 0 84 65l15 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5 l-15 -63q-3 -14 -3 -24zM922 -250q0 -35 27 -62q26 -26 61 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM989 -8q-2 -24 14 -50t48 -32q37 -10 68 6t44 60l29 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1283 -237 q0 -26 16.5 -51t49.5 -35q5 0 14.5 -2t14.5 -2q65 0 81 70l15 64q11 34 -7 67t-54 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -4 -2 -13t-2 -14zM1362 78q0 -36 27 -61q24 -26 61 -26q38 0 63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1427 325q0 -27 17.5 -51.5 t52.5 -34.5q3 0 13 -2t15 -2q16 0 38 10q34 18 44 56l26 96q10 36 -8 67.5t-54 42.5q-37 11 -68 -6t-42 -54l-30 -97q0 -4 -2 -12.5t-2 -12.5zM1477 1370q111 111 268 111t267.5 -111.5t110.5 -268.5q0 -107 -54 -197q-154 154 -378 154h-34q-45 187 -180 312z" />
<glyph unicode="&#xf035;" horiz-adv-x="2323" d="M0 515q0 -181 106.5 -321t279.5 -192q16 -2 27 8l121 156q-143 0 -246.5 102.5t-103.5 246.5q0 138 91.5 239t228.5 112l56 8q17 0 17 15l8 60q19 176 150.5 294t307.5 118q178 0 310.5 -117t149.5 -292l8 -63q4 -18 22 -18h174q144 0 248 -105t104 -251 q0 -135 -91 -235.5t-224 -113.5q-76 0 -97 -30l-233 -256q-25 -29 -20.5 -66.5t33.5 -67.5q21 -28 62.5 -24.5t64.5 40.5l209 222q132 13 243 87.5t175.5 192t64.5 251.5q0 101 -46 222q123 156 123 354q0 156 -76 286.5t-207 206t-285 75.5q-251 0 -416 -182 q-139 69 -296 69q-229 0 -404.5 -142t-225.5 -366q-183 -41 -298 -186.5t-115 -336.5zM405 -285q0 -23 5 -34q13 -34 47 -47q36 -16 72.5 -2.5t48.5 48.5q16 35 2 71.5t-49 49.5q-36 13 -70 -0.5t-50 -47.5q-6 -13 -6 -38zM601 -24q0 -37 34 -71q68 -58 134 16l234 260 q24 28 19.5 65.5t-33.5 60.5q-29 22 -67 17t-63 -31l-235 -254q-23 -34 -23 -63zM670 -550q0 -19 8 -34q14 -36 44 -49q19 -8 39 -8q12 0 34 6q34 15 47 48q16 32 2.5 68t-47.5 49q-36 17 -70 3t-52 -51q-5 -15 -5 -32zM848 -295v-14q3 -39 34 -64q23 -29 63.5 -25.5 t63.5 40.5l450 524q25 29 21 68t-37 61q-28 23 -64.5 20t-61.5 -32l-450 -525q-19 -20 -19 -53zM1235 -384q-11 -36 0 -66q14 -35 48 -52q17 -8 38 -8q10 0 32 6q36 14 49 49q16 36 3 70t-47 47q-36 17 -70.5 3.5t-52.5 -49.5zM1491 1368q109 109 264 109 q161 0 273.5 -112.5t112.5 -273.5q0 -100 -55 -194q-156 156 -379 156h-34q-40 182 -182 315z" />
<glyph unicode="&#xf036;" horiz-adv-x="2291" d="M0 525q0 -105 40 -200.5t108.5 -165t163 -112.5t199.5 -48q18 0 18 18v143q0 18 -18 18q-139 10 -234 110t-95 237q0 134 90.5 233.5t223.5 110.5l56 6q21 0 21 20l6 54q17 174 146.5 289.5t305.5 115.5q175 0 304.5 -114.5t147.5 -286.5l7 -62q0 -19 20 -19h171 q144 0 247 -102.5t103 -244.5q0 -137 -95 -237t-234 -110q-21 0 -21 -18v-143q0 -18 21 -18q214 10 361.5 161.5t147.5 364.5q0 115 -45 212q125 151 125 358q0 150 -75 279t-204 204.5t-279 75.5q-249 0 -414 -185q-141 69 -288 69q-226 0 -400.5 -140.5t-224.5 -360.5 q-176 -41 -291 -184.5t-115 -327.5zM585 -187q0 -64 69 -83q33 -11 67 6.5t44 53.5l160 611q10 35 -9.5 67t-57.5 43q-35 11 -67 -7.5t-42 -55.5l-160 -608q-4 -18 -4 -27zM862 -513q0 -19 9 -39q16 -33 54 -46q4 0 10.5 -1t12 -1.5t9.5 -0.5q69 0 81 70l245 932 q11 35 -6.5 67t-53.5 43q-39 11 -72 -7.5t-40 -55.5l-246 -933q-3 -15 -3 -28zM1305 -186q0 -25 17 -50t48 -34q10 -3 24 -3q27 0 52 14.5t34 48.5l160 611q12 33 -7 66t-55 44q-39 11 -70.5 -7.5t-38.5 -55.5l-160 -608q-4 -18 -4 -26zM1469 1362q107 107 264 107 q156 0 266 -109t110 -265q0 -100 -55 -197q-153 153 -373 153h-33q-45 187 -179 311z" />
<glyph unicode="&#xf037;" horiz-adv-x="2293" d="M0 526q0 -105 40 -200.5t108.5 -165.5t163.5 -113t200 -48q19 0 19 18v143q0 18 -19 18q-136 7 -232.5 109.5t-96.5 238.5t90 235t224 110l57 7q16 0 16 16l8 57q18 175 149 291.5t307 116.5q174 0 304.5 -115.5t149.5 -288.5l7 -61q0 -20 19 -20h173q142 0 244 -102 t102 -246q0 -136 -95 -238.5t-231 -109.5q-20 0 -20 -18v-143q0 -18 20 -18q214 10 362 162t148 365q0 103 -44 213q121 159 121 351q0 151 -75.5 280.5t-204.5 205t-280 75.5q-245 0 -412 -178q-139 69 -288 69q-227 0 -402 -141t-224 -361q-181 -42 -294.5 -183.5 t-113.5 -330.5zM575 -194q0 -27 15.5 -51.5t51.5 -36.5q18 -9 39.5 -7.5t43 21t29.5 51.5l30 108q10 40 -8.5 72t-56.5 39q-34 11 -67 -7.5t-44 -53.5l-30 -111q-3 -14 -3 -24zM715 315q1 -31 18 -55.5t51 -29.5q28 -5 32 -5q60 0 81 70l30 107q10 37 -8.5 70.5t-56.5 44.5 q-36 10 -68 -8.5t-43 -55.5l-32 -112q-4 -20 -4 -26zM847 -528q0 -28 16.5 -53t51.5 -35q22 -5 30 -5q14 0 40 11q27 13 41 59l32 108q10 40 -9 72.5t-56 39.5q-35 11 -68.5 -7.5t-44.5 -54.5l-30 -111q-3 -14 -3 -24zM989 -16q0 -27 17 -52.5t52 -35.5q36 -11 67.5 5 t43.5 60l30 108q11 40 -7.5 71t-56.5 38q-35 12 -68 -6.5t-44 -54.5l-30 -111q-4 -14 -4 -22zM1293 -202q-2 -25 14.5 -49.5t49.5 -35.5l27 -3q18 -1 40 8q34 13 45 58l30 112q11 37 -7.5 68.5t-54.5 42.5q-40 10 -71.5 -9t-38.5 -57l-31 -107q-3 -27 -3 -28zM1437 310 q0 -28 17.5 -53t51.5 -32l27 -3q69 0 86 66l30 110q10 40 -9 72t-57 39q-37 11 -68.5 -7.5t-41.5 -56.5l-32 -109q-4 -18 -4 -26zM1473 1366q107 103 261 103q156 0 266 -111.5t110 -267.5q0 -102 -51 -189q-154 154 -372 154h-34q-39 175 -180 311z" />
<glyph unicode="&#xf038;" horiz-adv-x="2297" d="M0 529q0 -213 149 -366.5t363 -163.5q19 0 19 18v143q0 18 -19 18q-137 8 -233.5 110t-96.5 241q0 133 90.5 231t224.5 114l56 4q21 0 21 19l8 58q17 173 146.5 290t304.5 117q174 0 305 -117t149 -290l8 -61q0 -20 18 -20h173q145 0 248 -101.5t103 -243.5 q0 -138 -97 -240.5t-234 -110.5q-20 0 -20 -18v-143q0 -18 20 -18q214 7 362.5 161.5t148.5 368.5q0 114 -46 214q126 154 126 354q0 152 -75.5 281.5t-204.5 204.5t-280 75q-248 0 -415 -185q-129 69 -289 69q-226 0 -401 -140.5t-225 -358.5q-177 -42 -292 -185.5 t-115 -328.5zM681 90q0 -35 26 -61q27 -27 62 -27q37 0 62.5 25t25.5 63t-25 63t-63 25t-63 -25t-25 -63zM681 -297q0 -38 26 -62q26 -26 62 -26q38 0 63 25t25 63t-25.5 64.5t-62.5 26.5t-62.5 -26.5t-25.5 -64.5zM1022 -112q0 -37 27 -65.5t62 -28.5q37 0 64 28t27 66 q0 35 -27 61.5t-64 26.5q-35 0 -62 -26.5t-27 -61.5zM1022 271q0 -36 26 -62t63 -26q38 0 64.5 25.5t26.5 62.5t-26.5 63.5t-64.5 26.5q-36 0 -62.5 -26.5t-26.5 -63.5zM1022 -504q0 -37 26.5 -64t62.5 -27q37 0 64 26.5t27 64.5q0 35 -27 61.5t-64 26.5q-35 0 -62 -26.5 t-27 -61.5zM1367 90q0 -33 26 -61q27 -27 64 -27t62.5 25t25.5 63t-25 63t-63 25t-64 -25t-26 -63zM1367 -297q0 -36 26 -62t64 -26t63 25t25 63t-25.5 64.5t-62.5 26.5t-63.5 -26.5t-26.5 -64.5zM1472 1369q108 108 265 108t266.5 -111t109.5 -269q0 -94 -54 -196 q-154 154 -373 154h-33q-47 186 -181 314z" />
<glyph unicode="&#xf039;" horiz-adv-x="2296" d="M-2 529q0 -213 148.5 -366.5t363.5 -163.5q18 0 18 18v146q0 20 -18 20q-140 10 -235.5 110t-95.5 236q0 135 91 234.5t225 110.5l56 7q20 0 20 20l7 53q17 173 147 290t306 117q175 0 305 -116.5t149 -290.5l6 -61q0 -19 20 -19h171q145 0 248 -101.5t103 -243.5 q0 -136 -95 -236t-234 -110q-22 0 -22 -20v-146q0 -18 22 -18q213 7 361.5 161.5t148.5 368.5q0 118 -46 214q126 153 126 358q0 151 -75.5 280.5t-204.5 205t-280 75.5q-244 0 -419 -187q-132 67 -284 67q-226 0 -401.5 -140t-224.5 -359q-177 -42 -292 -185.5t-115 -328.5 zM631 435q0 -60 45.5 -104t108.5 -44t106.5 43t43.5 105q0 41 -37.5 109t-70.5 107q-3 4 -19.5 21.5t-22.5 25.5l-38 -43q-44 -48 -80 -112.5t-36 -107.5zM950 10q0 -101 73.5 -175t175.5 -74q103 0 177 74t74 175q0 43 -25 103t-60 111q-74 95 -138 159q-9 7 -28 26 l-62 -62q-71 -68 -129 -166.5t-58 -170.5zM1107 725q0 -43 30 -71.5t76 -28.5q41 0 70 28.5t29 71.5q0 65 -99 172l-27 -28q-30 -32 -54.5 -74.5t-24.5 -69.5zM1469 1369q107 106 265 106q156 0 266 -109t110 -265q0 -101 -54 -197q-160 154 -374 154h-33q-45 188 -180 311z " />
<glyph unicode="&#xf03a;" horiz-adv-x="2294" d="M0 533q0 -176 106.5 -317.5t274.5 -191.5l-69 -177q-7 -22 15 -22h226l-122 -436h31l435 586q6 7 1.5 15t-15.5 8h-232l264 498q12 23 -14 23h-316q-15 0 -20 -15l-118 -312q-114 29 -189.5 125t-75.5 216q0 134 90.5 233.5t224.5 111.5l56 7q21 0 21 18l8 55 q17 174 146.5 290.5t305.5 116.5q175 0 305 -116.5t149 -290.5l7 -62q0 -18 19 -18h173q145 0 248 -101.5t103 -243.5q0 -137 -96 -237.5t-235 -110.5q-20 0 -20 -19v-147q0 -18 20 -18q213 7 361.5 162t148.5 370q0 116 -44 213q122 160 122 351q0 114 -45 217.5 t-120 178.5t-179 119.5t-217 44.5q-118 0 -226 -48t-186 -134q-131 70 -288 70q-227 0 -402 -139.5t-225 -359.5q-177 -41 -292 -185t-115 -328zM872 -520q0 -28 17 -54.5t49 -32.5q3 0 8.5 -1t10 -1.5t8.5 -0.5q68 5 85 65l31 113q10 35 -9.5 67.5t-56.5 43.5 q-35 10 -67.5 -9t-43.5 -57l-27 -107q-5 -25 -5 -26zM1015 -11q0 -24 16.5 -48t49.5 -36q35 -12 67 5.5t43 56.5l32 111q10 40 -8.5 72t-56.5 39q-36 11 -68.5 -7.5t-44.5 -56.5l-27 -109q0 -3 -1 -8.5t-1.5 -10t-0.5 -8.5zM1317 -184q0 -30 17 -55.5t50 -34.5q25 -5 29 -5 q63 0 82 64l26 113q11 35 -6 67t-53 44q-40 10 -73 -9.5t-40 -56.5l-30 -106q-2 -8 -2 -21zM1462 322q0 -26 17 -50.5t52 -36.5q27 -3 28 -3q19 0 40 9q31 16 42 56l31 111q10 35 -9.5 67.5t-56.5 43.5q-36 11 -68 -7.5t-43 -56.5l-30 -109q-3 -14 -3 -24zM1473 1373 q106 102 261 102q157 0 267 -110.5t110 -267.5q0 -101 -52 -190q-158 154 -372 154h-34q-49 185 -180 312z" />
<glyph unicode="&#xf03b;" horiz-adv-x="2288" d="M0 529q0 -178 106 -318t273 -187l-68 -179q-8 -23 15 -23h226l-111 -447h30l423 600q6 7 1.5 15t-15.5 8h-232l264 492q11 23 -15 23h-314q-14 0 -24 -15l-114 -306q-114 28 -188.5 122t-74.5 215q0 133 89.5 230.5t223.5 113.5l57 4q19 0 19 19l8 57q11 113 74 206.5 t162.5 146.5t214.5 53q173 0 303 -117t148 -289l8 -60q0 -20 18 -20h173q142 0 245.5 -102t103.5 -242q0 -138 -96 -239.5t-232 -108.5q-21 0 -21 -19v-143q0 -18 21 -18q139 4 256 76.5t184 192.5t67 259q0 117 -45 214q125 148 125 353q0 113 -44.5 216t-119.5 178 t-178 119.5t-216 44.5q-247 0 -412 -185q-129 69 -288 69q-225 0 -400 -139.5t-224 -357.5q-176 -41 -291 -184.5t-115 -327.5zM846 -525q0 -26 15.5 -49t48.5 -33l27 -3q67 0 85 64l259 948q10 37 -7 68.5t-52 42.5q-37 11 -69.5 -6.5t-42.5 -53.5l-261 -949q-3 -27 -3 -29 zM1288 -201q0 -64 66 -85q27 -3 28 -3q18 0 37 8q32 14 45 59l175 624q10 37 -8 68.5t-54 42.5q-37 11 -69 -6.5t-42 -53.5l-173 -628q-5 -23 -5 -26zM1466 1367q108 102 264 102q155 0 265 -109t110 -264q0 -101 -54 -197q-154 154 -371 154h-34q-45 183 -180 314z" />
<glyph unicode="&#xf03c;" horiz-adv-x="1120" d="M0 1160q0 80 57 137t137 57q79 0 135.5 -57t56.5 -137t-56.5 -137t-135.5 -57q-80 0 -137 57t-57 137zM94 1160q0 -42 29 -71q30 -30 71 -30t71 30t30 71t-30 71t-71 30q-42 0 -71 -29.5t-29 -71.5zM509 688q0 -123 68 -219q36 -50 99 -79.5t143 -29.5q234 0 293 178 q6 23 -6.5 43.5t-35.5 24.5q-23 6 -43 -7t-25 -36q0 -1 -1.5 -5.5l-2.5 -7.5q-18 -30 -48 -48q-50 -30 -131 -30q-50 0 -89 17q-64 27 -91 95q-18 44 -18 104v344q0 24 3 48q6 61 48 111q47 56 147 56q83 0 131 -29q32 -19 48 -48q1 -3 2.5 -8.5t1.5 -6.5q6 -22 25 -32.5 t43 -5.5q23 5 35.5 24.5t6.5 42.5v1l-9 25q-8 18 -29.5 46t-48.5 47q-33 24 -87.5 40t-118.5 16q-81 0 -143.5 -28.5t-97.5 -77.5q-69 -95 -69 -221v-344z" />
<glyph unicode="&#xf03d;" horiz-adv-x="2216" d="M0 531q0 -214 149 -367t363 -163q18 0 18 18v143q0 19 -18 19q-137 7 -233.5 109t-96.5 241q0 133 90.5 231.5t224.5 114.5l56 3q21 0 21 18l8 59q16 173 145.5 289.5t305.5 116.5q174 0 305 -116.5t149 -289.5l8 -62q0 -18 18 -18h173q142 0 246.5 -103t104.5 -243 q0 -139 -97 -241t-234 -109q-20 0 -20 -19v-143q0 -18 20 -18q140 4 257.5 76.5t185 192.5t67.5 261q0 144 -71 265t-193 190.5t-266 69.5h-35q-52 214 -224.5 351t-393.5 137q-226 0 -401 -140t-225 -359q-176 -41 -291.5 -185.5t-115.5 -328.5zM743 368q0 -38 26 -64 l276 -278q20 -25 61 -25q45 0 65 25l277 278q26 28 26 64q0 37 -26 62t-64 25t-66 -25l-120 -118v425q0 38 -27 63t-65 25t-63 -25t-25 -63v-425l-117 118q-28 25 -67 25q-40 0 -65.5 -24.5t-25.5 -62.5z" />
<glyph unicode="&#xf03e;" horiz-adv-x="2212" d="M0 527q0 -105 40 -200.5t108.5 -165t163 -112.5t199.5 -48q18 0 18 18v142q0 20 -18 20q-139 10 -234 110t-95 236q0 134 90.5 233.5t223.5 110.5l56 8q21 0 21 18l8 55q11 114 73.5 207.5t162 146t214.5 52.5q175 0 305.5 -115t148.5 -288l6 -61q0 -19 20 -19h172 q144 0 247 -103t103 -245q0 -136 -95 -236t-234 -110q-21 0 -21 -20v-142q0 -18 21 -18q214 10 361.5 161.5t147.5 364.5q0 143 -71.5 264.5t-193.5 192.5t-265 71h-34q-53 213 -225.5 350t-392.5 137q-225 0 -400 -141.5t-225 -360.5q-177 -42 -291.5 -185.5t-114.5 -327.5 zM664 392q0 -119 59.5 -220.5t161 -161.5t219.5 -60q184 0 315 130.5t131 311.5q0 37 -27 64t-65 27t-65.5 -27t-27.5 -64q0 -107 -76.5 -184t-184.5 -77q-106 0 -182.5 77t-76.5 184q0 96 57 171t140 82l-44 -42q-24 -24 -24 -61q0 -40 24 -70q22 -24 56.5 -25t74.5 25 l194 199q27 27 27 62q0 40 -27 65l-194 195q-30 28 -66 28q-37 0 -63 -27t-26 -65t24 -62l37 -38q-160 -27 -265.5 -149t-105.5 -288z" />
<glyph unicode="&#xf040;" horiz-adv-x="2211" d="M0 530q0 -213 148.5 -366t362.5 -163q18 0 18 18v142q0 20 -18 20q-137 7 -233 108.5t-96 240.5q0 132 90 230t224 114h56q21 0 21 19l6 61q17 173 147 290t305 117q173 0 303.5 -117t148.5 -290l8 -61q0 -19 19 -19h172q142 0 246 -102.5t104 -241.5q0 -138 -96.5 -240 t-232.5 -109q-21 0 -21 -20v-142q0 -18 21 -18q139 4 256 76t184.5 192.5t67.5 260.5q0 107 -42 204t-113 167t-169 111.5t-205 41.5h-34q-53 214 -225 350.5t-392 136.5q-226 0 -401 -140.5t-224 -358.5q-177 -41 -291.5 -184.5t-114.5 -327.5zM741 463q0 -40 26 -68 q24 -24 65 -24q39 0 66 24l118 122v-424q0 -38 25 -65t63 -27q37 0 64 27t27 65v420l120 -118q64 -49 130 0q26 24 26 66q0 38 -26 66l-276 274q-26 26 -64 26q-39 0 -63 -26l-275 -274q-26 -26 -26 -64z" />
<glyph unicode="&#xf041;" horiz-adv-x="2216" d="M0 530q0 184 115 328t292 185q50 219 225 359.5t401 140.5q221 0 393.5 -137t224.5 -351h35q144 0 266 -69.5t193 -190.5t71 -265q0 -141 -67.5 -261t-185 -192.5t-257.5 -76.5h-1194q-214 10 -363 163t-149 367zM182 530q0 -139 96.5 -241.5t233.5 -109.5h1194 q137 7 234 109.5t97 241.5q0 140 -104 242.5t-247 102.5h-173q-18 0 -18 19l-8 61q-18 173 -149 290t-305 117q-175 0 -304.5 -117t-146.5 -290l-8 -61q0 -19 -21 -19h-56q-134 -16 -224.5 -114t-90.5 -231z" />
<glyph unicode="&#xf042;" horiz-adv-x="386" d="M0 1349q0 80 57 137t137 57q79 0 135.5 -57t56.5 -137t-56.5 -137.5t-135.5 -57.5t-136.5 57.5t-57.5 137.5zM94 1349q0 -42 29 -71q30 -30 71 -30t71 30t30 71t-30 70.5t-71 29.5q-42 0 -71 -29t-29 -71z" />
<glyph unicode="&#xf043;" horiz-adv-x="677" d="M0 542q0 -31 20.5 -51.5t50.5 -20.5h306q30 0 50.5 20.5t20.5 51.5q0 30 -20.5 49.5t-50.5 19.5h-132l414 414q19 22 19 53q0 29 -19 49q-20 19 -53 19q-32 0 -51 -19l-412 -413v133q0 31 -20.5 51.5t-51.5 20.5q-30 0 -50.5 -21t-20.5 -51v-305z" />
<glyph unicode="&#xf044;" horiz-adv-x="690" d="M0 574q0 -35 27 -59l256 -261q25 -25 62 -25q38 0 63 25l256 261q26 23 26 59t-24 60.5t-60 24.5t-61 -25l-113 -112v703q0 36 -25.5 60t-61.5 24t-61.5 -24t-25.5 -60v-703l-113 112q-25 25 -59 25q-36 0 -61 -24.5t-25 -60.5z" />
<glyph unicode="&#xf045;" horiz-adv-x="1138" d="M0 1157q0 80 57 137t137 57q79 0 135.5 -57t56.5 -137t-56.5 -137.5t-135.5 -57.5t-136.5 57.5t-57.5 137.5zM94 1157q0 -42 29 -71q30 -30 71 -30t71 30t30 71t-30 70.5t-71 29.5q-42 0 -71 -29t-29 -71zM565 422q0 -23 16.5 -39.5t39.5 -16.5t39.5 16.5t16.5 39.5v404 h305q23 0 39.5 17t16.5 40q0 24 -16 40t-40 16h-305v291h408q23 0 38 16t15 40t-15 40t-38 16h-509q-11 0 -11 -12v-908z" />
<glyph unicode="&#xf046;" horiz-adv-x="2324" d="M0 635q0 42 29 66q23 24 66 24h222q39 0 64.5 -25.5t25.5 -64.5q0 -38 -26 -65t-64 -27h-222q-39 0 -67 27t-28 65zM99 93q0 37 28 65q26 25 65 25h1942q39 0 66 -26t27 -64t-27.5 -65.5t-65.5 -27.5h-1942q-38 0 -65.5 27.5t-27.5 65.5zM317 1391q0 41 25 63 q27 29 66 29q38 0 65 -29l154 -156q28 -26 28 -64q0 -40 -25.5 -65.5t-64.5 -25.5q-35 0 -64 26l-159 157q-25 22 -25 65zM594 635q0 -139 57 -249q5 -15 26 -15h178q12 0 14.5 6.5t-7.5 17.5q-85 104 -85 240q0 159 114 271t272 112q159 0 271.5 -112t112.5 -271 q0 -137 -85 -240q-6 -10 -6 -13q-1 -5 3 -8t11 -3h181q14 0 22 15q60 113 60 249q0 153 -77 284.5t-208.5 208.5t-284.5 77t-284.5 -77t-208 -208.5t-76.5 -284.5zM1071 1481v223q0 38 27 66t65 28t66 -28t28 -66v-223q0 -38 -28 -66t-66 -28t-65 28t-27 66zM1671 1234 q0 39 26 64l154 156q27 29 66 29q40 0 66.5 -26.5t26.5 -65.5q0 -41 -24 -65l-161 -157q-26 -24 -63 -24q-40 -1 -65.5 24t-25.5 65zM1919 635q0 43 26 66q23 24 63 24h223q39 0 66.5 -25.5t27.5 -64.5q0 -38 -28 -65t-66 -27h-223q-37 0 -63 27t-26 65z" />
<glyph unicode="&#xf047;" horiz-adv-x="2148" d="M0 94q0 42 30 66q22 25 67 25h1956q40 0 68 -26t28 -65q0 -38 -28.5 -66.5t-67.5 -28.5h-1956q-40 0 -68.5 28.5t-28.5 66.5zM210 978q0 42 25 67q27 28 69 28q37 0 64 -28l160 -160q29 -29 29 -67q0 -37 -29 -66q-24 -29 -64.5 -28.5t-68.5 28.5l-160 160q-25 24 -25 66 zM523 382q-7 -25 16 -25h159q11 0 24 18q48 102 142 162t209 60q116 0 212 -60t144 -162q13 -18 24 -18h158q20 0 16 25q-54 181 -207.5 294t-346.5 113q-192 0 -344 -113t-206 -294zM982 1071v228q0 40 26 68t65 28q40 0 67 -27.5t27 -68.5v-228q0 -41 -27 -68t-67 -27 q-39 0 -65 27.5t-26 67.5zM1592 818q0 38 27 67l164 160q25 28 66 28q39 0 64 -27t25 -68q0 -42 -25 -66l-158 -160q-27 -27 -60 -30q-36 -4 -69.5 26t-33.5 70z" />
<glyph unicode="&#xf048;" horiz-adv-x="1080" d="M0 734q0 -38 25 -63l262 -256q23 -26 58 -26q36 0 61 24t25 60t-25 61l-112 112h703q36 0 59.5 25.5t23.5 61.5t-23.5 61.5t-59.5 26.5h-703l112 113q25 25 25 59q0 36 -25 61t-61 25q-33 0 -58 -28l-262 -256q-25 -25 -25 -61z" />
<glyph unicode="&#xf049;" horiz-adv-x="1120" d="M40 1090q-61 129 18 243q56 79 169 97l20 3h23q155 -5 227 -139q35 -62 17 -140q-12 -61 -45 -112q-65 -104 -143 -175q-4 -5 -12 -9q-44 -35 -91 -3q-18 12 -26 20q-106 110 -157 215zM45 1169q1 -10 5 -30q15 -68 62.5 -105t116.5 -43q16 -2 18.5 0.5t2.5 19.5l-3 27 q-13 72 -69 105q-11 7 -90 40q-12 4 -29 4t-14 -18zM286 1013q-1 -17 3 -20t20 -2q14 2 42 8q56 13 94 60q29 35 44 110q2 11 -1.5 15t-14.5 3q-32 -3 -58 -13q-121 -45 -129 -161zM314 427q-60 128 19 243q56 79 169 97l19 3h23q155 -5 227 -139q35 -63 18 -140 q-12 -59 -46 -112q-63 -102 -143 -174q-8 -8 -11 -10q-45 -35 -92 -3q-15 10 -26 21q-107 111 -157 214zM319 506q1 -6 3.5 -16.5t2.5 -12.5q15 -68 62 -105.5t116 -43.5q16 -1 19 1.5t3 19.5l-4 26q-13 72 -68 105q-9 6 -91 40q-15 5 -28 5q-18 0 -15 -19zM560 350 q-1 -17 3 -20t20 -2q14 2 42 8q55 13 94 61q29 36 44 109q2 11 -1.5 15.5t-14.5 3.5q-28 -3 -58 -14q-121 -45 -129 -161zM634 1090q-60 128 19 243q56 79 169 97l19 3h23q155 -5 227 -139q35 -63 18 -140q-12 -59 -46 -112q-65 -104 -143 -175q-6 -6 -11 -9q-45 -35 -92 -3 q-18 12 -26 20q-106 110 -157 215zM639 1169l6 -30q15 -68 62 -105t116 -43q16 -2 19 1t3 19l-4 27q-13 72 -68 105q-9 6 -91 40q-12 4 -28 4q-18 0 -15 -18zM880 1013q-1 -17 3 -20t20 -2q14 2 42 8q56 13 94 60q29 35 44 110q2 11 -1.5 15t-14.5 3q-32 -3 -58 -13 q-121 -45 -129 -161z" />
<glyph unicode="&#xf04a;" horiz-adv-x="2632" d="M0 99q0 -36 27 -61t66 -25h1985q38 0 64.5 25t26.5 61q0 39 -26 65.5t-65 26.5h-1985q-38 0 -65.5 -27t-27.5 -65zM278 431q0 -38 28 -63q22 -29 63 -29h1985q37 0 62 27t25 65q0 37 -25 62t-62 25h-1985q-38 0 -64.5 -25t-26.5 -62zM294 689v5q-7 -24 13 -24h154 q9 0 20 16q38 83 113.5 136t165.5 60l57 8q20 0 20 19l6 53q17 172 145.5 287.5t302.5 115.5q172 0 301 -114t147 -285l7 -61q0 -19 22 -19h169q103 0 187 -55t125 -145q11 -16 23 -16h151q19 0 16 24q-35 89 -49 113q116 104 160 274l18 70q4 10 -1.5 17t-12.5 7l-66 23 q-143 41 -217.5 169t-39.5 273l14 62q8 15 -14 25l-90 25q-175 43 -343 -28t-263 -226q-127 49 -244 49q-222 0 -395.5 -140t-223.5 -357q-135 -32 -236.5 -129t-141.5 -232zM463 -226q0 -38 28 -63q27 -29 63 -29h1989q37 0 63 27t26 65q0 37 -26 62t-63 25h-1989 q-38 0 -64.5 -25t-26.5 -62zM1690 1403q56 92 150.5 142t199.5 40q-11 -167 75 -312.5t237 -215.5q-24 -56 -80 -114q-147 121 -335 121h-34q-51 210 -213 339z" />
<glyph unicode="&#xf04b;" horiz-adv-x="686" d="M0 741q0 -126 61 -232t167.5 -167.5t232.5 -61.5q30 0 51.5 23t21.5 54t-21 51.5t-52 20.5q-130 0 -220.5 91t-90.5 221q0 124 85 216t200 92l-35 -34q-24 -24 -22 -52q0 -29 21 -51.5t52 -22.5q32 0 54 22l161 160q21 17 21 54q0 35 -21 50l-161 163q-21 22 -52 22 t-53.5 -22t-22.5 -53q0 -33 23 -54l32 -30q-184 -13 -308 -144.5t-124 -315.5z" />
<glyph unicode="&#xf04c;" horiz-adv-x="1115" d="M0 674q0 -151 75.5 -279.5t204 -203t278.5 -74.5q153 0 281 74t202 202t74 281q0 38 -25.5 65t-62.5 27t-64 -27t-27 -65q0 -157 -110.5 -267.5t-267.5 -110.5q-155 0 -264 110.5t-109 267.5q0 136 84.5 246.5t196.5 117.5l-41 -39q-26 -28 -26 -62q0 -36 26 -64 q58 -56 129 0l196 194q26 20 26 66q0 41 -26 61l-196 198q-28 26 -61 26q-40 0 -67 -26.5t-27 -64.5q0 -39 26 -65l41 -38q-200 -35 -333 -191.5t-133 -358.5z" />
<glyph unicode="&#xf04d;" horiz-adv-x="1081" d="M1 799q0 -36 24.5 -61t59.5 -21h702l-110 -115q-26 -26 -26 -59q0 -36 25.5 -61t61.5 -25q34 1 57 29l261 257q25 25 25 62q-1 38 -26 62l-263 255q-24 26 -58 25q-36 0 -61 -24t-25 -60t25 -61l113 -115h-703q-36 -1 -59.5 -26.5t-22.5 -61.5z" />
<glyph unicode="&#xf04e;" horiz-adv-x="851" d="M0 1027q0 41 40.5 108t77.5 111q10 12 25 29.5t17 19.5l39 -46q44 -49 81 -114t37 -108q0 -66 -45.5 -113t-111.5 -47t-113 47t-47 113zM333 584q0 46 26 107.5t64 113.5q73 98 140 163q7 5 28 26l27 -26q62 -59 141 -162q41 -55 66.5 -115t25.5 -107q0 -110 -75 -184.5 t-185 -74.5q-108 0 -183 76t-75 183zM495 1320q0 69 107 181l27 -30q30 -35 54 -78.5t24 -72.5q0 -44 -30.5 -73.5t-74.5 -29.5q-46 0 -76.5 29.5t-30.5 73.5z" />
<glyph unicode="&#xf050;" horiz-adv-x="2539" d="M0 521q0 -39 30 -66q26 -30 67 -30h1567q46 0 78 -32t32 -79q0 -46 -31.5 -76.5t-78.5 -30.5t-78 31q-26 28 -64 28q-40 0 -68.5 -27.5t-28.5 -65.5q0 -40 30 -67q90 -88 209 -88q125 0 214 86t89 210t-89.5 213.5t-213.5 89.5h-1567q-40 0 -68.5 -28t-28.5 -68zM0 871 q0 -37 30 -65q28 -28 67 -28h2138q125 0 214.5 87t89.5 210q0 124 -89.5 212t-214.5 88q-123 0 -208 -85q-29 -26 -29 -71q0 -41 27.5 -67t67.5 -26q39 0 67 26q30 33 75 33q46 0 77.5 -32t31.5 -78t-31.5 -77t-77.5 -31h-2138q-40 0 -68.5 -28t-28.5 -68z" />
<glyph unicode="&#xf051;" horiz-adv-x="2613" d="M0 693q0 40 32 74q36 31 75 31h248q43 0 72 -31t29 -74q0 -46 -29 -77t-72 -31h-248q-43 0 -75 32.5t-32 75.5zM355 1544q0 43 28 73q36 31 75 31q42 0 73 -31l175 -176q30 -35 30 -74q0 -45 -29 -75t-70 -30q-39 0 -75 31l-179 173q-28 34 -28 78zM568 104q0 45 31 73 q28 28 73 28h281l332 312q16 13 36 0l337 -312h295q43 0 73.5 -29.5t30.5 -71.5q0 -43 -30.5 -74t-73.5 -31h-361q-16 0 -31 8l-257 242l-255 -242q-13 -8 -30 -8h-347q-43 0 -73.5 31t-30.5 74zM667 693q0 -155 66 -282q4 -19 27 -19h201q12 0 16 9t-2 20 q-102 123 -102 272q0 180 128 306t308 126q179 0 305.5 -126t126.5 -306q0 -150 -101 -272q-7 -11 -3.5 -20t16.5 -9h203q21 0 25 19q66 123 66 282q0 130 -51 248t-136.5 203.5t-203.5 136t-247 50.5q-130 0 -248.5 -50.5t-205 -136t-137.5 -203.5t-51 -248zM1203 1648v245 q0 46 30 75.5t76 29.5q45 0 74.5 -30t29.5 -75v-245q0 -46 -29.5 -75.5t-74.5 -29.5q-46 0 -76 29.5t-30 75.5zM1880 1367q0 40 29 74l173 176q31 31 75 31t74 -30.5t30 -73.5q0 -46 -28 -78l-180 -173q-34 -31 -75 -31q-43 0 -70.5 29.5t-27.5 75.5zM2159 693q0 43 28.5 74 t70.5 31h251q43 0 74 -31t31 -74q0 -44 -31 -76t-74 -32h-251q-43 0 -71 31t-28 77z" />
<glyph unicode="&#xf052;" horiz-adv-x="2585" d="M0 681q0 44 32 72q28 28 73 28h246q43 0 71 -28.5t28 -71.5q0 -45 -28.5 -75.5t-70.5 -30.5h-246q-43 0 -74 31.5t-31 74.5zM351 1519q0 45 27 72q32 32 75 32q46 0 72 -32l173 -174q74 -70 0 -144q-30 -30 -69 -30q-35 0 -72 30l-179 174q-27 29 -27 72zM561 103 q0 42 32 74q29 29 72 29h343q17 0 30 -8l251 -237l255 237q11 8 31 8h352q43 0 73.5 -30t30.5 -73t-30.5 -73.5t-73.5 -30.5h-286l-335 -303q-20 -14 -35 0l-329 303h-277q-43 0 -73.5 30.5t-30.5 73.5zM661 681q0 -159 62 -280q9 -17 29 -17h199q13 0 16 8t-8 19 q-95 119 -95 270q0 176 126 299.5t304 123.5q176 0 301.5 -124t125.5 -299q0 -151 -95 -270q-11 -11 -8 -19t16 -8h201q21 0 26 17q66 125 66 280q0 127 -50.5 244.5t-135.5 202.5t-202 135.5t-245 50.5t-245 -50.5t-202 -135.5t-135.5 -202.5t-50.5 -244.5zM1190 1621v248 q0 43 30.5 73.5t73.5 30.5t73.5 -30.5t30.5 -73.5v-248q0 -43 -30.5 -73.5t-73.5 -30.5t-73.5 30.5t-30.5 73.5zM1859 1345q0 45 28 72l174 174q26 32 72 32q44 0 73 -30.5t29 -73.5q0 -45 -27 -72l-177 -174q-37 -30 -74 -30q-42 0 -70 29.5t-28 72.5zM2135 681 q0 43 28 71.5t71 28.5h247q43 0 73.5 -29t30.5 -71q0 -43 -30.5 -74.5t-73.5 -31.5h-247q-42 0 -70.5 30.5t-28.5 75.5z" />
<glyph unicode="&#xf053;" horiz-adv-x="1085" d="M0 245q0 136 63 253.5t176 196.5v1058q0 128 88 217t216 89q129 0 217.5 -89t88.5 -217v-1058q113 -79 175 -196.5t62 -253.5q0 -148 -72.5 -273t-197.5 -197.5t-273 -72.5q-147 0 -272 72.5t-198 197.5t-73 273zM187 245q0 -149 104.5 -254.5t251.5 -105.5 q149 0 256.5 107t107.5 253q0 100 -51.5 184.5t-140.5 131.5l-30 15q-16 7 -16 31v1146q0 52 -36 86t-90 34q-52 0 -88.5 -34t-36.5 -86v-1146q0 -24 -15 -31l-29 -15q-88 -47 -137.5 -131t-49.5 -185z" />
<glyph unicode="&#xf054;" horiz-adv-x="538" d="M0 245q0 -114 78 -194t188 -80t191 80.5t81 193.5q0 101 -69 178t-168 91v783q0 10 -11 20.5t-24 10.5q-14 0 -22.5 -9t-8.5 -22v-783q-98 -14 -166.5 -91t-68.5 -178z" />
<glyph unicode="&#xf055;" horiz-adv-x="1085" d="M0 245q0 136 63 253.5t176 196.5v1058q0 128 88 217t216 89q129 0 217.5 -89t88.5 -217v-1058q113 -79 175 -196.5t62 -253.5q0 -148 -72.5 -273t-197.5 -197.5t-273 -72.5q-147 0 -272 72.5t-198 197.5t-73 273zM187 245q0 -149 104.5 -254.5t251.5 -105.5 q149 0 256.5 107t107.5 253q0 100 -51.5 184.5t-140.5 131.5l-30 15q-16 7 -16 31v1146q0 52 -36 86t-90 34q-52 0 -88.5 -34t-36.5 -86v-1146q0 -24 -15 -31l-29 -15q-88 -47 -137.5 -131t-49.5 -185zM270 245q0 -114 78 -194t188 -80t191 80.5t81 193.5q0 101 -69.5 178 t-168.5 91v783q0 10 -10.5 20.5t-23.5 10.5q-14 0 -22.5 -9t-8.5 -22v-783q-98 -14 -166.5 -91t-68.5 -178z" />
<glyph unicode="&#xf056;" horiz-adv-x="1484" d="M0 718q0 -71 74 -121q135 -95 408 -95q123 0 228 21q111 24 181 75t70 120q0 21 -8 42q142 35 223 94.5t81 136.5q0 19 -6 41q234 83 234 224q0 90 -102 160q-200 133 -586 133q-182 0 -330 -32q-159 -32 -257.5 -102t-98.5 -159q0 -53 33 -97q-121 -69 -121 -168 q0 -77 75 -135q-98 -57 -98 -138zM41 411q0 -75 92.5 -117.5t232.5 -42.5q142 0 235 42.5t93 117.5q0 28 -18 47t-46 19q-23 0 -41 -16t-23 -39q-20 -16 -75 -29.5t-125 -13.5q-113 0 -183 32q16 16 17.5 41t-10.5 42q-16 22 -41.5 27t-47.5 -9q-60 -40 -60 -101zM128 718 q0 1 13 12q9 9 38.5 23t65.5 24l8 4q166 -55 387 -55q97 0 176 11l18 -16q-9 -16 -43 -34q-41 -22 -127 -39t-182 -17t-182.5 17t-128.5 39q-34 15 -43 31zM136 143q0 -65 73.5 -100t182.5 -35q111 0 186 35t75 100q0 26 -19 46t-45 20q-48 0 -63 -49q-40 -25 -134 -25 q-82 0 -131 25q-15 49 -63 49q-26 0 -44 -19t-18 -47zM150 991q0 8 10 19q25 31 97 60q197 -105 540 -105q175 0 329 32v-6q0 -15 -19 -31q-42 -37 -156 -70q-124 -37 -311 -37q-188 0 -312 37q-119 33 -159 70q-19 15 -19 31zM239 1256q0 18 24 40q46 43 183 83 q146 43 351 43q206 0 354 -43q138 -40 183 -83q23 -23 23 -40t-23 -38q-45 -43 -183 -84q-148 -43 -354 -43q-205 0 -351 43q-138 40 -183 84q-24 21 -24 38z" />
<glyph unicode="&#xf057;" horiz-adv-x="676" d="M0 557q0 -31 18 -50q20 -19 54 -19q31 0 50 19l412 413v-133q0 -31 20.5 -51.5t51.5 -20.5q30 0 50.5 21t20.5 51v306q0 31 -20.5 51.5t-50.5 20.5h-307q-30 0 -50 -20.5t-20 -51.5q0 -30 20 -50t50 -20h133l-414 -414q-18 -21 -18 -52z" />
<glyph unicode="&#xf058;" horiz-adv-x="691" d="M1 1013q-1 -36 23.5 -61.5t60.5 -24.5q35 -2 60 25l113 112v-703q-1 -36 24.5 -60t62.5 -23q35 -2 61 22t27 60v703l112 -112q24 -25 60 -25q37 0 61.5 24.5t24.5 60.5q-2 37 -27 58l-255 262q-25 24 -63 27q-38 -2 -63 -28l-256 -260q-26 -22 -26 -57z" />
<glyph unicode="&#xf059;" horiz-adv-x="1533" d="M0 769q0 156 60.5 298.5t163 244.5t244 163t297.5 61q157 0 299 -61t245 -163.5t164 -244.5t61 -297q0 -156 -61 -298.5t-164 -245.5t-245 -163.5t-298 -60.5q-155 0 -297 60.5t-244.5 163t-163.5 244.5t-61 299zM168 769q0 -162 80.5 -299.5t218.5 -217t299 -79.5 q121 0 232 47.5t191.5 127.5t128 190.5t47.5 231.5q0 244 -178 422q-178 176 -422 176q-121 0 -231.5 -48t-190.5 -128t-127.5 -191t-47.5 -232zM491 521l90 239q5 10 0 21l-90 235q-5 10 1 16t17 1l598 -252q11 -2 11 -11q0 -8 -11 -10l-598 -257q-11 -4 -17 1.5t-1 16.5z " />
<glyph unicode="&#xf05a;" horiz-adv-x="1533" d="M0 769q0 156 60.5 298.5t163 244.5t244 163t297.5 61q157 0 299 -61t245 -163.5t164 -244.5t61 -297q0 -156 -61 -298.5t-164 -245.5t-245 -163.5t-298 -60.5q-155 0 -297 60.5t-244.5 163t-163.5 244.5t-61 299zM168 769q0 -162 80.5 -299.5t218.5 -217t299 -79.5 q121 0 232 47.5t191.5 127.5t128 190.5t47.5 231.5q0 244 -178 422q-178 176 -422 176q-121 0 -231.5 -48t-190.5 -128t-127.5 -191t-47.5 -232zM435 761q0 7 12 10l604 250q11 2 16.5 -3.5t1.5 -16.5l-248 -604q-2 -11 -11 -11q-11 0 -16 11l-103 230q-9 14 -14 15 l-230 104q-12 5 -12 15z" />
<glyph unicode="&#xf05b;" horiz-adv-x="1533" d="M0 769q0 156 60.5 298.5t163 244.5t244 163t297.5 61q157 0 299 -61t245 -163.5t164 -244.5t61 -297q0 -156 -61 -298.5t-164 -245.5t-245 -163.5t-298 -60.5q-155 0 -297 60.5t-244.5 163t-163.5 244.5t-61 299zM168 769q0 -162 80.5 -299.5t218.5 -217t299 -79.5 q121 0 232 47.5t191.5 127.5t128 190.5t47.5 231.5q0 244 -178 422q-178 176 -422 176q-121 0 -231.5 -48t-190.5 -128t-127.5 -191t-47.5 -232zM518 998q-2 11 3.5 17t15.5 2l602 -249q12 -2 12 -10q0 -9 -12 -14l-229 -104q-10 -4 -15 -15l-104 -230q-5 -11 -14 -11 q-8 0 -10 11z" />
<glyph unicode="&#xf05c;" d="M0 765q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 765q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM503 507l256 600q2 11 10 11t10 -11l255 -600q4 -11 -1.5 -17t-16.5 0l-237 89q-10 4 -20 0l-239 -89q-10 -6 -16 0t-1 17z" />
<glyph unicode="&#xf05d;" d="M0 769q0 156 60.5 298.5t163 244.5t244 163t297.5 61q157 0 299 -61t245 -163.5t164 -244.5t61 -297q0 -156 -61 -298.5t-164 -245.5t-245 -163.5t-298 -60.5q-155 0 -297 60.5t-244.5 163t-163.5 244.5t-61 299zM168 769q0 -162 80.5 -299.5t218.5 -217t299 -79.5 q121 0 232 47.5t191.5 127.5t128 190.5t47.5 231.5q0 244 -178 422q-178 176 -422 176q-121 0 -231.5 -48t-190.5 -128t-127.5 -191t-47.5 -232zM375 777q0 10 10 14l231 104q10 5 15 15l103 229q9 12 16 12q8 0 11 -12l248 -605q2 -11 -2 -15t-16 -2l-606 248q-10 3 -10 12 z" />
<glyph unicode="&#xf05e;" horiz-adv-x="1533" d="M0 769q0 156 60.5 298.5t163 244.5t244 163t297.5 61q157 0 299 -61t245 -163.5t164 -244.5t61 -297q0 -156 -61 -298.5t-164 -245.5t-245 -163.5t-298 -60.5q-155 0 -297 60.5t-244.5 163t-163.5 244.5t-61 299zM168 769q0 -162 80.5 -299.5t218.5 -217t299 -79.5 q121 0 232 47.5t191.5 127.5t128 190.5t47.5 231.5q0 244 -178 422q-178 176 -422 176q-121 0 -231.5 -48t-190.5 -128t-127.5 -191t-47.5 -232zM525 536l250 605q1 10 10 10q10 0 14 -10l104 -231q2 -9 16 -14l230 -104q11 -4 11 -14q0 -9 -11 -12l-605 -248q-10 -4 -15 1 t-4 17z" />
<glyph unicode="&#xf060;" horiz-adv-x="1538" d="M0 766q0 156 61.5 298.5t164.5 245.5t245 163.5t298 60.5t298.5 -60.5t245.5 -163.5t164 -245t61 -299t-61 -299t-164 -244.5t-245.5 -163t-298.5 -60.5t-298.5 61t-245.5 164t-164 245t-61 297zM170 766q0 -245 177 -422q176 -176 422 -176q163 0 301.5 80.5t219 218 t80.5 299.5q0 121 -47.5 232t-128.5 191.5t-192 128t-233 47.5q-121 0 -231.5 -47.5t-191 -128t-128.5 -191.5t-48 -232zM504 1025q-5 11 1 16.5t16 0.5l238 -89q10 -4 23 0l235 89q10 5 16 -0.5t2 -16.5l-253 -599q-3 -10 -13 -10q-7 0 -10 10z" />
<glyph unicode="&#xf061;" horiz-adv-x="1541" d="M0 769q0 157 61.5 300t165 246.5t246 164.5t298.5 61t299 -61t246 -164.5t164.5 -246.5t61.5 -300t-61.5 -300t-165 -245.5t-246 -163.5t-298.5 -61q-157 0 -300 61t-246 164.5t-164 246t-61 298.5zM170 769q0 -245 179 -424q177 -177 422 -177q163 0 302 81t220 219.5 t81 300.5t-81 300.5t-220 219.5t-302 81q-162 0 -300.5 -81t-219.5 -219.5t-81 -300.5zM418 769q0 9 12 10l601 258q11 5 16.5 -1.5t0.5 -16.5l-89 -240q-7 -10 0 -20l89 -238q5 -10 -0.5 -16t-16.5 -1l-601 255q-12 1 -12 10z" />
<glyph unicode="&#xf062;" horiz-adv-x="1816" d="M0 1000q0 150 94.5 268.5t239.5 150.5q41 180 184.5 295t328.5 115q180 0 322 -112.5t184 -286.5h29q180 0 307 -125.5t127 -304.5q0 -96 -39.5 -181.5t-109.5 -146.5v-3q0 -95 -59.5 -169.5t-149.5 -94.5q-23 -100 -97 -169t-174 -85q46 -55 46 -121q0 -77 -54.5 -132 t-131.5 -55t-131.5 55t-54.5 132q0 31 11 61h-11q-93 0 -160 67t-67 160q0 64 32 114q-83 46 -120 133h-125h-2h-9v1q-172 11 -291 136t-119 298zM149 1026q0 -128 90 -218t217 -90q79 0 146 36q19 -119 111 -198t216 -79q139 0 237 98q66 -76 164 -76q91 0 155.5 64.5 t64.5 155.5q64 43 101 110.5t37 146.5q0 127 -91 215.5t-219 88.5q-89 0 -163 -47q9 39 9 84q0 154 -110 262t-266 108q-150 0 -259 -104t-114 -253q-3 0 -9 0.5t-10 0.5q-126 0 -216.5 -89.5t-90.5 -215.5z" />
<glyph unicode="&#xf063;" horiz-adv-x="1636" d="M0 562q0 36 25 59.5t68 23.5h609q43 0 68 -23.5t25 -59.5q0 -44 -24.5 -68.5t-68.5 -24.5h-609q-43 0 -68 24.5t-25 68.5zM0 1193q0 36 25 59t68 23h316q43 0 68.5 -23t25.5 -59q0 -43 -25.5 -68.5t-68.5 -25.5h-316q-43 0 -68 25t-25 69zM105 247q0 35 29.5 64.5 t64.5 29.5q41 0 66.5 -28.5t25.5 -65.5q0 -44 -24.5 -69t-67.5 -25q-37 0 -65.5 26t-28.5 68zM257 879q0 37 23.5 65.5t57.5 28.5q42 0 68 -28.5t26 -65.5q0 -44 -25 -69t-69 -25q-36 0 -58.5 25.5t-22.5 68.5zM362 247q0 37 26 65.5t68 28.5h409l94 -94q0 -42 -28.5 -68 t-65.5 -26h-409q-44 0 -69 25.5t-25 68.5zM503 879q0 35 29.5 64.5t64.5 29.5h409q42 0 67.5 -28.5t25.5 -65.5q0 -44 -25 -69t-68 -25h-409q-37 0 -65.5 26t-28.5 68zM584 1193q0 36 25.5 59t68.5 23h609q36 0 65 -24t29 -58q0 -42 -28.5 -68t-65.5 -26h-609 q-44 0 -69 25.5t-25 68.5zM865 562q0 34 29 58.5t65 24.5t65 -24.5t29 -58.5q0 -42 -28.5 -67.5t-65.5 -25.5t-65.5 25.5t-28.5 67.5zM1029 247q0 37 25.5 65.5t67.5 28.5h199q42 0 67.5 -28t25.5 -66q0 -44 -24.5 -69t-68.5 -25h-199q-43 0 -68 25t-25 69zM1122 562 q0 34 29 58.5t65 24.5h327q35 0 58 -24t23 -59q0 -43 -22.5 -68t-58.5 -25h-327q-37 0 -65.5 25.5t-28.5 67.5zM1169 879q0 35 29.5 64.5t64.5 29.5h209q34 0 58 -29t24 -65q0 -43 -23 -68.5t-59 -25.5h-209q-37 0 -65.5 26t-28.5 68zM1461 1193q0 35 23.5 58.5t58.5 23.5 q43 0 68.5 -23t25.5 -59q0 -43 -25.5 -68.5t-68.5 -25.5q-36 0 -59 25.5t-23 68.5z" />
<glyph unicode="&#xf064;" horiz-adv-x="2211" d="M0 523q0 185 113.5 328.5t292.5 187.5q50 218 224.5 358t400.5 140q220 0 392.5 -136.5t224.5 -350.5h34q143 0 265 -70.5t193 -192t71 -264.5q0 -212 -148 -365t-360 -160q-21 0 -21 18v142q0 19 21 19q136 7 232.5 108.5t96.5 237.5q0 142 -103 245t-247 103h-172 q-19 0 -19 18l-8 62q-18 173 -148.5 290t-303.5 117q-176 0 -305.5 -118t-146.5 -293l-6 -53q0 -20 -21 -20l-56 -7q-133 -11 -223.5 -110.5t-90.5 -233.5q0 -136 96.5 -237.5t232.5 -108.5q18 0 18 -19v-142q0 -18 -18 -18q-214 7 -362.5 160t-148.5 365zM587 -298 q0 37 27 64q26 24 61 24q37 0 62.5 -25t25.5 -63t-25.5 -63t-62.5 -25t-62.5 25t-25.5 63zM679 89q0 36 25.5 62t62.5 26t62.5 -26t25.5 -62q0 -38 -25.5 -64.5t-62.5 -26.5t-62.5 26.5t-25.5 64.5zM882 -507q0 36 27 65q26 26 61 26q38 0 65 -27t27 -64t-27 -62.5 t-65 -25.5q-36 0 -62 25.5t-26 62.5zM974 -117q0 38 26 66q26 26 62 26q37 0 64 -27t27 -65q0 -37 -26.5 -63.5t-64.5 -26.5q-36 0 -62 26.5t-26 63.5zM1019 269q0 37 27 64q28 26 61 26q38 0 65 -26.5t27 -63.5t-27 -62.5t-65 -25.5q-36 0 -62 25.5t-26 62.5zM1272 -298 q0 36 26 64q26 24 64 24t63 -25t25 -63t-25 -63t-63 -25t-64 25.5t-26 62.5zM1363 89q0 35 27 61.5t64 26.5t62.5 -26t25.5 -62q0 -38 -25.5 -64.5t-62.5 -26.5q-38 0 -64.5 27t-26.5 64z" />
<glyph unicode="&#xf065;" horiz-adv-x="2864" d="M0 525q0 -138 68 -257t185.5 -191t256.5 -76q18 0 18 18v142q0 20 -18 20q-136 7 -232.5 108.5t-96.5 235.5q0 132 90.5 230t223.5 114l56 6q19 0 19 20l8 54q17 175 145.5 291.5t303.5 116.5q174 0 304.5 -116.5t147.5 -288.5l8 -62q0 -18 18 -18h172q144 0 246 -102.5 t102 -244.5q0 -134 -96.5 -235.5t-231.5 -108.5q-20 0 -20 -20v-142q0 -18 20 -18q212 7 360 160t148 364q0 121 -46 217q126 151 126 352q0 150 -75 278.5t-204 203.5t-279 75q-246 0 -413 -185q-130 70 -287 70q-225 0 -399 -139.5t-223 -356.5q-179 -44 -292 -187 t-113 -328zM585 -294q0 -33 26 -61q28 -26 62 -26q38 0 63 25t25 62q0 38 -25.5 63t-62.5 25t-62.5 -25t-25.5 -63zM677 93q0 -38 25.5 -65t62.5 -27t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-62.5 -26t-25.5 -62zM879 -502q0 -35 26 -61q27 -27 62 -27q38 0 64.5 25 t26.5 63t-27 64.5t-64 26.5q-35 0 -61.5 -27t-26.5 -64zM895 1832q0 -39 26 -63l70 -70q26 -26 57 -27q33 -5 65 23.5t32 67.5t-26 68l-68 65q-24 27 -62 27q-40 0 -67 -26.5t-27 -64.5zM970 -112q0 -35 27 -64q26 -26 61 -26q38 0 65 26t27 64q0 37 -27 63.5t-65 26.5 q-36 0 -62 -26.5t-26 -63.5zM1016 272q0 -36 26 -62t62 -26q38 0 64.5 25.5t26.5 62.5t-26.5 63t-64.5 26q-36 0 -62 -26t-26 -63zM1269 -294q0 -34 25 -61q28 -26 64 -26q38 0 63 25t25 62q0 38 -25 63t-63 25t-63.5 -25.5t-25.5 -62.5zM1360 93q0 -38 26 -65t63 -27 t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-63 -26t-26 -62zM1464 1365q110 106 263 106q155 0 265 -111t110 -266q0 -100 -54 -196q-153 153 -371 153h-34q-47 187 -179 314zM1635 1921q0 -37 27 -62t65 -25t63 25t25 62v218q0 38 -25.5 65t-62.5 27t-64.5 -27.5 t-27.5 -64.5v-218zM2223 1679q0 -37 27 -63q24 -25 59.5 -27.5t66.5 27.5l153 153q28 28 28 65q0 38 -27.5 65t-64.5 27q-35 0 -62 -27l-153 -156q-27 -25 -27 -64zM2309 421q0 -40 26 -66l68 -67q39 -26 68 -26q33 0 59.5 27.5t26.5 65.5q0 36 -28 62l-66 69q-28 26 -65 26 t-63 -26.5t-26 -64.5zM2463 1094q0 -38 28 -63q27 -29 66 -29h216q37 0 64 27t27 65t-27 64.5t-64 26.5h-216q-38 0 -66 -27t-28 -64z" />
<glyph unicode="&#xf066;" horiz-adv-x="2297" d="M0 529q0 -213 149 -366.5t363 -163.5q19 0 19 18v143q0 18 -19 18q-137 8 -233.5 110t-96.5 241q0 133 90.5 231t224.5 114l56 4q21 0 21 19l8 58q17 173 146.5 290t304.5 117q174 0 305 -117t149 -290l8 -61q0 -20 18 -20h173q145 0 248 -101.5t103 -243.5 q0 -138 -97 -240.5t-234 -110.5q-20 0 -20 -18v-143q0 -18 20 -18q214 7 362.5 161.5t148.5 368.5q0 114 -46 214q126 154 126 354q0 152 -75.5 281.5t-204.5 204.5t-280 75q-248 0 -415 -185q-129 69 -289 69q-226 0 -401 -140.5t-225 -358.5q-177 -42 -292 -185.5 t-115 -328.5zM585 -294q0 -33 26 -61q28 -26 62 -26q38 0 63 25t25 62q0 38 -25.5 63t-62.5 25t-62.5 -25t-25.5 -63zM677 93q0 -38 25.5 -65t62.5 -27t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-62.5 -26t-25.5 -62zM879 -502q0 -35 26 -61q27 -27 62 -27q38 0 64.5 25 t26.5 63t-27 64.5t-64 26.5q-35 0 -61.5 -27t-26.5 -64zM970 -112q0 -35 27 -64q26 -26 61 -26q38 0 65 26t27 64q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM1016 272q0 -36 26 -62t62 -26q38 0 64.5 25.5t26.5 62.5t-26.5 63t-64.5 26q-36 0 -62 -26t-26 -63z M1269 -294q0 -34 25 -61q28 -26 64 -26q38 0 63 25t25 62q0 38 -25 63t-63 25t-63.5 -25.5t-25.5 -62.5zM1360 93q0 -38 26 -65t63 -27t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-63 -26t-26 -62zM1472 1369q108 108 265 108t266.5 -111t109.5 -269q0 -94 -54 -196 q-154 154 -373 154h-33q-47 186 -181 314z" />
<glyph unicode="&#xf067;" horiz-adv-x="2331" d="M0 525q0 -212 149 -366t363 -161q19 0 19 18v143q0 18 -19 18q-136 7 -233 109.5t-97 238.5t90.5 235t224.5 110l57 8q21 0 21 18l7 55q17 175 146.5 293t305.5 118q174 0 305 -117.5t149 -290.5l8 -61q0 -19 18 -19h173q145 0 248.5 -103t103.5 -246q0 -136 -97 -238.5 t-233 -109.5q-22 0 -22 -18v-143q0 -18 22 -18q140 4 257 76t184.5 192t67.5 259q0 146 -69 265q118 106 162 275l18 77q2 2 2 8q0 12 -17 17l-65 18q-70 21 -124.5 61t-86 89.5t-47 101t-15.5 101.5q0 43 11 92l12 66q4 15 -15 24l-85 26q-70 17 -133 17q-59 0 -120 -14 t-126 -44t-126 -85.5t-106 -130.5q-129 53 -254 53q-226 0 -401.5 -140.5t-225.5 -359.5q-180 -45 -293.5 -188t-113.5 -329zM590 -299q0 -36 26 -62t62 -26q38 0 63.5 25t25.5 63t-25.5 63t-63.5 25t-63 -25t-25 -63zM635 89q0 -38 25.5 -64.5t62.5 -26.5q38 0 64 26.5 t26 64.5q0 36 -26 62t-64 26q-37 0 -62.5 -26t-25.5 -62zM886 -510q0 -35 26 -61q27 -27 62 -27q38 0 65 25.5t27 62.5q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM954 -118q0 -38 27 -63q26 -26 61 -26q38 0 65.5 26t27.5 63q0 38 -27.5 65.5t-65.5 27.5 q-35 0 -61.5 -27.5t-26.5 -65.5zM1023 270q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM1277 -299q0 -36 26 -62t64 -26q37 0 62.5 25.5t25.5 62.5q0 38 -25 63t-63 25t-64 -25t-26 -63zM1322 89q0 -37 27 -64 t64 -27t62.5 26.5t25.5 64.5q0 36 -25.5 62t-62.5 26t-64 -26.5t-27 -61.5zM1441 1395q50 87 138.5 134.5t182.5 49.5q24 0 35 -2v-33q0 -155 83.5 -292.5t231.5 -209.5q-25 -58 -81 -114q-142 126 -344 126h-33q-44 197 -213 341z" />
<glyph unicode="&#xf068;" horiz-adv-x="2883" d="M0 530q0 -179 106.5 -320t275.5 -188l-70 -181q-8 -23 15 -23h227l-152 -449h31l465 604q6 7 2 14.5t-15 7.5h-234l266 496q12 23 -15 23h-316q-15 0 -25 -16l-114 -307q-115 29 -190 123.5t-75 215.5q0 135 90 233t225 114l54 3q19 0 24 15l8 63q17 173 146.5 290.5 t305.5 117.5q174 0 305.5 -117.5t149.5 -290.5l8 -63q0 -18 19 -18h172q143 0 246 -102.5t103 -244.5q0 -139 -95.5 -241.5t-232.5 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185.5 193t68 261.5q0 117 -46 215q122 154 122 351q0 152 -75.5 281.5t-205 205 t-281.5 75.5q-115 0 -223.5 -48t-187.5 -133q-129 69 -290 69q-227 0 -402.5 -140.5t-224.5 -359.5q-177 -41 -292.5 -186t-115.5 -330zM841 -560q0 -27 17 -52.5t52 -35.5q14 -3 26 -3q69 0 85 65l14 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-14 -63 q-4 -18 -4 -24zM898 1841q0 -37 27 -64l69 -70q25 -25 59 -28q33 -5 65 24t32 68q0 37 -27 64l-67 70q-26 26 -64 26q-40 0 -67 -26t-27 -64zM925 -250q0 -36 26 -62t62 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM991 -8q-2 -24 14.5 -50t48.5 -32 q37 -10 68 6t44 60l28 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1286 -237q0 -27 16 -51.5t49 -34.5q5 0 15 -2t15 -2q65 0 81 70l15 64q11 34 -7.5 67t-54.5 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -2 -1.5 -12t-1.5 -15z M1365 78q0 -37 26 -61q24 -26 62 -26t63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1475 1369q107 103 261 103q157 0 267.5 -109.5t110.5 -266.5q0 -105 -50 -193q-154 154 -375 154h-33q-47 190 -181 312zM1645 1931q0 -38 26.5 -65t64.5 -27t63.5 26.5t25.5 65.5 v220q0 39 -25.5 65.5t-63.5 26.5t-64.5 -27t-26.5 -65v-220zM2240 1687q0 -39 25 -64q22 -25 58.5 -27.5t67.5 27.5l154 154q28 26 28 64t-28 64q-26 28 -64 28q-37 0 -62 -28l-154 -154q-25 -25 -25 -64zM2323 416q0 -37 27 -64l69 -67q29 -27 66 -27l2 -2q35 0 58 29 q28 26 28 64q0 37 -28 65l-66 66q-29 29 -65 29q-38 0 -64.5 -27.5t-26.5 -65.5zM2479 1096q0 -39 28 -63q25 -28 64 -28h220q38 0 65 26.5t27 64.5t-26.5 63.5t-65.5 25.5h-220q-39 0 -65.5 -25.5t-26.5 -63.5z" />
<glyph unicode="&#xf069;" horiz-adv-x="2883" d="M0 530q0 -179 106.5 -320t275.5 -188l-70 -181q-8 -23 15 -23h227l-152 -449h31l465 604q6 7 2 14.5t-15 7.5h-234l266 496q12 23 -15 23h-316q-15 0 -25 -16l-114 -307q-115 29 -190 123.5t-75 215.5q0 135 90 233t225 114l54 3q19 0 24 15l8 63q17 173 146.5 290.5 t305.5 117.5q174 0 305.5 -117.5t149.5 -290.5l8 -63q0 -18 19 -18h172q143 0 246 -102.5t103 -244.5q0 -139 -95.5 -241.5t-232.5 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185.5 193t68 261.5q0 117 -46 215q122 154 122 351q0 152 -75.5 281.5t-205 205 t-281.5 75.5q-115 0 -223.5 -48t-187.5 -133q-129 69 -290 69q-227 0 -402.5 -140.5t-224.5 -359.5q-177 -41 -292.5 -186t-115.5 -330zM841 -560q0 -27 17 -52.5t52 -35.5q14 -3 26 -3q69 0 85 65l14 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-14 -63 q-4 -18 -4 -24zM925 -250q0 -36 26 -62t62 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM991 -8q-2 -24 14.5 -50t48.5 -32q37 -10 68 6t44 60l28 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1286 -237q0 -27 16 -51.5 t49 -34.5q5 0 15 -2t15 -2q65 0 81 70l15 64q11 34 -7.5 67t-54.5 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -2 -1.5 -12t-1.5 -15zM1365 78q0 -37 26 -61q24 -26 62 -26t63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1475 1369q107 103 261 103 q157 0 267.5 -109.5t110.5 -266.5q0 -105 -50 -193q-154 154 -375 154h-33q-47 190 -181 312z" />
<glyph unicode="&#xf06a;" horiz-adv-x="2328" d="M0 529q0 -177 106 -316.5t275 -190.5l-69 -181q-7 -22 15 -22h226l-138 -446h30l451 600q6 7 2 14.5t-15 7.5h-232l264 495q11 23 -14 23h-316q-14 0 -24 -16l-114 -307q-114 29 -189.5 124.5t-75.5 214.5q0 133 90.5 231t224.5 114l56 8q21 0 21 19l8 54 q17 173 146.5 290t304.5 117q174 0 305 -117.5t149 -289.5l8 -61q0 -20 18 -20h173q145 0 248 -101.5t103 -243.5q0 -136 -96 -236t-235 -110q-20 0 -20 -20v-145q0 -19 20 -19q213 7 361.5 161.5t148.5 368.5q0 139 -70 261q122 118 161 280l20 73q1 1 1 7q0 13 -16 17 l-66 18q-92 27 -156 89.5t-90.5 130t-25.5 134.5q0 44 11 91l12 65q4 16 -15 25l-85 26q-75 15 -132 15q-59 1 -120.5 -12.5t-126.5 -43t-125.5 -84t-105.5 -128.5q-136 49 -254 49q-226 0 -401 -140.5t-225 -358.5q-177 -42 -292 -185.5t-115 -328.5zM841 -560 q0 -27 17 -52.5t52 -35.5q14 -3 26 -3q69 0 85 65l14 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-14 -63q-4 -18 -4 -24zM925 -250q0 -36 26 -62t62 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM991 -8q-2 -24 14.5 -50t48.5 -32q37 -10 68 6t44 60 l28 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1286 -237q0 -27 16 -51.5t49 -34.5q5 0 15 -2t15 -2q65 0 81 70l15 64q11 34 -7.5 67t-54.5 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -2 -1.5 -12t-1.5 -15zM1365 78q0 -37 26 -61 q24 -26 62 -26t63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1440 1395q53 89 143 137.5t188 48.5h23v-34q0 -102 36 -198t108.5 -177t171.5 -129q-27 -60 -81 -110q-146 125 -343 125h-35q-45 201 -211 337z" />
<glyph unicode="&#xf06b;" horiz-adv-x="2883" d="M0 530q0 -179 106.5 -320t275.5 -188l-70 -181q-8 -23 15 -23h227l-152 -449h31l465 604q6 7 2 14.5t-15 7.5h-234l266 496q12 23 -15 23h-316q-15 0 -25 -16l-114 -307q-115 29 -190 123.5t-75 215.5q0 135 90 233t225 114l54 3q19 0 24 15l8 63q17 173 146.5 290.5 t305.5 117.5q174 0 305.5 -117.5t149.5 -290.5l8 -63q0 -18 19 -18h172q143 0 246 -102.5t103 -244.5q0 -139 -95.5 -241.5t-232.5 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185.5 193t68 261.5q0 117 -46 215q122 154 122 351q0 152 -75.5 281.5t-205 205 t-281.5 75.5q-115 0 -223.5 -48t-187.5 -133q-129 69 -290 69q-227 0 -402.5 -140.5t-224.5 -359.5q-177 -41 -292.5 -186t-115.5 -330zM898 1841q0 -37 27 -64l69 -70q25 -25 59 -28q33 -5 65 24t32 68q0 37 -27 64l-67 70q-26 26 -64 26q-40 0 -67 -26t-27 -64zM1023 -118 q0 -39 26 -63q26 -26 62 -26q38 0 65 26t27 63q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1023 270q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM1023 -510q0 -35 26 -61q27 -27 62 -27 q38 0 65 25.5t27 62.5q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1368 89q0 -38 26.5 -64.5t63.5 -26.5t62.5 26.5t25.5 64.5q0 36 -25.5 62t-62.5 26t-63.5 -26t-26.5 -62zM1368 -299q0 -36 26 -62t64 -26t63 25.5t25 62.5q0 38 -25 63t-63 25t-64 -25 t-26 -63zM1475 1369q107 103 261 103q157 0 267.5 -109.5t110.5 -266.5q0 -105 -50 -193q-154 154 -375 154h-33q-47 190 -181 312zM1645 1931q0 -38 26.5 -65t64.5 -27t63.5 26.5t25.5 65.5v220q0 39 -25.5 65.5t-63.5 26.5t-64.5 -27t-26.5 -65v-220zM2240 1687 q0 -39 25 -64q22 -25 58.5 -27.5t67.5 27.5l154 154q28 26 28 64t-28 64q-26 28 -64 28q-37 0 -62 -28l-154 -154q-25 -25 -25 -64zM2323 416q0 -37 27 -64l69 -67q29 -27 66 -27l2 -2q35 0 58 29q28 26 28 64q0 37 -28 65l-66 66q-29 29 -65 29q-38 0 -64.5 -27.5 t-26.5 -65.5zM2479 1096q0 -39 28 -63q25 -28 64 -28h220q38 0 65 26.5t27 64.5t-26.5 63.5t-65.5 25.5h-220q-39 0 -65.5 -25.5t-26.5 -63.5z" />
<glyph unicode="&#xf06c;" horiz-adv-x="2298" d="M0 530q0 -179 106.5 -320t275.5 -188l-70 -181q-8 -23 15 -23h227l-152 -449h31l465 604q6 7 2 14.5t-15 7.5h-234l266 496q12 23 -15 23h-316q-15 0 -25 -16l-114 -307q-115 29 -190 123.5t-75 215.5q0 135 90 233t225 114l54 3q19 0 24 15l8 63q17 173 146.5 290.5 t305.5 117.5q174 0 305.5 -117.5t149.5 -290.5l8 -63q0 -18 19 -18h172q143 0 246 -102.5t103 -244.5q0 -139 -95.5 -241.5t-232.5 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185.5 193t68 261.5q0 117 -46 215q122 154 122 351q0 152 -75.5 281.5t-205 205 t-281.5 75.5q-115 0 -223.5 -48t-187.5 -133q-129 69 -290 69q-227 0 -402.5 -140.5t-224.5 -359.5q-177 -41 -292.5 -186t-115.5 -330zM1023 -118q0 -39 26 -63q26 -26 62 -26q38 0 65 26t27 63q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1023 270 q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM1023 -510q0 -35 26 -61q27 -27 62 -27q38 0 65 25.5t27 62.5q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1368 89q0 -38 26.5 -64.5t63.5 -26.5 t62.5 26.5t25.5 64.5q0 36 -25.5 62t-62.5 26t-63.5 -26t-26.5 -62zM1368 -299q0 -36 26 -62t64 -26t63 25.5t25 62.5q0 38 -25 63t-63 25t-64 -25t-26 -63zM1475 1369q107 103 261 103q157 0 267.5 -109.5t110.5 -266.5q0 -105 -50 -193q-154 154 -375 154h-33 q-47 190 -181 312z" />
<glyph unicode="&#xf06d;" horiz-adv-x="2328" d="M0 529q0 -177 106 -316.5t275 -190.5l-69 -181q-7 -22 15 -22h226l-138 -446h30l451 600q6 7 2 14.5t-15 7.5h-232l264 495q11 23 -14 23h-316q-14 0 -24 -16l-114 -307q-114 29 -189.5 124.5t-75.5 214.5q0 133 90.5 231t224.5 114l56 8q21 0 21 19l8 54 q17 173 146.5 290t304.5 117q174 0 305 -117.5t149 -289.5l8 -61q0 -20 18 -20h173q145 0 248 -101.5t103 -243.5q0 -136 -96 -236t-235 -110q-20 0 -20 -20v-145q0 -19 20 -19q213 7 361.5 161.5t148.5 368.5q0 139 -70 261q122 118 161 280l20 73q1 1 1 7q0 13 -16 17 l-66 18q-92 27 -156 89.5t-90.5 130t-25.5 134.5q0 44 11 91l12 65q4 16 -15 25l-85 26q-75 15 -132 15q-59 1 -120.5 -12.5t-126.5 -43t-125.5 -84t-105.5 -128.5q-136 49 -254 49q-226 0 -401 -140.5t-225 -358.5q-177 -42 -292 -185.5t-115 -328.5zM1023 -118 q0 -39 26 -63q26 -26 62 -26q38 0 65 26t27 63q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1023 270q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM1023 -510q0 -35 26 -61q27 -27 62 -27 q38 0 65 25.5t27 62.5q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1368 89q0 -38 26.5 -64.5t63.5 -26.5t62.5 26.5t25.5 64.5q0 36 -25.5 62t-62.5 26t-63.5 -26t-26.5 -62zM1368 -299q0 -36 26 -62t64 -26t63 25.5t25 62.5q0 38 -25 63t-63 25t-64 -25 t-26 -63zM1440 1395q53 89 143 137.5t188 48.5h23v-34q0 -102 36 -198t108.5 -177t171.5 -129q-27 -60 -81 -110q-146 125 -343 125h-35q-45 201 -211 337z" />
<glyph unicode="&#xf06e;" horiz-adv-x="2267" d="M0 771q0 39 27 66q28 26 64 26h218q37 0 61.5 -27t24.5 -65t-24.5 -64.5t-61.5 -26.5h-218q-37 0 -64 27t-27 64zM305 32q0 37 25 65l157 152q24 25 63 25q38 0 63.5 -24t25.5 -61q0 -39 -26 -68l-152 -152q-65 -51 -131 0q-25 27 -25 63zM305 1509q0 37 25 65 q31 26 68 26q35 0 63 -26l152 -157q26 -24 26 -63q0 -38 -25.5 -63.5t-63.5 -25.5q-39 0 -63 26l-157 152q-25 27 -25 66zM577 771q0 149 75 277.5t203.5 203.5t277.5 75q112 0 215 -44.5t177.5 -119t118.5 -177.5t44 -215q0 -150 -74.5 -278t-202.5 -202.5t-278 -74.5 t-278 74.5t-203 202.5t-75 278zM1042 -58q0 38 26.5 64t64.5 26q39 0 65 -26t26 -64v-212q0 -39 -26.5 -66t-64.5 -27t-64.5 27t-26.5 66v212zM1042 1595v218q0 37 27 64t64 27t64 -27t27 -64v-218q0 -37 -26.5 -61.5t-64.5 -24.5t-64.5 24.5t-26.5 61.5zM1053 1134 q139 -17 233.5 -123t94.5 -249q0 -133 -83.5 -234.5t-211.5 -129.5q32 -4 47 -4q156 0 266.5 110.5t110.5 266.5q0 154 -110.5 263t-266.5 109q-41 0 -80 -9zM1631 189q0 37 24 60q24 25 60 25q39 0 64 -25l156 -152q26 -28 26 -65t-26 -63q-64 -50 -128 0l-152 152 q-24 27 -24 68zM1631 1354q0 40 24 63l152 157q28 26 63 26q38 0 64.5 -27t26.5 -64q0 -40 -26 -66l-156 -152q-29 -26 -64 -26q-36 0 -60 25.5t-24 63.5zM1872 771q0 38 26 66q26 26 61 26h216q37 0 64.5 -27.5t27.5 -64.5t-27.5 -64t-64.5 -27h-216q-37 0 -62 26.5 t-25 64.5z" />
<glyph unicode="&#xf070;" horiz-adv-x="1110" d="M0 771q0 149 75 277.5t203 203.5t277 75q150 0 278 -75t203 -203t75 -278t-75 -278t-203 -202.5t-278 -74.5t-277.5 74.5t-202.5 202.5t-75 278zM475 1134q139 -17 233.5 -123t94.5 -249q0 -133 -83 -234.5t-211 -129.5q32 -4 46 -4q156 0 267 110.5t111 266.5 q0 154 -111 263t-267 109q-41 0 -80 -9z" />
<glyph unicode="&#xf071;" horiz-adv-x="1688" d="M0 239q0 21 1 31v9q0 3 0.5 6t0.5 5t0.5 5t0.5 4v2q0 5 2 12.5t2 9.5v3q0 2 0.5 5t0.5 4l9 39q0 1 1 2v2l4 15q1 1 1 2q1 2 1 3v3q6 20 11 30q0 1 2 3q1 2 5 16q27 61 67 115l6 8q1 1 3 4t3 4q1 2 7 6q1 3 4 6t4 6q6 4 7 8q2 1 7 6l7 8l811 889l-41 -235l727 778 l-446 -868l446 337l-404 -811l289 199l-499 -889q0 -1 -2 -4.5t-3 -5.5q-1 -1 -2 -4t-2 -5q-1 -1 -2.5 -5t-2.5 -5q-69 -134 -198 -215t-285 -81q-147 0 -272 73t-198 198t-73 272zM128 239q0 -172 121.5 -293.5t293.5 -121.5q131 0 237 75.5t150 196.5q27 68 27 143 q0 172 -121 293t-293 121q-160 0 -277 -107q-65 -57 -101.5 -137t-36.5 -170z" />
<glyph unicode="&#xf072;" horiz-adv-x="2317" d="M0 757q0 38 29 65q27 27 66 27h220q38 0 64.5 -27t26.5 -65q0 -40 -26.5 -67t-64.5 -27h-220q-40 0 -67.5 27t-27.5 67zM312 1505q0 37 26 66q30 27 70 27q34 0 63 -27l155 -158q27 -25 27 -64q0 -38 -26.5 -64.5t-63.5 -26.5q-41 0 -65 27l-160 154q-26 28 -26 66z M590 757q0 113 45.5 217.5t122 180t181.5 121t219 45.5q153 0 284 -76.5t207 -206.5t76 -281q0 -24 -3 -45q-45 27 -103 27q-39 0 -77 -16q1 11 1 34q0 156 -113 266.5t-272 110.5q-158 0 -270.5 -110.5t-112.5 -266.5v-19q-47 -3 -90 -27q-1 -1 -11 -8t-20 -14.5t-25 -20 t-28 -25.5q-11 51 -11 114zM593 367v16q-1 15 2 35q8 57 45 109q21 26 29 33q1 3 4 6l4 4q4 2 13 11q3 4 8.5 8t7.5 6q8 8 15 11l18 12q23 15 53 15h3q16 0 28 -3q5 -2 14 -7v-1q23 -10 36.5 -30.5t13.5 -44.5q0 -27 -15 -45q-10 -14 -24 -25q-3 -1 -6.5 -3t-4.5 -2l-6 -4 q-6 -5 -10.5 -9t-11.5 -11.5t-12 -14.5t-9.5 -16.5t-5.5 -18.5v-14v-2q6 -24 12 -38q11 -22 36 -47q2 -3 26 -27q138 -125 129 -267q-3 -48 -22.5 -92.5t-45.5 -75t-42 -45.5t-27 -22q-1 -1 -6 -4.5t-8 -4.5q-13 -6 -23 -7q-14 -2 -21 -2q-48 0 -76 32q-23 28 -19 63t35 57 l2 2q2 2 5 4.5t7.5 6.5t9 9t9 11t9 12.5t9 14.5t7.5 16t5 17.5t2 18.5q3 32 -16 64q-8 17 -24 35q-11 13 -16 17q-15 18 -16 19q-3 2 -7.5 6t-6.5 5q-24 22 -36 38q-20 25 -26 34q-31 42 -42 83q-7 23 -8 34q0 3 -2 8.5t-2 9.5zM1007 403q0 9 1 15q4 35 21 68.5t37.5 56.5 t40 40.5t33.5 26.5l13 8q24 15 53 15q18 0 32 -3q1 0 5.5 -2.5t6.5 -4.5q2 0 3 -1q1 0 8 -5q32 -19 40 -58q0 -3 0.5 -7t0.5 -5q0 -5 -2 -12.5t-2 -9.5q-11 -36 -45 -53q-53 -35 -56 -74q-1 -13 0 -23q4 -19 18 -42q18 -26 26 -34q25 -25 30 -29q20 -18 50 -54 q87 -104 79 -213q-3 -48 -22.5 -93t-45.5 -74.5t-43 -45.5t-27 -22l-13 -9q-17 -6 -22 -7q-18 -2 -21 -2h-3q-13 0 -20 2q-3 0 -8.5 1.5t-7.5 1.5q-1 0 -3 1t-4 2.5t-3 1.5q-24 17 -28 22q-25 29 -20 63.5t36 56.5l3 4q4 3 9.5 8.5l12.5 12.5t13.5 17t12.5 20.5t9.5 23.5 t4.5 26q2 64 -74 135q-30 27 -47 46q-89 105 -82 208zM1065 1593v221q0 39 27.5 66t65.5 27q39 0 66 -27t27 -66v-221q0 -38 -27 -63t-66 -25q-38 0 -65.5 25t-27.5 63zM1423 418q4 35 21 68.5t37.5 56.5t40 40.5t32.5 26.5l14 8q4 3 11 8q18 7 40 7q54 0 82 -41 q8 -11 11 -24q2 -4 2 -9v-12q0 -50 -48 -75q-51 -34 -56 -74q-6 -54 73 -128q140 -124 131 -267q-3 -48 -22.5 -92.5t-46 -75t-42 -45.5t-26.5 -22q-26 -16 -44 -17q-5 -1 -16 -1q-48 0 -74 32q-24 28 -20 63t34 57q5 2 19 15t30.5 41t18.5 56q3 64 -75 135q-66 58 -100 124 q-36 70 -27 145zM1667 1349q0 40 24 64l156 158q29 27 65 27q38 0 65.5 -27.5t27.5 -65.5q0 -40 -28 -66l-158 -154q-29 -27 -65 -27q-37 0 -62 26.5t-25 64.5zM1913 757q0 35 28 65q25 27 62 27h220q38 0 66.5 -27.5t28.5 -64.5q0 -39 -28 -66.5t-67 -27.5h-220 q-39 0 -64.5 27t-25.5 67z" />
<glyph unicode="&#xf073;" horiz-adv-x="842" d="M3 781v2q-1 13 0.5 39t10.5 86t26.5 123t54.5 144t87.5 154t133.5 148.5t185 132.5q25 14 52.5 6t40.5 -33q14 -25 6.5 -53t-32.5 -42q-210 -115 -323 -325q86 40 174 40q172 0 295 -122.5t123 -294.5q0 -13 -0.5 -25.5t-4.5 -55t-12 -82t-25 -99t-40.5 -113t-62 -117.5 t-86 -119.5t-115.5 -112t-148 -101.5q-15 -9 -33 -9q-41 0 -62 37q-14 25 -6 52.5t33 40.5q215 120 326 329q-87 -41 -182 -41q-111 0 -206.5 55t-152 150t-57.5 206zM184 786q0 -98 69 -167t166 -69q91 0 158.5 60.5t77.5 150.5l1 24q0 4 1 5q-1 96 -70.5 162.5 t-167.5 66.5q-89 0 -155.5 -58t-77.5 -145l-2 -27v-3z" />
<glyph unicode="&#xf074;" horiz-adv-x="1846" d="M0 1002q0 150 96.5 267t246.5 152q36 178 181.5 293.5t332.5 115.5q180 0 320.5 -110.5t183.5 -288.5h30q121 0 226 -52t167.5 -142.5t62.5 -196.5q0 -180 -138 -305q0 -56 -34.5 -128.5t-92.5 -131.5t-117 -72q-20 -99 -92 -167t-174 -91q48 -48 48 -113 q0 -79 -56 -134.5t-135 -55.5q-78 0 -134 55.5t-56 134.5q0 9 4.5 28t4.5 29h-9q-94 0 -161 67.5t-67 161.5q0 37 39 113q-78 41 -125 134h-133q-175 15 -297 138.5t-122 298.5z" />
<glyph unicode="&#xf075;" horiz-adv-x="1569" d="M118 673q-180 384 55 724q164 237 505 290q26 7 58 9h67q466 -14 683 -414q102 -189 51 -417q-41 -181 -137 -338q-207 -322 -427 -520q-12 -12 -32 -28q-74 -56 -136.5 -58t-139.5 48q-46 27 -79 63q-314 320 -468 641zM130 909q3 -17 10 -47t10 -43q45 -201 185 -312.5 t348 -131.5q46 -5 54.5 3.5t9.5 55.5q-2 13 -5 41.5t-6 41.5q-40 215 -203 313q-29 18 -66.5 36t-65 29t-73.5 28.5t-67 26.5q-25 10 -85 12q-55 0 -46 -53zM855 440q-4 -49 6.5 -59.5t58.5 -4.5q61 7 128 23q171 43 280 182q54 66 82.5 143t50.5 183q8 36 -3.5 49.5 t-46.5 8.5q-94 -16 -170 -43q-184 -69 -280 -185.5t-106 -296.5z" />
<glyph unicode="&#xf076;" horiz-adv-x="1609" d="M0 794q0 31 21 53t51 22q31 0 52 -22t21 -53q0 -30 -21.5 -51t-51.5 -21t-51 21.5t-21 50.5zM211 794q0 31 21 53t51 22h344l-243 243q-22 20 -22 50.5t22 52.5t52 22t52 -22l242 -242v342q0 31 22 53t53 22q30 0 51 -22t21 -53v-345l244 245q22 22 51.5 22t52.5 -22 q19 -22 19 -52.5t-19 -50.5l-243 -243h344q29 0 50.5 -22t21.5 -53q0 -29 -21.5 -50.5t-50.5 -21.5h-345l244 -244q19 -20 19 -50t-19 -52q-23 -22 -52.5 -22t-51.5 22l-244 245v-346q0 -31 -21 -52.5t-51 -21.5q-31 0 -53 21.5t-22 52.5v343l-242 -242q-22 -22 -52 -22 t-52 22t-22 52t22 50l245 244h-346q-30 0 -51 21.5t-21 50.5zM213 277.5q0 29.5 22 51.5q20 22 50.5 22t52.5 -22t22 -51.5t-22 -51.5t-52.5 -22t-50.5 22q-22 22 -22 51.5zM213 1313.5q0 29.5 22 51.5q20 22 50.5 22t52.5 -22t22 -51.5t-22 -52.5q-22 -22 -52.5 -22 t-50.5 22q-22 23 -22 52.5zM730 64q0 29 22 50.5t53 21.5q30 0 51 -21.5t21 -50.5q0 -31 -21 -52.5t-51 -21.5q-31 0 -53 21.5t-22 52.5zM730 1527q0 31 22 52.5t53 21.5q30 0 51 -21.5t21 -52.5q0 -29 -21 -50.5t-51 -21.5q-31 0 -53 21.5t-22 50.5zM1249 277.5 q0 29.5 22 51.5q20 22 50.5 22t52.5 -22t22 -51.5t-22 -51.5t-52.5 -22t-50.5 22q-22 22 -22 51.5zM1249 1313.5q0 29.5 22 51.5q20 22 50.5 22t52.5 -22t22 -51.5t-22 -52.5q-22 -22 -52.5 -22t-50.5 22q-22 23 -22 52.5zM1463 794q0 31 21.5 53t52.5 22q29 0 50.5 -22 t21.5 -53q0 -29 -21.5 -50.5t-50.5 -21.5q-31 0 -52.5 21.5t-21.5 50.5z" />
<glyph unicode="&#xf077;" horiz-adv-x="2054" d="M0 605q104 5 176 80.5t72 179.5q0 -104 72 -179.5t176 -80.5q-104 -5 -176 -80.5t-72 -179.5q0 104 -72 179.5t-176 80.5zM248 1373q202 10 342.5 156.5t140.5 349.5q0 -203 141 -349.5t343 -156.5q-133 -6 -244 -75.5t-175.5 -184t-64.5 -248.5q0 204 -140.5 351 t-342.5 157zM602 224q152 7 258 117.5t106 263.5q0 -153 105.5 -263.5t257.5 -117.5q-152 -7 -257.5 -117.5t-105.5 -263.5q0 153 -106 263.5t-258 117.5zM1329 730q152 7 257 117t105 264q0 -153 106 -263.5t258 -117.5q-152 -7 -258 -117t-106 -263q0 153 -105 263 t-257 117z" />
<glyph unicode="&#xf078;" horiz-adv-x="1110" d="M1 704q0 -147 74.5 -274.5t202.5 -203t276 -75.5q149 0 278 75.5t204.5 203t75.5 274.5q0 96 -56 228.5t-134 245.5q-71 91 -166.5 200.5t-138.5 151.5q-24 20 -63 59l-137 -138q-99 -96 -191 -222t-158.5 -271.5t-66.5 -253.5z" />
<glyph unicode="&#xf079;" horiz-adv-x="1562" d="M1 923q0 159 62 304t167 249t249.5 166t302.5 62q159 0 303.5 -62t249 -166.5t166.5 -249t62 -303.5q0 -259 -153.5 -462.5t-395.5 -278.5v-351h-452v347q-247 72 -404 278t-157 467zM173 923q0 -248 180 -426q178 -179 429 -179q165 0 305.5 81t222.5 220.5t82 303.5 q0 123 -48.5 235.5t-130.5 194t-195 130t-236 48.5t-235.5 -48.5t-194.5 -130t-130.5 -194t-48.5 -235.5zM235 885v77h231v-77h-231zM351 1262l56 55l162 -162l-55 -56zM621 736q0 67 46.5 116t113.5 51l291 479l70 -37l-215 -515q28 -40 28 -94q0 -70 -49 -118.5 t-119 -48.5q-69 0 -117.5 48.5t-48.5 118.5zM761 1234v231h74v-231h-74zM1074 886v79h231v-79h-231z" />
<glyph unicode="&#xf07a;" horiz-adv-x="1514" d="M-10 497q0 141 77 323.5t198 353.5q250 330 433 498l80 77q40 -42 88 -77q66 -67 201 -222.5t231 -282.5q114 -162 193 -346.5t79 -323.5q0 -160 -62 -305.5t-167.5 -251.5t-252.5 -168.5t-310 -62.5q-160 0 -305.5 60.5t-251.5 165t-168.5 251t-62.5 311.5zM231 810 q0 -133 56 -212t170 -79q115 0 171.5 78.5t57.5 212.5q-1 134 -57.5 213t-171.5 79q-114 0 -170 -79t-56 -213zM399 810q0 24 0.5 37t2 35t5 34.5t9.5 26t16.5 19.5t24.5 6q22 0 35 -13t18.5 -41t6.5 -48t1 -56t-1 -55.5t-6.5 -47.5t-18.5 -41t-35 -13q-14 0 -24.5 6 t-16.5 19.5t-9.5 26t-5 34.5t-2 34.5t-0.5 36.5zM461 -17h141l532 1146h-144zM920 302q2 -134 58.5 -213t170.5 -79q115 0 170.5 78.5t56.5 213.5q-1 134 -56.5 212.5t-170.5 78.5q-114 0 -170.5 -78.5t-58.5 -212.5zM1088 302q0 36 1 55.5t6.5 47.5t18.5 41t35 13 q15 0 25.5 -6t17 -20t10.5 -25.5t5 -34.5l1.5 -34.5t0.5 -36.5q0 -26 -0.5 -37.5l-1.5 -34.5t-5 -34.5t-10.5 -25.5t-17 -20t-25.5 -6q-22 0 -35 13t-18.5 41t-6.5 48t-1 56z" />
<glyph unicode="&#xf07b;" horiz-adv-x="1737" d="M1 387h207v388h2l219 -388h212v710h-207v-379h-2l-207 379h-224v-710zM697 370h152l278 744h-151zM1003 387h221l31 101h226l30 -101h227l-259 710h-214zM1303 641l68 218h3l64 -218h-135z" />
<glyph unicode="&#xf07c;" horiz-adv-x="1771" d="M-8 117q0 8 2 22v508q44 -79 123 -126.5t172 -47.5q94 0 172.5 47.5t122.5 126.5q44 -79 122.5 -126.5t172.5 -47.5q93 0 171.5 47.5t122.5 126.5q45 -79 123 -126.5t171 -47.5t172 47.5t123 126.5v-513q0 -3 0.5 -8.5t0.5 -8.5q0 -2 -0.5 -7.5t-0.5 -8.5q-5 -37 -32 -64 t-64 -32q-3 0 -8.5 -1t-8.5 -1q-2 0 -7.5 1t-8.5 1h-1511q-3 0 -8 -1t-8 -1t-8.5 1t-7.5 1q-36 5 -62 30t-34 60q-2 14 -2 22zM580 1299.5q0 25.5 18 44.5l236 237l3 2q1 0 1 1q1 0 1 1q1 0 1 1h1q1 0 1 1t1 2h2l1 1h1l1 1h1l1 1h1q1 1 2 1h1q0 1 2 1q1 1 2 1l4 2h1q1 0 1 1 h2h1h3h1l1 1h2h1h6h2h2q1 0 2 -1h2h1h3q0 -1 1 -1h1h1q2 -2 3 -2l2 -1h1h1l1 -1h1l1 -1q1 0 1 -1h2q1 0 1 -0.5t1 -0.5q1 -1 2 -1q0 -2 1 -2l1 -1h2l1 -1l1 -1l1 -1l2 -2l237 -237q19 -19 19 -44.5t-19 -43.5q-18 -19 -43.5 -19t-43.5 19l-131 130v-736q0 -25 -18 -43 t-44 -18t-44.5 18t-18.5 43v736l-130 -130q-19 -19 -44.5 -19t-43.5 19q-18 18 -18 43.5z" />
<glyph unicode="&#xf07d;" horiz-adv-x="2357" d="M0 939q0 148 92.5 265t233.5 149q41 176 181.5 289t321.5 113q176 0 314.5 -110.5t179.5 -282.5h28q176 0 300.5 -123.5t124.5 -299.5q0 -1 -0.5 -4t-0.5 -6q120 -128 120 -304q0 -121 -60.5 -224.5t-163 -163.5t-222.5 -60q-154 0 -273.5 95t-157.5 241h-609 q-171 7 -290 130.5t-119 295.5zM145 939q0 -112 77.5 -194.5t186.5 -87.5h605q6 4 12 4h104q5 0 9 -4h229q109 5 187 87.5t78 194.5q0 113 -84 195.5t-198 82.5h-138q-15 0 -15 15l-7 50q-14 139 -119 233.5t-243 94.5q-142 0 -246 -94t-118 -234l-6 -50q0 -15 -17 -15h-43 q-108 -12 -181 -91t-73 -187zM806 -22q-40 52 0 104l121 123q22 19 55 19q30 0 49 -19t19 -50q0 -32 -19 -51l-122 -126q-20 -20 -52 -20q-31 0 -51 20zM1168 513q34 -86 110.5 -139t170.5 -53q124 0 210.5 89t86.5 215q0 62 -20 112q-53 -98 -148.5 -159t-209.5 -65h-200z M1376 -40q0 30 21.5 50t51.5 20q29 0 53 -22q20 -20 20 -48v-175q0 -30 -21.5 -52t-51.5 -22t-51.5 22t-21.5 52v175zM1846 155q0 29 20.5 49t50.5 20q31 0 50 -19l126 -123q21 -23 21 -51q0 -30 -21.5 -51.5t-52.5 -21.5q-33 0 -53 20l-121 126q-20 23 -20 51zM1846 1095 q0 31 20 50l121 126q22 20 53 20q30 0 53 -20q21 -24 21 -54q0 -28 -21 -51l-126 -123q-20 -20 -50 -20t-50.5 20.5t-20.5 51.5zM2040 625q0 30 20 51t50 21h173q31 0 53 -21t22 -51q0 -31 -22 -52.5t-53 -21.5h-173q-30 0 -50 21.5t-20 52.5z" />
<glyph unicode="&#xf07e;" horiz-adv-x="2436" d="M-1 899q0 184 115.5 328.5t291.5 185.5q50 219 225 359t401 140q221 0 393.5 -137t224.5 -351h35q144 0 266 -69.5t193 -190.5t71 -265q0 -184 -113 -329q103 -88 241 -93l70 -6q19 0 19 -20v-82q1 -162 -78 -299t-215.5 -216.5t-297.5 -79.5q-123 0 -233.5 47 t-189.5 127t-125.5 190t-46.5 231h-735q-214 10 -363 163t-149 367zM181 899q0 -139 96.5 -241t233.5 -109h1194q137 7 233.5 109t96.5 241q0 140 -104 243t-246 103h-173q-18 0 -18 18l-8 62q-18 173 -149 289.5t-305 116.5q-176 0 -305.5 -116.5t-145.5 -289.5l-8 -62 q0 -18 -21 -18h-56q-134 -16 -224.5 -114.5t-90.5 -231.5zM1400 369q0 -127 64 -231.5t164.5 -160.5t212.5 -56q99 0 194.5 48t169 145.5t91.5 223.5q-172 35 -290 139q-135 -104 -301 -108h-305z" />
<glyph unicode="&#xf080;" horiz-adv-x="2436" d="M0 896q0 184 115 328t292 185q50 219 225 359.5t401 140.5q221 0 393.5 -137t224.5 -351h35q144 0 266 -69.5t193 -190.5t71 -265q0 -32 -3 -65q104 -82 164 -203.5t60 -259.5q0 -123 -47.5 -233.5t-127.5 -189.5t-190.5 -125.5t-231.5 -46.5q-120 0 -230 47 t-189.5 126.5t-127 189.5t-47.5 230h-734q-214 10 -363 163t-149 367zM182 896q0 -139 96.5 -241.5t233.5 -109.5h1194q137 7 234 109.5t97 241.5q0 140 -104 242.5t-247 102.5h-173q-18 0 -18 18l-8 62q-18 173 -149 290t-305 117q-175 0 -304.5 -117t-146.5 -290l-8 -62 q0 -18 -21 -18h-56q-134 -16 -224.5 -114t-90.5 -231zM1383 351q10 -180 146.5 -302t310.5 -122q96 0 181 37.5t143 99.5t91 141.5t33 162.5q0 78 -31.5 157t-90.5 144q-62 -132 -186 -215t-274 -88h-308q0 -3 2 -13q-12 -2 -17 -2z" />
<glyph unicode="&#xf081;" horiz-adv-x="1755" d="M0 235q0 126 72.5 223t193.5 135q51 174 212 266v37q0 233 147.5 410.5t373.5 219.5q57 10 115 10h3q33 0 75 -5q41 -3 78 -12l97 -30q21 -11 17 -28l-14 -75q-12 -51 -12 -103q0 -56 17.5 -114.5t53 -115t97 -103t141.5 -70.5l76 -22q18 -4 18 -19q0 -6 -1 -8l-19 -73 q-9 -39 -23 -78q-24 -70 -75 -146q0 1 -1 1q-70 -101 -175 -168q22 -54 22 -132q0 -158 -110.5 -269.5t-265.5 -111.5h-731q-155 0 -268.5 113t-113.5 268zM211 235q0 -72 49.5 -122.5t121.5 -50.5h731q69 0 119.5 51t50.5 122q0 69 -50.5 119.5t-119.5 50.5h-140 q-17 0 -27 24l-9 68q-11 92 -79.5 154t-161.5 62q-91 0 -157.5 -62t-77.5 -154l-11 -59q0 -24 -20 -24l-67 -9q-66 -6 -109 -54.5t-43 -115.5zM683 918h13q148 0 265.5 -83.5t164.5 -223.5q124 0 217 -77q111 69 163 187q-166 84 -259.5 240t-93.5 332v36q-5 0 -13 0.5 t-13 0.5q-98 0 -189 -42t-154 -120l-3 2q-87 -108 -98 -252z" />
<glyph unicode="&#xf082;" horiz-adv-x="2539" d="M0 521q0 -39 30 -66q26 -30 67 -30h1567q46 0 78 -32t32 -79q0 -46 -31.5 -76.5t-78.5 -30.5t-78 31q-26 28 -64 28q-40 0 -68.5 -27.5t-28.5 -65.5q0 -40 30 -67q90 -88 209 -88q125 0 214 86t89 210t-89.5 213.5t-213.5 89.5h-1567q-40 0 -68.5 -28t-28.5 -68zM0 871 q0 -37 30 -65q28 -28 67 -28h2138q125 0 214.5 87t89.5 210q0 124 -89.5 212t-214.5 88q-123 0 -208 -85q-29 -26 -29 -71q0 -41 27.5 -67t67.5 -26q39 0 67 26q30 33 75 33q46 0 77.5 -32t31.5 -78t-31.5 -77t-77.5 -31h-2138q-40 0 -68.5 -28t-28.5 -68zM168 133 q0 -38 26 -62q26 -26 62 -26q39 0 66 25t27 63q0 37 -27.5 63.5t-65.5 26.5q-36 0 -62 -26.5t-26 -63.5zM269 1192q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM592 1438q0 -38 26 -62q26 -26 62 -26q39 0 66 25 t27 63q0 37 -27.5 63.5t-65.5 26.5q-36 0 -62 -26.5t-26 -63.5zM602 201q0 -37 27 -62q26 -26 61 -26q39 0 66 25t27 63q0 37 -27.5 63.5t-65.5 26.5q-36 0 -62 -26.5t-26 -63.5zM1048 1249q0 -38 26 -62q26 -26 62 -26q39 0 66 25t27 63q0 37 -27.5 63.5t-65.5 26.5 q-36 0 -62 -26.5t-26 -63.5zM1082 77q0 -37 27 -62q26 -26 61 -26q39 0 66 25t27 63q0 37 -27.5 63.5t-65.5 26.5q-36 0 -62 -26.5t-26 -63.5zM1560 1266q0 -37 26 -61q27 -27 62 -27q39 0 66 25t27 63q0 37 -27.5 64t-65.5 27q-35 0 -61.5 -27t-26.5 -64zM2103 513 q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5z" />
<glyph unicode="&#xf083;" horiz-adv-x="1755" d="M0 239q0 -155 113.5 -268.5t268.5 -113.5h731q155 0 265.5 112t110.5 270q0 77 -22 131q133 85 210.5 226.5t77.5 302.5q0 130 -50.5 248.5t-136.5 204t-204 136.5t-247 51q-175 0 -322.5 -86t-232 -233t-84.5 -321v-36q-161 -92 -212 -266q-121 -38 -193.5 -135 t-72.5 -223zM211 239q0 67 43 115t109 54l67 9q20 0 20 24l11 60q11 92 77.5 154t157.5 62q93 0 161.5 -62t79.5 -154l9 -69q10 -24 27 -24h140q69 0 119.5 -50t50.5 -119q0 -72 -50.5 -123t-119.5 -51h-731q-72 0 -121.5 51t-49.5 123zM683 921q11 175 135.5 294t298.5 119 q178 0 302.5 -127t124.5 -308q0 -112 -54 -207.5t-147 -154.5q-94 78 -217 78q-47 140 -164.5 223t-265.5 83h-13z" />
<glyph unicode="&#xf084;" horiz-adv-x="2216" d="M3 768q2 54 53 168.5t142 245.5q298 417 841 440v47q0 33 22.5 53.5t51.5 20.5q30 0 53 -20.5t23 -53.5v-47q157 -7 293 -48t236.5 -106.5t172 -135t128.5 -150.5q66 -95 113 -202.5t65 -171.5t19 -65v-9v-11q0 -28 -22.5 -46.5t-52.5 -18.5q-50 0 -64 28 q-125 140 -272 140q-55 -3 -110 -24.5t-88 -44.5t-62 -46.5t-30 -24.5q-30 -28 -57 -28q-36 0 -55 19q-116 116 -214 141v-786v-8v-14t-0.5 -18t-1.5 -22t-4 -24.5t-6.5 -27t-9.5 -28t-13.5 -28.5t-18 -27.5t-22.5 -26.5q-81 -94 -233 -94q-162 0 -243 94q-19 19 -33.5 41 t-22 43.5t-13 41t-6.5 38.5t-1.5 31.5t0.5 25t1 13.5q0 29 25 50t59 15q28 0 47 -24.5t19 -59.5q-10 -65 27 -112q33 -47 141 -47q83 0 121 38q21 21 30.5 51t8.5 50l-1 20v785q-117 -28 -206 -122q-7 -13 -25 -24.5t-32 -11.5q-28 0 -64 36q-128 143 -272 140 q-64 -1 -120 -21t-84 -40.5t-58 -48t-34 -30.5q-33 -23 -54.5 -23t-51.5 18q-26 16 -31.5 34t-3.5 53zM226 920q108 57 205 57h9q184 0 336 -142q61 53 148 94t189 48h9q184 0 336 -142q61 53 148 94t189 48h10q90 0 187 -47q-71 137 -94 177q-287 374 -793 374 q-253 0 -452 -96t-325 -278q-40 -56 -102 -187z" />
<glyph unicode="&#xf085;" horiz-adv-x="2884" d="M0 80q0 -38 29 -64q27 -27 65 -27h627q41 0 72.5 -30t31.5 -73t-31.5 -74t-72.5 -31t-73 32q-29 26 -65 26q-38 0 -64 -25.5t-26 -63.5t26 -64q85 -85 202 -85q118 0 201 83.5t83 201.5t-83 201.5t-201 83.5h-627q-38 0 -66 -27t-28 -64zM0 401q0 -36 29 -62 q26 -26 65 -26h1170q118 0 201.5 83.5t83.5 201.5t-83 200t-202 82q-121 0 -201 -81q-25 -26 -25 -65t24.5 -63.5t63.5 -24.5q38 0 66 25q30 30 72 30t72.5 -30t30.5 -73t-30.5 -74t-72.5 -31h-1170q-38 0 -66 -27.5t-28 -64.5zM617 1099q0 38 28 66q28 26 64 26h217 q37 0 62 -27t25 -65t-25 -64.5t-62 -26.5h-217q-38 0 -65 27t-27 64zM922 1837q0 37 25 65q31 26 68 26q35 0 63 -26l152 -157q26 -24 26 -63q0 -38 -26 -63.5t-63 -25.5q-39 0 -63 26l-157 152q-25 27 -25 66zM1194 1112v7q3 146 79 269.5t203 195t274 71.5 q112 0 215 -44.5t177.5 -119t118.5 -177.5t44 -215q0 -150 -74 -277.5t-201 -202t-277 -75.5h-22q-11 0 -18.5 8t-7.5 19v130q0 21 23 21h26q154 1 263.5 111.5t109.5 265.5q0 154 -110.5 263t-266.5 109q-151 0 -260 -104t-115 -253q0 -9 -8.5 -18.5t-27.5 -9.5h-121 q-24 0 -24 26zM1659 58v212q0 38 26.5 64t64.5 26q40 0 65.5 -26t25.5 -64v-212q0 -39 -26.5 -66t-64.5 -27t-64.5 27t-26.5 66zM1659 1923v218q0 37 26.5 64t64.5 27t64.5 -27t26.5 -64v-218q0 -37 -26.5 -61.5t-64.5 -24.5t-64.5 24.5t-26.5 61.5zM2248 517q0 37 24 60 q24 25 61 25q39 0 64 -25l155 -152q26 -28 26 -65t-26 -63q-64 -50 -128 0l-152 152q-24 27 -24 68zM2248 1682q0 40 24 63l152 157q28 26 63 26q37 0 64 -27t27 -64q0 -40 -26 -66l-155 -152q-29 -26 -64 -26q-36 0 -60.5 25.5t-24.5 63.5zM2489 1099q0 38 26 66 q26 26 61 26h216q37 0 65 -27.5t28 -64.5t-28 -64t-65 -27h-216q-37 0 -62 26.5t-25 64.5z" />
<glyph unicode="&#xf086;" horiz-adv-x="2316" d="M0 528q0 185 113.5 328t292.5 183q37 165 149.5 288.5t269.5 176.5q99 34 206 34q130 0 251 -51q45 75 105.5 130t125 84.5t125.5 43.5t120 14q61 0 131 -17l87 -27q22 -9 15 -24l-15 -64q-11 -50 -11 -92q0 -50 15.5 -101t46.5 -100t85 -89t123 -61l66 -23q16 -4 16 -17 q0 -3 -2 -7l-19 -72q-44 -172 -160 -274q64 -112 69 -239q1 -8 1 -24q0 -143 -71 -264.5t-192.5 -192.5t-264.5 -71h-1153q-143 0 -264 71t-191 192.5t-70 264.5zM182 528q0 -142 102 -246t241 -104h1153q142 0 243.5 103t101.5 247q0 140 -102 241.5t-243 101.5h-190 l-11 80q-16 162 -134 276.5t-281 127.5q-5 0 -15.5 1t-15.5 1q-81 0 -164 -31v2q-117 -45 -196.5 -146t-95.5 -231l-7 -77l-73 -3q-135 -16 -224 -113t-89 -230zM1435 1393q170 -145 210 -339h34q199 0 338 -126q53 50 81 114q-146 69 -230 210t-84 297v26q-8 1 -26 1 q-93 2 -181 -46.5t-142 -136.5z" />
<glyph unicode="&#xf087;" horiz-adv-x="676" d="M-1 778v305q0 31 20.5 51.5t50.5 20.5h306q30 0 50.5 -20.5t20.5 -51.5q0 -30 -20.5 -49.5t-50.5 -19.5h-133l414 -414q18 -21 18 -53q0 -30 -18 -49q-20 -19 -54 -19q-31 0 -50 19l-411 413v-133q0 -31 -20.5 -51.5t-51.5 -20.5q-30 0 -50.5 21t-20.5 51z" />
<glyph unicode="&#xf088;" horiz-adv-x="677" d="M0 1067q0 31 18 50q20 19 54 19q31 0 50 -19l413 -413v133q0 31 20.5 51.5t51.5 20.5q30 0 50.5 -21t20.5 -51v-306q0 -31 -20.5 -51.5t-50.5 -20.5h-306q-30 0 -50.5 20.5t-20.5 51.5q0 30 20.5 50t50.5 20h132l-415 414q-18 21 -18 52z" />
<glyph unicode="&#xf089;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767q0 -23 16.5 -40t40.5 -17q23 0 40 17t17 40v455q0 24 -17 40.5t-40 16.5q-24 0 -40.5 -16.5t-16.5 -40.5v-455z" />
<glyph unicode="&#xf08a;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767v455q0 24 16.5 40.5t40.5 16.5q23 0 40 -16.5t17 -40.5v-241l51 89q12 20 35.5 26t43.5 -6q20 -11 26.5 -34t-5.5 -43l-156 -267q-13 -36 -52 -36q-24 0 -40.5 16.5t-16.5 40.5z " />
<glyph unicode="&#xf08b;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767v1v454q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-356l190 107q20 12 43 6t34 -28q12 -20 5.5 -43t-26.5 -35l-265 -148q-17 -15 -38 -15q-24 0 -40.5 16.5t-16.5 40.5z " />
<glyph unicode="&#xf08c;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767v455q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-397h258q24 0 40.5 -16.5t16.5 -40.5q0 -23 -16.5 -40t-40.5 -17h-303q-3 -1 -12 -1q-24 0 -40.5 16.5t-16.5 40.5z" />
<glyph unicode="&#xf08d;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767v455q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-420l245 -143q20 -12 26 -34.5t-6 -42.5q-16 -29 -49 -29q-17 0 -29 8l-261 152q-17 5 -28.5 20t-11.5 34z" />
<glyph unicode="&#xf08e;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767v1v454q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-438l147 -262q12 -22 5.5 -44.5t-26.5 -34.5q-11 -6 -28 -6q-34 0 -50 28l-150 266q-12 15 -12 36z" />
<glyph unicode="&#xf08f;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 453v769q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-769q0 -24 -16.5 -41t-40.5 -17t-40.5 17t-16.5 41z" />
<glyph unicode="&#xf090;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM556.5 477.5q-6.5 22.5 5.5 44.5l148 262v438q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-454v-1q0 -20 -13 -36l-149 -266q-16 -28 -51 -28q-16 0 -27 6q-21 12 -27.5 34.5z" />
<glyph unicode="&#xf091;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM439 624.5q6 22.5 26 34.5l245 143v420q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-455q0 -19 -11.5 -34t-28.5 -20l-262 -152q-12 -8 -28 -8q-33 0 -49 29q-12 20 -6 42.5z" />
<glyph unicode="&#xf092;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM394 768q0 24 16.5 40.5t40.5 16.5h259v397q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-455q0 -24 -16.5 -40.5t-40.5 -16.5q-10 0 -13 1h-303q-24 0 -40.5 17t-16.5 40z" />
<glyph unicode="&#xf093;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM437 908q-7 23 5 43q11 20 34.5 27t43.5 -5l190 -107v356q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-454v-1q0 -24 -16.5 -40.5t-40.5 -16.5q-21 0 -38 15l-265 148q-20 12 -27 35 z" />
<glyph unicode="&#xf094;" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM553 1056q6 23 26 34q20 12 43.5 6t34.5 -26l53 -89v241q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-455q0 -24 -16.5 -40.5t-40.5 -16.5q-41 0 -54 36l-154 267q-12 20 -6 43z" />
<glyph unicode="&#xf095;" d="M0 769q0 157 61 299.5t164 245.5t245.5 164t298.5 61q157 0 299.5 -61t245.5 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245.5t-245.5 -164t-299.5 -61q-156 0 -298.5 61t-245.5 164t-164 245.5t-61 298.5zM82 769q0 -139 54.5 -266.5t146.5 -219.5 t219.5 -146.5t266.5 -54.5q140 0 267 54.5t219.5 146.5t147 219.5t54.5 266.5q0 186 -92.5 344.5t-251 251t-344.5 92.5q-139 0 -266.5 -54.5t-219.5 -147t-146.5 -219.5t-54.5 -267z" />
<glyph unicode="&#xf096;" d="M769 0q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103q135 -53 237 -140.5t160.5 -192.5t86.5 -214t28 -221q0 -66 -5 -125.5t-20 -127.5t-38.5 -127t-63 -118.5t-92 -108t-127.5 -91t-166 -71.5z" />
<glyph unicode="&#xf097;" d="M769 0q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103q113 -60 197.5 -149.5t133 -193t72 -209.5t23.5 -216q0 -93 -9 -173.5t-36.5 -172.5t-72.5 -166t-124 -142.5t-184 -114.5z" />
<glyph unicode="&#xf098;" d="M769 0q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103q175 -129 258 -335.5t83 -432.5q0 -92 -7 -170.5t-29.5 -168.5t-58.5 -163.5t-99 -144.5t-147 -122z" />
<glyph unicode="&#xf099;" d="M769 0q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103q132 -142 194 -344.5t62 -423.5q0 -90 -5.5 -166.5t-22 -164.5t-44 -161.5t-74.5 -146.5t-110 -130z" />
<glyph unicode="&#xf09a;" d="M768 0q209 0 386 103t280 280t103 386t-103 385.5t-280 279.5t-386 103q171 -297 171 -768q0 -239 -35.5 -430t-135.5 -339z" />
<glyph unicode="&#xf09b;" d="M768 0q209 0 386 103t280 280t103 386t-103 385.5t-280 279.5t-386 103q171 -297 171 -768q0 -239 -35.5 -430t-135.5 -339z" />
<glyph unicode="&#xf09c;" d="M769 0q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103v-1537z" />
<glyph unicode="&#xf09d;" d="M695 769q0 -464 74 -769q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103q-74 -381 -74 -768z" />
<glyph unicode="&#xf09e;" d="M622 769q0 -488 146 -769q209 0 386 103t280 280t103 386t-103 385.5t-280 279.5t-386 103q-146 -350 -146 -768z" />
<glyph unicode="&#xf09f;" d="M550 770q0 -245 48.5 -436.5t171.5 -333.5q156 0 298.5 61t245.5 164t164 245.5t61 299.5t-61 299t-164 245t-245.5 164t-298.5 61q-104 -149 -162 -350t-58 -419z" />
<glyph unicode="&#xf0a0;" d="M477 770q0 -122 13.5 -225t45.5 -204t91 -187.5t143 -153.5q157 0 299 61t245 164t164 245.5t61 299.5q0 209 -103 386t-280 280t-386 103q-138 -133 -215.5 -336.5t-77.5 -432.5z" />
<glyph unicode="&#xf0a1;" d="M403 770q0 -127 17 -233t57 -207.5t114 -185t179 -144.5q156 0 298.5 61t245.5 164t164 245.5t61 299.5t-61 299t-164 245t-245.5 164t-298.5 61q-171 -117 -269 -323.5t-98 -445.5z" />
<glyph unicode="&#xf0a2;" d="M330 770q0 -105 12 -193.5t42.5 -177t79.5 -160t126.5 -133.5t179.5 -106q157 0 299 61t245 164t164 245.5t61 299.5q0 209 -103 386t-280 280t-386 103q-204 -102 -322 -310.5t-118 -458.5z" />
<glyph unicode="&#xf0a3;" d="M0 769q0 -209 103 -386t280 -280t386 -103t385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103t-386 -103t-280 -279.5t-103 -385.5z" />
<glyph unicode="&#xf0a4;" d="M0 766q0 -125 38.5 -242t109.5 -211t165 -165t211 -109.5t242 -38.5q515 143 515 766q0 121 -28.5 230t-77 193t-115 153t-140.5 115t-154 73q-156 0 -298 -60.5t-244.5 -163t-163 -244t-60.5 -296.5z" />
<glyph unicode="&#xf0a5;" d="M0 766q0 -125 38.5 -242t109.5 -211t165 -165t211 -109.5t242 -38.5q443 177 443 766q0 142 -37 268.5t-100.5 220.5t-140.5 163t-165 113q-208 0 -384.5 -102.5t-279 -278.5t-102.5 -384z" />
<glyph unicode="&#xf0a6;" d="M0 766q0 -125 38.5 -242t109.5 -211t165 -165t211 -109.5t242 -38.5q370 212 370 766q0 134 -30.5 255.5t-84 216.5t-117.5 168t-138 127q-156 0 -298 -60.5t-244.5 -163.5t-163 -245t-60.5 -298z" />
<glyph unicode="&#xf0a7;" d="M0 767q0 -156 60.5 -298t163.5 -245t245 -163.5t298 -60.5q296 245 296 767q0 240 -83.5 434.5t-212.5 332.5q-208 0 -385 -103t-279.5 -279.5t-102.5 -384.5z" />
<glyph unicode="&#xf0a8;" d="M0 767q0 -208 103 -384.5t279.5 -279.5t384.5 -103q222 282 222 767q0 406 -222 767q-208 0 -384.5 -102.5t-279.5 -279.5t-103 -385z" />
<glyph unicode="&#xf0a9;" d="M0 768q0 -209 103 -385.5t279.5 -279.5t385.5 -103q147 315 147 768q0 354 -147 767q-156 0 -298.5 -60.5t-245 -163.5t-163.5 -245t-61 -298z" />
<glyph unicode="&#xf0aa;" d="M0 769q0 -209 103 -386t279.5 -280t385.5 -103v1537q-209 0 -385.5 -103t-279.5 -279.5t-103 -385.5z" />
<glyph unicode="&#xf0ab;" d="M0 769q0 -209 103 -386t279.5 -280t385.5 -103q-102 322 -102 769q0 351 102 768q-209 0 -385.5 -103t-279.5 -279.5t-103 -385.5z" />
<glyph unicode="&#xf0ac;" d="M0 769q0 -209 103 -386t280 -280t386 -103q-206 281 -206 769q0 408 206 768q-209 0 -386 -103t-280 -279.5t-103 -385.5z" />
<glyph unicode="&#xf0ad;" d="M0 769q0 -209 103 -386t279.5 -280t385.5 -103q-306 239 -306 769q0 238 85.5 437t220.5 331q-209 0 -385.5 -103t-279.5 -279.5t-103 -385.5z" />
<glyph unicode="&#xf0ae;" d="M0 769q0 -209 103 -386t280 -280t386 -103q-212 103 -311 295.5t-99 473.5q0 259 115.5 461t294.5 307q-209 0 -386 -103t-280 -279.5t-103 -385.5z" />
<glyph unicode="&#xf0af;" d="M0 769q0 -209 103 -386t279.5 -280t385.5 -103q-265 81 -388.5 274.5t-123.5 494.5q0 142 41 269.5t111.5 223.5t162 166.5t197.5 108.5q-209 0 -385.5 -103t-279.5 -279.5t-103 -385.5z" />
<glyph unicode="&#xf0b0;" d="M0 769q0 -209 103 -386t279.5 -280t385.5 -103q-149 57 -259 128t-175.5 143.5t-104.5 159.5t-52.5 165t-13.5 172q0 67 5.5 123.5t22 121t44 119.5t74 113.5t108.5 107.5t151 97t200 87q-209 0 -385.5 -103t-279.5 -279.5t-103 -385.5z" />
<glyph unicode="&#xf0b1;" d="M0 765q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 765q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM503 366l256 895q1 10 10 10t10 -10l255 -895q4 -11 -1.5 -17t-16.5 0l-237 89q-10 4 -20 0l-239 -89q-10 -6 -14.5 0t-2.5 17z" />
<glyph unicode="&#xf0b2;" horiz-adv-x="2883" d="M0 526v1q0 185 115.5 329t292.5 186q49 219 224.5 360t402.5 141q159 0 290 -70q80 85 188 133.5t223 48.5q152 0 281.5 -75.5t205 -205t75.5 -281.5q0 -197 -122 -351q46 -98 46 -215q0 -141 -68 -261.5t-185.5 -193.5t-258.5 -77q-21 0 -21 19v143q0 19 21 19 q137 7 232.5 109.5t95.5 241.5q0 142 -103 244t-246 102h-172q-19 0 -19 18l-8 63q-18 173 -149.5 290.5t-305.5 117.5q-176 0 -305.5 -117.5t-146.5 -290.5l-8 -63q-5 -14 -24 -14l-54 -4q-135 -16 -225 -113.5t-90 -232.5v-5h3q2 -156 118 -259q35 -31 79 -52v-2 q66 -30 129 -33q18 0 18 -18v-143q0 -18 -18 -18q-83 5 -158 32v-2q-133 46 -225.5 153t-118.5 246v4q-1 1 -1 3q-8 40 -8 93zM587 -239q0 5 2 13.5t2 12.5l10 63q11 38 43.5 56.5t72.5 8.5q36 -11 54 -43.5t7 -66.5l-15 -64q-16 -70 -81 -70q-5 0 -15.5 1.5t-13.5 1.5 q-33 10 -49.5 35t-16.5 52zM666 75q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -61.5t-63 -24.5q-37 0 -61 26q-27 25 -27 60zM841 -563q0 6 4 24l14 62q11 36 44 54.5t67 7.5q37 -7 56 -39t9 -73l-14 -63q-16 -65 -85 -65q-8 0 -26 4q-35 10 -52 35.5t-17 52.5zM898 1838 q0 38 27 64t67 26q38 0 64 -26l67 -70q27 -27 27 -64q0 -39 -32 -68.5t-65 -24.5q-33 3 -59 29l-69 70q-27 27 -27 64zM925 -254q0 37 25 62t63 25t63 -25t25 -62q0 -38 -25 -63t-63 -25q-35 0 -62 27q-26 26 -26 61zM991 -11q0 15 3 28l24 96q11 37 44 56.5t68 8.5 q38 -11 56.5 -42.5t7.5 -66.5l-28 -96q-13 -44 -44 -60.5t-68 -6.5q-32 6 -48.5 32.5t-14.5 50.5zM1286 -240q0 5 1.5 14t1.5 12l10 63q11 38 43.5 56.5t72.5 8.5q36 -11 54.5 -44t7.5 -67l-15 -64q-16 -69 -81 -69q-5 0 -16 1.5t-14 1.5q-32 10 -48.5 35t-16.5 52zM1365 74 q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62t-63 -25q-37 0 -62 27q-26 24 -26 60zM1475 1366q134 -122 181 -312h33q220 0 375 -155q50 88 50 194q0 157 -110.5 266.5t-267.5 109.5q-154 0 -261 -103zM1645 1928v219q0 38 27 65.5t64 27.5q38 0 63.5 -27t25.5 -66v-219 q0 -39 -25.5 -66t-63.5 -27q-37 0 -64 27.5t-27 65.5zM2240 1683q0 39 25 64l154 155q24 27 62 27q39 0 64 -27q28 -26 28 -64t-28 -64l-154 -155q-31 -30 -67.5 -27.5t-58.5 27.5q-25 25 -25 64zM2323 413q0 38 26.5 65t64.5 27q37 0 65 -28l66 -67q28 -28 28 -65 q0 -38 -28 -64q-22 -28 -58 -28l-2 2q-38 0 -66 26l-69 68q-27 27 -27 64zM2479 1093q0 38 26.5 63.5t65.5 25.5h220q39 0 65.5 -25.5t26.5 -63.5t-27 -65t-65 -27h-220q-38 0 -64 29q-28 24 -28 63z" />
<glyph unicode="&#xf0b3;" horiz-adv-x="2298" d="M0 519v1v1q0 185 115.5 330t292.5 186q49 219 224.5 359.5t402.5 140.5q159 0 290 -70q80 85 188 133.5t223 48.5q152 0 281.5 -75.5t205 -205t75.5 -281.5q0 -197 -122 -351q46 -98 46 -215q0 -141 -68 -261.5t-185.5 -193t-258.5 -76.5q-21 0 -21 18v143q0 19 21 19 q137 7 232.5 109.5t95.5 241.5q0 142 -103 244t-246 102h-172q-19 0 -19 19l-8 63q-18 173 -149.5 290.5t-305.5 117.5q-176 0 -305.5 -117.5t-146.5 -290.5l-8 -63q-5 -15 -24 -15l-54 -4q-135 -16 -225 -113.5t-90 -232.5v-4q2 -2 3 -2q1 -136 96 -237q45 -47 98 -71v-2 q60 -31 132 -36q18 0 18 -18v-143q0 -18 -18 -18q-78 4 -153 31q-121 40 -209.5 131.5t-125.5 213.5q-23 75 -23 153zM587 -246q0 5 2 14t2 13l10 62q11 38 44 57t72 9q36 -11 54 -44t7 -67l-15 -64q-16 -70 -81 -70q-5 0 -15.5 1.5t-13.5 1.5q-33 10 -49.5 35t-16.5 52z M666 69q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62t-63 -25q-37 0 -61 26q-27 25 -27 61zM841 -569q0 6 4 24l14 63q11 36 44 54t67 7q37 -7 56 -39t9 -73l-14 -62q-17 -66 -85 -66q-8 0 -26 4q-35 10 -52 35.5t-17 52.5zM925 -259q0 37 25 61.5t63 24.5t63 -24.5 t25 -61.5q0 -38 -25 -63t-63 -25q-36 0 -62 26t-26 62zM991 -17q0 15 3 28l24 96q11 38 44 57t68 9q38 -11 56.5 -43t7.5 -67l-28 -96q-13 -44 -44 -60t-68 -6q-32 6 -48.5 32t-14.5 50zM1286 -246q0 5 1.5 15t1.5 12l10 62q11 38 44 57t72 9q36 -11 54.5 -44t7.5 -67 l-15 -64q-16 -70 -81 -70q-5 0 -16 1.5t-14 1.5q-32 10 -48.5 35t-16.5 52zM1365 69q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62t-63 -25t-62 26q-26 24 -26 61zM1475 1360q134 -122 181 -312h33q221 0 375 -154q50 88 50 193q0 157 -110.5 266.5t-267.5 109.5 q-154 0 -261 -103z" />
<glyph unicode="&#xf0b4;" horiz-adv-x="2328" d="M0 504v6v2v5v5v1v2v9v7v2q7 179 121 317t286 178q50 218 225 358t401 140q118 0 254 -49q45 74 105.5 128.5t125.5 84t126.5 43t120.5 12.5q62 0 132 -14l85 -27q19 -9 15 -25l-12 -65q-11 -47 -11 -90q0 -49 15.5 -101t47 -101.5t85.5 -90.5t124 -62l66 -18 q16 -4 16 -17q0 -6 -1 -7l-20 -73q-39 -162 -161 -280q70 -122 70 -261q0 -214 -148.5 -368.5t-361.5 -161.5q-20 0 -20 20v145q0 19 20 19q139 10 235 110t96 236q0 143 -103 244.5t-248 101.5h-173q-18 0 -18 19l-8 62q-18 172 -149 289.5t-305 117.5q-175 0 -304.5 -117 t-146.5 -290l-8 -55q0 -18 -21 -18l-56 -8q-134 -16 -224.5 -114.5t-90.5 -231.5v-2l1 -1h2q1 -84 39 -158t104 -122h1l1 -1l1 -1q35 -25 66 -37q54 -24 114 -26q18 0 18 -18v-143q0 -19 -18 -19q-149 7 -272 88h-1q-106 69 -169.5 180t-68.5 241zM587 -240q0 5 2 13.5 t2 12.5l10 63q11 38 43.5 56.5t72.5 8.5q36 -11 54 -44t7 -67l-15 -64q-16 -69 -81 -69q-5 0 -15.5 1.5t-13.5 1.5q-33 10 -49.5 35t-16.5 52zM666 74q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62t-63 -25q-36 0 -61 27q-27 25 -27 60zM841 -566q0 6 4 24l14 63 q11 36 44 54.5t67 7.5q37 -7 56 -39t9 -73l-14 -63q-16 -65 -85 -65q-12 0 -26 3q-35 10 -52 35.5t-17 52.5zM925 -256q0 37 25 62t63 25t63 -25t25 -62q0 -38 -25 -63t-63 -25q-36 0 -62 26t-26 62zM991 -14q0 15 3 29l24 96q11 37 44 56.5t68 8.5q38 -11 56.5 -43t7.5 -67 l-28 -96q-13 -44 -44 -60t-68 -6q-32 6 -48.5 32t-14.5 50zM1286 -242q0 5 1.5 14t1.5 12l10 63q11 38 43.5 56.5t72.5 8.5q36 -11 54.5 -44t7.5 -67l-15 -64q-16 -70 -81 -70q-5 0 -15 2t-15 2q-32 10 -48.5 35t-16.5 52zM1365 72q0 38 25 63t63 25t63 -25t25 -63 q0 -37 -25 -62t-63 -25t-62 26q-26 24 -26 61zM1440 1390q166 -136 211 -337h35q196 0 343 -126q54 49 81 111q-99 48 -171.5 129t-108.5 177t-36 198v33h-23q-99 0 -188.5 -48t-142.5 -137z" />
<glyph unicode="&#xf0b5;" horiz-adv-x="2328" d="M0 523q0 185 115.5 330t292.5 186q49 219 224.5 359.5t402.5 140.5q130 0 235 -43q0 -1 1 -2q134 -52 236 -165h3q108 -117 146 -279h33q173 0 302 -92v1q85 -57 142.5 -142t77.5 -186q6 -34 8 -55v-1v-5q0 -1 1.5 -18t1.5 -26v-1v-2q0 -141 -68 -261.5t-185.5 -193 t-258.5 -76.5q-21 0 -21 18v143q0 20 21 20q137 7 232.5 109t95.5 241q0 142 -103 244.5t-246 102.5h-172q-19 0 -19 18l-8 63q-16 160 -135 276q-1 1 -2.5 3t-2.5 3q-2 2 -4 2q0 3 -2 3q-116 106 -273 120q-11 1 -36 1q-176 0 -305.5 -117.5t-146.5 -290.5l-8 -63 q-5 -15 -24 -15l-54 -3q-135 -16 -225 -114t-90 -233v-4h3q1 -76 32.5 -144t85.5 -116q33 -29 79 -51v-1q64 -31 129 -34q18 0 18 -19v-143q0 -18 -18 -18q-83 5 -158 32v-1q-133 46 -225.5 153t-118.5 246v3q-1 1 -1 4q-8 41 -8 93zM587 -242q0 5 2 13.5t2 12.5l10 63 q11 38 43.5 56.5t72.5 8.5q36 -11 54 -44t7 -67l-15 -64q-16 -70 -81 -70q-5 0 -14.5 2t-14.5 2q-33 10 -49.5 35t-16.5 52zM666 72q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62t-63 -25q-37 0 -61 26q-27 25 -27 61zM841 -567q0 6 4 24l14 63q11 36 44 54.5t67 7.5 q37 -7 56 -39t9 -73l-14 -63q-16 -65 -85 -65q-12 0 -26 3q-35 10 -52 35.5t-17 52.5zM925 -257q0 37 25 62t63 25t63 -25t25 -62q0 -38 -25 -63t-63 -25q-36 0 -62 26t-26 62zM991 -15q0 16 3 29l24 96q11 37 44 56.5t68 8.5q38 -11 56.5 -43t7.5 -67l-28 -96 q-13 -44 -44 -60t-68 -6q-32 6 -48.5 32t-14.5 50zM1286 -243q0 5 1.5 14t1.5 12l10 63q11 38 43.5 56.5t72.5 8.5q36 -11 54.5 -44t7.5 -67l-15 -64q-16 -70 -81 -70q-5 0 -15 2t-15 2q-32 10 -48.5 35t-16.5 52zM1365 71q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62 t-63 -25t-62 26q-26 24 -26 61z" />
<glyph unicode="&#xf0b6;" horiz-adv-x="2267" d="M0 665q0 38 27 65q29 27 64 27h218q37 0 61.5 -27t24.5 -65t-24.5 -64.5t-61.5 -26.5h-218q-37 0 -64 27t-27 64zM305 1402q0 37 25 65q32 27 68 27q34 0 63 -27l152 -156q26 -24 26 -63q0 -38 -25.5 -63.5t-63.5 -25.5q-39 0 -63 26l-157 152q-25 27 -25 65zM322 409 q0 36 25 59t68 23h609q43 0 68.5 -23t25.5 -59q0 -43 -25 -68.5t-69 -25.5h-609q-43 0 -68 25t-25 69zM427 94q0 35 29.5 64t64.5 29q42 0 67.5 -28t25.5 -65q0 -44 -25 -69t-68 -25q-37 0 -65.5 26t-28.5 68zM578 634v7q5 201 139.5 350t330.5 180h2h3q31 6 81 6t81 -6h2h2 q196 -31 330.5 -180t139.5 -350v-7q0 -26 -24 -26h-121q-19 0 -27 10t-8 19q-6 149 -115 252.5t-260 103.5t-260 -103.5t-115 -252.5q0 -9 -8.5 -19t-27.5 -10h-121q-24 0 -24 26zM685 94q0 37 25.5 65t67.5 28h409q35 0 64.5 -29t29.5 -64q0 -42 -28.5 -68t-65.5 -26h-409 q-43 0 -68 25t-25 69zM1042 1489v217q0 38 27 65t64 27t64 -27t27 -65v-217q0 -37 -26.5 -62t-64.5 -25t-64.5 25t-26.5 62zM1187 409q0 34 29 58t65 24t65 -24t29 -58q0 -42 -28.5 -68t-65.5 -26t-65.5 26t-28.5 68zM1351 94q0 37 26 65t68 28h198q42 0 67.5 -28t25.5 -65 q0 -44 -24.5 -69t-68.5 -25h-198q-43 0 -68.5 25t-25.5 69zM1445 409q0 34 28.5 58t64.5 24h327q35 0 58 -23.5t23 -58.5q0 -43 -22.5 -68.5t-58.5 -25.5h-327q-37 0 -65 26t-28 68zM1631 1248q0 40 24 63l152 156q29 27 63 27q37 0 64 -27t27 -65q0 -39 -26 -65l-156 -152 q-29 -26 -64 -26q-36 0 -60 25.5t-24 63.5zM1872 665q0 37 26 65q27 27 61 27h216q37 0 64.5 -27.5t27.5 -64.5t-27.5 -64t-64.5 -27h-216q-37 0 -62 26.5t-25 64.5z" />
<glyph unicode="&#xf0b7;" horiz-adv-x="2149" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1423 315q0 -83 26 -146.5 t70 -100.5t97 -55t112 -18q82 0 150 27.5t111.5 74t75.5 101.5t48.5 115.5t24 110t7.5 91.5q0 155 -85.5 240t-226.5 85q-79 0 -152.5 -37.5t-131 -104t-92 -166.5t-34.5 -217zM1642 309q0 24 4.5 61.5t17.5 89t32.5 94.5t55 73.5t79.5 30.5t69 -28t25 -84 q0 -154 -53 -261.5t-131 -107.5q-99 0 -99 132z" />
<glyph unicode="&#xf0b8;" horiz-adv-x="1990" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1384 0h263l176 851h-263z" />
<glyph unicode="&#xf0b9;" horiz-adv-x="2165" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1366 0h706l43 202h-392v3 q32 15 92 39t101.5 41t92.5 47t82 61t53 79.5t22 106.5q0 89 -46 149.5t-115 86t-155 25.5q-155 0 -253.5 -83.5t-117.5 -246.5h223q0 59 34.5 100t97.5 41q48 0 72 -25.5t24 -57.5q0 -19 -3.5 -34.5t-16.5 -30t-22.5 -23.5t-36.5 -24t-42.5 -23t-56.5 -27 q-141 -69 -175 -89q-128 -77 -177 -190q-25 -56 -34 -127z" />
<glyph unicode="&#xf0ba;" horiz-adv-x="2145" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1405 249q0 -43 17 -84t53 -79.5 t102.5 -62t155.5 -23.5q193 0 281 77t88 208q0 58 -32.5 106t-84.5 54v2q69 12 114.5 62t45.5 120q0 49 -18 87t-46.5 62t-68.5 39.5t-80.5 21.5t-85.5 6q-148 0 -243 -71.5t-117 -214.5h217q7 49 40.5 76.5t83.5 27.5q46 0 72.5 -19.5t26.5 -53.5q0 -75 -135 -75h-50 l-31 -149h47q109 0 109 -75q0 -50 -36 -77t-88 -27q-61 0 -89 36q-27 34 -22 95h-221q-5 -30 -5 -69z" />
<glyph unicode="&#xf0bb;" horiz-adv-x="2155" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1395 160h381l-34 -165h235l38 165 h108l38 203h-107l96 463h-237l-472 -444zM1635 363l239 236h3l-52 -236h-190z" />
<glyph unicode="&#xf0bc;" horiz-adv-x="2158" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1403 264q-4 -51 12.5 -97.5 t53 -86t104 -63t158.5 -23.5q92 0 163.5 24.5t111.5 60.5t65.5 84t34 87.5t8.5 78.5q0 107 -68.5 172t-176.5 65q-111 0 -155 -46h-2l37 109h368l42 201h-559l-155 -476h213q26 54 118 54q51 0 82 -26.5t31 -79.5q0 -54 -37 -87t-107 -33q-50 0 -78 18q-34 18 -38 64h-226z " />
<glyph unicode="&#xf0bd;" horiz-adv-x="2168" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1439 334q0 -153 80 -246t244 -93 q152 0 250.5 92.5t98.5 243.5q0 103 -71 167.5t-176 64.5q-117 0 -183 -80h-2q53 186 176 186q40 0 62 -15q20 -14 25 -44h225q-2 50 -20.5 90t-47 66t-67 43t-79.5 24t-85 7q-100 0 -179 -38.5t-124.5 -95t-75.5 -128.5t-40.5 -131.5t-10.5 -112.5zM1658 286q0 59 39 89.5 t88 30.5q30 0 51.5 -9t32 -20.5t16.5 -28.5t7 -26.5t1 -20.5q0 -50 -34 -84t-91 -34q-49 0 -79.5 28.5t-30.5 74.5z" />
<glyph unicode="&#xf0be;" horiz-adv-x="2187" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1504 -5h263q42 207 148.5 370.5 t230.5 260.5l41 199h-636l-44 -202h372q-316 -318 -375 -628z" />
<glyph unicode="&#xf0bf;" horiz-adv-x="2153" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1395 233q0 -117 91.5 -177.5 t246.5 -60.5q95 0 168 19t114 47t66.5 66.5t33.5 70.5t8 65q0 66 -38 113.5t-100 60.5l2 3v-1q72 10 119 63.5t47 126.5q0 61 -28 104.5t-76 65.5t-98 31.5t-108 9.5q-76 0 -137 -15t-99 -39.5t-63 -57t-35 -64.5t-10 -66q0 -55 29 -96t80 -57v-3q-90 -10 -151.5 -65.5 t-61.5 -143.5zM1621 257q0 56 45 82t108 26q65 0 94.5 -29.5t29.5 -63.5v-14q0 -45 -40.5 -68t-103.5 -23l3 1q-22 0 -43 3t-43.5 12t-36 28t-13.5 46zM1702 585q0 51 39.5 74t95.5 23q48 0 81.5 -21.5t33.5 -67.5q0 -12 -5 -25t-18 -28.5t-42 -25.5t-70 -10 q-64 0 -89.5 24.5t-25.5 56.5z" />
<glyph unicode="&#xf0c0;" horiz-adv-x="2133" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1406 223q3 -63 30 -109t71.5 -71 t95.5 -36.5t111 -11.5q91 0 165.5 34t120.5 86.5t77.5 120.5t44 131.5t12.5 122.5q0 169 -86.5 259.5t-231.5 90.5q-149 0 -252 -91t-103 -239q0 -106 67.5 -173t173.5 -67q57 0 111.5 23t76.5 58h3q-19 -76 -62 -130t-113 -54q-46 0 -63 11q-20 17 -26 45h-223zM1680 530 q0 50 31 86.5t92 36.5q54 0 82.5 -27.5t28.5 -81.5q0 -15 -6 -33t-19 -38t-39 -33t-60 -13t-57.5 12t-34 30.5t-14.5 33.5t-4 27z" />
<glyph unicode="&#xf0c1;" horiz-adv-x="2545" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1376 6h262l175 847h-261z M1823 317q0 -83 26 -147t70 -101t96.5 -55.5t111.5 -18.5q98 0 175 40t121 99t73 133.5t39 135t10 112.5q0 155 -85 240t-227 85q-165 0 -287.5 -146t-122.5 -377zM2042 307q0 25 4.5 62.5t17.5 89.5t32.5 95.5t55 74t79.5 30.5q43 0 69 -29t26 -84q0 -154 -53.5 -261.5 t-131.5 -107.5q-99 0 -99 130z" />
<glyph unicode="&#xf0c2;" horiz-adv-x="2219" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1384 -5h263l176 852h-263z M1781 -5h262l176 852h-261z" />
<glyph unicode="&#xf0c3;" horiz-adv-x="2563" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1384 -5h263l176 852h-263z M1763 -5h706l43 203h-391v2q32 15 92 39t101 41t92 47t82 61.5t53 80t22 106.5q0 89 -46 149t-115 85t-155 25q-155 0 -253 -83.5t-117 -246.5h221q0 60 35 101t99 41q48 0 71.5 -25.5t23.5 -58.5q0 -52 -35 -81t-133 -77q-6 -2 -9 -4q-142 -68 -176 -88q-127 -76 -176 -186 q-26 -58 -35 -131z" />
<glyph unicode="&#xf0c4;" horiz-adv-x="2708" d="M1 747q0 -38 28 -64q25 -27 64 -27h1005q37 0 62.5 26.5t25.5 64.5q0 37 -25 62.5t-63 25.5h-1005q-38 0 -65 -25.5t-27 -62.5zM37 91q0 -39 27 -64q26 -27 64 -27h1006q38 0 65 27t27 64t-27 62.5t-65 25.5h-1006q-38 0 -64.5 -25.5t-26.5 -62.5zM183 422q0 -38 27 -63 t67 -25h1003q38 0 63 25t25 63q0 40 -25 65.5t-63 25.5h-1003q-40 0 -67 -26t-27 -65zM442 1099q0 38 28 66q28 26 64 26h217q37 0 62 -27t25 -65t-25 -64.5t-62 -26.5h-217q-38 0 -65 27t-27 64zM747 1837q0 36 26 65q31 26 67 26q35 0 63 -26l152 -157q26 -24 26 -63 q0 -38 -25.5 -63.5t-63.5 -25.5q-39 0 -63 26l-156 152q-26 28 -26 66zM1019 1112v7q3 146 79 269.5t203 195t274 71.5q112 0 215 -44.5t177.5 -119t118.5 -177.5t44 -215q0 -150 -74 -277.5t-201 -202t-277 -75.5h-21q-11 0 -19 8t-8 19v130q0 21 23 21h26 q154 1 263.5 111.5t109.5 265.5q0 154 -110.5 263t-266.5 109q-151 0 -260 -104t-115 -253q0 -9 -8 -18.5t-27 -9.5h-122q-24 0 -24 26zM1485 58v212q0 38 26 64t64 26q39 0 65 -26t26 -64v-212q0 -39 -26.5 -66t-64.5 -27t-64 26.5t-26 66.5zM1485 1923v218q0 38 26.5 64.5 t63.5 26.5t64 -27t27 -64v-218q0 -37 -26.5 -61.5t-64.5 -24.5t-64 24.5t-26 61.5zM2073 517q0 37 24 60q24 25 61 25q39 0 64 -25l155 -152q26 -28 26 -65t-26 -63q-64 -50 -128 0l-152 152q-24 27 -24 68zM2073 1682q0 40 24 63l152 157q28 26 63 26q38 0 64.5 -27 t26.5 -64q0 -40 -26 -66l-155 -152q-29 -26 -64 -26q-36 0 -60.5 25.5t-24.5 63.5zM2314 1099q0 37 27 66q26 26 60 26h216q37 0 65 -27.5t28 -64.5t-28 -64t-65 -27h-216q-37 0 -62 26.5t-25 64.5z" />
<glyph unicode="&#xf0c5;" horiz-adv-x="2118" d="M0 65q0 26 18.5 45t43.5 19h43q-34 105 -56 221q-34 176 -34 319q0 274 97 513q98 234 275 401q179 170 416 258q241 92 524 92q170 0 320 -30q151 -35 291 -110l181 -97l-200 -42q-93 -21 -128 -83q-25 -52 3 -118l44 -101l-109 -5q-69 -5 -126 -29q-52 -25 -62 -53 q-17 -36 38 -107l86 -102l-134 -19q-248 -37 -406.5 -102.5t-250.5 -169.5q-90 -100 -133.5 -253t-47.5 -383h561v297l-41 -25q-22 -14 -48.5 -7.5t-39.5 29.5q-14 22 -8.5 48.5t28.5 40.5l407 254l2 2q1 0 1 1h2q2 0 3 1q11 4 24 7h3h3q2 -2 3 -2h1h1h3h1h1q0 -1 2 -1h1h2 l2 -1h1h1q2 -1 2 -3h2q1 0 1 -1q3 0 3 -1q1 0 3 -1l2 -1l407 -251q23 -14 28.5 -41t-8.5 -49q-13 -22 -39.5 -28t-48.5 8l-33 20v-296h102q25 0 42.5 -19t17.5 -45q1 -27 -17 -46t-43 -19h-1968q-26 0 -44 18.5t-18 46.5zM165 669q0 -114 32 -291q24 -130 58 -226h287 q8 232 48 383q56 204 171 330q117 131 308 209q131 55 332 93l-9 27q-16 73 10 131q36 82 137 129q11 5 20 8q-138 32 -277 15q-159 -20 -297 -91q-177 -93 -321 -264q-16 -19 -41 -19q-19 0 -33 11q-16 14 -18.5 36.5t11.5 39.5q160 190 356 291q157 79 335 101 q91 12 178 2t122 -18t48 -13l9 -3q8 49 26 90q25 47 68 85q-48 15 -111 30q-128 28 -287 28q-252 0 -471 -82q-214 -82 -365 -228q-157 -146 -238 -348q-88 -215 -88 -456zM1384 129h414v376l-211 129l-203 -127v-378z" />
<glyph unicode="&#xf0c6;" horiz-adv-x="2080" d="M0 699q0 -25 18 -42.5t43 -17.5h318q23 0 40 14t21 36l96 562l173 -1406q4 -23 20.5 -38t38.5 -15q24 0 41 15t21 38l133 1032l111 -299q6 -18 21.5 -29t34.5 -11h5q19 1 34.5 14t20.5 33l163 732l76 -1406q1 -23 16 -39.5t38 -18.5t41 11t23 35l176 740h296 q25 0 43 17.5t18 42.5t-18 43t-43 18h-344q-21 0 -37.5 -13t-21.5 -33l-89 -378l-77 1426q-1 23 -17 39.5t-38 17.5q-23 2 -41.5 -11.5t-23.5 -36.5l-213 -957l-124 337q-7 19 -25.5 30t-38.5 9q-21 -2 -35.5 -17t-18.5 -36l-105 -801l-163 1339q-4 23 -20 37.5t-38 15.5 q-23 1 -40.5 -13t-21.5 -37l-158 -918h-268q-25 0 -43 -18t-18 -43z" />
<glyph unicode="&#xf0c7;" horiz-adv-x="1628" d="M1 2q0 48 31 81.5t75 33.5v2l1404 -4q10 2 11 2q44 -1 75 -35t30 -82q0 -48 -31 -81t-75 -33v-1l-1391 3q-16 -2 -24 -2q-44 1 -75 34.5t-30 81.5zM89 585q-2 68 17 162q9 48 47 146q4 8 14 30q2 -3 4 -5t2 -3q17 -71 52 -128q33 -52 87 -74q42 -17 117 -19q3 0 8.5 -0.5 t8.5 -0.5q-53 53 -84 107q-48 83 -61 193q-10 86 10 209q4 24 31 108q24 75 68 137q52 78 149 161q59 50 166 114q11 7 37 20q0 -3 -0.5 -5.5t-0.5 -4v-2.5q-39 -92 -52 -185q-10 -84 26 -158q27 -58 98 -123q15 -15 63.5 -61.5t74.5 -72.5l27 -27q42 61 47 144 q7 88 -15 192q0 1 1 12q4 -3 32 -26q89 -80 137 -143q77 -100 113 -186q30 -73 40 -149q9 -68 8 -112q-2 -125 -27 -209q-11 -34 -20 -55q40 11 69 28q40 25 64 70q26 46 41 105q0 2 3 5q1 -3 5 -9.5t5 -10.5q20 -50 29 -103q12 -60 8 -121q-3 -46 -17 -86q-13 -38 -24 -62 q-30 -61 -66 -104q-10 -12 -15 -17h-1171q-2 2 -7 6t-8 7q-43 41 -88 121q-13 24 -31 74q-19 50 -22 111z" />
<glyph unicode="&#xf0c8;" horiz-adv-x="1646" d="M11 -81q-20 44 10 86l149 285q2 6 12 16q7 7 41 31q3 2 73 53q76 52 179 127l192 318q27 44 77 44h75q-26 -30 -48 -64t-41 -91t-19 -114.5t30 -133t94 -148.5q44 -50 53 -99t-11 -89t-63 -78.5t-94 -67t-114 -55.5t-112.5 -43.5t-99.5 -30.5h-301q-26 0 -49 14.5 t-33 39.5zM305 1505q0 74 48.5 132.5t123.5 76.5q18 89 91 147t166 58q90 0 160 -55.5t92 -144.5h15q92 0 160 -57.5t68 -138.5q0 -89 -69 -152q0 -44 -38.5 -99.5t-83.5 -65.5q-10 -49 -46 -83.5t-87 -45.5q24 -26 24 -58q0 -40 -28 -67t-68 -27q-39 0 -67 27.5t-28 66.5 q0 5 2.5 15t2.5 14h-5q-46 0 -80 34t-34 80q0 19 19 57q-38 20 -61 67h-67q-87 8 -148.5 69.5t-61.5 149.5zM797.5 680q-0.5 26 8 57.5t17 50.5t22.5 47.5t20 43.5h40q44 0 70 -34l7 -11l140 -265l496 -558l4 -3q34 -43 9 -94q-24 -49 -80 -49h-600q28 25 46.5 42t48.5 52.5 t45 65.5t25 73.5t1 84t-40 89.5t-86 97t-93.5 93.5t-60 81.5t-30.5 73t-9.5 63z" />
<glyph unicode="&#xf0c9;" horiz-adv-x="1549" d="M7 746q0 157 61.5 300.5t165.5 248t248 166.5t302 62h125q26 -7 26 -30l4 -96q6 -208 150.5 -355.5t349.5 -155.5l91 -7q25 0 25 -25v-108q1 -164 -62 -311h-219q81 119 103 270q-268 56 -429.5 230t-186.5 409q-155 -8 -283.5 -95.5t-199 -221.5t-70.5 -281 q0 -171 89 -311h-226q-64 148 -64 311zM37 105q0 46 30 73q28 28 74 28h281l331 312q16 13 37 0l337 -312h295q43 0 73.5 -29.5t30.5 -71.5q0 -43 -30.5 -74t-73.5 -31h-361q-16 0 -31 8l-257 242l-255 -242q-13 -8 -30 -8h-347q-43 0 -73.5 31t-30.5 74z" />
<glyph unicode="&#xf0ca;" horiz-adv-x="1549" d="M0 746q0 157 61.5 300.5t165.5 248t248 166.5t302 62h125q26 -7 26 -30l5 -96q3 -103 43 -195.5t106.5 -160.5t157.5 -109.5t192 -45.5l91 -7q26 0 26 -25v-108q1 -162 -63 -311h-219q81 119 103 270q-268 56 -429.5 230t-186.5 409q-155 -8 -283.5 -95.5t-199 -221.5 t-70.5 -281q0 -171 89 -311h-226q-64 148 -64 311zM27 103q0 42 32 74q29 29 72 29h343q17 0 30 -8l251 -237l255 237q11 8 31 8h352q43 0 73.5 -30t30.5 -73t-30.5 -73.5t-73.5 -30.5h-286l-334 -303q-20 -14 -36 0l-329 303h-277q-43 0 -73.5 30.5t-30.5 73.5z" />
<glyph unicode="&#xf0cb;" horiz-adv-x="2294" d="M0 979v34q0 16 11 26.5t27 10.5h809q16 0 27 -10.5t11 -26.5v-34q0 -16 -11 -26.5t-27 -10.5h-47v-176h226q4 45 37.5 76t79.5 31t79 -31t37 -76h141v362q-22 1 -37.5 17.5t-15.5 39.5v33q0 23 17.5 40t41.5 17h212q24 0 40.5 -17t16.5 -40v-33q0 -23 -14.5 -39.5 t-36.5 -17.5v-362h166q44 0 75.5 -32t31.5 -76v-312l398 -519h-506v324h-76q17 -42 17 -89q0 -97 -68.5 -166t-165.5 -69t-166 69t-69 166q0 47 17 89h-107q18 -44 18 -89q0 -97 -69.5 -166t-166.5 -69t-165.5 69t-68.5 166q0 47 17 89h-126q19 -47 19 -89q0 -97 -69.5 -166 t-166.5 -69t-166 69t-69 166q0 46 18 90q-39 6 -65 36t-26 70v92h-2v592h-45q-16 0 -27 10.5t-11 26.5zM219 558q0 -34 24 -57.5t58 -23.5h154q34 0 57 23.5t23 57.5v245q0 33 -23.5 56.5t-56.5 23.5h-154q-34 0 -58 -24t-24 -56v-245zM1230 1752q0 -66 50 -111 q0 -32 28 -72.5t60 -46.5q7 -36 33 -60.5t63 -32.5q-17 -17 -17 -42q0 -29 19.5 -48.5t48.5 -19.5t49 20t20 48q0 3 -1.5 10t-1.5 11h3q34 0 58 24.5t24 58.5q0 16 -13 40q28 15 44 50h48q63 5 107.5 49.5t44.5 107.5q0 54 -35 96t-89 55q-13 64 -66 106t-120 42 q-65 0 -115 -40t-66 -104h-12q-66 0 -115 -41.5t-49 -99.5z" />
<glyph unicode="&#xf0cc;" horiz-adv-x="1107" d="M0 -293v1829h110v-1829h-110zM184 746v790l923 -394z" />
<glyph unicode="&#xf0cd;" horiz-adv-x="923" d="M0 -293v1829h110v-1829h-110zM184 -63v790l923 -394zM184 746v790l923 -394z" />
<glyph unicode="&#xf0ce;" horiz-adv-x="1117" d="M0 -293v1829h121v-1829h-121zM206 832v704h912v-704h-912zM458 1046h406v267h-406v-267z" />
<glyph unicode="&#xf0cf;" d="M0 -293v1829h121v-1829h-121zM206 35v704h912v-704h-912zM206 832v704h912v-704h-912zM458 249h406v268h-406v-268zM458 1046h406v267h-406v-267z" />
<glyph unicode="&#xf0d0;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM863 1449q168 -92 275.5 -266.5t107.5 -413.5q0 -502 -352 -675q241 45 401 235t160 440 q0 170 -78 318t-213.5 243.5t-300.5 118.5z" />
<glyph unicode="&#xf0d1;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM830 1453q152 -101 249 -276.5t97 -407.5q0 -492 -327 -682q169 20 307.5 115t218.5 244.5 t80 322.5q0 176 -83 328t-226 246.5t-316 109.5z" />
<glyph unicode="&#xf0d2;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM808 1454q131 -113 214 -288t83 -397q0 -475 -284 -686q131 10 248 68t202 149t134.5 213.5 t49.5 255.5q0 179 -86 333.5t-235 248.5t-326 103z" />
<glyph unicode="&#xf0d3;" horiz-adv-x="1755" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM792 1455q108 -130 175.5 -303t67.5 -383q0 -450 -234 -687q134 6 255 63t208.5 148.5 t139 215.5t51.5 260q0 182 -88.5 337.5t-241 249t-333.5 99.5z" />
<glyph unicode="&#xf0d4;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM779 1455q187 -330 187 -686q0 -426 -181 -687q137 3 261 59t213.5 147.5t142.5 217 t53 263.5q0 184 -90.5 341t-246 249.5t-339.5 95.5z" />
<glyph unicode="&#xf0d5;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM769 1455q126 -363 126 -686q0 -402 -121 -687q138 1 264.5 55.5t217.5 146.5t145 219 t54 266t-54.5 266t-146.5 219t-219 146.5t-266 54.5z" />
<glyph unicode="&#xf0d6;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM755 82h13q140 0 267 54.5t219 146.5t146.5 219t54.5 267q0 139 -54.5 266t-146.5 219 t-219 146.5t-267 54.5h-13v-1373z" />
<glyph unicode="&#xf0d7;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM658 769q0 -390 84 -687h26q140 0 267 54.5t219 146.5t146.5 219t54.5 267q0 139 -54.5 266 t-146.5 219t-219 146.5t-267 54.5h-23q-87 -368 -87 -686z" />
<glyph unicode="&#xf0d8;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM561 769q0 -425 165 -686q15 -1 42 -1q140 0 267 54.5t219 146.5t146.5 219t54.5 267 q0 139 -54.5 266t-146.5 219t-219 146.5t-267 54.5q-24 0 -37 -1q-170 -322 -170 -685z" />
<glyph unicode="&#xf0d9;" d="M0 769q0 208 103 385t280 280t385 103q156 0 298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298.5 61t-245 164t-163.5 245.5t-61 298.5zM464 769q0 -455 239 -684q7 0 20.5 -1t24 -1.5t20.5 -0.5q139 0 266.5 54.5 t219.5 146.5t146.5 219t54.5 267q0 139 -54.5 266t-146.5 219t-219.5 146.5t-266.5 54.5q-37 0 -55 -2q-111 -125 -180 -301.5t-69 -382.5z" />
<glyph unicode="&#xf0da;" d="M0 769q0 157 61 299.5t164 245.5t245.5 164t298.5 61q157 0 299.5 -61t245.5 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245.5t-245.5 -164t-299.5 -61q-156 0 -298.5 61t-245.5 164t-164 245.5t-61 298.5zM368 770q0 -479 304 -681q45 -7 97 -7 q140 0 267 54.5t219.5 146.5t147 219.5t54.5 266.5q0 186 -92.5 344.5t-251 251t-344.5 92.5q-46 0 -81 -4q-143 -109 -231.5 -286.5t-88.5 -396.5z" />
<glyph unicode="&#xf0db;" d="M0 769q0 157 61 299.5t164 245.5t245.5 164t298.5 61q157 0 299.5 -61t245.5 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245.5t-245.5 -164t-299.5 -61q-156 0 -298.5 61t-245.5 164t-164 245.5t-61 298.5zM271 769q0 -487 339 -668q75 -19 159 -19 q140 0 267 54.5t219.5 146.5t147 219.5t54.5 266.5q0 186 -92.5 344.5t-251 251t-344.5 92.5q-70 0 -126 -11q-167 -96 -269.5 -272.5t-102.5 -404.5z" />
<glyph unicode="&#xf0dc;" d="M0 769q0 157 61 299.5t164 245.5t245.5 164t298.5 61q157 0 299.5 -61t245.5 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245.5t-245.5 -164t-299.5 -61q-156 0 -298.5 61t-245.5 164t-164 245.5t-61 298.5zM183 769q0 -80 10 -147t39 -142.5t77 -138.5 t128 -127t189 -117q69 -15 143 -15q140 0 267 54.5t219.5 146.5t147 219.5t54.5 266.5q0 186 -92.5 344.5t-251 251t-344.5 92.5q-87 0 -158 -18q-90 -43 -160 -93.5t-115.5 -105.5t-77 -110.5t-47 -119t-22 -119.5t-6.5 -122z" />
<glyph unicode="&#xf0dd;" d="M0 769q0 157 61 299.5t164 245.5t245.5 164t298.5 61q157 0 299.5 -61t245.5 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245.5t-245.5 -164t-299.5 -61q-156 0 -298.5 61t-245.5 164t-164 245.5t-61 298.5zM82 769q0 -139 54.5 -266.5t146.5 -219.5 t219.5 -146.5t266.5 -54.5q140 0 267 54.5t219.5 146.5t147 219.5t54.5 266.5q0 186 -92.5 344.5t-251 251t-344.5 92.5q-139 0 -266.5 -54.5t-219.5 -147t-146.5 -219.5t-54.5 -267z" />
<glyph unicode="&#xf0de;" d="M0 770q0 209 103.5 385.5t280.5 279t386 102.5t385.5 -102.5t279 -279t102.5 -385.5t-102.5 -386t-279 -280.5t-385.5 -103.5t-386 103.5t-280.5 280.5t-103.5 386zM82 770q0 -139 55 -266.5t147 -219.5t219.5 -147t266.5 -55q88 0 156 19q85 45 148 107t99.5 126.5 t59 143t29.5 146t7 146.5q0 95 -20.5 187t-63.5 182.5t-117.5 170.5t-173.5 136q-41 9 -124 9q-139 0 -266.5 -54t-220 -146t-147 -218.5t-54.5 -266.5z" />
<glyph unicode="&#xf0df;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5q37 0 82 5q95 58 160.5 138.5 t97.5 174.5t44.5 181t12.5 188q0 128 -31.5 248.5t-108.5 238.5t-192 197q-42 2 -65 2q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
<glyph unicode="&#xf0e0;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5q34 0 50 1q80 62 134 144 t80.5 175.5t37 179.5t10.5 187q0 196 -66 378.5t-206 306.5q-13 1 -40 1q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
<glyph unicode="&#xf0e1;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5h26q61 66 102.5 149.5t61.5 176 t28 177t8 184.5q0 193 -50 372.5t-157 313.5h-19q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
<glyph unicode="&#xf0e2;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5q27 0 40 1q79 136 107.5 307 t28.5 379q0 411 -139 685q-11 1 -37 1q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
<glyph unicode="&#xf0e3;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5h26q69 255 69 687 q0 391 -70 686h-25q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
<glyph unicode="&#xf0e4;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5h14v1373h-14q-139 0 -266 -54.5 t-219 -146.5t-146.5 -219t-54.5 -266z" />
<glyph unicode="&#xf0e5;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5h5q-60 273 -60 687 q0 347 62 686h-7q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
<glyph unicode="&#xf0e6;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -139 54 -265.5t145 -218.5t216.5 -147t264.5 -56q-119 253 -119 687 q0 370 123 686q-139 0 -265.5 -55t-218 -147t-146 -218.5t-54.5 -265.5z" />
<glyph unicode="&#xf0e7;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -137 52.5 -262.5t142 -217.5t213.5 -147.5t260 -59.5q-175 238 -175 687 q0 191 47 369t133 317q-184 -3 -338.5 -96t-244.5 -249.5t-90 -340.5z" />
<glyph unicode="&#xf0e8;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -136 51.5 -260t138.5 -215t208 -148t255 -64q-127 122 -178.5 294t-51.5 393 q0 198 63 378.5t175 307.5q-181 -7 -333 -100.5t-240 -249t-88 -336.5z" />
<glyph unicode="&#xf0e9;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -130 47.5 -250t129 -210t194.5 -149.5t240 -73.5q-179 106 -252.5 278t-73.5 405 q0 212 90 394.5t250 289.5q-129 -11 -245 -69.5t-199 -149.5t-132 -212t-49 -253z" />
<glyph unicode="&#xf0ea;" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -254 164.5 -446t411.5 -233q-103 51 -175 124t-111.5 162t-57 184t-17.5 209 q0 216 102 398.5t281 281.5q-167 -21 -303.5 -116t-215.5 -244t-79 -320z" />
<glyph unicode="&#xf0eb;" d="M0 769q0 -209 103 -386t280 -280t386 -103t385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103t-386 -103t-280 -279.5t-103 -385.5z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 181 KiB

Some files were not shown because too many files have changed in this diff Show More