544 Commits
4.1 ... 18.2

Author SHA1 Message Date
Steve Seguin
3e30724e8c Update index.html 2021-06-20 12:33:23 -04:00
Steve Seguin
5e2249c8b9 Update install.md
branding fixes
2021-06-18 17:49:28 -04:00
Steve Seguin
b366469e59 Update install.md
updated to include context isolation, to allow for ffmpeg.js to work:
details:
https://marketplace.zoom.us/docs/sdk/native-sdks/web/advanced/web-isolation
2021-06-18 17:48:05 -04:00
Steve Seguin
a125421357 Merge pull request #877 from steveseguin/update-convert-ui
tweak the /convert UI
2021-06-17 13:20:47 -04:00
Joel Calado
9db09a6278 tweak the /convert UI 2021-06-17 18:03:57 +01:00
Steve Seguin
d87d04a4d4 Merge pull request #874 from steveseguin/18.2-beta
v18.2 beta
2021-06-15 04:54:39 -04:00
Steve Seguin
0154565589 Update IFRAME.md 2021-06-10 12:06:44 -04:00
Steve Seguin
6912a98867 Update IFRAME.md 2021-06-10 12:05:54 -04:00
Steve Seguin
dc26a23ff9 v18.2 beta 2021-06-07 12:51:24 -04:00
Steve Seguin
be28fbde1b Merge pull request #872 from steveseguin/improve-electron-page-GO-button
Add files via upload
2021-06-05 17:44:00 -04:00
Joel Calado
b32d040ea2 Add files via upload 2021-06-05 22:40:51 +01:00
Steve Seguin
4010bd220e Add files via upload 2021-06-05 17:26:11 -04:00
Steve Seguin
b37fcf855d Update README.md 2021-06-04 17:43:38 -04:00
Steve Seguin
d798c6bd14 Update README.md 2021-06-04 17:43:03 -04:00
Steve Seguin
717c3aa7cc Update README.md 2021-06-04 17:39:22 -04:00
Steve Seguin
e424cf3c5c Update README.md 2021-06-02 12:46:05 -04:00
Steve Seguin
36a63f6155 bug fixes + rebrand
- midiin/out issue with indexing fixed
- h264 broadcast support no longer default
- vdo.ninja branding
2021-05-31 15:46:08 -04:00
Steve Seguin
2eff3ef88b Add files via upload 2021-05-31 12:25:41 -04:00
Steve Seguin
5f77aace18 Update README.md 2021-05-31 02:19:48 -04:00
Steve Seguin
d10a08e84f Update README.md 2021-05-31 02:15:43 -04:00
Steve Seguin
c30e282c1b Update README.md 2021-05-31 02:10:42 -04:00
Steve Seguin
05d6f3d0ee Update README.md 2021-05-31 02:10:28 -04:00
Steve Seguin
d8f897b974 Update README.md 2021-05-31 02:09:13 -04:00
Steve Seguin
0a5e820801 Update README.md 2021-05-31 02:08:37 -04:00
Steve Seguin
0b8e809b2f Update README.md 2021-05-31 02:05:55 -04:00
Steve Seguin
ad79f8c452 Update README.md 2021-05-31 02:05:45 -04:00
Steve Seguin
3f7bb89b5d Update README.md 2021-05-31 02:05:19 -04:00
Steve Seguin
ef4c2e5d77 Update README.md 2021-05-31 02:05:13 -04:00
Steve Seguin
1d9da2b08e Merge pull request #871 from steveseguin/generated_translations
[OBSNinja Bot] Updated translations
2021-05-30 22:06:04 -04:00
steveseguin
b0a55bf225 Generated updated translations 2021-05-31 02:04:54 +00:00
Steve Seguin
db04376a68 Merge pull request #870 from steveseguin/v18.beta
version 18.1
2021-05-30 22:04:32 -04:00
Steve Seguin
c701bd4f8f Merge branch 'master' into v18.beta 2021-05-30 22:03:17 -04:00
Steve Seguin
77df3a2ff1 Add files via upload
Pre-release Version 18
2021-05-30 21:55:20 -04:00
Steve Seguin
ba56f40ba5 Add files via upload
more bug fixes, etc
2021-05-23 14:58:21 -04:00
Steve Seguin
d1c980f309 Add files via upload 2021-05-17 19:50:05 -04:00
Steve Seguin
27c7d5c43b Add files via upload 2021-05-17 19:49:52 -04:00
Steve Seguin
56806a2186 Add files via upload 2021-05-17 17:58:17 -04:00
Steve Seguin
e2e56e5f4b Add files via upload 2021-05-14 10:42:04 -04:00
Steve Seguin
321f366c6b Add files via upload 2021-05-14 10:24:27 -04:00
Steve Seguin
93a1813fda Update README.md 2021-05-13 05:21:52 -04:00
Steve Seguin
4adf5fbe2d Merge pull request #867 from steveseguin/v17.2.99999
V17.2.99999
2021-05-13 05:15:14 -04:00
Steve Seguin
cee772d031 Delete changepass.html 2021-05-13 05:12:17 -04:00
Steve Seguin
15030fe123 Add files via upload 2021-05-13 05:10:55 -04:00
Steve Seguin
0b064f7c69 I don't like spaces afterall 2021-05-13 05:06:15 -04:00
Steve Seguin
6f6c7c3d97 Add files via upload 2021-05-13 05:03:45 -04:00
Steve Seguin
06078ecd2b Update index.html 2021-05-13 05:01:06 -04:00
Steve Seguin
f1d60678c4 Update index.html 2021-05-13 04:30:33 -04:00
Steve Seguin
8624f5bd67 Add files via upload 2021-05-13 04:07:17 -04:00
Steve Seguin
3882583d6c Update electron.html 2021-05-13 03:15:17 -04:00
Steve Seguin
d66a44e57c Update electron.html 2021-05-13 02:50:43 -04:00
Steve Seguin
8cbd26e34b Update electron.html 2021-05-13 02:41:10 -04:00
Steve Seguin
98c293d436 Merge pull request #866 from jcalado/master
electron.html - remember last 5 used urls
2021-05-12 17:43:35 -04:00
Joel Calado
14cf419e31 last 5 urls instead of last url 2021-05-12 22:34:46 +01:00
Joel Calado
74670f5dd0 remember last used url 2021-05-12 21:11:58 +01:00
Steve Seguin
58e07f58d9 Merge pull request #865 from jcalado/master
overhaul of the electron capture UI
2021-05-12 14:25:12 -04:00
Joel Calado
bc5fd78196 overhaul of the electron capture UI 2021-05-12 19:19:43 +01:00
Steve Seguin
612949ba64 Merge pull request #864 from Jumper78/fix/link-to-advanced-settings
correct link to advanced documentation
2021-05-12 07:20:10 -04:00
Jumper78
2bf59f0c2a correct link to advanced documentation
the link to advanced documentation has pointed to a non-existing page; I pointed it to: https://docs.obs.ninja/advanced-settings
2021-05-12 13:13:08 +02:00
Steve Seguin
495f508919 Update README.md 2021-05-07 04:16:45 -04:00
Steve Seguin
e8354f45c0 Add files via upload 2021-05-06 08:34:43 -04:00
Steve Seguin
2de7c38d7f Merge pull request #855 from duncanbarnes/master
iFrame styling in CSS not JS
2021-05-05 07:24:53 -04:00
Duncan Barnes
2be4038885 iFrame styling in CSS not JS
Small change, moved iframe styling to CSS, allows &css param to override iframe styling without requiring !important on the end of values.
2021-05-05 12:19:48 +01:00
Steve Seguin
b92af980fb Update update-advanced-settings-toc.yml 2021-05-04 07:39:44 -04:00
Steve Seguin
f734d63118 Update update-advanced-settings-toc.yml 2021-05-04 07:36:30 -04:00
Steve Seguin
3859cb2762 Fires every Feb 31st now 2021-05-04 07:34:44 -04:00
Steve Seguin
9600693001 May the fourth be with you 2021-05-04 04:02:53 -04:00
Steve Seguin
8934838954 Merge pull request #853 from steveseguin/jcalado-patch-1
fix typo
2021-05-02 03:28:19 -04:00
Joel Calado
e5f203e178 fix typo 2021-05-02 08:25:36 +01:00
Steve Seguin
3890f28ede on-air tweaks, &tbr for director, +minor features 2021-05-01 12:34:02 -04:00
Steve Seguin
e4e9398853 Add files via upload 2021-04-29 03:04:48 -04:00
Steve Seguin
a296ba8417 Update main.js 2021-04-26 02:37:52 -04:00
Steve Seguin
a843d3d04d Version 17.2
More bug fixes; &optimize command logic made more visible

I may do a v17.3 within the next week and a few more iterations after that, before working on v18
2021-04-25 21:27:19 -04:00
Steve Seguin
bb1061f22f Merge pull request #844 from steveseguin/generated_translations
[OBSNinja Bot] Updated translations
2021-04-23 03:15:09 -04:00
steveseguin
29458e4a87 Generated updated translations 2021-04-23 07:13:23 +00:00
Steve Seguin
ce97e74bea Merge pull request #835 from steveseguin/steves-dev-branch
Version 17.1
2021-04-23 03:12:57 -04:00
Steve Seguin
98f058594e Delete tflite.js 2021-04-23 03:06:11 -04:00
Steve Seguin
8337a8548d Add files via upload 2021-04-23 03:05:54 -04:00
Steve Seguin
be3bb3e532 Add files via upload 2021-04-23 03:04:41 -04:00
Steve Seguin
82214cbb9d Update README.md 2021-04-22 20:58:35 -04:00
Steve Seguin
6ab5a338af Merge pull request #840 from steveseguin/auto-update-advanced-settings-toc
Create update-advanced-settings-toc.yml
2021-04-22 03:29:13 -04:00
Joel Calado
bd9d707434 Create update-advanced-settings-toc.yml 2021-04-22 08:25:26 +01:00
Steve Seguin
bc6f4f08fc v17.0.1 2021-04-20 18:52:27 -04:00
Steve Seguin
28847040f7 Update IFRAME.md 2021-04-20 04:11:20 -04:00
Steve Seguin
5ab89d61b3 Update IFRAME.md 2021-04-20 04:11:06 -04:00
Steve Seguin
d059757f35 Add files via upload 2021-04-19 05:33:55 -04:00
Steve Seguin
cae33a0b92 Delete bg_sample2.jpg 2021-04-19 05:33:33 -04:00
Steve Seguin
05d5cd1a00 Delete bg_sample.jpg 2021-04-19 05:33:28 -04:00
Steve Seguin
137112242f Add files via upload 2021-04-19 05:33:18 -04:00
Steve Seguin
2ac3ff7242 Merge branch 'master' into steves-dev-branch 2021-04-19 05:30:21 -04:00
Steve Seguin
56a007725d Add files via upload 2021-04-19 05:11:49 -04:00
Steve Seguin
6f3b869c6e Add files via upload 2021-04-19 02:44:02 -04:00
Steve Seguin
71dac482d4 adblocker issue fix
&ad to &audiodevice for iframe
2021-04-15 15:25:16 -04:00
Steve Seguin
ab4582cc46 Update blank.json 2021-04-15 12:23:38 -04:00
Steve Seguin
4a57a86b53 Add files via upload
&nvb and &nmb added
2021-04-14 17:12:42 -04:00
Steve Seguin
1086848f78 Add files via upload
Support for Electron Capture 1.5.0 screen-capture
2021-04-14 04:26:51 -04:00
Steve Seguin
e91aba28bd bug fixes + moved 2600 lines of code to main.js
electron app will also warn an error now if screen-sharing via this version
consolidated the statistics overlay UI code
mixing code moved, along with new track logic and more.
2021-04-13 03:00:07 -04:00
Steve Seguin
7736e3fb6f syncing with the beta pre-release of v17
language files need some work, but I think the files are all there otherwise.
2021-04-12 02:29:35 -04:00
Steve Seguin
8f292cf7d2 Merge pull request #823 from jcalado/digital-effects-translations
Translation keys for digital video effects options
2021-04-07 20:20:41 -04:00
Steve Seguin
4a1213781d Merge pull request #824 from jcalado/settings-popup-ui-tweaks
consistent titles; improved spacing
2021-04-07 20:20:25 -04:00
Joel Calado
56f46bcd77 consistent titles; improved spacing
- Video source menu title was different from all others
- Create some space around the title so things don't look so crowded
- Made the title font bold
2021-04-05 11:12:37 +01:00
Joel Calado
d7e2b1dc3d Update index.html 2021-04-05 11:06:45 +01:00
Steve Seguin
e926196bcc Merge pull request #820 from steveseguin/generated_translations
[OBSNinja Bot] Updated translations
2021-04-03 13:15:37 -04:00
steveseguin
a48986b618 Generated updated translations 2021-04-03 17:14:01 +00:00
Steve Seguin
35fdd27f42 Merge pull request #817 from filiptronicek/patch-1
More style for CONTRIBUTING.md
2021-04-03 13:13:57 -04:00
Steve Seguin
7692623d90 Merge pull request #818 from steveseguin/jcalado-patch-1
add Ukrainian to the language picker
2021-04-03 13:13:36 -04:00
Filip Troníček
f640a9a16f Important notice <h2> 2021-04-01 15:44:31 +02:00
Filip Troníček
1b69686288 Change heading level 2021-04-01 15:43:23 +02:00
Joel Calado
da63ec44fe add Ukrainian to the language picker 2021-04-01 13:44:54 +01:00
Joel Calado
38162971ed Merge pull request #816 from Arteboy/ukrainian_translation
Ukrainian translation
2021-04-01 13:40:54 +01:00
Filip Troníček
7bd12cc4a4 More style for CONTRIBUTING.md
Add some features like headings and bold text for better readability.
2021-04-01 11:32:27 +02:00
Arteboy
53ea3ac18c Update translate.js 2021-04-01 12:20:34 +03:00
Arteboy
c0bb8b5cad Rename ukr.json to uk.json 2021-04-01 12:18:58 +03:00
Arteboy
a8d2bd9c0c Add files via upload
Ukrainian translation
2021-04-01 11:59:19 +03:00
Steve Seguin
6b3f538da3 Merge pull request #814 from jcalado/share-website-tips
share website tips on the new .message-card
2021-03-31 10:52:54 -04:00
Joel Calado
dd13c46be9 share website tips on the new .message-card 2021-03-31 14:57:39 +01:00
Steve Seguin
47d69c1b40 Merge pull request #812 from steveseguin/master
merging master with my dev branch
2021-03-31 00:47:56 -04:00
Steve Seguin
c4280b6c1d Add files via upload 2021-03-31 00:46:20 -04:00
Steve Seguin
1511de0277 Merge pull request #810 from steveseguin/jcalado-patch-1
Update pt.json
2021-03-28 19:41:09 -04:00
Joel Calado
4fcdd805a2 Update pt.json 2021-03-29 00:39:13 +01:00
Joel Calado
bfb05c7581 Merge pull request #809 from jcalado/translation-updates
update translation files
2021-03-29 00:20:04 +01:00
Joel Calado
33b2340eac Merge branch 'master' into translation-updates 2021-03-29 00:19:39 +01:00
Joel Calado
a00a6af494 update translation files 2021-03-29 00:15:24 +01:00
Steve Seguin
cd6983d75a Merge pull request #807 from jcalado/panels
message cards for info, warnings; use them on &fs
2021-03-28 19:06:46 -04:00
Steve Seguin
5b70d31844 Merge pull request #808 from jcalado/pt-translation-update
Update pt.json
2021-03-28 19:06:37 -04:00
Joel Calado
36b25b7ab7 Update pt.json 2021-03-29 00:05:03 +01:00
Joel Calado
dcd3a35682 message cards for info, warnings; use them on &fs 2021-03-28 18:06:52 +01:00
Steve Seguin
8a13af5a1b Update README.md 2021-03-28 10:47:36 -04:00
Steve Seguin
7bf4fb7b8a Update README.md 2021-03-28 10:44:07 -04:00
Steve Seguin
c0f8ba75d0 Merge pull request #806 from filiptronicek/patch-1
Update README for markdown constistency
2021-03-28 10:40:43 -04:00
Filip Troníček
20d209e222 Update README for markdown constistency
- Updated some <h4> that were direct children of <h2>s to <h3>
- Removed some unnecessary question marks and other symbols (for it to be consistent everywhere)
2021-03-28 16:39:35 +02:00
Steve Seguin
bb84c95662 Update ci-generateTranslations.js 2021-03-28 10:14:59 -04:00
Steve Seguin
afad412936 Merge pull request #805 from jcalado/screenshare-audio-css
screenshare audio selector panel tweaks
2021-03-28 10:07:30 -04:00
Joel Calado
fa7fa50d26 screenshare audio selector panel tweaks
- extract inline styles to main.css
- The audio selector panel is now similar to the one from the video camera sharing section
2021-03-28 15:05:33 +01:00
Steve Seguin
48977fe737 Merge pull request #804 from steveseguin/arrows-patch-1
Update ci-generateTranslations.js
2021-03-27 17:44:33 -04:00
Steve Seguin
de99499e30 Merge pull request #803 from steveseguin/generated_translations
[OBSNinja Bot] Updated translations
2021-03-27 17:36:50 -04:00
Steve Seguin
77c401f9c9 Update ci-generateTranslations.js
based on filiptronicek's feedback
2021-03-27 17:35:22 -04:00
steveseguin
1d04fbc474 Generated updated translations 2021-03-27 21:17:23 +00:00
Steve Seguin
9190a4584e Merge pull request #801 from jcalado/master
move "gowebcam" enabled styles over to css
2021-03-27 17:16:57 -04:00
Joel Calado
22f34d6b1e less verbose functions, safer for loop 2021-03-27 21:10:55 +00:00
Joel Calado
b973e16396 missing catches; format code 2021-03-27 21:03:47 +00:00
Joel Calado
66559c72b7 what a mess... 2021-03-27 20:52:07 +00:00
Joel Calado
b25614bd5f Update update_translations.yml 2021-03-27 20:51:14 +00:00
Joel Calado
57ec0db1eb typo 2021-03-27 20:47:51 +00:00
Joel Calado
b113d53f15 Update ci-generateTranslations.js 2021-03-27 19:39:27 +00:00
Joel Calado
2cb96bb133 Update ci-generateTranslations.js
pull from the repo
2021-03-27 19:32:51 +00:00
Joel Calado
4992858414 Update ci-generateTranslations.js 2021-03-27 19:10:41 +00:00
Joel Calado
f43f79a6cd Update ci-generateTranslations.js 2021-03-27 19:07:46 +00:00
Joel Calado
6284b38694 Update and rename main.yml to update_translations.yml 2021-03-27 19:07:31 +00:00
Joel Calado
e69c5502b2 Update .gitignore 2021-03-27 18:58:04 +00:00
Joel Calado
bf3c1ee97c Update main.yml 2021-03-27 18:57:30 +00:00
Joel Calado
0dbecf021d Merge branch 'master' of https://github.com/jcalado/obsninja 2021-03-27 18:54:47 +00:00
Joel Calado
0573bb9191 Create .gitignore 2021-03-27 18:52:12 +00:00
Joel Calado
a09d86d79e Update main.yml 2021-03-27 18:50:08 +00:00
Joel Calado
d1a2cc89f5 Update main.yml 2021-03-27 18:48:34 +00:00
Joel Calado
fc48814111 Create requirements.txt 2021-03-27 18:48:24 +00:00
Joel Calado
c7bb3f8acf move script 2021-03-27 18:45:32 +00:00
Joel Calado
e91d972753 Create main.yml 2021-03-27 18:45:14 +00:00
Joel Calado
ab1b0f2aa0 Create ci-generateTranslations.js 2021-03-27 18:38:49 +00:00
Joel Calado
59d3b0f0fb move "gowebcam" enabled styles over to css 2021-03-27 09:06:06 +00:00
Steve Seguin
1eb2f50605 Merge pull request #795 from jcalado/master
automatic language priority
2021-03-24 17:32:36 -04:00
Joel Calado
a51d43777a automatic language priority 2021-03-24 21:27:49 +00:00
Steve Seguin
cf4959c6db Merge pull request #791 from jcalado/master
Hotkey: Alt-Shift-C to toggle control bar
2021-03-24 09:51:16 -04:00
Joel Calado
68923a2462 alt+shift+c to toggle the control bar 2021-03-23 22:27:31 +00:00
Steve Seguin
055c4652ae Update README.md 2021-03-19 16:55:29 -04:00
Steve Seguin
791aaf497e just syncing up a bit of mid-dev code
THIS IS NOT FOR RELEASE YET
2021-03-16 08:50:27 -04:00
Steve Seguin
f886e485db Add files via upload 2021-03-03 01:38:33 -05:00
Steve Seguin
6b56b5ea33 Merge pull request #775 from steveseguin/v16-beta
V16.4 Release
2021-03-03 01:34:20 -05:00
Steve Seguin
41e1b4dc02 v16.4 update 2021-03-03 01:32:41 -05:00
Steve Seguin
a22388a24b Add files via upload 2021-03-01 04:15:39 -05:00
Steve Seguin
10ef9193b0 Merge pull request #762 from steveseguin/master
sync jcalado changes with my own
2021-02-26 21:41:11 -05:00
Steve Seguin
554af144f2 Add files via upload 2021-02-26 21:38:58 -05:00
Steve Seguin
36ae6c0f1e Update install.md 2021-02-25 01:29:31 -05:00
Steve Seguin
b949986182 Merge pull request #745 from jcalado/alert-modal
alert modal
2021-02-24 05:37:12 -05:00
Steve Seguin
b36b52ad8b Merge pull request #746 from steveseguin/v16-beta
V16 Release
2021-02-24 05:34:55 -05:00
Steve Seguin
de4f981455 v16.3 2021-02-24 05:33:44 -05:00
Joel Calado
eae305913f alert modal 2021-02-24 08:45:46 +00:00
Steve Seguin
14c13b02de Merge pull request #742 from jcalado/offline-notification
"no network connection" alert
2021-02-23 17:54:12 -05:00
Joel Calado
5bb7bbdd5c respect cleanOutput
if cleanOutput is set don't alert. Log to console instead.
2021-02-23 22:52:55 +00:00
Joel Calado
ea1895c129 "no network connection" alert 2021-02-23 22:34:59 +00:00
Steve Seguin
80295a7a9a Merge pull request #741 from TychoWerner/patch-1
Updated a couple of translations for the Dutch language
2021-02-23 16:21:42 -05:00
TychoWerner
ec1ec458aa More changes :) 2021-02-23 22:18:03 +01:00
TychoWerner
6b6e2b5a3f Updated a couple of translations for the Dutch language 2021-02-23 22:05:30 +01:00
Steve Seguin
a67e585eb1 v16.3 preflight 2021-02-22 17:01:19 -05:00
Steve Seguin
c6690fcdac Merge pull request #723 from filiptronicek/master
Typo
2021-02-17 22:39:12 -05:00
Steve Seguin
1f2c193956 Merge pull request #724 from theprincy/patch-7
Update it.json
2021-02-17 22:38:29 -05:00
Notelseit.com
1ba4d61486 Update it.json 2021-02-17 21:24:45 +01:00
Filip Troníček
e1f7ccacfe Fix seconary -> secondary 2021-02-17 09:55:35 +00:00
Steve Seguin
e366bdfa4c Merge pull request #722 from steveseguin/master
beginnings of v16.3; merging master.
2021-02-16 19:07:30 -05:00
Steve Seguin
62292e71ea Add files via upload 2021-02-16 19:04:01 -05:00
Steve Seguin
06379c1f1f Add files via upload 2021-02-16 19:03:51 -05:00
Steve Seguin
b471096842 Update install.md 2021-02-10 12:16:42 -05:00
Steve Seguin
85b336bafd Update README.md 2021-02-10 12:11:43 -05:00
Steve Seguin
fae0b094ac Update README.md 2021-02-10 10:54:52 -05:00
Joel Calado
a028a753e8 Merge pull request #714 from filiptronicek/patch-1
Add Wiki links to the README
2021-02-10 09:50:53 +00:00
Filip Troníček
a24e5ae667 Add Wiki links to the README
Just update the README with more hyperlinks. It's more convenient
2021-02-10 10:43:57 +01:00
Joel Calado
0f7b09526d Merge pull request #711 from steveseguin/fix_devices
Fix /devices multiple video inputs bug
2021-02-08 21:23:23 +00:00
Joel Calado
f335813c5e Update devices.html
fixes a bug where you could select multiple video devices

changes from device-id strings to sanitized device names
2021-02-08 21:16:14 +00:00
Joel Calado
f62f31329d Update devices.html
sanitize device names function
2021-02-08 21:15:17 +00:00
Joel Calado
cbc7971fa5 Update devices.html 2021-02-08 21:14:47 +00:00
Joel Calado
838acf07ac Update devices.html
change text
2021-02-08 21:14:41 +00:00
Joel Calado
864969ebae Update devices.html
add some tips to the top notice
2021-02-08 21:14:21 +00:00
Joel Calado
474e142908 tweak /devices CSS 2021-02-08 21:13:51 +00:00
Joel Calado
e5a7b29a46 Merge pull request #707 from filiptronicek/devices-refactor
Devices refactor
2021-02-08 17:58:19 +00:00
Filip Troníček
9cc109c254 Update target because of the arrow function 2021-02-08 17:21:40 +01:00
Filip Troníček
8338573c10 Template string output 2021-02-08 17:19:28 +01:00
Filip Troníček
46b00b1ce1 First ES6 refactor
- Eqeqeq
- const and let
- arrow functions
2021-02-08 17:14:27 +01:00
Steve Seguin
d2dd662d10 Merge pull request #703 from filiptronicek/patch-1
Add hyperlink to turnserver
2021-02-08 11:07:25 -05:00
Steve Seguin
c89fcc0064 Merge pull request #704 from filiptronicek/patch-2
Add comments to the commands
2021-02-08 11:07:13 -05:00
Steve Seguin
8d24e23232 Merge pull request #705 from filiptronicek/patch-3
JS syntax highlighting
2021-02-08 11:07:00 -05:00
Steve Seguin
474155e0d9 Merge pull request #706 from filiptronicek/patch-4
Update link style in License
2021-02-08 11:06:16 -05:00
Steve Seguin
166f933953 Merge pull request #694 from duncanbarnes/master
Feature: &rooms
2021-02-08 11:05:33 -05:00
Filip Troníček
43aa080bce Update link style in License
The license contains a link, which links to the raw file with no markdown features at all, I think if it is markdown, it should be displayed as such.
2021-02-08 16:52:28 +01:00
Filip Troníček
4e273219f8 Format the JS and comment a plaintext comment 2021-02-08 15:57:02 +01:00
Filip Troníček
1c3d45ae6f Const -> let because of re-declaration issues 2021-02-08 15:55:26 +01:00
Filip Troníček
c7a801c0e0 Template strings 2021-02-08 15:52:27 +01:00
Filip Troníček
8c4c1cd040 Arrow functions as onclick handlers 2021-02-08 15:52:15 +01:00
Filip Troníček
c487bed906 Invalid assignment to const 2021-02-08 15:45:46 +01:00
Filip Troníček
e762910907 Eqeqeq 2021-02-08 15:44:40 +01:00
Filip Troníček
f0cfa1effd Format IFRAME.md 2021-02-08 15:44:04 +01:00
Filip Troníček
8ee5be2960 Var -> const 2021-02-08 15:43:13 +01:00
Filip Troníček
1934097875 JS syntax highlighting
- add syntax highlighting in IFRAME.md
- update syntax to ES6
2021-02-08 15:40:48 +01:00
Filip Troníček
4e922c13aa Fix the incorrect placement of UDP and TCP 2021-02-08 10:55:27 +01:00
Filip Troníček
17403d816b Add comments to the commands
Add some explanations for the commands so that the user is better aware of what he is currently running.
2021-02-08 10:38:08 +01:00
Filip Troníček
944e619f0a Add hyperlink to turnserver 2021-02-08 10:12:30 +01:00
Duncan Barnes
d6d4d93dab Feature: &rooms
Permits a list of rooms to be defined for room transfer operations. Buttons are added to the control bar, when selected and a transfer button is pushed the user will be transfered straight to that room rather than the room name having to be entered.
2021-02-06 17:32:31 +00:00
Steve Seguin
5c7648d86a Create turnserver3.conf 2021-02-04 11:11:46 -05:00
Steve Seguin
c28ecebc13 Merge pull request #686 from steveseguin/v16-beta
V16.3
2021-02-03 11:17:29 -05:00
Steve Seguin
28a79b20b7 v16.3 release? 2021-02-03 11:16:35 -05:00
Steve Seguin
9172ebade1 Add files via upload 2021-02-01 09:58:31 -05:00
Steve Seguin
c4aed40be6 v16.0 2021-01-30 09:40:34 -05:00
Steve Seguin
1927b84d25 Merge pull request #676 from steveseguin/steveseguin-patch-1
Update nl.json
2021-01-27 17:29:55 -05:00
Steve Seguin
b6b39b893f Update nl.json 2021-01-27 17:29:08 -05:00
Steve Seguin
1f408e645f Merge pull request #675 from SilverServerT/master
Update nl.json
2021-01-27 17:04:45 -05:00
SilverServerT
eee79d2ef9 Update nl.json 2021-01-27 22:57:28 +01:00
Steve Seguin
abe5028458 Update README.md 2021-01-27 10:42:11 -05:00
Steve Seguin
09e1111be3 Update README.md 2021-01-27 10:40:54 -05:00
Steve Seguin
c2b8b1769d Delete videojs-vr.js 2021-01-27 10:38:35 -05:00
Steve Seguin
7c9ba6fd12 Delete video.js 2021-01-27 10:38:27 -05:00
Steve Seguin
f50ca54b32 Delete adapter-latest.js
using a smaller version instead
2021-01-27 10:38:13 -05:00
Steve Seguin
a4edbf1a18 Delete jquery.min.js
begone vile beast
2021-01-27 10:37:56 -05:00
Steve Seguin
308664fdc2 Delete tone.ogg
moved to media
2021-01-27 10:37:18 -05:00
Steve Seguin
8c68737501 Delete tone.mp3
moved to media
2021-01-27 10:37:08 -05:00
Steve Seguin
50e50c4d1b Delete cap.webm
moved to media
2021-01-27 10:36:57 -05:00
Steve Seguin
f05efc5288 Delete animations.js
migrated all the code away from jquery
2021-01-27 10:36:40 -05:00
Steve Seguin
a6b500bfa8 Delete images directory
deleting the right directory for once.  not enough coffeeeeee
2021-01-27 10:36:10 -05:00
Steve Seguin
32f4527784 Add files via upload 2021-01-27 10:35:42 -05:00
Steve Seguin
d45584c444 Delete favicon-16x16.png 2021-01-27 10:34:50 -05:00
Steve Seguin
70d83b35a7 Delete cap.webm 2021-01-27 10:30:02 -05:00
Steve Seguin
5198817371 Delete tone.mp3 2021-01-27 10:29:48 -05:00
Steve Seguin
d483b8ca3a Delete tone.ogg 2021-01-27 10:29:42 -05:00
Steve Seguin
a6c903fe1a Add files via upload 2021-01-27 10:29:23 -05:00
Steve Seguin
4a203a1e60 Add files via upload 2021-01-27 10:27:45 -05:00
Steve Seguin
c9849849a5 Merge pull request #674 from steveseguin/version-v15.1
Version v15.1
2021-01-27 10:16:36 -05:00
Steve Seguin
705c8028a1 Add files via upload 2021-01-27 10:13:18 -05:00
Steve Seguin
4618426724 Update animations.js 2021-01-27 10:07:46 -05:00
Steve Seguin
5b86a4f906 version v15.1 2021-01-27 10:05:42 -05:00
Joel Calado
2d0908f326 Merge pull request #673 from digisomni/patch-1
Fix typo in index.html
2021-01-27 10:10:27 +00:00
Kalila
843c49fa20 Update index.html
Fix extra "
2021-01-27 01:01:03 -05:00
Steve Seguin
e4d6862d9f Update animations.js 2021-01-21 07:20:21 -05:00
Steve Seguin
5538afdd71 Update animations.js
updating code to align with css; 220px is old.
2021-01-21 07:19:54 -05:00
Steve Seguin
e34b68a573 Merge pull request #671 from filiptronicek/master
Refactor animation code
2021-01-21 07:18:15 -05:00
Filip Troníček
0af23bf6de Break 2021-01-20 17:54:16 +01:00
Filip Troníček
8819b2fe95 Eqeqeq
https://eslint.org/docs/rules/eqeqeq
2021-01-20 17:52:36 +01:00
Filip Troníček
0913cc204d Unnecesary spaces 2021-01-20 17:51:28 +01:00
Filip Troníček
e31571e508 Rewrite style injection as a template string 2021-01-20 17:50:43 +01:00
Filip Troníček
a26cd7a1c9 Unused events as _e 2021-01-20 17:46:33 +01:00
Filip Troníček
e412f486bd var =>const 2021-01-20 17:46:11 +01:00
Filip Troníček
547a914a59 Template strings and const 2021-01-20 17:44:55 +01:00
Filip Troníček
89b651bb89 Simple code changes in animations.js
- delete double semicolons
- Convert anonymous functions to arrow functions where possible
2021-01-20 17:42:42 +01:00
Steve Seguin
b0b992c3a9 Add files via upload 2021-01-20 11:27:21 -05:00
Steve Seguin
d7117cede1 Merge pull request #670 from steveseguin/14.0-alpha
Version 14 release
2021-01-20 11:22:38 -05:00
Steve Seguin
ec4940b139 Merge branch 'master' into 14.0-alpha 2021-01-20 11:19:31 -05:00
Steve Seguin
dda1c48b00 Add files via upload 2021-01-20 11:10:34 -05:00
Steve Seguin
94e6380081 v14 release version 2021-01-20 11:00:56 -05:00
Steve Seguin
7f46ea944d Update install.md 2021-01-20 03:15:22 -05:00
Steve Seguin
217b9e102b Update install.md 2021-01-18 05:18:40 -05:00
Steve Seguin
11e7f6162d Update install.md 2021-01-18 05:02:19 -05:00
Steve Seguin
986675a747 Update install.md 2021-01-18 05:01:29 -05:00
Steve Seguin
c75e641c3a Update install.md 2021-01-18 05:01:02 -05:00
Steve Seguin
bf3a576507 Update install.md 2021-01-18 04:56:26 -05:00
Steve Seguin
423081ba4f Merge pull request #662 from steveseguin/revert-661-jcalado-patch-1
Revert "Update pt.json"
2021-01-17 10:32:51 -05:00
Steve Seguin
e965aacedf Revert "Update pt.json" 2021-01-17 10:32:10 -05:00
Steve Seguin
980afc35cb Merge pull request #661 from steveseguin/jcalado-patch-1
Update pt.json
2021-01-17 10:28:11 -05:00
Joel Calado
a74a128227 Update pt.json 2021-01-17 15:27:30 +00:00
Steve Seguin
b9e556908c Merge pull request #658 from steveseguin/chrismarquardt-langauge-patch-1
Some minor updates for the German translation
2021-01-17 00:09:45 -05:00
chrismarquardt
614d8fcf51 Some minor updates for the German translation 2021-01-17 01:16:55 +01:00
Steve Seguin
5fd0facefb Update README.md 2021-01-13 01:03:08 -05:00
Steve Seguin
20d9339c14 Update main.js 2021-01-13 01:01:41 -05:00
Steve Seguin
7ef903d6b5 Update README.md 2021-01-13 00:59:24 -05:00
Steve Seguin
43c5e89c2d Merge pull request #645 from 0xflotus/patch-1
fix: small error
2020-12-30 15:08:50 -05:00
0xflotus
98270abc37 fix: small error 2020-12-30 18:49:18 +01:00
Steve Seguin
7e96ef72a3 Update README.md 2020-12-21 23:59:11 -05:00
Steve Seguin
a0e765fa4d Merge pull request #599 from filiptronicek/14.0-alpha
Convert animations.js to ES6
2020-12-11 12:02:14 -05:00
Filip Troníček
4f8d2c2d38 Remove extra semicolons 2020-12-11 17:55:33 +01:00
Filip Troníček
78b7b9cba9 Format animations.js 2020-12-11 17:54:38 +01:00
Filip Troníček
26288e685a Rename e to er due to IE8 overwriting it
Nobody will use OBS.ninja in IE8 but who knows...
2020-12-11 17:54:17 +01:00
Filip Troníček
b25632188a Template string 2020-12-11 17:53:42 +01:00
Filip Troníček
f7adb67e3e ES6 conversion 2020-12-11 17:53:33 +01:00
STeve Seguin
2f3570dc19 style update 2020-12-11 11:50:35 -05:00
Steve Seguin
c25ca2c5a2 Merge pull request #596 from jcalado/14.0-alpha
guest label styles
2020-12-11 10:33:35 -05:00
Joel Calado
91545d7a9a guest label styles
Label styles are added classes to .video-label

- zoom
- teams
- skype
- ninjablue
- toprounded
- fire
- floating3d
2020-12-11 15:07:24 +00:00
STeve Seguin
de68524b32 ugh. css fix. how did this not transfer? 2020-12-11 09:48:44 -05:00
STeve Seguin
99cdff796d merge error fix 2020-12-11 09:39:18 -05:00
Steve Seguin
e8d5fca0d0 Delete mic-animate.gif 2020-12-11 09:17:52 -05:00
Steve Seguin
b45be651fc Delete mic-slash.gif 2020-12-11 09:17:45 -05:00
Steve Seguin
5989cc8022 Delete mic.gif 2020-12-11 09:17:38 -05:00
STeve Seguin
b14ebeffb9 merge with master 2020-12-11 09:11:27 -05:00
STeve Seguin
ebc42a9665 merge fix; webaudio added 2020-12-11 09:07:28 -05:00
STeve Seguin
e745daf082 audio updates, webaudio etc 2020-12-11 08:52:41 -05:00
STeve Seguin
53600179d1 audio updates, webaudio etc 2020-12-11 08:51:10 -05:00
STeve Seguin
4ec34fdb8a audio updates, webaudio etc 2020-12-11 08:48:23 -05:00
Steve Seguin
bd5cb836c5 Merge pull request #582 from filiptronicek/14.0-alpha
ES6 conversion for translate.js
2020-12-07 10:25:07 -05:00
Steve Seguin
e5178e7c6d Merge pull request #581 from jcalado/patch-1
Update pt.json
2020-12-07 10:08:23 -05:00
Filip Troníček
dfc6fdfcf0 Semicolon 2020-12-07 16:08:08 +01:00
Steve Seguin
bbe5629e2c Merge pull request #580 from filiptronicek/alpha-translations-cs
Alpha translations CS
2020-12-07 10:08:05 -05:00
Filip Troníček
c6f442288e Convert callbacks to arrow functions 2020-12-07 16:07:32 +01:00
Filip Troníček
e9a4ffa3c8 Format code 2020-12-07 15:01:54 +00:00
Filip Troníček
b1b5d7f0ff Re-write stuff to ES6 2020-12-07 15:00:59 +00:00
Joel Calado
d8ddcb6d65 Update pt.json 2020-12-07 14:59:33 +00:00
Filip Troníček
785e531d47 Final and sixth bunch of translation strings! 2020-12-07 14:31:56 +00:00
Filip Troníček
e621e497f9 Fifth bunch of strings 2020-12-07 14:25:53 +00:00
Filip Troníček
60a0167ac3 Third bunch of strings 2020-12-07 14:22:46 +00:00
Filip Troníček
8f28cf50e4 Second bunch of strings 2020-12-07 14:14:11 +00:00
Filip Troníček
84b6a2c211 First bunch of strings 2020-12-07 14:09:49 +00:00
Steve Seguin
6f697a638f Update IFRAME.md 2020-12-07 08:18:42 -05:00
Steve Seguin
a0e545da4e Merge pull request #579 from jcalado/14.0-alpha
speedtest graph color, button status, log copy
2020-12-07 08:00:12 -05:00
Joel Calado
40834d04ba speedtest graph color, button status, log copy
graphs target value
graphs max value
graphs now have colors, green / yellow / red
log click to copy
bitrate buttons reflect incoming connection requested bitrates via background color
disconnect button hidden until first connection established
2020-12-07 12:51:07 +00:00
Steve Seguin
edb531d8a1 Merge pull request #577 from filiptronicek/master
Improve Czech translations
2020-12-06 16:43:17 -05:00
Filip Troníček
eb8d45daa3 Grammar typo (probably) 2020-12-06 21:33:22 +00:00
Filip Troníček
53eb8c41f6 Improve czech translation 2020-12-06 21:28:21 +00:00
Steve Seguin
c1e9eb6dae debug version of 14.0-alpha
first 14.0 alpha build

not done yet.  includes labels, broadcast flag fixes, updated translation file stuff, etc.

UNTESTED!!!!!
2020-12-06 13:38:55 -05:00
Steve Seguin
083ec819dd Update install.md 2020-12-04 05:45:33 -05:00
Steve Seguin
0f293e4922 Update install.md 2020-12-04 05:29:25 -05:00
Steve Seguin
9bcbebca14 Update README.md 2020-12-04 05:25:56 -05:00
Steve Seguin
33e79daf9d Update install.md 2020-12-04 05:25:28 -05:00
Steve Seguin
5bfdfe325a Merge pull request #566 from duncanbarnes/master
Create iframe.outbound-stats.html
2020-12-03 07:46:47 -05:00
Duncan Barnes
beb5881352 Create iframe.outbound-stats.html
Added an example of using the iFrame API to retrieve and display outgoing viewer stats.
2020-12-03 12:35:59 +00:00
STeve Seguin
7baa26c99d fixed bug; added scene=2 2020-12-02 06:39:29 -05:00
STeve Seguin
eb86f2f6e7 merge conflict 2020-12-02 04:28:45 -05:00
STeve Seguin
6b9242532c merging fix? 2020-12-02 04:24:29 -05:00
STeve Seguin
9a7446a083 merge fix? 2020-12-02 04:22:21 -05:00
Joel Calado
c87781dcbd add red button css 2020-12-02 04:20:27 -05:00
STeve Seguin
6bc6736cdf audio/video retry logic 2020-12-02 04:15:45 -05:00
Steve Seguin
d7c0e0cfcd Merge pull request #552 from jcalado/master
Speedtest graphs, data logging, UI revamp
2020-12-01 13:06:01 -05:00
Joel Calado
c361aa19c1 speedtest improvements
- Design update
- Graphs!
- Data logging
2020-11-30 23:47:14 +00:00
Joel Calado
bd4763a087 add red button css 2020-11-30 23:45:17 +00:00
STeve Seguin
1d93b28595 merge 2020-11-30 06:16:01 -05:00
STeve Seguin
aebd62fdcc Merge remote-tracking branch 'origin/master' into 13.5a 2020-11-30 06:15:51 -05:00
STeve Seguin
51438daec8 language changes 2020-11-30 06:14:36 -05:00
Steve Seguin
820b06d518 Merge pull request #547 from jcalado/master
Guest tips
2020-11-29 13:56:33 -05:00
Joel Calado
017d2b2de5 Merge remote-tracking branch 'upstream/master' 2020-11-29 17:20:29 +00:00
Joel Calado
bdb50bd8cb guest tips
tips for: network, power, audio
2020-11-29 17:19:42 +00:00
STeve Seguin
f502bbbec3 Merge remote-tracking branch 'origin/master' into 13.5a 2020-11-29 07:25:48 -05:00
STeve Seguin
a237d9b025 bug fixes; website supported; UI 2020-11-29 07:24:46 -05:00
Steve Seguin
dd47dee760 Merge pull request #542 from jcalado/master
Add easy url parameters sharing to /devices
2020-11-29 06:37:50 -05:00
Joel Calado
574f9c6652 Update devices.html 2020-11-28 22:05:44 +00:00
Joel Calado
1084c8efd7 share &ad and &vd strings easily
handles multiple selection of audio devices, just click the ones you want
string to share is copied on click
2020-11-28 22:05:22 +00:00
STeve Seguin
a2436704df sync rtc 2020-11-28 04:15:21 -05:00
STeve Seguin
82a709cf6f Merge remote-tracking branch 'origin/master' into 13.5a 2020-11-28 04:13:27 -05:00
STeve Seguin
e8abdb4e96 tinkering -- EXPERIMENTAL 13.5-alpha branch 2020-11-28 04:11:04 -05:00
Steve Seguin
a93556e662 Merge pull request #534 from jcalado/master
touch up /devices
2020-11-28 00:31:37 -05:00
Joel Calado
1332a62b5e touch up /devices 2020-11-27 18:56:37 +00:00
Steve Seguin
3e7d538156 Merge pull request #533 from jcalado/master
allow for more strings to be translated
2020-11-27 11:04:06 -05:00
Joel Calado
6b09ee3b45 allow for more strings to be translated
"data-translate-type" attribute with the value of the attribute that you wish translated.
allows for translation of virtually anything? placeholder attr, title attr, etc.
2020-11-27 15:55:14 +00:00
Steve Seguin
accf4ce228 Merge pull request #532 from jcalado/master
updates pt.json
2020-11-27 09:25:16 -05:00
Joel Calado
3c8e93e9a1 Merge remote-tracking branch 'upstream/master' 2020-11-27 14:23:03 +00:00
Joel Calado
0eee6d6c4f Update pt.json 2020-11-27 14:21:48 +00:00
Steve Seguin
b0bfebc451 Merge pull request #531 from jcalado/master
extract card styles to its own class
2020-11-27 09:17:24 -05:00
Joel Calado
9617ef3739 extract card styles to its own class 2020-11-27 14:13:32 +00:00
Steve Seguin
46d978d908 Merge pull request #526 from jcalado/master
tweaks to /supports
2020-11-27 08:23:41 -05:00
Joel Calado
df2e3c9d7f tweaks to /supports 2020-11-27 13:16:32 +00:00
Steve Seguin
f5f2114446 support tool for debugging device support; accessing sinkID, etc. 2020-11-26 04:45:53 -05:00
Steve Seguin
d48483f113 Version 13.4 Release
pushed to production on November 24th
2020-11-24 05:25:07 -05:00
Steve Seguin
595b233327 Update turnserver.md 2020-11-22 00:30:47 -05:00
Steve Seguin
e64fa5c598 Update turnserver.md 2020-11-22 00:28:04 -05:00
Steve Seguin
40ff06c77b Update main.js 2020-11-09 18:14:01 -05:00
Steve Seguin
9d1e1d7f53 version 13.2
-bug fixes
-camera settings added
2020-11-09 16:24:26 -05:00
Steve Seguin
a6332b347a minor fix for rtc.ninja 2020-11-02 02:59:34 -05:00
Steve Seguin
84e6565c01 v13.1 2020-11-02 02:40:44 -05:00
Steve Seguin
589d0e4575 Merge pull request #420 from steveseguin/iframe-api-docs
Create IFRAME.md
2020-10-20 00:13:26 -04:00
Steve Seguin
c08d707a7f Create IFRAME.md 2020-10-20 00:12:51 -04:00
Steve Seguin
115f24fe96 Merge pull request #384 from Sleavely/patch-1
Use pointer cursor on the columns
2020-10-17 22:05:19 -04:00
Joakim Hedlund
db522b4ba4 Removes typo 2020-10-17 12:19:19 +02:00
Joakim Hedlund
20b68aff06 Use a cursor pointer when columns not expanded 2020-10-17 12:17:12 +02:00
Steve Seguin
2f0a1ba99e Update README.md 2020-10-13 16:29:15 -04:00
Steve Seguin
61883e5e54 Merge pull request #359 from kindlyops/elliot/tiny-cleanup
minor cleanups
2020-10-02 13:48:52 -04:00
Elliot Murphy
706d19bfd4 Specify which macOS OBS versions need workaround
This should make the docs a bit more resilient against
confusion with future OBS releases.

Signed-off-by: Elliot Murphy <statik@users.noreply.github.com>
2020-10-01 23:51:21 -04:00
Elliot Murphy
dc63c510c0 Link to new podcast series
Signed-off-by: Elliot Murphy <statik@users.noreply.github.com>
2020-10-01 23:50:46 -04:00
Elliot Murphy
1d4b0dd02f Fix spelling typo
Signed-off-by: Elliot Murphy <statik@users.noreply.github.com>
2020-10-01 23:45:54 -04:00
Elliot Murphy
ac7a2d15cb Remove unreachable code in keyboard shortcuts
Signed-off-by: Elliot Murphy <statik@users.noreply.github.com>
2020-10-01 23:45:01 -04:00
Steve Seguin
12fc6e0f1f Update README.md 2020-09-25 16:27:11 -04:00
Steve Seguin
7af76cfa7b Update index.html 2020-09-24 14:16:35 -04:00
Steve Seguin
a3156bbfb8 Update main.js 2020-09-24 14:15:53 -04:00
Steve Seguin
bf24d6c02c Update README.md 2020-09-23 09:27:14 -04:00
Steve Seguin
ef513acdd7 Update README.md 2020-09-23 09:26:48 -04:00
Steve Seguin
5cca338c9e Update README.md 2020-09-23 09:26:37 -04:00
Steve Seguin
883d5f10ab Update README.md 2020-09-23 09:26:28 -04:00
Steve Seguin
6ab97abe5d Update README.md 2020-09-23 09:25:53 -04:00
Steve Seguin
1cf307a8b4 Update README.md 2020-09-23 09:25:04 -04:00
Steve Seguin
c619810dd5 Update README.md 2020-09-23 09:24:42 -04:00
Steve Seguin
d78a7ec29f Update README.md 2020-09-23 09:24:17 -04:00
Steve Seguin
c88b97f388 Update README.md 2020-09-23 09:22:10 -04:00
Steve Seguin
cf6db6c0d8 Merge pull request #335 from KovalevArtem/patch-4
Update ru.json
2020-09-18 16:24:42 -04:00
KovalevArtem
0759b62306 Update ru.json 2020-09-18 23:23:02 +03:00
Steve Seguin
fddc8bbf74 Update README.md 2020-09-16 08:09:29 -04:00
Steve Seguin
57e80baf24 Update turnserver.md 2020-09-16 03:01:32 -04:00
Steve Seguin
88798d7694 Update turnserver.md 2020-09-16 02:48:20 -04:00
Steve Seguin
16e5a7f4e6 Update README.md
my old TURN server that isn't be used by any official OBS.Ninja deployment currently is still being heavily used; just got a $30 bill for someone's abusive streaming on it over the last few hours alone. .. ouch. I'm going to stop it I think and likely secure the existing TURN server with temporary tokens. I've supplied enough info on how to deploy your own.
2020-09-16 02:45:16 -04:00
Steve Seguin
4bcc628126 Merge pull request #326 from jcalado/patch-1
Update pt.json
2020-09-15 09:47:50 -04:00
Joel Calado
1cec930afb Update pt.json 2020-09-15 11:18:50 +01:00
Steve Seguin
b270267ec9 Delete template.js 2020-09-14 09:58:42 -04:00
Steve Seguin
52ab49158e Add files via upload 2020-09-14 09:36:21 -04:00
Steve Seguin
de23614d69 Release v12
https://www.reddit.com/r/OBSNinja/comments/irz5be/obsninja_version_12_released_change_log_here/
2020-09-14 09:35:42 -04:00
Steve Seguin
308e81cf12 Merge pull request #315 from COOLIGUAY/patch-3
Update es.json
2020-09-12 06:38:41 -04:00
Monsteer
1b9723ebd6 Small fix 2020-09-12 12:33:10 +02:00
Monsteer
523863f29d Update es.json
Updated to the new additions
2020-09-12 12:29:00 +02:00
Steve Seguin
d6f35092f1 Update turnserver.md 2020-09-12 06:06:46 -04:00
Steve Seguin
031fab960a Update turnserver.md 2020-09-12 06:05:28 -04:00
Steve Seguin
34a6bb49d0 Create turnserver2.conf
this one uses a paid SSL cert
2020-09-12 01:41:40 -04:00
Steve Seguin
059a575b33 Merge pull request #314 from theprincy/patch-6
Update Italian
2020-09-11 17:45:48 -04:00
Notelseit.com
7a51c5a826 Update Italian 2020-09-11 23:44:23 +02:00
Steve Seguin
02c93549d6 Update README.md 2020-09-11 07:52:54 -04:00
Steve Seguin
fb10013ca2 Update README.md 2020-09-11 07:52:33 -04:00
Steve Seguin
5cf966b0e8 Update README.md 2020-09-11 07:52:00 -04:00
Steve Seguin
b40e743253 Update README.md 2020-09-11 07:51:30 -04:00
Steve Seguin
1cfadb29e2 Update README.md 2020-09-11 07:50:47 -04:00
Steve Seguin
a787a78892 Update install.md 2020-09-11 07:46:32 -04:00
Steve Seguin
9cd7b23436 Update install.md 2020-09-11 07:32:54 -04:00
Steve Seguin
afc6e4f059 Create install.md 2020-09-11 07:32:30 -04:00
Steve Seguin
df6c147311 Update turnserver.md 2020-09-10 09:49:01 -04:00
Steve Seguin
0d1606833d Update turnserver.md 2020-09-10 09:29:08 -04:00
Steve Seguin
b8cfecb108 Update turnserver.md 2020-09-10 09:17:20 -04:00
Steve Seguin
31b9df5a06 Update turnserver.md 2020-09-10 09:12:03 -04:00
Steve Seguin
905c39a58b Update turnserver.md 2020-09-10 09:09:27 -04:00
Steve Seguin
d52fb0905e Update turnserver.md 2020-09-10 08:51:22 -04:00
Steve Seguin
6d19c082f4 Update README.md 2020-09-10 08:46:40 -04:00
Steve Seguin
bae12cbf73 Update README.md 2020-09-10 08:44:15 -04:00
Steve Seguin
a0031fff0c Update turnserver.md 2020-09-10 08:42:53 -04:00
Steve Seguin
5115ae7735 Update turnserver.md 2020-09-10 08:42:31 -04:00
Steve Seguin
a1aab474fa Update turnserver.md 2020-09-10 08:41:58 -04:00
Steve Seguin
17c2ae5fc6 Update turnserver.md 2020-09-10 06:16:38 -04:00
Steve Seguin
268460dcd5 Update turnserver.md 2020-09-10 02:14:38 -04:00
Steve Seguin
e7ba4f9e8d Update turnserver.conf 2020-09-10 02:04:41 -04:00
Steve Seguin
214c8d2a76 Update turnserver.md 2020-09-10 02:03:21 -04:00
Steve Seguin
c2fea315a6 Update turnserver.md 2020-09-10 02:01:04 -04:00
Steve Seguin
da2b18f642 Update turnserver.md 2020-09-10 02:00:43 -04:00
Steve Seguin
c310afa1f7 Update turnserver.md 2020-09-10 02:00:09 -04:00
Steve Seguin
c801ceb19a Update turnserver.md 2020-09-10 01:25:36 -04:00
Steve Seguin
b0231f4e00 Add files via upload 2020-09-09 03:01:47 -04:00
Steve Seguin
aa24a4be94 did I fix it? 2020-09-09 02:58:34 -04:00
Steve Seguin
d20aa3cd43 Merge pull request #311 from jcalado/update-portuguese
update portuguese translation
2020-09-09 02:14:20 -04:00
Joel Calado
3b411091d4 update portuguese translation 2020-09-09 07:12:04 +01:00
Steve Seguin
bf9e520f1c try try again 2020-09-09 01:23:04 -04:00
Steve Seguin
fb8271142b Delete default.json 2020-09-09 01:06:13 -04:00
Steve Seguin
680535412e Add files via upload 2020-09-09 01:05:51 -04:00
Steve Seguin
c23aaced01 updated language files a small bit 2020-09-09 00:33:10 -04:00
Steve Seguin
d4f29c6491 Update README.md 2020-09-08 03:05:22 -04:00
Steve Seguin
05082022cd Rename turnserver.MD to turnserver.md 2020-09-08 02:31:56 -04:00
Steve Seguin
d2d9e4918d Update turnserver.MD 2020-09-08 02:30:57 -04:00
Steve Seguin
f1f146a8a5 Update turnserver.MD 2020-09-08 02:28:39 -04:00
Steve Seguin
0c60f1fdd6 Update turnserver.MD 2020-09-08 02:27:53 -04:00
Steve Seguin
daa39963e8 Update turnserver.MD 2020-09-08 02:27:24 -04:00
Steve Seguin
5e5c1592bf Update turnserver.MD 2020-09-08 02:26:41 -04:00
Steve Seguin
f3b7e86095 Update turnserver.MD 2020-09-08 02:25:46 -04:00
Steve Seguin
eeaace7788 Update turnserver.MD 2020-09-08 02:25:37 -04:00
Steve Seguin
5868223c35 Create turnserver.MD 2020-09-08 02:25:06 -04:00
Steve Seguin
6be0fcf79b Merge pull request #302 from COOLIGUAY/patch-2
Update es.json
2020-09-07 16:13:55 -04:00
Monsteer
a9ca78ee2a Update es.json
Things I forgot to change...
2020-09-07 20:28:13 +02:00
Monsteer
2a481a8dbe Update es.json
Small fixes/typing errors.
2020-09-07 20:16:47 +02:00
Steve Seguin
472a83870a Add files via upload
speedtest stats fix
title bar updates
stats menu UI updates
electron app tweaked
etc
2020-09-07 06:20:18 -04:00
Steve Seguin
7e839a0a5b Merge pull request #269 from jcalado/new-stats-ui
new stats ui
2020-09-05 23:21:48 -04:00
Joel Calado
61533e8c9e new stats ui 2020-09-05 22:03:19 +01:00
Steve Seguin
c618b91aa5 Merge pull request #268 from COOLIGUAY/patch-1
Update es.json
2020-09-04 18:03:14 -04:00
Monsteer
c15f33934b Update es.json 2020-09-04 23:27:54 +02:00
Steve Seguin
1df852448b reorganized stats page elements
stats menu for view/push videos has been refactored a bit; cleaned up for easier CSS/templating.
2020-09-04 15:56:03 -04:00
Steve Seguin
fb9bfcc12b push to talk, room fixes, minor tweaks
largely Untested -- not a proper release.
2020-09-04 07:33:53 -04:00
Steve Seguin
af516397d8 Merge pull request #266 from jcalado/update-pt-translation
Update pt.json
2020-09-02 17:20:15 -04:00
Joel Calado
b43a21e860 Update pt.json 2020-09-02 21:30:08 +01:00
Steve Seguin
4dbb6613ef Add files via upload
removing the extra tabs I introduced
2020-08-27 04:31:40 -04:00
Steve Seguin
d33f5bef4c Merge pull request #260 from steveseguin/contrib+patches
try #2.
2020-08-27 04:29:06 -04:00
Steve Seguin
5eefa9021d try #2.
Forgot to pull before I merged.
2020-08-27 04:27:45 -04:00
Steve Seguin
05b021e18c Merge pull request #259 from steveseguin/revert-258-pig-latin-and-novideo-fix
Revert "Add files via upload"
2020-08-27 04:18:21 -04:00
Steve Seguin
c7bbfc4b15 Revert "Add files via upload" 2020-08-27 04:18:09 -04:00
Steve Seguin
235908d0e6 Merge pull request #258 from steveseguin/pig-latin-and-novideo-fix
Add files via upload
2020-08-27 04:14:17 -04:00
Steve Seguin
9ad233cfa9 Add files via upload 2020-08-27 04:13:48 -04:00
Steve Seguin
7425fceeec Merge pull request #257 from jcalado/master
Tweak invite like generator UI
2020-08-27 04:06:22 -04:00
Joel Calado
2caf55089f Merge branch 'master' of https://github.com/jcalado/obsninja 2020-08-27 08:39:44 +01:00
Joel Calado
b31248c191 Tweak Reusable Invite generator UI
Separates settings in groups to improve further expansion of available toggles
Increases margins and padding
2020-08-27 08:37:41 +01:00
Joel Calado
3215094833 Tweak Reusable Invite generator UI
Separates settings in groups to improve further expansion of available toggles
Increases margins and padding
2020-08-27 08:30:11 +01:00
Steve Seguin
75ba4f4b4d Version 10.3 - beta
fixed more bugs; minor polish in features
2020-08-26 06:29:17 -04:00
Steve Seguin
8ff1a0f6b2 v10.2 - bug fixes
Fixed a bug with the group room, where videos froze on guest re-join

added &scene=0 (&scene) , which auto-adds videos to the scene without interaction

Updated the &mirror URL flag to have 0, 1, 2, and 3 as options.

-no mirror parameter in the URL is the default.  Local previews are mirrored
-mirror=0 turns off ALL mirroring, for everything.
-mirror=1 inverts the default.  Local previews are not mirrored, but guests are mirrored.
-mirror=2 mirrors ALL videos
-mirror=3 is the same as default, except the entire website is mirrored, including Text (useful for teleprompters?)

Experimental Code Change :  When the data-channel closes, I auto-close the video channels as well, and try to reload the video from scratch.  I do not wait for the video stream to time out.  This *might* fix a 'stacking video' problem, as well as reducing the "frozen frame" video problem when a guest reloads.

This 10.2 release is currently on https://obs.ninja/beta for testing
2020-08-24 03:14:27 -04:00
Steve Seguin
588e99d581 Merge pull request #239 from steveseguin/version-10.1
Release version 10.1
2020-08-23 02:59:00 -04:00
Steve Seguin
4c4bdeb026 Release version 10.1
release notes here
https://www.reddit.com/r/OBSNinja/comments/ib7vhk/version_10_released_text_chat_and_more_added_see/
2020-08-23 02:55:13 -04:00
Steve Seguin
d1d736549d Update FUNDING.yml 2020-08-18 22:15:15 -04:00
Steve Seguin
8af2a94edc Update FUNDING.yml 2020-08-18 21:49:36 -04:00
Steve Seguin
2a31e5508e fixed an issue with advanced audio settings; added meter 2020-07-27 04:08:41 -04:00
Steve Seguin
dd950b1c4e Add files via upload
added translations
2020-07-17 02:25:36 -04:00
Steve Seguin
079b1e8545 Added iFrame communication and an example 2020-07-17 02:25:09 -04:00
Steve Seguin
9d1c466025 Update turnserver.conf 2020-07-05 17:11:57 -04:00
Steve Seguin
be741878e8 tweaked the auto mixer; side by side instead of over/under as default 2020-07-01 22:17:54 -04:00
Steve Seguin
7dcaf7f6f3 Delete IMG_1148.jpg 2020-06-30 04:51:54 -04:00
Steve Seguin
3719f4a4da version 8.01
minor bug fixes
2020-06-28 21:05:33 -04:00
Steve Seguin
4ec298f77c Merge pull request #218 from steveseguin/steveseguin-patch-1
Version 8.0 release
2020-06-28 05:05:59 -04:00
Steve Seguin
0cb72c1a02 Add files via upload 2020-06-28 03:16:50 -04:00
Steve Seguin
a94e164bfe Add files via upload
being added for convenience;
2020-06-28 03:14:45 -04:00
Steve Seguin
e61d6f4830 Version 8 - release (part1) 2020-06-28 02:52:53 -04:00
Steve Seguin
832c584956 doc for OBS.ninja; lets you create invites from inside OBS 2020-06-22 17:29:28 -04:00
Steve Seguin
1aaae51db4 Add files via upload 2020-06-17 05:20:50 -04:00
Steve Seguin
d990bce2ea Add files via upload 2020-06-17 05:07:18 -04:00
Steve Seguin
6c80bf83e0 Add files via upload 2020-06-17 05:06:09 -04:00
Steve Seguin
49df175df6 Version 7 Release Candidate
Mainly just a 1-week sprint focusing on bug fixes and not so much on major features.

Biggest fix this sprint was related to VP9 + Custom Video Bitrates now working as intended.
2020-06-17 04:24:30 -04:00
Steve Seguin
815c619313 Update index.html
for private deployment, please see blank.json as a good starting point for unbranded customization text.  My goal is to move towards more of a library for the core code, so I am trying to separate out the UI/text/style more and more. This should make forking of new branches of the code easier in the long run.
2020-06-16 05:02:28 -04:00
Steve Seguin
aa50333dc9 BETA Version -- bug fixes + main.js editable again
&view should work in the previous version, but tested again in this version
&view=xx,yy,zz should work
&codec=vp9 issue fixed in codec handler
numerous other fixes.
2020-06-16 04:41:07 -04:00
Steve Seguin
7300421a19 Add files via upload 2020-06-16 01:34:59 -04:00
Steve Seguin
6dbc64138a translation tool and updated translation files.
will improve on this all more in the upcoming next release
2020-06-14 21:27:03 -04:00
Steve Seguin
fa820d812c Merge pull request #168 from jcalado/patch-1
Create pt.json
2020-06-14 13:49:54 -04:00
Joel Calado
2c955e62b1 Create pt.json 2020-06-14 11:16:47 +01:00
Steve Seguin
a6c9cfcf1b added more configuration options
TURN server can be specified, along with changing default values.

not heavily tested yet.
2020-06-10 13:21:11 -04:00
Steve Seguin
6a2e5d1a84 Merge pull request #163 from steveseguin/Version-6
release version 6 updates
2020-06-09 12:37:52 -04:00
Steve Seguin
2d60c0a441 release version 6 updates
I've fixed issues with innerHTML calls in this release that would normally totally break things if there were changes to index.html. Now, if there is an error, it is handled more gracefully and usually just a single UI element breaks. You should be able to customize the index.html file now without too many hassles.

You will also notice that the index.html has the following line: 
<script type="text/javascript" id="main-js" data-translation="blank" src="./main.js"></script>

you can specify different languages or different branding/wording translations by setting the data-translation value to that of the json filename located in the translations folder.  You can also create your own json files and specify them that way. By default I am specifying the "blank" translation.

I'm trying to steer the app code in the direction of being a bit like a library, for numerous reasons, but please reach out if you have issues with this new release. This release has numerous bug fixes and uses a new handshake server to improve the group-room experience, which I will continue to update. I will continue to work towards allowing greater accessibility in stylizing the application.
2020-06-09 12:35:40 -04:00
Steve Seguin
1db217d01c Merge pull request #152 from willl/patch-1
Fix a tiny typo
2020-05-23 08:26:59 -04:00
Steve Seguin
f416348596 Update README.md 2020-05-18 08:34:08 -04:00
Steve Seguin
86fee88382 testing webhooks 2020-05-18 08:28:57 -04:00
Steve Seguin
e39d886602 thank you 2020-05-18 04:18:38 -04:00
Steve Seguin
f9f5093238 Create FUNDING.yml 2020-05-18 04:13:46 -04:00
William Luu
609ac042a9 Fix a tiny typo
Change `unavoiably` to `unavoidably`.
2020-05-16 21:49:51 +10:00
Steve Seguin
f980555f18 Merge pull request #130 from KovalevArtem/patch-2
Update ru.json
2020-05-13 00:00:47 -04:00
Steve Seguin
d53528424e Updating the readme with 'what is obs ninja' tweaks 2020-05-12 22:59:00 -04:00
Steve Seguin
2651755647 Update README.md 2020-05-12 22:58:16 -04:00
Steve Seguin
3263cbd684 fixing my last commit. :/ 2020-05-12 05:02:21 -04:00
Steve Seguin
ac34971a50 audio devices + framerates on sceeenshare
fixing a bug with audio devices not all listing and screenshare not allowing for custom frame rates
2020-05-12 04:58:03 -04:00
KovalevArtem
e9de1b9a4c Update ru.json 2020-05-12 11:52:47 +03:00
Steve Seguin
d584a5cbdd Merge pull request #129 from steveseguin/language-russian-auto
Add files via upload
2020-05-11 21:37:44 -04:00
Steve Seguin
c5067c850b Add files via upload
Automatically applies a really bad (sorry) Russian translation to the site
2020-05-11 21:35:18 -04:00
Steve Seguin
af83c67def Delete en_ca.json 2020-05-11 21:33:33 -04:00
Steve Seguin
1631ab8d18 Delete en_uk.json 2020-05-11 21:33:26 -04:00
Steve Seguin
8da4b746be Merge pull request #128 from steveseguin/language-update
Delete en_us.json
2020-05-11 21:33:01 -04:00
Steve Seguin
e658beb41e Delete en_us.json 2020-05-11 21:31:50 -04:00
Steve Seguin
d746860c82 Delete fr_ca.json 2020-05-11 21:31:28 -04:00
Steve Seguin
735f77cec4 Update index.html
removing some debugging code
2020-05-10 22:34:32 -04:00
Steve Seguin
94cb69703b Add files via upload 2020-05-10 22:17:00 -04:00
Steve Seguin
7d81bc3b79 Add files via upload
thank you for the bug report, sky
2020-05-10 22:16:22 -04:00
Steve Seguin
5ed0d7f6dc Update README.md 2020-05-10 07:58:54 -04:00
Steve Seguin
252e73edac cleaning up readme 2020-05-10 07:51:19 -04:00
195 changed files with 47893 additions and 3459 deletions

6
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,6 @@
# These are supported funding model platforms
# Thank you <3
github: [steveseguin]
custom: ["https://www.paypal.me/steveseguin", "buymeacoffee.com/steveseguin"]

168
.github/ci-generateTranslations.js vendored Normal file
View File

@@ -0,0 +1,168 @@
var https = require("https");
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const axios = require("axios").default;
const fs = require("fs");
const dom = new JSDOM(``, {
url: "https://obs.ninja",
contentType: "text/html",
includeNodeLocations: true,
storageQuota: 10000000,
pretendToBeVisual: true,
});
global.document = new JSDOM(``, {
url: "https://obs.ninja",
contentType: "text/html",
includeNodeLocations: true,
storageQuota: 10000000,
pretendToBeVisual: false,
}).window.document;
function downloadTranslation(filename, trans = {}) {
// downloads the current translation to a file
console.log("Downloading translation: " + filename);
const textDoc = JSON.stringify(trans, null, 2);
fs.writeFile(`translations/${filename}.json`, textDoc, (err) => {
if (err) {
return console.log(err);
}
});
return trans;
}
async function updateTranslation(filename) {
// updates the website with a specific translation
let data = await axios({
method: "get",
url: `https://raw.githubusercontent.com/steveseguin/obsninja/master/translations/${filename}.json?${(
Math.random() * 100
).toString()}`,
})
.then((response) => {
return response.data;
})
.catch((error) => {
console.log(error);
});
const oldTransItems = data["innerHTML"];
// const allItems1 = document.querySelectorAll('[data-translate]');
allItems.forEach((ele) => {
const key = ele.dataset.translate; //.replace(/[\W]+/g, "-").toLowerCase();
if (key in oldTransItems) {
ele.innerHTML = oldTransItems[key];
}
});
const oldTransTitles = data["titles"];
//const allTitles1 = document.querySelectorAll('[title]');
allTitles.forEach((ele) => {
const key = ele.dataset.key;
//const key = ele.title.replace(/[\W]+/g, "-").toLowerCase();
if (key in oldTransTitles) {
ele.title = oldTransTitles[key];
}
});
const oldTransPlaceholders = data.placeholders;
//const allPlaceholders1 = document.querySelectorAll('[placeholder]');
allPlaceholders.forEach((ele) => {
const key = ele.dataset.key;
//const key = ele.placeholder.replace(/[\W]+/g, "-").toLowerCase();
if (key in oldTransPlaceholders) {
ele.placeholder = oldTransPlaceholders[key];
}
});
return [true, data];
}
const updateList = [
"cs",
"de",
"en",
"es",
"fr",
"it",
"ja",
"nl",
"pig",
"pt",
"ru",
"tr",
"blank",
]; // list of languages to update. Update this if you add a new language.
const allItems = document.querySelectorAll("[data-translate]");
const defaultTrans = {};
allItems.forEach((ele) => {
const key = ele.dataset.translate; //.replace(/[\W]+/g, "-").toLowerCase();
defaultTrans[key] = ele.innerHTML;
});
const defaultTransTitles = {};
const allTitles = document.querySelectorAll("[title]");
allTitles.forEach((ele) => {
const key = ele.title.replace(/[\W]+/g, "-").toLowerCase();
ele.dataset.key = key;
defaultTransTitles[key] = ele.title;
});
const defaultTransPlaceholders = {};
const allPlaceholders = document.querySelectorAll("[placeholder]");
allPlaceholders.forEach((ele) => {
const key = ele.placeholder.replace(/[\W]+/g, "-").toLowerCase();
ele.dataset.key = key;
defaultTransPlaceholders[key] = ele.placeholder;
});
const combinedTrans = {};
combinedTrans.titles = defaultTransTitles;
combinedTrans.innerHTML = defaultTrans;
combinedTrans.placeholders = defaultTransPlaceholders;
var counter = 0;
for (var i = 0; i < updateList.length; i++) {
const lang = updateList[i];
var translation = updateTranslation(lang); // we don't need to worry about DATA.
updateTranslation(lang)
.then((translation) => {
const newTrans = translation[1]["innerHTML"];
//const allItems = document.querySelectorAll('[data-translate]');
allItems.forEach((ele) => {
const key = ele.dataset.translate; //.replace(/[\W]+/g, "-").toLowerCase();
newTrans[key] = ele.innerHTML;
});
const newTransTitles = translation[1]["titles"];
//const allTitles = document.querySelectorAll('[title]');
allTitles.forEach((ele) => {
const key = ele.dataset.key;
newTransTitles[key] = ele.title;
});
const newPlaceholders = translation[1]["placeholders"];
// const allPlaceholders = document.querySelectorAll('[placeholder]');
allPlaceholders.forEach((ele) => {
const key = ele.dataset.key;
newPlaceholders[key] = ele.placeholder;
});
// //// DOWNLOAD UPDATED TRANSLATION
const outputTrans = {};
outputTrans["titles"] = newTransTitles;
outputTrans["innerHTML"] = newTrans;
outputTrans["placeholders"] = newPlaceholders;
downloadTranslation(lang, outputTrans);
})
.catch((error) => {
console.log(error);
});
}

View File

@@ -0,0 +1,21 @@
name: Update Advanced Settings Markdown TOC
on:
workflow_dispatch:
schedule:
- cron: '0 0 29 2 1'
jobs:
update-toc:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
repository: ${{github.repository}}.wiki
- name: Run github-markdown-toc
run: |
curl https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc -o gh-md-toc
chmod a+x gh-md-toc
./gh-md-toc --insert --no-backup Advanced-Settings.md
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "Auto update markdown TOC"

View File

@@ -0,0 +1,39 @@
# This is a basic workflow to help you get started with Actions
name: Update translations
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
paths:
- 'index.html'
- 'main.js'
branches:
- master
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '14'
- run: npm install jsdom && npm install axios
- run: node .github/ci-generateTranslations.js
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
commit-message: Generated updated translations
branch: generated_translations
title: "[OBSNinja Bot] Updated translations"
labels: i18n

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
node_modules/
package-lock.json

View File

@@ -1,8 +1,8 @@
OBS.Ninja Contributor License Agreement (CLA)
# OBS.Ninja Contributor License Agreement (CLA)
To ensure the long-term viability of the open-source OBS.Ninja project, and for the protection of its creator and its users, we request that contributors to the project first agree to some basic terms. The terms when accepted applies to all of your past, present and future contributions.
Contribution Policy
# Contribution Policy
Contributions that only take 20 lines of code or less will have its Intellectual Property implicitly transferred to Stephen Seguin, the creator of OBS.Ninja. You agree with this rule by pushing your code or works to github, by sending the code or works to one of OBS.Ninja's core developers, or by distributing your code or works in any other way.
@@ -10,6 +10,7 @@ For all code contributions that take more than 20 lines, you are invited to digi
It is not required that you sign the CLA for every contribution. Once you execute a CLA, it is valid until the CLA agreement is meaningfully changed and requires updating.
Important notice: if you are contributing on behalf of your company, an officer of your company (usually a VP or higher title) must sign the CLA on behalf of the company, indicating his or her title. The company can choose to list the specific individuals authorized to make contributions on the "Full Name" line, or may cover all employees with a blanket CLA by not limiting contributors to an authorized list. If necessary, the company may provide a list of authorized contributors in an attachment. The executive signing the CLA must be the first name on such an attached list, and this executive must sign the attachment as well. It may well be the case that your company already has signed a company-wide CLA with Stephen Seguin. Please check this first.
## Important notice
If you are contributing on behalf of your company, an officer of your company (usually a VP or higher title) must sign the CLA on behalf of the company, indicating his or her title. The company can choose to list the specific individuals authorized to make contributions on the "Full Name" line, or may cover all employees with a blanket CLA by not limiting contributors to an authorized list. If necessary, the company may provide a list of authorized contributors in an attachment. The executive signing the CLA must be the first name on such an attached list, and this executive must sign the attachment as well. It may well be the case that your company already has signed a company-wide CLA with Stephen Seguin. Please check this first.
You can stop your participation in a project at any time, but you cannot rescind your assignments or grants with respect to prior contributions. This protects the whole community, allowing Stephen Seguin and downstream users of the code base to rely on it.

305
IFRAME.md Normal file
View File

@@ -0,0 +1,305 @@
## VDO.Ninja - iFrame API documentation
VDO.Ninja (VDON) is offers here a simple and free solution to quickly enable real-time video streaming in their websites. VDON wishes to make live video streaming development accessible to any developer, even novices, yet still remain flexible and powerful.
While VDO.Ninja does offer source-code to customize the application and UI at a low level, this isn't for beginners and it is rather hard to maintain. As well, due to the complexity of video streaming in the web, typical approaches for offering API access isn't quite feasible either.
The solution decided on isn't an SDK framework, but rather the use of embeddable _IFrames_ and a corresponding bi-directional iframe API. An [iframe](https://www.w3schools.com/tags/tag_iframe.ASP) allows us to embed a webpage inside a webpage, including VDO.Ninja into your own website.
Modern web browsers allow the parent website to communicate with the child webpage, giving a high-level of control to a developer, while also abstracting the complex code and hosting requirements. Functionality, we can make an VDON video stream act much like an HTML video element tag, where you can issue commands like play, pause, or change video sources with ease.
Creating an VDON iframe can be done in HTML or programmatically with Javascript like so:
```
const iframe = document.createElement("iframe");
iframe.allow = "autoplay;camera;microphone";
iframe.allowtransparency = "false";
iframe.src = "https://vdo.ninja/?webcam";
```
You can also make an VDO.Ninja without Javascript, using just HTML, like
`<iframe allow="autoplay;camera;microphone" src="https://vdo.ninja/?view=vhX5PYg&cleanoutput&transparent"></iframe>`
Adding that iframe to the DOM will reveal a simple page accessing for a user to select and share their webcam. For a developer wishing to access a remote guest's stream, this makes the ingestion of that stream into production software like OBS Studios very easy. The level of customization and control opens up opportunities, such as a pay-to-join audience option for a streaming interactive broadcast experience.
An example of how this API is used by VDO.Ninja is with its Internet Speedtest, which has two VDO.Ninja IFrames on a single page. One iframe feeds video to the other iframe, and the speed at which it does this is a measure of the system's performance. Detailed stats of the connection are made available to the parent window, which displays the results.
https://vdo.ninja/speedtest
More community-contributed IFRAME examples can be found here: https://github.com/steveseguin/vdoninja/tree/master/examples
A sandbox of options is available at this page, too: https://vdo.ninja/iframe You can enter an VDO.Ninja URL in the input box to start using it. For developers, viewing the source of that page will reveal examples of how all the available functions work, along with a way to test and play with each of them. You can also see here for the source-code on GitHub: https://github.com/steveseguin/vdoninja/blob/master/iframe.html
One thing to note about this iframe API is that it is a mix of URL parameters given to the iframe _src_ URL, but also the postMessage and addEventListener methods of the browser. The later is used to dynamically control VDO.Ninja, while the former is used to initiate the instance to a desired state.
For more information on the URL parameters thare are available, please see: https://github.com/steveseguin/vdoninja/wiki/Advanced-Settings
Some of the more interesting ones primarily for iframe users might include:
- &webcam
- &screenshare
- &videodevice=1 or 0
- &audiodevice=1 or 0
- &autostart
- &chroma
- &transparency
- As for API, allow for dynamic messaging, below are examples of the options available:
- Mute Speaker
- Mute Mic
- Disconnect
- Change Video Bitrate
- Reload the page
- Change the volume
- Request detailed connection stats
- Access the loudness level of the audio
- Send/Recieve a chat message to other connected guests
- Get notified when there is a video connection
As for the actually details for methods and options available to dynamically control child VDON iframe, they are primarily kept up to via the iframe.html file that is mentioned previously. see: _iframe.html_. Below is a snippet from that file:
```js
let button = document.createElement("button");
button.innerHTML = "Mute Speaker";
button.onclick = () => {
iframe.contentWindow.postMessage({
"mute": true
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Un-Mute Speaker";
button.onclick = () => {
iframe.contentWindow.postMessage({
"mute": false
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Toggle Speaker";
button.onclick = () => {
iframe.contentWindow.postMessage({
"mute": "toggle"
}, '*');
}
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Mute Mic";
button.onclick = () => {
iframe.contentWindow.postMessage({
"mic": false
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Un-Mute Mic";
button.onclick = () => {
iframe.contentWindow.postMessage({
"mic": true
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Toggle Mic";
button.onclick = () => {
iframe.contentWindow.postMessage({
"mic": "toggle"
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Disconnect";
button.onclick = () => {
iframe.contentWindow.postMessage({
"close": true
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Low Bitrate";
button.onclick = () => {
iframe.contentWindow.postMessage({
"bitrate": 30
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "High Bitrate";
button.onclick = () => {
iframe.contentWindow.postMessage({
"bitrate": 5000
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Default Bitrate";
button.onclick = () => {
iframe.contentWindow.postMessage({
"bitrate": -1
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Reload";
button.onclick = () => {
iframe.contentWindow.postMessage({
"reload": true
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "50% Volume";
button.onclick = () => {
iframe.contentWindow.postMessage({
"volume": 0.5
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "100% Volume";
button.onclick = () => {
iframe.contentWindow.postMessage({
"volume": 1.0
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Request Stats";
button.onclick = () => {
iframe.contentWindow.postMessage({
"getStats": true
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Request Loudness Levels";
button.onclick = () => {
iframe.contentWindow.postMessage({
"getLoudness": true
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Stop Sending Loudness Levels";
button.onclick = () => {
iframe.contentWindow.postMessage({
"getLoudness": false
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "Say Hello";
button.onclick = () => {
iframe.contentWindow.postMessage({
"sendChat": "Hello!"
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "previewWebcam()";
button.onclick = () => {
iframe.contentWindow.postMessage({
"function": "previewWebcam"
}, '*');
};
iframeContainer.appendChild(button);
button = document.createElement("button");
button.innerHTML = "CLOSE IFRAME";
button.onclick = () => {
iframeContainer.parentNode.removeChild(iframeContainer);
};
iframeContainer.appendChild(button);
// As for listening events, where the parent listens for responses or events from the VDON child frame:
// ////////// LISTEN FOR EVENTS
const eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
const eventer = window[eventMethod];
const messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
eventer(messageEvent, function (e) {
if (e.source !== iframe.contentWindow) {
return
} // reject messages send from other iframes
if ("stats" in e.data) {
const outputWindow = document.createElement("div");
let out = `<br />total_inbound_connections:${
e.data.stats.total_inbound_connections
}`;
out += `<br />total_outbound_connections:${
e.data.stats.total_outbound_connections
}`;
for (const streamID in e.data.stats.inbound_stats) {
out += `<br /><br /><b>streamID:</b> ${streamID}<br />`;
out += printValues(e.data.stats.inbound_stats[streamID]);
}
outputWindow.innerHTML = out;
iframeContainer.appendChild(outputWindow);
}
if ("gotChat" in e.data) {
const outputWindow = document.createElement("div");
outputWindow.innerHTML = e.data.gotChat.msg;
outputWindow.style.border = "1px dotted black";
iframeContainer.appendChild(outputWindow);
}
if ("action" in e.data) {
const outputWindow = document.createElement("div");
outputWindow.innerHTML = `child-page-action: ${
e.data.action
}<br />`;
outputWindow.style.border = "1px dotted black";
iframeContainer.appendChild(outputWindow);
}
if ("loudness" in e.data) {
console.log(e.data);
if (document.getElementById("loudness")) {
outputWindow = document.getElementById("loudness");
} else {
const outputWindow = document.createElement("div");
outputWindow.style.border = "1px dotted black";
iframeContainer.appendChild(outputWindow);
outputWindow.id = "loudness";
}
outputWindow.innerHTML = "child-page-action: loudness<br />";
for (const key in e.data.loudness) {
outputWindow.innerHTML += `${key} Loudness: ${
e.data.loudness[key]
}\n`;
}
outputWindow.style.border = "1px black";
}
});
```
This VDO.Ninja API is developed and expanded based on user feedback and requests. It is by no means complete.
Please feel free to follow me in the VDO.Ninja Discord channel (discord.vdo.ninja) where I post news about updates and listen to requests. The upcoming version of VDO.Ninja is also often hosted at https://vdo.ninja/beta, where you can explore new features and help crush any unexpected bugs.
-steve

View File

@@ -1,7 +1,7 @@
The OBS.Ninja source repository is governed by the GNU AFFERO GENERAL PUBLIC LICENSE. (AGPL-3.0)
That AGPL-3.0 licence can be found here: https://raw.githubusercontent.com/steveseguin/obsninja/master/AGPLv3.md
That AGPL-3.0 licence can be found here: [AGPLv3.md](https://github.com/steveseguin/obsninja/blob/master/AGPLv3.md)
In essence, OBS.Ninja is open-source and free to use, both for commericial and non-commericial use.
In essence, OBS.Ninja is open-source and free to use, both for commercial and non-commercial use.
Modifications of AGPL-3.0 licenced code must be made publicly accessible. Please refer to that licence.
Some individual source files may contain different licencing term and perhaps different copyright holders.

View File

@@ -1,60 +1,83 @@
![ILogo by brimace](images/obsNinja_logo_full.png)
## What is OBS NINJA
OBS.Ninja uses peer-to-peer technology to bring remote cameras into OBS. In most cases, all video data is transferred directly from peer to peer, without needing to go through any video server. This results in high-quality video with super low latency. In a small number of cases, video data may go through an encrypted TURN server, which is used to facilitate peer connections when otherwise not possible.
#### ⚠ Notice! We've started our rebranding from OBS.Ninja to VDO.Ninja 🎈 -- nothing else will be changing. ✨
OBS Ninja is not affiliated with OBS, but OBS Ninja is dependent on OBS to function. OBS.Ninja is designed to allow content creators to produce real-time live shows with OBS Studio and to allow smartphones to be used as webcams on a Windows PC.
Please see the sub-reddit added info: https://reddit.com/r/obsninja
Also check out the FAQ for more info: https://github.com/steveseguin/obsninja/wiki
<img src="media/obsNinja_logo_full.png" alt="Logo by brimace" height="150" />
## How to use:
I demo the basic usage of OBS.Ninja on YouTube: https://www.youtube.com/watch?v=6R_sQKxFAhg
## What is ~~OBS NINJA~~ **VDO NINJA**
VDO.Ninja uses peer-to-peer technology to bring remote cameras into OBS or other studio software.
In most cases, all video data is transferred directly from peer to peer, without needing to go through any video server. This results in high-quality video with super low latency. In a small number of cases, video data may go through an encrypted TURN server, which is used to facilitate peer connections when otherwise not possible.
VDO.Ninja is designed to allow content creators to produce real-time live shows using remote media streams. It can also turn smartphones into wireless webcams, with additional Virtualcam software.
VDO.Ninja is freely available to use as a managed service over at https://vdo.ninja.
For live support, please join our discord at https://discord.obs.ninja
Please see the sub-reddit added info: https://reddit.com/r/vdoninja
Also check out the FAQ for more info: https://github.com/steveseguin/vdoninja/wiki
<img src="https://user-images.githubusercontent.com/2575698/120865595-56de3b80-c55c-11eb-8b98-60c59ae0f904.png" height="300" />
## How to use
I demo the basic usage of VDO.Ninja on YouTube: https://www.youtube.com/watch?v=6R_sQKxFAhg
Here is a podcast series showing how to use different basic VDO.Ninja features, including macOS support: https://www.youtube.com/watch?v=XfSqufuoV74&list=PLWodc2tCfAH1l_LDvEyxEqFf42hOBKqQM
And Here is another video series touching on some more advanced settings: https://www.youtube.com/watch?v=mQ1Jdhf5aYg&list=PL8VJWj2-XLFpFu3G35Hdm1nKZ2xn9_0_8
Check the subreddit for added use cases, advanced features, and support. Advanced features includes high-quality audio modes, custom video resolutions, and more.
MacOS users will face some challenges in using OBS currently, but there are workarounds. Please see Reddit or the Wiki.
## What's in this repo
This repo contains software for VDO.Ninja, including the HTML landing page for its Electron Capture app offering. A sample config file and instructions for setting up a TURN server (video relay server), is also provided. You may also find [the Wiki](https://github.com/steveseguin/vdoninja/wiki) for the project in this repo, which contains added information on how to use the software.
## What's in this repo?
This repo contains the software for OBS.ninja and its TURN server deployment settings. Feel free to use it as you will; code contributions very welcomed. You may be best suited at getting ahold of me at steve@seguin.email instead of via Github if urgent though.
## How to Deploy this Repo
To use, just download and host the files on a HTTPS-enabled webserver. You may want to hide the .html extensions within your HTTP server as well, else the generated links will not work. See [here](https://github.com/steveseguin/vdoninja/blob/master/install.md) for added details and alternative install options.
## How to Deploy this Repo:
To use, just download and host on a HTTPS-enabled webserver. You may want to hide the .html extensions within your HTTP server as well, else the generated links will not work. Customize the code as desired.
Directions on how to deploy a TURN server are listed in the turnserver.md file. You may wish to do so, although not all use cases will not need one. Only about 10% of remote guests, those often connected via 4G LTE, will require a TURN server. While VDO.Ninja does host some TURN servers, they are quite expensive to operate and not really for private deployment use. If you are deploying your own version of VDO.Ninja, I'd ask you use your own TURN servers instead.
Directions on how to deploy a TURN server are listed in the turnserver.conf file. You may wish to do so if you are having problems with my existing TURN server, although most users will not need one. About 10% of users, those often connected via 4G LTE, will require a TURN server. My TURN server does cost me money to host, which I do for free, so please do not abuse it.
## Server side / API software
Since VDO.Ninja uses peer-2-peer technology, video connections are made directly between viewer and publisher in 90% of cases. Hosting a TURN server yourself may help improve performance, but less than 1% of users will see any benefit of this. Details on how to deploy a TURN server are provided. For those capable of hosting their own TURN server, that would be appreciated if possible, as TURN servers are the only real cost incurred by VDO.Ninja at present. (other than time, of course)
Why deploy OBS.Ninja? You may want to customize the UI for your brand/business, or control security/privacy beyond what I do already. I personally feel it is best to CONTRIBUTE desired changes to this repo instead, as technology moves fast and older forked versions will become obsolete.
Other than TURN servers, VDO.Ninja also uses public STUN servers and a hosted handshake server. These are used to facilitate the initial setup of peer connections and are generally not required after a peer connection is established. These servers are free to access and use, even for private deployments. As of Version 17.3 of VDO.Ninja, you can host your own handshake server or use a third-party managed one (such as piesocket.com); please see details here: https://github.com/steveseguin/websocket_server
## Server side / API software?
Other than the hosted TURN server, OBS.Ninja uses public STUN servers and a hosted handshake server. These are used to facilitate the initial setup of peer connections and are not required after a peer connection is established. Development builds of OBS.Ninja may include debugging software, but in-production releases have this removed.
Development builds of VDO.Ninja may include debugging software, but in-production releases have this removed. Double check to ensure "console.re" debugging is disabled before deployment, just to be safe.
A design goal of OBS.Ninja is to be serverless and we are 99% of the way there. This design objective ensures OBS.Ninja can be offered for free, along with providing increased levels of security and privacy.
A design goal of VDO.Ninja is to be serverless and we are 99% of the way there. This design objective ensures VDO.Ninja can be offered for free, along with providing increased levels of security and privacy.
## Issues? problems? Not working?
Please see the sub-reddit for more support: https://reddit.com/r/obsninja
Please see the sub-reddit for more support: https://reddit.com/r/vdoninja
Also check out the FAQ for common answers: https://github.com/steveseguin/obsninja/wiki
Also check out the FAQ for common answers: https://github.com/steveseguin/vdoninja/wiki
If urgent, join me on discord: https://discord.gg/EksyhGA or email me at steve@seguin.email
## Related Projects
#### OBS.Ninja's Electron Capture:
A better way to perform "Window Capturing" on desktop if OBS Browser Sources fails you. A downloadable tool designed to enhance OBS.Ninja.
### VDO.Ninja's Electron Capture:
A better way to perform "Window Capturing" on desktop if OBS Browser Sources fails you. A downloadable tool designed to enhance VDO.Ninja.
https://github.com/steveseguin/electroncapture
#### Steves.app:
A website designed to also work with OBS.Ninja as a Broadcasting tool. Share your webcam, window, desktop, or video file with friends and family. Peer-2-peer, so privacy can be maintained, but you can also list your broadcasts for others to watch.
### CAPTION.Ninja
A free AI-based closed-captioning tool to add speech-to-text overlays to OBS Studio. It's browser-based with an easy OBS or VMix integration. Developed by Steve as well! https://caption.ninja
### Chat.Overlay.Ninja
A free Chrome extension that lets you select Youtube Live Chat comments, with those comments then appearing directly in OBS or VMix as an overlay. No chroma-keying needed and the styling is pretty easy to customize without needing to modify the Chrome extension itself.
http://chat.overlay.ninja/
### Steves.app:
A website designed to also work with VDO.Ninja as a Broadcasting tool. Share your webcam, window, desktop, or video file with friends and family. Peer-2-peer, so privacy can be maintained, but you can also list your broadcasts for others to watch.
https://steves.app/
## Privacy
I try to avoid data collection whenever possible and video streams are generally designed to be private, but use at your own risk. It is best to not share links created with OBS.Ninja with those you do not trust. I've provided instructions on how to deploy a TURN server if IP-address privacy is an issue for you. See: turnserver.conf
I try to avoid data collection whenever possible and video streams are generally designed to be private, but use at your own risk. It is best to not share links created with VDO.Ninja with those you do not trust. I've provided instructions on how to deploy a TURN server if IP-address privacy is an issue for you. See: [turnserver.md](turnserver.md)
https://vdo.ninja may unavoidably use cookies that are exempt from EU laws of requiring notice of their use; they are exempt as they are required and necessary for the technical functioning of the web service. Our webserver is cached by Cloudflare and it provides denial of server protection for the users of VDO.Ninja.
Additional security features are being added weekly on request. Please ask about these options if added security and privacy are requirements for you.
## Feedback
Idea, feed back, bugs, etc -- all welcomed. I'm dumping many of my ideas as issues into Github. Feedback is typcially most welcomed via Email or Discord.
Ideas, feedback, bugs, etc -- all welcomed. I'm dumping many of my ideas as issues into Github. Feedback is typically most welcomed via Email or Discord.
## Licence
OBS.Ninja is available as open-source; please see the LICENCE.md file for details.
VDO.Ninja is available as 'mostly' open-source; please see the LICENCE.md file for details.

View File

@@ -1,115 +0,0 @@
/* We need to create dynamic keyframes to show the animation from full-screen to normal. So we create a stylesheet in which we can insert CSS keyframe rules */
$("body").append('<style id="lightbox-animations" type="text/css"></style>');
/* Click on the container */
$(".column").on('click', function() {
/* The position of the container will be set to fixed, so set the top & left properties of the container */
var bounding_box = $(this).get(0).getBoundingClientRect();
$(this).css({ top: bounding_box.top + 'px', left: bounding_box.left -20+ 'px' });
/* Set container to fixed position. Add animation */
$(this).addClass('in-animation');
/* An empty container has to be added in place of the lightbox container so that the elements below don't come up
Dimensions of this empty container is the same as the original container */
$("#empty-container").remove();
$('<div id="empty-container" class="column"></div>').insertAfter(this);
/* To animate the container from full-screen to normal, we need dynamic keyframes */
var styles = '';
styles = '@keyframes outlightbox {';
styles += '0% {';
styles += 'height: 100%;';
styles += 'width: 100%;';
styles += 'top: 0px;';
styles += 'left: 0px;';
styles += '}';
styles += '50% {';
styles += 'height: 220px;';
styles += 'top: ' + bounding_box.y + 'px;';
styles += '}';
styles += '100% {';
styles += 'height: 220px;';
styles += 'width: '+bounding_box.width+'px;';
styles += 'top: ' + bounding_box.y + 'px;';
styles += 'left: ' + bounding_box.x + 'px;';
styles += '}';
styles += '}';
/* Add keyframe to CSS */
$("#lightbox-animations").get(0).sheet.insertRule(styles, 0);
/* Hide the window scrollbar */
$("body").css('overflow', 'hidden');
});
/* Click on close button when full-screen */
$(".close").on('click', function(e) {
$(this).hide();
$(".container-inner").hide();
/* Window scrollbar normal */
$("body").css('overflow', 'auto');
var bounding_box = $(this).parent().get(0).getBoundingClientRect();
$(this).parent().css({ top: bounding_box.top + 'px', left: bounding_box.left + 'px' });
/* Show animation */
$(this).parent().addClass('out-animation');
e.stopPropagation();
});
/* On animationend : from normal to full screen & full screen to normal */
$(".column").on('animationend', function(e) {
/* On animation end from normal to full-screen */
if(e.originalEvent.animationName == 'inlightbox') {
$(this).children(".close").show();
$(this).children(".container-inner").show();
}
/* On animation end from full-screen to normal */
else if(e.originalEvent.animationName == 'outlightbox') {
/* Remove fixed positioning, remove animation rules */
$(this).removeClass('in-animation').removeClass('out-animation').removeClass('columnfade');
/* Remove the empty container that was earlier added */
$("#empty-container").remove();
/* Delete the dynamic keyframe rule that was earlier created */
$("#lightbox-animations").get(0).sheet.deleteRule(0);
}
});
// multiselect dropdowns
$('.multiselect-trigger').on('mousedown touchend focusin focusout', function(e) {
var state = $(this).data('state') || 0;
if( state == 0 ) {
// open the dropdown
$(this).data('state', '1').addClass('open').removeClass('closed');
$(this).find('.fa').removeClass('fa-chevron-down').addClass('fa-chevron-up');
$(this).parent().find('.multiselect-contents').show();
$(this).parent().find('.multiselect-contents').find('input[type="checkbox"]').parent().show();;
$(this).parent().find('.multiselect-contents').find('input[type="checkbox"]').show();;
} else {
// close the dropdown
$(this).data('state', '0').addClass('closed').removeClass('open');
$(this).find('.fa').removeClass('fa-chevron-up').addClass('fa-chevron-down');
//$(this).parent().find('.multiselect-contents').hide();
//$(this).parent().find('.multiselect-contents').find('input[type="checkbox"]').hide();
$(this).parent().find('.multiselect-contents').find('input[type="checkbox"]').not(":checked").parent().hide();;
$(this).parent().find('.multiselect-contents').find('input[type="checkbox"]').hide();;
}
e.preventDefault();
});
// when no preference is checked, uncheck the others
$('#multiselect1').on('change', function(e) {
if( $(this).is(':checked') ) {
$(this).parent().parent().find('input[type="checkbox"]').not('#multiselect1').prop('checked', false);
}
e.preventDefault();
});

159
chat.html Normal file
View File

@@ -0,0 +1,159 @@
<html>
<head>
<meta charset="utf8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>OBSN Chat Overlay</title>
<style>
@font-face {
font-family: 'Cousine';
src: url('fonts/Cousine-Bold.ttf') format('truetype');
}
body {
margin:0;
padding:0 10px;
height:100%;
border: 0;
display: flex;
flex-direction: column-reverse;
position:absolute;
bottom:0;
overflow:hidden;
max-width:100%;
}
div {
margin:0;
background-color: black;
padding: 8px 8px 0px 8px;
color: white;
font-family: Cousine, monospace;
font-size: 3.2em;
line-height: 1.1em;
letter-spacing: 0.0em;
text-transform: uppercase;
text-shadow: 0.05em 0.05em 0px rgba(0,0,0,1);
max-width:100%;
word-wrap: break-word;
overflow-wrap: break-word;
word-break: break-all;
hyphens: auto;
display:inline-block;
}
a {
color:white;
font-size:1.2em;
text-transform: none;
word-wrap: break-word;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-all;
hyphens: auto;
}
</style>
<script>
(function (w) {
w.URLSearchParams =
w.URLSearchParams ||
function (searchString) {
var self = this;
self.searchString = searchString;
self.get = function (name) {
var results = new RegExp("[\?&]" + name + "=([^&#]*)").exec(
self.searchString
);
if (results == null) {
return null;
} else {
return decodeURI(results[1]) || 0;
}
};
};
})(window);
var urlParams = new URLSearchParams(window.location.search);
function loadIframe() {
var iframe = document.createElement("iframe");
var view= "";
if (urlParams.has("view")) {
view = "&view="+(urlParams.get("view") || "");
}
var room="";
if (urlParams.has("room")) {
room = "&room="+urlParams.get("room");
}
var password="";
if (urlParams.has("password")) {
password = "&password="+urlParams.get("password");
}
iframe.allow = "autoplay";
var srcString = "./?novideo&noaudio&label=chatOverlay&scene"+room+view+password;
iframe.src = srcString;
iframe.style.width="0";
iframe.style.height="0";
iframe.style.border="0";
document.body.appendChild(iframe);
//////////// LISTEN FOR EVENTS
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
/// If you have a routing system setup, you could have just one global listener for all iframes instead.
eventer(messageEvent, function (e) {
if (e.source != iframe.contentWindow){return} // reject messages send from other iframes
console.log(e);
if ("gotChat" in e.data){
logData(e.data.gotChat.label,e.data.gotChat.msg);
}
});
}
function printValues(obj) {
var out = "";
for (var key in obj) {
if (typeof obj[key] === "object") {
out += "<br />";
out += printValues(obj[key]);
} else {
if (key.startsWith("_")) {
} else {
out += "<b>" + key + "</b>: " + obj[key] + "<br />";
}
}
}
return out;
}
function logData(type, data) {
var span = document.createElement('span');
var entry = document.createElement('div');
if (type){
type = "<i>"+type.replace(/_/g, ' ')+"</i>";
}
entry.innerHTML = type + data;
span.appendChild(entry);
document.body.prepend(span);
}
</script>
</head>
<body onload="loadIframe();">
</body>
</html>

230
convert.html Normal file
View File

@@ -0,0 +1,230 @@
<head>
<link rel="stylesheet" href="./main.css?ver=39" />
<style>
.container {
max-width: 80%;
width: fit-content;
margin: 0 auto;
}
h1 {
margin-top: 1em;
margin-bottom: 1em;
padding: 10px;
}
.card {
margin: 10px;
box-shadow: 0 4px 8px 0 rgb(0 0 0 / 10%);
background-color: #ddd;
color: black;
margin-bottom: 1.5em;
}
.card>div {
padding: 10px;
}
.card h2 {
font-size: 1.5em;
padding: 10px;
background-color: #457b9d;
color: white;
border-bottom: 2px solid #3b6a87;
}
small {
font-style: italic;
display: block;
margin-left: 1em;
}
span.warning {
color: rgb(212, 191, 0);
}
input {
padding: 10px;
}
video {
max-width: 640px;
max-height: 360px;
padding: 20px;
}
audio {
max-width: 640px;
max-height: 360px;
padding: 20px;
}
div#processing {
display: none;
justify-content: center;
place-items: center;
position: absolute;
inset: 0;
font-size: 1.5em;
font-weight: bold;
background: #141926;
flex-direction: column;
}
</style>
</head>
<body style='color:white'>
<div id="header">
<a id="logoname" href="./" style="text-decoration: none; color: white; margin: 2px">
<span data-translate="logo-header">
<font id="qos">V</font>DO.Ninja
</span>
</a>
</div>
<div class="container">
<div id="info">
<h1>Web-based Media Conversion Tools</h1>
<div class="card">
<h2>WebM to MP4 (fixed 1280x720 resolution) <span class='warning'>(very slow!)</span></h2>
<div>
<small>The same as: fmpeg -i input.webm -vf scale=1280:720 output.mp4</small>
<input type="file" id="uploader" title="Convert WebM to MP4">
</div>
</div>
<div class="card">
<h2>MKV to MP4 (no transcoding)</h2>
<div>
<small>The same as: fmpeg -i INPUTFILE -vcodec copy -acodec copy output.mp4</small>
<input type="file" id="uploader2" accept=".mkv" title="Convert MKV to MP4">
</div>
</div>
<div class="card">
<h2>WebM MP4 files (no transcoding, attempts to force high resolutions)</h2>
<div>
<input type="file" id="uploader3" accept=".webm" title="Convert WebM to MP4">
</div>
</div>
<div class="card">
<h2>WebM to Audio-only files (opus or wav)</h2>
<div>
<input type="file" id="uploader4" accept=".webm" title="Convert WebM to OPUS">
</div>
</div>
<div id="processing">
<span id="message"></span>
<video id="player" controls style="display:none"></video>
<audio id="player2" controls style="display:none"></audio>
</div>
</div>
<script src="https://unpkg.com/@ffmpeg/ffmpeg@0.9.6/dist/ffmpeg.min.js"></script>
<script>
function download(data, filename) {
const blob = new Blob([data.buffer]);
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 100);
}
const { createFFmpeg, fetchFile } = FFmpeg;
const ffmpeg = createFFmpeg({ log: true });
const transcode = async ({ target: { files } }) => {
const { name } = files[0];
document.getElementById('uploader').style.display = "none";
document.getElementById('uploader2').style.display = "none";
document.getElementById('uploader3').style.display = "none";
document.getElementById('message').innerText = "Transcoding file... this will take a while";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
await ffmpeg.run('-i', name, '-vf', 'scale=1280:720', 'output.mp4');
const data = ffmpeg.FS('readFile', 'output.mp4');
const video = document.getElementById('player');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play video or download it.";
}
const transmux = async ({ target: { files } }) => {
const { name } = files[0];
document.getElementById('uploader').style.display = "none";
document.getElementById('uploader2').style.display = "none";
document.getElementById('uploader3').style.display = "none";
document.getElementById('message').innerText = "Transcoding file... this will take a while";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
await ffmpeg.run('-i', name, '-vcodec', 'copy', '-acodec', 'copy', 'output.mp4');
const data = ffmpeg.FS('readFile', 'output.mp4');
const video = document.getElementById('player');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play video or download it.";
}
const force1080 = async ({ target: { files } }) => {
const { name } = files[0];
const sourceBuffer = await fetch("./media/cap.webm").then(r => r.arrayBuffer());
document.getElementById('uploader').style.display = "none";
document.getElementById('uploader2').style.display = "none";
document.getElementById('uploader3').style.display = "none";
document.getElementById('message').innerText = "Tweaking file... this will take a moment";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
ffmpeg.FS("writeFile", "cap.webm", new Uint8Array(sourceBuffer, 0, sourceBuffer.byteLength));
await ffmpeg.run("-i", "concat:cap.webm|" + name, "-safe", "0", "-c", "copy", "-avoid_negative_ts", "1", "-strict", "experimental", "output.mp4");
const data = ffmpeg.FS('readFile', 'output.mp4');
const video = document.getElementById('player');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play video or download it.";
document.getElementById('processing').style.display = 'flex';
}
const convertToAudioOnly = async ({ target: { files } }) => {
const { name } = files[0];
document.getElementById('message').innerText = "Transcoding file... this will take a while";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
const video = document.getElementById('player');
await ffmpeg.run('-i', name, '-vn', '-acodec', 'copy', 'output.opus');
const data = ffmpeg.FS('readFile', 'output.opus');
console.log(data.buffer.byteLength);
if (data.buffer.byteLength) {
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'audio/opus' }));
download(data, name.split(".")[0] + ".opus");
} else {
await ffmpeg.run('-i', name, '-vn', '-acodec', 'copy', 'output.wav');
const data2 = ffmpeg.FS('readFile', 'output.wav');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'audio/pcm' }));
download(data2, name.split(".")[0] + ".wav");
}
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play audio or download it.";
document.getElementById('processing').style.display = 'flex';
}
document.getElementById('uploader').addEventListener('change', transcode);
document.getElementById('uploader2').addEventListener('change', transmux);
document.getElementById('uploader3').addEventListener('change', force1080);
document.getElementById('uploader4').addEventListener('change', convertToAudioOnly);
</script>
</body>

127
devices.css Normal file
View File

@@ -0,0 +1,127 @@
#devices {
max-width: 80%;
width: fit-content;
margin: 0 auto;
}
h1 {
font-size: 1.5em;
padding:10px;
background-color:#457b9d;
color:white;
border-bottom: 2px solid #3b6a87;
}
.device {
display: flex;
flex-direction: column;
margin: 10px 0px;
font-size: 1rem;
padding: 10px;
position: relative;
user-select: none;
background: #d0d0d0;
border-radius: 4px;
}
.device.selected {
background-color: #3ea03c;
}
.device.selected::before {
content: "\f00c";
font-family: "Line Awesome Free";
font-weight: 900;
position: absolute;
top: 10px;
right: 10px;
}
.device:hover {
cursor: pointer;
}
.device-name{
font-weight: bold;
margin-bottom: 5px;
}
.device-id {
}
.card {
margin: 10px;
}
.card > div {
padding: 10px;
}
.notice {
background-color: #fff18c;
margin: 10px;
padding: 20px 20px;
font-weight: bold;
font-size: 1.2em;
text-align: center;
line-height: 1.4em;
}
.notice a {
color: #457b9d;
}
@media only screen
and (min-device-width: 375px)
and (max-device-width: 812px)
and (orientation: portrait) {
#devices {
width: 100%;
max-width: 100%;
}
.device-id {
text-overflow: ellipsis;
overflow: hidden;
}
}
#sharedDevices {
position: fixed;
bottom: 20px;
width: 80%;
left: 10%;
color: white;
overflow-wrap: anywhere;
background: #2c3754;
padding: 20px;
box-shadow: 0px 0px 10px 5px #00000047;
border: 1px solid #333c52;
}
#sharedDevices span {
display: block;
margin-bottom: 10px;
}
#sharedDevices input {
width: 100%;
padding: 5px;
}
span#close {
position: absolute;
top: -10px;
right: -10px;
display: block;
width: 20px;
height: 20px;
background: #457b9d;
text-align: center;
border-radius: 20px;
line-height: 20px;
font-size: 20px;
cursor: pointer;
}

227
devices.html Normal file
View File

@@ -0,0 +1,227 @@
<html>
<head>
<link rel="stylesheet" href="./lineawesome/css/line-awesome.min.css" />
<link rel="stylesheet" href="./main.css?ver=11" />
<link rel="stylesheet" href="./devices.css?ver=1" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf8" />
</head>
<body>
<div id="header">
<a
id="logoname"
href="./"
style="text-decoration: none; color: white; margin: 2px"
>
<span data-translate="logo-header">
<font id="qos">O</font>BS.Ninja
</span>
</a>
</div>
<div id="devices">
<div class="notice">
Device IDs are bound to a combination of domain and browser. <br />If
you want to use electron-capture, open this URL on the electron-capture
app. <br/>
Click device names to preset them. Select multiple audio inputs by clicking multiple devices.
</div>
<div class="notice">
Check for browser and camera capabilities <a href="/supports">here</a>.
</div>
<div class="card">
<h1>🎤 Audio Inputs</h1>
<div id="audioInputs"></div>
</div>
<div class="card">
<h1>📹 Video Inputs</h1>
<div id="videoInputs"></div>
</div>
<div class="card">
<h1>🔉 Audio Outputs</h1>
<div id="audioOutputs"></div>
</div>
</div>
<div id="sharedDevices" style="display: none">
<span>Click to copy. Use this URL to preset audio/video devices.</span>
<span id="close" onclick="this.parentNode.style.display='none'">×</span>
<input id="devicesUrl" value="" />
</div>
<script>
const list = [];
const url = new URL(document.location.origin);
const audioInputDevices = [];
function isAudioInput(value) {
return value.kind === "audioinput";
}
function isAudioOutput(value) {
return value.kind === "audiooutput";
}
function isVideoInput(value) {
return value.kind === "videoinput";
}
function sanitizeDeviceName(deviceName) {
return String(deviceName).toLowerCase().replace(/[\W]+/g, "_");
}
function addDevice(element) {
const type = element.dataset.deviceType;
const device = sanitizeDeviceName(element.querySelector('span').innerText);
if (type === "audioinput") {
setAudioSearchParams(element);
}
if (type === "videoinput") {
setVideoSearchParams(element);
}
if (type === "audiooutput") {
setAudioOutputSearchParams(element);
}
/*
Allows for multiple audio devices to be selected
Will be output as a comma separated string to &ad
*/
function setAudioSearchParams(info) {
// Device was already selected
if (info.className === "device selected") {
// Remove device from list of selected devices
const index = audioInputDevices.indexOf(device);
if (index !== -1) {
audioInputDevices.splice(index, 1);
}
// Set the url param to the devices that are left
url.searchParams.set("ad", audioInputDevices.join(","));
element.className = "device";
// If no audio devices remained, just remove the param completely
if (audioInputDevices.length === 0) {
url.searchParams.delete("ad");
}
} else {
// Device is unselected
audioInputDevices.push(device);
url.searchParams.set("ad", audioInputDevices.join(","));
element.className = "device selected";
}
}
/*
Only allows for a single video device to be selected
*/
function setVideoSearchParams(info) {
// Device was already selected
if (info.className === "device selected") {
element.className = "device";
// Set the url param to the devices that are left
url.searchParams.set("vd", device);
element.className = "device";
// If no devices remained, just remove the param completely
if (audioInputDevices.length === 0) {
url.searchParams.delete("vd");
}
} else {
// Device is unselected
try {
element.parentElement.querySelector('.device.selected').className = "device";
} catch (error) {
console.log("There was no video device already selected.");
}
url.searchParams.set("vd", device);
element.className = "device selected";
}
}
/*
Only allows for a single audio output device to be selected
*/
function setAudioOutputSearchParams(info) {
// Device was already selected
if (info.className === "device selected") {
element.className = "device";
// Set the url param to the devices that are left
url.searchParams.set("od", device);
element.className = "device";
// If no devices remained, just remove the param completely
if (audioInputDevices.length === 0) {
url.searchParams.delete("od");
}
} else {
// Device is unselected
try {
element.parentElement.querySelector('.device.selected').className = "device";
} catch (error) {
console.log("There was no video device already selected.");
}
url.searchParams.set("od", device);
element.className = "device selected";
}
}
// Update UI
showDeviceIdsPopup();
}
function showDeviceIdsPopup() {
document.getElementById("devicesUrl").value = decodeURIComponent(url);
document.getElementById("sharedDevices").style.display = "block";
}
function prettyPrint(json, element) {
let output = "<div class='prettyJson two-col'>";
let nestedObjs;
Object.entries(json)
.sort()
.forEach(([key, value]) => {
output += `
<div class='device' onclick='addDevice(this)' data-device-type='${value.kind}'>
<span class='device-name'>${value.label}</span>
<span class='device-id'>
${value.deviceId}
</span>
</div>`;
});
output += "</div>";
document.getElementById(element).innerHTML = output;
}
document.getElementById("devicesUrl").onclick = (e) => {
e.target.select();
document.execCommand("copy");
};
navigator.mediaDevices
.enumerateDevices()
.then((devices) => {
devices.forEach((device) => {
console.log(
`${device.kind}: ${device.label} id = ${device.deviceId}`
);
list.push(device);
});
prettyPrint(devices.filter(isAudioInput), "audioInputs");
prettyPrint(devices.filter(isAudioOutput), "audioOutputs");
prettyPrint(devices.filter(isVideoInput), "videoInputs");
})
.catch((err) => {
console.log(`${err.name}: ${err.message}`);
});
</script>
</body>
</html>

24
devices.json.html Normal file
View File

@@ -0,0 +1,24 @@
<html>
<head><meta charset="UTF-8"></head>
<body>
<script>
var list = [];
navigator.mediaDevices.enumerateDevices()
.then(function(devices) {
devices.forEach(function(device) {
console.log(device.kind + ": " + device.label +
" id = " + device.deviceId);
list.push(device);
});
document.write(JSON.stringify(list, null, 2));
})
.catch(function(err) {
console.log(err.name + ": " + err.message);
});
</script>
</body>
</html>

298
dock.html Normal file
View File

@@ -0,0 +1,298 @@
<html>
<head>
<style>
body {
transform: scale(0.7);
transform-origin: 0 0;
margin:2px;
padding:0;
border:0;
color: #FFF;
background-color: #1F1E1F;
font-family: Arial, Helvetica, sans-serif;
width:300px;
overflow:hidden;
text-overflow: ellipsis;
white-space: nowrap;
min-width:1px;
}
#container-links {
z-index:10;
width:100%;
height:100%;
display:none;
}
#container-setup {
width:100%;
height:100%;
display:block;
}
.red {
background-color:#FCC;
}
.green {
background-color:#CFC;
}
.task {
cursor:grab;
width:100%;
padding:5px;
border:2px solid black;
margin:0;
}
button{
padding:5px;
transform: scale(1.4);
transform-origin: 0 0;
}
.gone {
position: absolute;
display:inline-block;
left: -9999px;
}
</style>
</head>
<body>
<script>
function getById(id) {
var el = document.getElementById(id);
if (!el) {
console.warn(id + " is not defined; skipping.");
el = document.createElement("span"); // create a fake element
}
return el;
}
function copyFunction(copyText) {
copyText.select();
copyText.setSelectionRange(0, 99999);
document.execCommand("copy");
}
function generateStreamID(){
var text = "";
var possible = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789";
for (var i = 0; i < 7; i++){
text += possible.charAt(Math.floor(Math.random() * possible.length));
}
console.log(text);
return text;
};
function toHexString(byteArray){
return Array.prototype.map.call(byteArray, function(byte){
return ('0' + (byte & 0xFF).toString(16)).slice(-2);
}).join('');
}
generateHash = function (str, length=false){
var buffer = new TextEncoder("utf-8").encode(str);
return crypto.subtle.digest("SHA-256", buffer).then(
function (hash) {
hash = new Uint8Array(hash);
if (length){
hash = hash.slice(0, parseInt(parseInt(length)/2));
}
hash = toHexString(hash);
return hash;
}
);
};
function generateInvite(){
var title = encodeURI(getById("videoname").value.replace(/[\W]+/g,"_"));
if (title.length){
title = "&label="+title;
}
var sid = generateStreamID();
var viewstr = "";
var sendstr = "";
if (getById("invite_bitrate").checked){
viewstr+="&bitrate=20000";
}
if (getById("invite_vp9").checked){
viewstr+="&codec=vp9";
}
if (getById("invite_h264").checked){
viewstr+="&codec=h264";
}
if (getById("invite_stereo").checked){
viewstr+="&stereo";
sendstr+="&stereo";
}
//if (getById("invite_secure").checked){
// sendstr+="&secure";
//}
if (getById("invite_hidescreen").checked){
sendstr+="&webcam";
}
//if (getById("invite_remotecontrol").checked){ //
// var remote_gen_id = generateStreamID();
// sendstr+="&remote="+remote_gen_id; // security
// viewstr+="&remote="+remote_gen_id;
//}
if (getById("invite_joinroom").value.trim().length){
sendstr+="&room="+getById("invite_joinroom").value.replace(/[\W]+/g,"_");
viewstr+="&scene&room="+getById("invite_joinroom").value.replace(/[\W]+/g,"_");
}
if (getById("invite_group_chat_type").value){ // 0 is default
if (getById("invite_group_chat_type").value==1){ // no video
sendstr+="&novideo";
} else if (getById("invite_group_chat_type").value==2){ // no view or audio
sendstr+="&view";
}
}
if (getById("invite_quality").value){
if (getById("invite_quality").value==0){
sendstr+="&quality=0";
} else if (getById("invite_quality").value==1){
sendstr+="&quality=1";
} else if (getById("invite_quality").value==2){
sendstr+="&quality=2";
}
}
var href = window.location.href;
var dir = href.substring(0, href.lastIndexOf('/')) + "/";
var salt = location.hostname; // "obs.ninja" is the expected default. You will want to change this if hosting dock.html locally.
if (getById("invite_password").value.trim().length){
generateHash(getById("invite_password").value.trim().replace(/[\W]+/g,"_")+salt,4).then(function(hash){
sendstr+="&hash="+hash;
viewstr+="&password="+getById("invite_password").value.trim();
sendstr = dir+'?push=' + sid + sendstr;
viewstr = dir+'?view=' + sid + viewstr + title;
getById("container-setup").style.display="none";
getById("container-links").style.display="block";
getById("guest-link").value = sendstr;
getById("obs-link").value = viewstr;
});
} else {
sendstr = dir+'?push=' + sid + sendstr;
viewstr = dir+'?view=' + sid + viewstr + title;
getById("container-setup").style.display="none";
getById("container-links").style.display="block";
getById("guest-link").value = sendstr;
getById("obs-link").value = viewstr;
}
}
function goBack(){
getById("container-setup").style.display="block";
getById("container-links").style.display="none";
}
document.addEventListener("dragstart", event => {
var url = event.target.href || event.target.value;
if (!url || !url.startsWith('https://')) return;
if (event.target.dataset.drag!="1"){
return;
}
//event.target.ondragend = function(){event.target.blur();}
var streamId = url.split('view=');
var label = url.split('label=');
url += '&layer-name=OBSN';
if (streamId.length>1) url += ': ' + streamId[1].split('&')[0];
if (label.length>1) url += ' - ' + decodeURI(label[1].split('&')[0]);
url += '&layer-width=1920'; // this isn't always 100% correct, as the resolution can fluxuate, but it is probably good enough
url += '&layer-height=1080';
event.dataTransfer.setDragImage(document.querySelector('#dragImage'), 24, 24);
event.dataTransfer.setData("text/uri-list", encodeURI(url));
//event.dataTransfer.setData("url", encodeURI(url));
//warnlog(event);
});
</script>
<div id="container-setup" >
<button style="padding:5px;" onclick="generateInvite()" >
<span data-translate="generate-invite-link">GENERATE THE INVITE LINK</span>
</button>
<br /><br />
<input type="checkbox" id="invite_bitrate" /><label for="invite_bitrate"> <span data-translate="unlock-video-bitrate">Unlock Video Bitrate (20mbps)</span></label>
<br />
<input type="checkbox" id="invite_vp9" onclick="getById('invite_h264').checked=false;" /><label for="invite_vp9"> <span data-translate="force-vp9-video-codec">VP9 Video Codec</span></label>
<br />
<input type="checkbox" id="invite_h264" onclick="getById('invite_vp9').checked=false;" /><label for="invite_h264"> <span data-translate="force-h264-video-codec">H264 Video Codec</span></label>
<br />
<input type="checkbox" id="invite_stereo" /><label for="invite_stereo"> <span data-translate="enable-stereo-and-pro">Stereo and Pro HD Audio</span></label>
<br />
<br />
<label for="invite_quality" data-translate="video-resolution">Video Resolution: </label>
<select id="invite_quality" name="invite_quality">
<option value="-1" selected>User Selectable</option>
<option value="0">Maximum Resolution</option>
<option value="1">Balanced</option>
<option value="2">Smooth and Cool</option>
</select>
<br />
<br />
<input type="checkbox" id="invite_hidescreen" />
<label for="invite_hidescreen"> <span data-translate="hide-screen-share">Hide Screenshare Option</span></label>
<br />
<br />
<label for="videoname">Stream Label:</label>
<input id="videoname" placeholder="Give stream a description" />
<br />
<br />
<span data-translate="add-a-password-to-stream"> Add password:</span>
<input id="invite_password" placeholder="Add an optional password" />
<br /><br />
<span data-translate="add-the-guest-to-a-room"> Add to a room:</span>
<input id="invite_joinroom" placeholder="Enter Room name here" oninput="document.getElementById('invitegroupchat').style.display='block';" />
<br />
<br />
<span id="invitegroupchat" style="display:none;">
<label for="invite_group_chat_type" data-translate="invite-group-chat-type">This room guest can:</label><br />
<select id="invite_group_chat_type" name="invite_group_chat_type">
<option value="0" selected data-translate="can-see-and-hear">Can see and hear the group chat</option>
<option value="1" data-translate="can-hear-only">Can only hear the group chat</option>
<option value="2" data-translate="cant-see-or-hear">Cannot hear or see the group chat</option>
</select>
</span>
</div>
<div id="container-links" >
<button onclick="goBack()" >
<span >Go Back</span>
</button>
<div id="container-links-inner" >
<br /><br />
<h3>Guest Invite Link:</h3>
<input id="guest-link" class="task green" onclick="copyFunction(this)" onmousedown="copyFunction(this)"/>
<br /><br />
<h3>OBS Browser Source Link:</h3>
<input id="obs-link" class="task red" data-drag="1" onmousedown="copyFunction(this)" onclick="copyFunction(this)" />
<br />
<br />
<i>(links are draggable)</i>
</div>
</div>
<div class="gone" >
<!-- This image is used when dragging elements -->
<img src="./media/favicon-32x32.png" id="dragImage" />
</div>
</body>
</html>

331
dual.html Normal file
View File

@@ -0,0 +1,331 @@
<html>
<head><title>Dual Input</title>
<style>
body{
padding:0;
margin:0;
}
iframe {
border:0;
margin:0;
padding:0;
display:block;
margin:0px;
min-height: 100px;
min-width: 100px;
max-height: 95%;
max-width: 99%%;
float: left;
position: fixed;
}
#viewlink {
width:400px;
}
input{
padding:5px;
margin:5px;
}
button{
padding:5px;
margin:5px;
position:relative;
}
.menu {
z-index: 10;
float:right;
right: 20px;
color: #fff;
}
.close {
background-color: #d33;
color: #fff;
}
.reload {
background-color: #0a0;
color: #fff;
}
.popup {
z-index: 9;
background-color: #f1f1f1;
border: 1px solid #d3d3d3;
text-align: center;
min-height: 100px;
min-width: 100px;
max-height: 95%;
max-width: 99%;
scale: 0.5;
}
.popup {
position: absolute;
/*resize: both; !*enable this to css resize*! */
overflow: auto;
}
.popup-header {
cursor: move;
background-color: #2196f3;
}
.popup .resizer-right {
width: 5px;
height: 100%;
background: transparent;
position: absolute;
right: 0;
bottom: 0;
cursor: e-resize;
}
.popup .resizer-bottom {
width: 100%;
height: 5px;
background: transparent;
position: absolute;
right: 0;
bottom: 0;
cursor: n-resize;
}
.popup .resizer-both {
width: 5px;
height: 5px;
background: transparent;
z-index: 10;
position: absolute;
right: 0;
bottom: 0;
cursor: nw-resize;
}
/*NOSELECT*/
.popup * {
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Safari */
-khtml-user-select: none; /* Konqueror HTML */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version, currently
supported by Chrome and Opera */
}
</style>
</head>
<body>
<input placeholder="Enter an OBS.Ninja Room Link" id="viewlink" />
<button onclick="loadIframe();">Load URL</button>You can drag and resize the generated windows; multiple can be created.
<div id="container"></div>
<script>
var currentZIndex = 100;
function initDragElement(popup){
var pos1 = 0,
pos2 = 0,
pos3 = 0,
pos4 = 0;
var elmnt = null;
var header = getHeader(popup);
var iframe = getIFrame(popup);
popup.onmousedown = function() {
this.style.zIndex = "" + ++currentZIndex;
};
if (header) {
header.parentPopup = popup;
header.onmousedown = dragMouseDown;
}
function dragMouseDown(e) {
elmnt = this.parentPopup;
elmnt.style.zIndex = "" + ++currentZIndex;
e = e || window.event;
// get the mouse cursor position at startup:
pos3 = e.clientX;
pos4 = e.clientY;
document.onmouseup = closeDragElement;
// call a function whenever the cursor moves:
document.onmousemove = elementDrag;
}
function elementDrag(e) {
if (!elmnt) {
return;
}
e = e || window.event;
// calculate the new cursor position:
pos1 = pos3 - e.clientX;
pos2 = pos4 - e.clientY;
pos3 = e.clientX;
pos4 = e.clientY;
// set the element's new position:
elmnt.style.top = elmnt.offsetTop - pos2 + "px";
elmnt.style.left = elmnt.offsetLeft - pos1 + "px";
iframe.style.top = elmnt.offsetTop - pos2 + "px";
iframe.style.left = elmnt.offsetLeft - pos1 + "px";
}
function closeDragElement() {
/* stop moving when mouse button is released:*/
document.onmouseup = null;
document.onmousemove = null;
}
function getHeader(element) {
var headerItems = element.getElementsByClassName("popup-header");
if (headerItems.length === 1) {
return headerItems[0];
}
return null;
}
function getIFrame(element) {
var headerItems = element.getElementsByTagName("iframe");
if (headerItems.length === 1) {
return headerItems[0];
}
return null;
}
}
function initResizeElement(p) {
var iframe = getIFrame(p);
var element = null;
var startX, startY, startWidth, startHeight;
var right = document.createElement("div");
right.className = "resizer-right";
p.appendChild(right);
right.addEventListener("mousedown", initDrag, false);
right.parentPopup = p;
var bottom = document.createElement("div");
bottom.className = "resizer-bottom";
p.appendChild(bottom);
bottom.addEventListener("mousedown", initDrag, false);
bottom.parentPopup = p;
var both = document.createElement("div");
both.className = "resizer-both";
p.appendChild(both);
both.addEventListener("mousedown", initDrag, false);
both.parentPopup = p;
function initDrag(e) {
element = this.parentPopup;
startX = e.clientX;
startY = e.clientY;
startWidth = parseInt(
document.defaultView.getComputedStyle(element).width,
10
);
startHeight = parseInt(
document.defaultView.getComputedStyle(element).height,
10
);
document.documentElement.addEventListener("mousemove", doDrag, false);
document.documentElement.addEventListener("mouseup", stopDrag, false);
document.documentElement.addEventListener("click", stopDrag, false)
}
function doDrag(e) {
if (e.buttons==0){
stopDrag(e);
return false;
}
element.style.width = startWidth + e.clientX - startX + "px";
element.style.height = startHeight + e.clientY - startY + "px";
iframe.style.width = startWidth + e.clientX - startX + "px";
iframe.style.height = startHeight + e.clientY - startY + "px";
}
function stopDrag(e) {
document.documentElement.removeEventListener("mousemove", doDrag, false);
document.documentElement.removeEventListener("mouseup", stopDrag, false);
}
function getIFrame(element) {
var headerItems = element.getElementsByTagName("iframe");
if (headerItems.length === 1) {
return headerItems[0];
}
return null;
}
}
function loadIframe(){
var iframeContainer = document.createElement("div");
iframeContainer.className="popup";
iframeContainer.style.zIndex = "" + ++currentZIndex;
iframeContainer.style.width="325px";
iframeContainer.style.height="420px";
var button = document.createElement("button");
button.innerHTML = "Move";
button.className = "popup-header menu";
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Close";
button.className = "menu close";
button.onclick = function(){iframe.contentWindow.postMessage({"close":true}, '*');iframe.parentNode.parentNode.removeChild(iframeContainer);}
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Reload";
button.className = "menu reload";
button.onclick = function(){iframe.contentWindow.postMessage({"reload":true}, '*');}
iframeContainer.appendChild(button);
var iframe = document.createElement("iframe");
iframe.allow="autoplay";
iframe.src = document.getElementById("viewlink").value || "https://obs.ninja";
iframe.style.width="325px";
iframe.style.height="420px";
iframeContainer.appendChild(iframe);
document.getElementById("container").appendChild(iframeContainer);
initDragElement(iframeContainer);
initResizeElement(iframeContainer);
}
</script>
</body>
</html>

View File

@@ -1,299 +1,572 @@
<html>
<head><style>
html {
border:0;
margin:0;
}
video {
margin: 0;
padding: 0;
overflow: hidden;
cursor: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=), none;
user-select: none;
}
body {
padding: 0 0px;
height: 100%;
width: 100%;
background-color: #141926;
background-color: -webkit-linear-gradient(to top, #181925, #141826, #0F2027); /* Chrome 10-25, Safari 5.1-6 */
background-color: linear-gradient(to top, #181825, #141926, #0F2027); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
font-size: 2em;
font-family: Helvetica, Arial, sans-serif;
display: flex;
flex-flow: column;
border:0;
margin:0;
}
button{
padding:10px;
font-size: 20px;
margin: auto auto;
}
#header{
height:80px;
width:100%;
background-color: #101520;
}
.inputfield{
font-size: 20px;
align-self:center;
height:30px;
width:780px;
margin: auto auto;
padding:20px
}
.formcss{
font-size: 20px;
align-self:center;
margin: auto auto;
}
label {
font: white;
font-size: 1em;
color: white;
}
input[type='checkbox'] {
-webkit-appearance:none;
width:30px;
height:30px;
background:white;
border-radius:5px;
border:2px solid #555;
cursor: pointer;
}
input[type='checkbox']:checked {
background: #1A1;
}
</style></head>
<body >
<div id="header" style="-webkit-app-region: drag;color:white;font-size:2em">OBS.Ninja</div>
<div class="formcss" >
<input type="checkbox" class="check" id="prefervp9" name="prefervp9" value="false" onclick="modURL(this);">
<label for="prefervp9">Force VP9 Codec</label>
<input type="checkbox" class="check" id="showcursor" name="showcursor" value="false" onclick="modURL(this);">
<label for="showcursor">Show Mouse Cursor</label>
<input type="checkbox" class="check" id="highbitrate" name="highbitrate" value="false" onclick="modURL(this);">
<label for="highbitrate">High Video Bitrate</label>
<input type="checkbox" class="check" id="stereo" name="stereo" value="false" onclick="modURL(this);">
<label for="stereo">Pro Audio Mode</label><br><br><br>
<div class="formcss">
<input type="text" id="changeText" class="inputfield" value="http://obs.ninja/?view=" onchange="modURL" onkeyup="enterPressed(event, gohere);" />
<button onclick="gohere();" id="gobutton">GO</button>
<br><br>
<label for="audioOutput">Audio output destination: </label><select id="audioOutput" style="max-width:400px"></select>
</div>
</div>
<script>
/*
* Copyright (c) 2020 Steve Seguin. All Rights Reserved.
*
* Use of this source code is governed by the APGLv3 open-source license
* that can be found in the LICENSE file in the root of the source
* tree. Alternative licencing options can be made available on request.
*
*/
var audioOutputSelect = document.querySelector('select#audioOutput');
audioOutputSelect.disabled = !('sinkId' in HTMLMediaElement.prototype);
audioOutputSelect.onclick = getPermssions;
audioOutputSelect.onchange = updateOutputTarget;
var listed = false;
function updateOutputTarget(e){
console.log("change audio: "+audioOutputSelect.value);
var url = document.getElementById('changeText').value;
url=updateURLParameter(url, "sink", audioOutputSelect.value);
document.getElementById('changeText').value = url;
}
function getPermssions(e){
if (listed==true){
return;
}
e.currentTarget.blur();
navigator.mediaDevices.getUserMedia({audio: true,video: false}).then(function(stream){
navigator.mediaDevices.enumerateDevices().then(gotDevices).catch(console.error); // list all devices
stream.getTracks().forEach(track => {
track.stop();
});
listed=true;
audioOutputSelect.focus();
}).catch(function(){alert("Failed to list available output devices\n\nPlease ensure you allowed the microphone permissions.");});
}
function gotDevices(deviceInfos) {
for (let i = 0; i !== deviceInfos.length; ++i) {
const deviceInfo = deviceInfos[i];
const option = document.createElement('option');
option.value = deviceInfo.deviceId;
if (deviceInfo.kind === 'audiooutput'){
option.text = deviceInfo.label || `speaker ${audioOutputSelect.length + 1}`;
audioOutputSelect.appendChild(option);
} else {
console.log('Some other kind of source/device: ', deviceInfo);
}
}
listed=true;
}
function enterPressed(event, callback){
if (event.keyCode === 13){ // Number 13 is the "Enter" key on the keyboard
event.preventDefault(); // Cancel the default action, if needed
callback();
}
}
(function (w) {
w.URLSearchParams = w.URLSearchParams || function (searchString) {
var self = this;
self.searchString = searchString;
self.get = function (name) {
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(self.searchString);
if (results == null) {
return null;
}
else {
return decodeURI(results[1]) || 0;
}
};
}
})(window)
var urlParams = new URLSearchParams(window.location.search);
var isMobile = false;
if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)){ // does not detect iPad Pros.
isMobile=true; // if iOS, default to H264? meh. let's not.
}
function updateURLParameter(url, param, paramVal){
var TheAnchor = null;
var newAdditionalURL = "";
var tempArray = url.split("?");
var baseURL = tempArray[0];
var additionalURL = tempArray[1];
var temp = "";
if (additionalURL){
var tmpAnchor = additionalURL.split("#");
var TheParams = tmpAnchor[0];
TheAnchor = tmpAnchor[1];
if (TheAnchor){additionalURL = TheParams;}
tempArray = additionalURL.split("&");
for (var i=0; i<tempArray.length; i++){
if(tempArray[i].split('=')[0] != param){
newAdditionalURL += temp + tempArray[i];
temp = "&";
}
}
} else {
var tmpAnchor = baseURL.split("#");
var TheParams = tmpAnchor[0];
TheAnchor = tmpAnchor[1];
if(TheParams){baseURL = TheParams;}
}
if (paramVal==false){
temp="";
if(TheAnchor){temp += "#" + TheAnchor;}
var rows_txt = temp
} else {
if(TheAnchor){paramVal += "#" + TheAnchor;}
var rows_txt = temp + "" + param + "=" + paramVal;
}
return baseURL + "?" + newAdditionalURL + rows_txt;
}
if (urlParams.has('name')){
var name = urlParams.get('name');
if (name!="OBSNinja"){
document.getElementById('changeText').value = "https://obs.ninja/?view="+name;
}
}
function modURL(ele=false){
var url = document.getElementById('changeText').value;
console.log(url);
if ((url.split("view").length>0) || (url.split("room").length>0)){
if (!document.getElementById("showcursor").checked){
url=updateURLParameter(url, "nocursor", "1");
} else {
url=updateURLParameter(url, "nocursor", false);
}
if (ele!=false){
if (ele.id =="prefervp9"){
if (document.getElementById("prefervp9").checked){
url=updateURLParameter(url, "codec", "vp9");
} else {
url=updateURLParameter(url, "codec", false);
}
}
if (ele.id =="highbitrate"){
if (document.getElementById("highbitrate").checked){
url=updateURLParameter(url, "bitrate", "10000");
} else {
url=updateURLParameter(url, "bitrate", false);
}
}
if (ele.id =="stereo"){
if (document.getElementById("stereo").checked){
url=updateURLParameter(url, "stereo", "1");
alert('Audio bitrate increased to 256kbps.\n\nPlease note: the Video Publisher must also have the stereo flag enabled for stereo to work.');
} else {
url=updateURLParameter(url, "stereo", false);
}
}
}
}
document.getElementById('changeText').value = url;
console.log(url);
return url;
}
function gohere(){
var url = modURL(true);
window.location = url;
};
</script>
</body>
</html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<link rel="stylesheet" href="./lineawesome/css/line-awesome.min.css" />
<style>
html {
border:0;
margin:0;
outline:0;
overflow: hidden;
}
video {
margin: 0;
padding: 0;
overflow: hidden;
cursor: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=), none;
user-select: none;
}
body {
padding: 0 0px;
height: 100%;
width: 100%;
background-color: -webkit-linear-gradient(to top, #363644, 50%, #151b29); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to top, #363644, 50%, #151b29); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
font-size: 2em;
font-family: Helvetica, Arial, sans-serif;
display: flex;
flex-flow: column;
border:0;
margin:0;
outline:0;
}
button.glyphicon-button:focus,
button.glyphicon-button:active:focus,
button.glyphicon-button.active:focus,
button.glyphicon-button.focus,
button.glyphicon-button:active.focus,
button.glyphicon-button.active.focus {
outline: none !important;
}
#gobutton {
font-size: 20px;
font-weight: bold;
border: none;
background: #6aab23;
display: flex;
border-radius: 0px;
border-top-right-radius: 10px;
border-bottom-right-radius: 10px;
box-shadow: 0 12px 15px -10px #5ca70b, 0 2px 0px #6aab23;
color: white;
cursor: pointer;
box-sizing: border-box;
align-items: center;
padding: 0 1em;
}
#header{
width:100%;
background-color: #101520;
}
input#changeText {
font-size: 1em;
align-self: center;
width: 100%;
padding: 1em;
font-weight: bold;
background: white;
border: 4px solid white;
box-shadow: 0px 30px 40px -32px #6aab23, 0 2px 0px #6aab23;
border-top-left-radius: 10px;
border-bottom-left-radius: 10px;
transition: all 0.2s linear;
box-sizing: border-box;
border-bottom-right-radius: 0;
border-top-right-radius: 0;
}
input#changeText:focus {
outline: none;
}
.container{
font-size: 20px;
align-self:center;
margin: auto auto;
}
label {
font: white;
font-size: 1em;
color: white;
}
input[type='checkbox'] {
-webkit-appearance:none;
width:30px;
height:30px;
background:white;
border-radius:5px;
border:2px solid #555;
cursor: pointer;
}
input[type='checkbox']:checked {
background: #1A1;
}
#audioOutput, #lastUrls {
font-size: calc(16px + 0.3vw);
width: 730px;
height: 100%;
flex: 20;
border-radius: 10px;
padding: 1em;
background: #eaeaea;
cursor:pointer;
}
label[for="audioOutput"] {
font-size: 3em;
color: #FE53BB;
text-shadow: 0px 0px 30px #fe53bb;
padding-right: 10px;
}
label[for="changeText"] {
font-size: 3em;
color: #00F6FF;
text-shadow: 0px 0px 30px #00f6ff;
padding-top: 5px;
padding-right: 10px;
}
label[for="lastUrls"] {
font-size: 3em;
color: #1a1;
text-shadow: 0px 0px 30px #1a1;
padding-right: 10px;
cursor: pointer;
}
div#audioOutputContainer, #history {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: center;
margin: 4em;
}
@media only screen and (max-width: 1030px) {
body{
zoom: 0.9;
-moz-transform: scale(0.9);
-moz-transform-origin: 0 0;
}
}
#messageDiv {
font-size: .7em;
color: #DDD;
transition: all 0.5s linear;
font-style: italic;
opacity: 0;
text-align: center;
margin: 10px 0;
}
div#urlInput {
margin: 4em;
display: flex;
flex-direction: row;
}
@media only screen and (max-width: 940px) {
body{
zoom: 0.74;
-moz-transform: scale(0.74);
-moz-transform-origin: 0 0;
}
.container{
max-width:99%;
}
div#urlInput {
margin: 2em;
}
div#audioOutputContainer, #history {
margin: 2em;
}
}
@media only screen and (max-width: 840px) {
body{
zoom: 0.64;
-moz-transform: scale(0.64);
-moz-transform-origin: 0 0;
}
}
@media only screen and (max-height: 639px) {
div#urlInput {
margin: 2em;
}
div#audioOutputContainer, #history {
margin: 2em;
}
}
@media only screen and (max-width: 767px) {
div#urlInput {
margin: 2em 1em;
}
div#audioOutputContainer, #history {
margin: 2em 1em;
}
}
@media only screen and (max-height: 380px) {
div#urlInput {
margin: 1em;
}
div#audioOutputContainer, #history {
margin: 1em;
}
}
label[for="audioOutput"], label[for="lastUrls"] {
font-size: 3em;
}
#warning4mac, #electronVersion {
background: #8500f7;
box-shadow: 0px 0px 50px 10px #8500f7ab, inset 0px 0px 10px 2px #8d08ffba;
border: 2px solid #8500f7;
border-radius: 10px;
width: 90%;
padding:1em;
margin:0 auto;
color:white;
font-size:1.3em;
margin-bottom: 20px;
}
#warning4mac a, #electronVersion a {
color:white;
}
ul#lastUrls {
list-style: none;
background: #101520;
color: white;
padding: 1em;
}
ul#lastUrls li {
padding: 5px 0px;
}
ul#lastUrls li:nth-child(even) {
background-color: #182031;
}
#inputCombo {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
flex-grow: 1;
}
</style>
</head>
<body >
<div id="header" style="-webkit-app-region: drag;color:#6f6f6f;font-size:40px; line-height: 40px; padding: 20px; letter-spacing: 3; font-weight: bold;">Electron Capture</div>
<div class="container" >
<div id='warning4mac' style="display:none;"> ✨ Great News! OBS v26.1.2 <a href="https://github.com/obsproject/obs-browser/issues/209#issuecomment-748683083">now supports</a> VDO.Ninja without needing the Electron Capture app! 🥳</div>
<div id="electronVersion" style="display:none;">✨ Great News! <a href="https://github.com/steveseguin/electroncapture/releases/latest">Electron Capture <span id="currentElectronVersion"></span></a> is now available!<br>Update yours today to stay up-to-date with security patches.</div>
<div id="messageDiv" style='display:block'><br /></div>
<div class="container">
<div id="urlInput" title="Put the link you want to load here">
<label for="changeText">
<i class="las la-play"></i>
</label>
<div id="inputCombo">
<input type="text" id="changeText" class="inputfield" value="http://vdo.ninja/?view=" onchange="modURL" onkeyup="enterPressed(event, gohere);" />
<button onclick="gohere();" id="gobutton">GO</button>
</div>
</div>
<div id="audioOutputContainer" title="This option will only work with the official vdo.ninja domain">
<label for="audioOutput"><i class="las la-headphones"></i></label><select id="audioOutput"></select>
</div>
<div id="history" title="History of past links used. You can clear this history using the button to the left">
<label for="lastUrls" onclick="resetHistory()">
<i class="las la-history"></i>
</label>
<select id="lastUrls" onchange="setUrl()"></select>
</div>
</div>
</div>
<script>
/*
* Copyright (c) 2020 Steve Seguin. All Rights Reserved.
*
* Use of this source code is governed by the APGLv3 open-source license
* that can be found in the LICENSE file in the root of the source
* tree. Alternative licencing options can be made available on request.
*
*/
var lastUrls = JSON.parse(localStorage.getItem('lastUrls'));
if (lastUrls != undefined) {
document.querySelector("#changeText").value = lastUrls[0];
if (lastUrls.length>0){
lastUrls.forEach((url)=>{
var o = document.createElement('option');
o.value = url;
o.text = url;
document.querySelector("#lastUrls").appendChild(o);
})
} else {
document.querySelector("#history").style.display="none";
}
} else {
document.querySelector("#history").style.display="none";
}
function setUrl(){
document.querySelector("#changeText").value = document.querySelector("#lastUrls").value;
gohere();
}
function resetHistory(){
localStorage.clear();
document.querySelector('#lastUrls').innerHTML = '';
lastUrls = [];
}
(function (w) {
w.URLSearchParams = w.URLSearchParams || function (searchString) {
var self = this;
self.searchString = searchString;
self.get = function (name) {
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(self.searchString);
if (results == null) {
return null;
}
else {
return decodeURI(results[1]) || 0;
}
};
}
})(window)
var urlParams = new URLSearchParams(window.location.search);
if (navigator.userAgent.indexOf('Mac OS X') != -1){
document.getElementById("warning4mac").style.display="block";
} else if (location.hostname.toLowerCase() == "obs.ninja"){
try {
if (navigator.userAgent.toLowerCase().indexOf(' electron/') > -1) { // for now, just PC or Linux versions only.
function compareVersions(version){
version = version.split(".");
fetch('https://api.github.com/repos/steveseguin/electroncapture/releases/latest')
.then(response => response.json())
.then(data => {
console.log("recentVersion: "+data.tag_name);
var recentVersion = data.tag_name.split(".");
var ood = false;
if (recentVersion[0]>version[0]){
ood = true;
} else if (recentVersion[0]==version[0]) {
if (recentVersion[1]>version[1]){
ood = true;
} else if (recentVersion[1]==version[1]) {
if (recentVersion[2]>version[2]){
ood = true;
}
}
}
if (ood){
document.getElementById("electronVersion").style.display = "block";
document.getElementById("currentElectronVersion").innerText = data.tag_name;
}
}).catch(console.error);
}
if (urlParams.has('version')){
var ver = urlParams.get('version');
console.log("version: "+ver);
compareVersions(ver);
} else{
var checkVersion = setTimeout(function(){ // pre 1.5.2
compareVersions("0.0.0");
},500);
const ipcRenderer = require('electron').ipcRenderer;
console.log("ELECTRON DETECTED");
ipcRenderer.on('appVersion', function(event, version) {
clearTimeout(checkVersion);
console.log("version: "+version);
compareVersions(version);
})
ipcRenderer.send('getAppVersion');
}
}
} catch(e){console.error(e);}
}
var audioOutputSelect = document.querySelector('select#audioOutput');
audioOutputSelect.disabled = !('sinkId' in HTMLMediaElement.prototype);
audioOutputSelect.onclick = getPermssions;
audioOutputSelect.onchange = updateOutputTarget;
var listed = false;
function updateOutputTarget(e){
console.log("change audio: "+audioOutputSelect.value);
var url = document.getElementById('changeText').value;
url=updateURLParameter(url, "sink", audioOutputSelect.value);
document.getElementById('changeText').value = url;
}
function getPermssions(e=null){
if (listed==true){
return;
}
if (e!==null){
e.currentTarget.blur();
}
navigator.mediaDevices.getUserMedia({audio: true,video: false}).then((stream)=>{
navigator.mediaDevices.enumerateDevices().then(gotDevices).catch(console.error); // list all devices
stream.getTracks().forEach(track => {
track.stop();
});
listed=true;
audioOutputSelect.focus();
}).catch(function(){
document.getElementById("messageDiv").innerHTML = "Failed to list available output devices\n\nPlease ensure you allowed the microphone permissions.";
document.getElementById("messageDiv").style.display="block";
setTimeout(function(){document.getElementById("messageDiv").style.opacity="1.0";},0);
});
}
function gotDevices(deviceInfos) {
for (let i = 0; i !== deviceInfos.length; ++i) {
const deviceInfo = deviceInfos[i];
const option = document.createElement('option');
option.value = deviceInfo.deviceId;
if (deviceInfo.kind === 'audiooutput'){
option.text = deviceInfo.label || `speaker ${audioOutputSelect.length + 1}`;
audioOutputSelect.appendChild(option);
} else {
console.log('Some other kind of source/device: ', deviceInfo);
}
}
listed=true;
}
function enterPressed(event, callback){
if (event.keyCode === 13){ // Number 13 is the "Enter" key on the keyboard
event.preventDefault(); // Cancel the default action, if needed
callback();
}
}
var isMobile = false;
if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)){ // does not detect iPad Pros.
isMobile=true; // if iOS, default to H264? meh. let's not.
}
// Windows can show the cursor, since it captures in a different way.
//if (navigator.platform.indexOf("Win") != -1){
// document.getElementById("showcursor").checked=true;
//}
function updateURLParameter(url, param, paramVal){
var TheAnchor = null;
var newAdditionalURL = "";
var tempArray = url.split("?");
var baseURL = tempArray[0];
var additionalURL = tempArray[1];
var temp = "";
if (additionalURL){
var tmpAnchor = additionalURL.split("#");
var TheParams = tmpAnchor[0];
TheAnchor = tmpAnchor[1];
if (TheAnchor){additionalURL = TheParams;}
tempArray = additionalURL.split("&");
for (var i=0; i<tempArray.length; i++){
if(tempArray[i].split('=')[0] != param){
newAdditionalURL += temp + tempArray[i];
temp = "&";
}
}
} else {
var tmpAnchor = baseURL.split("#");
var TheParams = tmpAnchor[0];
TheAnchor = tmpAnchor[1];
if(TheParams){baseURL = TheParams;}
}
if (paramVal===false){
temp="";
if(TheAnchor){temp += "#" + TheAnchor;}
var rows_txt = temp
} else if (paramVal===""){
if(TheAnchor){paramVal += "#" + TheAnchor;}
var rows_txt = temp + "" + param;
} else {
if(TheAnchor){paramVal += "#" + TheAnchor;}
var rows_txt = temp + "" + param + "=" + paramVal;
}
return baseURL + "?" + newAdditionalURL + rows_txt;
}
if (urlParams.has('name')){
var name = urlParams.get('name');
if (name!="OBSNinja" && name!="VDONinja"){
document.getElementById('changeText').value = "https://vdo.ninja/?view="+name;
}
}
function addUrlToHistory(url){
if (lastUrls == undefined){
lastUrls = [];
}
if ( lastUrls[0] != url ) {
lastUrls.unshift(url);
if (lastUrls.length == 6) {
lastUrls.pop();
}
}
}
function modURL(){
var url = document.getElementById('changeText').value;
if (url.startsWith("obs.ninja")){
url = "https://"+url;
}
console.log(url);
return url;
}
function gohere(){
addUrlToHistory(document.getElementById('changeText').value);
localStorage.setItem('lastUrls', JSON.stringify(lastUrls));
var url = modURL();
if ((document.getElementById('changeText').value.includes("obs.ninja")) && (document.getElementById('changeText').value.includes("http")) && (document.getElementById('changeText').value.includes("&sink"))){
alert("Notice: OBS.Ninja has been replaced by VDO.Ninja.\n\nPlease update your links accordingly for audio output to work correctly.");
} else if (!(document.getElementById('changeText').value.includes(window.location.hostname)) && (document.getElementById('changeText').value.includes("http")) && (document.getElementById('changeText').value.includes("&sink"))){
alert("Notice: The &sink command is domain specific.\nVisit https://YOURDOMAIN.com/electron instead.");
}
window.location = url;
};
getPermssions();
</script>
</body>
</html>

View File

@@ -0,0 +1,264 @@
<html>
<head>
<title>OBS.Ninja IFRAME Outgoing Stats Example</title>
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
<link rel="icon" type="image/png" sizes="32x32" href="./images/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="./images/favicon-16x16.png" />
<link rel="icon" href="./images/favicon.ico" />
<link itemprop="thumbnailUrl" href="./images/obsNinja_logo_full.png" />
<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<style>
body {
padding: 0;
margin: 0;
background-color: rgb(20, 25, 38);
}
iframe {
border: 0;
margin: 2px auto;
padding: 0;
display: block;
margin: 10px;
width: 640px;
height: 320px;
background-color: black;
}
input {
padding: 5px;
margin: 5px;
}
button {
padding: 5px;
margin: 5px;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row controls" style="margin-bottom:15px;border-bottom:1px solid black;">
<div class="col-8">
<input type="text" class="form-control" style="width:95%;margin:10px auto;" placeholder="Enter an OBS.Ninja View URL here" value="" id="viewlink" />
</div>
<div class="col-4">
<div class="row">
<div class="col-2"></div>
<div class="col-10">
<button type="button" class="btn btn-primary" style="margin:10px 0;width:calc(90% + 15px);margin-left:5px;" id="btnStart">Start</button>
</div>
</div>
</div>
</div>
<div class="row output">
<div class="col-7" id="source">
<iframe style="margin:0 auto;" allow="autoplay;camera;microphone" src=""></iframe>
</div>
<div class="col-5" id="sourcecontrols">
<div class="row text-light" style="margin-top:15px;">
<div class="col">
<p>This example will show all connections to the stream generated from this page using statistics gathered using the <a href="https://github.com/steveseguin/obsninja/blob/master/IFRAME.md">iFrame API</a>.</p>
<p>Click start to generate a stream using the OBS.Ninja URL shown. If you use the example URL shown, you can <a id="aView" href="" target="_blank">click here</a> to connect to this stream as a viewer in a new window/tab, this will then show in the table below. Expired connections will be removed after a short delay.</p>
</div>
</div>
<div class="row" style="margin-top:5px;">
<div style="padding-top:10px;" class="col-4 text-right font-weight-bold text-light">Audio:</div>
<div class="col-8">
<button type="button" class="btn btn-sm btn-secondary" style="width:45%;" id="btnMuteAudio">Disable</button>
<button type="button" class="btn btn-sm btn-success" style="width:45%;" id="btnUnMuteAudio">Enabled</button>
</div>
</div>
<div class="row">
<div style="padding-top:10px;" class="col-4 text-right font-weight-bold text-light">Video:</div>
<div class="col-8">
<button type="button" class="btn btn-sm btn-secondary" style="width:45%;" id="btnMuteVidio">Disable</button>
<button type="button" class="btn btn-sm btn-success" style="width:45%;" id="btnUnMuteVidio">Enabled</button>
</div>
</div>
<div class="row">
<div style="padding-top:10px;" class="col-4 text-right font-weight-bold text-light">Stats:</div>
<div class="col-8">
<button type="button" class="btn btn-sm btn-secondary" style="width:45%;" id="btnStatsAuto">Auto Refresh Off</button>
<button type="button" class="btn btn-sm btn-secondary" style="width:45%;" id="btnStatsRefresh">Refresh</button>
</div>
</div>
<div class="row">
<div style="padding-top:5px;" class="col-6 text-right font-weight-bold text-light">Outbound Connections:</div>
<div style="padding-top:5px;" class="col-6 font-weight-bold text-light" id="divTotalConnections">0</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<table id="viewers" style="margin-top:15px;" class="table table-hover text-center table-striped table-dark">
<thead>
<tr>
<th scope="col" class="align-middle">Label</th>
<th scope="col" class="align-middle">Added</th>
<th scope="col" class="align-middle">Quality Limit Reason</th>
<th scope="col" class="align-middle">Resolution</th>
<th scope="col" class="align-middle">Platform</th>
<th scope="col" class="align-middle">Encoder</th>
<th scope="col" class="align-middle">User Agent</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<script>
var autorefresh = false;
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
eventer(messageEvent, function(e) {
//Check message is coming from our iframe, otherwise we don't care
if (e.source != $('#source iframe')[0].contentWindow) return;
if ("stats" in e.data) {
var now = new Date(); //Used for "Added" column and to remove stale viewers
for (var viewer in e.data.stats.outbound_stats) {
//Check to see if a row exists for this viewier, if not then its a new viewer and we should create a row
if ($("#obsn_viewer_" + viewer).length == 0) {
var h = now.getHours();
var m = now.getMinutes();
var s = now.getSeconds();
$('#viewers tbody').append('<tr id="obsn_viewer_' + viewer + '"><th class="obsn_viewer_label" scope="row"></th><td class="obsn_viewer_added">' + ("0" + h).slice(-2) + ':' + ("0" + m).slice(-2) + ':' + ("0" + s).slice(-2) + '</td><td class="obsn_viewer_qlr"></td><td class="obsn_viewer_resolution"></td><td class="obsn_viewer_platform"></td><td class="obsn_viewer_encoder"></td><td class="obsn_viewer_useragent"></td></tr>');
}
//Insert/update stats
//Initially objects can be available but without any attributes, check they exist and ignore till the basics are available
if (e.data.stats.outbound_stats[viewer] == undefined) continue;
if (e.data.stats.outbound_stats[viewer].info == undefined) continue;
//Checking these exist as not all attributes are available straight away when stats are created
if (e.data.stats.outbound_stats[viewer].info.label != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_label').text(e.data.stats.outbound_stats[viewer].info.label);
}
if (e.data.stats.outbound_stats[viewer].quality_Limitation_Reason != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_qlr').text(e.data.stats.outbound_stats[viewer].quality_Limitation_Reason);
}
if (e.data.stats.outbound_stats[viewer].resolution != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_resolution').text(e.data.stats.outbound_stats[viewer].resolution);
}
if (e.data.stats.outbound_stats[viewer].info.platform != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_platform').text(e.data.stats.outbound_stats[viewer].info.platform);
}
if (e.data.stats.outbound_stats[viewer].encoder != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_encoder').text(e.data.stats.outbound_stats[viewer].encoder);
}
if (e.data.stats.outbound_stats[viewer].info.useragent != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_useragent').text(e.data.stats.outbound_stats[viewer].info.useragent);
}
$("#obsn_viewer_" + viewer).data('last', now.getTime()); //Used below to remove old viewers
}
//Mark and then remove viewers who have not been seen for a while
$('#viewers tbody tr').each(function(el) {
if (parseInt($(this).data('last')) < (now.getTime() - 10000)) { //10 seconds
$(this).remove();
} else if (parseInt($(this).data('last')) < (now.getTime())) { //Mark viewer in red to show they have disappeared, note that it takes a few seconds for this to happen
$(this).addClass('bg-danger');
} else { //Viewer is there, make sure they're not marked as missing
$(this).removeClass('bg-danger');
}
});
$('#divTotalConnections').text(e.data.stats.total_outbound_connections);
}
});
$(document).ready(function() {
$('#btnMuteAudio').on('click', function() {
$(this).addClass('btn-success').removeClass('btn-secondary').text('Disabled');
$('#btnUnMuteAudio').removeClass('btn-success').addClass('btn-secondary').text('Enable');
$('#source iframe')[0].contentWindow.postMessage({
"mic": false
}, '*');
});
$('#btnUnMuteAudio').on('click', function() {
$(this).addClass('btn-success').removeClass('btn-secondary').text('Enabled');
$('#btnMuteAudio').removeClass('btn-success').addClass('btn-secondary').text('Disable');
$('#source iframe')[0].contentWindow.postMessage({
"mic": true
}, '*');
});
$('#btnMuteVidio').on('click', function() {
$(this).addClass('btn-success').removeClass('btn-secondary').text('Disabled');
$('#btnUnMuteVidio').removeClass('btn-success').addClass('btn-secondary').text('Enable');
$('#source iframe')[0].contentWindow.postMessage({
"camera": false
}, '*');
});
$('#btnUnMuteVidio').on('click', function() {
$(this).addClass('btn-success').removeClass('btn-secondary').text('Enabled');
$('#btnMuteVidio').removeClass('btn-success').addClass('btn-secondary').text('Disable');
$('#source iframe')[0].contentWindow.postMessage({
"camera": true
}, '*');
});
$('#btnStatsAuto').on('click', function() {
if (autorefresh) {
autorefresh = false;
$('#btnStatsAuto').removeClass('btn-success').addClass('btn-secondary').text('Auto Refresh Off');
} else {
autorefresh = true;
$('#btnStatsAuto').addClass('btn-success').removeClass('btn-secondary').text('Auto Refresh On');
}
});
$('#btnStatsRefresh').on('click', function() {
$(this).addClass('btn-success').removeClass('btn-secondary').attr('disabled', true);
$('#source iframe')[0].contentWindow.postMessage({
"getStats": true
}, '*');
setTimeout(function() {
$('#btnStatsRefresh').addClass('btn-secondary').removeClass('btn-success').attr('disabled', false);
}, 700);
});
$('#btnStart').on('click', function() {
//Reset buttons as currently we can't check the state of these properties
$('#btnMuteAudio,#btnMuteVidio').removeClass('btn-success').addClass('btn-secondary').text('Disable');
$('#btnUnMuteAudio,#btnUnMuteVidio').addClass('btn-success').removeClass('btn-secondary').text('Enabled');
//Update the iframe source from the input field, yup, that simple
$('#source iframe').attr('src', $('#viewlink').val());
//Start autorefresh of stats
autorefresh = true;
$('#btnStatsAuto').addClass('btn-success').removeClass('btn-secondary').text('Auto Refresh On');
});
//Start checking for stats
setInterval(function() {
if (autorefresh == false) return;
$('#source iframe')[0].contentWindow.postMessage({
"getStats": true
}, '*');
}, 1000);
//Add in random ID and password strings to URL's, the below is purely for the purposes of this example
var pushid = makeid();
var password = makeid();
var baseUrl = "https://obs.ninja/";
$('#aView').attr('href', baseUrl + '?view=' + pushid + '&password=' + password + '&label=Test_Link');
$('#viewlink').val(baseUrl + '?push=' + pushid + '&password=' + password + '&autostart&turn=false&fps=25&maxbitrate=1000&cleanoutput&audiobitrate=32&aec=0&denoise=0&webcam');
});
//This function is purely used to generate random push id and password strings for the purposes of this example
function makeid() {
var result = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0; i < 8; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
</script>
</body>
</html>

406
iframe.html Normal file
View File

@@ -0,0 +1,406 @@
<html>
<head><title>IFRAME Example</title>
<style>
body{
padding:0;
margin:0;
background-color: rgb(222,242,253);
}
iframe {
border:0;
margin:0;
padding:0;
display:block;
margin:10px;
width:640px;
height:320px;
}
#viewlink {
width:400px;
}
#container {
display:block;
padding:0px;
}
input{
padding:5px;
margin:5px;
}
button{
padding:5px;
margin:5px;
}
</style>
<script>
function loadIframe(){ // this is pretty important if you want to avoid camera permission popup problems. You can also call it automatically via: <body onload=>loadIframe();"> , but don't call it before the page loads.
var iframe = document.createElement("iframe");
var iframeContainer = document.createElement("div");
var iframesrc = document.getElementById("viewlink").value;
iframe.allow="autoplay;camera;microphone";
iframe.allowtransparency="true";
iframe.allowfullscreen ="true";
if (iframesrc==""){
iframesrc="./";
}
if (document.getElementById("clean").checked){
if (iframesrc.includes("?")){
iframesrc+='&';
} else {
iframesrc+='?';
}
iframesrc+="cleanoutput";
}
if (document.getElementById("transparent").checked){
if (iframesrc.includes("?")){
iframesrc+='&';
} else {
iframesrc+='?';
}
iframesrc+="transparent";
}
if (document.getElementById("hidemenu").checked){
if (iframesrc.includes("?")){
iframesrc+='&';
} else {
iframesrc+='?';
}
iframesrc+="hidemenu";
}
iframe.src = iframesrc;
iframeContainer.appendChild(iframe);
document.getElementById("container").appendChild(iframeContainer);
var button = document.createElement("button");
button.innerHTML = "Mute Speaker";
button.onclick = function(){iframe.contentWindow.postMessage({"mute":true}, '*');}; // "speaker" also works in the same way.
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Un-Mute Speaker";
button.onclick = function(){iframe.contentWindow.postMessage({"mute":false}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Toggle Speaker";
button.onclick = function(){iframe.contentWindow.postMessage({"mute":"toggle"}, '*');}; // open to a better suggestion here.
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Mute Mic";
button.onclick = function(){iframe.contentWindow.postMessage({"mic":false}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Un-Mute Mic";
button.onclick = function(){iframe.contentWindow.postMessage({"mic":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Toggle Mic";
button.onclick = function(){iframe.contentWindow.postMessage({"mic":"toggle"}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Mute Camera";
button.onclick = function(){iframe.contentWindow.postMessage({"camera":false}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Unmute Camera";
button.onclick = function(){iframe.contentWindow.postMessage({"camera":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Toggle Camera";
button.onclick = function(){iframe.contentWindow.postMessage({"camera":"toggle"}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Disconnect";
button.onclick = function(){iframe.contentWindow.postMessage({"close":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Low Bitrate";
button.onclick = function(){iframe.contentWindow.postMessage({"bitrate":30}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "High Bitrate";
button.onclick = function(){iframe.contentWindow.postMessage({"bitrate":5000}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Default Bitrate";
button.onclick = function(){iframe.contentWindow.postMessage({"bitrate":-1}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Reload";
button.onclick = function(){iframe.contentWindow.postMessage({"reload":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "50% Volume";
button.onclick = function(){iframe.contentWindow.postMessage({"volume":0.5}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "100% Volume";
button.onclick = function(){iframe.contentWindow.postMessage({"volume":1.0}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Request Stats";
button.onclick = function(){iframe.contentWindow.postMessage({"getStats":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Request Loudness Levels";
button.onclick = function(){iframe.contentWindow.postMessage({"getLoudness":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Stop Sending Loudness Levels";
button.onclick = function(){iframe.contentWindow.postMessage({"getLoudness":false}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Start Recording";
button.onclick = function(){iframe.contentWindow.postMessage({"record":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Stop Recording";
button.onclick = function(){iframe.contentWindow.postMessage({"record":false}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Say Hello";
button.onclick = function(){iframe.contentWindow.postMessage({"sendChat":"Hello!"}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Send Keyframe";
button.onclick = function(){iframe.contentWindow.postMessage({"keyframe":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Insert Style Sheet";
var stylesheet = "#main { zoom: 0.5;} video {float: left; margin: 0; padding: 0; } #info {display:none;}";
button.onclick = function(){iframe.contentWindow.postMessage({"style":stylesheet}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "get StreamIDs and labels";
button.onclick = function(){iframe.contentWindow.postMessage({"getStreamIDs":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Start AutoMixer";
button.onclick = function(){iframe.contentWindow.postMessage({"automixer":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Stop AutoMixer";
button.onclick = function(){iframe.contentWindow.postMessage({"automixer":false}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "ENABLE TALLY LIGHT";
button.onclick = function(){iframe.contentWindow.postMessage({"sceneState":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "STOP TALLY LIGHT";
button.onclick = function(){iframe.contentWindow.postMessage({"sceneState":false}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Add Target Video";
button.onclick = function(){iframe.contentWindow.postMessage({"target":"*", "add":true, "settings":{"style":{"width":"640px", "height":"360px", "float":"left", "border":"10px solid red", "display":"block"}}}, '*');}; // target can be a stream ID or * for all.
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Remove Target Video";
button.onclick = function(){iframe.contentWindow.postMessage({"target":"*", "remove": true}, '*');}; // target can be a stream ID or * for all.
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "previewWebcam()";
button.onclick = function(){iframe.contentWindow.postMessage({"function":"previewWebcam"}, '*');}; // publishScreen
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Change to Camera #2";
button.onclick = function(){iframe.contentWindow.postMessage({"changeVideoDevice":2}, '*');}; // change text of add camera button
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Change to Microphone #4";
button.onclick = function(){iframe.contentWindow.postMessage({"changeAudioDevice":4}, '*');}; // change text of add camera button
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "eval('alert(\"DANGERUS\")'";
button.onclick = function(){iframe.contentWindow.postMessage({"function":"eval", "value":'alert(\"DANGERUS\")'}, '*');}; // publishScreen
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Change Add Camera text";
button.onclick = function(){iframe.contentWindow.postMessage({"function":"changeHTML", "target":"add_camera", "value":"NEW CAMERA TEXT"}, '*');}; // change text of add camera button
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "CLOSE IFRAME";
button.onclick = function(){iframeContainer.parentNode.removeChild(iframeContainer);};
iframeContainer.appendChild(button);
//////////// LISTEN FOR EVENTS
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
/// If you have a routing system setup, you could have just one global listener for all iframes instead.
eventer(messageEvent, function (e) {
if (e.source != iframe.contentWindow){return} // reject messages send from other iframes
if ("stats" in e.data){
var outputWindow = document.createElement("div");
console.log(e.data.stats);
var out = "<br />total_inbound_connections:"+e.data.stats.total_inbound_connections;
out += "<br />total_outbound_connections:"+e.data.stats.total_outbound_connections;
for (var streamID in e.data.stats.inbound_stats){
out += "<br /><br /><b>streamID:</b> "+streamID+"<br />";
out += printValues(e.data.stats.inbound_stats[streamID]);
}
outputWindow.innerHTML = out;
iframeContainer.appendChild(outputWindow);
}
if ("gotChat" in e.data){
var outputWindow = document.createElement("div");
outputWindow.innerHTML = e.data.gotChat.msg;
outputWindow.style.border="1px dotted black";
iframeContainer.appendChild(outputWindow);
}
if ("action" in e.data){
var outputWindow = document.createElement("div");
outputWindow.innerHTML = "child-page-action: "+e.data.action+"<br />";
outputWindow.style.border="1px dotted black";
iframeContainer.appendChild(outputWindow);
}
if ("streamIDs" in e.data){
var outputWindow = document.createElement("div");
outputWindow.innerHTML = "child-page-action: streamIDs<br />";
for (var key in e.data.streamIDs) {
outputWindow.innerHTML += "streamID: " + key + ", label:"+e.data.streamIDs[key] + "\n";
}
outputWindow.style.border="1px dotted black";
iframeContainer.appendChild(outputWindow);
}
if ("loudness" in e.data){
console.log(e.data);
if (document.getElementById("loudness")){
outputWindow = document.getElementById("loudness");
} else {
var outputWindow = document.createElement("div");
outputWindow.style.border="1px dotted black";
iframeContainer.appendChild(outputWindow);
outputWindow.id = "loudness";
}
outputWindow.innerHTML = "child-page-action: loudness<br />";
for (var key in e.data.loudness) {
outputWindow.innerHTML += key + " Loudness: " + e.data.loudness[key] + "\n";
}
outputWindow.style.border="1px black";
}
if ("sensors" in e.data){
console.log(e.data);
if (document.getElementById("sensors")){
outputWindow = document.getElementById("sensors");
} else {
var outputWindow = document.createElement("div");
outputWindow.style.border="1px dotted black";
iframeContainer.appendChild(outputWindow);
outputWindow.id = "sensors";
}
outputWindow.innerHTML = "child-page-action: sensors<br /><br />";
for (var key in e.data.sensors.lin) {
outputWindow.innerHTML += key + " linear: " + e.data.sensors.lin[key] + "<br />";
}
for (var key in e.data.sensors.acc) {
outputWindow.innerHTML += key + " acceleration: " + e.data.sensors.acc[key] + "<br />";
}
for (var key in e.data.sensors.gyro) {
outputWindow.innerHTML += key + " gyro: " + e.data.sensors.gyro[key] + "<br />";
}
for (var key in e.data.sensors.mag) {
outputWindow.innerHTML += key + " magnet: " + e.data.sensors.mag[key] + "<br />";
}
outputWindow.style.border="1px black";
}
});
}
function printValues( obj) {
var out = "";
for (var key in obj) {
if (typeof obj[key] === "object") {
out +="<br />";
out += printValues(obj[key]);
} else {
out +="<b>"+key+"</b>: "+obj[key]+"<br />";
}
}
return out;
}
</script>
</head>
<body>
<input placeholder="Enter an OBS.Ninja View URL here" id="viewlink" />
<button onclick="loadIframe();">ADD</button>
<input type="checkbox" id="clean" checked>Clean Output
<input type="checkbox" id="transparent" checked>Transparent
<input type="checkbox" id="hidemenu">Hide Menu
<div id="container">
</div>
</body>
</html>

1971
index.html

File diff suppressed because it is too large Load Diff

105
install.md Normal file
View File

@@ -0,0 +1,105 @@
Deploying this code. A guide. (INITIAL DRAFT VERSION)
### PREFACE
The code is obvious enough already that someone experienced with NGINX webservers or with basic site deployments should have no problem getting things running.
I'm concerned at times that less experienced users will be deploying the code without really understanding why or properly how to. There are few cases a person needs to deploy any code. Those reasons are: wanting custom branding; contributing as a developer to the codebase; or deploying a private TURN server.
There may be misconceptions that deploying the website code will make the service faster; it will not. The service is video peer-to-peer based, so deploying webservers servers will not make it faster. Deploying a TURN server may help in some cases, although using a VPN, a cloud VM (for OBS), or disabling any symmetrical firewall will often provide a better end result than a private TURN server.
For those looking for a brand-free experience already with a different domain name, I offer https://rtc.ninja, and as well as other alternate domain names, such as:
- https://chromicam.com
- https://invite.cam (via URL obfuscation option)
- https://ltt.ninja
- https://rtc.ninja
- https://vmix.ninja
- https://webrtc.party
- https://callin.ninja
- https://auxiliary.live (backup hosted)
- https://backup.vdo.ninja (fully backup hosted)
There is also an isolated version specificly designed for use in mainland China, hosted at https://insecure.cam in Hong Kong AWS.
You can also point your domain to the VDO.Ninja IP address (provided on request), which will also rebrand the site automatically to match your domain name. (Requires Cloudflare as DNS server and proxy, Flexible SSL cert on, and HTTPs always on - all free.)
For those wanting a private TURN server setup, you can load the settings for those via the URL parameters. If infrequently needing a private TURN, this is a great solution. You can also use URL forwarding services to load up a customized link to VDO.Ninja, with URL parameters already included, such as https://invite.mypersonaldomain.com , which might secretly resolve to https://vdo.ninja/?room=myRoom&hash=3423&label or such.
VDO.Ninja also supports IFRAMES, so you can embed VDO.Ninja into your website and customize it via both URL parameters, but also via the IFRAME API. You can insert custom CSS styles with this method, giving VDO.Ninja quite a bit of flare.
See more on IFRAMES here: https://github.com/steveseguin/vdo.ninja/blob/master/IFRAME.md
Understanding clearly why you need to deploy any code or server is important. Maintaining updated deployed code can be quite hard, as VDO.Ninja updates frequently, so there are good reasons to consider an IFRAME approach instead. Feature requests there are welcomed.
That all aside, please continue:
### SETUP
There's a community-created video tutorial on setting up here; https://youtu.be/8sDMwBIlgwE Otherwise, read on.
I use Cloudflare with Flexible SSL enabled and HTTP Rewrites. If you do not use Cloudflare, you will need to deploy SSL certificates onto your website. You will also have to have Cloudflare or whatever DNS provider you have, point your domain name to the IP address of your webserver. VDO.Ninja REQUIRES a domain name and SSL.
For webservers, I use NGINX on a Ubuntu server; smaller the better. I rely on Cloudflare to provide caching and SSL, so my installation of NGINX is pretty simple.
```
sudo apt-get update
apt-get install nginx -y
sudo vi /etc/nginx/sites-available/default
sudo systemctl restart nginx
```
An example NGINX config file that "hides" the file extensions is as follows. Update the file as needed and
```server {
listen 80;
listen [::]:80;
server_name vdo.ninja;
root /var/www/html/vdo.ninja;
index index.html;
location ~ ^/([^/]+)/([^/?]+)$ {
root /var/www/html/vdo.ninja;
try_files /$1/$2 /$1/$2.html /$1/$2/ /$2 /$2/ /$1/index.html;
add_header Access-Control-Allow-Origin *;
add_header 'cross-origin-resource-policy' '*';
add_header 'Cross-Origin-Embedder-Policy' 'require-corp';
add_header 'Cross-Origin-Opener-Policy' 'same-origin';
}
location / {
if ($request_uri ~ ^/(.*)\.html$) {
return 302 /$1;
}
add_header 'cross-origin-resource-policy' '*';
add_header 'Cross-Origin-Embedder-Policy' 'require-corp';
add_header 'Cross-Origin-Opener-Policy' 'same-origin';
try_files $uri $uri.html $uri/ /index.html;
add_header Access-Control-Allow-Origin *;
}
}
```
You'll want to deploy (copy/clone) the GitHub VDO.Ninja files into your NGINX web folder, that is specified in your NGINX config file. Update the NGINX config file to match your domain and and folder, etc. Restart NGINX after.
As for the TURN server, it can run on a single or dual-core computer. It doesn't take much to host many users -- it mainly just needs a good internet connection. Most users will not need a TURN server, but since VDO.Ninja handles many different types of users, the TURN server is there as a failsafe for those occasional problem users. I'm assuming you know why you need and want a TURN server -- if not, you may not actually need one.
A guide and sample config file for the turn server is here:
https://github.com/steveseguin/vdo.ninja/blob/master/turnserver.md
If deploying to GCP or AWS, you might need to make some tweaks to the IP address values to include the internet local IP as well as the external. Please see online guides no setting up a TURN server for your particular setup. Setups will vary.
Once you have your TURN server setup, you can update the index.html of the VDO.Ninja code. Nightly or official releases should be fine to pull. You probably will want to uncomment the lines linked below once deployed, adjusting the default values to your liking and updating the server location address and credentials of your TURN server (if you deployed one that is). Unless your TURN server also provides STUN capabilities, you may want to also use the Google STUN servers, so uncomment that stuff too.
https://github.com/steveseguin/vdo.ninja/blob/df6c147311b9e7d19659ddbb1799d6598f59aa0d/index.html#L644
A newly deployed code deployment should work without any changes to the index.html file. The code needs to be constantly kept up to date though, as after a few months it may become deprecated and stop working. This is the reality of deploying VDO.Ninja -- you will need to update it every few months for it to continue to function well. Keep this in mind when making changes to the VDO.Ninja source code, as heavy custom changes will make updating harder to do. The fewer the changes the better.
My suggestion? Limit changes to images and perhaps the translation files (maybe add a new one); these are good starting points. If making changes to the main.css style sheet or index.html file, you should be mostly okay too, since these files are designed to be changed; I try to keep that in mind when updating the code at least. Making changes to other files though is strongly not recommend and in some cases discouraged. If you find a bug or need to make a change to other files, it might be best to make a Pull Request with the desired changes and hope it gets adopted into the main codebase.
Final note: I haven't provided here instructions on deploying STUN services or a private handshake server; the VDO.Ninja handshake server code is currently not provided, but access to it as a service is freely accessible for private deployments.
Regards,
Steve

1
lineawesome/LICENSE.txt Normal file
View File

@@ -0,0 +1 @@
If you use the icons publicly, please link to https://icons8.com/line-awesome somewhere on your page or artwork, so that more creators could know about it and use it for free.

1
lineawesome/Readme.md Normal file
View File

@@ -0,0 +1 @@
Please see: https://icons8.com/line-awesome

File diff suppressed because it is too large Load Diff

1
lineawesome/css/line-awesome.min.css vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 906 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,467 @@
<?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>Created by Icons8</metadata>
<defs>
<font id="la-regular-400" horiz-adv-x="1024">
<font-face font-family="la-regular-400"
units-per-em="1024" ascent="896"
descent="128"
font-weight="400" />
<missing-glyph horiz-adv-x="0" />
<glyph glyph-name="building"
unicode="&#xF1AD;"
horiz-adv-x="1024" d="M128 800L128 -32L480 -32L480 96L544 96L544 -32L896 -32L896 800zM192 736L832 736L832 32L608 32L608 160L416 160L416 32L192 32zM256 672L256 608L384 608L384 672zM448 672L448 608L576 608L576 672zM640 672L640 608L768 608L768 672zM256 544L256 480L384 480L384 544zM448 544L448 480L576 480L576 544zM640 544L640 480L768 480L768 544zM256 416L256 352L384 352L384 416zM448 416L448 352L576 352L576 416zM640 416L640 352L768 352L768 416zM256 288L256 224L384 224L384 288zM448 288L448 224L576 224L576 288zM640 288L640 224L768 224L768 288zM256 160L256 96L384 96L384 160zM640 160L640 96L768 96L768 160z" />
<glyph glyph-name="map"
unicode="&#xF279;"
horiz-adv-x="1024" d="M896 753L851 733L639 642L395 734L383 738L371 733L147 637L128 629L128 15L173 35L385 126L629 34L641 30L653 35L877 131L896 139zM416 658L608 586L608 110L416 182zM352 656L352 181L192 112L192 587zM832 656L832 181L672 112L672 587z" />
<glyph glyph-name="neutral-face"
unicode="&#xF11A;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM368 512C341.5 512 320 490.5 320 464C320 437.5 341.5 416 368 416C394.5 416 416 437.5 416 464C416 490.5 394.5 512 368 512zM656 512C629.5 512 608 490.5 608 464C608 437.5 629.5 416 656 416C682.5 416 704 437.5 704 464C704 490.5 682.5 512 656 512zM352 256L352 192L672 192L672 256z" />
<glyph glyph-name="eye-slash"
unicode="&#xF070;"
horiz-adv-x="1024" d="M119 823L73 777L272 579L627 224L688 162L905 -55L951 -9L752 190C887.5 257.124992 978.375008 356.7499840000001 984 363L1003 384L984 405C975.375008 414.624992 770.750016 640 512 640C449.375008 640 390.250016 626.249984 336 606zM512 576C580.875008 576 646 556.624992 704 530C724.624992 495.5 736 456.5 736 416C736 357.875008 713.5 304.7499840000001 677 265L586 356C599.375008 372.375008 608 393.124992 608 416C608 469 565 512 512 512C489.124992 512 468.375008 503.375008 452 490L387 555C426.750016 567.249984 468.375008 576 512 576zM214 547C111.375008 483.875008 44.750016 410.375008 40 405L21 384L40 363C48.250016 353.7499840000001 237.750016 146.375008 482 130C491.875008 129 501.875008 128 512 128C522.124992 128 532.124992 129 542 130C568.375008 131.7499840000001 594.124992 135.2499840000001 619 141L562 198C545.750016 194.2499840000001 529.250016 192 512 192C388.5 192 288 292.5 288 416C288 433 290.250016 449.624992 294 466zM232 482C226.875008 460.375008 224 438.375008 224 416C224 360.375008 239.624992 309.124992 267 265C193.750016 307 137.750016 356.2499840000001 109 384C132.875008 407.124992 175.875008 445.5 232 482zM792 482C848.124992 445.5 891 407.124992 915 384C886.250016 356.2499840000001 829.375008 306 756 264C783.5 308.124992 800 360.375008 800 416C800 438.375008 797.124992 460.5 792 482z" />
<glyph glyph-name="caret-square-up"
unicode="&#xF151;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM512 541L489 519L297 327L343 281L512 450L681 281L727 327L535 519z" />
<glyph glyph-name="copy"
unicode="&#xF0C5;"
horiz-adv-x="1024" d="M128 768L128 128L352 128L352 192L192 192L192 704L576 704L576 672L640 672L640 768zM384 640L384 0L896 0L896 640zM448 576L832 576L832 64L448 64z" />
<glyph glyph-name="dot-circle"
unicode="&#xF192;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM512 480C459 480 416 437 416 384C416 331 459 288 512 288C565 288 608 331 608 384C608 437 565 480 512 480z" />
<glyph glyph-name="grinning-face-with-big-eyes"
unicode="&#xF599;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM368 512A48 48 0 0 1 368 416A48 48 0 0 1 368 512zM656 512A48 48 0 0 1 656 416A48 48 0 0 1 656 512zM288 288C288 288 339.36 128 512 128C684.64 128 736 288 736 288L288 288z" />
<glyph glyph-name="save"
unicode="&#xF0C7;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 589L855 599L727 727L717 736zM224 672L320 672L320 480L704 480L704 658L800 562L800 96L736 96L736 384L288 384L288 96L224 96zM384 672L512 672L512 608L576 608L576 672L640 672L640 544L384 544zM352 320L672 320L672 96L352 96z" />
<glyph glyph-name="face-with-tears-of-joy"
unicode="&#xF588;"
horiz-adv-x="1024" d="M512 800C283.84 800 98.1395008 615.3064992 96.1875008 387.562496C114.5555008 394.922496 136.2884992 402.327488 161.3124992 409.687488C174.5284992 591.7995008 326.56 736 512 736C697.44 736 849.471488 591.7995008 862.687488 409.687488C887.711488 402.327488 909.444512 394.922496 927.812512 387.562496C925.860512 615.3064992 740.16 800 512 800zM288 448L288 384L448 384L448 448L288 448zM576 448L576 384L736 384L736 448L576 448zM192 352C192 352 96.9729984 325.285504 78.1249984 306.437504C59.2770016 287.5895040000001 59.2770016 256.972992 78.1249984 238.124992C96.9729984 219.276992 127.5895008 219.276992 146.4375008 238.124992C165.2855008 256.972992 192 352 192 352zM832 352C832 352 858.714496 256.972992 877.562496 238.124992C896.410496 219.276992 927.027008 219.276992 945.875008 238.124992C964.723008 256.972992 964.723008 287.5895040000001 945.875008 306.437504C927.027008 325.285504 832 352 832 352zM288 288C288 288 339.52 128 512 128C684.48 128 736 288 736 288L288 288zM205.6875008 211.187488C201.0155008 203.731488 196.2955008 197.4830080000001 191.6875008 192.875008C181.4155008 182.6030080000001 169.46 174.692992 156.5 169.124992C229.492 48.804992 361.312 -32 512 -32C662.688 -32 794.508 48.804992 867.5 169.124992C854.54 174.692992 842.584512 182.571008 832.312512 192.875008C827.672512 197.515008 822.984512 203.7634880000001 818.312512 211.187488C757.800512 104.371488 643.296 32 512 32C380.704 32 266.1995008 104.371488 205.6875008 211.187488z" />
<glyph glyph-name="star-half"
unicode="&#xF089;"
horiz-adv-x="1024" d="M512 827.749984L378.750016 528.875008L53.250016 494.5L296.375008 275.375008L228.5 -44.750016L512 118.7499840000001z" />
<glyph glyph-name="smiling-face"
unicode="&#xF118;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM368 512C341.5 512 320 490.5 320 464C320 437.5 341.5 416 368 416C394.5 416 416 437.5 416 464C416 490.5 394.5 512 368 512zM656 512C629.5 512 608 490.5 608 464C608 437.5 629.5 416 656 416C682.5 416 704 437.5 704 464C704 490.5 682.5 512 656 512zM346 288L291 256C335.250016 179.624992 417.5 128 512 128C606.5 128 688.750016 179.624992 733 256L678 288C644.750016 230.624992 583.250016 192 512 192C440.750016 192 379.250016 230.624992 346 288z" />
<glyph glyph-name="grinning-face-with-smiling-eyes"
unicode="&#xF582;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM352 512C284.992 512 236.5 473.375008 236.5 473.375008L275.5 422.624992C275.5 422.624992 310.1744992 448 352.062496 448C393.950496 448 428.562496 422.624992 428.562496 422.624992L467.562496 473.375008C467.498496 473.375008 419.008 512 352 512zM672 512C604.992 512 556.5 473.375008 556.5 473.375008L595.5 422.624992C595.5 422.624992 630.174496 448 672.062496 448C713.950496 448 748.562496 422.624992 748.562496 422.624992L787.562496 473.375008C787.498496 473.375008 739.008 512 672 512zM288 288C288 288 339.36 128 512 128C684.64 128 736 288 736 288L288 288z" />
<glyph glyph-name="audio-file"
unicode="&#xF1C7;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 800zM256 736L768 736L768 32L256 32zM512 585L512 378C501.875008 381.624992 491.250016 384 480 384C427.375008 384 384 340.624992 384 288C384 235.375008 427.375008 192 480 192C532.624992 192 576 235.375008 576 288L576 503L664 481L680 543zM480 320C498 320 512 306 512 288C512 270 498 256 480 256C462 256 448 270 448 288C448 306 462 320 480 320z" />
<glyph glyph-name="window-maximize"
unicode="&#xF2D0;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM288 576L288 192L736 192L736 576zM352 512L672 512L672 448L352 448zM352 384L672 384L672 256L352 256z" />
<glyph glyph-name="loudly-crying-face"
unicode="&#xF5B4;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM384 576C344.375008 576 314.250016 553.875008 294 535C273.750016 516.124992 261 498 261 498L315 462C315 462 322.875008 475.875008 337 489C351.124992 502.124992 369.5 512 384 512L480 512L480 576zM544 576L544 512L640 512C654.5 512 672.875008 502.124992 687 489C701.124992 475.875008 709 462 709 462L763 498C763 498 750.250016 516.124992 730 535C709.750016 553.875008 679.624992 576 640 576zM272 448C272 448 224 362.5 224 336C224 309.5 245.5 288 272 288C298.5 288 320 309.5 320 336C320 362.5 272 448 272 448zM512 384C437.250016 384 386.124992 344.5 358 307C329.875008 269.5 321 232 321 232L311 192L713 192L703 232C703 232 694.124992 269.5 666 307C637.875008 344.5 586.750016 384 512 384zM512 320C565.5 320 594.124992 295.5 614 269C618.875008 262.375008 617.624992 262.124992 621 256L403 256C406.375008 262.124992 405.124992 262.375008 410 269C429.875008 295.5 458.5 320 512 320z" />
<glyph glyph-name="sticky-note"
unicode="&#xF249;"
horiz-adv-x="1024" d="M160 736L160 32L653 32L663 41L855 233L864 243L864 736zM224 672L800 672L800 288L608 288L608 96L224 96zM672 224L754 224L672 142z" />
<glyph glyph-name="angry-face"
unicode="&#xF556;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM342 512C328.5 498.375008 320 479.749984 320 459C320 417.624992 353.624992 384 395 384C415.624992 384 434.5 392.375008 448 406zM682 512L576 406C589.5 392.375008 608.375008 384 629 384C670.375008 384 704 417.624992 704 459C704 479.624992 695.624992 498.5 682 512zM594 325C589.375008 324.875008 584.5 324.624992 580 324C544.124992 318.624992 517 299 493 283C469 267 447.875008 254.5 432 252C416.124992 249.5 401.875008 252 375 279L329 233C365.250016 196.5 406.5 183.375008 442 189C477.5 194.624992 504.124992 214.124992 528 230C551.875008 245.875008 572.375008 257.5 589 260C605.624992 262.5 622 260.375008 650 233L694 279C661.250016 311 626.375008 325.5 594 325z" />
<glyph glyph-name="window-restore"
unicode="&#xF2D2;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM384 608L384 480L288 480L288 160L640 160L640 288L736 288L736 608zM448 544L672 544L672 512L448 512zM448 448L672 448L672 352L448 352zM352 416L384 416L384 383L352 383zM352 319L384 319L384 288L576 288L576 224L352 224z" />
<glyph glyph-name="star"
unicode="&#xF005;"
horiz-adv-x="1024" d="M512 828L483 762L379 529L125 502L53 494L107 446L296 275L243 25L228 -45L291 -9L512 119L733 -9L796 -45L781 25L728 275L917 446L971 494L899 502L645 529L541 762zM512 671L594 486L602 469L620 467L821 446L671 311L657 298L661 280L703 83L528 183L512 193L496 183L321 83L363 280L367 298L353 311L203 446L404 467L422 469L430 486z" />
<glyph glyph-name="address-card"
unicode="&#xF2BB;"
horiz-adv-x="1024" d="M96 704L96 64L928 64L928 704zM160 640L864 640L864 128L755 128C752.5 132.375008 753.624992 138.375008 750 142C737.875008 154.124992 720.750016 160 704 160C687.250016 160 670.124992 154.124992 658 142C654.375008 138.375008 655.5 132.375008 653 128L371 128C368.5 132.375008 369.624992 138.375008 366 142C353.875008 154.124992 336.750016 160 320 160C303.250016 160 286.124992 154.124992 274 142C270.375008 138.375008 271.5 132.375008 269 128L160 128zM384 576C313.624992 576 256 518.375008 256 448C256 412.375008 271.250016 380.2499840000001 295 357C252.375008 328.124992 224 278.875008 224 224L288 224C288 277 331 320 384 320C437 320 480 277 480 224L544 224C544 278.875008 515.624992 328.124992 473 357C496.750016 380.2499840000001 512 412.375008 512 448C512 518.375008 454.375008 576 384 576zM384 512C419.750016 512 448 483.749984 448 448C448 412.249984 419.750016 384 384 384C348.250016 384 320 412.249984 320 448C320 483.749984 348.250016 512 384 512zM608 480L608 416L800 416L800 480zM608 352L608 288L800 288L800 352z" />
<glyph glyph-name="comment"
unicode="&#xF075;"
horiz-adv-x="1024" d="M96 704L96 64L402.750016 64L512 -45.250016L621.250016 64L928 64L928 704zM160 640L864 640L864 128L594.750016 128L512 45.249984L429.250016 128L160 128zM288 544L288 480L736 480L736 544zM288 416L288 352L736 352L736 416zM288 288L288 224L608 224L608 288z" />
<glyph glyph-name="object-ungroup"
unicode="&#xF248;"
horiz-adv-x="1024" d="M160 736L160 608L192 608L192 288L160 288L160 160L288 160L288 192L352 192L352 128L320 128L320 0L448 0L448 32L768 32L768 0L896 0L896 128L864 128L864 448L896 448L896 576L768 576L768 544L704 544L704 608L736 608L736 736L608 736L608 704L288 704L288 736zM288 640L608 640L608 608L640 608L640 288L608 288L608 256L288 256L288 288L256 288L256 608L288 608zM704 480L768 480L768 448L800 448L800 128L768 128L768 96L448 96L448 128L416 128L416 192L608 192L608 160L736 160L736 288L704 288z" />
<glyph glyph-name="winking-face"
unicode="&#xF4DA;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM368 512C341.5 512 320 490.5 320 464C320 437.5 341.5 416 368 416C394.5 416 416 437.5 416 464C416 490.5 394.5 512 368 512zM576 480L576 416L736 416L736 480zM671 351C671 297.124992 649.375008 259.7499840000001 618 233C586.624992 206.2499840000001 545.124992 192 512 192C444.124992 192 398 219.5 362 255L317 209C361.624992 165.124992 426.250016 128 512 128C561.750016 128 616.375008 146.7499840000001 660 184C703.624992 221.2499840000001 735 278.7499840000001 735 351z" />
<glyph glyph-name="window-close"
unicode="&#xF410;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM374 566L329 521L466 384L327 245L372 200L511 339L649 201L694 246L556 384L692 520L647 565L511 429z" />
<glyph glyph-name="video-file"
unicode="&#xF1C8;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 589L823 599L631 791L621 800zM256 736L576 736L576 544L768 544L768 32L256 32zM640 690L722 608L640 608zM416 473L416 167L464 197L624 293L670 320L624 347L464 443zM480 360L547 320L480 280z" />
<glyph glyph-name="hushed-face"
unicode="&#xF5C2;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM368 544C341.5 544 320 508.124992 320 464C320 419.875008 341.5 384 368 384C394.5 384 416 419.875008 416 464C416 508.124992 394.5 544 368 544zM656 544C629.5 544 608 508.124992 608 464C608 419.875008 629.5 384 656 384C682.5 384 704 419.875008 704 464C704 508.124992 682.5 544 656 544zM512 352C438.624992 352 384 292.624992 384 224C384 192.375008 395.375008 160.875008 421 145C446.624992 129.124992 475 128 512 128C549 128 577.375008 129.124992 603 145C628.624992 160.875008 640 192.375008 640 224C640 292.624992 585.375008 352 512 352zM512 288C553.375008 288 576 261.5 576 224C576 202.624992 574.750016 201.875008 570 199C565.250016 196.124992 545.750016 192 512 192C478.250016 192 458.750016 196.124992 454 199C449.250016 201.875008 448 202.624992 448 224C448 261.5 470.624992 288 512 288z" />
<glyph glyph-name="envelope"
unicode="&#xF0E0;"
horiz-adv-x="1024" d="M96 640L96 64L928 64L928 640zM234 576L790 576L512 391zM160 548L494 325L512 314L530 325L864 548L864 128L160 128z" />
<glyph glyph-name="face-with-tongue"
unicode="&#xF589;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM368 512A48 48 0 0 1 368 416A48 48 0 0 1 368 512zM656 512A48 48 0 0 1 656 416A48 48 0 0 1 656 512zM376.5 340.562496L327.437504 299.437504C355.494176 266.009728 398.443392 242.3571520000001 448 231.2499840000001L448 192C448 156.8 476.8 128 512 128C547.2 128 576 156.8 576 192L576 231.2499840000001C625.554688 242.359072 668.465984 265.98704 696.5 299.437504L647.437504 340.562496C620.301504 308.1144960000001 568.416 288 512 288C455.584 288 403.668 308.146496 376.5 340.562496z" />
<glyph glyph-name="caret-square-down"
unicode="&#xF150;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM343 487L297 441L489 249L512 227L535 249L727 441L681 487L512 318z" />
<glyph glyph-name="pause-circle"
unicode="&#xF28B;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM384 544L384 224L448 224L448 544zM576 544L576 224L640 224L640 544z" />
<glyph glyph-name="folder-open"
unicode="&#xF07C;"
horiz-adv-x="1024" d="M160 800L160 6L185 1L569 -79L608 -87L608 0L800 0L800 402L855 457L864 467L864 800zM452 736L800 736L800 494L745 439L736 429L736 64L608 64L608 349L599 359L544 414L544 713zM224 727L480 663L480 387L489 377L544 322L544 -9L224 58z" />
<glyph glyph-name="folder"
unicode="&#xF07B;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 402L887 457L896 467L896 800zM256 736L704 736L704 467L713 457L768 402L768 32L256 32zM768 736L832 736L832 494L800 462L768 494z" />
<glyph glyph-name="flag"
unicode="&#xF024;"
horiz-adv-x="1024" d="M160 736L160 -32L224 -32L224 288L480 288L480 192L864 192L864 640L544 640L544 736zM224 672L480 672L480 352L224 352zM544 576L800 576L800 256L544 256z" />
<glyph glyph-name="hand-pointing-right"
unicode="&#xF0A4;"
horiz-adv-x="1024" d="M470 800L460 791L243 576L64 576L64 64L603 64C648.124992 64 687.5 95.875008 697 140L750 384L864 384C916.624992 384 960 427.375008 960 480C960 532.624992 916.624992 576 864 576L520 576L526 600C532.5 605 536.624992 607.124992 546 620C561 640.5 576 672.249984 576 715C576 760.624992 534.750016 800 483 800zM493 733C506.5 730.375008 512 724.875008 512 715C512 686.124992 503.250016 668.249984 495 657C486.750016 645.749984 481 643 481 643L470 637L466 624L447 552L437 512L864 512C882.124992 512 896 498.124992 896 480C896 461.875008 882.124992 448 864 448L698 448L692 423L635 153C631.750016 138 618.250016 128 603 128L288 128L288 531zM128 512L224 512L224 128L128 128z" />
<glyph glyph-name="minus-square"
unicode="&#xF146;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM352 416L352 352L672 352L672 416z" />
<glyph glyph-name="alternate-arrow-circle-down"
unicode="&#xF358;"
horiz-adv-x="1024" d="M512 800C282.624992 800 96 613.375008 96 384C96 154.624992 282.624992 -32 512 -32C741.375008 -32 928 154.624992 928 384C928 613.375008 741.375008 800 512 800zM512 736C706.750016 736 864 578.749984 864 384C864 189.2499840000001 706.750016 32 512 32C317.250016 32 160 189.2499840000001 160 384C160 578.749984 317.250016 736 512 736zM480 608L480 288L384 288L512 160L640 288L544 288L544 608z" />
<glyph glyph-name="excel-file"
unicode="&#xF1C3;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 588.8124992L822.375008 598.3750016L630.375008 790.3750016L620.812512 800L192 800zM256 736L576 736L576 544L768 544L768 32L256 32L256 736zM640 691.1875008L723.187488 608L640 608L640 691.1875008zM352 480L473.624992 304L352 128L428.8125120000001 128L512 249.624992L595.187488 128L672 128L550.375008 304L672 480L595.187488 480L512 358.375008L428.8125120000001 480L352 480z" />
<glyph glyph-name="caret-square-left"
unicode="&#xF191;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM569 599L377 407L355 384L377 361L569 169L615 215L446 384L615 553z" />
<glyph glyph-name="pointer--hand-"
unicode="&#xF25A;"
horiz-adv-x="1024" d="M416 832C363.375008 832 320 788.624992 320 736L320 358L299 380L291 387C254.124992 423.875008 193.875008 423.875008 157 387C120.124992 350.124992 120.124992 289.875008 157 253L157 252L419 -7L421 -8L422 -10C465.124992 -42.375008 520.124992 -64 582 -64L637 -64C782.124992 -64 899 52.875008 899 198L899 448C899 500.624992 855.624992 544 803 544C789.375008 544 776.750016 540.249984 765 535C754.5 576.624992 716.624992 608 672 608C647.5 608 625 598.375008 608 583C591 598.375008 568.5 608 544 608C532.750016 608 522.124992 605.624992 512 602L512 736C512 788.624992 468.624992 832 416 832zM416 768C433.750016 768 448 753.749984 448 736L448 384L512 384L512 512C512 529.749984 526.250016 544 544 544C561.750016 544 576 529.749984 576 512L576 384L640 384L640 512C640 529.749984 654.250016 544 672 544C689.750016 544 704 529.749984 704 512L704 384L771 384L771 448C771 465.749984 785.250016 480 803 480C820.750016 480 835 465.749984 835 448L835 198C835 87.124992 747.875008 0 637 0L582 0C535.124992 0 494.624992 16.749984 461 42L202 298C187.750016 312.2499840000001 187.750016 327.7499840000001 202 342C216.250016 356.2499840000001 231.750016 356.2499840000001 246 342L384 204L384 736C384 753.749984 398.250016 768 416 768z" />
<glyph glyph-name="laugh-face-with-beaming-eyes"
unicode="&#xF59A;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM352 512C284.992 512 236.5 473.375008 236.5 473.375008L275.5 422.624992C275.5 422.624992 310.1744992 448 352.062496 448C393.950496 448 428.562496 422.624992 428.562496 422.624992L467.562496 473.375008C467.498496 473.375008 419.008 512 352 512zM672 512C604.992 512 556.5 473.375008 556.5 473.375008L595.5 422.624992C595.5 422.624992 630.174496 448 672.062496 448C713.950496 448 748.562496 422.624992 748.562496 422.624992L787.562496 473.375008C787.498496 473.375008 739.008 512 672 512zM288 288C288 288 339.36 128 512 128C684.64 128 736 288 736 288L288 288z" />
<glyph glyph-name="snowflake"
unicode="&#xF2DC;"
horiz-adv-x="1024" d="M480 800L480 686L407 759L361 713L480 594L480 440L348 519L306 682L244 666L270 566L172 625L139 571L239 511L136 485L152 423L316 465L451 384L316 303L152 345L136 283L239 257L139 197L172 143L270 202L244 102L306 86L348 249L480 328L480 174L361 55L407 9L480 82L480 -32L544 -32L544 82L617 9L663 55L544 174L544 328L676 249L718 86L780 102L754 202L852 143L885 197L785 257L888 283L872 345L708 303L573 384L708 465L872 423L888 485L785 511L885 571L852 625L754 566L780 666L718 682L676 519L544 440L544 594L663 713L617 759L544 686L544 800z" />
<glyph glyph-name="star-struck"
unicode="&#xF587;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM384 567.437504L356 504.562496L288 497.124992L338.875008 451.437504L324.562496 384L384 418.249984L443.437504 384L429.124992 451.437504L480 497.124992L412 504.562496L384 567.437504zM640 567.437504L612 504.562496L544 497.124992L594.875008 451.437504L580.562496 384L640 418.249984L699.437504 384L685.124992 451.437504L736 497.124992L668 504.562496L640 567.437504zM345.937504 288L290.8750016 256C296.4350016 246.4400000000001 302.56 237.290624 309.25 228.562496C315.94 219.8343680000001 323.217504 211.542496 330.937504 203.750016C338.657504 195.957504 346.850016 188.628128 355.5 181.875008C372.8 168.368736 391.829984 157.0387520000001 412.249984 148.312512C422.46 143.949376 433.035008 140.2624960000001 443.875008 137.2499840000001C465.555008 131.2249920000001 488.4 128 512 128C582.8 128 646.742496 156.995008 693.062496 203.750016C700.782496 211.542496 708.06 219.8343680000001 714.750016 228.562496C721.44 237.290624 727.564992 246.4400000000001 733.124992 256L678.062496 288C648.942496 237.88 598.270624 201.944384 538.249984 193.750016C529.675616 192.57936 520.92 192 512 192C503.08 192 494.324384 192.57936 485.750016 193.750016C477.175616 194.9206400000001 468.782496 196.6750080000001 460.624992 198.937504C444.310016 203.462496 428.907488 210.0800000000001 414.687488 218.5C407.577504 222.710016 400.729376 227.3718720000001 394.249984 232.437504C381.291264 242.568736 369.696256 254.3562560000001 359.687488 267.437504C354.683136 273.978112 350.097504 280.8400000000001 345.937504 288z" />
<glyph glyph-name="stop-circle"
unicode="&#xF28D;"
horiz-adv-x="1024" d="M512 800C283.2 800 96 612.8 96 384C96 155.2000000000001 283.2 -32 512 -32C740.8 -32 928 155.2000000000001 928 384C928 612.8 740.8 800 512 800zM512 736C705.6 736 864 577.6 864 384C864 190.4 705.6 32 512 32C318.4 32 160 190.4 160 384C160 577.6 318.4 736 512 736zM352 544L352 464L352 304L352 224L432 224L592 224L672 224L672 304L672 464L672 544L592 544L432 544L352 544zM416 480L608 480L608 288L416 288L416 480z" />
<glyph glyph-name="comments"
unicode="&#xF086;"
horiz-adv-x="1024" d="M64 736L64 224L192 224L192 61L244 103L395 224L704 224L704 736zM128 672L640 672L640 288L373 288L364 281L256 195L256 288L128 288zM768 608L768 544L896 544L896 160L768 160L768 67L651 160L411 160L331 96L629 96L832 -67L832 96L960 96L960 608z" />
<glyph glyph-name="closed-captioning"
unicode="&#xF20A;"
horiz-adv-x="1024" d="M64 704L64 131L960 131L960 704zM128 640L896 640L896 195L128 195zM384 576C296 576 224 504 224 416C224 328 296 256 384 256C422.250016 256 456.875008 270.124992 484 292L444 342C427.124992 328.375008 406.624992 320 384 320C330.624992 320 288 362.624992 288 416C288 469.375008 330.624992 512 384 512C406.624992 512 427.124992 503.624992 444 490L484 540C456.875008 561.875008 422.250016 576 384 576zM704 576C616 576 544 504 544 416C544 328 616 256 704 256C742.250016 256 776.875008 270.124992 804 292L764 342C747.124992 328.375008 726.624992 320 704 320C650.624992 320 608 362.624992 608 416C608 469.375008 650.624992 512 704 512C726.624992 512 747.124992 503.624992 764 490L804 540C776.875008 561.875008 742.250016 576 704 576z" />
<glyph glyph-name="thumbs-down"
unicode="&#xF165;"
horiz-adv-x="1024" d="M325 704C279.875008 704 240.5 672.124992 231 628L162 308C149.375008 248.875008 195.624992 192 256 192L440 192L434 168C427.5 163 423.375008 160.875008 414 148C399 127.5 384 95.749984 384 53C384 7.375008 425.250016 -32 477 -32L490 -32L500 -23L717 192L864 192L864 704zM325 640L672 640L672 237L467 35C453.5 37.624992 448 43.124992 448 53C448 81.875008 456.750016 99.749984 465 111C473.250016 122.2499840000001 479 125 479 125L490 131L494 144L513 216L523 256L256 256C234.875008 256 220.624992 274.375008 225 295L293 615C296.250016 630 309.750016 640 325 640zM736 640L800 640L800 256L736 256z" />
<glyph glyph-name="grinning-winking-face"
unicode="&#xF58C;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM368 512C341.5 512 320 490.5 320 464C320 437.5 341.5 416 368 416C394.5 416 416 437.5 416 464C416 490.5 394.5 512 368 512zM576 480L576 416L736 416L736 480zM671 351C671 297.124992 649.375008 259.7499840000001 618 233C586.624992 206.2499840000001 545.124992 192 512 192C444.124992 192 398 219.5 362 255L317 209C361.624992 165.124992 426.250016 128 512 128C561.750016 128 616.375008 146.7499840000001 660 184C703.624992 221.2499840000001 735 278.7499840000001 735 351z" />
<glyph glyph-name="images"
unicode="&#xF302;"
horiz-adv-x="1024" d="M64 736L64 160L192 160L192 32L960 32L960 608L832 608L832 736zM128 672L768 672L768 224L128 224zM192 608L192 288L704 288L704 608zM256 544L640 544L640 352L256 352zM832 544L896 544L896 96L256 96L256 160L832 160z" />
<glyph glyph-name="compass"
unicode="&#xF14E;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM479 702C479.375008 702 479.624992 702 480 702L480 672L544 672L544 702C695.624992 687.124992 815.124992 567.624992 830 416L800 416L800 352L830 352C815.124992 200.375008 695.624992 80.875008 544 66L544 96L480 96L480 66C328.375008 80.875008 208.875008 200.375008 194 352L224 352L224 416L194 416C208.875008 567.375008 327.875008 686.749984 479 702zM720 592L453 443L304 176L571 325zM512 432C538.5 432 560 410.5 560 384C560 357.5 538.5 336 512 336C485.5 336 464 357.5 464 384C464 410.5 485.5 432 512 432z" />
<glyph glyph-name="code-file"
unicode="&#xF1C9;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 589L823 599L631 791L621 800zM256 736L576 736L576 544L768 544L768 32L256 32zM640 690L722 608L640 608zM512 480L448 96L512 96L576 480zM391 404L311 308L294 288L311 268L391 172L441 212L378 288L441 364zM633 404L583 364L646 288L583 212L633 172L713 268L730 288L713 308z" />
<glyph glyph-name="squinting-face-with-tongue"
unicode="&#xF58A;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM352 512C284.992 512 236.5 473.375008 236.5 473.375008L275.5 422.624992C275.5 422.624992 310.1744992 448 352.062496 448C393.950496 448 428.562496 422.624992 428.562496 422.624992L467.562496 473.375008C467.498496 473.375008 419.008 512 352 512zM672 512C604.992 512 556.5 473.375008 556.5 473.375008L595.5 422.624992C595.5 422.624992 630.174496 448 672.062496 448C713.950496 448 748.562496 422.624992 748.562496 422.624992L787.562496 473.375008C787.498496 473.375008 739.008 512 672 512zM376.5 340.562496L327.437504 299.437504C355.494176 266.009728 398.443392 242.3571520000001 448 231.2499840000001L448 192C448 156.8 476.8 128 512 128C547.2 128 576 156.8 576 192L576 231.2499840000001C625.554688 242.359072 668.465984 265.98704 696.5 299.437504L647.437504 340.562496C620.301504 308.1144960000001 568.416 288 512 288C455.584 288 403.668 308.146496 376.5 340.562496z" />
<glyph glyph-name="clipboard"
unicode="&#xF328;"
horiz-adv-x="1024" d="M512 800C471.750016 800 443.124992 771.5 429 736L192 736L192 0L832 0L832 736L595 736C580.875008 771.5 552.250016 800 512 800zM512 736C529.750016 736 544 721.749984 544 704L544 672L640 672L640 608L384 608L384 672L480 672L480 704C480 721.749984 494.250016 736 512 736zM256 672L320 672L320 544L704 544L704 672L768 672L768 64L256 64z" />
<glyph glyph-name="newspaper"
unicode="&#xF1EA;"
horiz-adv-x="1024" d="M96 736L96 160C96 89.249984 153.250016 32 224 32L800 32C870.750016 32 928 89.249984 928 160L928 512L736 512L736 736zM160 672L672 672L672 160C672 136.624992 679.124992 114.875008 690 96L224 96C185.875008 96 160 121.875008 160 160zM224 608L224 448L608 448L608 608zM288 544L544 544L544 512L288 512zM736 448L864 448L864 160C864 121.875008 838.124992 96 800 96C761.875008 96 736 121.875008 736 160zM224 416L224 352L384 352L384 416zM448 416L448 352L608 352L608 416zM224 320L224 256L384 256L384 320zM448 320L448 256L608 256L608 320zM224 224L224 160L384 160L384 224zM448 224L448 160L608 160L608 224z" />
<glyph glyph-name="hand-pointing-left"
unicode="&#xF0A5;"
horiz-adv-x="1024" d="M541 800C489.250016 800 448 760.624992 448 715C448 672.249984 463 640.5 478 620C487.375008 607.124992 491.5 605 498 600L504 576L160 576C107.375008 576 64 532.624992 64 480C64 427.375008 107.375008 384 160 384L274 384L327 140C336.5 95.875008 375.875008 64 421 64L960 64L960 576L781 576L564 791L554 800zM531 733L736 531L736 128L421 128C405.750016 128 392.250016 138 389 153L332 423L326 448L160 448C141.875008 448 128 461.875008 128 480C128 498.124992 141.875008 512 160 512L587 512L577 552L558 624L554 637L543 643C543 643 537.250016 645.749984 529 657C520.750016 668.249984 512 686.124992 512 715C512 724.875008 517.5 730.375008 531 733zM800 512L896 512L896 128L800 128z" />
<glyph glyph-name="object-group"
unicode="&#xF247;"
horiz-adv-x="1024" d="M160 736L160 608L192 608L192 160L160 160L160 32L288 32L288 64L736 64L736 32L864 32L864 160L832 160L832 608L864 608L864 736L736 736L736 704L288 704L288 736zM288 640L736 640L736 608L768 608L768 160L736 160L736 128L288 128L288 160L256 160L256 608L288 608zM320 576L320 320L448 320L448 192L704 192L704 448L576 448L576 576zM384 512L512 512L512 384L384 384zM576 384L640 384L640 256L512 256L512 320L576 320z" />
<glyph glyph-name="image"
unicode="&#xF03E;"
horiz-adv-x="1024" d="M64 736L64 32L960 32L960 736zM128 672L896 672L896 227L727 397L704 420L559 275L375 461L352 484L128 260zM768 608C732.624992 608 704 579.375008 704 544C704 508.624992 732.624992 480 768 480C803.375008 480 832 508.624992 832 544C832 579.375008 803.375008 608 768 608zM352 393L646 96L128 96L128 169zM704 329L896 137L896 96L737 96L604 230z" />
<glyph glyph-name="keyboard"
unicode="&#xF11C;"
horiz-adv-x="1024" d="M96 672C61 672 32 643 32 608L32 160C32 125 61 96 96 96L928 96C963 96 992 125 992 160L992 608C992 643 963 672 928 672zM96 608L928 608L928 160L96 160zM160 544L160 480L224 480L224 544zM288 544L288 480L352 480L352 544zM416 544L416 480L480 480L480 544zM544 544L544 480L608 480L608 544zM672 544L672 480L736 480L736 544zM800 544L800 480L864 480L864 544zM160 416L160 352L288 352L288 416zM352 416L352 352L416 352L416 416zM480 416L480 352L544 352L544 416zM608 416L608 352L672 352L672 416zM736 416L736 352L864 352L864 416zM160 288L160 224L288 224L288 288zM352 288L352 224L672 224L672 288zM736 288L736 224L864 224L864 288z" />
<glyph glyph-name="grinning-squinting-face"
unicode="&#xF585;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM321.750016 538.624992L286.25 485.375008L342.3125120000001 448L286.25 410.624992L321.750016 357.375008L457.687488 448L321.750016 538.624992zM702.249984 538.624992L566.312512 448L702.249984 357.375008L737.750016 410.624992L681.687488 448L737.750016 485.375008L702.249984 538.624992zM288 288C288 288 339.36 128 512 128C684.64 128 736 288 736 288L288 288z" />
<glyph glyph-name="hand-pointing-down"
unicode="&#xF0A7;"
horiz-adv-x="1024" d="M320 832L320 653L105 436L96 426L96 413C96 361.2499840000001 135.375008 320 181 320C223.750016 320 255.5 335 276 350C288.875008 359.375008 291 363.5 296 370L320 376L320 32C320 -20.624992 363.375008 -64 416 -64C468.624992 -64 512 -20.624992 512 32L512 146L756 199C800.124992 208.5 832 247.875008 832 293L832 832zM384 768L768 768L768 672L384 672zM365 608L768 608L768 293C768 277.7499840000001 758 264.2499840000001 743 261L473 204L448 198L448 32C448 13.875008 434.124992 0 416 0C397.875008 0 384 13.875008 384 32L384 459L344 449L272 430L259 426L253 415C253 415 250.250016 409.249984 239 401C227.750016 392.749984 209.875008 384 181 384C171.124992 384 165.624992 389.5 163 403z" />
<glyph glyph-name="gem"
unicode="&#xF3A5;"
horiz-adv-x="1024" d="M305 704L135 500L119 481L135 460L487 12L512 -20L537 12L889 460L905 481L889 500L719 704zM335 640L452 640L366 512L228 512zM572 640L689 640L796 512L658 512zM512 613L580 512L444 512zM225 448L360 448L436 179zM426 448L597 448L512 150zM664 448L799 448L588 180z" />
<glyph glyph-name="kissing-face-with-smiling-eyes"
unicode="&#xF597;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM352 512C284.992 512 236.5 473.375008 236.5 473.375008L275.5 422.624992C275.5 422.624992 310.1744992 448 352.062496 448C393.950496 448 428.562496 422.624992 428.562496 422.624992L467.562496 473.375008C467.498496 473.375008 419.008 512 352 512zM672 512C604.992 512 556.5 473.375008 556.5 473.375008L595.5 422.624992C595.5 422.624992 630.174496 448 672.062496 448C713.950496 448 748.562496 422.624992 748.562496 422.624992L787.562496 473.375008C787.498496 473.375008 739.008 512 672 512zM480 351.750016L480 304.062496C508.864 304.062496 527.249984 290.787008 527.249984 283.875008C527.250016 276.99088 508.944576 263.856096 480.312512 263.750016C480.205792 263.75024 480.106784 263.750016 480 263.750016L480 263.6874880000001L480 216.062496L480 216C480.106784 216 480.205792 215.999776 480.312512 216C508.975936 215.893888 527.249984 202.759136 527.249984 195.875008C527.250016 188.963008 508.832 175.687488 480 175.687488L480 128C533.408 128 575.249984 157.827008 575.249984 195.875008C575.249984 212.90816 566.558144 228.076192 552.5 239.875008C566.558144 251.6737920000001 575.249984 266.841824 575.249984 283.875008C575.250016 321.923008 533.408 351.750016 480 351.750016z" />
<glyph glyph-name="address-book"
unicode="&#xF2B9;"
horiz-adv-x="1024" d="M192 768L192 608L160 608L160 544L256 544L256 704L768 704L768 64L256 64L256 160L192 160L192 0L832 0L832 768zM512 576C441.624992 576 384 518.375008 384 448C384 412.375008 399.250016 380.2499840000001 423 357C380.375008 328.124992 352 278.875008 352 224L416 224C416 277 459 320 512 320C565 320 608 277 608 224L672 224C672 278.875008 643.624992 328.124992 601 357C624.750016 380.2499840000001 640 412.375008 640 448C640 518.375008 582.375008 576 512 576zM192 512L192 448L160 448L160 384L256 384L256 512zM512 512C547.750016 512 576 483.749984 576 448C576 412.249984 547.750016 384 512 384C476.250016 384 448 412.249984 448 448C448 483.749984 476.250016 512 512 512zM192 352L192 288L160 288L160 224L256 224L256 352z" />
<glyph glyph-name="face-without-mouth"
unicode="&#xF5A4;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM368 512A48 48 0 0 1 368 416A48 48 0 0 1 368 512zM656 512A48 48 0 0 1 656 416A48 48 0 0 1 656 512z" />
<glyph glyph-name="paper-plane"
unicode="&#xF1D8;"
horiz-adv-x="1024" d="M115 725L129 665L191 384L129 103L115 43L172 66L876 354L949 384L876 414L172 702zM204 619L701 416L249 416zM249 352L701 352L204 149z" />
<glyph glyph-name="alternate-arrow-circle-up"
unicode="&#xF35B;"
horiz-adv-x="1024" d="M512 800C282.624992 800 96 613.375008 96 384C96 154.624992 282.624992 -32 512 -32C741.375008 -32 928 154.624992 928 384C928 613.375008 741.375008 800 512 800zM512 736C706.750016 736 864 578.749984 864 384C864 189.2499840000001 706.750016 32 512 32C317.250016 32 160 189.2499840000001 160 384C160 578.749984 317.250016 736 512 736zM512 608L384 480L480 480L480 160L544 160L544 480L640 480z" />
<glyph glyph-name="play-circle"
unicode="&#xF144;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM384 604L384 164L432 192L720 356L768 384L720 412L432 576zM448 494L639 384L448 274z" />
<glyph glyph-name="image-file"
unicode="&#xF1C5;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 589L823 599L631 791L621 800zM256 736L576 736L576 544L768 544L768 32L256 32zM640 690L722 608L640 608zM675 448C657.375008 448 643 433.624992 643 416C643 398.375008 657.375008 384 675 384C692.624992 384 707 398.375008 707 416C707 433.624992 692.624992 448 675 448zM448 397L425 375L297 247L343 201L448 306L521 233L544 211L567 233L608 274L681 201L727 247L631 343L608 365L585 343L544 302L471 375z" />
<glyph glyph-name="dizzy-face"
unicode="&#xF567;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM310.6249984 566.624992L265.3750016 521.375008L322.750016 464L265.3750016 406.624992L310.6249984 361.375008L368 418.750016L425.375008 361.375008L470.624992 406.624992L413.249984 464L470.624992 521.375008L425.375008 566.624992L368 509.249984L310.6249984 566.624992zM598.624992 566.624992L553.375008 521.375008L610.750016 464L553.375008 406.624992L598.624992 361.375008L656 418.750016L713.375008 361.375008L758.624992 406.624992L701.249984 464L758.624992 521.375008L713.375008 566.624992L656 509.249984L598.624992 566.624992zM512 320C441.408 320 384 271.1874880000001 384 211.187488C384 155.987488 427.072 128 512 128C596.928 128 640 155.987488 640 211.187488C640 271.1874880000001 582.592 320 512 320zM512 256C546.688 256 576 235.4754880000001 576 211.187488C576 205.939488 576 192 512 192C448 192 448 205.939488 448 211.187488C448 235.4754880000001 477.312 256 512 256z" />
<glyph glyph-name="laughing-winking-face"
unicode="&#xF59C;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM368 512A48 48 0 0 1 368 416A48 48 0 0 1 368 512zM576 480L576 416L736 416L736 480L576 480zM288 288C288 288 339.52 128 512 128C684.48 128 736 288 736 288L288 288z" />
<glyph glyph-name="alternate-money-bill"
unicode="&#xF3D1;"
horiz-adv-x="1024" d="M64 672L64 128L960 128L960 672L64 672zM192 608L832 608C832 572.64 860.64 544 896 544L896 256C860.64 256 832 227.36 832 192L192 192C192 227.36 163.36 256 128 256L128 544C163.36 544 192 572.64 192 608zM480 544C480 497.952 462.048 480 416 480L416 416C440.824032 416 461.977152 420.837408 480 429.187488L480 256L544 256L544 544L480 544zM272 448C245.504 448 224 426.496 224 400C224 373.504 245.504 352 272 352C298.496 352 320 373.504 320 400C320 426.496 298.496 448 272 448zM752 448C725.504 448 704 426.496 704 400C704 373.504 725.504 352 752 352C778.496 352 800 373.504 800 400C800 426.496 778.496 448 752 448z" />
<glyph glyph-name="calendar-times"
unicode="&#xF273;"
horiz-adv-x="1024" d="M288 736L288 704L160 704L160 0L864 0L864 704L736 704L736 736L672 736L672 704L352 704L352 736zM224 640L288 640L288 608L352 608L352 640L672 640L672 608L736 608L736 640L800 640L800 576L224 576zM224 512L800 512L800 64L224 64zM423 423L377 377L466 288L377 199L423 153L512 242L601 153L647 199L558 288L647 377L601 423L512 334z" />
<glyph glyph-name="rolling-on-the-floor-laughing"
unicode="&#xF586;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 259.8400000000001 150.972 148.538016 237.5 72.249984C243.644 87.930016 252.9149984 108.045984 265.8750016 132.750016C200.6270016 196.685984 160 285.664 160 384C160 578.0799999999999 317.92 736 512 736C610.336 736 699.314016 695.3730016 763.249984 630.1249984C787.985984 643.0850015999999 808.070016 652.388 823.750016 658.5C747.462016 745.028 636.16 800 512 800zM880 608C853.504 608 768 560 768 560C768 560 853.504 512 880 512C906.496 512 928 533.504 928 560C928 586.496 906.496 608 880 608zM617.375008 598.6249984L489.375008 470.624992L534.624992 425.375008L662.624992 553.375008L617.375008 598.6249984zM754.249984 466.249984L429.750016 141.750016C455.669984 132.790016 483.2 128 512 128C653.44 128 768 242.56 768 384C768 412.8 763.210016 440.329984 754.249984 466.249984zM921.312512 456.124992C908.512512 451.004992 894.624 448 880 448C876.128 448 869.276 448.094016 857.5 450.750016C861.66 429.117984 864 406.848 864 384C864 189.92 706.08 32 512 32C489.152 32 466.882016 34.34 445.249984 38.5C447.906016 26.724 448 19.872 448 16C448 1.376 444.995008 -12.512512 439.875008 -25.312512C463.363008 -29.440512 487.36 -32 512 -32C741.376 -32 928 154.624 928 384C928 408.64 925.440512 432.636992 921.312512 456.124992zM425.375008 406.624992L297.3750016 278.624992L342.624992 233.375008L470.624992 361.375008L425.375008 406.624992zM336 128C336 128 288 42.496 288 16C288 -10.496 309.504 -32 336 -32C362.496 -32 384 -10.496 384 16C384 42.496 336 128 336 128z" />
<glyph glyph-name="times-circle"
unicode="&#xF057;"
horiz-adv-x="1024" d="M512 800C282.624992 800 96 613.375008 96 384C96 154.624992 282.624992 -32 512 -32C741.375008 -32 928 154.624992 928 384C928 613.375008 741.375008 800 512 800zM512 736C706.750016 736 864 578.749984 864 384C864 189.2499840000001 706.750016 32 512 32C317.250016 32 160 189.2499840000001 160 384C160 578.749984 317.250016 736 512 736zM391 551L345 505L466 384L345 263L391 217L512 338L633 217L679 263L558 384L679 505L633 551L512 430z" />
<glyph glyph-name="calendar-plus"
unicode="&#xF271;"
horiz-adv-x="1024" d="M288 736L288 704L160 704L160 0L864 0L864 704L736 704L736 736L672 736L672 704L352 704L352 736zM224 640L288 640L288 608L352 608L352 640L672 640L672 608L736 608L736 640L800 640L800 576L224 576zM224 512L800 512L800 64L224 64zM480 448L480 320L352 320L352 256L480 256L480 128L544 128L544 256L672 256L672 320L544 320L544 448z" />
<glyph glyph-name="crying-face"
unicode="&#xF5B3;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 274.956736 814.106592 177.368576 736 112.750016L736 384C736 401.664 721.696 416 704 416C686.304 416 672 401.664 672 384L672 70.875008C623.92704 46.204512 569.642304 32 512 32C454.357696 32 400.07296 46.204512 352 70.875008L352 384C352 401.664 337.6960000000001 416 320 416C302.304 416 288 401.664 288 384L288 112.750016C209.8934208 177.368576 160 274.956736 160 384C160 578.0799999999999 317.92 736 512 736zM384 576C344.32 576 314.2224992 553.942496 294.0624992 535.062496C273.5824992 516.182496 261.1249984 497.937504 261.1249984 497.937504L314.8750016 462.062496C314.8749984 462.062496 322.857504 475.817504 336.937504 488.937504C351.017504 502.057504 369.6 512 384 512L480 512L480 576L384 576zM544 576L544 512L640 512C654.4 512 672.982496 502.057504 687.062496 488.937504C701.142496 475.817504 709.124992 462.062496 709.124992 462.062496L762.875008 497.937504C762.875008 497.937504 750.417504 516.182496 729.937504 535.062496C709.777504 553.942496 679.68 576 640 576L544 576zM512 384C459.072 384 416 333.76 416 272C416 210.24 459.072 160 512 160C564.928 160 608 210.24 608 272C608 333.76 564.928 384 512 384zM512 320C529.024 320 544 297.568 544 272C544 246.432 529.024 224 512 224C494.976 224 480 246.432 480 272C480 297.568 494.976 320 512 320z" />
<glyph glyph-name="powerpoint-file"
unicode="&#xF1C4;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 588.8124992L822.375008 598.3750016L630.375008 790.3750016L620.812512 800L192 800zM256 736L576 736L576 544L768 544L768 32L256 32L256 736zM640 691.1875008L723.187488 608L640 608L640 691.1875008zM416 480L416 416L544 416C582.4 416 608 390.4 608 352C608 313.6 582.4 288 544 288C505.6 288 480 313.6 480 352L416 352L416 128L480 128L480 243.1874880000001C499.2 230.387488 521.6 224 544 224C614.4 224 672 281.6 672 352C672 422.4 614.4 480 544 480L416 480z" />
<glyph glyph-name="hdd"
unicode="&#xF0A0;"
horiz-adv-x="1024" d="M199 704L96 292L96 64L928 64L928 292L825 704zM249 640L775 640L855 320L169 320zM160 256L864 256L864 128L160 128zM768 224C750.375008 224 736 209.624992 736 192C736 174.375008 750.375008 160 768 160C785.624992 160 800 174.375008 800 192C800 209.624992 785.624992 224 768 224z" />
<glyph glyph-name="hourglass"
unicode="&#xF254;"
horiz-adv-x="1024" d="M224 768L224 704L288 704L288 576C288 494.624992 331.750016 423.249984 397 384C331.750016 344.7499840000001 288 273.375008 288 192L288 64L224 64L224 0L800 0L800 64L736 64L736 192C736 273.375008 692.250016 344.7499840000001 627 384C692.250016 423.249984 736 494.624992 736 576L736 704L800 704L800 768zM352 704L672 704L672 576C672 487.249984 600.750016 416 512 416C423.250016 416 352 487.249984 352 576zM512 352C600.750016 352 672 280.7499840000001 672 192L672 64L352 64L352 192C352 280.7499840000001 423.250016 352 512 352z" />
<glyph glyph-name="credit-card"
unicode="&#xF09D;"
horiz-adv-x="1024" d="M160 704C107.375008 704 64 660.624992 64 608L64 160C64 107.375008 107.375008 64 160 64L864 64C916.624992 64 960 107.375008 960 160L960 608C960 660.624992 916.624992 704 864 704zM160 640L864 640C882.124992 640 896 626.124992 896 608L896 544L160 544L160 480L896 480L896 160C896 141.875008 882.124992 128 864 128L160 128C141.875008 128 128 141.875008 128 160L128 608C128 626.124992 141.875008 640 160 640z" />
<glyph glyph-name="bell-slash"
unicode="&#xF1F6;"
horiz-adv-x="1024" d="M119 823L73 777L905 -55L951 -9L832 110L832 160L800 160C782.375008 160 768 174.375008 768 192L768 471C768 593.5 685.375008 697.5 575 727C575.375008 730 576 732.875008 576 736C576 771.375008 547.375008 800 512 800C476.624992 800 448 771.375008 448 736C448 733.249984 448.624992 730.624992 449 728C406.124992 717.124992 366.624992 695.624992 334 664C324.375008 654.749984 315.875008 644.375008 308 634zM498 672C504.5 672.5 511.5 672.249984 518 672C620.624992 668.875008 704 578.875008 704 471L704 238L354 588C361.124992 598.5 368.624992 609 378 618C410.875008 650 452.875008 668.875008 498 672zM257 504C256.250016 495.875008 256 488.249984 256 480L256 192C256 174.375008 241.624992 160 224 160L192 160L192 96L422 96C418.375008 85.875008 416 75.249984 416 64C416 11.375008 459.375008 -32 512 -32C564.624992 -32 608 11.375008 608 64C608 75.249984 605.624992 85.875008 602 96L666 96L602 160L314 160C317.624992 170 320 180.7499840000001 320 192L320 442zM512 96C530 96 544 82 544 64C544 46 530 32 512 32C494 32 480 46 480 64C480 82 494 96 512 96z" />
<glyph glyph-name="lemon"
unicode="&#xF094;"
horiz-adv-x="1024" d="M416 768C333.375008 768 259.875008 722 209 652C158.124992 582 128 487.5 128 384C128 280.5 158.124992 186 209 116C259.875008 46 333.375008 0 416 0C679.375008 0 819.750016 150.624992 854 309C878.124992 326.375008 896 352.124992 896 384C896 415.875008 878.124992 441.624992 854 459C817.875008 621.375008 650 768 416 768zM416 704C474.750016 704 529.250016 671.5 571 614C612.750016 556.5 640 474.875008 640 384C640 293.124992 612.750016 211.5 571 154C529.250016 96.5 474.750016 64 416 64C357.250016 64 302.750016 96.5 261 154C219.250016 211.5 192 293.124992 192 384C192 474.875008 219.250016 556.5 261 614C302.750016 671.5 357.250016 704 416 704zM620 655C717.250016 603.5 779.750016 518.749984 795 436L798 420L813 413C824.124992 407.875008 832 397.124992 832 384C832 370.875008 824.124992 360.124992 813 355L798 348L795 332C778 239.375008 722.124992 148.5 610 100C614.375008 105.249984 618.875008 110.375008 623 116C673.875008 186 704 280.5 704 384C704 487.5 673.875008 582 623 652C622.124992 653.124992 620.875008 653.875008 620 655zM416 640C393.124992 640 371.624992 631.749984 352 618L417 465L483 617C462.750016 631.875008 439.750016 640 416 640zM304 567C278.875008 527.624992 261.624992 474.875008 257 416L368 416zM530 564L465 416L575 416C570.5 473.5 554.250016 524.875008 530 564zM257 352C261.5 294.5 277.750016 243.124992 302 204L367 352zM464 352L528 201C553.124992 240.375008 570.375008 293.124992 575 352zM415 303L349 151C369.250016 136.124992 392.250016 128 416 128C438.875008 128 460.375008 136.2499840000001 480 150z" />
<glyph glyph-name="alternate-grinning-face"
unicode="&#xF581;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM368 544A48 96 0 0 1 368 352A48 96 0 0 1 368 544zM656 544A48 96 0 0 1 656 352A48 96 0 0 1 656 544zM288 288C288 288 339.36 128 512 128C684.64 128 736 288 736 288L288 288z" />
<glyph glyph-name="alternate-arrow-circle-right"
unicode="&#xF35A;"
horiz-adv-x="1024" d="M512 800C282.624992 800 96 613.375008 96 384C96 154.624992 282.624992 -32 512 -32C741.375008 -32 928 154.624992 928 384C928 613.375008 741.375008 800 512 800zM512 736C706.750016 736 864 578.749984 864 384C864 189.2499840000001 706.750016 32 512 32C317.250016 32 160 189.2499840000001 160 384C160 578.749984 317.250016 736 512 736zM608 512L608 416L288 416L288 352L608 352L608 256L736 384z" />
<glyph glyph-name="archive-file"
unicode="&#xF1C6;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 800zM256 736L480 736L480 704L544 704L544 736L768 736L768 32L256 32zM480 672L480 608L544 608L544 672zM480 576L480 512L544 512L544 576zM480 480L480 410C443 396.624992 416 361.375008 416 320C416 267.375008 459.375008 224 512 224C564.624992 224 608 267.375008 608 320C608 361.375008 581 396.624992 544 410L544 480zM512 352C530 352 544 338 544 320C544 302 530 288 512 288C494 288 480 302 480 320C480 338 494 352 512 352z" />
<glyph glyph-name="lizard--hand-"
unicode="&#xF258;"
horiz-adv-x="1024" d="M458 768C401.124992 768 347.624992 738.124992 319 689L150 398C135.750016 373.5 128 345.375008 128 317L128 0L448 0L448 138C532.124992 163.2499840000001 575.5 207.5 589 224L791 224C831.875008 224 862.875008 264.375008 853 304L849 319C834.750016 375.7499840000001 783.5 416 725 416L505 416L489 480L693 480C751.5 480 802.750016 520.249984 817 577L828 619C865.750016 632 896 662.124992 896 704L896 768zM458 704L832 704C832 685.875008 818.124992 672 800 672L512 672L480 608L759 608L755 592C747.875008 563.375008 722.5 544 693 544L489 544C448.124992 544 417.124992 503.624992 427 464L443 400C450.124992 371.624992 475.750016 352 505 352L725 352C754.5 352 779.875008 332.624992 787 304L791 288L560 288L550 275C550 275 503.875008 209.5 410 191L384 186L384 64L192 64L192 317C192 334 196.375008 351.2499840000001 205 366L375 656C392.250016 685.5 423.750016 704 458 704z" />
<glyph glyph-name="laughing-squinting-face"
unicode="&#xF59B;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM321.750016 538.624992L286.25 485.375008L342.3125120000001 448L286.25 410.624992L321.750016 357.375008L457.687488 448L321.750016 538.624992zM702.249984 538.624992L566.312512 448L702.249984 357.375008L737.750016 410.624992L681.687488 448L737.750016 485.375008L702.249984 538.624992zM288 288C288 288 339.36 128 512 128C684.64 128 736 288 736 288L288 288z" />
<glyph glyph-name="grinning-face"
unicode="&#xF580;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM368 512A48 48 0 0 1 368 416A48 48 0 0 1 368 512zM656 512A48 48 0 0 1 656 416A48 48 0 0 1 656 512zM288 288C288 288 339.36 128 512 128C684.64 128 736 288 736 288L288 288z" />
<glyph glyph-name="thumbs-up"
unicode="&#xF164;"
horiz-adv-x="1024" d="M534 800L524 791L307 576L160 576L160 64L699 64C744.124992 64 783.5 95.875008 793 140L862 460C874.624992 519.124992 828.375008 576 768 576L584 576L590 600C596.5 605 600.624992 607.124992 610 620C625 640.5 640 672.249984 640 715C640 760.624992 598.750016 800 547 800zM557 733C570.5 730.375008 576 724.875008 576 715C576 686.124992 567.250016 668.249984 559 657C550.750016 645.749984 545 643 545 643L534 637L530 624L511 552L501 512L768 512C789.124992 512 803.375008 493.624992 799 473L731 153C727.750016 138 714.250016 128 699 128L352 128L352 531zM224 512L288 512L288 128L224 128z" />
<glyph glyph-name="hospital"
unicode="&#xF0F8;"
horiz-adv-x="1024" d="M480 800L480 736L416 736L416 672L480 672L480 608L544 608L544 672L608 672L608 736L544 736L544 800zM192 736L192 0L480 0L480 96L544 96L544 0L832 0L832 736L672 736L672 672L768 672L768 64L608 64L608 160L416 160L416 64L256 64L256 672L352 672L352 736zM352 544L352 480L416 480L416 544zM480 544L480 480L544 480L544 544zM608 544L608 480L672 480L672 544zM352 416L352 352L416 352L416 416zM480 416L480 352L544 352L544 416zM608 416L608 352L672 352L672 416zM352 288L352 224L416 224L416 288zM480 288L480 224L544 224L544 288zM608 288L608 224L672 224L672 288z" />
<glyph glyph-name="kissing-face"
unicode="&#xF596;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM368 512A48 48 0 0 1 368 416A48 48 0 0 1 368 512zM656 512A48 48 0 0 1 656 416A48 48 0 0 1 656 512zM480 351.750016L480 304.062496C508.832 304.062496 527.249984 290.787008 527.249984 283.875008C527.249984 276.99088 508.94432 263.856096 480.312512 263.750016C480.205792 263.75024 480.106784 263.750016 480 263.750016L480 263.6874880000001L480 216.062496L480 216C480.106784 216 480.205792 215.999776 480.312512 216C508.94432 215.893888 527.249984 202.759136 527.249984 195.875008C527.249984 188.963008 508.832 175.687488 480 175.687488L480 128C533.408 128 575.249984 157.827008 575.249984 195.875008C575.249984 212.914304 566.497728 228.074528 552.437504 239.875008C566.497728 251.675488 575.249984 266.83568 575.249984 283.875008C575.249984 321.923008 533.408 351.750016 480 351.750016z" />
<glyph glyph-name="face-blowing-a-kiss"
unicode="&#xF598;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C587.808 -32 658.657504 -11.302016 719.937504 24.249984L673.812512 71.687488C625.300512 46.471488 570.336 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736C706.08 736 864 578.0799999999999 864 384C864 383.168 863.875008 382.362496 863.875008 381.562496C886.883008 377.850496 908.194496 369.303008 926.562496 356.375008C927.170496 365.559008 928 374.656 928 384C928 613.376 741.376 800 512 800zM368 512A48 48 0 0 1 368 416A48 48 0 0 1 368 512zM640 512C572.992 512 524.5 473.375008 524.5 473.375008L563.5 422.624992C563.5 422.624992 598.174496 448 640.062496 448C681.950496 448 716.562496 422.624992 716.562496 422.624992L755.562496 473.375008C755.498496 473.375008 707.008 512 640 512zM480 351.750016L480 304.062496C508.864 304.062496 527.249984 290.787008 527.249984 283.875008C527.250016 276.99088 508.944576 263.856096 480.312512 263.750016C480.205792 263.75024 480.106784 263.750016 480 263.750016L480 263.6874880000001L480 216.062496L480 216C480.106784 216 480.205792 215.999776 480.312512 216C508.975936 215.893888 527.249984 202.759136 527.249984 195.875008C527.250016 188.963008 508.832 175.687488 480 175.687488L480 128C533.408 128 575.249984 157.827008 575.249984 195.875008C575.249984 212.90816 566.558144 228.076192 552.5 239.875008C566.558144 251.6737920000001 575.249984 266.841824 575.249984 283.875008C575.250016 321.923008 533.408 351.750016 480 351.750016zM728 320C679.04 320 640 278.6950080000001 640 230.375008C640 202.279008 656.164512 181.592992 667.812512 169.624992L784 50.249984L900.5 169.624992C912.148 181.5609920000001 928 198.119008 928 230.375008C928 278.6950080000001 888.96 320 840 320C816.64 320 797.44 312 784 304C770.56 312 751.36 320 728 320zM728 256C735.648 256 743.442016 253.64 751.249984 249L784 229.5L816.750016 249C824.557984 253.64 832.352 256 840 256C852.8 256 864 244.0070080000001 864 230.375008C864 224.3910080000001 863.743488 223.5925120000001 854.687488 214.312512L784.062496 141.937504L713.687488 214.2499840000001C710.071488 217.961984 704 224.999008 704 230.375008C704 244.0070080000001 715.2 256 728 256z" />
<glyph glyph-name="bar-chart"
unicode="&#xF080;"
horiz-adv-x="1024" d="M416 800L416 32L352 32L352 672L160 672L160 32L96 32L96 -32L928 -32L928 32L864 32L864 448L672 448L672 32L608 32L608 800zM480 736L544 736L544 32L480 32z" />
<glyph glyph-name="heart"
unicode="&#xF004;"
horiz-adv-x="1024" d="M304 736C171.624992 736 64 627.124992 64 496C64 450.249984 84.750016 410.624992 104 382C123.250016 353.375008 143 335 143 335L489 -12L512 -35L535 -12L881 335C881 335 960 404.624992 960 496C960 627.124992 852.375008 736 720 736C610.124992 736 539.375008 669.875008 512 642C484.624992 669.875008 413.875008 736 304 736zM304 672C399.624992 672 488 579 488 579L512 552L536 579C536 579 624.375008 672 720 672C817.375008 672 896 592.124992 896 496C896 446.624992 836 380 836 380L512 56L188 380C188 380 172.5 394.875008 157 418C141.5 441.124992 128 471.249984 128 496C128 592.124992 206.624992 672 304 672z" />
<glyph glyph-name="alternate-comment"
unicode="&#xF27A;"
horiz-adv-x="1024" d="M96 736L96 160L256 160L256 -2.5L459.250016 160L928 160L928 736zM160 672L864 672L864 224L436.750016 224L320 130.624992L320 224L160 224z" />
<glyph glyph-name="plus-square"
unicode="&#xF0FE;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM480 544L480 416L352 416L352 352L480 352L480 224L544 224L544 352L672 352L672 416L544 416L544 544z" />
<glyph glyph-name="alternate-list"
unicode="&#xF022;"
horiz-adv-x="1024" d="M329 727L224 622L183 663L137 617L201 553L224 531L247 553L375 681zM480 672L480 608L896 608L896 672zM329 471L224 366L183 407L137 361L201 297L224 275L247 297L375 425zM480 416L480 352L896 352L896 416zM329 215L224 110L183 151L137 105L201 41L224 19L247 41L375 169zM480 160L480 96L896 96L896 160z" />
<glyph glyph-name="smiling-face-with-heart-eyes"
unicode="&#xF584;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM336 544C309.5 544 288 522.5 288 496C288 493 288.250016 490.124992 289 487C290.375008 479.375008 293.5 472.875008 298 467C322 425.624992 384 384 384 384C384 384 480 445 480 496C480 522.5 458.5 544 432 544C405.5 544 384 522.5 384 496C384 522.5 362.5 544 336 544zM592 544C565.5 544 544 522.5 544 496C544 493 544.250016 490.124992 545 487C546.375008 479.375008 549.5 472.875008 554 467C578 425.624992 640 384 640 384C640 384 703.624992 425.249984 727 468C732.124992 477.5 736 486.749984 736 496C736 522.5 714.5 544 688 544C661.5 544 640 522.5 640 496C640 522.5 618.5 544 592 544zM346 288L291 256C335.250016 179.624992 417.5 128 512 128C606.5 128 688.750016 179.624992 733 256L678 288C644.750016 230.624992 583.250016 192 512 192C440.750016 192 379.250016 230.624992 346 288z" />
<glyph glyph-name="alternate-arrow-circle-left"
unicode="&#xF359;"
horiz-adv-x="1024" d="M512 800C282.624992 800 96 613.375008 96 384C96 154.624992 282.624992 -32 512 -32C741.375008 -32 928 154.624992 928 384C928 613.375008 741.375008 800 512 800zM512 736C706.750016 736 864 578.749984 864 384C864 189.2499840000001 706.750016 32 512 32C317.250016 32 160 189.2499840000001 160 384C160 578.749984 317.250016 736 512 736zM416 512L288 384L416 256L416 352L736 352L736 416L416 416z" />
<glyph glyph-name="frowning-face-with-open-mouth"
unicode="&#xF57A;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM368 544C341.5 544 320 508.124992 320 464C320 419.875008 341.5 384 368 384C394.5 384 416 419.875008 416 464C416 508.124992 394.5 544 368 544zM656 544C629.5 544 608 508.124992 608 464C608 419.875008 629.5 384 656 384C682.5 384 704 419.875008 704 464C704 508.124992 682.5 544 656 544zM512 352C438.624992 352 384 292.624992 384 224C384 192.375008 395.375008 160.875008 421 145C446.624992 129.124992 475 128 512 128C549 128 577.375008 129.124992 603 145C628.624992 160.875008 640 192.375008 640 224C640 292.624992 585.375008 352 512 352zM512 288C553.375008 288 576 261.5 576 224C576 202.624992 574.750016 201.875008 570 199C565.250016 196.124992 545.750016 192 512 192C478.250016 192 458.750016 196.124992 454 199C449.250016 201.875008 448 202.624992 448 224C448 261.5 470.624992 288 512 288z" />
<glyph glyph-name="tired-face"
unicode="&#xF5C8;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM321.750016 538.624992L286.25 485.375008L342.3125120000001 448L286.25 410.624992L321.750016 357.375008L457.687488 448L321.750016 538.624992zM702.249984 538.624992L566.312512 448L702.249984 357.375008L737.750016 410.624992L681.687488 448L737.750016 485.375008L702.249984 538.624992zM512 288C428.6720000000001 288 373.303488 218.92 353.687488 181C347.767488 169.576 358.588512 156.750016 370.8125120000001 160.750016C403.356512 171.438016 459.168 192 512 192C564.832 192 620.643488 171.405984 653.187488 160.750016C665.443488 156.718016 676.232512 169.576 670.312512 181C650.696512 218.888 595.328 288 512 288z" />
<glyph glyph-name="peace--hand-"
unicode="&#xF25B;"
horiz-adv-x="1024" d="M480 832C427.375008 832 384 788.624992 384 736L384 687L380 700C364.750016 750.375008 310.375008 779.249984 260 764C209.624992 748.749984 180.750016 694.375008 196 644L279 374C273 371.624992 266.5 368.875008 260 365C233.250016 349 203 316.624992 194 265C187.250016 226.7499840000001 194.624992 193.124992 200 175C200 174.624992 200 174.375008 200 174L225 94C253.875008 0.124992 340.875008 -64 439 -64L608 -64C731.375008 -64 832 36.624992 832 160L832 477C832 478.375008 832 479.624992 832 481C832 481.624992 832 482.375008 832 483C832 483.375008 832 483.624992 832 484C831.750016 485 831.375008 486 831 487C828.124992 522.249984 806.750016 555.124992 772 569C747.875008 578.624992 722.5 577.249984 700 568C689.624992 587.624992 672.875008 604.249984 651 613C625.875008 623 599.124992 621.375008 576 611L576 736C576 788.624992 532.624992 832 480 832zM480 768C498.124992 768 512 754.124992 512 736L512 525L479 441C474.250016 429.124992 472 416.249984 472 404L341 387L258 663C252.750016 680.249984 261.750016 697.749984 279 703C296.250016 708.249984 313.750016 698.249984 319 681L385 462L421 473L448 473L448 736C448 754.124992 461.875008 768 480 768zM614 556C618.124992 556.124992 622.875008 555.624992 627 554C643.750016 547.249984 651.750016 528.749984 645 512L611 427L611 426L598 393C597.375008 391.249984 595.875008 390.5 595 389C578.750016 401.624992 558.250016 409.749984 537 410C537.375008 412.375008 537 414.624992 538 417L586 536C591 548.624992 601.624992 555.749984 614 556zM735 512C739.250016 512 743.750016 511.624992 748 510C760.624992 505 767.750016 493.624992 768 481C768 480.624992 768 480.375008 768 480C768 476.124992 767.5 471.875008 766 468L730 379C723.250016 362.2499840000001 704.750016 354.2499840000001 688 361C671.250016 367.7499840000001 664.250016 386.249984 671 403L705 488C705.5 489.249984 705.5 490.749984 706 492C709.375008 500.375008 715.5 506.749984 723 510C726.750016 511.624992 730.750016 512 735 512zM528 347C544.875008 351 561 340.875008 565 324C567.5 313.624992 566.124992 308.375008 563 303C559.875008 297.624992 553.250016 291 539 286L384 246C374.5 243.5 366.750016 236.7499840000001 362.875008 227.875008C359 218.875008 359.375008 208.624992 364 200L393 147C401.5 131.5 421 125.875008 436.5 134.5C452 143 457.624992 162.5 449 178L440 194L558 225C559 225.2499840000001 560 225.624992 561 226C585.750016 234.624992 605.624992 249.375008 618 270C628.124992 286.875008 632 306.5 630 326C639.375008 315.875008 651.375008 307.5 665 302C701.624992 287.375008 741.875008 296.624992 768 323L768 160C768 71.249984 696.750016 0 608 0L439 0C368.624992 0 306.750016 45.749984 286 113L262 193C259.375008 201.624992 254.124992 231.875008 258 254C264 288.375008 279 301.624992 293 310C307 318.375008 317 319 317 319C317.624992 319 318.375008 319 319 319L525 346C526 346.2499840000001 527 346.624992 528 347z" />
<glyph glyph-name="calendar-minus"
unicode="&#xF272;"
horiz-adv-x="1024" d="M288 736L288 704L160 704L160 0L864 0L864 704L736 704L736 736L672 736L672 704L352 704L352 736zM224 640L288 640L288 608L352 608L352 640L672 640L672 608L736 608L736 640L800 640L800 576L224 576zM224 512L800 512L800 64L224 64zM352 320L352 256L672 256L672 320z" />
<glyph glyph-name="lightbulb"
unicode="&#xF0EB;"
horiz-adv-x="1024" d="M512 768C353.375008 768 224 638.624992 224 480C224 418.624992 251 355 288 298C315.5 255.624992 348.375008 216.624992 384 187L384 96C384 61 413 32 448 32L480 0L544 0L576 32C611 32 640 61 640 96L640 187C675.624992 216.624992 708.5 255.624992 736 298C773 355 800 418.624992 800 480C800 638.624992 670.624992 768 512 768zM512 704C636.124992 704 736 604.124992 736 480C736 438.124992 715.375008 382.875008 683 333C654.124992 288.5 616.124992 248.875008 581 224L443 224C407.875008 248.875008 369.875008 288.5 341 333C308.624992 382.875008 288 438.124992 288 480C288 604.124992 387.875008 704 512 704zM456 160L568 160C570.5 158.2499840000001 573.124992 157 576 156L576 96L448 96L448 156C450.875008 157 453.5 158.2499840000001 456 160z" />
<glyph glyph-name="check-square"
unicode="&#xF14A;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM681 535L448 302L343 407L297 361L425 233L448 211L471 233L727 489z" />
<glyph glyph-name="user"
unicode="&#xF007;"
horiz-adv-x="1024" d="M512 736C388.624992 736 288 635.375008 288 512C288 434.875008 327.375008 366.375008 387 326C272.875008 277 192 163.7499840000001 192 32L256 32C256 173.7499840000001 370.250016 288 512 288C653.750016 288 768 173.7499840000001 768 32L832 32C832 163.7499840000001 751.124992 277 637 326C696.624992 366.375008 736 434.875008 736 512C736 635.375008 635.375008 736 512 736zM512 672C600.750016 672 672 600.749984 672 512C672 423.249984 600.750016 352 512 352C423.250016 352 352 423.249984 352 512C352 600.749984 423.250016 672 512 672z" />
<glyph glyph-name="spock--hand-"
unicode="&#xF259;"
horiz-adv-x="1024" d="M397 832C390.750016 831.875008 384.375008 831.5 378 830C335.124992 820.249984 305 782.124992 303 740C291.250016 741.875008 279.124992 741.749984 267 739C215.624992 727.375008 182.375008 675.375008 194 624L256 355L256 328L228 356C190.750016 393.249984 129.250016 393.249984 92 356C54.750016 318.7499840000001 54.750016 257.2499840000001 92 220L309 3C346.624992 -34.5 398.624992 -64 460 -64L608 -64C731.375008 -64 832 36.624992 832 160L832 384L862 535C872.124992 586.624992 837.624992 637.875008 786 648C775.124992 650.124992 764.375008 650.5 754 649L761 685C771.124992 736.624992 736.624992 787.875008 685 798C633.375008 808.124992 583.124992 773.624992 573 722L541 570L492 757C491.875008 757.249984 492.124992 757.749984 492 758L491 758C480.250016 802.124992 440.750016 832.749984 397 832zM392 767C409.624992 771 426 760.624992 430 743L430 742L510 435L516 411L573 411L579 437L635 709L635 710C638.5 727.749984 655.250016 738.5 673 735C690.750016 731.5 701.5 714.749984 698 697L640 405L703 393L736 559L737 559C740.5 576.749984 756.250016 588.5 774 585C791.750016 581.5 802.5 564.749984 799 547L769 390L768 387L768 160C768 71.249984 696.750016 0 608 0L460 0C419.250016 0 384.250016 19.875008 355 49L137 265C124.250016 277.7499840000001 124.250016 298.2499840000001 137 311C149.750016 323.7499840000001 170.250016 323.7499840000001 183 311L265 228L320 173L320 359L319 362L257 638C253 655.624992 263.375008 673 281 677C298.624992 681 315 669.624992 319 652L376 398L439 412L382 667C381.875008 667.375008 382.124992 667.624992 382 668L368 729C364 746.624992 374.375008 763 392 767z" />
<glyph glyph-name="identification-card"
unicode="&#xF2C2;"
horiz-adv-x="1024" d="M160 704C107.375008 704 64 660.624992 64 608L64 160C64 107.375008 107.375008 64 160 64L864 64C916.624992 64 960 107.375008 960 160L960 608C960 660.624992 916.624992 704 864 704zM160 640L864 640C882.124992 640 896 626.124992 896 608L896 160C896 141.875008 882.124992 128 864 128L160 128C141.875008 128 128 141.875008 128 160L128 608C128 626.124992 141.875008 640 160 640zM352 576C281.624992 576 224 518.375008 224 448C224 412.375008 239.250016 380.2499840000001 263 357C220.375008 328.124992 192 279 192 224L256 224C256 277.375008 298.624992 320 352 320C405.375008 320 448 277.375008 448 224L512 224C512 279 483.624992 328.124992 441 357C464.750016 380.2499840000001 480 412.375008 480 448C480 518.375008 422.375008 576 352 576zM576 544L576 480L832 480L832 544zM352 512C387.750016 512 416 483.749984 416 448C416 412.249984 387.750016 384 352 384C316.250016 384 288 412.249984 288 448C288 483.749984 316.250016 512 352 512zM576 416L576 352L832 352L832 416zM576 288L576 224L736 224L736 288z" />
<glyph glyph-name="calendar-check"
unicode="&#xF274;"
horiz-adv-x="1024" d="M288 736L288 704L160 704L160 0L864 0L864 704L736 704L736 736L672 736L672 704L352 704L352 736zM224 640L288 640L288 608L352 608L352 640L672 640L672 608L736 608L736 640L800 640L800 576L224 576zM224 512L800 512L800 64L224 64zM649 439L480 270L407 343L361 297L457 201L480 179L503 201L695 393z" />
<glyph glyph-name="moon"
unicode="&#xF186;"
horiz-adv-x="1024" d="M160 736L160 672L96 672L96 608L160 608L160 544L224 544L224 608L288 608L288 672L224 672L224 736zM649 642L596 640C425 633.875008 288 493.5 288 321C288 144.624992 431.624992 1 608 1C780.5 1 920.875008 138 927 309L929 361L882 339C857 327.124992 829.250016 321 800 321C693.624992 321 608 406.624992 608 513C608 542.249984 615.124992 569 627 594zM556 566C552 548.249984 544 532 544 513C544 372 659 257 800 257C819.375008 257 835.875008 264.875008 854 269C829.624992 153 731.5 65 608 65C466.250016 65 352 179.2499840000001 352 321C352 444.249984 440.250016 541.375008 556 566z" />
<glyph glyph-name="calendar"
unicode="&#xF133;"
horiz-adv-x="1024" d="M288 768L288 736L160 736L160 32L864 32L864 736L736 736L736 768L672 768L672 736L352 736L352 768zM224 672L288 672L288 640L352 640L352 672L672 672L672 640L736 640L736 672L800 672L800 608L224 608zM224 544L800 544L800 96L224 96zM416 480L416 416L480 416L480 480zM544 480L544 416L608 416L608 480zM672 480L672 416L736 416L736 480zM288 352L288 288L352 288L352 352zM416 352L416 288L480 288L480 352zM544 352L544 288L608 288L608 352zM672 352L672 288L736 288L736 352zM288 224L288 160L352 160L352 224zM416 224L416 160L480 160L480 224zM544 224L544 160L608 160L608 224z" />
<glyph glyph-name="file"
unicode="&#xF15B;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 589L823 599L631 791L621 800zM256 736L576 736L576 544L768 544L768 32L256 32zM640 690L722 608L640 608z" />
<glyph glyph-name="clock"
unicode="&#xF017;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM480 640L480 352L704 352L704 416L544 416L544 640z" />
<glyph glyph-name="sun"
unicode="&#xF185;"
horiz-adv-x="1024" d="M480 800L480 640L544 640L544 800zM240 701L195 656L308 542L354 588zM784 701L670 588L716 542L829 656zM512 608C388.624992 608 288 507.375008 288 384C288 260.624992 388.624992 160 512 160C635.375008 160 736 260.624992 736 384C736 507.375008 635.375008 608 512 608zM512 544C600.750016 544 672 472.749984 672 384C672 295.2499840000001 600.750016 224 512 224C423.250016 224 352 295.2499840000001 352 384C352 472.749984 423.250016 544 512 544zM96 416L96 352L256 352L256 416zM768 416L768 352L928 352L928 416zM308 226L195 112L240 67L354 180zM716 226L670 180L784 67L829 112zM480 128L480 -32L544 -32L544 128z" />
<glyph glyph-name="hand-pointing-up"
unicode="&#xF0A6;"
horiz-adv-x="1024" d="M416 832C363.375008 832 320 788.624992 320 736L320 392L296 398C291 404.5 288.875008 408.624992 276 418C255.5 433 223.750016 448 181 448C135.375008 448 96 406.749984 96 355L96 342L105 332L320 115L320 -64L832 -64L832 475C832 520.124992 800.124992 559.5 756 569L512 622L512 736C512 788.624992 468.624992 832 416 832zM416 768C434.124992 768 448 754.124992 448 736L448 570L473 564L743 507C758 503.749984 768 490.249984 768 475L768 160L365 160L163 365C165.624992 378.5 171.124992 384 181 384C209.875008 384 227.750016 375.2499840000001 239 367C250.250016 358.7499840000001 253 353 253 353L259 342L272 338L344 319L384 309L384 736C384 754.124992 397.875008 768 416 768zM384 96L768 96L768 0L384 0z" />
<glyph glyph-name="user-circle"
unicode="&#xF2BD;"
horiz-adv-x="1024" d="M512 800C282.624992 800 96 613.375008 96 384C96 154.624992 282.624992 -32 512 -32C741.375008 -32 928 154.624992 928 384C928 613.375008 741.375008 800 512 800zM512 736C706.750016 736 864 578.749984 864 384C864 189.2499840000001 706.750016 32 512 32C317.250016 32 160 189.2499840000001 160 384C160 578.749984 317.250016 736 512 736zM512 640C424 640 352 568 352 480C352 431.5 374.624992 388.375008 409 359C337 321.624992 288 246.375008 288 160L352 160C352 248.7499840000001 423.250016 320 512 320C600.750016 320 672 248.7499840000001 672 160L736 160C736 246.375008 687 321.624992 615 359C649.375008 388.375008 672 431.5 672 480C672 568 600 640 512 640zM512 576C565.375008 576 608 533.375008 608 480C608 426.624992 565.375008 384 512 384C458.624992 384 416 426.624992 416 480C416 533.375008 458.624992 576 512 576z" />
<glyph glyph-name="envelope-open"
unicode="&#xF2B6;"
horiz-adv-x="1024" d="M512 800L495 789L111 539L96 529L96 -32L928 -32L928 529L913 539L529 789zM512 724L838 512L512 301L186 512zM160 453L495 236L512 225L529 236L864 453L864 32L160 32z" />
<glyph glyph-name="edit"
unicode="&#xF044;"
horiz-adv-x="1024" d="M800 767C775.5 767 751.5 757.5 733 739L416 423L409 416L407 406L385 294L375 247L422 257L534 279L544 281L551 288L867 605C903.875008 641.875008 903.875008 702.124992 867 739C848.5 757.5 824.5 767 800 767zM800 705C807.5 705 814.875008 701.124992 822 694C836.250016 679.749984 836.250016 664.249984 822 650L512 340L457 329L468 384L778 694C785.124992 701.124992 792.5 705 800 705zM128 640L128 0L768 0L768 422L704 358L704 64L192 64L192 576L486 576L550 640z" />
<glyph glyph-name="circle"
unicode="&#xF111;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704z" />
<glyph glyph-name="word-file"
unicode="&#xF1C2;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 800zM256 736L768 736L768 32L256 32zM576 512L576 304C576 297.124992 566.875008 288 560 288C558.624992 288 560.624992 286.5 558 290C555.375008 293.5 551.375008 302.375008 549 312C544.250016 331.124992 544 352 544 352L544 416L480 416L480 272C480 265.124992 470.875008 256 464 256C457.124992 256 448 265.124992 448 272L448 480L320 480L320 416L384 416L384 272C384 227.7499840000001 419.750016 192 464 192C495.5 192 518 212.624992 531 239C540.624992 233 547.624992 224 560 224C604.250016 224 640 259.7499840000001 640 304L640 448L704 448L704 512z" />
<glyph glyph-name="alternate-file"
unicode="&#xF15C;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 589L823 599L631 791L621 800zM256 736L576 736L576 544L768 544L768 32L256 32zM640 690L722 608L640 608zM352 480L352 416L672 416L672 480zM352 352L352 288L672 288L672 352zM352 224L352 160L672 160L672 224z" />
<glyph glyph-name="flushed-face"
unicode="&#xF579;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM368 640C270.944 640 192 561.056 192 464C192 366.944 270.944 288 368 288C427.54 288 480.13632 317.812992 512 363.1874880000001C543.86368 317.812992 596.46 288 656 288C753.056 288 832 366.944 832 464C832 561.056 753.056 640 656 640C596.46 640 543.86368 610.1870144 512 564.812512C480.13632 610.1870144 427.54 640 368 640zM368 576C429.76 576 480 525.76 480 464C480 402.24 429.76 352 368 352C306.24 352 256 402.24 256 464C256 525.76 306.24 576 368 576zM656 576C717.76 576 768 525.76 768 464C768 402.24 717.76 352 656 352C594.24 352 544 402.24 544 464C544 525.76 594.24 576 656 576zM368 512A48 48 0 0 1 368 416A48 48 0 0 1 368 512zM656 512A48 48 0 0 1 656 416A48 48 0 0 1 656 512zM384 224L384 160L640 160L640 224L384 224z" />
<glyph glyph-name="life-ring"
unicode="&#xF1CD;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C522.750016 704 533.5 703 544 702L544 605C533.5 606.5 522.875008 608 512 608C501.124992 608 490.5 606.5 480 605L480 702C490.5 703 501.250016 704 512 704zM416 690L416 586C369.5 563.749984 332.124992 526.5 310 480L207 480C238.124992 580 316.250016 658.749984 416 690zM608 690C707.624992 658.749984 786.750016 579.624992 818 480L714 480C691.875008 526.5 654.5 563.875008 608 586zM512 544C600.750016 544 672 472.749984 672 384C672 295.2499840000001 600.750016 224 512 224C423.250016 224 352 295.2499840000001 352 384C352 472.749984 423.250016 544 512 544zM194 416L290 416C288.5 405.624992 288 394.749984 288 384C288 373.124992 289.5 362.5 291 352L194 352C193 362.5 192 373.2499840000001 192 384C192 394.749984 193 405.5 194 416zM733 416L830 416C831 405.5 832 394.749984 832 384C832 373.2499840000001 831 362.5 830 352L733 352C734.5 362.5 736 373.124992 736 384C736 394.875008 734.5 405.5 733 416zM206 288L310 288C332.124992 241.5 369.5 204.124992 416 182L416 78C316.375008 109.249984 237.250016 188.375008 206 288zM714 288L818 288C786.750016 188.375008 707.624992 109.249984 608 78L608 182C654.5 204.124992 691.875008 241.5 714 288zM480 163C490.5 161.5 501.124992 160 512 160C522.875008 160 533.5 161.5 544 163L544 66C533.5 65 522.750016 64 512 64C501.250016 64 490.5 65 480 66z" />
<glyph glyph-name="caret-square-right"
unicode="&#xF152;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM455 599L409 553L578 384L409 215L455 169L647 361L669 384L647 407z" />
<glyph glyph-name="beaming-face-with-smiling-eyes"
unicode="&#xF5B8;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM352 512C284.992 512 236.5 473.375008 236.5 473.375008L275.5 422.624992C275.5 422.624992 310.1744992 448 352.062496 448C393.950496 448 428.562496 422.624992 428.562496 422.624992L467.562496 473.375008C467.498496 473.375008 419.008 512 352 512zM672 512C604.992 512 556.5 473.375008 556.5 473.375008L595.5 422.624992C595.5 422.624992 630.174496 448 672.062496 448C713.950496 448 748.562496 422.624992 748.562496 422.624992L787.562496 473.375008C787.498496 473.375008 739.008 512 672 512zM345.937504 288L290.8750016 256C296.4350016 246.4400000000001 302.56 237.290624 309.25 228.562496C315.94 219.8343680000001 323.217504 211.542496 330.937504 203.750016C346.377504 188.164992 363.790016 174.532512 382.750016 163.312512C392.230016 157.702496 402.04 152.675616 412.249984 148.312512C422.46 143.949376 433.035008 140.2624960000001 443.875008 137.2499840000001C454.715008 134.237504 465.88 131.93312 477.249984 130.375008C488.62 128.816864 500.2 128 512 128C523.8 128 535.38 128.816864 546.750016 130.375008C603.6 138.165632 654.462496 164.7874880000001 693.062496 203.750016C700.782496 211.542496 708.06 219.8343680000001 714.750016 228.562496C721.44 237.290624 727.564992 246.4400000000001 733.124992 256L678.062496 288C648.942496 237.88 598.270624 201.944384 538.249984 193.750016C529.675616 192.57936 520.92 192 512 192C503.08 192 494.324384 192.57936 485.750016 193.750016C477.175616 194.9206400000001 468.782496 196.6750080000001 460.624992 198.937504C444.310016 203.462496 428.907488 210.0800000000001 414.687488 218.5C400.467488 226.92 387.430016 237.127488 375.875008 248.812512C370.097504 254.655008 364.691872 260.8968640000001 359.687488 267.437504C354.683136 273.978112 350.097504 280.8400000000001 345.937504 288z" />
<glyph glyph-name="square"
unicode="&#xF0C8;"
horiz-adv-x="1024" d="M192 704L192 64L832 64L832 704zM256 640L768 640L768 128L256 128z" />
<glyph glyph-name="question-circle"
unicode="&#xF059;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM512 576C441.624992 576 384 518.375008 384 448L448 448C448 483.749984 476.250016 512 512 512C547.750016 512 576 483.749984 576 448C576 423.5 560.250016 401.749984 537 394L524 390C497.875008 381.375008 480 356.375008 480 329L480 288L544 288L544 329L557 333C606.250016 349.375008 640 396.124992 640 448C640 518.375008 582.375008 576 512 576zM480 256L480 192L544 192L544 256z" />
<glyph glyph-name="eye"
unicode="&#xF06E;"
horiz-adv-x="1024" d="M512 640C245.250016 640 40 405 40 405L21 384L40 363C40 363 227.124992 149.624992 476 130C487.875008 128.5 499.750016 128 512 128C524.250016 128 536.124992 128.5 548 130C796.875008 149.624992 984 363 984 363L1003 384L984 405C984 405 778.750016 640 512 640zM512 576C582.5 576 647.5 556.749984 704 531C724.375008 497.249984 736 458.375008 736 416C736 300.375008 649.250016 205.375008 537 193C536.375008 192.875008 535.624992 193.124992 535 193C527.375008 192.624992 519.750016 192 512 192C503.5 192 495.250016 192.5 487 193C374.750016 205.375008 288 300.375008 288 416C288 457.749984 299.250016 496.624992 319 530L318 530C375 556.249984 440.750016 576 512 576zM512 512C459 512 416 469 416 416C416 363 459 320 512 320C565 320 608 363 608 416C608 469 565 512 512 512zM232 482C227 460.5 224 438.875008 224 416C224 359.875008 240 307.375008 268 263C187.375008 309.624992 131.375008 365.2499840000001 113 384C128.375008 399.749984 171.250016 441.5 232 482zM792 482C852.750016 441.5 895.624992 399.749984 911 384C892.624992 365.2499840000001 836.624992 309.624992 756 263C784 307.375008 800 359.875008 800 416C800 438.875008 797 460.749984 792 482z" />
<glyph glyph-name="pdf-file"
unicode="&#xF1C1;"
horiz-adv-x="1024" d="M192 800L192 -32L832 -32L832 800zM256 736L768 736L768 32L256 32zM493 565C483.250016 565.124992 471.875008 561.624992 464 555C455.875008 548.124992 452.250016 539.624992 450 531C445.624992 513.749984 446.875008 495.875008 451 476C455.875008 452.749984 469.750016 424.749984 481 398C475.250016 373.624992 473.750016 352 465 327C457.5 305.5 447.875008 293.124992 439 274C418.875008 266.375008 394.875008 261.875008 379 252C361.875008 241.375008 346.875008 229.624992 338 213C329.124992 196.375008 330.124992 172.875008 342 156C347.875008 147.124992 355.624992 140.124992 366 136C376.375008 131.875008 387.624992 131.7499840000001 397 135C415.875008 141.5 429.250016 156 442 173C453.875008 188.7499840000001 462.250016 215.5 473 237C489.124992 242.375008 500.750016 249.124992 518 253C536 257 548.124992 255.124992 565 257C572.250016 248.7499840000001 578.375008 235.5 586 229C601.250016 215.7499840000001 618 205.2499840000001 638 204C658 202.7499840000001 678 215.2499840000001 689 234L690 234L690 235C694.875008 243.5 698.250016 252.7499840000001 698 263C697.750016 273.2499840000001 692.624992 284 686 291C672.875008 305 656.124992 308.624992 638 311C624 312.875008 604.5 307.875008 588 307C573.5 326.124992 559.124992 340.5 546 365C538.875008 378.2499840000001 537 389.5 531 403C535.624992 424.749984 544.750016 449 546 468C547.5 491 546.624992 510.875008 540 529C536.624992 538.124992 531.250016 547.124992 523 554C515 560.624992 504.624992 564.749984 494 565C493.624992 565 493.375008 565 493 565zM514 328C519.750016 317.875008 526.875008 311.5 533 302C524 300.375008 517.124992 302 508 300C506.5 299.624992 505.5 298.375008 504 298C505.875008 303 508.250016 306 510 311C512 316.875008 512.124992 322.124992 514 328zM632 263C642.750016 261.624992 646.624992 259.624992 648 259C647.750016 258.5 648.375008 258.624992 648 258C644 251.375008 643.624992 251.875008 641 252C638.875008 252.124992 630.750016 256.5 623 262C625.250016 261.875008 630 263.2499840000001 632 263zM408 213C406.250016 210.375008 404.750016 204.2499840000001 403 202C393.250016 189 384.250016 183 382 182C381.624992 182.5 382.624992 182 382 183L381 183C377.750016 187.624992 378.624992 185.7499840000001 381 190C383.375008 194.2499840000001 390.875008 202.875008 404 211C405 211.624992 407 212.375008 408 213z" />
<glyph glyph-name="frowning-face"
unicode="&#xF119;"
horiz-adv-x="1024" d="M512 768C300.250016 768 128 595.749984 128 384C128 172.2499840000001 300.250016 0 512 0C723.750016 0 896 172.2499840000001 896 384C896 595.749984 723.750016 768 512 768zM512 704C689.124992 704 832 561.124992 832 384C832 206.875008 689.124992 64 512 64C334.875008 64 192 206.875008 192 384C192 561.124992 334.875008 704 512 704zM368 512C341.5 512 320 490.5 320 464C320 437.5 341.5 416 368 416C394.5 416 416 437.5 416 464C416 490.5 394.5 512 368 512zM656 512C629.5 512 608 490.5 608 464C608 437.5 629.5 416 656 416C682.5 416 704 437.5 704 464C704 490.5 682.5 512 656 512zM512 320C426.624992 320 351.375008 277.2499840000001 305 213L357 176C391.875008 224.5 447.750016 256 512 256C576.250016 256 632.124992 224.5 667 176L719 213C672.624992 277.2499840000001 597.375008 320 512 320z" />
<glyph glyph-name="window-minimize"
unicode="&#xF2D1;"
horiz-adv-x="1024" d="M160 736L160 32L864 32L864 736zM224 672L800 672L800 96L224 96zM288 256L288 192L736 192L736 256z" />
<glyph glyph-name="registered-trademark"
unicode="&#xF25D;"
horiz-adv-x="1024" d="M512 800C282.624992 800 96 613.375008 96 384C96 154.624992 282.624992 -32 512 -32C741.375008 -32 928 154.624992 928 384C928 613.375008 741.375008 800 512 800zM512 736C706.750016 736 864 578.749984 864 384C864 189.2499840000001 706.750016 32 512 32C317.250016 32 160 189.2499840000001 160 384C160 578.749984 317.250016 736 512 736zM384 576L384 192L448 192L448 320L557 320L608 192L672 192L618 328C668 345.375008 704 392 704 448C704 518.749984 646.750016 576 576 576zM448 512L576 512C614.124992 512 640 486.124992 640 448C640 409.875008 614.124992 384 576 384L448 384z" />
<glyph glyph-name="comment-dots"
unicode="&#xF4AD;"
horiz-adv-x="1024" d="M96 736L96 160L256 160L256 -2.5L459.250016 160L928 160L928 736zM160 672L864 672L864 224L436.750016 224L320 130.624992L320 224L160 224zM320 512C284.624992 512 256 483.375008 256 448C256 412.624992 284.624992 384 320 384C355.375008 384 384 412.624992 384 448C384 483.375008 355.375008 512 320 512zM512 512C476.624992 512 448 483.375008 448 448C448 412.624992 476.624992 384 512 384C547.375008 384 576 412.624992 576 448C576 483.375008 547.375008 512 512 512zM704 512C668.624992 512 640 483.375008 640 448C640 412.624992 668.624992 384 704 384C739.375008 384 768 412.624992 768 448C768 483.375008 739.375008 512 704 512z" />
<glyph glyph-name="winking-face-with-tongue"
unicode="&#xF58B;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM368 512A48 48 0 0 1 368 416A48 48 0 0 1 368 512zM576 480L576 416L736 416L736 480L576 480zM376.5 340.562496L327.437504 299.437504C355.494176 266.009728 398.443392 242.3571520000001 448 231.2499840000001L448 192C448 156.8 476.8 128 512 128C547.2 128 576 156.8 576 192L576 231.2499840000001C625.554688 242.359072 668.465984 265.98704 696.5 299.437504L647.437504 340.562496C620.301504 308.1144960000001 568.416 288 512 288C455.584 288 403.668 308.146496 376.5 340.562496z" />
<glyph glyph-name="futbol"
unicode="&#xF1E3;"
horiz-adv-x="1024" d="M512 800C282.624992 800 96 613.375008 96 384C96 154.624992 282.624992 -32 512 -32C741.375008 -32 928 154.624992 928 384C928 613.375008 741.375008 800 512 800zM512 736C531.250016 736 549.624992 734 568 731L512 691L456 731C474.250016 733.875008 492.875008 736 512 736zM378 709L493 625L512 611L531 625L646 709C697.124992 687.749984 742.250016 655.249984 778 614L734 477L727 455L746 442L862 357C857.750016 300.624992 840.5 247.7499840000001 813 202L644 202L637 180L592 41C566.375008 35 539.5 32 512 32C483.375008 32 455.624992 35.624992 429 42L385 179L378 201L211 201C183 247 166.375008 300.124992 162 357L277 441L296 454L289 476L244 612C280 654.249984 325.875008 687.5 378 709zM512 573L493 559L347 453L329 439L336 417L392 246L399 224L625 224L632 246L688 417L695 439L677 453L531 559zM824 547C841.5 513.5 853 476.749984 859 438L802 479zM199 545L221 479L165 438C170.875008 476 182 512 199 545zM512 493L620 415L579 288L445 288L404 415zM691 138L763 138C735.750016 109.875008 704.375008 86.624992 669 69zM261 137L331 137L353 70C318.750016 87.375008 287.624992 110 261 137z" />
<glyph glyph-name="clone"
unicode="&#xF24D;"
horiz-adv-x="1024" d="M160 736L160 704L160 224L160 192L192 192L288 192L288 256L224 256L224 672L640 672L640 608L704 608L704 704L704 736L672 736L192 736L160 736zM320 576L320 544L320 64L320 32L352 32L832 32L864 32L864 64L864 544L864 576L832 576L352 576L320 576zM384 512L800 512L800 96L384 96L384 512z" />
<glyph glyph-name="share-square"
unicode="&#xF14D;"
horiz-adv-x="1024" d="M749.249984 754L704 708.75L837.375008 576L528 576C430.976 576 352 497.056 352 400C352 302.944 430.976 224 528 224L544 224L544 288L528 288C466.24 288 416 338.24 416 400C416 461.76 466.24 512 528 512L837.5 512L704.249984 378.750016L749.5 333.5L960 544L749.249984 754zM160 736L160 32L864 32L864 352L800 288L800 96L224 96L224 672L571.312512 672L635.312512 736L160 736z" />
<glyph glyph-name="copyright"
unicode="&#xF1F9;"
horiz-adv-x="1024" d="M512 800C282.624992 800 96 613.375008 96 384C96 154.624992 282.624992 -32 512 -32C741.375008 -32 928 154.624992 928 384C928 613.375008 741.375008 800 512 800zM512 736C706.750016 736 864 578.749984 864 384C864 189.2499840000001 706.750016 32 512 32C317.250016 32 160 189.2499840000001 160 384C160 578.749984 317.250016 736 512 736zM509 576C402.624992 576 317 490.375008 317 384C317 277.624992 402.624992 192 509 192C585.750016 192 651.375008 238 682 303L624 330C603.375008 286.124992 560.250016 256 509 256C436.124992 256 381 311.124992 381 384C381 456.875008 436.124992 512 509 512C560.250016 512 603.375008 481.875008 624 438L682 465C651.375008 530 585.750016 576 509 576z" />
<glyph glyph-name="bell"
unicode="&#xF0F3;"
horiz-adv-x="1024" d="M512 800C476.624992 800 448 771.375008 448 736C448 733.249984 448.624992 730.624992 449 728C338.375008 699.749984 256 599.249984 256 480L256 192C256 173.875008 242.124992 160 224 160L192 160L192 96L422 96C418.375008 85.875008 416 75.249984 416 64C416 11.375008 459.375008 -32 512 -32C564.624992 -32 608 11.375008 608 64C608 75.249984 605.624992 85.875008 602 96L832 96L832 160L800 160C781.875008 160 768 173.875008 768 192L768 471C768 591.249984 687.624992 698.5 575 728C575.375008 730.624992 576 733.249984 576 736C576 771.375008 547.375008 800 512 800zM498 672C502.624992 672.375008 507.250016 672 512 672C514 672 516 672 518 672C622.5 668.875008 704 577.249984 704 471L704 192C704 180.7499840000001 706.375008 170.124992 710 160L314 160C317.624992 170.124992 320 180.7499840000001 320 192L320 480C320 581.624992 398.250016 664.749984 498 672zM512 96C530 96 544 82 544 64C544 46 530 32 512 32C494 32 480 46 480 64C480 82 494 96 512 96z" />
<glyph glyph-name="paper--hand-"
unicode="&#xF256;"
horiz-adv-x="1024" d="M512 832C467.750016 832 431 801 420 760C408.750016 764.624992 396.875008 768 384 768C331.375008 768 288 724.624992 288 672L288 328L260 356C222.750016 393.249984 161.250016 393.249984 124 356C86.750016 318.7499840000001 86.750016 257.2499840000001 124 220L341 3C378.624992 -34.5 430.624992 -64 492 -64L640 -64C763.375008 -64 864 36.624992 864 160L864 544C864 596.624992 820.624992 640 768 640C756.750016 640 746.124992 637.624992 736 634L736 672C736 724.624992 692.624992 768 640 768C627.124992 768 615.250016 764.624992 604 760C593 801 556.250016 832 512 832zM512 768C530.124992 768 544 754.124992 544 736L544 416L608 416L608 672C608 690.124992 621.875008 704 640 704C658.124992 704 672 690.124992 672 672L672 416L736 416L736 544C736 562.124992 749.875008 576 768 576C786.124992 576 800 562.124992 800 544L800 160C800 71.249984 728.750016 0 640 0L492 0C451.250016 0 416.250016 19.875008 387 49L169 265C156.250016 277.7499840000001 156.250016 298.2499840000001 169 311C181.750016 323.7499840000001 202.250016 323.7499840000001 215 311L297 228L352 173L352 672C352 690.124992 365.875008 704 384 704C402.124992 704 416 690.124992 416 672L416 416L480 416L480 736C480 754.124992 493.875008 768 512 768z" />
<glyph glyph-name="scissors--hand-"
unicode="&#xF257;"
horiz-adv-x="1024" d="M365 673C338.5 673.5 316.5 668 303 664C302.624992 664 302.375008 664 302 664L222 639C128.124992 610.124992 64 523.124992 64 425L64 256C64 132.624992 164.624992 32 288 32L605 32C644 31.124992 681.750016 54 697 92C706.624992 116.124992 705.250016 141.5 696 164C715.624992 174.375008 732.250016 191.124992 741 213C751 238.124992 749.375008 264.875008 739 288L864 288C916.624992 288 960 331.375008 960 384C960 436.624992 916.624992 480 864 480L815 480L828 484C878.375008 499.249984 907.250016 553.624992 892 604C876.750016 654.375008 822.375008 683.249984 772 668L502 585C499.624992 591 496.875008 597.5 493 604C477 630.749984 444.624992 661 393 670C383.375008 671.624992 373.875008 672.875008 365 673zM804 608C816.5 606.624992 827.124992 598 831 585C836.250016 567.749984 826.250016 550.249984 809 545L590 479L601 443L601 416L864 416C882.124992 416 896 402.124992 896 384C896 365.875008 882.124992 352 864 352L653 352L569 385C556.875008 389.875008 544.375008 392.249984 532 392L515 523L791 607C795.375008 608.375008 799.875008 608.5 804 608zM364 607C370.124992 607 376.5 607 382 606C416.375008 600 429.624992 585 438 571C446.375008 557 447 547 447 547C447 546.375008 447 545.624992 447 545L474 339C474.250016 338 474.624992 337 475 336C479 319.124992 468.875008 303 452 299C441.624992 296.5 436.375008 297.875008 431 301C425.624992 304.124992 419 310.7499840000001 414 325L374 480C371.5 489.5 364.750016 497.249984 355.875008 501.124992C346.875008 505 336.624992 504.624992 328 500L275 471C259.5 462.5 253.875008 443 262.5 427.5C271 412 290.5 406.375008 306 415L322 424L353 306C353.250016 305 353.624992 304 354 303C362.624992 278.2499840000001 377.375008 258.375008 398 246C414.875008 235.875008 434.5 232 454 234C443.875008 224.624992 435.5 212.624992 430 199C415.375008 162.375008 424.624992 122.124992 451 96L288 96C199.250016 96 128 167.2499840000001 128 256L128 425C128 495.375008 173.750016 557.249984 241 578L321 602C327.5 604 345.750016 607 364 607zM538 327C540.375008 326.624992 542.624992 327 545 326L664 278C680.750016 271.2499840000001 688.750016 253.7499840000001 682 237C675.250016 220.2499840000001 656.750016 212.2499840000001 640 219L521 266C519.250016 266.624992 518.5 268.124992 517 269C529.624992 285.2499840000001 537.750016 305.7499840000001 538 327zM518 195C522.250016 195 526.750016 194.624992 531 193L574 176L616 159L620 158C636.750016 151.2499840000001 644.750016 132.7499840000001 638 116C633.124992 103.749984 622.250016 96.624992 610 96C609.624992 96 609.375008 96 609 96C604.750016 95.875008 600.250016 96.375008 596 98L507 134C490.250016 140.7499840000001 482.250016 159.2499840000001 489 176C492.375008 184.375008 498.5 189.7499840000001 506 193C509.750016 194.624992 513.750016 195 518 195z" />
<glyph glyph-name="bookmark"
unicode="&#xF02E;"
horiz-adv-x="1024" d="M224 736L224 0L275 38L512 216L749 38L800 0L800 736zM288 672L736 672L736 128L531 282L512 296L493 282L288 128z" />
<glyph glyph-name="grimacing-face"
unicode="&#xF57F;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM368 512A48 48 0 0 1 368 416A48 48 0 0 1 368 512zM656 512A48 48 0 0 1 656 416A48 48 0 0 1 656 512zM384 352C331.072 352 288 308.928 288 256C288 203.072 331.072 160 384 160L640 160C692.928 160 736 203.072 736 256C736 308.928 692.928 352 640 352L384 352zM384 288L416 288L416 224L384 224C366.336 224 352 238.336 352 256C352 273.664 366.336 288 384 288zM480 288L544 288L544 224L480 224L480 288zM608 288L640 288C657.664 288 672 273.664 672 256C672 238.336 657.664 224 640 224L608 224L608 288z" />
<glyph glyph-name="check-circle"
unicode="&#xF058;"
horiz-adv-x="1024" d="M512 800C281.624992 800 96 614.375008 96 384C96 153.624992 281.624992 -32 512 -32C742.375008 -32 928 153.624992 928 384C928 428.749984 922 473.375008 906 515L854 464C860.375008 438.375008 864 412.749984 864 384C864 188.7499840000001 707.250016 32 512 32C316.750016 32 160 188.7499840000001 160 384C160 579.249984 316.750016 736 512 736C608 736 694.250016 697.749984 755 637L800 682C726.375008 755.624992 624 800 512 800zM873 663L512 302L375 439L329 393L489 233L512 211L535 233L919 617z" />
<glyph glyph-name="alternate-calendar"
unicode="&#xF073;"
horiz-adv-x="1024" d="M288 768L288 736L160 736L160 32L864 32L864 736L736 736L736 768L672 768L672 736L352 736L352 768zM224 672L288 672L288 640L352 640L352 672L672 672L672 640L736 640L736 672L800 672L800 608L224 608zM224 544L800 544L800 96L224 96zM416 480L416 416L480 416L480 480zM544 480L544 416L608 416L608 480zM672 480L672 416L736 416L736 480zM288 352L288 288L352 288L352 352zM416 352L416 288L480 288L480 352zM544 352L544 288L608 288L608 352zM672 352L672 288L736 288L736 352zM288 224L288 160L352 160L352 224zM416 224L416 160L480 160L480 224zM544 224L544 160L608 160L608 224z" />
<glyph glyph-name="handshake"
unicode="&#xF2B5;"
horiz-adv-x="1024" d="M618 673C600.250016 672.875008 582.624992 672 564 667C545.375008 662 526.750016 654 507 641C482.5 655.375008 458.750016 667.249984 436 670C407.750016 673.5 381.5 671.624992 351 671C314.875008 670.249984 291.250016 651.749984 253 637C214.750016 622.249984 165.5 608 96 608L64 608L64 300L82 291L141 262L351 28L352 27C376 3.249984 408.375008 -2.624992 437 -1C465.624992 0.624992 492.5 9 514 22C561.250016 50.5 690 140 690 140L693 142L695 144C710.250016 159.124992 717.875008 177.624992 723 197L846 259L938 290L960 297L960 608L928 608C858.624992 608 809.250016 623 771 638C732.750016 653 709.5 671.249984 673 672C653.5 672.375008 635.750016 673.124992 618 673zM619 609C633.375008 609.124992 650 608.375008 671 608C674.375008 607.875008 705.124992 594.749984 748 578C784.250016 563.749984 834.624992 551.124992 896 547L896 343L822 318L820 318L818 317L721 268C715.624992 282.624992 708.250016 296.124992 697 308L695 311L559 478L539 503L514 483L428 413C399.124992 393 375.750016 398.749984 352 410C345.124992 413.249984 345.5 414.249984 340 418L486 539L488 541C531.375008 584 558 598.875008 581 605C592.5 608.124992 604.624992 608.875008 619 609zM396 608C408.250016 608.249984 418.5 608.124992 428 607C436.375008 606 445.875008 598.875008 454 596C450.750016 593 448.375008 591.249984 445 588C444.250016 587.249984 443.750016 586.749984 443 586L268 441L241 419L265 394C265 394 288.124992 369 324 352C359.875008 335 415.250016 325.375008 465 360L467 362L529 413L647 268L648 266L649 265C670.124992 244.124992 669.624992 211.2499840000001 649 190C648.750016 189.7499840000001 649.250016 189.2499840000001 649 189C648.750016 188.875008 644.5 186.375008 644 186L602 243L550 205L591 150C574.375008 138.7499840000001 566.875008 132.875008 549 121L506 179L454 141L495 86C491.375008 83.749984 483.875008 78.749984 481 77C470.875008 70.875008 451.375008 64 434 63C417.624992 62.124992 405.124992 65.875008 399 71L398 72L184 309L180 314L128 340L128 547C189.124992 551 239.875008 563.124992 276 577C318.750016 593.375008 349.250016 606.875008 353 607C369.375008 607.375008 383.750016 607.749984 396 608z" />
<glyph glyph-name="grinning-face-with-sweat"
unicode="&#xF583;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 449.728 912.264 511.734496 885 567.062496C875.4 544.438496 859.675488 525.224512 840.187488 510.312512C855.355488 471.048512 864 428.544 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736C555.232 736 596.508512 727.804 634.812512 713.5C643.132512 732.444 652.731008 751.922 662.875008 771.25C616.027008 789.554 565.248 800 512 800zM752 800C752 800 672 663.2124992 672 620.8124992C672 578.4124992 707.84 544 752 544C796.16 544 832 578.4124992 832 620.8124992C832 663.2124992 752 800 752 800zM288 448L288 384L448 384L448 448L288 448zM576 448L576 384L736 384L736 448L576 448z" />
<glyph glyph-name="identification-badge"
unicode="&#xF2C1;"
horiz-adv-x="1024" d="M480 800C445 800 416 771 416 736L224 736L224 0L800 0L800 736L608 736C608 771 579 800 544 800zM480 736L544 736L544 672L480 672zM288 672L416 672L416 608L608 608L608 672L736 672L736 64L288 64zM512 544C441.624992 544 384 486.375008 384 416C384 380.375008 399.250016 348.2499840000001 423 325C380.375008 296.124992 352 247 352 192L416 192C416 245.375008 458.624992 288 512 288C565.375008 288 608 245.375008 608 192L672 192C672 247 643.624992 296.124992 601 325C624.750016 348.2499840000001 640 380.375008 640 416C640 486.375008 582.375008 544 512 544zM512 480C547.750016 480 576 451.749984 576 416C576 380.2499840000001 547.750016 352 512 352C476.250016 352 448 380.2499840000001 448 416C448 451.749984 476.250016 480 512 480z" />
<glyph glyph-name="rock--hand-"
unicode="&#xF255;"
horiz-adv-x="1024" d="M480 704C446 704 416.124992 686 399 659C385 667 369.124992 672 352 672C299.375008 672 256 628.624992 256 576L256 459L189 373C148.124992 320.124992 150.875008 244.2499840000001 195 194L271 108C313.5 59.624992 374.624992 32 439 32L608 32C731.375008 32 832 132.624992 832 256L832 544C832 596.624992 788.624992 640 736 640C718.875008 640 703 635 689 627C671.875008 654 642 672 608 672C590.875008 672 575 667 561 659C543.875008 686 514 704 480 704zM480 640C498.124992 640 512 626.124992 512 608L512 512L576 512L576 576C576 594.124992 589.875008 608 608 608C626.124992 608 640 594.124992 640 576L640 512L704 512L704 544C704 562.124992 717.875008 576 736 576C754.124992 576 768 562.124992 768 544L768 256C768 167.2499840000001 696.750016 96 608 96L439 96C393 96 349.375008 115.375008 319 150L243 237C218.875008 264.5 217.624992 304 240 333L256 354L256 320L320 320L320 576C320 594.124992 333.875008 608 352 608C370.124992 608 384 594.124992 384 576L384 512L448 512L448 608C448 626.124992 461.875008 640 480 640z" />
<glyph glyph-name="face-with-rolling-eyes"
unicode="&#xF5A5;"
horiz-adv-x="1024" d="M512 800C282.624 800 96 613.376 96 384C96 154.624 282.624 -32 512 -32C741.376 -32 928 154.624 928 384C928 613.376 741.376 800 512 800zM512 736C706.08 736 864 578.0799999999999 864 384C864 189.92 706.08 32 512 32C317.92 32 160 189.92 160 384C160 578.0799999999999 317.92 736 512 736zM352 576C281.408 576 224 518.592 224 448C224 377.408 281.408 320 352 320C422.592 320 480 377.408 480 448C480 518.592 422.592 576 352 576zM672 576C601.408 576 544 518.592 544 448C544 377.408 601.408 320 672 320C742.592 320 800 377.408 800 448C800 518.592 742.592 576 672 576zM320.624992 503.437504A48 48 0 0 1 368 448A48 48 0 0 1 410.437504 473.750016C413.934432 465.848384 416 457.183616 416 448C416 412.704 387.296 384 352 384C316.704 384 288 412.704 288 448C288 471.836896 301.2527584 492.424512 320.624992 503.437504zM703.375008 503.437504C722.747232 492.424512 736 471.836896 736 448C736 412.704 707.296 384 672 384C636.704 384 608 412.704 608 448C608 457.183616 610.065568 465.848384 613.562496 473.750016A48 48 0 0 1 656 448A48 48 0 0 1 703.375008 503.437504zM384 256L384 192L640 192L640 256L384 256z" />
<glyph glyph-name="alternate-trash"
unicode="&#xF2ED;"
horiz-adv-x="1024" d="M480 768C463.250016 768 446.124992 762.124992 434 750C421.875008 737.875008 416 720.749984 416 704L416 672L224 672L224 608L256 608L256 96C256 43.375008 299.375008 0 352 0L736 0C788.624992 0 832 43.375008 832 96L832 608L864 608L864 672L672 672L672 704C672 720.749984 666.124992 737.875008 654 750C641.875008 762.124992 624.750016 768 608 768zM480 704L608 704L608 672L480 672zM320 608L768 608L768 96C768 78.249984 753.750016 64 736 64L352 64C334.250016 64 320 78.249984 320 96zM384 512L384 160L448 160L448 512zM512 512L512 160L576 160L576 512zM640 512L640 160L704 160L704 512z" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 902 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,21 @@
// Bordered & Pulled
// -------------------------
.#{$la-css-prefix}-border {
border: solid 0.08em #eee;
border-radius: .1em;
padding: .2em .25em .15em;
}
.#{$la-css-prefix}-pull-left { float: left; }
.#{$la-css-prefix}-pull-right { float: right; }
.#{$la-css-prefix} {
&.#{$la-css-prefix}-pull-left { margin-right: .3em; }
&.#{$la-css-prefix}-pull-right { margin-left: .3em; }
}
.#{$la-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}

View File

@@ -0,0 +1,11 @@
.lar,
.las,
.lab {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: inline-block;
font-style: normal;
font-variant: normal;
text-rendering: auto;
line-height: 1;
}

View File

@@ -0,0 +1,4 @@
.#{$la-css-prefix}-fw {
width: 1.25em;
text-align: center;
}

1393
lineawesome/scss/_icons.scss Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,22 @@
.#{$la-css-prefix}-lg {
font-size: 1.33333em;
line-height: 0.75em;
vertical-align: -.0667em;
}
.#{$la-css-prefix}-xs { font-size: 0.75em; }
.#{$la-css-prefix}-2x { font-size: 1em; }
.#{$la-css-prefix}-2x { font-size: 2em; }
.#{$la-css-prefix}-3x { font-size: 3em; }
.#{$la-css-prefix}-4x { font-size: 4em; }
.#{$la-css-prefix}-5x { font-size: 5em; }
.#{$la-css-prefix}-6x { font-size: 6em; }
.#{$la-css-prefix}-7x { font-size: 7em; }
.#{$la-css-prefix}-8x { font-size: 8em; }
.#{$la-css-prefix}-9x { font-size: 9em; }
.#{$la-css-prefix}-10x { font-size: 10em; }
.#{$la-css-prefix}-fw {
text-align: center;
width: 1.25em;
}

View File

@@ -0,0 +1,19 @@
.#{$la-css-prefix}-ul {
padding-left: 0;
margin-left: $la-li-width;
list-style-type: none;
> li {
position: relative;
}
}
.#{$la-css-prefix}-li {
position: absolute;
left: -2em;
text-align: center;
width: $la-li-width;
line-height: inherit;
&.#{$la-css-prefix}-lg {
left: -$la-li-width + (4em / 14);
}
}

View File

@@ -0,0 +1,32 @@
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
@mixin sr-only {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
@mixin sr-only-focusable {
&:active,
&:focus {
clip: auto;
height: auto;
margin: 0;
overflow: visible;
position: static;
width: auto;
}
}

View File

@@ -0,0 +1,53 @@
@font-face {
font-family: $la-font-name-lab;
font-style: normal;
font-weight: normal;
font-display: auto;
src: url('#{$la-font-path}/la-brands-400.eot');
src: url("#{$la-font-path}/la-brands-400.eot?#iefix") format("embedded-opentype"),
url("#{$la-font-path}/la-brands-400.woff2") format("woff2"),
url("#{$la-font-path}/la-brands-400.woff") format("woff"),
url("#{$la-font-path}/la-brands-400.ttf") format("truetype"),
url("#{$la-font-path}/la-brands-400.svg#lineawesome") format("svg");
}
.#{$la-css-prefix-lab} {
font-family: $la-font-name-lab;
font-weight: 400;
}
@font-face {
font-family: $la-font-name-lar;
font-style: normal;
font-weight: 400;
font-display: auto;
src: url('#{$la-font-path}/la-regular-400.eot');
src: url("#{$la-font-path}/la-regular-400.eot?#iefix") format("embedded-opentype"),
url("#{$la-font-path}/la-regular-400.woff2") format("woff2"),
url("#{$la-font-path}/la-regular-400.woff") format("woff"),
url("#{$la-font-path}/la-regular-400.ttf") format("truetype"),
url("#{$la-font-path}/la-regular-400.svg#lineawesome") format("svg");
}
.#{$la-css-prefix-lar} {
font-family: $la-font-name-lar;
font-weight: 400;
}
@font-face {
font-family: $la-font-name-las;
font-style: normal;
font-weight: 900;
font-display: auto;
src: url('#{$la-font-path}/la-solid-900.eot');
src: url("#{$la-font-path}/la-solid-900.eot?#iefix") format("embedded-opentype"),
url("#{$la-font-path}/la-solid-900.woff2") format("woff2"),
url("#{$la-font-path}/la-solid-900.woff") format("woff"),
url("#{$la-font-path}/la-solid-900.ttf") format("truetype"),
url("#{$la-font-path}/la-solid-900.svg#lineawesome") format("svg");
}
.#{$la-css-prefix-las} {
font-family: $la-font-name-las;
font-weight: 900;
}

View File

@@ -0,0 +1,101 @@
.la-pull-left {
float: left;
}
.la-pull-right {
float: right;
}
.la.la-pull-left,
.las.la-pull-left,
.lar.la-pull-left,
.lal.la-pull-left,
.lab.la-pull-left {
margin-right: .3em;
}
.la.la-pull-right,
.las.la-pull-right,
.lar.la-pull-right,
.lal.la-pull-right,
.lab.la-pull-right {
margin-left: .3em;
}
.la-spin {
-webkit-animation: la-spin 2s infinite linear;
animation: la-spin 2s infinite linear;
}
.la-pulse {
-webkit-animation: la-spin 1s infinite steps(8);
animation: la-spin 1s infinite steps(8);
}
@-webkit-keyframes la-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes la-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
.la-rotate-90 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
}
.la-rotate-180 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
}
.la-rotate-270 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
-webkit-transform: rotate(270deg);
transform: rotate(270deg);
}
.la-flip-horizontal {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
-webkit-transform: scale(-1, 1);
transform: scale(-1, 1);
}
.la-flip-vertical {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
-webkit-transform: scale(1, -1);
transform: scale(1, -1);
}
.la-flip-both, .la-flip-horizontal.la-flip-vertical {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
-webkit-transform: scale(-1, -1);
transform: scale(-1, -1);
}
:root .la-rotate-90,
:root .la-rotate-180,
:root .la-rotate-270,
:root .la-flip-horizontal,
:root .la-flip-vertical,
:root .la-flip-both {
-webkit-filter: none;
filter: none;
}

View File

@@ -0,0 +1,2 @@
.sr-only { @include sr-only(); }
.sr-only-focusable { @include sr-only-focusable(); }

View File

@@ -0,0 +1,28 @@
.#{$la-css-prefix}-stack {
display: inline-block;
height: 2em;
line-height: 2em;
position: relative;
vertical-align: middle;
width: 2.5em;
}
.#{$la-css-prefix}-stack-1x,
.#{$la-css-prefix}-stack-2x {
left: 0;
position: absolute;
text-align: center;
width: 100%;
}
.#{$la-css-prefix}-stack-1x {
line-height: inherit;
}
.#{$la-css-prefix}-stack-2x {
font-size: 2em;
}
.#{$la-css-prefix}-inverse {
color: $la-inverse;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
@import "mixins";
@import "core";
@import "variables";
@import "path";
@import "larger";
@import "fixed-width";
@import "list";
@import "bordered_pulled";
@import "rotated-flipped";
@import "stacked";
@import "icons";
@import "screen-reader";

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 15 9 L 15 19 L 12 19 L 16 23 L 20 19 L 17 19 L 17 9 Z"/></svg>

After

Width:  |  Height:  |  Size: 403 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 15 9 L 15 19 L 12 19 L 16 23 L 20 19 L 17 19 L 17 9 Z"/></svg>

After

Width:  |  Height:  |  Size: 403 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 13 12 L 9 16 L 13 20 L 13 17 L 23 17 L 23 15 L 13 15 Z"/></svg>

After

Width:  |  Height:  |  Size: 404 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 13 12 L 9 16 L 13 20 L 13 17 L 23 17 L 23 15 L 13 15 Z"/></svg>

After

Width:  |  Height:  |  Size: 404 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 19 12 L 19 15 L 9 15 L 9 17 L 19 17 L 19 20 L 23 16 Z"/></svg>

After

Width:  |  Height:  |  Size: 403 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 19 12 L 19 15 L 9 15 L 9 17 L 19 17 L 19 20 L 23 16 Z"/></svg>

After

Width:  |  Height:  |  Size: 403 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 16 9 L 12 13 L 15 13 L 15 23 L 17 23 L 17 13 L 20 13 Z"/></svg>

After

Width:  |  Height:  |  Size: 404 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 16 9 L 12 13 L 15 13 L 15 23 L 17 23 L 17 13 L 20 13 Z"/></svg>

After

Width:  |  Height:  |  Size: 404 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 15 9 L 15 19.28125 L 11 15.28125 L 9.59375 16.71875 L 16 23.125 L 22.40625 16.71875 L 21 15.28125 L 17 19.28125 L 17 9 Z"/></svg>

After

Width:  |  Height:  |  Size: 470 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 15.28125 9.59375 L 8.875 16 L 15.28125 22.40625 L 16.71875 21 L 12.71875 17 L 23 17 L 23 15 L 12.71875 15 L 16.71875 11 Z"/></svg>

After

Width:  |  Height:  |  Size: 471 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 16.71875 9.59375 L 15.28125 11 L 19.28125 15 L 9 15 L 9 17 L 19.28125 17 L 15.28125 21 L 16.71875 22.40625 L 23.125 16 Z"/></svg>

After

Width:  |  Height:  |  Size: 470 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 16 8.875 L 9.59375 15.28125 L 11 16.71875 L 15 12.71875 L 15 23 L 17 23 L 17 12.71875 L 21 16.71875 L 22.40625 15.28125 Z"/></svg>

After

Width:  |  Height:  |  Size: 471 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 15 4 L 15 24.0625 L 8.21875 17.28125 L 6.78125 18.71875 L 15.28125 27.21875 L 16 27.90625 L 16.71875 27.21875 L 25.21875 18.71875 L 23.78125 17.28125 L 17 24.0625 L 17 4 Z"/></svg>

After

Width:  |  Height:  |  Size: 251 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 13.28125 6.78125 L 4.78125 15.28125 L 4.09375 16 L 4.78125 16.71875 L 13.28125 25.21875 L 14.71875 23.78125 L 7.9375 17 L 28 17 L 28 15 L 7.9375 15 L 14.71875 8.21875 Z"/></svg>

After

Width:  |  Height:  |  Size: 248 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 18.71875 6.78125 L 17.28125 8.21875 L 24.0625 15 L 4 15 L 4 17 L 24.0625 17 L 17.28125 23.78125 L 18.71875 25.21875 L 27.21875 16.71875 L 27.90625 16 L 27.21875 15.28125 Z"/></svg>

After

Width:  |  Height:  |  Size: 251 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 4.09375 L 15.28125 4.78125 L 6.78125 13.28125 L 8.21875 14.71875 L 15 7.9375 L 15 28 L 17 28 L 17 7.9375 L 23.78125 14.71875 L 25.21875 13.28125 L 16.71875 4.78125 Z"/></svg>

After

Width:  |  Height:  |  Size: 248 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 9.28125 6.78125 L 0.78125 15.28125 L 0.09375 16 L 0.78125 16.71875 L 9.28125 25.21875 L 10.71875 23.78125 L 3.9375 17 L 28.0625 17 L 21.28125 23.78125 L 22.71875 25.21875 L 31.21875 16.71875 L 31.90625 16 L 31.21875 15.28125 L 22.71875 6.78125 L 21.28125 8.21875 L 28.0625 15 L 3.9375 15 L 10.71875 8.21875 Z"/></svg>

After

Width:  |  Height:  |  Size: 388 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 1.5859375 L 10.292969 7.2929688 L 11.707031 8.7070312 L 15 5.4140625 L 15 15 L 5.4140625 15 L 8.7070312 11.707031 L 7.2929688 10.292969 L 1.5859375 16 L 7.2929688 21.707031 L 8.7070312 20.292969 L 5.4140625 17 L 15 17 L 15 26.585938 L 11.707031 23.292969 L 10.292969 24.707031 L 16 30.414062 L 21.707031 24.707031 L 20.292969 23.292969 L 17 26.585938 L 17 17 L 26.585938 17 L 23.292969 20.292969 L 24.707031 21.707031 L 30.414062 16 L 24.707031 10.292969 L 23.292969 11.707031 L 26.585938 15 L 17 15 L 17 5.4140625 L 20.292969 8.7070312 L 21.707031 7.2929688 L 16 1.5859375 z"/></svg>

After

Width:  |  Height:  |  Size: 658 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 2.09375 L 15.28125 2.78125 L 7.28125 10.78125 L 8.71875 12.21875 L 15 5.9375 L 15 26.0625 L 8.71875 19.78125 L 7.28125 21.21875 L 15.28125 29.21875 L 16 29.90625 L 16.71875 29.21875 L 24.71875 21.21875 L 23.28125 19.78125 L 17 26.0625 L 17 5.9375 L 23.28125 12.21875 L 24.71875 10.78125 L 16.71875 2.78125 Z"/></svg>

After

Width:  |  Height:  |  Size: 390 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 10.71875 12.78125 L 9.28125 14.21875 L 15.28125 20.21875 L 16 20.90625 L 16.71875 20.21875 L 22.71875 14.21875 L 21.28125 12.78125 L 16 18.0625 Z"/></svg>

After

Width:  |  Height:  |  Size: 495 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 17.78125 9.28125 L 11.78125 15.28125 L 11.09375 16 L 11.78125 16.71875 L 17.78125 22.71875 L 19.21875 21.28125 L 13.9375 16 L 19.21875 10.71875 Z"/></svg>

After

Width:  |  Height:  |  Size: 495 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 14.21875 9.28125 L 12.78125 10.71875 L 18.0625 16 L 12.78125 21.28125 L 14.21875 22.71875 L 20.21875 16.71875 L 20.90625 16 L 20.21875 15.28125 Z"/></svg>

After

Width:  |  Height:  |  Size: 495 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3 C 8.832031 3 3 8.832031 3 16 C 3 23.167969 8.832031 29 16 29 C 23.167969 29 29 23.167969 29 16 C 29 8.832031 23.167969 3 16 3 Z M 16 5 C 22.085938 5 27 9.914063 27 16 C 27 22.085938 22.085938 27 16 27 C 9.914063 27 5 22.085938 5 16 C 5 9.914063 9.914063 5 16 5 Z M 16 11.09375 L 15.28125 11.78125 L 9.28125 17.78125 L 10.71875 19.21875 L 16 13.9375 L 21.28125 19.21875 L 22.71875 17.78125 L 16.71875 11.78125 Z"/></svg>

After

Width:  |  Height:  |  Size: 495 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 6.90625 6.59375 L 6.1875 7.28125 L 2.28125 11.1875 L 1.59375 11.90625 L 16 26.3125 L 30.40625 11.90625 L 29.71875 11.1875 L 25.8125 7.28125 L 25.09375 6.59375 L 16 15.6875 Z M 6.875 9.4375 L 15.28125 17.8125 L 16 18.5 L 16.71875 17.8125 L 25.125 9.4375 L 27.5625 11.875 L 16 23.46875 L 4.4375 11.875 Z"/></svg>

After

Width:  |  Height:  |  Size: 381 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 19.75 2.59375 L 19.03125 3.28125 L 7.03125 15.28125 L 6.34375 16 L 7.03125 16.71875 L 19.03125 28.71875 L 19.75 29.40625 L 20.46875 28.71875 L 24.0625 25.09375 L 24.75 24.40625 L 24.0625 23.6875 L 16.375 16 L 24.0625 8.3125 L 24.75 7.59375 L 24.0625 6.90625 L 20.46875 3.28125 Z M 19.75 5.4375 L 21.9375 7.625 L 14.25 15.28125 L 13.53125 16 L 14.25 16.71875 L 21.9375 24.375 L 19.75 26.5625 L 9.1875 16 Z"/></svg>

After

Width:  |  Height:  |  Size: 484 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 12.25 2.59375 L 11.53125 3.28125 L 7.9375 6.90625 L 7.25 7.59375 L 7.9375 8.3125 L 15.625 16 L 7.9375 23.6875 L 7.25 24.40625 L 7.9375 25.09375 L 11.53125 28.71875 L 12.25 29.40625 L 12.96875 28.71875 L 24.96875 16.71875 L 25.65625 16 L 24.96875 15.28125 L 12.96875 3.28125 Z M 12.25 5.4375 L 22.8125 16 L 12.25 26.5625 L 10.0625 24.375 L 17.75 16.71875 L 18.46875 16 L 17.75 15.28125 L 10.0625 7.625 Z"/></svg>

After

Width:  |  Height:  |  Size: 482 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 5.6875 L 1.59375 20.09375 L 2.28125 20.8125 L 6.1875 24.71875 L 6.90625 25.40625 L 16 16.3125 L 25.09375 25.40625 L 25.8125 24.71875 L 29.71875 20.8125 L 30.40625 20.09375 Z M 16 8.53125 L 27.5625 20.125 L 25.125 22.5625 L 16.71875 14.1875 L 16 13.5 L 15.28125 14.1875 L 6.875 22.5625 L 4.4375 20.125 Z"/></svg>

After

Width:  |  Height:  |  Size: 385 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 13.1875 3 L 13.03125 3.8125 L 12.4375 6.78125 C 11.484375 7.15625 10.625 7.683594 9.84375 8.3125 L 6.9375 7.3125 L 6.15625 7.0625 L 5.75 7.78125 L 3.75 11.21875 L 3.34375 11.9375 L 3.9375 12.46875 L 6.1875 14.4375 C 6.105469 14.949219 6 15.460938 6 16 C 6 16.539063 6.105469 17.050781 6.1875 17.5625 L 3.9375 19.53125 L 3.34375 20.0625 L 3.75 20.78125 L 5.75 24.21875 L 6.15625 24.9375 L 6.9375 24.6875 L 9.84375 23.6875 C 10.625 24.316406 11.484375 24.84375 12.4375 25.21875 L 13.03125 28.1875 L 13.1875 29 L 18.8125 29 L 18.96875 28.1875 L 19.5625 25.21875 C 20.515625 24.84375 21.375 24.316406 22.15625 23.6875 L 25.0625 24.6875 L 25.84375 24.9375 L 26.25 24.21875 L 28.25 20.78125 L 28.65625 20.0625 L 28.0625 19.53125 L 25.8125 17.5625 C 25.894531 17.050781 26 16.539063 26 16 C 26 15.460938 25.894531 14.949219 25.8125 14.4375 L 28.0625 12.46875 L 28.65625 11.9375 L 28.25 11.21875 L 26.25 7.78125 L 25.84375 7.0625 L 25.0625 7.3125 L 22.15625 8.3125 C 21.375 7.683594 20.515625 7.15625 19.5625 6.78125 L 18.96875 3.8125 L 18.8125 3 Z M 14.8125 5 L 17.1875 5 L 17.6875 7.59375 L 17.8125 8.1875 L 18.375 8.375 C 19.511719 8.730469 20.542969 9.332031 21.40625 10.125 L 21.84375 10.53125 L 22.40625 10.34375 L 24.9375 9.46875 L 26.125 11.5 L 24.125 13.28125 L 23.65625 13.65625 L 23.8125 14.25 C 23.941406 14.820313 24 15.402344 24 16 C 24 16.597656 23.941406 17.179688 23.8125 17.75 L 23.6875 18.34375 L 24.125 18.71875 L 26.125 20.5 L 24.9375 22.53125 L 22.40625 21.65625 L 21.84375 21.46875 L 21.40625 21.875 C 20.542969 22.667969 19.511719 23.269531 18.375 23.625 L 17.8125 23.8125 L 17.6875 24.40625 L 17.1875 27 L 14.8125 27 L 14.3125 24.40625 L 14.1875 23.8125 L 13.625 23.625 C 12.488281 23.269531 11.457031 22.667969 10.59375 21.875 L 10.15625 21.46875 L 9.59375 21.65625 L 7.0625 22.53125 L 5.875 20.5 L 7.875 18.71875 L 8.34375 18.34375 L 8.1875 17.75 C 8.058594 17.179688 8 16.597656 8 16 C 8 15.402344 8.058594 14.820313 8.1875 14.25 L 8.34375 13.65625 L 7.875 13.28125 L 5.875 11.5 L 7.0625 9.46875 L 9.59375 10.34375 L 10.15625 10.53125 L 10.59375 10.125 C 11.457031 9.332031 12.488281 8.730469 13.625 8.375 L 14.1875 8.1875 L 14.3125 7.59375 Z M 16 11 C 13.25 11 11 13.25 11 16 C 11 18.75 13.25 21 16 21 C 18.75 21 21 18.75 21 16 C 21 13.25 18.75 11 16 11 Z M 16 13 C 17.667969 13 19 14.332031 19 16 C 19 17.667969 17.667969 19 16 19 C 14.332031 19 13 17.667969 13 16 C 13 14.332031 14.332031 13 16 13 Z"/></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 15 4 L 15 5.125 C 14.339844 5.253906 13.699219 5.480469 13.15625 5.84375 L 12.375 5.0625 L 10.9375 6.46875 L 11.75 7.28125 C 11.410156 7.796875 11.160156 8.378906 11.03125 9 L 10 9 L 10 11 L 11.03125 11 C 11.160156 11.621094 11.410156 12.203125 11.75 12.71875 L 10.9375 13.53125 L 12.375 14.9375 L 13.15625 14.15625 C 13.699219 14.519531 14.339844 14.746094 15 14.875 L 15 16 L 17 16 L 17 14.875 C 17.609375 14.742188 18.183594 14.523438 18.6875 14.1875 L 19.4375 14.9375 L 20.84375 13.53125 L 20.09375 12.78125 C 20.453125 12.25 20.710938 11.648438 20.84375 11 L 22 11 L 22 9 L 20.84375 9 C 20.710938 8.351563 20.453125 7.75 20.09375 7.21875 L 20.84375 6.46875 L 19.4375 5.0625 L 18.6875 5.8125 C 18.183594 5.476563 17.609375 5.257813 17 5.125 L 17 4 Z M 15.9375 7 C 17.605469 7 18.9375 8.332031 18.9375 10 C 18.9375 11.667969 17.605469 13 15.9375 13 C 14.269531 13 12.9375 11.667969 12.9375 10 C 12.9375 8.332031 14.269531 7 15.9375 7 Z M 8 16 L 8 17.09375 C 7.328125 17.222656 6.703125 17.472656 6.15625 17.84375 L 5.375 17.0625 L 3.9375 18.46875 L 4.75 19.28125 C 4.410156 19.800781 4.160156 20.375 4.03125 21 L 3 21 L 3 23 L 4.03125 23 C 4.160156 23.625 4.410156 24.199219 4.75 24.71875 L 3.9375 25.53125 L 5.375 26.9375 L 6.15625 26.15625 C 6.703125 26.527344 7.328125 26.777344 8 26.90625 L 8 28 L 10 28 L 10 26.875 C 10.609375 26.742188 11.183594 26.523438 11.6875 26.1875 L 12.4375 26.9375 L 13.84375 25.53125 L 13.09375 24.78125 C 13.449219 24.257813 13.707031 23.667969 13.84375 23.03125 L 15.03125 23 L 14.96875 21 L 13.84375 21.03125 C 13.710938 20.371094 13.460938 19.757813 13.09375 19.21875 L 13.84375 18.46875 L 12.4375 17.0625 L 11.6875 17.8125 C 11.183594 17.476563 10.609375 17.257813 10 17.125 L 10 16 Z M 22 16 L 22 17.125 C 21.339844 17.253906 20.699219 17.480469 20.15625 17.84375 L 19.375 17.0625 L 17.9375 18.46875 L 18.75 19.28125 C 18.410156 19.796875 18.160156 20.378906 18.03125 21 L 17 21 L 17 23 L 18.03125 23 C 18.160156 23.621094 18.410156 24.203125 18.75 24.71875 L 17.9375 25.53125 L 19.375 26.9375 L 20.15625 26.15625 C 20.699219 26.519531 21.339844 26.746094 22 26.875 L 22 28 L 24 28 L 24 26.875 C 24.605469 26.742188 25.152344 26.488281 25.65625 26.15625 L 26.4375 26.9375 L 27.84375 25.53125 L 27.09375 24.78125 C 27.453125 24.257813 27.707031 23.671875 27.84375 23.03125 L 29.03125 23 L 28.96875 21 L 27.84375 21.03125 C 27.714844 20.378906 27.421875 19.785156 27.0625 19.25 L 27.84375 18.46875 L 26.4375 17.0625 L 25.65625 17.84375 C 25.160156 17.519531 24.59375 17.289063 24 17.15625 L 24 16 Z M 8.9375 19 C 10.605469 19 11.9375 20.332031 11.9375 22 C 11.9375 23.667969 10.605469 25 8.9375 25 C 7.269531 25 5.9375 23.667969 5.9375 22 C 5.9375 20.332031 7.269531 19 8.9375 19 Z M 22.9375 19 C 24.605469 19 25.9375 20.332031 25.9375 22 C 25.9375 23.667969 24.605469 25 22.9375 25 C 21.269531 25 19.9375 23.667969 19.9375 22 C 19.9375 20.332031 21.269531 19 22.9375 19 Z"/></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 4.71875 3.28125 L 3.28125 4.71875 L 10.5625 12 L 5 12 L 5 14 L 14 14 L 14 5 L 12 5 L 12 10.5625 Z M 27.28125 3.28125 L 20 10.5625 L 20 5 L 18 5 L 18 14 L 27 14 L 27 12 L 21.4375 12 L 28.71875 4.71875 Z M 5 18 L 5 20 L 10.5625 20 L 3.28125 27.28125 L 4.71875 28.71875 L 12 21.4375 L 12 27 L 14 27 L 14 18 Z M 18 18 L 18 27 L 20 27 L 20 21.4375 L 27.28125 28.71875 L 28.71875 27.28125 L 21.4375 20 L 27 20 L 27 18 Z"/></svg>

After

Width:  |  Height:  |  Size: 493 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 11 4 L 11 11 L 4 11 L 4 13 L 13 13 L 13 4 L 11 4 z M 19 4 L 19 13 L 28 13 L 28 11 L 21 11 L 21 4 L 19 4 z M 4 19 L 4 21 L 11 21 L 11 28 L 13 28 L 13 19 L 4 19 z M 19 19 L 19 28 L 21 28 L 21 21 L 28 21 L 28 19 L 19 19 z"/></svg>

After

Width:  |  Height:  |  Size: 298 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 4 4 L 4 13 L 6 13 L 6 7.4375 L 14.5625 16 L 6 24.5625 L 6 19 L 4 19 L 4 28 L 13 28 L 13 26 L 7.4375 26 L 16 17.4375 L 24.5625 26 L 19 26 L 19 28 L 28 28 L 28 19 L 26 19 L 26 24.5625 L 17.4375 16 L 26 7.4375 L 26 13 L 28 13 L 28 4 L 19 4 L 19 6 L 24.5625 6 L 16 14.5625 L 7.4375 6 L 13 6 L 13 4 Z"/></svg>

After

Width:  |  Height:  |  Size: 375 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 4 4 L 4 13 L 6 13 L 6 6 L 13 6 L 13 4 L 4 4 z M 19 4 L 19 6 L 26 6 L 26 13 L 28 13 L 28 4 L 19 4 z M 4 19 L 4 28 L 13 28 L 13 26 L 6 26 L 6 19 L 4 19 z M 26 19 L 26 26 L 19 26 L 19 28 L 28 28 L 28 19 L 26 19 z"/></svg>

After

Width:  |  Height:  |  Size: 289 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 18 5 L 18 7 L 23.5625 7 L 11.28125 19.28125 L 12.71875 20.71875 L 25 8.4375 L 25 14 L 27 14 L 27 5 Z M 5 9 L 5 27 L 23 27 L 23 14 L 21 16 L 21 25 L 7 25 L 7 11 L 16 11 L 18 9 Z"/></svg>

After

Width:  |  Height:  |  Size: 256 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 5 5 L 5 27 L 27 27 L 27 5 Z M 7 7 L 25 7 L 25 25 L 7 25 Z M 13 10 L 13 12 L 18.5625 12 L 9.28125 21.28125 L 10.71875 22.71875 L 20 13.4375 L 20 19 L 22 19 L 22 10 Z"/></svg>

After

Width:  |  Height:  |  Size: 244 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 24.65625 3.03125 C 23.546875 3.03125 22.433594 3.441406 21.59375 4.28125 L 18.8125 7.09375 L 17.8125 6.09375 L 16.40625 7.5 L 17.40625 8.5 L 7.90625 18 C 6.867188 19.039063 6.273438 19.792969 5.90625 20.46875 C 5.539063 21.144531 5.410156 21.753906 5.34375 22.15625 C 5.277344 22.558594 5.242188 22.777344 5 23.21875 C 4.757813 23.660156 4.265625 24.296875 3.28125 25.28125 L 2.59375 26 L 3.28125 26.71875 L 5.28125 28.71875 L 6 29.40625 L 6.71875 28.71875 C 7.679688 27.757813 8.292969 27.292969 8.71875 27.0625 C 9.144531 26.832031 9.371094 26.789063 9.78125 26.71875 C 10.191406 26.648438 10.78125 26.535156 11.46875 26.15625 C 12.15625 25.777344 12.9375 25.15625 14 24.09375 L 23.5 14.59375 L 24.5 15.59375 L 25.90625 14.1875 L 24.90625 13.1875 L 27.71875 10.40625 C 29.398438 8.726563 29.398438 5.960938 27.71875 4.28125 C 26.878906 3.441406 25.765625 3.03125 24.65625 3.03125 Z M 24.65625 5.03125 C 25.246094 5.03125 25.820313 5.257813 26.28125 5.71875 C 27.199219 6.636719 27.199219 8.082031 26.28125 9 L 23.5 11.78125 L 20.21875 8.5 L 23 5.71875 C 23.460938 5.257813 24.066406 5.03125 24.65625 5.03125 Z M 18.8125 9.90625 L 22.09375 13.1875 L 12.59375 22.6875 C 11.609375 23.671875 10.941406 24.164063 10.5 24.40625 C 10.058594 24.648438 9.839844 24.683594 9.4375 24.75 C 9.035156 24.816406 8.457031 24.914063 7.78125 25.28125 C 7.320313 25.53125 6.695313 26.128906 6.09375 26.65625 L 5.34375 25.90625 C 5.890625 25.289063 6.492188 24.65625 6.75 24.1875 C 7.128906 23.5 7.242188 22.878906 7.3125 22.46875 C 7.382813 22.058594 7.425781 21.863281 7.65625 21.4375 C 7.886719 21.011719 8.351563 20.367188 9.3125 19.40625 Z"/></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 3.71875 2.28125 L 2.28125 3.71875 L 8.46875 9.875 L 21.4375 22.84375 L 28.28125 29.71875 L 29.71875 28.28125 L 23.375 21.9375 C 27.472656 19.851563 30.527344 16.910156 30.71875 16.71875 L 31.375 16.0625 L 30.75 15.34375 C 30.492188 15.042969 24.394531 8 16 8 C 14.007813 8 12.152344 8.417969 10.46875 9.03125 Z M 16 10 C 18.164063 10 20.160156 10.554688 21.9375 11.34375 C 22.613281 12.445313 23 13.699219 23 15 C 23 16.816406 22.300781 18.46875 21.15625 19.71875 L 18.3125 16.875 C 18.726563 16.363281 19 15.710938 19 15 C 19 13.347656 17.652344 12 16 12 C 15.289063 12 14.636719 12.273438 14.125 12.6875 L 12.0625 10.625 C 13.300781 10.253906 14.609375 10 16 10 Z M 6.625 10.875 C 3.386719 12.863281 1.394531 15.171875 1.25 15.34375 L 0.625 16.0625 L 1.28125 16.71875 C 1.566406 17.003906 8.097656 23.382813 15.0625 23.9375 L 15.125 23.9375 C 15.414063 23.960938 15.710938 24 16 24 C 16.289063 24 16.585938 23.960938 16.875 23.9375 L 16.9375 23.9375 C 17.734375 23.875 18.535156 23.730469 19.3125 23.53125 L 17.59375 21.8125 C 17.34375 21.871094 17.074219 21.910156 16.8125 21.9375 L 16.6875 21.96875 C 16.21875 22.007813 15.777344 22.007813 15.3125 21.96875 L 15.21875 21.9375 C 11.679688 21.539063 9 18.566406 9 15 C 9 14.464844 9.066406 13.949219 9.1875 13.4375 Z M 7.28125 12.84375 C 7.105469 13.546875 7 14.261719 7 15 C 7 16.613281 7.4375 18.121094 8.1875 19.4375 C 6.066406 18.175781 4.320313 16.75 3.40625 15.9375 C 4.152344 15.195313 5.507813 13.988281 7.28125 12.84375 Z M 24.71875 12.84375 C 26.492188 13.988281 27.816406 15.226563 28.5625 15.96875 C 27.648438 16.78125 25.933594 18.175781 23.8125 19.4375 C 24.5625 18.121094 25 16.613281 25 15 C 25 14.265625 24.890625 13.546875 24.71875 12.84375 Z M 16 14 C 16.550781 14 17 14.449219 17 15 C 17 15.164063 16.945313 15.300781 16.875 15.4375 L 15.5625 14.125 C 15.699219 14.054688 15.835938 14 16 14 Z"/></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 3.71875 2.28125 L 2.28125 3.71875 L 8.5 9.90625 L 19.59375 21 L 21.5 22.9375 L 28.28125 29.71875 L 29.71875 28.28125 L 23.5 22.0625 C 27.734375 19.964844 30.574219 16.851563 30.75 16.65625 L 31.34375 16 L 30.75 15.34375 C 30.480469 15.042969 24.085938 8 16 8 C 14.042969 8 12.195313 8.429688 10.5 9.0625 Z M 16 10 C 18.152344 10 20.1875 10.605469 22 11.4375 C 22.644531 12.515625 23 13.734375 23 15 C 23 16.816406 22.296875 18.476563 21.15625 19.71875 L 18.3125 16.875 C 18.730469 16.363281 19 15.714844 19 15 C 19 13.34375 17.65625 12 16 12 C 15.285156 12 14.636719 12.269531 14.125 12.6875 L 12.09375 10.65625 C 13.335938 10.273438 14.636719 10 16 10 Z M 6.6875 10.90625 C 3.480469 12.878906 1.398438 15.175781 1.25 15.34375 L 0.65625 16 L 1.25 16.65625 C 1.507813 16.945313 7.429688 23.425781 15.0625 23.9375 C 15.371094 23.96875 15.683594 24 16 24 C 16.316406 24 16.628906 23.96875 16.9375 23.9375 C 17.761719 23.882813 18.566406 23.773438 19.34375 23.59375 L 17.5625 21.8125 C 17.054688 21.929688 16.539063 22 16 22 C 12.140625 22 9 18.859375 9 15 C 9 14.46875 9.070313 13.949219 9.1875 13.4375 Z M 7.25 12.9375 C 7.089844 13.613281 7 14.300781 7 15 C 7 16.738281 7.488281 18.339844 8.34375 19.71875 C 6.054688 18.40625 4.304688 16.867188 3.40625 16 C 4.152344 15.277344 5.496094 14.078125 7.25 12.9375 Z M 24.75 12.9375 C 26.503906 14.078125 27.84375 15.277344 28.59375 16 C 27.695313 16.867188 25.917969 18.4375 23.625 19.75 C 24.484375 18.371094 25 16.738281 25 15 C 25 14.300781 24.910156 13.609375 24.75 12.9375 Z"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 8 C 7.664063 8 1.25 15.34375 1.25 15.34375 L 0.65625 16 L 1.25 16.65625 C 1.25 16.65625 7.097656 23.324219 14.875 23.9375 C 15.246094 23.984375 15.617188 24 16 24 C 16.382813 24 16.753906 23.984375 17.125 23.9375 C 24.902344 23.324219 30.75 16.65625 30.75 16.65625 L 31.34375 16 L 30.75 15.34375 C 30.75 15.34375 24.335938 8 16 8 Z M 16 10 C 18.203125 10 20.234375 10.601563 22 11.40625 C 22.636719 12.460938 23 13.675781 23 15 C 23 18.613281 20.289063 21.582031 16.78125 21.96875 C 16.761719 21.972656 16.738281 21.964844 16.71875 21.96875 C 16.480469 21.980469 16.242188 22 16 22 C 15.734375 22 15.476563 21.984375 15.21875 21.96875 C 11.710938 21.582031 9 18.613281 9 15 C 9 13.695313 9.351563 12.480469 9.96875 11.4375 L 9.9375 11.4375 C 11.71875 10.617188 13.773438 10 16 10 Z M 16 12 C 14.34375 12 13 13.34375 13 15 C 13 16.65625 14.34375 18 16 18 C 17.65625 18 19 16.65625 19 15 C 19 13.34375 17.65625 12 16 12 Z M 7.25 12.9375 C 7.09375 13.609375 7 14.285156 7 15 C 7 16.753906 7.5 18.394531 8.375 19.78125 C 5.855469 18.324219 4.105469 16.585938 3.53125 16 C 4.011719 15.507813 5.351563 14.203125 7.25 12.9375 Z M 24.75 12.9375 C 26.648438 14.203125 27.988281 15.507813 28.46875 16 C 27.894531 16.585938 26.144531 18.324219 23.625 19.78125 C 24.5 18.394531 25 16.753906 25 15 C 25 14.285156 24.90625 13.601563 24.75 12.9375 Z"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

1
lineawesome/svg/eye.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 8 C 7.664063 8 1.25 15.34375 1.25 15.34375 L 0.65625 16 L 1.25 16.65625 C 1.25 16.65625 7.097656 23.324219 14.875 23.9375 C 15.246094 23.984375 15.617188 24 16 24 C 16.382813 24 16.753906 23.984375 17.125 23.9375 C 24.902344 23.324219 30.75 16.65625 30.75 16.65625 L 31.34375 16 L 30.75 15.34375 C 30.75 15.34375 24.335938 8 16 8 Z M 16 10 C 18.203125 10 20.234375 10.601563 22 11.40625 C 22.636719 12.460938 23 13.675781 23 15 C 23 18.613281 20.289063 21.582031 16.78125 21.96875 C 16.761719 21.972656 16.738281 21.964844 16.71875 21.96875 C 16.480469 21.980469 16.242188 22 16 22 C 15.734375 22 15.476563 21.984375 15.21875 21.96875 C 11.710938 21.582031 9 18.613281 9 15 C 9 13.695313 9.351563 12.480469 9.96875 11.4375 L 9.9375 11.4375 C 11.71875 10.617188 13.773438 10 16 10 Z M 16 12 C 14.34375 12 13 13.34375 13 15 C 13 16.65625 14.34375 18 16 18 C 17.65625 18 19 16.65625 19 15 C 19 13.34375 17.65625 12 16 12 Z M 7.25 12.9375 C 7.09375 13.609375 7 14.285156 7 15 C 7 16.753906 7.5 18.394531 8.375 19.78125 C 5.855469 18.324219 4.105469 16.585938 3.53125 16 C 4.011719 15.507813 5.351563 14.203125 7.25 12.9375 Z M 24.75 12.9375 C 26.648438 14.203125 27.988281 15.507813 28.46875 16 C 27.894531 16.585938 26.144531 18.324219 23.625 19.78125 C 24.5 18.394531 25 16.753906 25 15 C 25 14.285156 24.90625 13.601563 24.75 12.9375 Z"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 16 3.90625 L 3.625 9.0625 L 3 9.34375 L 3 12 L 5 12 L 5 23 L 3 23 L 3 28 L 29 28 L 29 23 L 27 23 L 27 12 L 29 12 L 29 9.34375 L 28.375 9.0625 Z M 16 6.09375 L 25.375 10 L 6.625 10 Z M 7 12 L 9 12 L 9 23 L 7 23 Z M 11 12 L 13 12 L 13 23 L 11 23 Z M 15 12 L 17 12 L 17 23 L 15 23 Z M 19 12 L 21 12 L 21 23 L 19 23 Z M 23 12 L 25 12 L 25 23 L 23 23 Z M 5 25 L 27 25 L 27 26 L 5 26 Z"/></svg>

After

Width:  |  Height:  |  Size: 459 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 4 4 L 4 22 L 10 22 L 10 28 L 28 28 L 28 10 L 22 10 L 22 4 Z M 6 6 L 20 6 L 20 10.5625 L 10.5625 20 L 6 20 Z M 11 8 L 11 9 L 8 9 L 8 11 L 12.9375 11 C 12.808594 12.148438 12.457031 13.054688 11.875 13.6875 C 11.53125 13.574219 11.222656 13.433594 10.96875 13.28125 C 10.265625 12.863281 10 12.417969 10 12 L 8 12 C 8 13.191406 8.734375 14.183594 9.71875 14.84375 C 9.226563 14.949219 8.65625 15 8 15 L 8 17 C 9.773438 17 11.25 16.59375 12.375 15.84375 C 12.898438 15.933594 13.429688 16 14 16 L 14 14.125 C 14.542969 13.214844 14.832031 12.152344 14.9375 11 L 16 11 L 16 9 L 13 9 L 13 8 Z M 21.4375 12 L 26 12 L 26 26 L 12 26 L 12 21.4375 Z M 20 13.84375 L 19.0625 16.6875 L 17.0625 22.6875 L 17 22.84375 L 17 24 L 19 24 L 19 23.125 L 19.03125 23 L 20.96875 23 L 21 23.125 L 21 24 L 23 24 L 23 22.84375 L 22.9375 22.6875 L 20.9375 16.6875 Z M 20 20.125 L 20.28125 21 L 19.71875 21 Z"/></svg>

After

Width:  |  Height:  |  Size: 961 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 15 4 L 15 24.0625 L 10.71875 19.78125 L 9.28125 21.1875 L 16 27.90625 L 22.71875 21.1875 L 21.28125 19.78125 L 17 24.0625 L 17 4 Z"/></svg>

After

Width:  |  Height:  |  Size: 210 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 10.8125 9.28125 L 4.09375 16 L 10.8125 22.71875 L 12.21875 21.28125 L 7.9375 17 L 28 17 L 28 15 L 7.9375 15 L 12.21875 10.71875 Z"/></svg>

After

Width:  |  Height:  |  Size: 209 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M 21.1875 9.28125 L 19.78125 10.71875 L 24.0625 15 L 4 15 L 4 17 L 24.0625 17 L 19.78125 21.28125 L 21.1875 22.71875 L 27.90625 16 Z"/></svg>

After

Width:  |  Height:  |  Size: 210 B

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