1 Commits
Author SHA1 Message Date
tmshv 1ce449320c ya trash 2018-11-28 18:37:16 +03:00
448 changed files with 125065 additions and 13440 deletions

No files matched your search

+13 -1
View File
@@ -1,5 +1,17 @@
{
"presets": [
"next/babel"
[
"env",
{
"targets": {
"node": "8.5.0"
}
}
]
],
"plugins": [
"transform-react-jsx",
"transform-object-rest-spread",
"transform-class-properties"
]
}
+18
View File
@@ -0,0 +1,18 @@
pipeline:
build:
image: docker
commands:
- docker build -t tmshv/hudozka:latest -t tmshv/hudozka:build-${DRONE_BUILD_NUMBER} .
- docker save -o hudozka-docker_container${DRONE_BUILD_NUMBER}.tar tmshv/hudozka:build-${DRONE_BUILD_NUMBER}
volumes:
- /var/run/docker.sock:/var/run/docker.sock
scp:
image: appleboy/drone-scp
host: art.shlisselburg.org
username: master
target: ~/Hudozka
source: hudozka-docker_container${DRONE_BUILD_NUMBER}.tar
secrets: [scp_key]
when:
branch: master
+2
View File
@@ -0,0 +1,2 @@
MONGO_HUDOZKA_PASSWORD=h123
HUDOZKA_DB_URI=mongodb://hudozka:h123@mongo:27017/hudozka?authSource=admin
+4
View File
@@ -9,6 +9,10 @@ module.exports = {
"promise",
"react",
],
"globals": {
"angular": true,
"DISQUS": true
},
"rules": {
"semi": ["error", "never"],
"space-before-function-paren": "off",
@@ -1,15 +0,0 @@
---
label: Article
hide_body: false
fields:
- name: slug
type: text
config:
required: false
label: slug
- name: tags
type: tag_list
default: []
label: tags
pages:
- data/articles/article-test.md
-29
View File
@@ -1,29 +0,0 @@
---
new_page_extension: md
auto_deploy: false
admin_path: ''
webhook_url:
sections:
- type: directory
path: data/articles
label: Articles
create: documents
match: "**/*"
- type: document
path: data/settings.json
label: Settings
upload_dir: uploads
public_path: "/uploads"
front_matter_path: ''
use_front_matter_path: false
file_template: ":year:/:filename:"
build:
preview_command: gatsby build
publish_command: gatsby build
preview_output_directory: public
output_directory: public
instant_preview_command: npm run forestry:preview
install_dependencies_command: yarn install
preview_docker_image: node:10
mount_path: "/srv"
working_dir: "/srv"
+1 -4
View File
@@ -8,15 +8,12 @@ private*.json
/node_modules
/bower_components
/modules/hudozka-api-v1/lib
/public
/build
/out
dist
.next
**/env
**/venv
**/__pycache__
**/*.pyc
/coverage
**/.vscode
*.log
.now
-5
View File
@@ -1,5 +0,0 @@
.forestry
./utils
modules
data
uploads
+27
View File
@@ -0,0 +1,27 @@
# Build
FROM node:10 as build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm i
COPY webpack.config.js gulpfile.js .babelrc ./
COPY robots.txt ./
COPY src ./src
RUN npm run gulp
RUN npm run build-app
RUN npm run out
# Run
FROM node:8-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm i --production
COPY --from=build /app/out ./src
COPY --from=build /app/public ./public
EXPOSE 3000
CMD npm start
+6 -2
View File
@@ -2,8 +2,6 @@
Site of Art school of Shlisselburg
Font: [«Shadow»](http://mishapanfilov.ru/font_shadow.html)
## Usage
### Build
@@ -38,5 +36,11 @@ PWD=<mongo_password>
mongodump -d ${DB} --gzip --archive | mongorestore -h ${HOST} -u ${USER} -p ${PWD} -d ${DB} --gzip --archive
```
## Based on:
- [NodeJS](http://nodejs.org) 10.0
- [koa.js](http://koajs.com) 2.0
- [React](https://react.org) 16.3
- [MongoDB](http://mongodb.org) 3.6
## Contributors
- Roman Timashev ([roman@tmshv.ru](mailto:roman@tmshv.ru))
-16
View File
@@ -1,16 +0,0 @@
---
tags:
- test
- dev
slug: article-test
---
This is **Hudozka**
![](/uploads/2019/HudozkaMain2014.jpg)
1. 1
2. 2
3. 3
[Устав 2015](https://app.forestry.io/sites/tadnt0fp3fdrgg/body-media//uploads/2019/Устав 2015.pdf "Устав 2015")
-3
View File
@@ -1,3 +0,0 @@
{
"name": "Hudozka"
}
+30
View File
@@ -0,0 +1,30 @@
version: '3'
volumes:
data:
services:
mongo:
image: mongo:3.6
restart: always
volumes:
- data:/data/db
ports:
- "1817:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=hudozka
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_HUDOZKA_PASSWORD}
app:
restart: always
depends_on:
- mongo
build:
context: ./
dockerfile: Dockerfile
links:
- mongo
ports:
- "1880:3000"
environment:
- DB_URI=${HUDOZKA_DB_URI}
+8
View File
@@ -0,0 +1,8 @@
{
"uid": "hudozka",
"append": true,
"watch": false,
"script": "index.js",
"sourceDir": "/home/hoster/www/art.shburg.org/out",
"wordingDir": "/home/hoster/www/art.shburg.org"
}
+58
View File
@@ -0,0 +1,58 @@
const gulp = require('gulp')
const postcss = require('gulp-postcss')
const sass = require('gulp-sass')
const imageMin = require('gulp-imagemin')
const concat = require('gulp-concat')
const autoprefixer = require('autoprefixer')
const cssnano = require('cssnano')
gulp.task('style', () => {
const processors = [
autoprefixer({
browsers: ['last 1 version']
}),
cssnano({
zindex: false
})
]
return gulp.src('./src/style/style.scss')
.pipe(sass())
.pipe(postcss(processors))
.pipe(concat('style.css'))
.pipe(gulp.dest('./public'))
})
gulp.task('copy fonts', () => {
return gulp.src('./src/assets/fonts/*/*')
.pipe(gulp.dest('./public/fonts'))
})
gulp.task('copy graphics', () => {
return gulp.src('./src/assets/graphics/*')
.pipe(gulp.dest('./public/graphics'))
})
gulp.task('copy 3rdparty', () => {
return gulp.src('./src/3rdparty/*')
.pipe(gulp.dest('./public'))
})
gulp.task('copy robots.txt', () => {
return gulp.src('./robots.txt')
.pipe(gulp.dest('./public'))
})
gulp.task('copy views', () => {
return gulp.src('./src/views/**')
.pipe(gulp.dest('./out/views'))
})
gulp.task('imagemin', () => {
return gulp.src('./src/assets/graphics/**/*')
.pipe(imageMin())
.pipe(gulp.dest('./public/graphics'))
})
gulp.task('copy', gulp.series('copy views', 'copy fonts', 'copy graphics', 'copy robots.txt', 'copy 3rdparty'))
gulp.task('default', gulp.series('style', 'copy', 'imagemin'))
Executable
+16
View File
@@ -0,0 +1,16 @@
#!/bin/sh
dir_path="$1"
build_file="$2"
app="hudozka"
script="forever.json"
cd ${dir_path}
gunzip -c ${build_file} | tar xopf -
#rm build.tar
npm install --production --loglevel error
echo "Deploying finish. Please restart hudozka.service manually"
+27
View File
@@ -0,0 +1,27 @@
FROM alpine:3.5
RUN apk add --no-cache python3 && \
apk add --no-cache py3-lxml && \
python3 -m ensurepip && \
rm -r /usr/lib/python*/ensurepip && \
pip3 install --upgrade pip setuptools && \
rm -r /root/.cache
LABEL maintainer "Roman Timashev <roman@tmshv.ru>"
ENV INSTALL_PATH /app
RUN mkdir -p $INSTALL_PATH
WORKDIR /$INSTALL_PATH
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY app ./app
ENV DB_URI "mongodb://localhost:27017"
ENV DB_USER ""
ENV DB_PASSWORD ""
ENV DB_NAME "hudozka"
EXPOSE 5000
CMD python3 app/main.py
+10
View File
@@ -0,0 +1,10 @@
# Feed
Link to feed: [art.shlisselburg.org/feed](https://art.shlisselburg.org/feed)
## How to deploy with Docker
```bash
docker build -t hudozka/feed .
docker run -d --name hudozka-feed -p 18050:5000 -e DB_USER="<DB_USER>" -e DB_PASSWORD="<DB_PASSWORD>" -e DB_URI="<DB_URI>" hudozka/feed
```
+13
View File
@@ -0,0 +1,13 @@
from pymongo import MongoClient
from settings import db_uri, db_name, db_user, db_password
db = MongoClient(db_uri)[db_name]
if db_user and db_password:
auth_status = db.authenticate(db_user, db_password)
if not auth_status:
print('Failed to authenticate user')
exit(1)
def collection(name):
return db[name]
+39
View File
@@ -0,0 +1,39 @@
import html
from feedgen.feed import FeedGenerator
from db import collection
def get_items(collection_name, query={}):
return list(
collection(collection_name).find(query)
)
def get_feed():
events = get_items('events')
news = get_items('timeline', {'type': 'post'})
articles = sorted(events + news, key=lambda item: item['date'], reverse=True)
fg = FeedGenerator()
fg.id('art.shlisselburg.org')
fg.title('Шлиссельбургская ДХШ')
fg.link(href='https://art.shlisselburg.org', rel='alternate')
fg.logo('https://static.shlisselburg.org/art/graphics/favicon-144.png')
fg.link(href='https://art.shlisselburg.org/feed', rel='self')
fg.language('ru')
for article in articles:
content = html.unescape(article['post'])
article_id = article['id']
url = 'https://art.shlisselburg.org/article/{id}'.format(id=article_id)
fe = fg.add_entry()
fe.id(article_id)
fe.title(article['title'])
fe.content(content, None, 'CDATA')
fe.link({'href': url})
return fg.atom_str(pretty=True)
+5
View File
@@ -0,0 +1,5 @@
from server import app
from settings import host
if __name__ == '__main__':
app.run(host=host)
+14
View File
@@ -0,0 +1,14 @@
from flask import Flask
from feed import get_feed
app = Flask(__name__)
@app.route('/')
def root():
feed = get_feed()
if not feed:
return '', 404
return feed
+7
View File
@@ -0,0 +1,7 @@
import os
db_uri = os.getenv('DB_URI', 'mongodb://localhost:27017')
db_name = os.getenv('DB_NAME', 'hudozka')
db_user = os.getenv('DB_USER', None)
db_password = os.getenv('DB_PASSWORD', None)
host = os.getenv('APP_HOST', '0.0.0.0')
+5
View File
@@ -0,0 +1,5 @@
pymongo==3.4.0
Flask==0.12
redis==2.10.5
PyYAML==3.12
feedgen==0.5.1
+7
View File
@@ -0,0 +1,7 @@
{
vk: {
appId: '4202466',
appSecret: '5NMWIbgb2ImAQeMeODEd'
},
outputDir: '/Users/tmshv/Yandex.Disk.localized/Hudozka/Site/Events'
}
+202
View File
@@ -0,0 +1,202 @@
#!/usr/local/bin/python3
import json
import os
import re
import string
from datetime import datetime
from functools import reduce
from os import makedirs
import json5
import sys
import requests
from utils import until, copy
from vk import vk_init, vk_wall_get_by_id, vk_photos_get_albums, vk_photos_get
config = json5.load(open('config.json5', 'r'))
vk_init(config['vk']['appId'], config['vk']['appSecret'])
pattern = re.compile(r'https?://vk\.com/wall([-\d]+)_(\d+)')
ms = []
size_priority = ['w', 'z', 'y']
# get_album_item = until(size_priority)
def get_item_by_size(size, item):
for s in item:
if s['type'] == size:
return s
return None
def get_album_item(item):
for s in size_priority:
img = get_item_by_size(s, item)
if img:
return img
return None
def is_valid_url(i: str):
return pattern.match(i) is not None
def add_middleware(var: str, fn):
ms.append((var, fn))
def apply_middleware(data: str, mw: tuple):
key, fn = mw
value = fn(data)
form = {}
form[mw[0]] = ''
data.format(**form)
return data
def apply_middlewares(output_dir, template, data):
result = template
for mw in ms:
key, fn = mw
form = {key: fn(output_dir, data)}
result = string.Template(result)
result = result.safe_substitute(**form)
return result
def attach_album(output_dir, data):
"""
{
'size': 13,
'title': 'Каллиграфия 27.11.2016',
'owner_id': -132442859,
'updated': 1480340404,
'description': '',
'id': '238711857',
'thumb': {'user_id': 100, 'access_key': '428f3dad13bdd5d730', 'owner_id': -132442859,
'date': 1480340404,
'photo_807': 'https://pp.vk.me/c837134/v837134463/11056/ZaoO1h5Idaw.jpg',
'id': 456239050,
'width': 1024, 'photo_75': 'https://pp.vk.me/c837134/v837134463/11053/aHOALfgr0VU.jpg',
'photo_130': 'https://pp.vk.me/c837134/v837134463/11054/czcuc7o-bN4.jpg', 'text': '',
'photo_604': 'https://pp.vk.me/c837134/v837134463/11055/P7yUE6WitSA.jpg', 'height': 683,
'photo_1280': 'https://pp.vk.me/c837134/v837134463/11057/eLG5Akgx3fk.jpg',
'album_id': 238711857
},
'created': 1480340311
}
:param data:
:return:
"""
oid = data['owner_id']
aid = data['id']
album = vk_photos_get(oid, aid)['response']['items']
files = []
for file in album:
img = get_album_item(file['sizes'])
if img:
files.append(img['src'])
# files.append(file['sizes'])
download_files(files, output_dir)
return '\n'.join(list(
map(
lambda i: '![](%s)' % i,
map(
lambda f: os.path.basename(f),
files
)
)
))
def get_date(ts: int):
date = datetime.fromtimestamp(ts)
return date.strftime("%Y.%m.%d")
def get_folder_name(post):
date_formatted = get_date(post['date'])
return '{date} vk-{owner_id}-{id}'.format(
date=date_formatted,
owner_id=post['owner_id'],
id=post['id'],
)
def download_files(files, output):
for url in files:
file_out = os.path.join(output, os.path.basename(url))
req = requests.get(url)
data = req.content
f = open(file_out, 'wb')
f.write(data)
f.close()
attachment_types = {
'album': attach_album
}
def get_post_attachments(output_dir, data):
attachments = []
for a in data['attachments']:
a_type = a['type']
if a_type in attachment_types:
fn = attachment_types[a_type]
attachment = fn(output_dir, a[a_type])
attachments.append(attachment)
return '\n'.join(attachments)
if __name__ == '__main__':
add_middleware('id', lambda _, data: 'vk-{owner_id}-{id}'.format(
owner_id=data['owner_id'],
id=data['id'],
))
add_middleware('date', lambda _, data: get_date(data['date']))
add_middleware('text', lambda _, data: data['text'])
add_middleware('attachments', get_post_attachments)
article_file = open('template.md', 'r', encoding='utf-8')
article = article_file.read()
article_file.close()
urls = sys.argv[1:]
for url in urls:
if not is_valid_url(url):
raise Exception('Cannot perform URL %s' % url)
vid = '%s_%s' % pattern.findall(url)[0]
res = vk_wall_get_by_id(vid)
if 'response' in res:
post = res['response'][0]
if 'copy_history' in post:
copy(post['copy_history'][0], post)
output_dir = os.path.join(config['outputDir'], get_folder_name(post))
makedirs(output_dir, exist_ok=True)
article = apply_middlewares(output_dir, article, post)
article_file = open(os.path.join(output_dir, 'vk.md'), 'w', encoding='utf-8')
article_file.write(article)
article_file.close()
# print(json.dumps(post, indent=4, ensure_ascii=False))
+8
View File
@@ -0,0 +1,8 @@
---
id: ${id}
date: ${date}
---
${text}
${attachments}
+13
View File
@@ -0,0 +1,13 @@
def until(keys: list):
def select(value):
for key in keys:
if key in value:
return value[key]
return None
return select
def copy(source: dict, destination: dict):
for k, v in source.items():
destination[k] = v
+166
View File
@@ -0,0 +1,166 @@
import requests
from urllib.parse import urlencode
client_id = '4362480'
client_secret = 'CI8hARpbqa5amp4OfTS6'
access_token = '39c1712d4005b24bd9faddf34b7f4647a26afb4c7b1a935ba7680b24378a9acb3e0faed5b3af8a1e7879c'
api_version = '5.52'
VK_API = 'https://api.vk.com/method/'
def vk_init(app_id, app_secret):
global client_id
global client_secret
client_id = app_id
client_secret = app_secret
def http_get(url):
req = requests.get(url)
return req.json()
def upload_file(url, file):
req = requests.post(url, files={'photo': file})
return req.json()
def vk_auth(client_id, redirect_uri, scope, response_type):
q = urlencode({
'client_id': client_id,
'scope': ','.join(scope),
'v': api_version,
'redirect_uri': redirect_uri,
'display': 'page',
'response_type': response_type
})
return 'https://oauth.vk.com/authorize?' + q
def vk_get_access_token(client_id, client_secret, redirect_uri, code):
q = urlencode({
'client_id': client_id,
'client_secret': client_secret,
'code': code,
'redirect_uri': redirect_uri,
})
uri = 'https://oauth.vk.com/access_token?' + q
return http_get(uri)
def vk_photos_get_wall_upload_server():
q = urlencode({
'access_token': access_token,
})
uri = VK_API + 'photos.getWallUploadServer?' + q
return http_get(uri)['response']
def vk_photos_save_wall_photo(server, hash, photo):
q = urlencode({
'access_token': access_token,
'v': api_version,
'server': server,
'hash': hash,
'photo': photo,
})
uri = VK_API + 'photos.saveWallPhoto?' + q
return http_get(uri)
def vk_wall_get_by_id(ids):
if not isinstance(ids, list):
ids = [ids]
q = urlencode({
'posts': ','.join(ids),
'v': api_version,
})
uri = VK_API + 'wall.getById?{q}'.format(q=q)
return http_get(uri)
def vk_wall_post(owner_id, message, attachments):
q = urlencode({
'access_token': access_token,
'v': api_version,
'owner_id': owner_id,
'message': message,
'attachments': ','.join(attachments)
})
uri = VK_API + 'wall.post?{q}'.format(q=q)
return http_get(uri)
def vk_photos_get_albums(owner_id, album_ids):
q = urlencode({
'v': api_version,
'owner_id': owner_id,
'album_ids': ','.join(album_ids),
'photo_sizes': '1',
'need_covers': '1',
})
uri = VK_API + 'photos.getAlbums?{q}'.format(q=q)
return http_get(uri)
def vk_photos_get(owner_id, album_id):
q = urlencode({
'v': api_version,
'owner_id': owner_id,
'album_id': album_id,
'photo_sizes': '1',
})
uri = VK_API + 'photos.get?{q}'.format(q=q)
return http_get(uri)
if __name__ == '__main__':
import os
print(os.getcwd())
# redirect_uri = 'http://tmshv.ru/callback'
redirect_uri = 'http://vk.com/blank.html'
# print(vk_auth(client_id, redirect_uri, ['photos', 'wall', 'offline', 'messages'], 'token'))
# exit()
upload_url = vk_photos_get_wall_upload_server()['upload_url']
print(upload_url)
# UPLOADING
uploaded = upload_file(upload_url, open('1.jpg', 'rb'))
print(uploaded)
exit()
# uploaded_photo = uploaded['photo']
saved_photo = vk_photos_save_wall_photo(**uploaded)
print(saved_photo)
# {'response': [
# {
# 'text': '',
# 'id': 420377937,
# 'album_id': -14,
# 'photo_75': 'http://cs631817.vk.me/v631817931/37c93/eiG89yDwZl4.jpg',
# 'photo_130': 'http://cs631817.vk.me/v631817931/37c94/FDDyNTsJYYQ.jpg',
# 'date': 1467142947,
# 'width': 200,
# 'owner_id': 1338931,
# 'photo_604': 'http://cs631817.vk.me/v631817931/37c95/_TMbT8QHwAc.jpg',
# 'height': 200}
# ]
# }
photo_id = saved_photo['response'][0]['id']
photo_owner_id = saved_photo['response'][0]['owner_id']
attachment = '{type}{owner_id}_{media_id}'.format(
type='photo',
owner_id=photo_owner_id,
media_id=photo_id
)
post = vk_wall_post(photo_owner_id, '#api #test', [attachment])
print(post)
-4
View File
@@ -1,4 +0,0 @@
.env
*.tar
node_modules
-3
View File
@@ -1,3 +0,0 @@
node_modules
.env
*.tar
-27
View File
@@ -1,27 +0,0 @@
# BUILD
FROM node:12-alpine as build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
# Building app
RUN npm run build
# RUNTIME
FROM node:12-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install --production
COPY --from=build /app/build ./build
EXPOSE 80
ENV PORT 80
ENV NODE_ENV production
# Running the app
CMD [ "npm", "start" ]
-755
View File
@@ -1,755 +0,0 @@
{
"name": "hudozka-api",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@types/body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
"dev": true,
"requires": {
"@types/connect": "*",
"@types/node": "*"
}
},
"@types/bson": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.1.tgz",
"integrity": "sha512-K6VAEdLVJFBxKp8m5cRTbUfeZpuSvOuLKJLrgw9ANIXo00RiyGzgH4BKWWR4F520gV4tWmxG7q9sKQRVDuzrBw==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/classnames": {
"version": "2.2.9",
"resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.9.tgz",
"integrity": "sha512-MNl+rT5UmZeilaPxAVs6YaPC2m6aA8rofviZbhbxpPpl61uKodfdQVsBtgJGTqGizEf02oW3tsVe7FYB8kK14A==",
"dev": true
},
"@types/connect": {
"version": "3.4.33",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz",
"integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/express": {
"version": "4.17.2",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz",
"integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==",
"dev": true,
"requires": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "*",
"@types/serve-static": "*"
}
},
"@types/express-serve-static-core": {
"version": "4.17.2",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.2.tgz",
"integrity": "sha512-El9yMpctM6tORDAiBwZVLMcxoTMcqqRO9dVyYcn7ycLWbvR8klrDn8CAOwRfZujZtWD7yS/mshTdz43jMOejbg==",
"dev": true,
"requires": {
"@types/node": "*",
"@types/range-parser": "*"
}
},
"@types/mime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz",
"integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==",
"dev": true
},
"@types/mongodb": {
"version": "3.3.16",
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.3.16.tgz",
"integrity": "sha512-i1Ov36BXdp+urtPsaSvrNfCdsaVn4Ukq1m1kGyzdWB1+eg3gJ68unXU5LNmnF4EAMRFY6FXZzA7/W3NST40b8g==",
"dev": true,
"requires": {
"@types/bson": "*",
"@types/node": "*"
}
},
"@types/node": {
"version": "13.7.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.1.tgz",
"integrity": "sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==",
"dev": true
},
"@types/range-parser": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
"integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==",
"dev": true
},
"@types/serve-static": {
"version": "1.13.3",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz",
"integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==",
"dev": true,
"requires": {
"@types/express-serve-static-core": "*",
"@types/mime": "*"
}
},
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
}
},
"arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"bl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz",
"integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==",
"requires": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
}
},
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"requires": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
},
"dependencies": {
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
}
}
},
"bson": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz",
"integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg=="
},
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
"content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
"requires": {
"safe-buffer": "5.1.2"
}
},
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
"cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"denque": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true
},
"dotenv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
},
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"requires": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
"content-type": "~1.0.4",
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~1.1.2",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "~1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.5",
"qs": "6.7.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.1.2",
"send": "0.17.1",
"serve-static": "1.14.1",
"setprototypeof": "1.1.1",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
}
}
},
"feed": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/feed/-/feed-4.1.0.tgz",
"integrity": "sha512-dAXWXM8QMxZ1DRnAxDmy1MaWZFlh1Ku7TU3onbXgHrVJynsxkNGPUed1AxszVW8AXo43xExronVkIqK+ACsoBA==",
"requires": {
"xml-js": "^1.6.11"
}
},
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
}
}
},
"forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
},
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
"http-errors": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
"integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.4",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ipaddr.js": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
"integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
},
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
"make-error": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
"integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
"dev": true
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"memory-pager": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
"optional": true
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.43.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
"integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
},
"mime-types": {
"version": "2.1.26",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
"integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
"requires": {
"mime-db": "1.43.0"
}
},
"mongodb": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.3.tgz",
"integrity": "sha512-II7P7A3XUdPiXRgcN96qIoRa1oesM6qLNZkzfPluNZjVkgQk3jnQwOT6/uDk4USRDTTLjNFw2vwfmbRGTA7msg==",
"requires": {
"bl": "^2.2.0",
"bson": "^1.1.1",
"denque": "^1.4.1",
"require_optional": "^1.0.1",
"safe-buffer": "^5.1.2",
"saslprep": "^1.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"requires": {
"ee-first": "1.1.1"
}
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"proxy-addr": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
"integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
"requires": {
"forwarded": "~0.1.2",
"ipaddr.js": "1.9.0"
}
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
},
"dependencies": {
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
}
}
},
"require_optional": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
"integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
"requires": {
"resolve-from": "^2.0.0",
"semver": "^5.1.0"
}
},
"resolve-from": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
"integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"saslprep": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
"integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
"optional": true,
"requires": {
"sparse-bitfield": "^3.0.3"
}
},
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
},
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"requires": {
"debug": "2.6.9",
"depd": "~1.1.2",
"destroy": "~1.0.4",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "~1.7.2",
"mime": "1.6.0",
"ms": "2.1.1",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
},
"dependencies": {
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
"serve-static": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.17.1"
}
},
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
},
"sitemap": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/sitemap/-/sitemap-1.13.0.tgz",
"integrity": "sha1-Vpy+IYAgKSamKiZs094Jyc60P4M=",
"requires": {
"underscore": "^1.7.0",
"url-join": "^1.1.0"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
"source-map-support": {
"version": "0.5.16",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
"integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"sparse-bitfield": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
"integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
"optional": true,
"requires": {
"memory-pager": "^1.0.2"
}
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"ts-node": {
"version": "8.6.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz",
"integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==",
"dev": true,
"requires": {
"arg": "^4.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
"source-map-support": "^0.5.6",
"yn": "3.1.1"
}
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
}
},
"typescript": {
"version": "3.7.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz",
"integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==",
"dev": true
},
"underscore": {
"version": "1.9.2",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz",
"integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ=="
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
"url-join": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz",
"integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg="
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"xml-js": {
"version": "1.6.11",
"resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
"integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
"requires": {
"sax": "^1.2.4"
}
},
"yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true
}
}
}
-36
View File
@@ -1,36 +0,0 @@
{
"name": "hudozka-api",
"private": true,
"version": "1.0.0",
"description": "",
"main": "src/server.ts",
"scripts": {
"start": "node build/server.js",
"dev": "ts-node src/server.ts",
"build": "tsc",
"sitemap": "node scripts/sitemap.js",
"feed": "node scripts/feed.js"
},
"repository": {
"type": "git",
"url": "https://github.com/tmshv/hudozka"
},
"author": "Roman Timashev",
"license": "ISC",
"dependencies": {
"dotenv": "^8.2.0",
"express": "^4.17.1",
"feed": "^4.0.0",
"lodash": "^4.17.15",
"mongodb": "^3.5.3",
"sitemap": "^1.5.0"
},
"devDependencies": {
"@types/classnames": "^2.2.9",
"@types/express": "^4.17.2",
"@types/mongodb": "^3.3.16",
"@types/node": "^13.7.1",
"ts-node": "^8.6.2",
"typescript": "^3.7.5"
}
}
@@ -1,23 +0,0 @@
import { getPathWaterfall } from '../lib/url'
import { Breadcrumb } from '../types'
import Page from '../core/Page'
export async function getItems(path: string): Promise<Breadcrumb> {
const bc = getPathWaterfall(path)
const parts = await Promise.all(bc.map(async href => {
const resource = await Page.findByUrl(href)
if (!resource) {
return null
}
const name = resource.title
return {
name,
href,
}
}))
return parts.filter(Boolean)
}
@@ -1,51 +0,0 @@
import { Request, Response } from 'express'
import Document from '../core/Document'
import { encodeFile } from '../factory/file'
export async function getItem(req: Request, res: Response) {
const id = req.params.slug
const document = await Document.findById(id)
if (document) {
res.json(encodeFile(document))
} else {
res.status(404)
res.json({
error: `Resource ${id} not found`
})
}
}
export async function getAll(req: Request, res: Response) {
const documents = await Document.find({ hidden: false })
if (documents) {
const items = documents
.map(encodeFile)
.filter(x => x.imageUrl) // skip documents without preview image; needs to be refactored
res.json({
items,
})
} else {
res.status(404)
res.json({
error: `Not found`
})
}
}
export async function getUrls(req: Request, res: Response) {
const data = await Document.find({})
if (data) {
const items = data.map(x => `/document/${x.id}`)
res.json({
items
})
} else {
res.status(404)
res.json({
error: `Not found`
})
}
}
@@ -1,17 +0,0 @@
import Image from '../core/Image'
import { encodeImage } from '../factory/image'
import { Request, Response } from 'express'
export async function getItem(req: Request, res: Response) {
const file = req.query.file
const image = await Image.findByFile(file)
if (image) {
res.json(encodeImage(image))
} else {
res.status(404)
res.json({
error: `Resource ${file} not found`
})
}
}
-117
View File
@@ -1,117 +0,0 @@
import { pick } from 'lodash'
import { Request, Response } from 'express'
import Page from '../core/Page'
import { dropTrailingSlash, readQueryArray, readQueryInt, readQueryString } from '../lib/url'
import { encodePage } from '../factory/page'
import * as breadcrumb from './breadcrumb'
import { isArrayOk } from '../lib/array'
function getSort(sortBy: string) {
if (!sortBy) {
return null
}
if (sortBy.charAt(0) === '-') {
const key = sortBy.substr(1, sortBy.length)
return {
[key]: -1,
}
}
return {
[sortBy]: 1,
}
}
async function resolveItem(page: Page) {
const breadcrumbs = await breadcrumb.getItems(page.getUrl())
page.setBreadcrumb(breadcrumbs)
return page
}
export async function getItem(req: Request, res: Response) {
const pageUrl = dropTrailingSlash(req.query.page)
const resource = await Page.findByUrl(pageUrl)
if (resource) {
const page = await resolveItem(resource)
res.json(encodePage(page))
} else {
res.status(404)
res.json({
error: `Resource ${pageUrl} not found`
})
}
}
export async function getAll(req: Request, res: Response) {
const items = await Page.find({})
if (items) {
res.json({
items,
})
} else {
res.status(404)
res.json({
error: `Not found`
})
}
}
export async function getByTags(req: Request, res: Response) {
const skip = readQueryInt(req, 'skip')
const limit = readQueryInt(req, 'limit')
const sortBy = readQueryString(req, 'sortBy')
const sort = getSort(sortBy)
const fields = readQueryArray(req, 'field')
const tags = readQueryArray(req, 'tag')
if (tags.length === 0) {
res.status(400)
return res.json({
error: `No tags in request`
})
}
const options = { skip, limit, sort }
const models = await Page.find({
tags: { $in: tags },
}, options)
if (models) {
const pages = await Promise.all(models.map(resolveItem))
const encodedItems = pages.map(encodePage)
const items = isArrayOk(fields)
? encodedItems.map(x => pick(x, fields))
: encodedItems
res.json({
items,
})
} else {
res.status(404)
res.json({
error: `Not found`
})
}
}
export async function getUrls(req: Request, res: Response) {
const data = await Page.find({})
if (data) {
const items = data.map(x => x.url)
res.json({
items,
})
} else {
res.status(404)
res.json({
error: `Not found`
})
}
}
@@ -1,22 +0,0 @@
import Page from '../core/Page'
import { Request, Response } from 'express'
import { unique } from '../lib/array'
export async function getAll(req: Request, res: Response) {
const data = await Page.find({})
const tags = data
.flatMap(x => x.tags)
.filter(x => x.isValid())
const items = unique(tags, t => t.slug)
if (data) {
res.json({
items,
})
} else {
res.status(404)
res.json({
error: `Not found`
})
}
}
-18
View File
@@ -1,18 +0,0 @@
import { Collection } from 'mongodb'
import * as db from '../db'
const store = new Map<string, Collection>()
export default class Data {
static setStore(key: string, collection: Collection) {
store.set(key, collection)
}
static getStore<T>(key: string): Collection<T> {
return store.get(key)
}
static getCollection(name: string): Collection {
return db.collection(name)
}
}
-68
View File
@@ -1,68 +0,0 @@
import Data from './Data'
import Image from './Image'
import { find, findOne } from '../lib/store'
const store = () => Data.getStore('Document')
export default class Document {
static async find(query, options = {}): Promise<Document[]> {
const items = await find(store(), query, options as any)
return Promise.all(items.map(processDocument))
}
static async findById(id) {
const data = await findOne(store(), { id })
if (!data) return null
return processDocument(data)
}
public id: any
public hash: any
public file: any
public fileInfo: any
public type: any
public title: any
public category: any
public url: any
public preview: any
public viewUrl: any
constructor(data) {
this.id = data.id
this.hash = data.hash
this.file = data.file
// In the future: use fileInfo only
this.fileInfo = data.fileInfo
? new DocumentFile(data.fileInfo)
: new DocumentFile(data.file)
this.type = data.type
this.title = data.title
this.category = data.category
this.url = data.url
this.preview = data.preview
this.viewUrl = `/document/${this.id}`
}
}
class DocumentFile {
public name: any
public size: any
constructor(data) {
this.name = data.name
this.size = data.size
}
}
const processDocument = async data => {
const imageId = data.preview
const preview = await Image.findById(imageId)
return new Document({
...data,
preview,
})
}
-105
View File
@@ -1,105 +0,0 @@
import Data from './Data'
import ImageArtifactType from './ImageArtifactType'
import { findOne } from '../lib/store'
import { ObjectId } from 'mongodb'
/**
*
* {a: {}, b: {}, ...} -> Map (a: Class, b: Class)
*
* @param Class
* @param object
*/
function mapOf(Class, object) {
return Object
.entries(object)
.reduce((map, i) => (
map.set(i[0], new Class(i[1]))
), new Map())
}
const store = () => Data.getStore('Image')
export default class Image {
static async findById(id: ObjectId) {
const data = await findOne(store(), { _id: id })
if (!data) return null
const artifacts = data.data
return new Image({ ...data, artifacts })
}
static async findByFile(file: string) {
const data = await findOne(store(), { file })
if (!data) return null
const artifacts = data.data
return new Image({ ...data, artifacts })
}
public hash: string
public file: string
public artifacts: Map<string, ImageArtifact>
constructor({ hash, file, artifacts }) {
this.hash = hash
this.file = file
this.artifacts = mapOf(ImageArtifact, artifacts)
}
getArtifact(size) {
return this.artifacts.get(size)
}
findArtifact(sizes) {
for (let size of sizes) {
const a = this.getArtifact(size)
if (a) return a
}
return null
}
getPicture(size) {
const retinaSize = ImageArtifactType.retina(size)
const a = this.getArtifact(size)
const a2 = this.getArtifact(retinaSize)
const srcset = !a2
? []
: [{
url: a2.url,
density: ImageArtifactType.RETINA_DENSITY,
}]
return {
src: a.url,
width: a.width,
height: a.height,
set: srcset,
}
}
getSrc(): string | null {
const a = this.getArtifact(ImageArtifactType.ORIGINAL)
if (!a) {
return null
}
return a.url
}
}
class ImageArtifact {
public url: string
public size: string
public width: number
public height: number
constructor({ url, size, width, height }) {
this.url = url
this.size = size
this.width = width
this.height = height
}
}
-113
View File
@@ -1,113 +0,0 @@
import Data from './Data'
import { find as storeFind, findOne, total } from '../lib/store'
import Image from './Image'
import { Tag } from './Tag'
import { ObjectId } from 'mongodb'
import { Breadcrumb } from '../types'
const store = () => Data.getStore('Page')
type PageDto = {
[name: string]: any
preview?: ObjectId
images: ObjectId[]
}
export default class Page {
static async find(query, options = {}): Promise<Page[]> {
const items = await storeFind(store(), query, options as any)
return Promise.all(items.map(processPage))
}
static async findById(id) {
const item = await findOne(store(), { id })
return !item
? null
: processPage(item)
}
static async findByUrl(url: string) {
const item = await findOne(store(), { url })
return !item
? null
: processPage(item)
}
static async total(query = {}) {
return total(store(), query)
}
public id: any
public hash: any
public file: any
public url: string
public content: any
public title: any
public date: Date
public tags: Tag[]
public data: any
public images: ObjectId[]
public documents: any
public preview?: Image
public tokens: any[]
public description: string
public featured: boolean
private breadcrumb: Breadcrumb
constructor(data: { [name: string]: any }) {
this.id = data.id
this.hash = data.hash
this.file = data.file
this.url = data.url
this.content = data.content
this.title = data.title
this.data = data.data
this.date = data.date
this.images = data.images
this.documents = data.documents
this.preview = data.preview
this.tokens = data.tokens
this.tags = (data.tags || []).map((x: string) => new Tag(x, x))
this.featured = data.featured
this.description = data.description
}
public setBreadcrumb(value: Breadcrumb) {
this.breadcrumb = value
return this
}
public getBreadcrumb() {
return this.breadcrumb
}
public getUrl() {
return this.url
}
}
function firstItem<T>(items: T[] = []): T {
return items.length
? items[0]
: null
}
async function processPage(item: PageDto): Promise<Page> {
let preview: Image = null
const previewId = item.preview
? item.preview
: firstItem(item.images)
if (previewId) {
preview = await Image.findById(previewId)
}
return new Page({
...item,
preview,
})
}
-23
View File
@@ -1,23 +0,0 @@
import { translit } from '../lib/translit'
export class Tag {
public static fromCyrillic(tag: string) {
const slug = tag
? translit(tag).toLowerCase()
: tag
return new Tag(tag, slug)
}
public name: string
public slug: string
constructor(name: string, slug: string) {
this.name = name
this.slug = slug
}
public isValid() {
return !!this.slug
}
}
-35
View File
@@ -1,35 +0,0 @@
import Data from './core/Data'
import { MongoClient, ObjectId, Db } from 'mongodb'
var db: Db
export async function connect(dbName: string, mongoUri: string) {
if (db) {
return db
}
const connection = await MongoClient.connect(mongoUri, { useUnifiedTopology: true })
db = init(connection.db(dbName))
return db
}
export function collection(name) {
return db.collection(name)
}
export function id(i) {
if (typeof i === 'string') return new ObjectId(i)
else if (i instanceof ObjectId) return i
else if (i instanceof Object) return '_id' in i ? new ObjectId(i._id) : null
return null
}
function init(db: Db) {
console.log('INIT DB')
Data.setStore('Page', db.collection('pages'))
Data.setStore('Image', db.collection('images'))
Data.setStore('Document', db.collection('documents'))
Data.setStore('Settings', db.collection('settings'))
return db
}
-35
View File
@@ -1,35 +0,0 @@
import ImageArtifactType from '../core/ImageArtifactType'
const sizes = [
ImageArtifactType.MEDIUM,
ImageArtifactType.BIG,
ImageArtifactType.ORIGIN,
]
export function encodeFilePreview(file, sizes) {
const preview = file.preview
if (!preview) return null
const image = preview.findArtifact(sizes)
if (!image) return null
return image.url
}
export function encodeFile(file) {
const imageUrl = encodeFilePreview(file, sizes)
const category = (file.category || '')
.replace('Documents/', '')
.replace('Pages/', '')
.replace('Articles /', '')
return {
imageUrl,
category,
title: file.title,
fileName: file.fileInfo.name,
fileSize: file.fileInfo.size,
fileUrl: file.url,
url: file.viewUrl,
}
}
-48
View File
@@ -1,48 +0,0 @@
import ImageArtifactType from '../core/ImageArtifactType'
import Image from '../core/Image'
export type ImageArtifactDto = {
height: number
width: number
src: string
set: Array<{
density: number
url: string
}>
}
export type ImageDto = {
artifacts: {
original: ImageArtifactDto,
large: ImageArtifactDto,
big: ImageArtifactDto,
medium: ImageArtifactDto,
small: ImageArtifactDto,
fb: ImageArtifactDto,
},
hash: string
file: string
}
export function encodeImage(image: Image): ImageDto {
const artifacts = [
ImageArtifactType.SMALL,
ImageArtifactType.MEDIUM,
ImageArtifactType.BIG,
ImageArtifactType.LARGE,
ImageArtifactType.ORIGIN,
ImageArtifactType.ORIGINAL,
ImageArtifactType.FACEBOOK = 'fb'
].reduce((acc, size) => {
return {
...acc,
[size]: image.getPicture(size),
}
}, {})
return {
artifacts: artifacts as any,
hash: image.hash,
file: image.file,
}
}
-47
View File
@@ -1,47 +0,0 @@
import { encodeImage, ImageDto } from './image'
import Page from '../core/Page'
import { Breadcrumb } from '../types'
import { Tag } from '../core/Tag'
type Token = {
token: string
data: any
}
type PageDto = {
id: string
title: string
date?: string
url: string
data: string
description: string
preview?: ImageDto
tokens: Token[]
tags: Tag[]
featured: boolean
breadcrumb: Breadcrumb
coverSrc?: string
}
export function encodePage(page: Page): PageDto {
const preview = page.preview ? encodeImage(page.preview) : null
const date = page.date ? page.date.toString() : null
const breadcrumb = page.getBreadcrumb()
const coverSrc = page.preview ? page.preview.getSrc() : null
return {
id: page.id,
title: page.title,
url: page.url,
data: page.data,
description: page.description,
tokens: page.tokens,
tags: page.tags,
featured: page.featured,
preview,
date,
breadcrumb,
coverSrc,
}
}
-31
View File
@@ -1,31 +0,0 @@
export function unique<T>(items: T[], key: (item: T) => string): T[] {
const map = new Map(items.map(x => [key(x), x]))
return [...map.values()]
}
export function ensureArray<T>(value: T | T[]): T[] {
if (!value) {
return []
}
if (Array.isArray(value)) {
return value
}
return [value]
}
/**
*
* Check if array has one item at least
*
* @param items
*/
export function isArrayOk<T>(items: T[]): boolean {
if (!Array.isArray(items)) {
return false
}
return items.length > 0
}
-19
View File
@@ -1,19 +0,0 @@
export async function find(collection, query, { sort, skip, limit }) {
const cursor = collection.find(query)
if (sort) cursor.sort(sort)
if (skip) cursor.skip(skip)
if (limit) cursor.limit(limit)
return cursor.toArray()
}
export async function findOne(collection, query) {
return collection.findOne(query)
}
export async function total(collection, query) {
return collection
.find(query)
.count()
}
-80
View File
@@ -1,80 +0,0 @@
const map = new Map<string, string>([
['', '_'],
['А', 'A'],
['а', 'a'],
['Б', 'B'],
['б', 'b'],
['В', 'V'],
['в', 'v'],
['Г', 'G'],
['г', 'g'],
['Д', 'D'],
['д', 'd'],
['Е', 'E'],
['е', 'e'],
['Ё', 'E'],
['ё', 'e'],
['Ж', 'Zh'],
['ж', 'zh'],
['З', 'Z'],
['з', 'z'],
['И', 'I'],
['и', 'i'],
['Й', 'Y'],
['й', 'y'],
['К', 'K'],
['к', 'k'],
['Л', 'L'],
['л', 'l'],
['М', 'M'],
['м', 'm'],
['Н', 'N'],
['н', 'n'],
['О', 'O'],
['о', 'o'],
['П', 'P'],
['п', 'p'],
['Р', 'R'],
['р', 'r'],
['С', 'S'],
['с', 's'],
['Т', 'T'],
['т', 't'],
['У', 'U'],
['у', 'u'],
['Ф', 'F'],
['ф', 'f'],
['Х', 'Kh'],
['х', 'kh'],
['Ц', 'Ts'],
['ц', 'ts'],
['Ч', 'Ch'],
['ч', 'ch'],
['Ш', 'Sh'],
['ш', 'sh'],
['Щ', 'Sch'],
['щ', 'sch'],
['ь', ''],
['Ы', 'Y'],
['ы', 'y'],
['ъ', ''],
['Э', 'E'],
['э', 'e'],
['Ю', 'Yu'],
['ю', 'yu'],
['Я', 'Ya'],
['я', 'ya'],
])
export function translit(sample: string): string {
return [...sample]
.map(char => {
if (map.has(char)) {
return map.get(char)
}
return ''
})
.join('')
}
-48
View File
@@ -1,48 +0,0 @@
import { Request } from 'express'
import { ensureArray } from './array'
export function dropTrailingSlash(path: string) {
if (path === '/' || path === '') {
return '/'
}
const lastChar = path.charAt(path.length - 1)
if (lastChar === '/') {
return path.substr(0, path.length - 1)
}
return path
}
export function getPathWaterfall(path: string): string[] {
const parts = path
.split('/')
.filter(Boolean)
.reduce((acc, part, index, parts) => {
const i = index + 1
const item = `/${parts.slice(0, i).join('/')}`
return [
...acc,
item
]
}, [])
return ['/', ...parts]
}
export function readQueryInt(req: Request, key: string) {
const int = (value: string | string[]) => parseInt(Array.isArray(value)
? value[0]
: value
)
return int(req.query[key]) || 0
}
export function readQueryString(req: Request, key: string) {
return `${req.query[key]}`
}
export function readQueryArray(req: Request, key: string) {
return ensureArray(req.query[key])
}
-43
View File
@@ -1,43 +0,0 @@
import { config } from 'dotenv'
import express from 'express'
import { connect } from './db'
import * as file from './controllers/file'
import * as page from './controllers/page'
import * as image from './controllers/image'
import * as tag from './controllers/tag'
async function main() {
const port = process.env.PORT || '3000'
const mongoUri = process.env.MONGO_URI
try {
await connect('hudozka', mongoUri)
console.log('connected')
} catch (e) {
console.error(e.message)
process.exit(1)
}
const app = express()
app.get('/files', file.getAll)
app.get('/files/urls', file.getUrls)
app.get('/files/:slug', file.getItem)
app.get('/pages', page.getAll)
app.get('/pages/urls', page.getUrls)
app.get('/pages/tags', page.getByTags)
app.get('/page', page.getItem)
app.get('/image', image.getItem)
app.get('/tags', tag.getAll)
app.listen(port, () => {
console.log(`> Ready on http://localhost:${port}`)
})
}
config()
main()
-6
View File
@@ -1,6 +0,0 @@
export type BreadcrumbPart = {
name: string
href: string
}
export type Breadcrumb = BreadcrumbPart[]
-23
View File
@@ -1,23 +0,0 @@
{
"compilerOptions": {
"outDir": "./build",
"target": "esnext",
"lib": [
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": false,
"forceConsistentCasingInFileNames": true,
"esModuleInterop": true,
"module": "commonjs",
"moduleResolution": "node",
"resolveJsonModule": true
},
"exclude": [
"node_modules"
],
"include": [
"**/*.ts"
]
}
-34
View File
@@ -1,34 +0,0 @@
import lxml.html
import re
from markdown import markdown
from kazimir.figure import FigureExtension
from kazimir.instagram import InstagramExtension
from sync.data import request
def extract_files(text: str) -> [str]:
html = markdown(text)
post_html = lxml.html.fromstring(html)
images = post_html.cssselect('img')
images = [img.get('src') for img in images]
return images, []
def html_from_tree(tree):
html = lxml.html.tostring(tree, encoding='unicode')
return html
async def typo(text):
from kazimir import artlebedev
result = await artlebedev.typograf(text)
if result == 'Размер текста ограничен 32 КБ':
return text
return result
# url = 'http://www.typograf.ru/webservice/'
# params = dict(text=text)
# return await request.post(url, params, {'chr': 'utf-8'})
-75
View File
@@ -1,75 +0,0 @@
import settings
from sync.core import Sync
from sync.data.fs import FSProvider
from sync.data.yandexdisk import YDProvider
import asyncio
import logging
from sync.models.Page import Page, PageController
def init_logger(name: str, file: str):
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler(file)
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
# ch.setLevel(logging.ERROR)
ch.setLevel(logging.DEBUG)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)
logger.addHandler(ch)
async def run_sync(sync: Sync, **kwargs):
await sync.run(**kwargs)
async def run(run_interval=0):
provider = get_provider(settings.provider_name, settings.provider_root)
controller = PageController(provider)
sync_pages = Sync(
ctrl=controller,
name='Page'
)
sync_pages.set_options(True, True, True)
while True:
await asyncio.wait([
run_sync(sync_pages),
])
if run_interval == 0:
break
else:
await asyncio.sleep(run_interval)
def get_provider(provider_type, root):
if provider_type == 'fs':
return FSProvider(root)
elif provider_type == 'yd':
return YDProvider(root, settings.yandex_disk_access_token)
return None
if __name__ == '__main__':
init_logger(settings.name, 'hudozka.log')
interval = settings.interval
loop = asyncio.get_event_loop()
loop.run_until_complete(run(interval))
loop.close()
-40
View File
@@ -1,40 +0,0 @@
import aiohttp
from boto3 import session
from mimetypes import MimeTypes
import logging
import settings
logger = logging.getLogger(settings.name + '.S3')
async def s3_put(obj, path):
"""
:param obj: uploads/file.pdf
:param path: to/to/local/file.pdf
:return:
"""
logger.info('Put {}'.format(obj))
s = session.Session()
client = s.client('s3', **settings.auth_s3)
mime = MimeTypes()
mime_type, enc = mime.guess_type(path)
# Upload a file to your Space
client.upload_file(path, 'hudozka', obj, ExtraArgs={
'ACL': 'public-read',
'ContentType': mime_type,
})
async def get(url):
async with aiohttp.ClientSession as aio_session:
res = aio_session.get(url)
return await res.text()
async def post(url, data, params={}, headers={}):
async with aiohttp.ClientSession() as aio_session:
async with aio_session.post(url, data=data, params=params, headers=headers) as resp:
return await resp.text()
-2
View File
@@ -1,2 +0,0 @@
/// <reference types="next" />
/// <reference types="next/types/global" />
-14
View File
@@ -1,14 +0,0 @@
const withCss = require('@zeit/next-css')
const withSass = require('@zeit/next-sass')
module.exports = withCss(withSass({
exportTrailingSlash: true,
env: {
APP_ARTICLES_PAGE_SIZE: 24,
APP_CARD_DEFAULT_IMAGE: 'https://art.shlisselburg.org/static/img/main.jpg',
},
webpack(config) {
config.resolve.modules.push(__dirname)
return config;
},
}))
+48
View File
@@ -0,0 +1,48 @@
server {
listen 443 ssl;
charset utf-8;
server_name art.shlisselburg.org;
ssl_certificate /etc/letsencrypt/live/art.shlisselburg.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/art.shlisselburg.org/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
location / {
proxy_pass http://hudozka;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
error_log /var/log/nginx/art.shburg.error.log;
access_log /var/log/nginx/art.shburg.access.log;
}
server {
listen 80;
server_name art.shlisselburg.org art.shburg.org;
location ^~ /.well-known/acme-challenge {
root /home/hoster/www/art.shburg.org/public;
}
location / {
return 301 https://art.shlisselburg.org$request_uri;
}
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream hudozka {
server localhost:1800;
}
+12400 -7614
View File
File diff suppressed because it is too large. Load diff
+107 -48
View File
@@ -1,50 +1,109 @@
{
"name": "hudozka",
"private": true,
"version": "6.10.0",
"description": "",
"scripts": {
"start": "next dev",
"build": "npm run next-build && npm run export && npm run sitemap && npm run feed",
"next-build": "next build",
"export": "next export -o dist",
"sitemap": "node scripts/sitemap.js",
"feed": "node scripts/feed.js",
"test": "mocha --compilers js:babel-register"
},
"repository": {
"type": "git",
"url": "https://github.com/tmshv/hudozka"
},
"author": "Roman Timashev",
"license": "ISC",
"dependencies": {
"axios": "^0.19.0",
"classnames": "^2.2.6",
"date-fns": "^2.10.0",
"lodash": "^4.17.15",
"next": "^9.2.2",
"react": "^16.12.0",
"react-dom": "^16.12.0",
"sitemap": "^1.5.0",
"use-media": "^1.4.0"
},
"devDependencies": {
"@types/classnames": "^2.2.9",
"@types/lodash": "^4.14.149",
"@types/node": "^12.12.12",
"@types/react": "^16.9.12",
"@zeit/next-css": "^1.0.1",
"@zeit/next-sass": "^1.0.1",
"eslint": "^4.18.2",
"eslint-config-standard": "^6.2.1",
"eslint-plugin-promise": "^3.8.0",
"eslint-plugin-react": "^7.16.0",
"eslint-plugin-standard": "^2.0.1",
"feed": "^4.0.0",
"mocha": "^6.2.2",
"node-sass": "^4.13.0",
"should": "^8.2.2",
"typescript": "^3.7.5"
}
"name": "Hudozka",
"private": true,
"version": "4.0.0",
"description": "",
"main": "src/bin/www.js",
"scripts": {
"start": "node src/index.js",
"build-edit": "webpack -w --env.NODE_ENV=production --env.TARGET=edit",
"build-app": "webpack --env.NODE_ENV=production --env.TARGET=app",
"out": "babel src/ -d out/",
"gulp": "gulp",
"test": "mocha --compilers js:babel-register",
"coverage": "istanbul cover mocha -- --compilers js:babel-register"
},
"repository": {
"type": "git",
"url": "https://github.com/tmshv/hudozka"
},
"author": "Roman Timashev",
"license": "ISC",
"dependencies": {
"@mikeljames/draft-js-drag-n-drop-upload-plugin": "^2.0.1",
"async-file": "^2.0.2",
"classnames": "^2.2.5",
"co": "^4.4.0",
"draft-js": "^0.10.5",
"draft-js-alignment-plugin": "^2.0.3",
"draft-js-drag-n-drop-plugin": "^2.0.3",
"draft-js-focus-plugin": "^2.0.4",
"draft-js-image-plugin": "^2.0.5",
"draft-js-plugins-editor": "^2.0.8",
"draft-js-resizeable-plugin": "^2.0.6",
"ejson": "^2.1.2",
"handlebars": "^4.0.5",
"immutable": "^3.8.2",
"instagram-node": "^0.5.1",
"koa": "^2.5.1",
"koa-bodyparser": "^3.0.0",
"koa-compose": "^3.1.0",
"koa-conditional-get": "^1.0.2",
"koa-convert": "^1.2.0",
"koa-cookie": "^1.0.0",
"koa-etag": "^2.0.0",
"koa-helmet": "^1.0.0",
"koa-logger": "^2.0.0",
"koa-mount": "^2.0.0",
"koa-route": "^3.1.0",
"koa-session": "^4.0.0",
"koa-static": "^3.0.0",
"markdown": "^0.5.0",
"moment": "^2.22.2",
"mongodb": "^2.1.14",
"mz": "^2.4.0",
"react": "^16.3.2",
"react-dom": "^16.3.2",
"react-redux": "^4.4.8",
"react-router": "^4.2.0",
"react-router-redux": "^4.0.8",
"redux": "^3.7.2",
"redux-thunk": "^2.2.0",
"request-promise": "^2.0.1",
"sitemap": "^1.5.0",
"thunkify": "^2.1.2"
},
"devDependencies": {
"@babel/cli": "^7.0.0-beta.47",
"@babel/core": "^7.0.0-beta.47",
"@babel/plugin-proposal-class-properties": "^7.0.0-beta.47",
"@babel/polyfill": "^7.0.0-beta.47",
"@babel/preset-env": "^7.0.0-beta.47",
"@babel/register": "^7.0.0-beta.47",
"autoprefixer": "^6.3.6",
"babel-loader": "^8.0.0-beta.3",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-plugin-transform-react-jsx": "^6.23.0",
"babel-plugin-transform-regenerator": "^6.26.0",
"babel-preset-env": "^1.7.0",
"babel-register": "^6.26.0",
"css-loader": "^0.28.9",
"cssnano": "^3.4.0",
"eslint": "^3.9.1",
"eslint-config-standard": "^6.2.1",
"eslint-plugin-promise": "^3.3.1",
"eslint-plugin-react": "^7.4.0",
"eslint-plugin-standard": "^2.0.1",
"gulp": "^4.0.0",
"gulp-concat": "^2.4.1",
"gulp-if": "^2.0.0",
"gulp-imagemin": "~2.4.0",
"gulp-postcss": "^6.0.1",
"gulp-rename": "^1.2.2",
"gulp-sass": "^4.0.1",
"gulp-uglify": "~1.5.0",
"html-minify-loader": "~1.1.0",
"html-webpack-plugin": "^2.30.1",
"istanbul": "~0.4.2",
"less": "^3.0.4",
"less-loader": "^4.1.0",
"mocha": "~2.4.5",
"raw-loader": "~0.5.1",
"should": "^8.2.2",
"style-loader": "^0.20.2",
"vinyl-named": "~1.1.0",
"webpack": "^3.11.0",
"webpack-merge": "^4.1.1"
}
}
-102
View File
@@ -1,102 +0,0 @@
import Head from 'next/head'
import { App } from 'src/components/App'
import { tail } from 'lodash'
import { Page } from 'src/components/Page'
import { Meta } from 'src/components/Meta'
import { MetaBuilder } from 'src/lib/meta'
import { createApiUrl, requestGet, IResponseItems } from 'src/next-lib'
import { NextPage } from 'next'
import { IBreadcumbsPart, IMeta, IPage, ITag } from 'src/types'
function array<T>(value: T | T[]) {
return Array.isArray(value)
? value
: [value]
}
type Props = {
title: string
tags: ITag[]
date: string
content: string
breadcrumb: IBreadcumbsPart[]
meta?: IMeta
}
const Index: NextPage<Props> = props => (
<App
contentStyle={{
marginTop: 'var(--size-l)',
marginBottom: 'var(--size-xl)',
}}
breadcrumbs={props.breadcrumb}
>
<Head>
<title>{props.title}</title>
{!props.meta ? null : (
<Meta meta={props.meta} />
)}
</Head>
<Page
tags={props.tags}
date={props.date ? new Date(props.date) : null}
>
{props.content}
</Page>
</App>
)
export const unstable_getStaticProps = async (ctx: any) => {
let slug = null
if (ctx.query) {
slug = '/' + array(ctx.query.slug).join('/')
} else {
slug = '/' + array(ctx.params.slug).join('/')
}
const page = await requestGet<IPage>(createApiUrl(`/api/page?page=${slug}`), null)
if (!page) {
throw new Error(`Not found: ${slug}`)
}
const description = page.description ?? undefined
const breadcrumbSize = page?.breadcrumb?.length ?? 0
const breadcrumb = breadcrumbSize < 2 ? null : page.breadcrumb
const meta = (new MetaBuilder())
.setImage(page.preview)
.setTitle(page.title)
.setDescription(description)
.build()
return {
props: {
content: page.data,
title: page.title,
tags: page.tags,
date: page.date,
meta,
breadcrumb,
}
}
}
export const unstable_getStaticPaths = async () => {
const urls = await requestGet<IResponseItems<string>>(createApiUrl(`/api/pages/urls`), null)
if (!urls) {
return null
}
return {
paths: urls.items
.map(path => {
const slug = tail(path.split('/'))
return {
params: {
slug,
},
}
}),
}
}
export default Index
-63
View File
@@ -1,63 +0,0 @@
import 'src/style.css'
import 'src/style/content.css'
import 'src/style/article.css'
import 'src/style/marker/marker-table.css'
import 'src/style/kazimir/image.css'
import 'src/style/kazimir/video.css'
import 'src/style/style.scss'
import App from 'next/app'
import Head from 'next/head'
import { YMetrika } from 'src/components/YMetrika'
import { GAnalytics } from 'src/components/GAnalytics'
export default class MyApp extends App {
render() {
const { Component, pageProps } = this.props
return (
<>
<Head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, maximum-scale=1.0" />
<meta name="referrer" content="unsafe-url" />
<meta name="google-site-verification" content="8BxOTw-Q02DS2KAdcGcnIMwiPZ58DVB18XpOfRibCcg" />
<meta name="google-site-verification" content="A-TEemUw4hHpULUDCd6xhxfHnyRbgKtss90JGKXnSpw" />
<meta name='yandex-verification' content='643c7dac144b9dac' />
<meta name="msvalidate.01" content="E878301FE3E3F12D233A6B1156889601" />
<link rel="icon" type="image/png" href="/static/graphics/favicon-32.png" />
<link rel="apple-touch-icon" sizes="57x57" href="/static/graphics/favicon-57.png" />
<link rel="apple-touch-icon" sizes="72x72" href="/static/graphics/favicon-72.png" />
<link rel="apple-touch-icon" sizes="114x114" href="/static/graphics/favicon-114.png" />
<link rel="apple-touch-icon" sizes="144x144" href="/static/graphics/favicon-144.png" />
<link
rel="alternate"
type="application/rss+xml"
title="Шлиссельбургская Детская Художественная Школа"
href="/feed.xml"
/>
<link href='/static/shadow-font/style.css' rel='stylesheet' />
{/* Opa */}
<script src="/static/opa.js" />
<link rel="stylesheet" href="/static/opa.css" />
{/* Likely */}
<script src='/static/likely.js' />
<link href='/static/likely.css' rel='stylesheet' />
{/* Instagram Embed */}
<script async defer src="//platform.instagram.com/en_US/embeds.js" />
<YMetrika account={24027460} />
<GAnalytics account={'UA-60209057-1'} />
</Head>
<Component {...pageProps} />
</>
)
}
}
-23
View File
@@ -1,23 +0,0 @@
import { NextPage } from 'next'
import { Wrapper } from 'src/components/Wrapper'
import { NotFound } from 'src/components/NotFound'
import { Copyright } from 'src/components/Copyright'
import { Block } from 'src/components/Block'
import { Spacer } from 'src/components/Spacer'
const Page: NextPage = () => (
<Wrapper
header={null}
footer={(
<Block as={'footer'} direction={'horizontal'}>
<Spacer />
<Copyright />
<Spacer />
</Block>
)}
>
<NotFound />
</Wrapper>
)
export default Page
-136
View File
@@ -1,136 +0,0 @@
import Head from 'next/head'
import { App } from 'src/components/App'
import { Meta } from 'src/components/Meta'
import { meta } from 'src/lib/meta'
import { IMeta, IPage, ImageSize } from 'src/types'
import { createApiUrl, requestGet } from 'src/next-lib'
import { NextPage, NextPageContext } from 'next'
import { CardGrid } from 'src/components/CardGrid'
import { Card } from 'src/components/Card'
import { Block } from 'src/components/Block'
import { Image } from 'src/components/Image'
import { imageSrcSet } from 'src/lib/image'
const persons = [
'/teacher/mg-timasheva',
'/teacher/va-sarzhin',
'/teacher/od-gogoleva',
'/teacher/nv-andreeva',
'/teacher/vv-voronova',
'/teacher/ea-burovtseva',
'/teacher/sa-latipova',
'/teacher/iv-khramov',
'/teacher/ma-khramova',
// АС Тимашева
// ЕЮ Тарасова
// ИН Втюрина
// МЮ Валькова
// РК Тимашев
]
type CardData = {
title: string
caption?: string
imageSrc: string
imageAlt: string
imageSrcSet: string
href: string
}
type Props = {
title: string
meta: IMeta
data: CardData[]
}
const Page: NextPage<Props> = props => {
if (!props.data) {
console.log('kek error')
return
}
const src = 'https://art.shlisselburg.org/static/img/collective.jpg'
const srcSet = imageSrcSet(src, [ImageSize.big, ImageSize.large, ImageSize.medium, ImageSize.small])
return (
<App
showAuthor={true}
wide={true}
>
<Head>
<title>{props.title}</title>
<Meta meta={props.meta} />
</Head>
<Image
src={src}
srcSet={srcSet}
style={{
marginBottom: 'var(--size-l)',
borderRadius: 'var(--radius)',
}}
/>
<CardGrid style={{
marginBottom: 'var(--size-xl)',
}}>
{props.data.map(item => (
<Card
key={item.href}
layout={'featured'}
img={{
src: item.imageSrc,
alt: item.imageAlt,
srcSet: item.imageSrcSet,
}}
href={item.href}
>
<Block direction={'vertical'}>
<span>{item.title}</span>
<span style={{
paddingTop: 'var(--size-s)',
fontSize: 'var(--font-size-second)',
}}>
{item.caption}
</span>
</Block>
</Card>
))}
</CardGrid>
</App>
)
}
export const unstable_getStaticProps = async (ctx: NextPageContext) => {
const title = 'Преподаватели Шлиссельбургской ДХШ'
const pages = await Promise.all(persons
.map(page => requestGet<IPage>(createApiUrl(`/api/page?page=${page}`), null))
)
const data: CardData[] = pages
.filter(Boolean)
.map(x => {
const image = x.preview.artifacts.large
return {
title: x.title,
caption: x.description,
href: x.url,
imageAlt: title,
imageSrc: image.src,
imageSrcSet: imageSrcSet(image.src, [ImageSize.medium, ImageSize.small])
}
})
return {
props: {
data,
title,
meta: meta({
title,
description: 'Преподаватели Шлиссельбургской ДХШ',
})
}
}
}
export default Page
-71
View File
@@ -1,71 +0,0 @@
import React from 'react'
import Head from 'next/head'
import { App } from 'src/components/App'
import Document from 'src/components/Document'
import { Share } from 'src/components/Share'
import { meta } from 'src/lib/meta'
import { Meta } from 'src/components/Meta'
import { createApiUrl, requestGet, IResponseItems } from 'src/next-lib'
import { NextPage } from 'next'
import { IMeta } from 'src/types'
type Props = {
data: any //(file)
meta: IMeta
}
const Page: NextPage<Props> = props => {
if (!props.data) {
console.log('kek error', props)
return null
}
return (
<App
showAuthor={true}
>
<Head>
<title>{props.data.title}</title>
<Meta meta={props.meta} />
</Head>
<Document {...props.data} />
<Share />
</App>
)
}
export const unstable_getStaticProps = async (ctx: any) => {
const id = ctx.params.slug
const data = await requestGet(createApiUrl(`/api/files/${id}`), {})
return {
props: {
data,
meta: meta({
// title: file.meta,
})
}
}
}
export const unstable_getStaticPaths = async () => {
const urls = await requestGet<IResponseItems<string>>(createApiUrl(`/api/files/urls`), null)
if (!urls) {
return null
}
return {
paths: urls.items
.map(x => x.replace('/document/', ''))
.map(slug => {
return {
params: {
slug,
},
}
}),
}
}
export default Page
-62
View File
@@ -1,62 +0,0 @@
import Head from 'next/head'
import { App } from 'src/components/App'
import { Meta } from 'src/components/Meta'
import { PageGrid } from 'src/components/PageGrid'
import { HudozkaTitle } from 'src/components/HudozkaTitle'
import { MetaBuilder } from 'src/lib/meta'
import { getPagesCardsByTags } from 'src/rest'
import { NextPage } from 'next'
import { IMeta, PageCardData } from 'src/types'
interface IProps {
title: string
meta: IMeta
items: PageCardData[]
}
const Index: NextPage<IProps> = props => (
<App
showAuthor={true}
wide={true}
>
<Head>
<title>{props.title}</title>
<Meta meta={props.meta} />
</Head>
<HudozkaTitle
style={{
marginBottom: 'var(--size-l)'
}}
/>
<PageGrid
items={props.items}
/>
</App>
)
export const unstable_getStaticProps = async () => {
const items = await getPagesCardsByTags([
'event',
'album',
'post',
])
const title = 'Шлиссельбургская ДХШ'
const meta = (new MetaBuilder())
.setTitle(title)
.setData({
url: '/',
})
.build()
return {
props: {
items,
title,
meta,
}
}
}
export default Index
Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 772 KiB

Binary file not shown.
@@ -1,713 +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>
<metadata>
Created by FontForge 20090622 at Wed May 4 16:42:32 2016
By deploy user
</metadata>
<defs>
<font id="Shadow-Regular" horiz-adv-x="729" >
<font-face
font-family="Shadow"
font-weight="400"
font-stretch="normal"
units-per-em="1000"
panose-1="0 0 0 0 0 0 0 0 0 0"
ascent="750"
descent="-250"
x-height="635"
cap-height="638.5"
bbox="-64.1538 -251 1003 860"
underline-thickness="50"
underline-position="-50"
unicode-range="U+000D-U+20B4"
/>
<missing-glyph horiz-adv-x="500"
/>
<glyph glyph-name=".notdef" horiz-adv-x="500"
/>
<glyph glyph-name="NULL" horiz-adv-x="0"
/>
<glyph glyph-name="NULL" horiz-adv-x="0"
/>
<glyph glyph-name="nonmarkingreturn" unicode="&#xd;" horiz-adv-x="500"
/>
<glyph glyph-name="space" unicode=" " horiz-adv-x="323"
/>
<glyph glyph-name="uni0418" unicode="&#x418;" horiz-adv-x="750"
d="M7 616q0 18 4.5 21.5t23.5 1.5q20 -2 40.5 -1.5t40.5 -0.5q12 0 24.5 1t25.5 -1q15 -2 20.5 -8.5t5.5 -22.5q1 -5 0.5 -9.5t-0.5 -9.5v-264v-13.5t1 -13.5q0 -7 5 -9q6 0 9 5q4 3 7 7t5 8q51 71 100.5 148.5t99.5 147.5q12 20 28 28.5t43 7.5q26 -3 53.5 -2t53.5 0
q24 -2 31 -9t6 -31q-2 -102 -1.5 -209.5t-1.5 -209.5q-1 -39 0 -73.5t2 -73.5q0 -7 0.5 -12t-0.5 -12q-1 -9 -6 -14.5t-15 -3.5q-32 1 -65 2.5t-66 0.5q-7 0 -14 0.5t-13 3.5q-4 2 -7.5 7t-3.5 10q2 37 0 80t0 80q1 37 1 73.5t1 73.5q0 2 -1 6t-5 4q-3 0 -4.5 -2t-3.5 -4
q-48 -59 -96 -127.5t-88 -134.5l-15.5 -24l-15.5 -24q-9 -15 -22 -19t-29 -6q-12 -1 -23.5 -0.5t-23.5 0.5q-20 1 -40.5 -0.5t-40.5 0.5q-23 2 -27.5 8t-3.5 30q2 37 2.5 73.5t0.5 73.5q0 38 -1 75.5l-2 75.5l0.5 15t0.5 39v55v63.5v63.5v55z" />
<glyph glyph-name="uni0413" unicode="&#x413;" horiz-adv-x="542"
d="M8 293v50t-0.5 61l-1 64t-1 58.5t-1 44.5t-0.5 23v15t1 15q0 17 19 18q21 0 54.5 0.5t73 0.5h81h77.5t63.5 -0.5t38.5 -0.5q18 0 22 -4t6 -22q3 -31 2 -58.5t2 -58.5q2 -16 -2 -21.5t-19 -7.5q-6 -1 -33 -1.5t-61.5 -0.5t-69 -0.5t-56.5 -0.5q-16 0 -16 -17
q0 -4 -0.5 -7.5t-0.5 -7.5q1 -75 0 -156t1 -156q1 -23 0.5 -40t0.5 -40q1 -14 -2 -31q-3 -15 -19 -15q-38 -2 -72.5 -2.5t-71.5 -1.5q-8 0 -10.5 4t-3.5 10q-1 7 -1 13.5v13.5v130t-1 129h1z" />
<glyph glyph-name="uni041F" unicode="&#x41f;" horiz-adv-x="688"
d="M561 353q-2 -58 -3 -115l-2 -114q-1 -26 0.5 -47.5t2.5 -47.5q0 -15 -3.5 -19.5t-17.5 -5.5l-65.5 -4t-65.5 -3q-19 -1 -19 23q0 38 0.5 70.5t0.5 70.5q0 63 0.5 124.5t-0.5 123.5q0 27 -1 39t-6 16.5t-17 4t-34 0.5q-29 1 -58 1.5t-58 -0.5q-19 0 -23.5 -4.5t-4.5 -21.5
v-175q1 -58 1.5 -116t1.5 -116q0 -5 -1 -8q-1 -13 -2 -20t-5 -10t-11 -3.5t-20 -0.5q-28 1 -56 1.5t-56 3.5q-22 2 -27 8.5t-5 28.5v450v133q0 14 3 16t18 1q48 -2 94.5 -1.5t94.5 0.5q66 -1 129 2t127 0q16 0 31 -0.5t31 -0.5q15 0 18.5 -3t3.5 -18v-93q0 -21 0.5 -50
l1 -56t1.5 -45.5z" />
<glyph glyph-name="uni0422" unicode="&#x422;" horiz-adv-x="614"
d="M468 637q7 -1 13.5 -1t13.5 -2q20 -3 25 -8t5 -26q0 -26 -0.5 -47t-1.5 -47q-1 -17 -5 -21t-20 -3q-12 0 -30.5 -0.5t-36.5 -0.5t-32.5 -0.5t-17.5 -0.5q-15 0 -23.5 -1t-12 -5t-4 -12t0.5 -23v-32.5t-1 -75.5t-1.5 -97.5t-1.5 -97.5t-1.5 -75t-0.5 -31q-3 -30 -32 -31
h-21.5h-26t-22.5 0.5t-12 0.5q-16 0 -25 0.5t-13 4.5t-5 12.5t-1 24.5v33t0.5 60t1 77l1 83t0.5 77.5v61.5v27q1 17 -19 19q-13 0 -34 1t-41.5 1.5t-37 1.5t-19.5 1q-15 1 -20 6t-5 20v39t1 39v12q0 9 -1 19t4 16q3 5 13.5 3.5t19.5 -1.5q13 0 46.5 0.5t76.5 0.5t91 -0.5
t91 -0.5t76 -0.5t45 -0.5z" />
<glyph glyph-name="uni0428" unicode="&#x428;" horiz-adv-x="969"
d="M255 -2q-51 1 -101 1.5t-101 1.5q-10 0 -15 1q-17 2 -22.5 8.5t-5.5 23.5q-2 69 -1 136t0 136q-1 55 -0.5 110t0.5 111q1 23 0 37t-2 37q0 7 1 13t2 13q5 15 20 14q10 -1 26 -1.5t32.5 -0.5t30 0.5t16.5 0.5q13 1 21 0t12.5 -4.5t6.5 -11t3 -20.5q5 -62 4 -118t1 -119
q1 -42 -1 -86t0 -86q1 -14 4.5 -17.5t18.5 -4.5q25 -2 54 -0.5t53 0.5t29 3.5t4 27.5q0 38 -1 75.5t-1 75.5q0 54 0.5 106.5t0.5 106.5q0 16 1 26.5t-1 26.5q-2 20 16 20q34 -2 65.5 0t65.5 -1q14 -2 18 -7t4 -22q1 -87 1 -172.5v-172.5q0 -19 0.5 -37.5t1.5 -36.5
q1 -14 5.5 -18t18.5 -4q27 -1 54 -0.5t55 0.5q17 0 17 16v55q-1 41 -0.5 81t-1.5 82q-2 50 -2.5 98.5t-2.5 98.5q0 4 -0.5 7.5t-0.5 8.5q0 11 4.5 15.5t16.5 4.5h60t61 -1q11 -1 17 -6t7 -22q3 -97 4.5 -193.5t-3.5 -194.5q-2 -45 -0.5 -87.5t1.5 -87.5q0 -31 -8.5 -39
t-38.5 -8q-17 0 -59.5 -0.5t-97 -0.5h-115.5h-113.5t-90.5 0.5t-48 0.5z" />
<glyph glyph-name="uni0420" unicode="&#x420;" horiz-adv-x="614"
d="M6 483q1 36 1.5 63.5t1.5 62.5q0 10 0.5 16t3.5 9t8.5 4t15.5 2q8 1 15.5 0.5t15.5 -0.5q11 0 23 0.5t23 0.5q7 0 23 0.5t34 2t34.5 2t23.5 0.5q20 -2 39 -3.5t38 -3.5q45 -5 81.5 -25t70.5 -47q5 -4 8.5 -8t8.5 -9q24 -22 35.5 -43.5t13.5 -44.5t-3 -48t-14 -55
q-21 -67 -60 -104t-102 -56q-35 -11 -70.5 -13t-72.5 0q-23 2 -28 -2.5t-6 -27.5q-1 -34 -0.5 -68t0.5 -68q0 -20 -5 -25t-26 -4l-55.5 2l-56.5 2q-19 1 -20 23q-1 27 -1 54v54v202v17v41t0.5 50.5t1.5 46.5zM230 495q-8 0 -17 -0.5t-17 -0.5q-9 -1 -14.5 -4.5t-6.5 -13.5
q0 -29 -0.5 -60t-1.5 -60q0 -15 16 -17q36 -4 70 0.5t66 21.5q18 10 28 26q8 12 10 28.5t-3 31.5t-16 26.5t-29 14.5q-11 2 -25 3.5t-27.5 2.5t-23 1h-9.5z" />
<glyph glyph-name="uni041C" unicode="&#x41c;" horiz-adv-x="979"
d="M5 622q0 12 3.5 16t16.5 5q15 1 40.5 1t51 -1t45 -1t24.5 1q18 4 25 -12q28 -58 52.5 -103l47 -84.5l44.5 -77.5l45 -81q8 -15 17 -26q7 -11 15 0l102 165l23.5 40l31.5 56l29 53.5l17 32.5q16 36 55 33q30 -2 60 -2.5t60 -1.5q10 0 19 -3q8 -2 13 -6.5t5 -14.5
q0 -41 1 -81.5l2 -81.5q2 -66 2.5 -132t2.5 -132l2 -81l2 -82q1 -18 -7 -25t-25 -6l-105 3q-12 0 -19 1t-10 4t-3.5 9t-0.5 18q0 68 -0.5 131.5t-0.5 132.5v9.5t-1 9.5t-1.5 11t-4.5 6q-3 1 -9.5 -7.5t-8.5 -10.5l-85.5 -128.5t-78.5 -131.5q-2 -3 -3.5 -6.5t-3.5 -6.5
q-10 -16 -15 -25t-11 -12.5t-16 -4t-30 -0.5q-30 1 -59 0q-26 -3 -34 23l-5.5 15t-5.5 14q-11 25 -22 46t-22 46l-16.5 35.5l-16.5 35.5q-6 13 -11.5 26.5t-12.5 26.5q-5 11 -13.5 26t-12.5 15q-1 0 -1.5 -14.5t-0.5 -38v-53.5t0.5 -60l1 -57.5t0.5 -47.5v-11t-1 -12
q-3 -21 -24 -19q-32 1 -63.5 0t-63.5 1q-18 1 -22.5 5.5t-5.5 21.5q-1 29 -1 53t-1 53q-1 39 -1.5 77.5t-0.5 77.5q0 13 0.5 25.5t0.5 24.5v15v39.5v56v64.5t-0.5 64t-0.5 56z" />
<glyph glyph-name="uni041E" unicode="&#x41e;"
d="M654 323q-2 -46 -20 -97.5t-51 -101.5q-35 -51 -83 -82t-103 -52q-16 -6 -34.5 -10t-37.5 -5.5t-37.5 -0.5t-34.5 5q-18 4 -46 15.5t-60 29t-64 41.5t-58 54q-23 27 -34.5 59.5t-13.5 68.5q-3 54 4.5 106t30.5 102q12 26 32 54.5t51 54.5t74 48t102 36q29 6 65.5 5
t74.5 -11q28 -7 56.5 -22t53.5 -33t44 -36.5t30 -32.5q31 -40 44.5 -86t14.5 -109zM302 154q27 -1 48.5 2.5t41.5 14.5q51 32 73 79t11 106q-5 29 -20.5 53t-38.5 41t-50.5 25t-56.5 4t-55.5 -12.5t-45.5 -31.5q-37 -42 -51 -91.5t1 -106.5q3 -10 10.5 -20t15.5 -17
q27 -22 56.5 -35t60.5 -11z" />
<glyph glyph-name="uni0429" unicode="&#x429;" horiz-adv-x="1083"
d="M340 617q0 15 3 19.5t18 4.5q30 1 60 0.5t60 -1.5q17 0 17 -20q0 -44 0.5 -84t-0.5 -84q0 -66 -0.5 -132t-0.5 -132q-1 -17 2.5 -21t20.5 -5q29 -1 58.5 -1h58.5q13 0 20 1t10.5 4.5t4 10.5t0.5 19q0 42 -0.5 83.5t-0.5 83.5q-1 61 -1 122v122q0 11 0.5 17.5t3.5 10
t9 4.5t17 1q30 1 60 -0.5t60 -3.5q12 0 14 -15q2 -20 3.5 -40.5t1.5 -40.5q1 -80 0 -159t2 -159l1.5 -41t5.5 -17.5t17 -4t36 -0.5l36.5 -2t36.5 -3q19 -2 20 -19q0 -7 1.5 -13.5t2.5 -13.5q2 -47 2.5 -93t2.5 -93q0 -6 -1 -11.5l-2 -11.5q-3 -18 -21 -18q-27 1 -54 1t-54 1
q-19 0 -24 5t-7 23q-5 33 -6 66q-1 11 -5.5 16t-15.5 5q-20 0 -39 0.5t-39 0.5q-105 1 -209 1.5t-210 1.5q-67 0 -133.5 0.5t-133.5 0.5h-12t-11 2q-11 2 -17 9t-3 18q-2 21 -2 39v34.5t0.5 32.5t0.5 33q-2 52 0 103t-1 103q-4 60 -3.5 113.5t1.5 113.5v16q1 17 4.5 21
t20.5 3q17 0 34.5 -1t34.5 -1q15 -1 29.5 -1.5t28.5 0.5q19 0 19 -18q-1 -23 -1.5 -40t-0.5 -40q1 -69 1.5 -138t0.5 -138q1 -17 0.5 -33t-0.5 -33q0 -21 3 -25.5t23 -5.5l52.5 -4t52.5 -2q15 0 22.5 1t10.5 4.5t3.5 11t0.5 20.5q-1 52 -1 104t-1 105l0.5 22.5t0.5 54.5
v67.5v62.5z" />
<glyph glyph-name="uni0427" unicode="&#x427;" horiz-adv-x="656"
d="M550 471q-1 -107 -0.5 -213t-0.5 -213q0 -11 -0.5 -16.5l-1.5 -16.5q-2 -14 -6.5 -18t-18.5 -3q-30 2 -60 0t-60 2q-26 3 -26 36v117q0 14 -1 28.5l-2 29.5q-1 17 -17 9q-5 -2 -10.5 -5.5t-10.5 -5.5l-41.5 -16t-41.5 -14q-52 -14 -96.5 0t-85.5 44q-24 18 -39.5 42.5
t-17.5 55.5l-4 67.5t-3 68.5v43t0.5 39l1 39t0.5 43q0 22 20 22q5 0 21.5 0.5t36.5 0.5h39h30q12 -1 19 -2t10 -4t3.5 -9.5t0.5 -17.5q-1 -42 -2.5 -74.5t-2.5 -73.5q0 -17 1 -33t5 -33q5 -24 21 -38.5t45 -14.5q50 -1 90 29q14 11 21.5 23.5t7.5 32.5q-2 48 -1 93t1 93v8
q1 17 5.5 22t21.5 5h19h33.5h36h28.5q20 1 25 -5t7 -26q1 -17 1 -41.5v-46.5t-0.5 -37.5z" />
<glyph glyph-name="uni0426" unicode="&#x426;"
d="M6 611q-1 16 2.5 20t20.5 7q4 0 19.5 0.5t35.5 0.5t40 -0.5t32 -0.5q11 0 14.5 -4.5t3.5 -14.5q1 -28 1.5 -68t0.5 -85t-0.5 -90.5t-0.5 -84.5t-0.5 -67.5t0.5 -38.5q0 -22 24 -22h73.5t73.5 -1q20 0 18 20q-1 16 -1 47.5v72t-0.5 85.5t-0.5 87t-1 77.5t-2 56.5v10t1 10
q3 15 19 15q30 -2 60 -2.5t60 -2.5q16 -2 19.5 -5.5t4.5 -20.5q1 -24 2 -58t1.5 -73t0.5 -78.5t0.5 -73.5t0.5 -59v-34q1 -11 1 -21.5t1 -21.5q1 -17 2 -25.5t5.5 -13t13 -5.5t25.5 -1q3 0 6 0.5t5 -0.5q18 -1 27 -2t12 -5t3 -12t1 -21q4 -43 5 -83t0 -87q0 -15 -6 -23.5
t-21 -9.5q-26 0 -49 0.5t-49 -0.5q-22 0 -25 20q-2 14 -1 28.5t-1 28.5q-2 17 -17 18q-9 1 -19 1.5t-19 -1.5q-17 0 -46 -0.5t-63.5 -0.5t-71 -1t-69 -1t-58 -0.5t-37.5 -0.5h-31q-10 1 -21 0.5t-18 4.5q-5 4 -4.5 15t-0.5 21q-3 97 1 192t0 192l-2 68q-1 29 -1 61.5v60.5z
" />
<glyph glyph-name="uni042C" unicode="&#x42c;" horiz-adv-x="594"
d="M146 -2q-30 1 -52.5 1.5t-42.5 1.5q-16 0 -31 3q-7 2 -11.5 6.5t-2.5 12.5q0 48 -0.5 98t0.5 99v61.5v77v81.5v76v60v34q0 5 -0.5 9.5t0.5 9.5q3 20 24 20q30 -2 60 -3t60 -3q14 -1 22 -2t11.5 -5t4.5 -12t1 -22q1 -34 0.5 -59.5t1.5 -59.5q0 -18 3 -22t20 -5
q22 -2 49 -1.5t49 -1.5q84 -6 142 -64q48 -49 54 -122q5 -83 -38 -156q-22 -36 -53 -60.5t-73 -35.5q-52 -14 -103 -18t-95 1zM191 251q2 -10 2 -29q0 -9 0.5 -18.5t0.5 -19.5q1 -26 6.5 -32t31.5 -4q15 1 30 6q14 4 28 10t25.5 16t18.5 23.5t7 33.5q0 19 -8 31t-21.5 19.5
t-30 10.5t-34.5 5q-1 1 -4 1q-19 2 -29.5 2t-15.5 -5t-6 -16.5t-1 -33.5z" />
<glyph glyph-name="uni042A" unicode="&#x42a;" horiz-adv-x="666"
d="M76 324q-1 39 0.5 77.5t-0.5 77.5q-2 18 -6 21.5t-23 4.5q-23 1 -37.5 0t-23 3t-11 16t-1.5 39q1 14 0 27t-1 27q1 14 5 18.5t18 5.5h37.5t63.5 -0.5l69 -1t54 -1.5q3 1 9.5 1t12.5 -2.5t10.5 -8.5t4.5 -16v-28v-39v-42v-38q0 -22 20 -22q37 0 73 -3q51 -5 94 -24.5
t76 -58.5q32 -38 41 -81t-2 -91q-14 -60 -50.5 -100t-94.5 -63q-41 -16 -81.5 -19t-82.5 -5q-37 -2 -74 0l-74 4q-18 1 -21 4t-3 20q-1 48 -1.5 95t-1.5 95v12v28.5t0.5 35t0.5 32.5zM302 136q7 1 16.5 1.5t19.5 2.5q8 2 16.5 6t13.5 10q19 20 25.5 43t-2.5 50
q-15 49 -65 58q-21 4 -42 6q-17 2 -21.5 -2t-4.5 -22q-2 -66 0 -132q0 -14 3.5 -17t19.5 -4h21z" />
<glyph glyph-name="uni042B" unicode="&#x42b;" horiz-adv-x="823"
d="M7 283q1 36 1.5 89l1 104t0.5 90v48q-1 18 3 22t23 5h23t40 -0.5l43 -1t32 -0.5q16 -1 19 -3t5 -18q2 -34 0.5 -67.5t0.5 -67.5q0 -13 1 -20.5t4 -11t10 -5t21 -3.5q10 -1 19.5 -1t19.5 -2q60 -10 105 -41t72 -88q18 -38 23 -77t-7 -81q-11 -40 -36 -74.5t-66 -50.5
q-42 -17 -81.5 -20.5l-83.5 -7.5q-5 0 -24 -0.5t-44 -0.5t-50 -0.5t-40 -1.5q-23 -1 -28.5 4.5t-5.5 28.5q0 66 -0.5 130.5t-0.5 122.5zM194 167q0 -8 3 -13.5t11 -5.5q10 0 24.5 0.5t28.5 3.5t26.5 7.5t20.5 12.5t12.5 20t6 25t-0.5 26t-7 23t-18.5 18.5t-29.5 14t-33 8
t-29 1.5q-14 -2 -15 -14v-127zM543 615q0 14 3.5 19.5t17.5 4.5h62t62 -2q17 -1 20.5 -5.5t3.5 -22.5q2 -42 2.5 -79t0.5 -79v-194t-2 -194q0 -30 0.5 -43.5t-5 -18t-20 -3.5t-44.5 1q-19 -1 -37 0t-37 1q-18 0 -24 5t-6 24v150.5t-1 151.5l1 30.5t1.5 74.5t1 93t0.5 86z
" />
<glyph glyph-name="uni0411" unicode="&#x411;" horiz-adv-x="677"
d="M156 -12q-31 1 -61.5 1t-62.5 2q-17 1 -22 6t-5 22q1 34 1.5 67.5t1.5 68.5v135v246q0 44 -3 89q0 11 4 14.5t14 3.5h38.5h60.5t71.5 -0.5t73 -0.5h65.5t47 1q11 1 21.5 1.5t21.5 -0.5q18 -1 25 -8t6 -26q-1 -25 -3 -47.5t-4 -47.5q-1 -8 -2 -13t-3.5 -7t-7.5 -2.5
t-14 -0.5q-35 -1 -69.5 -0.5t-69.5 -0.5q-22 0 -45 -0.5t-44 -0.5q-16 0 -18 -16q-2 -17 -0.5 -33t0.5 -34q0 -9 5 -12t13 -3q28 -3 55.5 -2.5t56.5 0.5q29 -1 57 -7.5t56 -15.5q35 -12 60.5 -35t42.5 -55q14 -26 13 -51t-7 -62q-9 -56 -38 -90.5t-66.5 -53.5t-77.5 -25
t-73 -6h-21.5h-39h-37t-16.5 -1zM233 256q-8 2 -17 1t-19 0q-20 2 -21 -17q0 -23 -0.5 -44.5t-0.5 -44.5q0 -17 18 -20q57 -12 110 11q14 6 22.5 17t11.5 24t-0.5 25.5t-14.5 22.5q-10 8 -22.5 12.5t-25.5 7.5q-9 3 -19.5 4t-21.5 1z" />
<glyph glyph-name="uni041A" unicode="&#x41a;" horiz-adv-x="677"
d="M7 611q0 15 4 19.5t18 3.5q24 0 45 -1t46 -2q5 -1 11 -1h12q20 0 24 -3.5t5 -23.5q2 -32 2.5 -64t1.5 -64q1 -6 0 -11.5t0 -11.5l2 -10.5t3 -10.5q5 2 9 4.5t7 5.5l89 86.5l88 87.5q11 10 22 16.5t25 5.5q38 -1 75.5 -1.5t75.5 -1.5q3 0 7 -3t5 -5q1 -3 -1 -7.5t-4 -6.5
l-76 -77.5l-76 -77.5q-14 -14 -28.5 -26.5t-28.5 -26.5q-14 -13 -14.5 -18t9.5 -21l41.5 -67.5l42.5 -67.5l61 -96.5l61 -96.5q8 -12 3.5 -22t-18.5 -12q-5 -1 -11 -1h-12q-21 -1 -42.5 -1t-42.5 -2q-23 -2 -39.5 6.5t-29.5 26.5q-14 20 -31 47t-31 47l-42 60.5l-42 60.5
q-8 12 -13.5 12.5t-16.5 -9.5q-20 -16 -19 -44q2 -45 2.5 -89t1.5 -89q1 -20 -3.5 -25.5t-23.5 -5.5q-30 0 -64.5 1t-64.5 3q-23 1 -24 25q-1 18 -1 63v103.5v124v124.5v105v65z" />
<glyph glyph-name="uni041B" unicode="&#x41b;" horiz-adv-x="751"
d="M635 356q0 -48 -0.5 -95t0.5 -95q1 -42 2 -76t3 -76q1 -17 -13 -17q-35 1 -70 1.5t-70 1.5q-10 0 -12 5t-2 13v54.5t-1 55.5l-3 213q-1 25 0 50t0 51q0 11 -1 17.5t-4.5 9.5t-10 4t-18.5 2h-8q-10 0 -15.5 -0.5t-9 -2.5t-6 -7.5t-5.5 -14.5l-23.5 -84t-25.5 -83
q-15 -45 -32 -89.5t-39 -86.5q-12 -23 -31.5 -42.5l-39.5 -38.5q-17 -17 -39 -23.5t-46 -7.5q-33 -2 -64 5t-61 18q-14 5 -17.5 11.5t-1.5 21.5q6 29 11.5 59t12.5 59q4 21 25 15l9 -3.5l9 -3.5q31 -11 59.5 -2.5t46.5 35.5q8 12 14.5 25t10.5 27l27 91.5t24 91.5
q11 42 19 85t17 85q3 17 7.5 21.5t21.5 6.5q4 0 8 0.5t7 -0.5q17 0 43 0.5t56.5 0.5h62.5h61h52h35q18 -1 21.5 -5t3.5 -23q0 -47 -0.5 -93t-1.5 -93v-21.5t0.5 -24t1 -20z" />
<glyph glyph-name="uni042F" unicode="&#x42f;" horiz-adv-x="687"
d="M571 34v-23q-2 -20 -21 -18h-127q-18 1 -24 7t-6 23v54.5t1 54.5q0 17 0.5 34.5t0.5 35.5q0 15 -3.5 18t-18.5 5q-30 6 -46 -20l-57.5 -85t-55.5 -86q-7 -12 -12.5 -19.5t-13 -12.5t-19.5 -7t-31 -2h-34t-38 1q-21 0 -44 1q-6 2 -10 5q-8 6 -1 16q14 20 30 39.5t31 40.5
l48 67.5l48 68.5q9 14 8.5 18.5t-14.5 10.5q-35 16 -55 43.5t-34 60.5q-14 35 -18.5 70.5t6.5 73.5q5 18 16 32.5t25 26.5q49 41 113 57q45 11 87 11.5t82 1.5q17 -1 42.5 -1t49 0.5t40.5 0.5h19q21 -3 28 -11t7 -29v-48v-87t0.5 -111t0.5 -119v-111.5v-87.5zM407 438
q-1 4 -1 12.5t-1 17.5q-2 15 -14 16q-15 1 -43.5 2.5t-56 -1t-48.5 -12t-22 -30.5q-1 -37 17 -53.5t41 -21.5t44.5 -3.5t29.5 0.5q22 -2 32.5 1t14.5 11t4.5 23t2.5 38z" />
<glyph glyph-name="uni0414" unicode="&#x414;" horiz-adv-x="791"
d="M570 179q1 -20 4.5 -24.5t23.5 -5.5q13 -1 25.5 -1t24.5 -1q15 0 21 -4t9 -18q1 -6 1 -12v-11q0 -33 0.5 -66t0.5 -66v-11.5t-1 -11.5q-3 -17 -22 -17q-21 0 -42.5 -0.5t-42.5 -0.5q-20 0 -17 20v3q0 17 -1 26t-5 13.5t-13 5.5t-25 1q-12 0 -42 0.5t-69 1t-82.5 1
t-82 0.5h-67.5t-39 -1q-4 -1 -8 -6t-5 -10q-2 -11 -1.5 -27t0.5 -27q0 -6 -2.5 -11t-10.5 -5q-26 -1 -55 -2t-55 0q-14 0 -18 5t-5 19q-2 44 -1 87t-1 87q-1 14 2.5 17.5t17.5 1.5q22 -3 36 16l27.5 35t24.5 37q22 39 39.5 79.5t27.5 84.5q2 9 8 31.5t12 49t10 51.5t4 40
q-1 20 1.5 36.5t3.5 36.5q1 19 20 18q49 0 97 0.5t96 -0.5q72 0 143 -3q17 -1 20.5 -5t3.5 -21q0 -19 0.5 -53.5t1.5 -77l2 -88.5t1.5 -88t1.5 -76.5t2 -52.5zM400 314v18t-1 44t-1.5 55t-1.5 51q0 5 -2 11t-4 6q-11 1 -22.5 1t-22.5 -2q-9 -2 -8.5 -9t-0.5 -14
q-2 -16 -3 -29t-3 -30q-8 -65 -27.5 -128t-51.5 -121q-1 -3 -2 -5.5t-2 -5.5q-3 -6 -0.5 -9.5t8.5 -3.5q31 0 67.5 1t67.5 2q17 0 17 17v17.5t-1 17.5q-2 29 -3 58t-3 58z" />
<glyph glyph-name="uni0416" unicode="&#x416;" horiz-adv-x="928"
d="M352 369q2 0 3 12.5t2 29.5t1 36t-1 33q-2 38 -4.5 69.5t-4.5 69.5q-1 17 2.5 21t20.5 5q32 1 64 0.5t64 -0.5q11 0 13.5 -5t2.5 -15q0 -61 1 -116t2 -116v-8t2 -7q1 -2 4.5 -3t3.5 0q5 5 9 10t7 11l57.5 108t57.5 109q7 15 16.5 23t27.5 6q25 -2 50 -1t50 1q9 0 17 -1
t13 -12q4 -10 1 -17t-8 -15l-74.5 -114.5l-74.5 -114.5q-9 -15 -9 -29t8 -29l24 -46l30 -57l31.5 -60.5l28.5 -56l22 -44t12 -23.5q9 -19 -11 -22q-17 -3 -34 -3q-23 2 -46.5 1t-46.5 1q-19 1 -27 18l-59 114.5l-60 114.5q-2 3 -3.5 6.5t-3.5 7.5q-3 3 -6 3q-4 0 -4 -5
q-1 -7 -1.5 -13.5t-0.5 -13.5q2 -57 3 -111l2 -112q1 -10 -5 -16.5t-15 -3.5q-32 -1 -62 0.5t-61 -0.5q-17 -2 -20.5 2.5t-4.5 21.5l-2 114.5l-2 115.5v9.5t-1 9.5q0 5 -5 5q-5 2 -7 -2l-5.5 -7.5t-5.5 -8.5l-48.5 -81l-49.5 -82l-28 -44l-28 -44q-5 -8 -9.5 -9t-22.5 0
q-3 2 -18 2.5t-34.5 0.5h-39h-30.5q-29 2 -12 25q8 13 17 24t17 24l27.5 41.5l31.5 48.5l32 49.5l29 44.5l21 32.5t9 13.5q14 20 2 40l-21.5 39l-21.5 39q-23 38 -45 69t-45 69q-11 18 -21 36.5t-21 36.5q-10 17 11 17q13 0 33.5 -0.5t39.5 -0.5t33.5 -0.5t16.5 -0.5
q10 2 22 1.5t18 -4.5q9 -6 14.5 -17l10.5 -21l30 -55.5l30 -52l30 -51.5l31 -55q2 -3 4 -9t7 -6z" />
<glyph glyph-name="uni0425" unicode="&#x425;" horiz-adv-x="771"
d="M649 -3q-47 -2 -90.5 -1t-89.5 -1q-11 0 -17 4t-11 12q-14 18 -27.5 39t-27.5 40l-22.5 30.5l-22.5 30.5q-14 19 -19 19t-18 -19l-31.5 -47l-31.5 -48l-8 -10.5t-7 -11.5q-26 -54 -88 -48q-32 -1 -54.5 0t-48.5 1q-10 0 -22 5q-12 3 -5 15l48.5 73l48.5 73l49 75l50 74
q8 11 7 19.5t-8 17.5l-44.5 62.5l-43.5 62.5l-49.5 74l-49.5 74q-2 5 -4 9t-4 9q-3 12 10 12q41 1 81.5 1.5t81.5 1.5q8 0 12 -3.5t8 -9.5l50 -69.5l50 -69.5q2 -3 5 -6t5 -6q11 -14 21 0q5 8 10.5 15.5l11.5 15.5l38 54t37 56q15 21 38 21q33 0 66 0.5t67 1.5q9 0 12 -5
t2 -13q-3 -12 -10 -24l-55.5 -85l-54.5 -84l-28 -45.5l-29 -44.5q-6 -9 -3.5 -14.5t7.5 -12.5l48.5 -60.5l48.5 -61.5l54 -73.5l53 -74.5q5 -7 9 -14t8 -15q6 -12 3 -16.5t-16 -4.5z" />
<glyph glyph-name="uni0424" unicode="&#x424;" horiz-adv-x="812"
d="M457 646q4 -3 5 -14t1.5 -24t0.5 -23.5t2 -12.5q2 -5 7.5 -6l10.5 -2q88 -8 144 -38t76 -71q19 -41 30 -84q16 -66 -4 -121.5t-61 -103.5q-29 -35 -70 -53.5t-87 -24.5q-17 -3 -25.5 -5t-13 -6.5t-5 -13.5t-0.5 -25v-16q0 -18 -19 -21q-33 -3 -65.5 -3.5t-65.5 6.5
q-20 3 -20 23q-1 14 -2.5 28.5t-2.5 28.5q-14 3 -28 5.5t-28 5.5q-20 5 -39.5 9t-39.5 10q-26 9 -50.5 23t-45 35t-34.5 49t-20 64q-10 57 4.5 107.5t45.5 97.5q17 25 40 42t51 28q29 12 60.5 19t63.5 8q10 0 16 1t8.5 4t3 9.5t0.5 17.5v15q-3 27 5.5 33.5t33.5 8.5
q6 1 23.5 0.5t37 -1.5t36 -3.5t20.5 -5.5zM298 337h1q0 17 0.5 33t0.5 33q-1 17 -4 22t-21 3q-9 0 -26.5 -8.5t-34.5 -23t-29.5 -33.5t-11.5 -41q1 -32 13.5 -53.5t28 -34.5t32 -18t27.5 -5q9 1 15.5 3t7.5 16q0 27 0.5 53.5t0.5 53.5zM462 225q0 -17 15 -14q24 5 45.5 14.5
t35.5 29.5q20 26 21.5 56t-9.5 61q-11 26 -32 35t-44 14q-2 0 -8 2q-14 2 -18 -0.5t-5 -16.5q0 -11 -0.5 -36t-0.5 -53.5v-54v-37.5z" />
<glyph glyph-name="uni0423" unicode="&#x423;"
d="M159 641q14 0 22 -1.5t11.5 -5t3.5 -11t-2 -19.5q-5 -29 -0.5 -56t12.5 -54q16 -53 53 -81t84 -45q13 -5 17.5 -2t11.5 18l24 59l23 60l21 56l21 56q5 18 21 18l70 2t70 0q23 0 30 -9t-1 -32q-21 -62 -45 -120q-35 -94 -79 -181.5t-94 -173.5q-16 -28 -38 -49t-49 -38
q-28 -17 -57.5 -30.5t-64.5 -16.5q-20 -1 -40 -0.5t-40 7.5q-28 9 -55.5 17t-52.5 25q-15 10 -16.5 14.5t5.5 22.5q10 28 18.5 55.5t19.5 54.5q8 22 18.5 24.5t30.5 -11.5q11 -8 22.5 -14.5t24.5 -11.5q38 -14 74 2t57 47q11 14 -7 20l-39 16l-39 16q-38 17 -68.5 42.5
t-56.5 54.5q-27 31 -40.5 68t-20.5 77q-5 29 -8 54.5t-6 55.5q-1 14 2 17.5t17 3.5h28.5h40.5t39.5 -0.5t26.5 -0.5z" />
<glyph glyph-name="uni0401" unicode="&#x401;" horiz-adv-x="593"
d="M475 634q19 0 21 -18q0 -4 0.5 -20t0.5 -34t-0.5 -33t-0.5 -16q-1 -14 -4.5 -18t-18.5 -4q-16 0 -52.5 -0.5t-78 -1t-78.5 -1.5t-54 -1q-15 0 -20.5 -5.5t-6.5 -19.5q-2 -20 -2 -32v-31q0 -20 23 -20q21 0 41.5 -1l41.5 -2q19 -2 15 -21q-2 -14 -1.5 -28.5t-1.5 -28.5
q-2 -17 -7.5 -21.5t-22.5 -4.5t-33 0.5t-33 0.5q-14 -1 -19 -5t-5 -18q1 -20 0 -40.5t1 -40.5q2 -17 7.5 -20.5t21.5 -2.5q27 0 56 0.5t56 0.5q34 -1 68 -1.5t68 -2.5q18 -1 24 -7t5 -23v-24.5t0.5 -28.5t0.5 -24.5v-12.5q-1 -16 -6.5 -21t-22.5 -5h-40h-75.5h-93.5h-93.5
h-76h-40.5q-13 0 -20 0.5t-10.5 4t-4.5 10.5t-1 19q-1 61 -1 120t-1 120v89q1 43 2 78.5t2 78.5q1 24 0 48t0 48q0 17 3.5 20.5t20.5 3.5q47 1 93 0.5t93 -0.5l28.5 0.5t69 0t85 -1.5t77.5 -2zM127 695q-16 1 -29.5 7t-23.5 16.5t-15.5 23.5t-4.5 28q1 13 7.5 25t16.5 21
t22.5 14.5t25.5 5.5q12 0 24.5 -6.5t22 -17t15.5 -23t6 -24.5q0 -15 -5.5 -28t-14.5 -22.5t-21.5 -15t-25.5 -4.5zM396 831q12 0 23.5 -5t20.5 -13.5t14 -19t5 -22.5q-1 -30 -18.5 -49.5t-44.5 -18.5q-29 0 -48 19.5t-19 49.5q-1 26 18 42.5t49 16.5z" />
<glyph glyph-name="uni0419" unicode="&#x419;" horiz-adv-x="708"
d="M6 621q0 16 6 23t21 5q35 -2 67.5 0t67.5 -2q22 -2 20 -23v-35.5v-61.5t0.5 -73.5t1 -71t1.5 -53.5t2 -21q11 0 15 6q14 17 26.5 34l25.5 34l45.5 65l45.5 65l39.5 55l39.5 56q5 7 8.5 11t9 6.5t13 3t21.5 0.5h78q16 0 24 -0.5t12 -3.5t4.5 -10.5t1.5 -20.5
q1 -25 1.5 -73t0.5 -106.5v-121t-0.5 -115t-0.5 -89.5v-45q0 -12 0.5 -20.5t-1.5 -20.5q-2 -13 -7 -17t-19 -3q-26 2 -52.5 0.5t-52.5 0.5q-9 1 -21.5 0t-15.5 2t-2 19t0 27q0 44 0.5 79t-0.5 79q0 23 -0.5 46.5t-1.5 46.5q0 7 -4 10q-4 2 -9 -3q-4 -4 -10 -12l-79 -103.5
l-79 -103.5q-14 -20 -28.5 -37t-28.5 -37q-10 -15 -29 -15q-35 2 -69.5 1t-69.5 1q-8 0 -10.5 4t-3.5 11v13.5t-1 13.5q0 70 -0.5 139.5t-1.5 140.5q-1 0 -1 21v52.5v69v71v57.5v29zM308 710q-15 0 -29 6t-24 15.5t-16 21.5t-5 25q2 29 25 48.5t55 18.5q65 -1 68 -72
q1 -12 -5.5 -23.5t-17 -20.5t-24 -14t-27.5 -5z" />
<glyph glyph-name="uni042E" unicode="&#x42e;" horiz-adv-x="969"
d="M184 23q-1 -16 -5 -20.5t-19 -4.5q-29 1 -59 1t-59 2q-13 0 -20 1t-10 4.5t-3.5 10t-0.5 18.5q-2 79 -0.5 157t-0.5 157q-1 32 -1.5 64.5t1.5 64.5q2 37 2 70.5t-2 71.5q-1 14 1.5 18t13.5 4q36 0 69 -0.5t69 -0.5q16 -2 16 -17q1 -14 1 -27v-27q1 -37 0 -70.5t1 -71.5
q0 -19 3.5 -22t21.5 -5q14 -1 27 -0.5t26 -0.5q17 -1 23 16q5 11 9.5 22.5t9.5 22.5q34 78 95 121t142 61q66 15 123 -1.5t107 -58.5q35 -31 60.5 -69t37.5 -86q9 -36 15 -72t2 -74q-5 -44 -17 -83.5t-38 -76.5q-19 -26 -40 -50t-49 -41q-53 -32 -109.5 -41.5t-117.5 -6.5
q-42 3 -79 18t-72 38q-33 22 -52.5 54t-30.5 69q-7 22 -11.5 44l-9.5 45q-4 17 -20 18q-18 1 -28 0t-15.5 -6.5t-7 -15.5t-1.5 -28q0 -11 0.5 -38t0.5 -57.5t0.5 -59t0.5 -41.5zM442 324q0 -6 -0.5 -12t-0.5 -11q0 -34 15 -59.5t36.5 -43t44.5 -26t38 -8.5q72 0 111 47.5
t39 125.5q0 12 -2 33.5t-13.5 44t-34.5 41t-65 26.5q-61 10 -104.5 -22t-59.5 -90q-2 -6 -2.5 -13.5l-1 -15t-0.5 -12.5v-5z" />
<glyph glyph-name="uni0412" unicode="&#x412;" horiz-adv-x="646"
d="M429 377q14 -5 25 -10l22 -10q9 -4 20 -16t20.5 -32t16 -48.5t6.5 -64.5q0 -29 -14 -58t-35.5 -54.5t-47.5 -45t-50 -28.5q-36 -14 -73.5 -19t-75.5 -6q-2 0 -4 0.5t-4 -0.5q-17 -2 -49.5 -1.5t-65.5 1.5q-39 1 -82 2q-7 0 -12 2t-9 5t-6 9q-5 17 -5 33q-1 79 -1 157.5
v157.5q0 44 0.5 87t0.5 87q1 29 0.5 57.5t-2.5 57.5q0 15 12 15q64 1 120.5 2t120.5 0q23 0 45.5 -5t45.5 -11q29 -8 53 -25.5t44 -40.5q12 -15 17 -37q4 -20 6 -39.5t0.5 -37.5t-7.5 -35.5t-19 -33.5q-2 -3 -5 -6.5t-8 -8.5zM186 205v-26q-2 -20 -2 -30t4.5 -14t14.5 -4
t28 -1q30 -2 57 8t51 27q40 27 14 70q-10 15 -28 27q-29 19 -59.5 19.5t-62.5 -3.5q-10 -2 -13 -7t-3 -14q0 -7 -0.5 -15.5t-0.5 -16.5v-20zM183 478v-41.5t6 -19.5t20 -4t43 4q12 2 23 6.5t22 10.5q14 8 20 21.5t5 29.5t-11 25.5t-24 13.5q-12 3 -24.5 4l-25.5 2
q-12 1 -24 0t-23 -1q-2 -13 -3.5 -25.5t-3.5 -25.5z" />
<glyph glyph-name="uni0421" unicode="&#x421;" horiz-adv-x="688"
d="M-20 334q0 53 15.5 96.5t40.5 77t55.5 59t61 42.5t57 27t42.5 13q94 20 179 -19q19 -8 37.5 -19.5l35.5 -22.5q11 -6 10.5 -10.5t-9.5 -13.5l-45.5 -41.5l-45.5 -41.5q-14 -13 -32 -6q-30 11 -58 9q-18 -1 -44.5 -11t-51 -30t-42 -51.5t-17.5 -75.5q0 -53 23 -84.5
t54 -47.5t62.5 -19.5t49.5 -0.5q32 5 57 22.5t45 43.5l9 10.5t6 4.5t7 -1.5t11 -7.5l39 -25t39 -26q14 -10 16 -16.5t-5 -21.5q-15 -34 -39 -60t-55 -46q-36 -23 -74.5 -39.5t-83.5 -18.5q-92 0 -153.5 26t-100.5 65t-58.5 84.5t-28 84.5t-9 65z" />
<glyph glyph-name="uni042D" unicode="&#x42d;" horiz-adv-x="719"
d="M624 300q1 -40 -9 -80.5t-31 -78.5t-54 -62q-34 -25 -68.5 -44.5t-75.5 -32.5q-73 -23 -141.5 -11.5t-135.5 40.5q-52 22 -95 62q-5 5 -8.5 9.5t-0.5 12.5l27 65.5l27 64.5q5 13 17 19q18 9 34 -7q14 -14 29 -27t32 -24q49 -33 100 -32.5t103 23.5q41 18 55 64
q6 20 -14 20h-33t-58 -0.5t-58 -0.5h-34h-17t-17 1q-20 0 -20 21q0 11 -2 21t-2 21q-1 21 6.5 28.5t28.5 8.5q6 0 21.5 0.5t35.5 0.5h42.5h42.5t35.5 0.5t21.5 0.5q14 2 16 5.5t-2 16.5q-10 29 -32.5 44t-49.5 23q-92 26 -173 -18q-17 -9 -24.5 -5.5t-15.5 16.5l-24.5 39
l-23.5 39q-3 5 -6 9.5t-7 8.5q-10 12 -9.5 16t11.5 14q78 66 178 69q61 3 121 -6q56 -8 99.5 -37.5t78.5 -71.5q44 -52 64 -112.5t15 -132.5z" />
<glyph glyph-name="uni0417" unicode="&#x417;" horiz-adv-x="593"
d="M403 626q44 -21 65.5 -57.5t23.5 -75.5t-13.5 -74.5t-45.5 -54.5q-6 -4 -9 -7q-4 -4 -4 -6.5t6 -6.5q11 -7 21 -15l20 -16q18 -16 28 -41.5t12 -53.5t-4 -54.5t-19 -44.5q-39 -54 -90 -83.5t-115 -38.5q-16 -2 -31.5 -3t-30.5 -1q-29 -2 -54.5 4t-49.5 16.5t-47.5 23.5
l-46.5 27q-8 5 -11.5 13.5t0.5 18.5l22.5 52l22.5 52q2 4 8 6t11 1t9.5 -4.5t9.5 -5.5q35 -20 72.5 -34t79.5 -17q21 -2 38 6l34 16q5 3 8.5 10t5 15.5t1.5 17.5t-3 15q-17 42 -60 48q-14 2 -27.5 2t-27.5 1q-16 0 -16 15q-2 18 -3.5 36.5t-3.5 36.5q18 5 35.5 8.5t35.5 8.5
l24 8t23 12q14 10 20.5 23t5 26t-10 24.5t-24.5 19.5q-20 11 -41 13t-44 -6t-45 -16.5t-43 -20.5q-19 -11 -27 -9.5t-20 21.5q-13 20 -25 40.5t-23 41.5q-2 4 -1 10t4 10q5 5 11 9t13 7q44 24 87 32t91 20q6 2 24.5 3t43 -0.5t51 -6.5t49.5 -17z" />
<glyph glyph-name="one" unicode="1" horiz-adv-x="478"
d="M387 29q1 -6 0.5 -14.5t-2.5 -10.5q-5 -4 -9.5 -3.5t-10.5 0.5q-29 -1 -58 -1h-58q-14 0 -18.5 5t-5.5 21q-3 78 -3 157q-1 50 0 99t1 99v12t-1 11q-1 6 -4.5 8t-8.5 -3l-10.5 -8t-10.5 -9l-34.5 -29.5t-35.5 -29.5q-14 -11 -22.5 -10.5t-20.5 13.5q-17 19 -33 39l-33 40
q-13 16 2 31l21 19t20 20q36 38 76 70l82 65q10 8 20.5 13t23.5 4q30 0 58.5 1t58.5 -1q14 -1 17 -4t4 -19q0 -15 -0.5 -31t-0.5 -31q0 -35 0.5 -69t0.5 -68q-2 -105 -3 -189q0 -36 -0.5 -70.5t-1 -62t-0.5 -45v-19.5z" />
<glyph glyph-name="two" unicode="2" horiz-adv-x="541"
d="M225 0h-183q-14 0 -21.5 1t-11.5 5t-4.5 12t-0.5 22v39t-1 38q-2 28 19 44l40 32l40 31q40 30 74 65t62 77q11 16 14.5 33.5t-3.5 36.5q-11 37 -51 40q-23 2 -42.5 -5t-36.5 -21q-17 -16 -33 0l-36 35.5l-36 35.5q-7 6 -5.5 12t6.5 12q33 39 75 61q47 26 96 35.5
t103 -2.5q28 -6 51.5 -20.5t40.5 -33.5t28 -41t15 -44q16 -87 -13.5 -155t-91.5 -125l-30.5 -27.5l-30.5 -27.5q-2 -2 -2.5 -6t-0.5 -7q0 -1 3.5 -2.5t5.5 -1.5h144q5 0 9.5 0.5t9.5 0.5q14 2 16 -12q2 -28 0.5 -55t-0.5 -54q0 -17 -6 -22t-22 -7h-43q-20 0 -45 0.5l-48 1
t-38.5 0.5t-15.5 -1z" />
<glyph glyph-name="zero" unicode="0" horiz-adv-x="552"
d="M462 311q-3 -32 -4.5 -59.5t-5.5 -53.5q-8 -65 -36 -115t-82 -86q-30 -20 -68 -21.5t-72 5.5q-37 7 -68.5 25t-58.5 44q-20 19 -30.5 43t-15.5 50q-15 74 -17.5 147.5t12.5 148.5q7 34 17 65t34 57l26 28t27 25q42 32 92.5 35t98.5 -15q65 -23 97.5 -71t41.5 -114
q5 -36 7.5 -71.5zM318 298v34q0 14 0.5 29.5t0.5 26.5q0 23 -8 44.5t-21 40.5q-6 9 -15.5 15t-21.5 8.5t-24.5 0.5t-23.5 -11q-22 -17 -31 -38.5t-14 -45.5q-11 -51 -8 -101t11 -101q2 -13 6.5 -25.5t12.5 -23.5q9 -14 23.5 -21t30.5 -6t30.5 8.5t22.5 22.5q9 15 16 31t7 33
q0 20 3 39.5t3 39.5z" />
<glyph glyph-name="three" unicode="3" horiz-adv-x="594"
d="M226 -12q-22 0 -47.5 9t-48.5 18q-35 13 -66 34l-62 43q-5 4 -8.5 9t1.5 13l60 90q7 11 18 3l25 -18l24 -18q28 -15 55.5 -21.5t56.5 -7.5q22 -2 43.5 8.5t32.5 30.5q5 10 5 22.5t-4 24t-12 21t-18 14.5q-12 6 -25.5 7.5t-30.5 0.5q-8 3 -13 7t-6 14q-2 13 -1.5 26
t-1.5 27q-3 19 18 29l18.5 5.5l16.5 5t16 6t19 10.5q5 3 9.5 12t7.5 20t4 21.5t0 16.5q-2 6 -8 14.5t-17.5 14.5t-28 6t-38.5 -11q-13 -8 -26 -20.5t-24 -17.5q-13 -6 -20 -5.5t-18 10.5q-8 8 -15 17t-15 18q-12 14 -18.5 22.5t-6 15.5t7.5 14.5t22 20.5q42 35 88 58t103 23
q63 -1 105 -30.5t62 -87.5q15 -46 5.5 -89t-44.5 -79q-7 -8 -7 -13t10 -10q28 -15 43 -39.5t19 -52.5t-1 -57t-17 -52q-9 -17 -21.5 -43t-38.5 -50.5t-70.5 -42t-116.5 -17.5z" />
<glyph glyph-name="four" unicode="4" horiz-adv-x="593"
d="M472 329q0 -69 -1 -130.5t-1 -121.5q0 -16 1 -30.5t1 -30.5q1 -11 -4.5 -15t-19.5 -3q-27 1 -54.5 0t-54.5 -1q-20 1 -25 5t-5 24q-1 26 -1 53t-1 53q-1 17 -5.5 22t-21.5 7q-58 3 -116 2.5t-114 -0.5q-23 -3 -32.5 4.5t-11.5 29.5q-2 20 -2 39t-1 39q-1 19 13 35
l145 156.5l144 157.5q16 18 37 15q28 -2 55 -1t55 -1q21 0 21 -21q0 -20 1 -39t0 -39q-1 -54 -0.5 -108t-1.5 -101zM231 295h58q18 0 18 16q1 52 0 105q0 12 -6 14.5t-14 -5.5l-39.5 -38l-38.5 -39q-11 -11 -23.5 -22t-16.5 -28q7 -1 18 -1.5t20.5 -1t16.5 -0.5h7z" />
<glyph glyph-name="five" unicode="5" horiz-adv-x="583"
d="M233 640q39 1 77.5 1h77.5q17 0 20 -3t6 -19l8 -40.5l8 -40.5q1 -5 0.5 -9t-0.5 -9q-1 -15 -6 -19t-20 -4q-32 2 -65 2.5t-66 -0.5q-18 0 -23.5 -5.5t-8.5 -22.5q-2 -11 -6 -23.5t1 -20.5q3 -5 8 -5.5t10.5 1l11.5 3t12 1.5q42 -2 79.5 -14t70.5 -38q19 -14 30 -34
t19 -42q10 -26 10 -62.5t-8.5 -73t-25.5 -69.5t-41 -53q-21 -17 -44.5 -27.5t-49.5 -18.5q-66 -18 -130.5 -15t-129.5 23q-18 6 -35 17l-34 22q-21 13 -13 36l20 52.5t21 52.5q7 16 24 2q26 -23 56.5 -34.5t63.5 -16.5q29 -5 58 -3t56 17q10 6 19.5 14t16.5 18q9 13 11 28.5
t-2 30.5t-13.5 27.5t-24.5 20.5q-11 6 -24 10.5t-26 4.5q-27 0 -54 -1.5t-53 -15.5q-9 -7 -20 0q-24 16 -37.5 28t-18 25t-1.5 30.5t11 46.5l29 101.5l28 101.5q3 12 8 18t19 5q11 -1 26.5 -1h29.5h34z" />
<glyph glyph-name="six" unicode="6" horiz-adv-x="605"
d="M8 287q0 75 18 129.5t45 93t60 63t62 38.5t51 19.5t28 7.5q16 4 44 4t55.5 -2t48.5 -5.5t24 -7.5t6 -19.5t5 -34l4 -36.5l3 -27q1 -11 -2 -14t-14 -1q-8 1 -24.5 3.5t-37.5 4t-44 0.5t-42 -8q-12 -4 -28 -15t-31.5 -26.5t-29 -35t-19.5 -41.5q-1 -3 -1 -8t2 -6
q2 -2 7 -0.5t7 3.5q21 17 44.5 24.5t49.5 11.5q34 6 65.5 -1t62.5 -22q18 -9 32.5 -27t25.5 -42t17 -53t6 -59q0 -61 -26.5 -104t-91.5 -82q-47 -24 -92.5 -27.5t-87.5 8.5t-78.5 36.5t-63.5 56.5q-18 21 -29.5 48.5t-18 55.5t-9.5 53.5t-3 43.5zM285 148q7 0 10.5 -0.5
t5.5 -0.5q26 0 42.5 16.5t16.5 43.5q-1 52 -58 52q-33 -2 -53 -23l-11.5 -13t-10.5 -13q-13 -17 -8.5 -31t24.5 -22q11 -4 22.5 -5.5t19.5 -3.5z" />
<glyph glyph-name="seven" unicode="7" horiz-adv-x="573"
d="M225 637q39 0 78 -0.5t78 -1.5q17 -1 35.5 0.5t35.5 -0.5q12 -1 18 -7.5t7 -17.5q2 -16 0.5 -34t-0.5 -34q1 -4 -1.5 -8.5t-4.5 -8.5q-35 -54 -61.5 -111l-52.5 -115l-64 -137.5l-64 -137.5q-5 -10 -12 -17t-20 -7h-140q-17 0 -10 15l12.5 24l12.5 24l91.5 191.5
l91.5 191.5q12 25 9 30t-32 5h-100.5t-100.5 -1q-11 0 -17 3.5t-7 14.5q-2 29 -1.5 58.5t-0.5 58.5q-1 20 21 22h20q22 0 53 -0.5t59 -0.5t47.5 0.5z" />
<glyph glyph-name="eight" unicode="8" horiz-adv-x="541"
d="M245 653q41 0 74.5 -13.5t60.5 -45.5q16 -20 23.5 -45t7.5 -51.5t-6 -50.5t-18 -42q-9 -13 -8 -16.5t12 -14.5q43 -39 61.5 -87.5t16.5 -105.5q-2 -39 -22.5 -74.5t-51 -63.5t-68 -44.5t-73.5 -17.5q-61 2 -117 28t-92 68.5t-44.5 98t27.5 115.5q26 47 70 81
q9 7 11.5 13.5t-4.5 17.5q-9 14 -12 30.5l-6 33.5q-6 35 3 65t27 58q21 31 54.5 47t73.5 16zM309 186q0 11 -4.5 24t-11.5 25t-16 22t-19 15q-7 5 -17 1q-20 -10 -36 -23.5t-24 -34.5q-6 -13 -3 -28q2 -13 11.5 -24.5t22 -20t27 -11.5t27.5 0q8 2 16 8t14 13.5t9.5 16
t3.5 17.5zM248 522q-14 -1 -22 -6t-9 -15q-2 -23 4 -42.5t25 -33.5q2 -2 6 -2t6 2q12 14 19.5 30.5t5.5 36.5q-3 32 -35 30z" />
<glyph glyph-name="nine" unicode="9" horiz-adv-x="604"
d="M505 337q-2 -44 -7.5 -86t-20.5 -83q-38 -101 -132 -147q-145 -71 -286 15l-23 14t-23 15q-15 12 -4 31q14 23 27 47t27 47q5 8 9.5 10t14.5 -3q40 -24 83 -43q29 -14 58.5 -11t58.5 14q33 13 48 39t18 62q1 7 -3 9t-9 -2q-5 -2 -8.5 -5t-8.5 -5q-103 -60 -198 17
q-20 16 -36.5 33t-28.5 39q-13 22 -18.5 49.5t-3 55t12 53.5t25.5 46q22 27 52 52.5t62 36.5q12 6 35.5 8t50.5 0.5t53.5 -7t46.5 -15.5q52 -25 77 -68.5t37 -94.5q8 -30 9.5 -61t4.5 -62zM322 431q1 18 -5.5 33t-17 24.5t-25 13t-30.5 -0.5q-14 -4 -25 -12.5t-13 -22.5
q-3 -16 -6.5 -32.5t9.5 -33.5q11 -14 32.5 -21.5t40.5 -2.5q37 9 40 55z" />
<glyph glyph-name="hyphen" unicode="-" horiz-adv-x="302"
d="M125 293h95q11 0 9 -11l-3 -60q-1 -15 -5 -20t-19 -6q-20 -2 -39 -2h-39h-84q-17 0 -22.5 5t-10.5 20q-1 2 -1 3t-1 3q-2 26 -2.5 40t4.5 20t17.5 6h36.5h19t21 0.5t17 1z" />
<glyph glyph-name="equal" unicode="=" horiz-adv-x="396"
d="M29 308q-18 0 -20 20l-2 31.5t-1 31.5q0 11 4 14.5t15 4.5h17.5h39h52h55.5h50.5h36.5q19 0 20 -18q2 -12 4.5 -24.5t4.5 -24.5q3 -26 -22 -30q-4 -1 -21 -1.5t-41.5 -1t-53 -1l-55.5 -1t-49.5 -0.5h-33.5zM154 243h120q13 0 15 -2t1 -15q0 -17 0.5 -32.5t0.5 -31.5
q-1 -14 -5 -18t-18 -5h-11l-219 3q-19 0 -23.5 4t-6.5 23q-2 13 -1.5 26t0.5 27q-1 13 2.5 16.5t17.5 4.5h127z" />
<glyph glyph-name="parenleft" unicode="(" horiz-adv-x="323"
d="M246 -14q-5 -2 -9 -4t-9 -2q-22 0 -43.5 -0.5t-44.5 0.5q-13 2 -22 14l-23.5 33.5t-20.5 34.5l-28.5 63l-26.5 63q-11 25 -13 50t0 51q5 73 33.5 135t74.5 117q6 7 12 13t11 14q26 32 60.5 38t71.5 2q6 0 6.5 -4.5t-2.5 -8.5l-15 -20.5t-15 -18.5q-21 -23 -37 -49.5
t-29 -55.5q-26 -57 -31 -117t4 -121q6 -46 22 -87.5t37 -81.5q8 -15 17.5 -29z" />
<glyph glyph-name="parenright" unicode=")" horiz-adv-x="312"
d="M70 -20q-18 1 -27 2.5t-11.5 6t0.5 13.5t11 25l25 52l26 52q29 60 35.5 122t-4.5 127q-11 62 -36 116t-69 100q-6 7 -13 21q-5 11 -2 15t14 5h42t42 -1q5 -1 10.5 -4t9.5 -7q38 -36 65.5 -78.5t40.5 -93.5q14 -56 21.5 -112.5t-0.5 -115.5q-5 -41 -19 -79t-34 -73
q-11 -20 -24.5 -38.5t-24.5 -38.5q-11 -18 -32 -18h-35q-2 0 -4 1q-2 0 -3.5 0.5t-3.5 0.5z" />
<glyph glyph-name="period" unicode="." horiz-adv-x="229"
d="M84 -4q-4 1 -10.5 2t-14.5 2q-15 3 -26.5 12t-18.5 21.5t-9 28.5t3 32q8 26 34 38.5t55 3.5q18 -6 32 -15q42 -28 28 -73q-7 -23 -26.5 -37.5t-46.5 -14.5z" />
<glyph glyph-name="colon" unicode=":" horiz-adv-x="209"
d="M154 355q-5 -38 -38 -58q-13 -8 -30 -8.5t-32.5 5t-28.5 16t-18 24.5q-6 16 -2.5 31.5t13.5 29.5q13 19 36 28.5t44 2.5q24 -7 40 -27t16 -44zM75 0q-36 2 -54 20.5t-16 52.5q1 14 6.5 26.5t15 21.5t21.5 14t25 4q73 -5 70 -74q-1 -29 -20.5 -48t-47.5 -17z" />
<glyph glyph-name="comma" unicode="," horiz-adv-x="219"
d="M145 46q0 -20 -7.5 -40t-20 -37.5t-29.5 -30.5t-35 -18q-3 -1 -6.5 0t-6.5 1q1 3 1 6.5t1 6.5q2 6 5.5 12.5t5.5 12.5q4 14 2 18.5t-15 12.5q-24 15 -32 40t3 48q12 23 37 31.5t51 -1.5q14 -5 23 -10.5t14 -12t7 -16t2 -23.5z" />
<glyph glyph-name="semicolon" unicode=";" horiz-adv-x="239"
d="M159 49q0 -16 -4.5 -29.5t-12.5 -27.5q-15 -29 -39 -45t-53 -27q-5 -2 -9.5 0.5t-9.5 3.5q2 4 3.5 7.5t3.5 7.5q3 5 7 9.5t7 10.5q7 12 4.5 18.5t-13.5 15.5q-6 5 -11.5 9t-10.5 9q-12 13 -15 29.5t1.5 32.5t15 29t25.5 18q20 7 38.5 6.5t37.5 -5.5q19 -4 24 -24
q4 -11 6.5 -23.5t4.5 -24.5zM91 282q-17 0 -32 6t-27 16t-19.5 23t-7.5 27q0 15 6.5 29.5t17.5 26t25.5 18t29.5 6.5q36 0 60 -22.5t24 -54.5q-1 -33 -23 -54.5t-54 -20.5z" />
<glyph glyph-name="quotesingle" unicode="'" horiz-adv-x="833"
/>
<glyph glyph-name="slash" unicode="/" horiz-adv-x="323"
d="M57 -3q-9 0 -17.5 -0.5t-17.5 -0.5q-14 1 -17 4.5t1 17.5q11 42 19.5 84l17 84.5l17.5 85t21 83.5q14 49 25 97.5l23 97.5q2 8 3.5 12.5t4.5 7t7.5 3t12.5 0.5q39 1 78 0q14 0 18 -5t1 -19q-5 -26 -9.5 -52t-11.5 -52l-47 -195l-48 -195q-2 -10 -5 -19l-6 -18
q-8 -24 -31 -23q-10 1 -19.5 1h-19.5v1z" />
<glyph glyph-name="backslash" unicode="\" horiz-adv-x="344"
d="M195 -6q-1 0 -4 -1t-6 -1q-15 -2 -24.5 -1t-15.5 5t-10 13t-8 24l-29.5 116.5l-29.5 116.5q-6 26 -13.5 52.5t-13.5 53.5q-4 19 -6 38t-6 38l-10 39.5l-10 39.5q-2 5 -3 10l-2 10q-2 8 1 13t11 5q26 1 51 1.5t51 0.5q6 0 8.5 -4.5t4.5 -9.5l63 -257.5l62 -257.5
q2 -5 2.5 -10t1.5 -10q4 -16 0 -21t-19 -5q-11 -1 -21.5 0t-24.5 2z" />
<glyph glyph-name="plus" unicode="+" horiz-adv-x="407"
d="M175 425q23 -1 35.5 -1.5t18 -6t6 -17.5t-0.5 -36q-1 -2 -0.5 -3.5t0.5 -3.5q0 -17 1 -25t5.5 -11t13 -2.5t25.5 0.5h42q17 0 17 -17q0 -37 3 -71q1 -18 -15 -18q-17 -1 -32.5 -1t-31.5 -1q-14 0 -17 -3t-4 -17q-1 -12 -1 -27.5v-27.5q0 -24 -18 -19q-17 4 -33.5 3
l-33.5 -2t-22 5t-6 24q-1 11 -1 26v26q-1 19 -20 19q-8 -1 -16 -1h-16q-7 0 -13 -1t-12 0q-14 1 -22 2t-13 4.5t-6.5 11.5t-1.5 25q0 10 -1.5 19t-1.5 19q1 12 5 16.5t17 5.5q15 1 30 0t30 -1t23.5 1t12 4.5t4 12t0.5 23.5q-1 14 -1.5 25.5t-1.5 25.5q0 17 18 17
q9 0 18 -0.5t17 -1.5z" />
<glyph glyph-name="uni0410" unicode="&#x410;" horiz-adv-x="760"
d="M259 135q-11 0 -16.5 -1t-9 -3.5t-6 -8.5t-5.5 -16q-5 -18 -11 -35.5t-11 -35.5q-7 -34 -40 -34q-36 -2 -71.5 -2t-71.5 -1q-16 0 -11 16l47.5 144.5l46.5 145.5q14 44 26 87.5t26 87.5l20.5 60t19.5 61q6 20 18 28t30 8q21 -1 41.5 -1.5t40.5 -0.5q23 0 46 0.5t46 0.5
q13 0 25.5 0.5t25.5 0.5q12 0 19 -1t11 -4t6.5 -9.5t5.5 -18.5l40 -155.5l41 -155.5l32.5 -116l33.5 -115q6 -24 8.5 -36.5t-1 -18.5t-14 -6.5t-30.5 0.5q-34 0 -67.5 1l-67.5 2q-18 1 -21 18q-2 15 -5 30.5l-6 30.5q-2 8 -4 15t-4 15q-5 20 -24 20q-13 -1 -25.5 -0.5
t-24.5 0.5l-12 0.5t-29 1t-36 1t-32 0.5zM360 481q-2 3 -6 -6.5t-6 -12.5l-27 -81l-23 -65l-23 -66q-5 -14 -1.5 -18t18.5 -4q24 -1 48 -1h48q19 1 22 4.5t-2 23.5q-8 41 -17 81l-18 81q-2 7 -3.5 18t-3.5 21l-3.5 17.5t-2.5 7.5z" />
<glyph glyph-name="uni041D" unicode="&#x41d;" horiz-adv-x="667"
d="M554 94q1 -26 1.5 -41.5t0.5 -41.5q0 -11 -4.5 -14.5t-17.5 -2.5q-29 1 -58 1.5t-58 0.5q-17 0 -20.5 3t-4.5 20q-2 47 -4.5 96t-4.5 96v11t-1 12q0 12 -15 14q-40 2 -79.5 0.5t-78.5 0.5q-20 1 -18 -19q1 -49 -1 -95t0 -99q1 -7 1.5 -13.5t-0.5 -13.5q0 -14 -14 -14
q-10 0 -19.5 0.5t-19.5 1.5q-27 2 -54 0.5t-54 0.5q-18 2 -23 6.5t-5 21.5q0 56 -1 104.5t0 104.5q1 89 2.5 176.5t3.5 176.5v31q0 19 19 19q14 0 28.5 0.5t29.5 -0.5q20 -1 38.5 -1.5t38.5 -2.5t24.5 -5.5t4.5 -23.5q1 -48 1 -85.5t-1 -84.5q0 -18 0.5 -28.5t5 -15.5
t14.5 -6t28 -1q32 0 62.5 1.5t61.5 2.5q20 0 20 17q-1 5 -0.5 10t0.5 10q-2 54 -3 98t-3 98q-2 16 12 16h123q11 0 16 -1q15 -2 19.5 -6.5t5.5 -20.5q3 -72 3 -143q0 -39 -1 -77.5l-2 -77.5v-24v-57.5t0.5 -71t0.5 -64.5z" />
<glyph glyph-name="uni0415" unicode="&#x415;" horiz-adv-x="594"
d="M88 -1h-54q-22 -1 -25.5 3t-3.5 27q0 25 0.5 50t0.5 50v227t1 226q0 5 -0.5 8.5t-0.5 7.5q0 15 0.5 23.5t5 13t13 6t24.5 1.5h38t71 -0.5t88 -1t89.5 -0.5h75t44.5 1q21 0 26.5 -6.5t5.5 -24.5q0 -26 -0.5 -49.5t0.5 -48.5q0 -22 -21 -22q-12 0 -23.5 1t-23.5 1h-147h-81
q-15 0 -19 -4t-3 -19q1 -20 2 -36t2 -36q1 -22 22 -22h19.5h26h26h19.5q23 2 21 -20v-66q0 -11 -16 -13q-7 0 -19.5 -0.5t-26 -1.5t-26 -1.5t-19.5 -0.5q-11 -1 -16 -5.5t-5 -15.5v-78q-2 -21 21 -21q11 0 21 0.5t21 0.5q40 -1 79.5 -1t79.5 -1q16 0 31 0.5t31 0.5
q14 0 19.5 -4t6.5 -17q2 -26 3.5 -51t1.5 -51q0 -21 -6.5 -27t-27.5 -5h-41.5h-63h-75.5t-76.5 0.5t-67.5 0.5t-48 1z" />
<glyph glyph-name="question" unicode="?" horiz-adv-x="552"
d="M231 184q-14 0 -27 -0.5t-27 0.5t-19.5 7t-5.5 20q0 31 10 58t35 47q18 15 37 27t42 20q21 7 30 22.5t13 35.5q6 36 -24 57q-8 6 -13 7q-17 4 -38 3t-40.5 -7.5t-35.5 -18.5t-23 -29q-3 -6 -5 -12.5t-13 -8.5q-11 -3 -20 -3.5t-20 6.5q-18 13 -36.5 24l-37.5 22
q-11 6 -10.5 11.5t4.5 13.5q32 63 82 102t121 52q39 7 76.5 4t75.5 -14q42 -12 68 -41.5t40 -69.5q16 -44 10.5 -85.5t-24.5 -81.5q-6 -13 -17.5 -23t-22.5 -18t-23 -14t-23 -13q-23 -13 -39 -31t-21 -44q-3 -14 -10.5 -18.5t-18.5 -4.5q-7 0 -15 -0.5t-16 -0.5
q-9 -1 -19 -1zM316 56q0 -14 -2 -22.5t-7 -14.5t-13 -11t-21 -10q-31 -11 -63.5 -2t-48.5 36q-11 20 -8 40q4 33 31 53t63 17q31 -2 50.5 -26.5t18.5 -59.5z" />
<glyph glyph-name="exclam" unicode="!" horiz-adv-x="270"
d="M157 636q13 -1 21.5 -2.5t12.5 -5.5t5 -12t1 -21q-1 -26 -3 -51.5t-5 -50.5l-15.5 -125.5l-15.5 -125.5q-1 -5 -1 -9.5t-1 -9.5q-3 -17 -8 -21t-23 -4q-21 0 -42 1t-42 1q-15 0 -15 12q-2 21 -3 41.5l-2 40.5q-4 78 -7 152t-7 152q0 4 -0.5 7.5t-0.5 7.5q1 14 5 19t18 4
h27h38h37.5h25.5zM87 0q-34 1 -58 22t-23 50q0 18 7.5 33.5t19.5 27.5t27.5 19t32.5 7q16 0 31 -6.5t25.5 -17.5t16 -25.5t4.5 -30.5q-2 -15 -7.5 -29.5t-15.5 -26t-24.5 -18t-35.5 -5.5z" />
<glyph glyph-name="emdash" unicode="&#x2014;" horiz-adv-x="510"
d="M390 301q15 0 18 -2.5t4 -16.5q2 -17 2 -32.5t1 -32.5q0 -18 -16 -19l-30 -2t-30 -1q-26 0 -72 -1t-92.5 -2.5t-84 -2.5t-47.5 -2q-19 -1 -28 3t-10 25q-2 20 -0.5 34.5t-0.5 31.5q-2 11 2.5 14.5t16.5 4.5h38h63h76.5h77.5t67 0.5t45 0.5z" />
<glyph glyph-name="endash" unicode="&#x2013;" horiz-adv-x="375"
d="M154 296h120q13 0 15 -2t1 -16q0 -16 0.5 -31.5t0.5 -32.5q-1 -14 -5 -17.5t-18 -5.5h-11l-219 3q-19 0 -23.5 4t-6.5 23q-2 14 -1.5 27t0.5 26q-1 13 2.5 17t17.5 4q32 1 63.5 0.5t63.5 -0.5v1z" />
<glyph glyph-name="uni0430" unicode="&#x430;" horiz-adv-x="760"
d="M259 135q-11 0 -16.5 -1t-9 -3.5t-6 -8.5t-5.5 -16q-5 -18 -11 -35.5t-11 -35.5q-7 -34 -40 -34q-36 -2 -71.5 -2t-71.5 -1q-16 0 -11 16l47.5 144.5l46.5 145.5q14 44 26 87.5t26 87.5l20.5 60t19.5 61q6 20 18 28t30 8q21 -1 41.5 -1.5t40.5 -0.5q23 0 46 0.5t46 0.5
q13 0 25.5 0.5t25.5 0.5q12 0 19 -1t11 -4t6.5 -9.5t5.5 -18.5l40 -155.5l41 -155.5l32.5 -116l33.5 -115q6 -24 8.5 -36.5t-1 -18.5t-14 -6.5t-30.5 0.5q-34 0 -67.5 1l-67.5 2q-18 1 -21 18q-2 15 -5 30.5l-6 30.5q-2 8 -4 15t-4 15q-5 20 -24 20q-13 -1 -25.5 -0.5
t-24.5 0.5l-12 0.5t-29 1t-36 1t-32 0.5zM360 481q-2 3 -6 -6.5t-6 -12.5l-27 -81l-23 -65l-23 -66q-5 -14 -1.5 -18t18.5 -4q24 -1 48 -1h48q19 1 22 4.5t-2 23.5q-8 41 -17 81l-18 81q-2 7 -3.5 18t-3.5 21l-3.5 17.5t-2.5 7.5z" />
<glyph glyph-name="uni0431" unicode="&#x431;" horiz-adv-x="635"
d="M156 -12q-31 1 -61.5 1t-62.5 2q-17 1 -22 6t-5 22q1 34 1.5 67.5t1.5 68.5v135v246q0 44 -3 89q0 11 4 14.5t14 3.5h38.5h60.5t71.5 -0.5t73 -0.5h65.5t47 1q11 1 21.5 1.5t21.5 -0.5q18 -1 25 -8t6 -26q-1 -25 -3 -47.5t-4 -47.5q-1 -8 -2 -13t-3.5 -7t-7.5 -2.5
t-14 -0.5q-35 -1 -69.5 -0.5t-69.5 -0.5q-22 0 -45 -0.5t-44 -0.5q-16 0 -18 -16q-2 -17 -0.5 -33t0.5 -34q0 -9 5 -12t13 -3q28 -3 55.5 -2.5t56.5 0.5q29 -1 57 -7.5t56 -15.5q35 -12 60.5 -35t42.5 -55q14 -26 13 -51t-7 -62q-9 -56 -38 -90.5t-66.5 -53.5t-77.5 -25
t-73 -6h-21.5h-39h-37t-16.5 -1zM233 256q-8 2 -17 1t-19 0q-20 2 -21 -17q0 -23 -0.5 -44.5t-0.5 -44.5q0 -17 18 -20q57 -12 110 11q14 6 22.5 17t11.5 24t-0.5 25.5t-14.5 22.5q-10 8 -22.5 12.5t-25.5 7.5q-9 3 -19.5 4t-21.5 1z" />
<glyph glyph-name="uni0432" unicode="&#x432;" horiz-adv-x="646"
d="M429 377q14 -5 25 -10l22 -10q9 -4 20 -16t20.5 -32t16 -48.5t6.5 -64.5q0 -29 -14 -58t-35.5 -54.5t-47.5 -45t-50 -28.5q-36 -14 -73.5 -19t-75.5 -6q-2 0 -4 0.5t-4 -0.5q-17 -2 -49.5 -1.5t-65.5 1.5q-39 1 -82 2q-7 0 -12 2t-9 5t-6 9q-5 17 -5 33q-1 79 -1 157.5
v157.5q0 44 0.5 87t0.5 87q1 29 0.5 57.5t-2.5 57.5q0 15 12 15q64 1 120.5 2t120.5 0q23 0 45.5 -5t45.5 -11q29 -8 53 -25.5t44 -40.5q12 -15 17 -37q4 -20 6 -39.5t0.5 -37.5t-7.5 -35.5t-19 -33.5q-2 -3 -5 -6.5t-8 -8.5zM186 205v-26q-2 -20 -2 -30t4.5 -14t14.5 -4
t28 -1q30 -2 57 8t51 27q40 27 14 70q-10 15 -28 27q-29 19 -59.5 19.5t-62.5 -3.5q-10 -2 -13 -7t-3 -14q0 -7 -0.5 -15.5t-0.5 -16.5v-20zM183 478v-41.5t6 -19.5t20 -4t43 4q12 2 23 6.5t22 10.5q14 8 20 21.5t5 29.5t-11 25.5t-24 13.5q-12 3 -24.5 4l-25.5 2
q-12 1 -24 0t-23 -1q-2 -13 -3.5 -25.5t-3.5 -25.5z" />
<glyph glyph-name="uni0433" unicode="&#x433;" horiz-adv-x="542"
d="M8 293v50t-0.5 61l-1 64t-1 58.5t-1 44.5t-0.5 23v15t1 15q0 17 19 18q21 0 54.5 0.5t73 0.5h81h77.5t63.5 -0.5t38.5 -0.5q18 0 22 -4t6 -22q3 -31 2 -58.5t2 -58.5q2 -16 -2 -21.5t-19 -7.5q-6 -1 -33 -1.5t-61.5 -0.5t-69 -0.5t-56.5 -0.5q-16 0 -16 -17
q0 -4 -0.5 -7.5t-0.5 -7.5q1 -75 0 -156t1 -156q1 -23 0.5 -40t0.5 -40q1 -14 -2 -31q-3 -15 -19 -15q-38 -2 -72.5 -2.5t-71.5 -1.5q-8 0 -10.5 4t-3.5 10q-1 7 -1 13.5v13.5v130t-1 129h1z" />
<glyph glyph-name="uni0434" unicode="&#x434;" horiz-adv-x="792"
d="M570 179q1 -20 4.5 -24.5t23.5 -5.5q13 -1 25.5 -1t24.5 -1q15 0 21 -4t9 -18q1 -6 1 -12v-11q0 -33 0.5 -66t0.5 -66v-11.5t-1 -11.5q-3 -17 -22 -17q-21 0 -42.5 -0.5t-42.5 -0.5q-20 0 -17 20v3q0 17 -1 26t-5 13.5t-13 5.5t-25 1q-12 0 -42 0.5t-69 1t-82.5 1
t-82 0.5h-67.5t-39 -1q-4 -1 -8 -6t-5 -10q-2 -11 -1.5 -27t0.5 -27q0 -6 -2.5 -11t-10.5 -5q-26 -1 -55 -2t-55 0q-14 0 -18 5t-5 19q-2 44 -1 87t-1 87q-1 14 2.5 17.5t17.5 1.5q22 -3 36 16l27.5 35t24.5 37q22 39 39.5 79.5t27.5 84.5q2 9 8 31.5t12 49t10 51.5t4 40
q-1 20 1.5 36.5t3.5 36.5q1 19 20 18q49 0 97 0.5t96 -0.5q72 0 143 -3q17 -1 20.5 -5t3.5 -21q0 -19 0.5 -53.5t1.5 -77l2 -88.5t1.5 -88t1.5 -76.5t2 -52.5zM400 314v18t-1 44t-1.5 55t-1.5 51q0 5 -2 11t-4 6q-11 1 -22.5 1t-22.5 -2q-9 -2 -8.5 -9t-0.5 -14
q-2 -16 -3 -29t-3 -30q-8 -65 -27.5 -128t-51.5 -121q-1 -3 -2 -5.5t-2 -5.5q-3 -6 -0.5 -9.5t8.5 -3.5q31 0 67.5 1t67.5 2q17 0 17 17v17.5t-1 17.5q-2 29 -3 58t-3 58z" />
<glyph glyph-name="uni0435" unicode="&#x435;" horiz-adv-x="594"
d="M88 -1h-54q-22 -1 -25.5 3t-3.5 27q0 25 0.5 50t0.5 50v227t1 226q0 5 -0.5 8.5t-0.5 7.5q0 15 0.5 23.5t5 13t13 6t24.5 1.5h38t71 -0.5t88 -1t89.5 -0.5h75t44.5 1q21 0 26.5 -6.5t5.5 -24.5q0 -26 -0.5 -49.5t0.5 -48.5q0 -22 -21 -22q-12 0 -23.5 1t-23.5 1h-147h-81
q-15 0 -19 -4t-3 -19q1 -20 2 -36t2 -36q1 -22 22 -22h19.5h26h26h19.5q23 2 21 -20v-66q0 -11 -16 -13q-7 0 -19.5 -0.5t-26 -1.5t-26 -1.5t-19.5 -0.5q-11 -1 -16 -5.5t-5 -15.5v-78q-2 -21 21 -21q11 0 21 0.5t21 0.5q40 -1 79.5 -1t79.5 -1q16 0 31 0.5t31 0.5
q14 0 19.5 -4t6.5 -17q2 -26 3.5 -51t1.5 -51q0 -21 -6.5 -27t-27.5 -5h-41.5h-63h-75.5t-76.5 0.5t-67.5 0.5t-48 1z" />
<glyph glyph-name="uni0451" unicode="&#x451;" horiz-adv-x="594"
d="M475 634q19 0 21 -18q0 -4 0.5 -20t0.5 -34t-0.5 -33t-0.5 -16q-1 -14 -4.5 -18t-18.5 -4q-16 0 -52.5 -0.5t-78 -1t-78.5 -1.5t-54 -1q-15 0 -20.5 -5.5t-6.5 -19.5q-2 -20 -2 -32v-31q0 -20 23 -20q21 0 41.5 -1l41.5 -2q19 -2 15 -21q-2 -14 -1.5 -28.5t-1.5 -28.5
q-2 -17 -7.5 -21.5t-22.5 -4.5t-33 0.5t-33 0.5q-14 -1 -19 -5t-5 -18q1 -20 0 -40.5t1 -40.5q2 -17 7.5 -20.5t21.5 -2.5q27 0 56 0.5t56 0.5q34 -1 68 -1.5t68 -2.5q18 -1 24 -7t5 -23v-24.5t0.5 -28.5t0.5 -24.5v-12.5q-1 -16 -6.5 -21t-22.5 -5h-40h-75.5h-93.5h-93.5
h-76h-40.5q-13 0 -20 0.5t-10.5 4t-4.5 10.5t-1 19q-1 61 -1 120t-1 120v89q1 43 2 78.5t2 78.5q1 24 0 48t0 48q0 17 3.5 20.5t20.5 3.5q47 1 93 0.5t93 -0.5l28.5 0.5t69 0t85 -1.5t77.5 -2zM127 695q-16 1 -29.5 7t-23.5 16.5t-15.5 23.5t-4.5 28q1 13 7.5 25t16.5 21
t22.5 14.5t25.5 5.5q12 0 24.5 -6.5t22 -17t15.5 -23t6 -24.5q0 -15 -5.5 -28t-14.5 -22.5t-21.5 -15t-25.5 -4.5zM396 831q12 0 23.5 -5t20.5 -13.5t14 -19t5 -22.5q-1 -30 -18.5 -49.5t-44.5 -18.5q-29 0 -48 19.5t-19 49.5q-1 26 18 42.5t49 16.5z" />
<glyph glyph-name="uni0436" unicode="&#x436;" horiz-adv-x="927"
d="M352 369q2 0 3 12.5t2 29.5t1 36t-1 33q-2 38 -4.5 69.5t-4.5 69.5q-1 17 2.5 21t20.5 5q32 1 64 0.5t64 -0.5q11 0 13.5 -5t2.5 -15q0 -61 1 -116t2 -116v-8t2 -7q1 -2 4.5 -3t3.5 0q5 5 9 10t7 11l57.5 108t57.5 109q7 15 16.5 23t27.5 6q25 -2 50 -1t50 1q9 0 17 -1
t13 -12q4 -10 1 -17t-8 -15l-74.5 -114.5l-74.5 -114.5q-9 -15 -9 -29t8 -29l24 -46l30 -57l31.5 -60.5l28.5 -56l22 -44t12 -23.5q9 -19 -11 -22q-17 -3 -34 -3q-23 2 -46.5 1t-46.5 1q-19 1 -27 18l-59 114.5l-60 114.5q-2 3 -3.5 6.5t-3.5 7.5q-3 3 -6 3q-4 0 -4 -5
q-1 -7 -1.5 -13.5t-0.5 -13.5q2 -57 3 -111l2 -112q1 -10 -5 -16.5t-15 -3.5q-32 -1 -62 0.5t-61 -0.5q-17 -2 -20.5 2.5t-4.5 21.5l-2 114.5l-2 115.5v9.5t-1 9.5q0 5 -5 5q-5 2 -7 -2l-5.5 -7.5t-5.5 -8.5l-48.5 -81l-49.5 -82l-28 -44l-28 -44q-5 -8 -9.5 -9t-22.5 0
q-3 2 -18 2.5t-34.5 0.5h-39h-30.5q-29 2 -12 25q8 13 17 24t17 24l27.5 41.5l31.5 48.5l32 49.5l29 44.5l21 32.5t9 13.5q14 20 2 40l-21.5 39l-21.5 39q-23 38 -45 69t-45 69q-11 18 -21 36.5t-21 36.5q-10 17 11 17q13 0 33.5 -0.5t39.5 -0.5t33.5 -0.5t16.5 -0.5
q10 2 22 1.5t18 -4.5q9 -6 14.5 -17l10.5 -21l30 -55.5l30 -52l30 -51.5l31 -55q2 -3 4 -9t7 -6z" />
<glyph glyph-name="uni0437" unicode="&#x437;" horiz-adv-x="593"
d="M403 626q44 -21 65.5 -57.5t23.5 -75.5t-13.5 -74.5t-45.5 -54.5q-6 -4 -9 -7q-4 -4 -4 -6.5t6 -6.5q11 -7 21 -15l20 -16q18 -16 28 -41.5t12 -53.5t-4 -54.5t-19 -44.5q-39 -54 -90 -83.5t-115 -38.5q-16 -2 -31.5 -3t-30.5 -1q-29 -2 -54.5 4t-49.5 16.5t-47.5 23.5
l-46.5 27q-8 5 -11.5 13.5t0.5 18.5l22.5 52l22.5 52q2 4 8 6t11 1t9.5 -4.5t9.5 -5.5q35 -20 72.5 -34t79.5 -17q21 -2 38 6l34 16q5 3 8.5 10t5 15.5t1.5 17.5t-3 15q-17 42 -60 48q-14 2 -27.5 2t-27.5 1q-16 0 -16 15q-2 18 -3.5 36.5t-3.5 36.5q18 5 35.5 8.5t35.5 8.5
l24 8t23 12q14 10 20.5 23t5 26t-10 24.5t-24.5 19.5q-20 11 -41 13t-44 -6t-45 -16.5t-43 -20.5q-19 -11 -27 -9.5t-20 21.5q-13 20 -25 40.5t-23 41.5q-2 4 -1 10t4 10q5 5 11 9t13 7q44 24 87 32t91 20q6 2 24.5 3t43 -0.5t51 -6.5t49.5 -17z" />
<glyph glyph-name="uni0438" unicode="&#x438;" horiz-adv-x="750"
d="M7 616q0 18 4.5 21.5t23.5 1.5q20 -2 40.5 -1.5t40.5 -0.5q12 0 24.5 1t25.5 -1q15 -2 20.5 -8.5t5.5 -22.5q1 -5 0.5 -9.5t-0.5 -9.5v-264v-13.5t1 -13.5q0 -7 5 -9q6 0 9 5q4 3 7 7t5 8q51 71 100.5 148.5t99.5 147.5q12 20 28 28.5t43 7.5q26 -3 53.5 -2t53.5 0
q24 -2 31 -9t6 -31q-2 -102 -1.5 -209.5t-1.5 -209.5q-1 -39 0 -73.5t2 -73.5q0 -7 0.5 -12t-0.5 -12q-1 -9 -6 -14.5t-15 -3.5q-32 1 -65 2.5t-66 0.5q-7 0 -14 0.5t-13 3.5q-4 2 -7.5 7t-3.5 10q2 37 0 80t0 80q1 37 1 73.5t1 73.5q0 2 -1 6t-5 4q-3 0 -4.5 -2t-3.5 -4
q-48 -59 -96 -127.5t-88 -134.5l-15.5 -24l-15.5 -24q-9 -15 -22 -19t-29 -6q-12 -1 -23.5 -0.5t-23.5 0.5q-20 1 -40.5 -0.5t-40.5 0.5q-23 2 -27.5 8t-3.5 30q2 37 2.5 73.5t0.5 73.5q0 38 -1 75.5l-2 75.5l0.5 15t0.5 39v55v63.5v63.5v55z" />
<glyph glyph-name="uni0439" unicode="&#x439;" horiz-adv-x="708"
d="M6 621q0 16 6 23t21 5q35 -2 67.5 0t67.5 -2q22 -2 20 -23v-35.5v-61.5t0.5 -73.5t1 -71t1.5 -53.5t2 -21q11 0 15 6q14 17 26.5 34l25.5 34l45.5 65l45.5 65l39.5 55l39.5 56q5 7 8.5 11t9 6.5t13 3t21.5 0.5h78q16 0 24 -0.5t12 -3.5t4.5 -10.5t1.5 -20.5
q1 -25 1.5 -73t0.5 -106.5v-121t-0.5 -115t-0.5 -89.5v-45q0 -12 0.5 -20.5t-1.5 -20.5q-2 -13 -7 -17t-19 -3q-26 2 -52.5 0.5t-52.5 0.5q-9 1 -21.5 0t-15.5 2t-2 19t0 27q0 44 0.5 79t-0.5 79q0 23 -0.5 46.5t-1.5 46.5q0 7 -4 10q-4 2 -9 -3q-4 -4 -10 -12l-79 -103.5
l-79 -103.5q-14 -20 -28.5 -37t-28.5 -37q-10 -15 -29 -15q-35 2 -69.5 1t-69.5 1q-8 0 -10.5 4t-3.5 11v13.5t-1 13.5q0 70 -0.5 139.5t-1.5 140.5q-1 0 -1 21v52.5v69v71v57.5v29zM308 710q-15 0 -29 6t-24 15.5t-16 21.5t-5 25q2 29 25 48.5t55 18.5q65 -1 68 -72
q1 -12 -5.5 -23.5t-17 -20.5t-24 -14t-27.5 -5z" />
<glyph glyph-name="uni043A" unicode="&#x43a;" horiz-adv-x="677"
d="M7 611q0 15 4 19.5t18 3.5q24 0 45 -1t46 -2q5 -1 11 -1h12q20 0 24 -3.5t5 -23.5q2 -32 2.5 -64t1.5 -64q1 -6 0 -11.5t0 -11.5l2 -10.5t3 -10.5q5 2 9 4.5t7 5.5l89 86.5l88 87.5q11 10 22 16.5t25 5.5q38 -1 75.5 -1.5t75.5 -1.5q3 0 7 -3t5 -5q1 -3 -1 -7.5t-4 -6.5
l-76 -77.5l-76 -77.5q-14 -14 -28.5 -26.5t-28.5 -26.5q-14 -13 -14.5 -18t9.5 -21l41.5 -67.5l42.5 -67.5l61 -96.5l61 -96.5q8 -12 3.5 -22t-18.5 -12q-5 -1 -11 -1h-12q-21 -1 -42.5 -1t-42.5 -2q-23 -2 -39.5 6.5t-29.5 26.5q-14 20 -31 47t-31 47l-42 60.5l-42 60.5
q-8 12 -13.5 12.5t-16.5 -9.5q-20 -16 -19 -44q2 -45 2.5 -89t1.5 -89q1 -20 -3.5 -25.5t-23.5 -5.5q-30 0 -64.5 1t-64.5 3q-23 1 -24 25q-1 18 -1 63v103.5v124v124.5v105v65z" />
<glyph glyph-name="uni043B" unicode="&#x43b;" horiz-adv-x="750"
d="M635 356q0 -48 -0.5 -95t0.5 -95q1 -42 2 -76t3 -76q1 -17 -13 -17q-35 1 -70 1.5t-70 1.5q-10 0 -12 5t-2 13v54.5t-1 55.5l-3 213q-1 25 0 50t0 51q0 11 -1 17.5t-4.5 9.5t-10 4t-18.5 2h-8q-10 0 -15.5 -0.5t-9 -2.5t-6 -7.5t-5.5 -14.5l-23.5 -84t-25.5 -83
q-15 -45 -32 -89.5t-39 -86.5q-12 -23 -31.5 -42.5l-39.5 -38.5q-17 -17 -39 -23.5t-46 -7.5q-33 -2 -64 5t-61 18q-14 5 -17.5 11.5t-1.5 21.5q6 29 11.5 59t12.5 59q4 21 25 15l9 -3.5l9 -3.5q31 -11 59.5 -2.5t46.5 35.5q8 12 14.5 25t10.5 27l27 91.5t24 91.5
q11 42 19 85t17 85q3 17 7.5 21.5t21.5 6.5q4 0 8 0.5t7 -0.5q17 0 43 0.5t56.5 0.5h62.5h61h52h35q18 -1 21.5 -5t3.5 -23q0 -47 -0.5 -93t-1.5 -93v-21.5t0.5 -24t1 -20z" />
<glyph glyph-name="uni043C" unicode="&#x43c;" horiz-adv-x="979"
d="M5 622q0 12 3.5 16t16.5 5q15 1 40.5 1t51 -1t45 -1t24.5 1q18 4 25 -12q28 -58 52.5 -103l47 -84.5l44.5 -77.5l45 -81q8 -15 17 -26q7 -11 15 0l102 165l23.5 40l31.5 56l29 53.5l17 32.5q16 36 55 33q30 -2 60 -2.5t60 -1.5q10 0 19 -3q8 -2 13 -6.5t5 -14.5
q0 -41 1 -81.5l2 -81.5q2 -66 2.5 -132t2.5 -132l2 -81l2 -82q1 -18 -7 -25t-25 -6l-105 3q-12 0 -19 1t-10 4t-3.5 9t-0.5 18q0 68 -0.5 131.5t-0.5 132.5v9.5t-1 9.5t-1.5 11t-4.5 6q-3 1 -9.5 -7.5t-8.5 -10.5l-85.5 -128.5t-78.5 -131.5q-2 -3 -3.5 -6.5t-3.5 -6.5
q-10 -16 -15 -25t-11 -12.5t-16 -4t-30 -0.5q-30 1 -59 0q-26 -3 -34 23l-5.5 15t-5.5 14q-11 25 -22 46t-22 46l-16.5 35.5l-16.5 35.5q-6 13 -11.5 26.5t-12.5 26.5q-5 11 -13.5 26t-12.5 15q-1 0 -1.5 -14.5t-0.5 -38v-53.5t0.5 -60l1 -57.5t0.5 -47.5v-11t-1 -12
q-3 -21 -24 -19q-32 1 -63.5 0t-63.5 1q-18 1 -22.5 5.5t-5.5 21.5q-1 29 -1 53t-1 53q-1 39 -1.5 77.5t-0.5 77.5q0 13 0.5 25.5t0.5 24.5v15v39.5v56v64.5t-0.5 64t-0.5 56z" />
<glyph glyph-name="uni043D" unicode="&#x43d;" horiz-adv-x="667"
d="M554 94q1 -26 1.5 -41.5t0.5 -41.5q0 -11 -4.5 -14.5t-17.5 -2.5q-29 1 -58 1.5t-58 0.5q-17 0 -20.5 3t-4.5 20q-2 47 -4.5 96t-4.5 96v11t-1 12q0 12 -15 14q-40 2 -79.5 0.5t-78.5 0.5q-20 1 -18 -19q1 -49 -1 -95t0 -99q1 -7 1.5 -13.5t-0.5 -13.5q0 -14 -14 -14
q-10 0 -19.5 0.5t-19.5 1.5q-27 2 -54 0.5t-54 0.5q-18 2 -23 6.5t-5 21.5q0 56 -1 104.5t0 104.5q1 89 2.5 176.5t3.5 176.5v31q0 19 19 19q14 0 28.5 0.5t29.5 -0.5q20 -1 38.5 -1.5t38.5 -2.5t24.5 -5.5t4.5 -23.5q1 -48 1 -85.5t-1 -84.5q0 -18 0.5 -28.5t5 -15.5
t14.5 -6t28 -1q32 0 62.5 1.5t61.5 2.5q20 0 20 17q-1 5 -0.5 10t0.5 10q-2 54 -3 98t-3 98q-2 16 12 16h123q11 0 16 -1q15 -2 19.5 -6.5t5.5 -20.5q3 -72 3 -143q0 -39 -1 -77.5l-2 -77.5v-24v-57.5t0.5 -71t0.5 -64.5z" />
<glyph glyph-name="uni043E" unicode="&#x43e;"
d="M654 323q-2 -46 -20 -97.5t-51 -101.5q-35 -51 -83 -82t-103 -52q-16 -6 -34.5 -10t-37.5 -5.5t-37.5 -0.5t-34.5 5q-18 4 -46 15.5t-60 29t-64 41.5t-58 54q-23 27 -34.5 59.5t-13.5 68.5q-3 54 4.5 106t30.5 102q12 26 32 54.5t51 54.5t74 48t102 36q29 6 65.5 5
t74.5 -11q28 -7 56.5 -22t53.5 -33t44 -36.5t30 -32.5q31 -40 44.5 -86t14.5 -109zM302 154q27 -1 48.5 2.5t41.5 14.5q51 32 73 79t11 106q-5 29 -20.5 53t-38.5 41t-50.5 25t-56.5 4t-55.5 -12.5t-45.5 -31.5q-37 -42 -51 -91.5t1 -106.5q3 -10 10.5 -20t15.5 -17
q27 -22 56.5 -35t60.5 -11z" />
<glyph glyph-name="uni043F" unicode="&#x43f;" horiz-adv-x="688"
d="M561 353q-2 -58 -3 -115l-2 -114q-1 -26 0.5 -47.5t2.5 -47.5q0 -15 -3.5 -19.5t-17.5 -5.5l-65.5 -4t-65.5 -3q-19 -1 -19 23q0 38 0.5 70.5t0.5 70.5q0 63 0.5 124.5t-0.5 123.5q0 27 -1 39t-6 16.5t-17 4t-34 0.5q-29 1 -58 1.5t-58 -0.5q-19 0 -23.5 -4.5t-4.5 -21.5
v-175q1 -58 1.5 -116t1.5 -116q0 -5 -1 -8q-1 -13 -2 -20t-5 -10t-11 -3.5t-20 -0.5q-28 1 -56 1.5t-56 3.5q-22 2 -27 8.5t-5 28.5v450v133q0 14 3 16t18 1q48 -2 94.5 -1.5t94.5 0.5q66 -1 129 2t127 0q16 0 31 -0.5t31 -0.5q15 0 18.5 -3t3.5 -18v-93q0 -21 0.5 -50
l1 -56t1.5 -45.5z" />
<glyph glyph-name="uni0440" unicode="&#x440;" horiz-adv-x="615"
d="M6 483q1 36 1.5 63.5t1.5 62.5q0 10 0.5 16t3.5 9t8.5 4t15.5 2q8 1 15.5 0.5t15.5 -0.5q11 0 23 0.5t23 0.5q7 0 23 0.5t34 2t34.5 2t23.5 0.5q20 -2 39 -3.5t38 -3.5q45 -5 81.5 -25t70.5 -47q5 -4 8.5 -8t8.5 -9q24 -22 35.5 -43.5t13.5 -44.5t-3 -48t-14 -55
q-21 -67 -60 -104t-102 -56q-35 -11 -70.5 -13t-72.5 0q-23 2 -28 -2.5t-6 -27.5q-1 -34 -0.5 -68t0.5 -68q0 -20 -5 -25t-26 -4l-55.5 2l-56.5 2q-19 1 -20 23q-1 27 -1 54v54v202v17v41t0.5 50.5t1.5 46.5zM230 495q-8 0 -17 -0.5t-17 -0.5q-9 -1 -14.5 -4.5t-6.5 -13.5
q0 -29 -0.5 -60t-1.5 -60q0 -15 16 -17q36 -4 70 0.5t66 21.5q18 10 28 26q8 12 10 28.5t-3 31.5t-16 26.5t-29 14.5q-11 2 -25 3.5t-27.5 2.5t-23 1h-9.5z" />
<glyph glyph-name="uni0441" unicode="&#x441;" horiz-adv-x="688"
d="M-20 334q0 53 15.5 96.5t40.5 77t55.5 59t61 42.5t57 27t42.5 13q94 20 179 -19q19 -8 37.5 -19.5l35.5 -22.5q11 -6 10.5 -10.5t-9.5 -13.5l-45.5 -41.5l-45.5 -41.5q-14 -13 -32 -6q-30 11 -58 9q-18 -1 -44.5 -11t-51 -30t-42 -51.5t-17.5 -75.5q0 -53 23 -84.5
t54 -47.5t62.5 -19.5t49.5 -0.5q32 5 57 22.5t45 43.5l9 10.5t6 4.5t7 -1.5t11 -7.5l39 -25t39 -26q14 -10 16 -16.5t-5 -21.5q-15 -34 -39 -60t-55 -46q-36 -23 -74.5 -39.5t-83.5 -18.5q-92 0 -153.5 26t-100.5 65t-58.5 84.5t-28 84.5t-9 65z" />
<glyph glyph-name="uni0442" unicode="&#x442;" horiz-adv-x="615"
d="M468 637q7 -1 13.5 -1t13.5 -2q20 -3 25 -8t5 -26q0 -26 -0.5 -47t-1.5 -47q-1 -17 -5 -21t-20 -3q-12 0 -30.5 -0.5t-36.5 -0.5t-32.5 -0.5t-17.5 -0.5q-15 0 -23.5 -1t-12 -5t-4 -12t0.5 -23v-32.5t-1 -75.5t-1.5 -97.5t-1.5 -97.5t-1.5 -75t-0.5 -31q-3 -30 -32 -31
h-21.5h-26t-22.5 0.5t-12 0.5q-16 0 -25 0.5t-13 4.5t-5 12.5t-1 24.5v33t0.5 60t1 77l1 83t0.5 77.5v61.5v27q1 17 -19 19q-13 0 -34 1t-41.5 1.5t-37 1.5t-19.5 1q-15 1 -20 6t-5 20v39t1 39v12q0 9 -1 19t4 16q3 5 13.5 3.5t19.5 -1.5q13 0 46.5 0.5t76.5 0.5t91 -0.5
t91 -0.5t76 -0.5t45 -0.5z" />
<glyph glyph-name="uni0443" unicode="&#x443;"
d="M159 641q14 0 22 -1.5t11.5 -5t3.5 -11t-2 -19.5q-5 -29 -0.5 -56t12.5 -54q16 -53 53 -81t84 -45q13 -5 17.5 -2t11.5 18l24 59l23 60l21 56l21 56q5 18 21 18l70 2t70 0q23 0 30 -9t-1 -32q-21 -62 -45 -120q-35 -94 -79 -181.5t-94 -173.5q-16 -28 -38 -49t-49 -38
q-28 -17 -57.5 -30.5t-64.5 -16.5q-20 -1 -40 -0.5t-40 7.5q-28 9 -55.5 17t-52.5 25q-15 10 -16.5 14.5t5.5 22.5q10 28 18.5 55.5t19.5 54.5q8 22 18.5 24.5t30.5 -11.5q11 -8 22.5 -14.5t24.5 -11.5q38 -14 74 2t57 47q11 14 -7 20l-39 16l-39 16q-38 17 -68.5 42.5
t-56.5 54.5q-27 31 -40.5 68t-20.5 77q-5 29 -8 54.5t-6 55.5q-1 14 2 17.5t17 3.5h28.5h40.5t39.5 -0.5t26.5 -0.5z" />
<glyph glyph-name="uni0444" unicode="&#x444;" horiz-adv-x="812"
d="M457 646q4 -3 5 -14t1.5 -24t0.5 -23.5t2 -12.5q2 -5 7.5 -6l10.5 -2q88 -8 144 -38t76 -71q19 -41 30 -84q16 -66 -4 -121.5t-61 -103.5q-29 -35 -70 -53.5t-87 -24.5q-17 -3 -25.5 -5t-13 -6.5t-5 -13.5t-0.5 -25v-16q0 -18 -19 -21q-33 -3 -65.5 -3.5t-65.5 6.5
q-20 3 -20 23q-1 14 -2.5 28.5t-2.5 28.5q-14 3 -28 5.5t-28 5.5q-20 5 -39.5 9t-39.5 10q-26 9 -50.5 23t-45 35t-34.5 49t-20 64q-10 57 4.5 107.5t45.5 97.5q17 25 40 42t51 28q29 12 60.5 19t63.5 8q10 0 16 1t8.5 4t3 9.5t0.5 17.5v15q-3 27 5.5 33.5t33.5 8.5
q6 1 23.5 0.5t37 -1.5t36 -3.5t20.5 -5.5zM298 337h1q0 17 0.5 33t0.5 33q-1 17 -4 22t-21 3q-9 0 -26.5 -8.5t-34.5 -23t-29.5 -33.5t-11.5 -41q1 -32 13.5 -53.5t28 -34.5t32 -18t27.5 -5q9 1 15.5 3t7.5 16q0 27 0.5 53.5t0.5 53.5zM462 225q0 -17 15 -14q24 5 45.5 14.5
t35.5 29.5q20 26 21.5 56t-9.5 61q-11 26 -32 35t-44 14q-2 0 -8 2q-14 2 -18 -0.5t-5 -16.5q0 -11 -0.5 -36t-0.5 -53.5v-54v-37.5z" />
<glyph glyph-name="uni0445" unicode="&#x445;" horiz-adv-x="770"
d="M649 -3q-47 -2 -90.5 -1t-89.5 -1q-11 0 -17 4t-11 12q-14 18 -27.5 39t-27.5 40l-22.5 30.5l-22.5 30.5q-14 19 -19 19t-18 -19l-31.5 -47l-31.5 -48l-8 -10.5t-7 -11.5q-26 -54 -88 -48q-32 -1 -54.5 0t-48.5 1q-10 0 -22 5q-12 3 -5 15l48.5 73l48.5 73l49 75l50 74
q8 11 7 19.5t-8 17.5l-44.5 62.5l-43.5 62.5l-49.5 74l-49.5 74q-2 5 -4 9t-4 9q-3 12 10 12q41 1 81.5 1.5t81.5 1.5q8 0 12 -3.5t8 -9.5l50 -69.5l50 -69.5q2 -3 5 -6t5 -6q11 -14 21 0q5 8 10.5 15.5l11.5 15.5l38 54t37 56q15 21 38 21q33 0 66 0.5t67 1.5q9 0 12 -5
t2 -13q-3 -12 -10 -24l-55.5 -85l-54.5 -84l-28 -45.5l-29 -44.5q-6 -9 -3.5 -14.5t7.5 -12.5l48.5 -60.5l48.5 -61.5l54 -73.5l53 -74.5q5 -7 9 -14t8 -15q6 -12 3 -16.5t-16 -4.5z" />
<glyph glyph-name="uni0446" unicode="&#x446;"
d="M6 611q-1 16 2.5 20t20.5 7q4 0 19.5 0.5t35.5 0.5t40 -0.5t32 -0.5q11 0 14.5 -4.5t3.5 -14.5q1 -28 1.5 -68t0.5 -85t-0.5 -90.5t-0.5 -84.5t-0.5 -67.5t0.5 -38.5q0 -22 24 -22h73.5t73.5 -1q20 0 18 20q-1 16 -1 47.5v72t-0.5 85.5t-0.5 87t-1 77.5t-2 56.5v10t1 10
q3 15 19 15q30 -2 60 -2.5t60 -2.5q16 -2 19.5 -5.5t4.5 -20.5q1 -24 2 -58t1.5 -73t0.5 -78.5t0.5 -73.5t0.5 -59v-34q1 -11 1 -21.5t1 -21.5q1 -17 2 -25.5t5.5 -13t13 -5.5t25.5 -1q3 0 6 0.5t5 -0.5q18 -1 27 -2t12 -5t3 -12t1 -21q4 -43 5 -83t0 -87q0 -15 -6 -23.5
t-21 -9.5q-26 0 -49 0.5t-49 -0.5q-22 0 -25 20q-2 14 -1 28.5t-1 28.5q-2 17 -17 18q-9 1 -19 1.5t-19 -1.5q-17 0 -46 -0.5t-63.5 -0.5t-71 -1t-69 -1t-58 -0.5t-37.5 -0.5h-31q-10 1 -21 0.5t-18 4.5q-5 4 -4.5 15t-0.5 21q-3 97 1 192t0 192l-2 68q-1 29 -1 61.5v60.5z
" />
<glyph glyph-name="uni0447" unicode="&#x447;" horiz-adv-x="656"
d="M550 471q-1 -107 -0.5 -213t-0.5 -213q0 -11 -0.5 -16.5l-1.5 -16.5q-2 -14 -6.5 -18t-18.5 -3q-30 2 -60 0t-60 2q-26 3 -26 36v117q0 14 -1 28.5l-2 29.5q-1 17 -17 9q-5 -2 -10.5 -5.5t-10.5 -5.5l-41.5 -16t-41.5 -14q-52 -14 -96.5 0t-85.5 44q-24 18 -39.5 42.5
t-17.5 55.5l-4 67.5t-3 68.5v43t0.5 39l1 39t0.5 43q0 22 20 22q5 0 21.5 0.5t36.5 0.5h39h30q12 -1 19 -2t10 -4t3.5 -9.5t0.5 -17.5q-1 -42 -2.5 -74.5t-2.5 -73.5q0 -17 1 -33t5 -33q5 -24 21 -38.5t45 -14.5q50 -1 90 29q14 11 21.5 23.5t7.5 32.5q-2 48 -1 93t1 93v8
q1 17 5.5 22t21.5 5h19h33.5h36h28.5q20 1 25 -5t7 -26q1 -17 1 -41.5v-46.5t-0.5 -37.5z" />
<glyph glyph-name="uni0448" unicode="&#x448;" horiz-adv-x="969"
d="M255 -2q-51 1 -101 1.5t-101 1.5q-10 0 -15 1q-17 2 -22.5 8.5t-5.5 23.5q-2 69 -1 136t0 136q-1 55 -0.5 110t0.5 111q1 23 0 37t-2 37q0 7 1 13t2 13q5 15 20 14q10 -1 26 -1.5t32.5 -0.5t30 0.5t16.5 0.5q13 1 21 0t12.5 -4.5t6.5 -11t3 -20.5q5 -62 4 -118t1 -119
q1 -42 -1 -86t0 -86q1 -14 4.5 -17.5t18.5 -4.5q25 -2 54 -0.5t53 0.5t29 3.5t4 27.5q0 38 -1 75.5t-1 75.5q0 54 0.5 106.5t0.5 106.5q0 16 1 26.5t-1 26.5q-2 20 16 20q34 -2 65.5 0t65.5 -1q14 -2 18 -7t4 -22q1 -87 1 -172.5v-172.5q0 -19 0.5 -37.5t1.5 -36.5
q1 -14 5.5 -18t18.5 -4q27 -1 54 -0.5t55 0.5q17 0 17 16v55q-1 41 -0.5 81t-1.5 82q-2 50 -2.5 98.5t-2.5 98.5q0 4 -0.5 7.5t-0.5 8.5q0 11 4.5 15.5t16.5 4.5h60t61 -1q11 -1 17 -6t7 -22q3 -97 4.5 -193.5t-3.5 -194.5q-2 -45 -0.5 -87.5t1.5 -87.5q0 -31 -8.5 -39
t-38.5 -8q-17 0 -59.5 -0.5t-97 -0.5h-115.5h-113.5t-90.5 0.5t-48 0.5z" />
<glyph glyph-name="uni0449" unicode="&#x449;" horiz-adv-x="1083"
d="M340 617q0 15 3 19.5t18 4.5q30 1 60 0.5t60 -1.5q17 0 17 -20q0 -44 0.5 -84t-0.5 -84q0 -66 -0.5 -132t-0.5 -132q-1 -17 2.5 -21t20.5 -5q29 -1 58.5 -1h58.5q13 0 20 1t10.5 4.5t4 10.5t0.5 19q0 42 -0.5 83.5t-0.5 83.5q-1 61 -1 122v122q0 11 0.5 17.5t3.5 10
t9 4.5t17 1q30 1 60 -0.5t60 -3.5q12 0 14 -15q2 -20 3.5 -40.5t1.5 -40.5q1 -80 0 -159t2 -159l1.5 -41t5.5 -17.5t17 -4t36 -0.5l36.5 -2t36.5 -3q19 -2 20 -19q0 -7 1.5 -13.5t2.5 -13.5q2 -47 2.5 -93t2.5 -93q0 -6 -1 -11.5l-2 -11.5q-3 -18 -21 -18q-27 1 -54 1t-54 1
q-19 0 -24 5t-7 23q-5 33 -6 66q-1 11 -5.5 16t-15.5 5q-20 0 -39 0.5t-39 0.5q-105 1 -209 1.5t-210 1.5q-67 0 -133.5 0.5t-133.5 0.5h-12t-11 2q-11 2 -17 9t-3 18q-2 21 -2 39v34.5t0.5 32.5t0.5 33q-2 52 0 103t-1 103q-4 60 -3.5 113.5t1.5 113.5v16q1 17 4.5 21
t20.5 3q17 0 34.5 -1t34.5 -1q15 -1 29.5 -1.5t28.5 0.5q19 0 19 -18q-1 -23 -1.5 -40t-0.5 -40q1 -69 1.5 -138t0.5 -138q1 -17 0.5 -33t-0.5 -33q0 -21 3 -25.5t23 -5.5l52.5 -4t52.5 -2q15 0 22.5 1t10.5 4.5t3.5 11t0.5 20.5q-1 52 -1 104t-1 105l0.5 22.5t0.5 54.5
v67.5v62.5z" />
<glyph glyph-name="uni044A" unicode="&#x44a;" horiz-adv-x="667"
d="M76 324q-1 39 0.5 77.5t-0.5 77.5q-2 18 -6 21.5t-23 4.5q-23 1 -37.5 0t-23 3t-11 16t-1.5 39q1 14 0 27t-1 27q1 14 5 18.5t18 5.5h37.5t63.5 -0.5l69 -1t54 -1.5q3 1 9.5 1t12.5 -2.5t10.5 -8.5t4.5 -16v-28v-39v-42v-38q0 -22 20 -22q37 0 73 -3q51 -5 94 -24.5
t76 -58.5q32 -38 41 -81t-2 -91q-14 -60 -50.5 -100t-94.5 -63q-41 -16 -81.5 -19t-82.5 -5q-37 -2 -74 0l-74 4q-18 1 -21 4t-3 20q-1 48 -1.5 95t-1.5 95v12v28.5t0.5 35t0.5 32.5zM302 136q7 1 16.5 1.5t19.5 2.5q8 2 16.5 6t13.5 10q19 20 25.5 43t-2.5 50
q-15 49 -65 58q-21 4 -42 6q-17 2 -21.5 -2t-4.5 -22q-2 -66 0 -132q0 -14 3.5 -17t19.5 -4h21z" />
<glyph glyph-name="uni044B" unicode="&#x44b;" horiz-adv-x="823"
d="M7 283q1 36 1.5 89l1 104t0.5 90v48q-1 18 3 22t23 5h23t40 -0.5l43 -1t32 -0.5q16 -1 19 -3t5 -18q2 -34 0.5 -67.5t0.5 -67.5q0 -13 1 -20.5t4 -11t10 -5t21 -3.5q10 -1 19.5 -1t19.5 -2q60 -10 105 -41t72 -88q18 -38 23 -77t-7 -81q-11 -40 -36 -74.5t-66 -50.5
q-42 -17 -81.5 -20.5l-83.5 -7.5q-5 0 -24 -0.5t-44 -0.5t-50 -0.5t-40 -1.5q-23 -1 -28.5 4.5t-5.5 28.5q0 66 -0.5 130.5t-0.5 122.5zM194 167q0 -8 3 -13.5t11 -5.5q10 0 24.5 0.5t28.5 3.5t26.5 7.5t20.5 12.5t12.5 20t6 25t-0.5 26t-7 23t-18.5 18.5t-29.5 14t-33 8
t-29 1.5q-14 -2 -15 -14v-127zM543 615q0 14 3.5 19.5t17.5 4.5h62t62 -2q17 -1 20.5 -5.5t3.5 -22.5q2 -42 2.5 -79t0.5 -79v-194t-2 -194q0 -30 0.5 -43.5t-5 -18t-20 -3.5t-44.5 1q-19 -1 -37 0t-37 1q-18 0 -24 5t-6 24v150.5t-1 151.5l1 30.5t1.5 74.5t1 93t0.5 86z
" />
<glyph glyph-name="uni044C" unicode="&#x44c;" horiz-adv-x="593"
d="M146 -2q-30 1 -52.5 1.5t-42.5 1.5q-16 0 -31 3q-7 2 -11.5 6.5t-2.5 12.5q0 48 -0.5 98t0.5 99v61.5v77v81.5v76v60v34q0 5 -0.5 9.5t0.5 9.5q3 20 24 20q30 -2 60 -3t60 -3q14 -1 22 -2t11.5 -5t4.5 -12t1 -22q1 -34 0.5 -59.5t1.5 -59.5q0 -18 3 -22t20 -5
q22 -2 49 -1.5t49 -1.5q84 -6 142 -64q48 -49 54 -122q5 -83 -38 -156q-22 -36 -53 -60.5t-73 -35.5q-52 -14 -103 -18t-95 1zM191 251q2 -10 2 -29q0 -9 0.5 -18.5t0.5 -19.5q1 -26 6.5 -32t31.5 -4q15 1 30 6q14 4 28 10t25.5 16t18.5 23.5t7 33.5q0 19 -8 31t-21.5 19.5
t-30 10.5t-34.5 5q-1 1 -4 1q-19 2 -29.5 2t-15.5 -5t-6 -16.5t-1 -33.5z" />
<glyph glyph-name="uni044D" unicode="&#x44d;"
d="M624 300q1 -40 -9 -80.5t-31 -78.5t-54 -62q-34 -25 -68.5 -44.5t-75.5 -32.5q-73 -23 -141.5 -11.5t-135.5 40.5q-52 22 -95 62q-5 5 -8.5 9.5t-0.5 12.5l27 65.5l27 64.5q5 13 17 19q18 9 34 -7q14 -14 29 -27t32 -24q49 -33 100 -32.5t103 23.5q41 18 55 64
q6 20 -14 20h-30t-51 -0.5t-51 -0.5h-31h-17t-17 1q-20 0 -20 21q0 11 -2 21t-2 21q-1 21 6.5 28.5t28.5 8.5q9 0 34.5 0.5t55 0.5t55 0.5t34.5 0.5q14 2 16 5.5t-2 16.5q-10 29 -32.5 44t-49.5 23q-92 26 -173 -18q-17 -9 -24.5 -5.5t-15.5 16.5l-24.5 39l-23.5 39
q-3 5 -6 9.5t-7 8.5q-10 12 -9.5 16t11.5 14q78 66 178 69q61 3 121 -6q56 -8 99.5 -37.5t78.5 -71.5q44 -52 64 -112.5t15 -132.5z" />
<glyph glyph-name="uni044E" unicode="&#x44e;" horiz-adv-x="969"
d="M184 23q-1 -16 -5 -20.5t-19 -4.5q-29 1 -59 1t-59 2q-13 0 -20 1t-10 4.5t-3.5 10t-0.5 18.5q-2 79 -0.5 157t-0.5 157q-1 32 -1.5 64.5t1.5 64.5q2 37 2 70.5t-2 71.5q-1 14 1.5 18t13.5 4q36 0 69 -0.5t69 -0.5q16 -2 16 -17q1 -14 1 -27v-27q1 -37 0 -70.5t1 -71.5
q0 -19 3.5 -22t21.5 -5q14 -1 27 -0.5t26 -0.5q17 -1 23 16q5 11 9.5 22.5t9.5 22.5q34 78 95 121t142 61q66 15 123 -1.5t107 -58.5q35 -31 60.5 -69t37.5 -86q9 -36 15 -72t2 -74q-5 -44 -17 -83.5t-38 -76.5q-19 -26 -40 -50t-49 -41q-53 -32 -109.5 -41.5t-117.5 -6.5
q-42 3 -79 18t-72 38q-33 22 -52.5 54t-30.5 69q-7 22 -11.5 44l-9.5 45q-4 17 -20 18q-18 1 -28 0t-15.5 -6.5t-7 -15.5t-1.5 -28q0 -11 0.5 -38t0.5 -57.5t0.5 -59t0.5 -41.5zM442 324q0 -6 -0.5 -12t-0.5 -11q0 -34 15 -59.5t36.5 -43t44.5 -26t38 -8.5q72 0 111 47.5
t39 125.5q0 12 -2 33.5t-13.5 44t-34.5 41t-65 26.5q-61 10 -104.5 -22t-59.5 -90q-2 -6 -2.5 -13.5l-1 -15t-0.5 -12.5v-5z" />
<glyph glyph-name="uni044F" unicode="&#x44f;" horiz-adv-x="688"
d="M571 34v-23q-2 -20 -21 -18h-127q-18 1 -24 7t-6 23v54.5t1 54.5q0 17 0.5 34.5t0.5 35.5q0 15 -3.5 18t-18.5 5q-30 6 -46 -20l-57.5 -85t-55.5 -86q-7 -12 -12.5 -19.5t-13 -12.5t-19.5 -7t-31 -2h-34t-38 1q-21 0 -44 1q-6 2 -10 5q-8 6 -1 16q14 20 30 39.5t31 40.5
l48 67.5l48 68.5q9 14 8.5 18.5t-14.5 10.5q-35 16 -55 43.5t-34 60.5q-14 35 -18.5 70.5t6.5 73.5q5 18 16 32.5t25 26.5q49 41 113 57q45 11 87 11.5t82 1.5q17 -1 42.5 -1t49 0.5t40.5 0.5h19q21 -3 28 -11t7 -29v-48v-87t0.5 -111t0.5 -119v-111.5v-87.5zM407 438
q-1 4 -1 12.5t-1 17.5q-2 15 -14 16q-15 1 -43.5 2.5t-56 -1t-48.5 -12t-22 -30.5q-1 -37 17 -53.5t41 -21.5t44.5 -3.5t29.5 0.5q22 -2 32.5 1t14.5 11t4.5 23t2.5 38z" />
<glyph glyph-name="A" unicode="A" horiz-adv-x="708"
d="M436 638q18 1 23.5 -3t9.5 -21q8 -33 14.5 -64t14.5 -64l34 -142l34 -141l15.5 -64.5l15.5 -64.5l6 -25.5l6 -24.5q6 -23 -16 -27h-7q-36 -2 -72 -0.5t-71 -0.5q-15 0 -18.5 5t-5.5 22q-3 44 -16 88q-2 10 -8.5 11t-11.5 1q-36 1 -72 0l-71 -2q-8 0 -12 -4t-6 -11
q-6 -23 -12.5 -43t-12.5 -43q-3 -11 -7.5 -15.5t-18.5 -4.5h-31h-50t-47.5 0.5t-22.5 0.5q-24 2 -16 25l20 60l21 59l42 133.5l43 133.5l17 56l19.5 64l16.5 53t8 24q3 10 4.5 16t5 9t11 4t21.5 1q12 0 40.5 -0.5t60 -0.5h60.5h42zM361 243q16 1 12 17l-16.5 71l-16.5 71
q-1 3 -3 6.5t-6 3.5t-4.5 -3t-1.5 -5l-22 -64.5l-22 -64.5q-5 -15 -7 -22.5t0.5 -10.5t10 -3h21.5l6.5 0.5t15 1t18 1t15.5 1.5z" />
<glyph glyph-name="a" unicode="a" horiz-adv-x="708"
d="M436 638q18 1 23.5 -3t9.5 -21q8 -33 14.5 -64t14.5 -64l34 -142l34 -141l15.5 -64.5l15.5 -64.5l6 -25.5l6 -24.5q6 -23 -16 -27h-7q-36 -2 -72 -0.5t-71 -0.5q-15 0 -18.5 5t-5.5 22q-3 44 -16 88q-2 10 -8.5 11t-11.5 1q-36 1 -72 0l-71 -2q-8 0 -12 -4t-6 -11
q-6 -23 -12.5 -43t-12.5 -43q-3 -11 -7.5 -15.5t-18.5 -4.5h-31h-50t-47.5 0.5t-22.5 0.5q-24 2 -16 25l20 60l21 59l42 133.5l43 133.5l17 56l19.5 64l16.5 53t8 24q3 10 4.5 16t5 9t11 4t21.5 1q12 0 40.5 -0.5t60 -0.5h60.5h42zM361 243q16 1 12 17l-16.5 71l-16.5 71
q-1 3 -3 6.5t-6 3.5t-4.5 -3t-1.5 -5l-22 -64.5l-22 -64.5q-5 -15 -7 -22.5t0.5 -10.5t10 -3h21.5l6.5 0.5t15 1t18 1t15.5 1.5z" />
<glyph glyph-name="B" unicode="B" horiz-adv-x="636"
d="M3 604q0 14 5 21t19 10q8 1 16 1h16q37 -2 75 0q51 1 101.5 -1.5t101.5 -8.5q31 -4 54.5 -18t42.5 -37q6 -7 10.5 -19.5t8.5 -25.5t6.5 -23t2.5 -11q4 -35 -9.5 -64.5t-36.5 -54.5q-9 -10 -8 -12.5t14 -8.5l27.5 -13.5t25.5 -15.5q46 -36 48 -96q1 -89 -54 -163
q-8 -11 -20.5 -19.5l-24.5 -16.5q-18 -12 -38.5 -18t-42.5 -8q-17 -1 -44 -1.5t-58.5 -0.5h-64.5t-61.5 0.5t-49.5 1t-29 0.5q-20 1 -26.5 8.5t-6.5 27.5v283l0.5 31t0.5 75t-0.5 92.5t-0.5 84.5zM171 140q0 -18 17 -17q12 1 24 0.5t23 1.5q20 4 39 10.5t35 21.5
q23 23 19.5 48.5t-32.5 39.5q-26 11 -54.5 14.5t-57.5 2.5q-16 0 -16 -19q0 -6 0.5 -20.5l1 -30.5l1 -30.5t0.5 -21.5zM170 424q0 -19 16 -18q17 1 34 1.5t34 2.5q15 3 28 10.5t16 25.5q8 37 -21 57q-34 25 -77 24q-20 0 -24 -4t-5 -24v-13t-0.5 -22t-0.5 -23v-17z" />
<glyph glyph-name="b" unicode="b" horiz-adv-x="636"
d="M3 604q0 14 5 21t19 10q8 1 16 1h16q37 -2 75 0q51 1 101.5 -1.5t101.5 -8.5q31 -4 54.5 -18t42.5 -37q6 -7 10.5 -19.5t8.5 -25.5t6.5 -23t2.5 -11q4 -35 -9.5 -64.5t-36.5 -54.5q-9 -10 -8 -12.5t14 -8.5l27.5 -13.5t25.5 -15.5q46 -36 48 -96q1 -89 -54 -163
q-8 -11 -20.5 -19.5l-24.5 -16.5q-18 -12 -38.5 -18t-42.5 -8q-17 -1 -44 -1.5t-58.5 -0.5h-64.5t-61.5 0.5t-49.5 1t-29 0.5q-20 1 -26.5 8.5t-6.5 27.5v283l0.5 31t0.5 75t-0.5 92.5t-0.5 84.5zM171 140q0 -18 17 -17q12 1 24 0.5t23 1.5q20 4 39 10.5t35 21.5
q23 23 19.5 48.5t-32.5 39.5q-26 11 -54.5 14.5t-57.5 2.5q-16 0 -16 -19q0 -6 0.5 -20.5l1 -30.5l1 -30.5t0.5 -21.5zM170 424q0 -19 16 -18q17 1 34 1.5t34 2.5q15 3 28 10.5t16 25.5q8 37 -21 57q-34 25 -77 24q-20 0 -24 -4t-5 -24v-13t-0.5 -22t-0.5 -23v-17z" />
<glyph glyph-name="C" unicode="C" horiz-adv-x="687"
d="M-17 288q0 64 16 120.5t47 108.5q14 23 32.5 40.5t41.5 31.5q55 34 114 49t124 9q39 -4 75 -18.5l71 -29.5q25 -10 7 -34l-40.5 -49l-41.5 -49q-7 -8 -15 -9.5t-19 0.5q-21 4 -42.5 5t-41.5 -2q-30 -3 -53.5 -16t-40 -33t-24.5 -46t-6 -55l4 -34.5t7 -33.5
q9 -28 27.5 -45.5t49.5 -21.5q20 -3 40 -5t40 3q28 7 46 20.5t38 39.5q14 29 38 12l51 -34t50 -36q15 -11 11 -20.5t-15 -26.5q-6 -8 -26 -26.5t-47 -38t-57 -37t-56 -24.5q-33 -9 -66 -11t-68 2q-45 6 -85.5 22.5t-75.5 45.5q-6 5 -16.5 14.5t-22 22t-23 27.5t-18.5 32
t-12.5 33t-10.5 33q-4 17 -4.5 33.5t-2.5 30.5z" />
<glyph glyph-name="c" unicode="c" horiz-adv-x="708"
d="M3 288q0 64 16 120.5t47 108.5q14 23 32.5 40.5t41.5 31.5q55 34 114 49t124 9q39 -4 75 -18.5l71 -29.5q25 -10 7 -34l-40.5 -49l-41.5 -49q-7 -8 -15 -9.5t-19 0.5q-21 4 -42.5 5t-41.5 -2q-30 -3 -53.5 -16t-40 -33t-24.5 -46t-6 -55l4 -34.5t7 -33.5
q9 -28 27.5 -45.5t49.5 -21.5q20 -3 40 -5t40 3q28 7 46 20.5t38 39.5q14 29 38 12l51 -34t50 -36q15 -11 11 -20.5t-15 -26.5q-6 -8 -26 -26.5t-47 -38t-57 -37t-56 -24.5q-33 -9 -66 -11t-68 2q-45 6 -85.5 22.5t-75.5 45.5q-6 5 -16.5 14.5t-22 22t-23 27.5t-18.5 32
t-12.5 33t-10.5 33q-4 17 -4.5 33.5t-2.5 30.5z" />
<glyph glyph-name="D" unicode="D" horiz-adv-x="709"
d="M4 576q0 21 1 32.5t6.5 17t16.5 7t32 2.5q11 0 44 0.5t72 0.5t76 -1t57 -3q24 -2 48 -4.5t47 -10.5q21 -7 41.5 -18t38.5 -25q30 -20 52.5 -53.5t38 -68.5t24.5 -66t12 -47q13 -72 -9 -131t-71 -110q-34 -35 -74 -57t-89 -29q-63 -9 -124.5 -12.5t-124.5 -1.5
q-26 0 -50.5 2t-49.5 2q-11 -1 -13.5 4t-2.5 13q0 4 -0.5 7.5t-0.5 7.5q0 71 0.5 141.5t0.5 141.5l0.5 28t0.5 68.5v85v77.5zM202 315q0 -33 -0.5 -66t-1.5 -66q0 -20 20 -21q43 -4 82 6t74 36q17 13 30 28t18 36q7 28 4.5 56t-11.5 56q-8 21 -22 37.5t-36 25.5
q-32 14 -64.5 16t-65.5 2q-20 0 -23.5 -4t-3.5 -24q-1 -15 -0.5 -35t0.5 -39v-44z" />
<glyph glyph-name="d" unicode="d" horiz-adv-x="708"
d="M4 576q0 21 1 32.5t6.5 17t16.5 7t32 2.5q11 0 44 0.5t72 0.5t76 -1t57 -3q24 -2 48 -4.5t47 -10.5q21 -7 41.5 -18t38.5 -25q30 -20 52.5 -53.5t38 -68.5t24.5 -66t12 -47q13 -72 -9 -131t-71 -110q-34 -35 -74 -57t-89 -29q-63 -9 -124.5 -12.5t-124.5 -1.5
q-26 0 -50.5 2t-49.5 2q-11 -1 -13.5 4t-2.5 13q0 4 -0.5 7.5t-0.5 7.5q0 71 0.5 141.5t0.5 141.5l0.5 28t0.5 68.5v85v77.5zM202 315q0 -33 -0.5 -66t-1.5 -66q0 -20 20 -21q43 -4 82 6t74 36q17 13 30 28t18 36q7 28 4.5 56t-11.5 56q-8 21 -22 37.5t-36 25.5
q-32 14 -64.5 16t-65.5 2q-20 0 -23.5 -4t-3.5 -24q-1 -15 -0.5 -35t0.5 -39v-44z" />
<glyph glyph-name="E" unicode="E" horiz-adv-x="583"
d="M9 431q0 38 -1.5 75.5t-3.5 75.5q0 5 -0.5 10.5t-0.5 11.5q0 17 4 25t27 7q26 -1 65.5 -1h83h88.5t82.5 0.5t64.5 0.5h36q20 0 21 -19q1 -26 1 -57v-57q0 -3 -4.5 -7t-7.5 -4q-14 -2 -27.5 -3.5t-27.5 -1.5q-49 -1 -95 -1t-95 -1q-17 0 -26.5 -1t-13.5 -5.5t-4 -14
t1 -27.5q0 -10 -0.5 -13t0.5 -12q1 -12 2 -19t4 -10.5t10 -4.5t20 -2q10 -2 27.5 -1t28.5 0q12 -1 17.5 -3.5t7.5 -7.5t1.5 -13t-0.5 -20q0 -4 -0.5 -7.5t0.5 -7.5q0 -18 -18 -18q-30 -2 -59 0q-16 0 -25 -0.5t-12.5 -4.5t-4 -12.5t-0.5 -23.5v-74q1 -21 21 -21h243
q18 2 25 -2.5t8 -22.5q2 -28 2.5 -62t-0.5 -62q0 -4 -4.5 -8.5t-8.5 -5.5q-6 -1 -27.5 -1h-52t-66.5 0.5l-71 1t-66 0.5h-50q-23 -1 -47 0l-47 2q-19 1 -24.5 6.5t-5.5 24.5v66t1 66q0 23 0.5 44.5t1.5 44.5q-1 0 -0.5 19.5t1 47t1 58t0.5 52.5z" />
<glyph glyph-name="e" unicode="e" horiz-adv-x="583"
d="M9 431q0 38 -1.5 75.5t-3.5 75.5q0 5 -0.5 10.5t-0.5 11.5q0 17 4 25t27 7q26 -1 65.5 -1h83h88.5t82.5 0.5t64.5 0.5h36q20 0 21 -19q1 -26 1 -57v-57q0 -3 -4.5 -7t-7.5 -4q-14 -2 -27.5 -3.5t-27.5 -1.5q-49 -1 -95 -1t-95 -1q-17 0 -26.5 -1t-13.5 -5.5t-4 -14
t1 -27.5q0 -10 -0.5 -13t0.5 -12q1 -12 2 -19t4 -10.5t10 -4.5t20 -2q10 -2 27.5 -1t28.5 0q12 -1 17.5 -3.5t7.5 -7.5t1.5 -13t-0.5 -20q0 -4 -0.5 -7.5t0.5 -7.5q0 -18 -18 -18q-30 -2 -59 0q-16 0 -25 -0.5t-12.5 -4.5t-4 -12.5t-0.5 -23.5v-74q1 -21 21 -21h243
q18 2 25 -2.5t8 -22.5q2 -28 2.5 -62t-0.5 -62q0 -4 -4.5 -8.5t-8.5 -5.5q-6 -1 -27.5 -1h-52t-66.5 0.5l-71 1t-66 0.5h-50q-23 -1 -47 0l-47 2q-19 1 -24.5 6.5t-5.5 24.5v66t1 66q0 23 0.5 44.5t1.5 44.5q-1 0 -0.5 19.5t1 47t1 58t0.5 52.5z" />
<glyph glyph-name="F" unicode="F" horiz-adv-x="635"
d="M440 638q20 -1 40.5 -1.5t41.5 -0.5q11 0 13.5 -5t2.5 -14q1 -28 1 -56t1 -55q0 -19 -4 -24.5t-24 -5.5h-72t-72 1q-26 0 -51 0.5t-51 0.5q-10 0 -19.5 0.5t-19.5 -0.5q-21 -2 -25.5 -7t-5.5 -25q-1 -19 -1.5 -34t-1.5 -34q0 -23 4 -28.5t28 -7.5q29 -3 58.5 -1.5
t58.5 -0.5q11 -1 23 -0.5t23 -0.5q18 -2 26.5 -2t11.5 -3.5t3 -11.5t2 -24q2 -20 2 -41t-1 -41q0 -13 -4 -16.5t-17 -3.5q-45 -1 -90 -1t-90 -1q-4 0 -7.5 0.5t-7.5 0.5q-18 0 -21.5 -3t-3.5 -20q-1 -27 -1 -61t-1 -61q0 -20 -1.5 -30.5t-6.5 -15t-15 -5t-29 -0.5
q-25 1 -49 1.5t-49 1.5q-20 2 -25 6.5t-6 22.5q-1 50 -1 99.5t-1 99.5q0 19 -1 64.5t-1 97.5t0.5 99.5t2.5 70.5q2 15 1.5 25.5t1.5 26.5q1 18 5 21.5t23 4.5h16q16 -1 46.5 -1h68h78.5h78.5t68 -0.5t46.5 -0.5z" />
<glyph glyph-name="f" unicode="f" horiz-adv-x="635"
d="M440 638q20 -1 40.5 -1.5t41.5 -0.5q11 0 13.5 -5t2.5 -14q1 -28 1 -56t1 -55q0 -19 -4 -24.5t-24 -5.5h-72t-72 1q-26 0 -51 0.5t-51 0.5q-10 0 -19.5 0.5t-19.5 -0.5q-21 -2 -25.5 -7t-5.5 -25q-1 -19 -1.5 -34t-1.5 -34q0 -23 4 -28.5t28 -7.5q29 -3 58.5 -1.5
t58.5 -0.5q11 -1 23 -0.5t23 -0.5q18 -2 26.5 -2t11.5 -3.5t3 -11.5t2 -24q2 -20 2 -41t-1 -41q0 -13 -4 -16.5t-17 -3.5q-45 -1 -90 -1t-90 -1q-4 0 -7.5 0.5t-7.5 0.5q-18 0 -21.5 -3t-3.5 -20q-1 -27 -1 -61t-1 -61q0 -20 -1.5 -30.5t-6.5 -15t-15 -5t-29 -0.5
q-25 1 -49 1.5t-49 1.5q-20 2 -25 6.5t-6 22.5q-1 50 -1 99.5t-1 99.5q0 19 -1 64.5t-1 97.5t0.5 99.5t2.5 70.5q2 15 1.5 25.5t1.5 26.5q1 18 5 21.5t23 4.5h16q16 -1 46.5 -1h68h78.5h78.5t68 -0.5t46.5 -0.5z" />
<glyph glyph-name="G" unicode="G" horiz-adv-x="718"
d="M475 362h58t58 -1q17 -1 20.5 -4t6.5 -19q5 -32 -0.5 -62.5t-15.5 -59.5q-12 -37 -33 -68t-47 -59q-32 -35 -71 -58t-87 -31q-50 -8 -98.5 -6t-96.5 24q-26 11 -49 22t-45 29q-13 11 -22 24t-20 27q-7 14 -15.5 29.5t-13.5 31.5q-31 89 -18 171.5t60 160.5q27 45 69 73
t93 43q55 17 109.5 16.5t109.5 -11.5q26 -5 48 -17t45 -23q8 -4 8 -10t-6 -11l-50.5 -45.5l-50.5 -45.5q-4 -3 -10.5 -5t-8.5 0q-20 14 -41.5 12l-42.5 -4q-17 -2 -33.5 -6t-31.5 -11q-29 -14 -51.5 -41.5t-32.5 -62t-5.5 -72.5t29.5 -74q23 -33 56.5 -47t74.5 -9q19 2 37 7
t33 18q7 5 13 11t11 13q5 8 10 18.5t3 18.5q-1 5 -4.5 7t-8.5 2t-10.5 -0.5t-9.5 0.5q-7 1 -13 1t-13 1q-22 2 -28 8.5t-7 28.5q-1 13 -1 25t-2 24q-1 20 16 20q23 0 47 -0.5t47 -0.5q8 -1 15.5 -1.5t15.5 -0.5z" />
<glyph glyph-name="g" unicode="g" horiz-adv-x="719"
d="M474 362h58t58 -1q17 -1 20.5 -4t6.5 -19q5 -32 -0.5 -62.5t-15.5 -59.5q-12 -37 -33 -68t-47 -59q-32 -35 -71 -58t-87 -31q-50 -8 -98.5 -6t-96.5 24q-26 11 -49 22t-45 29q-13 11 -22 24t-20 27q-7 14 -15.5 29.5t-13.5 31.5q-31 89 -18 171.5t60 160.5q27 45 69 73
t93 43q55 17 109.5 16.5t109.5 -11.5q26 -5 48 -17t45 -23q8 -4 8 -10t-6 -11l-50.5 -45.5l-50.5 -45.5q-4 -3 -10.5 -5t-8.5 0q-20 14 -41.5 12l-42.5 -4q-17 -2 -33.5 -6t-31.5 -11q-29 -14 -51.5 -41.5t-32.5 -62t-5.5 -72.5t29.5 -74q23 -33 56.5 -47t74.5 -9q19 2 37 7
t33 18q7 5 13 11t11 13q5 8 10 18.5t3 18.5q-1 5 -4.5 7t-8.5 2t-10.5 -0.5t-9.5 0.5q-7 1 -13 1t-13 1q-22 2 -28 8.5t-7 28.5q-1 13 -1 25t-2 24q-1 20 16 20q23 0 47 -0.5t47 -0.5q8 -1 15.5 -1.5t15.5 -0.5z" />
<glyph glyph-name="H" unicode="H" horiz-adv-x="645"
d="M9 518q0 22 -0.5 49t-0.5 49q0 12 4 16.5t15 4.5h63t62 -1q30 -1 33 -32q1 -11 0.5 -25.5t-0.5 -25.5q-1 -30 -1.5 -60.5t-0.5 -60.5q0 -8 0.5 -16.5t2.5 -16.5q2 -5 7 -9t8 -4h15h106q18 0 28 0.5t15 5t6.5 14t1.5 27.5q2 41 1.5 84t-0.5 84q0 6 -0.5 11.5t1.5 10.5
q1 15 18 15q31 -2 61.5 -1.5t62.5 -1.5q14 -1 16 -4t2 -19q0 -26 0.5 -56.5t0.5 -56.5q-1 -24 -1.5 -47.5t-0.5 -47.5q-1 -28 -0.5 -55.5t0.5 -55.5q1 -60 1 -118v-118q0 -7 0.5 -13t-0.5 -13q-2 -17 -9 -23.5t-24 -6.5q-29 -1 -57 -0.5t-57 -0.5q-16 0 -16 16
q0 13 0.5 25.5t-0.5 25.5q-1 35 -1.5 68.5t-2.5 68.5q-1 10 -2 16t-4 8.5t-9 3.5t-16 1l-63 2t-62 -1q-10 -2 -15.5 -2.5t-8.5 -3.5t-4 -8.5t-1 -16.5q-1 -39 -1 -80.5v-80.5q0 -21 -7.5 -30t-29.5 -12q-1 -1 -3 -1q-29 0 -57 0.5t-57 0.5q-11 0 -15.5 5.5t-5.5 15.5
q-1 13 -1.5 25.5t-0.5 25.5v123.5t1 123.5l0.5 22t1 53l1 65t0.5 59z" />
<glyph glyph-name="h" unicode="h" horiz-adv-x="646"
d="M9 518q0 22 -0.5 49t-0.5 49q0 12 4 16.5t15 4.5h63t62 -1q30 -1 33 -32q1 -11 0.5 -25.5t-0.5 -25.5q-1 -30 -1.5 -60.5t-0.5 -60.5q0 -8 0.5 -16.5t2.5 -16.5q2 -5 7 -9t8 -4h15h106q18 0 28 0.5t15 5t6.5 14t1.5 27.5q2 41 1.5 84t-0.5 84q0 6 -0.5 11.5t1.5 10.5
q1 15 18 15q31 -2 61.5 -1.5t62.5 -1.5q14 -1 16 -4t2 -19q0 -26 0.5 -56.5t0.5 -56.5q-1 -24 -1.5 -47.5t-0.5 -47.5q-1 -28 -0.5 -55.5t0.5 -55.5q1 -60 1 -118v-118q0 -7 0.5 -13t-0.5 -13q-2 -17 -9 -23.5t-24 -6.5q-29 -1 -57 -0.5t-57 -0.5q-16 0 -16 16
q0 13 0.5 25.5t-0.5 25.5q-1 35 -1.5 68.5t-2.5 68.5q-1 10 -2 16t-4 8.5t-9 3.5t-16 1l-63 2t-62 -1q-10 -2 -15.5 -2.5t-8.5 -3.5t-4 -8.5t-1 -16.5q-1 -39 -1 -80.5v-80.5q0 -21 -7.5 -30t-29.5 -12q-1 -1 -3 -1q-29 0 -57 0.5t-57 0.5q-11 0 -15.5 5.5t-5.5 15.5
q-1 13 -1.5 25.5t-0.5 25.5v123.5t1 123.5l0.5 22t1 53l1 65t0.5 59z" />
<glyph glyph-name="I" unicode="I" horiz-adv-x="302"
d="M198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25
q-1 -66 -2 -148.5t-3 -172.5z" />
<glyph glyph-name="i" unicode="i" horiz-adv-x="302"
d="M198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25
q-1 -66 -2 -148.5t-3 -172.5z" />
<glyph glyph-name="J" unicode="J" horiz-adv-x="636"
d="M524 240q-8 -52 -27.5 -99t-53.5 -88q-19 -23 -42.5 -37.5t-53.5 -20.5q-20 -4 -38.5 -6.5t-38.5 -1.5q-6 0 -30.5 1.5t-56.5 10t-66.5 27.5t-60.5 55q-13 21 -22 44.5t-15 47.5q-7 29 -10.5 59.5t-7.5 60.5q-1 10 0 16.5t4 10.5t9 6.5t16 4.5h15.5h35.5t43 -0.5t38 -0.5
q17 0 17 -19q-1 -13 -1 -26t2 -26q5 -39 29 -57t64 -12q36 6 53.5 21.5t25.5 52.5q9 48 9 96q0 59 -1.5 112t-2.5 113q-1 17 0 27t5.5 15t13.5 7t26 2q45 2 92 0q25 -1 31.5 -8.5t8.5 -34.5v-34.5v-58t-1 -72l-2 -74.5t-2.5 -66.5t-4.5 -47.5z" />
<glyph glyph-name="j" unicode="j" horiz-adv-x="635"
d="M524 240q-8 -52 -27.5 -99t-53.5 -88q-19 -23 -42.5 -37.5t-53.5 -20.5q-20 -4 -38.5 -6.5t-38.5 -1.5q-6 0 -30.5 1.5t-56.5 10t-66.5 27.5t-60.5 55q-13 21 -22 44.5t-15 47.5q-7 29 -10.5 59.5t-7.5 60.5q-1 10 0 16.5t4 10.5t9 6.5t16 4.5h15.5h35.5t43 -0.5t38 -0.5
q17 0 17 -19q-1 -13 -1 -26t2 -26q5 -39 29 -57t64 -12q36 6 53.5 21.5t25.5 52.5q9 48 9 96q0 59 -1.5 112t-2.5 113q-1 17 0 27t5.5 15t13.5 7t26 2q45 2 92 0q25 -1 31.5 -8.5t8.5 -34.5v-34.5v-58t-1 -72l-2 -74.5t-2.5 -66.5t-4.5 -47.5z" />
<glyph glyph-name="K" unicode="K" horiz-adv-x="656"
d="M3 609q0 20 5.5 24.5t25.5 5.5h44t44 -1q26 -1 35 -12.5t8 -38.5q-2 -37 -0.5 -74t1.5 -74q0 -7 4 -9t10 2l63.5 55.5l63.5 56.5q18 16 38 39t38 40q11 11 23 14t27 2q55 -3 111 -3q8 0 16.5 -1t11.5 -10q6 -19 -11 -33q-20 -17 -41 -41t-41 -42l-62.5 -56.5l-62.5 -56.5
q-8 -7 -12 -11t-4.5 -7.5t1.5 -8.5t7 -13l58 -99l58 -98l39.5 -62.5l39.5 -61.5q4 -6 7 -11t-2 -12q-7 -13 -25 -13q-9 1 -28 0.5t-39.5 -0.5t-39 0.5t-26.5 3.5t-14 10.5t-11 17t-9.5 19t-8.5 16.5l-54 90.5l-52 91.5l-12 18q-8 13 -18 4q-9 -8 -17.5 -16.5t-17.5 -16.5
q-8 -7 -9 -16t-1 -18q0 -39 0.5 -77.5t0.5 -77.5v-26q-2 -20 -21 -20q-29 2 -57 0t-57 0q-16 2 -21.5 9t-5.5 24q-1 38 -1 79v79q0 33 0.5 66t0.5 66q-1 0 -1 31v75.5t0.5 93.5t0.5 84z" />
<glyph glyph-name="k" unicode="k" horiz-adv-x="656"
d="M3 609q0 20 5.5 24.5t25.5 5.5h44t44 -1q26 -1 35 -12.5t8 -38.5q-2 -37 -0.5 -74t1.5 -74q0 -7 4 -9t10 2l63.5 55.5l63.5 56.5q18 16 38 39t38 40q11 11 23 14t27 2q55 -3 111 -3q8 0 16.5 -1t11.5 -10q6 -19 -11 -33q-20 -17 -41 -41t-41 -42l-62.5 -56.5l-62.5 -56.5
q-8 -7 -12 -11t-4.5 -7.5t1.5 -8.5t7 -13l58 -99l58 -98l39.5 -62.5l39.5 -61.5q4 -6 7 -11t-2 -12q-7 -13 -25 -13q-9 1 -28 0.5t-39.5 -0.5t-39 0.5t-26.5 3.5t-14 10.5t-11 17t-9.5 19t-8.5 16.5l-54 90.5l-52 91.5l-12 18q-8 13 -18 4q-9 -8 -17.5 -16.5t-17.5 -16.5
q-8 -7 -9 -16t-1 -18q0 -39 0.5 -77.5t0.5 -77.5v-26q-2 -20 -21 -20q-29 2 -57 0t-57 0q-16 2 -21.5 9t-5.5 24q-1 38 -1 79v79q0 33 0.5 66t0.5 66q-1 0 -1 31v75.5t0.5 93.5t0.5 84z" />
<glyph glyph-name="L" unicode="L" horiz-adv-x="521"
d="M3 616q0 18 16 19q29 2 54.5 1.5t54.5 0.5q23 1 30 -6t8 -30q3 -71 3.5 -147.5t3.5 -147.5q1 -30 -0.5 -57t0.5 -56q1 -19 5 -23t24 -4q35 -2 70 -2h70h47t20.5 -6t6 -20t2.5 -42q2 -20 2.5 -38.5t2.5 -38.5q1 -20 -21 -20q-23 1 -47 1.5t-48 0.5h-124t-123 1h-11.5
t-10.5 1q-20 2 -27 9.5t-7 28.5q0 42 0.5 84.5t0.5 84.5v21v55t0.5 77.5t0 89l-1 88t-1.5 75.5z" />
<glyph glyph-name="l" unicode="l" horiz-adv-x="521"
d="M3 616q0 18 16 19q29 2 54.5 1.5t54.5 0.5q23 1 30 -6t8 -30q3 -71 3.5 -147.5t3.5 -147.5q1 -30 -0.5 -57t0.5 -56q1 -19 5 -23t24 -4q35 -2 70 -2h70h47t20.5 -6t6 -20t2.5 -42q2 -20 2.5 -38.5t2.5 -38.5q1 -20 -21 -20q-23 1 -47 1.5t-48 0.5h-124t-123 1h-11.5
t-10.5 1q-20 2 -27 9.5t-7 28.5q0 42 0.5 84.5t0.5 84.5v21v55t0.5 77.5t0 89l-1 88t-1.5 75.5z" />
<glyph glyph-name="M" unicode="M" horiz-adv-x="980"
d="M181 299q0 -7 -0.5 -8.5t0.5 -5.5l6 -131l6 -131q1 -14 -2 -17t-19 -5q-17 -2 -33 -2h-32h-45t-44 1q-15 0 -12 15q-1 57 -0.5 113.5t0.5 113.5q-3 184 -3 368q-1 17 3 21t20 5h26.5h39.5h40.5h28.5q16 2 25.5 -4t17.5 -20l59.5 -110.5l60.5 -109.5l72 -132
q8 -14 13 -13.5t13 14.5l27 45l27 45q20 34 41.5 66.5t41.5 67.5l34.5 61.5l32.5 62.5q8 14 17.5 22.5t26.5 6.5q6 -1 25.5 -1h41t39.5 0.5t20 0.5q17 0 26 -1t13.5 -5.5t5 -14t0.5 -27.5q0 -99 1 -197t3 -197q1 -44 0.5 -84.5t1.5 -83.5q1 -23 -2.5 -27t-25.5 -3
q-9 0 -27.5 0.5t-38.5 0.5h-38h-25q-14 -1 -18.5 3t-4.5 19q-1 69 -1.5 136t-1.5 136q0 8 -1 11q0 5 -4 9q-2 2 -3.5 0t-2.5 -3l-9 -13t-8 -13l-76.5 -131.5l-76.5 -132.5q-5 -8 -11 -14t-20 -6h-87q-22 0 -29 8.5t-15 25.5l-57 118l-59 117q-4 8 -8.5 16t-9.5 16
q-1 2 -3.5 3.5t-2.5 -5.5z" />
<glyph glyph-name="m" unicode="m" horiz-adv-x="979"
d="M181 299q0 -7 -0.5 -8.5t0.5 -5.5l6 -131l6 -131q1 -14 -2 -17t-19 -5q-17 -2 -33 -2h-32h-45t-44 1q-15 0 -12 15q-1 57 -0.5 113.5t0.5 113.5q-3 184 -3 368q-1 17 3 21t20 5h26.5h39.5h40.5h28.5q16 2 25.5 -4t17.5 -20l59.5 -110.5l60.5 -109.5l72 -132
q8 -14 13 -13.5t13 14.5l27 45l27 45q20 34 41.5 66.5t41.5 67.5l34.5 61.5l32.5 62.5q8 14 17.5 22.5t26.5 6.5q6 -1 25.5 -1h41t39.5 0.5t20 0.5q17 0 26 -1t13.5 -5.5t5 -14t0.5 -27.5q0 -99 1 -197t3 -197q1 -44 0.5 -84.5t1.5 -83.5q1 -23 -2.5 -27t-25.5 -3
q-9 0 -27.5 0.5t-38.5 0.5h-38h-25q-14 -1 -18.5 3t-4.5 19q-1 69 -1.5 136t-1.5 136q0 8 -1 11q0 5 -4 9q-2 2 -3.5 0t-2.5 -3l-9 -13t-8 -13l-76.5 -131.5l-76.5 -132.5q-5 -8 -11 -14t-20 -6h-87q-22 0 -29 8.5t-15 25.5l-57 118l-59 117q-4 8 -8.5 16t-9.5 16
q-1 2 -3.5 3.5t-2.5 -5.5z" />
<glyph glyph-name="n" unicode="n" horiz-adv-x="750"
d="M4 601v22q2 17 17 14q38 1 71.5 0t68.5 1q13 1 19.5 -3.5t13.5 -13.5q27 -39 54 -83l55.5 -87.5l58 -86t60.5 -78.5q7 -8 17 -18.5t14 -10.5t5 15t1 26q-1 33 -1.5 72t-1.5 78.5t-1.5 78.5t-1.5 72q-1 22 3.5 28t25.5 7q29 2 57 3t57 0q26 0 32 -6.5t6 -31.5
q0 -21 -0.5 -48l-1 -55l-1 -55t-0.5 -48q2 -55 3.5 -110t3.5 -111q2 -38 2 -75.5t1 -75.5q0 -13 -3 -16.5t-16 -3.5h-84.5t-85.5 2q-6 0 -13 3.5t-12 8.5q-29 27 -50 54q-11 13 -27 35t-33.5 48.5l-36 55l-34.5 52.5l-27.5 41.5l-15.5 23.5q-1 2 -4 2t-5 1q-1 -1 -1 -2
q-1 -1 -1 -5v-46.5t1 -46.5l2 -96t3 -96q0 -23 -7 -30t-30 -6l-31.5 2t-31.5 1q-16 -1 -37.5 0t-38.5 -2q-13 -3 -16 10q-2 8 -1 13t1 13q-3 68 -2 135t-1 134q-1 36 0 72t1 72l-0.5 17.5t-0.5 41.5t0.5 49.5t0.5 42.5z" />
<glyph glyph-name="N" unicode="N" horiz-adv-x="750"
d="M4 601v22q2 17 17 14q38 1 71.5 0t68.5 1q13 1 19.5 -3.5t13.5 -13.5q27 -39 54 -83l55.5 -87.5l58 -86t60.5 -78.5q7 -8 17 -18.5t14 -10.5t5 15t1 26q-1 33 -1.5 72t-1.5 78.5t-1.5 78.5t-1.5 72q-1 22 3.5 28t25.5 7q29 2 57 3t57 0q26 0 32 -6.5t6 -31.5
q0 -21 -0.5 -48l-1 -55l-1 -55t-0.5 -48q2 -55 3.5 -110t3.5 -111q2 -38 2 -75.5t1 -75.5q0 -13 -3 -16.5t-16 -3.5h-84.5t-85.5 2q-6 0 -13 3.5t-12 8.5q-29 27 -50 54q-11 13 -27 35t-33.5 48.5l-36 55l-34.5 52.5l-27.5 41.5l-15.5 23.5q-1 2 -4 2t-5 1q-1 -1 -1 -2
q-1 -1 -1 -5v-46.5t1 -46.5l2 -96t3 -96q0 -23 -7 -30t-30 -6l-31.5 2t-31.5 1q-16 -1 -37.5 0t-38.5 -2q-13 -3 -16 10q-2 8 -1 13t1 13q-3 68 -2 135t-1 134q-1 36 0 72t1 72l-0.5 17.5t-0.5 41.5t0.5 49.5t0.5 42.5z" />
<glyph glyph-name="O" unicode="O" horiz-adv-x="728"
d="M632 326q-5 -46 -15 -89t-29.5 -81.5t-49 -71t-71.5 -56.5q-33 -19 -68 -29t-73 -10q-62 0 -110.5 15.5t-85 40t-62 55t-42 60t-24.5 54.5t-9 40q-2 27 -4.5 54t2.5 55q10 49 33.5 96t60 85t86.5 64.5t112 33.5q37 5 73.5 -1t71.5 -19q60 -23 101 -64.5t67 -100.5
q14 -32 26 -63t10 -68zM466 330q0 12 -0.5 18.5t-1.5 10.5t-2 7.5t-2 9.5q-3 15 -16.5 32.5t-33 33t-43 26t-45.5 10.5q-45 0 -75.5 -18t-49 -44.5t-27.5 -57.5t-10 -57q-1 -17 8.5 -39.5t29 -43t48 -35t64.5 -14.5q40 0 69 16.5t48.5 40.5t29 52t9.5 52z" />
<glyph glyph-name="o" unicode="o"
d="M634 326q-5 -46 -15 -89t-29.5 -81.5t-49 -71t-71.5 -56.5q-33 -19 -68 -29t-73 -10q-62 0 -110.5 15.5t-85 40t-62 55t-42 60t-24.5 54.5t-9 40q-2 27 -4.5 54t2.5 55q10 49 33.5 96t60 85t86.5 64.5t112 33.5q37 5 73.5 -1t71.5 -19q60 -23 101 -64.5t67 -100.5
q14 -32 26 -63t10 -68zM468 330q0 12 -0.5 18.5t-1.5 10.5t-2 7.5t-2 9.5q-3 15 -16.5 32.5t-33 33t-43 26t-45.5 10.5q-45 0 -75.5 -18t-49 -44.5t-27.5 -57.5t-10 -57q-1 -17 8.5 -39.5t29 -43t48 -35t64.5 -14.5q40 0 69 16.5t48.5 40.5t29 52t9.5 52z" />
<glyph glyph-name="p" unicode="p" horiz-adv-x="635"
d="M11 527q1 17 0 34.5t-1 35.5q1 21 8 29t28 10q17 2 33 2h32q54 -1 108 -1t108 -2q56 -3 105 -21q14 -5 35.5 -21.5t41 -42t33.5 -58t14 -68.5q0 -56 -19 -95t-49 -66.5t-66.5 -45t-71.5 -28.5q-59 -18 -122 -12q-21 2 -25 -4t-4 -29q-1 -30 -0.5 -55.5t2.5 -54.5
q1 -21 -6 -30t-28 -8q-31 0 -65 -1.5t-65 0.5q-14 1 -18.5 6.5t-6.5 20.5q-2 27 -1 54t0 54q-2 51 -2.5 100.5t-2.5 100.5l0.5 21.5t1 52t1.5 64.5t2 58zM225 520q-20 -2 -24 -6t-3 -24q0 -27 0.5 -64t1.5 -64q1 -14 5 -19t17 -4q10 1 34.5 2t50 9t44.5 25t19 50
q0 26 -10.5 43.5t-26 28.5t-34 16t-34.5 6.5t-27 1t-13 -0.5z" />
<glyph glyph-name="P" unicode="P" horiz-adv-x="635"
d="M11 527q1 17 0 34.5t-1 35.5q1 21 8 29t28 10q17 2 33 2h32q54 -1 108 -1t108 -2q56 -3 105 -21q14 -5 35.5 -21.5t41 -42t33.5 -58t14 -68.5q0 -56 -19 -95t-49 -66.5t-66.5 -45t-71.5 -28.5q-59 -18 -122 -12q-21 2 -25 -4t-4 -29q-1 -30 -0.5 -55.5t2.5 -54.5
q1 -21 -6 -30t-28 -8q-31 0 -65 -1.5t-65 0.5q-14 1 -18.5 6.5t-6.5 20.5q-2 27 -1 54t0 54q-2 51 -2.5 100.5t-2.5 100.5l0.5 21.5t1 52t1.5 64.5t2 58zM225 520q-20 -2 -24 -6t-3 -24q0 -27 0.5 -64t1.5 -64q1 -14 5 -19t17 -4q10 1 34.5 2t50 9t44.5 25t19 50
q0 26 -10.5 43.5t-26 28.5t-34 16t-34.5 6.5t-27 1t-13 -0.5z" />
<glyph glyph-name="q" unicode="q" horiz-adv-x="792"
d="M679 27q13 -13 0 -21l-55 -38.5l-55 -37.5q-12 -8 -23 5l-27.5 33.5l-27.5 34.5q-12 17 -32 10q-16 -6 -32 -11t-33 -8q-42 -8 -82 -0.5t-79 21.5q-16 5 -31.5 12t-30.5 15q-47 23 -83.5 56.5t-55.5 83.5q-7 18 -12 39.5t-8.5 42.5t-5 40t-1.5 32q0 22 6.5 48t18.5 52.5
t29 52t38 46.5q50 50 110 76.5t127 34.5q45 6 88.5 -5t82.5 -36q66 -40 102 -97.5t51 -132.5q11 -58 -0.5 -110t-37.5 -103l-12 -26t-3.5 -16.5t7 -16t19.5 -22.5l24 -27.5zM471 256q14 42 11.5 84t-26.5 76q-22 30 -49 43.5t-51.5 17.5t-42 2.5t-20.5 -1.5
q-20 -5 -38.5 -17.5t-29.5 -30.5q-16 -25 -28 -55t-12 -56t5.5 -39.5l12.5 -30.5q20 -46 62 -64.5t93 -15.5q43 2 71 24.5t42 62.5z" />
<glyph glyph-name="Q" unicode="Q" horiz-adv-x="792"
d="M679 27q13 -13 0 -21l-55 -38.5l-55 -37.5q-12 -8 -23 5l-27.5 33.5l-27.5 34.5q-12 17 -32 10q-16 -6 -32 -11t-33 -8q-42 -8 -82 -0.5t-79 21.5q-16 5 -31.5 12t-30.5 15q-47 23 -83.5 56.5t-55.5 83.5q-7 18 -12 39.5t-8.5 42.5t-5 40t-1.5 32q0 22 6.5 48t18.5 52.5
t29 52t38 46.5q50 50 110 76.5t127 34.5q45 6 88.5 -5t82.5 -36q66 -40 102 -97.5t51 -132.5q11 -58 -0.5 -110t-37.5 -103l-12 -26t-3.5 -16.5t7 -16t19.5 -22.5l24 -27.5zM471 256q14 42 11.5 84t-26.5 76q-22 30 -49 43.5t-51.5 17.5t-42 2.5t-20.5 -1.5
q-20 -5 -38.5 -17.5t-29.5 -30.5q-16 -25 -28 -55t-12 -56t5.5 -39.5l12.5 -30.5q20 -46 62 -64.5t93 -15.5q43 2 71 24.5t42 62.5z" />
<glyph glyph-name="R" unicode="R" horiz-adv-x="656"
d="M235 638q54 -2 107.5 -6t105.5 -25q26 -11 47 -26.5t36 -38.5q23 -34 32 -71.5t6 -74t-16 -70t-34 -60.5q-10 -12 -24.5 -21.5l-28.5 -18.5q-8 -5 -9.5 -10t3.5 -13l34.5 -57.5l35.5 -57.5q7 -11 17 -30t18 -30q7 -12 2 -24q-3 -8 -8.5 -9t-12.5 -1q-32 2 -63 1t-63 -1
q-11 0 -16 4t-10 12l-41.5 78.5t-42.5 78.5q-4 7 -8 13l-8 12q-8 15 -27 15q-11 0 -20.5 1.5t-20.5 1.5q-16 1 -21.5 -3.5t-5.5 -21.5l2 -78l2 -78q1 -14 -3 -20t-17 -9q-5 -2 -11 -2h-11q-26 0 -50.5 -0.5t-50.5 -0.5q-8 0 -15 0.5t-15 1.5q-17 2 -20 19q-1 8 -2.5 16.5
t-1.5 16.5q1 40 1 80t2 80q1 38 1 74.5v74.5q1 61 0 121.5t-1 121.5q0 22 6 27.5t29 4.5h84l11.5 0.5t28.5 1.5t35 1.5t32 -0.5zM201 413q-1 -14 -1 -27v-41q0 -17 18 -17q20 2 39.5 2.5t39.5 2.5q20 3 38.5 11t33.5 24q11 12 14.5 29t0 33.5t-13.5 29t-25 16.5
q-68 17 -133 14q-3 -1 -6.5 -5.5t-3.5 -7.5q-1 -14 -1 -32v-32z" />
<glyph glyph-name="r" unicode="r" horiz-adv-x="656"
d="M235 638q54 -2 107.5 -6t105.5 -25q26 -11 47 -26.5t36 -38.5q23 -34 32 -71.5t6 -74t-16 -70t-34 -60.5q-10 -12 -24.5 -21.5l-28.5 -18.5q-8 -5 -9.5 -10t3.5 -13l34.5 -57.5l35.5 -57.5q7 -11 17 -30t18 -30q7 -12 2 -24q-3 -8 -8.5 -9t-12.5 -1q-32 2 -63 1t-63 -1
q-11 0 -16 4t-10 12l-41.5 78.5t-42.5 78.5q-4 7 -8 13l-8 12q-8 15 -27 15q-11 0 -20.5 1.5t-20.5 1.5q-16 1 -21.5 -3.5t-5.5 -21.5l2 -78l2 -78q1 -14 -3 -20t-17 -9q-5 -2 -11 -2h-11q-26 0 -50.5 -0.5t-50.5 -0.5q-8 0 -15 0.5t-15 1.5q-17 2 -20 19q-1 8 -2.5 16.5
t-1.5 16.5q1 40 1 80t2 80q1 38 1 74.5v74.5q1 61 0 121.5t-1 121.5q0 22 6 27.5t29 4.5h84l11.5 0.5t28.5 1.5t35 1.5t32 -0.5zM201 413q-1 -14 -1 -27v-41q0 -17 18 -17q20 2 39.5 2.5t39.5 2.5q20 3 38.5 11t33.5 24q11 12 14.5 29t0 33.5t-13.5 29t-25 16.5
q-68 17 -133 14q-3 -1 -6.5 -5.5t-3.5 -7.5q-1 -14 -1 -32v-32z" />
<glyph glyph-name="s" unicode="s" horiz-adv-x="584"
d="M384 631q26 -11 44 -30l37 -38q6 -6 4 -14t-7 -13l-36 -39.5l-37 -38.5q-8 -9 -20 -2l-20 16t-21 14l-28 15.5t-28 12.5q-17 6 -30.5 1.5t-20.5 -18.5q-6 -12 -3.5 -28.5t14.5 -25.5q16 -11 32.5 -20.5l33.5 -18.5l48.5 -27.5t47.5 -27.5t41.5 -33.5t35.5 -40.5
q20 -26 24.5 -56t0.5 -61q-14 -120 -131 -161q-46 -16 -90.5 -14.5t-90.5 14.5q-42 11 -77 31.5l-70 42.5q-6 3 -12 9q-9 8 -13.5 12.5t-5.5 9.5t1.5 11.5t8.5 17.5q11 21 20.5 43l19.5 44q4 8 7 15t8 14q3 5 8 6.5t10 -3.5l22 -22l22 -22q26 -25 57.5 -39.5t64.5 -25.5
q13 -4 30 -1q15 3 25 12t13.5 21t0.5 25t-14 24q-13 13 -28 23.5t-31 19.5q-26 16 -53 30.5t-55 27.5q-42 20 -65.5 52.5t-35.5 75.5q-15 62 21 112q14 20 28 33.5t44 28.5q41 20 80 25.5t71.5 3t58 -9.5t39.5 -13z" />
<glyph glyph-name="S" unicode="S" horiz-adv-x="584"
d="M384 631q26 -11 44 -30l37 -38q6 -6 4 -14t-7 -13l-36 -39.5l-37 -38.5q-8 -9 -20 -2l-20 16t-21 14l-28 15.5t-28 12.5q-17 6 -30.5 1.5t-20.5 -18.5q-6 -12 -3.5 -28.5t14.5 -25.5q16 -11 32.5 -20.5l33.5 -18.5l48.5 -27.5t47.5 -27.5t41.5 -33.5t35.5 -40.5
q20 -26 24.5 -56t0.5 -61q-14 -120 -131 -161q-46 -16 -90.5 -14.5t-90.5 14.5q-42 11 -77 31.5l-70 42.5q-6 3 -12 9q-9 8 -13.5 12.5t-5.5 9.5t1.5 11.5t8.5 17.5q11 21 20.5 43l19.5 44q4 8 7 15t8 14q3 5 8 6.5t10 -3.5l22 -22l22 -22q26 -25 57.5 -39.5t64.5 -25.5
q13 -4 30 -1q15 3 25 12t13.5 21t0.5 25t-14 24q-13 13 -28 23.5t-31 19.5q-26 16 -53 30.5t-55 27.5q-42 20 -65.5 52.5t-35.5 75.5q-15 62 21 112q14 20 28 33.5t44 28.5q41 20 80 25.5t71.5 3t58 -9.5t39.5 -13z" />
<glyph glyph-name="T" unicode="T" horiz-adv-x="646"
d="M350 32q0 -20 -5.5 -25.5t-25.5 -6.5q-26 0 -51.5 -0.5t-51.5 -0.5q-16 -1 -20 3t-5 20q-1 63 -1 125t-1 125q-1 35 -1.5 77.5t-2.5 77.5q-1 15 -1 22.5t-3 11t-11 4t-24 0.5h-103q-11 0 -17.5 1t-10 4t-5 9t-2.5 17q-2 30 -2.5 60.5t-0.5 60.5q0 10 6 13.5t14 3.5
q120 3 239 3t239 -4q17 -1 27 -9t11 -22q2 -30 2.5 -59.5t1.5 -58.5q0 -18 -19 -16l-39 2t-38 1q-39 1 -78 0q-14 -1 -17 -4.5t-3 -17.5v-50t-0.5 -74t0 -85.5t0 -85t-0.5 -73.5v-49z" />
<glyph glyph-name="t" unicode="t" horiz-adv-x="646"
d="M350 32q0 -20 -5.5 -25.5t-25.5 -6.5q-26 0 -51.5 -0.5t-51.5 -0.5q-16 -1 -20 3t-5 20q-1 63 -1 125t-1 125q-1 35 -1.5 77.5t-2.5 77.5q-1 15 -1 22.5t-3 11t-11 4t-24 0.5h-103q-11 0 -17.5 1t-10 4t-5 9t-2.5 17q-2 30 -2.5 60.5t-0.5 60.5q0 10 6 13.5t14 3.5
q120 3 239 3t239 -4q17 -1 27 -9t11 -22q2 -30 2.5 -59.5t1.5 -58.5q0 -18 -19 -16l-39 2t-38 1q-39 1 -78 0q-14 -1 -17 -4.5t-3 -17.5v-50t-0.5 -74t0 -85.5t0 -85t-0.5 -73.5v-49z" />
<glyph glyph-name="U" unicode="U" horiz-adv-x="656"
d="M6 611q0 18 4 22t24 4q30 -2 60 -0.5t60 0.5q17 -1 20 -3.5t3 -19.5l-2 -61.5l-2 -61.5q-1 -45 -0.5 -88.5t0.5 -87.5q0 -25 6 -48.5t20 -44.5q37 -61 105 -49q23 3 36 22q43 58 40 126q-2 60 -0.5 120t-0.5 120q0 5 -0.5 14.5t-1 20l-1 20.5t-0.5 15q0 6 17.5 7.5
t41.5 1.5t47.5 -1.5t35.5 -2.5q9 -1 14.5 -0.5t9 0t5 -4t2.5 -12.5q2 -26 3.5 -56.5t2.5 -55.5q2 -37 0.5 -73.5t-2.5 -73.5q0 -25 -1.5 -50t-5.5 -50q-11 -73 -43 -132.5t-97 -100.5q-20 -13 -45.5 -20t-50 -10t-45.5 -3t-33 1q-8 1 -27.5 4.5t-44 13.5t-51.5 27t-49 44
t-36.5 65.5t-14.5 91.5q-1 47 -1 93.5v93.5l-0.5 19.5t-1 48t-0.5 60v55.5z" />
<glyph glyph-name="u" unicode="u" horiz-adv-x="656"
d="M6 611q0 18 4 22t24 4q30 -2 60 -0.5t60 0.5q17 -1 20 -3.5t3 -19.5l-2 -61.5l-2 -61.5q-1 -45 -0.5 -88.5t0.5 -87.5q0 -25 6 -48.5t20 -44.5q37 -61 105 -49q23 3 36 22q43 58 40 126q-2 60 -0.5 120t-0.5 120q0 5 -0.5 14.5t-1 20l-1 20.5t-0.5 15q0 6 17.5 7.5
t41.5 1.5t47.5 -1.5t35.5 -2.5q9 -1 14.5 -0.5t9 0t5 -4t2.5 -12.5q2 -26 3.5 -56.5t2.5 -55.5q2 -37 0.5 -73.5t-2.5 -73.5q0 -25 -1.5 -50t-5.5 -50q-11 -73 -43 -132.5t-97 -100.5q-20 -13 -45.5 -20t-50 -10t-45.5 -3t-33 1q-8 1 -27.5 4.5t-44 13.5t-51.5 27t-49 44
t-36.5 65.5t-14.5 91.5q-1 47 -1 93.5v93.5l-0.5 19.5t-1 48t-0.5 60v55.5z" />
<glyph glyph-name="V" unicode="V" horiz-adv-x="719"
d="M177 635q9 0 12 -5.5t5 -10.5q5 -10 8 -20l6 -20l37 -137.5l37 -137.5q3 -10 8 -22q2 -2 4.5 -3t4.5 -3q2 0 5 5q4 10 6 14q29 76 61 151.5t55 153.5q11 35 44 35h40h49.5h43h20.5q14 -3 10 -17q0 -4 -1.5 -7.5t-3.5 -7.5l-21 -56t-21 -55l-60.5 -140.5l-59.5 -139.5
l-39 -94.5l-39 -95.5q-8 -20 -14 -21.5t-25 -1.5h-167q-9 1 -11 7t-4 13l-15.5 51.5l-14.5 51.5l-38.5 145.5l-38.5 144.5q-12 43 -25 85l-26 84q-2 6 -3.5 11.5t-3.5 11.5q-5 19 1 25t26 5q4 0 24 0.5t44.5 0.5h47.5h32z" />
<glyph glyph-name="v" unicode="v" horiz-adv-x="719"
d="M177 635q9 0 12 -5.5t5 -10.5q5 -10 8 -20l6 -20l37 -137.5l37 -137.5q3 -10 8 -22q2 -2 4.5 -3t4.5 -3q2 0 5 5q4 10 6 14q29 76 61 151.5t55 153.5q11 35 44 35h40h49.5h43h20.5q14 -3 10 -17q0 -4 -1.5 -7.5t-3.5 -7.5l-21 -56t-21 -55l-60.5 -140.5l-59.5 -139.5
l-39 -94.5l-39 -95.5q-8 -20 -14 -21.5t-25 -1.5h-167q-9 1 -11 7t-4 13l-15.5 51.5l-14.5 51.5l-38.5 145.5l-38.5 144.5q-12 43 -25 85l-26 84q-2 6 -3.5 11.5t-3.5 11.5q-5 19 1 25t26 5q4 0 24 0.5t44.5 0.5h47.5h32z" />
<glyph glyph-name="W" unicode="W" horiz-adv-x="927"
d="M604 308q2 0 3.5 4.5t2.5 11t1.5 13t1.5 10.5q11 63 21 130.5l20 130.5q1 5 2 9t2 9q3 12 16 12q35 -2 70 -1t70 -1q18 -2 21.5 -7.5t0.5 -23.5q-11 -57 -21.5 -122.5t-21.5 -122.5l-23.5 -133l-22.5 -132q-3 -17 -7.5 -34.5t-7.5 -33.5q-4 -16 -7 -19.5t-19 -4.5
q-35 -1 -69.5 0.5t-69.5 -0.5q-16 -1 -24.5 6t-13.5 21l-25.5 61.5l-25.5 60.5l-26 59.5l-26 59.5q-2 2 -3.5 5.5t-5.5 3.5q-3 0 -5 -4t-4 -7q-34 -59 -61.5 -121l-53.5 -125q-2 -10 -6 -13q-4 -4 -8 -7t-9 -3q-29 -2 -57 -0.5t-57 -0.5q-14 0 -18 14l-24.5 105.5
l-24.5 105.5l-22.5 103l-23.5 102q-4 18 -8 40l-8 45.5t-8.5 45.5l-8.5 40q-1 4 -2 7t-2 7q-2 14 4.5 19t20.5 4q9 -1 29 -1.5t42.5 -0.5t42 0.5t28.5 1.5q8 0 10.5 -3t4.5 -9q4 -14 7.5 -31l7 -35l7 -35.5t6.5 -30.5l19 -73.5t19 -72.5q1 -3 2.5 -6.5t6.5 -3.5q3 0 7 8
l42 69t40 70q17 35 55 32q21 -2 42 -0.5t43 0.5q8 0 12 -4t8 -12q19 -45 39 -87.5l40 -86.5q2 -5 5.5 -11.5t7.5 -6.5z" />
<glyph glyph-name="w" unicode="w" horiz-adv-x="927"
d="M604 308q2 0 3.5 4.5t2.5 11t1.5 13t1.5 10.5q11 63 21 130.5l20 130.5q1 5 2 9t2 9q3 12 16 12q35 -2 70 -1t70 -1q18 -2 21.5 -7.5t0.5 -23.5q-11 -57 -21.5 -122.5t-21.5 -122.5l-23.5 -133l-22.5 -132q-3 -17 -7.5 -34.5t-7.5 -33.5q-4 -16 -7 -19.5t-19 -4.5
q-35 -1 -69.5 0.5t-69.5 -0.5q-16 -1 -24.5 6t-13.5 21l-25.5 61.5l-25.5 60.5l-26 59.5l-26 59.5q-2 2 -3.5 5.5t-5.5 3.5q-3 0 -5 -4t-4 -7q-34 -59 -61.5 -121l-53.5 -125q-2 -10 -6 -13q-4 -4 -8 -7t-9 -3q-29 -2 -57 -0.5t-57 -0.5q-14 0 -18 14l-24.5 105.5
l-24.5 105.5l-22.5 103l-23.5 102q-4 18 -8 40l-8 45.5t-8.5 45.5l-8.5 40q-1 4 -2 7t-2 7q-2 14 4.5 19t20.5 4q9 -1 29 -1.5t42.5 -0.5t42 0.5t28.5 1.5q8 0 10.5 -3t4.5 -9q4 -14 7.5 -31l7 -35l7 -35.5t6.5 -30.5l19 -73.5t19 -72.5q1 -3 2.5 -6.5t6.5 -3.5q3 0 7 8
l42 69t40 70q17 35 55 32q21 -2 42 -0.5t43 0.5q8 0 12 -4t8 -12q19 -45 39 -87.5l40 -86.5q2 -5 5.5 -11.5t7.5 -6.5z" />
<glyph glyph-name="X" unicode="X" horiz-adv-x="698"
d="M107 639h73q18 0 25 -15q9 -21 21 -39.5t25.5 -36.5l27 -36.5t25.5 -37.5q6 -11 10 -10.5t11 11.5l42 66l41 67q4 8 7.5 13.5t8.5 9t13.5 5t23.5 1.5h75q14 0 32 0.5t32 -0.5q16 -1 14 -10t-10 -22l-53.5 -77l-52.5 -78l-41.5 -60.5l-41.5 -59.5q-8 -11 -7.5 -19.5
t6.5 -19.5l21 -34t22 -34l64.5 -88.5l65.5 -87.5q1 -2 5.5 -7t8.5 -11.5t6.5 -13t0.5 -11.5q-2 -3 -12.5 -4t-18.5 -1q-36 0 -71.5 1.5t-70.5 0.5q-14 -1 -22.5 4.5t-15.5 15.5l-75 117q-2 4 -4.5 8t-5.5 8q-9 9 -16 -1l-14 -18t-14 -19l-35.5 -52l-35.5 -52q-7 -10 -19 -12
h-72.5t-73.5 1q-7 0 -11 1q-25 6 -10 27l76.5 108l77.5 108q8 11 15 22t15 22q8 10 7 18t-7 17l-54 86l-54 87l-35 57l-36 57q-18 28 18 28h46h27z" />
<glyph glyph-name="x" unicode="x" horiz-adv-x="698"
d="M107 639h73q18 0 25 -15q9 -21 21 -39.5t25.5 -36.5l27 -36.5t25.5 -37.5q6 -11 10 -10.5t11 11.5l42 66l41 67q4 8 7.5 13.5t8.5 9t13.5 5t23.5 1.5h75q14 0 32 0.5t32 -0.5q16 -1 14 -10t-10 -22l-53.5 -77l-52.5 -78l-41.5 -60.5l-41.5 -59.5q-8 -11 -7.5 -19.5
t6.5 -19.5l21 -34t22 -34l64.5 -88.5l65.5 -87.5q1 -2 5.5 -7t8.5 -11.5t6.5 -13t0.5 -11.5q-2 -3 -12.5 -4t-18.5 -1q-36 0 -71.5 1.5t-70.5 0.5q-14 -1 -22.5 4.5t-15.5 15.5l-75 117q-2 4 -4.5 8t-5.5 8q-9 9 -16 -1l-14 -18t-14 -19l-35.5 -52l-35.5 -52q-7 -10 -19 -12
h-72.5t-73.5 1q-7 0 -11 1q-25 6 -10 27l76.5 108l77.5 108q8 11 15 22t15 22q8 10 7 18t-7 17l-54 86l-54 87l-35 57l-36 57q-18 28 18 28h46h27z" />
<glyph glyph-name="Y" unicode="Y" horiz-adv-x="677"
d="M169 637q8 0 12 -3.5t8 -9.5q23 -34 46 -77.5t46 -78.5l5.5 -7.5l5.5 -7.5q8 -11 18 0l9 12q12 14 30 39l34.5 49l28.5 42t13 19q9 18 20.5 21t28.5 3q13 0 33 -0.5t39.5 -0.5h34.5h18q7 -2 9.5 -8t-2.5 -13q-2 -5 -5.5 -10t-7.5 -9q-20 -23 -39.5 -50.5l-40 -56
l-40.5 -55.5t-39 -50l-44 -50q-20 -20 -19 -50q4 -60 2.5 -130t2.5 -130q0 -11 -4 -17t-16 -7q-30 -2 -57 -1.5t-56 -0.5q-14 0 -18.5 5.5t-6.5 19.5q0 9 -0.5 33.5t-1 54t-0.5 57.5v43q0 13 -1 30t-4 34t-8 32.5t-14 27.5q-23 32 -42.5 65.5t-40.5 65.5q-20 29 -40.5 66.5
t-40.5 66.5q-3 5 -7 8.5t-7 8.5q-6 8 -2.5 13.5t13.5 6.5h22t41 -0.5t46 -0.5t38 1z" />
<glyph glyph-name="y" unicode="y" horiz-adv-x="677"
d="M169 637q8 0 12 -3.5t8 -9.5q23 -34 46 -77.5t46 -78.5l5.5 -7.5l5.5 -7.5q8 -11 18 0l9 12q12 14 30 39l34.5 49l28.5 42t13 19q9 18 20.5 21t28.5 3q13 0 33 -0.5t39.5 -0.5h34.5h18q7 -2 9.5 -8t-2.5 -13q-2 -5 -5.5 -10t-7.5 -9q-20 -23 -39.5 -50.5l-40 -56
l-40.5 -55.5t-39 -50l-44 -50q-20 -20 -19 -50q4 -60 2.5 -130t2.5 -130q0 -11 -4 -17t-16 -7q-30 -2 -57 -1.5t-56 -0.5q-14 0 -18.5 5.5t-6.5 19.5q0 9 -0.5 33.5t-1 54t-0.5 57.5v43q0 13 -1 30t-4 34t-8 32.5t-14 27.5q-23 32 -42.5 65.5t-40.5 65.5q-20 29 -40.5 66.5
t-40.5 66.5q-3 5 -7 8.5t-7 8.5q-6 8 -2.5 13.5t13.5 6.5h22t41 -0.5t46 -0.5t38 1z" />
<glyph glyph-name="Z" unicode="Z" horiz-adv-x="666"
d="M521 635q8 0 15 -0.5t14 -1.5q14 -2 18 -6t3 -18q0 -11 0.5 -26t0.5 -31t-0.5 -31t-1.5 -26q1 -23 -22 -50t-55 -68q-17 -21 -47 -52.5l-61 -62.5l-58 -56.5l-38 -35.5q-6 -4 -6 -12q0 -5 5.5 -5h9.5q57 -1 114 -0.5t115 -0.5h9t9 -1q16 -3 20 -8t4 -21q1 -28 0.5 -53.5
t1.5 -53.5q1 -10 -3 -13t-13 -3q-51 2 -100 0t-99 -1q-78 2 -155 2t-155 2q-6 0 -11.5 0.5t-10.5 1.5q-16 2 -16 17q-1 60 0 118q0 6 5 12.5t10 10.5q10 8 31 29l48.5 49l58 60l59.5 62l54.5 54.5t42.5 38.5l4.5 4.5t2.5 6.5t-5 4h-8q-69 2 -136.5 0.5t-136.5 -0.5
q-21 0 -26.5 4.5t-5.5 26.5q-1 28 -0.5 55.5t1.5 54.5q2 16 7 21.5t18 4.5q22 -2 61 -2h87t100 1t99 1t85 -0.5t57 -1.5z" />
<glyph glyph-name="z" unicode="z" horiz-adv-x="667"
d="M521 635q8 0 15 -0.5t14 -1.5q14 -2 18 -6t3 -18q0 -11 0.5 -26t0.5 -31t-0.5 -31t-1.5 -26q1 -23 -22 -50t-55 -68q-17 -21 -47 -52.5l-61 -62.5l-58 -56.5l-38 -35.5q-6 -4 -6 -12q0 -5 5.5 -5h9.5q57 -1 114 -0.5t115 -0.5h9t9 -1q16 -3 20 -8t4 -21q1 -28 0.5 -53.5
t1.5 -53.5q1 -10 -3 -13t-13 -3q-51 2 -100 0t-99 -1q-78 2 -155 2t-155 2q-6 0 -11.5 0.5t-10.5 1.5q-16 2 -16 17q-1 60 0 118q0 6 5 12.5t10 10.5q10 8 31 29l48.5 49l58 60l59.5 62l54.5 54.5t42.5 38.5l4.5 4.5t2.5 6.5t-5 4h-8q-69 2 -136.5 0.5t-136.5 -0.5
q-21 0 -26.5 4.5t-5.5 26.5q-1 28 -0.5 55.5t1.5 54.5q2 16 7 21.5t18 4.5q22 -2 61 -2h87t100 1t99 1t85 -0.5t57 -1.5z" />
<glyph glyph-name="guillemotleft" unicode="&#xab;" horiz-adv-x="537"
d="M434 411h12.5t18.5 -1q4 0 8 -1.5t8 -2.5q-2 -4 -3 -8t-3 -7l-21 -26.5l-21 -25.5l-47.5 -55l-48.5 -54q-15 -18 -4 -38l96 -156q4 -7 9.5 -13.5t0.5 -14.5q-4 -5 -12 -7t-16 -3q-15 -2 -30 -2h-29q-4 0 -8.5 2t-6.5 5q-12 32 -33 58t-38 55q-13 23 -27.5 44l-28.5 42
q-5 8 -5.5 13.5t6.5 13.5l71 86l71 85q5 6 14 8.5t17 4.5q11 1 22 0t28 -2zM125 -1q-12 -3 -19 2.5t-11 14.5q-17 42 -40 80.5l-45 77.5q-8 16 -7.5 27.5t10.5 25.5q26 38 50 77.5l47 79.5q9 16 21 24.5t32 6.5q16 -2 31.5 0.5t31.5 1.5q28 0 13 -21l-33.5 -50l-33.5 -49
l-21.5 -34.5l-21.5 -34.5q-14 -21 -1 -46l40 -74.5l40 -74.5l6 -15t2 -12q-2 -4 -7.5 -5t-10.5 -3q-1 0 -11 0.5t-23 1t-24.5 0.5t-14.5 -1z" />
<glyph glyph-name="guillemotright" unicode="&#xbb;" horiz-adv-x="457"
d="M50 -2q-7 0 -13 0.5t-12 1.5q-18 1 -19.5 3.5t6.5 19.5l34 78l34 77q6 12 5 21.5t-8 20.5q-17 32 -33 65.5l-33 66.5q-6 13 -3.5 16.5t17.5 4.5q20 2 39 2.5t38 -0.5q4 0 8.5 -4t6.5 -8l29 -58.5l29 -58.5q6 -12 14 -24.5t8 -25.5q1 -13 -7 -26t-13 -26
q-11 -27 -23 -53.5t-22 -53.5q-9 -25 -25 -33.5t-40 -6.5q-5 1 -9 1h-8zM259 -3q-10 -1 -19.5 -1t-19.5 -1q-38 -3 -22 31l33 70.5l33 70.5q10 18 11 34.5t-9 35.5q-12 21 -23 43l-22 45l-6 10.5l-6 11.5q-9 23 16 26q14 2 26.5 2t26.5 2q12 2 20.5 -2t13.5 -16l36 -76.5
l37 -76.5q4 -9 1.5 -15t-5.5 -14l-35.5 -81l-34.5 -81q-5 -11 -10.5 -16t-17.5 -3q-6 1 -15 0.5t-9 0.5z" />
<glyph glyph-name="dollar" unicode="$" horiz-adv-x="584"
d="M7 412q-1 49 -1.5 97t-1.5 97q0 16 5 22t21 7q11 1 22.5 0.5t23.5 -0.5q42 -2 84.5 -3.5t84.5 -3.5l49.5 -2t49.5 -4q29 -3 56 -14t47 -35q26 -32 41 -68.5t5 -80.5l-9.5 -41.5t-12.5 -40.5q-37 -81 -127 -96l-70 -10t-71 0q-3 1 -6.5 0.5t-7.5 -0.5q-13 0 -13 -13v-21
q0 -18 17 -18q21 -1 42.5 -1.5t42.5 -1.5q19 -1 22 -4.5t4 -21.5q1 -17 0.5 -27t-5.5 -14.5t-14.5 -5.5t-26.5 -1h-70q-17 -2 -16 -19q1 -15 1.5 -30t0.5 -30q0 -17 -6 -24t-22 -7q-29 1 -58 1.5t-58 1.5q-15 0 -17.5 3t-3.5 17l-2 77t0 78q0 30 0.5 70.5t0.5 77.5v63t-1 26
zM176 442q1 -14 0.5 -26.5t1.5 -26.5q0 -12 5 -16t17 -4q10 1 19.5 1t18.5 2l39.5 10t34.5 21q15 15 17 34.5t-13 34.5q-8 9 -19.5 17t-23.5 11q-20 4 -40 4t-41 1q-16 1 -16 -18v-28v-17z" />
<glyph glyph-name="underscore" unicode="_" horiz-adv-x="494"
d="M274 -143q24 1 36.5 1t22.5 0.5t22 0.5t35 1q15 0 18 -2.5t4 -16.5q2 -17 2 -33t1 -33q0 -18 -16 -19l-30 -2t-30 -1q-26 0 -38.5 -0.5t-22.5 -1.5t-22 -1.5t-38 -0.5q-11 0 -34.5 0.5t-50 1t-50 0.5t-33.5 -1q-19 -1 -26.5 4.5t-11.5 23.5q-3 16 -4.5 30t-3.5 31
q-2 11 2.5 14.5t16.5 4.5q32 0 60.5 0.5t61.5 0.5q7 0 25.5 -0.5t39.5 -0.5t39.5 -0.5t24.5 -0.5z" />
<glyph glyph-name="at" unicode="@" horiz-adv-x="698"
d="M12 176q1 60 25.5 109t66.5 91q36 35 79 57.5t95 28.5q7 1 14 1t14 2q38 6 79.5 -2t79 -24t66.5 -36t41 -37q30 -43 38 -86.5t1 -82.5t-25 -71t-39 -51q-33 -30 -73 -33.5t-75 23.5q-10 8 -18 9.5t-20 -2.5q-27 -11 -55 -10t-54 15q-8 5 -16.5 11t-12.5 14
q-9 22 -14.5 45t1.5 48q1 3 1.5 6.5t2.5 6.5q28 93 131 104q22 3 40.5 -1.5t37.5 -14.5q23 -13 19 -37q-5 -23 -0.5 -44.5t9.5 -42.5q2 -5 3 -9t3 -8q5 -8 12 -10.5t15 2.5t15.5 12t11.5 15q5 11 7.5 23.5t0.5 24.5q-8 63 -44.5 102t-103.5 44q-135 12 -211 -102
q-7 -11 -11.5 -23.5t-8.5 -25.5q-11 -48 0 -91t43 -81q22 -26 51 -39.5t64 -8.5q21 2 31 2.5t15 -4t8.5 -14l9.5 -26.5q4 -12 6 -24q2 -14 -3 -22t-19 -13q-100 -35 -192 25q-41 26 -69.5 61t-49.5 77q-5 9 -9 23.5t-7 31t-5 33t-2 29.5z" />
<glyph glyph-name="percent" unicode="%" horiz-adv-x="698"
d="M180 -8q-18 1 -35.5 1t-34.5 1t-10 16l73 149q11 20 21 40.5l20 41.5l50.5 102.5l49.5 103.5l23.5 49.5l22.5 49.5q5 10 12.5 15.5t20.5 4.5q27 -1 53.5 0t52.5 1q12 1 14.5 -1.5t-2.5 -12.5l-24.5 -55l-25.5 -54l-70 -144.5l-70 -144.5q-17 -35 -35.5 -69t-35.5 -69
q-13 -27 -42 -24q-7 1 -17.5 0.5t-10.5 -1.5zM379 120q1 34 12.5 57.5t29.5 38t42.5 21t52.5 5.5q28 -2 50.5 -17.5t34.5 -43.5q20 -48 6 -91.5t-48 -70.5q-47 -36 -100 -13q-5 2 -13 6q-40 18 -54.5 41t-12.5 67zM533 131q0 14 -11 23.5t-27 8.5q-12 -1 -23.5 -12
t-10.5 -22q0 -15 13.5 -27t28.5 -12q13 0 21.5 12t8.5 29zM4 482q3 42 21.5 63t60.5 32q25 8 46 2.5t42 -19.5q18 -12 30 -29t16.5 -36.5t2 -40.5t-12.5 -40q-12 -21 -28.5 -35t-35.5 -21t-39.5 -5.5t-40.5 12.5q-31 16 -49 45t-13 72zM149 469q2 29 -29 31
q-15 1 -26.5 -7.5t-10.5 -20.5q0 -11 11 -22t23 -12q11 -1 21 8.5t11 22.5z" />
<glyph glyph-name="numbersign" unicode="#" horiz-adv-x="604"
d="M298 1h-11q-14 0 -22 1.5t-11 5.5t-2 12t5 22l6 22l6 22q3 16 -12 17q-1 0 -1.5 0.5t-1.5 0.5q-22 2 -34.5 2t-20.5 -5t-13.5 -16.5t-12.5 -31.5q0 -1 -0.5 -1.5t-0.5 -2.5q-6 -11 -11.5 -23l-10.5 -24q-20 0 -39 -0.5t-38 0.5q-7 0 -10 5t-1 13q4 12 7.5 24t6.5 24
q4 14 0.5 18t-18.5 6q-10 1 -19.5 0.5t-19.5 -0.5q-9 1 -13.5 4.5t-2.5 13.5q2 8 3.5 17t4.5 17l9.5 25.5t9.5 14t16 5.5t27 2q15 1 23.5 2.5t13.5 6t7 13t4 22.5q1 11 -1.5 14.5t-13.5 3.5h-46q-16 0 -11 17l10 30l10 30q6 19 27 18q9 -1 18 -0.5t17 0.5q18 1 22.5 4
t10.5 20q12 35 21 74q2 7 5 11t11 4q20 0 41 0.5t41 0.5q14 0 9 -14l-24 -81q-4 -14 9 -13h28.5t28.5 2q20 1 24.5 5.5t10.5 24.5l10 34l10 34q1 3 4.5 6.5t6.5 3.5q31 1 63 0q17 0 21 -5t-1 -22q-5 -16 -9 -32t-9 -32q-2 -9 0 -12t12 -3q11 1 21 2.5t21 1.5q26 1 19 -24
q-3 -9 -8 -19l-24 -54q-14 -1 -28 -1.5t-28 -1.5q-17 0 -21 -2.5t-10 -18.5q-1 -2 -1 -5t-1 -5q-6 -20 -3.5 -23t22.5 -3h39q23 0 16 -22q-5 -15 -11 -29.5t-11 -30.5q-7 -22 -31 -21q-12 0 -24.5 -1t-24.5 0q-17 0 -21 -15q-4 -14 -7.5 -29l-6.5 -29q-2 -10 -4 -15.5
t-5.5 -8.5t-9.5 -3.5t-16 -0.5h-21v1zM259 199q10 0 19.5 -0.5t19.5 0.5q3 0 7 1t5 3q3 12 7 24t3 23q-1 9 -10 8.5t-17 -0.5q-10 1 -19.5 0.5t-19.5 0.5q-21 3 -28 -19q-5 -16 -7 -25t1 -12.5t12.5 -4t26.5 0.5z" />
<glyph glyph-name="ampersand" unicode="&#x26;" horiz-adv-x="677"
d="M3 175q-1 32 7 63t32 56q14 14 29.5 26t31.5 23q15 10 4 22q-30 38 -35 81t3 88q4 25 20 43.5t38 32.5q35 22 72.5 26.5t77.5 -6.5q34 -10 55 -32t35 -52q12 -27 14.5 -57.5t-3.5 -60.5t-20.5 -56t-36.5 -43q-16 -11 -16 -17t14 -21q7 -8 14 -14.5t13 -14.5q12 -14 24 0
l11 17l14 22.5t12 21t6 12.5q5 20 29 19q21 -1 43 0t42 -1q14 -1 14 -15q-2 -48 -20.5 -91t-43.5 -81q-11 -15 -10.5 -20t12.5 -18l39 -40.5l39 -41.5q2 -2 5 -5.5t5 -5.5q5 -5 9 -11t0 -14q-3 -8 -9.5 -8.5t-14.5 -0.5h-62.5t-62.5 1q-3 0 -7 3t-8.5 7t-8.5 8l-6 6
q-13 15 -31 4q-53 -32 -117 -46q-60 -13 -110 3.5t-93 54.5q-29 25 -40.5 59t-8.5 74zM227 132q8 0 16.5 3t17.5 7q9 3 10.5 9t-3.5 13l-27.5 32.5l-27.5 32.5q-8 8 -19 1q-17 -11 -24.5 -29.5t-2.5 -34.5q5 -13 25.5 -23.5t34.5 -10.5zM271 470q0 17 -6 26.5t-14 14
t-16.5 4t-13.5 -2.5q-10 -4 -15.5 -12t-2.5 -19q5 -17 11.5 -32.5t14.5 -31.5q1 -2 5 -3t6 0q13 9 22 25.5t9 30.5z" />
<glyph glyph-name="quotedblleft" unicode="&#x201c;" horiz-adv-x="537"
d="M434 411h12.5t18.5 -1q4 0 8 -1.5t8 -2.5q-2 -4 -3 -8t-3 -7l-21 -26.5l-21 -25.5l-47.5 -55l-48.5 -54q-15 -18 -4 -38l96 -156q4 -7 9.5 -13.5t0.5 -14.5q-4 -5 -12 -7t-16 -3q-15 -2 -30 -2h-29q-4 0 -8.5 2t-6.5 5q-12 32 -33 58t-38 55q-13 23 -27.5 44l-28.5 42
q-5 8 -5.5 13.5t6.5 13.5l71 86l71 85q5 6 14 8.5t17 4.5q11 1 22 0t28 -2zM125 -1q-12 -3 -19 2.5t-11 14.5q-17 42 -40 80.5l-45 77.5q-8 16 -7.5 27.5t10.5 25.5q26 38 50 77.5l47 79.5q9 16 21 24.5t32 6.5q16 -2 31.5 0.5t31.5 1.5q28 0 13 -21l-33.5 -50l-33.5 -49
l-21.5 -34.5l-21.5 -34.5q-14 -21 -1 -46l40 -74.5l40 -74.5l6 -15t2 -12q-2 -4 -7.5 -5t-10.5 -3q-1 0 -11 0.5t-23 1t-24.5 0.5t-14.5 -1z" />
<glyph glyph-name="quotedblright" unicode="&#x201d;" horiz-adv-x="448"
d="M50 -2q-7 0 -13 0.5t-12 1.5q-18 1 -19.5 3.5t6.5 19.5l34 78l34 77q6 12 5 21.5t-8 20.5q-17 32 -33 65.5l-33 66.5q-6 13 -3.5 16.5t17.5 4.5q20 2 39 2.5t38 -0.5q4 0 8.5 -4t6.5 -8l29 -58.5l29 -58.5q6 -12 14 -24.5t8 -25.5q1 -13 -7 -26t-13 -26
q-11 -27 -23 -53.5t-22 -53.5q-9 -25 -25 -33.5t-40 -6.5q-5 1 -9 1h-8zM259 -3q-10 -1 -19.5 -1t-19.5 -1q-38 -3 -22 31l33 70.5l33 70.5q10 18 11 34.5t-9 35.5q-12 21 -23 43l-22 45l-6 10.5l-6 11.5q-9 23 16 26q14 2 26.5 2t26.5 2q12 2 20.5 -2t13.5 -16l36 -76.5
l37 -76.5q4 -9 1.5 -15t-5.5 -14l-35.5 -81l-34.5 -81q-5 -11 -10.5 -16t-17.5 -3q-6 1 -15 0.5t-9 0.5z" />
<glyph glyph-name="less" unicode="&#x3c;" horiz-adv-x="457"
d="M391 398q-1 -14 -1.5 -26.5t-2.5 -26.5l-54 -24q-39 -17 -78.5 -32.5l-78.5 -31.5q-4 -2 -7 -5t-7 -5q3 -3 5.5 -6t6.5 -5q50 -30 101.5 -57t105.5 -50q25 -11 22 -38q-2 -19 -2 -37t-1 -37q-2 -17 -17 -11l-21 10l-21 10l-99 49.5l-100 50.5l-57.5 30.5l-57.5 30.5
q-25 11 -23 39l2 30t0 30q-1 20 18 27l98.5 43.5l99.5 42.5l73.5 29.5l73.5 29.5q14 6 19 3t5 -17v-13t-0.5 -15t-1 -12.5z" />
<glyph glyph-name="greater" unicode="&#x3e;" horiz-adv-x="473"
d="M6 119q-5 15 3 23.5t22 14.5l77 34.5l77 34.5q7 3 13.5 5.5t12.5 6.5q3 2 4.5 4.5t3.5 4.5q-5 5 -8 6q-26 11 -56 21q-38 11 -72 30t-69 36q-2 2 -4.5 6t-2.5 8q-1 23 -1 44.5t-1 44.5q0 15 18 10l54.5 -19.5t55.5 -20.5l88.5 -34.5l88.5 -34.5l31 -13.5t31 -12.5
q10 -4 12.5 -10.5t2.5 -14.5q1 -18 0.5 -35.5t1.5 -34.5q1 -15 -4 -24.5t-19 -14.5l-35.5 -16l-35.5 -16l-112 -52.5l-112 -52.5q-7 -3 -13 -6l-12 -6q-17 -8 -24 -4t-10 22q-2 16 -3 32t-3 34z" />
<glyph glyph-name="quotedblbase" unicode="&#x201e;" horiz-adv-x="833"
/>
<glyph glyph-name="quotedbl" unicode="&#x22;" horiz-adv-x="833"
/>
<glyph glyph-name="uni0406" unicode="&#x406;" horiz-adv-x="302"
d="M198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25
q-1 -66 -2 -148.5t-3 -172.5z" />
<glyph glyph-name="uni0456" unicode="&#x456;" horiz-adv-x="302"
d="M198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25
q-1 -66 -2 -148.5t-3 -172.5z" />
<glyph glyph-name="uni0490" unicode="&#x490;" horiz-adv-x="542"
d="M8 293v50t-0.5 61l-1 64t-1 58.5t-1 44.5t-0.5 23v15t1 15q0 17 19 18q18 0 44.5 0.5t58.5 0.5h67h69v28.5v26.5t0.5 20t0.5 11q0 17 19 18q31 1 48.5 1h29.5t22 -0.5t27 -0.5q18 0 22 -4t6 -22q0 -3 0.5 -19t1 -39t1 -49.5t1 -50t1 -41.5t1.5 -23q2 -16 -2 -21.5
t-19 -7.5q-6 -1 -33 -1.5t-61.5 -0.5t-69 -0.5t-56.5 -0.5q-16 0 -16 -17q0 -4 -0.5 -7.5t-0.5 -7.5q1 -75 0 -156t1 -156q1 -23 0.5 -40t0.5 -40q1 -14 -2 -31q-3 -15 -19 -15q-38 -2 -72.5 -2.5t-71.5 -1.5q-8 0 -10.5 4t-3.5 10q-1 7 -1 13.5v13.5v130t-1 129h1z" />
<glyph glyph-name="uni0491" unicode="&#x491;" horiz-adv-x="542"
d="M8 293v50t-0.5 61l-1 64t-1 58.5t-1 44.5t-0.5 23v15t1 15q0 17 19 18q18 0 44.5 0.5t58.5 0.5h67h69v28.5v26.5t0.5 20t0.5 11q0 17 19 18q31 1 48.5 1h29.5t22 -0.5t27 -0.5q18 0 22 -4t6 -22q0 -3 0.5 -19t1 -39t1 -49.5t1 -50t1 -41.5t1.5 -23q2 -16 -2 -21.5
t-19 -7.5q-6 -1 -33 -1.5t-61.5 -0.5t-69 -0.5t-56.5 -0.5q-16 0 -16 -17q0 -4 -0.5 -7.5t-0.5 -7.5q1 -75 0 -156t1 -156q1 -23 0.5 -40t0.5 -40q1 -14 -2 -31q-3 -15 -19 -15q-38 -2 -72.5 -2.5t-71.5 -1.5q-8 0 -10.5 4t-3.5 10q-1 7 -1 13.5v13.5v130t-1 129h1z" />
<glyph glyph-name="uni0407" unicode="&#x407;" horiz-adv-x="302"
d="M9 719q-16 1 -29.5 7t-23.5 16.5t-15.5 23.5t-4.5 28q1 13 7.5 25t16.5 21t22.5 14.5t25.5 5.5q12 0 24.5 -6.5t22 -17t15.5 -23t6 -24.5q0 -15 -5.5 -28t-14.5 -22.5t-21.5 -15t-25.5 -4.5zM196 855q12 0 23.5 -5t20.5 -13.5t14 -19t5 -22.5q-1 -30 -18.5 -49.5
t-44.5 -18.5q-29 0 -48 19.5t-19 49.5q-1 26 18 42.5t49 16.5zM198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5
t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25q-1 -66 -2 -148.5t-3 -172.5z" />
<glyph glyph-name="uni0457" unicode="&#x457;" horiz-adv-x="302"
d="M9 719q-16 1 -29.5 7t-23.5 16.5t-15.5 23.5t-4.5 28q1 13 7.5 25t16.5 21t22.5 14.5t25.5 5.5q12 0 24.5 -6.5t22 -17t15.5 -23t6 -24.5q0 -15 -5.5 -28t-14.5 -22.5t-21.5 -15t-25.5 -4.5zM196 855q12 0 23.5 -5t20.5 -13.5t14 -19t5 -22.5q-1 -30 -18.5 -49.5
t-44.5 -18.5q-29 0 -48 19.5t-19 49.5q-1 26 18 42.5t49 16.5zM198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5
t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25q-1 -66 -2 -148.5t-3 -172.5z" />
<glyph glyph-name="uni0404" unicode="&#x404;" horiz-adv-x="674"
d="M-22 300q-5 72 15 132.5t64 112.5q35 42 78.5 71.5t99.5 37.5q60 9 121 6q100 -3 178 -69q11 -10 11.5 -14t-9.5 -16q-4 -4 -7 -8.5t-6 -9.5l-23.5 -39l-24.5 -39q-8 -13 -15.5 -16.5t-24.5 5.5q-81 44 -173 18q-27 -8 -49.5 -23t-32.5 -44q-4 -13 -2 -16.5t16 -5.5
q9 0 33.5 -0.5t52 -0.5t52 -0.5t33.5 -0.5q21 -1 28.5 -8.5t6.5 -28.5q0 -11 -2 -21t-2 -21q0 -21 -20 -21q-8 -1 -17 -1h-17h-29.5t-48.5 0.5t-48.5 0.5h-28.5q-20 0 -14 -20q14 -46 55 -64q52 -23 103 -23.5t100 32.5q17 11 32 24t29 27q16 16 34 7q12 -6 17 -19l27 -64.5
l27 -65.5q3 -8 -0.5 -12.5t-8.5 -9.5q-43 -40 -95 -62q-67 -29 -135.5 -40.5t-141.5 11.5q-41 13 -75.5 32.5t-68.5 44.5q-33 24 -54 62t-31 78.5t-9 80.5z" />
<glyph glyph-name="uni0454" unicode="&#x454;" horiz-adv-x="674"
d="M-22 300q-5 72 15 132.5t64 112.5q35 42 78.5 71.5t99.5 37.5q60 9 121 6q100 -3 178 -69q11 -10 11.5 -14t-9.5 -16q-4 -4 -7 -8.5t-6 -9.5l-23.5 -39l-24.5 -39q-8 -13 -15.5 -16.5t-24.5 5.5q-81 44 -173 18q-27 -8 -49.5 -23t-32.5 -44q-4 -13 -2 -16.5t16 -5.5
q9 0 33.5 -0.5t52 -0.5t52 -0.5t33.5 -0.5q21 -1 28.5 -8.5t6.5 -28.5q0 -11 -2 -21t-2 -21q0 -21 -20 -21q-8 -1 -17 -1h-17h-29.5t-48.5 0.5t-48.5 0.5h-28.5q-20 0 -14 -20q14 -46 55 -64q52 -23 103 -23.5t100 32.5q17 11 32 24t29 27q16 16 34 7q12 -6 17 -19l27 -64.5
l27 -65.5q3 -8 -0.5 -12.5t-8.5 -9.5q-43 -40 -95 -62q-67 -29 -135.5 -40.5t-141.5 11.5q-41 13 -75.5 32.5t-68.5 44.5q-33 24 -54 62t-31 78.5t-9 80.5z" />
<glyph glyph-name="uni20B4" unicode="&#x20b4;" horiz-adv-x="583"
d="M261 271l-10 -6q-16 -9 -31 -19.5t-28 -23.5q-11 -11 -14 -24t0.5 -25t13.5 -21t25 -12q8 -2 15.5 -0.5t14.5 1.5q36 -1 65 6t57 21q14 7 23.5 12.5t20.5 16.5q5 5 10 3.5t8 -6.5q5 -7 8 -14t7 -15q10 -22 16 -36.5t11 -35.5q3 -11 5 -17.5t2 -11.5t-3.5 -9.5
t-12.5 -12.5q-6 -6 -12 -9q-33 -17 -62 -27t-72 -15q-26 -3 -47 -5t-41.5 -1.5t-42.5 3.5t-50 9q-60 14 -92 57.5t-39 103.5q-4 31 0.5 59t24.5 54l5 7zM187 395l17 9l33.5 18.5t32.5 20.5q12 9 14.5 25.5t-3.5 28.5q-7 14 -20 15.5t-31 1.5q-22 0 -42 -5.5t-35 -12.5
t-24.5 -13.5t-11.5 -7.5q-12 -7 -20 2q-9 9 -15 18.5t-11.5 19.5l-11 20t-14.5 20q-5 5 -7 13t4 14q19 19 34.5 32t41.5 24q14 6 39.5 12t58 7.5t71.5 -5.5t80 -27q30 -15 44 -28.5t28 -33.5q36 -50 21 -112q-5 -19 -12 -34.5t-18 -28.5zM491 443q15 0 18 -2.5t4 -16.5
q1 -9 1.5 -12.5t0.5 -5.5t0.5 -5.5t0.5 -12.5q0 -18 -16 -19l-30 -2t-30 -1h-54t-81 0.5l-93 1t-89.5 1t-70.5 0.5h-36q-19 -1 -28 3t-10 25q0 8 -0.5 12t-0.5 14q0 11 3.5 14.5t15.5 4.5h47.5h86.5h107h108.5t91 0.5t54.5 0.5zM473 316q15 0 18 -2.5t4 -16.5
q1 -9 1.5 -12.5t0.5 -5.5t0.5 -5.5t0.5 -12.5q0 -18 -16 -19l-30 -2t-30 -1h-54t-81 0.5l-93 1t-89.5 1t-70.5 0.5h-36q-19 -1 -28 3t-10 25q0 8 -0.5 12t-0.5 14q0 11 3.5 14.5t15.5 4.5h47.5h86.5h107h108.5t91 0.5t54.5 0.5z" />
<hkern u1="&#x413;" u2="&#x430;" k="70" />
<hkern u1="&#x413;" u2="&#x410;" k="70" />
<hkern u1="&#x422;" u2="&#x430;" k="50" />
<hkern u1="&#x422;" u2="&#x410;" k="50" />
<hkern u1="&#x410;" u2="&#x422;" k="50" />
<hkern u1="&#x430;" u2="&#x442;" k="50" />
<hkern u1="&#x433;" u2="&#x430;" k="70" />
<hkern u1="&#x442;" u2="&#x430;" k="50" />
<hkern u1="A" u2="T" k="50" />
<hkern u1="a" u2="t" k="50" />
<hkern u1="T" u2="a" k="50" />
<hkern u1="T" u2="A" k="50" />
<hkern u1="t" u2="a" k="50" />
<hkern u1="&#x490;" u2="&#x430;" k="70" />
<hkern u1="&#x490;" u2="&#x410;" k="70" />
<hkern u1="&#x491;" u2="&#x430;" k="70" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.
Binary file not shown.
-7
View File
@@ -1,7 +0,0 @@
@font-face {
font-family: "Shadow";
src: url("Shadow-Regular.eot");
src: url("Shadow-Regular.woff") format("woff"),
url("Shadow-Regular.otf") format("opentype"),
url("Shadow-Regular.svg") format("svg");
}
View File
File renamed without changes.
-46
View File
@@ -1,46 +0,0 @@
const { Feed } = require('feed')
const axios = require('axios')
const fs = require('fs').promises
const api = axios.create({
baseURL: 'https://api.tmshv.com/hudozka',
})
async function getArticles(limit) {
const query = ['post', 'event', 'album']
.map(t => `tag=${t}`)
.join('&')
const url = `/api/pages/tags?${query}&sortBy=-date&skip=0&pageSize=${limit}`
const res = await api.get(url)
return res.data.items
}
(async () => {
const articles = await getArticles(30)
const url = 'https://art.shlisselburg.org'
const feed = new Feed({
title: 'Шлиссельбургская ДХШ',
id: url,
link: url,
feedLinks: {
atom: 'https://art.shlisselburg.org/feed.xml',
},
});
articles.forEach(article => {
feed.addItem({
title: article.title,
date: new Date(article.date),
id: article.id,
link: article.url,
content: article.data,
})
})
const content = feed.atom1()
await fs.writeFile('dist/feed.xml', content, { encoding: 'utf-8' })
})()
-48
View File
@@ -1,48 +0,0 @@
const sitemap = require('sitemap')
const axios = require('axios')
const fs = require('fs').promises
const homeUrl = 'https://art.shlisselburg.org'
const sitemapCacheTime = 600000
const api = axios.create({
baseURL: 'https://api.tmshv.com/hudozka',
})
async function getMenuUrls(frequency = 'daily') {
const menu = [
'/',
'/collective',
]
return menu
// .filter(i => 'url' in i)
.map(url => ({
url,
changefreq: frequency
}))
}
async function getPageUrls(frequency = 'daily') {
const res = await api.get('/api/pages/urls')
return res.data.items.map(url => ({
changefreq: frequency,
url,
}))
}
(async () => {
let urls = await Promise.all([
getMenuUrls(),
getPageUrls(),
])
urls = urls.reduce((urls, i) => urls.concat(i))
let map = sitemap.createSitemap({
hostname: homeUrl,
cacheTime: sitemapCacheTime,
urls
})
const content = map.toString()
await fs.writeFile('dist/sitemap.xml', content, { encoding: 'utf-8' })
})()
+3
View File
@@ -0,0 +1,3 @@
{
"presets": ["es2015", "react", "stage-0"]
}
+11
View File
@@ -0,0 +1,11 @@
.DS_Store
.idea
*.sublime*
npm-debug.log
.private*
/node_modules
/build
/out
/coverage
+41
View File
@@ -0,0 +1,41 @@
#!/bin/sh
echo "Deploying Instagram Microservice"
#NODE_ENV=production gulp deploy
server="art.shburg.org"
tarfile="build.tar.gz"
tarpath=$TMPDIR${tarfile}
destpath="~/www/art.shburg.org/services/instagram"
private=".private"
echo "Building..."
NODE_ENV=production npm run webpack
npm run build
echo "Packing..."
env GZIP=-9 tar -czf ${tarpath} \
--disable-copyfile \
--exclude=node_modules \
--exclude=.git \
--exclude=.idea \
--exclude=.DS_Store \
--exclude=.private* \
--exclude=src \
--exclude=deploy.sh \
--exclude=install.sh \
.
echo "Build file: $tarpath"
scp ${tarpath} hoster@${server}:${destpath}
echo "Build file successfully uploaded on ${server}"
scp ${private} hoster@${server}:${destpath}
echo "Installing..."
ssh hoster@${server} "bash -s" -- < ./install.sh ${destpath} ${tarfile}
rm ${tarpath}
echo "Done"
+8
View File
@@ -0,0 +1,8 @@
{
"uid": "hudozka-instagram",
"append": true,
"watch": false,
"script": "index.js",
"sourceDir": "/home/hoster/www/art.shburg.org/services/instagram/out",
"wordingDir": "/home/hoster/www/art.shburg.org/services/instagram"
}
+17
View File
@@ -0,0 +1,17 @@
#!/bin/sh
dir_path="$1"
build_file="$2"
app="hudozka-instagram"
script="forever.json"
cd ${dir_path}
gunzip -c ${build_file} | tar xopf -
npm install --production --loglevel error
if forever restart ${app}; then
echo Instagram Microservice restarted
else
forever start ${script}
echo Instagram Microservice started
fi
+39
View File
@@ -0,0 +1,39 @@
server {
listen 443 ssl;
server_name art.shburg.org;
ssl_certificate /etc/letsencrypt/live/art.shlisselburg.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/art.shlisselburg.org/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
location /service/instagram {
proxy_pass http://hudozka_instagram/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
error_log /var/log/nginx/art.shburg.instagram.error.log;
access_log /var/log/nginx/art.shburg.instagram.access.log;
}
server {
listen 80;
server_name art.shburg.org;
return 301 https://art.shburg.org$request_uri;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream hudozka_instagram {
server localhost:18000;
}
+46
View File
@@ -0,0 +1,46 @@
{
"name": "hudozka-instagram",
"version": "0.0.0",
"private": true,
"scripts": {
"devwebpack": "NODE_ENV=development webpack",
"webpack": "webpack",
"start": "babel-node src/index.js",
"build": "babel src -d out"
},
"dependencies": {
"babel-polyfill": "^6.7.2",
"co": "^4.6.0",
"ejson": "^2.1.2",
"instagram-node": "^0.5.8",
"jsonwebtoken": "^5.7.0",
"kerberos": "0.0.19",
"koa": "^2.0.0-alpha.3",
"koa-bodyparser": "^3.0.0",
"koa-compose": "^3.1.0",
"koa-convert": "^1.2.0",
"koa-logger": "^2.0.0",
"koa-mount": "^2.0.0",
"koa-route": "^3.0.0",
"koa-session-mongo": "^1.1.0",
"koa-session-store": "^1.1.1",
"koa-static": "^3.0.0",
"mongodb": "^2.1.10",
"mz": "^2.3.1",
"react": "^0.14.7",
"react-dom": "^0.14.7",
"react-router": "^2.0.1",
"request-promise": "^2.0.1",
"thunkify": "^2.1.2"
},
"devDependencies": {
"babel-core": "^6.7.2",
"babel-preset-es2015": "^6.6.0",
"babel-preset-stage-0": "^6.5.0",
"babel-cli": "^6.6.5",
"babel-loader": "^6.2.4",
"babel-preset-react": "^6.5.0",
"html-webpack-plugin": "^2.10.0",
"webpack": "^1.12.14"
}
}
+5
View File
@@ -0,0 +1,5 @@
export default class EndPoint{
constructor(request) {
this.request = request;
}
}
+7
View File
@@ -0,0 +1,7 @@
import EndPoint from './EndPoint';
export default class Feed extends EndPoint {
add(post) {
return this.request.request('PUT', '/timeline', post);
}
}
+33
View File
@@ -0,0 +1,33 @@
import {stringify} from 'ejson';
import {EventEmitter} from 'events';
import request from 'request-promise';
import Feed from './Feed';
let json = i => stringify(i);
export default class Service extends EventEmitter{
constructor(host, service, secret) {
super();
this.version = 'v1';
this.host = host;
this.service = service;
this.secret = secret;
this.feed = new Feed(this);
}
request(method, path, data) {
let buildPath = path => `${this.host}/api/${this.version}${path}`;
let options = {
method: method,
uri: buildPath(path),
headers: {
'Content-Type': 'application/ejson',
'X-Service-Name': this.service,
'X-Service-Token': this.secret
},
body: json(data)
};
return request(options);
}
}
+25
View File
@@ -0,0 +1,25 @@
import React from 'react';
import {render} from 'react-dom';
import {Router, Route, browserHistory} from 'react-router';
import App from './components/App';
render(
(
<Router history={browserHistory}>
<Route path="/" component={App}>
</Route>
</Router>
),
document.querySelector('.app-container')
);
// <Route path="login" component={Login}/>
// <Route path="logout" component={Logout}/>
// <Route path="about" component={About}/>
// <Route path="dashboard" component={Dashboard} onEnter={requireAuth}/>
// render(
// <App/>,
// document.querySelector('.app-container')
// );
+18
View File
@@ -0,0 +1,18 @@
import React from 'react';
export default class App extends React.Component{
handleClick(event){
}
render(){
return (
<div>
<h1>Панель управления инстаграмом художки</h1>
<p>Чтобы управлять, вы должны быть <a href="https://instagram.com/hudozka">hudozka</a></p>
<a href="auth" onClick={this.handleClick.bind(this)}>Войти</a>
</div>
)
}
}
+67
View File
@@ -0,0 +1,67 @@
import path from 'path';
import {readFileSync} from 'fs';
const env = process.env['NODE_ENV'] || 'production';
const isProduction = env === 'production';
let privatePath = path.join(
__dirname,
process.env['PRIVATE'] || '../.private'
);
let privateData = JSON.parse(
readFileSync(privatePath, 'utf-8')
);
export const staticPath = path.join(
__dirname,
'../build'
);
export const port = isProduction ? 18000 : 3000;
export const pathPrefix = isProduction ? '/service/instagram' : '';
export const baseHref = isProduction ? '/service/instagram/' : '/';
// export const pathPrefix = '';
export const indexPath = path.join(
__dirname,
// './templates/index.html'
'../build/main.html'
);
// export const indexPath = '../build/main.html';
export const clientId = privateData['clientId'];
export const clientSecret = privateData['clientSecret'];
export const redirectUri = privateData['redirectUri'];
export const serviceHost = isProduction ? 'http://localhost:1800' : 'http://localhost:8080';
export const serviceName = 'instagram';
export const serviceSecret = privateData['serviceSecret'];
export const jwtSecret = privateData['jwtSecret'];
export const sessionSecret = privateData['sessionSecret'];
export const sessionExpirationTime = 60 * 60 * 24 * 2; // two days in seconds
export const authScope = [
'basic',
// 'public_content',
// 'follower_list',
'comments',
// 'relationships',
'likes'
];
export const postType = 'instagram-2';
export const fetchItemsPerUpdateLoop = 1;
export const updateSubscriptionDelay = 1000 * 60 * 60; // one hour in milliseconds
export const updateSubscriptionCallbackUrl = isProduction ? `https://art.shburg.org${pathPrefix}/callback/hudozka` : 'http://dev.tmshv.ru/callback/hudozka';
export const database = {
host: 'localhost',
port: 27017,
db: 'hudozka',
username: privateData['databaseUser'],
password: privateData['databasePassword']
};
const databaseAuth = database.username && database.password ? `${database.username}:${database.password}@` : '';
export const databaseUri = `mongodb://${databaseAuth}${database.host}:${database.port}/${database.db}`;
+48
View File
@@ -0,0 +1,48 @@
import {collection} from './db';
import {jwtSecret} from '../config';
import {sign} from 'jsonwebtoken';
/**
* {
* username: String,
* bio: String,
* website: String,
* profile_picture: String,
* full_name: String,
* id: String
* }
*
* @param accessToken
* @param user
*/
export async function authorizeUser(accessToken, user) {
const provider = 'instagram';
const users = collection('users');
let profile = await users.findOne({
provider: provider,
username: user.username
});
if(profile){
Object.keys(user).forEach(i => {
profile[i] = user[i];
});
profile.accessToken = accessToken;
profile.jwtToken = await createToken(profile);
await users.update({_id: profile['_id']}, profile);
return profile;
}else{
return null;
}
}
async function createToken(user){
return new Promise((resolve, reject) => {
sign(user, jwtSecret, {}, token => {
if (!token) return reject();
resolve(token);
});
});
}
+15
View File
@@ -0,0 +1,15 @@
import {MongoClient} from 'mongodb';
import co from 'co';
export var db;
export function connect(uri){
return co(function*() {
db = yield MongoClient.connect(uri);
return db;
})
}
export function collection(name){
return db.collection(name);
}
Loaded 100 of 448 files, more files were not shown because too many files have changed in this diff. Show more