Compare commits

..

145 Commits

Author SHA1 Message Date
Dan Brown
c10d2a1493 Updated assets for release v0.12.2 2016-10-30 13:19:19 +00:00
Dan Brown
97bbf79ffd Merge branch 'v0.12' into release 2016-10-30 13:18:23 +00:00
Dan Brown
2af0021c2b Fixed image tests after amends to url system 2016-10-30 12:58:01 +00:00
Dan Brown
0f2eaccb39 Added quick test to cover hypen breakage 2016-10-30 12:15:11 +00:00
Dan Brown
b251671e3f Amended search to not break on non-alpha-num chars
And also fixed exact term matches that contain non-alpha-num chars
Fixes #212
2016-10-30 12:08:22 +00:00
Dan Brown
c4eed37d8e Added custom head content into public pages
Closes #211
2016-10-30 11:46:23 +00:00
Dan Brown
8b43b91057 Improved password reset flow with notifications.
Also added links to sign-in/register.
Fixed links in emails sent out.

Fixes #210 and #218.
2016-10-30 11:36:57 +00:00
Dan Brown
91fe7f0bee Fixed PDF export table width
Closes #203

Signed-off-by: Dan Brown <ssddanbrown@googlemail.com>
2016-10-30 10:41:18 +00:00
Dan Brown
5cfb7b8de4 Altered 'ol' element padding to not clip numbering
Allows usage to 3-digits now
Closes #204
2016-10-30 10:23:49 +00:00
Dan Brown
6329a1842a Fixed issue with callouts overflowing page tags
Closes #179
2016-10-30 10:19:45 +00:00
Dan Brown
f7b01ae53d Updated assets for release v0.12.1 2016-09-06 20:50:15 +01:00
Dan Brown
d704e1dbba Merge branch 'master' into release 2016-09-06 20:49:15 +01:00
Dan Brown
393f6047f2 Updated table styling to ideally by more predictable
Set styles to be fixed and not cut text.
2016-09-06 20:47:34 +01:00
Dan Brown
d94fc5b694 Fixed table cell p tag spacing and de-duped editor shortcuts
Also changed shortcuts to be better compatible with OSX by using the
command key.
2016-09-06 19:50:47 +01:00
Dan Brown
f06770d91d Updated TinyMCE version from 4.3.7 to 4.4.3 2016-09-06 19:29:09 +01:00
Dan Brown
ef2ff5e093 Updated assets for release v0.12 2016-09-05 19:49:42 +01:00
Dan Brown
7caed3b0db Merge branch 'master' into release 2016-09-05 19:35:21 +01:00
Dan Brown
11960d9d3a Cleaned page form JS & spaced tag box
As per #174
2016-09-05 19:33:14 +01:00
Dan Brown
bbd8fff021 Fixed bad image base-urls and forced tinyMCE to use absolute
Also ensured image file existance is checked during base64 conversion
during exports.
Closes #171.
2016-09-03 19:24:58 +01:00
Dan Brown
ec17bd8608 Improved Exception handling, Removed npm requirement for testing 2016-09-03 12:08:58 +01:00
Dan Brown
0dbb8babee Merge branch 'page_link_selector' 2016-09-03 10:40:27 +01:00
Dan Brown
b14e9fc619 Fixed some cross browser flexbox popup issues
Set min height for poor IE & safari flexbox support.
Fixes #105.
2016-09-03 10:32:14 +01:00
Dan Brown
63c6d3478d Added image paste and drop to markdown editor
Only currently tested in chrome.
Closes #128
2016-09-02 21:18:48 +01:00
Dan Brown
781f0e7887 Added draft save indicator and fixed notification positions 2016-09-02 19:26:12 +01:00
Dan Brown
23e014cb25 Added link selector to markdown editor 2016-09-02 18:54:26 +01:00
Dan Brown
5b64358ef1 Added link selector interface to WYSIWYG editor 2016-09-01 20:36:22 +01:00
Dan Brown
56df64063d Updated popup design and started integrating link selector
Extracted design and base styles from image manager into generic popup
classes that can be used by other app components such as the new
popup Book/Chapter/Page link selector
2016-08-30 20:05:59 +01:00
Dan Brown
3f81eba13b Updated travis testing to work with new helper configuration (#175)
* Updated travis to call phpunit globally rather then booting application first
2016-08-27 11:27:23 +01:00
Dan Brown
7973412c29 Improved sort efficiency by a factor of 10
Fixes #145
2016-08-26 20:20:58 +01:00
Dan Brown
f83de5f834 Fixed single word quoted search terms
Fixes #170
2016-08-25 17:17:26 +01:00
Dan Brown
f2ceba978a Removed animation from page content.
Prevents issues with browsers that do not support
animaton-fill-direction.
Fixes #173.
2016-08-25 16:47:25 +01:00
Dan Brown
96c074bb56 Merge fixes from branch 'v0.11' 2016-08-21 15:02:37 +01:00
Dan Brown
45641d0754 Updated assets for release v0.11.2 2016-08-21 14:56:29 +01:00
Dan Brown
4b1d08ba99 Merge branch 'v0.11' into release 2016-08-21 14:55:11 +01:00
Dan Brown
f8a299caee Fixed login 'intended' redirect for custom urls.
Also changed social account detach wording.
2016-08-21 14:49:40 +01:00
Chris
437dce7756 Applied baseUrl to login redirect 2016-08-21 13:48:56 +01:00
Dan Brown
f8ad820281 Merge pull request #166 from poppahorse/patch-1
Applied baseUrl to login redirect
2016-08-21 13:44:36 +01:00
Dan Brown
757f16a3b5 Improved page tag box structure and fixed footer in PDF export.
Fixes #162.
2016-08-21 13:35:22 +01:00
Chris
632ecc668f Applied baseUrl to login redirect 2016-08-15 15:07:45 +01:00
Dan Brown
92d393537c Merge branch 'v0.11' 2016-08-14 13:09:44 +01:00
Dan Brown
160fa99ba4 Updated assets for release v0.11.1 2016-08-14 12:40:55 +01:00
Dan Brown
d2a5ab49ed Merge branch 'v0.11' into release 2016-08-14 12:37:48 +01:00
Dan Brown
43d9d2eba7 Updated all application urls to allow path prefix.
Allows BookStack to be installed at a non-root location on a domain.
Closes #40.
2016-08-14 12:29:35 +01:00
Dan Brown
baa260a03d Started work on subdirectory support 2016-08-13 17:56:25 +01:00
Dan Brown
b157a9927a Fixed tag section and editor safari rendering.
Fixes #152.
2016-08-13 14:54:23 +01:00
Dan Brown
b246a67e8a Fixed double brace issues in both editors.
Double braces were being parsed by angular in both the WYSIWYG and markdown editor.
Fixes #150 and fixes #155.
2016-08-13 14:18:31 +01:00
Dan Brown
2d958e88bf Fixed entities created with blank slugs.
Fixes #156.
2016-08-13 13:53:04 +01:00
Dan Brown
07c7d5af17 Updated elixr and fixed table th element borders
Fixes #164.
2016-08-13 10:02:54 +01:00
Dan Brown
42976ca48c Fixed revision-based redirect on new pages 2016-07-26 18:16:40 +01:00
Dan Brown
d05e85efa9 Fixed back-to-top button on firefox. Fixes #153. 2016-07-26 18:03:10 +01:00
Dan Brown
547e117760 Changed issue template to use md extension 2016-07-26 17:46:09 +01:00
Nick Walke
50a5d3c546 Added issue template 2016-07-21 10:04:06 -05:00
Dan Brown
3fd82200cc Added WYSIWYG editor shortcuts 2016-07-12 21:11:48 +01:00
Dan Brown
7215392784 Changed when revisions are saved and update changelog input
Revisions are now saved when te page content is originally saved whereas before they were saved on the next update to the page.
2016-07-10 12:12:52 +01:00
Dan Brown
8a9a8dfae5 Merge branch 'summary' of git://github.com/younes0/BookStack into younes0-summary 2016-07-10 10:42:47 +01:00
Dan Brown
c44314def3 Added check for s3 bucket name to choose shortest url 2016-07-10 10:28:05 +01:00
Dan Brown
8b899a9cf0 Merge branch 'patch-1' of git://github.com/younes0/BookStack into younes0-patch-1 2016-07-10 10:15:38 +01:00
Dan Brown
0ebdfa4825 Merge pull request #144 from younes0/patch-2
set uploaded images visibility public (relevant for S3 storage)
2016-07-10 10:14:19 +01:00
Younes El Biache
32a06f119b set uploaded files public visibliity (relevant for S3 storage) 2016-07-09 15:26:53 +02:00
Younes El Biache
ec30864ce5 shorter amazon S3 url 2016-07-09 14:33:37 +02:00
Younès EL BIACHE
6bc72e157a edit summary 2016-07-07 20:53:43 +02:00
Dan Brown
c6404d8917 Updated assets for release v0.11 2016-07-03 10:56:16 +01:00
Dan Brown
7113807f12 Merge branch 'master' into release 2016-07-03 10:52:04 +01:00
Dan Brown
10418323ef Prevented shift-tab from selecting a tag 2016-07-03 10:47:20 +01:00
Dan Brown
a11d5245ec Cut down homepage queries a little 2016-07-03 10:42:13 +01:00
Dan Brown
565033e0d4 Fixed bug which hid entities and fixed new chapter priority 2016-07-03 10:31:20 +01:00
Dan Brown
c25ef18900 Made list default messages a little nicer 2016-07-03 10:12:12 +01:00
Dan Brown
b0a63ba0cc Tightened and cleaned some list styles 2016-07-03 09:58:45 +01:00
Dan Brown
7b6c88f17c Fixed error on image deletion
Also Added tests to cover image upload and deletion.
Fixes #136.
2016-07-01 20:13:30 +01:00
Dan Brown
361ba8b244 Made stick book navigation recalc on window resize 2016-06-25 15:46:31 +01:00
Dan Brown
9baa96d41c Added chapter move actions. Closes #86 2016-06-25 15:31:38 +01:00
Dan Brown
e584b4926f Travis CI updates (#130)
* Updated travis config to use mysql

* Added cache for composer
2016-06-19 19:30:43 +01:00
Dan Brown
bcd9c2044e Added WYSIWYG editor callouts 2016-06-19 19:02:53 +01:00
Dan Brown
d582e76fed Fixed theme color elements not showing on new instance
Also cleaned notification session access
2016-06-12 13:37:15 +01:00
Dan Brown
991dd8a558 Merged branch add_page_move into master
References #86
2016-06-12 12:49:08 +01:00
Dan Brown
bc49784797 Added tests to cover page_move features 2016-06-12 12:48:06 +01:00
Dan Brown
7f99903fdb Finished off page move functionality 2016-06-12 12:14:14 +01:00
Dan Brown
97d011ac8e Started work on page move view and entity selector 2016-06-11 21:04:18 +01:00
Dan Brown
61596a8e21 Prevent page redirect on draft saving
Only an issue when using the non 'mysqlnd' extension.
Fixes #120
2016-06-10 19:45:53 +01:00
Dan Brown
44e337cef6 Merged branch rovox-master into master 2016-06-04 16:33:23 +01:00
Dan Brown
1bec3eaa1e Added checks to use MyISAM if MySQL 5.5 is found 2016-06-04 16:32:57 +01:00
Dan Brown
5942d796b5 Merge branch 'master' of git://github.com/rovox/BookStack into rovox-master 2016-06-04 15:43:08 +01:00
Dan Brown
eec9c05518 Added tag autosuggestion when no input provided
Shows the most popular tag names/values.
As requested on #121
2016-06-04 15:37:28 +01:00
Dan Brown
246d1621f5 Limited tag value autosuggestions based on tag name
As requested on #121
2016-06-04 14:54:31 +01:00
Dan Brown
6c1e06bf86 Updated License file 2016-06-03 18:52:49 +01:00
Dan Brown
3c1e165134 Add in LICENSE file 2016-06-03 18:51:47 +01:00
Dan Brown
80d1c594cc Added licence and release badges 2016-06-03 18:50:20 +01:00
Dan Brown
947db95d16 Fixed error with similar activity filtering 2016-05-28 14:02:48 +01:00
Dan Brown
5b9362ab0b Added (Ctrl+s) draft force save 2016-05-28 13:51:07 +01:00
Dan Brown
f602b088ac Added basic markdown scroll syncing 2016-05-28 13:24:07 +01:00
robert
4acf0c4ee0 Making sure MyISAM is set for the tables that need it for new installtions that are using mariadb. 2016-05-25 23:52:43 +02:00
Dan Brown
be711215e8 Updated assets for release v0.10 2016-05-22 15:12:47 +01:00
Dan Brown
7e3b404240 Merge branch 'master' into release for version v0.10 2016-05-22 15:11:50 +01:00
Dan Brown
9d3f329bc9 Fixed missing column drop on migration rollback 2016-05-22 14:56:26 +01:00
Dan Brown
bd00a03e7b Added support for custom content in HTML head 2016-05-22 11:01:21 +01:00
Dan Brown
be517de7dc Added pagination, sorting & searching to users list
As requested on #113
2016-05-22 10:44:31 +01:00
Dan Brown
23ab1f0c81 Standardised delete aesthetics regarding roles and users
Also added user delete success message.
Fixes #114
2016-05-22 09:23:41 +01:00
Dan Brown
49621e7b15 Fixed flexbox overflow scrolling issues in firefox
Fixes #111
2016-05-22 09:08:37 +01:00
Dan Brown
1ab6f017c9 Made user names clickable at the bottom of assets
Fixes #117
2016-05-22 08:48:40 +01:00
Dan Brown
0b364fd72f Merge pull request #110 from ssddanbrown/page_attributes
Attribute System. Closes #48.
2016-05-15 20:24:57 +01:00
Dan Brown
e80ae76856 Added auto-suggestions to tag names and values 2016-05-15 20:12:53 +01:00
Dan Brown
eebad3e2a0 Fixed tags not being saved on new pages 2016-05-15 14:17:25 +01:00
Dan Brown
db2af47286 Revert travis CI changes 2016-05-15 13:59:16 +01:00
Dan Brown
7ad28aeab4 Updated travis file to hopefully fix CI errors 2016-05-15 13:53:42 +01:00
Dan Brown
8d80e7311c Added tag searching to search interfaces 2016-05-15 13:41:18 +01:00
Dan Brown
7932069535 Added tags to page display and simplified editing flow
Tags now save with the page content data
2016-05-15 10:39:17 +01:00
Dan Brown
78564ec61d Cleaned up tag edit interface 2016-05-14 20:02:00 +01:00
Dan Brown
b80184cd93 Renamed attribute to tags & continued interface
Also fixed page create route broken in last commit
2016-05-13 21:20:21 +01:00
Dan Brown
1fa079b466 Started the page attributes interface 2016-05-12 23:12:05 +01:00
Dan Brown
fcfb9470c9 Added further attribute endpoints and added tests 2016-05-07 14:29:43 +01:00
Dan Brown
c99653f0f2 Fixed bad refactor in the permission service 2016-05-06 20:44:07 +01:00
Dan Brown
5080b4996e Started base work on attribute system 2016-05-06 20:33:08 +01:00
Dan Brown
1903422113 Merge branch 'v0.9' 2016-05-03 21:30:55 +01:00
Dan Brown
e86901ca20 Updated assets for release v0.9.3 2016-05-03 21:13:02 +01:00
Dan Brown
bdfa61c8b2 Merge branch 'v0.9' into release 2016-05-03 21:11:01 +01:00
Dan Brown
4e8722661f Added bookstack version in settings
Gets the app version via git. Closes #99
2016-05-03 21:10:05 +01:00
Dan Brown
6f9d2939e7 Updated travisCI to help fix node error 2016-05-02 13:14:35 +01:00
Dan Brown
3234510d31 Merged ci_testing into master 2016-05-02 13:01:46 +01:00
Dan Brown
a40af08018 Changed mariadb version 2016-05-02 12:50:17 +01:00
Dan Brown
223a6b546c Added dependancy caching and travis badge 2016-05-02 12:37:58 +01:00
Dan Brown
0d5da2d9d4 Added travis CI file 2016-05-02 12:26:09 +01:00
Dan Brown
37337b8b1d Added codeship CI badge 2016-05-02 12:02:23 +01:00
Dan Brown
ffcc058927 Merge pull request #106 from ssddanbrown/ci_testing
Ci testing
2016-05-02 11:58:12 +01:00
Dan Brown
3a1cda5802 Updated ldap so extension not required in testing 2016-05-02 11:38:07 +01:00
Dan Brown
5c1015d6fc Updated social testing compatibility 2016-05-02 11:26:47 +01:00
Dan Brown
3385ec3f78 Updated database config to be codeship compatible 2016-05-02 10:35:42 +01:00
Dan Brown
1b46c19849 Merge pull request #103 from ssddanbrown/add_role_view_permissions
Overhauled permission system and stripped migrations of most app code to reduce future breakages. Closes #101.
2016-05-01 22:47:22 +01:00
Dan Brown
75a4fc905b Major permission naming refactor and database migration cleanup 2016-05-01 22:33:56 +01:00
Dan Brown
05666efda9 Added hidden public role to fit with new permissions system 2016-05-01 19:36:53 +01:00
Dan Brown
59367b3417 Improved permission regen performance by factor of 4
Worked around slower eloquent access to speed up permission generation.
2016-04-30 17:16:06 +01:00
Dan Brown
9a31b83b2a Worked around create permission quirks 2016-04-26 21:48:17 +01:00
Dan Brown
a81a56706e Rolled out new permissions system throughout application 2016-04-24 16:54:20 +01:00
Dan Brown
9dc1b35e82 Made settings ui a little less jumpy 2016-04-24 10:28:47 +01:00
Dan Brown
2dc1180a41 Added custom, More consistent hr insertion
Since the previous hr plugin caused large empty p tags
2016-04-23 19:15:49 +01:00
Dan Brown
ada7c83e96 Continued with database work for permissions overhaul
Added to the entity_permissions table with further required fields and indexes.
Wrote the code for checking permissions.
2016-04-23 18:14:26 +01:00
Dan Brown
ea287ebf86 Started creation of intermediate permission table 2016-04-20 21:37:57 +01:00
Dan Brown
043cdeafb3 Merge branch 'master' into add_role_view_permissions 2016-04-20 20:22:30 +01:00
Dan Brown
8b36ca95a3 Improved font quality and cyrillic support
Fixes dodgy font rendering on windows
2016-04-20 19:11:33 +01:00
Dan Brown
2cc36787f5 Updated assets for release 0.9.2 2016-04-15 19:57:02 +01:00
Dan Brown
448ac61b48 Merge branch 'master' into release 2016-04-15 19:52:59 +01:00
Dan Brown
8933179017 Prevented drafts from showing up in a book sort
Added tests to cover regresssion.
In reference to #100.
2016-04-15 19:51:27 +01:00
Dan Brown
792e786880 Added lists plugin to TinyMCE, Fixed strange nested list behaviour
Fixes #97
2016-04-14 22:34:33 +01:00
Dan Brown
753f6394f7 Merge branch 'master' into release 2016-04-12 20:09:14 +01:00
Dan Brown
0a8030306e Fixed redis config not being set if not using redis 2016-04-12 20:08:49 +01:00
Dan Brown
6e03078de3 Started work towards adding role view permissions
Work halted as re-write required.
In reference to #92
2016-04-09 12:40:07 +01:00
271 changed files with 5511 additions and 7077 deletions

View File

@@ -3,6 +3,10 @@ APP_ENV=production
APP_DEBUG=false
APP_KEY=SomeRandomString
# The below url has to be set if using social auth options
# or if you are not using BookStack at the root path of your domain.
# APP_URL=http://bookstack.dev
# Database details
DB_HOST=localhost
DB_DATABASE=database_database
@@ -42,8 +46,6 @@ GITHUB_APP_ID=false
GITHUB_APP_SECRET=false
GOOGLE_APP_ID=false
GOOGLE_APP_SECRET=false
# URL used for social login redirects, NO TRAILING SLASH
APP_URL=http://bookstack.dev
# External services such as Gravatar
DISABLE_EXTERNAL_SERVICES=false

11
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,11 @@
### For Feature Requests
Desired Feature:
### For Bug Reports
PHP Version:
MySQL Version:
Expected Behavior:
Actual Behavior:

31
.travis.yml Normal file
View File

@@ -0,0 +1,31 @@
dist: trusty
sudo: required
language: php
php:
- 7.0
cache:
directories:
- $HOME/.composer/cache
addons:
apt:
packages:
- mysql-server-5.6
- mysql-client-core-5.6
- mysql-client-5.6
before_script:
- mysql -u root -e 'create database `bookstack-test`;'
- composer config -g github-oauth.github.com $GITHUB_ACCESS_TOKEN
- phpenv config-rm xdebug.ini
- composer self-update
- composer dump-autoload --no-interaction
- composer install --prefer-dist --no-interaction
- php artisan clear-compiled -n
- php artisan optimize -n
- php artisan migrate --force -n --database=mysql_testing
- php artisan db:seed --force -n --class=DummyContentSeeder --database=mysql_testing
script:
- phpunit

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2016 Dan Brown
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software 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
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -2,8 +2,6 @@
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
/**
* @property string key
* @property \User user
@@ -28,7 +26,7 @@ class Activity extends Model
*/
public function user()
{
return $this->belongsTo('BookStack\User');
return $this->belongsTo(User::class);
}
/**
@@ -46,7 +44,7 @@ class Activity extends Model
* @return bool
*/
public function isSimilarTo($activityB) {
return [$this->key, $this->entitiy_type, $this->entitiy_id] === [$activityB->key, $activityB->entitiy_type, $activityB->entitiy_id];
return [$this->key, $this->entity_type, $this->entity_id] === [$activityB->key, $activityB->entity_type, $activityB->entity_id];
}
}

View File

@@ -1,35 +1,59 @@
<?php
namespace BookStack;
<?php namespace BookStack;
class Book extends Entity
{
protected $fillable = ['name', 'description'];
public function getUrl()
/**
* Get the url for this book.
* @param string|bool $path
* @return string
*/
public function getUrl($path = false)
{
return '/books/' . $this->slug;
if ($path !== false) {
return baseUrl('/books/' . $this->slug . '/' . trim($path, '/'));
}
return baseUrl('/books/' . $this->slug);
}
/*
* Get the edit url for this book.
* @return string
*/
public function getEditUrl()
{
return $this->getUrl() . '/edit';
}
/**
* Get all pages within this book.
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function pages()
{
return $this->hasMany('BookStack\Page');
return $this->hasMany(Page::class);
}
/**
* Get all chapters within this book.
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function chapters()
{
return $this->hasMany('BookStack\Chapter');
return $this->hasMany(Chapter::class);
}
/**
* Get an excerpt of this book's description to the specified length or less.
* @param int $length
* @return string
*/
public function getExcerpt($length = 100)
{
return strlen($this->description) > $length ? substr($this->description, 0, $length-3) . '...' : $this->description;
$description = $this->description;
return strlen($description) > $length ? substr($description, 0, $length-3) . '...' : $description;
}
}

View File

@@ -5,25 +5,47 @@ class Chapter extends Entity
{
protected $fillable = ['name', 'description', 'priority', 'book_id'];
/**
* Get the book this chapter is within.
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function book()
{
return $this->belongsTo('BookStack\Book');
return $this->belongsTo(Book::class);
}
/**
* Get the pages that this chapter contains.
* @return mixed
*/
public function pages()
{
return $this->hasMany('BookStack\Page')->orderBy('priority', 'ASC');
return $this->hasMany(Page::class)->orderBy('priority', 'ASC');
}
public function getUrl()
/**
* Get the url of this chapter.
* @param string|bool $path
* @return string
*/
public function getUrl($path = false)
{
$bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
return '/books/' . $bookSlug. '/chapter/' . $this->slug;
if ($path !== false) {
return baseUrl('/books/' . $bookSlug. '/chapter/' . $this->slug . '/' . trim($path, '/'));
}
return baseUrl('/books/' . $bookSlug. '/chapter/' . $this->slug);
}
/**
* Get an excerpt of this chapter's description to the specified length or less.
* @param int $length
* @return string
*/
public function getExcerpt($length = 100)
{
return strlen($this->description) > $length ? substr($this->description, 0, $length-3) . '...' : $this->description;
$description = $this->description;
return strlen($description) > $length ? substr($description, 0, $length-3) . '...' : $description;
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace BookStack\Console\Commands;
use BookStack\Services\PermissionService;
use Illuminate\Console\Command;
class RegeneratePermissions extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'permissions:regen';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Regenerate all system permissions';
/**
* The service to handle the permission system.
*
* @var PermissionService
*/
protected $permissionService;
/**
* Create a new command instance.
*
* @param PermissionService $permissionService
*/
public function __construct(PermissionService $permissionService)
{
$this->permissionService = $permissionService;
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->permissionService->buildJointPermissions();
}
}

View File

@@ -15,6 +15,7 @@ class Kernel extends ConsoleKernel
protected $commands = [
\BookStack\Console\Commands\Inspire::class,
\BookStack\Console\Commands\ResetViews::class,
\BookStack\Console\Commands\RegeneratePermissions::class,
];
/**

View File

@@ -1,15 +1,16 @@
<?php
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
<?php namespace BookStack;
class EmailConfirmation extends Model
{
protected $fillable = ['user_id', 'token'];
/**
* Get the user that this confirmation is attached to.
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function user()
{
return $this->belongsTo('BookStack\User');
return $this->belongsTo(User::class);
}
}

View File

@@ -1,7 +1,7 @@
<?php namespace BookStack;
abstract class Entity extends Ownable
class Entity extends Ownable
{
/**
@@ -43,7 +43,7 @@ abstract class Entity extends Ownable
*/
public function activity()
{
return $this->morphMany('BookStack\Activity', 'entity')->orderBy('created_at', 'desc');
return $this->morphMany(Activity::class, 'entity')->orderBy('created_at', 'desc');
}
/**
@@ -51,15 +51,24 @@ abstract class Entity extends Ownable
*/
public function views()
{
return $this->morphMany('BookStack\View', 'viewable');
return $this->morphMany(View::class, 'viewable');
}
/**
* Get the Tag models that have been user assigned to this entity.
* @return \Illuminate\Database\Eloquent\Relations\MorphMany
*/
public function tags()
{
return $this->morphMany(Tag::class, 'entity')->orderBy('order', 'asc');
}
/**
* Get this entities restrictions.
*/
public function restrictions()
public function permissions()
{
return $this->morphMany('BookStack\Restriction', 'restrictable');
return $this->morphMany(EntityPermission::class, 'restrictable');
}
/**
@@ -70,7 +79,28 @@ abstract class Entity extends Ownable
*/
public function hasRestriction($role_id, $action)
{
return $this->restrictions->where('role_id', $role_id)->where('action', $action)->count() > 0;
return $this->permissions()->where('role_id', '=', $role_id)
->where('action', '=', $action)->count() > 0;
}
/**
* Check if this entity has live (active) restrictions in place.
* @param $role_id
* @param $action
* @return bool
*/
public function hasActiveRestriction($role_id, $action)
{
return $this->getRawAttribute('restricted') && $this->hasRestriction($role_id, $action);
}
/**
* Get the entity jointPermissions this is connected to.
* @return \Illuminate\Database\Eloquent\Relations\MorphMany
*/
public function jointPermissions()
{
return $this->morphMany(JointPermission::class, 'entity');
}
/**
@@ -81,7 +111,32 @@ abstract class Entity extends Ownable
*/
public static function isA($type)
{
return static::getClassName() === strtolower($type);
return static::getType() === strtolower($type);
}
/**
* Get entity type.
* @return mixed
*/
public static function getType()
{
return strtolower(static::getClassName());
}
/**
* Get an instance of an entity of the given type.
* @param $type
* @return Entity
*/
public static function getEntityInstance($type)
{
$types = ['Page', 'Book', 'Chapter'];
$className = str_replace([' ', '-', '_'], '', ucwords($type));
if (!in_array($className, $types)) {
return null;
}
return app('BookStack\\' . $className);
}
/**
@@ -102,24 +157,31 @@ abstract class Entity extends Ownable
* @param string[] array $wheres
* @return mixed
*/
public static function fullTextSearchQuery($fieldsToSearch, $terms, $wheres = [])
public function fullTextSearchQuery($fieldsToSearch, $terms, $wheres = [])
{
$exactTerms = [];
$fuzzyTerms = [];
$search = static::newQuery();
foreach ($terms as $key => $term) {
$term = htmlentities($term, ENT_QUOTES);
$term = preg_replace('/[+\-><\(\)~*\"@]+/', ' ', $term);
if (preg_match('/\s/', $term)) {
$exactTerms[] = '%' . $term . '%';
$term = '"' . $term . '"';
$safeTerm = htmlentities($term, ENT_QUOTES);
$safeTerm = preg_replace('/[+\-><\(\)~*\"@]+/', ' ', $safeTerm);
if (preg_match('/&quot;.*?&quot;/', $safeTerm) || is_numeric($safeTerm)) {
$safeTerm = preg_replace('/^"(.*?)"$/', '$1', $term);
$exactTerms[] = '%' . $safeTerm . '%';
} else {
$term = '' . $term . '*';
$safeTerm = '' . $safeTerm . '*';
if (trim($safeTerm) !== '*') $fuzzyTerms[] = $safeTerm;
}
if ($term !== '*') $terms[$key] = $term;
}
$termString = implode(' ', $terms);
$fields = implode(',', $fieldsToSearch);
$search = static::selectRaw('*, MATCH(name) AGAINST(? IN BOOLEAN MODE) AS title_relevance', [$termString]);
$search = $search->whereRaw('MATCH(' . $fields . ') AGAINST(? IN BOOLEAN MODE)', [$termString]);
$isFuzzy = count($exactTerms) === 0 || count($fuzzyTerms) > 0;
// Perform fulltext search if relevant terms exist.
if ($isFuzzy) {
$termString = implode(' ', $fuzzyTerms);
$fields = implode(',', $fieldsToSearch);
$search = $search->selectRaw('*, MATCH(name) AGAINST(? IN BOOLEAN MODE) AS title_relevance', [$termString]);
$search = $search->whereRaw('MATCH(' . $fields . ') AGAINST(? IN BOOLEAN MODE)', [$termString]);
}
// Ensure at least one exact term matches if in search
if (count($exactTerms) > 0) {
@@ -131,25 +193,21 @@ abstract class Entity extends Ownable
}
});
}
$orderBy = $isFuzzy ? 'title_relevance' : 'updated_at';
// Add additional where terms
foreach ($wheres as $whereTerm) {
$search->where($whereTerm[0], $whereTerm[1], $whereTerm[2]);
}
// Load in relations
if (static::isA('page')) {
if ($this->isA('page')) {
$search = $search->with('book', 'chapter', 'createdBy', 'updatedBy');
} else if (static::isA('chapter')) {
} else if ($this->isA('chapter')) {
$search = $search->with('book');
}
return $search->orderBy('title_relevance', 'desc');
return $search->orderBy($orderBy, 'desc');
}
/**
* Get the url for this item.
* @return string
*/
abstract public function getUrl();
}

View File

@@ -1,10 +1,7 @@
<?php
<?php namespace BookStack;
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
class Restriction extends Model
class EntityPermission extends Model
{
protected $fillable = ['role_id', 'action'];
@@ -16,6 +13,6 @@ class Restriction extends Model
*/
public function restrictable()
{
return $this->morphTo();
return $this->morphTo('restrictable');
}
}

View File

@@ -47,19 +47,44 @@ class Handler extends ExceptionHandler
{
// Handle notify exceptions which will redirect to the
// specified location then show a notification message.
if ($e instanceof NotifyException) {
\Session::flash('error', $e->message);
return response()->redirectTo($e->redirectLocation);
if ($this->isExceptionType($e, NotifyException::class)) {
session()->flash('error', $this->getOriginalMessage($e));
return redirect($e->redirectLocation);
}
// Handle pretty exceptions which will show a friendly application-fitting page
// Which will include the basic message to point the user roughly to the cause.
if (($e instanceof PrettyException || $e->getPrevious() instanceof PrettyException) && !config('app.debug')) {
$message = ($e instanceof PrettyException) ? $e->getMessage() : $e->getPrevious()->getMessage();
if ($this->isExceptionType($e, PrettyException::class) && !config('app.debug')) {
$message = $this->getOriginalMessage($e);
$code = ($e->getCode() === 0) ? 500 : $e->getCode();
return response()->view('errors/' . $code, ['message' => $message], $code);
}
return parent::render($request, $e);
}
/**
* Check the exception chain to compare against the original exception type.
* @param Exception $e
* @param $type
* @return bool
*/
protected function isExceptionType(Exception $e, $type) {
do {
if (is_a($e, $type)) return true;
} while ($e = $e->getPrevious());
return false;
}
/**
* Get original exception message.
* @param Exception $e
* @return string
*/
protected function getOriginalMessage(Exception $e) {
do {
$message = $e->getMessage();
} while ($e = $e->getPrevious());
return $message;
}
}

View File

@@ -1,5 +1,3 @@
<?php namespace BookStack\Exceptions;
use Exception;
class PrettyException extends Exception {}
class PrettyException extends \Exception {}

View File

@@ -1,9 +1,6 @@
<?php
namespace BookStack\Http\Controllers\Auth;
<?php namespace BookStack\Http\Controllers\Auth;
use BookStack\Exceptions\AuthException;
use BookStack\Exceptions\PrettyException;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;
use BookStack\Exceptions\SocialSignInException;
@@ -36,7 +33,6 @@ class AuthController extends Controller
protected $redirectAfterLogout = '/login';
protected $username = 'email';
protected $socialAuthService;
protected $emailConfirmationService;
protected $userRepo;
@@ -53,6 +49,8 @@ class AuthController extends Controller
$this->socialAuthService = $socialAuthService;
$this->emailConfirmationService = $emailConfirmationService;
$this->userRepo = $userRepo;
$this->redirectPath = baseUrl('/');
$this->redirectAfterLogout = baseUrl('/login');
$this->username = config('auth.method') === 'standard' ? 'email' : 'username';
parent::__construct();
}
@@ -147,7 +145,9 @@ class AuthController extends Controller
auth()->login($user);
}
return redirect()->intended($this->redirectPath());
$path = session()->pull('url.intended', '/');
$path = baseUrl($path, true);
return redirect($path);
}
/**

View File

@@ -4,6 +4,8 @@ namespace BookStack\Http\Controllers\Auth;
use BookStack\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
use Illuminate\Http\Request;
use Password;
class PasswordController extends Controller
{
@@ -29,4 +31,46 @@ class PasswordController extends Controller
{
$this->middleware('guest');
}
/**
* Send a reset link to the given user.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function sendResetLinkEmail(Request $request)
{
$this->validate($request, ['email' => 'required|email']);
$broker = $this->getBroker();
$response = Password::broker($broker)->sendResetLink(
$request->only('email'), $this->resetEmailBuilder()
);
switch ($response) {
case Password::RESET_LINK_SENT:
$message = 'A password reset link has been sent to ' . $request->get('email') . '.';
session()->flash('success', $message);
return $this->getSendResetLinkEmailSuccessResponse($response);
case Password::INVALID_USER:
default:
return $this->getSendResetLinkEmailFailureResponse($response);
}
}
/**
* Get the response for after a successful password reset.
*
* @param string $response
* @return \Symfony\Component\HttpFoundation\Response
*/
protected function getResetSuccessResponse($response)
{
$message = 'Your password has been successfully reset.';
session()->flash('success', $message);
return redirect($this->redirectPath())->with('status', trans($response));
}
}

View File

@@ -3,7 +3,6 @@
use Activity;
use BookStack\Repos\UserRepo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use BookStack\Http\Requests;
use BookStack\Repos\BookRepo;
use BookStack\Repos\ChapterRepo;
@@ -71,11 +70,7 @@ class BookController extends Controller
'name' => 'required|string|max:255',
'description' => 'string|max:1000'
]);
$book = $this->bookRepo->newFromInput($request->all());
$book->slug = $this->bookRepo->findSuitableSlug($book->name);
$book->created_by = Auth::user()->id;
$book->updated_by = Auth::user()->id;
$book->save();
$book = $this->bookRepo->createFromInput($request->all());
Activity::add($book, 'book_create', $book->id);
return redirect($book->getUrl());
}
@@ -88,6 +83,7 @@ class BookController extends Controller
public function show($slug)
{
$book = $this->bookRepo->getBySlug($slug);
$this->checkOwnablePermission('book-view', $book);
$bookChildren = $this->bookRepo->getChildren($book);
Views::add($book);
$this->setPageTitle($book->getShortName());
@@ -121,10 +117,7 @@ class BookController extends Controller
'name' => 'required|string|max:255',
'description' => 'string|max:1000'
]);
$book->fill($request->all());
$book->slug = $this->bookRepo->findSuitableSlug($book->name, $book->id);
$book->updated_by = Auth::user()->id;
$book->save();
$book = $this->bookRepo->updateFromInput($book, $request->all());
Activity::add($book, 'book_update', $book->id);
return redirect($book->getUrl());
}
@@ -151,7 +144,7 @@ class BookController extends Controller
{
$book = $this->bookRepo->getBySlug($bookSlug);
$this->checkOwnablePermission('book-update', $book);
$bookChildren = $this->bookRepo->getChildren($book);
$bookChildren = $this->bookRepo->getChildren($book, true);
$books = $this->bookRepo->getAll(false);
$this->setPageTitle('Sort Book ' . $book->getShortName());
return view('books/sort', ['book' => $book, 'current' => $book, 'books' => $books, 'bookChildren' => $bookChildren]);
@@ -186,21 +179,31 @@ class BookController extends Controller
return redirect($book->getUrl());
}
$sortedBooks = [];
// Sort pages and chapters
$sortedBooks = [];
$updatedModels = collect();
$sortMap = json_decode($request->get('sort-tree'));
$defaultBookId = $book->id;
foreach ($sortMap as $index => $bookChild) {
$id = $bookChild->id;
// Loop through contents of provided map and update entities accordingly
foreach ($sortMap as $bookChild) {
$priority = $bookChild->sort;
$id = intval($bookChild->id);
$isPage = $bookChild->type == 'page';
$bookId = $this->bookRepo->exists($bookChild->book) ? $bookChild->book : $defaultBookId;
$bookId = $this->bookRepo->exists($bookChild->book) ? intval($bookChild->book) : $defaultBookId;
$chapterId = ($isPage && $bookChild->parentChapter === false) ? 0 : intval($bookChild->parentChapter);
$model = $isPage ? $this->pageRepo->getById($id) : $this->chapterRepo->getById($id);
$isPage ? $this->pageRepo->changeBook($bookId, $model) : $this->chapterRepo->changeBook($bookId, $model);
$model->priority = $index;
if ($isPage) {
$model->chapter_id = ($bookChild->parentChapter === false) ? 0 : $bookChild->parentChapter;
// Update models only if there's a change in parent chain or ordering.
if ($model->priority !== $priority || $model->book_id !== $bookId || ($isPage && $model->chapter_id !== $chapterId)) {
$isPage ? $this->pageRepo->changeBook($bookId, $model) : $this->chapterRepo->changeBook($bookId, $model);
$model->priority = $priority;
if ($isPage) $model->chapter_id = $chapterId;
$model->save();
$updatedModels->push($model);
}
$model->save();
// Store involved books to be sorted later
if (!in_array($bookId, $sortedBooks)) {
$sortedBooks[] = $bookId;
}
@@ -212,6 +215,9 @@ class BookController extends Controller
Activity::add($updatedBook, 'book_sort', $updatedBook->id);
}
// Update permissions on changed models
$this->bookRepo->buildJointPermissions($updatedModels);
return redirect($book->getUrl());
}
@@ -226,7 +232,7 @@ class BookController extends Controller
$this->checkOwnablePermission('book-delete', $book);
Activity::addMessage('book_delete', 0, $book->name);
Activity::removeEntity($book);
$this->bookRepo->destroyBySlug($bookSlug);
$this->bookRepo->destroy($book);
return redirect('/books');
}
@@ -257,7 +263,7 @@ class BookController extends Controller
{
$book = $this->bookRepo->getBySlug($bookSlug);
$this->checkOwnablePermission('restrictions-manage', $book);
$this->bookRepo->updateRestrictionsFromRequest($request, $book);
$this->bookRepo->updateEntityPermissionsFromRequest($request, $book);
session()->flash('success', 'Book Restrictions Updated');
return redirect($book->getUrl());
}

View File

@@ -57,12 +57,9 @@ class ChapterController extends Controller
$book = $this->bookRepo->getBySlug($bookSlug);
$this->checkOwnablePermission('chapter-create', $book);
$chapter = $this->chapterRepo->newFromInput($request->all());
$chapter->slug = $this->chapterRepo->findSuitableSlug($chapter->name, $book->id);
$chapter->priority = $this->bookRepo->getNewPriority($book);
$chapter->created_by = auth()->user()->id;
$chapter->updated_by = auth()->user()->id;
$book->chapters()->save($chapter);
$input = $request->all();
$input['priority'] = $this->bookRepo->getNewPriority($book);
$chapter = $this->chapterRepo->createFromInput($input, $book);
Activity::add($chapter, 'chapter_create', $book->id);
return redirect($chapter->getUrl());
}
@@ -77,6 +74,7 @@ class ChapterController extends Controller
{
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->checkOwnablePermission('chapter-view', $chapter);
$sidebarTree = $this->bookRepo->getChildren($book);
Views::add($chapter);
$this->setPageTitle($chapter->getShortName());
@@ -156,6 +154,63 @@ class ChapterController extends Controller
return redirect($book->getUrl());
}
/**
* Show the page for moving a chapter.
* @param $bookSlug
* @param $chapterSlug
* @return mixed
* @throws \BookStack\Exceptions\NotFoundException
*/
public function showMove($bookSlug, $chapterSlug) {
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->checkOwnablePermission('chapter-update', $chapter);
return view('chapters/move', [
'chapter' => $chapter,
'book' => $book
]);
}
/**
* Perform the move action for a chapter.
* @param $bookSlug
* @param $chapterSlug
* @param Request $request
* @return mixed
* @throws \BookStack\Exceptions\NotFoundException
*/
public function move($bookSlug, $chapterSlug, Request $request) {
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->checkOwnablePermission('chapter-update', $chapter);
$entitySelection = $request->get('entity_selection', null);
if ($entitySelection === null || $entitySelection === '') {
return redirect($chapter->getUrl());
}
$stringExploded = explode(':', $entitySelection);
$entityType = $stringExploded[0];
$entityId = intval($stringExploded[1]);
$parent = false;
if ($entityType == 'book') {
$parent = $this->bookRepo->getById($entityId);
}
if ($parent === false || $parent === null) {
session()->flash('The selected Book was not found');
return redirect()->back();
}
$this->chapterRepo->changeBook($parent->id, $chapter, true);
Activity::add($chapter, 'chapter_move', $chapter->book->id);
session()->flash('success', sprintf('Chapter moved to "%s"', $parent->name));
return redirect($chapter->getUrl());
}
/**
* Show the Restrictions view.
* @param $bookSlug
@@ -186,7 +241,7 @@ class ChapterController extends Controller
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->checkOwnablePermission('restrictions-manage', $chapter);
$this->chapterRepo->updateRestrictionsFromRequest($request, $chapter);
$this->chapterRepo->updateEntityPermissionsFromRequest($request, $chapter);
session()->flash('success', 'Chapter Restrictions Updated');
return redirect($chapter->getUrl());
}

View File

@@ -110,4 +110,15 @@ abstract class Controller extends BaseController
return true;
}
/**
* Send back a json error message.
* @param string $messageText
* @param int $statusCode
* @return mixed
*/
protected function jsonError($messageText = "", $statusCode = 500)
{
return response()->json(['message' => $messageText], $statusCode);
}
}

View File

@@ -51,9 +51,9 @@ class ImageController extends Controller
$this->validate($request, [
'term' => 'required|string'
]);
$searchTerm = $request->get('term');
$imgData = $this->imageRepo->searchPaginatedByType($type, $page,24, $searchTerm);
$imgData = $this->imageRepo->searchPaginatedByType($type, $page, 24, $searchTerm);
return response()->json($imgData);
}
@@ -99,7 +99,7 @@ class ImageController extends Controller
{
$this->checkPermission('image-create-all');
$this->validate($request, [
'file' => 'image|mimes:jpeg,gif,png'
'file' => 'is_image'
]);
$imageUpload = $request->file('file');

View File

@@ -69,10 +69,10 @@ class PageController extends Controller
{
$book = $this->bookRepo->getBySlug($bookSlug);
$draft = $this->pageRepo->getById($pageId, true);
$this->checkOwnablePermission('page-create', $draft);
$this->checkOwnablePermission('page-create', $book);
$this->setPageTitle('Edit Page Draft');
return view('pages/create', ['draft' => $draft, 'book' => $book]);
return view('pages/edit', ['page' => $draft, 'book' => $book, 'isDraft' => true]);
}
/**
@@ -92,7 +92,7 @@ class PageController extends Controller
$draftPage = $this->pageRepo->getById($pageId, true);
$chapterId = $draftPage->chapter_id;
$chapterId = intval($draftPage->chapter_id);
$parent = $chapterId !== 0 ? $this->chapterRepo->getById($chapterId) : $book;
$this->checkOwnablePermission('page-create', $parent);
@@ -128,6 +128,8 @@ class PageController extends Controller
return redirect($page->getUrl());
}
$this->checkOwnablePermission('page-view', $page);
$sidebarTree = $this->bookRepo->getChildren($book);
Views::add($page);
$this->setPageTitle($page->getShortName());
@@ -219,8 +221,8 @@ class PageController extends Controller
$updateTime = $draft->updated_at->timestamp;
$utcUpdateTimestamp = $updateTime + Carbon::createFromTimestamp(0)->offset;
return response()->json([
'status' => 'success',
'message' => 'Draft saved at ',
'status' => 'success',
'message' => 'Draft saved at ',
'timestamp' => $utcUpdateTimestamp
]);
}
@@ -410,7 +412,7 @@ class PageController extends Controller
*/
public function showRecentlyCreated()
{
$pages = $this->pageRepo->getRecentlyCreatedPaginated(20);
$pages = $this->pageRepo->getRecentlyCreatedPaginated(20)->setPath(baseUrl('/pages/recently-created'));
return view('pages/detailed-listing', [
'title' => 'Recently Created Pages',
'pages' => $pages
@@ -423,7 +425,7 @@ class PageController extends Controller
*/
public function showRecentlyUpdated()
{
$pages = $this->pageRepo->getRecentlyUpdatedPaginated(20);
$pages = $this->pageRepo->getRecentlyUpdatedPaginated(20)->setPath(baseUrl('/pages/recently-updated'));
return view('pages/detailed-listing', [
'title' => 'Recently Updated Pages',
'pages' => $pages
@@ -449,7 +451,68 @@ class PageController extends Controller
}
/**
* Set the restrictions for this page.
* Show the view to choose a new parent to move a page into.
* @param $bookSlug
* @param $pageSlug
* @return mixed
* @throws NotFoundException
*/
public function showMove($bookSlug, $pageSlug)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->checkOwnablePermission('page-update', $page);
return view('pages/move', [
'book' => $book,
'page' => $page
]);
}
/**
* Does the action of moving the location of a page
* @param $bookSlug
* @param $pageSlug
* @param Request $request
* @return mixed
* @throws NotFoundException
*/
public function move($bookSlug, $pageSlug, Request $request)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->checkOwnablePermission('page-update', $page);
$entitySelection = $request->get('entity_selection', null);
if ($entitySelection === null || $entitySelection === '') {
return redirect($page->getUrl());
}
$stringExploded = explode(':', $entitySelection);
$entityType = $stringExploded[0];
$entityId = intval($stringExploded[1]);
$parent = false;
if ($entityType == 'chapter') {
$parent = $this->chapterRepo->getById($entityId);
} else if ($entityType == 'book') {
$parent = $this->bookRepo->getById($entityId);
}
if ($parent === false || $parent === null) {
session()->flash('The selected Book or Chapter was not found');
return redirect()->back();
}
$this->pageRepo->changePageParent($page, $parent);
Activity::add($page, 'page_move', $page->book->id);
session()->flash('success', sprintf('Page moved to "%s"', $parent->name));
return redirect($page->getUrl());
}
/**
* Set the permissions for this page.
* @param $bookSlug
* @param $pageSlug
* @param Request $request
@@ -460,8 +523,8 @@ class PageController extends Controller
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->checkOwnablePermission('restrictions-manage', $page);
$this->pageRepo->updateRestrictionsFromRequest($request, $page);
session()->flash('success', 'Page Restrictions Updated');
$this->pageRepo->updateEntityPermissionsFromRequest($request, $page);
session()->flash('success', 'Page Permissions Updated');
return redirect($page->getUrl());
}

View File

@@ -2,6 +2,7 @@
use BookStack\Exceptions\PermissionsException;
use BookStack\Repos\PermissionsRepo;
use BookStack\Services\PermissionService;
use Illuminate\Http\Request;
use BookStack\Http\Requests;
@@ -62,11 +63,13 @@ class PermissionController extends Controller
* Show the form for editing a user role.
* @param $id
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws PermissionsException
*/
public function editRole($id)
{
$this->checkPermission('user-roles-manage');
$role = $this->permissionsRepo->getRoleById($id);
if ($role->hidden) throw new PermissionsException('This role cannot be edited');
return view('settings/roles/edit', ['role' => $role]);
}

View File

@@ -2,10 +2,10 @@
namespace BookStack\Http\Controllers;
use BookStack\Services\ViewService;
use Illuminate\Http\Request;
use BookStack\Http\Requests;
use BookStack\Http\Controllers\Controller;
use BookStack\Repos\BookRepo;
use BookStack\Repos\ChapterRepo;
use BookStack\Repos\PageRepo;
@@ -15,18 +15,21 @@ class SearchController extends Controller
protected $pageRepo;
protected $bookRepo;
protected $chapterRepo;
protected $viewService;
/**
* SearchController constructor.
* @param $pageRepo
* @param $bookRepo
* @param $chapterRepo
* @param PageRepo $pageRepo
* @param BookRepo $bookRepo
* @param ChapterRepo $chapterRepo
* @param ViewService $viewService
*/
public function __construct(PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo)
public function __construct(PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, ViewService $viewService)
{
$this->pageRepo = $pageRepo;
$this->bookRepo = $bookRepo;
$this->chapterRepo = $chapterRepo;
$this->viewService = $viewService;
parent::__construct();
}
@@ -48,9 +51,9 @@ class SearchController extends Controller
$chapters = $this->chapterRepo->getBySearch($searchTerm, [], 10, $paginationAppends);
$this->setPageTitle('Search For ' . $searchTerm);
return view('search/all', [
'pages' => $pages,
'books' => $books,
'chapters' => $chapters,
'pages' => $pages,
'books' => $books,
'chapters' => $chapters,
'searchTerm' => $searchTerm
]);
}
@@ -69,8 +72,8 @@ class SearchController extends Controller
$pages = $this->pageRepo->getBySearch($searchTerm, [], 20, $paginationAppends);
$this->setPageTitle('Page Search For ' . $searchTerm);
return view('search/entity-search-list', [
'entities' => $pages,
'title' => 'Page Search Results',
'entities' => $pages,
'title' => 'Page Search Results',
'searchTerm' => $searchTerm
]);
}
@@ -89,8 +92,8 @@ class SearchController extends Controller
$chapters = $this->chapterRepo->getBySearch($searchTerm, [], 20, $paginationAppends);
$this->setPageTitle('Chapter Search For ' . $searchTerm);
return view('search/entity-search-list', [
'entities' => $chapters,
'title' => 'Chapter Search Results',
'entities' => $chapters,
'title' => 'Chapter Search Results',
'searchTerm' => $searchTerm
]);
}
@@ -109,8 +112,8 @@ class SearchController extends Controller
$books = $this->bookRepo->getBySearch($searchTerm, 20, $paginationAppends);
$this->setPageTitle('Book Search For ' . $searchTerm);
return view('search/entity-search-list', [
'entities' => $books,
'title' => 'Book Search Results',
'entities' => $books,
'title' => 'Book Search Results',
'searchTerm' => $searchTerm
]);
}
@@ -134,4 +137,35 @@ class SearchController extends Controller
return view('search/book', ['pages' => $pages, 'chapters' => $chapters, 'searchTerm' => $searchTerm]);
}
/**
* Search for a list of entities and return a partial HTML response of matching entities.
* Returns the most popular entities if no search is provided.
* @param Request $request
* @return mixed
*/
public function searchEntitiesAjax(Request $request)
{
$entities = collect();
$entityTypes = $request->has('types') ? collect(explode(',', $request->get('types'))) : collect(['page', 'chapter', 'book']);
$searchTerm = ($request->has('term') && trim($request->get('term')) !== '') ? $request->get('term') : false;
// Search for entities otherwise show most popular
if ($searchTerm !== false) {
if ($entityTypes->contains('page')) $entities = $entities->merge($this->pageRepo->getBySearch($searchTerm)->items());
if ($entityTypes->contains('chapter')) $entities = $entities->merge($this->chapterRepo->getBySearch($searchTerm)->items());
if ($entityTypes->contains('book')) $entities = $entities->merge($this->bookRepo->getBySearch($searchTerm)->items());
$entities = $entities->sortByDesc('title_relevance');
} else {
$entityNames = $entityTypes->map(function ($type) {
return 'BookStack\\' . ucfirst($type);
})->toArray();
$entities = $this->viewService->getPopular(20, 0, $entityNames);
}
return view('search/entity-ajax-list', ['entities' => $entities]);
}
}

View File

@@ -15,7 +15,14 @@ class SettingController extends Controller
{
$this->checkPermission('settings-manage');
$this->setPageTitle('Settings');
return view('settings/index');
// Get application version
$version = false;
if (function_exists('exec')) {
$version = exec('git describe --always --tags ');
}
return view('settings/index', ['version' => $version]);
}
/**

View File

@@ -0,0 +1,75 @@
<?php namespace BookStack\Http\Controllers;
use BookStack\Repos\TagRepo;
use Illuminate\Http\Request;
use BookStack\Http\Requests;
class TagController extends Controller
{
protected $tagRepo;
/**
* TagController constructor.
* @param $tagRepo
*/
public function __construct(TagRepo $tagRepo)
{
$this->tagRepo = $tagRepo;
}
/**
* Get all the Tags for a particular entity
* @param $entityType
* @param $entityId
*/
public function getForEntity($entityType, $entityId)
{
$tags = $this->tagRepo->getForEntity($entityType, $entityId);
return response()->json($tags);
}
/**
* Update the tags for a particular entity.
* @param $entityType
* @param $entityId
* @param Request $request
* @return mixed
*/
public function updateForEntity($entityType, $entityId, Request $request)
{
$entity = $this->tagRepo->getEntity($entityType, $entityId, 'update');
if ($entity === null) return $this->jsonError("Entity not found", 404);
$inputTags = $request->input('tags');
$tags = $this->tagRepo->saveTagsToEntity($entity, $inputTags);
return response()->json([
'tags' => $tags,
'message' => 'Tags successfully updated'
]);
}
/**
* Get tag name suggestions from a given search term.
* @param Request $request
*/
public function getNameSuggestions(Request $request)
{
$searchTerm = $request->has('search') ? $request->get('search') : false;
$suggestions = $this->tagRepo->getNameSuggestions($searchTerm);
return response()->json($suggestions);
}
/**
* Get tag value suggestions from a given search term.
* @param Request $request
*/
public function getValueSuggestions(Request $request)
{
$searchTerm = $request->has('search') ? $request->get('search') : false;
$tagName = $request->has('name') ? $request->get('name') : false;
$suggestions = $this->tagRepo->getValueSuggestions($searchTerm, $tagName);
return response()->json($suggestions);
}
}

View File

@@ -31,14 +31,21 @@ class UserController extends Controller
/**
* Display a listing of the users.
* @param Request $request
* @return Response
*/
public function index()
public function index(Request $request)
{
$this->checkPermission('users-manage');
$users = $this->userRepo->getAllUsers();
$listDetails = [
'order' => $request->has('order') ? $request->get('order') : 'asc',
'search' => $request->has('search') ? $request->get('search') : '',
'sort' => $request->has('sort') ? $request->get('sort') : 'name',
];
$users = $this->userRepo->getAllUsersPaginatedAndSorted(20, $listDetails);
$this->setPageTitle('Users');
return view('users/index', ['users' => $users]);
$users->appends($listDetails);
return view('users/index', ['users' => $users, 'listDetails' => $listDetails]);
}
/**
@@ -49,7 +56,8 @@ class UserController extends Controller
{
$this->checkPermission('users-manage');
$authMethod = config('auth.method');
return view('users/create', ['authMethod' => $authMethod]);
$roles = $this->userRepo->getAssignableRoles();
return view('users/create', ['authMethod' => $authMethod, 'roles' => $roles]);
}
/**
@@ -117,7 +125,8 @@ class UserController extends Controller
$user = $this->user->findOrFail($id);
$activeSocialDrivers = $socialAuthService->getActiveDrivers();
$this->setPageTitle('User Profile');
return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers, 'authMethod' => $authMethod]);
$roles = $this->userRepo->getAssignableRoles();
return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers, 'authMethod' => $authMethod, 'roles' => $roles]);
}
/**
@@ -198,11 +207,14 @@ class UserController extends Controller
});
$user = $this->userRepo->getById($id);
if ($this->userRepo->isOnlyAdmin($user)) {
session()->flash('error', 'You cannot delete the only admin');
return redirect($user->getEditUrl());
}
$this->userRepo->destroy($user);
session()->flash('success', 'User successfully removed');
return redirect('/settings/users');
}

View File

@@ -33,14 +33,14 @@ class Authenticate
public function handle($request, Closure $next)
{
if ($this->auth->check() && setting('registration-confirmation') && !$this->auth->user()->email_confirmed) {
return redirect()->guest('/register/confirm/awaiting');
return redirect()->guest(baseUrl('/register/confirm/awaiting'));
}
if ($this->auth->guest() && !setting('app-public')) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('/login');
return redirect()->guest(baseUrl('/login'));
}
}

View File

@@ -28,12 +28,14 @@ Route::group(['middleware' => 'auth'], function () {
// Pages
Route::get('/{bookSlug}/page/create', 'PageController@create');
Route::get('/{bookSlug}/draft/{pageId}', 'PageController@editDraft');
Route::post('/{bookSlug}/page/{pageId}', 'PageController@store');
Route::post('/{bookSlug}/draft/{pageId}', 'PageController@store');
Route::get('/{bookSlug}/page/{pageSlug}', 'PageController@show');
Route::get('/{bookSlug}/page/{pageSlug}/export/pdf', 'PageController@exportPdf');
Route::get('/{bookSlug}/page/{pageSlug}/export/html', 'PageController@exportHtml');
Route::get('/{bookSlug}/page/{pageSlug}/export/plaintext', 'PageController@exportPlainText');
Route::get('/{bookSlug}/page/{pageSlug}/edit', 'PageController@edit');
Route::get('/{bookSlug}/page/{pageSlug}/move', 'PageController@showMove');
Route::put('/{bookSlug}/page/{pageSlug}/move', 'PageController@move');
Route::get('/{bookSlug}/page/{pageSlug}/delete', 'PageController@showDelete');
Route::get('/{bookSlug}/draft/{pageId}/delete', 'PageController@showDeleteDraft');
Route::get('/{bookSlug}/page/{pageSlug}/permissions', 'PageController@showRestrict');
@@ -53,6 +55,8 @@ Route::group(['middleware' => 'auth'], function () {
Route::post('/{bookSlug}/chapter/create', 'ChapterController@store');
Route::get('/{bookSlug}/chapter/{chapterSlug}', 'ChapterController@show');
Route::put('/{bookSlug}/chapter/{chapterSlug}', 'ChapterController@update');
Route::get('/{bookSlug}/chapter/{chapterSlug}/move', 'ChapterController@showMove');
Route::put('/{bookSlug}/chapter/{chapterSlug}/move', 'ChapterController@move');
Route::get('/{bookSlug}/chapter/{chapterSlug}/edit', 'ChapterController@edit');
Route::get('/{bookSlug}/chapter/{chapterSlug}/permissions', 'ChapterController@showRestrict');
Route::put('/{bookSlug}/chapter/{chapterSlug}/permissions', 'ChapterController@restrict');
@@ -80,11 +84,21 @@ Route::group(['middleware' => 'auth'], function () {
Route::delete('/{imageId}', 'ImageController@destroy');
});
// Ajax routes
// AJAX routes
Route::put('/ajax/page/{id}/save-draft', 'PageController@saveDraft');
Route::get('/ajax/page/{id}', 'PageController@getPageAjax');
Route::delete('/ajax/page/{id}', 'PageController@ajaxDestroy');
// Tag routes (AJAX)
Route::group(['prefix' => 'ajax/tags'], function() {
Route::get('/get/{entityType}/{entityId}', 'TagController@getForEntity');
Route::get('/suggest/names', 'TagController@getNameSuggestions');
Route::get('/suggest/values', 'TagController@getValueSuggestions');
Route::post('/update/{entityType}/{entityId}', 'TagController@updateForEntity');
});
Route::get('/ajax/search/entities', 'SearchController@searchEntitiesAjax');
// Links
Route::get('/link/{id}', 'PageController@redirectFromLink');

24
app/JointPermission.php Normal file
View File

@@ -0,0 +1,24 @@
<?php namespace BookStack;
class JointPermission extends Model
{
public $timestamps = false;
/**
* Get the role that this points to.
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function role()
{
return $this->belongsTo(Role::class);
}
/**
* Get the entity this points to.
* @return \Illuminate\Database\Eloquent\Relations\MorphOne
*/
public function entity()
{
return $this->morphOne(Entity::class, 'entity');
}
}

19
app/Model.php Normal file
View File

@@ -0,0 +1,19 @@
<?php namespace BookStack;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class Model extends EloquentModel
{
/**
* Provides public access to get the raw attribute value from the model.
* Used in areas where no mutations are required but performance is critical.
* @param $key
* @return mixed
*/
public function getRawAttribute($key)
{
return parent::getAttributeFromArray($key);
}
}

View File

@@ -1,6 +1,5 @@
<?php namespace BookStack;
use Illuminate\Database\Eloquent\Model;
abstract class Ownable extends Model
{
@@ -10,7 +9,7 @@ abstract class Ownable extends Model
*/
public function createdBy()
{
return $this->belongsTo('BookStack\User', 'created_by');
return $this->belongsTo(User::class, 'created_by');
}
/**
@@ -19,7 +18,7 @@ abstract class Ownable extends Model
*/
public function updatedBy()
{
return $this->belongsTo('BookStack\User', 'updated_by');
return $this->belongsTo(User::class, 'updated_by');
}
/**

View File

@@ -1,8 +1,5 @@
<?php
<?php namespace BookStack;
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
class Page extends Entity
{
@@ -10,6 +7,10 @@ class Page extends Entity
protected $simpleAttributes = ['name', 'id', 'slug'];
/**
* Converts this page into a simplified array.
* @return mixed
*/
public function toSimpleArray()
{
$array = array_intersect_key($this->toArray(), array_flip($this->simpleAttributes));
@@ -17,34 +18,65 @@ class Page extends Entity
return $array;
}
/**
* Get the book this page sits in.
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function book()
{
return $this->belongsTo('BookStack\Book');
return $this->belongsTo(Book::class);
}
/**
* Get the chapter that this page is in, If applicable.
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function chapter()
{
return $this->belongsTo('BookStack\Chapter');
return $this->belongsTo(Chapter::class);
}
/**
* Check if this page has a chapter.
* @return bool
*/
public function hasChapter()
{
return $this->chapter()->count() > 0;
}
/**
* Get the associated page revisions, ordered by created date.
* @return mixed
*/
public function revisions()
{
return $this->hasMany('BookStack\PageRevision')->where('type', '=', 'version')->orderBy('created_at', 'desc');
return $this->hasMany(PageRevision::class)->where('type', '=', 'version')->orderBy('created_at', 'desc');
}
public function getUrl()
/**
* Get the url for this page.
* @param string|bool $path
* @return string
*/
public function getUrl($path = false)
{
$bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
$midText = $this->draft ? '/draft/' : '/page/';
$idComponent = $this->draft ? $this->id : $this->slug;
return '/books/' . $bookSlug . $midText . $idComponent;
if ($path !== false) {
return baseUrl('/books/' . $bookSlug . $midText . $idComponent . '/' . trim($path, '/'));
}
return baseUrl('/books/' . $bookSlug . $midText . $idComponent);
}
/**
* Get an excerpt of this page's content to the specified length.
* @param int $length
* @return mixed
*/
public function getExcerpt($length = 100)
{
$text = strlen($this->text) > $length ? substr($this->text, 0, $length-3) . '...' : $this->text;

View File

@@ -1,10 +1,9 @@
<?php namespace BookStack;
use Illuminate\Database\Eloquent\Model;
class PageRevision extends Model
{
protected $fillable = ['name', 'html', 'text', 'markdown'];
protected $fillable = ['name', 'html', 'text', 'markdown', 'summary'];
/**
* Get the user that created the page revision
@@ -12,7 +11,7 @@ class PageRevision extends Model
*/
public function createdBy()
{
return $this->belongsTo('BookStack\User', 'created_by');
return $this->belongsTo(User::class, 'created_by');
}
/**
@@ -21,7 +20,7 @@ class PageRevision extends Model
*/
public function page()
{
return $this->belongsTo('BookStack\Page');
return $this->belongsTo(Page::class);
}
/**

View File

@@ -1,10 +1,6 @@
<?php
<?php namespace BookStack\Providers;
namespace BookStack\Providers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\ServiceProvider;
use BookStack\User;
class AppServiceProvider extends ServiceProvider
{
@@ -15,7 +11,12 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot()
{
//
// Custom validation methods
\Validator::extend('is_image', function($attribute, $value, $parameters, $validator) {
$imageMimes = ['image/png', 'image/bmp', 'image/gif', 'image/jpeg', 'image/jpg', 'image/tiff', 'image/webp'];
return in_array($value->getMimeType(), $imageMimes);
});
}
/**

View File

@@ -3,6 +3,7 @@
namespace BookStack\Providers;
use Auth;
use BookStack\Services\LdapService;
use Illuminate\Support\ServiceProvider;
class AuthServiceProvider extends ServiceProvider
@@ -25,7 +26,7 @@ class AuthServiceProvider extends ServiceProvider
public function register()
{
Auth::provider('ldap', function($app, array $config) {
return new LdapUserProvider($config['model'], $app['BookStack\Services\LdapService']);
return new LdapUserProvider($config['model'], $app[LdapService::class]);
});
}
}

View File

@@ -2,11 +2,18 @@
namespace BookStack\Providers;
use BookStack\Activity;
use BookStack\Services\ImageService;
use BookStack\Services\PermissionService;
use BookStack\Services\ViewService;
use BookStack\Setting;
use BookStack\View;
use Illuminate\Contracts\Cache\Repository;
use Illuminate\Contracts\Filesystem\Factory;
use Illuminate\Support\ServiceProvider;
use BookStack\Services\ActivityService;
use BookStack\Services\SettingService;
use Intervention\Image\ImageManager;
class CustomFacadeProvider extends ServiceProvider
{
@@ -29,30 +36,30 @@ class CustomFacadeProvider extends ServiceProvider
{
$this->app->bind('activity', function() {
return new ActivityService(
$this->app->make('BookStack\Activity'),
$this->app->make('BookStack\Services\RestrictionService')
$this->app->make(Activity::class),
$this->app->make(PermissionService::class)
);
});
$this->app->bind('views', function() {
return new ViewService(
$this->app->make('BookStack\View'),
$this->app->make('BookStack\Services\RestrictionService')
$this->app->make(View::class),
$this->app->make(PermissionService::class)
);
});
$this->app->bind('setting', function() {
return new SettingService(
$this->app->make('BookStack\Setting'),
$this->app->make('Illuminate\Contracts\Cache\Repository')
$this->app->make(Setting::class),
$this->app->make(Repository::class)
);
});
$this->app->bind('images', function() {
return new ImageService(
$this->app->make('Intervention\Image\ImageManager'),
$this->app->make('Illuminate\Contracts\Filesystem\Factory'),
$this->app->make('Illuminate\Contracts\Cache\Repository')
$this->app->make(ImageManager::class),
$this->app->make(Factory::class),
$this->app->make(Repository::class)
);
});
}

View File

@@ -0,0 +1,30 @@
<?php namespace BookStack\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;
class PaginationServiceProvider extends ServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
Paginator::currentPathResolver(function () {
return baseUrl($this->app['request']->path());
});
Paginator::currentPageResolver(function ($pageName = 'page') {
$page = $this->app['request']->input($pageName);
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return 1;
});
}
}

View File

@@ -1,6 +1,8 @@
<?php namespace BookStack\Repos;
use Alpha\B;
use BookStack\Exceptions\NotFoundException;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Str;
use BookStack\Book;
use Views;
@@ -29,7 +31,7 @@ class BookRepo extends EntityRepo
*/
private function bookQuery()
{
return $this->restrictionService->enforceBookRestrictions($this->book, 'view');
return $this->permissionService->enforceBookRestrictions($this->book, 'view');
}
/**
@@ -123,21 +125,43 @@ class BookRepo extends EntityRepo
/**
* Get a new book instance from request input.
* @param $input
* @param array $input
* @return Book
*/
public function newFromInput($input)
public function createFromInput($input)
{
return $this->book->newInstance($input);
$book = $this->book->newInstance($input);
$book->slug = $this->findSuitableSlug($book->name);
$book->created_by = auth()->user()->id;
$book->updated_by = auth()->user()->id;
$book->save();
$this->permissionService->buildJointPermissionsForEntity($book);
return $book;
}
/**
* Destroy a book identified by the given slug.
* @param $bookSlug
* Update the given book from user input.
* @param Book $book
* @param $input
* @return Book
*/
public function destroyBySlug($bookSlug)
public function updateFromInput(Book $book, $input)
{
$book->fill($input);
$book->slug = $this->findSuitableSlug($book->name, $book->id);
$book->updated_by = auth()->user()->id;
$book->save();
$this->permissionService->buildJointPermissionsForEntity($book);
return $book;
}
/**
* Destroy the given book.
* @param Book $book
* @throws \Exception
*/
public function destroy(Book $book)
{
$book = $this->getBySlug($bookSlug);
foreach ($book->pages as $page) {
$this->pageRepo->destroy($page);
}
@@ -145,7 +169,8 @@ class BookRepo extends EntityRepo
$this->chapterRepo->destroy($chapter);
}
$book->views()->delete();
$book->restrictions()->delete();
$book->permissions()->delete();
$this->permissionService->deleteJointPermissionsForEntity($book);
$book->delete();
}
@@ -183,12 +208,10 @@ class BookRepo extends EntityRepo
*/
public function findSuitableSlug($name, $currentId = false)
{
$originalSlug = Str::slug($name);
$slug = $originalSlug;
$count = 2;
$slug = Str::slug($name);
if ($slug === "") $slug = substr(md5(rand(1, 500)), 0, 5);
while ($this->doesSlugExist($slug, $currentId)) {
$slug = $originalSlug . '-' . $count;
$count++;
$slug .= '-' . substr(md5(rand(1, 500)), 0, 3);
}
return $slug;
}
@@ -196,22 +219,32 @@ class BookRepo extends EntityRepo
/**
* Get all child objects of a book.
* Returns a sorted collection of Pages and Chapters.
* Loads the bookslug onto child elements to prevent access database access for getting the slug.
* Loads the book slug onto child elements to prevent access database access for getting the slug.
* @param Book $book
* @param bool $filterDrafts
* @return mixed
*/
public function getChildren(Book $book)
public function getChildren(Book $book, $filterDrafts = false)
{
$pageQuery = $book->pages()->where('chapter_id', '=', 0);
$pageQuery = $this->restrictionService->enforcePageRestrictions($pageQuery, 'view');
$pageQuery = $this->permissionService->enforcePageRestrictions($pageQuery, 'view');
if ($filterDrafts) {
$pageQuery = $pageQuery->where('draft', '=', false);
}
$pages = $pageQuery->get();
$chapterQuery = $book->chapters()->with(['pages' => function($query) {
$this->restrictionService->enforcePageRestrictions($query, 'view');
$chapterQuery = $book->chapters()->with(['pages' => function ($query) use ($filterDrafts) {
$this->permissionService->enforcePageRestrictions($query, 'view');
if ($filterDrafts) $query->where('draft', '=', false);
}]);
$chapterQuery = $this->restrictionService->enforceChapterRestrictions($chapterQuery, 'view');
$chapterQuery = $this->permissionService->enforceChapterRestrictions($chapterQuery, 'view');
$chapters = $chapterQuery->get();
$children = $pages->merge($chapters);
$children = $pages->values();
foreach ($chapters as $chapter) {
$children->push($chapter);
}
$bookSlug = $book->slug;
$children->each(function ($child) use ($bookSlug) {
@@ -220,7 +253,7 @@ class BookRepo extends EntityRepo
$child->pages->each(function ($page) use ($bookSlug) {
$page->setAttribute('bookSlug', $bookSlug);
});
$child->pages = $child->pages->sortBy(function($child, $key) {
$child->pages = $child->pages->sortBy(function ($child, $key) {
$score = $child->priority;
if ($child->draft) $score -= 100;
return $score;
@@ -229,7 +262,7 @@ class BookRepo extends EntityRepo
});
// Sort items with drafts first then by priority.
return $children->sortBy(function($child, $key) {
return $children->sortBy(function ($child, $key) {
$score = $child->priority;
if ($child->isA('page') && $child->draft) $score -= 100;
return $score;
@@ -246,8 +279,9 @@ class BookRepo extends EntityRepo
public function getBySearch($term, $count = 20, $paginationAppends = [])
{
$terms = $this->prepareSearchTerms($term);
$books = $this->restrictionService->enforceBookRestrictions($this->book->fullTextSearchQuery(['name', 'description'], $terms))
->paginate($count)->appends($paginationAppends);
$bookQuery = $this->permissionService->enforceBookRestrictions($this->book->fullTextSearchQuery(['name', 'description'], $terms));
$bookQuery = $this->addAdvancedSearchQueries($bookQuery, $term);
$books = $bookQuery->paginate($count)->appends($paginationAppends);
$words = join('|', explode(' ', preg_quote(trim($term), '/')));
foreach ($books as $book) {
//highlight

View File

@@ -2,19 +2,32 @@
use Activity;
use BookStack\Book;
use BookStack\Exceptions\NotFoundException;
use Illuminate\Support\Str;
use BookStack\Chapter;
class ChapterRepo extends EntityRepo
{
protected $pageRepo;
/**
* Base query for getting chapters, Takes restrictions into account.
* ChapterRepo constructor.
* @param $pageRepo
*/
public function __construct(PageRepo $pageRepo)
{
$this->pageRepo = $pageRepo;
parent::__construct();
}
/**
* Base query for getting chapters, Takes permissions into account.
* @return mixed
*/
private function chapterQuery()
{
return $this->restrictionService->enforceChapterRestrictions($this->chapter, 'view');
return $this->permissionService->enforceChapterRestrictions($this->chapter, 'view');
}
/**
@@ -66,9 +79,9 @@ class ChapterRepo extends EntityRepo
*/
public function getChildren(Chapter $chapter)
{
$pages = $this->restrictionService->enforcePageRestrictions($chapter->pages())->get();
$pages = $this->permissionService->enforcePageRestrictions($chapter->pages())->get();
// Sort items with drafts first then by priority.
return $pages->sortBy(function($child, $key) {
return $pages->sortBy(function ($child, $key) {
$score = $child->priority;
if ($child->draft) $score -= 100;
return $score;
@@ -78,11 +91,18 @@ class ChapterRepo extends EntityRepo
/**
* Create a new chapter from request input.
* @param $input
* @return $this
* @param Book $book
* @return Chapter
*/
public function newFromInput($input)
public function createFromInput($input, Book $book)
{
return $this->chapter->fill($input);
$chapter = $this->chapter->newInstance($input);
$chapter->slug = $this->findSuitableSlug($chapter->name, $book->id);
$chapter->created_by = auth()->user()->id;
$chapter->updated_by = auth()->user()->id;
$chapter = $book->chapters()->save($chapter);
$this->permissionService->buildJointPermissionsForEntity($chapter);
return $chapter;
}
/**
@@ -99,7 +119,8 @@ class ChapterRepo extends EntityRepo
}
Activity::removeEntity($chapter);
$chapter->views()->delete();
$chapter->restrictions()->delete();
$chapter->permissions()->delete();
$this->permissionService->deleteJointPermissionsForEntity($chapter);
$chapter->delete();
}
@@ -130,6 +151,7 @@ class ChapterRepo extends EntityRepo
public function findSuitableSlug($name, $bookId, $currentId = false)
{
$slug = Str::slug($name);
if ($slug === "") $slug = substr(md5(rand(1, 500)), 0, 5);
while ($this->doesSlugExist($slug, $bookId, $currentId)) {
$slug .= '-' . substr(md5(rand(1, 500)), 0, 3);
}
@@ -159,8 +181,9 @@ class ChapterRepo extends EntityRepo
public function getBySearch($term, $whereTerms = [], $count = 20, $paginationAppends = [])
{
$terms = $this->prepareSearchTerms($term);
$chapters = $this->restrictionService->enforceChapterRestrictions($this->chapter->fullTextSearchQuery(['name', 'description'], $terms, $whereTerms))
->paginate($count)->appends($paginationAppends);
$chapterQuery = $this->permissionService->enforceChapterRestrictions($this->chapter->fullTextSearchQuery(['name', 'description'], $terms, $whereTerms));
$chapterQuery = $this->addAdvancedSearchQueries($chapterQuery, $term);
$chapters = $chapterQuery->paginate($count)->appends($paginationAppends);
$words = join('|', explode(' ', preg_quote(trim($term), '/')));
foreach ($chapters as $chapter) {
//highlight
@@ -172,19 +195,32 @@ class ChapterRepo extends EntityRepo
/**
* Changes the book relation of this chapter.
* @param $bookId
* @param $bookId
* @param Chapter $chapter
* @param bool $rebuildPermissions
* @return Chapter
*/
public function changeBook($bookId, Chapter $chapter)
public function changeBook($bookId, Chapter $chapter, $rebuildPermissions = false)
{
$chapter->book_id = $bookId;
// Update related activity
foreach ($chapter->activity as $activity) {
$activity->book_id = $bookId;
$activity->save();
}
$chapter->slug = $this->findSuitableSlug($chapter->name, $bookId, $chapter->id);
$chapter->save();
// Update all child pages
foreach ($chapter->pages as $page) {
$this->pageRepo->changeBook($bookId, $page);
}
// Update permissions if applicable
if ($rebuildPermissions) {
$chapter->load('book');
$this->permissionService->buildJointPermissionsForEntity($chapter->book);
}
return $chapter;
}

View File

@@ -4,8 +4,10 @@ use BookStack\Book;
use BookStack\Chapter;
use BookStack\Entity;
use BookStack\Page;
use BookStack\Services\RestrictionService;
use BookStack\Services\PermissionService;
use BookStack\User;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
class EntityRepo
{
@@ -26,9 +28,15 @@ class EntityRepo
public $page;
/**
* @var RestrictionService
* @var PermissionService
*/
protected $restrictionService;
protected $permissionService;
/**
* Acceptable operators to be used in a query
* @var array
*/
protected $queryOperators = ['<=', '>=', '=', '<', '>', 'like', '!='];
/**
* EntityService constructor.
@@ -38,7 +46,7 @@ class EntityRepo
$this->book = app(Book::class);
$this->chapter = app(Chapter::class);
$this->page = app(Page::class);
$this->restrictionService = app(RestrictionService::class);
$this->permissionService = app(PermissionService::class);
}
/**
@@ -50,7 +58,7 @@ class EntityRepo
*/
public function getRecentlyCreatedBooks($count = 20, $page = 0, $additionalQuery = false)
{
$query = $this->restrictionService->enforceBookRestrictions($this->book)
$query = $this->permissionService->enforceBookRestrictions($this->book)
->orderBy('created_at', 'desc');
if ($additionalQuery !== false && is_callable($additionalQuery)) {
$additionalQuery($query);
@@ -66,7 +74,7 @@ class EntityRepo
*/
public function getRecentlyUpdatedBooks($count = 20, $page = 0)
{
return $this->restrictionService->enforceBookRestrictions($this->book)
return $this->permissionService->enforceBookRestrictions($this->book)
->orderBy('updated_at', 'desc')->skip($page * $count)->take($count)->get();
}
@@ -79,7 +87,7 @@ class EntityRepo
*/
public function getRecentlyCreatedPages($count = 20, $page = 0, $additionalQuery = false)
{
$query = $this->restrictionService->enforcePageRestrictions($this->page)
$query = $this->permissionService->enforcePageRestrictions($this->page)
->orderBy('created_at', 'desc')->where('draft', '=', false);
if ($additionalQuery !== false && is_callable($additionalQuery)) {
$additionalQuery($query);
@@ -96,7 +104,7 @@ class EntityRepo
*/
public function getRecentlyCreatedChapters($count = 20, $page = 0, $additionalQuery = false)
{
$query = $this->restrictionService->enforceChapterRestrictions($this->chapter)
$query = $this->permissionService->enforceChapterRestrictions($this->chapter)
->orderBy('created_at', 'desc');
if ($additionalQuery !== false && is_callable($additionalQuery)) {
$additionalQuery($query);
@@ -112,7 +120,7 @@ class EntityRepo
*/
public function getRecentlyUpdatedPages($count = 20, $page = 0)
{
return $this->restrictionService->enforcePageRestrictions($this->page)
return $this->permissionService->enforcePageRestrictions($this->page)
->where('draft', '=', false)
->orderBy('updated_at', 'desc')->with('book')->skip($page * $count)->take($count)->get();
}
@@ -136,14 +144,14 @@ class EntityRepo
* @param $request
* @param Entity $entity
*/
public function updateRestrictionsFromRequest($request, Entity $entity)
public function updateEntityPermissionsFromRequest($request, Entity $entity)
{
$entity->restricted = $request->has('restricted') && $request->get('restricted') === 'true';
$entity->restrictions()->delete();
$entity->permissions()->delete();
if ($request->has('restrictions')) {
foreach ($request->get('restrictions') as $roleId => $restrictions) {
foreach ($restrictions as $action => $value) {
$entity->restrictions()->create([
$entity->permissions()->create([
'role_id' => $roleId,
'action' => strtolower($action)
]);
@@ -151,6 +159,7 @@ class EntityRepo
}
}
$entity->save();
$this->permissionService->buildJointPermissionsForEntity($entity);
}
/**
@@ -160,18 +169,117 @@ class EntityRepo
* @param $termString
* @return array
*/
protected function prepareSearchTerms($termString)
public function prepareSearchTerms($termString)
{
preg_match_all('/"(.*?)"/', $termString, $matches);
$termString = $this->cleanSearchTermString($termString);
preg_match_all('/(".*?")/', $termString, $matches);
$terms = [];
if (count($matches[1]) > 0) {
$terms = $matches[1];
foreach ($matches[1] as $match) {
$terms[] = $match;
}
$termString = trim(preg_replace('/"(.*?)"/', '', $termString));
} else {
$terms = [];
}
if (!empty($termString)) $terms = array_merge($terms, explode(' ', $termString));
return $terms;
}
/**
* Removes any special search notation that should not
* be used in a full-text search.
* @param $termString
* @return mixed
*/
protected function cleanSearchTermString($termString)
{
// Strip tag searches
$termString = preg_replace('/\[.*?\]/', '', $termString);
// Reduced multiple spacing into single spacing
$termString = preg_replace("/\s{2,}/", " ", $termString);
return $termString;
}
/**
* Get the available query operators as a regex escaped list.
* @return mixed
*/
protected function getRegexEscapedOperators()
{
$escapedOperators = [];
foreach ($this->queryOperators as $operator) {
$escapedOperators[] = preg_quote($operator);
}
return join('|', $escapedOperators);
}
/**
* Parses advanced search notations and adds them to the db query.
* @param $query
* @param $termString
* @return mixed
*/
protected function addAdvancedSearchQueries($query, $termString)
{
$escapedOperators = $this->getRegexEscapedOperators();
// Look for tag searches
preg_match_all("/\[(.*?)((${escapedOperators})(.*?))?\]/", $termString, $tags);
if (count($tags[0]) > 0) {
$this->applyTagSearches($query, $tags);
}
return $query;
}
/**
* Apply extracted tag search terms onto a entity query.
* @param $query
* @param $tags
* @return mixed
*/
protected function applyTagSearches($query, $tags) {
$query->where(function($query) use ($tags) {
foreach ($tags[1] as $index => $tagName) {
$query->whereHas('tags', function($query) use ($tags, $index, $tagName) {
$tagOperator = $tags[3][$index];
$tagValue = $tags[4][$index];
if (!empty($tagOperator) && !empty($tagValue) && in_array($tagOperator, $this->queryOperators)) {
if (is_numeric($tagValue) && $tagOperator !== 'like') {
// We have to do a raw sql query for this since otherwise PDO will quote the value and MySQL will
// search the value as a string which prevents being able to do number-based operations
// on the tag values. We ensure it has a numeric value and then cast it just to be sure.
$tagValue = (float) trim($query->getConnection()->getPdo()->quote($tagValue), "'");
$query->where('name', '=', $tagName)->whereRaw("value ${tagOperator} ${tagValue}");
} else {
$query->where('name', '=', $tagName)->where('value', $tagOperator, $tagValue);
}
} else {
$query->where('name', '=', $tagName);
}
});
}
});
return $query;
}
/**
* Alias method to update the book jointPermissions in the PermissionService.
* @param Collection $collection collection on entities
*/
public function buildJointPermissions(Collection $collection)
{
$this->permissionService->buildJointPermissionsForEntities($collection);
}
}
}

View File

@@ -4,7 +4,7 @@
use BookStack\Image;
use BookStack\Page;
use BookStack\Services\ImageService;
use BookStack\Services\RestrictionService;
use BookStack\Services\PermissionService;
use Setting;
use Symfony\Component\HttpFoundation\File\UploadedFile;
@@ -13,21 +13,21 @@ class ImageRepo
protected $image;
protected $imageService;
protected $restictionService;
protected $restrictionService;
protected $page;
/**
* ImageRepo constructor.
* @param Image $image
* @param ImageService $imageService
* @param RestrictionService $restrictionService
* @param PermissionService $permissionService
* @param Page $page
*/
public function __construct(Image $image, ImageService $imageService, RestrictionService $restrictionService, Page $page)
public function __construct(Image $image, ImageService $imageService, PermissionService $permissionService, Page $page)
{
$this->image = $image;
$this->imageService = $imageService;
$this->restictionService = $restrictionService;
$this->restrictionService = $permissionService;
$this->page = $page;
}
@@ -52,7 +52,7 @@ class ImageRepo
*/
private function returnPaginated($query, $page = 0, $pageSize = 24)
{
$images = $this->restictionService->filterRelatedPages($query, 'images', 'uploaded_to');
$images = $this->restrictionService->filterRelatedPages($query, 'images', 'uploaded_to');
$images = $images->orderBy('created_at', 'desc')->skip($pageSize * $page)->take($pageSize + 1)->get();
$hasMore = count($images) > $pageSize;

View File

@@ -3,6 +3,7 @@
use Activity;
use BookStack\Book;
use BookStack\Chapter;
use BookStack\Entity;
use BookStack\Exceptions\NotFoundException;
use Carbon\Carbon;
use DOMDocument;
@@ -14,14 +15,17 @@ class PageRepo extends EntityRepo
{
protected $pageRevision;
protected $tagRepo;
/**
* PageRepo constructor.
* @param PageRevision $pageRevision
* @param TagRepo $tagRepo
*/
public function __construct(PageRevision $pageRevision)
public function __construct(PageRevision $pageRevision, TagRepo $tagRepo)
{
$this->pageRevision = $pageRevision;
$this->tagRepo = $tagRepo;
parent::__construct();
}
@@ -32,7 +36,7 @@ class PageRepo extends EntityRepo
*/
private function pageQuery($allowDrafts = false)
{
$query = $this->restrictionService->enforcePageRestrictions($this->page, 'view');
$query = $this->permissionService->enforcePageRestrictions($this->page, 'view');
if (!$allowDrafts) {
$query = $query->where('draft', '=', false);
}
@@ -76,7 +80,7 @@ class PageRepo extends EntityRepo
{
$revision = $this->pageRevision->where('slug', '=', $pageSlug)
->whereHas('page', function ($query) {
$this->restrictionService->enforcePageRestrictions($query);
$this->permissionService->enforcePageRestrictions($query);
})
->where('type', '=', 'version')
->where('book_slug', '=', $bookSlug)->orderBy('created_at', 'desc')
@@ -142,22 +146,29 @@ class PageRepo extends EntityRepo
{
$draftPage->fill($input);
// Save page tags if present
if (isset($input['tags'])) {
$this->tagRepo->saveTagsToEntity($draftPage, $input['tags']);
}
$draftPage->slug = $this->findSuitableSlug($draftPage->name, $draftPage->book->id);
$draftPage->html = $this->formatHtml($input['html']);
$draftPage->text = strip_tags($draftPage->html);
$draftPage->draft = false;
$draftPage->save();
$this->saveRevision($draftPage, 'Initial Publish');
return $draftPage;
}
/**
* Get a new draft page instance.
* @param Book $book
* @param Chapter|null $chapter
* @param Chapter|bool $chapter
* @return static
*/
public function getDraftPage(Book $book, $chapter)
public function getDraftPage(Book $book, $chapter = false)
{
$page = $this->page->newInstance();
$page->name = 'New Page';
@@ -168,6 +179,7 @@ class PageRepo extends EntityRepo
if ($chapter) $page->chapter_id = $chapter->id;
$book->pages()->save($page);
$this->permissionService->buildJointPermissionsForEntity($page);
return $page;
}
@@ -241,8 +253,9 @@ class PageRepo extends EntityRepo
public function getBySearch($term, $whereTerms = [], $count = 20, $paginationAppends = [])
{
$terms = $this->prepareSearchTerms($term);
$pages = $this->restrictionService->enforcePageRestrictions($this->page->fullTextSearchQuery(['name', 'text'], $terms, $whereTerms))
->paginate($count)->appends($paginationAppends);
$pageQuery = $this->permissionService->enforcePageRestrictions($this->page->fullTextSearchQuery(['name', 'text'], $terms, $whereTerms));
$pageQuery = $this->addAdvancedSearchQueries($pageQuery, $term);
$pages = $pageQuery->paginate($count)->appends($paginationAppends);
// Add highlights to page text.
$words = join('|', explode(' ', preg_quote(trim($term), '/')));
@@ -297,16 +310,20 @@ class PageRepo extends EntityRepo
*/
public function updatePage(Page $page, $book_id, $input)
{
// Save a revision before updating
if ($page->html !== $input['html'] || $page->name !== $input['name']) {
$this->saveRevision($page);
}
// Hold the old details to compare later
$oldHtml = $page->html;
$oldName = $page->name;
// Prevent slug being updated if no name change
if ($page->name !== $input['name']) {
$page->slug = $this->findSuitableSlug($input['name'], $book_id, $page->id);
}
// Save page tags if present
if (isset($input['tags'])) {
$this->tagRepo->saveTagsToEntity($page, $input['tags']);
}
// Update with new details
$userId = auth()->user()->id;
$page->fill($input);
@@ -319,6 +336,11 @@ class PageRepo extends EntityRepo
// Remove all update drafts for this user & page.
$this->userUpdateDraftsQuery($page, $userId)->delete();
// Save a revision after updating
if ($oldHtml !== $input['html'] || $oldName !== $input['name'] || $input['summary'] !== null) {
$this->saveRevision($page, $input['summary']);
}
return $page;
}
@@ -344,9 +366,10 @@ class PageRepo extends EntityRepo
/**
* Saves a page revision into the system.
* @param Page $page
* @param null|string $summary
* @return $this
*/
public function saveRevision(Page $page)
public function saveRevision(Page $page, $summary = null)
{
$revision = $this->pageRevision->fill($page->toArray());
if (setting('app-editor') !== 'markdown') $revision->markdown = '';
@@ -356,6 +379,7 @@ class PageRepo extends EntityRepo
$revision->created_by = auth()->user()->id;
$revision->created_at = $page->updated_at;
$revision->type = 'version';
$revision->summary = $summary;
$revision->save();
// Clear old revisions
if ($this->pageRevision->where('page_id', '=', $page->id)->count() > 50) {
@@ -389,7 +413,7 @@ class PageRepo extends EntityRepo
$draft->fill($data);
if (setting('app-editor') !== 'markdown') $draft->markdown = '';
$draft->save();
return $draft;
}
@@ -557,16 +581,33 @@ class PageRepo extends EntityRepo
return $page;
}
/**
* Change the page's parent to the given entity.
* @param Page $page
* @param Entity $parent
*/
public function changePageParent(Page $page, Entity $parent)
{
$book = $parent->isA('book') ? $parent : $parent->book;
$page->chapter_id = $parent->isA('chapter') ? $parent->id : 0;
$page->save();
$page = $this->changeBook($book->id, $page);
$page->load('book');
$this->permissionService->buildJointPermissionsForEntity($book);
}
/**
* Gets a suitable slug for the resource
* @param $name
* @param $bookId
* @param string $name
* @param int $bookId
* @param bool|false $currentId
* @return string
*/
public function findSuitableSlug($name, $bookId, $currentId = false)
{
$slug = Str::slug($name);
if ($slug === "") $slug = substr(md5(rand(1, 500)), 0, 5);
while ($this->doesSlugExist($slug, $bookId, $currentId)) {
$slug .= '-' . substr(md5(rand(1, 500)), 0, 3);
}
@@ -577,12 +618,14 @@ class PageRepo extends EntityRepo
* Destroy a given page along with its dependencies.
* @param $page
*/
public function destroy($page)
public function destroy(Page $page)
{
Activity::removeEntity($page);
$page->views()->delete();
$page->tags()->delete();
$page->revisions()->delete();
$page->restrictions()->delete();
$page->permissions()->delete();
$this->permissionService->deleteJointPermissionsForEntity($page);
$page->delete();
}

View File

@@ -2,8 +2,9 @@
use BookStack\Exceptions\PermissionsException;
use BookStack\Permission;
use BookStack\RolePermission;
use BookStack\Role;
use BookStack\Services\PermissionService;
use Setting;
class PermissionsRepo
@@ -11,16 +12,21 @@ class PermissionsRepo
protected $permission;
protected $role;
protected $permissionService;
protected $systemRoles = ['admin', 'public'];
/**
* PermissionsRepo constructor.
* @param $permission
* @param $role
* @param RolePermission $permission
* @param Role $role
* @param PermissionService $permissionService
*/
public function __construct(Permission $permission, Role $role)
public function __construct(RolePermission $permission, Role $role, PermissionService $permissionService)
{
$this->permission = $permission;
$this->role = $role;
$this->permissionService = $permissionService;
}
/**
@@ -29,7 +35,7 @@ class PermissionsRepo
*/
public function getAllRoles()
{
return $this->role->all();
return $this->role->where('hidden', '=', false)->get();
}
/**
@@ -39,7 +45,7 @@ class PermissionsRepo
*/
public function getAllRolesExcept(Role $role)
{
return $this->role->where('id', '!=', $role->id)->get();
return $this->role->where('id', '!=', $role->id)->where('hidden', '=', false)->get();
}
/**
@@ -69,6 +75,7 @@ class PermissionsRepo
$permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : [];
$this->assignRolePermissions($role, $permissions);
$this->permissionService->buildJointPermissionForRole($role);
return $role;
}
@@ -77,10 +84,14 @@ class PermissionsRepo
* Ensure Admin role always has all permissions.
* @param $roleId
* @param $roleData
* @throws PermissionsException
*/
public function updateRole($roleId, $roleData)
{
$role = $this->role->findOrFail($roleId);
if ($role->hidden) throw new PermissionsException("Cannot update a hidden role");
$permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : [];
$this->assignRolePermissions($role, $permissions);
@@ -91,6 +102,7 @@ class PermissionsRepo
$role->fill($roleData);
$role->save();
$this->permissionService->buildJointPermissionForRole($role);
}
/**
@@ -122,8 +134,8 @@ class PermissionsRepo
$role = $this->role->findOrFail($roleId);
// Prevent deleting admin role or default registration role.
if ($role->name === 'admin') {
throw new PermissionsException('The admin role cannot be deleted');
if ($role->system_name && in_array($role->system_name, $this->systemRoles)) {
throw new PermissionsException('This role is a system role and cannot be deleted');
} else if ($role->id == setting('registration-role')) {
throw new PermissionsException('This role cannot be deleted while set as the default registration role.');
}
@@ -136,6 +148,7 @@ class PermissionsRepo
}
}
$this->permissionService->deleteJointPermissionsForRole($role);
$role->delete();
}

135
app/Repos/TagRepo.php Normal file
View File

@@ -0,0 +1,135 @@
<?php namespace BookStack\Repos;
use BookStack\Tag;
use BookStack\Entity;
use BookStack\Services\PermissionService;
/**
* Class TagRepo
* @package BookStack\Repos
*/
class TagRepo
{
protected $tag;
protected $entity;
protected $permissionService;
/**
* TagRepo constructor.
* @param Tag $attr
* @param Entity $ent
* @param PermissionService $ps
*/
public function __construct(Tag $attr, Entity $ent, PermissionService $ps)
{
$this->tag = $attr;
$this->entity = $ent;
$this->permissionService = $ps;
}
/**
* Get an entity instance of its particular type.
* @param $entityType
* @param $entityId
* @param string $action
*/
public function getEntity($entityType, $entityId, $action = 'view')
{
$entityInstance = $this->entity->getEntityInstance($entityType);
$searchQuery = $entityInstance->where('id', '=', $entityId)->with('tags');
$searchQuery = $this->permissionService->enforceEntityRestrictions($searchQuery, $action);
return $searchQuery->first();
}
/**
* Get all tags for a particular entity.
* @param string $entityType
* @param int $entityId
* @return mixed
*/
public function getForEntity($entityType, $entityId)
{
$entity = $this->getEntity($entityType, $entityId);
if ($entity === null) return collect();
return $entity->tags;
}
/**
* Get tag name suggestions from scanning existing tag names.
* If no search term is given the 50 most popular tag names are provided.
* @param $searchTerm
* @return array
*/
public function getNameSuggestions($searchTerm = false)
{
$query = $this->tag->select('*', \DB::raw('count(*) as count'))->groupBy('name');
if ($searchTerm) {
$query = $query->where('name', 'LIKE', $searchTerm . '%')->orderBy('name', 'desc');
} else {
$query = $query->orderBy('count', 'desc')->take(50);
}
$query = $this->permissionService->filterRestrictedEntityRelations($query, 'tags', 'entity_id', 'entity_type');
return $query->get(['name'])->pluck('name');
}
/**
* Get tag value suggestions from scanning existing tag values.
* If no search is given the 50 most popular values are provided.
* Passing a tagName will only find values for a tags with a particular name.
* @param $searchTerm
* @param $tagName
* @return array
*/
public function getValueSuggestions($searchTerm = false, $tagName = false)
{
$query = $this->tag->select('*', \DB::raw('count(*) as count'))->groupBy('value');
if ($searchTerm) {
$query = $query->where('value', 'LIKE', $searchTerm . '%')->orderBy('value', 'desc');
} else {
$query = $query->orderBy('count', 'desc')->take(50);
}
if ($tagName !== false) $query = $query->where('name', '=', $tagName);
$query = $this->permissionService->filterRestrictedEntityRelations($query, 'tags', 'entity_id', 'entity_type');
return $query->get(['value'])->pluck('value');
}
/**
* Save an array of tags to an entity
* @param Entity $entity
* @param array $tags
* @return array|\Illuminate\Database\Eloquent\Collection
*/
public function saveTagsToEntity(Entity $entity, $tags = [])
{
$entity->tags()->delete();
$newTags = [];
foreach ($tags as $tag) {
if (trim($tag['name']) === '') continue;
$newTags[] = $this->newInstanceFromInput($tag);
}
return $entity->tags()->saveMany($newTags);
}
/**
* Create a new Tag instance from user input.
* @param $input
* @return static
*/
protected function newInstanceFromInput($input)
{
$name = trim($input['name']);
$value = isset($input['value']) ? trim($input['value']) : '';
// Any other modification or cleanup required can go here
$values = ['name' => $name, 'value' => $value];
return $this->tag->newInstance($values);
}
}

View File

@@ -51,6 +51,27 @@ class UserRepo
return $this->user->with('roles', 'avatar')->orderBy('name', 'asc')->get();
}
/**
* Get all the users with their permissions in a paginated format.
* @param int $count
* @param $sortData
* @return \Illuminate\Database\Eloquent\Builder|static
*/
public function getAllUsersPaginatedAndSorted($count = 20, $sortData)
{
$query = $this->user->with('roles', 'avatar')->orderBy($sortData['sort'], $sortData['order']);
if ($sortData['search']) {
$term = '%' . $sortData['search'] . '%';
$query->where(function($query) use ($term) {
$query->where('name', 'like', $term)
->orWhere('email', 'like', $term);
});
}
return $query->paginate($count);
}
/**
* Creates a new user and attaches a role to them.
* @param array $data
@@ -168,6 +189,15 @@ class UserRepo
];
}
/**
* Get the roles in the system that are assignable to a user.
* @return mixed
*/
public function getAssignableRoles()
{
return $this->role->visible();
}
/**
* Get all the roles which can be given restricted access to
* other entities in the system.
@@ -175,7 +205,7 @@ class UserRepo
*/
public function getRestrictableRoles()
{
return $this->role->where('name', '!=', 'admin')->get();
return $this->role->where('hidden', '=', false)->where('system_name', '=', '')->get();
}
}

View File

@@ -1,8 +1,5 @@
<?php
<?php namespace BookStack;
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
@@ -14,40 +11,54 @@ class Role extends Model
*/
public function users()
{
return $this->belongsToMany('BookStack\User');
return $this->belongsToMany(User::class);
}
/**
* The permissions that belong to the role.
* Get all related JointPermissions.
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function jointPermissions()
{
return $this->hasMany(JointPermission::class);
}
/**
* The RolePermissions that belong to the role.
*/
public function permissions()
{
return $this->belongsToMany('BookStack\Permission');
return $this->belongsToMany(RolePermission::class, 'permission_role', 'role_id', 'permission_id');
}
/**
* Check if this role has a permission.
* @param $permission
* @param $permissionName
* @return bool
*/
public function hasPermission($permission)
public function hasPermission($permissionName)
{
return $this->permissions->pluck('name')->contains($permission);
$permissions = $this->getRelationValue('permissions');
foreach ($permissions as $permission) {
if ($permission->getRawAttribute('name') === $permissionName) return true;
}
return false;
}
/**
* Add a permission to this role.
* @param Permission $permission
* @param RolePermission $permission
*/
public function attachPermission(Permission $permission)
public function attachPermission(RolePermission $permission)
{
$this->permissions()->attach($permission->id);
}
/**
* Detach a single permission from this role.
* @param Permission $permission
* @param RolePermission $permission
*/
public function detachPermission(Permission $permission)
public function detachPermission(RolePermission $permission)
{
$this->permissions()->detach($permission->id);
}
@@ -61,4 +72,24 @@ class Role extends Model
{
return static::where('name', '=', $roleName)->first();
}
/**
* Get the role object for the specified system role.
* @param $roleName
* @return mixed
*/
public static function getSystemRole($roleName)
{
return static::where('system_name', '=', $roleName)->first();
}
/**
* Get all visible roles
* @return mixed
*/
public static function visible()
{
return static::where('hidden', '=', false)->orderBy('name')->get();
}
}

View File

@@ -1,22 +1,19 @@
<?php
<?php namespace BookStack;
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
class Permission extends Model
class RolePermission extends Model
{
/**
* The roles that belong to the permission.
*/
public function roles()
{
return $this->belongsToMany('BookStack\Role');
return $this->belongsToMany(Role::class, 'permission_role','permission_id', 'role_id');
}
/**
* Get the permission object by name.
* @param $roleName
* @param $name
* @return mixed
*/
public static function getByName($name)

View File

@@ -8,17 +8,17 @@ class ActivityService
{
protected $activity;
protected $user;
protected $restrictionService;
protected $permissionService;
/**
* ActivityService constructor.
* @param Activity $activity
* @param RestrictionService $restrictionService
* @param PermissionService $permissionService
*/
public function __construct(Activity $activity, RestrictionService $restrictionService)
public function __construct(Activity $activity, PermissionService $permissionService)
{
$this->activity = $activity;
$this->restrictionService = $restrictionService;
$this->permissionService = $permissionService;
$this->user = auth()->user();
}
@@ -88,9 +88,9 @@ class ActivityService
*/
public function latest($count = 20, $page = 0)
{
$activityList = $this->restrictionService
$activityList = $this->permissionService
->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
->orderBy('created_at', 'desc')->skip($count * $page)->take($count)->get();
->orderBy('created_at', 'desc')->with('user', 'entity')->skip($count * $page)->take($count)->get();
return $this->filterSimilar($activityList);
}
@@ -105,8 +105,16 @@ class ActivityService
*/
public function entityActivity($entity, $count = 20, $page = 0)
{
$activity = $entity->hasMany('BookStack\Activity')->orderBy('created_at', 'desc')
->skip($count * $page)->take($count)->get();
if ($entity->isA('book')) {
$query = $this->activity->where('book_id', '=', $entity->id);
} else {
$query = $this->activity->where('entity_type', '=', get_class($entity))
->where('entity_id', '=', $entity->id);
}
$activity = $this->permissionService
->filterRestrictedEntityRelations($query, 'activities', 'entity_id', 'entity_type')
->orderBy('created_at', 'desc')->skip($count * $page)->take($count)->get();
return $this->filterSimilar($activity);
}
@@ -121,7 +129,7 @@ class ActivityService
*/
public function userActivity($user, $count = 20, $page = 0)
{
$activityList = $this->restrictionService
$activityList = $this->permissionService
->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
->orderBy('created_at', 'desc')->where('user_id', '=', $user->id)->skip($count * $page)->take($count)->get();
return $this->filterSimilar($activityList);

View File

@@ -48,11 +48,13 @@ class ExportService
foreach ($imageTagsOutput[0] as $index => $imgMatch) {
$oldImgString = $imgMatch;
$srcString = $imageTagsOutput[2][$index];
if (strpos(trim($srcString), 'http') !== 0) {
$pathString = public_path($srcString);
$isLocal = strpos(trim($srcString), 'http') !== 0;
if ($isLocal) {
$pathString = public_path(trim($srcString, '/'));
} else {
$pathString = $srcString;
}
if ($isLocal && !file_exists($pathString)) continue;
$imageContent = file_get_contents($pathString);
$imageEncoded = 'data:image/' . pathinfo($pathString, PATHINFO_EXTENSION) . ';base64,' . base64_encode($imageContent);
$newImageString = str_replace($srcString, $imageEncoded, $oldImgString);

View File

@@ -95,6 +95,7 @@ class ImageService
try {
$storage->put($fullPath, $imageData);
$storage->setVisibility($fullPath, 'public');
} catch (Exception $e) {
throw new ImageUploadException('Image Path ' . $fullPath . ' is not writable by the server.');
}
@@ -167,6 +168,7 @@ class ImageService
$thumbData = (string)$thumb->encode();
$storage->put($thumbFilePath, $thumbData);
$storage->setVisibility($thumbFilePath, 'public');
$this->cache->put('images-' . $image->id . '-' . $thumbFilePath, $thumbFilePath, 60 * 72);
return $this->getPublicUrl($thumbFilePath);
@@ -257,16 +259,22 @@ class ImageService
$storageUrl = config('filesystems.url');
// Get the standard public s3 url if s3 is set as storage type
// Uses the nice, short URL if bucket name has no periods in otherwise the longer
// region-based url will be used to prevent http issues.
if ($storageUrl == false && config('filesystems.default') === 's3') {
$storageDetails = config('filesystems.disks.s3');
$storageUrl = 'https://s3-' . $storageDetails['region'] . '.amazonaws.com/' . $storageDetails['bucket'];
if (strpos($storageDetails['bucket'], '.') === false) {
$storageUrl = 'https://' . $storageDetails['bucket'] . '.s3.amazonaws.com';
} else {
$storageUrl = 'https://s3-' . $storageDetails['region'] . '.amazonaws.com/' . $storageDetails['bucket'];
}
}
$this->storageUrl = $storageUrl;
}
return ($this->storageUrl == false ? '' : rtrim($this->storageUrl, '/')) . $filePath;
return ($this->storageUrl == false ? rtrim(baseUrl(''), '/') : rtrim($this->storageUrl, '/')) . $filePath;
}
}
}

View File

@@ -33,6 +33,17 @@ class Ldap
return ldap_set_option($ldapConnection, $option, $value);
}
/**
* Set the version number for the given ldap connection.
* @param $ldapConnection
* @param $version
* @return bool
*/
public function setVersion($ldapConnection, $version)
{
return $this->setOption($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, $version);
}
/**
* Search LDAP tree using the provided filter.
* @param resource $ldapConnection

View File

@@ -122,7 +122,7 @@ class LdapService
// Set any required options
if ($this->config['version']) {
$this->ldap->setOption($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, $this->config['version']);
$this->ldap->setVersion($ldapConnection, $this->config['version']);
}
$this->ldapConnection = $ldapConnection;

View File

@@ -0,0 +1,581 @@
<?php namespace BookStack\Services;
use BookStack\Book;
use BookStack\Chapter;
use BookStack\Entity;
use BookStack\JointPermission;
use BookStack\Ownable;
use BookStack\Page;
use BookStack\Role;
use BookStack\User;
use Illuminate\Support\Collection;
class PermissionService
{
protected $userRoles;
protected $isAdmin;
protected $currentAction;
protected $currentUser;
public $book;
public $chapter;
public $page;
protected $jointPermission;
protected $role;
protected $entityCache;
/**
* PermissionService constructor.
* @param JointPermission $jointPermission
* @param Book $book
* @param Chapter $chapter
* @param Page $page
* @param Role $role
*/
public function __construct(JointPermission $jointPermission, Book $book, Chapter $chapter, Page $page, Role $role)
{
$this->currentUser = auth()->user();
$userSet = $this->currentUser !== null;
$this->userRoles = false;
$this->isAdmin = $userSet ? $this->currentUser->hasRole('admin') : false;
if (!$userSet) $this->currentUser = new User();
$this->jointPermission = $jointPermission;
$this->role = $role;
$this->book = $book;
$this->chapter = $chapter;
$this->page = $page;
}
/**
* Prepare the local entity cache and ensure it's empty
*/
protected function readyEntityCache()
{
$this->entityCache = [
'books' => collect(),
'chapters' => collect()
];
}
/**
* Get a book via ID, Checks local cache
* @param $bookId
* @return Book
*/
protected function getBook($bookId)
{
if (isset($this->entityCache['books']) && $this->entityCache['books']->has($bookId)) {
return $this->entityCache['books']->get($bookId);
}
$book = $this->book->find($bookId);
if ($book === null) $book = false;
if (isset($this->entityCache['books'])) {
$this->entityCache['books']->put($bookId, $book);
}
return $book;
}
/**
* Get a chapter via ID, Checks local cache
* @param $chapterId
* @return Book
*/
protected function getChapter($chapterId)
{
if (isset($this->entityCache['chapters']) && $this->entityCache['chapters']->has($chapterId)) {
return $this->entityCache['chapters']->get($chapterId);
}
$chapter = $this->chapter->find($chapterId);
if ($chapter === null) $chapter = false;
if (isset($this->entityCache['chapters'])) {
$this->entityCache['chapters']->put($chapterId, $chapter);
}
return $chapter;
}
/**
* Get the roles for the current user;
* @return array|bool
*/
protected function getRoles()
{
if ($this->userRoles !== false) return $this->userRoles;
$roles = [];
if (auth()->guest()) {
$roles[] = $this->role->getSystemRole('public')->id;
return $roles;
}
foreach ($this->currentUser->roles as $role) {
$roles[] = $role->id;
}
return $roles;
}
/**
* Re-generate all entity permission from scratch.
*/
public function buildJointPermissions()
{
$this->jointPermission->truncate();
$this->readyEntityCache();
// Get all roles (Should be the most limited dimension)
$roles = $this->role->with('permissions')->get();
// Chunk through all books
$this->book->with('permissions')->chunk(500, function ($books) use ($roles) {
$this->createManyJointPermissions($books, $roles);
});
// Chunk through all chapters
$this->chapter->with('book', 'permissions')->chunk(500, function ($chapters) use ($roles) {
$this->createManyJointPermissions($chapters, $roles);
});
// Chunk through all pages
$this->page->with('book', 'chapter', 'permissions')->chunk(500, function ($pages) use ($roles) {
$this->createManyJointPermissions($pages, $roles);
});
}
/**
* Rebuild the entity jointPermissions for a particular entity.
* @param Entity $entity
*/
public function buildJointPermissionsForEntity(Entity $entity)
{
$roles = $this->role->with('jointPermissions')->get();
$entities = collect([$entity]);
if ($entity->isA('book')) {
$entities = $entities->merge($entity->chapters);
$entities = $entities->merge($entity->pages);
} elseif ($entity->isA('chapter')) {
$entities = $entities->merge($entity->pages);
}
$this->deleteManyJointPermissionsForEntities($entities);
$this->createManyJointPermissions($entities, $roles);
}
/**
* Rebuild the entity jointPermissions for a collection of entities.
* @param Collection $entities
*/
public function buildJointPermissionsForEntities(Collection $entities)
{
$roles = $this->role->with('jointPermissions')->get();
$this->deleteManyJointPermissionsForEntities($entities);
$this->createManyJointPermissions($entities, $roles);
}
/**
* Build the entity jointPermissions for a particular role.
* @param Role $role
*/
public function buildJointPermissionForRole(Role $role)
{
$roles = collect([$role]);
$this->deleteManyJointPermissionsForRoles($roles);
// Chunk through all books
$this->book->with('permissions')->chunk(500, function ($books) use ($roles) {
$this->createManyJointPermissions($books, $roles);
});
// Chunk through all chapters
$this->chapter->with('book', 'permissions')->chunk(500, function ($books) use ($roles) {
$this->createManyJointPermissions($books, $roles);
});
// Chunk through all pages
$this->page->with('book', 'chapter', 'permissions')->chunk(500, function ($books) use ($roles) {
$this->createManyJointPermissions($books, $roles);
});
}
/**
* Delete the entity jointPermissions attached to a particular role.
* @param Role $role
*/
public function deleteJointPermissionsForRole(Role $role)
{
$this->deleteManyJointPermissionsForRoles([$role]);
}
/**
* Delete all of the entity jointPermissions for a list of entities.
* @param Role[] $roles
*/
protected function deleteManyJointPermissionsForRoles($roles)
{
foreach ($roles as $role) {
$role->jointPermissions()->delete();
}
}
/**
* Delete the entity jointPermissions for a particular entity.
* @param Entity $entity
*/
public function deleteJointPermissionsForEntity(Entity $entity)
{
$this->deleteManyJointPermissionsForEntities([$entity]);
}
/**
* Delete all of the entity jointPermissions for a list of entities.
* @param Entity[] $entities
*/
protected function deleteManyJointPermissionsForEntities($entities)
{
$query = $this->jointPermission->newQuery();
foreach ($entities as $entity) {
$query->orWhere(function($query) use ($entity) {
$query->where('entity_id', '=', $entity->id)
->where('entity_type', '=', $entity->getMorphClass());
});
}
$query->delete();
}
/**
* Create & Save entity jointPermissions for many entities and jointPermissions.
* @param Collection $entities
* @param Collection $roles
*/
protected function createManyJointPermissions($entities, $roles)
{
$this->readyEntityCache();
$jointPermissions = [];
foreach ($entities as $entity) {
foreach ($roles as $role) {
foreach ($this->getActions($entity) as $action) {
$jointPermissions[] = $this->createJointPermissionData($entity, $role, $action);
}
}
}
$this->jointPermission->insert($jointPermissions);
}
/**
* Get the actions related to an entity.
* @param $entity
* @return array
*/
protected function getActions($entity)
{
$baseActions = ['view', 'update', 'delete'];
if ($entity->isA('chapter')) {
$baseActions[] = 'page-create';
} else if ($entity->isA('book')) {
$baseActions[] = 'page-create';
$baseActions[] = 'chapter-create';
}
return $baseActions;
}
/**
* Create entity permission data for an entity and role
* for a particular action.
* @param Entity $entity
* @param Role $role
* @param $action
* @return array
*/
protected function createJointPermissionData(Entity $entity, Role $role, $action)
{
$permissionPrefix = (strpos($action, '-') === false ? ($entity->getType() . '-') : '') . $action;
$roleHasPermission = $role->hasPermission($permissionPrefix . '-all');
$roleHasPermissionOwn = $role->hasPermission($permissionPrefix . '-own');
$explodedAction = explode('-', $action);
$restrictionAction = end($explodedAction);
if ($entity->isA('book')) {
if (!$entity->restricted) {
return $this->createJointPermissionDataArray($entity, $role, $action, $roleHasPermission, $roleHasPermissionOwn);
} else {
$hasAccess = $entity->hasActiveRestriction($role->id, $restrictionAction);
return $this->createJointPermissionDataArray($entity, $role, $action, $hasAccess, $hasAccess);
}
} elseif ($entity->isA('chapter')) {
if (!$entity->restricted) {
$book = $this->getBook($entity->book_id);
$hasExplicitAccessToBook = $book->hasActiveRestriction($role->id, $restrictionAction);
$hasPermissiveAccessToBook = !$book->restricted;
return $this->createJointPermissionDataArray($entity, $role, $action,
($hasExplicitAccessToBook || ($roleHasPermission && $hasPermissiveAccessToBook)),
($hasExplicitAccessToBook || ($roleHasPermissionOwn && $hasPermissiveAccessToBook)));
} else {
$hasAccess = $entity->hasActiveRestriction($role->id, $restrictionAction);
return $this->createJointPermissionDataArray($entity, $role, $action, $hasAccess, $hasAccess);
}
} elseif ($entity->isA('page')) {
if (!$entity->restricted) {
$book = $this->getBook($entity->book_id);
$hasExplicitAccessToBook = $book->hasActiveRestriction($role->id, $restrictionAction);
$hasPermissiveAccessToBook = !$book->restricted;
$chapter = $this->getChapter($entity->chapter_id);
$hasExplicitAccessToChapter = $chapter && $chapter->hasActiveRestriction($role->id, $restrictionAction);
$hasPermissiveAccessToChapter = $chapter && !$chapter->restricted;
$acknowledgeChapter = ($chapter && $chapter->restricted);
$hasExplicitAccessToParents = $acknowledgeChapter ? $hasExplicitAccessToChapter : $hasExplicitAccessToBook;
$hasPermissiveAccessToParents = $acknowledgeChapter ? $hasPermissiveAccessToChapter : $hasPermissiveAccessToBook;
return $this->createJointPermissionDataArray($entity, $role, $action,
($hasExplicitAccessToParents || ($roleHasPermission && $hasPermissiveAccessToParents)),
($hasExplicitAccessToParents || ($roleHasPermissionOwn && $hasPermissiveAccessToParents))
);
} else {
$hasAccess = $entity->hasRestriction($role->id, $action);
return $this->createJointPermissionDataArray($entity, $role, $action, $hasAccess, $hasAccess);
}
}
}
/**
* Create an array of data with the information of an entity jointPermissions.
* Used to build data for bulk insertion.
* @param Entity $entity
* @param Role $role
* @param $action
* @param $permissionAll
* @param $permissionOwn
* @return array
*/
protected function createJointPermissionDataArray(Entity $entity, Role $role, $action, $permissionAll, $permissionOwn)
{
$entityClass = get_class($entity);
return [
'role_id' => $role->getRawAttribute('id'),
'entity_id' => $entity->getRawAttribute('id'),
'entity_type' => $entityClass,
'action' => $action,
'has_permission' => $permissionAll,
'has_permission_own' => $permissionOwn,
'created_by' => $entity->getRawAttribute('created_by')
];
}
/**
* Checks if an entity has a restriction set upon it.
* @param Ownable $ownable
* @param $permission
* @return bool
*/
public function checkOwnableUserAccess(Ownable $ownable, $permission)
{
if ($this->isAdmin) return true;
$explodedPermission = explode('-', $permission);
$baseQuery = $ownable->where('id', '=', $ownable->id);
$action = end($explodedPermission);
$this->currentAction = $action;
$nonJointPermissions = ['restrictions'];
// Handle non entity specific jointPermissions
if (in_array($explodedPermission[0], $nonJointPermissions)) {
$allPermission = $this->currentUser && $this->currentUser->can($permission . '-all');
$ownPermission = $this->currentUser && $this->currentUser->can($permission . '-own');
$this->currentAction = 'view';
$isOwner = $this->currentUser && $this->currentUser->id === $ownable->created_by;
return ($allPermission || ($isOwner && $ownPermission));
}
// Handle abnormal create jointPermissions
if ($action === 'create') {
$this->currentAction = $permission;
}
return $this->entityRestrictionQuery($baseQuery)->count() > 0;
}
/**
* Check if an entity has restrictions set on itself or its
* parent tree.
* @param Entity $entity
* @param $action
* @return bool|mixed
*/
public function checkIfRestrictionsSet(Entity $entity, $action)
{
$this->currentAction = $action;
if ($entity->isA('page')) {
return $entity->restricted || ($entity->chapter && $entity->chapter->restricted) || $entity->book->restricted;
} elseif ($entity->isA('chapter')) {
return $entity->restricted || $entity->book->restricted;
} elseif ($entity->isA('book')) {
return $entity->restricted;
}
}
/**
* The general query filter to remove all entities
* that the current user does not have access to.
* @param $query
* @return mixed
*/
protected function entityRestrictionQuery($query)
{
return $query->where(function ($parentQuery) {
$parentQuery->whereHas('jointPermissions', function ($permissionQuery) {
$permissionQuery->whereIn('role_id', $this->getRoles())
->where('action', '=', $this->currentAction)
->where(function ($query) {
$query->where('has_permission', '=', true)
->orWhere(function ($query) {
$query->where('has_permission_own', '=', true)
->where('created_by', '=', $this->currentUser->id);
});
});
});
});
}
/**
* Add restrictions for a page query
* @param $query
* @param string $action
* @return mixed
*/
public function enforcePageRestrictions($query, $action = 'view')
{
// Prevent drafts being visible to others.
$query = $query->where(function ($query) {
$query->where('draft', '=', false);
if ($this->currentUser) {
$query->orWhere(function ($query) {
$query->where('draft', '=', true)->where('created_by', '=', $this->currentUser->id);
});
}
});
return $this->enforceEntityRestrictions($query, $action);
}
/**
* Add on permission restrictions to a chapter query.
* @param $query
* @param string $action
* @return mixed
*/
public function enforceChapterRestrictions($query, $action = 'view')
{
return $this->enforceEntityRestrictions($query, $action);
}
/**
* Add restrictions to a book query.
* @param $query
* @param string $action
* @return mixed
*/
public function enforceBookRestrictions($query, $action = 'view')
{
return $this->enforceEntityRestrictions($query, $action);
}
/**
* Add restrictions for a generic entity
* @param $query
* @param string $action
* @return mixed
*/
public function enforceEntityRestrictions($query, $action = 'view')
{
if ($this->isAdmin) return $query;
$this->currentAction = $action;
return $this->entityRestrictionQuery($query);
}
/**
* Filter items that have entities set a a polymorphic relation.
* @param $query
* @param string $tableName
* @param string $entityIdColumn
* @param string $entityTypeColumn
* @return mixed
*/
public function filterRestrictedEntityRelations($query, $tableName, $entityIdColumn, $entityTypeColumn)
{
if ($this->isAdmin) return $query;
$this->currentAction = 'view';
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn, 'entityTypeColumn' => $entityTypeColumn];
return $query->where(function ($query) use ($tableDetails) {
$query->whereExists(function ($permissionQuery) use (&$tableDetails) {
$permissionQuery->select('id')->from('joint_permissions')
->whereRaw('joint_permissions.entity_id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
->whereRaw('joint_permissions.entity_type=' . $tableDetails['tableName'] . '.' . $tableDetails['entityTypeColumn'])
->where('action', '=', $this->currentAction)
->whereIn('role_id', $this->getRoles())
->where(function ($query) {
$query->where('has_permission', '=', true)->orWhere(function ($query) {
$query->where('has_permission_own', '=', true)
->where('created_by', '=', $this->currentUser->id);
});
});
});
});
}
/**
* Filters pages that are a direct relation to another item.
* @param $query
* @param $tableName
* @param $entityIdColumn
* @return mixed
*/
public function filterRelatedPages($query, $tableName, $entityIdColumn)
{
if ($this->isAdmin) return $query;
$this->currentAction = 'view';
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn];
return $query->where(function ($query) use ($tableDetails) {
$query->where(function ($query) use (&$tableDetails) {
$query->whereExists(function ($permissionQuery) use (&$tableDetails) {
$permissionQuery->select('id')->from('joint_permissions')
->whereRaw('joint_permissions.entity_id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
->where('entity_type', '=', 'Bookstack\\Page')
->where('action', '=', $this->currentAction)
->whereIn('role_id', $this->getRoles())
->where(function ($query) {
$query->where('has_permission', '=', true)->orWhere(function ($query) {
$query->where('has_permission_own', '=', true)
->where('created_by', '=', $this->currentUser->id);
});
});
});
})->orWhere($tableDetails['entityIdColumn'], '=', 0);
});
}
}

View File

@@ -1,326 +0,0 @@
<?php namespace BookStack\Services;
use BookStack\Entity;
class RestrictionService
{
protected $userRoles;
protected $isAdmin;
protected $currentAction;
protected $currentUser;
/**
* RestrictionService constructor.
*/
public function __construct()
{
$this->currentUser = auth()->user();
$this->userRoles = $this->currentUser ? $this->currentUser->roles->pluck('id') : [];
$this->isAdmin = $this->currentUser ? $this->currentUser->hasRole('admin') : false;
}
/**
* Checks if an entity has a restriction set upon it.
* @param Entity $entity
* @param $action
* @return bool
*/
public function checkIfEntityRestricted(Entity $entity, $action)
{
if ($this->isAdmin) return true;
$this->currentAction = $action;
$baseQuery = $entity->where('id', '=', $entity->id);
if ($entity->isA('page')) {
return $this->pageRestrictionQuery($baseQuery)->count() > 0;
} elseif ($entity->isA('chapter')) {
return $this->chapterRestrictionQuery($baseQuery)->count() > 0;
} elseif ($entity->isA('book')) {
return $this->bookRestrictionQuery($baseQuery)->count() > 0;
}
return false;
}
/**
* Check if an entity has restrictions set on itself or its
* parent tree.
* @param Entity $entity
* @param $action
* @return bool|mixed
*/
public function checkIfRestrictionsSet(Entity $entity, $action)
{
$this->currentAction = $action;
if ($entity->isA('page')) {
return $entity->restricted || ($entity->chapter && $entity->chapter->restricted) || $entity->book->restricted;
} elseif ($entity->isA('chapter')) {
return $entity->restricted || $entity->book->restricted;
} elseif ($entity->isA('book')) {
return $entity->restricted;
}
}
/**
* Add restrictions for a page query
* @param $query
* @param string $action
* @return mixed
*/
public function enforcePageRestrictions($query, $action = 'view')
{
// Prevent drafts being visible to others.
$query = $query->where(function ($query) {
$query->where('draft', '=', false);
if ($this->currentUser) {
$query->orWhere(function ($query) {
$query->where('draft', '=', true)->where('created_by', '=', $this->currentUser->id);
});
}
});
if ($this->isAdmin) return $query;
$this->currentAction = $action;
return $this->pageRestrictionQuery($query);
}
/**
* The base query for restricting pages.
* @param $query
* @return mixed
*/
private function pageRestrictionQuery($query)
{
return $query->where(function ($parentWhereQuery) {
$parentWhereQuery
// (Book & chapter & page) or (Book & page & NO CHAPTER) unrestricted
->where(function ($query) {
$query->where(function ($query) {
$query->whereExists(function ($query) {
$query->select('*')->from('chapters')
->whereRaw('chapters.id=pages.chapter_id')
->where('restricted', '=', false);
})->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=pages.book_id')
->where('restricted', '=', false);
})->where('restricted', '=', false);
})->orWhere(function ($query) {
$query->where('restricted', '=', false)->where('chapter_id', '=', 0)
->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=pages.book_id')
->where('restricted', '=', false);
});
});
})
// Page unrestricted, Has no chapter & book has accepted restrictions
->orWhere(function ($query) {
$query->where('restricted', '=', false)
->whereExists(function ($query) {
$query->select('*')->from('chapters')
->whereRaw('chapters.id=pages.chapter_id');
}, 'and', true)
->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=pages.book_id')
->whereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'books', 'Book');
});
});
})
// Page unrestricted, Has an unrestricted chapter & book has accepted restrictions
->orWhere(function ($query) {
$query->where('restricted', '=', false)
->whereExists(function ($query) {
$query->select('*')->from('chapters')
->whereRaw('chapters.id=pages.chapter_id')->where('restricted', '=', false);
})
->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=pages.book_id')
->whereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'books', 'Book');
});
});
})
// Page unrestricted, Has a chapter with accepted permissions
->orWhere(function ($query) {
$query->where('restricted', '=', false)
->whereExists(function ($query) {
$query->select('*')->from('chapters')
->whereRaw('chapters.id=pages.chapter_id')
->where('restricted', '=', true)
->whereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'chapters', 'Chapter');
});
});
})
// Page has accepted permissions
->orWhereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'pages', 'Page');
});
});
}
/**
* Add on permission restrictions to a chapter query.
* @param $query
* @param string $action
* @return mixed
*/
public function enforceChapterRestrictions($query, $action = 'view')
{
if ($this->isAdmin) return $query;
$this->currentAction = $action;
return $this->chapterRestrictionQuery($query);
}
/**
* The base query for restricting chapters.
* @param $query
* @return mixed
*/
private function chapterRestrictionQuery($query)
{
return $query->where(function ($parentWhereQuery) {
$parentWhereQuery
// Book & chapter unrestricted
->where(function ($query) {
$query->where('restricted', '=', false)->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=chapters.book_id')
->where('restricted', '=', false);
});
})
// Chapter unrestricted & book has accepted restrictions
->orWhere(function ($query) {
$query->where('restricted', '=', false)
->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=chapters.book_id')
->whereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'books', 'Book');
});
});
})
// Chapter has accepted permissions
->orWhereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'chapters', 'Chapter');
});
});
}
/**
* Add restrictions to a book query.
* @param $query
* @param string $action
* @return mixed
*/
public function enforceBookRestrictions($query, $action = 'view')
{
if ($this->isAdmin) return $query;
$this->currentAction = $action;
return $this->bookRestrictionQuery($query);
}
/**
* The base query for restricting books.
* @param $query
* @return mixed
*/
private function bookRestrictionQuery($query)
{
return $query->where(function ($parentWhereQuery) {
$parentWhereQuery
->where('restricted', '=', false)
->orWhere(function ($query) {
$query->where('restricted', '=', true)->whereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'books', 'Book');
});
});
});
}
/**
* Filter items that have entities set a a polymorphic relation.
* @param $query
* @param string $tableName
* @param string $entityIdColumn
* @param string $entityTypeColumn
* @return mixed
*/
public function filterRestrictedEntityRelations($query, $tableName, $entityIdColumn, $entityTypeColumn)
{
if ($this->isAdmin) return $query;
$this->currentAction = 'view';
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn, 'entityTypeColumn' => $entityTypeColumn];
return $query->where(function ($query) use ($tableDetails) {
$query->where(function ($query) use (&$tableDetails) {
$query->where($tableDetails['entityTypeColumn'], '=', 'BookStack\Page')
->whereExists(function ($query) use (&$tableDetails) {
$query->select('*')->from('pages')->whereRaw('pages.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
->where(function ($query) {
$this->pageRestrictionQuery($query);
});
});
})->orWhere(function ($query) use (&$tableDetails) {
$query->where($tableDetails['entityTypeColumn'], '=', 'BookStack\Book')->whereExists(function ($query) use (&$tableDetails) {
$query->select('*')->from('books')->whereRaw('books.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
->where(function ($query) {
$this->bookRestrictionQuery($query);
});
});
})->orWhere(function ($query) use (&$tableDetails) {
$query->where($tableDetails['entityTypeColumn'], '=', 'BookStack\Chapter')->whereExists(function ($query) use (&$tableDetails) {
$query->select('*')->from('chapters')->whereRaw('chapters.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
->where(function ($query) {
$this->chapterRestrictionQuery($query);
});
});
});
});
}
/**
* Filters pages that are a direct relation to another item.
* @param $query
* @param $tableName
* @param $entityIdColumn
* @return mixed
*/
public function filterRelatedPages($query, $tableName, $entityIdColumn)
{
if ($this->isAdmin) return $query;
$this->currentAction = 'view';
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn];
return $query->where(function ($query) use (&$tableDetails) {
$query->where(function ($query) use (&$tableDetails) {
$query->whereExists(function ($query) use (&$tableDetails) {
$query->select('*')->from('pages')->whereRaw('pages.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
->where(function ($query) {
$this->pageRestrictionQuery($query);
});
})->orWhere($tableDetails['entityIdColumn'], '=', 0);
});
});
}
/**
* The query to check the restrictions on an entity.
* @param $query
* @param $tableName
* @param $modelName
*/
private function checkRestrictionsQuery($query, $tableName, $modelName)
{
$query->select('*')->from('restrictions')
->whereRaw('restrictions.restrictable_id=' . $tableName . '.id')
->where('restrictions.restrictable_type', '=', 'BookStack\\' . $modelName)
->where('restrictions.action', '=', $this->currentAction)
->whereIn('restrictions.role_id', $this->userRoles);
}
}

View File

@@ -1,14 +1,11 @@
<?php namespace BookStack\Services;
use GuzzleHttp\Exception\ClientException;
use Laravel\Socialite\Contracts\Factory as Socialite;
use BookStack\Exceptions\SocialDriverNotConfigured;
use BookStack\Exceptions\SocialSignInException;
use BookStack\Exceptions\UserRegistrationException;
use BookStack\Http\Controllers\Auth\AuthController;
use BookStack\Repos\UserRepo;
use BookStack\SocialAccount;
use BookStack\User;
class SocialAuthService
{
@@ -116,20 +113,20 @@ class SocialAuthService
if ($isLoggedIn && $socialAccount === null) {
$this->fillSocialAccount($socialDriver, $socialUser);
$currentUser->socialAccounts()->save($this->socialAccount);
\Session::flash('success', title_case($socialDriver) . ' account was successfully attached to your profile.');
session()->flash('success', title_case($socialDriver) . ' account was successfully attached to your profile.');
return redirect($currentUser->getEditUrl());
}
// When a user is logged in and the social account exists and is already linked to the current user.
if ($isLoggedIn && $socialAccount !== null && $socialAccount->user->id === $currentUser->id) {
\Session::flash('error', 'This ' . title_case($socialDriver) . ' account is already attached to your profile.');
session()->flash('error', 'This ' . title_case($socialDriver) . ' account is already attached to your profile.');
return redirect($currentUser->getEditUrl());
}
// When a user is logged in, A social account exists but the users do not match.
// Change the user that the social account is assigned to.
if ($isLoggedIn && $socialAccount !== null && $socialAccount->user->id != $currentUser->id) {
\Session::flash('success', 'This ' . title_case($socialDriver) . ' account is already used by another user.');
session()->flash('success', 'This ' . title_case($socialDriver) . ' account is already used by another user.');
return redirect($currentUser->getEditUrl());
}
@@ -138,6 +135,7 @@ class SocialAuthService
if (setting('registration-enabled')) {
$message .= ' or, If you do not yet have an account, You can register an account using the ' . $socialDriver . ' option';
}
throw new SocialSignInException($message . '.', '/login');
}
@@ -160,7 +158,7 @@ class SocialAuthService
$driver = trim(strtolower($socialDriver));
if (!in_array($driver, $this->validSocialDrivers)) abort(404, 'Social Driver Not Found');
if (!$this->checkDriverConfigured($driver)) throw new SocialDriverNotConfigured;
if (!$this->checkDriverConfigured($driver)) throw new SocialDriverNotConfigured("Your {$driver} social settings are not configured correctly.");
return $driver;
}
@@ -217,7 +215,7 @@ class SocialAuthService
{
session();
auth()->user()->socialAccounts()->where('driver', '=', $socialDriver)->delete();
\Session::flash('success', $socialDriver . ' account successfully detached');
session()->flash('success', title_case($socialDriver) . ' account successfully detached');
return redirect(auth()->user()->getEditUrl());
}

View File

@@ -8,18 +8,18 @@ class ViewService
protected $view;
protected $user;
protected $restrictionService;
protected $permissionService;
/**
* ViewService constructor.
* @param View $view
* @param RestrictionService $restrictionService
* @param PermissionService $permissionService
*/
public function __construct(View $view, RestrictionService $restrictionService)
public function __construct(View $view, PermissionService $permissionService)
{
$this->view = $view;
$this->user = auth()->user();
$this->restrictionService = $restrictionService;
$this->permissionService = $permissionService;
}
/**
@@ -50,17 +50,21 @@ class ViewService
* Get the entities with the most views.
* @param int $count
* @param int $page
* @param bool|false $filterModel
* @param bool|false|array $filterModel
*/
public function getPopular($count = 10, $page = 0, $filterModel = false)
{
$skipCount = $count * $page;
$query = $this->restrictionService->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type')
$query = $this->permissionService->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type')
->select('*', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count'))
->groupBy('viewable_id', 'viewable_type')
->orderBy('view_count', 'desc');
if ($filterModel) $query->where('viewable_type', '=', get_class($filterModel));
if ($filterModel && is_array($filterModel)) {
$query->whereIn('viewable_type', $filterModel);
} else if ($filterModel) {
$query->where('viewable_type', '=', get_class($filterModel));
};
return $query->with('viewable')->skip($skipCount)->take($count)->get()->pluck('viewable');
}
@@ -76,7 +80,7 @@ class ViewService
{
if ($this->user === null) return collect();
$query = $this->restrictionService
$query = $this->permissionService
->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type');
if ($filterModel) $query = $query->where('viewable_type', '=', get_class($filterModel));

View File

@@ -1,8 +1,4 @@
<?php
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
<?php namespace BookStack;
class Setting extends Model
{

View File

@@ -1,8 +1,5 @@
<?php
<?php namespace BookStack;
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
class SocialAccount extends Model
{
@@ -11,6 +8,6 @@ class SocialAccount extends Model
public function user()
{
return $this->belongsTo('BookStack\User');
return $this->belongsTo(User::class);
}
}

19
app/Tag.php Normal file
View File

@@ -0,0 +1,19 @@
<?php namespace BookStack;
/**
* Class Attribute
* @package BookStack
*/
class Tag extends Model
{
protected $fillable = ['name', 'value', 'order'];
/**
* Get the entity that this tag belongs to
* @return \Illuminate\Database\Eloquent\Relations\MorphTo
*/
public function entity()
{
return $this->morphTo('entity');
}
}

View File

@@ -1,9 +1,6 @@
<?php
namespace BookStack;
<?php namespace BookStack;
use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
@@ -52,7 +49,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function roles()
{
return $this->belongsToMany('BookStack\Role');
return $this->belongsToMany(Role::class);
}
/**
@@ -116,7 +113,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function socialAccounts()
{
return $this->hasMany('BookStack\SocialAccount');
return $this->hasMany(SocialAccount::class);
}
/**
@@ -141,8 +138,8 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function getAvatar($size = 50)
{
if ($this->image_id === 0 || $this->image_id === '0' || $this->image_id === null) return '/user_avatar.png';
return $this->avatar->getThumb($size, $size, false);
if ($this->image_id === 0 || $this->image_id === '0' || $this->image_id === null) return baseUrl('/user_avatar.png');
return baseUrl($this->avatar->getThumb($size, $size, false));
}
/**
@@ -151,7 +148,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function avatar()
{
return $this->belongsTo('BookStack\Image', 'image_id');
return $this->belongsTo(Image::class, 'image_id');
}
/**
@@ -160,7 +157,16 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function getEditUrl()
{
return '/settings/users/' . $this->id;
return baseUrl('/settings/users/' . $this->id);
}
/**
* Get the url that links to this user's profile.
* @return mixed
*/
public function getProfileUrl()
{
return baseUrl('/user/' . $this->id);
}
/**

View File

@@ -1,8 +1,4 @@
<?php
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
<?php namespace BookStack;
class View extends Model
{

View File

@@ -1,64 +1,58 @@
<?php
if (!function_exists('versioned_asset')) {
/**
* Get the path to a versioned file.
*
* @param string $file
* @return string
*
* @throws \InvalidArgumentException
*/
function versioned_asset($file)
{
static $manifest = null;
use BookStack\Ownable;
if (is_null($manifest)) {
$manifest = json_decode(file_get_contents(public_path('build/manifest.json')), true);
/**
* Get the path to a versioned file.
*
* @param string $file
* @return string
* @throws Exception
*/
function versioned_asset($file = '')
{
// Don't require css and JS assets for testing
if (config('app.env') === 'testing') return '';
static $manifest = null;
$manifestPath = 'build/manifest.json';
if (is_null($manifest) && file_exists($manifestPath)) {
$manifest = json_decode(file_get_contents(public_path($manifestPath)), true);
} else if (!file_exists($manifestPath)) {
if (config('app.env') !== 'production') {
$path = public_path($manifestPath);
$error = "No {$path} file found, Ensure you have built the css/js assets using gulp.";
} else {
$error = "No {$manifestPath} file found, Ensure you are using the release version of BookStack";
}
if (isset($manifest[$file])) {
return '/' . $manifest[$file];
}
if (file_exists(public_path($file))) {
return '/' . $file;
}
throw new InvalidArgumentException("File {$file} not defined in asset manifest.");
throw new \Exception($error);
}
if (isset($manifest[$file])) {
return baseUrl($manifest[$file]);
}
throw new InvalidArgumentException("File {$file} not defined in asset manifest.");
}
/**
* Check if the current user has a permission.
* If an ownable element is passed in the permissions are checked against
* If an ownable element is passed in the jointPermissions are checked against
* that particular item.
* @param $permission
* @param \BookStack\Ownable $ownable
* @param Ownable $ownable
* @return mixed
*/
function userCan($permission, \BookStack\Ownable $ownable = null)
function userCan($permission, Ownable $ownable = null)
{
if (!auth()->check()) return false;
if ($ownable === null) {
return auth()->user() && auth()->user()->can($permission);
}
// Check permission on ownable item
$permissionBaseName = strtolower($permission) . '-';
$hasPermission = false;
if (auth()->user()->can($permissionBaseName . 'all')) $hasPermission = true;
if (auth()->user()->can($permissionBaseName . 'own') && $ownable->createdBy && $ownable->createdBy->id === auth()->user()->id) $hasPermission = true;
if (!$ownable instanceof \BookStack\Entity) return $hasPermission;
// Check restrictions on the entity
$restrictionService = app('BookStack\Services\RestrictionService');
$explodedPermission = explode('-', $permission);
$action = end($explodedPermission);
$hasAccess = $restrictionService->checkIfEntityRestricted($ownable, $action);
$restrictionsSet = $restrictionService->checkIfRestrictionsSet($ownable, $action);
return ($hasAccess && $restrictionsSet) || (!$restrictionsSet && $hasPermission);
$permissionService = app(\BookStack\Services\PermissionService::class);
return $permissionService->checkOwnableUserAccess($ownable, $permission);
}
/**
@@ -72,3 +66,82 @@ function setting($key, $default = false)
$settingService = app('BookStack\Services\SettingService');
return $settingService->get($key, $default);
}
/**
* Helper to create url's relative to the applications root path.
* @param string $path
* @param bool $forceAppDomain
* @return string
*/
function baseUrl($path, $forceAppDomain = false)
{
$isFullUrl = strpos($path, 'http') === 0;
if ($isFullUrl && !$forceAppDomain) return $path;
$path = trim($path, '/');
if ($isFullUrl && $forceAppDomain) {
$explodedPath = explode('/', $path);
$path = implode('/', array_splice($explodedPath, 3));
}
// Return normal url path if not specified in config
if (config('app.url') === '') {
return url($path);
}
return rtrim(config('app.url'), '/') . '/' . $path;
}
/**
* Get an instance of the redirector.
* Overrides the default laravel redirect helper.
* Ensures it redirects even when the app is in a subdirectory.
*
* @param string|null $to
* @param int $status
* @param array $headers
* @param bool $secure
* @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse
*/
function redirect($to = null, $status = 302, $headers = [], $secure = null)
{
if (is_null($to)) {
return app('redirect');
}
$to = baseUrl($to);
return app('redirect')->to($to, $status, $headers, $secure);
}
/**
* Generate a url with multiple parameters for sorting purposes.
* Works out the logic to set the correct sorting direction
* Discards empty parameters and allows overriding.
* @param $path
* @param array $data
* @param array $overrideData
* @return string
*/
function sortUrl($path, $data, $overrideData = [])
{
$queryStringSections = [];
$queryData = array_merge($data, $overrideData);
// Change sorting direction is already sorted on current attribute
if (isset($overrideData['sort']) && $overrideData['sort'] === $data['sort']) {
$queryData['order'] = ($data['order'] === 'asc') ? 'desc' : 'asc';
} else {
$queryData['order'] = 'asc';
}
foreach ($queryData as $name => $value) {
$trimmedVal = trim($value);
if ($trimmedVal === '') continue;
$queryStringSections[] = urlencode($name) . '=' . urlencode($trimmedVal);
}
if (count($queryStringSections) === 0) return $path;
return baseUrl($path . '?' . implode('&', $queryStringSections));
}

View File

@@ -14,6 +14,7 @@ define('LARAVEL_START', microtime(true));
|
*/
require __DIR__.'/../app/helpers.php';
require __DIR__.'/../vendor/autoload.php';
/*

View File

@@ -29,10 +29,7 @@
],
"psr-4": {
"BookStack\\": "app/"
},
"files": [
"app/helpers.php"
]
}
},
"autoload-dev": {
"classmap": [

View File

@@ -31,7 +31,7 @@ return [
|
*/
'url' => env('APP_URL', 'http://localhost'),
'url' => env('APP_URL', '') === 'http://bookstack.dev' ? '' : env('APP_URL', ''),
/*
|--------------------------------------------------------------------------
@@ -130,7 +130,6 @@ return [
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
@@ -153,6 +152,8 @@ return [
/*
* Application Service Providers...
*/
BookStack\Providers\PaginationServiceProvider::class,
BookStack\Providers\AuthServiceProvider::class,
BookStack\Providers\AppServiceProvider::class,
BookStack\Providers\EventServiceProvider::class,

View File

@@ -84,8 +84,8 @@ return [
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'bookstack-test',
'username' => 'bookstack-test',
'password' => 'bookstack-test',
'username' => env('MYSQL_USER', 'bookstack-test'),
'password' => env('MYSQL_PASSWORD', 'bookstack-test'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
@@ -139,6 +139,6 @@ return [
|
*/
'redis' => $redisConfig,
'redis' => env('REDIS_SERVERS', false) ? $redisConfig : [],
];

View File

@@ -5,6 +5,11 @@
*/
return [
'app-editor' => 'wysiwyg'
'app-name' => 'BookStack',
'app-editor' => 'wysiwyg',
'app-color' => '#0288D1',
'app-color-light' => 'rgba(21, 101, 192, 0.15)',
'app-custom-head' => false,
'registration-enabled' => false,
];

View File

@@ -52,4 +52,11 @@ $factory->define(BookStack\Role::class, function ($faker) {
'display_name' => $faker->sentence(3),
'description' => $faker->sentence(10)
];
});
$factory->define(BookStack\Tag::class, function ($faker) {
return [
'name' => $faker->city,
'value' => $faker->sentence(3)
];
});

View File

@@ -21,10 +21,13 @@ class CreateUsersTable extends Migration
$table->nullableTimestamps();
});
\BookStack\User::forceCreate([
// Create the initial admin user
DB::table('users')->insert([
'name' => 'Admin',
'email' => 'admin@admin.com',
'password' => bcrypt('password')
'password' => bcrypt('password'),
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
}

View File

@@ -12,7 +12,13 @@ class CreateBooksTable extends Migration
*/
public function up()
{
Schema::create('books', function (Blueprint $table) {
$pdo = \DB::connection()->getPdo();
$mysqlVersion = $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
$requiresISAM = strpos($mysqlVersion, '5.5') === 0;
Schema::create('books', function (Blueprint $table) use ($requiresISAM) {
if($requiresISAM) $table->engine = 'MyISAM';
$table->increments('id');
$table->string('name');
$table->string('slug')->indexed();

View File

@@ -12,7 +12,13 @@ class CreatePagesTable extends Migration
*/
public function up()
{
Schema::create('pages', function (Blueprint $table) {
$pdo = \DB::connection()->getPdo();
$mysqlVersion = $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
$requiresISAM = strpos($mysqlVersion, '5.5') === 0;
Schema::create('pages', function (Blueprint $table) use ($requiresISAM) {
if($requiresISAM) $table->engine = 'MyISAM';
$table->increments('id');
$table->integer('book_id');
$table->integer('chapter_id');

View File

@@ -12,7 +12,12 @@ class CreateChaptersTable extends Migration
*/
public function up()
{
Schema::create('chapters', function (Blueprint $table) {
$pdo = \DB::connection()->getPdo();
$mysqlVersion = $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
$requiresISAM = strpos($mysqlVersion, '5.5') === 0;
Schema::create('chapters', function (Blueprint $table) use ($requiresISAM) {
if($requiresISAM) $table->engine = 'MyISAM';
$table->increments('id');
$table->integer('book_id');
$table->string('slug')->indexed();

View File

@@ -68,35 +68,44 @@ class AddRolesAndPermissions extends Migration
// Create default roles
$admin = new \BookStack\Role();
$admin->name = 'admin';
$admin->display_name = 'Admin';
$admin->description = 'Administrator of the whole application';
$admin->save();
$adminId = DB::table('roles')->insertGetId([
'name' => 'admin',
'display_name' => 'Admin',
'description' => 'Administrator of the whole application',
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
$editorId = DB::table('roles')->insertGetId([
'name' => 'editor',
'display_name' => 'Editor',
'description' => 'User can edit Books, Chapters & Pages',
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
$viewerId = DB::table('roles')->insertGetId([
'name' => 'viewer',
'display_name' => 'Viewer',
'description' => 'User can view books & their content behind authentication',
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
$editor = new \BookStack\Role();
$editor->name = 'editor';
$editor->display_name = 'Editor';
$editor->description = 'User can edit Books, Chapters & Pages';
$editor->save();
$viewer = new \BookStack\Role();
$viewer->name = 'viewer';
$viewer->display_name = 'Viewer';
$viewer->description = 'User can view books & their content behind authentication';
$viewer->save();
// Create default CRUD permissions and allocate to admins and editors
$entities = ['Book', 'Page', 'Chapter', 'Image'];
$ops = ['Create', 'Update', 'Delete'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$newPermission = new \BookStack\Permission();
$newPermission->name = strtolower($entity) . '-' . strtolower($op);
$newPermission->display_name = $op . ' ' . $entity . 's';
$newPermission->save();
$admin->attachPermission($newPermission);
$editor->attachPermission($newPermission);
$newPermId = DB::table('permissions')->insertGetId([
'name' => strtolower($entity) . '-' . strtolower($op),
'display_name' => $op . ' ' . $entity . 's',
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
DB::table('permission_role')->insert([
['permission_id' => $newPermId, 'role_id' => $adminId],
['permission_id' => $newPermId, 'role_id' => $editorId]
]);
}
}
@@ -105,19 +114,27 @@ class AddRolesAndPermissions extends Migration
$ops = ['Create', 'Update', 'Delete'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$newPermission = new \BookStack\Permission();
$newPermission->name = strtolower($entity) . '-' . strtolower($op);
$newPermission->display_name = $op . ' ' . $entity;
$newPermission->save();
$admin->attachPermission($newPermission);
$newPermId = DB::table('permissions')->insertGetId([
'name' => strtolower($entity) . '-' . strtolower($op),
'display_name' => $op . ' ' . $entity,
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
DB::table('permission_role')->insert([
'permission_id' => $newPermId,
'role_id' => $adminId
]);
}
}
// Set all current users as admins
// (At this point only the initially create user should be an admin)
$users = \BookStack\User::all();
$users = DB::table('users')->get();
foreach ($users as $user) {
$user->attachRole($admin);
DB::table('role_user')->insert([
'role_id' => $adminId,
'user_id' => $user->id
]);
}
}

View File

@@ -13,29 +13,31 @@ class UpdatePermissionsAndRoles extends Migration
public function up()
{
// Get roles with permissions we need to change
$adminRole = \BookStack\Role::getRole('admin');
$editorRole = \BookStack\Role::getRole('editor');
$adminRoleId = DB::table('roles')->where('name', '=', 'admin')->first()->id;
$editorRole = DB::table('roles')->where('name', '=', 'editor')->first();
// Delete old permissions
$permissions = \BookStack\Permission::all();
$permissions->each(function ($permission) {
$permission->delete();
});
$permissions = DB::table('permissions')->delete();
// Create & attach new admin permissions
$permissionsToCreate = [
'settings-manage' => 'Manage Settings',
'users-manage' => 'Manage Users',
'user-roles-manage' => 'Manage Roles & Permissions',
'restrictions-manage-all' => 'Manage All Entity Restrictions',
'restrictions-manage-own' => 'Manage Entity Restrictions On Own Content'
'restrictions-manage-all' => 'Manage All Entity Permissions',
'restrictions-manage-own' => 'Manage Entity Permissions On Own Content'
];
foreach ($permissionsToCreate as $name => $displayName) {
$newPermission = new \BookStack\Permission();
$newPermission->name = $name;
$newPermission->display_name = $displayName;
$newPermission->save();
$adminRole->attachPermission($newPermission);
$permissionId = DB::table('permissions')->insertGetId([
'name' => $name,
'display_name' => $displayName,
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
DB::table('permission_role')->insert([
'role_id' => $adminRoleId,
'permission_id' => $permissionId
]);
}
// Create & attach new entity permissions
@@ -43,12 +45,22 @@ class UpdatePermissionsAndRoles extends Migration
$ops = ['Create All', 'Create Own', 'Update All', 'Update Own', 'Delete All', 'Delete Own'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$newPermission = new \BookStack\Permission();
$newPermission->name = strtolower($entity) . '-' . strtolower(str_replace(' ', '-', $op));
$newPermission->display_name = $op . ' ' . $entity . 's';
$newPermission->save();
$adminRole->attachPermission($newPermission);
if ($editorRole !== null) $editorRole->attachPermission($newPermission);
$permissionId = DB::table('permissions')->insertGetId([
'name' => strtolower($entity) . '-' . strtolower(str_replace(' ', '-', $op)),
'display_name' => $op . ' ' . $entity . 's',
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
DB::table('permission_role')->insert([
'role_id' => $adminRoleId,
'permission_id' => $permissionId
]);
if ($editorRole !== null) {
DB::table('permission_role')->insert([
'role_id' => $editorRole->id,
'permission_id' => $permissionId
]);
}
}
}
@@ -62,24 +74,26 @@ class UpdatePermissionsAndRoles extends Migration
public function down()
{
// Get roles with permissions we need to change
$adminRole = \BookStack\Role::getRole('admin');
$adminRoleId = DB::table('roles')->where('name', '=', 'admin')->first()->id;
// Delete old permissions
$permissions = \BookStack\Permission::all();
$permissions->each(function ($permission) {
$permission->delete();
});
$permissions = DB::table('permissions')->delete();
// Create default CRUD permissions and allocate to admins and editors
$entities = ['Book', 'Page', 'Chapter', 'Image'];
$ops = ['Create', 'Update', 'Delete'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$newPermission = new \BookStack\Permission();
$newPermission->name = strtolower($entity) . '-' . strtolower($op);
$newPermission->display_name = $op . ' ' . $entity . 's';
$newPermission->save();
$adminRole->attachPermission($newPermission);
$permissionId = DB::table('permissions')->insertGetId([
'name' => strtolower($entity) . '-' . strtolower($op),
'display_name' => $op . ' ' . $entity . 's',
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
DB::table('permission_role')->insert([
'role_id' => $adminRoleId,
'permission_id' => $permissionId
]);
}
}
@@ -88,11 +102,16 @@ class UpdatePermissionsAndRoles extends Migration
$ops = ['Create', 'Update', 'Delete'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$newPermission = new \BookStack\Permission();
$newPermission->name = strtolower($entity) . '-' . strtolower($op);
$newPermission->display_name = $op . ' ' . $entity;
$newPermission->save();
$adminRole->attachPermission($newPermission);
$permissionId = DB::table('permissions')->insertGetId([
'name' => strtolower($entity) . '-' . strtolower($op),
'display_name' => $op . ' ' . $entity,
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
DB::table('permission_role')->insert([
'role_id' => $adminRoleId,
'permission_id' => $permissionId
]);
}
}
}

View File

@@ -0,0 +1,58 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddViewPermissionsToRoles extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$currentRoles = DB::table('roles')->get();
// Create new view permission
$entities = ['Book', 'Page', 'Chapter'];
$ops = ['View All', 'View Own'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$permId = DB::table('permissions')->insertGetId([
'name' => strtolower($entity) . '-' . strtolower(str_replace(' ', '-', $op)),
'display_name' => $op . ' ' . $entity . 's',
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
// Assign view permission to all current roles
foreach ($currentRoles as $role) {
DB::table('permission_role')->insert([
'role_id' => $role->id,
'permission_id' => $permId
]);
}
}
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// Delete the new view permission
$entities = ['Book', 'Page', 'Chapter'];
$ops = ['View All', 'View Own'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$permissionName = strtolower($entity) . '-' . strtolower(str_replace(' ', '-', $op));
$permission = DB::table('permissions')->where('name', '=', $permissionName)->first();
DB::table('permission_role')->where('permission_id', '=', $permission->id)->delete();
DB::table('permissions')->where('name', '=', $permissionName)->delete();
}
}
}
}

View File

@@ -0,0 +1,103 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateJointPermissionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('joint_permissions', function (Blueprint $table) {
$table->increments('id');
$table->integer('role_id');
$table->string('entity_type');
$table->integer('entity_id');
$table->string('action');
$table->boolean('has_permission')->default(false);
$table->boolean('has_permission_own')->default(false);
$table->integer('created_by');
// Create indexes
$table->index(['entity_id', 'entity_type']);
$table->index('has_permission');
$table->index('has_permission_own');
$table->index('role_id');
$table->index('action');
$table->index('created_by');
});
Schema::table('roles', function (Blueprint $table) {
$table->string('system_name');
$table->boolean('hidden')->default(false);
$table->index('hidden');
$table->index('system_name');
});
Schema::rename('permissions', 'role_permissions');
Schema::rename('restrictions', 'entity_permissions');
// Create the new public role
$publicRoleData = [
'name' => 'public',
'display_name' => 'Public',
'description' => 'The role given to public visitors if allowed',
'system_name' => 'public',
'hidden' => true,
'created_at' => \Carbon\Carbon::now()->toDateTimeString(),
'updated_at' => \Carbon\Carbon::now()->toDateTimeString()
];
// Ensure unique name
while (DB::table('roles')->where('name', '=', $publicRoleData['display_name'])->count() > 0) {
$publicRoleData['display_name'] = $publicRoleData['display_name'] . str_random(2);
}
$publicRoleId = DB::table('roles')->insertGetId($publicRoleData);
// Add new view permissions to public role
$entities = ['Book', 'Page', 'Chapter'];
$ops = ['View All', 'View Own'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$name = strtolower($entity) . '-' . strtolower(str_replace(' ', '-', $op));
$permission = DB::table('role_permissions')->where('name', '=', $name)->first();
// Assign view permission to public
DB::table('permission_role')->insert([
'permission_id' => $permission->id,
'role_id' => $publicRoleId
]);
}
}
// Update admin role with system name
DB::table('roles')->where('name', '=', 'admin')->update(['system_name' => 'admin']);
// Generate the new entity jointPermissions
$restrictionService = app(\BookStack\Services\PermissionService::class);
$restrictionService->buildJointPermissions();
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('joint_permissions');
Schema::rename('role_permissions', 'permissions');
Schema::rename('entity_permissions', 'restrictions');
// Delete the public role
DB::table('roles')->where('system_name', '=', 'public')->delete();
Schema::table('roles', function (Blueprint $table) {
$table->dropColumn('system_name');
$table->dropColumn('hidden');
});
}
}

View File

@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateTagsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->increments('id');
$table->integer('entity_id');
$table->string('entity_type', 100);
$table->string('name');
$table->string('value');
$table->integer('order');
$table->timestamps();
$table->index('name');
$table->index('value');
$table->index('order');
$table->index(['entity_id', 'entity_type']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('tags');
}
}

View File

@@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddSummaryToPageRevisions extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('page_revisions', function ($table) {
$table->string('summary')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('page_revisions', function ($table) {
$table->dropColumn('summary');
});
}
}

View File

@@ -20,12 +20,15 @@ class DummyContentSeeder extends Seeder
->each(function($book) use ($user) {
$chapters = factory(BookStack\Chapter::class, 5)->create(['created_by' => $user->id, 'updated_by' => $user->id])
->each(function($chapter) use ($user, $book){
$pages = factory(\BookStack\Page::class, 10)->make(['created_by' => $user->id, 'updated_by' => $user->id, 'book_id' => $book->id]);
$pages = factory(\BookStack\Page::class, 5)->make(['created_by' => $user->id, 'updated_by' => $user->id, 'book_id' => $book->id]);
$chapter->pages()->saveMany($pages);
});
$pages = factory(\BookStack\Page::class, 3)->make(['created_by' => $user->id, 'updated_by' => $user->id]);
$book->chapters()->saveMany($chapters);
$book->pages()->saveMany($pages);
});
$restrictionService = app(\BookStack\Services\PermissionService::class);
$restrictionService->buildJointPermissions();
}
}

View File

@@ -4,14 +4,15 @@
"gulp": "^3.9.0"
},
"dependencies": {
"angular": "^1.5.0-rc.0",
"angular-animate": "^1.5.0-rc.0",
"angular-resource": "^1.5.0-rc.0",
"angular-sanitize": "^1.5.0-rc.0",
"angular": "^1.5.5",
"angular-animate": "^1.5.5",
"angular-resource": "^1.5.5",
"angular-sanitize": "^1.5.5",
"angular-ui-sortable": "^0.14.0",
"babel-runtime": "^5.8.29",
"bootstrap-sass": "^3.0.0",
"dropzone": "^4.0.1",
"laravel-elixir": "^3.4.0",
"laravel-elixir": "^5.0.0",
"marked": "^0.3.5",
"moment": "^2.12.0",
"zeroclipboard": "^2.2.0"

View File

@@ -28,11 +28,12 @@
<env name="DB_CONNECTION" value="mysql_testing"/>
<env name="MAIL_DRIVER" value="log"/>
<env name="AUTH_METHOD" value="standard"/>
<env name="DISABLE_EXTERNAL_SERVICES" value="false"/>
<env name="DISABLE_EXTERNAL_SERVICES" value="true"/>
<env name="LDAP_VERSION" value="3"/>
<env name="GITHUB_APP_ID" value="aaaaaaaaaaaaaa"/>
<env name="GITHUB_APP_SECRET" value="aaaaaaaaaaaaaa"/>
<env name="GOOGLE_APP_ID" value="aaaaaaaaaaaaaa"/>
<env name="GOOGLE_APP_SECRET" value="aaaaaaaaaaaaaa"/>
<env name="APP_URL" value="http://bookstack.dev"/>
</php>
</phpunit>

View File

@@ -1,5 +1,5 @@
{
"css/styles.css": "css/styles.css?version=b7e7aa9",
"css/print-styles.css": "css/print-styles.css?version=b7e7aa9",
"js/common.js": "js/common.js?version=b7e7aa9"
"css/styles.css": "css/styles.css?version=5be13a8",
"css/print-styles.css": "css/print-styles.css?version=5be13a8",
"js/common.js": "js/common.js?version=5be13a8"
}

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
.faded-small,.print-hidden,header{display:none}body{font-size:12px}.page-content{margin:0 auto}.print-full-width{width:100%;float:none;display:block}h2{font-size:2em;line-height:1;margin-top:.6em;margin-bottom:.3em}
header{display:none}body{font-size:12px}.faded-small{display:none}.page-content{margin:0 auto}.print-hidden{display:none}.print-full-width{width:100%;float:none;display:block}h2{font-size:2em;line-height:1;margin-top:.6em;margin-bottom:.3em}

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -1,675 +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">
<metadata></metadata>
<defs>
<font id="robotobold" horiz-adv-x="1175" >
<font-face units-per-em="2048" ascent="1536" descent="-512" />
<missing-glyph horiz-adv-x="510" />
<glyph unicode="&#xfb01;" horiz-adv-x="1246" d="M20 870v212h161v50q2 204 125.5 314.5t348.5 110.5q135 0 328 -59l-42 -239q-98 29 -152 37.5t-116 8.5q-202 0 -202 -179v-44h213v-212h-213v-870h-290v870h-161zM828 0v1082h290v-1082h-290z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1255" d="M29 870v212h161v84q2 188 118 289.5t328 101.5q151 0 490 -32v-1525h-290v1312q-86 10 -160 10q-196 0 -196 -167v-73h215v-212h-215v-870h-290v870h-161z" />
<glyph horiz-adv-x="0" />
<glyph horiz-adv-x="0" />
<glyph unicode="&#xd;" horiz-adv-x="510" />
<glyph horiz-adv-x="0" />
<glyph unicode=" " horiz-adv-x="510" />
<glyph unicode="&#x09;" horiz-adv-x="510" />
<glyph unicode="&#xa0;" horiz-adv-x="510" />
<glyph unicode="!" horiz-adv-x="557" d="M124 136q0 66 44.5 109.5t116.5 43.5q73 0 117.5 -43t44.5 -110q0 -66 -44.5 -109t-117.5 -43q-72 0 -116.5 43t-44.5 109zM131 1456h308l-34 -1009h-240z" />
<glyph unicode="&#x22;" horiz-adv-x="657" d="M64 987v549h202v-138l-40 -411h-162zM390 987v549h201v-138l-39 -411h-162z" />
<glyph unicode="#" horiz-adv-x="1220" d="M64 410v172h257l50 284h-232v174h263l73 416h182l-73 -416h194l73 416h183l-73 -416h219v-174h-250l-50 -284h224v-172h-254l-72 -410h-183l72 410h-193l-72 -410h-183l72 410h-227zM504 582h193l50 284h-194z" />
<glyph unicode="$" d="M92 457h289q0 -119 56.5 -182.5t162.5 -63.5q88 0 139 46.5t51 125.5q0 82 -45.5 130.5t-154.5 89.5t-188 81.5t-135.5 93t-88 123.5t-31.5 169q0 169 108 277t287 126v214h160v-217q177 -25 277 -147.5t100 -317.5h-289q0 120 -49.5 179.5t-132.5 59.5q-82 0 -127 -46.5 t-45 -128.5q0 -76 44 -122t163.5 -94t196.5 -90.5t130 -96t81 -122t28 -159.5q0 -170 -106 -276t-292 -125v-199h-159v198q-205 22 -317.5 145.5t-112.5 328.5z" />
<glyph unicode="%" horiz-adv-x="1512" d="M95 1105v71q0 134 87 217.5t228 83.5q143 0 230 -82.5t87 -223.5v-72q0 -135 -87 -217t-228 -82q-142 0 -229.5 82.5t-87.5 222.5zM287 1099q0 -60 34.5 -96.5t90.5 -36.5t89 37t33 99v74q0 60 -33 97t-91 37q-55 0 -89 -36.5t-34 -101.5v-73zM328 185l711 1138l141 -76 l-711 -1138zM791 283v74q0 135 88 217.5t228 82.5q142 0 229.5 -81.5t87.5 -224.5v-72q0 -134 -86 -216.5t-229 -82.5q-144 0 -231 83t-87 220zM983 279q0 -55 36 -94t90 -39q122 0 122 135v76q0 60 -34 96.5t-90 36.5t-90 -36.5t-34 -99.5v-75z" />
<glyph unicode="&#x26;" horiz-adv-x="1344" d="M71 392q0 101 56.5 187t207.5 191q-65 87 -102 163.5t-37 159.5q0 170 107.5 276.5t289.5 106.5q163 0 267.5 -97t104.5 -242q0 -174 -176 -307l-112 -81l251 -292q59 116 59 256h246q0 -284 -131 -460l218 -253h-328l-75 86q-161 -106 -370 -106q-216 0 -346 113.5 t-130 298.5zM361 408q0 -87 55.5 -141.5t144.5 -54.5q104 0 197 58l-287 332l-21 -15q-89 -76 -89 -179zM455 1097q0 -75 88 -189l77 51q59 38 81.5 74t22.5 86t-37 87t-95 37q-62 0 -99.5 -40t-37.5 -106z" />
<glyph unicode="'" horiz-adv-x="331" d="M63 985v551h212v-147l-29 -404h-183z" />
<glyph unicode="(" horiz-adv-x="719" d="M124 539v53q0 229 61 436t180 366.5t258 221.5l56 -156q-146 -108 -228 -334t-82 -528v-31q0 -303 81 -530t229 -339l-56 -153q-136 61 -253.5 215.5t-179.5 356.5t-66 422z" />
<glyph unicode=")" horiz-adv-x="722" d="M40 -302q142 107 224 330t85 513v53q0 299 -81.5 527t-227.5 342l56 153q136 -59 256.5 -214t187 -361t69.5 -427v-45q0 -226 -65 -435t-187 -369t-261 -220z" />
<glyph unicode="*" horiz-adv-x="928" d="M27 1051l59 181l311 -125l-20 349h196l-20 -356l303 123l59 -183l-320 -89l210 -266l-159 -113l-182 292l-180 -282l-159 108l216 272z" />
<glyph unicode="+" horiz-adv-x="1118" d="M57 554v261h362v391h275v-391h361v-261h-361v-408h-275v408h-362z" />
<glyph unicode="," horiz-adv-x="500" d="M35 -286l36 65q67 122 69 243v224h244l-1 -200q-1 -111 -56 -224t-141 -187z" />
<glyph unicode="-" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
<glyph unicode="." horiz-adv-x="595" d="M126 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
<glyph unicode="/" horiz-adv-x="765" d="M-13 -125l536 1581h215l-536 -1581h-215z" />
<glyph unicode="0" d="M95 587v268q0 305 126.5 463t364.5 158t364 -156.5t129 -449.5v-268q0 -302 -125 -462t-366 -160q-238 0 -364 157t-129 450zM384 564q0 -178 48.5 -264.5t155.5 -86.5q106 0 153 83t49 254v346q0 181 -49.5 263.5t-154.5 82.5q-102 0 -150.5 -78.5t-51.5 -245.5v-354z " />
<glyph unicode="1" d="M167 1007v235l603 216h31v-1458h-289v1114z" />
<glyph unicode="2" d="M70 998q0 133 63.5 243t179.5 172.5t263 62.5q225 0 349.5 -108t124.5 -305q0 -108 -56 -220t-192 -261l-331 -349h626v-233h-998v198l471 502q97 106 143.5 185t46.5 150q0 97 -49 152.5t-140 55.5q-98 0 -154.5 -67.5t-56.5 -177.5h-290z" />
<glyph unicode="3" d="M64 399h289q0 -82 61.5 -134t151.5 -52q103 0 161.5 54.5t58.5 144.5q0 218 -240 218h-153v226h154q110 0 163 55t53 146q0 88 -52.5 137t-144.5 49q-83 0 -139 -45.5t-56 -118.5h-289q0 114 61.5 204.5t172 141.5t243.5 51q231 0 362 -110.5t131 -304.5q0 -100 -61 -184 t-160 -129q123 -44 183.5 -132t60.5 -208q0 -194 -141.5 -311t-374.5 -117q-218 0 -356.5 115t-138.5 304z" />
<glyph unicode="4" d="M55 497l607 959h292v-908h165v-233h-165v-315h-289v315h-597zM343 548h322v514l-19 -33z" />
<glyph unicode="5" d="M105 405h286q9 -91 63.5 -141.5t142.5 -50.5q98 0 151 70.5t53 199.5q0 124 -61 190t-173 66q-103 0 -167 -54l-28 -26l-230 57l84 740h816v-241h-579l-36 -313q103 55 219 55q208 0 326 -129t118 -361q0 -141 -59.5 -252.5t-170.5 -173t-262 -61.5q-132 0 -245 53.5 t-178.5 150.5t-69.5 221z" />
<glyph unicode="6" d="M100 567v104q0 237 89.5 418.5t257 281t388.5 100.5h48v-238h-28q-196 -3 -315.5 -102t-143.5 -275q116 118 293 118q190 0 302 -136t112 -358q0 -142 -61.5 -257t-174 -179t-254.5 -64q-230 0 -371.5 160t-141.5 427zM390 521q0 -145 57 -226.5t160 -81.5 q93 0 150.5 73.5t57.5 190.5q0 119 -58 192t-156 73q-70 0 -127 -36.5t-84 -96.5v-88z" />
<glyph unicode="7" d="M61 1222v234h1028v-162l-563 -1294h-305l564 1222h-724z" />
<glyph unicode="8" d="M95 399q0 121 62 211t167 140q-93 49 -145.5 131t-52.5 188q0 186 124 296.5t337 110.5q212 0 336.5 -109.5t124.5 -297.5q0 -106 -53 -188t-146 -131q106 -51 168 -140.5t62 -210.5q0 -194 -132 -306.5t-359 -112.5t-360 113t-133 306zM384 420q0 -93 54 -150t150 -57 q94 0 147.5 55t53.5 152q0 95 -55 152t-148 57q-92 0 -147 -56.5t-55 -152.5zM416 1055q0 -87 45 -140t127 -53t126.5 53t44.5 140q0 85 -45 136.5t-127 51.5q-81 0 -126 -50t-45 -138z" />
<glyph unicode="9" d="M86 961q0 143 62.5 262.5t174.5 186t252 66.5q144 0 256 -72t174 -207t63 -309v-107q0 -364 -181 -572t-513 -222l-71 -1v241l64 1q377 17 408 354q-113 -111 -264 -111q-193 0 -309 132.5t-116 357.5zM374 964q0 -119 54.5 -195.5t153.5 -76.5q70 0 120.5 36t76.5 87 v119q0 147 -56 228t-150 81q-87 0 -143 -79.5t-56 -199.5z" />
<glyph unicode=":" horiz-adv-x="578" d="M125 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5zM125 961q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
<glyph unicode=";" horiz-adv-x="537" d="M57 -286l36 65q67 122 69 243v224h244l-1 -200q-1 -111 -56 -224t-141 -187zM108 961q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
<glyph unicode="&#x3c;" horiz-adv-x="1042" d="M54 502v236l861 365v-280l-570 -205l570 -201v-280z" />
<glyph unicode="=" horiz-adv-x="1172" d="M136 313v236h894v-236h-894zM136 746v236h894v-236h-894z" />
<glyph unicode="&#x3e;" horiz-adv-x="1058" d="M120 136v279l581 206l-581 203v278l871 -365v-235z" />
<glyph unicode="?" horiz-adv-x="1019" d="M45 1069q2 191 123.5 299t331.5 108q212 0 329 -102.5t117 -289.5q0 -85 -38 -160.5t-133 -167.5l-81 -77q-76 -73 -87 -171l-4 -61h-256q0 140 34 223t124.5 163.5t120.5 131t30 106.5q0 169 -156 169q-74 0 -118.5 -45.5t-46.5 -125.5h-290zM318 140q0 67 45.5 110.5 t116.5 43.5t116.5 -43.5t45.5 -110.5q0 -66 -44.5 -109t-117.5 -43t-117.5 43t-44.5 109z" />
<glyph unicode="@" horiz-adv-x="1833" d="M87 463q12 276 126 495t310.5 338.5t443.5 119.5q251 0 432 -107.5t271 -307.5t79 -465q-11 -256 -126.5 -406.5t-310.5 -150.5q-86 0 -148.5 37t-94.5 106q-100 -140 -261 -140q-146 0 -226 123t-60 325q18 165 83.5 293.5t165.5 197.5t216 69q143 0 244 -66l63 -43 l-51 -578q-10 -79 17.5 -121t87.5 -42q92 0 154 107.5t68 281.5q17 349 -140.5 536.5t-466.5 187.5q-193 0 -344 -98t-238 -278.5t-98 -413.5q-16 -354 142 -547.5t473 -193.5q83 0 174 18.5t157 49.5l38 -154q-61 -40 -164.5 -64.5t-208.5 -24.5q-264 0 -450 106.5 t-277.5 314t-79.5 495.5zM744 430q-11 -132 23 -200.5t110 -68.5q49 0 93 43t73 124l42 473q-39 13 -80 13q-115 0 -178.5 -98t-82.5 -286z" />
<glyph unicode="A" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM507 543h364l-183 545z" />
<glyph unicode="B" horiz-adv-x="1307" d="M130 0v1456h510q265 0 402 -101.5t137 -297.5q0 -107 -55 -188.5t-153 -119.5q112 -28 176.5 -113t64.5 -208q0 -210 -134 -318t-382 -110h-566zM430 241h257q106 0 165.5 50.5t59.5 139.5q0 200 -207 203h-275v-393zM430 846h222q227 4 227 181q0 99 -57.5 142.5 t-181.5 43.5h-210v-367z" />
<glyph unicode="C" horiz-adv-x="1340" d="M86 686v89q0 210 74 370t211.5 245.5t319.5 85.5q252 0 406 -135t178 -379h-300q-11 141 -78.5 204.5t-205.5 63.5q-150 0 -224.5 -107.5t-76.5 -333.5v-110q0 -236 71.5 -345t225.5 -109q139 0 207.5 63.5t78.5 196.5h300q-17 -235 -173.5 -370t-412.5 -135 q-280 0 -440.5 188.5t-160.5 517.5z" />
<glyph unicode="D" horiz-adv-x="1331" d="M130 0v1456h448q192 0 343.5 -86.5t236.5 -246t85 -362.5v-67q0 -203 -83.5 -361t-235.5 -245t-343 -88h-451zM430 241h145q176 0 269 115t95 329v77q0 222 -92 336.5t-269 114.5h-148v-972z" />
<glyph unicode="E" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976z" />
<glyph unicode="F" horiz-adv-x="1122" d="M130 0v1456h948v-243h-648v-376h576v-242h-576v-595h-300z" />
<glyph unicode="G" horiz-adv-x="1395" d="M94 671v99q0 218 73.5 377.5t212 244t324.5 84.5q259 0 405 -123.5t173 -359.5h-292q-20 125 -88.5 183t-188.5 58q-153 0 -233 -115t-81 -342v-93q0 -229 87 -346t255 -117q169 0 241 72v251h-273v221h573v-581q-81 -97 -229 -150.5t-328 -53.5q-189 0 -331.5 82.5 t-220 239.5t-79.5 369z" />
<glyph unicode="H" horiz-adv-x="1447" d="M130 0v1456h300v-590h585v590h300v-1456h-300v624h-585v-624h-300z" />
<glyph unicode="I" horiz-adv-x="597" d="M149 0v1456h300v-1456h-300z" />
<glyph unicode="J" horiz-adv-x="1144" d="M40 430h302q0 -107 45 -158t142 -51q86 0 137 59t51 168v1008h300v-1008q0 -139 -61.5 -245.5t-173.5 -164.5t-253 -58q-231 0 -360 117.5t-129 332.5z" />
<glyph unicode="K" horiz-adv-x="1300" d="M130 0v1456h300v-660l132 181l371 479h369l-517 -647l532 -809h-357l-374 584l-156 -168v-416h-300z" />
<glyph unicode="L" horiz-adv-x="1109" d="M130 0v1456h300v-1215h637v-241h-937z" />
<glyph unicode="M" horiz-adv-x="1794" d="M130 0v1456h392l374 -1056l372 1056h394v-1456h-301v398l30 687l-393 -1085h-206l-392 1084l30 -686v-398h-300z" />
<glyph unicode="N" horiz-adv-x="1446" d="M130 0v1456h300l585 -960v960h299v-1456h-300l-584 958v-958h-300z" />
<glyph unicode="O" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119 q-151 0 -233 -117.5t-83 -344.5v-71z" />
<glyph unicode="P" horiz-adv-x="1321" d="M130 0v1456h568q164 0 288.5 -60t191.5 -170.5t67 -251.5q0 -214 -146.5 -337.5t-405.5 -123.5h-263v-513h-300zM430 756h268q119 0 181.5 56t62.5 160q0 107 -63 173t-174 68h-275v-457z" />
<glyph unicode="Q" horiz-adv-x="1414" d="M84 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -204 -66 -354.5t-183 -241.5l242 -190l-191 -169l-310 249q-53 -9 -110 -9q-181 0 -323 87t-220 248.5t-79 371.5zM388 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5 v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
<glyph unicode="R" horiz-adv-x="1307" d="M130 0v1456h541q258 0 398 -115t140 -325q0 -149 -64.5 -248.5t-195.5 -158.5l315 -595v-14h-322l-273 533h-239v-533h-300zM430 776h242q113 0 175 57.5t62 158.5q0 103 -58.5 162t-179.5 59h-241v-437z" />
<glyph unicode="S" horiz-adv-x="1259" d="M69 458h301q0 -241 288 -241q107 0 167 43.5t60 121.5q0 85 -60 130.5t-216 96t-247 99.5q-248 134 -248 361q0 118 66.5 210.5t191 144.5t279.5 52q156 0 278 -56.5t189.5 -159.5t67.5 -234h-300q0 100 -63 155.5t-177 55.5q-110 0 -171 -46.5t-61 -122.5 q0 -71 71.5 -119t210.5 -90q256 -77 373 -191t117 -284q0 -189 -143 -296.5t-385 -107.5q-168 0 -306 61.5t-210.5 168.5t-72.5 248z" />
<glyph unicode="T" horiz-adv-x="1267" d="M40 1213v243h1186v-243h-446v-1213h-300v1213h-440z" />
<glyph unicode="U" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371z" />
<glyph unicode="V" horiz-adv-x="1339" d="M7 1456h333l328 -1095l330 1095h334l-507 -1456h-313z" />
<glyph unicode="W" horiz-adv-x="1791" d="M35 1456h299l197 -1034l240 1034h254l239 -1036l196 1036h299l-323 -1456h-302l-237 974l-237 -974h-302z" />
<glyph unicode="X" horiz-adv-x="1301" d="M22 0l435 734l-424 722h345l273 -502l273 502h345l-424 -722l435 -734h-349l-280 510l-280 -510h-349z" />
<glyph unicode="Y" horiz-adv-x="1266" d="M2 1456h329l301 -656l303 656h328l-478 -928v-528h-305v528z" />
<glyph unicode="Z" horiz-adv-x="1241" d="M73 0v176l720 1037h-719v243h1092v-172l-718 -1043h734v-241h-1109z" />
<glyph unicode="[" horiz-adv-x="569" d="M120 -339v2033h432v-223h-142v-1587h142v-223h-432z" />
<glyph unicode="\" horiz-adv-x="864" d="M0 1456h295l608 -1581h-296z" />
<glyph unicode="]" horiz-adv-x="569" d="M13 -116h143v1587h-143v223h432v-2033h-432v223z" />
<glyph unicode="^" horiz-adv-x="895" d="M44 729l299 727h210l299 -727h-229l-175 457l-174 -457h-230z" />
<glyph unicode="_" horiz-adv-x="914" d="M1 0h911v-226h-911v226z" />
<glyph unicode="`" horiz-adv-x="677" d="M52 1536h315l198 -310h-237z" />
<glyph unicode="a" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150z" />
<glyph unicode="b" horiz-adv-x="1153" d="M111 0v1536h289v-551q100 117 263 117q198 0 310.5 -145.5t112.5 -409.5v-16q0 -260 -111 -405.5t-310 -145.5q-176 0 -281 135l-13 -115h-260zM400 327q53 -114 192 -114q140 0 184 138q21 66 21 201q0 164 -52 239.5t-155 75.5q-138 0 -190 -113v-427z" />
<glyph unicode="c" horiz-adv-x="1068" d="M66 535v19q0 250 133 399t365 149q203 0 325.5 -115.5t124.5 -307.5h-271q-2 84 -52 136.5t-132 52.5q-101 0 -152.5 -73.5t-51.5 -238.5v-30q0 -167 51 -240t155 -73q80 0 130 44t52 117h271q-1 -110 -60 -201.5t-161.5 -142t-226.5 -50.5q-232 0 -366 147.5t-134 407.5 z" />
<glyph unicode="d" horiz-adv-x="1154" d="M66 549q0 253 113.5 403t310.5 150q158 0 261 -118v552h290v-1536h-261l-14 115q-108 -135 -278 -135q-191 0 -306.5 150.5t-115.5 418.5zM355 528q0 -152 53 -233t154 -81q134 0 189 113v427q-54 113 -187 113q-209 0 -209 -339z" />
<glyph unicode="e" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM368 644h402v23q-2 96 -52 148.5t-142 52.5 q-86 0 -139.5 -58t-68.5 -166z" />
<glyph unicode="f" horiz-adv-x="734" d="M29 870v212h161v92q0 182 104.5 282.5t292.5 100.5q60 0 147 -20l-3 -224q-36 9 -88 9q-163 0 -163 -153v-87h215v-212h-215v-870h-290v870h-161z" />
<glyph unicode="g" horiz-adv-x="1169" d="M69 537v12q0 249 118.5 401t319.5 152q178 0 277 -122l12 102h262v-1046q0 -142 -64.5 -247t-181.5 -160t-274 -55q-119 0 -232 47.5t-171 122.5l128 176q108 -121 262 -121q115 0 179 61.5t64 174.5v58q-100 -113 -263 -113q-195 0 -315.5 152.5t-120.5 404.5zM358 528 q0 -147 59 -230.5t162 -83.5q132 0 189 99v455q-58 99 -187 99q-104 0 -163.5 -85t-59.5 -254z" />
<glyph unicode="h" horiz-adv-x="1146" d="M104 0v1536h289v-572q115 138 289 138q352 0 357 -409v-693h-289v685q0 93 -40 137.5t-133 44.5q-127 0 -184 -98v-769h-289z" />
<glyph unicode="i" horiz-adv-x="543" d="M109 1362q0 65 43.5 107t118.5 42q74 0 118 -42t44 -107q0 -66 -44.5 -108t-117.5 -42t-117.5 42t-44.5 108zM126 0v1082h290v-1082h-290z" />
<glyph unicode="j" horiz-adv-x="532" d="M-95 -191q52 -9 91 -9q131 0 131 139v1143h290v-1141q0 -179 -95 -278.5t-274 -99.5q-75 0 -143 17v229zM104 1362q0 65 43.5 107t118.5 42t118.5 -42t43.5 -107q0 -66 -44.5 -108t-117.5 -42t-117.5 42t-44.5 108z" />
<glyph unicode="k" horiz-adv-x="1094" d="M111 0v1536h289v-851l56 72l277 325h347l-391 -451l425 -631h-332l-278 434l-104 -104v-330h-289z" />
<glyph unicode="l" horiz-adv-x="543" d="M126 0v1536h290v-1536h-290z" />
<glyph unicode="m" horiz-adv-x="1773" d="M111 0v1082h271l9 -121q115 141 311 141q209 0 287 -165q114 165 325 165q176 0 262 -102.5t86 -308.5v-691h-290v690q0 92 -36 134.5t-127 42.5q-130 0 -180 -124l1 -743h-289v689q0 94 -37 136t-126 42q-123 0 -178 -102v-765h-289z" />
<glyph unicode="n" horiz-adv-x="1147" d="M105 0v1082h272l9 -125q116 145 311 145q172 0 256 -101t86 -302v-699h-289v692q0 92 -40 133.5t-133 41.5q-122 0 -183 -104v-763h-289z" />
<glyph unicode="o" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5z" />
<glyph unicode="p" horiz-adv-x="1153" d="M111 -416v1498h268l10 -106q105 126 274 126q200 0 311 -148t111 -408v-15q0 -250 -113.5 -400.5t-306.5 -150.5q-164 0 -265 114v-510h-289zM400 320q53 -107 189 -107q207 0 207 339q0 151 -53.5 233t-155.5 82q-136 0 -187 -104v-443z" />
<glyph unicode="q" horiz-adv-x="1157" d="M66 551q0 255 113.5 403t311.5 148q174 0 277 -133l19 113h254v-1498h-290v509q-100 -113 -262 -113q-193 0 -308 150t-115 421zM355 530q0 -155 54.5 -236t153.5 -81q133 0 188 106v447q-54 102 -186 102q-100 0 -155 -81t-55 -257z" />
<glyph unicode="r" horiz-adv-x="747" d="M111 0v1082h273l8 -129q87 149 241 149q48 0 90 -13l-4 -278q-59 8 -104 8q-164 0 -215 -111v-708h-289z" />
<glyph unicode="s" horiz-adv-x="1053" d="M56 344h274q4 -77 57 -118t142 -41q83 0 125.5 31.5t42.5 82.5q0 53 -52.5 83.5t-168.5 54.5q-386 81 -386 328q0 144 119.5 240.5t312.5 96.5q206 0 329.5 -97t123.5 -252h-289q0 62 -40 102.5t-125 40.5q-73 0 -113 -33t-40 -84q0 -48 45.5 -77.5t153.5 -51t182 -48.5 q229 -84 229 -291q0 -148 -127 -239.5t-328 -91.5q-136 0 -241.5 48.5t-165.5 133t-60 182.5z" />
<glyph unicode="t" horiz-adv-x="692" d="M10 870v212h158v266h289v-266h185v-212h-185v-540q0 -60 23 -86t88 -26q48 0 85 7v-219q-85 -26 -175 -26q-304 0 -310 307v583h-158z" />
<glyph unicode="u" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293z" />
<glyph unicode="v" horiz-adv-x="1035" d="M13 1082h302l201 -729l201 729h302l-365 -1082h-276z" />
<glyph unicode="w" horiz-adv-x="1505" d="M28 1082h279l141 -688l198 688h209l197 -689l142 689h279l-276 -1082h-242l-205 681l-205 -681h-241z" />
<glyph unicode="x" horiz-adv-x="1042" d="M21 0l321 552l-307 530h310l178 -323l182 323h309l-308 -530l321 -552h-310l-193 340l-192 -340h-311z" />
<glyph unicode="y" horiz-adv-x="1028" d="M3 1082h311l201 -673l200 673h310l-435 -1250l-24 -57q-97 -212 -320 -212q-63 0 -128 19v219l44 -1q82 0 122.5 25t63.5 83l34 89z" />
<glyph unicode="z" horiz-adv-x="1042" d="M74 0v176l509 672h-494v234h867v-171l-513 -678h529v-233h-898z" />
<glyph unicode="{" horiz-adv-x="676" d="M48 515v207q174 0 178 199v212q0 185 90 299t270 165l56 -161q-76 -28 -115 -97.5t-41 -192.5v-210q0 -226 -179 -317q179 -92 179 -319v-212q5 -234 156 -286l-56 -162q-360 101 -360 465v199q0 211 -178 211z" />
<glyph unicode="|" horiz-adv-x="518" d="M173 -270v1726h175v-1726h-175z" />
<glyph unicode="}" horiz-adv-x="676" d="M34 -198q152 54 156 290v212q0 226 183 314q-183 88 -183 319v209q-4 233 -156 290l56 161q179 -50 269 -163.5t91 -297.5v-215q4 -199 178 -199v-207q-178 0 -178 -209v-217q-8 -350 -360 -449z" />
<glyph unicode="~" horiz-adv-x="1328" d="M106 415q0 186 90.5 299t240.5 113q78 0 142 -30t145.5 -107.5t148.5 -77.5q59 0 96.5 53t37.5 129l214 -1q0 -186 -93 -302t-240 -116q-74 0 -137.5 28.5t-146.5 108t-153 79.5q-58 0 -94 -50t-36 -128z" />
<glyph unicode="&#xa1;" horiz-adv-x="578" d="M128 948q0 67 44.5 110t117.5 43t117.5 -43t44.5 -110t-46 -110t-116 -43t-116 43t-46 110zM137 -369l33 1008h241l33 -1008h-307z" />
<glyph unicode="&#xa2;" horiz-adv-x="1178" d="M99 532v22q0 218 105 363t294 177v224h200v-225q163 -29 255.5 -140t94.5 -274h-272q-2 86 -52 137.5t-131 51.5q-102 0 -153 -74.5t-52 -234.5v-33q0 -168 51.5 -240.5t154.5 -72.5q80 0 130 44t52 117h272q-2 -145 -98.5 -250.5t-251.5 -134.5v-234h-200v233 q-187 30 -293 174t-106 370z" />
<glyph unicode="&#xa3;" horiz-adv-x="1217" d="M99 576v236h154l-7 227q0 202 123.5 319t330.5 117q212 0 333 -112.5t121 -304.5h-287q0 85 -43.5 130t-124.5 45q-66 0 -109.5 -49t-43.5 -145l9 -227h309v-236h-300l6 -139q0 -123 -62 -196h653v-241h-1059v241h92q72 18 72 179l-5 156h-162z" />
<glyph unicode="&#xa4;" horiz-adv-x="1418" d="M81 118l135 137q-100 156 -100 353q0 204 109 365l-144 147l141 144l142 -145q155 115 348 115q194 0 349 -117l144 148l142 -145l-148 -151q107 -159 107 -361q0 -193 -98 -349l139 -141l-142 -145l-132 134q-159 -127 -361 -127q-203 0 -361 126l-129 -132zM302 608 q0 -118 54 -219.5t149.5 -160t206.5 -58.5q110 0 205.5 58.5t149.5 160t54 219.5q0 119 -54 219.5t-149 158.5t-206 58q-112 0 -207 -58t-149 -158.5t-54 -219.5z" />
<glyph unicode="&#xa5;" horiz-adv-x="1254" d="M20 1456h330l276 -606l277 606h329l-375 -714h234v-175h-319v-115h319v-174h-319v-278h-300v278h-336v174h336v115h-336v175h260z" />
<glyph unicode="&#xa6;" horiz-adv-x="516" d="M128 -270v795h260v-795h-260zM128 698v758h260v-758h-260z" />
<glyph unicode="&#xa7;" horiz-adv-x="1287" d="M92 -35l289 1q0 -89 64 -136.5t191 -47.5q112 0 170 37.5t58 100.5q0 65 -64.5 106t-247 91.5t-275 105.5t-138 130t-45.5 181q0 180 162 273q-136 103 -136 288q0 171 140.5 276t379.5 105q247 0 383 -113t136 -314h-289q0 87 -61.5 140.5t-168.5 53.5q-110 0 -170 -39 t-60 -107q0 -73 55.5 -110t240.5 -86t282.5 -104t144.5 -131.5t47 -184.5q0 -182 -162 -271q135 -102 135 -288q0 -175 -137.5 -274.5t-379.5 -99.5q-257 0 -400.5 107t-143.5 310zM383 563q0 -69 41.5 -106.5t165.5 -77.5l222 -67q82 47 82 140q0 62 -45.5 101.5 t-163.5 79.5l-227 71q-75 -42 -75 -141z" />
<glyph unicode="&#xa8;" horiz-adv-x="956" d="M93 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM580 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xa9;" horiz-adv-x="1606" d="M86 729q0 202 93.5 375t259 272.5t357.5 99.5t357.5 -99.5t259 -272.5t93.5 -375q0 -204 -95 -377.5t-259.5 -272.5t-355.5 -99q-193 0 -357.5 100t-258.5 273t-94 376zM208 729q0 -170 77.5 -314t214 -227.5t296.5 -83.5t297.5 85t213.5 229t76 311q0 166 -75 308.5 t-212 228t-300 85.5q-159 0 -295.5 -82t-214.5 -226t-78 -314zM433 675v113q0 174 95.5 280.5t253.5 106.5q163 0 249.5 -82.5t86.5 -231.5h-156q0 96 -46 137.5t-134 41.5q-92 0 -142.5 -67.5t-51.5 -180.5v-123q0 -117 51 -184.5t143 -67.5q89 0 134 40.5t45 138.5h156 q0 -152 -87.5 -233t-247.5 -81t-254.5 106.5t-94.5 286.5z" />
<glyph unicode="&#xaa;" horiz-adv-x="909" d="M137 919q0 110 84 170.5t257 60.5h102v51q0 127 -116 127q-65 0 -101.5 -25.5t-36.5 -73.5l-173 14q0 104 87.5 168.5t223.5 64.5q135 0 213 -72t78 -205v-316q0 -97 26 -178h-177q-10 27 -17 68q-77 -82 -201 -82q-118 0 -183.5 61.5t-65.5 166.5zM312 923 q0 -88 117 -88q40 0 82 18.5t69 43.5v136h-106q-76 -1 -119 -31t-43 -79z" />
<glyph unicode="&#xab;" horiz-adv-x="1023" d="M77 515v19l280 390h186l-240 -400l240 -399h-186zM462 515v19l280 390h186l-240 -400l240 -399h-186z" />
<glyph unicode="&#xac;" horiz-adv-x="1129" d="M126 634v171h835v-431h-200v260h-635z" />
<glyph unicode="&#xad;" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
<glyph unicode="&#xae;" horiz-adv-x="1606" d="M86 729q0 202 93.5 375t259 272.5t357.5 99.5t357.5 -99.5t259 -272.5t93.5 -375q0 -204 -95 -377.5t-259.5 -272.5t-355.5 -99q-193 0 -357.5 100t-258.5 273t-94 376zM208 729q0 -170 77.5 -314t214 -227.5t296.5 -83.5t297.5 85t213.5 229t76 311q0 166 -75 308.5 t-212 228t-300 85.5q-159 0 -295.5 -82t-214.5 -226t-78 -314zM501 316v850h281q151 0 238 -68.5t87 -194.5q0 -112 -113 -174q61 -31 85.5 -86.5t24.5 -137.5t3.5 -116t13.5 -57v-16h-155q-13 34 -13 194q0 76 -33 109.5t-110 33.5h-158v-337h-151zM652 787h136 q74 0 121.5 32t47.5 84q0 70 -35.5 99.5t-128.5 30.5h-141v-246z" />
<glyph unicode="&#xaf;" horiz-adv-x="1026" d="M148 1290v167h730v-167h-730z" />
<glyph unicode="&#xb0;" horiz-adv-x="795" d="M126 1200q0 114 81 195t191 81q109 0 188.5 -80.5t79.5 -195.5t-79.5 -193.5t-188.5 -78.5q-108 0 -190 78.5t-82 193.5zM273 1200q0 -52 36.5 -88t88.5 -36q53 0 87.5 35.5t34.5 88.5q0 52 -34.5 90t-87.5 38t-89 -38t-36 -90z" />
<glyph unicode="&#xb1;" horiz-adv-x="1100" d="M89 701v241h335v343h253v-343h328v-241h-328v-364h-253v364h-335zM113 1v235h864v-235h-864z" />
<glyph unicode="&#xb2;" horiz-adv-x="763" d="M55 1193q0 116 85.5 195t220.5 79q148 0 228.5 -64.5t80.5 -183.5q0 -70 -36 -128t-144 -145l-148 -115h351v-164h-620v138l287 257q56 49 80.5 91t24.5 65q0 84 -95 84q-50 0 -79.5 -31t-29.5 -78h-206z" />
<glyph unicode="&#xb3;" horiz-adv-x="763" d="M48 902h206q0 -34 34 -58.5t86 -24.5q60 0 86.5 26.5t26.5 61.5q0 92 -122 93h-92v136h82q119 0 119 88q0 35 -28.5 56t-77.5 21q-42 0 -71.5 -15.5t-29.5 -44.5h-205q0 102 84.5 163.5t215.5 61.5q145 0 230.5 -59.5t85.5 -166.5q0 -119 -135 -169q150 -41 150 -184 q0 -105 -91.5 -168.5t-239.5 -63.5q-142 0 -228 66.5t-86 180.5z" />
<glyph unicode="&#xb4;" horiz-adv-x="679" d="M101 1226l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xb5;" horiz-adv-x="1261" d="M139 -416v1498h289v-623q0 -126 40.5 -185.5t139.5 -59.5q149 0 205 105v763h289v-1082h-269l-6 68q-89 -89 -225 -89q-102 0 -174 45v-440h-289z" />
<glyph unicode="&#xb6;" horiz-adv-x="1003" d="M75 988q0 213 133 340.5t363 127.5h298v-1456h-219v520h-80q-230 0 -362.5 127t-132.5 341z" />
<glyph unicode="&#xb7;" horiz-adv-x="617" d="M140 697q0 69 46 112t117 43t117.5 -43t46.5 -112t-47 -111.5t-117 -42.5q-72 0 -117.5 43.5t-45.5 110.5z" />
<glyph unicode="&#xb8;" horiz-adv-x="548" d="M98 -136l31 143h216l-11 -58q150 -27 150 -173q0 -110 -91.5 -174t-257.5 -64l-7 167q112 0 112 81q0 42 -33.5 57.5t-108.5 20.5z" />
<glyph unicode="&#xb9;" horiz-adv-x="763" d="M135 1176v158l374 121h19v-786h-204v548z" />
<glyph unicode="&#xba;" horiz-adv-x="936" d="M118 1049v72q0 160 95.5 257.5t250.5 97.5t251 -97t96 -263v-72q0 -159 -94 -256.5t-251 -97.5q-158 0 -253 98t-95 261zM293 1044q0 -98 46.5 -153t126.5 -55q78 0 123.5 54t46.5 151v80q0 97 -46.5 152t-125.5 55q-78 0 -124.5 -54.5t-46.5 -156.5v-73z" />
<glyph unicode="&#xbb;" horiz-adv-x="1023" d="M85 124l240 399l-240 400h187l280 -390v-19l-280 -390h-187zM478 124l240 399l-240 400h187l280 -390v-19l-280 -390h-187z" />
<glyph unicode="&#xbc;" horiz-adv-x="1470" d="M101 1171v158l374 121h19v-786h-204v548zM317 193l711 1138l141 -76l-711 -1138zM739 294l357 495h206v-463h88v-167h-88v-159h-205v159h-346zM935 326h162v212l-14 -22z" />
<glyph unicode="&#xbd;" horiz-adv-x="1559" d="M84 1177v158l374 121h19v-786h-204v548zM275 193l711 1138l141 -76l-711 -1138zM839 526q0 116 85.5 195t220.5 79q148 0 228.5 -64.5t80.5 -183.5q0 -70 -36 -128t-144 -145l-148 -115h351v-164h-620v138l287 257q56 49 80.5 91t24.5 65q0 84 -95 84q-50 0 -79.5 -31 t-29.5 -78h-206z" />
<glyph unicode="&#xbe;" horiz-adv-x="1655" d="M94 903h206q0 -34 34 -58.5t86 -24.5q60 0 86.5 26.5t26.5 61.5q0 92 -122 93h-92v136h82q119 0 119 88q0 35 -28.5 56t-77.5 21q-42 0 -71.5 -15.5t-29.5 -44.5h-205q0 102 84.5 163.5t215.5 61.5q145 0 230.5 -59.5t85.5 -166.5q0 -119 -135 -169q150 -41 150 -184 q0 -105 -91.5 -168.5t-239.5 -63.5q-142 0 -228 66.5t-86 180.5zM478 193l711 1138l141 -76l-711 -1138zM897 294l357 495h206v-463h88v-167h-88v-159h-205v159h-346zM1093 326h162v212l-14 -22z" />
<glyph unicode="&#xbf;" horiz-adv-x="1019" d="M69 6q0 159 153 312l97 93q50 45 69.5 94t21.5 138h256q0 -133 -31 -215t-110.5 -156t-108 -110t-43 -73t-14.5 -81q0 -157 154 -157q77 0 122.5 45t47.5 126h289q-2 -192 -123 -299.5t-331 -107.5q-213 0 -331 101.5t-118 289.5zM378 949q0 67 44.5 110t117.5 43 t117.5 -43t44.5 -110t-46 -110t-116 -43t-116 43t-46 110z" />
<glyph unicode="&#xc0;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM323 1846h315l198 -310h-237zM507 543h364l-183 545z" />
<glyph unicode="&#xc1;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM507 543h364l-183 545zM553 1536l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xc2;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM312 1554v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM507 543h364l-183 545z" />
<glyph unicode="&#xc3;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM315 1566q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5 q-35 0 -59.5 -25t-24.5 -71zM507 543h364l-183 545z" />
<glyph unicode="&#xc4;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM309 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM507 543h364l-183 545zM796 1675q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5 q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xc5;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM470 1730q0 86 65 145.5t158 59.5q92 0 157.5 -58.5t65.5 -146.5q0 -85 -64 -143t-159 -58q-97 0 -160 59t-63 142zM507 543h364l-183 545zM585 1730q0 -44 29 -75.5t79 -31.5t79 31.5t29 75.5 q0 46 -29.5 77.5t-78.5 31.5t-78.5 -31.5t-29.5 -77.5z" />
<glyph unicode="&#xc6;" horiz-adv-x="1925" d="M2 0l786 1456h1016v-236h-598l15 -355h502v-236h-492l16 -394h618v-235h-897l-14 333h-446l-167 -333h-339zM633 580h311l-24 570z" />
<glyph unicode="&#xc7;" horiz-adv-x="1340" d="M86 686v89q0 210 74 370t211.5 245.5t319.5 85.5q252 0 406 -135t178 -379h-300q-11 141 -78.5 204.5t-205.5 63.5q-150 0 -224.5 -107.5t-76.5 -333.5v-110q0 -236 71.5 -345t225.5 -109q139 0 207.5 63.5t78.5 196.5h300q-17 -235 -173.5 -370t-412.5 -135 q-280 0 -440.5 188.5t-160.5 517.5zM550 -137l31 143h216l-11 -58q150 -27 150 -173q0 -110 -91.5 -174t-257.5 -64l-7 167q112 0 112 81q0 42 -33.5 57.5t-108.5 20.5z" />
<glyph unicode="&#xc8;" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM266 1849h315l198 -310h-237z" />
<glyph unicode="&#xc9;" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM496 1539l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xca;" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM255 1557v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
<glyph unicode="&#xcb;" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM252 1678q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM739 1678q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5 t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xcc;" horiz-adv-x="597" d="M-70 1849h315l198 -310h-237zM149 0v1456h300v-1456h-300z" />
<glyph unicode="&#xcd;" horiz-adv-x="597" d="M149 0v1456h300v-1456h-300zM159 1539l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xce;" horiz-adv-x="597" d="M-81 1557v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM149 0v1456h300v-1456h-300z" />
<glyph unicode="&#xcf;" horiz-adv-x="597" d="M-84 1678q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM149 0v1456h300v-1456h-300zM403 1678q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xd0;" horiz-adv-x="1361" d="M-20 642v183h180v631h448q192 0 343.5 -86.5t236.5 -246t85 -362.5v-67q0 -203 -83.5 -361t-235.5 -245t-343 -88h-451v642h-180zM460 241h145q178 0 271 117.5t93 335.5v68q0 222 -92 336.5t-269 114.5h-148v-388h219v-183h-219v-401z" />
<glyph unicode="&#xd1;" horiz-adv-x="1446" d="M130 0v1456h300l585 -960v960h299v-1456h-300l-584 958v-958h-300zM349 1566q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5 q-35 0 -59.5 -25t-24.5 -71z" />
<glyph unicode="&#xd2;" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM337 1846h315l198 -310h-237zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71 q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
<glyph unicode="&#xd3;" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119 q-151 0 -233 -117.5t-83 -344.5v-71zM567 1536l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xd4;" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM326 1554v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM390 695q0 -223 82 -346 t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
<glyph unicode="&#xd5;" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM329 1566q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5 t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
<glyph unicode="&#xd6;" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM323 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5 t-39.5 90.5zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71zM810 1675q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xd7;" horiz-adv-x="1088" d="M65 373l307 313l-307 313l170 168l304 -311l305 311l170 -168l-307 -313l307 -313l-170 -168l-305 310l-304 -310z" />
<glyph unicode="&#xd8;" horiz-adv-x="1411" d="M93 702v57q0 215 77.5 378.5t219 251t323.5 87.5q175 0 314 -82l74 124h187l-134 -227q179 -198 179 -537v-59q0 -215 -76 -377t-217.5 -250t-324.5 -88q-164 0 -295 70l-85 -145h-188l143 242q-197 195 -197 555zM397 695q0 -172 49 -285l447 757q-73 61 -180 61 q-151 0 -233 -117.5t-83 -344.5v-71zM552 273q70 -47 163 -47q151 0 232.5 118.5t82.5 345.5v71q0 151 -38 256z" />
<glyph unicode="&#xd9;" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM301 1846h315l198 -310h-237z" />
<glyph unicode="&#xda;" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM531 1536l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xdb;" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM290 1554v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
<glyph unicode="&#xdc;" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM287 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM774 1675 q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xdd;" horiz-adv-x="1266" d="M2 1456h329l301 -656l303 656h328l-478 -928v-528h-305v528zM496 1536l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xde;" horiz-adv-x="1246" d="M133 0v1456h289v-267h230q162 -1 281.5 -56.5t183.5 -158t64 -236.5q0 -202 -138.5 -324t-378.5 -127h-242v-287h-289zM422 520h223q117 0 182 59t65 157t-63.5 158t-175.5 62h-231v-436z" />
<glyph unicode="&#xdf;" horiz-adv-x="1292" d="M135 0v1101q0 220 124 339t350 119q191 0 306.5 -99.5t115.5 -270.5q0 -108 -53.5 -195t-53.5 -164q0 -37 30.5 -76.5t118.5 -117.5q151 -134 151 -282q0 -177 -115 -275.5t-330 -98.5q-81 0 -160 16t-119 40l54 229q98 -52 219 -52q79 0 121 36.5t42 99.5 q0 46 -34.5 89.5t-116.5 109.5q-150 120 -150 270q0 96 55 186.5t55 169.5q0 70 -44.5 111.5t-112.5 41.5q-159 0 -164 -213v-1114h-289z" />
<glyph unicode="&#xe0;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M182 1536h315l198 -310h-237zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150z" />
<glyph unicode="&#xe1;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150zM412 1226l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xe2;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M171 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150z" />
<glyph unicode="&#xe3;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M174 1257q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5 t80 76.5v186h-108q-217 0 -231 -150z" />
<glyph unicode="&#xe4;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M168 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150zM655 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5 q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xe5;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M329 1420q0 86 65 145.5t158 59.5q92 0 157.5 -58.5t65.5 -146.5q0 -85 -64 -143t-159 -58q-97 0 -160 59t-63 142zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150zM444 1420q0 -44 29 -75.5t79 -31.5t79 31.5t29 75.5q0 46 -29.5 77.5 t-78.5 31.5t-78.5 -31.5t-29.5 -77.5z" />
<glyph unicode="&#xe6;" horiz-adv-x="1729" d="M66 319q0 157 124 243t367 87h168v57q0 76 -40.5 119t-117.5 43q-82 0 -129.5 -35.5t-47.5 -87.5l-289 19q0 149 130.5 243.5t338.5 94.5q211 0 327 -110q126 112 326 110q212 0 333 -131.5t121 -363.5v-157h-668q11 -116 80.5 -177t186.5 -61q77 0 142.5 16t152.5 61 l77 -189q-73 -56 -180.5 -88t-221.5 -32q-247 0 -386 147q-64 -69 -166.5 -108t-227.5 -39q-186 0 -293 89t-107 250zM355 315q0 -56 40.5 -89.5t125.5 -33.5q49 0 107 22.5t97 57.5v189h-164q-95 -1 -150.5 -43t-55.5 -103zM1011 644h382v28q0 94 -43.5 145t-126.5 51 q-90 0 -144.5 -57.5t-67.5 -166.5z" />
<glyph unicode="&#xe7;" horiz-adv-x="1068" d="M66 535v19q0 250 133 399t365 149q203 0 325.5 -115.5t124.5 -307.5h-271q-2 84 -52 136.5t-132 52.5q-101 0 -152.5 -73.5t-51.5 -238.5v-30q0 -167 51 -240t155 -73q80 0 130 44t52 117h271q-1 -110 -60 -201.5t-161.5 -142t-226.5 -50.5q-232 0 -366 147.5t-134 407.5 zM419 -137l31 143h216l-11 -58q150 -27 150 -173q0 -110 -91.5 -174t-257.5 -64l-7 167q112 0 112 81q0 42 -33.5 57.5t-108.5 20.5z" />
<glyph unicode="&#xe8;" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM175 1536h315l198 -310h-237zM368 644h402v23 q-2 96 -52 148.5t-142 52.5q-86 0 -139.5 -58t-68.5 -166z" />
<glyph unicode="&#xe9;" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM368 644h402v23q-2 96 -52 148.5t-142 52.5 q-86 0 -139.5 -58t-68.5 -166zM405 1226l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xea;" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM164 1244v16l296 276h168l300 -280v-12h-230l-154 145 l-154 -145h-226zM368 644h402v23q-2 96 -52 148.5t-142 52.5q-86 0 -139.5 -58t-68.5 -166z" />
<glyph unicode="&#xeb;" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM161 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5 t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM368 644h402v23q-2 96 -52 148.5t-142 52.5q-86 0 -139.5 -58t-68.5 -166zM648 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xec;" horiz-adv-x="561" d="M-88 1521h315l198 -310h-237zM134 0v1082h289v-1082h-289z" />
<glyph unicode="&#xed;" horiz-adv-x="561" d="M134 0v1082h289v-1082h-289zM141 1211l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xee;" horiz-adv-x="561" d="M-99 1229v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM134 0v1082h289v-1082h-289z" />
<glyph unicode="&#xef;" horiz-adv-x="561" d="M-102 1350q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM134 0v1082h289v-1082h-289zM385 1350q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xf0;" horiz-adv-x="1178" d="M84 468q0 231 123 364.5t329 133.5q136 0 244 -76q-49 152 -166 265l-191 -122l-78 114l152 97q-116 72 -264 111l91 224q238 -48 416 -180l171 109l77 -114l-139 -89q255 -262 256 -654v-74q0 -172 -66.5 -309t-185.5 -212.5t-266 -75.5q-144 0 -259 63.5t-179.5 176 t-64.5 248.5zM373 468q0 -112 60 -183.5t158 -71.5q103 0 164 90.5t61 248.5v111q-68 83 -215 83q-113 0 -170.5 -74.5t-57.5 -203.5z" />
<glyph unicode="&#xf1;" horiz-adv-x="1147" d="M105 0v1082h272l9 -125q116 145 311 145q172 0 256 -101t86 -302v-699h-289v692q0 92 -40 133.5t-133 41.5q-122 0 -183 -104v-763h-289zM198 1257q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5 t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71z" />
<glyph unicode="&#xf2;" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM207 1536h315l198 -310h-237zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83 q-106 0 -164 -82.5t-58 -255.5z" />
<glyph unicode="&#xf3;" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5zM437 1226 l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xf4;" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM196 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5 t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5z" />
<glyph unicode="&#xf5;" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM199 1257q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11 q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5z" />
<glyph unicode="&#xf6;" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM193 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM355 530 q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5zM680 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xf7;" horiz-adv-x="1168" d="M63 571v230h1028v-230h-1028zM415 277q0 68 45.5 110t117.5 42q71 0 117.5 -41.5t46.5 -110.5q0 -67 -45 -108.5t-119 -41.5q-75 0 -119 42t-44 108zM415 1089q0 68 45.5 110t117.5 42q71 0 117.5 -41.5t46.5 -110.5q0 -67 -45 -108.5t-119 -41.5q-75 0 -119 42t-44 108z " />
<glyph unicode="&#xf8;" horiz-adv-x="1156" d="M66 551q0 161 62 287t178.5 195t270.5 69q101 0 186 -29l70 143h161l-103 -211q200 -149 200 -475q0 -249 -139 -399.5t-373 -150.5q-95 0 -176 26l-72 -148h-161l103 212q-207 146 -207 481zM355 530q0 -130 41 -208l260 532q-36 14 -79 14q-106 0 -164 -82.5 t-58 -255.5zM509 223q30 -10 70 -10q105 0 164 80.5t59 257.5q0 114 -37 196z" />
<glyph unicode="&#xf9;" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM203 1536h315l198 -310h-237z" />
<glyph unicode="&#xfa;" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM433 1226l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xfb;" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM192 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
<glyph unicode="&#xfc;" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM189 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM676 1365 q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xfd;" horiz-adv-x="1028" d="M3 1082h311l201 -673l200 673h310l-435 -1250l-24 -57q-97 -212 -320 -212q-63 0 -128 19v219l44 -1q82 0 122.5 25t63.5 83l34 89zM381 1226l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xfe;" horiz-adv-x="1162" d="M113 -416v1952h290v-547q100 113 262 113q198 0 310 -147t112 -410v-14q0 -250 -113.5 -400.5t-306.5 -150.5q-164 0 -264 113v-509h-290zM403 318q54 -105 188 -105q207 0 207 339q0 151 -53.5 233t-155.5 82q-132 0 -186 -102v-447z" />
<glyph unicode="&#xff;" horiz-adv-x="1028" d="M3 1082h311l201 -673l200 673h310l-435 -1250l-24 -57q-97 -212 -320 -212q-63 0 -128 19v219l44 -1q82 0 122.5 25t63.5 83l34 89zM137 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM624 1365q0 53 39.5 90 t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#x152;" horiz-adv-x="1983" d="M96 563v317q0 173 75.5 309.5t214 211.5t314.5 75q123 0 290 -20h884v-243h-673v-347h575v-235h-575v-390h675v-241h-886q-167 -20 -288 -20q-174 0 -312 73.5t-214.5 207t-79.5 302.5zM385 576q0 -176 83.5 -270t233.5 -94q94 0 198 13v1004q-112 14 -200 14 q-150 0 -232 -92.5t-83 -265.5v-309z" />
<glyph unicode="&#x153;" horiz-adv-x="1847" d="M83 538v13q0 161 61 286.5t177 195t270 69.5q231 0 371 -149q134 151 349 149q214 0 337 -129t123 -365v-158h-654q16 -113 81.5 -175.5t168.5 -62.5q85 0 152 16.5t149 61.5l79 -187q-73 -58 -182 -90.5t-228 -32.5q-233 0 -373 149q-138 -149 -371 -149t-371.5 149.5 t-138.5 408.5zM372 530q0 -155 56.5 -236.5t164.5 -81.5q106 0 163 80.5t57 258.5q0 153 -58 235t-164 82q-105 0 -162 -82t-57 -256zM1120 647h367v26q0 97 -46.5 146t-129.5 49q-77 0 -126 -57t-65 -164z" />
<glyph unicode="&#x178;" horiz-adv-x="1266" d="M2 1456h329l301 -656l303 656h328l-478 -928v-528h-305v528zM252 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM739 1675q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5 t-100 37.5t-38 89.5z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1015" d="M123 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
<glyph unicode="&#x2dc;" horiz-adv-x="985" d="M117 1258q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71z" />
<glyph unicode="&#x2000;" horiz-adv-x="967" />
<glyph unicode="&#x2001;" horiz-adv-x="1935" />
<glyph unicode="&#x2002;" horiz-adv-x="967" />
<glyph unicode="&#x2003;" horiz-adv-x="1935" />
<glyph unicode="&#x2004;" horiz-adv-x="645" />
<glyph unicode="&#x2005;" horiz-adv-x="483" />
<glyph unicode="&#x2006;" horiz-adv-x="322" />
<glyph unicode="&#x2007;" horiz-adv-x="322" />
<glyph unicode="&#x2008;" horiz-adv-x="241" />
<glyph unicode="&#x2009;" horiz-adv-x="387" />
<glyph unicode="&#x200a;" horiz-adv-x="107" />
<glyph unicode="&#x2010;" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
<glyph unicode="&#x2011;" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
<glyph unicode="&#x2012;" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
<glyph unicode="&#x2013;" horiz-adv-x="1294" d="M147 596v236h1036v-236h-1036z" />
<glyph unicode="&#x2014;" horiz-adv-x="1563" d="M33 596v236h1381v-236h-1381z" />
<glyph unicode="&#x2018;" horiz-adv-x="479" d="M104 1048v150q0 94 52.5 200.5t129.5 171.5l136 -79q-86 -136 -89 -276v-167h-229z" />
<glyph unicode="&#x2019;" horiz-adv-x="470" d="M58 1088q86 135 89 279v169h230v-155q0 -90 -50 -195t-133 -177z" />
<glyph unicode="&#x201a;" horiz-adv-x="508" d="M66 -226q78 126 81 274v181h238l-1 -166q-1 -89 -50.5 -192t-131.5 -176z" />
<glyph unicode="&#x201c;" horiz-adv-x="831" d="M112 1048v150q0 94 52.5 200.5t129.5 171.5l136 -79q-86 -136 -89 -276v-167h-229zM455 1048v150q0 94 52.5 200.5t129.5 171.5l136 -79q-86 -136 -89 -276v-167h-229z" />
<glyph unicode="&#x201d;" horiz-adv-x="837" d="M72 1088q86 135 89 279v169h230v-155q0 -90 -50 -195t-133 -177zM419 1088q86 135 89 279v169h230v-155q0 -90 -50 -195t-133 -177z" />
<glyph unicode="&#x201e;" horiz-adv-x="825" d="M66 -246q78 134 81 293v216h238l-1 -199q-1 -97 -48 -206.5t-127 -182.5zM402 -246q86 148 89 294v215h238l-1 -203q-2 -96 -52.5 -205t-130.5 -180z" />
<glyph unicode="&#x2022;" horiz-adv-x="736" d="M135 731v35q0 104 66 167t170 63q108 0 172.5 -62t66.5 -163v-43q0 -103 -65.5 -165.5t-171.5 -62.5q-105 0 -171.5 62t-66.5 169z" />
<glyph unicode="&#x2026;" horiz-adv-x="1515" d="M133 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5zM606 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5zM1070 142q0 69 46.5 112 t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
<glyph unicode="&#x202f;" horiz-adv-x="387" />
<glyph unicode="&#x2039;" horiz-adv-x="638" d="M108 515v19l280 390h186l-240 -400l240 -399h-186z" />
<glyph unicode="&#x203a;" horiz-adv-x="618" d="M80 124l240 399l-240 400h187l280 -390v-19l-280 -390h-187z" />
<glyph unicode="&#x205f;" horiz-adv-x="483" />
<glyph unicode="&#x20ac;" d="M89 516v152h169v124h-169v152h171q17 252 175.5 391.5t420.5 139.5q105 0 236 -31l-36 -243q-94 32 -185 32q-283 0 -310 -289h333v-152h-335v-124h335v-152h-335q5 -147 78.5 -221t228.5 -74q105 0 190 31l36 -242q-124 -29 -256 -29q-263 0 -416.5 141.5t-161.5 393.5 h-169z" />
<glyph unicode="&#x2122;" horiz-adv-x="1293" d="M116 1348v108h407v-108h-129v-431h-142v431h-136zM594 914v542h158l117 -368l126 368h149v-542h-128v352l-111 -352h-72l-111 353v-353h-128z" />
<glyph unicode="&#x25fc;" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1901" d="M29 870v212h161v92q0 182 104.5 282.5t292.5 100.5q60 0 147 -20l-3 -224q-36 9 -88 9q-163 0 -163 -153v-87h356v50q2 204 125.5 314.5t348.5 110.5q134 0 329 -59l-42 -239q-98 29 -152.5 37.5t-116.5 8.5q-202 0 -202 -179v-44h213v-212h-213v-870h-290v870h-356v-870 h-290v870h-161zM1483 0v1082h290v-1082h-290z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1901" d="M29 870v212h161v92q0 182 104.5 282.5t292.5 100.5q60 0 147 -20l-3 -224q-36 9 -88 9q-163 0 -163 -153v-87h356v81q1 191 118.5 292.5t328.5 101.5q144 0 490 -32v-1525h-290v1312q-86 10 -161 10q-196 0 -196 -167v-73h215v-212h-215v-870h-290v870h-356v-870h-290 v870h-161z" />
<hkern u1="&#x20;" u2="T" k="60" />
<hkern u1="&#x22;" u2="w" k="-11" />
<hkern u1="&#x27;" u2="w" k="-11" />
<hkern u1="&#x28;" u2="&#x178;" k="-22" />
<hkern u1="&#x28;" u2="&#xdd;" k="-22" />
<hkern u1="&#x28;" u2="Y" k="-22" />
<hkern u1="&#x28;" u2="W" k="-38" />
<hkern u1="&#x28;" u2="V" k="-20" />
<hkern u1="&#x2f;" u2="&#x2f;" k="248" />
<hkern u1="A" u2="w" k="33" />
<hkern u1="A" u2="t" k="17" />
<hkern u1="A" u2="&#x3f;" k="81" />
<hkern u1="C" u2="&#x7d;" k="17" />
<hkern u1="C" u2="]" k="12" />
<hkern u1="C" u2="&#x29;" k="26" />
<hkern u1="D" u2="&#xc6;" k="33" />
<hkern u1="E" u2="w" k="22" />
<hkern u1="E" u2="f" k="18" />
<hkern u1="F" u2="&#x2026;" k="274" />
<hkern u1="F" u2="&#x201e;" k="274" />
<hkern u1="F" u2="&#x201a;" k="274" />
<hkern u1="F" u2="&#x153;" k="21" />
<hkern u1="F" u2="&#xff;" k="24" />
<hkern u1="F" u2="&#xfd;" k="24" />
<hkern u1="F" u2="&#xfc;" k="22" />
<hkern u1="F" u2="&#xfb;" k="22" />
<hkern u1="F" u2="&#xfa;" k="22" />
<hkern u1="F" u2="&#xf9;" k="22" />
<hkern u1="F" u2="&#xf6;" k="21" />
<hkern u1="F" u2="&#xf5;" k="21" />
<hkern u1="F" u2="&#xf4;" k="21" />
<hkern u1="F" u2="&#xf3;" k="21" />
<hkern u1="F" u2="&#xf2;" k="21" />
<hkern u1="F" u2="&#xeb;" k="21" />
<hkern u1="F" u2="&#xea;" k="21" />
<hkern u1="F" u2="&#xe9;" k="21" />
<hkern u1="F" u2="&#xe8;" k="21" />
<hkern u1="F" u2="&#xe7;" k="21" />
<hkern u1="F" u2="&#xe5;" k="34" />
<hkern u1="F" u2="&#xe4;" k="34" />
<hkern u1="F" u2="&#xe3;" k="34" />
<hkern u1="F" u2="&#xe2;" k="34" />
<hkern u1="F" u2="&#xe1;" k="34" />
<hkern u1="F" u2="&#xe0;" k="34" />
<hkern u1="F" u2="&#xc5;" k="192" />
<hkern u1="F" u2="&#xc4;" k="192" />
<hkern u1="F" u2="&#xc3;" k="192" />
<hkern u1="F" u2="&#xc2;" k="192" />
<hkern u1="F" u2="&#xc1;" k="192" />
<hkern u1="F" u2="&#xc0;" k="192" />
<hkern u1="F" u2="y" k="24" />
<hkern u1="F" u2="v" k="24" />
<hkern u1="F" u2="u" k="22" />
<hkern u1="F" u2="r" k="26" />
<hkern u1="F" u2="q" k="21" />
<hkern u1="F" u2="o" k="21" />
<hkern u1="F" u2="g" k="21" />
<hkern u1="F" u2="e" k="21" />
<hkern u1="F" u2="d" k="21" />
<hkern u1="F" u2="c" k="21" />
<hkern u1="F" u2="a" k="34" />
<hkern u1="F" u2="T" k="-20" />
<hkern u1="F" u2="J" k="208" />
<hkern u1="F" u2="A" k="192" />
<hkern u1="F" u2="&#x2e;" k="274" />
<hkern u1="F" u2="&#x2c;" k="274" />
<hkern u1="K" u2="w" k="63" />
<hkern u1="L" u2="w" k="52" />
<hkern u1="O" u2="&#xc6;" k="33" />
<hkern u1="P" u2="&#xc6;" k="297" />
<hkern u1="P" u2="t" k="-14" />
<hkern u1="Q" u2="&#x178;" k="35" />
<hkern u1="Q" u2="&#xdd;" k="35" />
<hkern u1="Q" u2="Y" k="35" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="28" />
<hkern u1="Q" u2="T" k="33" />
<hkern u1="R" u2="&#x178;" k="48" />
<hkern u1="R" u2="&#xdd;" k="48" />
<hkern u1="R" u2="Y" k="48" />
<hkern u1="R" u2="V" k="19" />
<hkern u1="R" u2="T" k="50" />
<hkern u1="T" u2="&#xf8;" k="95" />
<hkern u1="T" u2="&#xe6;" k="84" />
<hkern u1="T" u2="&#xc6;" k="189" />
<hkern u1="T" u2="&#xbb;" k="146" />
<hkern u1="T" u2="&#xab;" k="148" />
<hkern u1="T" u2="w" k="47" />
<hkern u1="T" u2="r" k="65" />
<hkern u1="T" u2="&#x20;" k="60" />
<hkern u1="V" u2="&#x7d;" k="-19" />
<hkern u1="V" u2="r" k="30" />
<hkern u1="V" u2="]" k="-17" />
<hkern u1="V" u2="&#x29;" k="-20" />
<hkern u1="W" u2="&#x7d;" k="-14" />
<hkern u1="W" u2="r" k="21" />
<hkern u1="W" u2="]" k="-12" />
<hkern u1="W" u2="&#x29;" k="-15" />
<hkern u1="Y" u2="&#x2022;" k="45" />
<hkern u1="Y" u2="&#xf8;" k="64" />
<hkern u1="Y" u2="&#xe6;" k="63" />
<hkern u1="Y" u2="&#xc6;" k="96" />
<hkern u1="Y" u2="&#xbb;" k="51" />
<hkern u1="Y" u2="&#xab;" k="82" />
<hkern u1="Y" u2="&#x7d;" k="-19" />
<hkern u1="Y" u2="t" k="22" />
<hkern u1="Y" u2="r" k="40" />
<hkern u1="Y" u2="f" k="22" />
<hkern u1="Y" u2="]" k="-18" />
<hkern u1="Y" u2="&#x2a;" k="49" />
<hkern u1="Y" u2="&#x29;" k="-20" />
<hkern u1="Y" u2="&#x26;" k="30" />
<hkern u1="Z" u2="w" k="27" />
<hkern u1="[" u2="&#xdc;" k="18" />
<hkern u1="[" u2="&#xdb;" k="18" />
<hkern u1="[" u2="&#xda;" k="18" />
<hkern u1="[" u2="&#xd9;" k="18" />
<hkern u1="[" u2="U" k="18" />
<hkern u1="[" u2="J" k="18" />
<hkern u1="e" u2="&#x2019;" k="64" />
<hkern u1="f" u2="&#x201d;" k="-16" />
<hkern u1="f" u2="&#x201c;" k="-16" />
<hkern u1="f" u2="&#x2019;" k="-16" />
<hkern u1="f" u2="&#x2018;" k="-16" />
<hkern u1="f" u2="&#x153;" k="24" />
<hkern u1="f" u2="&#xeb;" k="24" />
<hkern u1="f" u2="&#xea;" k="24" />
<hkern u1="f" u2="&#xe9;" k="24" />
<hkern u1="f" u2="&#xe8;" k="24" />
<hkern u1="f" u2="&#xe7;" k="24" />
<hkern u1="f" u2="&#x7d;" k="-19" />
<hkern u1="f" u2="q" k="24" />
<hkern u1="f" u2="g" k="24" />
<hkern u1="f" u2="e" k="24" />
<hkern u1="f" u2="d" k="24" />
<hkern u1="f" u2="c" k="24" />
<hkern u1="f" u2="]" k="-18" />
<hkern u1="f" u2="&#x29;" k="-20" />
<hkern u1="f" u2="&#x27;" k="-16" />
<hkern u1="f" u2="&#x22;" k="-16" />
<hkern u1="h" u2="&#x2019;" k="104" />
<hkern u1="k" u2="&#x153;" k="20" />
<hkern u1="k" u2="&#xeb;" k="20" />
<hkern u1="k" u2="&#xea;" k="20" />
<hkern u1="k" u2="&#xe9;" k="20" />
<hkern u1="k" u2="&#xe8;" k="20" />
<hkern u1="k" u2="&#xe7;" k="20" />
<hkern u1="k" u2="q" k="20" />
<hkern u1="k" u2="g" k="20" />
<hkern u1="k" u2="e" k="20" />
<hkern u1="k" u2="d" k="20" />
<hkern u1="k" u2="c" k="20" />
<hkern u1="m" u2="&#x2019;" k="120" />
<hkern u1="n" u2="&#x2019;" k="120" />
<hkern u1="o" u2="&#x2019;" k="112" />
<hkern u1="r" u2="&#x2019;" k="-16" />
<hkern u1="r" u2="w" k="-17" />
<hkern u1="r" u2="t" k="-50" />
<hkern u1="r" u2="f" k="-20" />
<hkern u1="t" u2="&#x2019;" k="-24" />
<hkern u1="t" u2="&#xf6;" k="30" />
<hkern u1="t" u2="&#xf5;" k="30" />
<hkern u1="t" u2="&#xf4;" k="30" />
<hkern u1="t" u2="&#xf3;" k="30" />
<hkern u1="t" u2="&#xf2;" k="30" />
<hkern u1="t" u2="o" k="30" />
<hkern u1="v" u2="f" k="-13" />
<hkern u1="w" u2="&#x2026;" k="124" />
<hkern u1="w" u2="&#x201e;" k="124" />
<hkern u1="w" u2="&#x201a;" k="124" />
<hkern u1="w" u2="&#x2e;" k="124" />
<hkern u1="w" u2="&#x2c;" k="124" />
<hkern u1="y" u2="f" k="-13" />
<hkern u1="&#x7b;" u2="&#xdc;" k="20" />
<hkern u1="&#x7b;" u2="&#xdb;" k="20" />
<hkern u1="&#x7b;" u2="&#xda;" k="20" />
<hkern u1="&#x7b;" u2="&#xd9;" k="20" />
<hkern u1="&#x7b;" u2="U" k="20" />
<hkern u1="&#x7b;" u2="J" k="20" />
<hkern u1="&#xc0;" u2="w" k="33" />
<hkern u1="&#xc0;" u2="t" k="17" />
<hkern u1="&#xc0;" u2="&#x3f;" k="81" />
<hkern u1="&#xc1;" u2="w" k="33" />
<hkern u1="&#xc1;" u2="t" k="17" />
<hkern u1="&#xc1;" u2="&#x3f;" k="81" />
<hkern u1="&#xc2;" u2="w" k="33" />
<hkern u1="&#xc2;" u2="t" k="17" />
<hkern u1="&#xc2;" u2="&#x3f;" k="81" />
<hkern u1="&#xc3;" u2="w" k="33" />
<hkern u1="&#xc3;" u2="t" k="17" />
<hkern u1="&#xc3;" u2="&#x3f;" k="81" />
<hkern u1="&#xc4;" u2="w" k="33" />
<hkern u1="&#xc4;" u2="t" k="17" />
<hkern u1="&#xc4;" u2="&#x3f;" k="81" />
<hkern u1="&#xc5;" u2="w" k="33" />
<hkern u1="&#xc5;" u2="t" k="17" />
<hkern u1="&#xc5;" u2="&#x3f;" k="81" />
<hkern u1="&#xc7;" u2="&#x7d;" k="17" />
<hkern u1="&#xc7;" u2="]" k="12" />
<hkern u1="&#xc7;" u2="&#x29;" k="26" />
<hkern u1="&#xc8;" u2="w" k="22" />
<hkern u1="&#xc8;" u2="f" k="18" />
<hkern u1="&#xc9;" u2="w" k="22" />
<hkern u1="&#xc9;" u2="f" k="18" />
<hkern u1="&#xca;" u2="w" k="22" />
<hkern u1="&#xca;" u2="f" k="18" />
<hkern u1="&#xcb;" u2="w" k="22" />
<hkern u1="&#xcb;" u2="f" k="18" />
<hkern u1="&#xd0;" u2="&#xc6;" k="33" />
<hkern u1="&#xd2;" u2="&#xc6;" k="33" />
<hkern u1="&#xd3;" u2="&#xc6;" k="33" />
<hkern u1="&#xd4;" u2="&#xc6;" k="33" />
<hkern u1="&#xd5;" u2="&#xc6;" k="33" />
<hkern u1="&#xd6;" u2="&#xc6;" k="33" />
<hkern u1="&#xdd;" u2="&#x2022;" k="45" />
<hkern u1="&#xdd;" u2="&#xf8;" k="64" />
<hkern u1="&#xdd;" u2="&#xe6;" k="63" />
<hkern u1="&#xdd;" u2="&#xc6;" k="96" />
<hkern u1="&#xdd;" u2="&#xbb;" k="51" />
<hkern u1="&#xdd;" u2="&#xab;" k="82" />
<hkern u1="&#xdd;" u2="&#x7d;" k="-19" />
<hkern u1="&#xdd;" u2="t" k="22" />
<hkern u1="&#xdd;" u2="r" k="40" />
<hkern u1="&#xdd;" u2="f" k="22" />
<hkern u1="&#xdd;" u2="]" k="-18" />
<hkern u1="&#xdd;" u2="&#x2a;" k="49" />
<hkern u1="&#xdd;" u2="&#x29;" k="-20" />
<hkern u1="&#xdd;" u2="&#x26;" k="30" />
<hkern u1="&#xe8;" u2="&#x2019;" k="64" />
<hkern u1="&#xe9;" u2="&#x2019;" k="64" />
<hkern u1="&#xea;" u2="&#x2019;" k="64" />
<hkern u1="&#xeb;" u2="&#x2019;" k="64" />
<hkern u1="&#xf1;" u2="&#x2019;" k="120" />
<hkern u1="&#xf2;" u2="&#x2019;" k="112" />
<hkern u1="&#xf3;" u2="&#x2019;" k="112" />
<hkern u1="&#xf4;" u2="&#x2019;" k="112" />
<hkern u1="&#xf5;" u2="&#x2019;" k="112" />
<hkern u1="&#xf6;" u2="&#x2019;" k="112" />
<hkern u1="&#xfd;" u2="f" k="-13" />
<hkern u1="&#xff;" u2="f" k="-13" />
<hkern u1="&#x178;" u2="&#x2022;" k="45" />
<hkern u1="&#x178;" u2="&#xf8;" k="64" />
<hkern u1="&#x178;" u2="&#xe6;" k="63" />
<hkern u1="&#x178;" u2="&#xc6;" k="96" />
<hkern u1="&#x178;" u2="&#xbb;" k="51" />
<hkern u1="&#x178;" u2="&#xab;" k="82" />
<hkern u1="&#x178;" u2="&#x7d;" k="-19" />
<hkern u1="&#x178;" u2="t" k="22" />
<hkern u1="&#x178;" u2="r" k="40" />
<hkern u1="&#x178;" u2="f" k="22" />
<hkern u1="&#x178;" u2="]" k="-18" />
<hkern u1="&#x178;" u2="&#x2a;" k="49" />
<hkern u1="&#x178;" u2="&#x29;" k="-20" />
<hkern u1="&#x178;" u2="&#x26;" k="30" />
<hkern u1="&#x2018;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="&#x153;" k="104" />
<hkern u1="&#x2019;" u2="&#xf6;" k="144" />
<hkern u1="&#x2019;" u2="&#xf5;" k="144" />
<hkern u1="&#x2019;" u2="&#xf4;" k="144" />
<hkern u1="&#x2019;" u2="&#xf3;" k="144" />
<hkern u1="&#x2019;" u2="&#xf2;" k="144" />
<hkern u1="&#x2019;" u2="&#xeb;" k="104" />
<hkern u1="&#x2019;" u2="&#xea;" k="104" />
<hkern u1="&#x2019;" u2="&#xe9;" k="104" />
<hkern u1="&#x2019;" u2="&#xe8;" k="104" />
<hkern u1="&#x2019;" u2="&#xe7;" k="104" />
<hkern u1="&#x2019;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="s" k="232" />
<hkern u1="&#x2019;" u2="q" k="104" />
<hkern u1="&#x2019;" u2="o" k="144" />
<hkern u1="&#x2019;" u2="g" k="104" />
<hkern u1="&#x2019;" u2="e" k="104" />
<hkern u1="&#x2019;" u2="d" k="104" />
<hkern u1="&#x2019;" u2="c" k="104" />
<hkern u1="&#x201c;" u2="w" k="-11" />
<hkern u1="&#x201d;" u2="w" k="-11" />
<hkern g1="B" g2="V" k="24" />
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="55" />
<hkern g1="B" g2="T" k="27" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="Y,Yacute,Ydieresis" k="28" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="T" k="29" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-18" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="X" k="-17" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="43" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="85" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="21" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="23" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="122" />
<hkern g1="C,Ccedilla" g2="T" k="29" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="26" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="17" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="T" g2="z" k="60" />
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="208" />
<hkern g1="T" g2="v,y,yacute,ydieresis" k="82" />
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="28" />
<hkern g1="T" g2="V" k="-16" />
<hkern g1="T" g2="m,n,p,ntilde" k="89" />
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-16" />
<hkern g1="T" g2="T" k="-16" />
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="65" />
<hkern g1="T" g2="W" k="-15" />
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
<hkern g1="T" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="258" />
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="89" />
<hkern g1="T" g2="x" k="77" />
<hkern g1="T" g2="s" k="76" />
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="272" />
<hkern g1="T" g2="S" k="16" />
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="168" />
<hkern g1="T" g2="J" k="216" />
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="27" />
<hkern g1="K" g2="v,y,yacute,ydieresis" k="40" />
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="31" />
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="23" />
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="164" />
<hkern g1="L" g2="v,y,yacute,ydieresis" k="123" />
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="64" />
<hkern g1="L" g2="V" k="206" />
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="24" />
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="279" />
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="288" />
<hkern g1="L" g2="T" k="205" />
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="14" />
<hkern g1="L" g2="W" k="93" />
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-19" />
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="13" />
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-15" />
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="178" />
<hkern g1="P" g2="X" k="51" />
<hkern g1="P" g2="Z" k="36" />
<hkern g1="P" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="404" />
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="11" />
<hkern g1="P" g2="J" k="184" />
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="22" />
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="46" />
<hkern g1="V" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="13" />
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="28" />
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="75" />
<hkern g1="V" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="215" />
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="44" />
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="157" />
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="46" />
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="X" g2="v,y,yacute,ydieresis" k="31" />
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="25" />
<hkern g1="X" g2="V" k="-14" />
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="21" />
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="156" />
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="30" />
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="20" />
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="29" />
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="96" />
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="40" />
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="39" />
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="150" />
<hkern g1="Y,Yacute,Ydieresis" g2="X" k="-13" />
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="231" />
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="23" />
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="58" />
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="152" />
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="16" />
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="63" />
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="96" />
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
<hkern g1="W" g2="T" k="-14" />
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="43" />
<hkern g1="W" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="143" />
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="31" />
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="60" />
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="33" />
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="27" />
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="26" />
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-13" />
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="21" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="17" />
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="11" />
<hkern g1="b,p,thorn" g2="z" k="15" />
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="29" />
<hkern g1="b,p,thorn" g2="x" k="15" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="13" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="14" />
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="80" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="16" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="88" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="21" />
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
<hkern g1="v,y,yacute,ydieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-15" />
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="167" />
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="15" />
<hkern g1="r" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="36" />
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-18" />
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-16" />
<hkern g1="r" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="173" />
<hkern g1="r" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="r" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="30" />
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="40" />
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="20" />
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="16" />
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="16" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="91" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="m,n,p,ntilde" k="20" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="37" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="59" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="s" k="92" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="50" />
<hkern g1="comma,period,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="285" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

View File

@@ -1,675 +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">
<metadata></metadata>
<defs>
<font id="robotobold_italic" horiz-adv-x="1150" >
<font-face units-per-em="2048" ascent="1536" descent="-512" />
<missing-glyph horiz-adv-x="505" />
<glyph unicode="&#xfb01;" horiz-adv-x="1219" d="M65 870l38 212h146l9 52q37 204 173 315.5t349 109.5q83 -2 162.5 -19.5t158.5 -39.5l-61 -241q-138 48 -255 50q-99 0 -163 -47.5t-83 -133.5l-9 -46h219l-38 -212h-206l-151 -870h-283l151 870h-157zM698 0l188 1082h283l-187 -1082h-284z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1227" d="M74 870l37 212l156 1l12 93q26 176 148 278.5t318 105.5h17l173 -7l311 -27l-257 -1526h-283l231 1314q-86 12 -147 12q-93 0 -152.5 -43t-74.5 -122l-13 -79h209l-37 -212h-208l-151 -870h-284l151 870h-156z" />
<glyph horiz-adv-x="10" />
<glyph horiz-adv-x="10" />
<glyph unicode="&#xd;" horiz-adv-x="505" />
<glyph horiz-adv-x="10" />
<glyph unicode=" " horiz-adv-x="505" />
<glyph unicode="&#x09;" horiz-adv-x="505" />
<glyph unicode="&#xa0;" horiz-adv-x="505" />
<glyph unicode="!" horiz-adv-x="550" d="M41 131q-2 66 42 111.5t112 47.5q64 2 111 -39.5t49 -108.5q2 -66 -42 -112t-113 -48q-70 0 -114.5 44t-44.5 105zM134 447l142 1009h301l-208 -1009h-235z" />
<glyph unicode="&#x22;" horiz-adv-x="647" d="M121 987l87 549h198l-25 -154l-99 -395h-161zM438 987l86 549h197l-24 -154l-99 -395h-160z" />
<glyph unicode="#" horiz-adv-x="1193" d="M28 410l30 172h247l97 284h-222l31 174h251l144 416h184l-143 -416h180l143 416h186l-143 -416h209l-30 -174h-239l-98 -284h214l-30 -172h-243l-141 -410h-186l142 410h-179l-142 -410h-186l142 410h-218zM490 582h179l98 284h-180z" />
<glyph unicode="$" d="M65 458l282 -1q-5 -121 39.5 -182t133.5 -63q85 -2 145 47.5t72 130.5q10 70 -23 121t-135.5 97t-169.5 91q-205 138 -190 363q11 172 129 281.5t309 129.5l41 214h157l-42 -220q152 -32 231.5 -152t74.5 -311l-283 1q12 236 -139 239q-79 2 -133 -48.5t-65 -132.5 q-9 -64 22.5 -113t121 -92t150.5 -80q239 -144 223 -386q-11 -174 -128.5 -281t-311.5 -127l-39 -199h-156l39 200q-176 26 -268.5 151.5t-86.5 321.5z" />
<glyph unicode="%" horiz-adv-x="1477" d="M184 1099l5 67q11 142 103.5 228t232.5 84q134 -4 211.5 -89t69.5 -213l-6 -77q-14 -137 -108 -220t-227 -79q-130 2 -208.5 85t-72.5 214zM247 196l878 1124l137 -83l-876 -1126zM373 1095q-5 -56 18.5 -92t74.5 -38t90.5 34.5t51.5 99.5l10 78q7 59 -17.5 95.5 t-74.5 38.5q-55 2 -94.5 -37t-48.5 -98zM718 279l5 78q12 136 106 219.5t230 81.5q133 -4 211 -88t70 -213l-5 -67q-11 -145 -105.5 -230t-230.5 -81q-128 2 -208.5 85.5t-72.5 214.5zM904 277q-5 -55 21 -92.5t74 -39.5q58 -2 95 34t48 100l10 80q7 59 -18 94.5t-74 37.5 q-54 2 -93.5 -34.5t-51.5 -99.5z" />
<glyph unicode="&#x26;" horiz-adv-x="1314" d="M41 385q10 183 217 325l98 63l-40 90q-52 126 -45 223q8 115 65 205.5t152 139t207 45.5q147 -4 241 -97.5t88 -233.5q-10 -189 -227 -332l-114 -75l188 -282q84 120 101 258h239q-19 -282 -193 -465l168 -249h-302l-55 84q-180 -107 -371 -103q-190 2 -309 114.5 t-108 289.5zM330 399q-11 -83 32 -133.5t118 -52.5q87 -3 209 59l-214 330l-24 -16q-106 -79 -121 -187zM517 1043q7 -53 49 -134l82 50q124 75 133 169q6 50 -22.5 83t-77.5 33q-62 2 -108 -43t-55 -111q-4 -24 -1 -47z" />
<glyph unicode="'" horiz-adv-x="331" d="M120 985l87 551h207l-25 -163l-88 -388h-181z" />
<glyph unicode="(" horiz-adv-x="707" d="M105 384q2 95 13 180l4 24q48 357 213.5 638.5t415.5 392.5l48 -161q-342 -261 -433 -839q-31 -196 -33 -352q-5 -411 188 -571l-63 -151q-216 120 -302 415q-57 198 -51 424z" />
<glyph unicode=")" horiz-adv-x="710" d="M-104 -300q343 265 433 848q29 187 31 345q5 411 -186 572l63 151q118 -64 202.5 -186.5t125 -295.5t38.5 -356q-6 -278 -96 -540.5t-235.5 -440.5t-327.5 -255z" />
<glyph unicode="*" horiz-adv-x="910" d="M100 1058l85 170l287 -128l43 356h192l-80 -347l307 118l26 -193l-328 -89l161 -272l-161 -104l-126 293l-222 -278l-149 119l257 263z" />
<glyph unicode="+" horiz-adv-x="1094" d="M46 554l46 261h351l68 391h269l-68 -391h350l-46 -261h-349l-71 -408h-269l71 408h-352z" />
<glyph unicode="," horiz-adv-x="495" d="M-118 -284l73 117q64 107 82 201l37 212h238l-29 -184q-41 -259 -252 -427z" />
<glyph unicode="-" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
<glyph unicode="." horiz-adv-x="587" d="M44 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
<glyph unicode="/" horiz-adv-x="752" d="M-145 -125l794 1581h223l-795 -1581h-222z" />
<glyph unicode="0" d="M87 454q-1 74 8 148l41 273q49 298 193 452t369 149q189 -4 292.5 -127.5t106.5 -344.5q1 -75 -8 -149l-42 -271q-50 -300 -192.5 -454.5t-369.5 -149.5q-189 4 -292 128t-106 346zM361 422q-5 -203 139 -210q203 -13 258 317l53 356q13 87 13 153q0 199 -140 206 q-202 9 -257 -308l-50 -338q-16 -106 -16 -176z" />
<glyph unicode="1" d="M230 1001l44 247l608 210l37 1l-245 -1459h-282l192 1108z" />
<glyph unicode="2" d="M1 0l33 210l517 485q159 149 211 242t39 182q-21 124 -143 127q-96 2 -160.5 -67t-78.5 -181l-282 -1q8 136 81 247t194.5 172.5t262.5 60.5q203 -4 316 -114t100 -293q-16 -206 -243 -430l-144 -137l-298 -268l602 -2l-37 -233h-970z" />
<glyph unicode="3" d="M27 400h280q-2 -81 45.5 -132.5t132.5 -53.5q98 -2 168 55.5t82 150.5q13 100 -35.5 153t-147.5 56l-166 1l36 226l135 -1q103 0 172.5 57t80.5 153q10 81 -31 129.5t-123 50.5t-140.5 -44.5t-71.5 -120.5l-282 -2q9 176 151.5 288.5t346.5 110.5q206 -4 326 -115 t109 -294q-14 -208 -265 -326q98 -47 143.5 -133.5t39.5 -192.5q-7 -132 -81 -232t-198 -153.5t-268 -50.5q-195 2 -318 117t-121 303z" />
<glyph unicode="4" d="M17 315l20 197l743 944h295l-157 -908h160l-41 -233h-160l-55 -315h-282l55 315h-578zM330 550l306 -2l99 518l-26 -36z" />
<glyph unicode="5" d="M67 406h277q4 -89 49 -139.5t122 -52.5q100 -3 164.5 73t77.5 204q12 114 -34.5 180t-141.5 68q-106 2 -196 -78l-231 59l196 736h796l-38 -241h-559l-96 -315q89 56 210 56q187 0 289.5 -132.5t86.5 -349.5q-12 -144 -84.5 -259t-190.5 -177t-260 -59 q-123 1 -223.5 56.5t-156.5 153t-57 217.5z" />
<glyph unicode="6" d="M97 559l11 90q47 376 275.5 599.5t569.5 223.5h38l-22 -239l-55 -1q-343 -18 -495 -378q125 123 293 119q118 -2 199.5 -66t119.5 -175t27 -245q-12 -143 -85.5 -261.5t-192.5 -184t-257 -62.5q-143 4 -245.5 80.5t-149.5 209.5t-31 290zM372 422q2 -94 43 -151t116 -58 q74 -3 135 48t90 137t19 175q-9 78 -50.5 123.5t-108.5 46.5q-73 2 -131 -36t-96 -97l-13 -90q-5 -45 -4 -98z" />
<glyph unicode="7" d="M113 0l738 1222h-696l37 234h999l-27 -177l-740 -1279h-311z" />
<glyph unicode="8" d="M62 390q14 242 285 366q-147 117 -137 305q7 124 73 220t177.5 147t243.5 48q189 -4 300 -112.5t100 -286.5q-14 -213 -250 -333q85 -59 127 -146t35 -190q-11 -196 -159 -314t-366 -114q-199 2 -319.5 114t-109.5 296zM348 411q-11 -86 30.5 -141.5t125.5 -57.5 q92 -2 156.5 58t77.5 158q11 86 -31 143t-124 59q-91 2 -156.5 -59t-78.5 -160zM489 1047q-9 -81 24.5 -132.5t104.5 -53.5q78 -2 134 54.5t67 147.5q9 82 -26 130.5t-104 50.5q-79 2 -134 -52.5t-66 -144.5z" />
<glyph unicode="9" d="M143 954q14 161 102 291t229 192q93 41 204 39q180 -4 287 -126t121 -327q4 -71 -3 -141l-11 -86q-49 -381 -271.5 -596t-570.5 -215h-21l22 242h15q197 -3 324 85.5t193 270.5q-123 -114 -263 -112q-120 1 -204 64t-124.5 175.5t-28.5 243.5zM424 868q7 -80 47.5 -128 t106.5 -49q120 -4 212 123l17 121q5 42 5 95q-2 96 -40 154t-110 60q-72 1 -129.5 -51.5t-87 -143.5t-21.5 -181z" />
<glyph unicode=":" horiz-adv-x="571" d="M43 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109zM184 956q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
<glyph unicode=";" horiz-adv-x="531" d="M-97 -284l73 117q64 107 82 201l37 212h238l-29 -184q-41 -259 -252 -427zM167 956q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
<glyph unicode="&#x3c;" horiz-adv-x="1021" d="M36 509l41 236l901 365l-52 -293l-589 -205l519 -201l-46 -267z" />
<glyph unicode="=" horiz-adv-x="1147" d="M81 313l42 236h869l-42 -236h-869zM156 746l42 236h869l-42 -236h-869z" />
<glyph unicode="&#x3e;" horiz-adv-x="1036" d="M33 129l52 292l600 206l-530 203l47 265l783 -365l-41 -235z" />
<glyph unicode="?" horiz-adv-x="998" d="M132 1068q13 190 146.5 301.5t335.5 107.5q189 -4 295 -108t93 -277q-12 -170 -194 -323l-128 -106q-92 -85 -112 -216l-247 -1q9 130 53.5 219.5t138 165t125.5 110.5q86 95 75 202q-10 97 -113 100q-71 2 -120 -45t-65 -128zM228 134q-2 67 43 113t113 48 q64 2 111 -40.5t49 -109.5q2 -63 -42 -110t-114 -49q-67 0 -112.5 41t-47.5 107z" />
<glyph unicode="@" horiz-adv-x="1788" d="M54 111q-30 225 36.5 471t215 441t345 295.5t414.5 97.5q293 -5 462.5 -178.5t182.5 -472.5q6 -169 -40 -336t-136 -282q-136 -173 -340 -168q-172 5 -218 143q-126 -144 -268 -141q-120 2 -182.5 97.5t-54.5 251.5q6 155 83 318t194.5 254t259.5 89q73 -2 137.5 -25 t155.5 -83l-134 -582l-7 -53q-11 -105 74 -110q126 -5 204 148t95 377l3 51q5 161 -45 284t-158 187.5t-265 67.5q-164 3 -311.5 -69.5t-263.5 -213.5t-182.5 -323.5t-73.5 -369.5q-9 -211 74 -353q117 -198 397 -201q161 -2 338 68l28 -158q-129 -86 -365 -86 q-201 2 -338.5 76t-216.5 199t-100 289zM690 320q-11 -160 90 -163q54 -3 109 49t80 120l127 478q-31 11 -69 13q-126 5 -210 -108t-121 -331z" />
<glyph unicode="A" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542z" />
<glyph unicode="B" horiz-adv-x="1278" d="M21 0l253 1456l454 -1q253 -1 380 -103q116 -93 116 -256q0 -15 -1 -31q-14 -221 -255 -323q87 -30 135 -112q42 -72 42 -167q0 -14 -1 -28q-14 -206 -161.5 -320.5t-402.5 -114.5h-559zM356 241l231 -1q108 0 181 53.5t87 144.5q4 24 4 45q-1 57 -29 95q-38 50 -129 55 l-276 1zM461 846l199 -2q111 2 181.5 52t84.5 139q3 19 3 35q0 141 -188 142l-216 1z" />
<glyph unicode="C" horiz-adv-x="1310" d="M94 508q-1 22 -1 45q1 110 27 261q32 183 115.5 325t198.5 225q157 112 356 112h14q226 -4 358.5 -139.5t145.5 -376.5l-292 1q0 138 -55 202t-171 68h-13q-141 0 -233 -107q-96 -112 -130 -327q-28 -186 -28 -289v-24q5 -132 59 -194.5t151 -65.5h18q120 0 196 64 q80 68 107 196l291 2q-17 -151 -103 -267.5t-224 -178.5q-132 -60 -283 -60h-15q-144 3 -251 66.5t-168.5 184t-69.5 277.5z" />
<glyph unicode="D" horiz-adv-x="1301" d="M21 0l253 1456l418 -1q147 -3 264.5 -66.5t190.5 -182.5t88 -268q4 -39 3 -78q0 -49 -5 -100l-7 -53q-44 -320 -251.5 -513.5t-503.5 -193.5h-450zM356 241l122 -1q202 0 324.5 148t140.5 447l2 32v14q0 155 -63 239q-66 88 -197 92l-160 1z" />
<glyph unicode="E" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949z" />
<glyph unicode="F" horiz-adv-x="1098" d="M21 0l253 1456h922l-43 -243h-628l-66 -376h560l-43 -242h-558l-104 -595h-293z" />
<glyph unicode="G" horiz-adv-x="1363" d="M106 508q-2 29 -2 59q0 124 32 279q41 195 139.5 341.5t236.5 218.5q133 70 293 70h13q228 -4 357 -128.5t147 -356.5l-282 1q-11 122 -65 180t-161 62h-13q-176 0 -279 -162q-106 -169 -121 -489q-1 -24 -1 -46q0 -138 54 -219q62 -94 190 -96h15q139 0 239 71l49 251 h-266l39 221h556l-88 -581q-78 -99 -228 -152q-143 -51 -320 -51h-20q-149 1 -262 65.5t-178 185.5t-74 276z" />
<glyph unicode="H" horiz-adv-x="1414" d="M21 0l253 1456h293l-103 -590h566l102 590h293l-252 -1456h-293l108 624h-565l-109 -624h-293z" />
<glyph unicode="I" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293z" />
<glyph unicode="J" horiz-adv-x="1120" d="M7 431l295 -1q-1 -18 -1 -34q0 -172 146 -175h8q82 0 140 58q61 61 79 169l172 1008h293l-171 -1008q-18 -138 -92 -247t-190 -167q-110 -55 -241 -55h-14q-206 4 -318 122q-106 112 -106 309v21z" />
<glyph unicode="K" horiz-adv-x="1271" d="M21 0l253 1456h293l-112 -642l149 168l438 474h382l-629 -662l375 -794h-334l-260 581l-192 -178l-70 -403h-293z" />
<glyph unicode="L" horiz-adv-x="1086" d="M21 0l253 1456h293l-211 -1215h618l-42 -241h-911z" />
<glyph unicode="M" horiz-adv-x="1750" d="M21 0l253 1456h376l179 -1053l543 1053h390l-253 -1456h-294l72 415l142 648l-558 -1063h-201l-195 1100l-94 -717l-67 -383h-293z" />
<glyph unicode="N" horiz-adv-x="1413" d="M21 0l253 1456h283l406 -973l169 973h292l-252 -1456h-284l-405 971l-169 -971h-293z" />
<glyph unicode="O" horiz-adv-x="1382" d="M101 521q-2 32 -2 64q0 136 37 286q46 186 148 327t240 211q132 67 284 67h13q147 -3 257 -69.5t173 -191t72 -282.5q2 -30 2 -61q0 -147 -40 -301q-48 -186 -149 -322q-100 -136 -236 -204q-130 -65 -281 -65h-13q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597 q-1 -26 -1 -51q0 -140 48 -222q57 -96 177 -99h16q146 1 244 123q103 130 135 366l7 54l8 95q1 26 1 51q0 141 -48 219q-58 92 -175 96h-13q-174 0 -278 -162q-108 -168 -121 -470z" />
<glyph unicode="P" horiz-adv-x="1291" d="M21 0l253 1456l510 -1q236 0 371 -131q120 -116 120 -296q0 -23 -2 -46q-16 -214 -178.5 -342t-414.5 -128l-276 1l-90 -513h-293zM445 756l244 -2q118 0 196 61t93 165q4 25 4 47q0 72 -38 119q-48 62 -143 66l-276 1z" />
<glyph unicode="Q" horiz-adv-x="1382" d="M98 522q-2 31 -2 63q0 98 20 211q27 152 90 279t154.5 218t208.5 139q110 44 232 44h16q146 -3 256 -69t174 -190t73 -284q2 -29 2 -58q0 -58 -7 -116l-17 -115q-67 -372 -340 -549l202 -198l-200 -157l-255 248q-47 -7 -88 -7h-18q-218 2 -352 148t-149 393zM391 597 q-1 -26 -1 -51q0 -140 48 -222q57 -95 177 -99h16q146 0 244 123q103 129 135 366q13 96 16 149q1 20 1 39q0 156 -51 234q-58 89 -173 93h-13q-174 0 -278 -162q-107 -168 -121 -470z" />
<glyph unicode="R" horiz-adv-x="1278" d="M21 0l253 1456l482 -1q242 0 372 -114q117 -102 117 -276q0 -20 -1 -41q-21 -300 -320 -417l205 -591v-16h-312l-172 533h-238l-93 -533h-293zM449 776l218 -2q116 2 191.5 62.5t90.5 164.5q3 23 3 44q0 66 -34 108q-45 55 -143 59l-250 1z" />
<glyph unicode="S" horiz-adv-x="1231" d="M38 459l293 -1q-1 -13 0 -25q0 -212 233 -216q107 0 176 47t82 125q3 16 3 30q0 97 -120 152l-193 77q-320 143 -320 388q0 12 1 25q7 122 80 216q73 93 205 147q127 52 274 52h11q211 -4 341 -126q128 -120 128 -319v-6h-292v18q0 86 -44 136q-48 55 -150 57h-8 q-95 0 -166 -46q-74 -48 -88 -130q-2 -11 -2 -22q0 -94 148 -151l132 -50l76 -35q277 -137 277 -378q0 -16 -1 -32q-9 -129 -82.5 -222.5t-199.5 -143.5q-119 -47 -262 -47h-17q-155 3 -276 65t-184 175q-55 98 -55 223v17z" />
<glyph unicode="T" horiz-adv-x="1239" d="M144 1213l43 243h1152l-43 -243h-432l-210 -1213h-293l210 1213h-427z" />
<glyph unicode="U" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-4 -30 -4 -58q0 -24 3 -47q20 -162 193 -168h13q115 0 190 68q79 72 102 206l164 961h294l-164 -960q-34 -241 -200 -381q-161 -136 -398 -136h-14q-154 3 -267 67q-114 64 -168 182q-41 89 -41 197q0 34 4 70z" />
<glyph unicode="V" horiz-adv-x="1309" d="M145 1456h315l146 -1092l490 1092h336l-719 -1456h-306z" />
<glyph unicode="W" horiz-adv-x="1747" d="M170 1456h286l29 -1028l392 1028h249l69 -1033l351 1033h299l-541 -1456h-295l-77 970l-381 -970h-295z" />
<glyph unicode="X" horiz-adv-x="1272" d="M-81 0l547 748l-293 708h320l186 -500l343 500h352l-535 -736l302 -720h-324l-191 508l-351 -508h-356z" />
<glyph unicode="Y" horiz-adv-x="1238" d="M154 1455l309 1l177 -654l407 654h336l-636 -944l-88 -512h-298l95 545z" />
<glyph unicode="Z" horiz-adv-x="1214" d="M-34 0l33 191l871 1020l-693 2l43 243h1061l-33 -187l-870 -1026l708 -2l-42 -241h-1078z" />
<glyph unicode="[" horiz-adv-x="562" d="M-31 -339l318 2033h421l-35 -223h-138l-248 -1587h138l-35 -223h-421z" />
<glyph unicode="\" horiz-adv-x="848" d="M154 1456h275l316 -1581h-276z" />
<glyph unicode="]" horiz-adv-x="562" d="M-135 -339l35 223h139l248 1587h-139l35 223h421l-318 -2033h-421z" />
<glyph unicode="^" horiz-adv-x="878" d="M57 729l417 727h205l164 -727h-211l-89 454l-247 -454h-239z" />
<glyph unicode="_" horiz-adv-x="897" d="M-143 -226l40 226h885l-39 -226h-886z" />
<glyph unicode="`" horiz-adv-x="667" d="M204 1534l291 2l143 -310l-211 1z" />
<glyph unicode="a" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5h-7q-61 -1 -105 -33q-46 -34 -59 -99l-283 -1q6 156 142 252q133 95 327 94h8q184 -4 288 -110q89 -91 89 -226q0 -22 -2 -45l-83 -518l-5 -64v-13q0 -62 17 -107l-1 -19h-277 q-11 36 -11 83v15q-118 -118 -266 -118h-10q-142 2 -236 92q-88 85 -87 208v16zM306 317q-2 -11 -1 -21q-1 -38 23 -64q30 -32 84 -33h9q117 0 204 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81z" />
<glyph unicode="b" horiz-adv-x="1128" d="M3 0l266 1536h283l-109 -553q110 119 255 119h9q157 -2 246.5 -112.5t95.5 -305.5q0 -12 1 -26q0 -53 -7 -120q-30 -256 -156 -410q-122 -149 -313 -149h-13q-171 4 -260 138l-41 -117h-257zM340 325q38 -108 162 -112h8q201 0 247 302l6 44q7 64 7 106q0 14 -1 26 q-11 174 -144 177h-8q-119 0 -199 -113z" />
<glyph unicode="c" horiz-adv-x="1046" d="M47 469l3 55l1 11q27 265 178 419q145 149 357 148h16q182 -4 290 -120q106 -113 106 -297v-7h-263q0 87 -38 137t-114 54h-8q-195 0 -237 -295q-12 -86 -12 -151q0 -17 1 -33q10 -175 150 -178h7q74 0 123 42q52 44 68 119l265 1q-7 -114 -71.5 -205t-172.5 -142 q-102 -48 -213 -48h-13q-197 3 -312 136q-111 129 -111 339v15z" />
<glyph unicode="d" horiz-adv-x="1129" d="M49 399q-1 21 -1 42q0 41 4 80l6 45q24 166 92 292t168 187q95 58 211 58h11q151 -4 244 -121l106 554h283l-266 -1536h-252l16 116q-118 -137 -273 -137h-9q-101 1 -177 53t-117.5 149.5t-45.5 217.5zM330 393q10 -176 142 -179h10q113 0 197 112l77 430 q-39 107 -156 112h-7q-99 0 -165 -80q-68 -82 -93 -267q-6 -55 -6 -98q0 -16 1 -30z" />
<glyph unicode="e" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290q77 131 198 203q115 68 252 68h16q209 -4 317 -154q87 -120 86 -292q0 -42 -5 -86l-16 -123h-663v-14q0 -95 51 -154q55 -63 150 -65h10q148 0 260 119l129 -160q-61 -91 -176 -143q-111 -50 -237 -50h-10q-142 1 -251.5 69.5t-163.5 188.5 q-44 98 -44 211q0 26 2 52zM360 643h388l6 26q3 22 3 42q0 17 -2 34q-10 58 -49 90.5t-99 33.5h-6q-75 0 -133 -49q-60 -51 -108 -177z" />
<glyph unicode="f" horiz-adv-x="722" d="M74 870l37 212l156 1l14 108q26 173 141 271q113 97 286 97h7q61 -2 153 -21l-25 -225q-48 12 -83 12h-4q-72 0 -124 -38q-54 -39 -67 -117l-15 -88h209l-37 -212h-208l-151 -870h-284l151 870h-156z" />
<glyph unicode="g" horiz-adv-x="1144" d="M-16 -251l140 172q94 -119 236 -123h13q102 0 175 58q78 61 106 173l16 65q-114 -114 -255 -114h-10q-158 2 -251 117.5t-102 300.5q-1 17 -1 35q0 49 6 109q30 251 163 408q131 153 329 153h8q173 -4 258 -125l37 105l259 -1l-177 -1045q-29 -216 -184 -342 q-150 -122 -370 -122h-14q-112 2 -214 48.5t-168 127.5zM334 424q0 -94 39.5 -150.5t114.5 -59.5h9q109 0 195 98l84 458q-43 94 -159 98h-7q-103 0 -176 -87q-75 -90 -94 -239q-6 -64 -6 -106v-12z" />
<glyph unicode="h" horiz-adv-x="1122" d="M-4 0l266 1536h283l-112 -574q125 140 288 140h5q160 -4 236 -116q60 -89 61 -230q0 -36 -4 -74l-114 -682h-282l115 685q3 24 3 46q0 13 -1 26q-10 108 -126 111h-9q-109 0 -191 -98l-136 -770h-282z" />
<glyph unicode="i" horiz-adv-x="537" d="M17 0l188 1082h284l-188 -1082h-284zM238 1357v6q0 63 44 105q46 44 111 44h6q60 0 105 -39q47 -41 49 -106v-5q1 -59 -41 -103q-44 -46 -114 -48h-6q-58 0 -104 38q-48 40 -50 108z" />
<glyph unicode="j" horiz-adv-x="526" d="M-262 -421l23 230q50 -11 87 -13h4q129 0 158 144l196 1142h284l-194 -1141q-23 -181 -130 -282q-106 -99 -271 -99h-7q-68 2 -150 19zM233 1357v6q0 62 42 103q44 44 113 46q69 0 113.5 -41t46.5 -104v-6q0 -63 -42 -105q-44 -43 -113 -45h-6q-59 0 -105 38 q-47 40 -49 108z" />
<glyph unicode="k" horiz-adv-x="1071" d="M3 0l266 1536h283l-146 -834l55 59l321 321h362l-473 -465l301 -617h-309l-192 431l-131 -114l-55 -317h-282z" />
<glyph unicode="l" horiz-adv-x="537" d="M17 0l267 1536h283l-266 -1536h-284z" />
<glyph unicode="m" horiz-adv-x="1730" d="M3 0l187 1082l263 1l-23 -123q128 142 307 142h10q100 -2 166 -46t89 -119q140 165 327 165h9q148 -3 224 -102q65 -85 65 -236q0 -24 -1 -50l-2 -25l-115 -689h-283l115 691q3 30 3 56v13q-7 105 -120 108q-116 0 -199 -124l-3 -23l-126 -721h-282l115 689q3 30 3 56v13 q-7 106 -119 109h-6q-103 0 -187 -101l-135 -766h-282z" />
<glyph unicode="n" horiz-adv-x="1123" d="M-3 0l188 1082l264 1l-24 -128q127 147 305 147h10q153 -3 226 -112q57 -86 57 -223q0 -38 -4 -79l-114 -688h-282l116 691q3 24 3 46q0 13 -1 25q-13 102 -128 105h-8q-106 0 -191 -103l-135 -764h-282z" />
<glyph unicode="o" horiz-adv-x="1133" d="M58 524q26 268 182 426q150 152 366 152h16q143 -2 246 -74q104 -70 152 -196q38 -97 38 -212q0 -33 -3 -67q-23 -257 -179 -417q-153 -156 -376 -156h-11q-141 2 -244 72.5t-152 195.5q-38 97 -38 210q0 32 3 66zM337 421q2 -96 45 -151.5t121 -57.5h8q124 0 196 120 q69 116 69 299v25q-4 96 -46.5 153.5t-121.5 59.5h-8q-120 -1 -194 -119q-70 -113 -69 -299v-30z" />
<glyph unicode="p" horiz-adv-x="1128" d="M-69 -416l259 1498l260 1l-19 -109q114 128 267 128h9q159 -4 247 -115.5t94 -302.5v-26q0 -53 -6 -120q-21 -170 -89 -302t-169 -196q-96 -61 -213 -61h-11q-157 4 -248 117l-99 -512h-282zM339 318q37 -101 159 -105h7q97 0 163 79q68 82 94 267l6 96v10q0 90 -36 144 q-37 57 -109 59h-9q-117 0 -194 -104z" />
<glyph unicode="q" horiz-adv-x="1132" d="M49 400q-1 21 -1 42q0 41 4 81l6 44q24 168 92.5 294t167.5 185q95 57 210 57h12q168 -4 257 -136l46 116l252 -1l-260 -1498h-284l101 511q-109 -115 -253 -115h-10q-101 1 -177 53t-117.5 150.5t-45.5 216.5zM331 394q10 -178 142 -181h8q114 0 196 105l82 450 q-39 97 -157 101h-7q-101 0 -168 -83q-69 -87 -89 -242q-8 -79 -8 -125q0 -14 1 -25z" />
<glyph unicode="r" horiz-adv-x="735" d="M3 0l188 1082l265 1l-26 -132q102 153 252 153q42 0 98 -14l-36 -279q-58 10 -95 10h-10q-144 0 -229 -113l-125 -708h-282z" />
<glyph unicode="s" horiz-adv-x="1031" d="M9 346l266 -2q4 -155 166 -157q78 0 128.5 32t60.5 86q2 9 2 17q0 67 -113 99l-91 23q-314 87 -314 302v12q6 154 136 250q128 95 307 94h7q183 -2 296 -97t115 -253l-280 1q2 139 -138 141q-66 0 -114.5 -33t-59.5 -89q-1 -8 -1 -15q0 -68 122 -98l40 -9 q138 -33 211 -75.5t113 -105.5q37 -59 36 -139v-12q-3 -103 -66.5 -180t-173.5 -119q-103 -39 -217 -39h-16q-180 2 -300 103.5t-122 262.5z" />
<glyph unicode="t" horiz-adv-x="681" d="M56 870l37 212h153l46 266h283l-47 -266h180l-37 -212h-180l-92 -542q-2 -15 -2 -28q0 -31 10 -50q14 -27 68 -29h6q20 0 80 5l-20 -221q-69 -23 -149 -23h-13q-139 2 -207 87q-58 72 -58 188q0 20 2 42l93 571h-153z" />
<glyph unicode="u" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103h10q125 0 207 101l135 767h284l-188 -1082h-263l21 112q-117 -132 -290 -132h-8q-156 2 -236 112q-65 90 -65 226q0 31 3 64z" />
<glyph unicode="v" horiz-adv-x="1014" d="M92 1082h286l80 -725l308 725h304l-523 -1082h-270z" />
<glyph unicode="w" horiz-adv-x="1470" d="M115 1082h264l17 -681l309 681h204l71 -688l257 688h281l-455 -1082h-236l-80 677l-316 -677h-236z" />
<glyph unicode="x" horiz-adv-x="1021" d="M-82 0l408 566l-209 516h286l121 -321l227 321h317l-392 -544l219 -538h-286l-133 338l-239 -338h-319z" />
<glyph unicode="y" horiz-adv-x="1007" d="M-55 -419l21 220l39 -2h10q130 0 192 101l62 115l-177 1067h292l78 -670l309 670h314l-633 -1245q-68 -143 -159.5 -210t-211.5 -67q-47 0 -136 21z" />
<glyph unicode="z" horiz-adv-x="1021" d="M-33 0l33 191l603 655l-475 2l41 234h843l-32 -185l-609 -662l510 -2l-41 -233h-873z" />
<glyph unicode="{" horiz-adv-x="666" d="M39 513l19 207q185 8 215 222l32 230q59 325 404 429l47 -166q-168 -65 -201 -304l-32 -229q-34 -193 -223 -289q69 -51 101 -128.5t23 -175.5l-31 -236l-4 -57q-7 -162 110 -215l-61 -161q-158 53 -235 173q-77 121 -59 293l28 205q5 42 2 78q-10 113 -135 124z" />
<glyph unicode="|" horiz-adv-x="512" d="M31 -270l270 1726h172l-270 -1726h-172z" />
<glyph unicode="}" horiz-adv-x="666" d="M-94 -197q168 65 201 304l32 230q34 193 226 287q-72 49 -104 128t-23 177l31 236l4 57q7 161 -109 215l64 158q161 -54 234.5 -174.5t55.5 -288.5l-28 -204q-5 -43 -2 -78q10 -115 135 -126l-19 -207q-186 -10 -215 -221l-27 -199q-51 -353 -409 -461z" />
<glyph unicode="~" horiz-adv-x="1298" d="M80 415q12 186 109.5 301t248.5 112q77 -2 138.5 -35.5t133.5 -108t131 -74.5q62 0 104.5 50t55.5 134l202 1q-6 -118 -52 -216.5t-124 -152.5t-179 -52q-77 2 -137.5 35t-117.5 92t-86 75t-64 17q-59 0 -99.5 -47.5t-54.5 -132.5z" />
<glyph unicode="&#xa1;" horiz-adv-x="571" d="M-37 -369l208 1008h235l-143 -1008h-300zM184 943q-2 65 42 111t113 48q64 2 111 -39.5t49 -109.5q2 -69 -44 -114t-111 -45q-63 -2 -110.5 40t-49.5 109z" />
<glyph unicode="&#xa2;" horiz-adv-x="1153" d="M96 523q25 246 150 392.5t326 178.5l47 224h196l-47 -228q133 -32 207.5 -139.5t72.5 -272.5h-264l-1 34q-13 151 -147 157q-101 5 -167.5 -74t-87.5 -243q-12 -110 -9 -161q5 -176 146 -179q78 -2 131 42.5t68 118.5l266 2q-11 -151 -117.5 -254.5t-273.5 -131.5 l-49 -234h-196l50 236q-164 38 -243 182t-58 350z" />
<glyph unicode="&#xa3;" horiz-adv-x="1190" d="M-6 0l43 240l75 -2q48 19 75 59.5t41 123.5l21 155h-158l41 236h150l27 221q26 208 162 327t336 115q191 -4 296.5 -116t101.5 -302l-280 1q5 174 -136 177q-70 2 -120.5 -51t-65.5 -144l-27 -228h300l-41 -236h-291l-17 -147q-16 -109 -101 -192l640 4l-43 -241h-1029z " />
<glyph unicode="&#xa4;" horiz-adv-x="1385" d="M-3 132l154 125q-57 185 -37 345q26 215 171 375l-115 157l148 130l109 -143q177 116 354 112q185 -2 321 -116l170 148l123 -159l-169 -139q62 -186 42 -352q-24 -203 -157 -360l111 -151l-149 -131l-101 132q-182 -129 -369 -125q-200 4 -331 126l-153 -132zM295 599 q-15 -110 19 -209.5t110 -158.5t181 -63q114 -4 219 56t175.5 166t88.5 227q15 110 -19 209t-110 157t-180 62q-115 4 -221.5 -56.5t-175.5 -164.5t-87 -225z" />
<glyph unicode="&#xa5;" horiz-adv-x="1226" d="M75 278l31 174h325l21 115h-327l31 175h261l-245 713l310 1l161 -604l373 604h337l-492 -712l225 -2l-33 -175h-308l-21 -115h310l-31 -174h-308l-49 -278h-293l49 278h-327z" />
<glyph unicode="&#xa6;" horiz-adv-x="511" d="M-28 -270l139 795h254l-138 -795h-255zM140 698l132 758h254l-132 -758h-254z" />
<glyph unicode="&#xa7;" horiz-adv-x="1258" d="M-24 -34h281q-4 -91 51 -137t160 -46q109 0 175 38t80 106q20 98 -136 155l-97 31q-228 70 -322 167.5t-85 245.5q10 177 205 286q-96 113 -86 275q12 166 143 269t341 118l67 2q218 -4 339.5 -116.5t117.5 -311.5h-280q3 91 -46 141.5t-141 52.5q-103 3 -172.5 -38.5 t-84.5 -113.5q-22 -117 153 -165.5t267.5 -95t143.5 -104.5q85 -96 76 -236q-7 -102 -62.5 -170t-142.5 -114q95 -111 84 -275q-8 -117 -75.5 -203t-191.5 -134t-280 -45q-230 2 -358 112t-124 306zM372 555q-24 -121 144 -176l79 -25l130 -43q95 56 115 149 q21 110 -140 170l-221 75q-90 -55 -107 -150z" />
<glyph unicode="&#xa8;" horiz-adv-x="937" d="M210 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM683 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xa9;" horiz-adv-x="1568" d="M114 722q17 152 86 292.5t180.5 247.5t245 162t276.5 52q183 -4 325 -102.5t214.5 -272t51.5 -366.5q-21 -189 -120.5 -356t-254.5 -272q-194 -131 -413 -127q-185 4 -326.5 103.5t-213.5 273.5t-51 365zM235 722q-22 -159 29.5 -302.5t165 -228.5t262.5 -87 q161 -4 306.5 78.5t246.5 230.5t126 323q22 159 -29.5 301.5t-163.5 226t-264 87.5q-162 4 -311.5 -81t-247.5 -234.5t-120 -313.5zM444 669l11 110q19 184 122.5 291.5t258.5 105.5q145 -4 225 -87t78 -230l-152 2q13 177 -146 181q-93 2 -155.5 -69.5t-77 -196t-15 -145 t1.5 -47.5q3 -73 40 -118.5t102 -48.5q169 -7 200 179l152 1q-10 -150 -101 -234.5t-244 -80.5q-148 4 -230.5 113.5t-69.5 273.5z" />
<glyph unicode="&#xaa;" horiz-adv-x="892" d="M187 911q2 115 94.5 177.5t260.5 62.5l106 -2l12 55l4 46q-3 75 -81 78q-120 4 -147 -99l-173 13q7 110 94.5 173.5t219.5 61.5q121 -2 193 -77t62 -200l-53 -347l-4 -59q-1 -44 8 -92h-164l-3 72q-89 -83 -201 -83q-105 0 -166.5 60t-61.5 160zM362 915q-7 -38 15.5 -60 t70.5 -22q69 0 161 63l28 137h-80q-84 -3 -135 -34.5t-60 -83.5z" />
<glyph unicode="&#xab;" horiz-adv-x="1002" d="M60 513l1 21l330 390h203l-316 -416l162 -382l-167 -1zM433 513l1 21l330 390h203l-316 -416l162 -382l-167 -1z" />
<glyph unicode="&#xac;" horiz-adv-x="1105" d="M127 634l30 171h812l-75 -431h-196l46 260h-617z" />
<glyph unicode="&#xad;" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
<glyph unicode="&#xae;" horiz-adv-x="1568" d="M114 722q17 152 86 292.5t180.5 247.5t245 162t276.5 52q183 -4 325 -102.5t214.5 -272t51.5 -366.5q-21 -189 -120.5 -356t-254.5 -272q-194 -131 -413 -127q-185 4 -326.5 103.5t-213.5 273.5t-51 365zM235 722q-22 -160 30 -304t164 -227t263 -87q157 -4 304.5 78 t248.5 230.5t126 323.5q22 159 -29.5 301.5t-163.5 226t-264 87.5q-162 4 -311.5 -81t-247.5 -234.5t-120 -313.5zM452 316l133 850l256 -1q142 -5 218.5 -73t71.5 -182q-3 -58 -36 -103t-101 -84q68 -49 74 -149q1 -29 -5.5 -89.5t-4.5 -88.5l4 -63l-1 -19l-148 1 q-6 37 -4 73q1 43 12 128q7 63 -14 97t-87 38l-167 2l-53 -337h-148zM674 787l116 -1q82 3 134 35.5t63 87.5q11 58 -17 89t-117 34l-141 1z" />
<glyph unicode="&#xaf;" horiz-adv-x="1005" d="M250 1290l27 167h710l-27 -167h-710z" />
<glyph unicode="&#xb0;" horiz-adv-x="781" d="M228 1191q2 117 86.5 202.5t195.5 83.5q104 -2 173.5 -82t67.5 -186q-2 -116 -84.5 -200t-193.5 -82q-105 2 -176 79.5t-69 184.5zM371 1193q-6 -45 20 -81t74 -36q51 0 93 37t51 94q6 49 -19 85.5t-72 36.5q-51 0 -94.5 -40t-52.5 -96z" />
<glyph unicode="&#xb1;" horiz-adv-x="1077" d="M15 1l37 235h840l-37 -235h-840zM101 701l38 241h325l54 343h247l-54 -343h319l-38 -241h-318l-57 -364h-248l57 364h-325z" />
<glyph unicode="&#xb2;" horiz-adv-x="750" d="M81 667l26 150l335 270q95 79 107 141q8 36 -10 57t-54 21q-97 0 -121 -112l-204 -2q8 126 96.5 202.5t216.5 74.5q131 -2 207.5 -66.5t74.5 -175.5q-5 -138 -169 -255l-78 -55l-130 -84l336 -2l-30 -164h-603z" />
<glyph unicode="&#xb3;" horiz-adv-x="750" d="M96 904l195 -1q7 -82 102 -82q52 0 89 25t46 68q16 80 -94 85h-94l10 137h81q54 2 90.5 26.5t45.5 68.5q5 34 -18 52.5t-59 18.5q-80 0 -108 -60l-208 -1q7 106 89.5 167t212.5 59q136 -3 214.5 -61.5t75.5 -157.5q-3 -118 -158 -183q58 -20 87 -65.5t28 -105.5 q-2 -111 -97.5 -176.5t-239.5 -62.5q-129 2 -208.5 69t-81.5 180z" />
<glyph unicode="&#xb4;" horiz-adv-x="669" d="M186 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xb5;" horiz-adv-x="1233" d="M-42 -416l260 1498h282l-103 -622l-6 -83q-7 -160 125 -163q133 -4 221 104l135 764h282l-188 -1082h-248l8 69q-106 -93 -230 -91q-93 0 -169 48l-87 -442h-282z" />
<glyph unicode="&#xb6;" horiz-adv-x="983" d="M149 980q19 214 168 345.5t372 131.5l313 -1l-253 -1456h-214l90 520l-52 1q-211 3 -326.5 130t-97.5 329z" />
<glyph unicode="&#xb7;" horiz-adv-x="608" d="M154 692q-2 67 43 113t113 48q65 2 112.5 -41t49.5 -110q2 -65 -43.5 -112.5t-114.5 -47.5q-64 -2 -111 39.5t-49 110.5z" />
<glyph unicode="&#xb8;" horiz-adv-x="542" d="M-45 -465l8 170q111 5 128 88q12 61 -86 68l-35 3l43 142l209 3l-20 -64q62 -13 93.5 -56.5t31.5 -105.5q0 -115 -96 -179t-276 -69z" />
<glyph unicode="&#xb9;" horiz-adv-x="750" d="M229 1172l30 168l369 115l25 1l-128 -787h-200l95 543z" />
<glyph unicode="&#xba;" horiz-adv-x="918" d="M200 1044l5 63q13 167 117.5 270.5t258.5 99.5q148 -4 229 -105.5t71 -250.5l-6 -66q-16 -171 -120.5 -270.5t-253.5 -95.5q-144 4 -228 103.5t-73 251.5zM372 969q5 -61 38.5 -97.5t89.5 -37.5q76 -3 131 53.5t70 156.5l11 101l-1 49q-15 132 -128 135q-77 3 -132 -52.5 t-70 -155.5l-9 -80q-3 -36 0 -72z" />
<glyph unicode="&#xbb;" horiz-adv-x="1002" d="M-10 124l315 415l-161 383l167 1l213 -387l-1 -22l-330 -390h-203zM371 124l315 415l-161 383l167 1l213 -387l-1 -22l-330 -390h-203z" />
<glyph unicode="&#xbc;" horiz-adv-x="1436" d="M194 1167l30 168l369 115l25 1l-128 -787h-200l95 543zM235 204l878 1124l137 -83l-876 -1126zM652 159l14 150l419 479l203 2l-80 -466l96 1l-31 -166h-85l-29 -159h-200l28 159h-335zM866 328l152 -3l44 216l-18 -25z" />
<glyph unicode="&#xbd;" horiz-adv-x="1522" d="M178 1173l30 168l369 115l25 1l-128 -787h-200l95 543zM194 204l878 1124l137 -83l-876 -1126zM726 0l26 150l335 270q95 79 107 141q8 36 -10 57t-54 21q-97 0 -121 -112l-204 -2q8 126 96.5 202.5t216.5 74.5q131 -2 207.5 -66.5t74.5 -175.5q-5 -138 -169 -255 l-78 -55l-130 -84l336 -2l-30 -164h-603z" />
<glyph unicode="&#xbe;" horiz-adv-x="1615" d="M141 905l195 -1q7 -82 102 -82q52 0 89 25t46 68q16 80 -94 85h-94l10 137h81q54 2 90.5 26.5t45.5 68.5q5 34 -18 52.5t-59 18.5q-80 0 -108 -60l-208 -1q7 106 89.5 167t212.5 59q136 -3 214.5 -61.5t75.5 -157.5q-3 -118 -158 -183q58 -20 87 -65.5t28 -105.5 q-2 -111 -97.5 -176.5t-239.5 -62.5q-129 2 -208.5 69t-81.5 180zM391 204l878 1124l137 -83l-876 -1126zM806 159l14 150l419 479l203 2l-80 -466l96 1l-31 -166h-85l-29 -159h-200l28 159h-335zM1020 328l152 -3l44 216l-18 -25z" />
<glyph unicode="&#xbf;" horiz-adv-x="998" d="M-31 -2q11 161 179 311l145 121q86 79 109 213l246 1q-8 -122 -50 -211t-128 -162l-68 -57q-127 -106 -144 -216q-9 -64 17 -106t95 -44q71 -2 120.5 42t68.5 131l282 2q-13 -191 -145.5 -301.5t-335.5 -106.5q-186 2 -294 104t-97 279zM432 944q-2 69 44 114t111 45 q64 2 111 -39.5t49 -109.5q2 -69 -44 -114t-111 -45q-64 -2 -111 39.5t-49 109.5z" />
<glyph unicode="&#xc0;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542zM532 1844l291 2l143 -310l-211 1z" />
<glyph unicode="&#xc1;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542zM690 1536l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xc2;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM471 1551v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM489 543h351l-82 542z" />
<glyph unicode="&#xc3;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM477 1566q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z M489 543h351l-82 542z" />
<glyph unicode="&#xc4;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM485 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM489 543h351l-82 542zM958 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33 t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xc5;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542zM651 1723q0 90 66 151.5t157 61.5q87 0 148.5 -58.5t61.5 -140.5q2 -86 -63.5 -147.5t-159.5 -61.5q-86 0 -147 56t-63 139zM764 1723q-7 -40 15 -70t65 -30q47 0 83 32.5 t45 81.5q6 43 -17 72.5t-63 29.5q-47 0 -84.5 -34t-43.5 -82z" />
<glyph unicode="&#xc6;" horiz-adv-x="1877" d="M-111 0l1015 1456h996l-42 -236h-580l-47 -355h488l-42 -236h-477l-53 -394h600l-41 -235h-871l44 333h-423l-220 -333h-347zM615 582l298 -2l73 552z" />
<glyph unicode="&#xc7;" horiz-adv-x="1310" d="M94 508q-7 123 25.5 306t116 325t198.5 225q162 116 370 112q226 -4 358.5 -139.5t145.5 -376.5l-292 1q0 138 -55 202t-171 68q-150 5 -246.5 -107t-129.5 -327q-32 -209 -28 -313q5 -132 59 -194.5t151 -65.5q134 -5 214.5 63.5t106.5 196.5l291 2 q-17 -151 -103 -267.5t-224 -179t-298 -59.5q-144 3 -251 66.5t-168.5 184t-69.5 277.5zM393 -466l8 170q111 5 128 88q12 61 -86 68l-35 3l43 142l209 3l-20 -64q62 -13 93.5 -56.5t31.5 -105.5q0 -115 -96 -179t-276 -69z" />
<glyph unicode="&#xc8;" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM477 1847l291 2l143 -310l-211 1z" />
<glyph unicode="&#xc9;" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM635 1539l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xca;" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM416 1554v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#xcb;" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM430 1675q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM903 1675q-2 54 36 91.5t94 39.5q53 2 95.5 -33 t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xcc;" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM151 1847l291 2l143 -310l-211 1z" />
<glyph unicode="&#xcd;" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM308 1539l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xce;" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM90 1554v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#xcf;" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM104 1675q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM577 1675q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z " />
<glyph unicode="&#xd0;" horiz-adv-x="1331" d="M-13 642l33 183h174l110 631l416 -1q147 -2 265.5 -66t191.5 -183t88 -268q8 -87 -2 -178l-7 -53q-44 -320 -251.5 -513.5t-503.5 -193.5h-450l111 642h-175zM386 241l122 -1q202 0 324.5 148t140.5 447l2 32q3 165 -63 253t-197 92l-160 1l-68 -388h213l-33 -183h-212z " />
<glyph unicode="&#xd1;" horiz-adv-x="1413" d="M21 0l253 1456h283l406 -973l169 973h292l-252 -1456h-284l-405 971l-169 -971h-293zM510 1566q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8 q-76 -3 -101 -98z" />
<glyph unicode="&#xd2;" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM546 1844l291 2l143 -310l-211 1z" />
<glyph unicode="&#xd3;" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM704 1536l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xd4;" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM485 1551v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#xd5;" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM491 1566q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z" />
<glyph unicode="&#xd6;" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM499 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM972 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5 t-97 34.5t-41 90.5z" />
<glyph unicode="&#xd7;" horiz-adv-x="1065" d="M25 386l353 313l-244 313l180 155l242 -310l348 311l148 -182l-353 -314l244 -312l-179 -156l-243 310l-348 -309z" />
<glyph unicode="&#xd8;" horiz-adv-x="1379" d="M12 -94l194 244q-138 232 -99 545l8 58q30 214 129.5 382t249 256t330.5 86q169 -4 294 -84l99 125l202 -1l-183 -229q120 -232 84 -529l-5 -40q-42 -333 -234.5 -538t-474.5 -202q-155 2 -279 72l-112 -146zM387 552q-5 -72 3 -144l575 764q-51 54 -152 59 q-158 5 -262.5 -122t-139.5 -360q-19 -128 -24 -197zM479 268q51 -40 139 -45q147 -5 249 108t143 329.5t34 359.5z" />
<glyph unicode="&#xd9;" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM511 1844l291 2l143 -310l-211 1z" />
<glyph unicode="&#xda;" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM669 1536l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xdb;" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM450 1551v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#xdc;" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM464 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5 t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM937 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xdd;" horiz-adv-x="1238" d="M154 1455l309 1l177 -654l407 654h336l-636 -944l-88 -512h-298l95 545zM635 1536l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xde;" horiz-adv-x="1219" d="M24 0l253 1456h282l-47 -267l177 -1q234 -1 365 -122t116 -320q-11 -141 -88 -245t-206 -159.5t-286 -55.5l-233 1l-51 -287h-282zM397 520l198 -1q113 0 194.5 59.5t98.5 165.5q14 95 -36 151t-147 60l-232 1z" />
<glyph unicode="&#xdf;" horiz-adv-x="1263" d="M26 0l188 1101q29 218 168 341t352 117q174 -4 275 -104.5t90 -257.5q-3 -46 -19 -86.5t-61 -115.5t-58 -106t-20 -68q-8 -46 12.5 -94.5t80.5 -123t86.5 -131t24.5 -109.5q-9 -179 -139.5 -282.5t-335.5 -101.5q-166 2 -279 59l76 227q89 -55 205 -53q72 0 127 38 t68 107q8 48 -13.5 96t-87.5 123.5t-92 135.5q-20 46 -17 96q3 45 19 84.5t58.5 110t57.5 106.5t20 75q8 62 -22.5 103t-93.5 44q-82 3 -133 -56t-68 -177l-187 -1098h-282z" />
<glyph unicode="&#xe0;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81zM342 1534l291 2l143 -310l-211 1z" />
<glyph unicode="&#xe1;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81zM500 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xe2;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM281 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81z" />
<glyph unicode="&#xe3;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM287 1257q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98zM306 317 q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81z" />
<glyph unicode="&#xe4;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM295 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95 q-25 -33 -31 -81zM768 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xe5;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81zM461 1413q0 90 66 151.5t157 61.5q87 0 148.5 -58.5t61.5 -140.5q2 -86 -63.5 -147.5t-159.5 -61.5 q-86 0 -147 56t-63 139zM574 1413q-7 -40 15 -70t65 -30q47 0 83 32.5t45 81.5q6 43 -17 72.5t-63 29.5q-47 0 -84.5 -34t-43.5 -82z" />
<glyph unicode="&#xe6;" horiz-adv-x="1687" d="M15 311q7 164 144.5 251.5t377.5 87.5l167 -2l13 60q5 33 2 62q-14 96 -115 99q-70 2 -123 -30.5t-66 -93.5l-281 18q8 160 148 252t338 88q204 -5 302 -110q151 112 331 108q192 -4 295.5 -139.5t79.5 -349.5l-25 -162h-642q-10 -108 42 -171t156 -65q81 -2 154 20 t145 56l61 -193q-135 -117 -396 -117q-243 5 -352 146q-170 -150 -404 -146q-106 1 -189.5 42.5t-125.5 115t-37 173.5zM299 307q-10 -53 25 -84.5t102 -31.5q96 0 216 80l38 190l-139 1q-99 -3 -165 -45t-77 -110zM981 643h369l7 31q6 36 4 71q-7 118 -124 124 q-171 6 -256 -226z" />
<glyph unicode="&#xe7;" horiz-adv-x="1046" d="M47 469l3 55l1 11q27 264 178 418.5t373 148.5q183 -4 290.5 -119.5t105.5 -304.5h-263q0 87 -38 137t-114 54q-202 6 -245 -295q-15 -109 -11 -184q10 -175 150 -178q78 -2 130 42.5t68 118.5l265 1q-7 -114 -71.5 -205t-172 -142t-226.5 -48q-197 3 -312 136t-111 354z M277 -466l8 170q111 5 128 88q12 61 -86 68l-35 3l43 142l209 3l-20 -64q62 -13 93.5 -56.5t31.5 -105.5q0 -115 -96 -179t-276 -69z" />
<glyph unicode="&#xe8;" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM323 1534l291 2l143 -310l-211 1zM360 643 h388l6 26q6 40 1 76q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177z" />
<glyph unicode="&#xe9;" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM360 643h388l6 26q6 40 1 76 q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177zM481 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xea;" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM262 1241v23l321 272l161 1l261 -277v-21 l-216 5l-123 144l-175 -143zM360 643h388l6 26q6 40 1 76q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177z" />
<glyph unicode="&#xeb;" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM276 1362q-2 54 36 91.5t95 39.5 q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM360 643h388l6 26q6 40 1 76q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177zM749 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5 t-41 90.5z" />
<glyph unicode="&#xec;" horiz-adv-x="554" d="M25 0l188 1082h282l-188 -1082h-282zM77 1519l291 2l143 -310l-211 1z" />
<glyph unicode="&#xed;" horiz-adv-x="554" d="M25 0l188 1082h282l-188 -1082h-282zM234 1211l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xee;" horiz-adv-x="554" d="M16 1226v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM25 0l188 1082h282l-188 -1082h-282z" />
<glyph unicode="&#xef;" horiz-adv-x="554" d="M25 0l188 1082h282l-188 -1082h-282zM30 1347q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM503 1347q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xf0;" horiz-adv-x="1153" d="M64 460q13 148 80 266t175.5 180.5t245.5 60.5q129 -4 237 -78q-6 140 -92 265l-211 -123l-62 128l161 89q-81 67 -235 109l108 222q223 -53 371 -180l192 112l60 -129l-146 -80q87 -155 121 -313t13 -336l-6 -52q-34 -281 -197.5 -454t-390.5 -168q-129 3 -230.5 65.5 t-153.5 174t-40 241.5zM346 460q-12 -109 31.5 -177.5t128.5 -71.5q101 -3 173.5 78.5t103.5 236.5l23 126l3 13q-27 41 -77 62t-111 21q-112 2 -186.5 -78.5t-88.5 -209.5z" />
<glyph unicode="&#xf1;" horiz-adv-x="1123" d="M-3 0l188 1082l264 1l-24 -128q130 151 315 147q153 -3 226 -112t53 -302l-114 -688h-282l116 691q5 39 2 71q-13 102 -128 105q-111 4 -199 -103l-135 -764h-282zM310 1257q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10 q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z" />
<glyph unicode="&#xf2;" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5 q-126 4 -201.5 -118.5t-69.5 -329.5zM354 1534l291 2l143 -310l-211 1z" />
<glyph unicode="&#xf3;" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5 q-126 4 -201.5 -118.5t-69.5 -329.5zM512 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xf4;" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM293 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM337 421q2 -96 45 -151.5t121 -57.5 q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5q-126 4 -201.5 -118.5t-69.5 -329.5z" />
<glyph unicode="&#xf5;" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM299 1257q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10 q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5q-126 4 -201.5 -118.5t-69.5 -329.5z" />
<glyph unicode="&#xf6;" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM307 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5 t-43.5 90.5zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5q-126 4 -201.5 -118.5t-69.5 -329.5zM780 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xf7;" horiz-adv-x="1143" d="M55 571l40 230h1000l-41 -230h-999zM346 272q-2 66 43 112t114 46q67 2 113 -40t48 -108t-43.5 -111t-112.5 -45q-68 -2 -114 39.5t-48 106.5zM487 1084q-2 66 43 112t114 46q67 2 113 -40t48 -108t-43.5 -111t-112.5 -45q-68 -2 -114 39.5t-48 106.5z" />
<glyph unicode="&#xf8;" horiz-adv-x="1131" d="M27 -141l150 215q-119 131 -127 328q-3 57 5 143q20 162 98 292.5t200.5 199.5t273.5 67q91 -1 180 -32l100 144l174 -1l-150 -214q114 -134 123 -328q2 -58 -6 -141q-20 -162 -97 -289t-201 -197t-275 -68q-87 1 -171 29l-103 -149zM320 423q-4 -52 6 -103l356 540 q-32 12 -66 12q-127 2 -204 -111t-92 -338zM425 218q30 -8 59 -9q108 -2 182 80.5t102 242.5q11 76 14 119q3 48 -4 98z" />
<glyph unicode="&#xf9;" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM362 1534l291 2l143 -310l-211 1z" />
<glyph unicode="&#xfa;" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM520 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xfb;" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM301 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#xfc;" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM315 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5 q-53 -2 -94.5 33.5t-43.5 90.5zM788 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xfd;" horiz-adv-x="1007" d="M-55 -419l21 220l39 -2q138 -4 202 101l62 115l-177 1067h292l78 -670l309 670h314l-633 -1245q-68 -143 -159.5 -210t-211.5 -67q-47 0 -136 21zM470 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xfe;" horiz-adv-x="1137" d="M-67 -416l338 1952h284l-108 -549q113 119 262 115q156 -2 245.5 -112.5t95.5 -305.5q2 -62 -6 -146q-21 -173 -89.5 -304t-169 -194.5t-223.5 -60.5q-154 4 -248 116l-98 -511h-283zM341 316q37 -101 159 -103q98 -3 165.5 74.5t92.5 229.5l6 42l6 96q2 97 -35.5 154 t-109.5 59q-120 4 -202 -102z" />
<glyph unicode="&#xff;" horiz-adv-x="1007" d="M-55 -419l21 220l39 -2q138 -4 202 101l62 115l-177 1067h292l78 -670l309 670h314l-633 -1245q-68 -143 -159.5 -210t-211.5 -67q-47 0 -136 21zM265 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5z M738 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#x152;" horiz-adv-x="1934" d="M96 576l46 299q43 276 227.5 439t445.5 163l73 -2l208 -19h877l-43 -243h-652l-61 -347h558l-41 -235h-557l-68 -390h655l-42 -241h-842l-196 -17l-87 -1q-162 4 -284 81.5t-180 214.5t-37 298zM375 445q8 -106 68 -166.5t163 -64.5q78 -3 199 9l187 1008q-90 14 -183 16 q-153 0 -254 -97.5t-129 -273.5l-48 -301q-9 -67 -3 -130z" />
<glyph unicode="&#x153;" horiz-adv-x="1802" d="M74 523l3 22q26 227 158 378q161 184 409 180q107 -2 196 -41t142 -108q162 152 360 148q132 -4 224 -66.5t133 -173.5t24 -249l-25 -163h-628q-7 -105 40.5 -168t140.5 -67q137 -7 305 76l64 -190q-68 -60 -174.5 -91t-230.5 -29q-106 0 -195.5 38.5t-143.5 108.5 q-166 -152 -382 -148q-141 2 -241.5 72t-147.5 195t-31 276zM351 422q0 -98 41 -154t118 -58q108 -3 180 83t91 239l2 21l5 67q7 241 -161 249q-103 3 -173 -77t-93 -235l-5 -34zM1091 646h355q13 66 10 102q-5 57 -39 89t-92 33q-128 3 -206 -159z" />
<glyph unicode="&#x178;" horiz-adv-x="1238" d="M154 1455l309 1l177 -654l407 654h336l-636 -944l-88 -512h-298l95 545zM430 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM903 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92 q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#x2c6;" horiz-adv-x="995" d="M234 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#x2dc;" horiz-adv-x="965" d="M220 1258q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z" />
<glyph unicode="&#x2000;" horiz-adv-x="968" />
<glyph unicode="&#x2001;" horiz-adv-x="1936" />
<glyph unicode="&#x2002;" horiz-adv-x="968" />
<glyph unicode="&#x2003;" horiz-adv-x="1936" />
<glyph unicode="&#x2004;" horiz-adv-x="645" />
<glyph unicode="&#x2005;" horiz-adv-x="484" />
<glyph unicode="&#x2006;" horiz-adv-x="322" />
<glyph unicode="&#x2007;" horiz-adv-x="322" />
<glyph unicode="&#x2008;" horiz-adv-x="242" />
<glyph unicode="&#x2009;" horiz-adv-x="387" />
<glyph unicode="&#x200a;" horiz-adv-x="107" />
<glyph unicode="&#x2010;" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
<glyph unicode="&#x2011;" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
<glyph unicode="&#x2012;" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
<glyph unicode="&#x2013;" horiz-adv-x="1265" d="M146 596l49 236h1008l-50 -236h-1007z" />
<glyph unicode="&#x2014;" horiz-adv-x="1526" d="M104 596l65 236h1344l-67 -236h-1342z" />
<glyph unicode="&#x2018;" horiz-adv-x="475" d="M178 1048l20 132q36 232 230 390l134 -82q-46 -68 -82 -137.5t-52 -151.5l-26 -151h-224z" />
<glyph unicode="&#x2019;" horiz-adv-x="466" d="M142 1091q103 148 129 260l33 185h225l-23 -148q-34 -221 -221 -381z" />
<glyph unicode="&#x201a;" horiz-adv-x="503" d="M-77 -223q96 144 121 261l34 191h232l-22 -143q-36 -232 -231 -391z" />
<glyph unicode="&#x201c;" horiz-adv-x="816" d="M186 1048l20 132q36 232 230 390l134 -82q-46 -68 -82 -137.5t-52 -151.5l-26 -151h-224zM518 1048l20 132q36 232 230 390l134 -82q-46 -68 -82 -137.5t-52 -151.5l-26 -151h-224z" />
<glyph unicode="&#x201d;" horiz-adv-x="822" d="M156 1091q103 148 129 260l33 185h225l-23 -148q-34 -221 -221 -381zM492 1091q103 148 129 260l33 185h225l-23 -148q-34 -221 -221 -381z" />
<glyph unicode="&#x201e;" horiz-adv-x="810" d="M-80 -244q96 148 124 282l40 225h232l-31 -191q-39 -238 -225 -397zM245 -244q105 161 132 279l40 228h232l-27 -177q-38 -244 -236 -411z" />
<glyph unicode="&#x2022;" horiz-adv-x="724" d="M156 720l1 34q3 108 69 175.5t173 67.5q99 -2 158.5 -64t59.5 -164l-1 -40q-6 -105 -73.5 -169t-168.5 -62q-99 2 -158.5 65t-59.5 157z" />
<glyph unicode="&#x2026;" horiz-adv-x="1480" d="M51 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109zM510 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109zM960 137q-2 67 43 113t113 48 q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
<glyph unicode="&#x202f;" horiz-adv-x="387" />
<glyph unicode="&#x2039;" horiz-adv-x="629" d="M90 513l1 21l330 390h203l-316 -416l162 -382l-167 -1z" />
<glyph unicode="&#x203a;" horiz-adv-x="609" d="M-15 124l315 415l-161 383l167 1l213 -387l-1 -22l-330 -390h-203z" />
<glyph unicode="&#x205f;" horiz-adv-x="484" />
<glyph unicode="&#x20ac;" d="M70 516l27 152h164l22 124h-164l27 152l154 -1q73 263 243.5 399t418.5 134q100 -2 238 -32l-59 -243q-87 33 -173 35q-276 4 -373 -293l333 1l-27 -152h-324l-22 -124h326l-27 -152h-319q-9 -66 -1 -119q12 -83 71 -128t156 -46q84 -2 193 30l12 -245q-132 -29 -243 -25 q-155 1 -273.5 71t-172.5 191.5t-32 272.5z" />
<glyph unicode="&#x2122;" horiz-adv-x="1264" d="M241 1348l19 108h397l-19 -108h-125l-75 -431h-140l75 431h-132zM629 914l95 542h150l48 -364l185 364h153l-95 -542h-126l58 328l-155 -327l-71 -2l-51 365l-64 -364h-127z" />
<glyph unicode="&#x25fc;" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1854" d="M74 870l37 212l156 1l11 85q24 189 140.5 291.5t296.5 100.5q55 -1 153 -22l-25 -225q-48 12 -83 12q-74 1 -126.5 -37t-67.5 -112l-16 -94h334l6 36q36 211 169 325t347 115h10q84 -1 164 -19.5t161 -41.5l-65 -238q-142 47 -256 49q-92 0 -158 -44t-87 -137l-9 -46 l218 1l-37 -212h-207l-151 -870h-283l151 870h-343l-151 -870h-284l151 870h-156zM1334 0l187 1082h284l-188 -1082h-283z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1854" d="M74 870l37 212l156 1l14 107q26 173 141.5 272t293.5 97q59 -2 152 -21l-25 -225q-48 12 -83 12q-77 0 -129.5 -40t-65.5 -114l-15 -89l343 1l10 78q28 212 179 315q125 85 307 83l153 -5l331 -28l-256 -1526h-283l233 1314q-84 11 -150 11q-94 0 -154 -43.5t-74 -120.5 l-12 -79h209l-37 -212h-209l-151 -870h-283l151 870h-343l-151 -870h-284l151 870h-156z" />
<hkern u1="&#x20;" u2="T" k="60" />
<hkern u1="&#x22;" u2="w" k="-11" />
<hkern u1="&#x27;" u2="w" k="-11" />
<hkern u1="&#x28;" u2="&#x178;" k="-22" />
<hkern u1="&#x28;" u2="&#xdd;" k="-22" />
<hkern u1="&#x28;" u2="Y" k="-22" />
<hkern u1="&#x28;" u2="W" k="-38" />
<hkern u1="&#x28;" u2="V" k="-20" />
<hkern u1="&#x2f;" u2="&#x2f;" k="248" />
<hkern u1="A" u2="w" k="33" />
<hkern u1="A" u2="t" k="17" />
<hkern u1="A" u2="&#x3f;" k="81" />
<hkern u1="C" u2="&#x7d;" k="17" />
<hkern u1="C" u2="]" k="12" />
<hkern u1="C" u2="&#x29;" k="26" />
<hkern u1="D" u2="&#xc6;" k="33" />
<hkern u1="E" u2="w" k="22" />
<hkern u1="E" u2="f" k="18" />
<hkern u1="F" u2="&#x2026;" k="274" />
<hkern u1="F" u2="&#x201e;" k="274" />
<hkern u1="F" u2="&#x201a;" k="274" />
<hkern u1="F" u2="&#x153;" k="21" />
<hkern u1="F" u2="&#xff;" k="24" />
<hkern u1="F" u2="&#xfd;" k="24" />
<hkern u1="F" u2="&#xfc;" k="22" />
<hkern u1="F" u2="&#xfb;" k="22" />
<hkern u1="F" u2="&#xfa;" k="22" />
<hkern u1="F" u2="&#xf9;" k="22" />
<hkern u1="F" u2="&#xf6;" k="21" />
<hkern u1="F" u2="&#xf5;" k="21" />
<hkern u1="F" u2="&#xf4;" k="21" />
<hkern u1="F" u2="&#xf3;" k="21" />
<hkern u1="F" u2="&#xf2;" k="21" />
<hkern u1="F" u2="&#xeb;" k="21" />
<hkern u1="F" u2="&#xea;" k="21" />
<hkern u1="F" u2="&#xe9;" k="21" />
<hkern u1="F" u2="&#xe8;" k="21" />
<hkern u1="F" u2="&#xe7;" k="21" />
<hkern u1="F" u2="&#xe5;" k="34" />
<hkern u1="F" u2="&#xe4;" k="34" />
<hkern u1="F" u2="&#xe3;" k="34" />
<hkern u1="F" u2="&#xe2;" k="34" />
<hkern u1="F" u2="&#xe1;" k="34" />
<hkern u1="F" u2="&#xe0;" k="34" />
<hkern u1="F" u2="&#xc5;" k="192" />
<hkern u1="F" u2="&#xc4;" k="192" />
<hkern u1="F" u2="&#xc3;" k="192" />
<hkern u1="F" u2="&#xc2;" k="192" />
<hkern u1="F" u2="&#xc1;" k="192" />
<hkern u1="F" u2="&#xc0;" k="192" />
<hkern u1="F" u2="y" k="24" />
<hkern u1="F" u2="v" k="24" />
<hkern u1="F" u2="u" k="22" />
<hkern u1="F" u2="r" k="26" />
<hkern u1="F" u2="q" k="21" />
<hkern u1="F" u2="o" k="21" />
<hkern u1="F" u2="g" k="21" />
<hkern u1="F" u2="e" k="21" />
<hkern u1="F" u2="d" k="21" />
<hkern u1="F" u2="c" k="21" />
<hkern u1="F" u2="a" k="34" />
<hkern u1="F" u2="T" k="-20" />
<hkern u1="F" u2="J" k="208" />
<hkern u1="F" u2="A" k="192" />
<hkern u1="F" u2="&#x2e;" k="274" />
<hkern u1="F" u2="&#x2c;" k="274" />
<hkern u1="K" u2="w" k="63" />
<hkern u1="L" u2="w" k="52" />
<hkern u1="O" u2="&#xc6;" k="33" />
<hkern u1="P" u2="&#xc6;" k="297" />
<hkern u1="P" u2="t" k="-14" />
<hkern u1="Q" u2="&#x178;" k="35" />
<hkern u1="Q" u2="&#xdd;" k="35" />
<hkern u1="Q" u2="Y" k="35" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="28" />
<hkern u1="Q" u2="T" k="33" />
<hkern u1="R" u2="&#x178;" k="48" />
<hkern u1="R" u2="&#xdd;" k="48" />
<hkern u1="R" u2="Y" k="48" />
<hkern u1="R" u2="V" k="19" />
<hkern u1="R" u2="T" k="50" />
<hkern u1="T" u2="&#xf8;" k="95" />
<hkern u1="T" u2="&#xe6;" k="84" />
<hkern u1="T" u2="&#xc6;" k="189" />
<hkern u1="T" u2="&#xbb;" k="146" />
<hkern u1="T" u2="&#xab;" k="148" />
<hkern u1="T" u2="w" k="47" />
<hkern u1="T" u2="r" k="65" />
<hkern u1="T" u2="&#x20;" k="60" />
<hkern u1="V" u2="&#x7d;" k="-19" />
<hkern u1="V" u2="r" k="30" />
<hkern u1="V" u2="]" k="-17" />
<hkern u1="V" u2="&#x29;" k="-20" />
<hkern u1="W" u2="&#x7d;" k="-14" />
<hkern u1="W" u2="r" k="21" />
<hkern u1="W" u2="]" k="-12" />
<hkern u1="W" u2="&#x29;" k="-15" />
<hkern u1="Y" u2="&#x2022;" k="45" />
<hkern u1="Y" u2="&#xf8;" k="64" />
<hkern u1="Y" u2="&#xe6;" k="63" />
<hkern u1="Y" u2="&#xc6;" k="96" />
<hkern u1="Y" u2="&#xbb;" k="51" />
<hkern u1="Y" u2="&#xab;" k="82" />
<hkern u1="Y" u2="&#x7d;" k="-19" />
<hkern u1="Y" u2="t" k="22" />
<hkern u1="Y" u2="r" k="40" />
<hkern u1="Y" u2="f" k="22" />
<hkern u1="Y" u2="]" k="-18" />
<hkern u1="Y" u2="&#x2a;" k="49" />
<hkern u1="Y" u2="&#x29;" k="-20" />
<hkern u1="Y" u2="&#x26;" k="30" />
<hkern u1="Z" u2="w" k="27" />
<hkern u1="[" u2="&#xdc;" k="18" />
<hkern u1="[" u2="&#xdb;" k="18" />
<hkern u1="[" u2="&#xda;" k="18" />
<hkern u1="[" u2="&#xd9;" k="18" />
<hkern u1="[" u2="U" k="18" />
<hkern u1="[" u2="J" k="18" />
<hkern u1="e" u2="&#x2019;" k="64" />
<hkern u1="f" u2="&#x201d;" k="-16" />
<hkern u1="f" u2="&#x201c;" k="-16" />
<hkern u1="f" u2="&#x2019;" k="-16" />
<hkern u1="f" u2="&#x2018;" k="-16" />
<hkern u1="f" u2="&#x153;" k="24" />
<hkern u1="f" u2="&#xeb;" k="24" />
<hkern u1="f" u2="&#xea;" k="24" />
<hkern u1="f" u2="&#xe9;" k="24" />
<hkern u1="f" u2="&#xe8;" k="24" />
<hkern u1="f" u2="&#xe7;" k="24" />
<hkern u1="f" u2="&#x7d;" k="-19" />
<hkern u1="f" u2="q" k="24" />
<hkern u1="f" u2="g" k="24" />
<hkern u1="f" u2="e" k="24" />
<hkern u1="f" u2="d" k="24" />
<hkern u1="f" u2="c" k="24" />
<hkern u1="f" u2="]" k="-18" />
<hkern u1="f" u2="&#x29;" k="-20" />
<hkern u1="f" u2="&#x27;" k="-16" />
<hkern u1="f" u2="&#x22;" k="-16" />
<hkern u1="h" u2="&#x2019;" k="104" />
<hkern u1="k" u2="&#x153;" k="20" />
<hkern u1="k" u2="&#xeb;" k="20" />
<hkern u1="k" u2="&#xea;" k="20" />
<hkern u1="k" u2="&#xe9;" k="20" />
<hkern u1="k" u2="&#xe8;" k="20" />
<hkern u1="k" u2="&#xe7;" k="20" />
<hkern u1="k" u2="q" k="20" />
<hkern u1="k" u2="g" k="20" />
<hkern u1="k" u2="e" k="20" />
<hkern u1="k" u2="d" k="20" />
<hkern u1="k" u2="c" k="20" />
<hkern u1="m" u2="&#x2019;" k="120" />
<hkern u1="n" u2="&#x2019;" k="120" />
<hkern u1="o" u2="&#x2019;" k="112" />
<hkern u1="r" u2="&#x2019;" k="-16" />
<hkern u1="r" u2="w" k="-17" />
<hkern u1="r" u2="t" k="-50" />
<hkern u1="r" u2="f" k="-20" />
<hkern u1="t" u2="&#x2019;" k="-24" />
<hkern u1="t" u2="&#xf6;" k="30" />
<hkern u1="t" u2="&#xf5;" k="30" />
<hkern u1="t" u2="&#xf4;" k="30" />
<hkern u1="t" u2="&#xf3;" k="30" />
<hkern u1="t" u2="&#xf2;" k="30" />
<hkern u1="t" u2="o" k="30" />
<hkern u1="v" u2="f" k="-13" />
<hkern u1="w" u2="&#x2026;" k="124" />
<hkern u1="w" u2="&#x201e;" k="124" />
<hkern u1="w" u2="&#x201a;" k="124" />
<hkern u1="w" u2="&#x2e;" k="124" />
<hkern u1="w" u2="&#x2c;" k="124" />
<hkern u1="y" u2="f" k="-13" />
<hkern u1="&#x7b;" u2="&#xdc;" k="20" />
<hkern u1="&#x7b;" u2="&#xdb;" k="20" />
<hkern u1="&#x7b;" u2="&#xda;" k="20" />
<hkern u1="&#x7b;" u2="&#xd9;" k="20" />
<hkern u1="&#x7b;" u2="U" k="20" />
<hkern u1="&#x7b;" u2="J" k="20" />
<hkern u1="&#xc0;" u2="w" k="33" />
<hkern u1="&#xc0;" u2="t" k="17" />
<hkern u1="&#xc0;" u2="&#x3f;" k="81" />
<hkern u1="&#xc1;" u2="w" k="33" />
<hkern u1="&#xc1;" u2="t" k="17" />
<hkern u1="&#xc1;" u2="&#x3f;" k="81" />
<hkern u1="&#xc2;" u2="w" k="33" />
<hkern u1="&#xc2;" u2="t" k="17" />
<hkern u1="&#xc2;" u2="&#x3f;" k="81" />
<hkern u1="&#xc3;" u2="w" k="33" />
<hkern u1="&#xc3;" u2="t" k="17" />
<hkern u1="&#xc3;" u2="&#x3f;" k="81" />
<hkern u1="&#xc4;" u2="w" k="33" />
<hkern u1="&#xc4;" u2="t" k="17" />
<hkern u1="&#xc4;" u2="&#x3f;" k="81" />
<hkern u1="&#xc5;" u2="w" k="33" />
<hkern u1="&#xc5;" u2="t" k="17" />
<hkern u1="&#xc5;" u2="&#x3f;" k="81" />
<hkern u1="&#xc7;" u2="&#x7d;" k="17" />
<hkern u1="&#xc7;" u2="]" k="12" />
<hkern u1="&#xc7;" u2="&#x29;" k="26" />
<hkern u1="&#xc8;" u2="w" k="22" />
<hkern u1="&#xc8;" u2="f" k="18" />
<hkern u1="&#xc9;" u2="w" k="22" />
<hkern u1="&#xc9;" u2="f" k="18" />
<hkern u1="&#xca;" u2="w" k="22" />
<hkern u1="&#xca;" u2="f" k="18" />
<hkern u1="&#xcb;" u2="w" k="22" />
<hkern u1="&#xcb;" u2="f" k="18" />
<hkern u1="&#xd0;" u2="&#xc6;" k="33" />
<hkern u1="&#xd2;" u2="&#xc6;" k="33" />
<hkern u1="&#xd3;" u2="&#xc6;" k="33" />
<hkern u1="&#xd4;" u2="&#xc6;" k="33" />
<hkern u1="&#xd5;" u2="&#xc6;" k="33" />
<hkern u1="&#xd6;" u2="&#xc6;" k="33" />
<hkern u1="&#xdd;" u2="&#x2022;" k="45" />
<hkern u1="&#xdd;" u2="&#xf8;" k="64" />
<hkern u1="&#xdd;" u2="&#xe6;" k="63" />
<hkern u1="&#xdd;" u2="&#xc6;" k="96" />
<hkern u1="&#xdd;" u2="&#xbb;" k="51" />
<hkern u1="&#xdd;" u2="&#xab;" k="82" />
<hkern u1="&#xdd;" u2="&#x7d;" k="-19" />
<hkern u1="&#xdd;" u2="t" k="22" />
<hkern u1="&#xdd;" u2="r" k="40" />
<hkern u1="&#xdd;" u2="f" k="22" />
<hkern u1="&#xdd;" u2="]" k="-18" />
<hkern u1="&#xdd;" u2="&#x2a;" k="49" />
<hkern u1="&#xdd;" u2="&#x29;" k="-20" />
<hkern u1="&#xdd;" u2="&#x26;" k="30" />
<hkern u1="&#xe8;" u2="&#x2019;" k="64" />
<hkern u1="&#xe9;" u2="&#x2019;" k="64" />
<hkern u1="&#xea;" u2="&#x2019;" k="64" />
<hkern u1="&#xeb;" u2="&#x2019;" k="64" />
<hkern u1="&#xf1;" u2="&#x2019;" k="120" />
<hkern u1="&#xf2;" u2="&#x2019;" k="112" />
<hkern u1="&#xf3;" u2="&#x2019;" k="112" />
<hkern u1="&#xf4;" u2="&#x2019;" k="112" />
<hkern u1="&#xf5;" u2="&#x2019;" k="112" />
<hkern u1="&#xf6;" u2="&#x2019;" k="112" />
<hkern u1="&#xfd;" u2="f" k="-13" />
<hkern u1="&#xff;" u2="f" k="-13" />
<hkern u1="&#x178;" u2="&#x2022;" k="45" />
<hkern u1="&#x178;" u2="&#xf8;" k="64" />
<hkern u1="&#x178;" u2="&#xe6;" k="63" />
<hkern u1="&#x178;" u2="&#xc6;" k="96" />
<hkern u1="&#x178;" u2="&#xbb;" k="51" />
<hkern u1="&#x178;" u2="&#xab;" k="82" />
<hkern u1="&#x178;" u2="&#x7d;" k="-19" />
<hkern u1="&#x178;" u2="t" k="22" />
<hkern u1="&#x178;" u2="r" k="40" />
<hkern u1="&#x178;" u2="f" k="22" />
<hkern u1="&#x178;" u2="]" k="-18" />
<hkern u1="&#x178;" u2="&#x2a;" k="49" />
<hkern u1="&#x178;" u2="&#x29;" k="-20" />
<hkern u1="&#x178;" u2="&#x26;" k="30" />
<hkern u1="&#x2018;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="&#x153;" k="104" />
<hkern u1="&#x2019;" u2="&#xf6;" k="144" />
<hkern u1="&#x2019;" u2="&#xf5;" k="144" />
<hkern u1="&#x2019;" u2="&#xf4;" k="144" />
<hkern u1="&#x2019;" u2="&#xf3;" k="144" />
<hkern u1="&#x2019;" u2="&#xf2;" k="144" />
<hkern u1="&#x2019;" u2="&#xeb;" k="104" />
<hkern u1="&#x2019;" u2="&#xea;" k="104" />
<hkern u1="&#x2019;" u2="&#xe9;" k="104" />
<hkern u1="&#x2019;" u2="&#xe8;" k="104" />
<hkern u1="&#x2019;" u2="&#xe7;" k="104" />
<hkern u1="&#x2019;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="s" k="232" />
<hkern u1="&#x2019;" u2="q" k="104" />
<hkern u1="&#x2019;" u2="o" k="144" />
<hkern u1="&#x2019;" u2="g" k="104" />
<hkern u1="&#x2019;" u2="e" k="104" />
<hkern u1="&#x2019;" u2="d" k="104" />
<hkern u1="&#x2019;" u2="c" k="104" />
<hkern u1="&#x201c;" u2="w" k="-11" />
<hkern u1="&#x201d;" u2="w" k="-11" />
<hkern g1="B" g2="V" k="24" />
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="55" />
<hkern g1="B" g2="T" k="27" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="Y,Yacute,Ydieresis" k="28" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="T" k="29" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-18" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="X" k="-17" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="43" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="85" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="21" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="23" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="122" />
<hkern g1="C,Ccedilla" g2="T" k="29" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="26" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="17" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="T" g2="z" k="60" />
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="208" />
<hkern g1="T" g2="v,y,yacute,ydieresis" k="82" />
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="28" />
<hkern g1="T" g2="V" k="-16" />
<hkern g1="T" g2="m,n,p,ntilde" k="89" />
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-16" />
<hkern g1="T" g2="T" k="-16" />
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="65" />
<hkern g1="T" g2="W" k="-15" />
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
<hkern g1="T" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="258" />
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="89" />
<hkern g1="T" g2="x" k="77" />
<hkern g1="T" g2="s" k="76" />
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="272" />
<hkern g1="T" g2="S" k="16" />
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="168" />
<hkern g1="T" g2="J" k="216" />
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="27" />
<hkern g1="K" g2="v,y,yacute,ydieresis" k="40" />
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="31" />
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="23" />
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="164" />
<hkern g1="L" g2="v,y,yacute,ydieresis" k="123" />
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="64" />
<hkern g1="L" g2="V" k="206" />
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="24" />
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="279" />
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="288" />
<hkern g1="L" g2="T" k="205" />
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="14" />
<hkern g1="L" g2="W" k="93" />
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-19" />
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="13" />
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-15" />
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="178" />
<hkern g1="P" g2="X" k="51" />
<hkern g1="P" g2="Z" k="36" />
<hkern g1="P" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="404" />
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="11" />
<hkern g1="P" g2="J" k="184" />
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="22" />
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="46" />
<hkern g1="V" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="13" />
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="28" />
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="75" />
<hkern g1="V" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="215" />
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="44" />
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="157" />
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="46" />
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="X" g2="v,y,yacute,ydieresis" k="31" />
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="25" />
<hkern g1="X" g2="V" k="-14" />
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="21" />
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="156" />
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="30" />
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="20" />
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="29" />
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="96" />
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="40" />
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="39" />
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="150" />
<hkern g1="Y,Yacute,Ydieresis" g2="X" k="-13" />
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="231" />
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="23" />
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="58" />
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="152" />
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="16" />
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="63" />
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="96" />
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
<hkern g1="W" g2="T" k="-14" />
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="43" />
<hkern g1="W" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="143" />
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="31" />
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="60" />
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="33" />
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="27" />
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="26" />
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-13" />
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="21" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="17" />
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="11" />
<hkern g1="b,p,thorn" g2="z" k="15" />
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="29" />
<hkern g1="b,p,thorn" g2="x" k="15" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="13" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="14" />
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="80" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="16" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="88" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="21" />
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
<hkern g1="v,y,yacute,ydieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-15" />
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="167" />
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="15" />
<hkern g1="r" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="36" />
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-18" />
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-16" />
<hkern g1="r" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="173" />
<hkern g1="r" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="r" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="30" />
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="40" />
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="20" />
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="16" />
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="16" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="91" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="m,n,p,ntilde" k="20" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="37" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="59" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="s" k="92" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="50" />
<hkern g1="comma,period,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="285" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 80 KiB

View File

@@ -1,666 +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">
<metadata></metadata>
<defs>
<font id="robotoitalic" horiz-adv-x="1126" >
<font-face units-per-em="2048" ascent="1536" descent="-512" />
<missing-glyph horiz-adv-x="502" />
<glyph unicode="&#xfb01;" horiz-adv-x="1110" d="M88 939l25 143l166 1l14 100q27 183 147 283q115 95 290 93q71 -2 137.5 -19.5t136.5 -41.5l-44 -158q-113 51 -224 53q-229 4 -263 -224l-13 -87h215l-25 -143h-214l-163 -939h-182l163 939h-166zM659 0l188 1082h182l-188 -1082h-182z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1138" d="M116 939l25 143h166l18 127q26 167 134 260t274 91q109 -2 293 -44l96 -20l-254 -1496h-181l240 1381q-129 22 -188 22q-99 0 -159 -55.5t-75 -150.5l-18 -115h225l-25 -143h-224l-163 -939h-181l164 939h-167z" />
<glyph horiz-adv-x="10" />
<glyph horiz-adv-x="10" />
<glyph unicode="&#xd;" horiz-adv-x="502" />
<glyph horiz-adv-x="10" />
<glyph unicode=" " horiz-adv-x="502" />
<glyph unicode="&#x09;" horiz-adv-x="502" />
<glyph unicode="&#xa0;" horiz-adv-x="502" />
<glyph unicode="!" horiz-adv-x="521" d="M67 90q1 47 30 77.5t77 32.5q46 2 76 -28t30 -76q0 -47 -30 -76.5t-77 -31.5t-76.5 27t-29.5 75zM141 411l169 1045h190l-195 -1045h-164z" />
<glyph unicode="&#x22;" horiz-adv-x="645" d="M200 1041l80 503l136 -9l-23 -145l-83 -348zM462 1042l80 502l136 -9l-23 -145l-83 -348h-110z" />
<glyph unicode="#" horiz-adv-x="1233" d="M82 410l24 137h255l128 354h-248l24 139h274l152 416h145l-153 -416h251l152 416h146l-153 -416h196l-24 -139h-222l-128 -354h216l-24 -137h-241l-149 -410h-146l150 410h-250l-150 -410h-144l149 410h-230zM505 547h250l129 354h-250z" />
<glyph unicode="$" d="M85 429h181q-11 -131 47.5 -209t176.5 -80q127 -2 212.5 64.5t98.5 177.5q10 86 -43 150t-179.5 112.5t-201.5 109.5q-148 121 -134 317q11 164 118.5 271.5t284.5 130.5l39 219h146l-40 -222q148 -29 220.5 -149.5t57.5 -312.5h-179q8 147 -43.5 225.5t-151.5 81.5 q-113 2 -186.5 -63.5t-85.5 -176.5q-9 -86 37.5 -148t183.5 -116.5t208 -114t103.5 -136.5t25.5 -176q-13 -171 -127.5 -276t-303.5 -125l-34 -191h-145l35 193q-164 24 -248 141t-73 303z" />
<glyph unicode="%" horiz-adv-x="1465" d="M195 1099l6 64q13 144 104.5 230.5t219.5 84.5q121 -4 192.5 -88.5t63.5 -213.5l-6 -77q-15 -134 -105.5 -219t-215.5 -81q-121 2 -194 88t-65 212zM261 184l881 1128l99 -71l-881 -1129zM330 1097q-5 -81 29.5 -128.5t98.5 -49.5q68 -2 118.5 48.5t61.5 131.5l9 78 q7 76 -26 127t-100 53q-69 2 -120 -49t-62 -132zM741 279l6 68q13 139 102 226t221 85q124 -4 195 -89.5t63 -211.5l-6 -67q-13 -141 -103.5 -228.5t-218.5 -83.5q-120 2 -193.5 87t-65.5 214zM876 277q-5 -80 28.5 -128.5t99.5 -50.5q70 -2 119.5 49t60.5 132l9 79 q7 75 -26 126t-100 53q-71 2 -121 -49t-61 -131z" />
<glyph unicode="&#x26;" horiz-adv-x="1245" d="M71 384q15 186 222 332l114 76l-43 77q-72 132 -64 245q12 165 120 265.5t272 96.5q135 -2 223 -87.5t80 -212.5q-9 -172 -213 -315l-147 -98l249 -381q91 135 114 290h161q-27 -255 -181 -427l157 -245h-202l-73 113q-174 -136 -383 -132q-189 2 -304 114.5t-102 288.5z M255 383q-15 -108 48 -179t180 -73q134 -3 284 113l-271 424l-43 -30q-179 -124 -198 -255zM478 1121q-8 -84 49 -185l27 -47l153 103q107 80 118 185q6 64 -35 106t-109 42q-83 0 -139 -60.5t-64 -143.5z" />
<glyph unicode="'" horiz-adv-x="356" d="M170 1057l77 479h146l-19 -118l-76 -361h-128z" />
<glyph unicode="(" horiz-adv-x="689" d="M117 393q2 96 14 183l2 11q33 231 122.5 450t219.5 373.5t290 233.5l27 -124q-157 -117 -269.5 -305.5t-173.5 -448t-59 -511.5q0 -207 53.5 -364.5t154.5 -248.5l-45 -112q-167 116 -255.5 343t-80.5 520z" />
<glyph unicode=")" horiz-adv-x="701" d="M-113 -356q343 258 458 829q46 230 44 443q-5 429 -208 615l47 112q112 -78 189.5 -207.5t114 -301t32.5 -355.5q-3 -97 -15 -183l-2 -11q-35 -244 -127 -461.5t-220.5 -367t-284.5 -227.5z" />
<glyph unicode="*" horiz-adv-x="866" d="M107 1077l68 144l278 -113l51 348h150l-70 -344l303 108l19 -159l-315 -91l147 -275l-128 -88l-131 290l-222 -280l-114 98l241 272z" />
<glyph unicode="+" horiz-adv-x="1136" d="M76 606l31 175h393l74 425h182l-74 -425h394l-31 -175h-393l-80 -460h-182l80 460h-394z" />
<glyph unicode="," horiz-adv-x="400" d="M-113 -216q116 143 144 284l26 151h177l-21 -135q-36 -228 -222 -375z" />
<glyph unicode="-" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
<glyph unicode="." horiz-adv-x="533" d="M53 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5z" />
<glyph unicode="/" horiz-adv-x="829" d="M-113 -125l864 1581h163l-863 -1581h-164z" />
<glyph unicode="0" d="M112 475q2 74 11 146l36 243q48 311 183 464t356 148q186 -4 277.5 -127.5t84.5 -358.5q-3 -75 -12 -147l-35 -235q-53 -329 -187 -481t-354 -147q-184 4 -276 130.5t-84 364.5zM286 402q5 -265 196 -272q133 -6 219.5 98t123.5 330l48 318q14 121 13 188 q-5 254 -197 261q-140 5 -226.5 -103.5t-120.5 -340.5l-43 -290q-14 -116 -13 -189z" />
<glyph unicode="1" d="M249 1092l31 176l540 195h32l-248 -1463h-182l214 1228z" />
<glyph unicode="2" d="M23 0l22 141l537 522l98 97q169 169 187 312q13 110 -43 179.5t-158 73.5q-131 4 -219 -76.5t-107 -220.5l-179 -1q13 134 82.5 237.5t183 159t246.5 52.5q181 -4 287.5 -109.5t91.5 -273.5q-17 -192 -221 -404l-92 -93l-468 -445h703l-24 -151h-927z" />
<glyph unicode="3" d="M60 385l181 -1q-6 -112 54 -180.5t174 -72.5q128 -4 213 73t97 206q11 119 -54 185.5t-194 70.5l-139 1l24 151l120 -1q132 0 222.5 69.5t103.5 188.5q13 116 -43 182.5t-163 68.5q-114 2 -193.5 -66.5t-97.5 -184.5l-179 -1q17 180 153.5 292.5t325.5 110.5 q183 -4 287.5 -114.5t90.5 -291.5q-9 -103 -79 -188t-194 -141q99 -40 148 -126.5t41 -202.5q-16 -197 -156.5 -317t-341.5 -116q-187 4 -298 116t-103 289z" />
<glyph unicode="4" d="M5 338l21 119l800 999h198l-167 -967h196l-27 -151h-195l-59 -338h-182l59 338h-644zM243 489h432l130 716l-29 -42z" />
<glyph unicode="5" d="M114 384h169q7 -120 68 -186t165 -68q128 -4 215.5 91t103.5 249q14 135 -47 222.5t-179 91.5q-73 2 -129.5 -22t-112.5 -69l-148 40l185 723h726l-27 -171h-570l-112 -398q110 65 238 63q181 -2 278 -136.5t79 -342.5q-19 -224 -159 -360t-349 -132q-174 2 -281 112 t-113 293z" />
<glyph unicode="6" d="M120 407q-8 105 25 284q69 373 272.5 570t517.5 197h20l-16 -157h-35q-200 -4 -342 -124t-220 -354q136 136 318 132q115 -2 197 -63.5t120.5 -170t26.5 -239.5q-20 -221 -158.5 -364.5t-340.5 -137.5q-162 4 -266 119t-119 308zM299 450q0 -82 25 -159t74 -117t115 -41 q121 -5 207.5 90t103.5 250q10 90 -11 165t-69.5 118.5t-122.5 45.5q-97 2 -182 -56t-131 -148l-7 -67z" />
<glyph unicode="7" d="M157 0l787 1304h-760l24 152h956l-18 -114l-791 -1342h-198z" />
<glyph unicode="8" d="M80 385q11 125 88 218.5t210 151.5q-78 54 -115.5 136t-29.5 176q14 185 145 299t322 110q174 -4 276 -113t88 -278q-9 -109 -77.5 -196.5t-186.5 -144.5q94 -54 139.5 -144.5t37.5 -197.5q-15 -193 -158 -309.5t-345 -112.5q-189 4 -299 117t-95 288zM262 388 q-12 -116 48.5 -186t171.5 -72q126 -4 214 73.5t102 202.5q12 113 -48 188.5t-174 79.5q-124 2 -212 -78.5t-102 -207.5zM412 1064q-11 -104 42.5 -171t150.5 -69q109 -2 186.5 70.5t90.5 187.5q11 101 -41.5 170t-149.5 73q-112 2 -189 -71.5t-90 -189.5z" />
<glyph unicode="9" d="M160 965q13 144 81 264t177.5 185.5t241.5 61.5q174 -4 273 -126t107 -327q3 -107 -25 -266q-66 -374 -260.5 -563.5t-499.5 -195.5h-45l16 156h37q215 4 352.5 120.5t207.5 365.5q-74 -78 -157 -116.5t-165 -36.5q-115 2 -196.5 65t-119 173t-25.5 240zM339 975 q-7 -61 2 -124t36 -111q54 -97 162 -100q91 -4 175 51.5t138 149.5l8 73l3 81q-4 155 -57.5 239t-153.5 88q-124 5 -211.5 -95.5t-101.5 -251.5z" />
<glyph unicode=":" horiz-adv-x="491" d="M43 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5zM196 977q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5z" />
<glyph unicode=";" horiz-adv-x="430" d="M-101 -216q116 143 144 284l26 151h177l-21 -135q-36 -228 -222 -375zM173 977q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5z" />
<glyph unicode="&#x3c;" horiz-adv-x="1020" d="M65 579l26 146l861 378l-36 -205l-653 -258l565 -253l-33 -187z" />
<glyph unicode="=" horiz-adv-x="1100" d="M112 399l28 160h811l-29 -160h-810zM184 814l28 161h811l-29 -161h-810z" />
<glyph unicode="&#x3e;" horiz-adv-x="1048" d="M58 191l36 201l687 262l-598 259l33 182l764 -379l-26 -145z" />
<glyph unicode="?" horiz-adv-x="948" d="M165 1115q19 165 141.5 264.5t299.5 97.5q168 -4 260.5 -106t78.5 -267q-17 -182 -204 -350l-122 -104q-98 -89 -121 -240l-177 -1q13 115 61 203t156 184l81 71q125 111 141 233q12 94 -31 153t-134 63q-102 2 -167.5 -54.5t-82.5 -145.5zM250 90q1 47 30 77.5t77 32.5 q46 1 76.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -31q-47 -2 -76.5 27t-29.5 75z" />
<glyph unicode="@" horiz-adv-x="1794" d="M70 246q-2 217 77.5 442.5t221 397t322 260t380.5 85.5q194 -3 333.5 -87t213 -245t73.5 -365q0 -225 -65.5 -401t-176 -266.5t-250.5 -86.5q-89 2 -143.5 46.5t-67.5 121.5q-136 -172 -279 -169q-116 2 -172 93t-44 247q10 161 86 328.5t186 256t240 86.5 q139 -3 272 -105l-133 -558q-10 -66 -10 -93q-5 -135 92 -138q147 -6 238 165t102 441q7 180 -46 317t-168.5 207t-284.5 73q-221 4 -410 -123t-311.5 -370t-134.5 -522q-8 -181 47 -323t167 -214.5t274 -73.5q169 -4 339 78l27 -117q-139 -87 -368 -87q-191 1 -332 84.5 t-218 244t-77 370.5zM649 294q-5 -171 112 -174q107 -5 200 144l32 53l1 11l133 506q-52 28 -107 29q-139 5 -235.5 -135t-130.5 -377z" />
<glyph unicode="A" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679z" />
<glyph unicode="B" horiz-adv-x="1247" d="M59 0l253 1456l427 -1q223 0 334 -100q99 -89 99 -240q0 -19 -2 -39q-18 -209 -263 -315q99 -38 147 -130q41 -78 41 -169q0 -17 -2 -34q-15 -197 -158 -312.5t-370 -115.5h-506zM274 157l297 -1q136 0 228 73t107 197q3 24 3 46q0 86 -44 138q-55 66 -173 70l-327 1z M392 835l271 -1q127 0 214.5 65t102.5 179q3 20 3 39q-1 77 -45 121q-54 54 -180 59l-286 1z" />
<glyph unicode="C" horiz-adv-x="1303" d="M120 494q-1 22 -1 43q0 59 8 117l17 120q46 328 230 518q179 185 434 184h13q205 -4 325 -132.5t127 -356.5h-187q-13 306 -240 330l-33 2h-12q-181 -1 -303 -141q-126 -146 -164 -397l-22 -151l-6 -88v-28q0 -164 66 -264q72 -108 212 -113h18q140 0 234 73 q100 78 151 251l182 3q-43 -226 -205 -358q-155 -126 -369 -126h-20q-135 3 -236 66.5t-157 183t-62 264.5z" />
<glyph unicode="D" horiz-adv-x="1313" d="M59 0l253 1456l378 -1q178 0 306 -89q129 -90 185 -246q40 -111 40 -240q0 -53 -7 -110l-10 -73q-44 -318 -247 -507.5t-510 -189.5h-388zM274 157l185 -1q212 0 359.5 132t191.5 362q27 140 27 248q0 34 -3 65q-15 155 -103 242.5t-236 91.5l-223 1z" />
<glyph unicode="E" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899z" />
<glyph unicode="F" horiz-adv-x="1108" d="M59 0l253 1456h876l-28 -158h-688l-86 -498h593l-28 -157h-592l-112 -643h-188z" />
<glyph unicode="G" horiz-adv-x="1363" d="M128 502q-1 19 -1 40q0 112 31 282q36 203 127 351t227 226q132 75 300 75h13q203 -4 323.5 -120.5t137.5 -327.5h-186q-11 138 -83 212t-199 78h-18q-176 0 -296 -135q-127 -142 -167 -415l-19 -140l-3 -76q0 -197 81 -304.5t227 -109.5h18q198 0 317 104l60 327h-328 l28 156h512l-83 -533q-73 -103 -213 -158q-134 -54 -306 -54h-12q-143 3 -250 67t-168 183.5t-70 271.5z" />
<glyph unicode="H" horiz-adv-x="1426" d="M59 0l253 1456h188l-109 -626h710l109 626h189l-253 -1456h-188l117 673h-711l-117 -673h-188z" />
<glyph unicode="I" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187z" />
<glyph unicode="J" horiz-adv-x="1106" d="M22 402h187q-2 -20 -2 -38q0 -94 47 -154q56 -71 168 -73h11q116 0 197 77q85 81 104 210l176 1032h188l-175 -1031q-29 -206 -167 -329q-134 -118 -331 -118h-13q-192 4 -297 116q-94 101 -94 269q0 19 1 39z" />
<glyph unicode="K" horiz-adv-x="1255" d="M59 0l253 1456h188l-124 -709l742 709h242l-677 -652l453 -804h-209l-383 675l-213 -191l-84 -484h-188z" />
<glyph unicode="L" horiz-adv-x="1079" d="M59 0l253 1456h189l-226 -1299h670l-28 -157h-858z" />
<glyph unicode="M" horiz-adv-x="1744" d="M59 0l253 1456h237l255 -1186l668 1186h247l-253 -1456h-187l100 576l119 586l-660 -1162h-144l-260 1185l-90 -628l-97 -557h-188z" />
<glyph unicode="N" horiz-adv-x="1426" d="M59 0l253 1456h182l521 -1135l197 1135h187l-253 -1456h-182l-520 1130l-196 -1130h-189z" />
<glyph unicode="O" horiz-adv-x="1376" d="M125 515q-1 19 -1 39q0 110 28 260q33 178 114 321t197 229q152 112 345 112h13q213 -4 336 -147.5t132 -388.5q1 -14 0 -30q1 -97 -21 -237q-26 -162 -91.5 -301t-166.5 -233q-171 -159 -403 -159h-14q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q0 -14 -1 -28 q0 -176 71 -279q76 -111 221 -115h13q181 0 301 136q124 142 165 398q20 126 23 218v29q0 177 -69 277q-75 108 -223 112h-13q-127 0 -227 -72q-106 -76 -173 -227.5t-85 -383.5z" />
<glyph unicode="P" horiz-adv-x="1263" d="M59 0l253 1456l486 -1q225 1 347 -119q107 -105 107 -271q0 -23 -2 -47q-18 -209 -166.5 -329t-391.5 -120l-346 1l-99 -570h-188zM373 727l324 -1q153 0 251 77t115 214q3 24 3 46q0 91 -54 153q-67 76 -195 81l-345 1z" />
<glyph unicode="Q" horiz-adv-x="1376" d="M117 516q-1 20 -1 40q0 113 28 260q32 175 111 315.5t191 226.5q155 118 353 118h13q141 -3 245 -68t161 -188.5t63 -279.5q1 -19 1 -39q0 -64 -8 -128l-12 -85q-62 -431 -355 -612l217 -209l-139 -113l-254 243q-74 -16 -148 -16q-137 1 -241 66.5t-161.5 189 t-63.5 279.5zM303 564v-26q0 -100 27 -189q31 -100 98.5 -152t165.5 -55h17q173 0 293 133q125 140 167 395q21 127 24 224q1 17 1 33q0 176 -70 274q-76 107 -222 111h-13q-126 0 -227 -72q-105 -76 -172.5 -227.5t-85.5 -383.5z" />
<glyph unicode="R" horiz-adv-x="1233" d="M58 0l253 1456l438 -1q229 -1 349 -116q104 -99 104 -260q0 -26 -3 -53q-11 -137 -99.5 -241t-235.5 -157l226 -615l-1 -13h-200l-204 589h-336l-102 -589h-189zM376 746l276 -1q144 0 243 76.5t116 204.5q3 23 3 45q0 93 -53 151q-65 71 -198 75l-291 1z" />
<glyph unicode="S" horiz-adv-x="1189" d="M46 423l188 -1q-1 -13 -1 -26q-1 -112 71 -180q80 -76 225 -79h9q139 0 230 63q94 65 109 175q2 17 2 33q0 135 -168 201l-173 63l-58 25q-274 125 -274 345q0 14 1 29q10 121 83 214q74 93 194 143q114 48 241 48h15q132 -3 236 -59q103 -57 157 -157q49 -90 48 -201 v-25l-189 1q1 17 1 33q0 110 -61 174q-70 74 -200 76h-8q-132 0 -221 -64q-92 -66 -106 -180q-2 -13 -2 -26q0 -130 185 -200l149 -53l75 -32q262 -121 262 -351q0 -17 -1 -35q-11 -123 -83 -212.5t-196 -138.5q-116 -46 -249 -46h-16q-137 1 -250.5 58.5t-172.5 157.5 q-53 89 -53 200q0 14 1 27z" />
<glyph unicode="T" horiz-adv-x="1195" d="M168 1298l28 158h1093l-28 -158h-453l-225 -1298h-187l225 1298h-453z" />
<glyph unicode="U" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-3 -30 -3 -58q0 -113 55 -183q69 -88 209 -91h19q140 1 238 83q104 88 131 248l168 988h189l-168 -985q-34 -227 -196 -361q-157 -131 -378 -131h-13q-143 3 -249 65q-105 60 -155 172q-37 83 -37 184q0 34 4 70z" />
<glyph unicode="V" horiz-adv-x="1274" d="M164 1456h197l213 -1199l591 1199h212l-752 -1456h-166z" />
<glyph unicode="W" horiz-adv-x="1772" d="M195 1456h183l68 -1007l-4 -176l68 172l435 1011h159l115 -1024l10 -166l63 201l372 989h193l-570 -1456h-171l-126 1069l-4 100l-42 -116l-464 -1053h-171z" />
<glyph unicode="X" horiz-adv-x="1255" d="M-44 0l579 743l-330 713h208l253 -557l425 557h232l-567 -731l339 -725h-211l-258 567l-438 -567h-232z" />
<glyph unicode="Y" horiz-adv-x="1203" d="M168 1456h204l239 -730l495 730h224l-653 -923l-93 -533h-187l96 554z" />
<glyph unicode="Z" horiz-adv-x="1199" d="M-21 0l27 154l966 1144h-756l28 158h986l-26 -151l-970 -1148h802l-28 -157h-1029z" />
<glyph unicode="[" horiz-adv-x="537" d="M-1 -312l308 1976h368l-25 -152h-185l-261 -1672h186l-24 -152h-367z" />
<glyph unicode="\" horiz-adv-x="825" d="M191 1456h164l315 -1581h-163z" />
<glyph unicode="]" horiz-adv-x="537" d="M-134 -312l24 152h187l261 1672h-188l25 152h368l-309 -1976h-368z" />
<glyph unicode="^" horiz-adv-x="840" d="M79 729l417 727h124l163 -727h-158l-101 480l-268 -480h-177z" />
<glyph unicode="_" horiz-adv-x="906" d="M-127 -151l27 151h890l-27 -151h-890z" />
<glyph unicode="`" horiz-adv-x="624" d="M207 1534h205l143 -294h-143z" />
<glyph unicode="a" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q2 17 2 33q0 75 -40 121q-48 56 -142 58h-7q-87 0 -157 -46q-72 -48 -88 -125l-182 -1q9 95 74 168.5t167 113.5q97 39 201 39h10q169 -5 263 -103q81 -85 81 -217q0 -21 -2 -44l-88 -536l-5 -77v-14q0 -48 12 -95 l-2 -17h-184q-7 29 -7 57l3 57q-145 -134 -307 -134h-9q-143 2 -233 90q-82 81 -82 200q0 11 1 22zM244 319q-2 -13 -2 -25q0 -60 38 -102q44 -50 129 -52h8q83 0 157 42q78 44 133 120l39 223l-137 1q-171 0 -262 -54t-103 -153z" />
<glyph unicode="b" horiz-adv-x="1125" d="M31 0l267 1536h181l-109 -574q126 140 306 140h10q156 -4 243 -115t92 -306v-16q0 -56 -6 -108l-2 -21q-20 -166 -91 -299t-172 -197q-96 -61 -213 -61h-11q-196 4 -291 147l-37 -126h-167zM266 305q60 -165 225 -169h12q99 0 173 63q80 67 121 187.5t44 254.5v16 q0 135 -49 207q-52 78 -159 82h-8q-164 0 -278 -170z" />
<glyph unicode="c" horiz-adv-x="1050" d="M84 517l5 50q19 156 91 279q72 124 188 192q110 65 241 64h15q170 -4 272 -114t102 -279l-169 1q-2 106 -59 171.5t-154 69.5h-8q-136 0 -226 -105q-94 -108 -117 -302l-3 -26q-4 -38 -3 -78q0 -27 1 -54q7 -117 66 -185t162 -71h6q93 0 169 56q78 58 102 154l171 1 q-15 -102 -81.5 -186t-167.5 -131q-95 -44 -194 -44h-13q-135 2 -228 70q-94 70 -138 192q-33 93 -33 203q0 35 3 72z" />
<glyph unicode="d" horiz-adv-x="1130" d="M78 402q-1 16 -1 34q0 47 6 107q20 165 91 298t175 199q99 63 218 63h11q181 -4 278 -132l104 565h181l-266 -1536h-165l19 116q-124 -136 -306 -136h-10q-150 4 -239 117.5t-96 304.5zM257 439v-15q0 -132 51 -207q54 -79 158 -81h13q149 0 266 158l86 500 q-60 148 -218 152h-9q-102 0 -180 -64q-82 -68 -124 -189.5t-43 -253.5z" />
<glyph unicode="e" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 201q108 65 233 64h11q167 -4 262 -111t104 -290q1 -20 1 -39q0 -46 -5 -91l-11 -83h-707q-4 -31 -3 -61q0 -108 52 -189q66 -103 198 -107h8q155 0 288 144l104 -88q-68 -97 -176 -153q-104 -54 -230 -54h-9q-202 4 -316 149 q-98 125 -98 311q0 29 2 60zM286 640l526 -1l4 16q4 28 4 54q0 91 -44 155q-56 84 -162 87h-8q-108 0 -188 -76q-84 -79 -132 -235z" />
<glyph unicode="f" horiz-adv-x="700" d="M116 939l25 143h166l18 128q26 163 126 255q103 94 261 94h7q51 0 129 -17l-22 -151q-48 10 -97 12q-94 0 -152.5 -58.5t-72.5 -155.5l-16 -107h224l-25 -143h-224l-163 -939h-181l164 939h-167z" />
<glyph unicode="g" horiz-adv-x="1125" d="M4 -238l103 111q98 -145 259 -149h13q120 0 205 72q90 76 119 216l20 96q-128 -128 -299 -128h-10q-101 3 -175.5 54.5t-115.5 149t-45 217.5v25q0 51 6 117q24 177 95.5 307.5t174.5 193.5q97 59 213 59h11q188 -4 284 -142l36 121h166l-180 -1059q-29 -207 -168 -331 q-133 -119 -324 -119h-19q-110 2 -210.5 52t-158.5 137zM259 440v-15q0 -132 49 -207q53 -78 159 -82h8q157 0 271 159l85 497q-60 148 -217 154h-9q-141 0 -233 -120q-94 -124 -111 -335z" />
<glyph unicode="h" horiz-adv-x="1104" d="M31 0l267 1536h181l-110 -586q138 151 318 151h9q152 -3 226 -105q58 -81 58 -214q0 -35 -4 -73l-118 -709h-181l119 712q3 27 3 51q0 21 -2 40q-17 140 -165 143h-7q-161 0 -279 -174l-134 -772h-181z" />
<glyph unicode="i" horiz-adv-x="492" d="M47 0l188 1082h180l-188 -1082h-180zM300 1444q29 31 76 33h6q42 1 70 -27q30 -30 31 -78q-1 -47 -30.5 -77t-76.5 -32h-6q-43 0 -71 27q-29 28 -29 73q0 49 30 81z" />
<glyph unicode="j" horiz-adv-x="484" d="M-236 -420l16 148q37 -9 83 -11q129 0 155 154l207 1211h181l-205 -1211q-20 -153 -103 -233q-80 -78 -209 -78h-6q-53 2 -119 20zM256 1366q1 47 29.5 78t76.5 33h6q42 0 70 -29q31 -30 31 -76q-1 -47 -31 -77t-77 -32h-6q-41 0 -69 28q-30 30 -30 75z" />
<glyph unicode="k" horiz-adv-x="1017" d="M32 0l267 1536h181l-160 -918l111 112l384 352h235l-497 -461l342 -621h-198l-278 499l-142 -127l-64 -372h-181z" />
<glyph unicode="l" horiz-adv-x="492" d="M47 0l266 1536h181l-267 -1536h-180z" />
<glyph unicode="m" horiz-adv-x="1751" d="M30 0l188 1082l170 1l-23 -121q132 140 319 140h10q103 -2 174.5 -47t98.5 -127q149 174 350 174h9q162 -4 239 -109q61 -83 61 -212q0 -33 -4 -70l-119 -711h-180l118 713q3 26 3 49.5t-3 45.5q-19 136 -178 139h-6q-95 1 -173 -61q-80 -64 -104 -167l-123 -719h-182 l120 712q3 24 3 46q0 78 -36 125q-46 60 -145 62h-8q-163 0 -261 -154l-137 -791h-181z" />
<glyph unicode="n" horiz-adv-x="1106" d="M31 0l188 1082l171 1l-26 -137q142 156 323 156h9q153 -4 226 -106q58 -81 58 -214q0 -35 -4 -73l-118 -709h-181l119 712q3 27 3 51q0 21 -2 40q-17 140 -165 143h-5q-160 0 -281 -174l-134 -772h-181z" />
<glyph unicode="o" horiz-adv-x="1143" d="M82 523q15 168 91 302q75 133 195 207q113 70 249 70h15q136 -2 233 -74t143 -198q35 -96 36 -205q0 -35 -4 -72l-2 -22q-19 -158 -94 -285.5t-194 -198.5q-113 -67 -246 -67h-15q-135 2 -232.5 74t-142.5 196q-35 96 -35 207q0 33 3 66zM264 391q10 -118 70.5 -188 t161.5 -73h11q84 0 155 44q76 48 128 144t67 213q5 57 5 102q0 29 -2 53q-12 121 -73 191t-162 74h-7q-135 0 -231 -110q-98 -113 -121 -296l-2 -23q-4 -32 -4 -64.5t4 -66.5z" />
<glyph unicode="p" horiz-adv-x="1125" d="M-41 -416l260 1498l164 1l-20 -121q130 140 311 140h10q156 -4 243 -115t92 -306v-18q0 -55 -5 -106l-3 -21q-20 -165 -89 -297t-171 -197q-98 -63 -215 -63h-11q-188 4 -288 127l-97 -522h-181zM260 278q61 -144 219 -148h7q131 0 222 106q95 108 125 321l5 84 q0 146 -55.5 223.5t-160.5 81.5h-8q-152 0 -263 -149z" />
<glyph unicode="q" horiz-adv-x="1139" d="M79 400q-1 18 -1 37q0 107 30 225q35 137 104.5 239.5t164.5 153.5q90 48 195 48h13q183 -4 279 -131l33 110h167l-260 -1498h-180l98 516q-126 -120 -291 -120h-11q-152 2 -243 115t-98 305zM260 438v-15q0 -134 52 -211q56 -80 160 -82h8q148 0 263 146l94 532 q-66 139 -216 143h-7q-133 0 -224 -105q-94 -108 -125 -324z" />
<glyph unicode="r" horiz-adv-x="682" d="M31 0l188 1082l175 1l-27 -126q112 147 263 147h8q33 0 86 -15l-20 -172l-85 9q-174 0 -274 -157l-133 -769h-181z" />
<glyph unicode="s" horiz-adv-x="1034" d="M50 334l181 -1q0 -91 58 -146t159 -55h9q94 0 162 42q72 44 82 119q1 11 1 21q0 95 -124 137l-188 55q-230 79 -230 260v12q6 142 130 234q121 90 284 90h7q165 -2 267 -96q99 -90 98 -232v-11l-180 1v6q0 77 -51 126q-53 51 -141 53h-7q-89 0 -155 -46q-63 -45 -73 -118 q-1 -9 -1 -17q0 -81 116 -120l91 -25q186 -48 264 -125q72 -72 72 -175v-16q-6 -101 -66 -176t-160 -115q-93 -37 -197 -36h-16q-172 2 -284 100q-108 95 -108 243v11z" />
<glyph unicode="t" horiz-adv-x="659" d="M67 939l25 143h191l46 262h180l-46 -262h197l-25 -143h-196l-113 -673q-3 -26 -1 -48q7 -78 85 -78q33 0 88 10l-14 -151q-65 -18 -132 -18q-108 1 -162 79q-44 63 -44 163q0 22 2 46l110 670h-191z" />
<glyph unicode="u" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-3 -28 -3 -54q0 -16 1 -32q5 -72 43 -113t106 -44h14q184 0 286 157l136 788h181l-188 -1082h-171l23 107q-123 -127 -311 -127h-12q-155 4 -229 111q-59 85 -60 220q0 34 4 72z" />
<glyph unicode="v" horiz-adv-x="972" d="M110 1082h178l136 -829l390 829h191l-545 -1082h-138z" />
<glyph unicode="w" horiz-adv-x="1503" d="M128 1082h173l66 -806l384 806h146l105 -826l345 826h187l-493 -1082h-147l-112 818l-390 -818h-147z" />
<glyph unicode="x" horiz-adv-x="995" d="M-60 0l447 556l-256 526h198l167 -394l294 394h222l-434 -544l264 -538h-197l-179 404l-305 -404h-221z" />
<glyph unicode="y" horiz-adv-x="950" d="M-91 -422l16 150l47 -5h15q76 0 133 39q63 42 111 137l65 124l-187 1059h189l121 -809l385 809h200l-642 -1262q-132 -260 -339 -260h-5q-37 1 -109 18z" />
<glyph unicode="z" horiz-adv-x="995" d="M-19 0l25 145l709 784h-565l28 153h796l-24 -140l-716 -791h608l-27 -151h-834z" />
<glyph unicode="{" horiz-adv-x="682" d="M56 541l16 145q217 10 249 245l31 228q59 339 410 440l27 -117q-212 -70 -257 -337l-34 -240q-33 -200 -211 -294q103 -77 113 -219q3 -44 -1 -87l-31 -243l-2 -71l2 -31q17 -159 151 -212l-41 -113q-158 53 -232 172.5t-55 291.5l28 207q6 49 1 91q-17 136 -164 144z " />
<glyph unicode="|" horiz-adv-x="494" d="M33 -270l270 1726h146l-270 -1726h-146z" />
<glyph unicode="}" horiz-adv-x="682" d="M-116 -251q217 71 260 344l31 226q31 208 226 301q-113 69 -126 216q-4 42 1 87l31 246l2 71q-3 184 -152 242l45 113q156 -53 228 -172.5t53 -290.5l-27 -208q-6 -50 -1 -91q16 -135 163 -143l-15 -145q-218 -10 -250 -248l-28 -207q-51 -354 -413 -458z" />
<glyph unicode="~" horiz-adv-x="1361" d="M105 436q16 162 113.5 266.5t238.5 100.5q119 -3 227 -96l89 -83q68 -61 131 -61q75 0 127.5 55t70.5 157l143 3q-14 -163 -111.5 -271.5t-237.5 -106.5q-126 3 -249 115l-60 58q-72 67 -138 67q-136 3 -180 -164l-8 -37z" />
<glyph unicode="&#xa1;" horiz-adv-x="494" d="M-15 -360l194 1044h165l-169 -1044h-190zM203 993q1 48 30.5 77.5t76.5 31.5q46 1 76.5 -28t29.5 -75q0 -47 -29 -78t-77 -33t-77.5 29t-29.5 76z" />
<glyph unicode="&#xa2;" horiz-adv-x="1096" d="M94 350q-12 111 10 244.5t82.5 238.5t153.5 171.5t212 87.5l45 226h181l-45 -225q131 -32 204.5 -133.5t73.5 -250.5h-170q0 106 -56 172t-153 70q-152 6 -251 -122t-113 -356l-1 -42q-3 -142 55 -220.5t167 -80.5q97 -2 175.5 55.5t105.5 154.5l172 1 q-21 -134 -125.5 -228.5t-264.5 -124.5l-46 -233h-181l47 236q-119 30 -191.5 124t-86.5 235z" />
<glyph unicode="&#xa3;" horiz-adv-x="1164" d="M-13 0l29 156l67 -2q113 41 142 262l27 206h-160l27 157h156l31 253q25 204 164 327t331 117q168 -4 264 -108.5t88 -281.5l-187 1q7 106 -42 167t-150 65q-110 4 -187 -78t-93 -211l-32 -251h310l-27 -157h-305l-28 -212q-20 -153 -108 -256l715 3l-29 -157h-1003z" />
<glyph unicode="&#xa4;" horiz-adv-x="1426" d="M18 118l159 134q-30 85 -40 172q-19 150 25.5 294.5t148.5 261.5l-117 157l141 127l114 -148q179 122 361 118q188 -2 325 -121l175 152l111 -146l-173 -147q32 -87 44 -176q18 -144 -22.5 -285t-139.5 -261l115 -150l-143 -127l-106 137q-187 -134 -377 -130 q-199 4 -335 130l-157 -136zM304 599q-15 -114 22 -218t116.5 -165.5t187.5 -65.5q117 -4 224.5 59t180 174t88.5 234q14 115 -22.5 218t-115.5 163.5t-187 64.5q-118 4 -226 -59t-180 -173t-88 -232z" />
<glyph unicode="&#xa5;" horiz-adv-x="1213" d="M83 322l22 124h366l29 165h-367l22 125h310l-281 720h203l235 -673l469 673h225l-530 -720h297l-22 -125h-372l-29 -165h373l-22 -124h-372l-57 -322h-188l56 322h-367z" />
<glyph unicode="&#xa6;" horiz-adv-x="486" d="M-9 -270l138 791h182l-138 -791h-182zM159 698l132 758h182l-132 -758h-182z" />
<glyph unicode="&#xa7;" horiz-adv-x="1228" d="M-24 -63l181 1q-6 -85 25.5 -148t96.5 -97.5t153 -35.5q83 -2 157 25t120 76.5t55 118.5q12 77 -41.5 132.5t-192 100t-218.5 82.5q-242 115 -222 351q14 184 224 287q-99 106 -86 272q8 108 75 194.5t186 133.5q123 48 264 46q207 -4 319.5 -118.5t100.5 -312.5h-180 q8 126 -58 201t-190 79q-135 2 -226.5 -56.5t-106.5 -163.5q-11 -81 37 -135.5t183.5 -96.5t206.5 -73q269 -116 248 -361q-18 -191 -229 -287q103 -103 90 -272q-14 -174 -158 -276t-366 -100q-217 4 -338 119t-110 314zM273 545q-14 -100 61 -161q50 -41 179 -81.5 t194 -65.5q174 52 196 199q11 73 -36.5 129t-166.5 98l-84 28l-154 52q-167 -47 -189 -198z" />
<glyph unicode="&#xa8;" horiz-adv-x="840" d="M219 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM636 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xa9;" horiz-adv-x="1571" d="M119 722q22 199 136 377t289 279.5t369 97.5q178 -2 320 -100t213 -271.5t50 -369.5q-23 -203 -137 -380t-286 -277t-360 -99h-10q-183 4 -323 102t-211 271.5t-50 369.5zM230 570q22 -207 152 -338.5t320 -133.5q187 -4 353.5 107.5t258 302t71.5 380.5 q-22 205 -150 334t-321 134q-189 4 -355.5 -108t-257.5 -300t-71 -378zM453 670l10 98q20 189 123.5 298.5t260.5 107.5q142 -4 219.5 -85.5t71.5 -229.5l-143 1q6 85 -28.5 134t-124.5 51q-95 2 -158.5 -70.5t-78 -200t-13.5 -157.5l2 -35q7 -77 46.5 -122t107.5 -48 q170 -7 205 184l140 1q-14 -151 -107 -234.5t-242 -79.5q-145 4 -225 112t-66 275z" />
<glyph unicode="&#xaa;" horiz-adv-x="898" d="M199 911q5 115 98 177t260 62l111 -1l9 54q3 27 1 51q-7 79 -92 82q-56 1 -99.5 -23.5t-58.5 -80.5l-156 11q11 109 99 172.5t219 61.5q123 -4 189.5 -78.5t56.5 -198.5l-54 -347l-4 -58q-1 -45 7 -91l-155 -1l-4 74q-92 -86 -206 -86q-105 0 -165 61.5t-56 158.5z M361 915q-5 -43 22 -66t77 -23q75 0 166 68l28 143h-93q-88 -3 -140 -35t-60 -87z" />
<glyph unicode="&#xab;" horiz-adv-x="942" d="M89 538l2 20l347 389h152l-329 -409l178 -387h-125zM409 538l2 20l347 389h152l-329 -409l178 -387h-125z" />
<glyph unicode="&#xac;" horiz-adv-x="1110" d="M129 639l29 161h807l-74 -425h-182l47 264h-627z" />
<glyph unicode="&#xad;" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
<glyph unicode="&#xae;" horiz-adv-x="1572" d="M118 722q22 199 136 377t289 279.5t369 97.5q175 -2 316.5 -97.5t215 -269t51.5 -374.5q-23 -204 -138 -381.5t-288.5 -278.5t-365.5 -97q-179 4 -319 99.5t-213.5 270.5t-52.5 374zM229 569q12 -131 76.5 -241t167 -169t228.5 -62q187 -4 352 106t258 300t74 385 q-14 133 -78.5 241t-166 166t-227.5 61q-185 4 -350 -103t-259.5 -297.5t-74.5 -386.5zM463 316l133 849l257 -1q139 -5 213.5 -69.5t67.5 -178.5q-3 -58 -37 -106t-115 -94q77 -44 86 -141l-1 -61q-11 -87 -9 -118l3 -64l-2 -17h-138q-6 37 -4 73l7 72l6 54q7 66 -17 100.5 t-92 38.5l-167 1l-53 -338h-138zM673 782l143 -1q72 2 122.5 36.5t59.5 92.5q10 63 -22.5 94t-121.5 34h-140z" />
<glyph unicode="&#xaf;" horiz-adv-x="920" d="M227 1313l23 143h694l-23 -143h-694z" />
<glyph unicode="&#xb0;" horiz-adv-x="752" d="M236 1207q4 111 84.5 191.5t183.5 78.5q97 -2 160.5 -76.5t61.5 -175.5q-4 -112 -83.5 -190t-181.5 -76q-98 2 -163.5 74.5t-61.5 173.5zM357 1209q-6 -49 24.5 -85.5t79.5 -36.5q54 0 96.5 40t48.5 96q6 48 -22 87.5t-80 39.5q-54 0 -97.5 -42.5t-49.5 -98.5z" />
<glyph unicode="&#xb1;" horiz-adv-x="1071" d="M37 0l24 152h811l-24 -152h-811zM109 703l25 151h373l65 413h163l-65 -413h353l-24 -151h-352l-65 -414h-164l65 414h-374z" />
<glyph unicode="&#xb2;" horiz-adv-x="738" d="M92 667l20 116l355 298q99 84 111 158q7 48 -19.5 75t-74.5 28q-66 1 -106 -36.5t-54 -99.5l-154 -1q11 117 98 191.5t215 72.5q120 -2 189.5 -65t64.5 -165q-8 -123 -159 -248l-64 -51l-196 -145h379l-23 -128h-582z" />
<glyph unicode="&#xb3;" horiz-adv-x="738" d="M110 889h151q0 -50 33 -77.5t91 -27.5q64 0 109.5 32t52.5 85q13 102 -128 107l-87 1l11 116l78 -1q66 2 112.5 32.5t53.5 84.5q6 49 -25 73.5t-81 24.5q-112 0 -141 -93h-156q11 101 90.5 161.5t204.5 60.5q126 -3 197 -62t66 -156q-7 -119 -159 -185q118 -43 114 -172 q-5 -111 -95.5 -175.5t-223.5 -62.5q-119 2 -193.5 64t-74.5 170z" />
<glyph unicode="&#xb4;" horiz-adv-x="633" d="M213 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xb5;" horiz-adv-x="1135" d="M-27 -416l260 1498h181l-103 -624q-10 -84 -7 -142q10 -183 156 -186q183 -6 280 151l139 801h182l-188 -1082h-162l19 115q-111 -138 -273 -136q-135 0 -215 75l-89 -470h-180z" />
<glyph unicode="&#xb6;" horiz-adv-x="981" d="M143 980q14 142 88 251t194 167.5t264 58.5l277 -1l-252 -1456h-182l91 520l-64 1q-211 3 -323.5 130.5t-92.5 328.5z" />
<glyph unicode="&#xb7;" horiz-adv-x="528" d="M165 726q1 49 31.5 81.5t80.5 34.5q48 2 80 -29t32 -81q-1 -49 -33 -80.5t-81 -33.5q-45 -2 -77.5 27.5t-32.5 80.5z" />
<glyph unicode="&#xb8;" horiz-adv-x="502" d="M-56 -437l4 108q166 6 182 107q12 71 -92 83l-46 6l46 133h129l-21 -55q129 -29 125 -163q-3 -102 -90 -159t-237 -60z" />
<glyph unicode="&#xb9;" horiz-adv-x="738" d="M223 1215l24 135l356 113h21l-131 -789h-154l104 597z" />
<glyph unicode="&#xba;" horiz-adv-x="913" d="M205 1043l7 70q17 168 122.5 268t254.5 96q141 -4 221.5 -102.5t67.5 -251.5l-7 -71q-17 -166 -121.5 -266.5t-254.5 -96.5q-142 4 -222.5 104t-67.5 250zM365 1041q-10 -96 26 -153.5t113 -59.5q79 -3 135 54t71 161l9 81q8 102 -29 156.5t-109 56.5q-82 2 -138 -56 t-70 -158z" />
<glyph unicode="&#xbb;" horiz-adv-x="941" d="M15 152l328 408l-177 389h125l225 -387l-2 -21l-347 -389h-152zM353 152l328 408l-177 389h125l225 -387l-2 -21l-347 -389h-152z" />
<glyph unicode="&#xbc;" horiz-adv-x="1465" d="M185 1205l24 135l356 113h21l-131 -789h-154l104 597zM256 192l881 1128l98 -72l-881 -1128zM688 169l13 112l447 508h164l-85 -490h104l-23 -130h-103l-30 -169h-154l30 169h-363zM865 299h208l58 291l-22 -30z" />
<glyph unicode="&#xbd;" horiz-adv-x="1551" d="M180 1205l24 135l356 113h21l-131 -789h-154l104 597zM213 192l881 1128l98 -72l-881 -1128zM751 0l20 116l355 298q99 84 111 158q7 48 -19.5 75t-74.5 28q-66 1 -106 -36.5t-54 -99.5l-154 -1q11 117 98 191.5t215 72.5q120 -2 189.5 -65t64.5 -165q-8 -123 -159 -248 l-64 -51l-196 -145h379l-23 -128h-582z" />
<glyph unicode="&#xbe;" horiz-adv-x="1555" d="M158 890h151q0 -50 33 -77.5t91 -27.5q64 0 109.5 32t52.5 85q13 102 -128 107l-87 1l11 116l78 -1q66 2 112.5 32.5t53.5 84.5q6 49 -25 73.5t-81 24.5q-112 0 -141 -93h-156q11 101 90.5 161.5t204.5 60.5q126 -3 197 -62t66 -156q-7 -119 -159 -185q118 -43 114 -172 q-5 -111 -95.5 -175.5t-223.5 -62.5q-119 2 -193.5 64t-74.5 170zM379 192l881 1128l98 -72l-881 -1128zM777 169l13 112l447 508h164l-85 -490h104l-23 -130h-103l-30 -169h-154l30 169h-363zM954 299h208l58 291l-22 -30z" />
<glyph unicode="&#xbf;" horiz-adv-x="950" d="M-30 -14q15 183 206 358l116 102q91 85 116 234l176 1q-12 -109 -53.5 -189.5t-146.5 -180.5l-97 -91q-119 -115 -132 -230q-13 -98 34 -156t140 -60q98 -2 164.5 54.5t84.5 150.5l180 1q-19 -167 -141 -268.5t-299 -97.5q-173 4 -268 105t-80 267zM441 994q1 47 31 76.5 t76 31.5q46 1 76.5 -27.5t29.5 -74.5q0 -47 -29.5 -78t-76.5 -33q-48 -2 -77.5 29t-29.5 76z" />
<glyph unicode="&#xc0;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM568 1844h205l143 -294h-143z" />
<glyph unicode="&#xc1;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM712 1550l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xc2;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM528 1560v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xc3;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM478 1563q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34 t-67 14q-85 -3 -116 -112z" />
<glyph unicode="&#xc4;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM526 1679q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM943 1677q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5 q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xc5;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM641 1721q2 91 66.5 154t153.5 63q82 0 139.5 -58t57.5 -143q-2 -89 -66.5 -151t-153.5 -62q-84 0 -141.5 57t-55.5 140zM737 1723q-4 -46 23 -77.5t70 -31.5q46 0 85.5 35.5 t45.5 85.5q6 46 -22 79t-70 33q-46 0 -86 -36.5t-46 -87.5z" />
<glyph unicode="&#xc6;" horiz-adv-x="1867" d="M-124 0l1106 1456h930l-27 -152h-670l-63 -471h574l-27 -151h-567l-71 -531h685l-27 -151h-857l47 353h-540l-261 -353h-232zM496 527h436l96 722z" />
<glyph unicode="&#xc7;" horiz-adv-x="1303" d="M120 494q-4 82 7 160l17 120q47 328 230.5 517.5t446.5 184.5q205 -4 325 -132.5t127 -356.5h-187q-13 306 -240 330l-33 2q-189 5 -315.5 -140.5t-163.5 -397.5l-22 -151l-6 -88q-6 -184 65.5 -292.5t212.5 -112.5q152 -5 251.5 73t151.5 251l182 3 q-42 -226 -204.5 -358t-389.5 -126q-135 3 -236 66.5t-157 183t-62 264.5zM394 -446l4 108q166 6 182 107q12 71 -92 83l-46 6l46 133h129l-21 -55q129 -29 125 -163q-3 -102 -90 -159t-237 -60z" />
<glyph unicode="&#xc8;" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM518 1856h205l143 -294h-143z" />
<glyph unicode="&#xc9;" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM662 1562l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xca;" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM478 1572v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xcb;" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM476 1691q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM893 1689q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5 q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xcc;" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM189 1856h205l143 -294h-143z" />
<glyph unicode="&#xcd;" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM332 1562l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xce;" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM149 1572v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xcf;" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM147 1691q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM564 1689q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xd0;" horiz-adv-x="1343" d="M47 666l27 151h157l111 639l378 -1q178 0 306.5 -89t184.5 -245.5t33 -350.5l-10 -73q-44 -318 -247 -507.5t-510 -189.5h-388l115 666h-157zM304 157l185 -1q212 0 359.5 132t191.5 362q35 184 24 313q-15 155 -103 242.5t-236 91.5l-223 1l-84 -481h274l-27 -151h-273z " />
<glyph unicode="&#xd1;" horiz-adv-x="1426" d="M59 0l253 1456h182l521 -1135l197 1135h187l-253 -1456h-182l-520 1130l-196 -1130h-189zM530 1563q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14 q-85 -3 -116 -112z" />
<glyph unicode="&#xd2;" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM601 1846h205l143 -294h-143z" />
<glyph unicode="&#xd3;" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM745 1552l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xd4;" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM561 1562v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xd5;" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM511 1565q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14 q-85 -3 -116 -112z" />
<glyph unicode="&#xd6;" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM559 1681q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM976 1679q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5 q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xd7;" horiz-adv-x="1069" d="M40 338l379 335l-261 336l128 114l262 -334l377 334l101 -131l-376 -336l262 -336l-128 -114l-263 336l-379 -336z" />
<glyph unicode="&#xd8;" horiz-adv-x="1376" d="M32 -92l189 232q-106 171 -101 401q1 97 25.5 247t84 279.5t148.5 222t202 141t240 45.5q206 -4 335 -126l131 165h150l-208 -256q49 -116 59 -238q14 -169 -29 -391t-156 -381.5t-272 -225.5q-112 -47 -240 -44q-166 4 -283 84l-124 -155h-151zM302 487q2 -108 33 -191 l710 908q-77 104 -233 109q-182 5 -308 -133t-170 -382q-34 -192 -32 -311zM411 203q74 -58 188 -62q191 -5 317.5 142t166.5 417q22 147 26 233q4 78 -7 156z" />
<glyph unicode="&#xd9;" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM563 1844h205l143 -294h-143z" />
<glyph unicode="&#xda;" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM707 1550l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xdb;" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM523 1560v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z " />
<glyph unicode="&#xdc;" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM521 1679q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5 q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM938 1677q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xdd;" horiz-adv-x="1203" d="M168 1456h204l239 -730l495 730h224l-653 -923l-93 -533h-187l96 554zM658 1550l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xde;" horiz-adv-x="1184" d="M56 0l253 1456h182l-51 -293l238 -1q208 -1 326 -114.5t103 -301.5q-11 -130 -81.5 -228.5t-189.5 -152t-264 -53.5l-279 1l-55 -313h-182zM319 465l257 -1q139 0 236 76.5t114 203.5q14 120 -50.5 191t-182.5 75l-279 1z" />
<glyph unicode="&#xdf;" horiz-adv-x="1191" d="M30 0l190 1111q18 134 77 237t152 156t214 51q159 -4 246 -93t74 -237q-9 -95 -90 -217t-93 -198q-9 -55 18 -109t100 -128t102 -130.5t26 -116.5q-10 -164 -126 -257.5t-289 -89.5q-178 2 -292 75l59 153q106 -75 219 -77q101 0 170.5 49.5t80.5 135.5q7 57 -20.5 110.5 t-101 128.5t-104 134.5t-24.5 122.5q5 59 33 107.5t60.5 94t61 93t36.5 105.5q10 82 -28 136t-119 58q-105 3 -173 -72.5t-89 -220.5l-189 -1112h-181z" />
<glyph unicode="&#xe0;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM426 1534h205l143 -294h-143z" />
<glyph unicode="&#xe1;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM570 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xe2;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM386 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xe3;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM336 1253q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113 l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14q-85 -3 -116 -112z" />
<glyph unicode="&#xe4;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM384 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32 q-47 -1 -76.5 28t-29.5 76zM801 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xe5;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM499 1411q2 91 66.5 154t153.5 63q82 0 139.5 -58t57.5 -143q-2 -89 -66.5 -151t-153.5 -62 q-84 0 -141.5 57t-55.5 140zM595 1413q-4 -46 23 -77.5t70 -31.5q46 0 85.5 35.5t45.5 85.5q6 46 -22 79t-70 33q-46 0 -86 -36.5t-46 -87.5z" />
<glyph unicode="&#xe6;" horiz-adv-x="1687" d="M29 296q10 160 137 250t344 90l226 -1l12 86q12 104 -31 164.5t-133 64.5q-104 2 -176 -51.5t-87 -139.5l-179 19q16 151 142 239t312 86q109 -2 190.5 -45.5t115.5 -120.5q162 169 356 165q127 -2 214 -65t124 -173.5t20 -248.5l-18 -118h-702q-9 -68 0 -132 q13 -107 77.5 -169.5t168.5 -63.5q90 -2 168.5 28t152.5 77l53 -137q-138 -120 -380 -120q-121 2 -213.5 48.5t-143.5 131.5q-169 -184 -445 -180q-146 2 -230.5 88.5t-74.5 227.5zM212 292q-9 -74 36 -117.5t127 -45.5q70 -2 149.5 34.5t145.5 93.5l43 238l-203 1 q-120 0 -203 -56.5t-95 -147.5zM915 640h522l6 32q9 55 2 105q-11 80 -62 126t-135 49q-110 3 -195 -75.5t-138 -236.5z" />
<glyph unicode="&#xe7;" horiz-adv-x="1050" d="M84 517l5 50q19 156 91 279t188 191.5t256 64.5q170 -4 272 -114t102 -279l-169 1q-2 106 -59 171.5t-154 69.5q-141 3 -234.5 -105t-116.5 -302l-3 -26q-6 -64 -2 -132q7 -117 66 -185t162 -71q97 -2 175 56.5t102 153.5l171 1q-15 -102 -81.5 -186t-167.5 -131 t-207 -44q-135 2 -228.5 70.5t-137.5 191t-30 275.5zM262 -446l4 108q166 6 182 107q12 71 -92 83l-46 6l46 133h129l-21 -55q129 -29 125 -163q-3 -102 -90 -159t-237 -60z" />
<glyph unicode="&#xe8;" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM399 1534h205l143 -294h-143z" />
<glyph unicode="&#xe9;" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM543 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xea;" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM359 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xeb;" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM357 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM774 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5 q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xec;" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM107 1533h205l143 -294h-143z" />
<glyph unicode="&#xed;" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM250 1239l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xee;" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM67 1249v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xef;" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM65 1368q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM482 1366q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xf0;" horiz-adv-x="1174" d="M111 459q14 144 83 265.5t180 189.5t243 64q154 -4 265 -115q-4 182 -110 335l-239 -148l-59 108l207 126q-102 86 -280 138l70 157q220 -56 370 -192l209 130l58 -109l-182 -109q177 -295 127 -666l-13 -91q-24 -167 -102.5 -300t-191 -199.5t-242.5 -63.5 q-188 4 -300 141.5t-93 338.5zM292 458q-15 -139 49 -232.5t176 -96.5q127 -5 218 104.5t122 301.5l20 160q-56 126 -226 131q-144 4 -242 -97.5t-117 -270.5z" />
<glyph unicode="&#xf1;" horiz-adv-x="1106" d="M31 0l188 1082l171 1l-26 -137q146 160 332 156q153 -4 226 -106t54 -287l-118 -709h-181l119 712q6 49 1 91q-17 140 -165 143q-163 3 -286 -174l-134 -772h-181zM327 1253q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10 q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14q-85 -3 -116 -112z" />
<glyph unicode="&#xf2;" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM408 1534h205l143 -294h-143z" />
<glyph unicode="&#xf3;" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM552 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xf4;" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM368 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xf5;" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM318 1253q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14 q-85 -3 -116 -112z" />
<glyph unicode="&#xf6;" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM366 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM783 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5 q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xf7;" horiz-adv-x="1144" d="M68 600l33 184h969l-32 -184h-970zM392 278q1 49 31.5 81.5t80.5 34.5q48 2 80 -29t32 -81q-1 -49 -33 -80t-81 -33t-79.5 28.5t-30.5 78.5zM534 1095q0 49 30.5 81.5t80.5 34.5q48 2 80 -29t32 -81q-1 -49 -32.5 -80t-80.5 -33t-80 28t-30 79z" />
<glyph unicode="&#xf8;" horiz-adv-x="1135" d="M57 -133l141 205q-118 124 -125 329q-2 61 4 121l2 16q36 263 191 416.5t368 149.5q103 -2 194 -45l102 149l132 -1l-144 -207q110 -130 117 -328q2 -55 -6 -141q-19 -156 -98.5 -287.5t-199.5 -199.5t-262 -66q-89 2 -182 37l-102 -149zM249 447q-10 -132 41 -223 l459 698q-55 29 -119 31q-157 4 -261.5 -133.5t-119.5 -372.5zM373 152q50 -23 107 -25q140 -3 240.5 107t131.5 297q13 95 11 170q-3 74 -34 143z" />
<glyph unicode="&#xf9;" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM412 1534h205l143 -294h-143z" />
<glyph unicode="&#xfa;" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM556 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xfb;" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM372 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xfc;" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM370 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32 q-47 -1 -76.5 28t-29.5 76zM787 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xfd;" horiz-adv-x="950" d="M-91 -422l16 150l47 -5q86 -4 148.5 38.5t110.5 137.5l65 124l-187 1059h189l121 -809l385 809h200l-642 -1262q-134 -263 -344 -260q-37 1 -109 18zM499 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xfe;" horiz-adv-x="1155" d="M-32 -416l339 1952h180l-106 -567q131 137 312 133q158 -4 244.5 -118t89.5 -303q1 -61 -7 -145q-20 -166 -90 -299t-171.5 -197.5t-225.5 -61.5q-186 4 -287 128l-97 -522h-181zM269 278q61 -143 218 -148q137 -3 231.5 106.5t123.5 321.5l5 84q0 145 -56 223t-160 80 q-160 4 -272 -148z" />
<glyph unicode="&#xff;" horiz-adv-x="950" d="M-91 -422l16 150l47 -5q86 -4 148.5 38.5t110.5 137.5l65 124l-187 1059h189l121 -809l385 809h200l-642 -1262q-134 -263 -344 -260q-37 1 -109 18zM313 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76z M730 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#x152;" horiz-adv-x="1904" d="M105 576l47 299q43 274 215.5 439t415.5 163l74 -2l211 -19h825l-28 -158h-701l-81 -468h612l-28 -157h-611l-90 -516h712l-28 -157h-812l-217 -18l-69 -1q-152 4 -261.5 83t-158 216t-27.5 296zM284 419q10 -131 81 -206.5t193 -79.5q76 -3 214 10l209 1168 q-108 17 -203 17q-175 2 -293 -119.5t-151 -333.5l-47 -300q-10 -78 -3 -156z" />
<glyph unicode="&#x153;" horiz-adv-x="1814" d="M87 522l2 16q36 261 186.5 415t362.5 149q121 -2 216 -60t138 -157q178 221 395 218q125 -2 213 -65t125 -173t20 -246l-19 -122h-692q-8 -61 -2 -125q10 -108 68.5 -172.5t154.5 -67.5q172 -6 316 105l61 -127q-68 -65 -168 -98t-215 -31q-124 2 -218.5 58.5 t-138.5 151.5q-171 -217 -415 -211q-133 2 -227 73t-136.5 195.5t-26.5 273.5zM266 392q5 -117 62.5 -188.5t158.5 -74.5q136 -5 233.5 105t123.5 297l2 22l5 87q0 143 -57.5 225t-166.5 86q-140 5 -236.5 -110.5t-119.5 -296.5l-2 -22q-7 -62 -3 -130zM1056 649l510 -1 l5 28q8 53 1 102q-13 79 -64.5 124.5t-130.5 48.5q-101 3 -183.5 -74t-137.5 -228z" />
<glyph unicode="&#x178;" horiz-adv-x="1203" d="M168 1456h204l239 -730l495 730h224l-653 -923l-93 -533h-187l96 554zM472 1679q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM889 1677q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5 q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#x2c6;" horiz-adv-x="945" d="M279 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#x2dc;" horiz-adv-x="947" d="M221 1249q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14q-85 -3 -116 -112z" />
<glyph unicode="&#x2000;" horiz-adv-x="969" />
<glyph unicode="&#x2001;" horiz-adv-x="1938" />
<glyph unicode="&#x2002;" horiz-adv-x="969" />
<glyph unicode="&#x2003;" horiz-adv-x="1938" />
<glyph unicode="&#x2004;" horiz-adv-x="646" />
<glyph unicode="&#x2005;" horiz-adv-x="484" />
<glyph unicode="&#x2006;" horiz-adv-x="323" />
<glyph unicode="&#x2007;" horiz-adv-x="323" />
<glyph unicode="&#x2008;" horiz-adv-x="242" />
<glyph unicode="&#x2009;" horiz-adv-x="387" />
<glyph unicode="&#x200a;" horiz-adv-x="107" />
<glyph unicode="&#x2010;" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
<glyph unicode="&#x2011;" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
<glyph unicode="&#x2012;" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
<glyph unicode="&#x2013;" horiz-adv-x="1314" d="M159 651l33 151h973l-33 -151h-973z" />
<glyph unicode="&#x2014;" horiz-adv-x="1561" d="M82 651l43 151h1297l-43 -151h-1297z" />
<glyph unicode="&#x2018;" horiz-adv-x="407" d="M174 1073l18 112q36 222 225 370l100 -74q-112 -140 -139 -274l-24 -134h-180z" />
<glyph unicode="&#x2019;" horiz-adv-x="407" d="M137 1120q118 147 142 285l23 131h178l-19 -121q-36 -225 -224 -369z" />
<glyph unicode="&#x201a;" horiz-adv-x="405" d="M-104 -208q115 144 139 283l18 106h181l-15 -96q-35 -220 -224 -368z" />
<glyph unicode="&#x201c;" horiz-adv-x="712" d="M182 1073l18 112q36 222 225 370l100 -74q-112 -140 -139 -274l-24 -134h-180zM487 1073l18 112q36 222 225 370l100 -74q-112 -140 -139 -274l-24 -134h-180z" />
<glyph unicode="&#x201d;" horiz-adv-x="719" d="M149 1120q118 147 142 285l23 131h178l-19 -121q-36 -225 -224 -369zM446 1120q118 147 142 285l23 131h178l-19 -121q-36 -225 -224 -369z" />
<glyph unicode="&#x201e;" horiz-adv-x="694" d="M-108 -227q116 151 143 302l30 171h180l-25 -156q-39 -241 -224 -392zM180 -227q116 154 142 302l30 171h181l-25 -156q-39 -240 -225 -392z" />
<glyph unicode="&#x2022;" horiz-adv-x="679" d="M160 724l1 41q6 94 64.5 150.5t144.5 56.5q81 0 133.5 -54.5t52.5 -142.5l-2 -42q-6 -90 -62.5 -145t-146.5 -55q-82 0 -133.5 53t-51.5 138z" />
<glyph unicode="&#x2026;" horiz-adv-x="1339" d="M57 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5zM481 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5zM883 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5 t-31 78.5z" />
<glyph unicode="&#x202f;" horiz-adv-x="387" />
<glyph unicode="&#x2039;" horiz-adv-x="606" d="M95 540l2 20l347 389h152l-329 -409l178 -387h-125z" />
<glyph unicode="&#x203a;" horiz-adv-x="606" d="M2 152l328 408l-177 389h125l225 -387l-2 -21l-347 -389h-152z" />
<glyph unicode="&#x205f;" horiz-adv-x="484" />
<glyph unicode="&#x20ac;" d="M81 541l22 124h172l25 137h-173l22 125h165q62 269 219.5 410.5t389.5 139.5q89 0 237 -30l-34 -164q-106 36 -205 38q-161 2 -266.5 -99t-151.5 -295h378l-22 -125h-372l-24 -137h373l-22 -124h-370q-9 -74 -2 -145q12 -120 79 -187t181 -70q95 -3 219 31l5 -161 q-114 -29 -233 -27q-226 4 -345 159t-87 401z" />
<glyph unicode="&#x2122;" horiz-adv-x="1253" d="M234 1375l14 81h376l-15 -81h-142l-80 -456h-89l79 456h-143zM605 919l94 537h106l69 -397l210 397h113l-94 -537h-88l67 379l-195 -378l-52 -2l-70 401l-71 -400h-89z" />
<glyph unicode="&#x25fc;" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1706" d="M116 939l25 143h166l17 121q23 168 129 264t266 94q54 -2 129 -18l-22 -152q-48 10 -97 12q-89 0 -147.5 -53t-75.5 -147l-19 -121h387l14 101q26 177 141.5 277.5t296.5 98.5q72 -2 140.5 -21t136.5 -43l-47 -155q-115 51 -226 53q-228 2 -262 -224l-13 -87h216 l-25 -143h-215l-163 -939h-181l163 939h-387l-163 -939h-181l164 939h-167zM1254 0l188 1082h181l-188 -1082h-181z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1706" d="M116 939l25 143h166l18 127q29 182 151 276q102 78 244 76q53 -2 128 -18l-22 -152q-58 12 -98 12q-91 0 -149.5 -55t-74.5 -158l-17 -108h388l15 107q25 180 132 276.5t277 94.5q86 -2 199 -24l191 -40l-254 -1496h-181l243 1380q-129 22 -189 22q-205 2 -239 -225 l-14 -95h225l-26 -143h-223l-163 -939h-181l163 939h-387l-163 -939h-181l163 939h-166z" />
<hkern u1="&#x20;" u2="T" k="40" />
<hkern u1="&#x22;" u2="w" k="-11" />
<hkern u1="&#x27;" u2="w" k="-11" />
<hkern u1="&#x28;" u2="&#x178;" k="-22" />
<hkern u1="&#x28;" u2="&#xdd;" k="-22" />
<hkern u1="&#x28;" u2="Y" k="-22" />
<hkern u1="&#x28;" u2="W" k="-18" />
<hkern u1="&#x28;" u2="V" k="-20" />
<hkern u1="&#x2f;" u2="&#x2f;" k="224" />
<hkern u1="A" u2="w" k="33" />
<hkern u1="A" u2="t" k="17" />
<hkern u1="A" u2="&#x3f;" k="61" />
<hkern u1="C" u2="&#x7d;" k="17" />
<hkern u1="C" u2="]" k="12" />
<hkern u1="C" u2="&#x29;" k="26" />
<hkern u1="D" u2="&#xc6;" k="33" />
<hkern u1="E" u2="w" k="22" />
<hkern u1="E" u2="f" k="18" />
<hkern u1="F" u2="&#x2026;" k="234" />
<hkern u1="F" u2="&#x201e;" k="234" />
<hkern u1="F" u2="&#x201a;" k="234" />
<hkern u1="F" u2="&#x153;" k="21" />
<hkern u1="F" u2="&#xff;" k="24" />
<hkern u1="F" u2="&#xfd;" k="24" />
<hkern u1="F" u2="&#xfc;" k="22" />
<hkern u1="F" u2="&#xfb;" k="22" />
<hkern u1="F" u2="&#xfa;" k="22" />
<hkern u1="F" u2="&#xf9;" k="22" />
<hkern u1="F" u2="&#xf6;" k="21" />
<hkern u1="F" u2="&#xf5;" k="21" />
<hkern u1="F" u2="&#xf4;" k="21" />
<hkern u1="F" u2="&#xf3;" k="21" />
<hkern u1="F" u2="&#xf2;" k="21" />
<hkern u1="F" u2="&#xeb;" k="21" />
<hkern u1="F" u2="&#xea;" k="21" />
<hkern u1="F" u2="&#xe9;" k="21" />
<hkern u1="F" u2="&#xe8;" k="21" />
<hkern u1="F" u2="&#xe7;" k="21" />
<hkern u1="F" u2="&#xe5;" k="34" />
<hkern u1="F" u2="&#xe4;" k="34" />
<hkern u1="F" u2="&#xe3;" k="34" />
<hkern u1="F" u2="&#xe2;" k="34" />
<hkern u1="F" u2="&#xe1;" k="34" />
<hkern u1="F" u2="&#xe0;" k="34" />
<hkern u1="F" u2="&#xc5;" k="170" />
<hkern u1="F" u2="&#xc4;" k="170" />
<hkern u1="F" u2="&#xc3;" k="170" />
<hkern u1="F" u2="&#xc2;" k="170" />
<hkern u1="F" u2="&#xc1;" k="170" />
<hkern u1="F" u2="&#xc0;" k="170" />
<hkern u1="F" u2="y" k="24" />
<hkern u1="F" u2="v" k="24" />
<hkern u1="F" u2="u" k="22" />
<hkern u1="F" u2="r" k="26" />
<hkern u1="F" u2="q" k="21" />
<hkern u1="F" u2="o" k="21" />
<hkern u1="F" u2="g" k="21" />
<hkern u1="F" u2="e" k="21" />
<hkern u1="F" u2="d" k="21" />
<hkern u1="F" u2="c" k="21" />
<hkern u1="F" u2="a" k="34" />
<hkern u1="F" u2="T" k="-20" />
<hkern u1="F" u2="J" k="264" />
<hkern u1="F" u2="A" k="170" />
<hkern u1="F" u2="&#x2e;" k="234" />
<hkern u1="F" u2="&#x2c;" k="234" />
<hkern u1="K" u2="w" k="63" />
<hkern u1="L" u2="w" k="92" />
<hkern u1="O" u2="&#xc6;" k="33" />
<hkern u1="P" u2="&#xc6;" k="97" />
<hkern u1="P" u2="t" k="-14" />
<hkern u1="Q" u2="&#x178;" k="35" />
<hkern u1="Q" u2="&#xdd;" k="35" />
<hkern u1="Q" u2="Y" k="35" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="28" />
<hkern u1="Q" u2="T" k="43" />
<hkern u1="R" u2="&#x178;" k="48" />
<hkern u1="R" u2="&#xdd;" k="48" />
<hkern u1="R" u2="Y" k="48" />
<hkern u1="R" u2="V" k="19" />
<hkern u1="R" u2="T" k="80" />
<hkern u1="T" u2="&#xf8;" k="95" />
<hkern u1="T" u2="&#xe6;" k="114" />
<hkern u1="T" u2="&#xc6;" k="179" />
<hkern u1="T" u2="&#xbb;" k="216" />
<hkern u1="T" u2="&#xab;" k="328" />
<hkern u1="T" u2="w" k="57" />
<hkern u1="T" u2="r" k="75" />
<hkern u1="T" u2="&#x20;" k="40" />
<hkern u1="V" u2="&#x7d;" k="-19" />
<hkern u1="V" u2="r" k="30" />
<hkern u1="V" u2="]" k="-17" />
<hkern u1="V" u2="&#x29;" k="-20" />
<hkern u1="W" u2="&#x7d;" k="-14" />
<hkern u1="W" u2="r" k="21" />
<hkern u1="W" u2="]" k="-12" />
<hkern u1="W" u2="&#x29;" k="-15" />
<hkern u1="Y" u2="&#x2022;" k="45" />
<hkern u1="Y" u2="&#xf8;" k="64" />
<hkern u1="Y" u2="&#xe6;" k="63" />
<hkern u1="Y" u2="&#xc6;" k="96" />
<hkern u1="Y" u2="&#xbb;" k="51" />
<hkern u1="Y" u2="&#xab;" k="82" />
<hkern u1="Y" u2="&#x7d;" k="-19" />
<hkern u1="Y" u2="t" k="22" />
<hkern u1="Y" u2="r" k="40" />
<hkern u1="Y" u2="f" k="22" />
<hkern u1="Y" u2="]" k="-18" />
<hkern u1="Y" u2="&#x2a;" k="49" />
<hkern u1="Y" u2="&#x29;" k="-20" />
<hkern u1="Y" u2="&#x26;" k="30" />
<hkern u1="Z" u2="w" k="27" />
<hkern u1="[" u2="&#xdc;" k="18" />
<hkern u1="[" u2="&#xdb;" k="18" />
<hkern u1="[" u2="&#xda;" k="18" />
<hkern u1="[" u2="&#xd9;" k="18" />
<hkern u1="[" u2="U" k="18" />
<hkern u1="[" u2="J" k="18" />
<hkern u1="e" u2="&#x2019;" k="80" />
<hkern u1="f" u2="&#x201d;" k="-16" />
<hkern u1="f" u2="&#x201c;" k="-16" />
<hkern u1="f" u2="&#x2019;" k="-16" />
<hkern u1="f" u2="&#x2018;" k="-16" />
<hkern u1="f" u2="&#x153;" k="24" />
<hkern u1="f" u2="&#xeb;" k="24" />
<hkern u1="f" u2="&#xea;" k="24" />
<hkern u1="f" u2="&#xe9;" k="24" />
<hkern u1="f" u2="&#xe8;" k="24" />
<hkern u1="f" u2="&#xe7;" k="24" />
<hkern u1="f" u2="&#x7d;" k="-19" />
<hkern u1="f" u2="q" k="24" />
<hkern u1="f" u2="g" k="24" />
<hkern u1="f" u2="e" k="24" />
<hkern u1="f" u2="d" k="24" />
<hkern u1="f" u2="c" k="24" />
<hkern u1="f" u2="]" k="-18" />
<hkern u1="f" u2="&#x29;" k="-20" />
<hkern u1="f" u2="&#x27;" k="-16" />
<hkern u1="f" u2="&#x22;" k="-16" />
<hkern u1="h" u2="&#x2019;" k="80" />
<hkern u1="k" u2="&#x153;" k="20" />
<hkern u1="k" u2="&#xeb;" k="20" />
<hkern u1="k" u2="&#xea;" k="20" />
<hkern u1="k" u2="&#xe9;" k="20" />
<hkern u1="k" u2="&#xe8;" k="20" />
<hkern u1="k" u2="&#xe7;" k="20" />
<hkern u1="k" u2="q" k="20" />
<hkern u1="k" u2="g" k="20" />
<hkern u1="k" u2="e" k="20" />
<hkern u1="k" u2="d" k="20" />
<hkern u1="k" u2="c" k="20" />
<hkern u1="m" u2="&#x2019;" k="80" />
<hkern u1="n" u2="&#x2019;" k="80" />
<hkern u1="o" u2="&#x2019;" k="80" />
<hkern u1="r" u2="w" k="-17" />
<hkern u1="r" u2="t" k="-50" />
<hkern u1="r" u2="f" k="-15" />
<hkern u1="t" u2="&#xf6;" k="20" />
<hkern u1="t" u2="&#xf5;" k="20" />
<hkern u1="t" u2="&#xf4;" k="20" />
<hkern u1="t" u2="&#xf3;" k="20" />
<hkern u1="t" u2="&#xf2;" k="20" />
<hkern u1="t" u2="o" k="20" />
<hkern u1="v" u2="f" k="-13" />
<hkern u1="w" u2="&#x2026;" k="124" />
<hkern u1="w" u2="&#x201e;" k="124" />
<hkern u1="w" u2="&#x201a;" k="124" />
<hkern u1="w" u2="&#x2e;" k="124" />
<hkern u1="w" u2="&#x2c;" k="124" />
<hkern u1="y" u2="f" k="-13" />
<hkern u1="&#x7b;" u2="&#xdc;" k="20" />
<hkern u1="&#x7b;" u2="&#xdb;" k="20" />
<hkern u1="&#x7b;" u2="&#xda;" k="20" />
<hkern u1="&#x7b;" u2="&#xd9;" k="20" />
<hkern u1="&#x7b;" u2="U" k="20" />
<hkern u1="&#x7b;" u2="J" k="20" />
<hkern u1="&#xc0;" u2="w" k="33" />
<hkern u1="&#xc0;" u2="t" k="17" />
<hkern u1="&#xc0;" u2="&#x3f;" k="61" />
<hkern u1="&#xc1;" u2="w" k="33" />
<hkern u1="&#xc1;" u2="t" k="17" />
<hkern u1="&#xc1;" u2="&#x3f;" k="61" />
<hkern u1="&#xc2;" u2="w" k="33" />
<hkern u1="&#xc2;" u2="t" k="17" />
<hkern u1="&#xc2;" u2="&#x3f;" k="61" />
<hkern u1="&#xc3;" u2="w" k="33" />
<hkern u1="&#xc3;" u2="t" k="17" />
<hkern u1="&#xc3;" u2="&#x3f;" k="61" />
<hkern u1="&#xc4;" u2="w" k="33" />
<hkern u1="&#xc4;" u2="t" k="17" />
<hkern u1="&#xc4;" u2="&#x3f;" k="61" />
<hkern u1="&#xc5;" u2="w" k="33" />
<hkern u1="&#xc5;" u2="t" k="17" />
<hkern u1="&#xc5;" u2="&#x3f;" k="61" />
<hkern u1="&#xc7;" u2="&#x7d;" k="17" />
<hkern u1="&#xc7;" u2="]" k="12" />
<hkern u1="&#xc7;" u2="&#x29;" k="26" />
<hkern u1="&#xc8;" u2="w" k="22" />
<hkern u1="&#xc8;" u2="f" k="18" />
<hkern u1="&#xc9;" u2="w" k="22" />
<hkern u1="&#xc9;" u2="f" k="18" />
<hkern u1="&#xca;" u2="w" k="22" />
<hkern u1="&#xca;" u2="f" k="18" />
<hkern u1="&#xcb;" u2="w" k="22" />
<hkern u1="&#xcb;" u2="f" k="18" />
<hkern u1="&#xd0;" u2="&#xc6;" k="33" />
<hkern u1="&#xd2;" u2="&#xc6;" k="33" />
<hkern u1="&#xd3;" u2="&#xc6;" k="33" />
<hkern u1="&#xd4;" u2="&#xc6;" k="33" />
<hkern u1="&#xd5;" u2="&#xc6;" k="33" />
<hkern u1="&#xd6;" u2="&#xc6;" k="33" />
<hkern u1="&#xdd;" u2="&#x2022;" k="45" />
<hkern u1="&#xdd;" u2="&#xf8;" k="64" />
<hkern u1="&#xdd;" u2="&#xe6;" k="63" />
<hkern u1="&#xdd;" u2="&#xc6;" k="96" />
<hkern u1="&#xdd;" u2="&#xbb;" k="51" />
<hkern u1="&#xdd;" u2="&#xab;" k="82" />
<hkern u1="&#xdd;" u2="&#x7d;" k="-19" />
<hkern u1="&#xdd;" u2="t" k="22" />
<hkern u1="&#xdd;" u2="r" k="40" />
<hkern u1="&#xdd;" u2="f" k="22" />
<hkern u1="&#xdd;" u2="]" k="-18" />
<hkern u1="&#xdd;" u2="&#x2a;" k="49" />
<hkern u1="&#xdd;" u2="&#x29;" k="-20" />
<hkern u1="&#xdd;" u2="&#x26;" k="30" />
<hkern u1="&#xe8;" u2="&#x2019;" k="80" />
<hkern u1="&#xe9;" u2="&#x2019;" k="80" />
<hkern u1="&#xea;" u2="&#x2019;" k="80" />
<hkern u1="&#xeb;" u2="&#x2019;" k="80" />
<hkern u1="&#xf1;" u2="&#x2019;" k="80" />
<hkern u1="&#xf2;" u2="&#x2019;" k="80" />
<hkern u1="&#xf3;" u2="&#x2019;" k="80" />
<hkern u1="&#xf4;" u2="&#x2019;" k="80" />
<hkern u1="&#xf5;" u2="&#x2019;" k="80" />
<hkern u1="&#xf6;" u2="&#x2019;" k="80" />
<hkern u1="&#xfd;" u2="f" k="-13" />
<hkern u1="&#xff;" u2="f" k="-13" />
<hkern u1="&#x178;" u2="&#x2022;" k="45" />
<hkern u1="&#x178;" u2="&#xf8;" k="64" />
<hkern u1="&#x178;" u2="&#xe6;" k="63" />
<hkern u1="&#x178;" u2="&#xc6;" k="96" />
<hkern u1="&#x178;" u2="&#xbb;" k="51" />
<hkern u1="&#x178;" u2="&#xab;" k="82" />
<hkern u1="&#x178;" u2="&#x7d;" k="-19" />
<hkern u1="&#x178;" u2="t" k="22" />
<hkern u1="&#x178;" u2="r" k="40" />
<hkern u1="&#x178;" u2="f" k="22" />
<hkern u1="&#x178;" u2="]" k="-18" />
<hkern u1="&#x178;" u2="&#x2a;" k="49" />
<hkern u1="&#x178;" u2="&#x29;" k="-20" />
<hkern u1="&#x178;" u2="&#x26;" k="30" />
<hkern u1="&#x2018;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="&#xf6;" k="128" />
<hkern u1="&#x2019;" u2="&#xf5;" k="128" />
<hkern u1="&#x2019;" u2="&#xf4;" k="128" />
<hkern u1="&#x2019;" u2="&#xf3;" k="128" />
<hkern u1="&#x2019;" u2="&#xf2;" k="128" />
<hkern u1="&#x2019;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="s" k="112" />
<hkern u1="&#x2019;" u2="o" k="128" />
<hkern u1="&#x2019;" u2="l" k="-32" />
<hkern u1="&#x2019;" u2="k" k="-32" />
<hkern u1="&#x2019;" u2="h" k="-32" />
<hkern u1="&#x201c;" u2="w" k="-11" />
<hkern u1="&#x201d;" u2="w" k="-11" />
<hkern g1="B" g2="T" k="27" />
<hkern g1="B" g2="V" k="24" />
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="55" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="T" k="29" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="Y,Yacute,Ydieresis" k="28" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-18" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="X" k="-17" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="27" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="43" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="21" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="102" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="23" />
<hkern g1="C,Ccedilla" g2="T" k="29" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="26" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="17" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="T" g2="v,y,yacute,ydieresis" k="72" />
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="28" />
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="99" />
<hkern g1="T" g2="W" k="-15" />
<hkern g1="T" g2="T" k="-16" />
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="95" />
<hkern g1="T" g2="z" k="60" />
<hkern g1="T" g2="V" k="-16" />
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-16" />
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="79" />
<hkern g1="T" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="218" />
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="99" />
<hkern g1="T" g2="x" k="77" />
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="232" />
<hkern g1="T" g2="m,n,p,ntilde" k="109" />
<hkern g1="T" g2="S" k="16" />
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="113" />
<hkern g1="T" g2="s" k="116" />
<hkern g1="T" g2="J" k="240" />
<hkern g1="K" g2="v,y,yacute,ydieresis" k="40" />
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="31" />
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="27" />
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="23" />
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="64" />
<hkern g1="K" g2="m,n,p,ntilde" k="23" />
<hkern g1="L" g2="v,y,yacute,ydieresis" k="133" />
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="65" />
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="54" />
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="336" />
<hkern g1="L" g2="W" k="143" />
<hkern g1="L" g2="T" k="275" />
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="44" />
<hkern g1="L" g2="V" k="175" />
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="239" />
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-19" />
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-15" />
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="13" />
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="138" />
<hkern g1="P" g2="X" k="31" />
<hkern g1="P" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="324" />
<hkern g1="P" g2="Z" k="26" />
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="11" />
<hkern g1="P" g2="J" k="200" />
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="22" />
<hkern g1="V" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="13" />
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="46" />
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="28" />
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="75" />
<hkern g1="V" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="225" />
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="44" />
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="37" />
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="46" />
<hkern g1="X" g2="v,y,yacute,ydieresis" k="31" />
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="25" />
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="21" />
<hkern g1="X" g2="V" k="-14" />
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="46" />
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="20" />
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="29" />
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="96" />
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="39" />
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="30" />
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="94" />
<hkern g1="Y,Yacute,Ydieresis" g2="X" k="-13" />
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="211" />
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="23" />
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="52" />
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="40" />
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="16" />
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="73" />
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="58" />
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="96" />
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
<hkern g1="W" g2="T" k="-14" />
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="43" />
<hkern g1="W" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="123" />
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="31" />
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="60" />
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="33" />
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="27" />
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="26" />
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-13" />
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="21" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="67" />
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="11" />
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="29" />
<hkern g1="b,p,thorn" g2="z" k="15" />
<hkern g1="b,p,thorn" g2="x" k="15" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="13" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="14" />
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="104" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="136" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="16" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="21" />
<hkern g1="v,y,yacute,ydieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-15" />
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="107" />
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="15" />
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-18" />
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-16" />
<hkern g1="r" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="20" />
<hkern g1="r" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="123" />
<hkern g1="r" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="r" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="40" />
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="20" />
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="20" />
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="16" />
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="16" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="107" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="61" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="59" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="m,n,p,ntilde" k="20" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="50" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="s" k="80" />
<hkern g1="comma,period,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="170" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 81 KiB

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