Compare commits

...

197 Commits
0.8.0 ... 1.0.0

Author SHA1 Message Date
Colin McLeod
1350de1910 Empty retrofitting table color fix 2015-06-30 21:55:38 -07:00
Colin McLeod
89d3fd69e1 UI tweaks for mobile 2015-06-30 21:46:05 -07:00
Colin McLeod
7325081ec9 Version 1.0.0 :D 2015-06-30 21:09:19 -07:00
Colin McLeod
680872a302 Retrofitting costs added to outfit page 2015-06-30 21:06:12 -07:00
Colin McLeod
a3c65d6c69 Code comments 2015-06-30 19:25:57 -07:00
Colin McLeod
a189265326 Fix svg click bug in Chrome 2015-06-30 19:25:36 -07:00
Colin McLeod
b447e913ff no need to abbreviate shield details 2015-06-29 16:28:41 -07:00
Colin McLeod
b5a249fb4b Change latest version date format 2015-06-29 16:27:56 -07:00
Colin McLeod
ae081c147e Fix negative power for limpet controllers 2015-06-29 15:42:35 -07:00
Colin McLeod
3ce0d0bdd8 Add dps to outfit page 2015-06-29 15:03:04 -07:00
Colin McLeod
a71abd9fe3 Bumping version to 0.14.1 2015-06-29 14:59:30 -07:00
Colin McLeod
f1d804e3a1 Adding total DPS to outfit page and comparisons 2015-06-29 11:57:29 -07:00
Colin McLeod
aa7479d111 Updating Federal Dropship agility 2015-06-29 10:36:49 -07:00
Colin McLeod
7c23fb3884 Bumping version to 0.14.0 2015-06-26 11:00:46 -07:00
Colin McLeod
b707015d9c Fix power plant toggle power bug 2015-06-26 11:00:11 -07:00
Colin McLeod
10d5611dcd Seperate discounts for ship and components, added discounts for 5,10,15,20,25 percent off 2015-06-25 20:26:22 -07:00
Colin McLeod
9009a2a434 Bumping to 0.13.4, fixing courier bulkhead mass 2015-06-24 13:17:23 -07:00
Colin McLeod
8b98a98faf lint fix 2015-06-23 23:47:27 -07:00
Colin McLeod
44de3e4bbc Minor CSS refactor, outfit page tweak 2015-06-23 23:45:30 -07:00
Colin McLeod
ba2e9a12b0 Tweak chart axis labels 2015-06-23 11:47:23 -07:00
Colin McLeod
57304f55c1 Merge pull request #62 from Maverick-JM/master
Fixes for Windows phone and IE
2015-06-23 11:47:09 -07:00
Maverick
1eea358c35 Typo in the comments :). 2015-06-23 23:10:04 +10:00
Maverick
f671b7c34f Fix for the top menu not working in IE 11 (and probably older IE too). 2015-06-23 23:04:07 +10:00
Maverick
211028d80d Fix for the whole app not working on Windows phones as a Windows phone, this was somewhat vexing :)). 2015-06-23 22:27:24 +10:00
Justin Murtagh
c79359ea2f Merge pull request #6 from cmmcleod/master
Update my fork.
2015-06-23 22:04:34 +10:00
Colin McLeod
93f92da1df Adding line chart, adding speed function 2015-06-19 19:04:45 -07:00
Colin McLeod
25020293ec Fix unique internal component regression bug, add tests, bump to 0.13.3 2015-06-19 10:29:26 -07:00
Colin McLeod
4e7f1d3e8b Updating README and disclaimer text 2015-06-18 16:32:45 -07:00
Colin McLeod
e6ba0a14e8 Minor tweak to slot size position 2015-06-18 15:51:58 -07:00
Colin McLeod
b285a433b2 Bumping version to 0.13.2 2015-06-18 09:52:48 -07:00
Colin McLeod
f19c786f64 Update ship armour stats 2015-06-18 09:52:18 -07:00
Colin McLeod
806e545361 Fix charts in comparison page 2015-06-17 23:32:56 -07:00
Colin McLeod
ae62781d53 Bump version to 0.13.0 2015-06-17 23:17:15 -07:00
Colin McLeod
3abfcf7c95 Tweak chart axis UI 2015-06-17 23:12:27 -07:00
Colin McLeod
dc8b829d8a fix: total range calculation bug 2015-06-17 20:41:54 -07:00
Colin McLeod
353396398b Linting fix 2015-06-17 20:41:11 -07:00
Colin McLeod
bf99b34596 Tweak outfit page charts responsiveness 2015-06-16 15:28:06 -07:00
Colin McLeod
f3af0f3a99 Toggling shield and boosters updates shield strength 2015-06-16 15:27:41 -07:00
Colin McLeod
0fd4a8395e Tweak area chart tooltip 2015-06-16 15:26:47 -07:00
Colin McLeod
cb664003a5 Tweak slider 2015-06-16 15:26:22 -07:00
Colin McLeod
4686f17d18 Strip build should reset bulkheads 2015-06-16 15:26:05 -07:00
Colin McLeod
45c96dc136 Icon tweaks, added feather icon 2015-06-16 15:25:25 -07:00
Colin McLeod
389fdc8dfa Removing unused svg icon 2015-06-15 23:25:42 -07:00
Colin McLeod
b94e6126cd Chart performance tweaks, UI tweaks 2015-06-15 21:46:55 -07:00
Colin McLeod
bee4f7e6bc Fix strip build bug, and update state 2015-06-15 18:18:27 -07:00
Colin McLeod
345b7f5ffe Removing codeship, adding travis build status to readme 2015-06-15 18:08:41 -07:00
Colin McLeod
f1b40eb38c Adding gulp back to package.json 2015-06-15 18:06:09 -07:00
Colin McLeod
f459c26bd7 Locking down npm dependencies, add caching to travis 2015-06-15 18:03:02 -07:00
Colin McLeod
825b678fb0 Total Range chart feature added 2015-06-15 17:43:28 -07:00
Colin McLeod
ce3818f99a Use Travis CI instead of Codeship 2015-06-15 17:32:18 -07:00
Colin McLeod
94e2b60cd1 Changing version link 2015-06-15 17:31:27 -07:00
Colin McLeod
3bbef71a5e Merge pull request #58 from shearn89/strip-ship
Adding in 'Strip Ship' functionality.
2015-06-15 16:26:01 -07:00
Alex Shearn
ca280673d1 Fixing indentation 2015-06-15 22:09:18 +01:00
Alex Shearn
ff477c035a Moving button as per comments 2015-06-15 20:28:15 +01:00
Alex Shearn
1c0b76a8c2 Adding in 'Strip Ship' functionality.
This commit adds a simple button next to the save/reload icons that strips the ship to maximum class, D-rated modules, and no optional modules. Still needs a custom icon! May try to add in future things like 'all cargo' or 'fill empty with...' options.
2015-06-15 20:07:13 +01:00
Colin McLeod
bef741332d Bumping version to 0.12.1 2015-06-15 10:11:34 -07:00
Colin McLeod
f54620ee24 Imperial Courier shield correction 2015-06-15 10:11:12 -07:00
Colin McLeod
7d28e69b1c Bumping version to 0.12.0 2015-06-15 09:32:59 -07:00
Colin McLeod
abfe1b4a68 Updating base shield strength for Diamondback ships 2015-06-15 09:31:33 -07:00
Colin McLeod
59e400d7b8 Detailed suface scanner power management special case 2015-06-14 18:58:27 -07:00
Colin McLeod
4b3bb3bcde License readme tweak 2015-06-14 18:58:05 -07:00
Colin McLeod
a4a562bd40 Linting fixes 2015-06-14 17:47:16 -07:00
Colin McLeod
a1506d4f37 Selectable power bands, with right click to clear feature 2015-06-14 17:26:21 -07:00
Colin McLeod
8b0f58cb69 Right-click to clear slots feature 2015-06-14 17:26:04 -07:00
Colin McLeod
1a14674352 Updating License details to comply with Frontier terms and conditions 2015-06-14 17:25:28 -07:00
Colin McLeod
a2c32dd908 Bumping version to 0.11.1 2015-06-13 00:56:08 -07:00
Colin McLeod
eb7383b31e Lint fix 2015-06-13 00:44:15 -07:00
Colin McLeod
2106ec0e93 Ship building edge case, plus unit test to cover change 2015-06-13 00:43:10 -07:00
Colin McLeod
5649dc9079 Adding founders world discount 2015-06-12 23:40:32 -07:00
Colin McLeod
0d09607d30 Ship build, reset bug 2015-06-12 23:38:33 -07:00
Colin McLeod
d7415ea44a Updating hull prices for diamondback scout+exp, imperial courier 2015-06-12 20:14:56 -07:00
Colin McLeod
31579213b1 Responsive build menu improvements, donate button tweak 2015-06-11 23:01:14 -07:00
Colin McLeod
c1ae75e2b0 Merge pull request #55 from cmmcleod/karma-testing
Karma testing
2015-06-11 21:12:52 -07:00
Colin McLeod
2498c0e0b1 Fix tests to pass build 2015-06-11 21:10:57 -07:00
Colin McLeod
3b02536cf7 Fix some power bugs 2015-06-11 21:05:39 -07:00
Colin McLeod
cc2d91cc51 Adding karma and unit tests to get started 2015-06-11 21:05:09 -07:00
Colin McLeod
3f8cf106a1 Linting fixes 2015-06-11 17:23:13 -07:00
Colin McLeod
c80e0a51bf Use eslint instead of JShint 2015-06-11 17:17:42 -07:00
Colin McLeod
9d3e009013 Align power plant pct 2015-06-11 15:01:23 -07:00
Justin Murtagh
6fb2247dd7 Merge pull request #5 from cmmcleod/master
Merge back post-responsive priority stuff.
2015-06-12 07:12:13 +10:00
Colin McLeod
2f9473b3d7 Linting should use an exit error code on failure 2015-06-11 14:02:27 -07:00
Colin McLeod
604ef89067 Update README.md 2015-06-11 13:55:01 -07:00
Colin McLeod
456c63fe55 Changes for Codeship CI 2015-06-11 13:51:28 -07:00
Colin McLeod
df77d7680c Updating Imperial Courirer bulkhead mass 2015-06-11 11:27:43 -07:00
Colin McLeod
ae0b9a8a09 Symbol and responsive tweaks 2015-06-11 11:14:56 -07:00
Colin McLeod
b552f2c8f1 Merge pull request #53 from Maverick-JM/master
Responsive fixes (mostly power-priority related)
2015-06-11 10:48:35 -07:00
Maverick
e3d8dfa457 More fixes since I re-merged to my fork :). 2015-06-11 20:23:50 +10:00
Maverick
9b1767dade Merge of changes to responsive solutions for component power priority module. 2015-06-11 20:14:10 +10:00
Maverick
6d1adb28f3 Merge branch 'master' of https://github.com/cmmcleod/coriolis into cmmcleod-master 2015-06-11 20:11:08 +10:00
Maverick
ff119789ac Refinements to power-priority widget. Works from original iPhone size on up pretty smoothly. As screens get smaller, non-essential columns get smaller. Click targets also get a bit larger. 2015-06-11 20:00:08 +10:00
Colin McLeod
4540082232 Reducing power bands min size to 500 2015-06-11 00:54:30 -07:00
Colin McLeod
bfed9f3c61 Fix persist power bug 2015-06-11 00:40:45 -07:00
Colin McLeod
b37e4644b6 Bumping to 0.11.0 2015-06-11 00:23:37 -07:00
Colin McLeod
2f3ee50ec8 Persist power and priority changes 2015-06-11 00:08:56 -07:00
Colin McLeod
f77443156d Sort power management by type by default 2015-06-10 22:55:15 -07:00
Colin McLeod
2ea5c64256 Improve power management UI 2015-06-10 22:51:36 -07:00
Colin McLeod
0d3e156346 Adding percent formatter fixed to 1 decimal place 2015-06-10 22:50:06 -07:00
Colin McLeod
8fd0297091 Adding Settings label to menu 2015-06-10 22:49:01 -07:00
Colin McLeod
ba9c80ff05 Build menu wrapping fix 2015-06-10 22:48:42 -07:00
Maverick
ff133c2f3d Fix for non-html encoded triangle arrows 2015-06-11 15:42:23 +10:00
Maverick-JM
2e29676313 Merge pull request #3 from cmmcleod/master
Merge from cmmcleod => Maverick-JM
2015-06-11 15:04:38 +10:00
Maverick
300f5921e8 Fix for I'm a dumbass. 2015-06-11 13:11:03 +10:00
Maverick
7ba5f1ef68 Undo an unnessecary change. 2015-06-11 13:09:32 +10:00
Colin McLeod
7140dcce95 Linting fixes 2015-06-10 00:23:21 -07:00
Colin McLeod
1367418fb2 Total range, priority management, other tweaks 2015-06-10 00:17:55 -07:00
Colin McLeod
4fb1ad11ca Responsive tweaks and refactoring 2015-06-10 00:17:08 -07:00
Colin McLeod
3cdb576140 Removing unused files 2015-06-10 00:06:08 -07:00
Colin McLeod
ba9051783a Adding unit tests for data validation 2015-06-10 00:05:32 -07:00
Colin McLeod
a253c488a5 Component data corrections, refactoring 2015-06-10 00:02:33 -07:00
Colin McLeod
318f6f2fcb Adding retail cost to ship data for display purposes 2015-06-10 00:01:40 -07:00
Colin McLeod
fde6ddf985 Responsive UI Improvements across the board 2015-06-07 16:35:07 -07:00
Colin McLeod
3bb88a5c03 Unit display/metrics improvement 2015-06-07 16:34:46 -07:00
Colin McLeod
534a843df1 Linting fixes 2015-06-07 16:31:12 -07:00
Colin McLeod
fb35918839 Adding new limpet controllers 2015-06-07 16:28:12 -07:00
Colin McLeod
850a4931c3 Fix fuel scoop time to calc refuel with internal fuel tanks 2015-06-07 15:43:43 -07:00
Colin McLeod
b5e1c86a93 Improving D3 component event handling, responsiveness 2015-06-07 15:42:59 -07:00
Colin McLeod
e876732ce0 Replaving EuroCaps with Eurostile 2015-06-07 15:41:34 -07:00
Colin McLeod
2b822176e4 Removing uncecessary console.log 2015-06-07 15:40:37 -07:00
Colin McLeod
03eb66a4d0 Area chart tooltip dragging added 2015-06-06 16:48:01 -07:00
Colin McLeod
b449bb3724 Fix slider axis for small screens 2015-06-06 15:19:15 -07:00
Colin McLeod
0d1fa7904e Set default standalone app homepage 2015-06-06 13:58:33 -07:00
Colin McLeod
dbd1060cb3 Persist state when running and restarting the app in standalone mode 2015-06-06 13:25:35 -07:00
Colin McLeod
5b7a4edab4 Adding paypal donate button 2015-06-05 21:18:31 -07:00
Colin McLeod
827fb3c97a Adding internal fuel tanks, jump range tweaks 2015-06-05 21:14:40 -07:00
Colin McLeod
a5015b243b Minor responsive less tweak 2015-06-05 21:12:26 -07:00
Colin McLeod
e5ef190f3c Adding meta description 2015-06-05 21:09:34 -07:00
Maverick
1057277355 Build list now gets bigger before cutting off (overflow also scrolls) - this fix is primarily for those that have a few of every ship in their builds list. 2015-06-06 13:58:09 +10:00
Maverick-JM
12896a6325 Merge pull request #2 from cmmcleod/master
Merge back my way.
2015-06-06 09:14:24 +10:00
Colin McLeod
63ebbbf932 Merge pull request #44 from Maverick-JM/master
Responsive CSS for Outfitting screen
2015-06-05 14:13:44 -07:00
Maverick
3fe369d59d Font-size bump for tablets and phones on the outfitting screen. Seems to make life a bit easier. Also added a small-tablet size option which will fix a tiny visual bug on the outfitting screen with long ship names. Fixed a few other minor visual bugs. Also made clickable menu items bigger on tablets and phones. 2015-06-06 00:42:33 +10:00
Maverick
27c9f53649 4-to-2 spaces :) 2015-06-05 20:39:59 +10:00
Maverick
440d126579 Refactored responsive stuff. 2015-06-05 20:24:09 +10:00
Colin McLeod
4a5992dab7 Gulp-rev-all 0.8.20+ seems to break everything 2015-06-04 23:05:43 -07:00
Colin McLeod
0d7093e29f Bumping version to 0.10.1 2015-06-04 22:48:59 -07:00
Colin McLeod
56b1ddd684 Fix to Class 2 burst laser data and outfitting bug 2015-06-04 21:37:26 -07:00
Maverick
40d026c7cd Fixes for sub-350px screens (eg: really old iPhones) 2015-06-04 20:48:03 +10:00
Maverick
cc1018c62c Other responsive changes. Outfitting screen now works pretty well on phone-sized displays. Summary is currently just a horizontal-scrolling thing (because it's a table atm) but everything else scales down and collapses pretty nicely. 2015-06-04 20:40:43 +10:00
Maverick
6e9990831d More responsive outfitting screen (still work to do though). 2015-06-04 20:29:38 +10:00
Maverick-JM
7772880eff Merge pull request #1 from cmmcleod/master
If I'm doing this right, this will take updates to my fork
2015-06-04 19:46:48 +10:00
Colin McLeod
9e79698906 Use Orbitron font less often 2015-06-03 22:57:32 -07:00
Colin McLeod
9f083588cf Removing unecessary dependencies 2015-06-03 22:57:17 -07:00
Colin McLeod
f6da78f456 HTML fix for shipyard page 2015-06-03 22:56:52 -07:00
Colin McLeod
741e8247a9 Merge pull request #43 from Toxicat/diamondback-explorer
Diamondback Explorer data
2015-06-03 15:35:38 -07:00
Toxicat
8198fb0391 Diamondback Explorer data
- Small reduce on font size, to avoid a line break (should we up a bit
the width ?)
2015-06-04 00:29:28 +02:00
Colin McLeod
458fca69f6 Merge pull request #35 from Toxicat/master
👍 
Add a command to start nginx in windows environnement
2015-06-03 09:40:42 -07:00
Toxicat
d150cdf2a5 Reset package.json 2015-06-03 18:39:19 +02:00
Colin McLeod
b7d3b94c6c Merge pull request #39 from Maverick-JM/master
Main menu bar "Ships, Builds, Compare", et all is now responsive and …
2015-06-03 09:14:31 -07:00
Colin McLeod
5a8d662ba0 Merge pull request #38 from Toxicat/patch-1
Update Type-7 name to correct an old typo
2015-06-03 09:12:41 -07:00
Maverick
f76aa28d66 Main menu bar "Ships, Builds, Compare", et all is now responsive and should work on regular sized and tiny screens alike now. 2015-06-03 22:21:13 +10:00
PanzerKadaver
fb9654a526 Upadate Type-7 name to correct an old typo
According to the screenshot provide by SpyTec in #37, the correct name of the Type-7 is "Type-7 Transporter"
2015-06-03 13:28:42 +02:00
Colin McLeod
10bfaacb22 Linting fixes 2015-06-03 01:14:38 -07:00
Colin McLeod
799ff36ec4 Remove ticks on comparison page 2015-06-03 01:07:23 -07:00
PanzerKadaver
a35fc74542 Update package to compatibility with master 2015-06-03 09:18:12 +02:00
Colin McLeod
9e4ce83784 Update charts on orientation change 2015-06-02 23:57:31 -07:00
Colin McLeod
08ee37b6b3 Bump version to 0.10.0 2015-06-02 23:52:49 -07:00
Colin McLeod
f0f947cad4 Added notification when appcache is updated 2015-06-02 23:52:23 -07:00
Colin McLeod
0ae4957976 Tweak colors, remove hover 2015-06-02 22:18:47 -07:00
Colin McLeod
b678b81d8d Tweak dmg/eps/dps formatting 2015-06-02 22:00:58 -07:00
Colin McLeod
5c02afdf89 Remove scp from package.json 2015-06-02 21:53:13 -07:00
Colin McLeod
57dc910bc5 Use column for builds menu 2015-06-02 21:52:44 -07:00
Colin McLeod
1ac9d30beb Sort buils menu by ship name 2015-06-02 21:52:44 -07:00
Colin McLeod
4040767427 Merge pull request #34 from spullara/master
Add the measured values in MJ for weapon damage and energy usage
2015-06-02 21:52:35 -07:00
Sam Pullara
d0bb8fbdba add the new damage and energy values to the UI 2015-06-02 21:38:51 -07:00
Sam Pullara
83c8d17f75 add actual MJ damage values to all weapons 2015-06-02 21:38:50 -07:00
Colin McLeod
97c6429ffc Update Jump Range chart, adding slider, more useful UI 2015-06-02 20:13:42 -07:00
Colin McLeod
adf4e64362 Add missing class 2 fragment cannons 2015-06-02 20:13:14 -07:00
Colin McLeod
8194a734bc Add Class 2 Burst Lasers 2015-06-02 20:12:52 -07:00
Colin McLeod
d9cecbdc17 Minor tweak to tablet outfit page css 2015-06-02 20:11:13 -07:00
Colin McLeod
d69fe3f687 Change min launcher damage type 2015-06-02 20:10:05 -07:00
Colin McLeod
180700b973 Fix shield cell bank capacities 2015-06-02 20:09:43 -07:00
Colin McLeod
8f52dd75f0 Fix rating for C1 gimballed pulse laser 2015-06-02 20:09:20 -07:00
Colin McLeod
4b74b125e1 Enhance ship jump range function 2015-06-02 20:07:08 -07:00
Colin McLeod
55986a64a5 Fix to jump range calculation / function 2015-06-02 20:06:30 -07:00
Colin McLeod
f26002df3d Updating disclaimer text 2015-06-02 20:06:01 -07:00
Colin McLeod
0cd78748f7 Sort ships by name 2015-06-02 20:05:34 -07:00
Colin McLeod
3cc76ba85e Rename to Diamondback Scout 2015-06-02 20:04:42 -07:00
Colin McLeod
4531afb198 Fix default shield for Cobra 2015-06-02 20:04:05 -07:00
Colin McLeod
f5ae2c3135 Remove unused dev dependencies 2015-06-02 20:03:38 -07:00
Colin McLeod
abec7e87d8 Optimize PNGs, reduce favicon size, less sillyness 2015-06-02 20:01:18 -07:00
Colin McLeod
bf1dcbdd5e Minor tweak to outfit page tablet layout 2015-06-02 20:01:18 -07:00
Colin McLeod
5c5740f13e Tweak build, add angular explicit dependency 2015-06-02 20:01:18 -07:00
Colin McLeod
ce9b6b75d3 Merge pull request #33 from spullara/patch-1
The weapon and system capacity for power distributors was reversed in…
2015-06-02 20:00:51 -07:00
Colin McLeod
2237529968 Merge pull request #31 from Qirion/dev
Added missing dependencies
2015-06-02 20:00:37 -07:00
Sam Pullara
da61f4dc76 The weapon and system capacity for power distributors was reversed in the UI
I've relabelled them.
2015-06-02 19:08:11 -07:00
Toxicat
f5639ad74e Compatibility with #31 2015-05-31 15:39:56 +02:00
Gabriel Correia
16e6853ab5 Added missing dependencies 2015-05-30 11:38:51 -03:00
Toxicat
3ad698058b Fix dependencies and commands
- Fix 'gulp-scp2' dependencies problem
- Add serve-win gulp command (for thoose want to contribute with a
windows dev environment)
2015-05-30 14:16:28 +02:00
Colin McLeod
6ed0c0be3f Linting fix 2015-05-28 02:27:42 -07:00
Colin McLeod
acbfaaa53f Bumping Version to 0.9.0 2015-05-28 02:21:30 -07:00
Colin McLeod
91b42372fb UI & UX improvements 2015-05-28 02:21:03 -07:00
Colin McLeod
d2c6f0cf8f Use absolute path for appcache manifest 2015-05-28 02:00:34 -07:00
Colin McLeod
384d420a7f Update area chart on window resize or orientation change 2015-05-28 02:00:05 -07:00
Colin McLeod
24e9afd3bf Add Ship Diamondback and Imperial Clipper using best data available 2015-05-28 00:52:52 -07:00
Colin McLeod
39c5c724e4 Remove unused images 2015-05-28 00:00:39 -07:00
Colin McLeod
97213a4682 Improve coriolis logo svg 2015-05-28 00:00:10 -07:00
Colin McLeod
280411f35c Add appcache support for offline standalone app 2015-05-27 23:59:54 -07:00
Colin McLeod
1796b0fb46 report useragent on error page 2015-05-27 23:56:06 -07:00
182 changed files with 4468 additions and 2154 deletions

1
.gitignore vendored
View File

@@ -5,5 +5,6 @@ build
.DS_Store
*.log
app/js/db.js
app/db.json
nginx.pid
template_cache.js

View File

@@ -1,20 +0,0 @@
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) /index.html [NC,L]
<IfModule mod_expires.c>
# Activate mod_expires for this directory
ExpiresActive on
ExpiresDefault "access"
ExpiresByType text/html "access"
ExpiresByType application/json "access"
</IfModule>
<IfModule mod_headers.c>
Header add Access-Control-Allow-Origin "*"
</IfModule>

View File

@@ -1 +0,0 @@
app/js/db.js

19
.travis.yml Normal file
View File

@@ -0,0 +1,19 @@
language: node_js
notifications:
email: false
sudo: false
node_js:
- "0.12"
cache:
directories:
- node_modules
- bower_components
before_script:
- npm install -g gulp
- npm install -g bower
- bower install
script:
- gulp lint
- gulp build-prod
- gulp test

View File

@@ -1,14 +1,16 @@
[![Tasks in Ready](https://badge.waffle.io/cmmcleod/coriolis.png?label=ready&title=Ready)](https://waffle.io/cmmcleod/coriolis) [![Tasks in Progress](https://badge.waffle.io/cmmcleod/coriolis.svg?label=in%20progress&title=In%20Progress)](http://waffle.io/cmmcleod/coriolis)
[![Build Status](https://travis-ci.org/cmmcleod/coriolis.svg?branch=master)](https://travis-ci.org/cmmcleod/coriolis) [![Tasks in Ready](https://badge.waffle.io/cmmcleod/coriolis.png?label=ready&title=Ready)](https://waffle.io/cmmcleod/coriolis) [![Tasks in Progress](https://badge.waffle.io/cmmcleod/coriolis.svg?label=in%20progress&title=In%20Progress)](http://waffle.io/cmmcleod/coriolis)
## About
The Coriolis project was inspired by [E:D Shipyard](http://www.edshipyard.com/) and, of course, [Elite Dangerous](http://www.elitedangerous.com). The ultimate goal of Coriolis is to provide rich features to support in-game play and planning while engaging the E:D community to support its development.
Coriolis was created for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments.
Coriolis was created for non-commercial purposes. Coriolis was created using assets and imagery from Elite: Dangerous, with the permission of Frontier Developments plc, for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments and no employee of Frontier Developments was involved in the making of it.
## Contributing
Please [submit issues](https://github.com/cmmcleod/coriolis/issues), or better yet [pull requests](http://www.elitedangerous.com) for any corrections or additions to the database or the code.
Please [submit issues](https://github.com/cmmcleod/coriolis/issues), or better yet [pull requests](https://github.com/cmmcleod/coriolis/pulls) for any corrections or additions to the database or the code.
### Feature Requests, Suggestions & Bugs
@@ -26,12 +28,15 @@ See [Data wiki](https://github.com/cmmcleod/coriolis/wiki/Database) for details
## License
The MIT License
All Data and [associated JSON](https://github.com/cmmcleod/coriolis/tree/master/data) files are intellectual property and copyright of Frontier Developments plc ('Frontier', 'Frontier Developments') and are subject to their
[terms and conditions](https://www.frontierstore.net/terms-and-conditions/).
The code (Javascript, CSS, HTML, and SVG files only) specificially for Coriolis.io is released under the MIT License.
Copyright (c) 2015 Coriolis.io, Colin McLeod
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
of this software (Javascript, CSS, HTML, and SVG files only), and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is

Binary file not shown.

View File

@@ -1,913 +0,0 @@
<?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" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata></metadata>
<defs>
<font id="euro_capsregular" horiz-adv-x="1024" >
<font-face units-per-em="2048" ascent="1536" descent="-512" />
<missing-glyph horiz-adv-x="616" />
<glyph horiz-adv-x="0" />
<glyph unicode="&#xd;" horiz-adv-x="616" />
<glyph unicode=" " horiz-adv-x="616" />
<glyph unicode="&#x09;" horiz-adv-x="616" />
<glyph unicode="&#xa0;" horiz-adv-x="616" />
<glyph unicode="!" horiz-adv-x="533" d="M171 1365h192l-23 -969h-149zM175 0v212h185v-212h-185z" />
<glyph unicode="&#x22;" horiz-adv-x="662" d="M104 1365h138l-20 -546h-99zM419 1365h138l-19 -546h-99z" />
<glyph unicode="#" horiz-adv-x="1049" d="M68 355l17 110h187l37 235h-186l17 110h187l55 351h119l-55 -351h230l56 351h119l-55 -351h185l-18 -110h-185l-37 -235h187l-18 -110h-186l-57 -355h-119l56 355h-230l-57 -355h-118l56 355h-187zM391 465h231l37 235h-231z" />
<glyph unicode="$" horiz-adv-x="1186" d="M93 374v14h156v-20q1 -77 5 -114q6 -57 38.5 -85t97.5 -32q111 -3 143 -4v401q-188 1 -263 26q-97 32 -133 113q-31 68 -31 190q0 166 68 236q72 76 257 86q39 2 102 3v108h125v-108q26 -1 35 -1q160 -1 217 -21q94 -33 132 -118q26 -58 26 -161q0 -20 -1 -51h-153l-1 22 q-2 89 -6 107q-10 39 -30 53q-39 27 -144 30q-27 1 -75 1v-376q191 -2 278 -34q103 -37 137 -143q21 -64 21 -162q0 -126 -40 -199q-51 -94 -182 -121q-42 -8 -214 -14v-131h-125v131h-47q-109 -1 -159 6t-95 29q-63 31 -94 83t-40 140q-4 44 -5 116zM258 873 q0 -140 59 -172q45 -24 160 -27q19 -1 56 -1v377q-79 -1 -123 -3q-95 -4 -124 -46q-28 -38 -28 -128zM658 132h27q147 0 204 42q54 41 54 171q0 81 -24 124q-24 45 -107 56q-42 6 -154 7v-400z" />
<glyph unicode="%" horiz-adv-x="1813" d="M68 832q0 175 12 224q18 74 87 106q61 28 134 31q54 3 132 3q142 0 199 -15q106 -29 135 -111q16 -46 16 -237q0 -176 -12 -224q-18 -74 -87 -106q-60 -28 -134 -31q-52 -3 -124 -3q-150 0 -207 15q-106 29 -135 111q-16 46 -16 237zM201 833q2 -129 4 -147q7 -77 66 -89 q42 -9 155 -9q112 0 154 9q59 12 66 89q2 18 4 146q-2 129 -4 147q-8 77 -66 89q-42 9 -157 9q-110 0 -152 -9q-59 -12 -66 -89q-2 -18 -4 -146zM514 0l649 1188h136l-654 -1188h-131zM1030 354q0 175 12 224q18 75 87 106q61 28 134 31q54 3 132 3q141 0 199 -15 q106 -29 135 -111q16 -46 16 -237q0 -175 -12 -223q-18 -74 -87 -106q-60 -28 -134 -31q-52 -3 -124 -3q-150 0 -207 15q-106 29 -135 111q-16 46 -16 236zM1163 355q2 -129 4 -146q7 -77 66 -89q42 -9 155 -9q112 0 154 9q59 12 66 89q2 18 4 146q-2 128 -4 146 q-8 77 -66 89q-42 9 -157 9q-110 0 -152 -9q-59 -12 -66 -89q-2 -18 -4 -146z" />
<glyph unicode="&#x26;" horiz-adv-x="1308" d="M102 371q0 196 85 257q50 36 160 51q-37 33 -56 63q-28 47 -28 128q0 172 78 232q79 60 286 60q104 0 165 -15t101 -51q71 -64 71 -218q0 -31 -2 -88h-156q-1 45 -1 58q-1 115 -25 141q-29 31 -155 31q-141 0 -176 -31q-26 -24 -26 -93q0 -66 23 -99q16 -22 66 -63 l405 -338q1 31 1 46q0 26 -4 92h158q3 -78 3 -103q0 -87 -12 -156l204 -168l-90 -114l-165 137q-32 -63 -91 -97q-68 -37 -143 -43q-69 -6 -180 -6q-211 0 -285 18q-148 35 -190 174q-21 69 -21 195zM262 365q0 -169 52 -209q34 -26 118 -28q82 -1 168 -1q142 0 192 14 q76 21 97 87l-431 355q-107 -15 -142 -33q-29 -15 -41.5 -58t-12.5 -127z" />
<glyph unicode="'" horiz-adv-x="347" d="M104 1365h138l-20 -546h-99z" />
<glyph unicode="(" horiz-adv-x="673" d="M151 573q0 516 8 594q12 119 46.5 189.5t99.5 110.5q76 47 205 47q19 0 54 -1v-148q-112 -1 -160 -31q-50 -35 -63 -152q-10 -87 -9 -411v-395q2 -420 20 -476q21 -80 86 -103q44 -15 126 -15v-148q-41 -2 -61 -2q-235 0 -310 185q-34 84 -40 250q-2 51 -2 506z" />
<glyph unicode=")" horiz-adv-x="673" d="M109 -218q113 0 160 31q50 35 63 152q10 83 9 411v395q-2 419 -20 476q-21 80 -86 103q-44 15 -126 15v148q35 1 54 1q125 0 201.5 -44.5t115.5 -140.5q34 -84 40 -250q2 -51 2 -506q0 -516 -8 -594q-12 -119 -46.5 -189.5t-99.5 -110.5q-77 -47 -198 -47q-20 0 -61 2 v148z" />
<glyph unicode="*" horiz-adv-x="998" d="M82 1032l40 115l320 -115v333h115v-333l318 115l41 -115l-321 -119l191 -273l-92 -68l-193 282l-209 -282l-91 68l200 273z" />
<glyph unicode="+" horiz-adv-x="1079" d="M66 509v129h403v408h140v-408h403v-129h-403v-409h-140v409h-403z" />
<glyph unicode="," horiz-adv-x="454" d="M123 -140q53 3 75 19q28 21 28 76q0 15 -2 45h-78v212h185v-228q0 -111 -26 -152q-38 -62 -133 -62q-18 0 -49 2v88z" />
<glyph unicode="-" horiz-adv-x="513" d="M20 493v152h473v-152h-473z" />
<glyph unicode="." horiz-adv-x="431" d="M123 0v212h185v-212h-185z" />
<glyph unicode="/" horiz-adv-x="1212" d="M14 -195l1054 1560h131l-1054 -1560h-131z" />
<glyph unicode="0" horiz-adv-x="1152" d="M107 590q0 253 6 317q16 158 104 225q74 56 192 63q69 4 178 4q189 0 264 -25q135 -46 172 -181q19 -66 20 -185q1 -92 1 -215q0 -249 -6 -313q-16 -158 -104 -224q-73 -56 -192 -64q-67 -4 -166 -4q-201 0 -276 25q-135 46 -172 181q-18 66 -20 184q-1 91 -1 212z M259 594q0 -195 6 -272q6 -82 27.5 -122t68.5 -54q60 -18 215 -18t215 18q67 20 87 106q15 64 15 346q0 187 -6 267q-7 98 -37 136q-34 46 -130 53q-67 5 -150 5q-148 0 -209 -18q-67 -20 -87 -106q-15 -63 -15 -341z" />
<glyph unicode="1" horiz-adv-x="1150" d="M296 837l351 351h207v-1188h-157v1010l-287 -287z" />
<glyph unicode="2" horiz-adv-x="1074" d="M101 0v231q0 95 17 150.5t57 93.5q57 51 164 73q58 12 188 26q154 16 192 29q66 22 82 77q15 50 15 158q0 136 -39 176q-44 46 -216 46q-150 0 -217 -18q-33 -9 -50 -25.5t-27 -50.5q-9 -30 -9 -133v-68h-155v68q0 226 95 298q89 68 361 68q243 0 330 -85q56 -54 69 -152 q9 -63 9 -143q0 -137 -27 -205q-41 -101 -153 -140q-71 -25 -234 -42q-129 -13 -165 -21q-52 -11 -77 -28t-36 -51q-16 -47 -17 -142v-53h706v-137h-863z" />
<glyph unicode="3" horiz-adv-x="1112" d="M97 337v68h154v-68q0 -135 38 -175q24 -24 100 -30q52 -4 199 -4q175 0 215 46q31 36 31 182q0 102 -37 141q-29 31 -79 37q-34 4 -80 4h-205v140h205q115 0 149 47q25 34 25 125q0 98 -19 148q-10 27 -32.5 39t-71.5 18q-43 4 -154 4t-159.5 -7t-71.5 -27 q-36 -30 -36 -153v-68h-151v68q0 196 89 265q64 49 173 57q70 5 163 5q173 0 243 -19q128 -34 164 -137q20 -57 20 -151q0 -163 -49 -222q-32 -39 -96 -59q65 -16 99 -46q68 -59 68 -227q0 -197 -77 -270q-55 -52 -143 -66q-94 -14 -218 -14q-204 0 -288 28 q-110 37 -148 140q-20 54 -20 181z" />
<glyph unicode="4" horiz-adv-x="1114" d="M62 268v173l586 747h221v-782h174v-138h-174v-268h-157v268h-650zM212 406h500v647z" />
<glyph unicode="5" horiz-adv-x="1116" d="M122 291v68h151v-41q0 -112 33 -144q42 -40 149 -44q40 -2 85 -2q203 0 261 43q32 24 39 116q3 39 3 164q0 139 -47 185q-48 46 -226 46q-149 0 -201 -16q-61 -18 -76 -67q-2 -7 -6 -27h-143v616h808v-138h-656v-302q39 38 85 51q78 22 212 22q231 0 322 -88 q69 -68 81 -189q4 -48 4 -114q0 -144 -16.5 -221t-58.5 -127q-42 -49 -128.5 -71.5t-236.5 -22.5q-180 0 -261 26q-115 38 -154 133q-23 54 -23 144z" />
<glyph unicode="6" horiz-adv-x="1122" d="M117 621q5 256 5 270q3 98 30 155.5t87 95.5q89 57 303 57q197 0 279 -26q159 -50 159 -251v-55h-155v55q0 78 -28 102q-40 35 -185 35q-176 0 -235 -15q-59 -16 -77 -59q-18 -44 -18 -124v-200q39 41 81 55q74 25 240 25q182 0 258 -33q92 -39 125 -135q25 -74 25 -191 q0 -220 -75 -306q-59 -67 -165 -79q-79 -9 -190 -9q-137 0 -206.5 11.5t-119.5 43.5q-94 58 -119 154q-15 54 -17 212zM274 407q0 -191 45 -233q48 -46 255 -46q203 0 244 37q42 38 42 192q0 167 -37 203q-41 41 -262 41q-189 0 -246 -44q-41 -31 -41 -150z" />
<glyph unicode="7" horiz-adv-x="1069" d="M90 1050v138h873v-184l-567 -1004h-188l609 1050h-727z" />
<glyph unicode="8" horiz-adv-x="1112" d="M109 342q0 147 39 200q36 49 120 75q-61 20 -84 42q-60 60 -60 228q0 180 73 242q63 54 177 63q84 7 185 7q191 0 262 -20q116 -32 150 -141q18 -59 18 -155q0 -141 -42 -203q-24 -35 -103 -64q60 -17 88 -41q48 -41 60 -103q10 -55 10 -123q0 -119 -17 -183t-60 -102 q-44 -40 -128 -58t-226 -18q-205 0 -297 27q-103 31 -141 127q-24 60 -24 200zM260 351q0 -122 15 -155q22 -46 87 -58q53 -10 206 -10q198 0 244 43q39 35 39 182q0 108 -37 146q-26 28 -93 37q-49 7 -181 7q-137 0 -190 -15q-63 -19 -80 -70q-10 -28 -10 -107zM276 885 q0 -105 14 -136q21 -44 78 -56q55 -12 231 -12q163 0 204 40q35 34 35 156q0 123 -38 152q-38 30 -243 30q-121 0 -174 -7t-75 -26q-32 -27 -32 -141z" />
<glyph unicode="9" horiz-adv-x="1118" d="M106 282v41h150v-41q0 -99 39 -126q36 -24 112 -26q75 -2 142 -2q152 0 214 22q54 19 67 97q8 43 8 146v135q-27 -32 -53 -43q-80 -35 -286 -35q-201 0 -287 61q-71 50 -88 143q-12 65 -12 148q0 164 30 238q50 120 208 147q70 12 204 12q192 0 275 -34q132 -53 156 -204 q15 -95 15 -433q0 -185 -9 -266q-12 -101 -48 -157.5t-107 -85.5q-78 -31 -283 -31q-192 0 -263 18q-140 36 -172 145q-12 41 -12 131zM263 830q0 -159 40 -200q40 -40 213 -40q164 0 226 15q54 13 74 42q23 33 23 137q0 130 -12 168q-21 70 -84 90q-55 17 -217 17 q-182 0 -222 -38q-41 -39 -41 -191z" />
<glyph unicode=":" horiz-adv-x="431" d="M123 0v212h185v-212h-185zM123 880v212h185v-212h-185z" />
<glyph unicode=";" horiz-adv-x="454" d="M123 -140q53 3 75 19q28 21 28 76q0 15 -2 45h-78v212h185v-228q0 -111 -26 -152q-38 -62 -133 -62q-18 0 -49 2v88zM135 880v212h185v-212h-185z" />
<glyph unicode="&#x3c;" d="M68 504v140l887 420v-163l-713 -328l713 -328v-162z" />
<glyph unicode="=" horiz-adv-x="1079" d="M66 338v129h946v-129h-946zM66 680v129h946v-129h-946z" />
<glyph unicode="&#x3e;" d="M69 83v162l713 328l-713 328v163l887 -420v-140z" />
<glyph unicode="?" horiz-adv-x="976" d="M123 1022v37q0 103 12 152q25 102 118 141q72 31 226 31q156 0 228 -26q110 -39 135 -141q11 -46 11 -184q0 -151 -17 -195q-20 -52 -55 -78q-36 -26 -200 -87q-43 -17 -53 -35q-10 -15 -10 -65v-176h-157v192q0 128 65 172q36 23 173 70q71 25 90 65q13 25 13 102 q0 135 -9 165q-19 61 -86 72q-34 6 -127 6q-95 0 -129 -11q-60 -18 -72 -92q-3 -21 -3 -86v-29h-153zM348 0v212h185v-212h-185z" />
<glyph unicode="@" horiz-adv-x="1499" d="M102 674q0 306 45 450q41 129 136 176q133 66 505 66q270 0 385 -36q117 -37 161 -121q63 -120 63 -377q0 -279 -39 -414q-26 -90 -92 -115q-32 -13 -78 -13q-167 0 -193 128h-3q-25 -61 -77 -92q-69 -42 -206 -42q-184 0 -249 107q-51 85 -51 289q0 153 21 237 q29 109 122 148q63 26 164 26q113 0 182 -32q44 -20 70 -77h4v109h115v-544q4 -91 7 -108q12 -59 90 -59q54 0 74 35q18 33 29 138.5t11 240.5q0 221 -30 320q-36 115 -181 136q-106 15 -309 15q-263 0 -370 -22q-113 -23 -148 -96q-58 -119 -58 -438q0 -259 30 -391 q32 -134 135 -175q76 -31 172 -37q132 -9 285 -9q208 0 285 25q33 11 61 53l79 -56q-42 -73 -119 -95q-88 -26 -322 -26q-196 0 -310 16q-158 22 -241 81q-95 68 -128 231q-27 137 -27 348zM531 693q0 -206 51 -267q37 -45 157 -45q113 0 159 29q61 38 67 150q6 94 6 196 q0 144 -55 195q-48 44 -172 44q-74 0 -122 -16q-66 -23 -82 -129q-9 -60 -9 -157z" />
<glyph unicode="A" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625z" />
<glyph unicode="B" horiz-adv-x="1170" d="M143 0v1170h550q102 0 142 -5q120 -15 173 -103q40 -68 40 -209q0 -143 -59 -201q-28 -28 -105 -38q79 -5 118 -34q81 -63 81 -242q0 -224 -117 -293q-75 -45 -219 -45h-604zM302 142h288q147 1 175 3q122 6 145 68q14 40 14 110q0 84 -15 128q-19 60 -105 72 q-25 4 -156 4h-346v-385zM302 669h354q128 0 174 24q39 22 52 71q7 30 7 90q0 81 -15 113q-22 49 -89 58q-24 3 -95 3h-388v-359z" />
<glyph unicode="C" horiz-adv-x="1151" d="M94 569q0 273 13 358q21 136 143 204q76 43 203 51q62 4 225 4q154 0 215 -20q138 -45 166 -200q10 -57 10 -144q0 -10 -1 -32h-157q-1 39 -1 51q-2 142 -48 175q-40 29 -185 29q-192 0 -276 -11q-52 -7 -80.5 -29.5t-43.5 -68.5q-16 -50 -16 -166q0 -412 22 -514 q13 -66 48 -93q40 -31 130 -35q55 -2 118 -2q145 0 212.5 9.5t92.5 33.5q35 34 35 153q0 39 -2 90h159v-58v-12q0 -136 -22 -195q-46 -127 -205 -153q-60 -10 -301 -10q-108 0 -154 4.5t-91 20.5q-176 59 -199 311q-10 116 -10 249z" />
<glyph unicode="D" horiz-adv-x="1243" d="M143 0v1170h573q111 0 190 -20q121 -29 185 -149q59 -111 59 -363q0 -207 -9 -288q-25 -227 -171 -303q-55 -28 -169 -43q-30 -4 -52 -4h-606zM302 142h387q185 0 240 66q46 55 57 185q5 59 5 169q0 198 -10 278q-18 134 -117 169q-54 19 -149 19h-413v-886z" />
<glyph unicode="E" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794z" />
<glyph unicode="F" horiz-adv-x="960" d="M143 0v1170h761v-142h-602v-365h587v-139h-587v-524h-159z" />
<glyph unicode="G" horiz-adv-x="1192" d="M94 600v48q0 157 12.5 239.5t45.5 146.5q59 115 208 142q59 10 219 10q180 0 242 -4.5t108 -19.5q152 -53 165 -229q3 -31 3 -124h-158q-1 131 -21 174q-21 45 -112 55q-65 7 -241 7q-144 0 -207 -18q-71 -20 -91 -118q-11 -51 -14 -321q1 -212 3 -249q4 -90 28.5 -135.5 t77.5 -59.5q67 -19 292 -19q117 0 174.5 11.5t79.5 39.5q33 42 33 220q0 20 -1 59h-363v142h518q5 -58 5 -128q0 -128 -3 -185q-12 -208 -159 -269q-76 -31 -343 -31q-178 0 -260 18.5t-139 70.5q-88 81 -98 241q-3 51 -3 124v38t-1 124z" />
<glyph unicode="H" horiz-adv-x="1271" d="M143 0v1170h159v-502h668v502h159v-1170h-159v529h-668v-529h-159z" />
<glyph unicode="I" horiz-adv-x="445" d="M143 0v1170h159v-1170h-159z" />
<glyph unicode="J" horiz-adv-x="967" d="M57 296q0 79 4 150h156q-1 -52 -1 -69q0 -144 11 -181q15 -48 71 -61q36 -9 151 -9q121 0 158 23q48 31 55 124q4 46 4 99v798h159v-819q0 -102 -11 -157t-39 -96q-48 -68 -130 -93q-68 -21 -190 -21q-176 0 -259 34q-98 40 -125 135q-14 48 -14 143z" />
<glyph unicode="K" horiz-adv-x="1159" d="M143 0v1170h159v-498h106l482 498h210l-551 -567l615 -603h-220l-536 527h-106v-527h-159z" />
<glyph unicode="L" horiz-adv-x="958" d="M143 0v1170h159v-1019h618v-151h-777z" />
<glyph unicode="M" horiz-adv-x="1598" d="M143 0v1170h248l407 -999l406 999h251v-1170h-159v1023l-421 -1023h-150l-423 1023v-1023h-159z" />
<glyph unicode="N" horiz-adv-x="1321" d="M143 0v1170h234l643 -1023v1023h159v-1170h-235l-642 1023v-1023h-159z" />
<glyph unicode="O" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181z" />
<glyph unicode="P" horiz-adv-x="1121" d="M143 0v1170h524q112 0 159 -5.5t87 -23.5q146 -66 146 -336q0 -148 -40 -224q-52 -97 -160 -123q-38 -9 -212 -11h-345v-447h-159zM302 589h320q147 0 198 18q54 20 71 84q9 32 9 96q0 121 -15 169q-17 52 -78 65q-26 6 -144 7h-361v-439z" />
<glyph unicode="Q" horiz-adv-x="1220" d="M94 642q0 159 8 220q28 220 176 285q65 29 170 35q69 4 162 4q143 0 212.5 -8t120.5 -31q148 -65 176 -285q8 -61 8 -229q0 -278 -10 -346q-3 -24 -9 -50l117 -78l-70 -114l-102 67q-51 -70 -146 -102q-63 -22 -183 -25q-60 -1 -119 -1q-153 0 -219 8.5t-122 35.5 q-114 56 -149 204q-17 70 -19 173q-2 57 -2 237zM253 585q0 -213 4 -253q8 -82 28.5 -123.5t63.5 -59.5q38 -17 107 -20q55 -3 138 -3q130 0 205 5q88 7 127 65l-342 223l77 114l303 -201q4 64 4 253q0 217 -4 253q-8 82 -29 124t-62 60q-39 16 -112 19q-58 3 -151 3 q-125 0 -177.5 -4.5t-84.5 -18.5q-60 -26 -81 -113q-14 -61 -14 -142v-181z" />
<glyph unicode="R" horiz-adv-x="1193" d="M143 0v1170h590q156 0 237 -53q71 -46 97 -140q15 -56 15 -147q0 -150 -39 -218q-41 -74 -150 -84q172 -11 173 -222v-306h-159v276q0 108 -49 148q-48 35 -142 35h-10h-404v-459h-159zM302 601h388q119 0 172 32q61 37 61 151q0 155 -28 195q-35 49 -161 49h-432v-427z " />
<glyph unicode="S" horiz-adv-x="1097" d="M87 383h159v-44q1 -86 13 -126.5t43 -61.5q29 -20 92 -22q69 -3 164 -3q130 0 184 10t78 39q30 35 30 176q0 68 -15 101q-20 47 -99 57q-39 5 -197 11q-157 7 -198 12q-131 19 -193 100q-53 68 -53 210q0 204 91 274q70 54 181 64q79 6 183 6q199 0 273 -25 q151 -50 164 -240q1 -21 1 -91h-159q0 83 -7 117q-13 66 -82 85q-44 12 -157 12q-159 0 -205 -8q-86 -14 -110 -77q-14 -38 -14 -100q0 -79 19 -121q22 -47 109 -58q32 -4 189 -10q174 -7 237 -19q126 -26 172 -123q29 -62 29 -192q0 -189 -62 -259q-64 -72 -183 -84 q-91 -9 -246 -9q-188 0 -252 20q-150 48 -172 231q-5 39 -7 148z" />
<glyph unicode="T" horiz-adv-x="1007" d="M38 1019v151h930v-151h-384v-1019h-159v1019h-387z" />
<glyph unicode="U" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218z" />
<glyph unicode="V" horiz-adv-x="1096" d="M14 1170h170l367 -1000l361 1000h171l-429 -1170h-207z" />
<glyph unicode="W" horiz-adv-x="1801" d="M14 1170h165l308 -1014l304 1014h213l302 -1014l315 1014h167l-377 -1170h-218l-296 1014l-301 -1014h-215z" />
<glyph unicode="X" horiz-adv-x="1101" d="M1 0l433 605l-401 565h194l331 -469l326 469h189l-390 -565l418 -605h-190l-353 506l-361 -506h-196z" />
<glyph unicode="Y" horiz-adv-x="1068" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487z" />
<glyph unicode="Z" horiz-adv-x="1076" d="M63 0v135l733 893h-713v142h916v-132l-736 -896h751v-142h-951z" />
<glyph unicode="[" horiz-adv-x="673" d="M165 -352v1850h399v-133h-225v-1583h225v-134h-399z" />
<glyph unicode="\" horiz-adv-x="1212" d="M14 1365h131l1054 -1560h-132z" />
<glyph unicode="]" horiz-adv-x="673" d="M109 -219h225v1584h-225v134h399v-1851h-399v133z" />
<glyph unicode="^" d="M64 765l356 604h185l356 -604h-154l-296 492l-294 -492h-153z" />
<glyph unicode="_" d="M0 -145h1024v-107h-1024v107z" />
<glyph unicode="`" d="M254 1518l82 112l310 -234l-56 -85z" />
<glyph unicode="a" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625z" />
<glyph unicode="b" horiz-adv-x="1170" d="M143 0v1170h550q102 0 142 -5q120 -15 173 -103q40 -68 40 -209q0 -143 -59 -201q-28 -28 -105 -38q79 -5 118 -34q81 -63 81 -242q0 -224 -117 -293q-75 -45 -219 -45h-604zM302 142h288q147 1 175 3q122 6 145 68q14 40 14 110q0 84 -15 128q-19 60 -105 72 q-25 4 -156 4h-346v-385zM302 669h354q128 0 174 24q39 22 52 71q7 30 7 90q0 81 -15 113q-22 49 -89 58q-24 3 -95 3h-388v-359z" />
<glyph unicode="c" horiz-adv-x="1151" d="M94 569q0 273 13 358q21 136 143 204q76 43 203 51q62 4 225 4q154 0 215 -20q138 -45 166 -200q10 -57 10 -144q0 -10 -1 -32h-157q-1 39 -1 51q-2 142 -48 175q-40 29 -185 29q-192 0 -276 -11q-52 -7 -80.5 -29.5t-43.5 -68.5q-16 -50 -16 -166q0 -412 22 -514 q13 -66 48 -93q40 -31 130 -35q55 -2 118 -2q145 0 212.5 9.5t92.5 33.5q35 34 35 153q0 39 -2 90h159v-58v-12q0 -136 -22 -195q-46 -127 -205 -153q-60 -10 -301 -10q-108 0 -154 4.5t-91 20.5q-176 59 -199 311q-10 116 -10 249z" />
<glyph unicode="d" horiz-adv-x="1243" d="M143 0v1170h573q111 0 190 -20q121 -29 185 -149q59 -111 59 -363q0 -207 -9 -288q-25 -227 -171 -303q-55 -28 -169 -43q-30 -4 -52 -4h-606zM302 142h387q185 0 240 66q46 55 57 185q5 59 5 169q0 198 -10 278q-18 134 -117 169q-54 19 -149 19h-413v-886z" />
<glyph unicode="e" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794z" />
<glyph unicode="f" horiz-adv-x="960" d="M143 0v1170h761v-142h-602v-365h587v-139h-587v-524h-159z" />
<glyph unicode="g" horiz-adv-x="1192" d="M94 600v48q0 157 12.5 239.5t45.5 146.5q59 115 208 142q59 10 219 10q180 0 242 -4.5t108 -19.5q152 -53 165 -229q3 -31 3 -124h-158q-1 131 -21 174q-21 45 -112 55q-65 7 -241 7q-144 0 -207 -18q-71 -20 -91 -118q-11 -51 -14 -321q1 -212 3 -249q4 -90 28.5 -135.5 t77.5 -59.5q67 -19 292 -19q117 0 174.5 11.5t79.5 39.5q33 42 33 220q0 20 -1 59h-363v142h518q5 -58 5 -128q0 -128 -3 -185q-12 -208 -159 -269q-76 -31 -343 -31q-178 0 -260 18.5t-139 70.5q-88 81 -98 241q-3 51 -3 124v38t-1 124z" />
<glyph unicode="h" horiz-adv-x="1271" d="M143 0v1170h159v-502h668v502h159v-1170h-159v529h-668v-529h-159z" />
<glyph unicode="i" horiz-adv-x="445" d="M143 0v1170h159v-1170h-159z" />
<glyph unicode="j" horiz-adv-x="967" d="M57 296q0 79 4 150h156q-1 -52 -1 -69q0 -144 11 -181q15 -48 71 -61q36 -9 151 -9q121 0 158 23q48 31 55 124q4 46 4 99v798h159v-819q0 -102 -11 -157t-39 -96q-48 -68 -130 -93q-68 -21 -190 -21q-176 0 -259 34q-98 40 -125 135q-14 48 -14 143z" />
<glyph unicode="k" horiz-adv-x="1159" d="M143 0v1170h159v-498h106l482 498h210l-551 -567l615 -603h-220l-536 527h-106v-527h-159z" />
<glyph unicode="l" horiz-adv-x="958" d="M143 0v1170h159v-1019h618v-151h-777z" />
<glyph unicode="m" horiz-adv-x="1598" d="M143 0v1170h248l407 -999l406 999h251v-1170h-159v1023l-421 -1023h-150l-423 1023v-1023h-159z" />
<glyph unicode="n" horiz-adv-x="1321" d="M143 0v1170h234l643 -1023v1023h159v-1170h-235l-642 1023v-1023h-159z" />
<glyph unicode="o" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181z" />
<glyph unicode="p" horiz-adv-x="1121" d="M143 0v1170h524q112 0 159 -5.5t87 -23.5q146 -66 146 -336q0 -148 -40 -224q-52 -97 -160 -123q-38 -9 -212 -11h-345v-447h-159zM302 589h320q147 0 198 18q54 20 71 84q9 32 9 96q0 121 -15 169q-17 52 -78 65q-26 6 -144 7h-361v-439z" />
<glyph unicode="q" horiz-adv-x="1220" d="M94 642q0 159 8 220q28 220 176 285q65 29 170 35q69 4 162 4q143 0 212.5 -8t120.5 -31q148 -65 176 -285q8 -61 8 -229q0 -278 -10 -346q-3 -24 -9 -50l117 -78l-70 -114l-102 67q-51 -70 -146 -102q-63 -22 -183 -25q-60 -1 -119 -1q-153 0 -219 8.5t-122 35.5 q-114 56 -149 204q-17 70 -19 173q-2 57 -2 237zM253 585q0 -213 4 -253q8 -82 28.5 -123.5t63.5 -59.5q38 -17 107 -20q55 -3 138 -3q130 0 205 5q88 7 127 65l-342 223l77 114l303 -201q4 64 4 253q0 217 -4 253q-8 82 -29 124t-62 60q-39 16 -112 19q-58 3 -151 3 q-125 0 -177.5 -4.5t-84.5 -18.5q-60 -26 -81 -113q-14 -61 -14 -142v-181z" />
<glyph unicode="r" horiz-adv-x="1193" d="M143 0v1170h590q156 0 237 -53q71 -46 97 -140q15 -56 15 -147q0 -150 -39 -218q-41 -74 -150 -84q172 -11 173 -222v-306h-159v276q0 108 -49 148q-48 35 -142 35h-10h-404v-459h-159zM302 601h388q119 0 172 32q61 37 61 151q0 155 -28 195q-35 49 -161 49h-432v-427z " />
<glyph unicode="s" horiz-adv-x="1097" d="M87 383h159v-44q1 -86 13 -126.5t43 -61.5q29 -20 92 -22q69 -3 164 -3q130 0 184 10t78 39q30 35 30 176q0 68 -15 101q-20 47 -99 57q-39 5 -197 11q-157 7 -198 12q-131 19 -193 100q-53 68 -53 210q0 204 91 274q70 54 181 64q79 6 183 6q199 0 273 -25 q151 -50 164 -240q1 -21 1 -91h-159q0 83 -7 117q-13 66 -82 85q-44 12 -157 12q-159 0 -205 -8q-86 -14 -110 -77q-14 -38 -14 -100q0 -79 19 -121q22 -47 109 -58q32 -4 189 -10q174 -7 237 -19q126 -26 172 -123q29 -62 29 -192q0 -189 -62 -259q-64 -72 -183 -84 q-91 -9 -246 -9q-188 0 -252 20q-150 48 -172 231q-5 39 -7 148z" />
<glyph unicode="t" horiz-adv-x="1007" d="M38 1019v151h930v-151h-384v-1019h-159v1019h-387z" />
<glyph unicode="u" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218z" />
<glyph unicode="v" horiz-adv-x="1096" d="M14 1170h170l367 -1000l361 1000h171l-429 -1170h-207z" />
<glyph unicode="w" horiz-adv-x="1801" d="M14 1170h165l308 -1014l304 1014h213l302 -1014l315 1014h167l-377 -1170h-218l-296 1014l-301 -1014h-215z" />
<glyph unicode="x" horiz-adv-x="1101" d="M1 0l433 605l-401 565h194l331 -469l326 469h189l-390 -565l418 -605h-190l-353 506l-361 -506h-196z" />
<glyph unicode="y" horiz-adv-x="1068" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487z" />
<glyph unicode="z" horiz-adv-x="1076" d="M63 0v135l733 893h-713v142h916v-132l-736 -896h751v-142h-951z" />
<glyph unicode="{" horiz-adv-x="673" d="M46 508v130q61 16 94 56q41 53 40 158v297q0 173 47 250q34 58 119 84q50 15 103 15h102v-127q-45 0 -87 -9t-64 -24q-18 -12 -34 -36.5t-21 -46.5q-3 -14 -6.5 -52t-3.5 -57v-301q0 -124 -39 -187q-33 -51 -103 -85q76 -36 110 -98q32 -63 32 -174v-301q0 -102 24 -144 q46 -81 178 -81h14v-127h-102q-81 0 -143 31q-66 32 -92 93q-34 82 -34 225v297q1 106 -40 158q-32 39 -94 56z" />
<glyph unicode="|" horiz-adv-x="594" d="M216 -341v1706h163v-1706h-163z" />
<glyph unicode="}" horiz-adv-x="659" d="M109 -225q45 0 86.5 9t63.5 24q19 12 35 36.5t21 46.5q3 14 6.5 52t3.5 57v301q0 124 39 187q33 51 103 85q-76 36 -110 98q-32 63 -32 174v301q0 102 -24 144q-46 81 -178 81h-14v127h103q80 0 142 -31q66 -32 92 -93q34 -82 34 -225v-297q-1 -105 40 -158 q32 -39 94 -56v-130q-61 -16 -94 -56q-41 -54 -40 -158v-297q0 -173 -47 -250q-34 -58 -119 -84q-50 -15 -102 -15h-103v127z" />
<glyph unicode="~" horiz-adv-x="1365" d="M193 1256q37 77 81 131q81 99 195 99q79 0 235 -79q89 -44 119 -55q43 -14 77 -14q67 0 119 56q33 36 68 97l87 -69q-111 -232 -277 -232q-51 0 -123 30q-38 16 -111 52q-137 67 -200 67q-68 0 -119 -59q-30 -34 -64 -93z" />
<glyph unicode="&#xa1;" horiz-adv-x="533" d="M171 -195l23 969h149l20 -969h-192zM174 958v212h185v-212h-185z" />
<glyph unicode="&#xa2;" horiz-adv-x="990" d="M116 565q0 187 40 268q70 140 269 144v113h127v-113q101 -2 171 -38q114 -58 114 -219q0 -10 -1 -43h-145q-1 87 -8 111q-22 61 -131 65v-609q70 3 107 23q29 17 38 49q9 27 10 76q0 19 1 58h146q-1 -21 -1 -45q-2 -113 -31 -167q-69 -119 -270 -119v-125h-127v125 q-116 3 -185 45q-80 49 -107 174q-17 79 -17 227zM267 583q0 -266 61 -313q27 -20 97 -24v609q-71 -6 -103 -31q-55 -44 -55 -241z" />
<glyph unicode="&#xa3;" horiz-adv-x="1074" d="M49 453v138h144v163q0 9 -1 48q-1 27 -1 50q0 181 71 260q52 58 143 73q81 14 179 14q167 0 239 -27q118 -45 149 -160q11 -42 11 -131v-68h-152v68q0 101 -30 134q-39 44 -198 44q-136 0 -187 -20q-43 -16 -55 -63q-8 -30 -11 -165v-220h330v-138h-330v-40v-47 q1 -35 1 -46q0 -98 -30 -145q-11 -19 -36 -39h721v-136h-928v124q65 14 90 56q20 38 23 117q2 41 2 74v82h-144z" />
<glyph unicode="&#xa4;" horiz-adv-x="1338" d="M100 1057l80 80l193 -193q143 106 296 106q154 0 293 -105l194 191l79 -79l-192 -192q105 -141 105 -293q0 -149 -103 -289l193 -193l-79 -80l-193 193q-135 -105 -294 -105q-149 0 -296 105l-192 -193l-79 79l190 193q-104 137 -104 292q0 150 104 290zM321 574 q0 -145 102 -248q102 -102 246 -102t247 103q101 101 101 245q0 149 -101 249q-105 103 -251 103q-140 0 -243 -104q-101 -102 -101 -246z" />
<glyph unicode="&#xa5;" horiz-adv-x="1048" d="M25 1188h184l314 -531l312 531h188l-226 -367h147v-137h-231l-89 -143h320v-138h-347v-403h-157v403h-336v138h310l-87 143h-223v137h142z" />
<glyph unicode="&#xa6;" horiz-adv-x="594" d="M216 314h163v-655h-163v655zM216 680v685h163v-685h-163z" />
<glyph unicode="&#xa7;" horiz-adv-x="1164" d="M96 551q0 145 62 200q36 32 108 48q-64 40 -84 97q-20 55 -20 145q0 197 65 263q73 75 336 75q274 0 353 -44q87 -49 104 -172q6 -43 6 -146h-147q0 40 -1 54q0 88 -32 120q-37 37 -142 45q-59 4 -123 4q-152 0 -201 -19q-40 -15 -55 -57q-11 -33 -11 -100q0 -99 28 -128 q21 -22 62 -35q29 -10 80 -25l306 -90q116 -34 151 -50q89 -38 114 -120q14 -43 14 -109q0 -118 -35 -184q-22 -43 -59 -65q-17 -10 -52 -23q74 -35 98 -73q38 -63 38 -197q0 -246 -123 -312q-62 -33 -178 -41q-63 -5 -161 -5q-255 0 -336 38q-115 52 -138 195q-7 42 -6 146 h151q1 -90 6 -119q14 -82 118 -99q70 -12 169 -12q180 0 240 11q104 19 104 190q0 95 -35 127q-29 27 -136 55l-420 111q-87 24 -122 44q-96 59 -96 257zM244 552q0 -77 32 -112q22 -23 56 -35q22 -7 63 -19l308 -86q61 -17 99 -17q77 0 106 68q19 46 19 141q0 67 -49 100 q-32 23 -118 48l-295 87q-67 20 -98 20q-71 0 -100 -54q-23 -42 -23 -141z" />
<glyph unicode="&#xa8;" d="M213 1366v155h184v-155h-184zM628 1366v155h184v-155h-184z" />
<glyph unicode="&#xa9;" horiz-adv-x="1526" d="M68 681q0 197 102 366q101 165 279 256q148 76 324 76q186 0 353 -103q168 -103 256 -277q76 -150 76 -317q0 -138 -53 -266t-150 -226q-98 -98 -226 -151t-265 -53q-138 0 -266 53t-225 150q-98 98 -151.5 226.5t-53.5 265.5zM183 683q0 -245 171 -417 q170 -172 410 -172q239 0 409 172q170 173 170 415q0 119 -45 229t-125 190q-174 171 -416 171q-110 0 -216 -45t-187 -126q-82 -82 -126.5 -191t-44.5 -226zM437 685q0 184 8 231q15 90 97 134q50 27 140 33q44 3 138 3q123 0 175 -28q69 -36 79 -127q3 -29 6 -100h-116 q-1 21 -1 28q-1 87 -32 108q-27 18 -120 18q-103 0 -158 -6q-65 -8 -84 -63q-11 -31 -11 -99q0 -270 14 -337q10 -43 33 -61q32 -25 155 -25q161 0 190 27q24 22 24 97q0 7 -1 51h117q-1 -27 -1 -36q1 -86 -11 -127t-45 -67q-46 -38 -125 -43q-59 -4 -157 -4q-119 0 -171 16 q-121 38 -136 204q-7 79 -7 173z" />
<glyph unicode="&#xaa;" horiz-adv-x="764" d="M82 697q0 137 67 186q59 43 205 43q150 0 203 -43v42q0 84 -16 123q-20 46 -143 46q-110 0 -140 -23q-23 -17 -23 -64q0 -6 1 -34h-126q0 11 1 31q1 106 52 146q59 47 226 47q129 0 188 -27q88 -39 100 -149q5 -44 5 -75v-454h-125v45q-35 -30 -69 -41q-48 -14 -142 -14 q-149 0 -210 55q-54 48 -54 160zM212 709q0 -73 27 -94q32 -23 131 -23q127 0 169 35q23 20 23 74q0 66 -26 89q-36 30 -151 30q-122 0 -153 -27q-20 -17 -20 -84z" />
<glyph unicode="&#xab;" horiz-adv-x="981" d="M109 576l223 472l120 -73l-188 -399l209 -404l-113 -76zM493 576l223 472l120 -73l-188 -399l210 -404l-114 -76z" />
<glyph unicode="&#xac;" d="M68 425v143h887v-568h-158v425h-729z" />
<glyph unicode="&#xad;" horiz-adv-x="513" d="M14 493l3 152h483v-152h-486z" />
<glyph unicode="&#xae;" horiz-adv-x="1526" d="M68 681q0 197 102 366q101 165 279 256q148 76 324 76q186 0 353 -103q168 -103 256 -277q76 -150 76 -317q0 -138 -53 -266t-150 -226q-98 -98 -226 -151t-265 -53q-138 0 -266 53t-225 150q-98 98 -151.5 226.5t-53.5 265.5zM183 683q0 -245 171 -417 q170 -172 410 -172q239 0 409 172q170 173 170 415q0 119 -45 229t-125 190q-174 171 -416 171q-110 0 -216 -45t-187 -126q-82 -82 -126.5 -191t-44.5 -226zM452 300v779h384q107 0 162 -34q76 -48 76 -192q0 -96 -26 -144q-21 -38 -81 -57q96 -31 96 -150v-202h-116v182 q0 75 -35 103q-37 26 -108 24h-236v-309h-116zM568 710h224q84 0 122 22q44 26 44 102q0 81 -20 109q-25 35 -115 35h-255v-268z" />
<glyph unicode="&#xaf;" d="M0 1511v107h1024v-107h-1024z" />
<glyph unicode="&#xb0;" horiz-adv-x="767" d="M102 1100q0 119 92 202q80 72 194 72q122 0 206 -93q71 -78 71 -183q0 -121 -92 -204q-80 -72 -190 -72q-119 0 -202 85q-79 80 -79 193zM201 1098q0 -72 51 -124q54 -55 131 -55q82 0 137 60q46 51 46 120q0 77 -59 131q-52 47 -126 47q-79 0 -134 -60q-46 -50 -46 -119 z" />
<glyph unicode="&#xb1;" horiz-adv-x="1079" d="M60 10v143h960v-143h-960zM60 640v143h404v354h151v-354h405v-143h-405v-350h-151v350h-404z" />
<glyph unicode="&#xb2;" horiz-adv-x="853" d="M80 341v172q0 69 13.5 110t45.5 68q45 37 126 53q23 4 138 17q153 16 178 37q29 23 29 136q0 90 -25 114q-31 29 -147 29q-184 0 -207 -34q-16 -25 -16 -90q0 -21 2 -81h-136v14q2 80 4 109q14 142 120 176q78 25 225 25q185 0 252 -62q61 -56 61 -212q0 -98 -21 -148 q-32 -74 -120 -103q-56 -19 -176 -30q-127 -11 -167 -28q-30 -14 -38 -63q-4 -16 -4 -84v-7h523v-118h-660z" />
<glyph unicode="&#xb3;" horiz-adv-x="853" d="M76 630v14h135v-14v-53q0 -79 25 -103q15 -16 68 -19q37 -3 144 -3q129 0 154 28q20 23 20 120q0 88 -54 106q-24 9 -186 9l-43 -1h-14v120q39 -1 49 -1q175 0 202 17q30 18 30 95q0 62 -12 94q-12 30 -70 35q-8 0 -124 3q-94 -2 -124 -8q-36 -10 -46 -41q-6 -15 -6 -78 v-26v-24h-134l1 14q0 87 5 125q12 77 66 112q55 36 132 41q53 4 121 4q131 0 184 -13q100 -26 128 -102q16 -42 16 -109q0 -118 -39 -162q-16 -19 -42 -33q42 -18 60 -42q37 -48 37 -148q0 -142 -61 -196q-43 -38 -111 -48q-71 -10 -162 -10q-153 0 -217 20 q-105 33 -126 134q-6 28 -6 143z" />
<glyph unicode="&#xb4;" d="M379 1396l309 234l83 -112l-337 -207z" />
<glyph unicode="&#xb5;" horiz-adv-x="1223" d="M115 -273l14 630v677h159v-677q0 -124 21 -161q26 -46 105 -61q47 -9 181 -9q198 0 258 20q56 19 73 90q9 40 9 121v677h159v-677q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -270 -18q-130 0 -190 5t-103 19q-41 14 -80 40l11 -321h-138z" />
<glyph unicode="&#xb6;" horiz-adv-x="1256" d="M102 882q0 223 66 333q65 108 191 136q61 14 258 14h482v-1560h-156v1414h-187v-1414h-156v612h-68q-225 0 -331 109q-52 54 -75.5 139t-23.5 217z" />
<glyph unicode="&#xb7;" horiz-adv-x="431" d="M123 468v212h185v-212h-185z" />
<glyph unicode="&#xb8;" d="M345 -258h51q80 1 119 42.5t40 129.5v47h123v-62q-1 -174 -72 -239t-193 -70h-68v152z" />
<glyph unicode="&#xb9;" horiz-adv-x="853" d="M214 932l256 256h168v-847h-137v707l-202 -202z" />
<glyph unicode="&#xba;" horiz-adv-x="783" d="M82 834q0 169 26 236q39 98 154 119q44 8 135 8q164 0 225 -51q55 -45 68 -136q11 -75 11 -171q0 -162 -27 -230q-38 -98 -153 -119q-44 -8 -129 -8q-171 0 -231 50q-55 47 -68 137q-11 73 -11 165zM212 847q0 -137 13 -183q12 -43 38 -56q33 -16 129 -16q112 0 140 24 q39 33 39 218q0 135 -13 181q-11 43 -38 56q-33 16 -131 16q-110 0 -138 -24q-39 -33 -39 -216z" />
<glyph unicode="&#xbb;" horiz-adv-x="981" d="M123 172l209 404l-187 399l120 73l222 -472l-251 -480zM507 172l209 404l-187 399l120 73l223 -472l-251 -480z" />
<glyph unicode="&#xbc;" horiz-adv-x="1946" d="M96 932l256 256h168v-847h-137v707l-202 -202zM543 0l649 1188h135l-653 -1188h-131zM1102 186v134l440 527h179v-544h129v-117h-129v-186h-137v186h-482zM1246 303h338v410z" />
<glyph unicode="&#xbd;" horiz-adv-x="1946" d="M98 932l256 256h168v-847h-137v707l-202 -202zM484 0l649 1188h135l-653 -1188h-131zM1186 0v172q0 69 13.5 110t45.5 68q45 37 126 53q23 4 138 17q153 16 178 37q29 23 29 136q0 90 -25 114q-31 29 -147 29q-184 0 -207 -34q-16 -25 -16 -90q0 -17 1 -51q0 -19 1 -30 h-136v14q2 80 4 109q14 142 120 176q79 25 225 25q184 0 252 -62q61 -56 61 -212q0 -98 -21 -148q-32 -74 -120 -103q-57 -19 -176 -29q-127 -12 -167 -29q-30 -14 -38 -63q-4 -16 -4 -84v-7h523v-118h-660z" />
<glyph unicode="&#xbe;" horiz-adv-x="1946" d="M71 630v14h135v-14v-53q0 -79 25 -103q15 -16 68 -19q37 -3 144 -3q129 0 154 28q20 23 20 120q0 88 -54 106q-24 9 -186 9l-43 -1h-14v120q39 -1 49 -1q175 0 202 17q30 18 30 95q0 62 -12 94q-12 30 -70 35q-8 0 -124 3q-94 -2 -124 -8q-36 -10 -46 -41q-6 -15 -6 -78 v-26v-24h-134l1 14q0 87 5 125q12 77 66 112q55 36 132 41q53 4 121 4q131 0 184 -13q100 -26 128 -102q16 -42 16 -109q0 -118 -39 -162q-16 -19 -42 -33q42 -18 60 -42q37 -48 37 -148q0 -142 -61 -196q-43 -38 -111 -48q-71 -10 -162 -10q-153 0 -217 20 q-105 33 -126 134q-6 28 -6 143zM578 0l649 1188h135l-653 -1188h-131zM1137 186v134l440 527h179v-544h129v-117h-129v-186h-137v186h-482zM1281 303h338v410z" />
<glyph unicode="&#xbf;" horiz-adv-x="976" d="M123 155q0 151 17 195q20 52 55 78q36 27 200 88q43 16 53 34q10 16 10 66v176h157v-192q0 -128 -65 -173q-35 -22 -173 -70q-71 -24 -90 -64q-13 -26 -13 -103q0 -135 9 -165q19 -61 86 -72q33 -6 127 -6q95 0 129 11q60 18 72 92q3 21 3 86v29h153v-37q0 -103 -12 -152 q-25 -102 -118 -141q-72 -31 -225 -31q-157 0 -229 26q-110 39 -135 141q-11 46 -11 184zM443 976v212h185v-212h-185z" />
<glyph unicode="&#xc0;" horiz-adv-x="1442" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM454 1605l34 135l375 -101l-20 -100z" />
<glyph unicode="&#xc1;" horiz-adv-x="1442" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM578 1639l375 101l34 -135l-390 -66z" />
<glyph unicode="&#xc2;" horiz-adv-x="1442" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM358 1580l367 208l358 -208l-49 -88l-309 142l-324 -142z" />
<glyph unicode="&#xc3;" horiz-adv-x="1442" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM367 1589q34 61 59 90q56 65 139 65q47 0 155 -46q104 -45 142 -45q63 0 122 92l89 -57q-97 -157 -214 -157q-52 0 -159 47q-95 42 -139 42q-38 0 -62 -26q-15 -17 -37 -58z" />
<glyph unicode="&#xc4;" horiz-adv-x="1442" d="M20 -195l571 1560h248l582 -1560h-184l-121 331h-790l-119 -331h-187zM376 276h688l-346 946zM421 1563v155h184v-155h-184zM836 1563v155h184v-155h-184z" />
<glyph unicode="&#xc5;" horiz-adv-x="1442" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM541 1655q0 78 59 132q51 46 124 46q76 0 130 -59q46 -51 46 -120q0 -80 -59 -133q-52 -46 -120 -46q-80 0 -134 59q-46 51 -46 121zM619 1654q0 -45 34 -75q28 -26 68 -26 q45 0 75 33q26 29 26 69q0 44 -34 74q-28 26 -69 26q-43 0 -74 -33q-26 -29 -26 -68z" />
<glyph unicode="&#xc6;" horiz-adv-x="1729" d="M19 0l651 1170h960v-142h-612v-357h586v-139h-586v-390h612v-142h-771v239h-522l-130 -239h-188zM414 381h445v647h-94z" />
<glyph unicode="&#xc7;" horiz-adv-x="1151" d="M94 569q0 273 13 358q21 136 143 204q76 43 203 51q62 4 225 4q154 0 215 -20q138 -45 166 -200q10 -57 10 -144q0 -10 -1 -32h-157q-1 39 -1 51q-2 142 -48 175q-40 29 -185 29q-192 0 -276 -11q-52 -7 -80.5 -29.5t-43.5 -68.5q-16 -50 -16 -166q0 -412 22 -514 q13 -66 48 -93q40 -31 130 -35q55 -2 118 -2q145 0 212.5 9.5t92.5 33.5q35 34 35 153q0 39 -2 90h159v-58q1 -145 -22 -207q-46 -127 -205 -153q-60 -10 -301 -10q-108 0 -154 4.5t-91 20.5q-176 59 -199 311q-10 116 -10 249zM409 -258h51q80 1 119 42.5t40 129.5v47h123 v-62q-1 -174 -72 -239t-193 -70h-68v152z" />
<glyph unicode="&#xc8;" horiz-adv-x="1268" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM387 1605l34 135l375 -101l-20 -100z" />
<glyph unicode="&#xc9;" horiz-adv-x="1268" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM512 1639l375 101l34 -135l-390 -66z" />
<glyph unicode="&#xca;" horiz-adv-x="1268" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM291 1580l367 208l358 -208l-49 -88l-309 142l-324 -142z" />
<glyph unicode="&#xcb;" horiz-adv-x="1268" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM355 1563v155h184v-155h-184zM770 1563v155h184v-155h-184z" />
<glyph unicode="&#xcc;" horiz-adv-x="489" d="M-19 1605l34 135l375 -101l-20 -100zM143 0v1170h159v-1170h-159z" />
<glyph unicode="&#xcd;" horiz-adv-x="489" d="M157 -195v1560h175v-1560h-175z" />
<glyph unicode="&#xce;" horiz-adv-x="445" d="M-77 1377l300 240l300 -240l-64 -80l-236 173l-235 -173zM143 0v1170h159v-1170h-159z" />
<glyph unicode="&#xcf;" horiz-adv-x="489" d="M33 1563v155h176v-155h-176zM143 0v1170h159v-1170h-159zM284 1563v155h176v-155h-176z" />
<glyph unicode="&#xd0;" horiz-adv-x="1265" d="M49 531v117h116v522h573q110 0 190 -20q121 -29 185 -149q59 -111 59 -362q0 -207 -9 -289q-25 -227 -171 -303q-55 -28 -169 -43q-31 -4 -53 -4h-605v531h-116zM324 142h386q186 0 241 66q46 55 57 186q5 57 5 166q0 199 -10 280q-18 134 -117 169q-54 19 -149 19h-413 v-380h300v-117h-300v-389z" />
<glyph unicode="&#xd1;" horiz-adv-x="1647" d="M143 0v1170h234l643 -1023v1023h159v-1170h-235l-642 1023v-1023h-159zM471 1589q34 61 59 90q56 65 139 65q47 0 155 -46q104 -45 142 -45q63 0 122 92l89 -57q-97 -157 -214 -157q-52 0 -159 47q-95 42 -139 42q-38 0 -62 -26q-15 -17 -37 -58z" />
<glyph unicode="&#xd2;" horiz-adv-x="1534" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM500 1605l34 135l375 -101l-20 -100z" />
<glyph unicode="&#xd3;" horiz-adv-x="1534" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM625 1639l375 101l34 -135l-390 -66z" />
<glyph unicode="&#xd4;" horiz-adv-x="1534" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM404 1580l367 208l358 -208l-49 -88l-309 142l-324 -142z" />
<glyph unicode="&#xd5;" horiz-adv-x="1534" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM414 1589q34 61 59 90q56 65 139 65q47 0 155 -46q104 -45 142 -45q63 0 122 92l89 -57q-97 -157 -214 -157q-52 0 -159 47q-95 42 -139 42q-38 0 -62 -26q-15 -17 -37 -58z" />
<glyph unicode="&#xd6;" horiz-adv-x="1534" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM467 1563v155h184v-155h-184zM882 1563v155h184v-155h-184z" />
<glyph unicode="&#xd7;" horiz-adv-x="1079" d="M105 235l339 338l-339 339l95 95l339 -338l339 338l95 -95l-339 -339l339 -338l-95 -95l-339 338l-339 -338z" />
<glyph unicode="&#xd8;" horiz-adv-x="1124" d="M38 -55v164l51 54q-15 39 -22 72q-18 85 -20 172q-1 65 -1 208q0 189 8 247q29 220 176 285q65 29 168 35q65 4 152 4q142 0 213 -7t118 -26q49 -19 88 -54l118 126v-164l-53 -56q19 -46 28 -87q17 -83 17 -267q0 -278 -9 -348q-15 -114 -52 -177t-110 -98 q-75 -36 -187 -41q-56 -3 -133 -3q-160 0 -226 6t-115 24q-51 20 -93 55zM204 766l1 -181q0 -230 8 -290l653 695q-31 29 -74 39q-48 11 -273 11q-145 0 -195 -15q-46 -13 -69.5 -40t-36.5 -79q-14 -60 -14 -140zM259 180q31 -29 74 -39q48 -11 272 -11q163 0 219 23 q61 24 82 111q14 61 14 140v181q0 229 -8 290z" />
<glyph unicode="&#xd9;" horiz-adv-x="1550" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM507 1605l34 135l375 -101 l-20 -100z" />
<glyph unicode="&#xda;" horiz-adv-x="1550" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM632 1639l375 101l34 -135 l-390 -66z" />
<glyph unicode="&#xdb;" horiz-adv-x="1550" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM411 1580l367 208 l358 -208l-49 -88l-309 142l-324 -142z" />
<glyph unicode="&#xdc;" horiz-adv-x="1550" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM475 1563v155h184v-155 h-184zM890 1563v155h184v-155h-184z" />
<glyph unicode="&#xdd;" horiz-adv-x="1365" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487zM541 1639l375 101l34 -135l-390 -66z" />
<glyph unicode="&#xde;" horiz-adv-x="1121" d="M143 0v1170h159v-218h365q112 0 159 -5.5t87 -23.5q146 -66 146 -336q0 -149 -40 -225q-51 -97 -160 -123q-38 -9 -212 -11h-345v-228h-159zM302 370h320q147 0 198 18q55 20 71 84q9 33 9 97q0 121 -15 168q-17 53 -78 66q-26 6 -144 7h-361v-440z" />
<glyph unicode="&#xdf;" horiz-adv-x="1112" d="M116 -80l1 952q0 196 89 265q64 49 173 57q70 5 163 5q173 0 243 -19q128 -34 164 -137q20 -57 20 -151q0 -163 -49 -222q-32 -39 -96 -59q65 -16 99 -46q68 -59 68 -227q0 -197 -77 -270q-55 -52 -143 -66q-94 -14 -218 -14h-123v140h158q175 0 215 46q31 36 31 182 q0 102 -37 141q-29 31 -79 37q-34 4 -80 4h-205v140h205q115 0 149 47q25 34 25 125q0 98 -19 148q-10 27 -32.5 39t-71.5 18q-43 4 -154 4t-159.5 -7t-71.5 -27q-36 -30 -36 -153v-952h-152z" />
<glyph unicode="&#xe0;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM311 1518l82 112l310 -234l-56 -85zM332 376h474l-239 625z" />
<glyph unicode="&#xe1;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM436 1396l309 234l83 -112l-337 -207z" />
<glyph unicode="&#xe2;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM269 1377l300 240l300 -240l-64 -80l-236 173l-235 -173zM332 376h474l-239 625z" />
<glyph unicode="&#xe3;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM253 1406q32 55 57 82q54 59 129 59q48 0 142 -44q98 -45 125 -45q45 0 88 85l91 -57q-81 -144 -180 -144q-54 0 -146 44q-89 43 -123 43q-36 0 -57 -26q-13 -15 -34 -56zM332 376h474l-239 625z" />
<glyph unicode="&#xe4;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM270 1366v155h184v-155h-184zM332 376h474l-239 625zM685 1366v155h184v-155h-184z" />
<glyph unicode="&#xe5;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM390 1468q0 77 59 132q51 46 124 46q76 0 130 -59q46 -52 46 -120q0 -81 -59 -134q-52 -46 -120 -46q-81 0 -134 59q-46 51 -46 122zM468 1467q0 -46 34 -76q28 -26 68 -26 q45 0 75 34q26 28 26 68q0 44 -34 75q-28 26 -69 26q-44 0 -74 -34q-26 -29 -26 -67z" />
<glyph unicode="&#xe6;" horiz-adv-x="1729" d="M19 0l651 1170h960v-142h-612v-357h586v-139h-586v-390h612v-142h-771v239h-522l-130 -239h-188zM414 381h445v647h-94z" />
<glyph unicode="&#xe7;" horiz-adv-x="1151" d="M94 569q0 273 13 358q21 136 143 204q76 43 203 51q62 4 225 4q154 0 215 -20q138 -45 166 -200q10 -57 10 -144q0 -10 -1 -32h-157q-1 39 -1 51q-2 142 -48 175q-40 29 -185 29q-192 0 -276 -11q-52 -7 -80.5 -29.5t-43.5 -68.5q-16 -50 -16 -166q0 -412 22 -514 q13 -66 48 -93q40 -31 130 -35q55 -2 118 -2q145 0 212.5 9.5t92.5 33.5q35 34 35 153q0 39 -2 90h159v-58q1 -145 -22 -207q-46 -127 -205 -153q-60 -10 -301 -10q-108 0 -154 4.5t-91 20.5q-176 59 -199 311q-10 116 -10 249zM409 -258h51q80 1 119 42.5t40 129.5v47h123 v-62q-1 -174 -72 -239t-193 -70h-68v152z" />
<glyph unicode="&#xe8;" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM278 1518l82 112l310 -234l-56 -85z" />
<glyph unicode="&#xe9;" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM403 1396l309 234l83 -112l-337 -207z" />
<glyph unicode="&#xea;" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM236 1377l300 240l300 -240l-64 -80l-236 173l-235 -173z" />
<glyph unicode="&#xeb;" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM237 1366v155h184v-155h-184zM652 1366v155h184v-155h-184z" />
<glyph unicode="&#xec;" horiz-adv-x="445" d="M-33 1518l82 112l310 -234l-56 -85zM143 0v1170h159v-1170h-159z" />
<glyph unicode="&#xed;" horiz-adv-x="445" d="M92 1396l309 234l83 -112l-337 -207zM143 0v1170h159v-1170h-159z" />
<glyph unicode="&#xee;" horiz-adv-x="445" d="M-77 1377l300 240l300 -240l-64 -80l-236 173l-235 -173zM143 0v1170h159v-1170h-159z" />
<glyph unicode="&#xef;" horiz-adv-x="445" d="M-13 1366v155h184v-155h-184zM143 0v1170h159v-1170h-159zM280 1366v155h184v-155h-184z" />
<glyph unicode="&#xf0;" horiz-adv-x="1265" d="M49 531v117h116v522h573q110 0 190 -20q121 -29 185 -149q59 -111 59 -362q0 -207 -9 -289q-25 -227 -171 -303q-55 -28 -169 -43q-31 -4 -53 -4h-605v531h-116zM324 142h386q186 0 241 66q46 55 57 186q5 57 5 166q0 199 -10 280q-18 134 -117 169q-54 19 -149 19h-413 v-380h300v-117h-300v-389z" />
<glyph unicode="&#xf1;" horiz-adv-x="1321" d="M143 0v1170h234l643 -1023v1023h159v-1170h-235l-642 1023v-1023h-159zM345 1406q32 55 57 82q54 59 129 59q48 0 142 -44q98 -45 125 -45q45 0 88 85l91 -57q-81 -144 -180 -144q-54 0 -146 44q-89 43 -123 43q-36 0 -57 -26q-13 -15 -34 -56z" />
<glyph unicode="&#xf2;" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM352 1518l82 112l310 -234l-56 -85z" />
<glyph unicode="&#xf3;" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM477 1396l309 234l83 -112l-337 -207z" />
<glyph unicode="&#xf4;" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM310 1377l300 240l300 -240l-64 -80l-236 173l-235 -173z" />
<glyph unicode="&#xf5;" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM294 1406q32 55 57 82q54 59 129 59q48 0 142 -44q98 -45 125 -45q45 0 88 85l91 -57q-81 -144 -180 -144q-54 0 -146 44q-89 43 -123 43q-36 0 -57 -26q-13 -15 -34 -56z" />
<glyph unicode="&#xf6;" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM311 1366v155h184v-155h-184zM726 1366v155h184v-155h-184z" />
<glyph unicode="&#xf7;" horiz-adv-x="1079" d="M66 509v129h946v-129h-946zM447 241q0 39 30 68q26 24 64 24q40 0 67 -31q24 -26 24 -61q0 -41 -31 -69q-26 -24 -61 -24q-41 0 -69 31q-24 26 -24 62zM447 908q0 39 30 68q26 24 64 24q40 0 67 -31q24 -27 24 -61q0 -41 -31 -69q-26 -24 -61 -24q-41 0 -69 31 q-24 27 -24 62z" />
<glyph unicode="&#xf8;" horiz-adv-x="1124" d="M38 -55v164l51 54q-15 39 -22 72q-18 85 -20 172q-1 65 -1 208q0 189 8 247q29 220 176 285q65 29 168 35q65 4 152 4q142 0 213 -7t118 -26q49 -19 88 -54l118 126v-164l-53 -56q19 -46 28 -87q17 -83 17 -267q0 -278 -9 -348q-15 -114 -52 -177t-110 -98 q-75 -36 -187 -41q-56 -3 -133 -3q-160 0 -226 6t-115 24q-51 20 -93 55zM204 766l1 -181q0 -230 8 -290l653 695q-31 29 -74 39q-48 11 -273 11q-145 0 -195 -15q-46 -13 -69.5 -40t-36.5 -79q-14 -60 -14 -140zM259 180q31 -29 74 -39q48 -11 272 -11q163 0 219 23 q61 24 82 111q14 61 14 140v181q0 229 -8 290z" />
<glyph unicode="&#xf9;" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM366 1518l82 112l310 -234 l-56 -85z" />
<glyph unicode="&#xfa;" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM491 1396l309 234l83 -112 l-337 -207z" />
<glyph unicode="&#xfb;" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM324 1377l300 240 l300 -240l-64 -80l-236 173l-235 -173z" />
<glyph unicode="&#xfc;" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM325 1366v155h184v-155 h-184zM740 1366v155h184v-155h-184z" />
<glyph unicode="&#xfd;" horiz-adv-x="1068" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487zM400 1396l309 234l83 -112l-337 -207z" />
<glyph unicode="&#xfe;" horiz-adv-x="1121" d="M143 0v1170h159v-218h365q112 0 159 -5.5t87 -23.5q146 -66 146 -336q0 -149 -40 -225q-51 -97 -160 -123q-38 -9 -212 -11h-345v-228h-159zM302 370h320q147 0 198 18q55 20 71 84q9 33 9 97q0 121 -15 168q-17 53 -78 66q-26 6 -144 7h-361v-440z" />
<glyph unicode="&#xff;" horiz-adv-x="1068" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487zM234 1366v155h184v-155h-184zM649 1366v155h184v-155h-184z" />
<glyph unicode="&#x152;" horiz-adv-x="1820" d="M94 443q0 159 1 293q1 194 50 284q66 124 233 154q64 12 192 12q195 0 268 -24q50 -18 113 -78v86h770v-142h-616v-354h591v-139h-591v-393h616v-142h-771l2 85q-78 -68 -140 -86q-52 -15 -202 -15q-197 0 -257 11q-97 19 -160.5 84.5t-84.5 169.5q-14 72 -14 194z M254 435q0 -154 32 -223q30 -67 135 -80q44 -6 170 -6q175 0 228 14q85 23 108 102q16 58 16 156v355q0 132 -25 200q-14 37 -43 56t-87 27q-65 9 -268 9q-164 0 -213 -52q-49 -53 -52 -253q-1 -91 -1 -305z" />
<glyph unicode="&#x153;" horiz-adv-x="1820" d="M94 443q0 159 1 293q1 194 50 284q66 124 233 154q64 12 192 12q195 0 268 -24q50 -18 113 -78v86h770v-142h-616v-354h591v-139h-591v-393h616v-142h-771l2 85q-78 -68 -140 -86q-52 -15 -202 -15q-197 0 -257 11q-97 19 -160.5 84.5t-84.5 169.5q-14 72 -14 194z M254 435q0 -154 32 -223q30 -67 135 -80q44 -6 170 -6q175 0 228 14q85 23 108 102q16 58 16 156v355q0 132 -25 200q-14 37 -43 56t-87 27q-65 9 -268 9q-164 0 -213 -52q-49 -53 -52 -253q-1 -91 -1 -305z" />
<glyph unicode="&#x178;" horiz-adv-x="1365" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487zM383 1563v155h184v-155h-184zM798 1563v155h184v-155h-184z" />
<glyph unicode="&#x2c6;" d="M212 1377l300 240l300 -240l-64 -80l-236 173l-235 -173z" />
<glyph unicode="&#x2dc;" d="M196 1406q32 55 57 82q54 59 129 59q48 0 142 -44q98 -45 125 -45q45 0 88 85l91 -57q-81 -144 -180 -144q-54 0 -146 44q-89 43 -123 43q-36 0 -57 -26q-13 -15 -34 -56z" />
<glyph unicode="&#x2000;" horiz-adv-x="916" />
<glyph unicode="&#x2001;" horiz-adv-x="1833" />
<glyph unicode="&#x2002;" horiz-adv-x="916" />
<glyph unicode="&#x2003;" horiz-adv-x="1833" />
<glyph unicode="&#x2004;" horiz-adv-x="611" />
<glyph unicode="&#x2005;" horiz-adv-x="458" />
<glyph unicode="&#x2006;" horiz-adv-x="305" />
<glyph unicode="&#x2007;" horiz-adv-x="305" />
<glyph unicode="&#x2008;" horiz-adv-x="229" />
<glyph unicode="&#x2009;" horiz-adv-x="366" />
<glyph unicode="&#x200a;" horiz-adv-x="101" />
<glyph unicode="&#x2010;" horiz-adv-x="513" d="M20 493v152h473v-152h-473z" />
<glyph unicode="&#x2011;" horiz-adv-x="513" d="M20 493v152h473v-152h-473z" />
<glyph unicode="&#x2012;" horiz-adv-x="513" d="M20 493v152h473v-152h-473z" />
<glyph unicode="&#x2013;" horiz-adv-x="1109" d="M96 493v152h918v-152h-918z" />
<glyph unicode="&#x2014;" horiz-adv-x="1647" d="M14 493l11 152h1609v-152h-1620z" />
<glyph unicode="&#x2018;" horiz-adv-x="454" d="M123 956v228q0 111 26 151q39 62 132 62q18 0 50 -3v-87q-53 -3 -74 -20q-28 -21 -28 -77q0 -14 1 -43h79v-211h-186z" />
<glyph unicode="&#x2019;" horiz-adv-x="454" d="M123 925v88q54 3 75 19q28 21 28 76q0 16 -2 45h-78v212h185v-229q0 -111 -26 -151q-39 -62 -133 -62q-18 0 -49 2z" />
<glyph unicode="&#x201a;" horiz-adv-x="454" d="M123 -140q53 3 75 19q28 21 28 76q0 15 -2 45h-78v212h185v-228q0 -111 -26 -152q-38 -62 -133 -62q-18 0 -49 2v88z" />
<glyph unicode="&#x201c;" horiz-adv-x="782" d="M123 956v228q0 111 26 151q39 62 132 62q18 0 50 -3v-87q-53 -3 -74 -20q-28 -21 -28 -77q0 -14 1 -43h79v-211h-186zM451 956v228q0 110 25 151q39 62 132 62q19 0 51 -3v-87q-53 -3 -75 -20q-28 -21 -28 -75q0 -15 2 -45h78v-211h-185z" />
<glyph unicode="&#x201d;" horiz-adv-x="782" d="M123 925v88q54 3 75 19q28 21 28 76q0 16 -2 45h-78v212h185v-229q0 -111 -26 -151q-39 -62 -133 -62q-18 0 -49 2zM451 925v88q54 3 75 19q28 22 28 77q0 15 -2 44h-78v212h185v-229q0 -111 -26 -151q-38 -62 -132 -62q-19 0 -50 2z" />
<glyph unicode="&#x201e;" horiz-adv-x="782" d="M123 -140q53 3 75 19q28 21 28 76q0 15 -2 45h-78v212h185v-228q0 -111 -26 -152q-38 -62 -133 -62q-18 0 -49 2v88zM451 -140q53 3 75 19q28 22 28 77q0 15 -2 44h-78v212h185v-228q0 -111 -26 -152q-38 -62 -133 -62q-18 0 -49 2v88z" />
<glyph unicode="&#x2022;" horiz-adv-x="1365" d="M401 570q0 121 84 202q85 83 204 83q113 0 196 -83q84 -83 84 -201t-84 -201q-82 -83 -200 -83t-200 83q-84 83 -84 200z" />
<glyph unicode="&#x2026;" horiz-adv-x="1292" d="M123 0v212h185v-212h-185zM554 0v212h185v-212h-185zM985 0v212h185v-212h-185z" />
<glyph unicode="&#x202f;" horiz-adv-x="366" />
<glyph unicode="&#x2039;" horiz-adv-x="597" d="M109 600l223 473l120 -74l-188 -399l209 -404l-113 -75z" />
<glyph unicode="&#x203a;" horiz-adv-x="597" d="M123 172l209 404l-187 399l120 73l222 -472l-251 -480z" />
<glyph unicode="&#x205f;" horiz-adv-x="458" />
<glyph unicode="&#x20ac;" horiz-adv-x="1011" d="M98 457l29 108h81v101h-108l27 109h88q1 87 11 175q24 185 144 260q79 52 216 54t281 -48l-65 -118q-57 18 -126 29t-147 3q-58 -12 -87 -47t-44 -86q-17 -56 -22 -221h394l-35 -108h-361v-103h320l-39 -111h-281q3 -118 21 -208q24 -84 68 -119t129 -40q74 -1 123 7.5 t117 45.5l80 -115q-122 -63 -268 -67t-221 26q-175 66 -201 322q-8 74 -7 151h-117z" />
<glyph unicode="&#x2122;" horiz-adv-x="1766" d="M127 1257v108h565v-108h-222v-670h-119v670h-224zM829 587v778h171l232 -605l232 605h174v-778h-120v591l-227 -591h-115l-228 591v-591h-119z" />
<glyph unicode="&#x25fc;" horiz-adv-x="1170" d="M0 0v1170h1170v-1170h-1170z" />
<hkern u1="&#x2c;" u2="&#x201d;" k="69" />
<hkern u1="&#x2c;" u2="&#x2019;" k="69" />
<hkern u1="&#x2c;" u2="&#x31;" k="154" />
<hkern u1="&#x2d;" u2="Y" k="123" />
<hkern u1="&#x2d;" u2="W" k="26" />
<hkern u1="&#x2d;" u2="V" k="42" />
<hkern u1="&#x2d;" u2="T" k="168" />
<hkern u1="&#x2d;" u2="A" k="33" />
<hkern u1="&#x2e;" u2="&#x201d;" k="70" />
<hkern u1="&#x2e;" u2="&#x2019;" k="70" />
<hkern u1="&#x2e;" u2="&#x31;" k="154" />
<hkern u1="&#x30;" u2="&#x37;" k="15" />
<hkern u1="&#x30;" u2="&#x34;" k="-15" />
<hkern u1="&#x30;" u2="&#x31;" k="-28" />
<hkern u1="&#x31;" u2="&#x39;" k="36" />
<hkern u1="&#x31;" u2="&#x38;" k="37" />
<hkern u1="&#x31;" u2="&#x37;" k="31" />
<hkern u1="&#x31;" u2="&#x36;" k="34" />
<hkern u1="&#x31;" u2="&#x35;" k="43" />
<hkern u1="&#x31;" u2="&#x34;" k="17" />
<hkern u1="&#x31;" u2="&#x33;" k="35" />
<hkern u1="&#x31;" u2="&#x32;" k="30" />
<hkern u1="&#x31;" u2="&#x31;" k="4" />
<hkern u1="&#x31;" u2="&#x30;" k="29" />
<hkern u1="&#x31;" u2="&#x2e;" k="34" />
<hkern u1="&#x31;" u2="&#x2c;" k="46" />
<hkern u1="&#x32;" u2="&#x37;" k="10" />
<hkern u1="&#x32;" u2="&#x34;" k="40" />
<hkern u1="&#x32;" u2="&#x31;" k="-29" />
<hkern u1="&#x33;" u2="&#x37;" k="23" />
<hkern u1="&#x33;" u2="&#x34;" k="-8" />
<hkern u1="&#x33;" u2="&#x31;" k="-10" />
<hkern u1="&#x34;" u2="&#x37;" k="66" />
<hkern u1="&#x34;" u2="&#x34;" k="-34" />
<hkern u1="&#x34;" u2="&#x31;" k="39" />
<hkern u1="&#x35;" u2="&#x37;" k="26" />
<hkern u1="&#x35;" u2="&#x34;" k="-12" />
<hkern u1="&#x35;" u2="&#x31;" k="47" />
<hkern u1="&#x36;" u2="&#x37;" k="22" />
<hkern u1="&#x36;" u2="&#x34;" k="-13" />
<hkern u1="&#x36;" u2="&#x31;" k="-2" />
<hkern u1="&#x37;" u2="&#x3a;" k="13" />
<hkern u1="&#x37;" u2="&#x38;" k="17" />
<hkern u1="&#x37;" u2="&#x37;" k="-2" />
<hkern u1="&#x37;" u2="&#x36;" k="19" />
<hkern u1="&#x37;" u2="&#x35;" k="24" />
<hkern u1="&#x37;" u2="&#x34;" k="135" />
<hkern u1="&#x37;" u2="&#x33;" k="15" />
<hkern u1="&#x37;" u2="&#x32;" k="11" />
<hkern u1="&#x37;" u2="&#x31;" k="13" />
<hkern u1="&#x37;" u2="&#x2e;" k="218" />
<hkern u1="&#x37;" u2="&#x2c;" k="226" />
<hkern u1="&#x38;" u2="&#x37;" k="13" />
<hkern u1="&#x38;" u2="&#x34;" k="-14" />
<hkern u1="&#x38;" u2="&#x31;" k="-20" />
<hkern u1="&#x39;" u2="&#x37;" k="20" />
<hkern u1="&#x39;" u2="&#x34;" k="-10" />
<hkern u1="&#x39;" u2="&#x31;" k="-21" />
<hkern u1="A" u2="&#x2039;" k="110" />
<hkern u1="A" u2="&#x201d;" k="170" />
<hkern u1="A" u2="&#x2019;" k="170" />
<hkern u1="A" u2="&#xe7;" k="52" />
<hkern u1="A" u2="&#xc7;" k="30" />
<hkern u1="A" u2="&#xab;" k="106" />
<hkern u1="A" u2="y" k="169" />
<hkern u1="A" u2="w" k="137" />
<hkern u1="A" u2="v" k="153" />
<hkern u1="A" u2="u" k="65" />
<hkern u1="A" u2="t" k="159" />
<hkern u1="A" u2="q" k="50" />
<hkern u1="A" u2="o" k="51" />
<hkern u1="A" u2="g" k="47" />
<hkern u1="A" u2="e" k="24" />
<hkern u1="A" u2="d" k="24" />
<hkern u1="A" u2="c" k="52" />
<hkern u1="A" u2="b" k="24" />
<hkern u1="A" u2="a" k="-36" />
<hkern u1="A" u2="Y" k="208" />
<hkern u1="A" u2="W" k="166" />
<hkern u1="A" u2="V" k="190" />
<hkern u1="A" u2="U" k="44" />
<hkern u1="A" u2="T" k="193" />
<hkern u1="A" u2="Q" k="30" />
<hkern u1="A" u2="O" k="30" />
<hkern u1="A" u2="G" k="26" />
<hkern u1="A" u2="C" k="30" />
<hkern u1="A" u2="&#x2e;" k="10" />
<hkern u1="A" u2="&#x2d;" k="36" />
<hkern u1="A" u2="&#x2c;" k="21" />
<hkern u1="B" u2="&#xd8;" k="-14" />
<hkern u1="B" u2="Y" k="39" />
<hkern u1="B" u2="W" k="24" />
<hkern u1="B" u2="V" k="28" />
<hkern u1="B" u2="A" k="9" />
<hkern u1="C" u2="O" k="-6" />
<hkern u1="C" u2="K" k="19" />
<hkern u1="C" u2="H" k="19" />
<hkern u1="C" u2="A" k="2" />
<hkern u1="D" u2="Y" k="57" />
<hkern u1="D" u2="X" k="70" />
<hkern u1="D" u2="W" k="29" />
<hkern u1="D" u2="V" k="36" />
<hkern u1="D" u2="T" k="27" />
<hkern u1="D" u2="J" k="-15" />
<hkern u1="D" u2="A" k="36" />
<hkern u1="F" u2="&#x153;" k="-8" />
<hkern u1="F" u2="&#xf8;" k="-31" />
<hkern u1="F" u2="&#xf6;" k="-8" />
<hkern u1="F" u2="&#xf3;" k="-8" />
<hkern u1="F" u2="&#xe9;" k="16" />
<hkern u1="F" u2="&#xe6;" k="99" />
<hkern u1="F" u2="&#xe5;" k="54" />
<hkern u1="F" u2="&#xe4;" k="54" />
<hkern u1="F" u2="&#xe1;" k="54" />
<hkern u1="F" u2="u" k="16" />
<hkern u1="F" u2="r" k="16" />
<hkern u1="F" u2="o" k="-8" />
<hkern u1="F" u2="j" k="2" />
<hkern u1="F" u2="i" k="16" />
<hkern u1="F" u2="e" k="16" />
<hkern u1="F" u2="a" k="54" />
<hkern u1="F" u2="O" k="-8" />
<hkern u1="F" u2="J" k="35" />
<hkern u1="F" u2="A" k="81" />
<hkern u1="F" u2="&#x2e;" k="119" />
<hkern u1="F" u2="&#x2d;" k="-52" />
<hkern u1="F" u2="&#x2c;" k="121" />
<hkern u1="G" u2="Y" k="15" />
<hkern u1="G" u2="W" k="2" />
<hkern u1="G" u2="V" k="6" />
<hkern u1="G" u2="T" k="-9" />
<hkern u1="G" u2="A" k="18" />
<hkern u1="J" u2="A" k="40" />
<hkern u1="K" u2="&#x152;" k="79" />
<hkern u1="K" u2="&#xfc;" k="95" />
<hkern u1="K" u2="&#xf6;" k="135" />
<hkern u1="K" u2="&#xf3;" k="135" />
<hkern u1="K" u2="&#xe6;" k="12" />
<hkern u1="K" u2="&#xe5;" k="12" />
<hkern u1="K" u2="&#xe4;" k="12" />
<hkern u1="K" u2="y" k="46" />
<hkern u1="K" u2="u" k="105" />
<hkern u1="K" u2="o" k="135" />
<hkern u1="K" u2="e" k="74" />
<hkern u1="K" u2="a" k="12" />
<hkern u1="K" u2="T" k="-36" />
<hkern u1="K" u2="S" k="56" />
<hkern u1="K" u2="O" k="79" />
<hkern u1="K" u2="G" k="78" />
<hkern u1="K" u2="C" k="78" />
<hkern u1="K" u2="&#x2d;" k="198" />
<hkern u1="L" u2="&#x201d;" k="371" />
<hkern u1="L" u2="&#x2019;" k="371" />
<hkern u1="L" u2="&#xfc;" k="385" />
<hkern u1="L" u2="&#xc7;" k="367" />
<hkern u1="L" u2="y" k="329" />
<hkern u1="L" u2="u" k="385" />
<hkern u1="L" u2="Y" k="330" />
<hkern u1="L" u2="W" k="336" />
<hkern u1="L" u2="V" k="336" />
<hkern u1="L" u2="U" k="382" />
<hkern u1="L" u2="T" k="345" />
<hkern u1="L" u2="S" k="369" />
<hkern u1="L" u2="O" k="368" />
<hkern u1="L" u2="G" k="367" />
<hkern u1="L" u2="C" k="367" />
<hkern u1="L" u2="A" k="369" />
<hkern u1="L" u2="&#x2d;" k="314" />
<hkern u1="N" u2="&#xfc;" k="37" />
<hkern u1="N" u2="&#xf8;" k="-8" />
<hkern u1="N" u2="&#xf6;" k="21" />
<hkern u1="N" u2="&#xf3;" k="21" />
<hkern u1="N" u2="&#xe9;" k="32" />
<hkern u1="N" u2="&#xe6;" k="-7" />
<hkern u1="N" u2="&#xe5;" k="-6" />
<hkern u1="N" u2="&#xe4;" k="-6" />
<hkern u1="N" u2="&#xe1;" k="-6" />
<hkern u1="N" u2="&#xc7;" k="19" />
<hkern u1="N" u2="u" k="37" />
<hkern u1="N" u2="o" k="21" />
<hkern u1="N" u2="e" k="32" />
<hkern u1="N" u2="a" k="-6" />
<hkern u1="N" u2="O" k="20" />
<hkern u1="N" u2="G" k="19" />
<hkern u1="N" u2="C" k="19" />
<hkern u1="N" u2="A" k="26" />
<hkern u1="N" u2="&#x2e;" k="27" />
<hkern u1="N" u2="&#x2c;" k="38" />
<hkern u1="O" u2="Y" k="38" />
<hkern u1="O" u2="X" k="62" />
<hkern u1="O" u2="W" k="19" />
<hkern u1="O" u2="V" k="25" />
<hkern u1="O" u2="T" k="10" />
<hkern u1="O" u2="A" k="30" />
<hkern u1="P" u2="&#x153;" k="-12" />
<hkern u1="P" u2="&#xf8;" k="-36" />
<hkern u1="P" u2="&#xf6;" k="-12" />
<hkern u1="P" u2="&#xf3;" k="-12" />
<hkern u1="P" u2="&#xe9;" k="9" />
<hkern u1="P" u2="&#xe6;" k="132" />
<hkern u1="P" u2="&#xe5;" k="82" />
<hkern u1="P" u2="&#xe4;" k="82" />
<hkern u1="P" u2="&#xe1;" k="82" />
<hkern u1="P" u2="o" k="-12" />
<hkern u1="P" u2="e" k="9" />
<hkern u1="P" u2="a" k="82" />
<hkern u1="P" u2="J" k="72" />
<hkern u1="P" u2="A" k="109" />
<hkern u1="P" u2="&#x2e;" k="156" />
<hkern u1="P" u2="&#x2d;" k="-44" />
<hkern u1="P" u2="&#x2c;" k="158" />
<hkern u1="R" u2="&#x153;" k="14" />
<hkern u1="R" u2="&#x152;" k="14" />
<hkern u1="R" u2="&#xfc;" k="37" />
<hkern u1="R" u2="&#xfa;" k="37" />
<hkern u1="R" u2="&#xf6;" k="15" />
<hkern u1="R" u2="&#xf3;" k="15" />
<hkern u1="R" u2="&#xe9;" k="31" />
<hkern u1="R" u2="&#xe6;" k="-13" />
<hkern u1="R" u2="&#xe5;" k="-12" />
<hkern u1="R" u2="&#xe4;" k="-12" />
<hkern u1="R" u2="&#xe1;" k="-12" />
<hkern u1="R" u2="&#xc7;" k="13" />
<hkern u1="R" u2="y" k="-14" />
<hkern u1="R" u2="u" k="37" />
<hkern u1="R" u2="o" k="15" />
<hkern u1="R" u2="e" k="30" />
<hkern u1="R" u2="a" k="-12" />
<hkern u1="R" u2="Y" k="39" />
<hkern u1="R" u2="W" k="19" />
<hkern u1="R" u2="V" k="24" />
<hkern u1="R" u2="U" k="39" />
<hkern u1="R" u2="T" k="10" />
<hkern u1="R" u2="O" k="13" />
<hkern u1="R" u2="G" k="13" />
<hkern u1="R" u2="C" k="13" />
<hkern u1="R" u2="&#x2d;" k="-14" />
<hkern u1="S" u2="t" k="-14" />
<hkern u1="S" u2="Y" k="24" />
<hkern u1="S" u2="W" k="11" />
<hkern u1="S" u2="V" k="15" />
<hkern u1="S" u2="A" k="10" />
<hkern u1="T" u2="&#x2039;" k="231" />
<hkern u1="T" u2="&#x152;" k="9" />
<hkern u1="T" u2="&#xf8;" k="85" />
<hkern u1="T" u2="&#xe6;" k="189" />
<hkern u1="T" u2="&#xd8;" k="3" />
<hkern u1="T" u2="&#xab;" k="231" />
<hkern u1="T" u2="y" k="183" />
<hkern u1="T" u2="w" k="189" />
<hkern u1="T" u2="v" k="189" />
<hkern u1="T" u2="u" k="239" />
<hkern u1="T" u2="s" k="223" />
<hkern u1="T" u2="r" k="229" />
<hkern u1="T" u2="o" k="225" />
<hkern u1="T" u2="j" k="208" />
<hkern u1="T" u2="i" k="229" />
<hkern u1="T" u2="g" k="224" />
<hkern u1="T" u2="e" k="229" />
<hkern u1="T" u2="c" k="225" />
<hkern u1="T" u2="a" k="190" />
<hkern u1="T" u2="Y" k="-67" />
<hkern u1="T" u2="W" k="-61" />
<hkern u1="T" u2="V" k="-61" />
<hkern u1="T" u2="S" k="-6" />
<hkern u1="T" u2="O" k="9" />
<hkern u1="T" u2="J" k="206" />
<hkern u1="T" u2="G" k="9" />
<hkern u1="T" u2="C" k="3" />
<hkern u1="T" u2="A" k="188" />
<hkern u1="T" u2="&#x3b;" k="243" />
<hkern u1="T" u2="&#x3a;" k="237" />
<hkern u1="T" u2="&#x2e;" k="226" />
<hkern u1="T" u2="&#x2d;" k="168" />
<hkern u1="T" u2="&#x2c;" k="236" />
<hkern u1="U" u2="r" k="34" />
<hkern u1="U" u2="p" k="34" />
<hkern u1="U" u2="n" k="34" />
<hkern u1="U" u2="m" k="34" />
<hkern u1="U" u2="A" k="44" />
<hkern u1="U" u2="&#x2e;" k="32" />
<hkern u1="U" u2="&#x2c;" k="43" />
<hkern u1="V" u2="&#x2039;" k="99" />
<hkern u1="V" u2="&#xf8;" k="19" />
<hkern u1="V" u2="&#xe6;" k="166" />
<hkern u1="V" u2="&#xd8;" k="16" />
<hkern u1="V" u2="&#xab;" k="103" />
<hkern u1="V" u2="y" k="-41" />
<hkern u1="V" u2="u" k="22" />
<hkern u1="V" u2="r" k="26" />
<hkern u1="V" u2="o" k="43" />
<hkern u1="V" u2="i" k="26" />
<hkern u1="V" u2="g" k="41" />
<hkern u1="V" u2="e" k="26" />
<hkern u1="V" u2="a" k="154" />
<hkern u1="V" u2="T" k="-62" />
<hkern u1="V" u2="S" k="8" />
<hkern u1="V" u2="O" k="24" />
<hkern u1="V" u2="G" k="22" />
<hkern u1="V" u2="C" k="18" />
<hkern u1="V" u2="A" k="185" />
<hkern u1="V" u2="&#x3b;" k="28" />
<hkern u1="V" u2="&#x3a;" k="26" />
<hkern u1="V" u2="&#x2e;" k="163" />
<hkern u1="V" u2="&#x2d;" k="42" />
<hkern u1="V" u2="&#x2c;" k="173" />
<hkern u1="W" u2="&#x2039;" k="87" />
<hkern u1="W" u2="&#xf8;" k="14" />
<hkern u1="W" u2="&#xe6;" k="142" />
<hkern u1="W" u2="&#xd8;" k="14" />
<hkern u1="W" u2="&#xab;" k="90" />
<hkern u1="W" u2="y" k="-44" />
<hkern u1="W" u2="u" k="20" />
<hkern u1="W" u2="r" k="23" />
<hkern u1="W" u2="o" k="38" />
<hkern u1="W" u2="i" k="23" />
<hkern u1="W" u2="g" k="37" />
<hkern u1="W" u2="e" k="23" />
<hkern u1="W" u2="a" k="141" />
<hkern u1="W" u2="T" k="-60" />
<hkern u1="W" u2="S" k="7" />
<hkern u1="W" u2="O" k="21" />
<hkern u1="W" u2="G" k="21" />
<hkern u1="W" u2="C" k="15" />
<hkern u1="W" u2="A" k="172" />
<hkern u1="W" u2="&#x3b;" k="24" />
<hkern u1="W" u2="&#x3a;" k="22" />
<hkern u1="W" u2="&#x2e;" k="143" />
<hkern u1="W" u2="&#x2d;" k="31" />
<hkern u1="W" u2="&#x2c;" k="154" />
<hkern u1="X" u2="y" k="3" />
<hkern u1="X" u2="u" k="63" />
<hkern u1="X" u2="o" k="97" />
<hkern u1="X" u2="e" k="50" />
<hkern u1="X" u2="a" k="-10" />
<hkern u1="X" u2="Q" k="57" />
<hkern u1="X" u2="O" k="58" />
<hkern u1="X" u2="C" k="54" />
<hkern u1="X" u2="&#x2d;" k="118" />
<hkern u1="Y" u2="&#x2039;" k="163" />
<hkern u1="Y" u2="&#xf8;" k="57" />
<hkern u1="Y" u2="&#xe6;" k="215" />
<hkern u1="Y" u2="&#xd8;" k="31" />
<hkern u1="Y" u2="&#xab;" k="170" />
<hkern u1="Y" u2="v" k="-12" />
<hkern u1="Y" u2="u" k="43" />
<hkern u1="Y" u2="p" k="49" />
<hkern u1="Y" u2="o" k="80" />
<hkern u1="Y" u2="i" k="49" />
<hkern u1="Y" u2="g" k="78" />
<hkern u1="Y" u2="e" k="49" />
<hkern u1="Y" u2="a" k="204" />
<hkern u1="Y" u2="T" k="-67" />
<hkern u1="Y" u2="S" k="16" />
<hkern u1="Y" u2="O" k="39" />
<hkern u1="Y" u2="G" k="37" />
<hkern u1="Y" u2="C" k="34" />
<hkern u1="Y" u2="A" k="198" />
<hkern u1="Y" u2="&#x3b;" k="62" />
<hkern u1="Y" u2="&#x3a;" k="62" />
<hkern u1="Y" u2="&#x2e;" k="251" />
<hkern u1="Y" u2="&#x2d;" k="129" />
<hkern u1="Y" u2="&#x2c;" k="262" />
<hkern u1="Z" u2="y" k="-19" />
<hkern u1="Z" u2="v" k="-13" />
<hkern u1="a" u2="&#x2019;" k="143" />
<hkern u1="a" u2="y" k="144" />
<hkern u1="a" u2="w" k="104" />
<hkern u1="a" u2="v" k="121" />
<hkern u1="a" u2="j" k="-16" />
<hkern u1="b" u2="y" k="16" />
<hkern u1="b" u2="w" k="6" />
<hkern u1="b" u2="v" k="10" />
<hkern u1="c" u2="k" k="18" />
<hkern u1="c" u2="h" k="18" />
<hkern u1="e" u2="&#x2019;" k="14" />
<hkern u1="e" u2="y" k="-39" />
<hkern u1="e" u2="x" k="-42" />
<hkern u1="e" u2="w" k="-33" />
<hkern u1="e" u2="v" k="-33" />
<hkern u1="e" u2="t" k="-23" />
<hkern u1="f" u2="&#x2019;" k="-6" />
<hkern u1="f" u2="&#x153;" k="-9" />
<hkern u1="f" u2="&#xf8;" k="-33" />
<hkern u1="f" u2="&#xf6;" k="-9" />
<hkern u1="f" u2="&#xf3;" k="-9" />
<hkern u1="f" u2="&#xe9;" k="8" />
<hkern u1="f" u2="&#xe6;" k="98" />
<hkern u1="f" u2="&#xe5;" k="53" />
<hkern u1="f" u2="&#xe4;" k="53" />
<hkern u1="f" u2="&#xe1;" k="53" />
<hkern u1="f" u2="t" k="-44" />
<hkern u1="f" u2="s" k="-8" />
<hkern u1="f" u2="o" k="-9" />
<hkern u1="f" u2="l" k="8" />
<hkern u1="f" u2="j" k="1" />
<hkern u1="f" u2="i" k="8" />
<hkern u1="f" u2="f" k="8" />
<hkern u1="f" u2="e" k="8" />
<hkern u1="f" u2="a" k="53" />
<hkern u1="g" u2="&#xf6;" k="1" />
<hkern u1="g" u2="&#xf3;" k="1" />
<hkern u1="g" u2="&#xe9;" k="17" />
<hkern u1="g" u2="&#xe6;" k="20" />
<hkern u1="g" u2="&#xe5;" k="9" />
<hkern u1="g" u2="&#xe4;" k="9" />
<hkern u1="g" u2="r" k="16" />
<hkern u1="g" u2="l" k="16" />
<hkern u1="g" u2="e" k="16" />
<hkern u1="g" u2="a" k="9" />
<hkern u1="h" u2="&#x2019;" k="16" />
<hkern u1="h" u2="y" k="-16" />
<hkern u1="i" u2="j" k="7" />
<hkern u1="i" u2="T" k="231" />
<hkern u1="k" u2="&#xfc;" k="9" />
<hkern u1="k" u2="&#xf6;" k="44" />
<hkern u1="k" u2="&#xf3;" k="44" />
<hkern u1="k" u2="&#xe9;" k="-16" />
<hkern u1="k" u2="&#xe6;" k="-78" />
<hkern u1="k" u2="&#xe5;" k="-78" />
<hkern u1="k" u2="&#xe4;" k="-78" />
<hkern u1="k" u2="&#xe1;" k="-78" />
<hkern u1="k" u2="u" k="9" />
<hkern u1="k" u2="s" k="24" />
<hkern u1="k" u2="o" k="44" />
<hkern u1="k" u2="g" k="40" />
<hkern u1="k" u2="e" k="-16" />
<hkern u1="k" u2="a" k="-78" />
<hkern u1="k" u2="&#x2e;" k="-31" />
<hkern u1="k" u2="&#x2d;" k="109" />
<hkern u1="k" u2="&#x2c;" k="-20" />
<hkern u1="l" u2="y" k="151" />
<hkern u1="l" u2="v" k="122" />
<hkern u1="m" u2="y" k="-15" />
<hkern u1="m" u2="w" k="-9" />
<hkern u1="m" u2="v" k="-9" />
<hkern u1="m" u2="p" k="27" />
<hkern u1="n" u2="&#x2019;" k="15" />
<hkern u1="n" u2="y" k="-16" />
<hkern u1="n" u2="w" k="-11" />
<hkern u1="n" u2="v" k="-11" />
<hkern u1="n" u2="p" k="25" />
<hkern u1="n" u2="T" k="231" />
<hkern u1="o" u2="&#x2019;" k="13" />
<hkern u1="o" u2="y" k="15" />
<hkern u1="o" u2="x" k="32" />
<hkern u1="o" u2="w" k="2" />
<hkern u1="o" u2="v" k="6" />
<hkern u1="o" u2="t" k="-6" />
<hkern u1="o" u2="T" k="227" />
<hkern u1="p" u2="y" k="-6" />
<hkern u1="p" u2="t" k="-26" />
<hkern u1="q" u2="u" k="-9" />
<hkern u1="q" u2="c" k="-22" />
<hkern u1="r" u2="&#x2019;" k="15" />
<hkern u1="r" u2="&#x153;" k="12" />
<hkern u1="r" u2="&#xf8;" k="-18" />
<hkern u1="r" u2="&#xf6;" k="12" />
<hkern u1="r" u2="&#xf4;" k="12" />
<hkern u1="r" u2="&#xf3;" k="12" />
<hkern u1="r" u2="&#xf2;" k="12" />
<hkern u1="r" u2="&#xea;" k="22" />
<hkern u1="r" u2="&#xe9;" k="22" />
<hkern u1="r" u2="&#xe8;" k="22" />
<hkern u1="r" u2="&#xe7;" k="12" />
<hkern u1="r" u2="&#xe6;" k="-19" />
<hkern u1="r" u2="&#xe5;" k="-18" />
<hkern u1="r" u2="&#xe4;" k="-18" />
<hkern u1="r" u2="&#xe2;" k="-18" />
<hkern u1="r" u2="&#xe1;" k="-18" />
<hkern u1="r" u2="&#xe0;" k="-18" />
<hkern u1="r" u2="z" k="2" />
<hkern u1="r" u2="y" k="19" />
<hkern u1="r" u2="x" k="-28" />
<hkern u1="r" u2="w" k="5" />
<hkern u1="r" u2="v" k="9" />
<hkern u1="r" u2="u" k="30" />
<hkern u1="r" u2="t" k="-3" />
<hkern u1="r" u2="s" k="11" />
<hkern u1="r" u2="r" k="22" />
<hkern u1="r" u2="q" k="12" />
<hkern u1="r" u2="p" k="22" />
<hkern u1="r" u2="o" k="12" />
<hkern u1="r" u2="n" k="22" />
<hkern u1="r" u2="m" k="22" />
<hkern u1="r" u2="l" k="22" />
<hkern u1="r" u2="k" k="22" />
<hkern u1="r" u2="i" k="22" />
<hkern u1="r" u2="h" k="22" />
<hkern u1="r" u2="g" k="12" />
<hkern u1="r" u2="f" k="22" />
<hkern u1="r" u2="e" k="22" />
<hkern u1="r" u2="d" k="22" />
<hkern u1="r" u2="c" k="12" />
<hkern u1="r" u2="a" k="-18" />
<hkern u1="r" u2="&#x3b;" k="28" />
<hkern u1="r" u2="&#x3a;" k="21" />
<hkern u1="r" u2="&#x2e;" k="8" />
<hkern u1="r" u2="&#x2d;" k="-31" />
<hkern u1="r" u2="&#x2c;" k="19" />
<hkern u1="s" u2="&#x2019;" k="19" />
<hkern u1="s" u2="t" k="-12" />
<hkern u1="t" u2="&#x2019;" k="-15" />
<hkern u1="t" u2="&#xf6;" k="-5" />
<hkern u1="t" u2="&#xf3;" k="-5" />
<hkern u1="t" u2="&#xe6;" k="129" />
<hkern u1="t" u2="&#xe5;" k="130" />
<hkern u1="t" u2="&#xe4;" k="130" />
<hkern u1="t" u2="&#xe1;" k="130" />
<hkern u1="t" u2="o" k="-5" />
<hkern u1="t" u2="a" k="130" />
<hkern u1="t" u2="S" k="-23" />
<hkern u1="t" u2="&#x3b;" k="-9" />
<hkern u1="t" u2="&#x3a;" k="-15" />
<hkern u1="u" u2="&#x2019;" k="16" />
<hkern u1="v" u2="&#xf8;" k="-17" />
<hkern u1="v" u2="&#xf6;" k="6" />
<hkern u1="v" u2="&#xf3;" k="6" />
<hkern u1="v" u2="&#xf2;" k="6" />
<hkern u1="v" u2="&#xea;" k="-13" />
<hkern u1="v" u2="&#xe9;" k="-13" />
<hkern u1="v" u2="&#xe8;" k="-13" />
<hkern u1="v" u2="&#xe6;" k="137" />
<hkern u1="v" u2="&#xe5;" k="117" />
<hkern u1="v" u2="&#xe4;" k="117" />
<hkern u1="v" u2="&#xe3;" k="117" />
<hkern u1="v" u2="&#xe2;" k="117" />
<hkern u1="v" u2="&#xe1;" k="117" />
<hkern u1="v" u2="&#xe0;" k="117" />
<hkern u1="v" u2="s" k="-6" />
<hkern u1="v" u2="o" k="6" />
<hkern u1="v" u2="l" k="-13" />
<hkern u1="v" u2="g" k="5" />
<hkern u1="v" u2="e" k="-13" />
<hkern u1="v" u2="a" k="117" />
<hkern u1="v" u2="&#x3b;" k="-8" />
<hkern u1="v" u2="&#x3a;" k="-10" />
<hkern u1="v" u2="&#x2e;" k="129" />
<hkern u1="v" u2="&#x2d;" k="6" />
<hkern u1="v" u2="&#x2c;" k="139" />
<hkern u1="w" u2="&#xf8;" k="-19" />
<hkern u1="w" u2="&#xf6;" k="4" />
<hkern u1="w" u2="&#xf3;" k="4" />
<hkern u1="w" u2="&#xf2;" k="4" />
<hkern u1="w" u2="&#xea;" k="-10" />
<hkern u1="w" u2="&#xe9;" k="-10" />
<hkern u1="w" u2="&#xe8;" k="-10" />
<hkern u1="w" u2="&#xe6;" k="112" />
<hkern u1="w" u2="&#xe5;" k="106" />
<hkern u1="w" u2="&#xe4;" k="106" />
<hkern u1="w" u2="&#xe3;" k="106" />
<hkern u1="w" u2="&#xe2;" k="106" />
<hkern u1="w" u2="&#xe1;" k="106" />
<hkern u1="w" u2="&#xe0;" k="106" />
<hkern u1="w" u2="s" k="-7" />
<hkern u1="w" u2="o" k="4" />
<hkern u1="w" u2="l" k="-10" />
<hkern u1="w" u2="g" k="3" />
<hkern u1="w" u2="e" k="-10" />
<hkern u1="w" u2="a" k="106" />
<hkern u1="w" u2="&#x3b;" k="-8" />
<hkern u1="w" u2="&#x3a;" k="-11" />
<hkern u1="w" u2="&#x2e;" k="108" />
<hkern u1="w" u2="&#x2d;" k="-5" />
<hkern u1="w" u2="&#x2c;" k="119" />
<hkern u1="x" u2="&#xe9;" k="-16" />
<hkern u1="x" u2="q" k="29" />
<hkern u1="x" u2="o" k="29" />
<hkern u1="x" u2="e" k="-16" />
<hkern u1="x" u2="c" k="25" />
<hkern u1="x" u2="a" k="-78" />
<hkern u1="y" u2="&#xf8;" k="-7" />
<hkern u1="y" u2="&#xf6;" k="14" />
<hkern u1="y" u2="&#xf3;" k="14" />
<hkern u1="y" u2="&#xf2;" k="14" />
<hkern u1="y" u2="&#xea;" k="-15" />
<hkern u1="y" u2="&#xe9;" k="-15" />
<hkern u1="y" u2="&#xe8;" k="-15" />
<hkern u1="y" u2="&#xe6;" k="148" />
<hkern u1="y" u2="&#xe5;" k="138" />
<hkern u1="y" u2="&#xe4;" k="138" />
<hkern u1="y" u2="&#xe3;" k="138" />
<hkern u1="y" u2="&#xe2;" k="138" />
<hkern u1="y" u2="&#xe1;" k="138" />
<hkern u1="y" u2="&#xe0;" k="138" />
<hkern u1="y" u2="s" k="-2" />
<hkern u1="y" u2="o" k="14" />
<hkern u1="y" u2="l" k="-15" />
<hkern u1="y" u2="g" k="12" />
<hkern u1="y" u2="e" k="-15" />
<hkern u1="y" u2="c" k="10" />
<hkern u1="y" u2="a" k="138" />
<hkern u1="y" u2="&#x3b;" k="-3" />
<hkern u1="y" u2="&#x3a;" k="-2" />
<hkern u1="y" u2="&#x2e;" k="175" />
<hkern u1="y" u2="&#x2d;" k="69" />
<hkern u1="y" u2="&#x2c;" k="186" />
<hkern u1="&#xbb;" u2="Y" k="169" />
<hkern u1="&#xbb;" u2="W" k="84" />
<hkern u1="&#xbb;" u2="V" k="103" />
<hkern u1="&#xbb;" u2="T" k="232" />
<hkern u1="&#xbb;" u2="A" k="102" />
<hkern u1="&#xc7;" u2="A" k="2" />
<hkern u1="&#xd8;" u2="A" k="20" />
<hkern u1="&#xe0;" u2="y" k="144" />
<hkern u1="&#xe0;" u2="w" k="104" />
<hkern u1="&#xe0;" u2="v" k="121" />
<hkern u1="&#xe1;" u2="y" k="144" />
<hkern u1="&#xe1;" u2="w" k="104" />
<hkern u1="&#xe1;" u2="v" k="121" />
<hkern u1="&#xe4;" u2="y" k="144" />
<hkern u1="&#xe4;" u2="w" k="104" />
<hkern u1="&#xe4;" u2="v" k="121" />
<hkern u1="&#xe5;" u2="y" k="144" />
<hkern u1="&#xe5;" u2="w" k="104" />
<hkern u1="&#xe5;" u2="v" k="121" />
<hkern u1="&#xe6;" u2="y" k="-36" />
<hkern u1="&#xe6;" u2="w" k="-31" />
<hkern u1="&#xe6;" u2="v" k="-31" />
<hkern u1="&#xe9;" u2="y" k="-39" />
<hkern u1="&#xe9;" u2="w" k="-33" />
<hkern u1="&#xe9;" u2="v" k="-33" />
<hkern u1="&#xea;" u2="y" k="-39" />
<hkern u1="&#xea;" u2="w" k="-33" />
<hkern u1="&#xea;" u2="v" k="-33" />
<hkern u1="&#xf2;" u2="y" k="15" />
<hkern u1="&#xf2;" u2="w" k="2" />
<hkern u1="&#xf2;" u2="v" k="6" />
<hkern u1="&#xf3;" u2="y" k="15" />
<hkern u1="&#xf3;" u2="w" k="2" />
<hkern u1="&#xf3;" u2="v" k="6" />
<hkern u1="&#xf4;" u2="t" k="-6" />
<hkern u1="&#xf6;" u2="y" k="15" />
<hkern u1="&#xf6;" u2="x" k="32" />
<hkern u1="&#xf6;" u2="w" k="2" />
<hkern u1="&#xf6;" u2="v" k="6" />
<hkern u1="&#xf6;" u2="t" k="-6" />
<hkern u1="&#x2018;" u2="Y" k="-31" />
<hkern u1="&#x2018;" u2="W" k="-25" />
<hkern u1="&#x2018;" u2="V" k="-25" />
<hkern u1="&#x2018;" u2="T" k="-16" />
<hkern u1="&#x2018;" u2="A" k="184" />
<hkern u1="&#x2019;" u2="y" k="-31" />
<hkern u1="&#x2019;" u2="w" k="-26" />
<hkern u1="&#x2019;" u2="v" k="-26" />
<hkern u1="&#x2019;" u2="t" k="-16" />
<hkern u1="&#x2019;" u2="s" k="10" />
<hkern u1="&#x2019;" u2="r" k="19" />
<hkern u1="&#x2019;" u2="o" k="20" />
<hkern u1="&#x2019;" u2="d" k="19" />
<hkern u1="&#x2019;" u2="A" k="180" />
<hkern u1="&#x2019;" u2="&#x2e;" k="84" />
<hkern u1="&#x2019;" u2="&#x2c;" k="94" />
<hkern u1="&#x201c;" u2="Y" k="-31" />
<hkern u1="&#x201c;" u2="W" k="-25" />
<hkern u1="&#x201c;" u2="V" k="-25" />
<hkern u1="&#x201c;" u2="T" k="-16" />
<hkern u1="&#x201c;" u2="A" k="186" />
<hkern u1="&#x201d;" u2="Y" k="-31" />
<hkern u1="&#x201d;" u2="W" k="-25" />
<hkern u1="&#x201d;" u2="V" k="-25" />
<hkern u1="&#x201d;" u2="T" k="-16" />
<hkern u1="&#x201d;" u2="A" k="181" />
<hkern u1="&#x201e;" u2="Y" k="242" />
<hkern u1="&#x201e;" u2="W" k="134" />
<hkern u1="&#x201e;" u2="V" k="162" />
<hkern u1="&#x201e;" u2="T" k="226" />
<hkern u1="&#x201e;" u2="A" k="7" />
<hkern u1="&#x203a;" u2="Y" k="169" />
<hkern u1="&#x203a;" u2="W" k="84" />
<hkern u1="&#x203a;" u2="V" k="103" />
<hkern u1="&#x203a;" u2="T" k="232" />
<hkern u1="&#x203a;" u2="A" k="102" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
app/fonts/eurostile.eot Executable file

Binary file not shown.

237
app/fonts/eurostile.svg Executable file
View File

@@ -0,0 +1,237 @@
<?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" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata></metadata>
<defs>
<font id="eurostileregular" horiz-adv-x="1256" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="512" />
<glyph horiz-adv-x="0" />
<glyph horiz-adv-x="682" />
<glyph unicode=" " horiz-adv-x="512" />
<glyph unicode="&#x09;" horiz-adv-x="512" />
<glyph unicode="&#xa0;" horiz-adv-x="512" />
<glyph unicode="!" horiz-adv-x="491" d="M160 1365h168l-20 -988h-131zM168 0v184h154v-184h-154z" />
<glyph unicode="&#x22;" horiz-adv-x="639" d="M93 1365h138l-20 -546h-99zM408 1365h138l-19 -546h-99z" />
<glyph unicode="#" d="M94 433l15 92h236l49 320h-236l16 92h236l67 428h108l-68 -428h303l68 428h109l-68 -428h234l-16 -92h-234l-48 -320h236l-16 -92h-236l-68 -433h-109l69 433h-304l-68 -433h-108l69 433h-236zM453 525h303l49 320h-303z" />
<glyph unicode="$" horiz-adv-x="1257" d="M55 425h151v-25q0 -183 52.5 -228.5t265.5 -45.5l48 -2v505q-309 0 -406 71t-97 298q0 219 101.5 293t401.5 74v127h116v-127l57 -1q251 0 338 -69.5t87 -268.5l-1 -43h-148l-1 34q0 140 -48.5 178t-226.5 38h-57v-474q304 0 408.5 -76t104.5 -298q0 -221 -99.5 -302.5 t-369.5 -81.5l-44 -1v-154h-116v154h-99q-76 0 -126 4q-292 23 -292 421zM216 1016q0 -161 59.5 -208.5t260.5 -47.5l36 -1v476h-47q-193 0 -251 -41.5t-58 -177.5zM688 124q37 -6 55 -8q311 -25 311 269q0 150 -62.5 195.5t-266.5 45.5l-37 1v-503z" />
<glyph unicode="%" horiz-adv-x="1609" d="M34 1032q0 217 53.5 277.5t245.5 60.5q205 0 251 -53.5t46 -288.5t-46 -293t-234 -58q-211 0 -263.5 59t-52.5 296zM119 1041q0 -218 33.5 -255t233.5 -37q159 0 159 159v118v111q0 109 -34.5 135t-179.5 26q-148 0 -180 -39t-32 -218zM295 0l921 1365h99l-927 -1365h-93 zM975 350q0 217 53.5 277.5t245.5 60.5q205 0 251 -53.5t46 -288.5q0 -236 -46 -293.5t-234 -57.5q-211 0 -263.5 59t-52.5 296zM1060 359q0 -218 33.5 -255t233.5 -37q159 0 159 159v118v111q0 109 -35 135t-179 26q-148 0 -180 -39t-32 -218z" />
<glyph unicode="&#x26;" horiz-adv-x="1434" d="M117 421q0 181 48.5 253t189.5 101q13 3 41 9q-124 104 -124 239q0 191 85.5 260.5t320.5 69.5q230 0 314 -68t84 -254l-2 -85h-151v51q0 152 -41 189t-210 37q-153 0 -203 -33t-50 -134q0 -114 87 -182l34 -28l514 -428v28v56v70v31h152l1 -36l1 -69q0 -109 -16 -194 l239 -197l-84 -107l-202 167q-85 -181 -458 -181q-360 0 -465 80t-105 355zM264 417q0 -208 60.5 -254.5t333.5 -46.5q327 0 367 146l-533 439q-155 -34 -191.5 -79.5t-36.5 -204.5z" />
<glyph unicode="'" horiz-adv-x="323" d="M93 1365h138l-20 -546h-99z" />
<glyph unicode="(" horiz-adv-x="568" d="M103 478q0 645 45.5 770t278.5 125l38 -1v-130q-146 0 -174.5 -73t-28.5 -447l1 -244v-245q0 -373 28.5 -446t173.5 -73v-130l-38 -1q-233 0 -278.5 125t-45.5 770z" />
<glyph unicode=")" horiz-adv-x="568" d="M102 -286q145 0 173.5 73t28.5 446v245l1 244q0 374 -28.5 447t-174.5 73v130l38 1q233 0 278.5 -125t45.5 -770t-45.5 -770t-278.5 -125l-38 1v130z" />
<glyph unicode="*" horiz-adv-x="1257" d="M263 1074l35 100l280 -100v291h102v-291l278 100l36 -100l-281 -105l167 -238l-80 -60l-170 247l-183 -247l-80 60l175 238z" />
<glyph unicode="+" d="M155 617v130h403v409h140v-409h403v-130h-403v-407h-140v407h-403z" />
<glyph unicode="," horiz-adv-x="406" d="M109 -123q86 5 86 88l-1 35h-65v184h154v-198q0 -187 -136 -187q-13 0 -38 2v76z" />
<glyph unicode="-" horiz-adv-x="425" d="M0 432l3 130h422v-130h-425z" />
<glyph unicode="." horiz-adv-x="400" d="M123 0v184h154v-184h-154z" />
<glyph unicode="/" horiz-adv-x="1323" d="M-136 -410l1201 1775h114l-1200 -1775h-115z" />
<glyph unicode="0" d="M93 732q0 449 82 548t453 99q379 0 457 -101.5t78 -594.5q0 -470 -74 -570q-95 -127 -461 -127t-461 127q-74 100 -74 619zM240 683q0 -419 50.5 -493t337.5 -74t337.5 74t50.5 493q0 418 -50.5 492t-337.5 74t-337.5 -74t-50.5 -492z" />
<glyph unicode="1" horiz-adv-x="1257" d="M210 955l378 410h222v-1365h-154v1250l-349 -387z" />
<glyph unicode="2" d="M111 0v257q0 216 84 283t399 103q252 28 304.5 76t52.5 249q0 176 -58.5 228.5t-255.5 52.5q-246 0 -310.5 -42.5t-64.5 -204.5l2 -102h-151l1 71q0 245 103.5 326.5t414.5 81.5q276 0 371 -88t95 -343q0 -245 -88.5 -327.5t-384.5 -111.5q-260 -26 -310 -72t-50 -261 v-46h829v-130h-983z" />
<glyph unicode="3" d="M105 363v81h150v-79q0 -174 59 -211.5t335 -37.5q214 0 271 47.5t57 227.5q0 151 -54 196.5t-235 45.5h-130h-58v131l52 -1q276 0 337.5 35t61.5 191q0 180 -53.5 220t-295.5 40q-223 0 -275.5 -39t-52.5 -205v-59h-146l1 54q0 234 91 306.5t384 72.5q301 0 397.5 -67.5 t96.5 -278.5q0 -179 -46 -245t-184 -83v-7q155 -21 205.5 -84t50.5 -234q0 -238 -98.5 -316t-397.5 -78q-323 0 -423 72t-100 305z" />
<glyph unicode="4" d="M54 315v181l680 869h238v-920h204v-130h-204v-315h-154v315h-764zM181 445h637v821h-3z" />
<glyph unicode="5" d="M133 338v52h145q0 -185 57.5 -229.5t293.5 -44.5q247 0 302 57t55 312q0 206 -61.5 262.5t-285.5 56.5q-312 0 -342 -131h-139v692h919v-130h-766l-7 -414h3q80 113 359 113q270 0 368.5 -93t98.5 -350q0 -314 -93.5 -409.5t-398.5 -95.5q-303 0 -405.5 71t-102.5 281z " />
<glyph unicode="6" horiz-adv-x="1255" d="M99 714l4 220q0 270 94 357.5t384 87.5q293 0 397.5 -65t104.5 -247l-1 -47h-150q4 37 4 49q0 109 -55 144.5t-225 35.5q-258 0 -326.5 -44t-68.5 -209v-278h3q87 122 393 122q275 0 368 -84t93 -332q0 -269 -97 -353.5t-406 -84.5q-315 0 -414 92.5t-99 387.5zM246 472 q0 -240 60 -298t307 -58q240 0 299 47t59 241q0 208 -58 257t-305 49q-225 0 -293.5 -45t-68.5 -193z" />
<glyph unicode="7" d="M98 1235v130h995v-196l-661 -1169h-183l716 1235h-867z" />
<glyph unicode="8" horiz-adv-x="1257" d="M104 373q0 179 45 243t192 92v3q-135 29 -177 89.5t-42 226.5q0 217 92 284.5t386 67.5q324 0 416 -65.5t92 -297.5q0 -156 -43.5 -217t-174.5 -90v-3q144 -29 188.5 -89.5t44.5 -225.5q0 -250 -94 -327.5t-397 -77.5q-333 0 -430.5 71.5t-97.5 315.5zM251 383 q0 -163 42.5 -213.5t180.5 -50.5l193 -3l128 8q111 14 146 68t35 212q0 153 -65 194t-307 41q-237 0 -295 -42t-58 -214zM269 1007q0 -165 62 -201.5t341 -36.5q186 0 237.5 46t51.5 211q0 153 -56.5 188t-302.5 35q-233 0 -283 -36.5t-50 -205.5z" />
<glyph unicode="9" horiz-adv-x="1257" d="M101 291q0 16 3 57h145l-1 -40q0 -126 60 -159t286 -33q258 0 315 50.5t57 279.5v205h-3q-80 -122 -410 -122q-260 0 -350 83t-90 322q0 274 95 359.5t399 85.5q312 0 413 -89t101 -365l4 -367l-3 -141q0 -262 -99 -346.5t-407 -84.5q-303 0 -409 62.5t-106 242.5z M260 955q0 -193 54 -244.5t258 -51.5q265 0 329 41.5t64 212.5q0 229 -59 282.5t-313 53.5q-223 0 -278 -48.5t-55 -245.5z" />
<glyph unicode=":" horiz-adv-x="400" d="M123 0v184h154v-184h-154zM123 772v184h154v-184h-154z" />
<glyph unicode=";" horiz-adv-x="365" d="M68 -123q86 5 86 88l-1 35h-65v184h154v-198q0 -187 -136 -187q-13 0 -38 2v76zM78 772v184h154v-184h-154z" />
<glyph unicode="&#x3c;" horiz-adv-x="887" d="M0 628v122l887 413v-140l-737 -334l737 -335v-139z" />
<glyph unicode="=" d="M155 447v130h946v-130h-946zM155 788v130h946v-130h-946z" />
<glyph unicode="&#x3e;" horiz-adv-x="887" d="M0 215v140l737 334l-737 334v139l887 -413v-122z" />
<glyph unicode="?" horiz-adv-x="1064" d="M109 938l1 45q0 244 86.5 320t364.5 76q234 0 317 -77t83 -295q0 -312 -193 -381l-84 -30q-137 -49 -137 -168l-1 -34h-151l1 30q0 137 38.5 191t170.5 104l83 32q126 48 126 242q0 169 -46.5 212.5t-229.5 43.5q-188 0 -236.5 -46t-48.5 -226l1 -39h-145zM387 0v184h154 v-184h-154z" />
<glyph unicode="@" horiz-adv-x="1290" d="M82 623q0 381 103 483t487 102q339 0 437.5 -85t98.5 -379q0 -268 -39 -368.5t-143 -100.5q-145 0 -168 110h-4q-48 -116 -243 -116q-150 0 -206 76t-56 280q0 198 56.5 271t208.5 73q177 0 220 -94h3v94h102v-471l2 -43q0 -108 83 -108q99 0 99 351q0 296 -67 358.5 t-384 62.5q-354 0 -429.5 -74t-75.5 -420q0 -368 83.5 -450t460.5 -82q256 0 300 82l68 -49q-60 -105 -385 -105q-395 0 -503.5 106.5t-108.5 495.5zM451 622q0 -172 35 -226.5t147 -54.5q135 0 169 56.5t34 282.5q0 217 -193 217q-122 0 -157 -50t-35 -225z" />
<glyph unicode="A" horiz-adv-x="1246" d="M10 0l500 1365h216l510 -1365h-161l-106 289h-691l-105 -289h-163zM322 405h602l-303 834z" />
<glyph unicode="B" horiz-adv-x="1264" d="M130 0v1365h604q251 0 328.5 -69t77.5 -292q0 -227 -175 -287v-3q217 -52 217 -321q0 -217 -85.5 -305t-297.5 -88h-669zM284 130h327l139 1q176 0 230.5 45.5t54.5 192.5q0 183 -55 224.5t-299 41.5h-397v-505zM284 765h405q193 0 248.5 46t55.5 205q0 138 -48.5 178.5 t-213.5 40.5h-447v-470z" />
<glyph unicode="C" horiz-adv-x="1222" d="M76 685q0 355 21 446.5t120 163.5q116 84 501 84q261 0 351.5 -81t90.5 -313l1 -37h-153l-1 42q0 165 -53.5 212t-241.5 47q-330 0 -403 -55t-73 -305q0 -575 49 -674t335 -99q272 0 339.5 43t67.5 216l-2 81h153v-52q0 -279 -95 -348.5t-478 -69.5q-343 0 -436 122.5 t-93 576.5z" />
<glyph unicode="D" horiz-adv-x="1338" d="M130 0v1365h632q293 0 397 -129t104 -494q0 -444 -92.5 -593t-369.5 -149h-671zM284 130h445q245 0 316 98t71 437q0 372 -61.5 471t-294.5 99h-476v-1105z" />
<glyph unicode="E" horiz-adv-x="1020" d="M75 0v1365h877v-130h-723v-465h693v-130h-693v-510h723v-130h-877z" />
<glyph unicode="F" horiz-adv-x="1001" d="M130 0v1365h837v-130h-683v-477h665v-130h-665v-628h-154z" />
<glyph unicode="G" horiz-adv-x="1268" d="M75 755l1 121q0 303 114.5 403t461.5 100q348 0 449 -65.5t101 -292.5v-52h-151v34q0 167 -68.5 206.5t-357.5 39.5q-267 0 -334 -63.5t-67 -317.5l-2 -181l1 -195q0 -258 74.5 -317t397.5 -59q247 0 305.5 56t58.5 293q0 19 -8 84h-434v130h585q4 -53 4 -149 q0 -369 -90.5 -456.5t-472.5 -87.5q-361 0 -464 103.5t-103 464.5z" />
<glyph unicode="H" horiz-adv-x="1365" d="M130 0v1365h154v-602h798v602h154v-1365h-154v633h-798v-633h-154z" />
<glyph unicode="I" horiz-adv-x="417" d="M130 0v1365h154v-1365h-154z" />
<glyph unicode="J" horiz-adv-x="1028" d="M53 335q0 93 3 162h151v-25v-105q0 -167 45 -209t222 -42q175 0 222.5 55t47.5 256v938h154v-963q0 -241 -88 -328.5t-330 -87.5q-245 0 -336 74.5t-91 274.5z" />
<glyph unicode="K" horiz-adv-x="1235" d="M130 0v1365h154v-596h135l560 596h199l-624 -658l700 -707h-211l-624 639h-135v-639h-154z" />
<glyph unicode="L" horiz-adv-x="993" d="M130 0v1365h154v-1222h702v-143h-856z" />
<glyph unicode="M" horiz-adv-x="1757" d="M130 0v1365h267l364 -883l58 -143l29 -71l28 -71h4l28 71q21 51 28 71l59 142l362 884h271v-1365h-154v1092v82l1 41l1 41h-4l-12 -32q-9 -24 -12 -31l-26 -64l-465 -1129h-154l-466 1116l-27 63l-12 32q-5 11 -12 31h-4l1 -37l1 -38v-75v-1092h-154z" />
<glyph unicode="N" horiz-adv-x="1426" d="M130 0v1365h252l499 -814l130 -214l65 -106l64 -107h4l-1 51l-1 52v102v1036h154v-1365h-253l-572 929l-93 153l-46 76l-46 76h-4l1 -51l1 -52v-102v-1029h-154z" />
<glyph unicode="O" d="M47 683v96l2 129q0 272 122.5 371.5t457.5 99.5q387 0 484 -113t97 -565q0 -487 -93 -601t-488 -114q-393 0 -487.5 113t-94.5 584zM194 683q0 -423 55 -495t379 -72q325 0 380 72t55 495v89l-1 129q0 226 -76 287t-358 61q-324 0 -379 -72t-55 -494z" />
<glyph unicode="P" horiz-adv-x="1208" d="M130 0v1365h573h52q231 0 315 -89t84 -333q0 -234 -87.5 -319t-328.5 -85l-60 -1h-394v-538h-154zM284 668h365q229 0 293.5 47t64.5 216q0 198 -43.5 250.5t-206.5 52.5l-59 1h-414v-567z" />
<glyph unicode="Q" horiz-adv-x="1342" d="M48 738q0 418 101 529.5t481 111.5q387 0 484 -113t97 -565q0 -339 -25 -444l136 -90l-63 -105l-122 79q-110 -155 -507 -155q-405 0 -493.5 114.5t-88.5 637.5zM195 683q0 -423 55 -495t377 -72q320 0 388 105l-409 268l71 105l373 -247q14 73 14 258q0 494 -50.5 569 t-384.5 75q-324 0 -379 -72t-55 -494z" />
<glyph unicode="R" horiz-adv-x="1276" d="M130 0v1365h650q220 0 310 -87t90 -302q0 -189 -49 -263.5t-187 -96.5v-3q217 -16 217 -264v-349h-154v314q0 239 -207 239h-51h-465v-553h-154zM284 683h445q176 0 240 53.5t64 201.5q0 185 -47.5 241t-203.5 56h-498v-552z" />
<glyph unicode="S" horiz-adv-x="1146" d="M61 422h153v-34q0 -183 56 -227.5t287 -44.5q265 0 326 44.5t61 237.5q0 125 -41.5 166.5t-173.5 49.5l-160 8l-152 8q-347 24 -347 360q0 233 101 311t403 78q306 0 399 -72.5t93 -311.5h-153q0 165 -55 209.5t-259 44.5q-242 0 -312 -42.5t-70 -189.5q0 -165 55 -201 t327 -49q319 -14 405.5 -81t86.5 -300q0 -252 -99.5 -326t-439.5 -74q-295 0 -392.5 74.5t-97.5 300.5z" />
<glyph unicode="T" horiz-adv-x="1054" d="M7 1222v143h1040v-143h-441v-1222h-154v1222h-445z" />
<glyph unicode="U" horiz-adv-x="1341" d="M131 363v46v956h154v-956q0 -194 63 -243.5t310 -49.5q268 0 334 48.5t66 244.5v956h154v-956q0 -260 -104.5 -341.5t-438.5 -81.5q-313 0 -425.5 78.5t-112.5 298.5z" />
<glyph unicode="V" horiz-adv-x="1171" d="M-10 1365h164l364 -1031l36 -105q20 -61 33 -105h4q30 101 67 208l358 1033h165l-483 -1365h-220z" />
<glyph unicode="W" horiz-adv-x="2045" d="M3 1365h158l294 -981l40 -133q5 -16 20 -66l19 -67h3l19 67l19 66l39 132l290 982h228l288 -983l39 -131l18 -67l19 -66h3l20 67l20 67l41 134l300 979h161l-430 -1365h-234l-287 983l-36 123q-3 10 -17 61l-18 62h-3l-17 -62l-18 -62l-37 -124l-292 -981h-230z" />
<glyph unicode="X" horiz-adv-x="1190" d="M-10 0l488 706l-449 659h186l303 -455l42 -64q8 -12 21 -32l20 -32h4l20 31q16 27 20 32l41 63l299 457h182l-436 -659l469 -706h-182l-316 478l-50 75q-4 6 -23 37l-24 38h-4l-24 -39q-20 -29 -25 -38l-52 -76l-321 -475h-189z" />
<glyph unicode="Y" horiz-adv-x="1152" d="M-10 1365h179l293 -461l56 -89q11 -16 28 -44l27 -45h4l27 45l27 44l57 89l292 461h183l-516 -795v-570h-154v570z" />
<glyph unicode="Z" horiz-adv-x="1161" d="M48 0v133l857 1099v3h-832v130h1022v-130l-859 -1102v-3h877v-130h-1065z" />
<glyph unicode="[" horiz-adv-x="567" d="M113 -410v1775h349v-116h-195v-1543h195v-116h-349z" />
<glyph unicode="\" horiz-adv-x="1323" d="M-136 1365h115l1200 -1775h-114z" />
<glyph unicode="]" horiz-adv-x="567" d="M105 -294h195v1543h-195v116h349v-1775h-349v116z" />
<glyph unicode="^" horiz-adv-x="914" d="M0 752l365 617h184l365 -617h-153l-306 506l-303 -506h-152z" />
<glyph unicode="_" horiz-adv-x="1024" d="M0 -136h1024v-130h-1024v130z" />
<glyph unicode="`" horiz-adv-x="1024" d="M286 1253l72 98l271 -205l-49 -74z" />
<glyph unicode="a" horiz-adv-x="1044" d="M89 277q0 173 81 239t293 66q252 0 302 -99l3 1v116q0 164 -45 212.5t-197 48.5q-258 0 -258 -145q0 -7 1 -28h-139q0 167 75.5 224.5t295.5 57.5q239 0 323 -70.5t84 -268.5v-631h-140l11 103l-3 1q-80 -118 -325 -118q-362 0 -362 291zM236 293q0 -116 48 -153.5 t195 -37.5q296 0 296 180q0 113 -57.5 152t-223.5 39q-161 0 -209.5 -34t-48.5 -146z" />
<glyph unicode="b" horiz-adv-x="1047" d="M123 0v1365h140v-531l3 -3q48 139 314 139q210 0 290 -109t80 -395q0 -271 -84.5 -375.5t-305.5 -104.5q-225 0 -300 133l-4 -1l7 -118h-140zM267 503q0 -259 50.5 -330t232.5 -71q154 0 203.5 72.5t49.5 297.5q0 237 -49 309.5t-210 72.5q-165 0 -221 -70.5t-56 -280.5z " />
<glyph unicode="c" horiz-adv-x="993" d="M95 483q0 284 84.5 385.5t321.5 101.5q233 0 318 -68.5t85 -257.5h-140v25q0 111 -55 148t-219 37q-158 0 -203 -70t-45 -314q0 -238 51.5 -303t240.5 -65q160 0 203 42.5t43 200.5h140l1 -52q0 -307 -402 -307q-258 0 -341 97t-83 400z" />
<glyph unicode="d" horiz-adv-x="1045" d="M97 492q0 269 81 373.5t290 104.5q261 0 311 -135l3 2v528h140v-1365h-140l7 124l-4 1q-66 -139 -307 -139q-220 0 -300.5 107t-80.5 399zM244 493q0 -240 50.5 -315.5t209.5 -75.5q173 0 225 75.5t52 328.5q0 205 -57.5 276.5t-222.5 71.5q-155 0 -206 -71.5t-51 -289.5 z" />
<glyph unicode="e" horiz-adv-x="1029" d="M95 488q0 286 83 384t325 98q264 0 346 -85t82 -358v-75h-688q0 -226 48.5 -288t226.5 -62q169 0 219.5 29.5t50.5 127.5v30h143l1 -35q0 -149 -90.5 -208.5t-317.5 -59.5q-264 0 -346.5 96.5t-82.5 405.5zM245 561h543l-1 45q0 155 -51 201.5t-220 46.5 q-170 0 -220.5 -54.5t-50.5 -238.5z" />
<glyph unicode="f" horiz-adv-x="543" d="M14 840v116h146v142q0 281 289 281q43 0 101 -7v-116q-68 7 -99 7q-151 0 -151 -152v-155h250v-116h-250v-840h-140v840h-146z" />
<glyph unicode="g" horiz-adv-x="1045" d="M96 472q0 287 81.5 392.5t302.5 105.5q235 0 307 -144l3 1l-7 129h140v-1018q0 -208 -90 -286t-330 -78q-214 0 -292 66t-78 247h135q0 -123 45.5 -160t199.5 -37q160 0 215 48t55 188v192l-3 1q-54 -133 -312 -133q-212 0 -292 104.5t-80 381.5zM243 480 q0 -237 49 -307.5t214 -70.5q167 0 220 77.5t53 322.5q0 216 -53 284t-220 68q-165 0 -214 -69.5t-49 -304.5z" />
<glyph unicode="h" horiz-adv-x="1053" d="M123 0v1365h140v-527l3 -2q53 134 296 134q360 0 360 -320v-39v-611h-140v611v27q0 216 -221 216q-178 0 -238 -63.5t-60 -252.5v-538h-140z" />
<glyph unicode="i" horiz-adv-x="385" d="M123 0v956h140v-956h-140zM123 1208v157h140v-157h-140z" />
<glyph unicode="j" horiz-adv-x="381" d="M-10 -260q12 2 16 2l18 1l58 19q32 27 32 150v1044h140v-1044v-41q0 -237 -197 -237q-29 0 -67 7v99zM114 1208v157h140v-157h-140z" />
<glyph unicode="k" horiz-adv-x="881" d="M123 0v1365h140v-793h64l338 384h176l-409 -439l483 -517h-189l-406 463h-57v-463h-140z" />
<glyph unicode="l" horiz-adv-x="386" d="M123 0v1365h140v-1365h-140z" />
<glyph unicode="m" horiz-adv-x="1691" d="M123 0v956h140l-3 -144l3 -3q81 161 312 161q243 0 295 -161h4q90 161 329 161q338 0 338 -345v-625h-140v638q0 126 -45 171t-170 45q-166 0 -225 -62.5t-59 -238.5v-553h-140v625l-2 44q0 185 -211 185q-286 0 -286 -311v-543h-140z" />
<glyph unicode="n" horiz-adv-x="1056" d="M123 0v956h135l-4 -130l4 -3q64 147 318 147q205 0 277.5 -72t72.5 -276v-622h-140v610v36q0 123 -47 165.5t-181 42.5q-295 0 -295 -279v-575h-140z" />
<glyph unicode="o" horiz-adv-x="1036" d="M96 478q0 308 79 400t343 92q265 0 344 -92t79 -400t-79 -400t-344 -92q-264 0 -343 92t-79 400zM243 478q0 -255 44.5 -315.5t230.5 -60.5q187 0 231.5 60.5t44.5 315.5t-44.5 315.5t-231.5 60.5q-186 0 -230.5 -60.5t-44.5 -315.5z" />
<glyph unicode="p" horiz-adv-x="1045" d="M123 -410v1366h140l-7 -121l4 -3q73 138 314 138q213 0 293 -108t80 -398q0 -269 -81 -373.5t-288 -104.5q-236 0 -312 127h-3v-523h-140zM265 470q0 -221 55 -294.5t221 -73.5q158 0 208.5 71t50.5 293q0 244 -49 316t-216 72q-168 0 -219 -72.5t-51 -311.5z" />
<glyph unicode="q" horiz-adv-x="1044" d="M96 479q0 277 82 384t295 107q234 0 313 -135l3 3l-7 118h140v-1366h-140v526l-3 3q-63 -133 -314 -133q-207 0 -288 108t-81 385zM243 465q0 -224 50 -293.5t210 -69.5q163 0 219 71.5t56 281.5q0 254 -51.5 326.5t-231.5 72.5q-155 0 -203.5 -75t-48.5 -314z" />
<glyph unicode="r" horiz-adv-x="816" d="M137 0v956h140l-14 -110l3 -3q83 135 274 135q264 0 264 -272l-1 -66h-138l3 24q3 38 3 51q0 147 -160 147q-234 0 -234 -289v-573h-140z" />
<glyph unicode="s" horiz-adv-x="970" d="M79 252l1 52h145l1 -45q0 -94 48 -125.5t189 -31.5q173 0 227.5 33t54.5 138q0 151 -137 151q-319 0 -419.5 54t-100.5 224q0 161 79.5 214.5t316.5 53.5q380 0 380 -229v-35h-140q0 100 -40.5 124t-208.5 24q-156 0 -198 -25.5t-42 -122.5q0 -147 141 -154l113 -6 l143 -7q260 -13 260 -272q0 -161 -86 -221t-315 -60q-235 0 -323.5 57t-88.5 209z" />
<glyph unicode="t" horiz-adv-x="667" d="M-10 840v116h132v230h140v-230h368v-116h-368v-585q0 -153 136 -153q135 0 135 137l1 47l2 53h130l1 -71q0 -282 -268 -282q-277 0 -277 235v34v585h-132z" />
<glyph unicode="u" horiz-adv-x="1039" d="M123 320v636h140v-636q0 -130 43 -174t169 -44q165 0 226.5 65.5t61.5 240.5v548h140v-956h-140l10 125l-3 3q-73 -142 -312 -142q-335 0 -335 334z" />
<glyph unicode="v" horiz-adv-x="824" d="M-7 956h144l169 -520l53 -163l25 -82l26 -82h4l24 81l24 82l51 162l162 522h156l-320 -956h-201z" />
<glyph unicode="w" horiz-adv-x="1373" d="M7 956h147l135 -529l42 -166l20 -83l20 -83h4l19 83l20 83l40 165l131 530h204l130 -531l40 -165l19 -82l19 -83h3l21 83l20 83l42 166l134 529h150l-268 -956h-208l-128 531l-39 162l-18 81l-19 81h-3l-19 -81l-19 -81l-39 -162l-129 -531h-212z" />
<glyph unicode="x" horiz-adv-x="827" d="M-7 0l347 500l-311 456h168l217 -349l216 349h167l-310 -450l347 -506h-167l-253 386l-254 -386h-167z" />
<glyph unicode="y" horiz-adv-x="796" d="M-7 956h149l147 -426l74 -212l36 -107l37 -106h4l26 106l25 107l54 212l108 426h149l-271 -1011q-57 -214 -126.5 -294t-198.5 -80q-26 0 -67 7v116q29 -6 49 -7h7q108 0 161 183l27 94q1 5 9 36h-53z" />
<glyph unicode="z" horiz-adv-x="826" d="M44 0v133l572 707h-524v116h689v-136l-570 -704h570v-116h-737z" />
<glyph unicode="{" horiz-adv-x="783" d="M171 422v113q117 34 117 188v337q0 305 237 305h88v-111q-185 0 -185 -197v-341q0 -177 -128 -237q128 -61 128 -238v-341q0 -197 171 -197h14v-113h-88q-237 0 -237 307v338q0 152 -117 187z" />
<glyph unicode="|" horiz-adv-x="140" d="M0 -341v1706h140v-1706h-140z" />
<glyph unicode="}" horiz-adv-x="783" d="M171 -299q189 0 189 197v341q0 177 128 238q-128 60 -128 237v341q0 197 -175 197h-14v113h90q239 0 239 -307v-338q0 -152 113 -187v-113q-113 -36 -113 -187v-338q0 -305 -239 -305h-90v111z" />
<glyph unicode="~" horiz-adv-x="984" d="M0 1250q115 232 279 232q77 0 230 -74q141 -69 202 -69q102 0 187 147l86 -51q-114 -226 -286 -226q-75 0 -174 47l-118 55q-85 41 -139 41q-100 0 -183 -156z" />
<glyph unicode="&#xa1;" horiz-adv-x="491" d="M162 -410l20 989h131l17 -989h-168zM162 772v184h154v-184h-154z" />
<glyph unicode="&#xa2;" horiz-adv-x="1255" d="M183 658q0 460 363 460v133h116v-133q336 0 336 -278l-1 -44h-140q0 127 -35.5 165t-159.5 44v-750q214 0 214 189l1 53h140l-1 -37q0 -321 -354 -321v-146h-116v146q-210 0 -286.5 109.5t-76.5 409.5zM330 668q0 -257 39 -330.5t177 -80.5v751q-134 -10 -175 -74.5 t-41 -265.5z" />
<glyph unicode="&#xa3;" horiz-adv-x="1257" d="M95 534v130h169v208l-2 121l7 113q37 273 433 273q266 0 364.5 -75t98.5 -277l-2 -70h-148v34q0 169 -50 213.5t-237 44.5q-204 0 -256.5 -44.5t-52.5 -216.5l-1 -50v-274h387v-130h-387v-64l1 -109l-15 -122q-18 -61 -100 -119v-3l885 10v-127h-1062v117q137 30 137 304 v113h-169z" />
<glyph unicode="&#xa4;" horiz-adv-x="1365" d="M114 1217l80 80l193 -193q143 107 299 107q151 0 290 -106l194 191l79 -79l-192 -191q105 -142 105 -294q0 -149 -103 -289l193 -193l-79 -80l-193 193q-137 -105 -297 -105q-146 0 -293 105l-192 -193l-79 80l190 193q-104 136 -104 290q0 152 104 291zM338 733 q0 -142 101.5 -243.5t244.5 -101.5q142 0 243.5 101.5t101.5 243.5q0 145 -101 246.5t-244 101.5q-144 0 -245 -102t-101 -246z" />
<glyph unicode="&#xa5;" horiz-adv-x="1257" d="M69 1365h179l376 -638h4l376 638h183l-267 -431h186v-130h-264l-125 -201h389v-130h-408v-473h-154v473h-394v130h375l-121 201h-254v130h178z" />
<glyph unicode="&#xa6;" horiz-adv-x="140" d="M0 314h140v-655h-140v655zM0 686v679h140v-679h-140z" />
<glyph unicode="&#xa7;" horiz-adv-x="1257" d="M154 559q0 204 156 240q-103 66 -103 241q0 208 76.5 273.5t321.5 65.5q307 0 386.5 -61.5t79.5 -300.5h-134l-1 56q0 112 -57 144t-257 32q-184 0 -233 -31.5t-49 -149.5q0 -148 100 -179l88 -26l306 -91q175 -51 220.5 -97t45.5 -171q0 -214 -132 -269 q135 -65 135 -270q0 -222 -90.5 -290t-387.5 -68q-292 0 -378 70t-86 309h138q0 -167 49.5 -208t253.5 -41q247 0 307.5 36t60.5 182q0 97 -32.5 130.5t-158.5 67.5l-421 111q-125 33 -164.5 90.5t-39.5 204.5zM287 555q0 -126 152 -169l308 -86q61 -17 102 -17 q118 0 118 209q0 100 -163 148l-295 87q-70 21 -102 21q-120 0 -120 -193z" />
<glyph unicode="&#xa8;" horiz-adv-x="1024" d="M250 1126v130h154v-130h-154zM620 1126v130h154v-130h-154z" />
<glyph unicode="&#xa9;" horiz-adv-x="1527" d="M68 683q0 288 204 492t493 204q286 0 489.5 -204t203.5 -492t-203.5 -492.5t-489.5 -204.5q-289 0 -493 204t-204 493zM153 683q0 -259 179 -442t432 -183q252 0 430.5 183t178.5 442t-178 441.5t-431 182.5t-432 -182.5t-179 -441.5zM437 690q0 277 57 336.5t322 59.5 q263 0 263 -227l1 -28h-103v30q0 88 -29.5 112t-137.5 24q-190 0 -230.5 -29t-40.5 -164q0 -317 27 -370t190 -53q157 0 194.5 22t37.5 114l-1 52h103l-1 -36q0 -160 -56.5 -200.5t-280.5 -40.5q-204 0 -259.5 70t-55.5 328z" />
<glyph unicode="&#xaa;" horiz-adv-x="837" d="M117 642l2 82h572v-82h-574zM147 979q0 177 231 177q123 0 176 -41v45q0 90 -25.5 115.5t-116.5 25.5q-144 0 -144 -76l1 -23h-98q0 102 46 136.5t184 34.5q255 0 255 -196v-358h-103l6 45q-63 -53 -179 -53q-233 0 -233 168zM249 986q0 -103 145 -103q164 0 164 97 q0 104 -162 104q-147 0 -147 -98z" />
<glyph unicode="&#xab;" horiz-adv-x="915" d="M102 525l246 522l105 -64l-215 -458l238 -459l-99 -66zM438 525l246 522l105 -64l-215 -458l238 -459l-99 -66z" />
<glyph unicode="&#xac;" horiz-adv-x="887" d="M0 416v130h887v-546h-140v416h-747z" />
<glyph unicode="&#xad;" horiz-adv-x="425" d="M0 432l3 130h422v-130h-425z" />
<glyph unicode="&#xae;" horiz-adv-x="1527" d="M68 683q0 288 204 492t493 204q286 0 489.5 -204t203.5 -492t-203.5 -492.5t-489.5 -204.5q-289 0 -493 204t-204 493zM153 683q0 -259 179 -442t432 -183q252 0 430.5 183t178.5 442t-178 441.5t-431 182.5t-432 -182.5t-179 -441.5zM452 300v779h384q238 0 238 -228 q0 -166 -107 -202q96 -33 96 -150v-199h-102v179q0 125 -114 125h-29h-264v-304h-102zM554 696h252q166 0 166 134q0 99 -25 128t-110 29h-283v-291z" />
<glyph unicode="&#xb0;" horiz-adv-x="749" d="M93 1105q0 115 82.5 195.5t199.5 80.5q116 0 198.5 -81t82.5 -195t-82.5 -195t-198.5 -81q-117 0 -199.5 81t-82.5 195zM178 1105q0 -192 197 -192q196 0 196 192t-196 192q-197 0 -197 -192z" />
<glyph unicode="&#xb1;" horiz-adv-x="1257" d="M148 124v143h960v-143h-960zM148 753v143h404v354h154v-354h402v-143h-402v-350h-154v350h-404z" />
<glyph unicode="&#xb2;" horiz-adv-x="826" d="M80 544v160q0 131 55 172.5t258 62.5q159 17 190 43.5t31 142.5q0 102 -36 130.5t-167 28.5q-146 0 -184.5 -24t-38.5 -115l1 -68h-108l1 49q0 146 66 196.5t257 50.5q186 0 248.5 -52.5t62.5 -208.5q0 -147 -57.5 -197.5t-247.5 -68.5q-161 -15 -191 -40.5t-30 -149.5 v-20h523v-92h-633z" />
<glyph unicode="&#xb3;" horiz-adv-x="826" d="M76 822h108v-54q0 -139 125 -139l140 -2l93 7q88 14 88 149t-179 135h-82h-44v93l40 -1q174 0 211 19t37 108q0 103 -32 125t-183 22q-142 0 -172 -22t-30 -124v-34h-105v39q0 141 59.5 185.5t246.5 44.5q193 0 255.5 -41.5t62.5 -169.5q0 -171 -117 -196 q134 -23 134 -188q0 -144 -64 -192t-255 -48q-206 0 -271 44.5t-65 185.5z" />
<glyph unicode="&#xb4;" horiz-adv-x="1024" d="M395 1146l271 205l72 -98l-295 -181z" />
<glyph unicode="&#xb5;" horiz-adv-x="825" d="M0 -342v1325h140v-559q0 -341 268 -341q277 0 277 360v540h140v-983h-140v180q-92 -206 -280 -206q-169 0 -265 152v-468h-140z" />
<glyph unicode="&#xb6;" horiz-adv-x="1260" d="M96 939q0 245 85 335.5t314 90.5h52h545v-1775h-140v1645h-160v-1645h-140v945h-80l-47 1q-248 0 -338.5 85t-90.5 318z" />
<glyph unicode="&#xb8;" horiz-adv-x="1024" d="M403 -307l121 207l97 -54l-139 -195z" />
<glyph unicode="&#xb9;" horiz-adv-x="817" d="M140 1116l245 249h141v-819h-102v727l-213 -220z" />
<glyph unicode="&#xba;" horiz-adv-x="837" d="M132 642l2 82h572v-82h-574zM152 1099q0 178 50.5 232.5t216.5 54.5t216.5 -54.5t50.5 -233.5q0 -178 -50.5 -232.5t-216.5 -54.5t-216.5 54.5t-50.5 233.5zM268 1099q0 -137 23.5 -168t127.5 -31q103 0 127 31.5t24 167.5q0 135 -24 166.5t-127 31.5t-127 -31.5 t-24 -166.5z" />
<glyph unicode="&#xbb;" horiz-adv-x="915" d="M102 66l238 459l-215 458l105 64l246 -522l-275 -525zM438 66l238 459l-215 458l105 64l246 -522l-275 -525z" />
<glyph unicode="&#xbc;" horiz-adv-x="1924" d="M140 1116l245 249h141v-819h-102v727l-213 -220zM447 0l922 1365h108l-926 -1365h-104zM1143 186v118l440 515h152v-541h129v-92h-129v-186h-102v186h-490zM1246 278h387v460z" />
<glyph unicode="&#xbd;" horiz-adv-x="1925" d="M140 1116l245 249h141v-819h-102v727l-213 -220zM447 0l922 1365h108l-926 -1365h-104zM1179 0v160q0 131 54.5 171.5t258.5 62.5q159 17 190 43t31 142q0 102 -36 130.5t-167 28.5q-146 0 -184.5 -24t-38.5 -115l1 -68h-108l1 49q0 146 66 196.5t257 50.5 q186 0 248.5 -52.5t62.5 -208.5q0 -147 -58 -197.5t-247 -67.5q-162 -15 -191.5 -40.5t-29.5 -148.5v-20h523v-92h-633z" />
<glyph unicode="&#xbe;" horiz-adv-x="1924" d="M76 822h108v-54q0 -139 125 -139l140 -2l93 7q88 14 88 149t-179 135h-82h-44v93l40 -1q174 0 211 19t37 108q0 103 -32 125t-183 22q-142 0 -172 -22t-30 -124v-34h-105v39q0 141 59.5 185.5t246.5 44.5q193 0 255.5 -41.5t62.5 -169.5q0 -173 -117 -196 q134 -22 134 -188q0 -144 -64 -192t-255 -48q-206 0 -271 44.5t-65 185.5zM515 0l921 1365h109l-927 -1365h-103zM1142 186v118l440 515h152v-541h129v-92h-129v-186h-102v186h-490zM1245 278h387v460z" />
<glyph unicode="&#xbf;" horiz-adv-x="1064" d="M102 -51q0 313 194 381l83 30q138 48 138 168v34h151l-1 -30q0 -137 -38 -191t-171 -104l-83 -32q-126 -48 -126 -242q0 -170 46.5 -213.5t229.5 -43.5q188 0 236.5 46.5t48.5 226.5v39h144v-45q0 -245 -86.5 -321t-365.5 -76q-234 0 -317 77t-83 296zM517 772v184h154 v-184h-154z" />
<glyph unicode="&#xc0;" horiz-adv-x="1246" d="M10 0l500 1365h216l510 -1365h-161l-106 289h-691l-105 -289h-163zM322 405h602l-303 834zM362 1630l60 111l298 -186l-50 -79z" />
<glyph unicode="&#xc1;" horiz-adv-x="1246" d="M10 0l500 1365h216l510 -1365h-161l-106 289h-691l-105 -289h-163zM322 405h602l-303 834zM526 1555l297 186l61 -111l-308 -154z" />
<glyph unicode="&#xc2;" horiz-adv-x="1246" d="M10 0l500 1365h216l510 -1365h-161l-106 289h-691l-105 -289h-163zM306 1553l321 182l313 -182l-43 -77l-270 124l-283 -124zM322 405h602l-303 834z" />
<glyph unicode="&#xc3;" horiz-adv-x="1246" d="M10 0l500 1365h216l510 -1365h-161l-106 289h-691l-105 -289h-163zM322 405h602l-303 834zM328 1561q74 136 173 136q41 0 136 -39q91 -38 123 -38q56 0 107 78l78 -51q-84 -136 -188 -136q-44 0 -138 41q-84 36 -123 36q-45 0 -86 -73z" />
<glyph unicode="&#xc4;" horiz-adv-x="1246" d="M10 0l500 1365h216l510 -1365h-161l-106 289h-691l-105 -289h-163zM322 405h602l-303 834zM361 1530v130h154v-130h-154zM731 1530v130h154v-130h-154z" />
<glyph unicode="&#xc5;" horiz-adv-x="1246" d="M10 0l500 1365h216l510 -1365h-161l-106 289h-691l-105 -289h-163zM322 405h602l-303 834zM466 1618q0 157 157 157t157 -157t-157 -157t-157 157zM534 1618q0 -85 89 -85t89 85t-89 85t-89 -85z" />
<glyph unicode="&#xc6;" horiz-adv-x="1902" d="M-9 0l759 1365h1084v-130h-714v-468h682v-130h-682v-507h714v-130h-868v287h-637l-156 -287h-182zM401 417h565v818h-124z" />
<glyph unicode="&#xc7;" horiz-adv-x="1222" d="M76 685q0 355 21 446.5t120 163.5q116 84 501 84q261 0 351.5 -81t90.5 -313l1 -37h-153l-1 42q0 165 -53.5 212t-241.5 47q-330 0 -403 -55t-73 -305q0 -575 49 -674t335 -99q272 0 339.5 43t67.5 216l-2 81h153v-52q0 -279 -95 -348.5t-478 -69.5q-343 0 -436 122.5 t-93 576.5zM502 -338l139 238l112 -63l-160 -224z" />
<glyph unicode="&#xc8;" horiz-adv-x="1020" d="M75 0v1365h877v-130h-723v-465h693v-130h-693v-510h723v-130h-877zM304 1630l60 111l297 -186l-50 -79z" />
<glyph unicode="&#xc9;" horiz-adv-x="1020" d="M75 0v1365h877v-130h-723v-465h693v-130h-693v-510h723v-130h-877zM399 1555l298 186l60 -111l-308 -154z" />
<glyph unicode="&#xca;" horiz-adv-x="1020" d="M75 0v1365h877v-130h-723v-465h693v-130h-693v-510h723v-130h-877zM206 1553l321 182l314 -182l-43 -77l-271 124l-283 -124z" />
<glyph unicode="&#xcb;" horiz-adv-x="1020" d="M75 0v1365h877v-130h-723v-465h693v-130h-693v-510h723v-130h-877zM262 1530v130h154v-130h-154zM632 1530v130h154v-130h-154z" />
<glyph unicode="&#xcc;" horiz-adv-x="416" d="M-53 1630l60 111l298 -186l-50 -79zM128 0v1365h154v-1365h-154z" />
<glyph unicode="&#xcd;" horiz-adv-x="416" d="M111 1555l297 186l61 -111l-308 -154zM130 0v1365h154v-1365h-154z" />
<glyph unicode="&#xce;" horiz-adv-x="416" d="M-82 1553l294 182l286 -182l-43 -77l-243 124l-256 -124zM130 0v1365h154v-1365h-154z" />
<glyph unicode="&#xcf;" horiz-adv-x="416" d="M21 1530v130h154v-130h-154zM130 0v1365h154v-1365h-154zM241 1530v130h154v-130h-154z" />
<glyph unicode="&#xd0;" horiz-adv-x="1337" d="M0 640v116h130v609h630q294 0 398 -129t104 -494q0 -444 -93 -593t-370 -149h-669v640h-130zM284 130h443q246 0 317 98t71 437q0 372 -62 471t-294 99h-475v-479h434v-116h-434v-510z" />
<glyph unicode="&#xd1;" horiz-adv-x="1426" d="M130 0v1365h252l499 -814l130 -214l65 -106l64 -107h4l-1 51l-1 52v102v1036h154v-1365h-253l-572 929l-93 153l-46 76l-46 76h-4l1 -51l1 -52v-102v-1029h-154zM418 1561q74 136 174 136q40 0 135 -39q91 -38 124 -38q55 0 107 78l78 -51q-84 -136 -189 -136 q-44 0 -137 41q-84 36 -124 36q-45 0 -85 -73z" />
<glyph unicode="&#xd2;" d="M47 683v96l2 129q0 272 122.5 371.5t457.5 99.5q387 0 484 -113t97 -565q0 -487 -93 -601t-488 -114q-393 0 -487.5 113t-94.5 584zM194 683q0 -423 55 -495t379 -72q325 0 380 72t55 495v89l-1 129q0 226 -76 287t-358 61q-324 0 -379 -72t-55 -494zM409 1630l60 111 l298 -186l-50 -79z" />
<glyph unicode="&#xd3;" d="M47 683v96l2 129q0 272 122.5 371.5t457.5 99.5q387 0 484 -113t97 -565q0 -487 -93 -601t-488 -114q-393 0 -487.5 113t-94.5 584zM194 683q0 -423 55 -495t379 -72q325 0 380 72t55 495v89l-1 129q0 226 -76 287t-358 61q-324 0 -379 -72t-55 -494zM505 1555l297 186 l60 -111l-308 -154z" />
<glyph unicode="&#xd4;" d="M47 683v96l2 129q0 272 122.5 371.5t457.5 99.5q387 0 484 -113t97 -565q0 -487 -93 -601t-488 -114q-393 0 -487.5 113t-94.5 584zM194 683q0 -423 55 -495t379 -72q325 0 380 72t55 495v89l-1 129q0 226 -76 287t-358 61q-324 0 -379 -72t-55 -494zM312 1553l320 182 l314 -182l-43 -77l-271 124l-282 -124z" />
<glyph unicode="&#xd5;" d="M47 683v96l2 129q0 272 122.5 371.5t457.5 99.5q387 0 484 -113t97 -565q0 -487 -93 -601t-488 -114q-393 0 -487.5 113t-94.5 584zM194 683q0 -423 55 -495t379 -72q325 0 380 72t55 495v89l-1 129q0 226 -76 287t-358 61q-324 0 -379 -72t-55 -494zM341 1561 q75 136 174 136q41 0 135 -39q92 -38 124 -38q56 0 107 78l78 -51q-84 -136 -188 -136q-44 0 -138 41q-84 36 -124 36q-44 0 -85 -73z" />
<glyph unicode="&#xd6;" d="M47 683v96l2 129q0 272 122.5 371.5t457.5 99.5q387 0 484 -113t97 -565q0 -487 -93 -601t-488 -114q-393 0 -487.5 113t-94.5 584zM194 683q0 -423 55 -495t379 -72q325 0 380 72t55 495v89l-1 129q0 226 -76 287t-358 61q-324 0 -379 -72t-55 -494zM367 1530v130h154 v-130h-154zM737 1530v130h154v-130h-154z" />
<glyph unicode="&#xd7;" d="M194 344l339 339l-339 338l95 96l339 -339l339 339l95 -96l-339 -338l339 -339l-95 -95l-339 338l-339 -338z" />
<glyph unicode="&#xd8;" horiz-adv-x="1289" d="M20 7v152l76 73q-34 116 -34 469q0 459 98 568.5t510 109.5q371 0 469 -137l129 125v-152l-79 -77q37 -118 37 -406q0 -520 -87.5 -633t-490.5 -113q-391 0 -503 143zM209 801q0 -327 15 -444l807 781q-40 75 -109 93t-317 18q-272 0 -334 -70t-62 -378zM256 235 q42 -83 110.5 -101t341.5 -18q233 0 301.5 68.5t68.5 302.5l1 327l-8 145q-2 19 -9 56z" />
<glyph unicode="&#xd9;" horiz-adv-x="1341" d="M131 363v46v956h154v-956q0 -194 63 -243.5t310 -49.5q268 0 334 48.5t66 244.5v956h154v-956q0 -260 -104.5 -341.5t-438.5 -81.5q-313 0 -425.5 78.5t-112.5 298.5zM451 1630l60 111l298 -186l-50 -79z" />
<glyph unicode="&#xda;" horiz-adv-x="1341" d="M131 363v46v956h154v-956q0 -194 63 -243.5t310 -49.5q268 0 334 48.5t66 244.5v956h154v-956q0 -260 -104.5 -341.5t-438.5 -81.5q-313 0 -425.5 78.5t-112.5 298.5zM547 1555l297 186l60 -111l-307 -154z" />
<glyph unicode="&#xdb;" horiz-adv-x="1341" d="M131 363v46v956h154v-956q0 -194 63 -243.5t310 -49.5q268 0 334 48.5t66 244.5v956h154v-956q0 -260 -104.5 -341.5t-438.5 -81.5q-313 0 -425.5 78.5t-112.5 298.5zM354 1553l321 182l313 -182l-43 -77l-270 124l-283 -124z" />
<glyph unicode="&#xdc;" horiz-adv-x="1341" d="M131 363v46v956h154v-956q0 -194 63 -243.5t310 -49.5q268 0 334 48.5t66 244.5v956h154v-956q0 -260 -104.5 -341.5t-438.5 -81.5q-313 0 -425.5 78.5t-112.5 298.5zM409 1530v130h154v-130h-154zM779 1530v130h154v-130h-154z" />
<glyph unicode="&#xdd;" horiz-adv-x="1152" d="M-10 1365h179l293 -461l56 -89q11 -16 28 -44l27 -45h4l27 45l27 44l57 89l292 461h183l-516 -795v-570h-154v570zM479 1555l297 186l61 -111l-308 -154z" />
<glyph unicode="&#xde;" horiz-adv-x="1208" d="M130 0v1365h154v-191h419h52q231 0 315 -89t84 -334q0 -236 -87.5 -321t-328.5 -85l-60 -1h-394v-344h-154zM284 474h365q230 0 294 47.5t64 216.5q0 199 -43.5 252t-206.5 53l-59 1h-414v-570z" />
<glyph unicode="&#xdf;" horiz-adv-x="1073" d="M130 0v1055v40q0 284 373 284q378 0 378 -269q0 -184 -178 -227v-2q151 -31 202.5 -116.5t51.5 -306.5q0 -263 -71 -367.5t-251 -104.5q-270 0 -270 286l1 20h137l1 -29q0 -161 132 -161q108 0 141 68t33 288q0 217 -55.5 289.5t-219.5 72.5h-78h-39v121h32l50 1 q234 0 234 145q0 111 -44.5 143.5t-195.5 32.5q-224 0 -224 -195v-1068h-140z" />
<glyph unicode="&#xe0;" horiz-adv-x="1044" d="M89 277q0 173 81 239t293 66q252 0 302 -99l3 1v116q0 164 -45 212.5t-197 48.5q-258 0 -258 -145q0 -7 1 -28h-139q0 167 75.5 224.5t295.5 57.5q239 0 323 -70.5t84 -268.5v-631h-140l11 103l-3 1q-80 -118 -325 -118q-362 0 -362 291zM236 293q0 -116 48 -153.5 t195 -37.5q296 0 296 180q0 113 -57.5 152t-223.5 39q-161 0 -209.5 -34t-48.5 -146zM297 1253l72 98l271 -205l-49 -74z" />
<glyph unicode="&#xe1;" horiz-adv-x="1044" d="M89 277q0 173 81 239t293 66q252 0 302 -99l3 1v116q0 164 -45 212.5t-197 48.5q-258 0 -258 -145q0 -7 1 -28h-139q0 167 75.5 224.5t295.5 57.5q239 0 323 -70.5t84 -268.5v-631h-140l11 103l-3 1q-80 -118 -325 -118q-362 0 -362 291zM236 293q0 -116 48 -153.5 t195 -37.5q296 0 296 180q0 113 -57.5 152t-223.5 39q-161 0 -209.5 -34t-48.5 -146zM406 1146l271 205l72 -98l-295 -181z" />
<glyph unicode="&#xe2;" horiz-adv-x="1044" d="M89 277q0 173 81 239t293 66q252 0 302 -99l3 1v116q0 164 -45 212.5t-197 48.5q-258 0 -258 -145q0 -7 1 -28h-139q0 167 75.5 224.5t295.5 57.5q239 0 323 -70.5t84 -268.5v-631h-140l11 103l-3 1q-80 -118 -325 -118q-362 0 -362 291zM236 293q0 -116 48 -153.5 t195 -37.5q296 0 296 180q0 113 -57.5 152t-223.5 39q-161 0 -209.5 -34t-48.5 -146zM246 1144l263 209l262 -209l-56 -71l-206 152l-206 -152z" />
<glyph unicode="&#xe3;" horiz-adv-x="1044" d="M89 277q0 173 81 239t293 66q252 0 302 -99l3 1v116q0 164 -45 212.5t-197 48.5q-258 0 -258 -145q0 -7 1 -28h-139q0 167 75.5 224.5t295.5 57.5q239 0 323 -70.5t84 -268.5v-631h-140l11 103l-3 1q-80 -118 -325 -118q-362 0 -362 291zM236 289q0 -115 48.5 -151 t206.5 -36q284 0 284 176q0 111 -57.5 149.5t-223.5 38.5q-161 0 -209.5 -33.5t-48.5 -143.5zM246 1155q73 124 163 124q41 0 124 -34q87 -36 110 -36q39 0 76 67l80 -50q-71 -126 -159 -126q-46 0 -126 36q-78 34 -109 34q-42 0 -79 -66z" />
<glyph unicode="&#xe4;" horiz-adv-x="1044" d="M89 277q0 173 81 239t293 66q252 0 302 -99l3 1v116q0 164 -45 212.5t-197 48.5q-258 0 -258 -145q0 -7 1 -28h-139q0 167 75.5 224.5t295.5 57.5q239 0 323 -70.5t84 -268.5v-631h-140l11 103l-3 1q-80 -118 -325 -118q-362 0 -362 291zM236 293q0 -116 48 -153.5 t195 -37.5q296 0 296 180q0 113 -57.5 152t-223.5 39q-161 0 -209.5 -34t-48.5 -146zM247 1126v130h154v-130h-154zM617 1126v130h154v-130h-154z" />
<glyph unicode="&#xe5;" horiz-adv-x="1044" d="M89 277q0 173 81 239t293 66q252 0 302 -99l3 1v116q0 164 -45 212.5t-197 48.5q-258 0 -258 -145q0 -7 1 -28h-139q0 167 75.5 224.5t295.5 57.5q239 0 323 -70.5t84 -268.5v-631h-140l11 103l-3 1q-80 -118 -325 -118q-362 0 -362 291zM236 293q0 -116 48 -153.5 t195 -37.5q296 0 296 180q0 113 -57.5 152t-223.5 39q-161 0 -209.5 -34t-48.5 -146zM352 1208q0 157 157 157t157 -157t-157 -157t-157 157zM420 1208q0 -85 89 -85t89 85t-89 85t-89 -85z" />
<glyph unicode="&#xe6;" horiz-adv-x="1697" d="M89 279q0 164 84.5 227.5t303.5 63.5q233 0 296 -97h3v162q0 138 -50.5 182t-208.5 44q-245 0 -245 -142v-21h-148q13 168 81.5 220t276.5 52q318 0 369 -123h3q69 123 333 123q249 0 330 -86.5t81 -351.5l1 -69h-681v-40q0 -212 49 -266.5t241 -54.5q152 0 200 31.5 t48 130.5l1 25h142v-40q0 -263 -408 -263q-291 0 -352 161h-3q-62 -161 -347 -161q-400 0 -400 293zM236 286q0 -108 55 -146t212 -38q274 0 274 180q0 101 -62.5 136.5t-240.5 35.5q-238 0 -238 -168zM917 579h540l-1 48q0 134 -53.5 180.5t-207.5 46.5q-162 0 -219.5 -50 t-57.5 -191z" />
<glyph unicode="&#xe7;" horiz-adv-x="993" d="M95 483q0 284 84.5 385.5t321.5 101.5q233 0 318 -68.5t85 -257.5h-140v25q0 111 -55 148t-219 37q-158 0 -203 -70t-45 -314q0 -238 51.5 -303t240.5 -65q160 0 203 42.5t43 200.5h140l1 -52q0 -307 -402 -307q-258 0 -341 97t-83 400zM385 -307l121 207l98 -54 l-140 -195z" />
<glyph unicode="&#xe8;" horiz-adv-x="1029" d="M95 488q0 286 83 384t325 98q264 0 346 -85t82 -358v-75h-688q0 -226 48.5 -288t226.5 -62q169 0 219.5 29.5t50.5 127.5v30h143l1 -35q0 -149 -90.5 -208.5t-317.5 -59.5q-264 0 -346.5 96.5t-82.5 405.5zM245 561h543l-1 45q0 155 -51 201.5t-220 46.5 q-170 0 -220.5 -54.5t-50.5 -238.5zM302 1253l72 98l271 -205l-49 -74z" />
<glyph unicode="&#xe9;" horiz-adv-x="1029" d="M95 488q0 286 83 384t325 98q264 0 346 -85t82 -358v-75h-688q0 -226 48.5 -288t226.5 -62q169 0 219.5 29.5t50.5 127.5v30h143l1 -35q0 -149 -90.5 -208.5t-317.5 -59.5q-264 0 -346.5 96.5t-82.5 405.5zM245 561h543l-1 45q0 155 -51 201.5t-220 46.5 q-170 0 -220.5 -54.5t-50.5 -238.5zM411 1146l271 205l72 -98l-295 -181z" />
<glyph unicode="&#xea;" horiz-adv-x="1029" d="M95 488q0 286 83 384t325 98q264 0 346 -85t82 -358v-75h-688q0 -226 48.5 -288t226.5 -62q169 0 219.5 29.5t50.5 127.5v30h143l1 -35q0 -149 -90.5 -208.5t-317.5 -59.5q-264 0 -346.5 96.5t-82.5 405.5zM245 561h543l-1 45q0 155 -51 201.5t-220 46.5 q-170 0 -220.5 -54.5t-50.5 -238.5zM265 1144l263 209l262 -209l-56 -71l-206 152l-206 -152z" />
<glyph unicode="&#xeb;" horiz-adv-x="1029" d="M95 488q0 286 83 384t325 98q264 0 346 -85t82 -358v-75h-688q0 -226 48.5 -288t226.5 -62q169 0 219.5 29.5t50.5 127.5v30h143l1 -35q0 -149 -90.5 -208.5t-317.5 -59.5q-264 0 -346.5 96.5t-82.5 405.5zM245 561h543l-1 45q0 155 -51 201.5t-220 46.5 q-170 0 -220.5 -54.5t-50.5 -238.5zM266 1126v130h154v-130h-154zM636 1126v130h154v-130h-154z" />
<glyph unicode="&#xec;" horiz-adv-x="385" d="M-47 1253l72 98l271 -205l-49 -74zM123 0v956h140v-956h-140z" />
<glyph unicode="&#xed;" horiz-adv-x="385" d="M89 1146l271 205l72 -98l-295 -181zM123 0v956h140v-956h-140z" />
<glyph unicode="&#xee;" horiz-adv-x="385" d="M-43 1144l235 209l236 -209l-57 -71l-179 152l-178 -152zM123 0v956h140v-956h-140z" />
<glyph unicode="&#xef;" horiz-adv-x="385" d="M-16 1126v130h154v-130h-154zM123 0v956h140v-956h-140zM248 1126v130h154v-130h-154z" />
<glyph unicode="&#xf0;" horiz-adv-x="1036" d="M96 478q0 308 79 400t344 92q68 0 137 -6l-125 183l-195 -108l-46 83l187 104l-96 139h139l57 -83l179 98l46 -83l-170 -94l211 -307q98 -143 98 -418q0 -308 -79 -400t-344 -92q-264 0 -343 92t-79 400zM243 478q0 -255 44.5 -315.5t230.5 -60.5q187 0 231.5 60.5 t44.5 315.5t-44.5 315.5t-231.5 60.5q-186 0 -230.5 -60.5t-44.5 -315.5z" />
<glyph unicode="&#xf1;" horiz-adv-x="1056" d="M123 0v956h135l-4 -130l4 -3q64 147 318 147q205 0 277.5 -72t72.5 -276v-622h-140v610v36q0 123 -47 165.5t-181 42.5q-295 0 -295 -279v-575h-140zM264 1155q73 124 163 124q41 0 124 -34q87 -36 110 -36q39 0 76 67l80 -50q-71 -126 -159 -126q-46 0 -126 36 q-78 34 -109 34q-42 0 -79 -66z" />
<glyph unicode="&#xf2;" horiz-adv-x="1036" d="M96 478q0 308 79 400t343 92q265 0 344 -92t79 -400t-79 -400t-344 -92q-264 0 -343 92t-79 400zM243 478q0 -255 44.5 -315.5t230.5 -60.5q187 0 231.5 60.5t44.5 315.5t-44.5 315.5t-231.5 60.5q-186 0 -230.5 -60.5t-44.5 -315.5zM306 1253l72 98l271 -205l-49 -74z " />
<glyph unicode="&#xf3;" horiz-adv-x="1036" d="M96 478q0 308 79 400t343 92q265 0 344 -92t79 -400t-79 -400t-344 -92q-264 0 -343 92t-79 400zM243 478q0 -255 44.5 -315.5t230.5 -60.5q187 0 231.5 60.5t44.5 315.5t-44.5 315.5t-231.5 60.5q-186 0 -230.5 -60.5t-44.5 -315.5zM401 1146l271 205l72 -98l-295 -181z " />
<glyph unicode="&#xf4;" horiz-adv-x="1036" d="M96 478q0 308 79 400t343 92q265 0 344 -92t79 -400t-79 -400t-344 -92q-264 0 -343 92t-79 400zM243 478q0 -255 44.5 -315.5t230.5 -60.5q187 0 231.5 60.5t44.5 315.5t-44.5 315.5t-231.5 60.5q-186 0 -230.5 -60.5t-44.5 -315.5zM255 1144l263 209l262 -209l-56 -71 l-206 152l-206 -152z" />
<glyph unicode="&#xf5;" horiz-adv-x="1036" d="M96 478q0 308 79 400t343 92q265 0 344 -92t79 -400t-79 -400t-344 -92q-264 0 -343 92t-79 400zM243 478q0 -255 44.5 -315.5t230.5 -60.5q187 0 231.5 60.5t44.5 315.5t-44.5 315.5t-231.5 60.5q-186 0 -230.5 -60.5t-44.5 -315.5zM262 1155q73 124 163 124 q41 0 124 -34q87 -36 110 -36q39 0 76 67l80 -50q-71 -126 -159 -126q-46 0 -126 36q-78 34 -109 34q-42 0 -79 -66z" />
<glyph unicode="&#xf6;" horiz-adv-x="1036" d="M96 478q0 308 79 400t343 92q265 0 344 -92t79 -400t-79 -400t-344 -92q-264 0 -343 92t-79 400zM243 478q0 -255 44.5 -315.5t230.5 -60.5q187 0 231.5 60.5t44.5 315.5t-44.5 315.5t-231.5 60.5q-186 0 -230.5 -60.5t-44.5 -315.5zM257 1126v130h154v-130h-154z M627 1126v130h154v-130h-154z" />
<glyph unicode="&#xf7;" d="M155 617v130h946v-130h-946zM536 350q0 92 92 92q93 0 93 -92q0 -93 -93 -93q-92 0 -92 93zM536 1017q0 92 92 92q93 0 93 -92q0 -93 -93 -93q-92 0 -92 93z" />
<glyph unicode="&#xf8;" horiz-adv-x="1037" d="M59 -33v129l69 66q-33 98 -33 315q0 310 79.5 401.5t348.5 91.5q263 0 342 -100l112 108v-128l-68 -66q32 -95 32 -290q0 -312 -77 -410t-323 -98q-279 0 -365 93zM242 476q0 -112 8 -197l513 493q-43 82 -224 82q-205 0 -251 -58.5t-46 -319.5zM278 178q43 -76 217 -76 q207 0 253 60t46 331q0 85 -7 174z" />
<glyph unicode="&#xf9;" horiz-adv-x="1039" d="M123 320v636h140v-636q0 -130 43 -174t169 -44q165 0 226.5 65.5t61.5 240.5v548h140v-956h-140l10 125l-3 3q-73 -142 -312 -142q-335 0 -335 334zM294 1253l72 98l271 -205l-49 -74z" />
<glyph unicode="&#xfa;" horiz-adv-x="1039" d="M123 320v636h140v-636q0 -130 43 -174t169 -44q165 0 226.5 65.5t61.5 240.5v548h140v-956h-140l10 125l-3 3q-73 -142 -312 -142q-335 0 -335 334zM403 1146l271 205l72 -98l-295 -181z" />
<glyph unicode="&#xfb;" horiz-adv-x="1039" d="M123 320v636h140v-636q0 -130 43 -174t169 -44q165 0 226.5 65.5t61.5 240.5v548h140v-956h-140l10 125l-3 3q-73 -142 -312 -142q-335 0 -335 334zM257 1144l263 209l262 -209l-56 -71l-206 152l-206 -152z" />
<glyph unicode="&#xfc;" horiz-adv-x="1039" d="M123 320v636h140v-636q0 -130 43 -174t169 -44q165 0 226.5 65.5t61.5 240.5v548h140v-956h-140l10 125l-3 3q-73 -142 -312 -142q-335 0 -335 334zM258 1126v130h154v-130h-154zM628 1126v130h154v-130h-154z" />
<glyph unicode="&#xfd;" horiz-adv-x="796" d="M-7 956h149l147 -426l74 -212l36 -107l37 -106h4l26 106l25 107l54 212l108 426h149l-271 -1011q-57 -214 -126.5 -294t-198.5 -80q-26 0 -67 7v116q29 -6 49 -7q113 -6 168 183l27 94q1 5 9 36h-53zM308 1146l271 205l72 -98l-295 -181z" />
<glyph unicode="&#xfe;" horiz-adv-x="1045" d="M123 -411v1776h140v-530l4 -3q72 138 307 138q213 0 293 -108.5t80 -397.5q0 -269 -81 -373.5t-288 -104.5q-236 0 -312 127h-3v-524h-140zM265 470q0 -221 55 -294.5t221 -73.5q158 0 208.5 71t50.5 293q0 244 -49 316t-216 72q-168 0 -219 -72.5t-51 -311.5z" />
<glyph unicode="&#xff;" horiz-adv-x="796" d="M-7 956h149l147 -426l74 -212l36 -107l37 -106h4l26 106l25 107l54 212l108 426h149l-271 -1011q-57 -214 -126.5 -294t-198.5 -80q-26 0 -67 7v116q29 -6 49 -7q113 -6 168 183l27 94q1 5 9 36h-53zM136 1126v130h154v-130h-154zM506 1126v130h154v-130h-154z" />
<glyph unicode="&#x152;" horiz-adv-x="2020" d="M76 523q0 525 40 630q86 226 515 226q365 0 453 -156h4l-4 130h868v-130h-719v-453h689v-130h-689v-505h719v-130h-868l4 130h-4q-92 -149 -409 -149q-378 0 -488.5 99t-110.5 438zM223 505q0 -104 10 -176q17 -133 93.5 -173t311.5 -40q286 0 361 59t75 284l1 215l4 210 l-7 141q-16 148 -98.5 186t-392.5 38q-259 0 -308.5 -83.5t-49.5 -519.5v-141z" />
<glyph unicode="&#x153;" horiz-adv-x="1714" d="M95 493q0 289 78.5 383t320.5 94q326 0 368 -139h3q61 139 340 139q247 0 329.5 -86.5t82.5 -344.5v-76h-676l-1 -54q0 -193 51 -250t225 -57q162 0 210 35t48 152h143q0 -187 -84.5 -245t-356.5 -58q-243 0 -311 135h-3q-58 -135 -350 -135q-261 0 -339 94.5t-78 412.5z M242 478q0 -255 44.5 -315.5t231.5 -60.5t231.5 60.5t44.5 315.5q0 254 -44.5 315t-231.5 61t-231.5 -60.5t-44.5 -315.5zM937 579h537q0 169 -48.5 222t-203.5 53q-176 0 -230.5 -52.5t-54.5 -222.5z" />
<glyph unicode="&#x178;" horiz-adv-x="1152" d="M-10 1365h179l293 -461l56 -89q11 -16 28 -44l27 -45h4l27 45l27 44l57 89l292 461h183l-516 -795v-570h-154v570zM314 1530v130h154v-130h-154zM684 1530v130h154v-130h-154z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1024" d="M249 1144l263 209l262 -209l-56 -71l-206 152l-206 -152z" />
<glyph unicode="&#x2dc;" horiz-adv-x="1024" d="M235 1155q73 124 163 124q41 0 124 -34q87 -36 110 -36q39 0 76 67l80 -50q-71 -126 -159 -126q-46 0 -126 36q-78 34 -109 34q-42 0 -79 -66z" />
<glyph unicode="&#x2000;" horiz-adv-x="887" />
<glyph unicode="&#x2001;" horiz-adv-x="1775" />
<glyph unicode="&#x2002;" horiz-adv-x="887" />
<glyph unicode="&#x2003;" horiz-adv-x="1775" />
<glyph unicode="&#x2004;" horiz-adv-x="591" />
<glyph unicode="&#x2005;" horiz-adv-x="443" />
<glyph unicode="&#x2006;" horiz-adv-x="295" />
<glyph unicode="&#x2007;" horiz-adv-x="295" />
<glyph unicode="&#x2008;" horiz-adv-x="221" />
<glyph unicode="&#x2009;" horiz-adv-x="355" />
<glyph unicode="&#x200a;" horiz-adv-x="98" />
<glyph unicode="&#x2010;" horiz-adv-x="425" d="M0 432l3 130h422v-130h-425z" />
<glyph unicode="&#x2011;" horiz-adv-x="425" d="M0 432l3 130h422v-130h-425z" />
<glyph unicode="&#x2012;" horiz-adv-x="425" d="M0 432l3 130h422v-130h-425z" />
<glyph unicode="&#x2013;" d="M227 432v130h803v-130h-803z" />
<glyph unicode="&#x2014;" horiz-adv-x="1417" d="M0 432l9 130h1408v-130h-1417z" />
<glyph unicode="&#x2018;" horiz-adv-x="366" d="M86 1008v199q0 186 136 186q15 0 46 -2v-77q-94 0 -94 -87l1 -35h65v-184h-154z" />
<glyph unicode="&#x2019;" horiz-adv-x="406" d="M123 981v77q86 5 86 88l-1 35h-65v184h154v-199q0 -187 -136 -187q-12 0 -38 2z" />
<glyph unicode="&#x201a;" horiz-adv-x="406" d="M109 -123q86 5 86 88l-1 35h-65v184h154v-198q0 -187 -136 -187q-13 0 -38 2v76z" />
<glyph unicode="&#x201c;" horiz-adv-x="653" d="M86 1008v199q0 186 136 186q15 0 46 -2v-77q-94 0 -94 -87l1 -35h65v-184h-154zM381 1008v199q0 186 136 186q11 0 38 -2v-77q-86 -5 -86 -87l1 -35h65v-184h-154z" />
<glyph unicode="&#x201d;" horiz-adv-x="653" d="M98 981v77q86 5 86 88l-1 35h-65v184h154v-199q0 -187 -136 -187q-12 0 -38 2zM385 981v77q94 0 94 88l-1 35h-65v184h154v-199q0 -187 -136 -187q-16 0 -46 2z" />
<glyph unicode="&#x201e;" horiz-adv-x="653" d="M98 -123q86 5 86 88l-1 35h-65v184h154v-198q0 -187 -136 -187q-13 0 -38 2v76zM385 -123q94 0 94 88l-1 35h-65v184h154v-198q0 -187 -136 -187q-17 0 -46 2v76z" />
<glyph unicode="&#x2022;" horiz-adv-x="568" d="M0 694q0 118 83.5 201t202.5 83q117 0 199.5 -83.5t82.5 -200.5t-83 -200.5t-199 -83.5q-118 0 -202 83.5t-84 200.5z" />
<glyph unicode="&#x2026;" horiz-adv-x="1223" d="M123 0v184h154v-184h-154zM531 0v184h154v-184h-154zM946 0v184h154v-184h-154z" />
<glyph unicode="&#x202f;" horiz-adv-x="355" />
<glyph unicode="&#x2039;" horiz-adv-x="578" d="M102 525l246 522l105 -64l-215 -458l238 -459l-99 -66z" />
<glyph unicode="&#x203a;" horiz-adv-x="578" d="M102 66l238 459l-215 458l105 64l246 -522l-275 -525z" />
<glyph unicode="&#x205f;" horiz-adv-x="443" />
<glyph unicode="&#x2122;" horiz-adv-x="1630" d="M-3 1273v92h617v-92h-257v-686h-102v686h-258zM680 587v778h166l213 -499l34 -80l16 -40l11 -26q9 19 12 26l16 40l34 80l212 499h168v-778h-102v618v15v31v14q-3 -9 -5 -12l-6 -15l-6 -14l-272 -637h-99l-272 629l-6 12l-6 14q-2 4 -6 15v-18v-17v-17v-618h-102z" />
<glyph unicode="&#x25fc;" horiz-adv-x="955" d="M0 0v955h955v-955h-955z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 48 KiB

BIN
app/fonts/eurostile.ttf Executable file

Binary file not shown.

BIN
app/fonts/eurostile.woff Executable file

Binary file not shown.

BIN
app/fonts/eurostile.woff2 Executable file

Binary file not shown.

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16 16-7.163 16-16-7.163-16-16-16zM16 29c-7.18 0-13-5.82-13-13s5.82-13 13-13 13 5.82 13 13-5.82 13-13 13z"></path>
<path d="M21 8l-5 5-5-5-3 3 5 5-5 5 3 3 5-5 5 5 3-3-5-5 5-5z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 554 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M27 4l-15 15-7-7-5 5 12 12 20-20z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 371 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M12.42 28.678l-12.433-12.238 6.168-6.071 6.265 6.167 13.426-13.214 6.168 6.071-19.594 19.285zM3.372 16.441l9.048 8.905 16.208-15.953-2.782-2.739-13.426 13.214-6.265-6.167-2.782 2.739z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 521 B

View File

@@ -1,8 +1,8 @@
<svg width="400" height="400" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
<rect transform="rotate(45 200,200) " height="266" width="266" y="67" x="67" stroke-width="10" stroke="#ff3b00" fill="#000000"/>
<rect height="26" width="83" y="187" x="158" fill-opacity="0" stroke-width="15" stroke="#ff3b00" fill="#000000"/>
<path stroke="#ff3b00" transform="rotate(45 314,85)" d="m181,114l134,-58l134,59l-268,0z" stroke-width="10" fill="#000000"/>
<path stroke="#ff3b00" transform="rotate(135 314,314) " d="m181,344l134,-59l134,59l-268,0z" stroke-width="10" fill="#000000"/>
<path stroke="#ff3b00" transform="rotate(-45 85,85) " d="m-49,114l134-59l134,59l-268,0z" stroke-width="10" fill="#000000"/>
<path stroke="#ff3b00" transform="rotate(-135 85,314) " d="m-49,344l134,-59l134,59l-268,0z" stroke-width="10" fill="#000000"/>
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(1,1)">
<path stroke="#ff3b00" transform="rotate(45 15 15)" d="m4,4 l 11,-4 l 11,4 l 4,11 l -4,11 l -11,4 l -11,-4 l -4,-11 l 4,-11 l 22,0 l 0,22 l -22,0 z" stroke-width="1" fill="#000000"/>
<rect height="3" width="10" y="13.5" x="10" stroke-width="1" stroke="#ff3b00" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 852 B

After

Width:  |  Height:  |  Size: 404 B

3
app/icons/feather.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="724" height="1024" viewBox="0 0 1024 1024">
<path d="M0 1024c128-384 463-1024 1024-1024-263 211-384 704-576 704s-192 0-192 0l-192 320h-64z"></path>
</svg>

After

Width:  |  Height:  |  Size: 218 B

3
app/icons/fuel.svg Executable file
View File

@@ -0,0 +1,3 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<path d="M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16 16-7.163 16-16-7.163-16-16-16zM9.464 26.067c0.347-0.957 0.536-1.99 0.536-3.067 0-3.886-2.463-7.197-5.913-8.456 0.319-2.654 1.508-5.109 3.427-7.029 2.267-2.266 5.28-3.515 8.485-3.515s6.219 1.248 8.485 3.515c1.92 1.92 3.108 4.375 3.428 7.029-3.45 1.26-5.913 4.57-5.913 8.456 0 1.077 0.189 2.11 0.536 3.067-1.928 1.258-4.18 1.933-6.536 1.933s-4.608-0.675-6.536-1.933zM17.242 20.031c0.434 0.109 0.758 0.503 0.758 0.969v2c0 0.55-0.45 1-1 1h-2c-0.55 0-1-0.45-1-1v-2c0-0.466 0.324-0.86 0.758-0.969l0.742-14.031h1l0.742 14.031z"></path>
</svg>

After

Width:  |  Height:  |  Size: 688 B

View File

@@ -1,6 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="33" height="33" viewBox="0 0 33 33">
<path d="M32 12h-12l4.485-4.485c-2.267-2.266-5.28-3.515-8.485-3.515s-6.219 1.248-8.485 3.515c-2.266 2.267-3.515 5.28-3.515 8.485s1.248 6.219 3.515 8.485c2.267 2.266 5.28 3.515 8.485 3.515s6.219-1.248 8.485-3.515c0.189-0.189 0.371-0.384 0.546-0.583l3.010 2.634c-2.933 3.349-7.239 5.464-12.041 5.464-8.837 0-16-7.163-16-16s7.163-16 16-16c4.418 0 8.418 1.791 11.313 4.687l4.687-4.687v12z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 713 B

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -1,6 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="33" height="33" viewBox="0 0 33 33">
<path d="M20 4.581v4.249c1.131 0.494 2.172 1.2 3.071 2.099 1.889 1.889 2.929 4.4 2.929 7.071s-1.040 5.182-2.929 7.071c-1.889 1.889-4.4 2.929-7.071 2.929s-5.182-1.040-7.071-2.929c-1.889-1.889-2.929-4.4-2.929-7.071s1.040-5.182 2.929-7.071c0.899-0.899 1.94-1.606 3.071-2.099v-4.249c-5.783 1.721-10 7.077-10 13.419 0 7.732 6.268 14 14 14s14-6.268 14-14c0-6.342-4.217-11.698-10-13.419zM14 0h4v16h-4z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 723 B

After

Width:  |  Height:  |  Size: 510 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

BIN
app/images/logo/144x144.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
app/images/logo/192x192.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
app/images/logo/72x72.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

BIN
app/images/logo/96x96.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -6,7 +6,7 @@
<square150x150logo src="images/logo/mstile-150x150.png"/>
<square310x310logo src="images/logo/mstile-310x310.png"/>
<wide310x150logo src="images/logo/mstile-310x150.png"/>
<TileColor>#da532c</TileColor>
<TileColor>#000000</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -1,38 +1,27 @@
{
"name": "Shipyard",
"name": "Coriolis.io",
"short_name": "Coriolis",
"icons": [
{
"src": "images\/logo\/android-chrome-36x36.png",
"sizes": "36x36",
"type": "image\/png",
"density": "0.75"
},
{
"src": "images\/logo\/android-chrome-48x48.png",
"sizes": "48x48",
"type": "image\/png",
"density": "1.0"
},
{
"src": "images\/logo\/android-chrome-72x72.png",
"src": "images\/logo\/72x72.png",
"sizes": "72x72",
"type": "image\/png",
"density": "1.5"
},
{
"src": "images\/logo\/android-chrome-96x96.png",
"src": "images\/logo\/96x96.png",
"sizes": "96x96",
"type": "image\/png",
"density": "2.0"
},
{
"src": "images\/logo\/android-chrome-144x144.png",
"src": "images\/logo\/144x144.png",
"sizes": "144x144",
"type": "image\/png",
"density": "3.0"
},
{
"src": "images\/logo\/android-chrome-192x192.png",
"src": "images\/logo\/192x192.png",
"sizes": "192x192",
"type": "image\/png",
"density": "4.0"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
app/images/splash/1024x748.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
app/images/splash/1136x640.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
app/images/splash/1242x2148.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
app/images/splash/1280x720.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

BIN
app/images/splash/1334x750.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
app/images/splash/1536x2008.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
app/images/splash/200x320.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
app/images/splash/2048x1496.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
app/images/splash/2208x1242.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
app/images/splash/320x200.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
app/images/splash/320x460.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
app/images/splash/320x480.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
app/images/splash/480x320.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
app/images/splash/480x800.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
app/images/splash/640x1096.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
app/images/splash/640x920.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
app/images/splash/720x1280.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

BIN
app/images/splash/750x1294.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
app/images/splash/768x1004.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
app/images/splash/800x480.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
app/images/splash/960x640.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -1,37 +1,72 @@
<!DOCTYPE html>
<html ng-app="app" ng-strict-di="true">
<html ng-app="app" ng-strict-di="true" manifest="/coriolis.appcache">
<head>
<title ng-bind="title">Coriolis</title>
<link rel="stylesheet" href="/app.css">
<link rel="apple-touch-icon" sizes="76x76" href="/images/logo/apple-touch-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/images/logo/apple-touch-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/images/logo/apple-touch-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/images/logo/apple-touch-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/images/logo/apple-touch-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/images/logo/apple-touch-icon-180x180.png">
<link rel="icon" sizes="96x96" type="image/png" href="/images/logo/favicon-96x96.png">
<link rel="icon" sizes="194x194" type="image/png" href="/images/logo/favicon-194x194.png">
<link rel="icon" sizes="192x192" type="image/png" href="/images/logo/android-chrome-192x192.png">
<!-- Standard headers -->
<meta name="description" content="A ship outfitting and comparison tool for Elite Dangerous">
<meta name="mobile-web-app-capable" content="yes">
<meta name="viewport" content="width = device-width, initial-scale = 1.0">
<link rel="manifest" href="/images/logo/manifest.json">
<link rel="icon" sizes="152x152 192x192" type="image/png" href="/images/logo/192x192.png">
<link rel="shortcut icon" href="/images/logo/favicon.ico">
<meta name="msapplication-TileColor" content="#da532c">
<!-- Apple/iOS headers -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-title" content="Coriolis">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="180x180" href="/images/logo/apple-touch-icon-precomposed.png">
<link rel="apple-touch-icon" href="/images/logo/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="180x180" href="/images/logo/apple-touch-icon-180x180.png">
<!-- iPhone, iPod Touch, portrait -->
<link href="/images/splash/320x460.png" media="(device-width: 320px) and (device-height: 480px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 1)" rel="apple-touch-startup-image">
<!-- iPhone, iPod Touch, landscape -->
<link href="/images/splash/480x320.png" media="(device-width: 320px) and (device-height: 480px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 1)" rel="apple-touch-startup-image">
<!-- iPhone 4, 4S, portrait -->
<link href="/images/splash/640x920.png" media="(device-width: 320px) and (device-height: 480px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 4, 4S, landscape -->
<link href="/images/splash/960x640.png" media="(device-width: 320px) and (device-height: 480px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 5, 5S, 5C, portrait -->
<link href="/images/splash/640x1096.png" media="(device-width: 320px) and (device-height: 568px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 5, 5S, 5C, landscape -->
<link href="/images/splash/1136x640.png" media="(device-width: 320px) and (device-height: 568px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 6, portrait -->
<link href="/images/splash/750x1294.png" media="(device-width: 375px) and (device-height: 667px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 6, landscape -->
<link href="/images/splash/1334x750.png" media="(device-width: 375px) and (device-height: 667px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 6+, portrait -->
<link href="/images/splash/1242x2148.png" media="(device-width: 414px) and (device-height: 736px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image">
<!-- iPhone 6+, landscape -->
<link href="/images/splash/2208x1242.png" media="(device-width: 414px) and (device-height: 736px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image">
<!-- iPad 1, 2, Mini, portrait -->
<link href="/images/splash/768x1004.png" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 1)" rel="apple-touch-startup-image">
<!-- iPad 1, 2, Mini, landscape -->
<link href="/images/splash/1024x748.png" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 1)" rel="apple-touch-startup-image">
<!-- iPad 3, 4, Air, Air 2, Mini 2, Mini 3, portrait -->
<link href="/images/splash/1536x2008.png" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPad 3, 4, Air, Air 2, Mini 2, Mini 3, landscape -->
<link href="/images/splash/2048x1496.png" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- Microsoft Windows Phone/Tablet headers -->
<meta name="msapplication-TileColor" content="#000000">
<meta name="msapplication-TileImage" content="/images/logo/mstile-144x144.png">
<meta name="msapplication-config" content="/images/logo/browserconfig.xml">
<meta name="theme-color" content="#000000">
</head>
<body>
<body style="background-color:#000;">
<div style="height: 0; width: 0; overflow:hidden"><%= svgContent %></div>
<shipyard-header></shipyard-header>
<div id="main" ui-view ng-click="bgClicked($event)"></div>
<div ui-view="modal"></div>
<div ui-view="modal" ng-click="bgClicked($event)"></div>
<footer>
<div class="right">
<a href="https://github.com/cmmcleod/coriolis" target="_blank" title="Coriolis Github Project">Version <%= version %> - <%= date %></a>
<a href="https://github.com/cmmcleod/coriolis/releases/" target="_blank" title="Coriolis Github Project">Version <%= version %> - <%= date %></a>
</div>
<div style="max-width:50%" class="l">
Coriolis Shipyard was created for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments.
Coriolis was created using assets and imagery from Elite: Dangerous, with the permission of Frontier Developments plc, for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments and no employee of Frontier Developments was involved in the making of it.
</div>
</footer>

View File

@@ -1,17 +1,35 @@
angular.module('app', ['ui.router', 'ct.ui.router.extras.sticky', 'ui.sortable', 'shipyard', 'ngLodash', 'app.templates'])
.run(['$rootScope', '$location', '$window', '$document','$state','commonArray','shipPurpose','shipSize','hardPointClass','internalGroupMap','hardpointsGroupMap', function ($rootScope, $location, $window, $doc, $state, CArr, shipPurpose, sz, hpc, igMap, hgMap) {
.run(['$rootScope', '$location', '$window', '$document', '$state', 'commonArray', 'shipPurpose', 'shipSize', 'hardPointClass', 'GroupMap', 'Persist', 'Discounts',
function($rootScope, $location, $window, $doc, $state, CArr, shipPurpose, sz, hpc, GroupMap, Persist, Discounts) {
// App is running as a standalone web app on tablet/mobile
var isStandAlone;
// This was causing issues on Windows phones ($window.external was causing Angular js to throw an exception). Backup is to try this and set isStandAlone to false if this fails.
try {
isStandAlone = $window.navigator.standalone || ($window.external && $window.external.msIsSiteMode && $window.external.msIsSiteMode());
} catch (ex) {
isStandAlone = false;
}
// Redirect any state transition errors to the error controller/state
$rootScope.$on('$stateChangeError', function(e, toState, toParams, fromState, fromParams, error){
$rootScope.$on('$stateChangeError', function(e, toState, toParams, fromState, fromParams, error) {
e.preventDefault();
$state.go('error', error, {location:false, reload:true}); // Go to error state, reload the controller, keep the current URL
$state.go('error', error, { location: false, reload: true }); // Go to error state, reload the controller, keep the current URL
});
// Track on Google analytics if available
$rootScope.$on('$stateChangeSuccess', function(e, to, toParams, from, fromParams) {
$rootScope.prevState = { name: from.name, params: fromParams };
if(to.url && $window.ga) { // Only track states that have a URL
ga('send', 'pageview', {page: $location.path()});
if (to.url) { // Only track states that have a URL
if ($window.ga) {
ga('send', 'pageview', { page: $location.path() });
}
if (isStandAlone) {
// Persist the current state
Persist.setState({ name: to.name, params: toParams });
}
}
});
@@ -20,22 +38,45 @@ angular.module('app', ['ui.router', 'ct.ui.router.extras.sticky', 'ui.sortable',
$rootScope.SP = shipPurpose;
$rootScope.SZ = sz;
$rootScope.HPC = hpc;
$rootScope.igMap = igMap;
$rootScope.hgMap = hgMap;
$rootScope.GMAP = GroupMap;
$rootScope.insurance = { opts: [{ name: 'Standard', pct: 0.05 }, { name: 'Alpha', pct: 0.025 }, { name: 'Beta', pct: 0.035 }] };
$rootScope. discounts = { opts: Discounts };
$rootScope.STATUS = ['', 'DISABLED', 'OFF', 'ON'];
$rootScope.STATUS_CLASS = ['', 'disabled', 'warning', 'secondary-disabled'];
$rootScope.title = 'Coriolis';
/**
* Returns the name of the component mounted in the specified slot
* @param {Object} slot The slot object
* @return {String} The component name
*/
$rootScope.cName = function(slot) {
return slot.c ? slot.c.name ? slot.c.name : GroupMap[slot.c.grp] : null;
};
// Formatters
$rootScope.fCrd = d3.format(',.0f');
$rootScope.fPwr = d3.format(',.2f');
$rootScope.fRound = function(d) { return d3.round(d, 2); };
$rootScope.fRound4 = function(d) { return d3.round(d, 4); };
$rootScope.fPct = d3.format('.2%');
$rootScope.f1Pct = d3.format('.1%');
$rootScope.fRPct = d3.format('%');
$rootScope.fTime = function(d) { return Math.floor(d/60) + ":" + ("00" + Math.floor(d%60)).substr(-2,2); };
$rootScope.fTime = function(d) { return Math.floor(d / 60) + ':' + ('00' + Math.floor(d % 60)).substr(-2, 2); };
if (isStandAlone) {
var state = Persist.getState();
// If a previous state has been stored, load that state
if (state && state.name && state.params) {
$state.go(state.name, state.params, { location: 'replace' });
} else {
$state.go('shipyard', null, { location: 'replace' }); // Default to home page
}
}
// Global Event Listeners
$doc.bind('keyup', function (e) {
if(e.keyCode == 27) { // Escape Key
$doc.bind('keyup', function(e) {
if (e.keyCode == 27) { // Escape Key
$rootScope.$broadcast('close', e);
$rootScope.$apply();
} else {
@@ -43,8 +84,19 @@ angular.module('app', ['ui.router', 'ct.ui.router.extras.sticky', 'ui.sortable',
}
});
$rootScope.bgClicked = function (e) {
$rootScope.bgClicked = function(e) {
$rootScope.$broadcast('close', e);
};
if ($window.applicationCache) {
// Listen for appcache updated event, present refresh to update view
$window.applicationCache.addEventListener('updateready', function() {
if ($window.applicationCache.status == $window.applicationCache.UPDATEREADY) {
// Browser downloaded a new app cache.
$rootScope.appCacheUpdate = true;
$rootScope.$apply();
}
}, false);
}
}]);

View File

@@ -1,9 +1,9 @@
/**
* Sets up the routes and handlers before the Angular app is kicked off.
*/
angular.module('app').config(['$provide','$stateProvider', '$urlRouterProvider', '$locationProvider', 'ShipsDB', function ($provide, $stateProvider, $urlRouterProvider, $locationProvider, ships) {
angular.module('app').config(['$provide', '$stateProvider', '$urlRouterProvider', '$locationProvider', 'ShipsDB', function($provide, $stateProvider, $urlRouterProvider, $locationProvider, ships) {
// Use HTML5 push and replace state if possible
$locationProvider.html5Mode({enabled: true, requireBase: false});
$locationProvider.html5Mode({ enabled: true, requireBase: false });
/**
* Set up all states and their routes.
*/
@@ -11,13 +11,13 @@ angular.module('app').config(['$provide','$stateProvider', '$urlRouterProvider',
.state('outfit', {
url: '/outfit/:shipId/:code?bn',
params: {
shipId: { value: 'sidewinder', squash: false}, // Allow 'shipId' parameter to default to sidewinder
code: { value: null, squash: true } // Allow 'code' parameter to be empty/optional
shipId: { value: 'sidewinder', squash: false }, // Allow 'shipId' parameter to default to sidewinder
code: { value: null, squash: true } // Allow 'code' parameter to be empty/optional
},
templateUrl: 'views/page-outfit.html',
controller: 'OutfitController',
resolve: {
shipId: ['$stateParams',function ($p) { // Ensure ship exists before loading controller
shipId: ['$stateParams', function($p) { // Ensure ship exists before loading controller
if (!ships[$p.shipId]) {
throw { type: 'no-ship', message: $p.shipId };
}
@@ -28,7 +28,7 @@ angular.module('app').config(['$provide','$stateProvider', '$urlRouterProvider',
.state('compare', {
url: '/compare/:name',
params: {
name: {value: null, squash: true }
name: { value: null, squash: true }
},
templateUrl: 'views/page-comparison.html',
controller: 'ComparisonController',
@@ -41,26 +41,26 @@ angular.module('app').config(['$provide','$stateProvider', '$urlRouterProvider',
sticky: true
})
.state('shipyard', { url: '/', templateUrl: 'views/page-shipyard.html', controller: 'ShipyardController', sticky: true })
.state('error', { params: {type:null, message:null, details: null }, templateUrl: 'views/page-error.html', controller: 'ErrorController', sticky: true })
.state('error', { params: { type: null, message: null, details: null }, templateUrl: 'views/page-error.html', controller: 'ErrorController', sticky: true })
// Modal States and views
.state('modal', { abstract: true, views:{ "modal": { templateUrl: "views/_modal.html", controller: 'ModalController' } } })
.state('modal.about', { views: { "modal-content": { templateUrl: "views/modal-about.html" } } })
.state('modal.export', { params: {title:null, data: null, promise: null}, views: { "modal-content": { templateUrl: "views/modal-export.html", controller: 'ExportController' } } })
.state('modal.import', { params: {obj:null}, views: { "modal-content": { templateUrl: "views/modal-import.html", controller: 'ImportController' } } })
.state('modal.link', { params: {url:null}, views: { "modal-content": { templateUrl: "views/modal-link.html", controller: 'LinkController' } } })
.state('modal.delete', { views: { "modal-content": { templateUrl: "views/modal-delete.html", controller: 'DeleteController' } } });
.state('modal', { abstract: true, views: { 'modal': { templateUrl: 'views/_modal.html', controller: 'ModalController' } } })
.state('modal.about', { views: { 'modal-content': { templateUrl: 'views/modal-about.html' } } })
.state('modal.export', { params: { title: null, data: null, promise: null }, views: { 'modal-content': { templateUrl: 'views/modal-export.html', controller: 'ExportController' } } })
.state('modal.import', { params: { obj: null }, views: { 'modal-content': { templateUrl: 'views/modal-import.html', controller: 'ImportController' } } })
.state('modal.link', { params: { url: null }, views: { 'modal-content': { templateUrl: 'views/modal-link.html', controller: 'LinkController' } } })
.state('modal.delete', { views: { 'modal-content': { templateUrl: 'views/modal-delete.html', controller: 'DeleteController' } } });
// Redirects
$urlRouterProvider.when('/outfit','/outfit/sidewinder');
$urlRouterProvider.when('/outfit', '/outfit/sidewinder');
/**
* 404 Handler - Keep current URL/ do not redirect, change to error state.
*/
$urlRouterProvider.otherwise(function ($injector, $location) {
$urlRouterProvider.otherwise(function($injector, $location) {
// Go to error state, reload the controller, keep the current URL
$injector.get('$state').go('error', { type: 404, message: null, details: null }, {location:false, reload:true});
$injector.get('$state').go('error', { type: 404, message: null, details: null }, { location: false, reload: true });
return $location.path;
});
@@ -69,10 +69,10 @@ angular.module('app').config(['$provide','$stateProvider', '$urlRouterProvider',
* redirects uncaught errors to the error page.
*
*/
$provide.decorator('$exceptionHandler', ['$delegate', '$injector', function ($delegate, $injector) {
$provide.decorator('$exceptionHandler', ['$delegate', '$injector', function($delegate, $injector) {
return function(err, cause) {
// Go to error state, reload the controller, keep the current URL
$injector.get('$state').go('error', {type:null, message: err.message, details: err.stack }, {location:false, reload:true});
$injector.get('$state').go('error', { type: null, message: err.message, details: err.stack }, { location: false, reload: true });
$delegate(err, cause);
};
}]);

View File

@@ -1,48 +1,49 @@
angular.module('app').controller('ComparisonController', ['lodash', '$rootScope', '$filter', '$scope', '$state', '$stateParams', 'Utils', 'ShipFacets', 'ShipsDB', 'Ship', 'Persist', 'Serializer', function (_, $rootScope, $filter, $scope, $state, $stateParams, Utils, ShipFacets, Ships, Ship, Persist, Serializer) {
angular.module('app').controller('ComparisonController', ['lodash', '$rootScope', '$filter', '$scope', '$state', '$stateParams', 'Utils', 'ShipFacets', 'ShipsDB', 'Ship', 'Persist', 'Serializer', function(_, $rootScope, $filter, $scope, $state, $stateParams, Utils, ShipFacets, Ships, Ship, Persist, Serializer) {
$rootScope.title = 'Coriolis - Compare';
$scope.predicate = 'name'; // Sort by ship name as default
$scope.desc = false;
$scope.facetSortOpts = { containment: '#facet-container', orderChanged: function () { $scope.saved = false; } };
$scope.facetSortOpts = { containment: '#facet-container', orderChanged: function() { $scope.saved = false; } };
$scope.builds = [];
$scope.unusedBuilds = [];
$scope.name = $stateParams.name;
$scope.compareMode = !$stateParams.code;
$scope.importObj = {}; // Used for importing comparison builds (from permalinked comparison)
var defaultFacets = [9,6,4,1,3,2]; // Reverse order of Armour, Shields, Speed, Jump Range, Cargo Capacity, Cost
var defaultFacets = [9, 6, 4, 1, 3, 2]; // Reverse order of Armour, Shields, Speed, Jump Range, Cargo Capacity, Cost
var facets = $scope.facets = angular.copy(ShipFacets);
var shipId, buildName, comparisonData;
/**
* Add an existing build to the comparison. The build must be saved locally.
* @param {string} shipId The unique ship key/id
* @param {string} buildName The build name
* @param {string} id The unique ship key/id
* @param {string} name The build name
*/
$scope.addBuild = function (shipId, buildName, code) {
var data = Ships[shipId]; // Get ship properties
code = code? code : Persist.builds[shipId][buildName]; // Retrieve build code if not passed
var b = new Ship(shipId, data.properties, data.slots); // Create a new Ship instance
$scope.addBuild = function(id, name, code) {
var data = Ships[id]; // Get ship properties
code = code ? code : Persist.builds[id][name]; // Retrieve build code if not passed
var b = new Ship(id, data.properties, data.slots); // Create a new Ship instance
Serializer.toShip(b, code); // Populate components from code
// Extend ship instance and add properties below
b.buildName = buildName;
b.buildName = name;
b.code = code;
b.pctRetracted = b.powerRetracted / b.powerAvailable;
b.pctDeployed = b.powerDeployed / b.powerAvailable;
$scope.builds.push(b); // Add ship build to comparison
$scope.builds = $filter('orderBy')($scope.builds, $scope.predicate, $scope.desc); // Resort
_.remove($scope.unusedBuilds, function (b) { // Remove from unused builds
return b.id == shipId && b.buildName == buildName;
_.remove($scope.unusedBuilds, function(o) { // Remove from unused builds
return o.id == id && o.buildName == name;
});
$scope.saved = false;
};
/**
* Removes a build from the comparison
* @param {string} shipId The unique ship key/id
* @param {string} buildName The build name
* @param {string} id The unique ship key/id
* @param {string} name The build name
*/
$scope.removeBuild = function (shipId, buildName) {
_.remove($scope.builds, function (b) {
if (b.id == shipId && b.buildName == buildName) {
$scope.unusedBuilds.push({id: shipId, buildName: buildName, name: b.name}); // Add build back to unused builds
$scope.removeBuild = function(id, name) {
_.remove($scope.builds, function(s) {
if (s.id == id && s.buildName == name) {
$scope.unusedBuilds.push({ id: id, buildName: name, name: s.name }); // Add build back to unused builds
return true;
}
return false;
@@ -54,7 +55,7 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
* Toggles the selected the set of facets used in the comparison
* @param {number} i The index of the facet in facets
*/
$scope.toggleFacet = function (i) {
$scope.toggleFacet = function(i) {
facets[i].active = !facets[i].active;
$scope.tblUpdate = !$scope.tblUpdate; // Simple switch to trigger the table to update
$scope.saved = false;
@@ -64,12 +65,12 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
* Click handler for sorting by facets in the table
* @param {object} e Event object
*/
$scope.handleClick = function (e) {
$scope.handleClick = function(e) {
var elem = angular.element(e.target);
if(elem.attr('prop')) { // Get component ID
if (elem.attr('prop')) { // Get component ID
$scope.sort(elem.attr('prop'));
}
else if (elem.attr('del')) { // Delete index
} else if (elem.attr('del')) { // Delete index
$scope.removeBuild(elem.attr('del'));
}
};
@@ -78,8 +79,8 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
* Sort the comparison array based on the selected facet / ship property
* @param {string} key Ship property
*/
$scope.sort = function (key) {
$scope.desc = ($scope.predicate == key)? !$scope.desc : $scope.desc;
$scope.sort = function(key) {
$scope.desc = $scope.predicate == key ? !$scope.desc : $scope.desc;
$scope.predicate = key;
$scope.builds = $filter('orderBy')($scope.builds, $scope.predicate, $scope.desc);
};
@@ -94,12 +95,12 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
}
var selectedFacets = [];
facets.forEach(function(f) {
if(f.active) {
if (f.active) {
selectedFacets.unshift(f.index);
}
});
Persist.saveComparison($scope.name, $scope.builds, selectedFacets);
$state.go('compare', {name: $scope.name}, {location:'replace', notify:false});
$state.go('compare', { name: $scope.name }, { location: 'replace', notify: false });
$scope.saved = true;
};
@@ -108,7 +109,7 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
*/
$scope.delete = function() {
Persist.deleteComparison($scope.name);
$state.go('compare', {name: null}, {location:'replace', reload:true});
$state.go('compare', { name: null }, { location: 'replace', reload: true });
};
/**
@@ -134,7 +135,7 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
*/
$scope.permalink = function(e) {
e.stopPropagation();
$state.go('modal.link', {url: genPermalink()});
$state.go('modal.link', { url: genPermalink() });
};
/**
@@ -147,14 +148,14 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
e.stopPropagation();
// Make a request to goo.gl to shorten the URL, returns a promise
var promise = Utils.shortenUrl( genPermalink()).then(
function (shortUrl) {
function(shortUrl) {
return Utils.comparisonBBCode(facets, $scope.builds, shortUrl);
},
function (e) {
return 'Error - ' + e.statusText;
function(err) {
return 'Error - ' + err.statusText;
}
);
$state.go('modal.export', {promise: promise, title:'Forum BBCode'});
$state.go('modal.export', { promise: promise, title: 'Forum BBCode' });
};
/**
@@ -164,7 +165,7 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
function genPermalink() {
var selectedFacets = [];
facets.forEach(function(f) {
if(f.active) {
if (f.active) {
selectedFacets.unshift(f.index);
}
});
@@ -175,7 +176,7 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
$scope.predicate,
$scope.desc
);
return $state.href('comparison', {code: code}, {absolute:true});
return $state.href('comparison', { code: code }, { absolute: true });
}
/* Event listeners */
@@ -184,7 +185,6 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
});
/* Initialization */
var shipId, buildName, comparisonData;
if ($scope.compareMode) {
if ($scope.name == 'all') {
for (shipId in Persist.builds) {
@@ -195,13 +195,13 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
} else {
for (shipId in Persist.builds) {
for (buildName in Persist.builds[shipId]) {
$scope.unusedBuilds.push({id: shipId, buildName: buildName, name: Ships[shipId].properties.name});
$scope.unusedBuilds.push({ id: shipId, buildName: buildName, name: Ships[shipId].properties.name });
}
}
comparisonData = Persist.getComparison($scope.name);
if (comparisonData) {
defaultFacets = comparisonData.facets;
comparisonData.builds.forEach(function (b) {
comparisonData.builds.forEach(function(b) {
$scope.addBuild(b.shipId, b.buildName);
});
$scope.saved = true;
@@ -214,9 +214,9 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
$scope.name = comparisonData.n;
$scope.predicate = comparisonData.p;
$scope.desc = comparisonData.d;
comparisonData.b.forEach(function (build) {
comparisonData.b.forEach(function(build) {
$scope.addBuild(build.s, build.n, build.c);
if(!$scope.importObj[build.s]) {
if (!$scope.importObj[build.s]) {
$scope.importObj[build.s] = {};
}
$scope.importObj[build.s][build.n] = build.c;
@@ -226,9 +226,9 @@ angular.module('app').controller('ComparisonController', ['lodash', '$rootScope'
}
}
// Replace fmt with actual format function as defined in rootScope and retain original index
facets.forEach(function(f,i) { f.fmt = $rootScope[f.fmt]; f.index = i; });
facets.forEach(function(f, i) { f.fmt = $rootScope[f.fmt]; f.index = i; });
// Remove default facets, mark as active, and add them back in selected order
_.pullAt(facets, defaultFacets).forEach(function (f) { f.active = true; facets.unshift(f); });
_.pullAt(facets, defaultFacets).forEach(function(f) { f.active = true; facets.unshift(f); });
$scope.builds = $filter('orderBy')($scope.builds, $scope.predicate, $scope.desc);
}]);
}]);

View File

@@ -1,7 +1,7 @@
angular.module('app').controller('DeleteController', ['$scope', 'Persist', function ($scope, Persist) {
$scope.deleteAll = function () {
angular.module('app').controller('DeleteController', ['$scope', 'Persist', function($scope, Persist) {
$scope.deleteAll = function() {
Persist.deleteAll();
$scope.$parent.dismiss();
};
}]);
}]);

View File

@@ -1,9 +1,9 @@
angular.module('app')
.controller('ErrorController', ['$window','$rootScope','$scope','$stateParams', '$location', function ($window, $rootScope, $scope, $p, $location) {
.controller('ErrorController', ['$window', '$rootScope', '$scope', '$stateParams', '$location', function($window, $rootScope, $scope, $p, $location) {
$rootScope.title = 'Error';
$scope.path = $location.path();
$scope.type = $p.type || 'unknown';
$scope.browser = $window.navigator.appVersion;
$scope.browser = $window.navigator.userAgent;
switch ($scope.type) {
case 404:
@@ -21,9 +21,9 @@ angular.module('app')
$scope.details = $p.details;
break;
default:
$scope.msgPre = "Uh, Jameson, we have a problem..";
$scope.msgPre = 'Uh, Jameson, we have a problem..';
$scope.errorMessage = $p.message;
$scope.details = $p.details;
}
}]);
}]);

View File

@@ -1,18 +1,18 @@
angular.module('app').controller('ExportController', ['$scope', '$stateParams', function ($scope, $stateParams) {
angular.module('app').controller('ExportController', ['$scope', '$stateParams', function($scope, $stateParams) {
$scope.title = $stateParams.title || 'Export';
if ($stateParams.promise) {
$scope.export = 'Generating...';
$stateParams.promise.then(function(data){
$stateParams.promise.then(function(data) {
$scope.export = data;
});
} else {
$scope.export = angular.toJson($stateParams.data, true);
}
$scope.onTextClick = function ($event) {
$scope.onTextClick = function($event) {
$event.target.select();
};
}]);
}]);

View File

@@ -1,4 +1,4 @@
angular.module('app').controller('ImportController', ['$scope', '$stateParams', 'ShipsDB', 'Ship', 'Persist', 'Serializer', function ($scope, $stateParams, Ships, Ship, Persist, Serializer) {
angular.module('app').controller('ImportController', ['$scope', '$stateParams', 'ShipsDB', 'Ship', 'Persist', 'Serializer', function($scope, $stateParams, Ships, Ship, Persist, Serializer) {
$scope.jsonValid = false;
$scope.importData = null;
$scope.errorMsg = null;
@@ -21,7 +21,7 @@ angular.module('app').controller('ImportController', ['$scope', '$stateParams',
return;
}
if(typeof importObj != 'object') {
if (typeof importObj != 'object') {
$scope.errorMsg = 'Must be an object!';
return;
}
@@ -48,7 +48,7 @@ angular.module('app').controller('ImportController', ['$scope', '$stateParams',
}
}
} else {
$scope.errorMsg = '"' + shipId + '" is not a valid Ship Id!';
$scope.errorMsg = '"' + shipId + '"" is not a valid Ship Id!';
return;
}
$scope.builds = importObj.builds;
@@ -57,7 +57,7 @@ angular.module('app').controller('ImportController', ['$scope', '$stateParams',
$scope.jsonValid = true;
};
$scope.hasBuild = function (shipId, name) {
$scope.hasBuild = function(shipId, name) {
return Persist.getBuild(shipId, name) !== null;
};
@@ -98,4 +98,4 @@ angular.module('app').controller('ImportController', ['$scope', '$stateParams',
}
}]);
}]);

View File

@@ -1,16 +1,16 @@
angular.module('app').controller('LinkController', ['$scope', 'Utils', '$stateParams', function ($scope, Utils, $stateParams) {
angular.module('app').controller('LinkController', ['$scope', 'Utils', '$stateParams', function($scope, Utils, $stateParams) {
$scope.url = $stateParams.url;
$scope.shortenedUrl = 'Shortening...';
$scope.onTextClick = function ($event) {
$scope.onTextClick = function($event) {
$event.target.select();
};
Utils.shortenUrl($scope.url)
.then(function(url) {
$scope.shortenedUrl = url;
},function(e) {
}, function(e) {
$scope.shortenedUrl = 'Error - ' + e.statusText;
});
}]);
}]);

View File

@@ -1,9 +1,9 @@
angular.module('app').controller('ModalController', ['$rootScope','$scope', '$state', function ($rootScope, $scope, $state) {
angular.module('app').controller('ModalController', ['$rootScope', '$scope', '$state', function($rootScope, $scope, $state) {
$scope.dismiss = function() {
if ($rootScope.prevState) {
var state = $rootScope.prevState;
$state.go(state.name, state.params, {location: 'replace', reload: false});
$state.go(state.name, state.params, { location: 'replace', reload: false });
} else {
$state.go('shipyard');
}
@@ -11,4 +11,4 @@ angular.module('app').controller('ModalController', ['$rootScope','$scope', '$st
$scope.$on('close', $scope.dismiss);
}]);
}]);

View File

@@ -1,6 +1,8 @@
angular.module('app').controller('OutfitController', ['$rootScope','$scope', '$state', '$stateParams', 'ShipsDB', 'Ship', 'Components', 'Serializer', 'Persist', function ($rootScope, $scope, $state, $p, Ships, Ship, Components, Serializer, Persist) {
angular.module('app').controller('OutfitController', ['$window', '$rootScope', '$scope', '$state', '$stateParams', 'ShipsDB', 'Ship', 'Components', 'Serializer', 'Persist', 'calcTotalRange', 'calcSpeed', function($window, $rootScope, $scope, $state, $p, Ships, Ship, Components, Serializer, Persist, calcTotalRange, calcSpeed) {
var win = angular.element($window); // Angularized window object for event triggering
var data = Ships[$p.shipId]; // Retrieve the basic ship properties, slots and defaults
var ship = new Ship($p.shipId, data.properties, data.slots); // Create a new Ship instance
var retrofitShip = new Ship($p.shipId, data.properties, data.slots); // Create a new Ship for retrofit comparison
// Update the ship instance with the code (if provided) or the 'factory' defaults.
if ($p.code) {
@@ -11,7 +13,7 @@ angular.module('app').controller('OutfitController', ['$rootScope','$scope', '$s
}
$scope.buildName = $p.bn;
$rootScope.title = ship.name + ($scope.buildName? ' - ' + $scope.buildName : '');
$rootScope.title = ship.name + ($scope.buildName ? ' - ' + $scope.buildName : '');
$scope.ship = ship;
$scope.pp = ship.common[0]; // Power Plant
$scope.th = ship.common[1]; // Thruster
@@ -22,28 +24,100 @@ angular.module('app').controller('OutfitController', ['$rootScope','$scope', '$s
$scope.ft = ship.common[6]; // Fuel Tank
$scope.hps = ship.hardpoints;
$scope.internal = ship.internal;
$scope.costList = ship.costList;
$scope.powerList = ship.powerList;
$scope.priorityBands = ship.priorityBands;
$scope.availCS = Components.forShip(ship.id);
$scope.selectedSlot = null;
$scope.savedCode = Persist.getBuild(ship.id, $scope.buildName);
$scope.canSave = Persist.isEnabled();
$scope.allBuilds = Persist.builds;
$scope.fuel = 0;
$scope.pwrDesc = false;
$scope.pwrPredicate = 'type';
$scope.retroDesc = false;
$scope.retroPredicate = 'netCost';
$scope.costDesc = true;
$scope.costPredicate = 'c.cost';
$scope.costTab = 'retrofit';
if ($scope.savedCode) {
Serializer.toShip(retrofitShip, $scope.savedCode); // Populate components from last save
$scope.retrofitBuild = $scope.buildName;
} else {
retrofitShip.buildWith(data.defaults);
$scope.retrofitBuild = null;
}
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
retrofitShip.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
updateRetrofitCosts();
$scope.jrSeries = {
xMin: ship.unladenMass,
xMax: ship.ladenMass,
func: ship.jumpRangeWithMass.bind(ship)
xMin: 0,
xMax: ship.cargoCapacity,
yMax: ship.unladenRange,
yMin: 0,
func: function(cargo) { // X Axis is Cargo
return ship.jumpRangeWithMass(ship.unladenMass + $scope.fuel + cargo, $scope.fuel);
}
};
$scope.jrChart = {
labels: {
xAxis: {
title:'Ship Mass',
title: 'Cargo',
unit: 'T'
},
yAxis: {
title:'Jump Range',
title: 'Jump Range',
unit: 'LY'
}
},
watch: $scope.fsd
}
};
$scope.trSeries = {
xMin: 0,
xMax: ship.cargoCapacity,
yMax: ship.unladenTotalRange,
yMin: 0,
func: function(cargo) { // X Axis is Cargo
return calcTotalRange(ship.unladenMass + cargo, $scope.fsd.c, $scope.fuel);
}
};
$scope.trChart = {
labels: {
xAxis: {
title: 'Cargo',
unit: 'T'
},
yAxis: {
title: 'Total Range',
unit: 'LY'
}
}
};
$scope.speedSeries = {
xMin: 0,
xMax: ship.cargoCapacity,
yMax: 500,
yMin: 0,
series: ['speed', 'boost'],
func: function(cargo) { // X Axis is Cargo
return calcSpeed(ship.unladenMass + $scope.fuel + cargo, ship.speed, ship.boost, $scope.th.c);
}
};
$scope.speedChart = {
labels: {
xAxis: {
title: 'Cargo',
unit: 'T'
},
yAxis: {
title: 'Speed',
unit: 'm/s'
}
}
};
/**
@@ -69,14 +143,14 @@ angular.module('app').controller('OutfitController', ['$rootScope','$scope', '$s
* @param {[type]} slot The slot object belonging to the ship instance
* @param {[type]} e The event object
*/
$scope.select = function(type, slot, e) {
$scope.select = function(type, slot, e, id) {
e.stopPropagation();
var id = angular.element(e.target).attr('cpid'); // Get component ID
id = id || angular.element(e.target).attr('cpid'); // Get component ID
if (id) {
if (id == 'empty') {
ship.use(slot, null, null);
} else if(type == 'h') {
} else if (type == 'h') {
ship.use(slot, id, Components.hardpoints(id));
} else if (type == 'c') {
ship.use(slot, id, Components.common(ship.common.indexOf(slot), id));
@@ -86,8 +160,7 @@ angular.module('app').controller('OutfitController', ['$rootScope','$scope', '$s
ship.useBulkhead(id);
}
$scope.selectedSlot = null;
$scope.code = Serializer.fromShip(ship);
updateState();
updateState(Serializer.fromShip(ship));
}
};
@@ -97,11 +170,24 @@ angular.module('app').controller('OutfitController', ['$rootScope','$scope', '$s
$scope.reloadBuild = function() {
if ($scope.buildName && $scope.savedCode) {
Serializer.toShip(ship, $scope.savedCode); // Repopulate with components from last save
$scope.code = $scope.savedCode;
updateState();
updateState($scope.savedCode);
}
};
/**
* Strip ship to D-class and no other components.
*/
$scope.stripBuild = function() {
for (var i = 0, l = ship.common.length - 1; i < l; i++) { // All except Fuel Tank
var id = ship.common[i].maxClass + 'D';
ship.use(ship.common[i], id, Components.common(i, id));
}
ship.hardpoints.forEach(function(slot) { ship.use(slot, null, null); });
ship.internal.forEach(function(slot) { ship.use(slot, null, null); });
ship.useBulkhead(0);
updateState(Serializer.fromShip(ship));
};
/**
* Save the current build. Will replace the saved build if there is one
* for this ship & with the exact name.
@@ -118,7 +204,10 @@ angular.module('app').controller('OutfitController', ['$rootScope','$scope', '$s
if ($scope.code != $scope.savedCode) {
Persist.saveBuild(ship.id, $scope.buildName, $scope.code);
$scope.savedCode = $scope.code;
updateState();
if ($scope.retrofitBuild === $scope.buildName) {
Serializer.toShip(retrofitShip, $scope.code);
}
updateState($scope.code);
}
};
@@ -128,13 +217,13 @@ angular.module('app').controller('OutfitController', ['$rootScope','$scope', '$s
*/
$scope.deleteBuild = function() {
Persist.deleteBuild(ship.id, $scope.buildName);
$state.go('outfit', {shipId: ship.id, code: null, bn: null}, {location:'replace', reload:true});
$state.go('outfit', { shipId: ship.id, code: null, bn: null }, { location: 'replace', reload: true });
};
/**
* On build name change, retrieve the existing saved code if there is one
*/
$scope.bnChange = function(){
$scope.bnChange = function() {
$scope.savedCode = Persist.getBuild(ship.id, $scope.buildName);
};
@@ -143,34 +232,135 @@ angular.module('app').controller('OutfitController', ['$rootScope','$scope', '$s
* @param {object} item The component being toggled
*/
$scope.toggleCost = function(item) {
item.incCost = !item.incCost;
ship.updateTotals();
ship.setCostIncluded(item, !item.incCost);
};
/**
* [sortCost description]
* @param {[type]} key [description]
* @return {[type]} [description]
*/
$scope.sortCost = function(key) {
$scope.costDesc = $scope.costPredicate == key ? !$scope.costDesc : $scope.costDesc;
$scope.costPredicate = key;
};
$scope.sortPwr = function(key) {
$scope.pwrDesc = $scope.pwrPredicate == key ? !$scope.pwrDesc : $scope.pwrDesc;
$scope.pwrPredicate = key;
};
$scope.sortRetrofit = function(key) {
$scope.retroDesc = $scope.retroPredicate == key ? !$scope.retroDesc : $scope.retroDesc;
$scope.retroPredicate = key;
};
/**
* Toggle the power on/off for the selected component
* @param {object} item The component being toggled
*/
$scope.togglePwr = function(item) {
item.enabled = !item.enabled;
ship.updateTotals();
$scope.togglePwr = function(c) {
ship.setSlotEnabled(c, !c.enabled);
updateState(Serializer.fromShip(ship));
};
$scope.incPriority = function(c) {
if (ship.changePriority(c, c.priority + 1)) {
updateState(Serializer.fromShip(ship));
}
};
$scope.decPriority = function(c) {
if (ship.changePriority(c, c.priority - 1)) {
updateState(Serializer.fromShip(ship));
}
};
$scope.fuelChange = function(fuel) {
$scope.fuel = fuel;
win.triggerHandler('render');
};
$scope.statusRetracted = function(slot) {
return ship.getSlotStatus(slot, false);
};
$scope.statusDeployed = function(slot) {
return ship.getSlotStatus(slot, true);
};
$scope.setRetrofitBase = function() {
if ($scope.retrofitBuild) {
Serializer.toShip(retrofitShip, Persist.getBuild(ship.id, $scope.retrofitBuild));
} else {
retrofitShip.buildWith(data.defaults);
}
updateRetrofitCosts();
};
// Utilify functions
function updateState() {
$state.go('outfit', {shipId: ship.id, code: $scope.code, bn: $scope.buildName}, {location:'replace', notify:false});
$scope.jrSeries.xMin = ship.unladenMass;
$scope.jrSeries.xMax = ship.ladenMass;
function updateState(code) {
$scope.code = code;
$state.go('outfit', { shipId: ship.id, code: $scope.code, bn: $scope.buildName }, { location: 'replace', notify: false });
$scope.speedSeries.xMax = $scope.trSeries.xMax = $scope.jrSeries.xMax = ship.cargoCapacity;
$scope.jrSeries.yMax = ship.unladenRange;
$scope.trSeries.yMax = ship.unladenTotalRange;
updateRetrofitCosts();
win.triggerHandler('pwrchange');
}
function updateRetrofitCosts() {
var costs = $scope.retrofitList = [];
var cName = $rootScope.cName;
var total = 0, i, l, item;
if (ship.bulkheads.id != retrofitShip.bulkheads.id) {
item = {
buyClassRating: ship.bulkheads.c.class + ship.bulkheads.c.rating,
buyName: cName(ship.bulkheads),
sellClassRating: retrofitShip.bulkheads.c.class + retrofitShip.bulkheads.c.rating,
sellName: cName(retrofitShip.bulkheads),
netCost: ship.bulkheads.discountedCost - retrofitShip.bulkheads.discountedCost
};
costs.push(item);
total += item.netCost;
}
for (var g in { common: 1, internal: 1, hardpoints: 1 }) {
var retroSlotGroup = retrofitShip[g];
var slotGroup = ship[g];
for (i = 0, l = slotGroup.length; i < l; i++) {
if (slotGroup[i].id != retroSlotGroup[i].id) {
item = { netCost: 0 };
if (slotGroup[i].id) {
item.buyName = cName(slotGroup[i]);
item.buyClassRating = slotGroup[i].c.class + slotGroup[i].c.rating;
item.netCost = slotGroup[i].discountedCost;
}
if (retroSlotGroup[i].id) {
item.sellName = cName(retroSlotGroup[i]);
item.sellClassRating = retroSlotGroup[i].c.class + retroSlotGroup[i].c.rating;
item.netCost -= retroSlotGroup[i].discountedCost;
}
costs.push(item);
total += item.netCost;
}
}
}
$scope.retrofitTotal = total;
}
// Hide any open menu/slot/etc if escape key is pressed
$scope.$on('escape', function () {
$scope.selectedSlot = null;
$scope.$apply();
});
// Hide any open menu/slot/etc if the background is clicked
$scope.$on('close', function () {
$scope.$on('close', function() {
$scope.selectedSlot = null;
});
// Hide any open menu/slot/etc if the background is clicked
$scope.$on('discountChange', function() {
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
retrofitShip.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
updateRetrofitCosts();
});
}]);

View File

@@ -1,4 +1,4 @@
angular.module('app').controller('ShipyardController', ['$rootScope', 'ShipsDB', function ($rootScope, ships) {
angular.module('app').controller('ShipyardController', ['$rootScope', 'ShipsDB', function($rootScope, ships) {
$rootScope.title = 'Coriolis';
$rootScope.ships = ships;
}]);
}]);

View File

@@ -1,123 +1,163 @@
angular.module('app').directive('areaChart', function () {
angular.module('app').directive('areaChart', ['$window', function($window) {
return {
restrict: 'A',
scope:{
scope: {
config: '=',
series: '=',
height: '=',
width: '='
series: '='
},
link: function(scope, element) {
var width = element[0].parentElement.offsetWidth,
height = width * 0.6,
series = scope.series,
var series = scope.series,
config = scope.config,
labels = config.labels,
margin = {top: 15, right: 15, bottom: 35, left: 50},
w = width - margin.left - margin.right,
h = height - margin.top - margin.bottom,
margin = { top: 15, right: 15, bottom: 35, left: 60 },
fmt = d3.format('.3r'),
fmtLong = d3.format('.2f');
fmtLong = d3.format('.2f'),
func = series.func,
drag = d3.behavior.drag(),
dragging = false,
// Define Axes
xAxis = d3.svg.axis().outerTickSize(0).orient('bottom').tickFormat(d3.format('.2r')),
yAxis = d3.svg.axis().ticks(6).outerTickSize(0).orient('left').tickFormat(fmt),
x = d3.scale.linear(),
y = d3.scale.linear(),
data = [];
// Create chart
var svg = d3.select(element[0]).append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var svg = d3.select(element[0]).append('svg');
var vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
// Define Axes
var x = d3.scale.linear().range([0, w]);
var y = d3.scale.linear().range([h, 0]);
var xAxis = d3.svg.axis().outerTickSize(0).orient("bottom").tickFormat(fmt);
var yAxis = d3.svg.axis().outerTickSize(0).orient("left").tickFormat(fmt);
// Define Area
var area = d3.svg.area().x(function(d) { return x(d[0]); }).y0(h).y1(function(d) { return y(d[1]); });
var area = d3.svg.area();
var gradient = svg.append("defs")
.append("linearGradient")
.attr("id", "gradient")
.attr("x1", "0%").attr("y1", "0%")
.attr("x2", "100%").attr("y2", "100%")
.attr("spreadMethod", "pad");
gradient.append("stop")
.attr("offset", "0%")
.attr("stop-color", "#ff8c0d")
.attr("stop-opacity", 1);
gradient.append("stop")
.attr("offset", "100%")
.attr("stop-color", "#ff3b00")
.attr("stop-opacity", 1);
var gradient = vis.append('defs')
.append('linearGradient')
.attr('id', 'gradient')
.attr('x1', '0%').attr('y1', '0%')
.attr('x2', '100%').attr('y2', '100%')
.attr('spreadMethod', 'pad');
gradient.append('stop')
.attr('offset', '0%')
.attr('stop-color', '#ff8c0d')
.attr('stop-opacity', 1);
gradient.append('stop')
.attr('offset', '100%')
.attr('stop-color', '#ff3b00')
.attr('stop-opacity', 1);
// Create Y Axis SVG Elements
svg.append("g").attr("class", "y axis")
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", -40)
.attr("x", -h/2)
.attr("dy", ".1em")
.style("text-anchor", "middle")
var yTxt = vis.append('g').attr('class', 'y axis')
.append('text')
.attr('transform', 'rotate(-90)')
.attr('y', -50)
.attr('dy', '.1em')
.style('text-anchor', 'middle')
.text(labels.yAxis.title + ' (' + labels.yAxis.unit + ')');
// Create X Axis SVG Elements
svg.append("g").attr("class", "x axis").attr("transform", "translate(0," + h + ")")
.append("text")
.attr("y", 30)
.attr("x", w/2)
.attr("dy", ".1em")
.style("text-anchor", "middle")
var xLbl = vis.append('g').attr('class', 'x axis');
var xTxt = xLbl.append('text')
.attr('y', 30)
.attr('dy', '.1em')
.style('text-anchor', 'middle')
.text(labels.xAxis.title + ' (' + labels.xAxis.unit + ')');
// Create and Add tooltip
var tip = svg.append("g").style("display", "none");
tip.append("circle")
.attr("class", "marker")
.attr("r", 4);
tip.append("text").attr("class", 'label x').attr("y", -2);
tip.append("text").attr("class", 'label y').attr("y", '0.7em');
var tip = vis.append('g').style('display', 'none');
tip.append('rect').attr('width', '4.5em').attr('height', '2em').attr('x', '0.5em').attr('y', '-1em').attr('class', 'tip');
tip.append('circle')
.attr('class', 'marker')
.attr('r', 4);
tip.append('text').attr('class', 'label x').attr('y', '-0.25em');
tip.append('text').attr('class', 'label y').attr('y', '0.85em');
vis.insert('path', ':first-child') // Area/Path to appear behind everything else
.data([data])
.attr('class', 'area')
.attr('fill', 'url(#gradient)')
.attr('d', area)
.on('mouseover', showTip)
.on('mouseout', hideTip)
.on('mousemove', moveTip)
.call(drag);
drag
.on('dragstart', function() {
dragging = true;
moveTip.call(this);
showTip();
})
.on('dragend', function() {
dragging = false;
hideTip();
})
.on('drag', moveTip);
/**
* Watch for changes in the series data (mass changes, etc)
*/
scope.$watchCollection('series', render);
scope.$watchCollection('config.watch', render);
angular.element($window).bind('orientationchange resize render', render);
function render() {
var data = [];
var func = series.func;
for (var d = series.xMin; d <= series.xMax; d++) {
data.push([ d, func(d) ]);
var width = element[0].parentElement.offsetWidth,
height = width * 0.5,
w = width - margin.left - margin.right,
h = height - margin.top - margin.bottom;
data.length = 0; // Reset Data array
if (series.xMax == series.xMin) {
var yVal = func(series.xMin);
data.push([ series.xMin, yVal ]);
data.push([ series.xMin, yVal ]);
area.x(function(d, i) { return i * w; }).y0(h).y1(function(d) { return y(d[1]); });
} else {
for (var val = series.xMin; val <= series.xMax; val += 1) {
data.push([ val, func(val) ]);
}
area.x(function(d) { return x(d[0]); }).y0(h).y1(function(d) { return y(d[1]); });
}
// Update domain and scale for axes;
x.domain([series.xMin, series.xMax]);
// Update Chart Size
svg.attr('width', width).attr('height', height);
// Update domain and scale for axes
x.range([0, w]).domain([series.xMin, series.xMax]).clamp(true);
xAxis.scale(x);
y.domain([data[data.length - 1][1], data[0][1]]);
xLbl.attr('transform', 'translate(0,' + h + ')');
xTxt.attr('x', w / 2);
y.range([h, 0]).domain([series.yMin, series.yMax]);
yAxis.scale(y);
svg.selectAll(".y.axis").call(yAxis);
svg.selectAll(".x.axis").call(xAxis);
yTxt.attr('x', -h / 2);
vis.selectAll('.y.axis').call(yAxis);
vis.selectAll('.x.axis').call(xAxis);
// Remove existing elements
svg.selectAll('path.area').remove();
svg.insert("path",':first-child') // Area/Path to appear behind everything else
.datum(data)
.attr("class", "area")
.attr('fill', 'url(#gradient)')
.attr("d", area)
.on("mouseover", function() { tip.style("display", null); })
.on("mouseout", function() { tip.style("display", "none"); })
.on('mousemove', function() {
var xPos = d3.mouse(this)[0], x0 = x.invert(xPos), y0 = func(x0), flip = (xPos > w * 0.75);
tip.attr("transform", "translate(" + x(x0) + "," + y(y0) + ")");
tip.selectAll('text.label').attr("x", flip? -10 : 10).style("text-anchor", flip? 'end' : 'start');
tip.select('text.label.x').text(fmtLong(x0) + ' ' + labels.xAxis.unit);
tip.select('text.label.y').text(fmtLong(y0) + ' ' + labels.yAxis.unit);
});
vis.selectAll('path.area') // Area/Path to appear behind everything else
.data([data])
.attr('d', area);
}
function showTip() {
tip.style('display', null);
}
function hideTip() {
if (!dragging) {
tip.style('display', 'none');
}
}
function moveTip() {
var xPos = d3.mouse(this)[0], x0 = x.invert(xPos), y0 = func(x0), flip = (x0 / x.domain()[1] > 0.65);
tip.attr('transform', 'translate(' + x(x0) + ',' + y(y0) + ')');
tip.selectAll('rect').attr('x', flip ? '-5.75em' : '0.5em').style('text-anchor', flip ? 'end' : 'start');
tip.selectAll('text.label').attr('x', flip ? '-2em' : '1em').style('text-anchor', flip ? 'end' : 'start');
tip.select('text.label.x').text(fmtLong(x0) + ' ' + labels.xAxis.unit);
tip.select('text.label.y').text(fmtLong(y0) + ' ' + labels.yAxis.unit);
}
scope.$on('$destroy', function() {
angular.element($window).unbind('orientationchange resize render', render);
});
}
};
});
}]);

View File

@@ -1,89 +1,94 @@
angular.module('app').directive('barChart', function () {
angular.module('app').directive('barChart', ['$window', function($window) {
function bName (build) {
function bName(build) {
return build.buildName + '\n' + build.name;
}
var insertLinebreaks = function (d) {
function insertLinebreaks(d) {
var el = d3.select(this);
var words = d.split('\n');
el.text('').attr('y', -5);
el.text('').attr('y', -6);
for (var i = 0; i < words.length; i++) {
var tspan = el.append('tspan').text(words[i]);
if (i > 0) {
tspan.attr('x', -9).attr('dy', 10);
tspan.attr('x', -9).attr('dy', 12);
}
}
};
}
return {
restrict: 'A',
scope:{
scope: {
data: '=',
facet: '=',
height: '=',
width: '='
facet: '='
},
link: function(scope, element) {
var color = d3.scale.ordinal().range([ '#7b6888', '#6b486b', '#3182bd', '#a05d56', '#d0743c']),
width = scope.width,
labels = scope.facet.lbls,
fmt = scope.facet.fmt,
properties = scope.facet.props,
unit = scope.facet.unit,
margin = {top: 10, right: 20, bottom: 35, left: 150},
w = width - margin.left - margin.right;
margin = { top: 10, right: 20, bottom: 35, left: 150 },
y0 = d3.scale.ordinal(),
y1 = d3.scale.ordinal(),
x = d3.scale.linear(),
yAxis = d3.svg.axis().scale(y0).outerTickSize(0).orient('left'),
xAxis = d3.svg.axis().scale(x).ticks(5).outerTickSize(0).orient('bottom').tickFormat(d3.format('.2s'));
// Create chart
var svg = d3.select(element[0]).append('svg').attr('width', width);
var svg = d3.select(element[0]).append('svg');
var vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
// Create and Add tooltip
var tip = d3.tip()
.attr('class', 'd3-tip')
.html(function(property, propertyIndex) {
return (labels? (labels[propertyIndex] + ': ') : '') + fmt(property.value) + ' ' + unit;
return (labels ? (labels[propertyIndex] + ': ') : '') + fmt(property.value) + ' ' + unit;
});
vis.call(tip);
// Create Y Axis SVG Elements
vis.append('g').attr('class', 'y axis');
vis.selectAll('g.y.axis g text').each(insertLinebreaks);
// Create X Axis SVG Elements
vis.append('g')
var xAxisLbl = vis.append('g')
.attr('class', 'x axis')
.append('text')
.attr('y', 30)
.attr('x', w/2)
.attr('dy', '.1em')
.style('text-anchor', 'middle')
.text(scope.facet.title + (unit? (' (' + unit + ')') : ''));
.text(scope.facet.title + (unit ? (' (' + unit + ')') : ''));
/**
* Watch for changes in the comparison array (ships added/removed, sorting)
*/
scope.$watchCollection('data', function() {
scope.$watchCollection('data', render);
angular.element($window).bind('orientationchange resize render', render);
function render() {
var data = scope.data,
height = 45 + (25 * data.length),
width = element[0].offsetWidth,
w = width - margin.left - margin.right,
height = 45 + (30 * data.length),
h = height - margin.top - margin.bottom,
maxVal = d3.max(data, function(d) { return d3.max(properties, function(p) {return d[p]; }); }),
y0 = d3.scale.ordinal().domain(data.map(bName)).rangeRoundBands([0, h],0.3),
y1 = d3.scale.ordinal().domain(properties).rangeRoundBands([0, y0.rangeBand()]),
x = d3.scale.linear().range([0, w]).domain([0, maxVal]),
yAxis = d3.svg.axis().scale(y0).outerTickSize(0).orient('left'),
xAxis = d3.svg.axis().scale(x).outerTickSize(0).orient('bottom').tickFormat(d3.format('.2s'));
maxVal = d3.max(data, function(d) { return d3.max(properties, function(p) {return d[p]; }); });
// Update chart size
svg.attr('height', height);
svg.attr('width', width).attr('height', height);
// Remove existing elements
vis.selectAll('.ship').remove();
vis.selectAll('rect').remove();
// Update X & Y Axis
x.range([0, w]).domain([0, maxVal]);
y0.domain(data.map(bName)).rangeRoundBands([0, h], 0.3);
y1.domain(properties).rangeRoundBands([0, y0.rangeBand()]);
vis.selectAll('.y.axis').call(yAxis);
vis.selectAll('.x.axis').attr('transform', 'translate(0,' + h + ')').call(xAxis);
xAxisLbl.attr('x', w / 2);
// Update Y-Axis labels
vis.selectAll('g.y.axis g text').each(insertLinebreaks);
@@ -97,25 +102,26 @@ angular.module('app').directive('barChart', function () {
.data(function(build) {
var o = [];
for (var i = 0; i < properties.length; i++) {
o.push({name: properties[i], value:build[properties[i]]});
o.push({ name: properties[i], value: build[properties[i]] });
}
return o;
})
.enter().append('rect')
.attr('height', y1.rangeBand())
.attr('x',0)
.attr('x', 0)
.attr('y', function(d) {return y1(d.name); })
.attr('width', function(d) { return x(d.value); })
.on('mouseover', tip.show)
.on('mouseout', tip.hide)
.style('fill', function(d) { return color(d.name); });
});
}
scope.$on('$destroy', function() {
angular.element($window).unbind('orientationchange resize render', render);
tip.destroy(); // Remove the tooltip from the DOM
});
}
};
});
}]);

View File

@@ -1,4 +1,4 @@
angular.module('app').directive('comparisonTable', ['$state', function ($state) {
angular.module('app').directive('comparisonTable', ['$state', function($state) {
function tblHeader(facets) {
var r1 = ['<tr class="main"><th rowspan="2" class="prop" prop="name">Ship</th><th rowspan="2" class="prop" prop="buildName">Build</th>'];
@@ -8,17 +8,17 @@ angular.module('app').directive('comparisonTable', ['$state', function ($state)
var f = facets[i];
var p = f.props;
var pl = p.length;
r1.push('<th rowspan="', f.props.length == 1 ? 2 : 1,'" colspan="',pl,'"');
r1.push('<th rowspan="', f.props.length == 1 ? 2 : 1, '" colspan="', pl, '"');
if (pl == 1) {
r1.push(' prop="',p[0],'" class="prop"');
r1.push(' prop="', p[0], '" class="prop"');
} else {
for (var j = 0; j < pl; j++) {
r2.push('<th prop="', p[j], '" class="prop ', j === 0? 'lft' : '', ' ">' , f.lbls[j], '</th>');
r2.push('<th prop="', p[j], '" class="prop ', j === 0 ? 'lft' : '', '">', f.lbls[j], '</th>');
}
}
r1.push('>', f.title ,'</th>');
r1.push('>', f.title, '</th>');
}
}
r1.push('</tr><tr>');
@@ -30,16 +30,16 @@ angular.module('app').directive('comparisonTable', ['$state', function ($state)
function tblBody(facets, builds) {
var body = [];
if(builds.length === 0) {
if (builds.length === 0) {
return '<td colspan="100" class="cen">No builds added to comparison!</td';
}
for (var i = 0, l = builds.length; i < l; i++) {
var b = builds[i];
body.push('<tr class="tr">');
var href = $state.href('outfit',{shipId: b.id, code: b.code, bn: b.buildName});
body.push('<td class="tl"><a href="', href,'">', b.name,'</a></td>');
body.push('<td class="tl"><a href="', href,'">', b.buildName,'</a></td>');
var href = $state.href('outfit', { shipId: b.id, code: b.code, bn: b.buildName });
body.push('<td class="tl"><a href="', href, '">', b.name, '</a></td>');
body.push('<td class="tl"><a href="', href, '">', b.buildName, '</a></td>');
for (var j = 0, fl = facets.length; j < fl; j++) {
if (facets[j].active) {
@@ -59,13 +59,13 @@ angular.module('app').directive('comparisonTable', ['$state', function ($state)
return {
restrict: 'A',
link: function (scope, element) {
link: function(scope, element) {
var header = angular.element('<thead></thead>');
var body = angular.element('<tbody></tbody>');
element.append(header);
element.append(body);
var updateAll = function (){
var updateAll = function() {
header.html(tblHeader(scope.facets));
body.html(tblBody(scope.facets, scope.builds));
};
@@ -77,4 +77,4 @@ angular.module('app').directive('comparisonTable', ['$state', function ($state)
});
}
};
}]);
}]);

View File

@@ -1,4 +1,4 @@
angular.module('app').directive('componentSelect', function () {
angular.module('app').directive('componentSelect', function() {
// Generting the HTML in this manner is MUCH faster than using an angular template.
@@ -8,42 +8,42 @@ angular.module('app').directive('componentSelect', function () {
var o = opts[i];
var id = o.id || (o.class + o.rating); // Common components' ID is their class and rating
if(i > 0 && opts.length > 3 && o.class != prevClass && (!o.grp || o.rating != prevRating || o.mode)) {
if (i > 0 && opts.length > 3 && o.class != prevClass && (!o.grp || o.rating != prevRating || o.mode)) {
list.push('<br/>');
}
list.push('<li class="', o.name? 'lc' : 'c');
list.push('<li class="', o.name ? 'lc' : 'c');
if (cid == id) {
list.push(' active');
}
list.push((o.maxmass && mass > o.maxmass)? ' disabled"' : '" cpid="', id, '">');
list.push((o.maxmass && mass > o.maxmass) ? ' disabled"' : '" cpid="', id, '">');
if(o.mode) {
list.push('<svg cpid="', id, '" class="icon lg"><use xlink:href="#mount-', o.mode , '"></use></svg> ');
if (o.mode) {
list.push('<svg cpid="', id, '" class="icon lg"><use cpid="', id, '" xlink:href="#mount-', o.mode, '"></use></svg> ');
}
list.push(o.class, o.rating);
if(o.missile) {
if (o.missile) {
list.push('/' + o.missile);
}
if(o.name) {
if (o.name) {
list.push(' ' + o.name);
}
list.push('</li>');
prevClass = o.class;
prevRating= o.rating;
prevRating = o.rating;
}
}
return {
restrict: 'A',
scope:{
scope: {
opts: '=', // Component Options object
groups: '=', // Groups of Component Options
mass: '=', // Current ship unladen mass
@@ -57,13 +57,13 @@ angular.module('app').directive('componentSelect', function () {
var groups = scope.groups;
var mass = scope.mass || 0;
if(groups) {
if (groups) {
// At present time slots with grouped options (Hardpoints and Internal) can be empty
list.push('<div class="empty-c" cpid="empty">EMPTY</div>');
for (var g in groups) {
var grp = groups[g];
var grpCode = grp[Object.keys(grp)[0]].grp; // Nasty operation to get the grp property of the first/any single component
list.push('<div id="', grpCode ,'" class="select-group">', g, '</div><ul>');
list.push('<div id="', grpCode, '" class="select-group">', g, '</div><ul>');
appendGroup(list, grp, cid, mass);
list.push('</ul>');
}
@@ -77,9 +77,9 @@ angular.module('app').directive('componentSelect', function () {
// If groups are present and a component is already selectd
if (groups && component && component.grp) {
var groupElement = angular.element(document.getElementById(component.grp));
var parentElem = element[0].parentElement;
var parentElem = element[0].parentElement;
parentElem.scrollTop = groupElement[0].offsetTop; // Scroll to currently selected group
}
}
};
});
});

View File

@@ -0,0 +1,12 @@
angular.module('app').directive('contextMenu', ['$parse', function($parse) {
return function(scope, element, attrs) {
var fn = $parse(attrs.contextMenu);
element.bind('contextmenu', function(e) {
scope.$apply(function() {
e.preventDefault();
fn(scope, { $event: e });
});
});
};
}]);

View File

@@ -1,35 +1,30 @@
angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Persist', 'ShipsDB', function (_, $rootScope, Persist, ships) {
angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Persist', 'ShipsDB', function(_, $rootScope, Persist, ships) {
return {
restrict: 'E',
templateUrl: 'views/_header.html',
scope: true,
link: function (scope) {
link: function(scope) {
scope.openedMenu = null;
scope.ships = ships;
scope.allBuilds = Persist.builds;
scope.buildsList = Object.keys(scope.allBuilds).sort();
scope.allComparisons = Persist.comparisons;
scope.bs = Persist.state;
// Insurance options and management here for now.
$rootScope.insurance = {
opts: [
{ name:'Standard', pct: 0.05 },
{ name:'Alpha', pct: 0.025 },
{ name:'Beta', pct: 0.035 }
]
};
var insIndex = _.findIndex($rootScope.insurance.opts, 'name', Persist.getInsurance());
$rootScope.insurance.current = $rootScope.insurance.opts[insIndex != -1? insIndex : 0];
var savedDiscounts = Persist.getDiscount() || [1, 1];
$rootScope.insurance.current = $rootScope.insurance.opts[insIndex != -1 ? insIndex : 0];
$rootScope.discounts.ship = savedDiscounts[0];
$rootScope.discounts.components = savedDiscounts[1];
// Close menus if a navigation change event occurs
$rootScope.$on('$stateChangeStart',function(){
$rootScope.$on('$stateChangeStart', function() {
scope.openedMenu = null;
});
// Listen to close event to close opened menus or modals
$rootScope.$on('close', function () {
$rootScope.$on('close', function() {
scope.openedMenu = null;
$rootScope.showAbout = false;
});
@@ -37,13 +32,21 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Pers
/**
* Save selected insurance option
*/
scope.updateInsurance = function(){
scope.updateInsurance = function() {
Persist.setInsurance($rootScope.insurance.current.name);
};
scope.openMenu = function (e, menu) {
/**
* Save selected discount option
*/
scope.updateDiscount = function() {
Persist.setDiscount([$rootScope.discounts.ship, $rootScope.discounts.components]);
$rootScope.$broadcast('discountChange');
};
scope.openMenu = function(e, menu) {
e.stopPropagation();
if(menu == scope.openedMenu) {
if (menu == scope.openedMenu) {
scope.openedMenu = null;
return;
}
@@ -62,9 +65,13 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Pers
$rootScope.showAbout = true;
};
$rootScope.hideAbout = function (){
$rootScope.hideAbout = function() {
$rootScope.showAbout = false;
};
scope.$watchCollection('allBuilds', function() {
scope.buildsList = Object.keys(scope.allBuilds).sort();
});
}
};
}]);
}]);

View File

@@ -0,0 +1,190 @@
angular.module('app').directive('lineChart', ['$window', function($window) {
return {
restrict: 'A',
scope: {
config: '=',
series: '='
},
link: function(scope, element) {
var seriesConfig = scope.series,
series = seriesConfig.series,
color = d3.scale.ordinal().range([ '#ff8c0d', '#1fb0ff', '#a05d56', '#d0743c']),
config = scope.config,
labels = config.labels,
margin = { top: 15, right: 15, bottom: 35, left: 60 },
fmt = d3.format('.3r'),
fmtLong = d3.format('.2f'),
func = seriesConfig.func,
drag = d3.behavior.drag(),
dragging = false,
// Define Scales
x = d3.scale.linear(),
y = d3.scale.linear(),
// Define Axes
xAxis = d3.svg.axis().scale(x).outerTickSize(0).orient('bottom').tickFormat(d3.format('.2r')),
yAxis = d3.svg.axis().scale(y).ticks(6).outerTickSize(0).orient('left').tickFormat(fmt),
data = [];
// Create chart
var svg = d3.select(element[0]).append('svg');
var vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
var lines = vis.append('g');
// Define Area
var line = d3.svg.line().y(function(d) { return y(d[1]); });
// Create Y Axis SVG Elements
var yTxt = vis.append('g').attr('class', 'y axis')
.append('text')
.attr('transform', 'rotate(-90)')
.attr('y', -50)
.attr('dy', '.1em')
.style('text-anchor', 'middle')
.text(labels.yAxis.title + ' (' + labels.yAxis.unit + ')');
// Create X Axis SVG Elements
var xLbl = vis.append('g').attr('class', 'x axis');
var xTxt = xLbl.append('text')
.attr('y', 30)
.attr('dy', '.1em')
.style('text-anchor', 'middle')
.text(labels.xAxis.title + ' (' + labels.xAxis.unit + ')');
// Create and Add tooltip
var tipWidth = (Math.max(labels.yAxis.unit.length, labels.xAxis.unit.length) * 1.25) + 2;
var tips = vis.append('g').style('display', 'none');
var background = vis.append('rect') // Background to capture hover/drag
.attr('fill-opacity', 0)
.on('mouseover', showTip)
.on('mouseout', hideTip)
.on('mousemove', moveTip)
.call(drag);
drag
.on('dragstart', function() {
dragging = true;
moveTip.call(this);
showTip();
})
.on('dragend', function() {
dragging = false;
hideTip();
})
.on('drag', moveTip);
/**
* Watch for changes in the series data (mass changes, etc)
*/
scope.$watchCollection('series', render);
angular.element($window).bind('orientationchange resize render', render);
function render() {
var width = element[0].parentElement.offsetWidth,
height = width * 0.5,
xMax = seriesConfig.xMax,
xMin = seriesConfig.xMin,
yMax = seriesConfig.yMax,
yMin = seriesConfig.yMin,
w = width - margin.left - margin.right,
h = height - margin.top - margin.bottom,
s, val, yVal, delta;
data.length = 0; // Reset Data array
if (seriesConfig.xMax == seriesConfig.xMin) {
line.x(function(d, i) { return i * w; });
} else {
line.x(function(d) { return x(d[0]); });
}
if (series) {
for (s = 0; s < series.length; s++) {
data.push([]);
}
if (xMax == xMin) {
yVal = func(xMin);
for (s = 0; s < series.length; s++) {
data[s].push( [ xMin, yVal[ series[s] ] ], [ 1, yVal[ series[s] ] ]);
}
} else {
delta = (xMax - xMin) / 30; // Only render 30 points on the graph
for (val = xMin; val <= xMax; val += delta) {
yVal = func(val);
for (s = 0; s < series.length; s++) {
data[s].push([ val, yVal[ series[s] ] ]);
}
}
}
} else {
var seriesData = [];
if (xMax == xMin) {
yVal = func(xMin);
seriesData.push([ xMin, yVal ], [ 1, yVal ]);
} else {
delta = (xMax - xMin) / 30; // Only render 30 points on the graph
for (val = xMin; val <= xMax; val += delta) {
seriesData.push([val, func(val) ]);
}
}
data.push(seriesData);
}
// Update Chart Size
svg.attr('width', width).attr('height', height);
background.attr('height', h).attr('width', w);
// Update domain and scale for axes
x.range([0, w]).domain([xMin, xMax]).clamp(true);
xLbl.attr('transform', 'translate(0,' + h + ')');
xTxt.attr('x', w / 2);
y.range([h, 0]).domain([yMin, yMax]);
yTxt.attr('x', -h / 2);
vis.selectAll('.y.axis').call(yAxis);
vis.selectAll('.x.axis').call(xAxis);
lines.selectAll('path.line')
.data(data)
.attr('d', line) // Update existing series
.enter() // Add new series
.append('path')
.attr('class', 'line')
.attr('stroke', function(d, i) { return color(i); })
.attr('stroke-width', 2)
.attr('d', line);
var tip = tips.selectAll('g.tooltip').data(data).enter().append('g').attr('class', 'tooltip');
tip.append('rect').attr('width', tipWidth + 'em').attr('height', '2em').attr('x', '0.5em').attr('y', '-1em').attr('class', 'tip');
tip.append('circle').attr('class', 'marker').attr('r', 4);
tip.append('text').attr('class', 'label x').attr('y', '-0.25em');
tip.append('text').attr('class', 'label y').attr('y', '0.85em');
}
function showTip() {
tips.style('display', null);
}
function hideTip() {
if (!dragging) {
tips.style('display', 'none');
}
}
function moveTip() {
var xPos = d3.mouse(this)[0], x0 = x.invert(xPos), y0 = func(x0), flip = (x0 / x.domain()[1] > 0.65);
var tip = tips.selectAll('g.tooltip').attr('transform', function(d, i) { return 'translate(' + x(x0) + ',' + y(series ? y0[series[i]] : y0) + ')'; });
tip.selectAll('rect').attr('x', flip ? (-tipWidth - 0.5) + 'em' : '0.5em').style('text-anchor', flip ? 'end' : 'start');
tip.selectAll('text.label').attr('x', flip ? '-1em' : '1em').style('text-anchor', flip ? 'end' : 'start');
tip.selectAll('text.label.x').text(fmtLong(x0) + ' ' + labels.xAxis.unit);
tips.selectAll('text.label.y').text(function(d, i) { return fmtLong(series ? y0[series[i]] : y0) + ' ' + labels.yAxis.unit; });
}
scope.$on('$destroy', function() {
angular.element($window).unbind('orientationchange resize render', render);
});
}
};
}]);

View File

@@ -0,0 +1,159 @@
angular.module('app').directive('powerBands', ['$window', function($window) {
return {
restrict: 'A',
scope: {
bands: '=',
available: '='
},
link: function(scope, element) {
var margin = { top: 20, right: 130, bottom: 20, left: 40 },
barHeight = 20,
bands = null,
innerHeight = (barHeight * 2) + 3,
height = innerHeight + margin.top + margin.bottom + 1,
wattScale = d3.scale.linear(),
pctScale = d3.scale.linear().domain([0, 1]),
wattFmt = d3.format('.2f'),
pctFmt = d3.format('.1%'),
wattAxis = d3.svg.axis().scale(wattScale).outerTickSize(0).orient('top').tickFormat(d3.format('.2r')),
pctAxis = d3.svg.axis().scale(pctScale).outerTickSize(0).orient('bottom').tickFormat(d3.format('%')),
// Create chart
svg = d3.select(element[0]).append('svg'),
vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'),
deployed = vis.append('g').attr('class', 'power-band'),
retracted = vis.append('g').attr('class', 'power-band');
svg.on('contextmenu', function() {
d3.event.preventDefault();
for (var i = 0, l = bands.length; i < l; i++) {
bands[i].retSelected = false;
bands[i].depSelected = false;
}
render();
});
// Create Y Axis SVG Elements
vis.append('g').attr('class', 'watt axis');
vis.append('g').attr('class', 'pct axis');
vis.append('text').attr('x', -35).attr('y', 16).attr('class', 'primary').text('RET');
vis.append('text').attr('x', -35).attr('y', barHeight + 18).attr('class', 'primary').text('DEP');
var retLbl = vis.append('text').attr('y', 16);
var depLbl = vis.append('text').attr('y', barHeight + 18);
// Watch for changes to data and events
scope.$watchCollection('available', render);
angular.element($window).bind('orientationchange resize pwrchange', render);
function render() {
bands = scope.bands;
var available = scope.available,
width = element[0].offsetWidth,
w = width - margin.left - margin.right,
maxBand = bands[bands.length - 1],
deployedSum = 0,
retractedSum = 0,
retBandsSelected = false,
depBandsSelected = false,
maxPwr = Math.max(available, maxBand.retractedSum, maxBand.deployedSum);
// Update chart size
svg.attr('width', width).attr('height', height);
// Remove existing elements
retracted.selectAll('rect').remove();
retracted.selectAll('text').remove();
deployed.selectAll('rect').remove();
deployed.selectAll('text').remove();
// Update X & Y Axis
wattScale.range([0, w]).domain([0, maxPwr]).clamp(true);
pctScale.range([0, w]).domain([0, maxPwr / available]).clamp(true);
vis.selectAll('.watt.axis').call(wattAxis);
vis.selectAll('.pct.axis').attr('transform', 'translate(0,' + innerHeight + ')').call(pctAxis);
for (var b = 0, l = bands.length; b < l; b++) {
if (bands[b].retSelected) {
retractedSum += bands[b].retracted + bands[b].retOnly;
retBandsSelected = true;
}
if (bands[b].depSelected) {
deployedSum += bands[b].deployed + bands[b].retracted;
depBandsSelected = true;
}
}
updateLabel(retLbl, w, retBandsSelected, retBandsSelected ? retractedSum : maxBand.retractedSum, available);
updateLabel(depLbl, w, depBandsSelected, depBandsSelected ? deployedSum : maxBand.deployedSum, available);
retracted.selectAll('rect').data(bands).enter().append('rect')
.attr('height', barHeight)
.attr('width', function(d) { return Math.max(wattScale(d.retracted + d.retOnly) - 1, 0); })
.attr('x', function(d) { return wattScale(d.retractedSum) - wattScale(d.retracted + d.retOnly); })
.attr('y', 1)
.on('click', function(d) {
d.retSelected = !d.retSelected;
render();
})
.attr('class', function(d) { return getClass(d.retSelected, d.retractedSum, available); });
retracted.selectAll('text').data(bands).enter().append('text')
.attr('x', function(d) { return wattScale(d.retractedSum) - (wattScale(d.retracted + d.retOnly) / 2); })
.attr('y', 15)
.style('text-anchor', 'middle')
.attr('class', 'primary-bg')
.on('click', function(d) {
d.retSelected = !d.retSelected;
render();
})
.text(function(d, i) { return bandText(d.retracted + d.retOnly, i); });
deployed.selectAll('rect').data(bands).enter().append('rect')
.attr('height', barHeight)
.attr('width', function(d) { return Math.max(wattScale(d.deployed + d.retracted) - 1, 0); })
.attr('x', function(d) { return wattScale(d.deployedSum) - wattScale(d.retracted) - wattScale(d.deployed); })
.attr('y', barHeight + 2)
.on('click', function(d) {
d.depSelected = !d.depSelected;
render();
})
.attr('class', function(d) { return getClass(d.depSelected, d.deployedSum, available); });
deployed.selectAll('text').data(bands).enter().append('text')
.attr('x', function(d) { return wattScale(d.deployedSum) - ((wattScale(d.retracted) + wattScale(d.deployed)) / 2); })
.attr('y', barHeight + 17)
.style('text-anchor', 'middle')
.attr('class', 'primary-bg')
.on('click', function(d) {
d.depSelected = !d.depSelected;
render();
})
.text(function(d, i) { return bandText(d.deployed + d.retracted, i); });
}
function updateLabel(lbl, width, selected, sum, available) {
lbl
.attr('x', width + 5 )
.attr('class', getClass(selected, sum, available))
.text(wattFmt(Math.max(0, sum)) + ' (' + pctFmt(Math.max(0, sum / available)) + ')');
}
function getClass(selected, sum, available) {
return selected ? 'secondary' : (sum > available) ? 'warning' : 'primary';
}
function bandText(val, index) {
if (val > 0 && wattScale(val) > 13) {
return index + 1;
}
return '';
}
scope.$on('$destroy', function() {
angular.element($window).unbind('orientationchange resize pwrchange', render);
});
}
};
}]);

View File

@@ -0,0 +1,80 @@
angular.module('app').directive('slider', ['$window', function($window) {
return {
restrict: 'A',
scope: {
max: '=',
unit: '=',
change: '&onChange'
},
link: function(scope, element) {
var margin = { top: -10, right: 145, bottom: 0, left: 50 },
height = 40, // Height is fixed
h = height - margin.top - margin.bottom,
fmt = d3.format('.2f'),
pct = d3.format('.1%'),
unit = scope.unit,
val = scope.max,
svg = d3.select(element[0]).append('svg'),
vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'),
xAxis = vis.append('g').attr('class', 'x slider-axis').attr('transform', 'translate(0,' + h / 2 + ')'),
x = d3.scale.linear(),
slider = vis.append('g').attr('class', 'slider'),
filled = slider.append('path').attr('class', 'filled').attr('transform', 'translate(0,' + h / 2 + ')'),
brush = d3.svg.brush().x(x).extent([scope.max, scope.max]).on('brush', brushed),
handle = slider.append('circle').attr('class', 'handle').attr('r', '0.6em'),
lbl = slider.append('g').append('text').attr('y', h / 2);
slider.call(brush);
slider.select('.background').attr('height', h);
handle.attr('transform', 'translate(0,' + h / 2 + ')');
/**
* Watch for changes in the max, window size
*/
scope.$watch('max', function(newMax, oldMax) {
val = newMax * (val / oldMax); // Retain percentage filled
render();
});
angular.element($window).bind('orientationchange resize', render);
function render() {
var width = element[0].offsetWidth, w = width - margin.left - margin.right;
svg.attr('width', width).attr('height', height);
x.domain([0, scope.max]).range([0, w]).clamp(true);
handle.attr('cx', x(val));
xAxis
.call(d3.svg.axis()
.scale(x)
.orient('bottom')
.tickFormat(function(d) { return d + unit; })
.tickValues([0, scope.max / 4, scope.max / 2, (3 * scope.max) / 4, scope.max])
.tickSize(0)
.tickPadding(12))
.select('.domain');
lbl.attr('x', w + 20);
slider.call(brush.extent([val, val])).call(brush.event);
slider.selectAll('.extent,.resize').remove();
}
function brushed() {
val = brush.extent()[0];
if (d3.event.sourceEvent) { // not a programmatic event
val = x.invert(d3.mouse(this)[0]);
brush.extent([val, val]);
}
lbl.text(fmt(val) + ' ' + unit + ' ' + pct(val / scope.max));
scope.change({ val: val });
handle.attr('cx', x(val));
filled.attr('d', 'M0,0V0H' + x(val) + 'V0');
}
scope.$on('$destroy', function() {
angular.element($window).unbind('orientationchange resize render', render);
});
}
};
}]);

View File

@@ -1,14 +1,14 @@
angular.module('app').directive('slotHardpoint', ['$rootScope', function ($r) {
angular.module('app').directive('slotHardpoint', ['$rootScope', function($r) {
return {
restrict: 'A',
scope:{
scope: {
hp: '=',
size: '=',
lbl: '=',
lbl: '='
},
templateUrl: 'views/_slot-hardpoint.html',
link: function (scope) {
link: function(scope) {
scope.$r = $r;
}
};
}]);
}]);

View File

@@ -1,15 +1,14 @@
angular.module('app').directive('slotInternal', ['$rootScope', function ($r) {
angular.module('app').directive('slotInternal', ['$rootScope', function($r) {
return {
restrict: 'A',
scope:{
scope: {
c: '=slot',
lbl: '=',
ft: '=',
fuel: '='
},
templateUrl: 'views/_slot-internal.html',
link: function(scope) {
scope.$r = $r;
}
};
}]);
}]);

View File

@@ -1,14 +1,18 @@
/**
* BBCode Generator functions for embedding in the Elite Dangerous Forums
*/
angular.module('app').factory('Utils', ['$state','$http', function ($state, $http) {
angular.module('app').factory('Utils', ['$window', '$state', '$http', '$q', function($window, $state, $http, $q) {
var shortenAPI = 'https://www.googleapis.com/urlshortener/v1/url?key=';
function shortenUrl(url) {
return $http.post(shortenAPI + GAPI_KEY, {longUrl:url}).then(function(response) {
return response.data.id;
});
if ($window.navigator.onLine) {
return $http.post(shortenAPI + GAPI_KEY, { longUrl: url }).then(function(response) {
return response.data.id;
});
} else {
return $q.reject({ statusText: 'Not Online' });
}
}
function comparisonBBCode(facets, builds, link) {
@@ -35,7 +39,7 @@ angular.module('app').factory('Utils', ['$state','$http', function ($state, $htt
for (i = 0; i < builds.length; i++) {
b = builds[i];
//var href = $state.href('outfit',{shipId: b.id, code: b.code, bn: b.buildName}, {absolute: true});
l.push('[tr][td]', b.name,'[/td][td]', b.buildName ,'[/td]');
l.push('[tr][td]', b.name, '[/td][td]', b.buildName, '[/td]');
for (j = 0, fl = facets.length; j < fl; j++) {
if (facets[j].active) {
@@ -48,8 +52,8 @@ angular.module('app').factory('Utils', ['$state','$http', function ($state, $htt
}
l.push('[/tr]\n');
}
l.push('[tr][td="align: center, colspan:',colCount,'"][size=-3]\n[url=', link,']Interactive Comparison at Coriolis.io[/url][/td][/tr]\n[/size][/table]');
l.unshift('[table="width:', colCount * 90,',align: center"]\n[tr][th][B][COLOR=#FF8C0D]Ship[/COLOR][/B][/th][th][B][COLOR="#FF8C0D"]Build[/COLOR][/B][/th]');
l.push('[tr][td="align: center, colspan:', colCount, '"][size=-3]\n[url=', link, ']Interactive Comparison at Coriolis.io[/url][/td][/tr]\n[/size][/table]');
l.unshift('[table="width:', colCount * 90, ',align: center"]\n[tr][th][B][COLOR=#FF8C0D]Ship[/COLOR][/B][/th][th][B][COLOR="#FF8C0D"]Build[/COLOR][/B][/th]');
return l.join('');
}

View File

@@ -1,7 +1,7 @@
/**
* [description]
*/
angular.module('app').service('Persist', ['$window','lodash', function ($window, _) {
angular.module('app').service('Persist', ['$window', 'lodash', function($window, _) {
var LS_KEY_BUILDS = 'builds';
var LS_KEY_COMPARISONS = 'comparisons';
var localStorage = $window.localStorage;
@@ -19,8 +19,8 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
this.lsEnabled = false;
}
this.builds = buildJson? angular.fromJson(buildJson) : {};
this.comparisons = comparisonJson? angular.fromJson(comparisonJson) : {};
this.builds = buildJson ? angular.fromJson(buildJson) : {};
this.comparisons = comparisonJson ? angular.fromJson(comparisonJson) : {};
var buildCount = Object.keys(this.builds).length;
this.state = {
@@ -35,7 +35,7 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
* @param {string} name The name of the build
* @param {string} code The serialized code
*/
this.saveBuild = function (shipId, name, code) {
this.saveBuild = function(shipId, name, code) {
if (!this.lsEnabled) {
return;
}
@@ -44,7 +44,7 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
this.builds[shipId] = {};
}
if(!this.builds[shipId][name]) {
if (!this.builds[shipId][name]) {
this.state.buildCount++;
this.state.hasBuilds = true;
}
@@ -62,7 +62,7 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
* @param {string} name The name of the build
* @return {string} The serialized build string.
*/
this.getBuild = function (shipId, name) {
this.getBuild = function(shipId, name) {
if (this.builds[shipId] && this.builds[shipId][name]) {
return this.builds[shipId][name];
}
@@ -76,8 +76,8 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
* @param {string} shipId The unique id for a model of ship
* @param {string} name The name of the build
*/
this.deleteBuild = function (shipId, name) {
if(this.lsEnabled && this.builds[shipId][name]) {
this.deleteBuild = function(shipId, name) {
if (this.lsEnabled && this.builds[shipId][name]) {
delete this.builds[shipId][name];
if (Object.keys(this.builds[shipId]).length === 0) {
delete this.builds[shipId];
@@ -90,8 +90,8 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
var comps = this.comparisons;
for (var c in comps) {
for (var i = 0; i < comps[c].builds.length; i++) { // For all builds in the current comparison
if(comps[c].builds[i].shipId == shipId && comps[c].builds[i].buildName == name) {
comps[c].builds.splice(i,1);
if (comps[c].builds[i].shipId == shipId && comps[c].builds[i].buildName == name) {
comps[c].builds.splice(i, 1);
break; // A build is unique ber comparison
}
}
@@ -107,7 +107,7 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
* @param {array} builds Array of builds
* @param {array} facets Array of facet indices
*/
this.saveComparison = function (name, builds, facets){
this.saveComparison = function(name, builds, facets) {
if (!this.lsEnabled) {
return;
}
@@ -117,7 +117,7 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
}
this.comparisons[name] = {
facets: facets,
builds: _.map(builds, function (b) { return {shipId: b.id, buildName: b.buildName }; })
builds: _.map(builds, function(b) { return { shipId: b.id, buildName: b.buildName }; })
};
localStorage.setItem(LS_KEY_COMPARISONS, angular.toJson(this.comparisons));
this.state.hasComparisons = true;
@@ -128,7 +128,7 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
* @param {string} name [description]
* @return {object} Object containing array of facets and ship id + build names
*/
this.getComparison = function (name) {
this.getComparison = function(name) {
if (this.comparisons[name]) {
return this.comparisons[name];
}
@@ -139,7 +139,7 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
* Removes the comparison from localstorage.
* @param {string} name Comparison name
*/
this.deleteComparison = function (name) {
this.deleteComparison = function(name) {
if (this.lsEnabled && this.comparisons[name]) {
delete this.comparisons[name];
localStorage.setItem(LS_KEY_COMPARISONS, angular.toJson(this.comparisons));
@@ -162,19 +162,76 @@ angular.module('app').service('Persist', ['$window','lodash', function ($window,
}
};
this.getInsurance = function () {
/**
* Get the saved insurance type
* @return {string} The name of the saved insurance type of null
*/
this.getInsurance = function() {
if (this.lsEnabled) {
return localStorage.getItem('insurance');
}
return null;
};
this.setInsurance = function (name) {
/**
* Persist selected insurance type
* @param {string} name Insurance type name
*/
this.setInsurance = function(name) {
if (this.lsEnabled) {
return localStorage.setItem('insurance', name);
}
};
/**
* Persist selected discount
* @param {number} val Discount value/amount
*/
this.setDiscount = function(val) {
if (this.lsEnabled) {
return localStorage.setItem('discounts', angular.toJson(val));
}
};
/**
* Get the saved discount
* @return {number} val Discount value/amount
*/
this.getDiscount = function() {
if (this.lsEnabled) {
return angular.fromJson(localStorage.getItem('discounts'));
}
return null;
};
/**
* Retrieve the last router state from local storage
* @param {object} state State object containing state name and params
*/
this.getState = function() {
if (this.lsEnabled) {
var state = localStorage.getItem('state');
if (state) {
return angular.fromJson(state);
}
}
return null;
};
/**
* Save the current router state to localstorage
* @param {object} state State object containing state name and params
*/
this.setState = function(state) {
if (this.lsEnabled) {
localStorage.setItem('state', angular.toJson(state));
}
};
/**
* Check if localStorage is enabled/active
* @return {Boolean} True if localStorage is enabled
*/
this.isEnabled = function() {
return this.lsEnabled;
};

View File

@@ -1,7 +1,7 @@
/**
* Service managing seralization and deserialization of models for use in URLs and persistene.
*/
angular.module('app').service('Serializer', ['lodash', function (_) {
angular.module('app').service('Serializer', ['lodash', function(_) {
/**
* Serializes the ships selected components for all slots to a URL friendly string.
@@ -9,11 +9,20 @@ angular.module('app').service('Serializer', ['lodash', function (_) {
* @return {string} Encoded string of components
*/
this.fromShip = function(ship) {
var power = {
enabled: [ship.cargoScoop.enabled ? 1 : 0],
priorities: [ship.cargoScoop.priority]
};
var data = [
ship.bulkheads.id,
_.map(ship.common, idToStr),
_.map(ship.hardpoints, idToStr),
_.map(ship.internal, idToStr),
_.map(ship.common, mapGroup, power),
_.map(ship.hardpoints, mapGroup, power),
_.map(ship.internal, mapGroup, power),
'.',
LZString.compressToBase64(power.enabled.join('')).replace(/\//g, '-'),
'.',
LZString.compressToBase64(power.priorities.join('')).replace(/\//g, '-')
];
return _.flatten(data).join('');
@@ -26,39 +35,46 @@ angular.module('app').service('Serializer', ['lodash', function (_) {
* @param {Ship} ship The ship instance to be updated
* @param {string} code The string to deserialize
*/
this.toShip = function (ship, code) {
var commonCount = ship.common.length;
var hpCount = commonCount + ship.hardpoints.length;
var comps = {
bulkheads: code.charAt(0) * 1,
common: new Array(ship.common.length),
hardpoints: new Array(ship.hardpoints.length),
internal: new Array(ship.internal.length)
};
this.toShip = function(ship, dataString) {
var common = new Array(ship.common.length),
hardpoints = new Array(ship.hardpoints.length),
internal = new Array(ship.internal.length),
parts = dataString.split('.'),
priorities = null,
enabled = null,
code = parts[0];
// TODO: improve...
for (var i = 1, c = 0, l = code.length; i < l; i++) {
var empty = code.charAt(i) == '-';
if (c < commonCount) {
comps.common[c] = empty? 0 : code.substring(i, i + 2);
} else if (c < hpCount) {
comps.hardpoints[c - commonCount] = empty? 0 : code.substring(i, i + 2);
} else {
comps.internal[c - hpCount] = empty? 0 : code.substring(i, i + 2);
}
if (!empty) {
i++;
}
c++;
if (parts[1]) {
enabled = LZString.decompressFromBase64(parts[1].replace(/-/g, '/')).split('');
}
ship.buildWith(comps);
if (parts[2]) {
priorities = LZString.decompressFromBase64(parts[2].replace(/-/g, '/')).split('');
}
decodeToArray(code, internal, decodeToArray(code, hardpoints, decodeToArray(code, common, 1)));
// get the remaining substring / split into parts for
// - priorities
// - enabled/disabled
ship.buildWith(
{
bulkheads: code.charAt(0) * 1,
common: common,
hardpoints: hardpoints,
internal: internal
},
priorities,
enabled
);
};
this.fromComparison = function (name, builds, facets, predicate, desc) {
this.fromComparison = function(name, builds, facets, predicate, desc) {
var shipBuilds = [];
builds.forEach(function (b) {
shipBuilds.push({s: b.id, n: b.buildName, c: this.fromShip(b)});
builds.forEach(function(b) {
shipBuilds.push({ s: b.id, n: b.buildName, c: this.fromShip(b) });
}.bind(this));
return LZString.compressToBase64(angular.toJson({
@@ -66,12 +82,12 @@ angular.module('app').service('Serializer', ['lodash', function (_) {
b: shipBuilds,
f: facets,
p: predicate,
d: desc? 1 : 0
})).replace(/\//g,'-');
d: desc ? 1 : 0
})).replace(/\//g, '-');
};
this.toComparison = function (code) {
return angular.fromJson(LZString.decompressFromBase64(code.replace(/-/g,'/')));
this.toComparison = function(code) {
return angular.fromJson(LZString.decompressFromBase64(code.replace(/-/g, '/')));
};
/**
@@ -82,8 +98,24 @@ angular.module('app').service('Serializer', ['lodash', function (_) {
* @param {object} slot The slot object.
* @return {string} The id of the selected component or '-' if none selected
*/
function idToStr(slot) {
return (slot.id === null)? '-' : slot.id;
function mapGroup(slot) {
this.enabled.push(slot.enabled ? 1 : 0);
this.priorities.push(slot.priority);
return slot.id === null ? '-' : slot.id;
}
function decodeToArray(code, arr, codePos) {
for (var i = 0; i < arr.length; i++) {
if (code.charAt(codePos) == '-') {
arr[i] = 0;
codePos++;
} else {
arr[i] = code.substring(codePos, codePos + 2);
codePos += 2;
}
}
return codePos;
}
}]);

View File

@@ -1,4 +1,10 @@
angular.module('shipyard').factory('ComponentSet', ['lodash', function (_) {
angular.module('shipyard').factory('ComponentSet', ['lodash', function(_) {
function filter(data, maxClass, minClass, mass) {
return _.filter(data, function(c) {
return c.class <= maxClass && c.class >= minClass && (c.maxmass === undefined || mass <= c.maxmass);
});
}
function ComponentSet(components, mass, maxCommonArr, maxInternal, maxHardPoint) {
this.mass = mass;
@@ -8,7 +14,7 @@ angular.module('shipyard').factory('ComponentSet', ['lodash', function (_) {
this.hpClass = {};
this.intClass = {};
for (var i = 0; i < components.common.length; i ++) {
for (var i = 0; i < components.common.length; i++) {
var max = maxCommonArr[i];
switch (i) {
// Slots where component class must be equal to slot class
@@ -22,21 +28,21 @@ angular.module('shipyard').factory('ComponentSet', ['lodash', function (_) {
}
}
for(var h in components.hardpoints) {
for (var h in components.hardpoints) {
this.hardpoints[h] = filter(components.hardpoints[h], maxHardPoint, 0, this.mass);
}
for(var g in components.internal) {
for (var g in components.internal) {
this.internal[g] = filter(components.internal[g], maxInternal, 0, this.mass);
}
}
ComponentSet.prototype.getHps = function(c) {
if(!this.hpClass[c]) {
var o = this.hpClass[c] = {};
for(var key in this.hardpoints) {
var data = filter(this.hardpoints[key], c, c? 1 : 0, this.mass);
if(data.length) { // If group is not empty
if (!this.hpClass[c]) {
var o = this.hpClass[c] = {};
for (var key in this.hardpoints) {
var data = filter(this.hardpoints[key], c, c ? 1 : 0, this.mass);
if (data.length) { // If group is not empty
o[key] = data;
}
}
@@ -45,11 +51,11 @@ angular.module('shipyard').factory('ComponentSet', ['lodash', function (_) {
};
ComponentSet.prototype.getInts = function(c) {
if(!this.intClass[c]) {
var o = this.intClass[c] = {};
for(var key in this.internal) {
if (!this.intClass[c]) {
var o = this.intClass[c] = {};
for (var key in this.internal) {
var data = filter(this.internal[key], c, 0, this.mass);
if(data.length) { // If group is not empty
if (data.length) { // If group is not empty
o[key] = data;
}
}
@@ -57,12 +63,6 @@ angular.module('shipyard').factory('ComponentSet', ['lodash', function (_) {
return this.intClass[c];
};
function filter (data, maxClass, minClass, mass) {
return _.filter(data, function (c) {
return c.class <= maxClass && c.class >= minClass && (c.maxmass === undefined || mass <= c.maxmass);
});
}
return ComponentSet;
}]);

View File

@@ -1,4 +1,22 @@
angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', 'calcJumpRange', 'lodash', function (Components, calcShieldStrength, calcJumpRange, _) {
angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', 'calcJumpRange', 'calcTotalRange', 'lodash', function(Components, calcShieldStrength, calcJumpRange, calcTotalRange, _) {
/**
* Returns the power usage type of a slot and it's particular component
* @param {object} slot The Slot
* @param {object} component The component in the slot
* @return {string} The key for the power usage type
*/
function powerUsageType(slot, component) {
if (component) {
if (component.retractedOnly) {
return 'retOnly';
}
if (component.passive) {
return 'retracted';
}
}
return slot.cat != 1 ? 'retracted' : 'deployed';
}
/**
* Ship model used to track all ship components and properties.
@@ -9,8 +27,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
*/
function Ship(id, properties, slots) {
this.id = id;
this.incCost = true;
this.cargoScoop = { enabled: true, c: Components.cargoScoop() };
this.cargoScoop = { c: Components.cargoScoop(), type: 'SYS' };
this.bulkheads = { incCost: true, maxClass: 8 };
for (var p in properties) { this[p] = properties[p]; } // Copy all base properties from shipData
@@ -18,161 +35,172 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
for (var slotType in slots) { // Initialize all slots
var slotGroup = slots[slotType];
var group = this[slotType] = []; // Initialize Slot group (Common, Hardpoints, Internal)
for(var i = 0; i < slotGroup.length; i++){
group.push({id: null, c: null, enabled: true, incCost: true, maxClass: slotGroup[i]});
for (var i = 0; i < slotGroup.length; i++) {
group.push({ id: null, c: null, incCost: true, maxClass: slotGroup[i] });
}
}
// Make a Ship 'slot'/item similar to other slots
this.c = { incCost: true, type: 'SHIP', discountedCost: this.cost, c: { name: this.name, cost: this.cost } };
this.costList = _.union(this.internal, this.common, this.hardpoints);
this.costList.push(this.bulkheads); // Add The bulkheads
this.costList.unshift(this.c); // Add the ship itself to the list
this.powerList = _.union(this.internal, this.hardpoints);
this.powerList.unshift(this.cargoScoop);
this.powerList.unshift(this.common[1]); // Add Thrusters
this.powerList.unshift(this.common[5]); // Add Sensors
this.powerList.unshift(this.common[4]); // Add Power Distributor
this.powerList.unshift(this.common[3]); // Add Life Support
this.powerList.unshift(this.common[2]); // Add FSD
this.powerList.unshift(this.common[0]); // Add Power Plant
this.shipDiscount = 1;
this.componentDiscount = 1;
this.priorityBands = [
{ deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0, retOnly: 0 }
];
}
/**
* Builds/Updates the ship instance with the components[comps] passed in.
* @param {object} comps Collection of components used to build the ship
*/
Ship.prototype.buildWith = function(comps) {
var internal = this.internal;
var common = this.common;
var hps = this.hardpoints;
var i,l;
Ship.prototype.buildWith = function(comps, priorities, enabled) {
var internal = this.internal,
common = this.common,
hps = this.hardpoints,
bands = this.priorityBands,
cl = common.length,
i, l;
this.bulkheads.id = comps.bulkheads || 0;
this.bulkheads.c = Components.bulkheads(this.id, this.bulkheads.id);
// Reset Cumulative stats
this.fuelCapacity = 0;
this.cargoCapacity = 0;
this.ladenMass = 0;
this.armourAdded = 0;
this.shieldMultiplier = 1;
this.totalCost = this.c.incCost ? this.c.discountedCost : 0;
this.unladenMass = this.mass;
this.armourTotal = this.armour;
this.totalDps = 0;
for(i = 0, l = comps.common.length; i < l; i++) {
common[i].id = comps.common[i];
common[i].c = Components.common(i, comps.common[i]);
this.bulkheads.c = null;
this.useBulkhead(comps.bulkheads || 0, true);
this.cargoScoop.priority = priorities ? priorities[0] * 1 : 0;
this.cargoScoop.enabled = enabled ? enabled[0] * 1 : true;
for (i = 0, l = this.priorityBands.length; i < l; i++) {
this.priorityBands[i].deployed = 0;
this.priorityBands[i].retracted = 0;
this.priorityBands[i].retOnly = 0;
}
for(i = 0, l = comps.hardpoints.length; i < l; i++) {
if (this.cargoScoop.enabled) {
bands[this.cargoScoop.priority].retracted += this.cargoScoop.c.power;
}
for (i = 0; i < cl; i++) {
common[i].cat = 0;
common[i].enabled = enabled ? enabled[i + 1] * 1 : true;
common[i].priority = priorities ? priorities[i + 1] * 1 : 0;
common[i].type = 'SYS';
common[i].c = common[i].id = null; // Resetting 'old' component if there was one
common[i].discountedCost = 0;
this.use(common[i], comps.common[i], Components.common(i, comps.common[i]), true);
}
common[1].type = 'ENG'; // Thrusters
common[2].type = 'ENG'; // FSD
cl++; // Increase accounts for Cargo Scoop
for (i = 0, l = hps.length; i < l; i++) {
hps[i].cat = 1;
hps[i].enabled = enabled ? enabled[cl + i] * 1 : true;
hps[i].priority = priorities ? priorities[cl + i] * 1 : 0;
hps[i].type = hps[i].maxClass ? 'WEP' : 'SYS';
hps[i].c = hps[i].id = null; // Resetting 'old' component if there was one
hps[i].discountedCost = 0;
if (comps.hardpoints[i] !== 0) {
hps[i].id = comps.hardpoints[i];
hps[i].c = Components.hardpoints(comps.hardpoints[i]);
} else {
hps[i].c = hps[i].id = null;
this.use(hps[i], comps.hardpoints[i], Components.hardpoints(comps.hardpoints[i]), true);
}
}
for(i = 0, l = comps.internal.length; i < l; i++) {
cl += hps.length; // Increase accounts for hardpoints
for (i = 0, l = internal.length; i < l; i++) {
internal[i].cat = 2;
internal[i].enabled = enabled ? enabled[cl + i] * 1 : true;
internal[i].priority = priorities ? priorities[cl + i] * 1 : 0;
internal[i].type = 'SYS';
internal[i].id = internal[i].c = null; // Resetting 'old' component if there was one
internal[i].discountedCost = 0;
if (comps.internal[i] !== 0) {
internal[i].id = comps.internal[i];
internal[i].c = Components.internal(comps.internal[i]);
} else {
internal[i].id = internal[i].c = null;
this.use(internal[i], comps.internal[i], Components.internal(comps.internal[i]), true);
}
}
this.updateTotals();
// Update aggragated stats
this.updatePower();
this.updateJumpStats();
this.updateShieldStrength();
};
/**
* Updates the ship totals based on the components for every slot.
*/
Ship.prototype.updateTotals = function() {
var c = _.reduce(this.common, optsSum, {cost: 0, power: 0, mass: 0});
var i = _.reduce(this.internal, optsSum, {cost: 0, power: 0, mass: 0, capacity: 0, armouradd: 0});
var h = _.reduce(this.hardpoints, hpSum, {cost: 0, active: 0, passive: 0, mass: 0, shieldmul: 1});
var fsd = this.common[2].c; // Frame Shift Drive;
var sgSI = this.findInternalByGroup('sg'); // Find Shield Generator slot Index if any
this.totalCost = c.cost + i.cost + h.cost + (this.incCost? this.cost : 0) + (this.bulkheads.incCost? this.bulkheads.c.cost : 0);
this.unladenMass = c.mass + i.mass + h.mass + this.mass + this.bulkheads.c.mass;
this.powerAvailable = this.common[0].c.pGen; // Power Plant
this.fuelCapacity = this.common[6].c.capacity;
this.maxMass = this.common[1].c.maxmass; // Thrusters Max Mass
this.cargoCapacity = i.capacity;
this.ladenMass = this.unladenMass + this.cargoCapacity + this.fuelCapacity;
this.powerRetracted = c.power + i.power + h.passive + (this.cargoScoop.enabled? this.cargoScoop.c.power : 0);
this.powerDeployed = this.powerRetracted + h.active;
this.armourAdded = i.armouradd;
this.shieldMultiplier = h.shieldmul;
this.unladenJumpRange = calcJumpRange(this.unladenMass + fsd.maxfuel, fsd); // Include fuel weight for jump
this.ladenJumpRange = calcJumpRange(this.ladenMass, fsd);
this.shieldStrength = sgSI != -1? calcShieldStrength(this.mass, this.shields, this.internal[sgSI].c, this.shieldMultiplier) : 0;
this.armourTotal = this.armourAdded + this.armour;
// TODO: shield recharge rate based pips, shield generator, power distributor
// TODO: armor bonus / damage reduction for bulkheads
// TODO: Damage / DPS total (for all weapons)
};
/**
* Utilify function for summing the components properties
*
* @private
* @param {object} sum Sum of cost, power, mass, capacity
* @param {object} slot Slot object
* @return {object} The mutated sum object
*/
function optsSum(sum, slot) {
var c = slot.c;
if (c) { // The slot has a component installed
sum.cost += (slot.incCost && c.cost)? c.cost : 0;
sum.power += (slot.enabled && c.power)? c.power : 0;
sum.mass += c.mass || 0;
sum.capacity += c.capacity || 0;
sum.armouradd += c.armouradd || 0;
}
return sum;
}
/**
* Utilify function for summing the hardpoint properties
*
* @private
* @param {object} sum Sum of cost, power, etc
* @param {object} slot Slot object
* @return {object} The mutated sum object
*/
function hpSum(sum, slot) {
var c = slot.c;
if (c) { // The slot has a component installed
sum.cost += (slot.incCost && c.cost)? c.cost : 0;
sum[c.passive? 'passive': 'active'] += slot.enabled? c.power : 0;
sum.mass += c.mass || 0;
sum.shieldmul += c.shieldmul || 0;
}
return sum;
}
Ship.prototype.useBulkhead = function(index) {
Ship.prototype.useBulkhead = function(index, preventUpdate) {
var oldBulkhead = this.bulkheads.c;
this.bulkheads.id = index;
this.bulkheads.c = Components.bulkheads(this.id, index);
this.updateTotals(); // Update mass, range, shield strength, armor
this.bulkheads.discountedCost = this.bulkheads.c.cost * this.componentDiscount;
this.updateStats(this.bulkheads, this.bulkheads.c, oldBulkhead, preventUpdate);
};
/**
* Update a slot with a the component if the id is different from the current id for this slot.
* Has logic handling components that you may only have 1 of (Shield Generator or Refinery).
*
* @param {object} slot The component slot
* @param {string} id Unique ID for the selected component
* @param {object} component Properties for the selected component
* @param {object} slot The component slot
* @param {string} id Unique ID for the selected component
* @param {object} component Properties for the selected component
* @param {boolean} preventUpdate If true, do not update aggregated stats
*/
Ship.prototype.use = function(slot, id, component) {
Ship.prototype.use = function(slot, id, component, preventUpdate) {
if (slot.id != id) { // Selecting a different component
var slotIndex = this.internal.indexOf(slot);
// Slot is an internal slot, is not being emptied, and the selected component group/type must be of unique
if(slotIndex != -1 && component && _.includes(['sg','rf','fs'],component.grp)) {
if (slot.cat == 2 && component && _.includes(['sg', 'rf', 'fs'], component.grp)) {
// Find another internal slot that already has this type/group installed
var similarSlotIndex = this.findInternalByGroup(component.grp);
var similarSlot = this.findInternalByGroup(component.grp);
// If another slot has an installed component with of the same type
if (similarSlotIndex != -1 && similarSlotIndex != slotIndex) {
// Empty the slot
this.internal[similarSlotIndex].id = null;
this.internal[similarSlotIndex].c = null;
if (!preventUpdate && similarSlot && similarSlot !== slot) {
this.updateStats(similarSlot, null, similarSlot.c, true); // Update stats but don't trigger a global update
similarSlot.id = similarSlot.c = null; // Empty the slot
similarSlot.discountedCost = 0;
}
}
// Update slot with selected component (or empty)
var oldComponent = slot.c;
slot.id = id;
slot.c = component;
this.updateTotals();
slot.discountedCost = (component && component.cost) ? component.cost * this.componentDiscount : 0;
this.updateStats(slot, component, oldComponent, preventUpdate);
}
};
/**
* [jumpRange description]
* @param {number} mass [description]
* Calculate jump range using the installed FSD and the
* specified mass which can be more or less than ships actual mass
* @param {number} mass Mass in tons
* @param {number} fuel Fuel available in tons
* @return {number} Jump range in Light Years
*/
Ship.prototype.jumpRangeWithMass = function (mass) {
return calcJumpRange(mass, this.common[2].c);
Ship.prototype.jumpRangeWithMass = function(mass, fuel) {
return calcJumpRange(mass, this.common[2].c, fuel);
};
/**
@@ -182,9 +210,215 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
* @return {number} The index of the slot in ship.internal
*/
Ship.prototype.findInternalByGroup = function(group) {
return _.findIndex(this.internal, function (slot) {
var index = _.findIndex(this.internal, function(slot) {
return slot.c && slot.c.grp == group;
});
if (index !== -1) {
return this.internal[index];
}
return null;
};
/**
* Will change the priority of the specified slot if the new priority is valid
* @param {object} slot The slot to be updated
* @param {number} newPriority The new priority to be set
* @return {boolean} Returns true if the priority was changed (within range)
*/
Ship.prototype.changePriority = function(slot, newPriority) {
if (newPriority >= 0 && newPriority < this.priorityBands.length) {
var oldPriority = slot.priority;
slot.priority = newPriority;
if (slot.enabled) { // Only update power if the slot is enabled
var usage = powerUsageType(slot, slot.c);
this.priorityBands[oldPriority][usage] -= slot.c.power;
this.priorityBands[newPriority][usage] += slot.c.power;
this.updatePower();
}
return true;
}
return false;
};
Ship.prototype.setCostIncluded = function(item, included) {
if (item.incCost != included && item.c) {
this.totalCost += included ? item.discountedCost : -item.discountedCost;
}
item.incCost = included;
};
Ship.prototype.setSlotEnabled = function(slot, enabled) {
if (slot.enabled != enabled) { // Enabled state is changing
slot.enabled = enabled;
if (slot.c) {
this.priorityBands[slot.priority][powerUsageType(slot, slot.c)] += enabled ? slot.c.power : -slot.c.power;
if (slot.c.grp == 'sg') {
this.updateShieldStrength();
} else if (slot.c.grp == 'sb') {
this.shieldMultiplier += slot.c.shieldmul * (enabled ? 1 : -1);
this.updateShieldStrength();
} else if (slot.c.dps) {
this.totalDps += slot.c.dps * (enabled ? 1 : -1);
}
this.updatePower();
}
}
};
Ship.prototype.getSlotStatus = function(slot, deployed) {
if (!slot.c) { // Empty Slot
return 0; // No Status (Not possible)
} else if (!slot.enabled) {
return 1; // Disabled
} else if (deployed && !slot.c.retractedOnly) { // Certain component (e.g. Detaild Surface scanner) are power only while retracted
return this.priorityBands[slot.priority].deployedSum > this.powerAvailable ? 2 : 3; // Offline : Online
// Active hardpoints have no retracted status
} else if ((deployed && slot.c.retractedOnly) || (slot.cat === 1 && !slot.c.passive)) {
return 0; // No Status (Not possible)
}
return this.priorityBands[slot.priority].retractedSum > this.powerAvailable ? 2 : 3; // Offline : Online
};
/**
* Updates the ship's cumulative and aggregated stats based on the component change.
*/
Ship.prototype.updateStats = function(slot, n, old, preventUpdate) {
var powerChange = slot == this.common[0];
if (old) { // Old component now being removed
switch (old.grp) {
case 'ft':
this.fuelCapacity -= old.capacity;
break;
case 'cr':
this.cargoCapacity -= old.capacity;
break;
case 'hr':
this.armourAdded -= old.armouradd;
break;
case 'sb':
this.shieldMultiplier -= slot.enabled ? old.shieldmul : 0;
break;
}
if (slot.incCost && old.cost) {
this.totalCost -= old.cost * this.componentDiscount;
}
if (old.power && slot.enabled) {
this.priorityBands[slot.priority][powerUsageType(slot, old)] -= old.power;
powerChange = true;
if (old.dps) {
this.totalDps -= old.dps;
}
}
this.unladenMass -= old.mass || 0;
}
if (n) {
switch (n.grp) {
case 'ft':
this.fuelCapacity += n.capacity;
break;
case 'cr':
this.cargoCapacity += n.capacity;
break;
case 't':
this.maxMass = n.maxmass;
break;
case 'hr':
this.armourAdded += n.armouradd;
break;
case 'sb':
this.shieldMultiplier += slot.enabled ? n.shieldmul : 0;
break;
}
if (slot.incCost && n.cost) {
this.totalCost += n.cost * this.componentDiscount;
}
if (n.power && slot.enabled) {
this.priorityBands[slot.priority][powerUsageType(slot, n)] += n.power;
powerChange = true;
if (n.dps) {
this.totalDps += n.dps;
}
}
this.unladenMass += n.mass || 0;
}
this.ladenMass = this.unladenMass + this.cargoCapacity + this.fuelCapacity;
this.armourTotal = this.armourAdded + this.armour;
if (!preventUpdate) {
if (powerChange) {
this.updatePower();
}
this.updateJumpStats();
this.updateShieldStrength();
}
};
Ship.prototype.updatePower = function() {
var bands = this.priorityBands;
var prevRetracted = 0, prevDeployed = 0;
for (var i = 0, l = bands.length; i < l; i++) {
var band = bands[i];
prevRetracted = band.retractedSum = prevRetracted + band.retracted + band.retOnly;
prevDeployed = band.deployedSum = prevDeployed + band.deployed + band.retracted;
}
this.powerAvailable = this.common[0].c.pGen;
this.powerRetracted = prevRetracted;
this.powerDeployed = prevDeployed;
};
Ship.prototype.updateShieldStrength = function() {
var sgSlot = this.findInternalByGroup('sg'); // Find Shield Generator slot Index if any
this.shieldStrength = sgSlot && sgSlot.enabled ? calcShieldStrength(this.mass, this.shields, sgSlot.c, this.shieldMultiplier) : 0;
};
/**
* Jump Range and total range calculations
*/
Ship.prototype.updateJumpStats = function() {
var fsd = this.common[2].c; // Frame Shift Drive;
this.unladenRange = calcJumpRange(this.unladenMass + fsd.maxfuel, fsd, this.fuelCapacity); // Include fuel weight for jump
this.fullTankRange = calcJumpRange(this.unladenMass + this.fuelCapacity, fsd, this.fuelCapacity); // Full Tanke
this.ladenRange = calcJumpRange(this.ladenMass, fsd, this.fuelCapacity);
this.unladenTotalRange = calcTotalRange(this.unladenMass, fsd, this.fuelCapacity);
this.ladenTotalRange = calcTotalRange(this.unladenMass + this.cargoCapacity, fsd, this.fuelCapacity);
this.maxJumpCount = Math.ceil(this.fuelCapacity / fsd.maxfuel);
};
/**
* Recalculate all item costs and total based on discounts.
* @param {number} shipDiscount Ship cost multiplier discount (e.g. 0.9 === 10% discount)
* @param {number} componentDiscount Component cost multiplier discount (e.g. 0.75 === 25% discount)
*/
Ship.prototype.applyDiscounts = function(shipDiscount, componentDiscount) {
var total = 0;
var costList = this.costList;
for (var i = 0, l = costList.length; i < l; i++) {
var item = costList[i];
if (item.c && item.c.cost) {
item.discountedCost = item.c.cost * (item.type == 'SHIP' ? shipDiscount : componentDiscount);
if (item.incCost) {
total += item.discountedCost;
}
}
}
this.shipDiscount = shipDiscount;
this.componentDiscount = componentDiscount;
this.totalCost = total;
};
return Ship;

View File

@@ -19,37 +19,51 @@ angular.module('shipyard', ['ngLodash'])
'Sensors',
'Fuel Tank'
])
.value('internalGroupMap', {
fs:'Fuel Scoop',
sc:'Scanners',
am:'Auto Field-Maintenance Unit',
cr:'Cargo Racks',
fi:'FSD Interdictor',
hb:'Hatch Breaker Limpet Ctrl',
hr:'Hull Reinforcement Package',
rf:'Refinery',
sb:'Shield Cell Bank',
sg:'Shield Generator',
dc:'Docking Computer'
})
.value('hardpointsGroupMap', {
'bl': "Beam Laser",
'ul': "Burst Laser",
'c': "Cannon",
'cs': "Cargo Scanner",
'cm': "Countermeasure",
'fc': "Fragment Cannon",
'fs': "Frame Shift Wake Scanner",
'kw': "Kill Warrant Scanner",
'nl': "Mine Launcher",
'ml': "Mining Laser",
'mr': "Missile Rack",
'pa': "Plasma Accelerator",
'mc': "Multi-cannon",
'pl': "Pulse Laser",
'rg': "Rail Gun",
'sb': "Shield Booster",
'tp': "Torpedo Pylon"
// Map to lookup group labels/names for component grp
.value('GroupMap', {
// Common
pp: 'Power Plant',
t: 'Thrusters',
fsd: 'Frame Shift Drive',
ls: 'Life Support',
pd: 'Power Distributor',
s: 'Sensors',
ft: 'Fuel Tank',
// Internal
fs: 'Fuel Scoop',
sc: 'Scanners',
am: 'Auto Field-Maint. Unit',
cr: 'Cargo Racks',
fi: 'FSD Interdictor',
hb: 'Hatch Breaker Limpet Ctrl',
hr: 'Hull Reinforcement Package',
rf: 'Refinery',
scb: 'Shield Cell Bank',
sg: 'Shield Generator',
dc: 'Docking Computer',
fx: 'Fuel Transfer Limpet Ctrl',
pc: 'Prospector Limpet Ctrl',
cc: 'Collector Limpet Ctrl',
// Hard Points
bl: 'Beam Laser',
ul: 'Burst Laser',
c: 'Cannon',
cs: 'Cargo Scanner',
cm: 'Countermeasure',
fc: 'Fragment Cannon',
ws: 'Frame Shift Wake Scanner',
kw: 'Kill Warrant Scanner',
nl: 'Mine Launcher',
ml: 'Mining Laser',
mr: 'Missile Rack',
pa: 'Plasma Accelerator',
mc: 'Multi-cannon',
pl: 'Pulse Laser',
rg: 'Rail Gun',
sb: 'Shield Booster',
tp: 'Torpedo Pylon'
})
.value('shipPurpose', {
mp: 'Multi Purpose',
@@ -63,7 +77,7 @@ angular.module('shipyard', ['ngLodash'])
'Small',
'Medium',
'Large',
'Capital',
'Capital'
])
.value('hardPointClass', [
'Utility',
@@ -89,7 +103,7 @@ angular.module('shipyard', ['ngLodash'])
title: 'Speed',
props: ['speed', 'boost'],
lbls: ['Thrusters', 'Boost'],
unit: 'M/s',
unit: 'm/s',
fmt: 'fRound'
},
{ // 2
@@ -101,13 +115,13 @@ angular.module('shipyard', ['ngLodash'])
{ // 3
title: 'Shields',
props: ['shieldStrength'],
unit: 'Mj',
unit: 'MJ',
fmt: 'fRound'
},
{ // 4
title: 'Jump Range',
props: ['unladenJumpRange', 'ladenJumpRange'],
lbls: ['Unladen', 'Laden'],
props: ['unladenRange', 'fullTankRange', 'ladenRange'],
lbls: ['Max', 'Full Tank', 'Laden'],
unit: 'LY',
fmt: 'fRound'
},
@@ -132,7 +146,7 @@ angular.module('shipyard', ['ngLodash'])
},
{ // 8
title: 'Power',
props: ['powerRetracted','powerDeployed','powerAvailable'],
props: ['powerRetracted', 'powerDeployed', 'powerAvailable'],
lbls: ['Retracted', 'Deployed', 'Available'],
unit: 'MW',
fmt: 'fPwr'
@@ -142,8 +156,35 @@ angular.module('shipyard', ['ngLodash'])
props: ['totalCost'],
unit: 'CR',
fmt: 'fCrd'
},
{ // 10
title: 'Total Range',
props: ['unladenTotalRange', 'ladenTotalRange'],
lbls: ['Unladen', 'Laden'],
unit: 'LY',
fmt: 'fRound'
},
{ // 11
title: 'DPS',
props: ['totalDps'],
lbls: ['Dps'],
unit: '',
fmt: 'fRound'
}
])
/**
* Set of all available / theoretical discounts
*
* @type {Object}
*/
.value('Discounts', {
'None': 1,
'5%': 0.95,
'10%': 0.90,
'15%': 0.85,
'20%': 0.80,
'25%': 0.75
})
/**
* Calculate the maximum single jump range based on mass and a specific FSD
*
@@ -153,7 +194,28 @@ angular.module('shipyard', ['ngLodash'])
* @return {number} Distance in Light Years
*/
.value('calcJumpRange', function(mass, fsd, fuel) {
return Math.pow(Math.min(fuel || Infinity, fsd.maxfuel) / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass;
return Math.pow(Math.min(fuel === undefined ? fsd.maxfuel : fuel, fsd.maxfuel) / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass;
})
/**
* Calculate the total range based on mass and a specific FSD, and all fuel available
*
* @param {number} mass Mass of a ship: laden, unlanden, partially laden, etc
* @param {object} fsd The FDS object/component with maxfuel, fuelmul, fuelpower, optmass
* @param {number} fuel The total fuel available
* @return {number} Distance in Light Years
*/
.value('calcTotalRange', function(mass, fsd, fuel) {
var fuelRemaining = fuel % fsd.maxfuel; // Fuel left after making N max jumps
var jumps = fuel / fsd.maxfuel;
mass += fuelRemaining;
// Going backwards, start with the last jump using the remaining fuel
var totalRange = fuelRemaining > 0 ? Math.pow(fuelRemaining / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass : 0;
// For each max fuel jump, calculate the max jump range based on fuel left in the tank
for (var j = 0, l = Math.floor(jumps); j < l; j++) {
fuelRemaining += fsd.maxfuel;
totalRange += Math.pow(fsd.maxfuel / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass;
}
return totalRange;
})
/**
* Calculate the a ships shield strength based on mass, shield generator and shield boosters used.
@@ -165,10 +227,7 @@ angular.module('shipyard', ['ngLodash'])
* @param {number} multiplier Shield multiplier for ship (1 + shield boosters if any)
* @return {number} Approximate shield strengh in MJ
*/
.value('calcShieldStrength', function (mass, shields, sg, multiplier) {
if (!sg) {
return 0;
}
.value('calcShieldStrength', function(mass, shields, sg, multiplier) {
if (mass <= sg.minmass) {
return shields * multiplier * sg.minmul;
}
@@ -179,4 +238,20 @@ angular.module('shipyard', ['ngLodash'])
return shields * multiplier * (sg.optmul + (mass - sg.optmass) / (sg.maxmass - sg.optmass) * (sg.maxmul - sg.optmul));
}
return shields * multiplier * sg.maxmul;
})
/**
* Calculate the a ships speed based on mass, and thrusters. Currently Innacurate / Incomplete :(
*
* @private
* @param {number} mass Current mass of the ship
* @param {number} baseSpeed Base speed m/s for ship
* @param {number} baseBoost Base boost m/s for ship
* @param {object} thrusters The shield generator used
* @return {object} Approximate speed and boost speed in m/s
*/
.value('calcSpeed', function(mass, baseSpeed, baseBoost) { //, thrusters) {
//var speed = baseSpeed * (1 + ((thrusters.optmass / mass) * 0.1 ) ); // TODO: find thruser coefficient(s)
//var boost = baseBoost * (1 + ((thrusters.optmass / mass) * 0.1 ) );
return { boost: baseSpeed, speed: baseBoost };
});

View File

@@ -1,10 +1,10 @@
angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'ShipsDB', 'ComponentSet', function (_, C, Ships, ComponentSet) {
angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'ShipsDB', 'ComponentSet', function(_, C, Ships, ComponentSet) {
this.cargoScoop = function() {
return { name: 'Cargo Hatch', class: 1, rating: 'H', power: 0.6};
return { name: 'Cargo Hatch', class: 1, rating: 'H', power: 0.6 };
};
this.common = function (typeIndex, componentId) {
this.common = function(typeIndex, componentId) {
return C.common[typeIndex][componentId];
};
@@ -32,13 +32,26 @@ angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'Shi
return null;
};
/**
* Looks up the bulkhead component for a specific ship and bulkhead
* @param {string} shipId Unique ship Id/Key
* @param {number} bulkheadsId Id/Index for the specified bulkhead
* @return {object} The bulkhead component object
*/
this.bulkheads = function(shipId, bulkheadsId) {
return C.bulkheads[shipId][bulkheadsId];
};
this.forShip = function (shipId) {
/**
* Creates a new ComponentSet that contains all available components
* that the specified ship is eligible to use.
*
* @param {string} shipId Unique ship Id/Key
* @return {ComponentSet} The set of components the ship can install
*/
this.forShip = function(shipId) {
var ship = Ships[shipId];
return new ComponentSet(C, ship.properties.mass, ship.slots.common, ship.slots.internal[0], ship.slots.hardpoints[0]);
return new ComponentSet(C, ship.properties.mass + 5, ship.slots.common, ship.slots.internal[0], ship.slots.hardpoints[0]);
};
}]);
}]);

View File

@@ -1,5 +1,6 @@
@import 'colors';
@import 'fonts';
@import 'responsive';
@import 'utilities';
@import 'icons';
@import 'background-images';
@@ -13,6 +14,7 @@
@import 'select';
@import 'modal';
@import 'charts';
@import 'slider';
@import 'chart-tooltip';
@import 'buttons';
@import 'error';
@@ -29,6 +31,7 @@ body {
margin: 0;
padding: 0;
font-family: @fStandard;
letter-spacing: 0.05em;
}
div, a, li {
@@ -37,7 +40,7 @@ div, a, li {
#main {
margin: 0;
padding: 0.5em 0.25em;
padding: 0.5em 0;
min-height: 90%;
clear: both;
text-align: center;
@@ -63,10 +66,23 @@ div, a, li {
clear: both;
}
.ri {
text-align: right;
}
.le {
text-align: left;
}
.cen {
text-align: center;
}
.scroll-x {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
h1 {
font-family: @fTitle;
color: @primary;
@@ -75,13 +91,15 @@ h1 {
h2 {
text-transform: uppercase;
font-family: @fTitle;
font-family: @fStandard;
font-size: 1.2em;
font-weight: normal;
}
h3 {
text-transform: uppercase;
font-family: @fTitle;
font-family: @fStandard;
font-weight: normal;
font-size: 1em;
margin: 0.2em 0;
color: @primary;

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