Compare commits

..

51 Commits
0.1.0 ... 0.4.2

Author SHA1 Message Date
undergroundwires
074734242b 🚀 0.4.2 release 2020-02-29 18:51:55 +01:00
undergroundwires
802b36bdd8 shortened all HKEY paths 2020-01-12 10:10:37 +01:00
undergroundwires
0c39a06be5 set font on input 2020-01-11 10:55:43 +01:00
undergroundwires
e63ac4ae67 added missing semicolon for masking 2020-01-11 09:45:37 +01:00
undergroundwires
edd076fade 🚀 0.4.1 release 2020-01-11 09:27:19 +01:00
undergroundwires
0ce354ea09 using right 🔍 input type 2020-01-11 09:14:45 +01:00
undergroundwires
19813b6917 more efficient queries with single lowercase 2020-01-11 08:57:24 +01:00
undergroundwires
97a7747933 👀🔍 showing search queries 2020-01-11 08:57:06 +01:00
undergroundwires
92f1a36bcb hide grouping while searching 2020-01-11 07:20:44 +01:00
undergroundwires
31364bdfec fixed search bug 2020-01-11 07:18:02 +01:00
undergroundwires
5b743a67a4 Merge pull request #3 from undergroundwires/develop
Develop
2020-01-11 05:57:01 +01:00
undergroundwires
16a7327750 🚀 v0.4.0 2020-01-11 05:50:58 +01:00
undergroundwires
5ea46ecbf5 more margin for the scripts 2020-01-11 05:13:18 +01:00
undergroundwires
e3f82e069e refactorings 2020-01-11 05:13:03 +01:00
undergroundwires
95baf3175b more scripts & better organized 2020-01-11 05:12:36 +01:00
undergroundwires
89862b2775 🔍 support for search 2020-01-10 01:35:09 +01:00
undergroundwires
fab87378a2 Merge pull request #2 from undergroundwires/develop
Develop
2020-01-09 22:02:57 +00:00
undergroundwires
cafe6e809a 0.3.0 information 2020-01-09 22:58:08 +01:00
undergroundwires
e0b080af69 less hyphens as it looks better on mobile 2020-01-09 22:47:17 +01:00
undergroundwires
ec6b3c5407 added support for grouping 2020-01-09 21:22:15 +01:00
undergroundwires
6825001c61 fancy-font is renamed to main and now used 2020-01-09 18:54:01 +01:00
undergroundwires
ed872ef3d9 added back meta needed for responsiveness 2020-01-09 18:53:24 +01:00
undergroundwires
4bc13e1192 backwards compatibility for fonts 2020-01-09 18:18:47 +01:00
undergroundwires
ab28f4ed85 🚫 disable NVIDIA telemetry 2020-01-09 18:18:24 +01:00
undergroundwires
cfd888f3af removed unused references 2020-01-09 18:15:09 +01:00
undergroundwires
eee0e785ec allow robots 2020-01-07 02:54:25 +01:00
undergroundwires
99576340b6 added description & more descriptive title 2020-01-07 02:54:09 +01:00
undergroundwires
47e5560c92 Merge pull request #1 from undergroundwires/develop
Develop
2020-01-06 21:49:28 +00:00
undergroundwires
5cf8614b17 added changelog + version to 0.2.0 2020-01-06 22:43:17 +01:00
undergroundwires
a7da75d442 added text when nothing is chosen 2020-01-06 22:36:48 +01:00
undergroundwires
246e753ddc code-gen refactorings 2020-01-06 22:28:53 +01:00
undergroundwires
60e6348dc8 using font variables 2020-01-06 20:41:37 +01:00
undergroundwires
10a34fae2f added footer with version 2020-01-06 20:40:01 +01:00
undergroundwires
2cf9214b14 more descriptive subtitle 2020-01-06 20:19:35 +01:00
undergroundwires
cced601d68 added hyphen lines for longer names 2020-01-06 20:14:49 +01:00
undergroundwires
3140cc663b default selection is now none 2020-01-06 20:02:12 +01:00
undergroundwires
20020af7c1 using free function 2020-01-06 19:17:02 +01:00
undergroundwires
2aa3742e30 refactorings in parsing 2020-01-06 18:58:56 +01:00
undergroundwires
5ccc7c5952 fixed wrong line dumps 2020-01-06 18:57:00 +01:00
undergroundwires
aaea47e7d1 fixed maintainability badge URL 2020-01-06 18:40:12 +01:00
undergroundwires
57037aaefc simplified finding duplicates 2020-01-06 18:19:28 +01:00
undergroundwires
c359f1d89c 🎨 styled no JS error 2020-01-06 18:05:54 +01:00
undergroundwires
d38f6cd6a8 optimized find queries & refactorings 2020-01-06 17:45:53 +01:00
undergroundwires
c646c10273 refactoring to new function 2020-01-06 17:45:38 +01:00
undergroundwires
aff463dd64 better URL validation 2020-01-06 17:45:24 +01:00
undergroundwires
8d05b03c9f fixed wrong relation + lighter style 2020-01-06 00:11:19 +01:00
undergroundwires
7b4277d770 fixed contribution URL 2020-01-04 18:31:34 +01:00
undergroundwires
beb3c8339f switched content information to "why" section 2020-01-02 13:00:27 +01:00
undergroundwires
e99f210c9d typo fixes + whitespace refactorings 2020-01-01 12:31:41 +01:00
undergroundwires
090e831909 more badges 📛🏆📜 2019-12-31 17:02:08 +00:00
undergroundwires
a229aca68a added GitHub Actions badge for build & deploy 2019-12-31 15:41:38 +00:00
82 changed files with 3324 additions and 1287 deletions

55
CHANGELOG.md Normal file
View File

@@ -0,0 +1,55 @@
# Changelog
- All notable changes to this project will be documented in this file.
## Unreleased
-
## [0.4.2] - 2020-02-29
- Fixed search text font being defaulted to Arial.
- Shortened `HKEY` paths in scripts
## [0.4.1] - 2020-01-11
- Fixed & improved search
- Hiding grouping while searching
- Showing search queries when searching
## [0.4.0] - 2020-01-11
- Added search
- Some styling improvements
- Better organization of scripts + more scripts
## [0.3.0] - 2020-01-09
- Added support for grouping
- Added some meta tags
- Added "Disable NVIDIA telemetry" script
- Added legacy browser compatibility for fonts & changed main font
## [0.2.0] - 2020-01-06
- Fixed typo in generated code.
- Better URL validation for documentation links in `application.yaml`.
- Slightly faster parsing of `application.yaml`
- Styled no JS error that's shown when JavaScript is disabled.
- The default selection is now *None* & instruction text is shown in code box when nothing is selected.
- Added hyphen lines when rendering of long function names
- Changed subtitle: added version as footer instead.
## [0.1.0] - 2019-12-31
- Initial release
## All releases
- [Unreleased] : https://github.com/undergroundwires/privacy.sexy/compare/v0.4.2...HEAD
- [v0.4.2] : https://github.com/undergroundwires/privacy.sexy/compare/v0.4.1...v0.4.2
- [v0.4.1] : https://github.com/undergroundwires/privacy.sexy/compare/v0.4.0...v0.4.1
- [v0.4.0] : https://github.com/undergroundwires/privacy.sexy/compare/v0.3.0...v0.4.0
- [v0.3.0] : https://github.com/undergroundwires/privacy.sexy/compare/v0.2.0...v0.3.0
- [v0.2.0] : https://github.com/undergroundwires/privacy.sexy/compare/v0.1.0...v0.2.0
- [v0.1.0] : https://github.com/undergroundwires/privacy.sexy/releases/tag/v0.1.0

View File

@@ -1,16 +1,27 @@
# privacy.sexy # privacy.sexy
Privacy & security generator tool for Windows. ![Build & deploy status](https://github.com/undergroundwires/privacy.sexy/workflows/Build%20&%20deploy/badge.svg)
![Vulnerabilities](https://snyk.io/test/github/undergroundwires/privacy.sexy/badge.svg)
[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/undergroundwires/privacy.sexy/issues)
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/undergroundwires/privacy.sexy.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/undergroundwires/privacy.sexy/context:javascript)
[![Maintainability](https://api.codeclimate.com/v1/badges/3a70b7ef602e2264342c/maintainability)](https://codeclimate.com/github/undergroundwires/privacy.sexy/maintainability)
Web tool to generate scripts for enforcing privacy & security best-practices such as stopping data collection of Windows and different softwares on it.
> because privacy is sexy 🍑🍆 > because privacy is sexy 🍑🍆
[https://privacy.sexy](https://privacy.sexy) [https://privacy.sexy](https://privacy.sexy)
In this repo you find: ## Why privacy.sexy
- Application & infrastructure code of privacy.sexy, simply everything is code & open-sourced. - You don't need to run any compiled software on your system, just run the generated scripts.
- Fully automated CI/CD pipeline to AWS for provisioning serverless infrastructure using GitHub actions. - It's open source, both application & infrastructure is 100% transparent
- Vue.js application in conjunction with domain-driven design, event-driven architecture & data-driven programming. - Fully automated C/CD pipeline to AWS for provisioning serverless infrastructure using GitHub actions.
- Have full visibility into what the tweaks do as you enable them.
- Easily extendable
## Extend scripts
Fork it & add more scripts in `src/application/application.yml` and send a pull request 👌
## Commands ## Commands
@@ -25,10 +36,6 @@ In this repo you find:
- Run tests: `npm run test:unit` - Run tests: `npm run test:unit`
- Lint and fix files: `npm run lint` - Lint and fix files: `npm run lint`
## Extend scripts
Fork it & add more scripts in `src/application/application.yml` and send a pull request 👌
## Architecture ## Architecture
### Application ### Application

View File

@@ -36,7 +36,7 @@ CLOUDFRONT_ARN=$(aws cloudformation describe-stacks \
--output text \ --output text \
--profile $ROLE_PROFILE) --profile $ROLE_PROFILE)
if [ -z "$CLOUDFRONT_ARN" ]; then echo "Could not read CloudFront ARN"; exit 1; fi; if [ -z "$CLOUDFRONT_ARN" ]; then echo "Could not read CloudFront ARN"; exit 1; fi;
echo :add-mask::$CLOUDFRONT_ARN echo ::add-mask::$CLOUDFRONT_ARN
echo Syncing folder to S3 echo Syncing folder to S3
aws cloudfront create-invalidation \ aws cloudfront create-invalidation \

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 236 KiB

View File

@@ -4,16 +4,30 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Privacy is sexy 🍑🍆 - Enforce privacy & security on Windows</title>
<meta name="robots" content="index,follow" />
<meta name="description" content="Web tool to generate scripts for enforcing privacy & security best-practices such as stopping data collection of Windows and different softwares on it."/>
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> <link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>Privacy is sexy 🍑🍆</title>
</head> </head>
<body> <body>
<noscript> <noscript>
<strong> <style>
The page does not work without JavaScript enabled. #javascriptDisabled {
Please enable it to continue. background:#eceef1;
There's no shady stuff as 100% of the website is open source. margin: 5rem auto;
</strong> max-width: 800px;
font-size: 7px;
padding: 3rem;
border: 1px solid#333a45;
font-size: 1.5rem;
line-height: 150%;
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;
}
</style>
<div id="javascriptDisabled">
<h1>Problem loading page</h1>
<p>The page does not work without JavaScript enabled. Please enable it to use privacy.sexy. There's no shady stuff as 100% of the website is open source.</p>
</div>
</noscript> </noscript>
<div id="app"></div> <div id="app"></div>
<!-- built files will be auto injected --> <!-- built files will be auto injected -->

View File

@@ -1,41 +1,34 @@
<template> <template>
<div id="app"> <div id="app">
<div class="wrapper"> <div class="wrapper">
<TheHeader <TheHeader class="row" />
class="row" <TheSearchBar class="row" />
github-url="https://github.com/undergroundwires/privacy.sexy"/> <TheScripts class="row"/>
<!-- <TheSearchBar> </TheSearchBar> --> <TheCodeArea class="row" theme="xcode" />
<!-- <div style="display: flex; justify-content: space-between;"> -->
<!-- <TheGrouper></TheGrouper> -->
<TheSelector class="row" />
<!-- </div> -->
<CardList />
<TheCodeArea class="row" theme="xcode"/>
<TheCodeButtons class="row" /> <TheCodeButtons class="row" />
<TheFooter />
</div> </div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator'; import { Component, Vue, Prop } from 'vue-property-decorator';
import { ApplicationState, IApplicationState } from '@/application/State/ApplicationState'; import { ApplicationState, IApplicationState } from '@/application/State/ApplicationState';
import TheHeader from './presentation/TheHeader.vue'; import TheHeader from '@/presentation/TheHeader.vue';
import TheCodeArea from './presentation/TheCodeArea.vue'; import TheFooter from '@/presentation/TheFooter.vue';
import TheCodeButtons from './presentation/TheCodeButtons.vue'; import TheCodeArea from '@/presentation/TheCodeArea.vue';
import TheSearchBar from './presentation/TheSearchBar.vue'; import TheCodeButtons from '@/presentation/TheCodeButtons.vue';
import TheSelector from './presentation/Scripts/Selector/TheSelector.vue'; import TheSearchBar from '@/presentation/TheSearchBar.vue';
import TheGrouper from './presentation/Scripts/TheGrouper.vue'; import TheScripts from '@/presentation/Scripts/TheScripts.vue';
import CardList from './presentation/Scripts/Cards/CardList.vue';
@Component({ @Component({
components: { components: {
TheHeader, TheHeader,
TheCodeArea, TheCodeArea,
TheCodeButtons, TheCodeButtons,
TheScripts,
TheSearchBar, TheSearchBar,
TheGrouper, TheFooter,
CardList,
TheSelector,
}, },
}) })
export default class App extends Vue { export default class App extends Vue {
@@ -53,7 +46,7 @@ export default class App extends Vue {
body { body {
background: $light-gray; background: $light-gray;
font-family: 'Slabo 27px', serif; font-family: $main-font;
color: $slate; color: $slate;
} }

View File

@@ -1,103 +0,0 @@
import { Category } from '../domain/Category';
import { Application } from '../domain/Application';
import { Script } from '@/domain/Script';
// import applicationFile from 'js-yaml-loader!@/application/application.yaml';
// import applicationFile from 'json-loader!yaml-loader!@/application/application.yaml';
import applicationFile, { YamlCategory, YamlScript, YamlDocumentable } from 'js-yaml-loader!./application.yaml';
// import test from './test-loader!./test.txt';
interface ApplicationResult {
readonly application: Application;
readonly selectedScripts: Script[];
}
export class ApplicationParser {
public static buildApplication(): ApplicationResult {
const name = applicationFile.name as string;
const version = applicationFile.version as number;
const categories = new Array<Category>();
const selectedScripts = new Array<Script>();
if (!applicationFile.actions || applicationFile.actions.length <= 0) {
throw new Error('Application does not define any action');
}
for (const action of applicationFile.actions) {
const category = ApplicationParser.parseCategory(action, selectedScripts);
categories.push(category);
}
const app = new Application(name, version, categories);
return {application: app, selectedScripts};
}
private static categoryIdCounter = 0;
private static parseCategory(category: YamlCategory, selectedScripts: Script[]): Category {
if (!category.children || category.children.length <= 0) {
throw Error('Category has no children');
}
const subCategories = new Array<Category>();
const subScripts = new Array<Script>();
for (const categoryOrScript of category.children) {
if (ApplicationParser.isCategory(categoryOrScript)) {
const subCategory = ApplicationParser.parseCategory(categoryOrScript as YamlCategory, selectedScripts);
subCategories.push(subCategory);
} else if (ApplicationParser.isScript(categoryOrScript)) {
const yamlScript = categoryOrScript as YamlScript;
const script = new Script(
/* name */ yamlScript.name,
/* code */ yamlScript.code,
/* docs */ this.parseDocUrls(yamlScript));
subScripts.push(script);
if (yamlScript.default === true) {
selectedScripts.push(script);
}
} else {
throw new Error(`Child element is neither a category or a script.
Parent: ${category.category}, element: ${categoryOrScript}`);
}
}
return new Category(
/*id*/ ApplicationParser.categoryIdCounter++,
/*name*/ category.category,
/*docs*/ this.parseDocUrls(category),
/*categories*/ subCategories,
/*scripts*/ subScripts,
);
}
private static parseDocUrls(documentable: YamlDocumentable): ReadonlyArray<string> {
if (!documentable.docs) {
return [];
}
const docs = documentable.docs;
const result = new Array<string>();
const addDoc = (doc: string) => {
if (!doc) {
throw new Error('Documentiton url is null or empty');
}
if (doc.includes('\n')) {
throw new Error('Documentation url cannot be multi-lined.');
}
result.push(doc);
};
if (docs instanceof Array) {
for (const doc of docs) {
if (typeof doc !== 'string') {
throw new Error('Docs field (documentation url) must be an array of strings');
}
addDoc(doc as string);
}
} else if (typeof docs === 'string') {
addDoc(docs as string);
} else {
throw new Error('Docs field (documentation url) must a string or array of strings');
}
return result;
}
private static isScript(categoryOrScript: any): boolean {
return categoryOrScript.code && categoryOrScript.code.length > 0;
}
private static isCategory(categoryOrScript: any): boolean {
return categoryOrScript.category && categoryOrScript.category.length > 0;
}
}

View File

@@ -0,0 +1,21 @@
import { Category } from '../../domain/Category';
import { Application } from '../../domain/Application';
import applicationFile from 'js-yaml-loader!./../application.yaml';
import { parseCategory } from './CategoryParser';
export function parseApplication(): Application {
const categories = new Array<Category>();
if (!applicationFile.actions || applicationFile.actions.length <= 0) {
throw new Error('Application does not define any action');
}
for (const action of applicationFile.actions) {
const category = parseCategory(action);
categories.push(category);
}
const app = new Application(
applicationFile.name,
applicationFile.repositoryUrl,
applicationFile.version,
categories);
return app;
}

View File

@@ -0,0 +1,60 @@
import { YamlCategory, YamlScript } from 'js-yaml-loader!./application.yaml';
import { Script } from '@/domain/Script';
import { Category } from '../../domain/Category';
import { parseDocUrls } from './DocumentationParser';
let categoryIdCounter: number = 0;
interface ICategoryChildren {
subCategories: Category[];
subScripts: Script[];
}
export function parseCategory(category: YamlCategory): Category {
if (!category.children || category.children.length <= 0) {
throw Error('Category has no children');
}
const children: ICategoryChildren = {
subCategories: new Array<Category>(),
subScripts: new Array<Script>(),
};
for (const categoryOrScript of category.children) {
parseCategoryChild(categoryOrScript, children, category);
}
return new Category(
/*id*/ categoryIdCounter++,
/*name*/ category.category,
/*docs*/ parseDocUrls(category),
/*categories*/ children.subCategories,
/*scripts*/ children.subScripts,
);
}
function parseCategoryChild(
categoryOrScript: any, children: ICategoryChildren, parent: YamlCategory) {
if (isCategory(categoryOrScript)) {
const subCategory = parseCategory(categoryOrScript as YamlCategory);
children.subCategories.push(subCategory);
} else if (isScript(categoryOrScript)) {
const yamlScript = categoryOrScript as YamlScript;
const script = new Script(
/* name */ yamlScript.name,
/* code */ yamlScript.code,
/* docs */ parseDocUrls(yamlScript),
/* is recommended? */ yamlScript.recommend);
children.subScripts.push(script);
} else {
throw new Error(`Child element is neither a category or a script.
Parent: ${parent.category}, element: ${categoryOrScript}`);
}
}
function isScript(categoryOrScript: any): boolean {
return categoryOrScript.code && categoryOrScript.code.length > 0;
}
function isCategory(categoryOrScript: any): boolean {
return categoryOrScript.category && categoryOrScript.category.length > 0;
}

View File

@@ -0,0 +1,49 @@
import { YamlDocumentable } from 'js-yaml-loader!./application.yaml';
export function parseDocUrls(documentable: YamlDocumentable): ReadonlyArray<string> {
const docs = documentable.docs;
if (!docs) {
return [];
}
const result = new DocumentationUrls();
if (docs instanceof Array) {
for (const doc of docs) {
if (typeof doc !== 'string') {
throw new Error('Docs field (documentation url) must be an array of strings');
}
result.add(doc);
}
} else if (typeof docs === 'string') {
result.add(docs);
} else {
throw new Error('Docs field (documentation url) must a string or array of strings');
}
return result.getAll();
}
class DocumentationUrls {
private readonly urls = new Array<string>();
public add(url: string) {
validateUrl(url);
this.urls.push(url);
}
public getAll(): ReadonlyArray<string> {
return this.urls;
}
}
function validateUrl(docUrl: string): void {
if (!docUrl) {
throw new Error('Documentation url is null or empty');
}
if (docUrl.includes('\n')) {
throw new Error('Documentation url cannot be multi-lined.');
}
const res = docUrl.match(
/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g);
if (res == null) {
throw new Error(`Invalid documentation url: ${docUrl}`);
}
}

View File

@@ -5,8 +5,7 @@ import { UserSelection } from './Selection/UserSelection';
import { IUserSelection } from './Selection/IUserSelection'; import { IUserSelection } from './Selection/IUserSelection';
import { AsyncLazy } from '../../infrastructure/Threading/AsyncLazy'; import { AsyncLazy } from '../../infrastructure/Threading/AsyncLazy';
import { Signal } from '../../infrastructure/Events/Signal'; import { Signal } from '../../infrastructure/Events/Signal';
import { ICategory } from '../../domain/ICategory'; import { parseApplication } from '../Parser/ApplicationParser';
import { ApplicationParser } from '../ApplicationParser';
import { IApplicationState } from './IApplicationState'; import { IApplicationState } from './IApplicationState';
import { Script } from '../../domain/Script'; import { Script } from '../../domain/Script';
import { Application } from '../../domain/Application'; import { Application } from '../../domain/Application';
@@ -16,13 +15,14 @@ import { IApplicationCode } from './Code/IApplicationCode';
export class ApplicationState implements IApplicationState { export class ApplicationState implements IApplicationState {
/** Get singleton application state */ /** Get singleton application state */
public static GetAsync(): Promise<IApplicationState> { public static GetAsync(): Promise<IApplicationState> {
return ApplicationState.instance.getValueAsync(); return ApplicationState.instance.getValueAsync();
} }
/** Application instance with all scripts. */ /** Application instance with all scripts. */
private static instance = new AsyncLazy<IApplicationState>(() => { private static instance = new AsyncLazy<IApplicationState>(() => {
const app = ApplicationParser.buildApplication(); const application = parseApplication();
const state = new ApplicationState(app.application, app.selectedScripts); const selectedScripts = new Array<Script>();
const state = new ApplicationState(application, selectedScripts);
return Promise.resolve(state); return Promise.resolve(state);
}); });
@@ -33,32 +33,12 @@ export class ApplicationState implements IApplicationState {
private constructor( private constructor(
/** Inner instance of the all scripts */ /** Inner instance of the all scripts */
private readonly app: Application, public readonly app: Application,
/** Initially selected scripts */ /** Initially selected scripts */
public readonly defaultScripts: Script[]) { public readonly defaultScripts: Script[]) {
this.selection = new UserSelection(app, defaultScripts); this.selection = new UserSelection(app, defaultScripts);
this.code = new ApplicationCode(this.selection, app.version.toString()); this.code = new ApplicationCode(this.selection, app.version.toString());
this.filter = new UserFilter(app); this.filter = new UserFilter(app);
}
public getCategory(categoryId: number): ICategory | undefined {
return this.app.findCategory(categoryId);
}
public get categories(): ReadonlyArray<ICategory> {
return this.app.categories;
}
public get appName(): string {
return this.app.name;
}
public get appVersion(): number {
return this.app.version;
}
public get appTotalScripts(): number {
return this.app.totalScripts;
} }
} }

View File

@@ -1,4 +1,4 @@
import { CodeBuilder } from './CodeBuilder'; import { UserScriptGenerator } from './UserScriptGenerator';
import { IUserSelection } from './../Selection/IUserSelection'; import { IUserSelection } from './../Selection/IUserSelection';
import { Signal } from '@/infrastructure/Events/Signal'; import { Signal } from '@/infrastructure/Events/Signal';
import { IApplicationCode } from './IApplicationCode'; import { IApplicationCode } from './IApplicationCode';
@@ -8,12 +8,12 @@ export class ApplicationCode implements IApplicationCode {
public readonly changed = new Signal<string>(); public readonly changed = new Signal<string>();
public current: string; public current: string;
private readonly codeBuilder: CodeBuilder; private readonly generator: UserScriptGenerator;
constructor(userSelection: IUserSelection, private readonly version: string) { constructor(userSelection: IUserSelection, private readonly version: string) {
if (!userSelection) { throw new Error('userSelection is null or undefined'); } if (!userSelection) { throw new Error('userSelection is null or undefined'); }
if (!version) { throw new Error('version is null or undefined'); } if (!version) { throw new Error('version is null or undefined'); }
this.codeBuilder = new CodeBuilder(); this.generator = new UserScriptGenerator();
this.setCode(userSelection.selectedScripts); this.setCode(userSelection.selectedScripts);
userSelection.changed.on((scripts) => { userSelection.changed.on((scripts) => {
this.setCode(scripts); this.setCode(scripts);
@@ -21,7 +21,7 @@ export class ApplicationCode implements IApplicationCode {
} }
private setCode(scripts: ReadonlyArray<IScript>) { private setCode(scripts: ReadonlyArray<IScript>) {
this.current = this.codeBuilder.buildCode(scripts, this.version); this.current = scripts.length === 0 ? '' : this.generator.buildCode(scripts, this.version);
this.changed.notify(this.current); this.changed.notify(this.current);
} }
} }

View File

@@ -1,27 +1,51 @@
import { AdminRightsFunctionRenderer } from './Renderer/AdminRightsFunctionRenderer'; const NewLine = '\n';
import { AsciiArtRenderer } from './Renderer/AsciiArtRenderer'; const TotalFunctionSeparatorChars = 58;
import { FunctionRenderer } from './Renderer/FunctionRenderer';
import { Script } from '@/domain/Script';
export class CodeBuilder { export class CodeBuilder {
private readonly functionRenderer: FunctionRenderer; private readonly lines = new Array<string>();
private readonly adminRightsFunctionRenderer: AdminRightsFunctionRenderer;
private readonly asciiArtRenderer: AsciiArtRenderer;
public constructor() { public appendLine(code?: string): CodeBuilder {
this.functionRenderer = new FunctionRenderer(); this.lines.push(code);
this.adminRightsFunctionRenderer = new AdminRightsFunctionRenderer(); return this;
this.asciiArtRenderer = new AsciiArtRenderer();
} }
public buildCode(scripts: ReadonlyArray<Script>, version: string): string { public appendTrailingHyphensCommentLine(
if (!scripts) { throw new Error('scripts is undefined'); } totalRepeatHyphens: number = TotalFunctionSeparatorChars): CodeBuilder {
if (!version) { throw new Error('version is undefined'); } return this.appendCommentLine('-'.repeat(totalRepeatHyphens));
return `@echo off\n\n${this.asciiArtRenderer.renderAsciiArt(version)}\n\n` }
+ `${this.adminRightsFunctionRenderer.renderAdminRightsFunction()}\n\n`
+ scripts.map((script) => this.functionRenderer.renderFunction(script.name, script.code)).join('\n\n') public appendCommentLine(commentLine?: string): CodeBuilder {
+ '\n\n' this.lines.push(`:: ${commentLine}`);
+ 'pause\n' return this;
+ 'exit /b 0'; }
public appendFunction(name: string, code: string): CodeBuilder {
if (!name) { throw new Error('name cannot be empty or null'); }
if (!code) { throw new Error('code cannot be empty or null'); }
return this
.appendLine()
.appendCommentLineWithHyphensAround(name)
.appendLine(`echo --- ${name}`)
.appendLine(code)
.appendTrailingHyphensCommentLine();
}
public appendCommentLineWithHyphensAround(
sectionName: string,
totalRepeatHyphens: number = TotalFunctionSeparatorChars): CodeBuilder {
if (!sectionName) { throw new Error('sectionName cannot be empty or null'); }
if (sectionName.length >= totalRepeatHyphens) {
return this.appendCommentLine(sectionName);
}
const firstHyphens = '-'.repeat(Math.floor((totalRepeatHyphens - sectionName.length) / 2));
const secondHyphens = '-'.repeat(Math.ceil((totalRepeatHyphens - sectionName.length) / 2));
return this
.appendTrailingHyphensCommentLine()
.appendCommentLine(firstHyphens + sectionName + secondHyphens)
.appendTrailingHyphensCommentLine();
}
public toString(): string {
return this.lines.join(NewLine);
} }
} }

View File

@@ -1,18 +0,0 @@
import { FunctionRenderer } from './FunctionRenderer';
export class AdminRightsFunctionRenderer {
private readonly functionRenderer: FunctionRenderer;
constructor() {
this.functionRenderer = new FunctionRenderer();
}
public renderAdminRightsFunction() {
const name = 'Ensure admin priviliges';
const code = 'fltmc >nul 2>&1 || (\n' +
' echo This batch script requires administrator privileges. Right-click on\n' +
' echo the script and select "Run as administrator".\n' +
' pause\n' +
' exit 1\n' +
')';
return this.functionRenderer.renderFunction(name, code);
}
}

View File

@@ -1,16 +0,0 @@
import { CodeRenderer } from './CodeRenderer';
export class AsciiArtRenderer extends CodeRenderer {
public renderAsciiArt(version: string): string {
if (!version) { throw new Error('Version is not defined'); }
return (
'██████╗ ██████╗ ██╗██╗ ██╗ █████╗ ██████╗██╗ ██╗███████╗███████╗██╗ ██╗██╗ ██╗\n' +
'██╔══██╗██╔══██╗██║██║ ██║██╔══██╗██╔════╝╚██╗ ██╔╝██╔════╝██╔════╝╚██╗██╔╝╚██╗ ██╔╝\n' +
'██████╔╝██████╔╝██║██║ ██║███████║██║ ╚████╔╝ ███████╗█████╗ ╚███╔╝ ╚████╔╝ \n' +
'██╔═══╝ ██╔══██╗██║╚██╗ ██╔╝██╔══██║██║ ╚██╔╝ ╚════██║██╔══╝ ██╔██╗ ╚██╔╝ \n' +
'██║ ██║ ██║██║ ╚████╔╝ ██║ ██║╚██████╗ ██║██╗███████║███████╗██╔╝ ██╗ ██║ \n' +
'╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ ')
.split('\n').map((line) => this.renderComment(line)).join('\n')
+ `\n${this.renderComment(`https://privacy.sexy — v${version}${new Date().toUTCString()}`)}`;
}
}

View File

@@ -1,11 +0,0 @@
export abstract class CodeRenderer {
protected readonly totalFunctionSeparatorChars = 58;
protected readonly trailingHyphens = '-'.repeat(this.totalFunctionSeparatorChars);
protected renderComment(line?: string): string {
return line ? `:: ${line}` : ':: ';
}
}

View File

@@ -1,31 +0,0 @@
import { CodeRenderer } from './CodeRenderer';
export class FunctionRenderer extends CodeRenderer {
public renderFunction(name: string, code: string) {
if (!name) { throw new Error('name cannot be empty or null'); }
if (!code) { throw new Error('code cannot be empty or null'); }
return this.renderFunctionStartComment(name) + '\n'
+ `echo --- ${name}` + '\n'
+ code + '\n'
+ this.renderFunctionEndComment();
}
private renderFunctionStartComment(functionName: string): string {
if (functionName.length >= this.totalFunctionSeparatorChars) {
return this.renderComment(functionName);
}
return this.renderComment(this.trailingHyphens) + '\n' +
this.renderFunctionName(functionName) + '\n' +
this.renderComment(this.trailingHyphens);
}
private renderFunctionName(functionName: string) {
const autoFirstHypens = '-'.repeat(Math.floor((this.totalFunctionSeparatorChars - functionName.length) / 2));
const secondHypens = '-'.repeat(Math.ceil((this.totalFunctionSeparatorChars - functionName.length) / 2));
return `${this.renderComment()}${autoFirstHypens}${functionName}${secondHypens}`;
}
private renderFunctionEndComment(): string {
return this.renderComment(this.trailingHyphens);
}
}

View File

@@ -0,0 +1,31 @@
import { CodeBuilder } from './CodeBuilder';
import { Script } from '@/domain/Script';
const adminRightsScript = {
name: 'Ensure admin privileges',
code: 'fltmc >nul 2>&1 || (\n' +
' echo This batch script requires administrator privileges. Right-click on\n' +
' echo the script and select "Run as administrator".\n' +
' pause\n' +
' exit 1\n' +
')',
};
export class UserScriptGenerator {
public buildCode(scripts: ReadonlyArray<Script>, version: string): string {
if (!scripts) { throw new Error('scripts is undefined'); }
if (!scripts.length) { throw new Error('scripts are empty'); }
if (!version) { throw new Error('version is undefined'); }
const builder = new CodeBuilder()
.appendLine('@echo off')
.appendCommentLine(`https://privacy.sexy — v${version}${new Date().toUTCString()}`)
.appendFunction(adminRightsScript.name, adminRightsScript.code).appendLine();
for (const script of scripts) {
builder.appendFunction(script.name, script.code).appendLine();
}
return builder.appendLine()
.appendLine('pause')
.appendLine('exit /b 0')
.toString();
}
}

View File

@@ -0,0 +1,18 @@
import { IFilterResult } from './IFilterResult';
import { IScript } from '@/domain/Script';
import { ICategory } from '@/domain/ICategory';
export class FilterResult implements IFilterResult {
constructor(
public readonly scriptMatches: ReadonlyArray<IScript>,
public readonly categoryMatches: ReadonlyArray<ICategory>,
public readonly query: string) {
if (!query) { throw new Error('Query is empty or undefined'); }
if (!scriptMatches) { throw new Error('Script matches is undefined'); }
if (!categoryMatches) { throw new Error('Category matches is undefined'); }
}
public hasAnyMatches(): boolean {
return this.scriptMatches.length > 0
|| this.categoryMatches.length > 0;
}
}

View File

@@ -1,7 +1,8 @@
import { IScript, ICategory } from '@/domain/ICategory'; import { IScript, ICategory } from '@/domain/ICategory';
export interface IFilterMatches { export interface IFilterResult {
readonly scriptMatches: ReadonlyArray<IScript>;
readonly categoryMatches: ReadonlyArray<ICategory>; readonly categoryMatches: ReadonlyArray<ICategory>;
readonly scriptMatches: ReadonlyArray<IScript>;
readonly query: string; readonly query: string;
hasAnyMatches(): boolean;
} }

View File

@@ -1,8 +1,8 @@
import { IFilterMatches } from './IFilterMatches'; import { IFilterResult } from './IFilterResult';
import { ISignal } from '@/infrastructure/Events/Signal'; import { ISignal } from '@/infrastructure/Events/Signal';
export interface IUserFilter { export interface IUserFilter {
readonly filtered: ISignal<IFilterMatches>; readonly filtered: ISignal<IFilterResult>;
readonly filterRemoved: ISignal<void>; readonly filterRemoved: ISignal<void>;
setFilter(filter: string): void; setFilter(filter: string): void;
removeFilter(): void; removeFilter(): void;

View File

@@ -1,10 +1,11 @@
import { IFilterMatches } from './IFilterMatches'; import { FilterResult } from './FilterResult';
import { IFilterResult } from './IFilterResult';
import { Application } from '../../../domain/Application'; import { Application } from '../../../domain/Application';
import { IUserFilter } from './IUserFilter'; import { IUserFilter } from './IUserFilter';
import { Signal } from '@/infrastructure/Events/Signal'; import { Signal } from '@/infrastructure/Events/Signal';
export class UserFilter implements IUserFilter { export class UserFilter implements IUserFilter {
public readonly filtered = new Signal<IFilterMatches>(); public readonly filtered = new Signal<IFilterResult>();
public readonly filterRemoved = new Signal<void>(); public readonly filterRemoved = new Signal<void>();
constructor(private application: Application) { constructor(private application: Application) {
@@ -15,15 +16,19 @@ export class UserFilter implements IUserFilter {
if (!filter) { if (!filter) {
throw new Error('Filter must be defined and not empty. Use removeFilter() to remove the filter'); throw new Error('Filter must be defined and not empty. Use removeFilter() to remove the filter');
} }
const filterLowercase = filter.toLocaleLowerCase();
const filteredScripts = this.application.getAllScripts().filter( const filteredScripts = this.application.getAllScripts().filter(
(script) => script.name.toLowerCase().includes(filter.toLowerCase()) (script) =>
|| script.code.toLowerCase().includes(filter.toLowerCase())); script.name.toLowerCase().includes(filterLowercase) ||
script.code.toLowerCase().includes(filterLowercase));
const filteredCategories = this.application.getAllCategories().filter(
(script) => script.name.toLowerCase().includes(filterLowercase));
const matches: IFilterMatches = { const matches = new FilterResult(
scriptMatches: filteredScripts, filteredScripts,
categoryMatches: null, filteredCategories,
query: filter, filter,
}; );
this.filtered.notify(matches); this.filtered.notify(matches);
} }

View File

@@ -1,7 +1,7 @@
import { IApplication } from './../../domain/IApplication';
import { IUserFilter } from './Filter/IUserFilter'; import { IUserFilter } from './Filter/IUserFilter';
import { IUserSelection } from './Selection/IUserSelection'; import { IUserSelection } from './Selection/IUserSelection';
import { ISignal } from '@/infrastructure/Events/ISignal'; import { ISignal } from '@/infrastructure/Events/ISignal';
import { ICategory, IScript } from '@/domain/ICategory';
import { IApplicationCode } from './Code/IApplicationCode'; import { IApplicationCode } from './Code/IApplicationCode';
export { IUserSelection, IApplicationCode, IUserFilter }; export { IUserSelection, IApplicationCode, IUserFilter };
@@ -10,12 +10,6 @@ export interface IApplicationState {
readonly code: IApplicationCode; readonly code: IApplicationCode;
readonly filter: IUserFilter; readonly filter: IUserFilter;
readonly stateChanged: ISignal<IApplicationState>; readonly stateChanged: ISignal<IApplicationState>;
readonly categories: ReadonlyArray<ICategory>;
readonly appName: string;
readonly appVersion: number;
readonly appTotalScripts: number;
readonly selection: IUserSelection; readonly selection: IUserSelection;
readonly defaultScripts: ReadonlyArray<IScript>; readonly app: IApplication;
getCategory(categoryId: number): ICategory | undefined;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,23 +1,29 @@
declare module 'js-yaml-loader!*' { declare module 'js-yaml-loader!*' {
type CategoryOrScript = YamlCategory | YamlScript; type CategoryOrScript = YamlCategory | YamlScript;
type DocumentationUrls = ReadonlyArray<string> | string; type DocumentationUrls = ReadonlyArray<string> | string;
export interface YamlDocumentable { export interface YamlDocumentable {
docs?: DocumentationUrls; docs?: DocumentationUrls;
} }
export interface YamlScript extends YamlDocumentable { export interface YamlScript extends YamlDocumentable {
name: string; name: string;
code: string; code: string;
default: boolean; recommend: boolean;
} }
export interface YamlCategory extends YamlDocumentable { export interface YamlCategory extends YamlDocumentable {
children: ReadonlyArray<CategoryOrScript>; children: ReadonlyArray<CategoryOrScript>;
category: string; category: string;
} }
interface ApplicationYaml { interface ApplicationYaml {
name: string; name: string;
version: number; version: number;
repositoryUrl: string;
actions: ReadonlyArray<YamlCategory>; actions: ReadonlyArray<YamlCategory>;
} }
const content: ApplicationYaml; const content: ApplicationYaml;
export default content; export default content;
} }

View File

@@ -4,115 +4,101 @@ import { IScript } from './IScript';
import { IApplication } from './IApplication'; import { IApplication } from './IApplication';
export class Application implements IApplication { export class Application implements IApplication {
private static mustHaveCategories(categories: ReadonlyArray<ICategory>) { public get totalScripts(): number { return this.flattened.allScripts.length; }
if (!categories || categories.length === 0) { public get totalCategories(): number { return this.flattened.allCategories.length; }
throw new Error('an application must consist of at least one category');
} private readonly flattened: IFlattenedApplication;
}
/**
* Checks all categories against duplicates, throws exception if it find any duplicates
* @return {number} Total unique categories
*/
/** Checks all categories against duplicates, throws exception if it find any duplicates returns total categories */
private static mustNotHaveDuplicatedCategories(categories: ReadonlyArray<ICategory>): number {
return Application.ensureNoDuplicateEntities(categories, Application.visitAllCategoriesOnce);
}
/**
* Checks all scripts against duplicates, throws exception if it find any scripts duplicates total scripts.
* @return {number} Total unique scripts
*/
private static mustNotHaveDuplicatedScripts(categories: ReadonlyArray<ICategory>): number {
return Application.ensureNoDuplicateEntities(categories, Application.visitAllScriptsOnce);
}
/**
* Checks entities against duplicates using a visit function, throws exception if it find any duplicates.
* @return {number} Result from the visit function
*/
private static ensureNoDuplicateEntities<TKey>(
categories: ReadonlyArray<ICategory>,
visitFunction: (categories: ReadonlyArray<ICategory>,
handler: (entity: IEntity<TKey>) => any) => number): number {
const totalOccurencesById = new Map<TKey, number>();
const totalVisited = visitFunction(categories,
(entity) =>
totalOccurencesById.set(entity.id,
(totalOccurencesById.get(entity.id) || 0) + 1));
const duplicatedIds = new Array<TKey>();
totalOccurencesById.forEach((count, id) => {
if (count > 1) {
duplicatedIds.push(id);
}
});
if (duplicatedIds.length > 0) {
const duplicatedIdsText = duplicatedIds.map((id) => `"${id}"`).join(',');
throw new Error(
`Duplicate entities are detected with following id(s): ${duplicatedIdsText}`);
}
return totalVisited;
}
// Runs handler on each category and returns sum of total visited categories
private static visitAllCategoriesOnce(
categories: ReadonlyArray<ICategory>, handler: (category: ICategory) => any): number {
let total = 0;
for (const category of categories) {
handler(category);
total++;
if (category.subCategories && category.subCategories.length > 0) {
total += Application.visitAllCategoriesOnce(
category.subCategories as ReadonlyArray<ICategory>, handler);
}
}
return total;
}
// Runs handler on each script and returns sum of total visited scripts
private static visitAllScriptsOnce(
categories: ReadonlyArray<ICategory>, handler: (script: IScript) => any): number {
let total = 0;
Application.visitAllCategoriesOnce(categories, (category) => {
if (category.scripts) {
for (const script of category.scripts) {
handler(script);
total++;
}
}
});
return total;
}
public readonly totalScripts: number;
public readonly totalCategories: number;
constructor( constructor(
public readonly name: string, public readonly name: string,
public readonly repositoryUrl: string,
public readonly version: number, public readonly version: number,
public readonly categories: ReadonlyArray<ICategory>) { public readonly categories: ReadonlyArray<ICategory>) {
Application.mustHaveCategories(categories); if (!name) { throw Error('Application has no name'); }
this.totalCategories = Application.mustNotHaveDuplicatedCategories(categories); if (!repositoryUrl) { throw Error('Application has no repository url'); }
this.totalScripts = Application.mustNotHaveDuplicatedScripts(categories); if (!version) { throw Error('Version cannot be zero'); }
this.flattened = flatten(categories);
if (this.flattened.allCategories.length === 0) {
throw new Error('Application must consist of at least one category');
}
if (this.flattened.allScripts.length === 0) {
throw new Error('Application must consist of at least one script');
}
if (this.flattened.allScripts.filter((script) => script.isRecommended).length === 0) {
throw new Error('Application must consist of at least one recommended script');
}
ensureNoDuplicates(this.flattened.allCategories);
ensureNoDuplicates(this.flattened.allScripts);
} }
public findCategory(categoryId: number): ICategory | undefined { public findCategory(categoryId: number): ICategory | undefined {
let result: ICategory | undefined; return this.flattened.allCategories.find((category) => category.id === categoryId);
Application.visitAllCategoriesOnce(this.categories, (category) => {
if (category.id === categoryId) {
result = category;
}
});
return result;
} }
public getRecommendedScripts(): readonly IScript[] {
return this.flattened.allScripts.filter((script) => script.isRecommended);
}
public findScript(scriptId: string): IScript | undefined { public findScript(scriptId: string): IScript | undefined {
let result: IScript | undefined; return this.flattened.allScripts.find((script) => script.id === scriptId);
Application.visitAllScriptsOnce(this.categories, (script) => {
if (script.id === scriptId) {
result = script;
}
});
return result;
} }
public getAllScripts(): IScript[] { public getAllScripts(): IScript[] {
const result = new Array<IScript>(); return this.flattened.allScripts;
Application.visitAllScriptsOnce(this.categories, (script) => { }
result.push(script);
}); public getAllCategories(): ICategory[] {
return result; return this.flattened.allCategories;
} }
} }
function ensureNoDuplicates<TKey>(entities: ReadonlyArray<IEntity<TKey>>) {
const totalOccurencesById = new Map<TKey, number>();
for (const entity of entities) {
totalOccurencesById.set(entity.id, (totalOccurencesById.get(entity.id) || 0) + 1);
}
const duplicatedIds = new Array<TKey>();
totalOccurencesById.forEach((index, id) => {
if (index > 1) {
duplicatedIds.push(id);
}
});
if (duplicatedIds.length > 0) {
const duplicatedIdsText = duplicatedIds.map((id) => `"${id}"`).join(',');
throw new Error(
`Duplicate entities are detected with following id(s): ${duplicatedIdsText}`);
}
}
interface IFlattenedApplication {
allCategories: ICategory[];
allScripts: IScript[];
}
function flattenRecursive(
categories: ReadonlyArray<ICategory>,
flattened: IFlattenedApplication) {
for (const category of categories) {
flattened.allCategories.push(category);
if (category.scripts) {
for (const script of category.scripts) {
flattened.allScripts.push(script);
}
}
if (category.subCategories && category.subCategories.length > 0) {
flattenRecursive(
category.subCategories as ReadonlyArray<ICategory>,
flattened);
}
}
}
function flatten(
categories: ReadonlyArray<ICategory>): IFlattenedApplication {
const flattened: IFlattenedApplication = {
allCategories: new Array<ICategory>(),
allScripts: new Array<IScript>(),
};
flattenRecursive(categories, flattened);
return flattened;
}

View File

@@ -7,8 +7,8 @@ export class Category extends BaseEntity<number> implements ICategory {
if (!category.name) { if (!category.name) {
throw new Error('name is null or empty'); throw new Error('name is null or empty');
} }
if ((!category.subCategories || category.subCategories.length === 0) if ((!category.subCategories || category.subCategories.length === 0) &&
&& (!category.scripts || category.scripts.length === 0)) { (!category.scripts || category.scripts.length === 0)) {
throw new Error('A category must have at least one sub-category or scripts'); throw new Error('A category must have at least one sub-category or scripts');
} }
} }

View File

@@ -2,10 +2,18 @@ import { IScript } from '@/domain/IScript';
import { ICategory } from '@/domain/ICategory'; import { ICategory } from '@/domain/ICategory';
export interface IApplication { export interface IApplication {
readonly name: string;
readonly repositoryUrl: string;
readonly version: number;
readonly categories: ReadonlyArray<ICategory>; readonly categories: ReadonlyArray<ICategory>;
readonly totalScripts: number;
readonly totalCategories: number;
getRecommendedScripts(): ReadonlyArray<IScript>;
findCategory(categoryId: number): ICategory | undefined; findCategory(categoryId: number): ICategory | undefined;
findScript(scriptId: string): IScript | undefined; findScript(scriptId: string): IScript | undefined;
getAllScripts(): ReadonlyArray<IScript>; getAllScripts(): ReadonlyArray<IScript>;
getAllCategories(): ReadonlyArray<ICategory>;
} }
export { IScript } from '@/domain/IScript'; export { IScript } from '@/domain/IScript';

View File

@@ -4,5 +4,6 @@ import { IDocumentable } from './IDocumentable';
export interface IScript extends IEntity<string>, IDocumentable { export interface IScript extends IEntity<string>, IDocumentable {
readonly name: string; readonly name: string;
readonly code: string; readonly code: string;
readonly isRecommended: boolean;
readonly documentationUrls: ReadonlyArray<string>; readonly documentationUrls: ReadonlyArray<string>;
} }

View File

@@ -9,36 +9,30 @@ export class Script extends BaseEntity<string> implements IScript {
} }
private static ensureCodeHasUniqueLines(name: string, code: string): void { private static ensureCodeHasUniqueLines(name: string, code: string): void {
const lines = code.split('\n'); const lines = code.split('\n')
.filter((line) => this.mayBeUniqueLine(line));
if (lines.length === 0) { if (lines.length === 0) {
return; return;
} }
const checkForDuplicates = (line: string) => { const duplicateLines = lines.filter((e, i, a) => a.indexOf(e) !== i);
const trimmed = line.trim();
if (trimmed.length === 1 && trimmed === ')' || trimmed === '(') {
return false;
}
return true;
};
const duplicateLines = new Array<string>();
const uniqueLines = new Set<string>();
let validatedLineCount = 0;
for (const line of lines) {
if (!checkForDuplicates(line)) {
continue;
}
uniqueLines.add(line);
if (uniqueLines.size !== validatedLineCount + 1) {
duplicateLines.push(line);
}
validatedLineCount++;
}
if (duplicateLines.length !== 0) { if (duplicateLines.length !== 0) {
throw Error(`Duplicates detected in script "${name}":\n ${duplicateLines.join('\n')}`); throw Error(`Duplicates detected in script "${name}":\n ${duplicateLines.join('\n')}`);
} }
} }
constructor(public name: string, public code: string, public documentationUrls: ReadonlyArray<string>) { private static mayBeUniqueLine(codeLine: string): boolean {
const trimmed = codeLine.trim();
if (trimmed === ')' || trimmed === '(') { // "(" and ")" are used often in batch code
return false;
}
return true;
}
constructor(
public name: string,
public code: string,
public documentationUrls: ReadonlyArray<string>,
public isRecommended: boolean) {
super(name); super(name);
if (code == null || code.length === 0) { if (code == null || code.length === 0) {
throw new Error('Code is empty or null'); throw new Error('Code is empty or null');

35
src/global.d.ts vendored
View File

@@ -1,9 +1,9 @@
// Two ways of typing other libraries: https://stackoverflow.com/a/53070501 // Two ways of typing other libraries: https://stackoverflow.com/a/53070501
declare module 'liquor-tree' { declare module 'liquor-tree' {
import { PluginObject } from 'vue'; import { PluginObject } from 'vue';
import { VueClass } from 'vue-class-component/lib/declarations'; import { VueClass } from 'vue-class-component/lib/declarations';
// https://github.com/amsik/liquor-tree/blob/master/src/lib/Tree.js // https://github.com/amsik/liquor-tree/blob/master/src/lib/Tree.js
export interface ILiquorTree { export interface ILiquorTree {
readonly model: ReadonlyArray<ILiquorTreeExistingNode>; readonly model: ReadonlyArray<ILiquorTreeExistingNode>;
@@ -14,20 +14,22 @@ declare module 'liquor-tree' {
interface ICustomLiquorTreeData { interface ICustomLiquorTreeData {
documentationUrls: ReadonlyArray<string>; documentationUrls: ReadonlyArray<string>;
} }
/** /**
* Returned from Node tree view events. * Returned from Node tree view events.
* See constructor in https://github.com/amsik/liquor-tree/blob/master/src/lib/Node.js * See constructor in https://github.com/amsik/liquor-tree/blob/master/src/lib/Node.js
*/ */
export interface ILiquorTreeExistingNode { export interface ILiquorTreeExistingNode {
id: string; id: string;
data: ILiquorTreeNodeData; data: ILiquorTreeNodeData;
states: ILiquorTreeNodeState | undefined; states: ILiquorTreeNodeState | undefined;
children: ReadonlyArray<ILiquorTreeExistingNode> | undefined; children: ReadonlyArray<ILiquorTreeExistingNode> | undefined;
} }
/** /**
* Sent to liquor tree to define of new nodes. * Sent to liquor tree to define of new nodes.
* https://github.com/amsik/liquor-tree/blob/master/src/lib/Node.js * https://github.com/amsik/liquor-tree/blob/master/src/lib/Node.js
*/ */
export interface ILiquorTreeNewNode { export interface ILiquorTreeNewNode {
id: string; id: string;
text: string; text: string;
@@ -35,13 +37,28 @@ declare module 'liquor-tree' {
children: ReadonlyArray<ILiquorTreeNewNode> | undefined; children: ReadonlyArray<ILiquorTreeNewNode> | undefined;
data: ICustomLiquorTreeData; data: ICustomLiquorTreeData;
} }
// https://amsik.github.io/liquor-tree/#Component-Options
export interface ILiquorTreeOptions {
multiple: boolean;
checkbox: boolean;
checkOnSelect: boolean;
autoCheckChildren: boolean;
parentSelect: boolean;
keyboardNavigation: boolean;
deletion: (node: ILiquorTreeExistingNode) => void;
filter: ILiquorTreeFilter;
}
// https://github.com/amsik/liquor-tree/blob/master/src/lib/Node.js // https://github.com/amsik/liquor-tree/blob/master/src/lib/Node.js
interface ILiquorTreeNodeState { interface ILiquorTreeNodeState {
checked: boolean; checked: boolean;
} }
interface ILiquorTreeNodeData extends ICustomLiquorTreeData { interface ILiquorTreeNodeData extends ICustomLiquorTreeData {
text: string; text: string;
} }
// https://github.com/amsik/liquor-tree/blob/master/src/components/TreeRoot.vue // https://github.com/amsik/liquor-tree/blob/master/src/components/TreeRoot.vue
interface ILiquorTreeOptions { interface ILiquorTreeOptions {
checkbox: boolean; checkbox: boolean;
@@ -49,11 +66,13 @@ declare module 'liquor-tree' {
filter: ILiquorTreeFilter; filter: ILiquorTreeFilter;
deletion(node: ILiquorTreeNewNode): boolean; deletion(node: ILiquorTreeNewNode): boolean;
} }
// https://github.com/amsik/liquor-tree/blob/master/src/components/TreeRoot.vue // https://github.com/amsik/liquor-tree/blob/master/src/components/TreeRoot.vue
interface ILiquorTreeFilter { interface ILiquorTreeFilter {
emptyText: string; emptyText: string;
matcher(query: string, node: ILiquorTreeNewNode): boolean; matcher(query: string, node: ILiquorTreeExistingNode): boolean;
} }
const LiquorTree: PluginObject<any> & VueClass<any>; const LiquorTree: PluginObject<any> & VueClass<any>;
export default LiquorTree; export default LiquorTree;
} }

View File

@@ -1,14 +1,13 @@
import { IEntity } from './IEntity'; import { IEntity } from './IEntity';
export abstract class BaseEntity<TId> implements IEntity<TId> { export abstract class BaseEntity<TId> implements IEntity<TId> {
constructor(public id: TId) { protected constructor(public id: TId) {
if (typeof id !== 'number' && !id) { if (typeof id !== 'number' && !id) {
throw new Error('Id cannot be null or empty'); throw new Error('Id cannot be null or empty');
} }
} }
public equals(otherId: TId): boolean { public equals(otherId: TId): boolean {
return this.id === otherId; return this.id === otherId;
} }
} }

View File

@@ -3,6 +3,7 @@ import { IRepository } from './IRepository';
export class InMemoryRepository<TKey, TEntity extends IEntity<TKey>> implements IRepository<TKey, TEntity> { export class InMemoryRepository<TKey, TEntity extends IEntity<TKey>> implements IRepository<TKey, TEntity> {
private readonly items: TEntity[]; private readonly items: TEntity[];
constructor(items?: TEntity[]) { constructor(items?: TEntity[]) {
this.items = items || new Array<TEntity>(); this.items = items || new Array<TEntity>();
} }

View File

@@ -10,7 +10,7 @@ export class SaveFileDialog {
const blob = new Blob([file], { type: fileType }); const blob = new Blob([file], { type: fileType });
fileSaver.saveAs(blob, fileName); fileSaver.saveAs(blob, fileName);
} catch (e) { } catch (e) {
window.open('data:' + fileType + ',' + encodeURIComponent(file.toString()), '_blank', ''); window.open(`data:${fileType},${encodeURIComponent(file.toString())}`, '_blank', '');
} }
} }
} }

View File

@@ -6,7 +6,7 @@ export class AsyncLazy<T> {
private isCreatingValue = false; private isCreatingValue = false;
private value: T | undefined; private value: T | undefined;
constructor(private valueFactory: () => Promise<T>) { } constructor(private valueFactory: () => Promise<T>) {}
public setValueFactory(valueFactory: () => Promise<T>) { public setValueFactory(valueFactory: () => Promise<T>) {
this.valueFactory = valueFactory; this.valueFactory = valueFactory;

View File

@@ -3,8 +3,8 @@ import App from './App.vue';
import { ApplicationBootstrapper } from './presentation/Bootstrapping/ApplicationBootstrapper'; import { ApplicationBootstrapper } from './presentation/Bootstrapping/ApplicationBootstrapper';
new ApplicationBootstrapper() new ApplicationBootstrapper()
.bootstrap(Vue); .bootstrap(Vue);
new Vue({ new Vue({
render: (h) => h(App), render: (h) => h(App),
}).$mount('#app'); }).$mount('#app');

View File

@@ -11,8 +11,15 @@ import { faTimes, faFileDownload, faCopy, faSearch, faInfoCircle } from '@fortaw
export class IconBootstrapper implements IVueBootstrapper { export class IconBootstrapper implements IVueBootstrapper {
public bootstrap(vue: VueConstructor): void { public bootstrap(vue: VueConstructor): void {
library.add(faGithub, faFolderOpen, faFolder, library.add(
faTimes, faFileDownload, faCopy, faSearch, faInfoCircle); faGithub,
faFolderOpen,
faFolder,
faTimes,
faFileDownload,
faCopy,
faSearch,
faInfoCircle);
vue.component('font-awesome-icon', FontAwesomeIcon); vue.component('font-awesome-icon', FontAwesomeIcon);
} }
} }

View File

@@ -29,6 +29,7 @@ export default class IconButton extends StatefulVue {
<style scoped lang="scss"> <style scoped lang="scss">
@import "@/presentation/styles/colors.scss"; @import "@/presentation/styles/colors.scss";
@import "@/presentation/styles/fonts.scss";
.button { .button {
display: flex; display: flex;
@@ -63,7 +64,7 @@ export default class IconButton extends StatefulVue {
} }
&__text { &__text {
display: none; display: none;
font-family: 'Yesteryear', cursive; font-family: $artistic-font;
font-size: 1.5em; font-size: 1.5em;
color: $gray; color: $gray;
font-weight: 500; font-weight: 500;

View File

@@ -31,7 +31,7 @@ export default class CardList extends StatefulVue {
public async mounted() { public async mounted() {
const state = await this.getCurrentStateAsync(); const state = await this.getCurrentStateAsync();
this.setCategories(state.categories); this.setCategories(state.app.categories);
} }
public onSelected(categoryId: number, isExpanded: boolean) { public onSelected(categoryId: number, isExpanded: boolean) {
@@ -49,14 +49,12 @@ export default class CardList extends StatefulVue {
.cards { .cards {
display: flex; display: flex;
flex-flow: row wrap; flex-flow: row wrap;
.card { font-family: $main-font;
}
} }
.error { .error {
width: 100%; width: 100%;
text-align: center; text-align: center;
font-size: 3.5em; font-size: 3.5em;
font: $default-font; font-family: $normal-font;
} }
</style> </style>

View File

@@ -12,19 +12,19 @@
</div> </div>
<div class="card__expander" v-on:click.stop> <div class="card__expander" v-on:click.stop>
<font-awesome-icon :icon="['fas', 'times']" class="close-button" v-on:click="onSelected(false)"/> <font-awesome-icon :icon="['fas', 'times']" class="close-button" v-on:click="onSelected(false)"/>
<CardListItemScripts :categoryId="categoryId"></CardListItemScripts> <ScriptsTree :categoryId="categoryId"></ScriptsTree>
</div> </div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { Component, Prop, Vue, Watch, Emit } from 'vue-property-decorator'; import { Component, Prop, Vue, Watch, Emit } from 'vue-property-decorator';
import CardListItemScripts from './CardListItemScripts.vue'; import ScriptsTree from '@/presentation/Scripts/ScriptsTree/ScriptsTree.vue';
import { StatefulVue } from '@/presentation/StatefulVue'; import { StatefulVue } from '@/presentation/StatefulVue';
@Component({ @Component({
components: { components: {
CardListItemScripts, ScriptsTree,
}, },
}) })
export default class CardListItem extends StatefulVue { export default class CardListItem extends StatefulVue {
@@ -52,10 +52,9 @@ export default class CardListItem extends StatefulVue {
this.cardTitle = value ? await this.getCardTitleAsync(value) : undefined; this.cardTitle = value ? await this.getCardTitleAsync(value) : undefined;
} }
private async getCardTitleAsync(categoryId: number): Promise<string | undefined> { private async getCardTitleAsync(categoryId: number): Promise<string | undefined> {
const state = await this.getCurrentStateAsync(); const state = await this.getCurrentStateAsync();
const category = state.getCategory(this.categoryId); const category = state.app.findCategory(this.categoryId);
return category ? category.name : undefined; return category ? category.name : undefined;
} }
} }
@@ -124,10 +123,6 @@ export default class CardListItem extends StatefulVue {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
text-transform: uppercase;
color: $light-gray;
font-size: 1.5em;
.close-button { .close-button {
font-size: 0.75em; font-size: 0.75em;
position: absolute; position: absolute;

View File

@@ -1,101 +0,0 @@
<template>
<span>
<span v-if="nodes != null && nodes.length > 0">
<SelectableTree
:nodes="nodes"
:selectedNodeIds="selectedNodeIds"
:filterPredicate="filterPredicate"
:filterText="filterText"
v-on:nodeSelected="checkNodeAsync($event)">
</SelectableTree>
</span>
<span v-else>Nooo 😢</span>
</span>
</template>
<script lang="ts">
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';
import { StatefulVue } from '@/presentation/StatefulVue';
import { Category } from '@/domain/Category';
import { IRepository } from '@/infrastructure/Repository/IRepository';
import { IScript } from '@/domain/IScript';
import { IApplicationState, IUserSelection } from '@/application/State/IApplicationState';
import { IFilterMatches } from '@/application/State/Filter/IFilterMatches';
import { ScriptNodeParser } from './ScriptNodeParser';
import SelectableTree, { FilterPredicate } from './../SelectableTree/SelectableTree.vue';
import { INode } from './../SelectableTree/INode';
@Component({
components: {
SelectableTree,
},
})
export default class CardListItemScripts extends StatefulVue {
@Prop() public categoryId!: number;
public nodes?: INode[] = null;
public selectedNodeIds?: string[] = null;
public filterText?: string = null;
private matches?: IFilterMatches;
public async mounted() {
// React to state changes
const state = await this.getCurrentStateAsync();
this.reactToChanges(state);
// Update initial state
await this.updateNodesAsync(this.categoryId);
}
public async checkNodeAsync(node: INode) {
if (node.children != null && node.children.length > 0) {
return; // only interested in script nodes
}
const state = await this.getCurrentStateAsync();
if (node.selected) {
state.selection.addSelectedScript(node.id);
} else {
state.selection.removeSelectedScript(node.id);
}
}
@Watch('categoryId')
public async updateNodesAsync(categoryId: |number) {
this.nodes = categoryId ?
await ScriptNodeParser.parseNodes(categoryId, await this.getCurrentStateAsync())
: undefined;
}
public filterPredicate(node: INode): boolean {
return this.matches.scriptMatches.some((script: IScript) => script.id === node.id);
}
private reactToChanges(state: IApplicationState) {
// Update selection data
const updateNodeSelection = (node: INode, selectedScripts: ReadonlyArray<IScript>): INode => {
return {
id: node.id,
text: node.text,
selected: selectedScripts.some((script) => script.id === node.id),
children: node.children ? node.children.map((child) => updateNodeSelection(child, selectedScripts)) : [],
documentationUrls: node.documentationUrls,
};
};
state.selection.changed.on(
(selectedScripts: ReadonlyArray<IScript>) =>
this.nodes = this.nodes.map((node: INode) => updateNodeSelection(node, selectedScripts)),
);
// Update search / filter data
state.filter.filterRemoved.on(() =>
this.filterText = '');
state.filter.filtered.on((matches: IFilterMatches) => {
this.filterText = matches.query;
this.matches = matches;
});
}
}
</script>
<style scoped lang="scss">
</style>

View File

@@ -1,43 +0,0 @@
import { ICategory } from './../../../domain/ICategory';
import { IApplicationState, IUserSelection } from '@/application/State/IApplicationState';
import { INode } from './../SelectableTree/INode';
export class ScriptNodeParser {
public static parseNodes(categoryId: number, state: IApplicationState): INode[] | undefined {
const category = state.getCategory(categoryId);
if (!category) {
throw new Error(`Category with id ${categoryId} does not exist`);
}
const tree = this.parseNodesRecursively(category, state.selection);
return tree;
}
private static parseNodesRecursively(parentCategory: ICategory, selection: IUserSelection): INode[] {
const nodes = new Array<INode>();
if (parentCategory.subCategories && parentCategory.subCategories.length > 0) {
for (const subCategory of parentCategory.subCategories) {
const subCategoryNodes = this.parseNodesRecursively(subCategory, selection);
nodes.push(
{
id: `cat${subCategory.id}`,
text: subCategory.name,
selected: false,
children: subCategoryNodes,
documentationUrls: subCategory.documentationUrls,
});
}
}
if (parentCategory.scripts && parentCategory.scripts.length > 0) {
for (const script of parentCategory.scripts) {
nodes.push( {
id: script.id,
text: script.name,
selected: selection.isSelected(script),
children: undefined,
documentationUrls: script.documentationUrls,
});
}
}
return nodes;
}
}

View File

@@ -1,19 +0,0 @@
<template>
<div>
<CardList v-if="isGrouped">
</CardList>
<SelectableTree></SelectableTree>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue, Emit } from 'vue-property-decorator';
import { Category } from '@/domain/Category';
import { StatefulVue } from '@/presentation/StatefulVue';
/** Shows content of single category or many categories */
@Component
export default class CategoryTree extends StatefulVue {
@Prop() public data!: Category | Category[];
}
</script>

View File

@@ -0,0 +1,4 @@
export enum Grouping {
Cards = 1,
None = 0,
}

View File

@@ -0,0 +1,83 @@
<template>
<div class="container">
<span class="part">Group by:</span>
<span class="part">
<span
class="part"
v-bind:class="{ 'disabled': cardsSelected, 'enabled': !cardsSelected}"
@click="groupByCard()">Cards</span>
<span class="part">|</span>
<span class="part"
v-bind:class="{ 'disabled': noneSelected, 'enabled': !noneSelected}"
@click="groupByNone()">None</span>
</span>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { StatefulVue } from '@/presentation/StatefulVue';
import { IApplicationState } from '@/application/State/IApplicationState';
import { Grouping } from './Grouping';
const DefaultGrouping = Grouping.Cards;
@Component
export default class TheGrouper extends StatefulVue {
public cardsSelected = false;
public noneSelected = false;
private currentGrouping: Grouping;
public mounted() {
this.changeGrouping(DefaultGrouping);
}
public groupByCard() {
this.changeGrouping(Grouping.Cards);
}
public groupByNone() {
this.changeGrouping(Grouping.None);
}
private changeGrouping(newGrouping: Grouping) {
if (this.currentGrouping === newGrouping) {
return;
}
this.currentGrouping = newGrouping;
this.cardsSelected = newGrouping === Grouping.Cards;
this.noneSelected = newGrouping === Grouping.None;
this.$emit('groupingChanged', this.currentGrouping);
}
}
</script>
<style scoped lang="scss">
@import "@/presentation/styles/colors.scss";
@import "@/presentation/styles/fonts.scss";
.container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
font-family: $normal-font;
.part {
display: flex;
margin-right:5px;
}
}
.enabled {
cursor: pointer;
&:hover {
font-weight:bold;
text-decoration:underline;
}
}
.disabled {
color:$gray;
}
</style>

View File

@@ -0,0 +1,66 @@
import { IApplication } from './../../../domain/IApplication';
import { ICategory, IScript } from '@/domain/ICategory';
import { INode } from './SelectableTree/INode';
export function parseAllCategories(app: IApplication): INode[] | undefined {
const nodes = new Array<INode>();
for (const category of app.categories) {
const children = parseCategoryRecursively(category);
nodes.push(convertCategoryToNode(category, children));
}
return nodes;
}
export function parseSingleCategory(categoryId: number, app: IApplication): INode[] | undefined {
const category = app.findCategory(categoryId);
if (!category) {
throw new Error(`Category with id ${categoryId} does not exist`);
}
const tree = parseCategoryRecursively(category);
return tree;
}
export function getScriptNodeId(script: IScript): string {
return script.id;
}
export function getCategoryNodeId(category: ICategory): string {
return `Category${category.id}`;
}
function parseCategoryRecursively(
parentCategory: ICategory): INode[] {
if (!parentCategory) { throw new Error('parentCategory is undefined'); }
const nodes = new Array<INode>();
if (parentCategory.subCategories && parentCategory.subCategories.length > 0) {
for (const subCategory of parentCategory.subCategories) {
const subCategoryNodes = parseCategoryRecursively(subCategory);
nodes.push(convertCategoryToNode(subCategory, subCategoryNodes));
}
}
if (parentCategory.scripts && parentCategory.scripts.length > 0) {
for (const script of parentCategory.scripts) {
nodes.push(convertScriptToNode(script));
}
}
return nodes;
}
function convertCategoryToNode(
category: ICategory, children: readonly INode[]): INode {
return {
id: getCategoryNodeId(category),
text: category.name,
children,
documentationUrls: category.documentationUrls,
};
}
function convertScriptToNode(script: IScript): INode {
return {
id: getScriptNodeId(script),
text: script.name,
children: undefined,
documentationUrls: script.documentationUrls,
};
}

View File

@@ -0,0 +1,103 @@
<template>
<span id="container">
<span v-if="nodes != null && nodes.length > 0">
<SelectableTree
:initialNodes="nodes"
:selectedNodeIds="selectedNodeIds"
:filterPredicate="filterPredicate"
:filterText="filterText"
v-on:nodeSelected="checkNodeAsync($event)">
</SelectableTree>
</span>
<span v-else>Nooo 😢</span>
</span>
</template>
<script lang="ts">
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';
import { StatefulVue } from '@/presentation/StatefulVue';
import { Category } from '@/domain/Category';
import { IRepository } from '@/infrastructure/Repository/IRepository';
import { IScript } from '@/domain/IScript';
import { ICategory } from '@/domain/ICategory';
import { IApplicationState, IUserSelection } from '@/application/State/IApplicationState';
import { IFilterResult } from '@/application/State/Filter/IFilterResult';
import { parseAllCategories, parseSingleCategory, getScriptNodeId, getCategoryNodeId } from './ScriptNodeParser';
import SelectableTree, { FilterPredicate } from './SelectableTree/SelectableTree.vue';
import { INode } from './SelectableTree/INode';
@Component({
components: {
SelectableTree,
},
})
export default class ScriptsTree extends StatefulVue {
@Prop() public categoryId?: number;
public nodes?: ReadonlyArray<INode> = null;
public selectedNodeIds?: ReadonlyArray<string> = [];
public filterText?: string = null;
private filtered?: IFilterResult;
public async mounted() {
const state = await this.getCurrentStateAsync();
// React to state changes
state.selection.changed.on(this.handleSelectionChanged);
state.filter.filterRemoved.on(this.handleFilterRemoved);
state.filter.filtered.on(this.handleFiltered);
// Update initial state
await this.initializeNodesAsync(this.categoryId);
}
public async checkNodeAsync(node: INode) {
if (node.children != null && node.children.length > 0) {
return; // only interested in script nodes
}
const state = await this.getCurrentStateAsync();
if (!this.selectedNodeIds.some((id) => id === node.id)) {
state.selection.addSelectedScript(node.id);
} else {
state.selection.removeSelectedScript(node.id);
}
}
@Watch('categoryId')
public async initializeNodesAsync(categoryId?: number) {
const state = await this.getCurrentStateAsync();
if (categoryId) {
this.nodes = parseSingleCategory(categoryId, state.app);
} else {
this.nodes = parseAllCategories(state.app);
}
this.selectedNodeIds = state.selection.selectedScripts
.map((script) => getScriptNodeId(script));
}
public filterPredicate(node: INode): boolean {
return this.filtered.scriptMatches.some(
(script: IScript) => node.id === getScriptNodeId(script))
|| this.filtered.categoryMatches.some(
(category: ICategory) => node.id === getCategoryNodeId(category));
}
private handleSelectionChanged(selectedScripts: ReadonlyArray<IScript>): void {
this.selectedNodeIds = selectedScripts
.map((node) => node.id);
}
private handleFilterRemoved() {
this.filterText = '';
}
private handleFiltered(result: IFilterResult) {
this.filterText = result.query;
this.filtered = result;
}
}
</script>
<style scoped lang="scss">
</style>

View File

@@ -3,5 +3,4 @@ export interface INode {
readonly text: string; readonly text: string;
readonly documentationUrls: ReadonlyArray<string>; readonly documentationUrls: ReadonlyArray<string>;
readonly children?: ReadonlyArray<INode>; readonly children?: ReadonlyArray<INode>;
readonly selected: boolean;
} }

View File

@@ -7,7 +7,7 @@
<a :href="url" <a :href="url"
:alt="url" :alt="url"
target="_blank" class="docs" target="_blank" class="docs"
v-tooltip.top-center="url" v-tooltip.top-center="url"
v-on:click.stop> v-on:click.stop>
<font-awesome-icon :icon="['fas', 'info-circle']" /> <font-awesome-icon :icon="['fas', 'info-circle']" />
</a> </a>

View File

@@ -0,0 +1,32 @@
import { ILiquorTreeNewNode, ILiquorTreeExistingNode } from 'liquor-tree';
import { INode } from './INode';
// Functions to translate INode to LiqourTree models and vice versa for anti-corruption
export function convertExistingToNode(liquorTreeNode: ILiquorTreeExistingNode): INode {
if (!liquorTreeNode) { throw new Error('liquorTreeNode is undefined'); }
return {
id: liquorTreeNode.id,
text: liquorTreeNode.data.text,
// selected: liquorTreeNode.states && liquorTreeNode.states.checked,
children: (!liquorTreeNode.children || liquorTreeNode.children.length === 0)
? [] : liquorTreeNode.children.map((childNode) => convertExistingToNode(childNode)),
documentationUrls: liquorTreeNode.data.documentationUrls,
};
}
export function toNewLiquorTreeNode(node: INode): ILiquorTreeNewNode {
if (!node) { throw new Error('node is undefined'); }
return {
id: node.id,
text: node.text,
state: {
checked: false,
},
children: (!node.children || node.children.length === 0) ? [] :
node.children.map((childNode) => toNewLiquorTreeNode(childNode)),
data: {
documentationUrls: node.documentationUrls,
},
};
}

View File

@@ -0,0 +1,162 @@
<template>
<span>
<span v-if="initialLiquourTreeNodes != null && initialLiquourTreeNodes.length > 0">
<tree :options="liquorTreeOptions"
:data="initialLiquourTreeNodes"
v-on:node:checked="nodeSelected($event)"
v-on:node:unchecked="nodeSelected($event)"
ref="treeElement"
>
<span class="tree-text" slot-scope="{ node }">
<Node :data="convertExistingToNode(node)"/>
</span>
</tree>
</span>
<span v-else>Nooo 😢</span>
</span>
</template>
<script lang="ts">
import { Component, Prop, Vue, Emit, Watch } from 'vue-property-decorator';
import LiquorTree, { ILiquorTreeNewNode, ILiquorTreeExistingNode, ILiquorTree, ILiquorTreeOptions } from 'liquor-tree';
import Node from './Node.vue';
import { INode } from './INode';
import { convertExistingToNode, toNewLiquorTreeNode } from './NodeTranslator';
export type FilterPredicate = (node: INode) => boolean;
/** Wrapper for Liquor Tree, reveals only abstracted INode for communication */
@Component({
components: {
LiquorTree,
Node,
},
})
export default class SelectableTree extends Vue {
@Prop() public filterPredicate?: FilterPredicate;
@Prop() public filterText?: string;
@Prop() public selectedNodeIds?: ReadonlyArray<string>;
@Prop() public initialNodes?: ReadonlyArray<INode>;
public initialLiquourTreeNodes?: ILiquorTreeNewNode[] = null;
public liquorTreeOptions = this.getDefaults();
public convertExistingToNode = convertExistingToNode;
public mounted() {
if (this.initialNodes) {
const initialNodes = this.initialNodes.map((node) => toNewLiquorTreeNode(node));
if (this.selectedNodeIds) {
recurseDown(initialNodes,
(node) => node.state.checked = this.selectedNodeIds.includes(node.id));
}
this.initialLiquourTreeNodes = initialNodes;
} else {
throw new Error('Initial nodes are null or empty');
}
if (this.filterText) {
this.updateFilterText(this.filterText);
}
}
public nodeSelected(node: ILiquorTreeExistingNode) {
this.$emit('nodeSelected', convertExistingToNode(node));
return;
}
@Watch('filterText')
public updateFilterText(filterText: |string) {
const api = this.getLiquorTreeApi();
if (!filterText) {
api.clearFilter();
} else {
api.filter('filtered'); // text does not matter, it'll trigger the filterPredicate
}
}
@Watch('selectedNodeIds')
public setSelectedStatus(selectedNodeIds: ReadonlyArray<string>) {
if (!selectedNodeIds) {
throw new Error('Selected nodes are undefined');
}
const newNodes = updateCheckedState(this.getLiquorTreeApi().model, selectedNodeIds);
this.getLiquorTreeApi().setModel(newNodes);
/* Alternative:
this.getLiquorTreeApi().recurseDown((node) => {
node.states.checked = selectedNodeIds.includes(node.id);
});
Problem: Does not check their parent if all children are checked, because it does not
trigger update on parent as we work with scripts not categories. */
/* Alternative:
this.getLiquorTreeApi().recurseDown((node) => {
if(selectedNodeIds.includes(node.id)) { node.select(); } else { node.unselect(); }
});
Problem: Emits nodeSelected() event again which will cause an infinite loop. */
}
private getLiquorTreeApi(): ILiquorTree {
if (!this.$refs.treeElement) {
throw new Error('Referenced tree element cannot be found. Probably it\'s not rendered?');
}
return (this.$refs.treeElement as any).tree;
}
private getDefaults(): ILiquorTreeOptions {
return {
multiple: true,
checkbox: true,
checkOnSelect: true,
autoCheckChildren: true,
parentSelect: false,
keyboardNavigation: true,
deletion: (node) => !node.children || node.children.length === 0,
filter: {
matcher: (query: string, node: ILiquorTreeExistingNode) => {
if (!this.filterPredicate) {
throw new Error('Cannot filter as predicate is null');
}
return this.filterPredicate(convertExistingToNode(node));
},
emptyText: '🕵Hmm.. Can not see one 🧐',
},
};
}
}
function recurseDown(
nodes: ReadonlyArray<ILiquorTreeNewNode>,
handler: (node: ILiquorTreeNewNode) => void) {
for (const node of nodes) {
handler(node);
if (node.children) {
recurseDown(node.children, handler);
}
}
}
function updateCheckedState(
oldNodes: ReadonlyArray<ILiquorTreeExistingNode>,
selectedNodeIds: ReadonlyArray<string>): ReadonlyArray<ILiquorTreeNewNode> {
const result = new Array<ILiquorTreeNewNode>();
for (const oldNode of oldNodes) {
const newState = oldNode.states;
newState.checked = selectedNodeIds.some((id) => id === oldNode.id);
const newNode: ILiquorTreeNewNode = {
id: oldNode.id,
text: oldNode.data.text,
data: {
documentationUrls: oldNode.data.documentationUrls,
},
children: oldNode.children == null ? [] :
updateCheckedState(oldNode.children, selectedNodeIds),
state: newState,
};
result.push(newNode);
}
return result;
}
</script>
<style scoped lang="scss">
@import "@/presentation/styles/colors.scss";
</style>

View File

@@ -1,181 +0,0 @@
<template>
<span>
<span v-if="initialNodes != null && initialNodes.length > 0">
<tree :options="liquorTreeOptions"
:data="this.initialNodes"
v-on:node:checked="nodeSelected($event)"
v-on:node:unchecked="nodeSelected($event)"
ref="treeElement"
>
<span class="tree-text" slot-scope="{ node }">
<Node :data="convertExistingToNode(node)"/>
</span>
</tree>
</span>
<span v-else>Nooo 😢</span>
</span>
</template>
<script lang="ts">
import { Component, Prop, Vue, Emit, Watch } from 'vue-property-decorator';
import LiquorTree, { ILiquorTreeNewNode, ILiquorTreeExistingNode, ILiquorTree } from 'liquor-tree';
import Node from './Node.vue';
import { INode } from './INode';
export type FilterPredicate = (node: INode) => boolean;
/** Wrapper for Liquor Tree, reveals only abstracted INode for communication */
@Component({
components: {
LiquorTree,
Node,
},
})
export default class SelectableTree extends Vue {
@Prop() public filterPredicate?: FilterPredicate;
@Prop() public filterText?: string;
@Prop() public nodes?: INode[];
public initialNodes?: ILiquorTreeNewNode[] = null;
public liquorTreeOptions = this.getLiquorTreeOptions();
public mounted() {
// console.log('Mounted', 'initial nodes', this.nodes);
// console.log('Mounted', 'initial model', this.getLiquorTreeApi().model);
if (this.nodes) {
this.initialNodes = this.nodes.map((node) => this.toLiquorTreeNode(node));
} else {
throw new Error('Initial nodes are null or empty');
}
if (this.filterText) {
this.updateFilterText(this.filterText);
}
}
public nodeSelected(node: ILiquorTreeExistingNode) {
this.$emit('nodeSelected', this.convertExistingToNode(node));
return;
}
@Watch('filterText')
public updateFilterText(filterText: |string) {
const api = this.getLiquorTreeApi();
if (!filterText) {
api.clearFilter();
} else {
api.filter('filtered'); // text does not matter, it'll trigger the predicate
}
}
@Watch('nodes', {deep: true})
public setSelectedStatus(nodes: |ReadonlyArray<INode>) {
if (!nodes || nodes.length === 0) {
throw new Error('Updated nodes are null or empty');
}
// Update old node properties, re-setting it changes expanded status etc.
// It'll not be needed when this is merged: https://github.com/amsik/liquor-tree/pull/141
const updateCheckedState = (
oldNodes: ReadonlyArray<ILiquorTreeExistingNode>,
updatedNodes: ReadonlyArray<INode>): ILiquorTreeNewNode[] => {
const newNodes = new Array<ILiquorTreeNewNode>();
for (const oldNode of oldNodes) {
for (const updatedNode of updatedNodes) {
if (oldNode.id === updatedNode.id) {
const newState = oldNode.states;
newState.checked = updatedNode.selected;
newNodes.push({
id: oldNode.id,
text: updatedNode.text,
children: oldNode.children == null ? [] :
updateCheckedState(
oldNode.children,
updatedNode.children),
state: newState,
data: {
documentationUrls: oldNode.data.documentationUrls,
},
});
}
}
}
return newNodes;
};
const newModel = updateCheckedState(
this.getLiquorTreeApi().model, nodes);
this.getLiquorTreeApi().setModel(newModel);
}
private convertItem(liquorTreeNode: ILiquorTreeNewNode): INode {
if (!liquorTreeNode) { throw new Error('liquorTreeNode is undefined'); }
return {
id: liquorTreeNode.id,
text: liquorTreeNode.text,
selected: liquorTreeNode.state && liquorTreeNode.state.checked,
children: (!liquorTreeNode.children || liquorTreeNode.children.length === 0)
? [] : liquorTreeNode.children.map((childNode) => this.convertItem(childNode)),
documentationUrls: liquorTreeNode.data.documentationUrls,
};
}
private convertExistingToNode(liquorTreeNode: ILiquorTreeExistingNode): INode {
if (!liquorTreeNode) { throw new Error('liquorTreeNode is undefined'); }
return {
id: liquorTreeNode.id,
text: liquorTreeNode.data.text,
selected: liquorTreeNode.states && liquorTreeNode.states.checked,
children: (!liquorTreeNode.children || liquorTreeNode.children.length === 0)
? [] : liquorTreeNode.children.map((childNode) => this.convertExistingToNode(childNode)),
documentationUrls: liquorTreeNode.data.documentationUrls,
};
}
private toLiquorTreeNode(node: INode): ILiquorTreeNewNode {
if (!node) { throw new Error('node is undefined'); }
return {
id: node.id,
text: node.text,
state: {
checked: node.selected,
},
children: (!node.children || node.children.length === 0) ? [] :
node.children.map((childNode) => this.toLiquorTreeNode(childNode)),
data: {
documentationUrls: node.documentationUrls,
},
};
}
private getLiquorTreeOptions(): any {
return {
checkbox: true,
checkOnSelect: true,
deletion: (node) => !node.children || node.children.length === 0,
filter: {
matcher: (query: string, node: ILiquorTreeExistingNode) => {
if (!this.filterPredicate) {
throw new Error('Cannot filter as predicate is null');
}
return this.filterPredicate(this.convertExistingToNode(node));
},
emptyText: '🕵Hmm.. Can not see one 🧐',
},
};
}
private getLiquorTreeApi(): ILiquorTree {
if (!this.$refs.treeElement) {
throw new Error('Referenced tree element cannot be found. Probably it\'s not rendered?');
}
return (this.$refs.treeElement as any).tree;
}
}
</script>
<style scoped lang="scss">
@import "@/presentation/styles/colors.scss";
</style>

View File

@@ -1,26 +1,28 @@
<template> <template>
<div class="container"> <div class="container">
<div class="part">Select:</div> <div class="part select">Select:</div>
<div class="part"> <div class="part">
<SelectableOption <div class="part">
label="Recommended" <SelectableOption
:enabled="isRecommendedSelected" label="None"
@click="selectRecommendedAsync()" /> :enabled="isNoneSelected"
</div> @click="selectNoneAsync()">
<div class="part"> | </div> </SelectableOption>
<div class="part"> </div>
<SelectableOption <div class="part"> | </div>
label="All" <div class="part">
:enabled="isAllSelected" <SelectableOption
@click="selectAllAsync()" /> label="Recommended"
</div> :enabled="isRecommendedSelected"
<div class="part"> | </div> @click="selectRecommendedAsync()" />
<div class="part"> </div>
<SelectableOption <div class="part"> | </div>
label="None" <div class="part">
:enabled="isNoneSelected" <SelectableOption
@click="selectNoneAsync()"> label="All"
</SelectableOption> :enabled="isAllSelected"
@click="selectAllAsync()" />
</div>
</div> </div>
</div> </div>
</template> </template>
@@ -63,7 +65,7 @@ export default class TheSelector extends StatefulVue {
return; return;
} }
const state = await this.getCurrentStateAsync(); const state = await this.getCurrentStateAsync();
state.selection.selectOnly(state.defaultScripts); state.selection.selectOnly(state.app.getRecommendedScripts());
} }
public async selectNoneAsync(): Promise<void> { public async selectNoneAsync(): Promise<void> {
@@ -76,8 +78,8 @@ export default class TheSelector extends StatefulVue {
private updateSelections(state: IApplicationState) { private updateSelections(state: IApplicationState) {
this.isNoneSelected = state.selection.totalSelected === 0; this.isNoneSelected = state.selection.totalSelected === 0;
this.isAllSelected = state.selection.totalSelected === state.appTotalScripts; this.isAllSelected = state.selection.totalSelected === state.app.totalScripts;
this.isRecommendedSelected = this.areSame(state.defaultScripts, state.selection.selectedScripts); this.isRecommendedSelected = this.areSame(state.app.getRecommendedScripts(), state.selection.selectedScripts);
} }
private areSame(scripts: ReadonlyArray<IScript>, other: ReadonlyArray<IScript>): boolean { private areSame(scripts: ReadonlyArray<IScript>, other: ReadonlyArray<IScript>): boolean {
@@ -94,13 +96,11 @@ export default class TheSelector extends StatefulVue {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
flex-wrap: wrap; flex-wrap: wrap;
align-items:flex-start;
.part { .part {
display: flex; display: flex;
margin-right:5px; margin-right:5px;
} }
font:16px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace; font-family: $normal-font;
} }
</style> </style>

View File

@@ -1,48 +0,0 @@
<template>
<div class="container">
Group by: <span
v-bind:class="{ 'disabled': isGrouped, 'enabled': !isGrouped}"
@click="changeGrouping()" >Cards</Span> |
<span class="action"
v-bind:class="{ 'disabled': !isGrouped, 'enabled': isGrouped}"
@click="changeGrouping()">None</span>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { StatefulVue } from '@/presentation/StatefulVue';
import { IApplicationState } from '@/application/State/IApplicationState';
@Component
export default class TheGrouper extends StatefulVue {
public isGrouped = true;
public changeGrouping() {
this.isGrouped = !this.isGrouped;
}
}
</script>
<style scoped lang="scss">
@import "@/presentation/styles/colors.scss";
@import "@/presentation/styles/fonts.scss";
.container {
// text-align:left;
font:16px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;
}
.enabled {
cursor: pointer;
&:hover {
font-weight:bold;
text-decoration:underline;
}
}
.disabled {
color:$gray;
}
</style>

View File

@@ -0,0 +1,137 @@
<template>
<div>
<div class="help-container">
<TheSelector class="left" />
<TheGrouper class="right"
v-on:groupingChanged="onGroupingChanged($event)"
v-show="!this.isSearching" />
</div>
<div class="scripts">
<div v-if="!isSearching || searchHasMatches">
<CardList v-if="this.showCards" />
<div v-else-if="this.showList" class="tree">
<div v-if="this.isSearching" class="search-query">
Searching for "{{this.searchQuery | threeDotsTrim}}"</div>
<ScriptsTree />
</div>
</div>
<div v-else class="search-no-matches">
Sorry, no matches for "{{this.searchQuery | threeDotsTrim}}" 😞
Feel free to extend the scripts <a :href="repositoryUrl" target="_blank" class="child github" >here</a>.
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue, Emit } from 'vue-property-decorator';
import { Category } from '@/domain/Category';
import { StatefulVue } from '@/presentation/StatefulVue';
import { Grouping } from './Grouping/Grouping';
import { IFilterResult } from '@/application/State/Filter/IFilterResult';
import TheGrouper from '@/presentation/Scripts/Grouping/TheGrouper.vue';
import TheSelector from '@/presentation/Scripts/Selector/TheSelector.vue';
import ScriptsTree from '@/presentation/Scripts/ScriptsTree/ScriptsTree.vue';
import CardList from '@/presentation/Scripts/Cards/CardList.vue';
/** Shows content of single category or many categories */
@Component({
components: {
TheGrouper,
TheSelector,
ScriptsTree,
CardList,
},
filters: {
threeDotsTrim(query: string) {
const threshold = 30;
if (query.length <= threshold - 3) {
return query;
}
return `${query.substr(0, threshold)}...`;
},
},
})
export default class TheScripts extends StatefulVue {
public showCards = false;
public showList = false;
public repositoryUrl = '';
private searchQuery = '';
private isSearching = false;
private searchHasMatches = false;
private currentGrouping: Grouping;
public async mounted() {
const state = await this.getCurrentStateAsync();
this.repositoryUrl = state.app.repositoryUrl;
state.filter.filterRemoved.on(() => {
this.isSearching = false;
this.updateGroups();
});
state.filter.filtered.on((result: IFilterResult) => {
this.searchQuery = result.query;
this.isSearching = true;
this.searchHasMatches = result.hasAnyMatches();
this.updateGroups();
});
}
public onGroupingChanged(group: Grouping) {
this.currentGrouping = group;
this.updateGroups();
}
private updateGroups(): void {
this.showCards = !this.isSearching && this.currentGrouping === Grouping.Cards;
this.showList = this.isSearching || this.currentGrouping === Grouping.None;
}
}
</script>
<style scoped lang="scss">
@import "@/presentation/styles/colors.scss";
@import "@/presentation/styles/fonts.scss";
.scripts {
margin-top:10px;
.search-no-matches {
word-break:break-word;
color: $white;
text-transform: uppercase;
color: $light-gray;
font-size: 1.5em;
background-color: $slate;
padding:5%;
text-align:center;
> a {
color: $gray;
}
}
.tree {
padding-left: 3%;
padding-top: 15px;
padding-bottom: 15px;
.search-query {
display: flex;
justify-content: center;
color: $gray;
}
}
}
.help-container {
display: flex;
justify-content: space-between;
align-items: center;
.center {
justify-content: center;
}
.left {
justify-content: flex-start;
}
.right {
justify-content: flex-end;
}
}
</style>

View File

@@ -7,7 +7,23 @@ import { Component, Prop, Watch, Vue } from 'vue-property-decorator';
import { StatefulVue, IApplicationState } from './StatefulVue'; import { StatefulVue, IApplicationState } from './StatefulVue';
import ace from 'ace-builds'; import ace from 'ace-builds';
import 'ace-builds/webpack-resolver'; import 'ace-builds/webpack-resolver';
import { CodeBuilder } from '../application/State/Code/CodeBuilder';
const NothingChosenCode =
new CodeBuilder()
.appendCommentLine('privacy.sexy — 🔐 Enforce privacy & security best-practices on Windows')
.appendLine()
.appendCommentLine('-- 🧐 Why privacy.sexy')
.appendCommentLine(' ✔️ Rich tweak pool to harden security & privacy of the OS and other softwares on it.')
.appendCommentLine(' ✔️ You don\'t need to run any compiled software on your system, just run the generated scripts.')
.appendCommentLine(' ✔️ Have full visibility into what the tweaks do as you enable them.')
.appendCommentLine(' ✔️ Free software, 100% transparency: both application & infrastructure code are open-sourced.')
.appendLine()
.appendCommentLine('-- 🤔 How to use')
.appendCommentLine(' 📙 Start by exploring different categories and choosing different tweaks.')
.appendCommentLine(' 📙 You can select "Recommended" on the top to select "safer" tweaks. Always double check!')
.appendCommentLine(' 📙 After you choose any tweak, you can download & copy to execute your script.')
.toString();
@Component @Component
export default class TheCodeArea extends StatefulVue { export default class TheCodeArea extends StatefulVue {
@@ -17,29 +33,29 @@ export default class TheCodeArea extends StatefulVue {
@Prop() private theme!: string; @Prop() private theme!: string;
public async mounted() { public async mounted() {
this.editor = this.initializeEditor(); this.editor = initializeEditor(this.theme, this.editorId);
const state = await this.getCurrentStateAsync(); const state = await this.getCurrentStateAsync();
this.updateCode(state.code.current); this.updateCode(state.code.current);
state.code.changed.on((code) => this.updateCode(code)); state.code.changed.on((code) => this.updateCode(code));
} }
private updateCode(code: string) { private updateCode(code: string) {
this.editor.setValue(code || 'Something is bad 😢', 1); this.editor.setValue(code || NothingChosenCode, 1);
}
private initializeEditor(): ace.Ace.Editor {
const lang = 'batchfile';
const theme = this.theme || 'github';
const editor = ace.edit(this.editorId);
editor.getSession().setMode(`ace/mode/${lang}`);
editor.setTheme(`ace/theme/${theme}`);
editor.setReadOnly(true);
editor.setAutoScrollEditorIntoView(true);
// this.editor.getSession().setUseWrapMode(true);
// this.editor.setOption("indentedSoftWrap", false);
return editor;
} }
} }
function initializeEditor(theme: string, editorId: string): ace.Ace.Editor {
const lang = 'batchfile';
theme = theme || 'github';
const editor = ace.edit(editorId);
editor.getSession().setMode(`ace/mode/${lang}`);
editor.setTheme(`ace/theme/${theme}`);
editor.setReadOnly(true);
editor.setAutoScrollEditorIntoView(true);
editor.getSession().setUseWrapMode(true); // So code is readable on mobile
return editor;
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@@ -0,0 +1,31 @@
<template>
<div id="footer">
{{text}}
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { StatefulVue } from './StatefulVue';
@Component
export default class TheFooter extends StatefulVue {
private text: string = '';
public async mounted() {
const state = await this.getCurrentStateAsync();
this.text = `v${state.app.version}`;
}
}
</script>
<style scoped lang="scss">
@import "@/presentation/styles/colors.scss";
@import "@/presentation/styles/fonts.scss";
#footer {
color: $gray;
font-size: 0.7em;
font-family: $artistic-font;
text-align: center;
}
</style>

View File

@@ -2,7 +2,7 @@
<div id="container"> <div id="container">
<h1 class="child title" >{{ title }}</h1> <h1 class="child title" >{{ title }}</h1>
<h2 class="child subtitle">{{ subtitle }}</h2> <h2 class="child subtitle">{{ subtitle }}</h2>
<a :href="githubUrl" target="_blank" class="child github" > <a :href="repositoryUrl" target="_blank" class="child github" >
<font-awesome-icon :icon="['fab', 'github']" size="3x" /> <font-awesome-icon :icon="['fab', 'github']" size="3x" />
</a> </a>
</div> </div>
@@ -14,20 +14,22 @@ import { StatefulVue } from './StatefulVue';
@Component @Component
export default class TheHeader extends StatefulVue { export default class TheHeader extends StatefulVue {
private title: string = ''; public title = '';
private subtitle: string = ''; public subtitle = '';
@Prop() private githubUrl!: string; public repositoryUrl = '';
public async mounted() { public async mounted() {
const state = await this.getCurrentStateAsync(); const state = await this.getCurrentStateAsync();
this.title = state.appName; this.title = state.app.name;
this.subtitle = `Privacy generator tool for Windows v${state.appVersion}`; this.subtitle = 'Enforce privacy & security on Windows';
this.repositoryUrl = state.app.repositoryUrl;
} }
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import "@/presentation/styles/colors.scss"; @import "@/presentation/styles/colors.scss";
@import "@/presentation/styles/fonts.scss";
#container { #container {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -42,15 +44,15 @@ export default class TheHeader extends StatefulVue {
margin: 0; margin: 0;
color: $black; color: $black;
text-transform: uppercase; text-transform: uppercase;
font-family: $main-font;
font-size: 2.5em; font-size: 2.5em;
font-weight: 500;
line-height: 1.1; line-height: 1.1;
} }
.subtitle { .subtitle {
margin: 0; margin: 0;
font-size: 1.5em; font-size: 1.5em;
color: $gray; color: $gray;
font-family: 'Yesteryear', cursive; font-family: $artistic-font;
font-weight: 500; font-weight: 500;
line-height: 1.2; line-height: 1.2;
} }

View File

@@ -1,13 +1,11 @@
<template> <template>
<div class="container"> <div class="search">
<div class="search"> <input type="search" class="searchTerm" placeholder="Search"
<input type="text" class="searchTerm" placeholder="Search for configurations" @input="updateFilterAsync($event.target.value)" >
@input="updateFilterAsync($event.target.value)" > <div class="iconWrapper">
<div class="iconWrapper"> <font-awesome-icon :icon="['fas', 'search']" />
<font-awesome-icon :icon="['fas', 'search']" /> </div>
</div> </div>
</div>
</div>
</template> </template>
<script lang="ts"> <script lang="ts">
@@ -16,8 +14,6 @@ import { StatefulVue } from './StatefulVue';
@Component @Component
export default class TheSearchBar extends StatefulVue { export default class TheSearchBar extends StatefulVue {
public async updateFilterAsync(filter: |string) { public async updateFilterAsync(filter: |string) {
const state = await this.getCurrentStateAsync(); const state = await this.getCurrentStateAsync();
if (!filter) { if (!filter) {
@@ -34,13 +30,6 @@ export default class TheSearchBar extends StatefulVue {
@import "@/presentation/styles/colors.scss"; @import "@/presentation/styles/colors.scss";
@import "@/presentation/styles/fonts.scss"; @import "@/presentation/styles/fonts.scss";
.container {
padding-top: 30px;
padding-right: 30%;
padding-left: 30%;
font: $default-font;
}
.search { .search {
width: 100%; width: 100%;
position: relative; position: relative;
@@ -49,6 +38,7 @@ export default class TheSearchBar extends StatefulVue {
.searchTerm { .searchTerm {
width: 100%; width: 100%;
min-width: 60px;
border: 1.5px solid $gray; border: 1.5px solid $gray;
border-right: none; border-right: none;
height: 36px; height: 36px;
@@ -57,6 +47,8 @@ export default class TheSearchBar extends StatefulVue {
padding-right:10px; padding-right:10px;
outline: none; outline: none;
color: $gray; color: $gray;
font-family: $normal-font;
font-size:1em;
} }
.searchTerm:focus{ .searchTerm:focus{

View File

@@ -1,26 +1,33 @@
/* latin-ext */ // https://google-webfonts-helper.herokuapp.com/fonts
@font-face {
font-family: 'Slabo 27px';
font-style: normal;
font-weight: 400;
src: local('Slabo 27px'), local('Slabo27px-Regular'), url('~@/presentation/styles/fonts/Slabo27px-v6.woff2') format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Slabo 27px';
font-style: normal;
font-weight: 400;
src: local('Slabo 27px'), local('Slabo27px-Regular'), url('~@/presentation/styles/fonts/Slabo27px-v6.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin */
@font-face {
font-family: 'Yesteryear';
font-style: normal;
font-weight: 400;
src: local('Yesteryear'), local('Yesteryear-Regular'), url('~@/presentation/styles/fonts/yesteryear-v8.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
$default-font: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace; /* slabo-27px-regular - latin-ext_latin */
@font-face {
font-family: 'Slabo 27px';
font-style: normal;
font-weight: 400;
src: url('~@/presentation/styles/fonts/slabo-27px-v6-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */
src: local('Slabo 27px'), local('Slabo27px-Regular'),
url('~@/presentation/styles/fonts/slabo-27px-v6-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('~@/presentation/styles/fonts/slabo-27px-v6-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
url('~@/presentation/styles/fonts/slabo-27px-v6-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */
url('~@/presentation/styles/fonts/slabo-27px-v6-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
url('~@/presentation/styles/fonts/slabo-27px-v6-latin-ext_latin-regular.svg#Slabo27px') format('svg'); /* Legacy iOS */
}
/* yesteryear-regular - latin */
@font-face {
font-family: 'Yesteryear';
font-style: normal;
font-weight: 400;
src: url('~@/presentation/styles/fonts/yesteryear-v8-latin-regular.eot'); /* IE9 Compat Modes */
src: local('Yesteryear'), local('Yesteryear-Regular'),
url('~@/presentation/styles/fonts/yesteryear-v8-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('~@/presentation/styles/fonts/yesteryear-v8-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
url('~@/presentation/styles/fonts/yesteryear-v8-latin-regular.woff') format('woff'), /* Modern Browsers */
url('~@/presentation/styles/fonts/yesteryear-v8-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
url('~@/presentation/styles/fonts/yesteryear-v8-latin-regular.svg#Yesteryear') format('svg'); /* Legacy iOS */
}
$normal-font: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;
$artistic-font: 'Yesteryear', cursive;
$main-font: 'Slabo 27px';

View File

@@ -0,0 +1,313 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<defs >
<font id="Slabo27px" horiz-adv-x="397" ><font-face
font-family="Slabo 27px"
units-per-em="810"
panose-1="2 6 5 3 3 5 5 2 4 4"
ascent="750"
descent="-240"
alphabetic="0" />
<glyph unicode=" " glyph-name="space" horiz-adv-x="150" />
<glyph unicode="!" glyph-name="exclam" horiz-adv-x="240" d="M92 540H166L150 150H109L92 540ZM80 39Q80 63 93 77T130 92Q153 92 166 78T180 43Q180 18 166 4T128 -10Q106 -10 93 4T80 39Z" />
<glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="270" d="M42 540H108L95 360H55L42 540ZM162 540H228L215 360H175L162 540Z" />
<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="420" d="M390 340L386 300H307L296 180H376L372 140H292L280 0H230L243 140H157L145 0H96L109 140H30L34 180H112L123 300H44L48 340H127L140 480H188L175 340H262L275 480H323L310 340H390ZM161 180H247L258
300H172L161 180Z" />
<glyph unicode="$" glyph-name="dollar" horiz-adv-x="420" d="M180 -70V-2Q109 -1 40 23V130H92V61Q126 50 180 49V249Q102 281 70 314T38 401Q38 458 75 495T180 540V610H226V541Q299 537 352 515V420H300V479Q266 490 226 491V295Q302 263 336 229T370 142Q370
86 334 48T226 1V-70H180ZM308 132Q308 170 286 192T226 231V51Q268 58 288 80T308 132ZM100 409Q100 372 121 351T180 314V490Q139 485 120 463T100 409Z" />
<glyph unicode="%" glyph-name="percent" horiz-adv-x="780" d="M50 379Q50 463 87 506T184 550Q242 550 276 507T310 385Q310 298 274 254T178 210Q121 210 86 254T50 379ZM106 382Q106 320 124 289T180 257Q216 257 235 288T254 382Q254 443 237 473T180 503Q144
503 125 475T106 382ZM605 550L235 0H175L545 550H605ZM470 170Q470 254 507 297T604 341Q662 341 696 298T730 176Q730 89 694 45T598 1Q541 1 506 45T470 170ZM526 173Q526 111 544 80T600 48Q636 48 655 79T674 173Q674 234 657 264T600 294Q564 294 545 266T526
173Z" />
<glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="540" d="M410 280H360V330H520V280H462Q457 184 416 109Q448 76 470 61T514 45Q528 45 540 47V0Q522 -5 503 -5Q474 -5 449 9T381 63Q314 -10 220 -10Q143 -10 95 34T47 143Q47 239 150 299Q90 367
90 423Q90 479 126 514T222 550Q278 550 314 520T350 439Q350 397 323 363T235 292Q251 274 271 254T310 213L378 146Q408 207 410 280ZM110 155Q110 104 142 72T228 40Q294 40 345 96Q313 127 271 168T180 265Q110 225 110 155ZM292 435Q292 466 272 483T220 500Q188
500 169 482T149 429Q149 382 205 325Q249 349 270 376T292 435Z" />
<glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="150" d="M42 540H108L95 360H55L42 540Z" />
<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="270" d="M110 243Q110 32 250 -120H192Q46 42 47 239Q46 435 192 600H250Q110 449 110 243Z" />
<glyph unicode=")" glyph-name="parenright" horiz-adv-x="270" d="M160 239Q160 449 20 600H78Q224 435 223 243Q224 42 78 -120H20Q160 32 160 239Z" />
<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="360" d="M216 570L207 458L313 500L330 440L221 417L295 328L245 290L185 389L125 291L76 329L148 417L39 441L58 500L162 459L154 570H216Z" />
<glyph unicode="+" glyph-name="plus" horiz-adv-x="390" d="M222 50H168V183H30V237H168V370H222V237H360V183H222V50Z" />
<glyph unicode="," glyph-name="comma" horiz-adv-x="210" d="M109 118Q155 75 155 28Q155 -37 79 -104L48 -75Q91 -34 90 4Q90 34 52 69L109 118Z" />
<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="210" d="M30 230H180V180H30V230Z" />
<glyph unicode="." glyph-name="period" horiz-adv-x="180" d="M50 39Q50 63 63 77T100 92Q123 92 136 78T150 43Q150 18 136 4T98 -10Q76 -10 63 4T50 39Z" />
<glyph unicode="/" glyph-name="slash" horiz-adv-x="240" d="M200 540H252L40 -120H-12L200 540Z" />
<glyph unicode="0" glyph-name="zero" horiz-adv-x="420" d="M40 224Q40 335 87 397T215 460Q289 460 334 400T380 230Q380 122 334 56T208 -10Q132 -10 86 54T40 224ZM103 228Q103 137 131 89T209 40Q261 40 289 89T317 230Q317 317 291 363T211 410Q160 410
132 365T103 228Z" />
<glyph unicode="1" glyph-name="one" horiz-adv-x="240" d="M110 0V400H40V450H170V0H110Z" />
<glyph unicode="2" glyph-name="two" horiz-adv-x="360" d="M330 110V0H30V45Q124 121 187 199T250 332Q250 368 233 389T170 410Q131 410 92 393V320H40V422Q109 460 177 460Q243 460 278 428T313 338Q313 273 250 193T110 52V50H278V110H330Z" />
<glyph unicode="3" glyph-name="three" horiz-adv-x="360" d="M10 -32Q67 -49 126 -49Q195 -49 231 -22T267 61Q267 113 233 137T129 161H100V210H120Q180 210 213 240T247 323Q247 365 224 387T152 410Q108 410 72 395V330H20V425Q86 460 156 460Q228 460 269
423T310 327Q310 238 214 194V192Q330 167 330 61Q330 26 317 -3T277 -54T212 -88T123 -100Q63 -100 10 -84V-32Z" />
<glyph unicode="4" glyph-name="four" horiz-adv-x="420" d="M270 60H20V104L281 450H330V110H390V60H330V-60H270V60ZM87 110H270V352H268L87 112V110Z" />
<glyph unicode="5" glyph-name="five" horiz-adv-x="390" d="M40 -36Q89 -49 139 -49Q209 -49 248 -18T287 79Q287 138 249 169T129 200Q92 200 50 196V450H322V340H270V400H105V248Q126 250 143 250Q236 250 293 208T350 83Q350 3 293 -48T137 -100Q85 -100 40 -89V-36Z" />
<glyph unicode="6" glyph-name="six" horiz-adv-x="420" d="M350 495Q317 500 295 500Q201 500 154 442T103 276L105 275Q158 330 234 330Q303 330 346 286T390 176Q390 102 343 51T220 0Q136 0 88 65T40 252Q40 390 107 470T295 550Q319 550 350 545V495ZM103
227Q108 149 137 100T222 50Q268 50 297 81T327 167Q327 218 300 249T223 280Q155 280 103 227Z" />
<glyph unicode="7" glyph-name="seven" horiz-adv-x="360" d="M110 -90Q113 -27 130 39T173 168T228 290T287 398L286 400H82V333H30V450H350V407Q315 350 285 290T231 168T193 42T178 -90H110Z" />
<glyph unicode="8" glyph-name="eight" horiz-adv-x="420" d="M145 285V287Q47 336 47 412Q47 474 94 512T216 550Q289 550 331 515T373 422Q373 344 269 291V289Q327 259 355 224T383 145Q383 83 334 42T206 0Q129 0 83 38T37 137Q37 229 145 285ZM189 263Q100
218 100 140Q100 95 130 73T208 50Q259 50 289 74T320 136Q320 174 289 202T189 263ZM227 312Q313 359 313 420Q313 460 285 480T211 500Q166 500 137 480T107 425Q107 405 116 390T142 361T180 337T227 312Z" />
<glyph unicode="9" glyph-name="nine" horiz-adv-x="420" d="M70 -45Q102 -50 125 -50Q218 -50 266 10T317 183L315 184Q262 130 186 130Q117 130 74 174T30 286Q30 360 77 410T200 460Q285 460 332 395T380 208Q380 66 312 -17T125 -100Q101 -100 70 -95V-45ZM317
233Q312 311 283 360T198 410Q152 410 123 379T93 293Q93 242 120 211T197 180Q264 180 317 233Z" />
<glyph unicode=":" glyph-name="colon" horiz-adv-x="210" d="M60 39Q60 63 73 77T110 92Q133 92 146 78T160 43Q160 18 146 4T108 -10Q86 -10 73 4T60 39ZM60 337Q60 361 73 375T110 390Q133 390 146 376T160 341Q160 316 146 302T108 288Q86 288 73 302T60 337Z" />
<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="210" d="M60 337Q60 361 73 375T110 390Q133 390 146 376T160 341Q160 316 146 302T108 288Q86 288 73 302T60 337ZM119 118Q165 75 165 28Q165 -37 89 -104L58 -75Q101 -34 100 4Q100 34 62 69L119 118Z" />
<glyph unicode="&lt;" glyph-name="less" horiz-adv-x="390" d="M97 209L360 117V60L30 183V237L360 360V305L97 211V209Z" />
<glyph unicode="=" glyph-name="equal" horiz-adv-x="390" d="M30 246V300H360V246H30ZM30 120V174H360V120H30Z" />
<glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="390" d="M293 211L30 305V360L360 237V183L30 60V117L293 209V211Z" />
<glyph unicode="?" glyph-name="question" horiz-adv-x="300" d="M60 537Q99 550 141 550Q202 550 242 515T282 420Q282 376 264 346T213 290Q180 263 164 242T147 190Q147 172 153 150H109Q98 180 98 210Q98 244 113 269T157 317Q184 339 202 360T220 418Q220
457 196 477T131 497Q99 497 60 485V537ZM80 39Q80 63 93 77T130 92Q153 92 166 78T180 43Q180 18 166 4T128 -10Q106 -10 93 4T80 39Z" />
<glyph unicode="@" glyph-name="at" horiz-adv-x="660" d="M480 -124Q407 -150 330 -150Q202 -150 126 -69T50 147Q50 289 134 384T352 480Q473 480 546 401T620 203Q620 113 578 52T474 -10Q437 -10 414 12T390 78H389Q352 -10 286 -10Q244 -10 220 28T195 125Q195
212 238 271T357 330Q402 330 457 312L447 175Q441 116 441 85Q441 41 474 41Q512 41 537 87T562 203Q562 303 503 365T351 427Q247 427 179 350T110 153Q110 38 171 -28T334 -95Q403 -95 480 -69V-124ZM397 278Q377 284 354 284Q311 284 286 240T260 129Q260 88
269 66T301 43Q336 43 360 97T391 211L397 278Z" />
<glyph unicode="A" glyph-name="A" horiz-adv-x="480" d="M160 50V0H0V50H50L211 545H269L433 50H480V0H320V50H370L321 200H154L107 50H160ZM235 460L169 250H305L237 460H235Z" />
<glyph unicode="B" glyph-name="B" horiz-adv-x="450" d="M307 292Q360 279 385 243T410 158Q410 84 362 42T212 0H30V50H90V490H30V540H213Q303 540 346 507T389 412Q389 370 370 340T307 294V292ZM214 50Q281 50 313 74T346 158Q346 210 316 235T219 260H150V50H214ZM214
310Q326 310 326 403Q326 450 298 470T209 490H150V310H214Z" />
<glyph unicode="C" glyph-name="C" horiz-adv-x="450" d="M420 30Q346 -10 270 -10Q163 -10 102 64T40 270Q40 400 103 475T271 550Q344 550 420 518V400H365V479Q325 495 269 495Q189 495 146 441T103 274Q103 157 148 101T273 45Q340 45 420 85V30Z" />
<glyph unicode="D" glyph-name="D" horiz-adv-x="510" d="M30 50H90V490H30V540H209Q339 540 401 476T463 284Q463 144 393 72T191 0H30V50ZM150 50H198Q295 50 347 105T400 278Q400 388 352 439T198 490H150V50Z" />
<glyph unicode="E" glyph-name="E" horiz-adv-x="420" d="M337 50V120H390V0H30V50H90V490H30V540H380V420H327V490H150V300H250V350H300V190H250V250H150V50H337Z" />
<glyph unicode="F" glyph-name="F" horiz-adv-x="390" d="M150 240V50H220V0H30V50H90V490H30V540H380V420H327V490H150V290H260V340H310V180H260V240H150Z" />
<glyph unicode="G" glyph-name="G" horiz-adv-x="510" d="M310 250H480V200H440V25Q365 -10 284 -10Q168 -10 104 64T40 270Q40 400 106 475T283 550Q360 550 440 518V390H385V479Q341 495 281 495Q195 495 149 441T103 274Q103 157 151 101T286 45Q332 45 381
59V200H310V250Z" />
<glyph unicode="H" glyph-name="H" horiz-adv-x="570" d="M30 50H90V490H30V540H210V490H150V300H420V490H360V540H540V490H480V50H540V0H360V50H420V250H150V50H210V0H30V50Z" />
<glyph unicode="I" glyph-name="I" horiz-adv-x="240" d="M30 50H90V490H30V540H210V490H150V50H210V0H30V50Z" />
<glyph unicode="J" glyph-name="J" horiz-adv-x="240" d="M6 -95Q19 -96 30 -96Q63 -96 76 -81T90 -20V490H30V540H210V490H150V-13Q150 -80 125 -115T36 -150Q21 -150 6 -147V-95Z" />
<glyph unicode="K" glyph-name="K" horiz-adv-x="480" d="M300 490V540H460V490H410L226 286L419 50H480V0H300V50H341V52L155 281L342 488V490H300ZM30 50H90V490H30V540H210V490H150V50H210V0H30V50Z" />
<glyph unicode="L" glyph-name="L" horiz-adv-x="390" d="M210 490H150V50H317V120H370V0H30V50H90V490H30V540H210V490Z" />
<glyph unicode="M" glyph-name="M" horiz-adv-x="690" d="M539 453L364 -5H318L144 444H142L132 50H180V0H20V50H77L90 490H31V540H171L344 93H346L516 540H657V490H600L611 50H670V0H500V50H551L541 453H539Z" />
<glyph unicode="N" glyph-name="N" horiz-adv-x="540" d="M394 490H334V540H510V490H450V0H392L148 421H146V50H206V0H30V50H90V490H30V540H150L392 124H394V490Z" />
<glyph unicode="O" glyph-name="O" horiz-adv-x="510" d="M47 271Q47 401 104 475T260 550Q356 550 409 478T463 278Q463 142 406 66T252 -10Q159 -10 103 64T47 271ZM110 274Q110 162 148 104T255 45Q323 45 361 103T400 275Q400 384 364 439T257 495Q186 495
148 441T110 274Z" />
<glyph unicode="P" glyph-name="P" horiz-adv-x="420" d="M150 220V50H220V0H30V50H90V490H30V540H211Q299 540 341 502T383 390Q383 307 336 264T197 220H150ZM200 270Q258 270 289 296T320 383Q320 444 292 467T205 490H150V270H200Z" />
<glyph unicode="Q" glyph-name="Q" horiz-adv-x="510" d="M47 271Q47 401 105 475T260 550Q355 550 409 478T463 278Q463 159 421 89T317 1V-1Q343 -48 385 -73T477 -98Q525 -98 570 -79V-130Q523 -150 470 -150Q401 -150 343 -112T248 -10Q157 -7 102 66T47 271ZM110
274Q110 162 148 104T255 45Q323 45 361 103T400 275Q400 384 364 439T257 495Q186 495 148 441T110 274Z" />
<glyph unicode="R" glyph-name="R" horiz-adv-x="450" d="M150 50H210V0H30V50H90V490H37V540H211Q304 540 347 506T390 405Q390 286 264 259V257Q278 249 294 233T334 171L400 50H450V0H354Q342 27 331 48T310 87L273 156Q253 191 241 209T214 239Q199 250 175
250H150V50ZM198 300Q262 300 294 323T327 399Q327 450 298 470T205 490H150V300H198Z" />
<glyph unicode="S" glyph-name="S" horiz-adv-x="390" d="M177 -10Q101 -10 36 18V130H90V56Q125 43 182 43Q237 43 267 68T298 138Q298 161 290 177T267 206T230 229T180 251Q153 261 127 272T79 301T44 344T30 406Q30 471 78 510T208 550Q280 550 340 520V410H286V482Q250
497 203 497Q148 497 120 471T92 409Q92 387 100 372T124 344T162 323T213 303Q241 292 267 280T314 250T347 207T360 142Q360 73 311 32T177 -10Z" />
<glyph unicode="T" glyph-name="T" horiz-adv-x="420" d="M110 50H180V490H70V410H17V540H403V410H350V490H240V50H310V0H110V50Z" />
<glyph unicode="U" glyph-name="U" horiz-adv-x="540" d="M140 173Q140 110 175 78T269 45Q333 45 368 79T404 176V490H343V540H520V490H460V179Q460 95 409 43T268 -10Q182 -10 131 39T80 172V490H20V540H200V490H140V173Z" />
<glyph unicode="V" glyph-name="V" horiz-adv-x="480" d="M245 80L371 490H320V540H480V490H428L269 -5H211L49 490H0V540H160V490H112L243 80H245Z" />
<glyph unicode="W" glyph-name="W" horiz-adv-x="720" d="M490 80L611 490H560V540H720V490H668L514 -5H456L360 288H358L264 -5H206L49 490H0V540H160V490H112L238 80H240L333 369L293 490H240V540H410V490H353L488 80H490Z" />
<glyph unicode="X" glyph-name="X" horiz-adv-x="450" d="M64 490H10V540H180V490H132L230 328L330 490H280V540H440V490H391L258 282L400 50H450V0H280V50H331L218 235L109 50H160V0H0V50H48L191 280L64 490Z" />
<glyph unicode="Y" glyph-name="Y" horiz-adv-x="480" d="M210 240L46 490H0V540H160V490H114L244 292L370 490H320V540H480V490H433L270 240V50H340V0H140V50H210V240Z" />
<glyph unicode="Z" glyph-name="Z" horiz-adv-x="450" d="M30 45L323 490H93V420H40V540H400V495L107 50H357V120H410V0H30V45Z" />
<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="240" d="M60 600H200V550H115V-70H200V-120H60V600Z" />
<glyph unicode="\" glyph-name="backslash" horiz-adv-x="240" d="M252 -120H200L-12 540H40L252 -120Z" />
<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="240" d="M180 -120H40V-70H125V550H40V600H180V-120Z" />
<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="360" d="M179 480L85 270H27L158 545H203L334 270H276L181 480H179Z" />
<glyph unicode="_" glyph-name="underscore" horiz-adv-x="300" d="M-10 -45H310V-90H-10V-45Z" />
<glyph unicode="`" glyph-name="grave" horiz-adv-x="180" d="M150 430H104L24 550H94L150 430Z" />
<glyph unicode="a" glyph-name="a" horiz-adv-x="390" d="M60 361Q129 400 201 400Q263 400 296 372T330 281V50H380V0H276L273 45L271 46Q223 -10 153 -10Q101 -10 71 20T40 98Q40 161 94 192T253 223H270V282Q270 319 253 334T194 350Q145 350 112 334V280H60V361ZM246
180Q177 180 140 163T103 101Q103 69 121 55T167 40Q227 40 270 89V180H246Z" />
<glyph unicode="b" glyph-name="b" horiz-adv-x="420" d="M135 46Q165 40 194 40Q254 40 285 77T317 195Q317 267 293 308T218 350Q174 350 135 317V46ZM135 365L137 364Q179 400 236 400Q301 400 340 345T380 204Q380 104 330 47T191 -10Q134 -10 75 9V550H25V600H135V365Z"
/>
<glyph unicode="c" glyph-name="c" horiz-adv-x="360" d="M320 15Q272 -10 215 -10Q134 -10 87 42T40 191Q40 289 89 344T218 400Q273 400 320 377V280H267V341Q245 350 213 350Q157 350 130 315T103 202Q103 120 132 81T216 42Q270 42 320 69V15Z" />
<glyph unicode="d" glyph-name="d" horiz-adv-x="420" d="M230 550V600H350V50H400V0H293L290 34L288 35Q246 -10 188 -10Q120 -10 80 45T40 189Q40 283 88 341T212 400Q250 400 288 382L290 383V550H230ZM290 336Q253 350 215 350Q158 350 131 313T103 196Q103
120 127 80T203 40Q253 40 290 80V336Z" />
<glyph unicode="e" glyph-name="e" horiz-adv-x="360" d="M320 75V21Q270 -10 203 -10Q124 -10 80 43T35 191Q35 289 82 344T200 400Q258 400 294 354T330 223V192H97Q99 122 124 83T206 42Q268 42 320 75ZM270 240Q270 297 249 323T190 350Q153 350 128 323T98 240H270Z" />
<glyph unicode="f" glyph-name="f" horiz-adv-x="240" d="M292 500H240V554Q225 557 210 557Q173 557 157 537T140 472V390H230V340H140V50H190V0H30V50H80V340H30V390H80V463Q80 535 114 570T209 605Q248 605 292 590V500Z" />
<glyph unicode="g" glyph-name="g" horiz-adv-x="360" d="M40 259Q40 321 79 360T179 400Q201 400 219 395Q235 390 255 390H350V342H293V341Q312 308 312 268Q312 202 274 161T174 120Q146 120 124 128Q105 106 105 86Q105 74 113 67T138 60H208Q274 60 309 33T345
-47Q345 -112 293 -151T162 -190Q98 -190 59 -160T20 -83Q20 -29 74 16Q50 36 50 68Q50 108 93 144Q40 185 40 259ZM111 0Q80 -30 80 -70Q80 -104 102 -123T170 -143Q224 -143 254 -121T285 -62Q285 -31 265 -16T208 0H111ZM102 264Q102 219 121 194T178 168Q214
168 232 191T250 261Q250 307 232 328T175 350Q139 350 121 329T102 264Z" />
<glyph unicode="h" glyph-name="h" horiz-adv-x="420" d="M70 550H20V600H130V344H131Q185 400 254 400Q304 400 327 372T350 291V50H400V0H250V50H290V283Q290 323 276 336T237 350Q179 350 130 293V50H170V0H20V50H70V550Z" />
<glyph unicode="i" glyph-name="i" horiz-adv-x="210" d="M30 50H80V340H30V390H140V50H190V0H30V50ZM63 496Q63 517 74 528T106 540Q125 540 137 529T149 498Q149 478 137 467T105 455Q86 455 75 466T63 496Z" />
<glyph unicode="j" glyph-name="j" horiz-adv-x="180" d="M105 -149Q81 -182 28 -182Q14 -182 0 -180V-130Q8 -131 17 -131Q48 -131 59 -115T70 -58V340H20V390H130V-49Q130 -117 105 -149ZM53 496Q53 517 64 528T96 540Q115 540 127 529T139 498Q139 478 127
467T95 455Q76 455 65 466T53 496Z" />
<glyph unicode="k" glyph-name="k" horiz-adv-x="390" d="M30 50H80V550H30V600H140V50H180V0H30V50ZM230 390H380V340H327L213 219L344 50H390V0H235V50H272L273 52L150 213L267 340H230V390Z" />
<glyph unicode="l" glyph-name="l" horiz-adv-x="210" d="M30 50H80V550H30V600H140V50H190V0H30V50Z" />
<glyph unicode="m" glyph-name="m" horiz-adv-x="630" d="M30 50H80V340H30V390H136L139 338H140Q193 400 261 400Q333 400 348 337H350Q404 400 474 400Q524 400 547 372T570 291V50H620V0H470V50H510V283Q510 323 496 336T457 350Q403 350 355 294V50H395V0H255V50H295V283Q295
323 282 336T244 350Q187 350 140 288V50H180V0H30V50Z" />
<glyph unicode="n" glyph-name="n" horiz-adv-x="420" d="M30 50H80V340H30V390H136L139 338H140Q194 400 264 400Q314 400 337 372T360 291V50H410V0H260V50H300V283Q300 323 286 336T247 350Q189 350 140 288V50H180V0H30V50Z" />
<glyph unicode="o" glyph-name="o" horiz-adv-x="390" d="M35 193Q35 288 81 344T199 400Q270 400 312 348T355 202Q355 106 310 48T192 -10Q120 -10 78 45T35 193ZM98 202Q98 123 123 82T197 40Q242 40 267 78T292 196Q292 350 194 350Q147 350 123 315T98 202Z" />
<glyph unicode="p" glyph-name="p" horiz-adv-x="420" d="M132 390L135 358H137Q182 400 238 400Q302 400 341 348T380 209Q380 111 333 51T212 -10Q174 -10 137 8L135 7V-130H195V-180H25V-130H75V340H25V390H132ZM135 55Q165 40 205 40Q258 40 287 79T317 199Q317
277 291 313T221 350Q173 350 135 307V55Z" />
<glyph unicode="q" glyph-name="q" horiz-adv-x="390" d="M400 -130V-180H230V-130H290V32L288 33Q247 -10 187 -10Q121 -10 81 45T40 187Q40 282 88 341T225 400Q279 400 350 379V-130H400ZM290 341Q252 350 219 350Q161 350 132 313T103 195Q103 114 130 77T203
40Q253 40 290 78V341Z" />
<glyph unicode="r" glyph-name="r" horiz-adv-x="270" d="M30 50H80V340H30V390H137L140 334H142Q161 366 184 381T239 396Q251 396 260 394V331Q245 334 229 334Q200 334 179 321T140 277V50H200V0H30V50Z" />
<glyph unicode="s" glyph-name="s" horiz-adv-x="330" d="M154 -10Q92 -10 40 14V100H92V48Q122 39 158 39Q203 39 221 54T240 98Q240 124 218 139T149 172Q83 196 59 223T35 288Q35 337 74 368T174 400Q230 400 280 376V290H228V343Q205 352 171 352Q133 352
114 337T95 296Q95 271 115 257T180 226Q243 204 271 177T300 105Q300 53 260 22T154 -10Z" />
<glyph unicode="t" glyph-name="t" horiz-adv-x="240" d="M163 -10Q120 -10 95 12T70 79V340H20V390H70V480L130 491V390H220V340H130V89Q130 60 141 50T172 40Q196 40 220 52V3Q193 -10 163 -10Z" />
<glyph unicode="u" glyph-name="u" horiz-adv-x="420" d="M290 340H240V390H350V50H400V0H295L292 43H290Q246 -10 179 -10Q126 -10 98 18T70 99V340H20V390H130V109Q130 69 147 55T195 40Q253 40 290 87V340Z" />
<glyph unicode="v" glyph-name="v" horiz-adv-x="390" d="M218 -5H161L45 340H0V390H150V340H106L193 72H195L285 340H240V390H390V340H340L218 -5Z" />
<glyph unicode="w" glyph-name="w" horiz-adv-x="600" d="M433 -5H376L297 226H295L213 -5H156L45 340H0V390H150V340H106L188 72H190L272 296L257 340H210V390H370V340H316L408 72H410L495 340H450V390H600V340H550L433 -5Z" />
<glyph unicode="x" glyph-name="x" horiz-adv-x="360" d="M254 338V340H220V390H355V340H308L209 203L313 50H360V0H210V50H245V52L173 158L99 52V50H140V0H0V50H45L149 196L51 340H5V390H150V340H118V338L185 240L254 338Z" />
<glyph unicode="y" glyph-name="y" horiz-adv-x="390" d="M340 340L211 -25Q199 -60 186 -89T155 -139T113 -172T56 -183Q38 -183 20 -180V-125Q39 -128 57 -128Q73 -128 86 -125T112 -111T137 -76T166 -5H161L45 340H0V390H150V340H106L193 72H195L286 340H240V390H390V340H340Z"
/>
<glyph unicode="z" glyph-name="z" horiz-adv-x="360" d="M30 43L246 342H82V280H30V390H320V347L105 48H278V110H330V0H30V43Z" />
<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="270" d="M80 239Q116 229 133 204T150 136V-22Q150 -50 163 -60T195 -70H230V-120H195Q145 -120 120 -96T95 -19V137Q95 180 77 198T25 216V264Q59 264 77 281T95 341V499Q95 552 121 576T197 600H230V550H193Q175
550 163 541T150 502V344Q150 300 133 275T80 241V239Z" />
<glyph unicode="|" glyph-name="bar" horiz-adv-x="240" d="M95 610H145V-190H95V610Z" />
<glyph unicode="}" glyph-name="braceright" horiz-adv-x="270" d="M190 241Q154 250 137 275T120 344V502Q120 531 108 540T77 550H40V600H73Q122 600 148 576T175 499V341Q175 299 193 282T245 264V216Q211 216 193 198T175 137V-19Q175 -72 150 -96T75 -120H40V-70H75Q94
-70 107 -60T120 -22V136Q120 179 137 204T190 239V241Z" />
<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="420" d="M30 215Q81 251 134 251Q162 251 182 244T219 228Q235 220 250 215T285 209Q338 209 390 249V196Q337 160 284 160Q257 160 238 167T201 183Q185 191 169 197T133 203Q83 203 30 162V215Z" />
<glyph unicode="&#xa0;" glyph-name="uni00A0" horiz-adv-x="150" />
<glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="240" d="M148 -150H74L90 240H131L148 -150ZM60 347Q60 371 73 385T110 400Q133 400 146 386T160 351Q160 326 146 312T108 298Q86 298 73 312T60 347Z" />
<glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="360" d="M180 -70V0Q114 8 77 56T40 192Q40 283 78 332T180 389V460H226V391Q256 389 282 383T330 366V277H280V333Q268 337 255 339T226 343V48Q273 51 330 83V30Q281 2 226 -1V-70H180ZM180 341Q139
332 121 299T102 199Q102 130 121 95T180 51V341Z" />
<glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="390" d="M40 280H98Q80 358 80 394Q80 462 122 501T234 540Q296 540 350 512V412H298V478Q267 490 231 490Q187 490 164 467T140 399Q140 365 159 280H290V235H167Q170 214 170 198Q170 108 107 52V50H308V120H360V0H40V43Q110
97 110 195Q110 214 107 235H40V280Z" />
<glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="450" d="M56 10L12 53L89 128Q60 172 60 224Q60 280 89 321L12 396L54 438L127 360Q171 390 225 390Q279 390 321 362L396 440L438 396L360 322Q390 280 390 224Q390 172 360 127L437 52L395 9L320
87Q279 60 225 60Q171 60 130 87L56 10ZM115 224Q115 170 145 140T224 110Q275 110 305 140T335 224Q335 278 305 309T224 340Q175 340 145 309T115 224Z" />
<glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="420" d="M217 285L320 490H270V540H420V490H374L268 285H360V240H240V180H360V135H240V50H300V0H120V50H180V135H61V180H180V240H61V285H152L42 490H0V540H149V490H106L215 285H217Z" />
<glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="240" d="M90 210H150V-10H90V210ZM90 550H150V330H90V550Z" />
<glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="420" d="M70 424Q70 481 111 515T225 550Q285 550 340 525V430H288V490Q253 500 220 500Q180 500 155 484T130 436Q130 418 138 404T159 380T190 361T228 343Q251 333 274 321T316 293T348 254T360
198Q360 114 277 78V76Q350 38 350 -34Q350 -91 309 -125T195 -160Q135 -160 80 -135V-40H132V-100Q166 -110 200 -110Q240 -110 265 -94T290 -46Q290 -28 282 -14T259 11T228 30T192 47Q166 58 142 70T100 99T71 138T60 191Q60 274 144 312V314Q70 350 70 424ZM300
186Q300 207 292 222T269 248T237 269T184 293Q120 264 120 202Q120 182 128 167T150 141T183 121T236 97Q300 125 300 186Z" />
<glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="300" d="M35 496Q35 516 47 528T77 540Q97 540 108 528T120 497Q120 478 109 467T76 455Q58 455 47 466T35 496ZM180 496Q180 516 192 528T222 540Q242 540 253 528T265 497Q265 478 254 467T221 455Q203
455 192 466T180 496Z" />
<glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="630" d="M430 135Q377 103 316 103Q239 103 195 148T150 269Q150 345 194 391T316 437Q374 437 430 410V317H380V376Q354 390 315 390Q262 390 236 360T210 274Q210 217 238 184T320 150Q371 150
430 184V135ZM40 270Q40 396 116 473T314 550Q436 550 513 473T590 270Q590 144 513 67T314 -10Q192 -10 116 67T40 270ZM90 270Q90 161 149 98T314 35Q419 35 479 98T540 270Q540 381 480 443T314 505Q209 505 150 443T90 270Z" />
<glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="330" d="M50 487Q101 510 158 510Q211 510 238 485T265 411V267H310V220H216L213 255H211Q172 210 119 210Q79 210 55 232T30 292Q30 385 195 385H210V400Q210 463 151 463Q99 463 50 439V487ZM194
345Q142 345 114 334T86 295Q86 277 98 267T133 257Q180 257 210 297V345H194Z" />
<glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="330" d="M30 195L115 330H180L95 195L180 60H115L30 195ZM150 195L235 330H300L215 195L300 60H235L150 195Z" />
<glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="390" d="M354 50H300V183H30V237H354V50Z" />
<glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="210" d="M30 230H180V180H30V230Z" />
<glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="630" d="M265 150H306V104H170V150H210V390H170V436H308Q376 436 408 413T440 346Q440 310 421 285T354 251V249Q366 246 379 237T406 206L439 150H480V104H398Q386 128 372 152L348 194Q332 223
319 232T283 241H265V150ZM296 285Q341 285 360 298T380 341Q380 366 362 378T303 390H265V285H296ZM40 270Q40 396 116 473T314 550Q436 550 513 473T590 270Q590 144 513 67T314 -10Q192 -10 116 67T40 270ZM90 270Q90 161 149 98T314 35Q419 35 479 98T540 270Q540
381 480 443T314 505Q209 505 150 443T90 270Z" />
<glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="270" d="M30 510H240V462H30V510Z" />
<glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="300" d="M30 425Q30 479 64 514T155 550Q210 550 245 515T280 425Q280 371 245 336T155 300Q99 300 65 335T30 425ZM84 425Q84 392 104 371T155 350Q188 350 207 371T227 425Q227 458 208 478T155 499Q124
499 104 479T84 425Z" />
<glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="390" d="M222 80H168V183H30V237H168V340H222V237H360V183H222V80ZM30 3V57H360V3H30Z" />
<glyph unicode="&#xb2;" glyph-name="twosuperior" horiz-adv-x="330" d="M290 310V220H40V264Q117 318 170 369T224 461Q224 482 209 493T162 504Q128 504 97 490V430H50V518Q107 550 170 550Q225 550 252 528T280 466Q280 412 232 363T122 268V266H243V310H290Z" />
<glyph unicode="&#xb3;" glyph-name="threesuperior" horiz-adv-x="330" d="M40 275Q88 256 141 256Q181 256 207 268T234 310Q234 334 211 347T133 360H110V404H126Q175 404 197 418T220 458Q220 478 204 491T151 504Q115 504 87 494V450H40V521Q95 550 155 550Q208
550 241 527T274 464Q274 412 218 391V389Q290 373 290 310Q290 262 249 236T144 210Q82 210 40 226V275Z" />
<glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="180" d="M86 550H156L76 430H30L86 550Z" />
<glyph unicode="&#xb5;" glyph-name="uni00B5" horiz-adv-x="390" d="M50 -180V390H110V98Q131 40 185 40Q241 40 270 99V390H330V50H380V0H277L274 45H272Q239 -10 188 -10Q135 -10 112 35H110V-180H50Z" />
<glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="450" d="M180 -150V240Q99 242 55 282T10 396Q10 465 52 502T184 540H410V490H360V-150H300V490H240V-150H180Z" />
<glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="180" d="M40 193Q40 217 53 231T90 246Q113 246 126 232T140 197Q140 172 126 158T88 144Q66 144 53 158T40 193Z" />
<glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="210" d="M30 -135Q49 -139 69 -139Q88 -139 99 -132T110 -106Q110 -74 53 -74L83 8H129L110 -44Q140 -51 152 -68T165 -108Q165 -143 139 -164T71 -185Q51 -185 30 -180V-135Z" />
<glyph unicode="&#xb9;" glyph-name="onesuperior" horiz-adv-x="240" d="M120 220V493H60V540H175V220H120Z" />
<glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="330" d="M30 359Q30 426 67 468T170 510Q231 510 265 470T300 365Q300 296 263 253T164 210Q102 210 66 251T30 359ZM87 366Q87 313 107 285T167 257Q206 257 224 283T243 361Q243 410 225 436T164
463Q127 463 107 440T87 366Z" />
<glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="330" d="M180 195L95 60H30L115 195L30 330H95L180 195ZM300 195L215 60H150L235 195L150 330H215L300 195Z" />
<glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="690" d="M120 220V493H60V540H175V220H120ZM545 550L175 0H115L485 550H545ZM540 86H370V126L547 336H600V131H660V86H600V11H540V86ZM433 131H540V259H538L432 133L433 131Z" />
<glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="720" d="M120 220V493H60V540H175V220H120ZM545 550L175 0H115L485 550H545ZM680 101V11H430V55Q507 109 560 160T614 252Q614 273 599 284T552 295Q518 295 487 281V221H440V309Q497 341 560 341Q615
341 642 319T670 257Q670 203 622 154T512 59V57H633V101H680Z" />
<glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="750" d="M40 275Q88 256 141 256Q181 256 207 268T234 310Q234 334 211 347T133 360H110V404H126Q175 404 197 418T220 458Q220 478 204 491T151 504Q115 504 87 494V450H40V521Q95 550 155 550Q208
550 241 527T274 464Q274 412 218 391V389Q290 373 290 310Q290 262 249 236T144 210Q82 210 40 226V275ZM605 550L235 0H175L545 550H605ZM600 86H430V126L607 336H660V131H720V86H660V11H600V86ZM493 131H600V259H598L492 133L493 131Z" />
<glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="300" d="M240 -147Q201 -160 159 -160Q98 -160 58 -125T18 -30Q18 14 36 44T87 100Q120 127 136 148T153 200Q153 218 147 240H191Q202 210 202 180Q202 146 187 121T143 73Q116 51 98 30T80 -28Q80
-67 104 -87T169 -107Q201 -107 240 -95V-147ZM220 351Q220 327 207 313T170 298Q147 298 134 312T120 347Q120 372 134 386T172 400Q194 400 207 386T220 351Z" />
<glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="480" d="M160 50V0H0V50H50L211 545H269L433 50H480V0H320V50H370L321 200H154L107 50H160ZM235 460L169 250H305L237 460H235ZM265 580H221L135 690H205L265 580Z" />
<glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="480" d="M160 50V0H0V50H50L211 545H269L433 50H480V0H320V50H370L321 200H154L107 50H160ZM235 460L169 250H305L237 460H235ZM275 690H345L259 580H215L275 690Z" />
<glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="480" d="M160 50V0H0V50H50L211 545H269L433 50H480V0H320V50H370L321 200H154L107 50H160ZM235 460L169 250H305L237 460H235ZM239 644L190 580H130L215 690H265L350 580H290L241 644H239Z" />
<glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="480" d="M160 50V0H0V50H50L211 545H269L433 50H480V0H320V50H370L321 200H154L107 50H160ZM235 460L169 250H305L237 460H235ZM135 583V634Q158 655 189 655Q214 655 249 636Q275 623 293 623Q323 623
343 646H345V595Q322 574 291 574Q266 574 231 593Q205 606 187 606Q157 606 137 583H135Z" />
<glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="480" d="M160 50V0H0V50H50L211 545H269L433 50H480V0H320V50H370L321 200H154L107 50H160ZM235 460L169 250H305L237 460H235ZM125 620Q125 640 136 651T166 663Q186 663 197 652T208 621Q208 602
197 591T165 580Q147 580 136 591T125 620ZM272 620Q272 640 283 651T313 663Q333 663 344 652T355 621Q355 602 344 591T312 580Q294 580 283 591T272 620Z" />
<glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="480" d="M160 50V0H0V50H50L211 545H269L433 50H480V0H320V50H370L321 200H154L107 50H160ZM235 460L169 250H305L237 460H235ZM168 637Q168 667 188 683T242 700Q276 700 294 684T312 639Q312 611 293
593T238 575Q205 575 187 592T168 637ZM207 639Q207 621 215 613T240 605Q255 605 264 614T273 639Q273 654 264 662T240 670Q224 670 216 662T207 639Z" />
<glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="660" d="M577 50V120H630V0H270V50H330V200H175L97 50H140V0H-10V50H36L293 540H620V420H567V490H390V300H490V350H540V190H490V250H390V50H577ZM202 250H330V490H328L202 250Z" />
<glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="450" d="M420 30Q346 -10 270 -10Q163 -10 102 64T40 270Q40 400 103 475T271 550Q344 550 420 518V400H365V479Q325 495 269 495Q189 495 146 441T103 274Q103 157 148 101T273 45Q340 45 420 85V30ZM195
-135Q214 -139 234 -139Q253 -139 264 -132T275 -106Q275 -74 218 -74L248 8H294L275 -44Q305 -51 317 -68T330 -108Q330 -143 304 -164T236 -185Q216 -185 195 -180V-135Z" />
<glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="420" d="M337 50V120H390V0H30V50H90V490H30V540H380V420H327V490H150V300H250V350H300V190H250V250H150V50H337ZM250 580H206L120 690H190L250 580Z" />
<glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="420" d="M337 50V120H390V0H30V50H90V490H30V540H380V420H327V490H150V300H250V350H300V190H250V250H150V50H337ZM260 690H330L244 580H200L260 690Z" />
<glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="420" d="M337 50V120H390V0H30V50H90V490H30V540H380V420H327V490H150V300H250V350H300V190H250V250H150V50H337ZM224 644L175 580H115L200 690H250L335 580H275L226 644H224Z" />
<glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="420" d="M337 50V120H390V0H30V50H90V490H30V540H380V420H327V490H150V300H250V350H300V190H250V250H150V50H337ZM110 620Q110 640 121 651T151 663Q171 663 182 652T193 621Q193 602 182 591T150
580Q132 580 121 591T110 620ZM257 620Q257 640 268 651T298 663Q318 663 329 652T340 621Q340 602 329 591T297 580Q279 580 268 591T257 620Z" />
<glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="240" d="M30 50H90V490H30V540H210V490H150V50H210V0H30V50ZM145 580H101L15 690H85L145 580Z" />
<glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="240" d="M30 50H90V490H30V540H210V490H150V50H210V0H30V50ZM155 690H225L139 580H95L155 690Z" />
<glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="240" d="M30 50H90V490H30V540H210V490H150V50H210V0H30V50ZM119 644L70 580H10L95 690H145L230 580H170L121 644H119Z" />
<glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="240" d="M30 50H90V490H30V540H210V490H150V50H210V0H30V50ZM5 620Q5 640 16 651T46 663Q66 663 77 652T88 621Q88 602 77 591T45 580Q27 580 16 591T5 620ZM152 620Q152 640 163 651T193 663Q213
663 224 652T235 621Q235 602 224 591T192 580Q174 580 163 591T152 620Z" />
<glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="510" d="M30 300H90V490H30V540H209Q339 540 401 476T463 284Q463 144 393 72T191 0H30V50H90V250H30V300ZM150 50H198Q295 50 347 105T400 278Q400 388 352 439T198 490H150V300H250V250H150V50Z" />
<glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="540" d="M394 490H334V540H510V490H450V0H392L148 421H146V50H206V0H30V50H90V490H30V540H150L392 124H394V490ZM165 583V634Q188 655 219 655Q244 655 279 636Q305 623 323 623Q353 623 373 646H375V595Q352
574 321 574Q296 574 261 593Q235 606 217 606Q187 606 167 583H165Z" />
<glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="510" d="M47 271Q47 401 104 475T260 550Q356 550 409 478T463 278Q463 142 406 66T252 -10Q159 -10 103 64T47 271ZM110 274Q110 162 148 104T255 45Q323 45 361 103T400 275Q400 384 364 439T257 495Q186
495 148 441T110 274ZM280 580H236L150 690H220L280 580Z" />
<glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="510" d="M47 271Q47 401 104 475T260 550Q356 550 409 478T463 278Q463 142 406 66T252 -10Q159 -10 103 64T47 271ZM110 274Q110 162 148 104T255 45Q323 45 361 103T400 275Q400 384 364 439T257 495Q186
495 148 441T110 274ZM290 690H360L274 580H230L290 690Z" />
<glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="510" d="M47 271Q47 401 104 475T260 550Q356 550 409 478T463 278Q463 142 406 66T252 -10Q159 -10 103 64T47 271ZM110 274Q110 162 148 104T255 45Q323 45 361 103T400 275Q400 384 364 439T257
495Q186 495 148 441T110 274ZM254 644L205 580H145L230 690H280L365 580H305L256 644H254Z" />
<glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="510" d="M47 271Q47 401 104 475T260 550Q356 550 409 478T463 278Q463 142 406 66T252 -10Q159 -10 103 64T47 271ZM110 274Q110 162 148 104T255 45Q323 45 361 103T400 275Q400 384 364 439T257 495Q186
495 148 441T110 274ZM150 583V634Q173 655 204 655Q229 655 264 636Q290 623 308 623Q338 623 358 646H360V595Q337 574 306 574Q281 574 246 593Q220 606 202 606Q172 606 152 583H150Z" />
<glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="510" d="M47 271Q47 401 104 475T260 550Q356 550 409 478T463 278Q463 142 406 66T252 -10Q159 -10 103 64T47 271ZM110 274Q110 162 148 104T255 45Q323 45 361 103T400 275Q400 384 364 439T257
495Q186 495 148 441T110 274ZM140 620Q140 640 151 651T181 663Q201 663 212 652T223 621Q223 602 212 591T180 580Q162 580 151 591T140 620ZM287 620Q287 640 298 651T328 663Q348 663 359 652T370 621Q370 602 359 591T327 580Q309 580 298 591T287 620Z" />
<glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="395" d="M355 88L317 50L195 172L73 50L35 88L157 210L35 332L73 370L195 248L317 370L355 332L233 210L355 88Z" />
<glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="510" d="M47 271Q47 401 104 475T260 550Q327 550 375 514L412 575L450 552L407 481Q463 409 463 278Q463 142 406 66T252 -10Q183 -10 137 30L98 -35L60 -12L105 63Q47 136 47 271ZM110 274Q110 176
139 120L344 463Q310 495 257 495Q186 495 148 441T110 274ZM255 45Q323 45 361 103T400 275Q400 369 373 423L167 80Q203 45 255 45Z" />
<glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="540" d="M140 173Q140 110 175 78T269 45Q333 45 368 79T404 176V490H343V540H520V490H460V179Q460 95 409 43T268 -10Q182 -10 131 39T80 172V490H20V540H200V490H140V173ZM295 580H251L165 690H235L295 580Z" />
<glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="540" d="M140 173Q140 110 175 78T269 45Q333 45 368 79T404 176V490H343V540H520V490H460V179Q460 95 409 43T268 -10Q182 -10 131 39T80 172V490H20V540H200V490H140V173ZM305 690H375L289 580H245L305 690Z" />
<glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="540" d="M140 173Q140 110 175 78T269 45Q333 45 368 79T404 176V490H343V540H520V490H460V179Q460 95 409 43T268 -10Q182 -10 131 39T80 172V490H20V540H200V490H140V173ZM269 644L220 580H160L245
690H295L380 580H320L271 644H269Z" />
<glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="540" d="M140 173Q140 110 175 78T269 45Q333 45 368 79T404 176V490H343V540H520V490H460V179Q460 95 409 43T268 -10Q182 -10 131 39T80 172V490H20V540H200V490H140V173ZM155 620Q155 640 166
651T196 663Q216 663 227 652T238 621Q238 602 227 591T195 580Q177 580 166 591T155 620ZM302 620Q302 640 313 651T343 663Q363 663 374 652T385 621Q385 602 374 591T342 580Q324 580 313 591T302 620Z" />
<glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="480" d="M210 240L46 490H0V540H160V490H114L244 292L370 490H320V540H480V490H433L270 240V50H340V0H140V50H210V240ZM275 690H345L259 580H215L275 690Z" />
<glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="420" d="M30 50H90V490H30V540H210V490H150V440H211Q299 440 341 402T383 290Q383 207 336 164T197 120H150V50H210V0H30V50ZM200 170Q258 170 289 196T320 283Q320 344 292 367T205 390H150V170H200Z" />
<glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="450" d="M140 0H30V50H80V340H30V390H80V455Q80 526 126 565T245 605Q311 605 350 573T390 485Q390 458 383 440T365 408T341 385T314 367Q285 350 273 337T260 304Q260 281 280 265T335 229Q351
220 365 210T392 187T412 155T420 112Q420 55 383 23T283 -10Q246 -10 210 0V53Q247 40 283 40Q323 40 341 55T360 102Q360 128 344 144T295 179Q277 189 261 200T232 224T211 254T203 294Q203 317 209 332T224 358T246 380T273 400Q287 409 297 416T315 433T327
454T331 482Q331 519 309 538T240 557Q193 557 167 535T140 464V0Z" />
<glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="390" d="M60 361Q129 400 201 400Q263 400 296 372T330 281V50H380V0H276L273 45L271 46Q223 -10 153 -10Q101 -10 71 20T40 98Q40 161 94 192T253 223H270V282Q270 319 253 334T194 350Q145 350 112
334V280H60V361ZM246 180Q177 180 140 163T103 101Q103 69 121 55T167 40Q227 40 270 89V180H246ZM226 430H180L100 550H170L226 430Z" />
<glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="390" d="M60 361Q129 400 201 400Q263 400 296 372T330 281V50H380V0H276L273 45L271 46Q223 -10 153 -10Q101 -10 71 20T40 98Q40 161 94 192T253 223H270V282Q270 319 253 334T194 350Q145 350 112
334V280H60V361ZM246 180Q177 180 140 163T103 101Q103 69 121 55T167 40Q227 40 270 89V180H246ZM220 550H290L210 430H164L220 550Z" />
<glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="390" d="M60 361Q129 400 201 400Q263 400 296 372T330 281V50H380V0H276L273 45L271 46Q223 -10 153 -10Q101 -10 71 20T40 98Q40 161 94 192T253 223H270V282Q270 319 253 334T194 350Q145 350
112 334V280H60V361ZM246 180Q177 180 140 163T103 101Q103 69 121 55T167 40Q227 40 270 89V180H246ZM194 505L137 430H77L171 550H219L313 430H253L196 505H194Z" />
<glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="390" d="M60 361Q129 400 201 400Q263 400 296 372T330 281V50H380V0H276L273 45L271 46Q223 -10 153 -10Q101 -10 71 20T40 98Q40 161 94 192T253 223H270V282Q270 319 253 334T194 350Q145 350 112
334V280H60V361ZM246 180Q177 180 140 163T103 101Q103 69 121 55T167 40Q227 40 270 89V180H246ZM80 463V514Q111 536 144 536Q170 536 205 518Q230 506 248 506Q280 506 308 530H310V479Q279 457 246 457Q220 457 185 475Q160 487 142 487Q110 487 82 463H80Z"
/>
<glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="390" d="M60 361Q129 400 201 400Q263 400 296 372T330 281V50H380V0H276L273 45L271 46Q223 -10 153 -10Q101 -10 71 20T40 98Q40 161 94 192T253 223H270V282Q270 319 253 334T194 350Q145 350
112 334V280H60V361ZM246 180Q177 180 140 163T103 101Q103 69 121 55T167 40Q227 40 270 89V180H246ZM80 496Q80 516 92 528T122 540Q142 540 153 528T165 497Q165 478 154 467T121 455Q103 455 92 466T80 496ZM225 496Q225 516 237 528T267 540Q287 540 298 528T310
497Q310 478 299 467T266 455Q248 455 237 466T225 496Z" />
<glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="390" d="M60 361Q129 400 201 400Q263 400 296 372T330 281V50H380V0H276L273 45L271 46Q223 -10 153 -10Q101 -10 71 20T40 98Q40 161 94 192T253 223H270V282Q270 319 253 334T194 350Q145 350 112
334V280H60V361ZM246 180Q177 180 140 163T103 101Q103 69 121 55T167 40Q227 40 270 89V180H246ZM120 495Q120 525 141 542T196 560Q232 560 251 543T270 496Q270 468 250 449T193 430Q159 430 140 448T120 495ZM161 496Q161 478 170 470T195 461Q210 461 219
470T229 496Q229 512 220 520T195 529Q179 529 170 521T161 496Z" />
<glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="570" d="M530 75V21Q482 -10 418 -10Q332 -10 289 59H287Q230 -10 149 -10Q99 -10 70 20T40 98Q40 161 92 192T244 223H260V282Q260 319 244 334T189 350Q143 350 112 334V280H60V361Q126 400 196 400Q279
400 304 347H306Q349 400 416 400Q471 400 505 354T540 223V192H320Q322 122 346 83T423 42Q481 42 530 75ZM237 180Q174 180 140 163T105 101Q105 70 121 55T160 40Q222 39 271 100Q260 133 258 180H237ZM480 240Q480 297 461 323T406 350Q372 350 349 323T321
240H480Z" />
<glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="360" d="M320 15Q272 -10 215 -10Q134 -10 87 42T40 191Q40 289 89 344T218 400Q273 400 320 377V280H267V341Q245 350 213 350Q157 350 130 315T103 202Q103 120 132 81T216 42Q270 42 320 69V15ZM135
-135Q154 -139 174 -139Q193 -139 204 -132T215 -106Q215 -74 158 -74L188 8H234L215 -44Q245 -51 257 -68T270 -108Q270 -143 244 -164T176 -185Q156 -185 135 -180V-135Z" />
<glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="360" d="M320 75V21Q270 -10 203 -10Q124 -10 80 43T35 191Q35 289 82 344T200 400Q258 400 294 354T330 223V192H97Q99 122 124 83T206 42Q268 42 320 75ZM270 240Q270 297 249 323T190 350Q153 350
128 323T98 240H270ZM226 430H180L100 550H170L226 430Z" />
<glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="360" d="M320 75V21Q270 -10 203 -10Q124 -10 80 43T35 191Q35 289 82 344T200 400Q258 400 294 354T330 223V192H97Q99 122 124 83T206 42Q268 42 320 75ZM270 240Q270 297 249 323T190 350Q153 350
128 323T98 240H270ZM220 550H290L210 430H164L220 550Z" />
<glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="360" d="M320 75V21Q270 -10 203 -10Q124 -10 80 43T35 191Q35 289 82 344T200 400Q258 400 294 354T330 223V192H97Q99 122 124 83T206 42Q268 42 320 75ZM270 240Q270 297 249 323T190 350Q153
350 128 323T98 240H270ZM194 505L137 430H77L171 550H219L313 430H253L196 505H194Z" />
<glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="360" d="M320 75V21Q270 -10 203 -10Q124 -10 80 43T35 191Q35 289 82 344T200 400Q258 400 294 354T330 223V192H97Q99 122 124 83T206 42Q268 42 320 75ZM270 240Q270 297 249 323T190 350Q153
350 128 323T98 240H270ZM80 496Q80 516 92 528T122 540Q142 540 153 528T165 497Q165 478 154 467T121 455Q103 455 92 466T80 496ZM225 496Q225 516 237 528T267 540Q287 540 298 528T310 497Q310 478 299 467T266 455Q248 455 237 466T225 496Z" />
<glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="210" d="M30 50H80V340H30V390H140V50H190V0H30V50ZM136 430H90L10 550H80L136 430Z" />
<glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="210" d="M30 50H80V340H30V390H140V50H190V0H30V50ZM130 550H200L120 430H74L130 550Z" />
<glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="210" d="M30 50H80V340H30V390H140V50H190V0H30V50ZM104 505L47 430H-13L81 550H129L223 430H163L106 505H104Z" />
<glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="210" d="M30 50H80V340H30V390H140V50H190V0H30V50ZM-10 496Q-10 516 2 528T32 540Q52 540 63 528T75 497Q75 478 64 467T31 455Q13 455 2 466T-10 496ZM135 496Q135 516 147 528T177 540Q197 540
208 528T220 497Q220 478 209 467T176 455Q158 455 147 466T135 496Z" />
<glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="420" d="M126 472L193 522Q152 546 88 550V600Q173 597 235 554L302 604L330 568L271 524Q369 423 369 242Q369 122 324 56T199 -10Q124 -10 80 45T35 191Q35 281 82 335T206 390Q250 390 290 369L292 370Q275
443 230 493L154 436L126 472ZM208 340Q152 340 125 306T98 198Q98 122 124 81T203 40Q256 40 281 88T306 237Q306 280 301 317Q256 340 208 340Z" />
<glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="420" d="M30 50H80V340H30V390H136L139 338H140Q194 400 264 400Q314 400 337 372T360 291V50H410V0H260V50H300V283Q300 323 286 336T247 350Q189 350 140 288V50H180V0H30V50ZM110 463V514Q141 536
174 536Q200 536 235 518Q260 506 278 506Q310 506 338 530H340V479Q309 457 276 457Q250 457 215 475Q190 487 172 487Q140 487 112 463H110Z" />
<glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="390" d="M35 193Q35 288 81 344T199 400Q270 400 312 348T355 202Q355 106 310 48T192 -10Q120 -10 78 45T35 193ZM98 202Q98 123 123 82T197 40Q242 40 267 78T292 196Q292 350 194 350Q147 350 123
315T98 202ZM226 430H180L100 550H170L226 430Z" />
<glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="390" d="M35 193Q35 288 81 344T199 400Q270 400 312 348T355 202Q355 106 310 48T192 -10Q120 -10 78 45T35 193ZM98 202Q98 123 123 82T197 40Q242 40 267 78T292 196Q292 350 194 350Q147 350 123
315T98 202ZM220 550H290L210 430H164L220 550Z" />
<glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="390" d="M35 193Q35 288 81 344T199 400Q270 400 312 348T355 202Q355 106 310 48T192 -10Q120 -10 78 45T35 193ZM98 202Q98 123 123 82T197 40Q242 40 267 78T292 196Q292 350 194 350Q147 350
123 315T98 202ZM194 505L137 430H77L171 550H219L313 430H253L196 505H194Z" />
<glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="390" d="M35 193Q35 288 81 344T199 400Q270 400 312 348T355 202Q355 106 310 48T192 -10Q120 -10 78 45T35 193ZM98 202Q98 123 123 82T197 40Q242 40 267 78T292 196Q292 350 194 350Q147 350 123
315T98 202ZM80 463V514Q111 536 144 536Q170 536 205 518Q230 506 248 506Q280 506 308 530H310V479Q279 457 246 457Q220 457 185 475Q160 487 142 487Q110 487 82 463H80Z" />
<glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="390" d="M35 193Q35 288 81 344T199 400Q270 400 312 348T355 202Q355 106 310 48T192 -10Q120 -10 78 45T35 193ZM98 202Q98 123 123 82T197 40Q242 40 267 78T292 196Q292 350 194 350Q147 350
123 315T98 202ZM80 496Q80 516 92 528T122 540Q142 540 153 528T165 497Q165 478 154 467T121 455Q103 455 92 466T80 496ZM225 496Q225 516 237 528T267 540Q287 540 298 528T310 497Q310 478 299 467T266 455Q248 455 237 466T225 496Z" />
<glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="390" d="M152 85Q152 106 163 118T196 130Q215 130 226 119T237 87Q237 67 226 56T195 44Q175 44 164 55T152 85ZM152 331Q152 352 163 364T196 376Q215 376 226 365T237 333Q237 313 226 302T195 290Q175
290 164 301T152 331ZM30 183V237H360V183H30Z" />
<glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="390" d="M35 193Q35 285 81 342T199 400Q248 400 284 374L316 425L350 405L313 346Q355 293 355 202Q355 108 310 49T192 -10Q143 -10 107 17L75 -35L40 -15L78 46Q35 102 35 193ZM98 202Q98 142 114
102L255 327Q231 350 194 350Q149 350 124 315T98 202ZM197 40Q242 40 267 79T292 196Q292 253 278 289L137 65Q160 40 197 40Z" />
<glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="420" d="M290 340H240V390H350V50H400V0H295L292 43H290Q246 -10 179 -10Q126 -10 98 18T70 99V340H20V390H130V109Q130 69 147 55T195 40Q253 40 290 87V340ZM226 430H180L100 550H170L226 430Z" />
<glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="420" d="M290 340H240V390H350V50H400V0H295L292 43H290Q246 -10 179 -10Q126 -10 98 18T70 99V340H20V390H130V109Q130 69 147 55T195 40Q253 40 290 87V340ZM220 550H290L210 430H164L220 550Z" />
<glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="420" d="M290 340H240V390H350V50H400V0H295L292 43H290Q246 -10 179 -10Q126 -10 98 18T70 99V340H20V390H130V109Q130 69 147 55T195 40Q253 40 290 87V340ZM194 505L137 430H77L171 550H219L313
430H253L196 505H194Z" />
<glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="420" d="M290 340H240V390H350V50H400V0H295L292 43H290Q246 -10 179 -10Q126 -10 98 18T70 99V340H20V390H130V109Q130 69 147 55T195 40Q253 40 290 87V340ZM80 496Q80 516 92 528T122 540Q142
540 153 528T165 497Q165 478 154 467T121 455Q103 455 92 466T80 496ZM225 496Q225 516 237 528T267 540Q287 540 298 528T310 497Q310 478 299 467T266 455Q248 455 237 466T225 496Z" />
<glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="390" d="M340 340L211 -25Q199 -60 186 -89T155 -139T113 -172T56 -183Q38 -183 20 -180V-125Q39 -128 57 -128Q73 -128 86 -125T112 -111T137 -76T166 -5H161L45 340H0V390H150V340H106L193 72H195L286
340H240V390H390V340H340ZM220 550H290L210 430H164L220 550Z" />
<glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="420" d="M380 207Q380 111 333 51T212 -10Q174 -10 137 8L135 7V-130H195V-180H25V-130H75V550H25V600H135V365L137 364Q179 400 236 400Q301 400 340 345T380 207ZM317 198Q317 267 293 308T218 350Q174
350 135 317V55Q165 40 205 40Q258 40 287 79T317 198Z" />
<glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="390" d="M340 340L211 -25Q199 -60 186 -89T155 -139T113 -172T56 -183Q38 -183 20 -180V-125Q39 -128 57 -128Q73 -128 86 -125T112 -111T137 -76T166 -5H161L45 340H0V390H150V340H106L193 72H195L286
340H240V390H390V340H340ZM80 496Q80 516 92 528T122 540Q142 540 153 528T165 497Q165 478 154 467T121 455Q103 455 92 466T80 496ZM225 496Q225 516 237 528T267 540Q287 540 298 528T310 497Q310 478 299 467T266 455Q248 455 237 466T225 496Z" />
<glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="420" d="M30 230H390V180H30V230Z" />
<glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="810" d="M30 230H780V180H30V230Z" />
<glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="150" d="M73 340Q30 381 30 425Q30 487 101 550L130 523Q90 484 90 448Q90 419 126 385L73 340Z" />
<glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="150" d="M77 550Q120 509 120 465Q120 403 49 340L20 367Q60 406 60 442Q60 471 24 505L77 550Z" />
<glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="150" d="M77 118Q120 77 120 33Q120 -29 49 -92L20 -65Q60 -26 60 10Q60 39 24 73L77 118Z" />
<glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="270" d="M73 340Q30 381 30 425Q30 487 101 550L130 523Q90 484 90 448Q90 419 126 385L73 340ZM193 340Q150 381 150 425Q150 487 221 550L250 523Q210 484 210 448Q210 419 246 385L193 340Z" />
<glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="270" d="M77 550Q120 509 120 465Q120 403 49 340L20 367Q60 406 60 442Q60 471 24 505L77 550ZM197 550Q240 509 240 465Q240 403 169 340L140 367Q180 406 180 442Q180 471 144 505L197 550Z" />
<glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="270" d="M77 118Q120 77 120 33Q120 -29 49 -92L20 -65Q60 -26 60 10Q60 39 24 73L77 118ZM197 118Q240 77 240 33Q240 -29 169 -92L140 -65Q180 -26 180 10Q180 39 144 73L197 118Z" />
<glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="240" d="M55 274Q55 304 72 322T120 340Q149 340 167 323T185 276Q185 245 167 228T118 210Q90 210 73 227T55 274Z" />
<glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="210" d="M30 195L115 330H180L95 195L180 60H115L30 195Z" />
<glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="210" d="M180 195L95 60H30L115 195L30 330H95L180 195Z" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -0,0 +1,726 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<defs >
<font id="Yesteryear" horiz-adv-x="661" ><font-face
font-family="Yesteryear"
units-per-em="2048"
panose-1="3 2 8 2 4 6 7 7 8 2"
ascent="2001"
descent="-1004"
alphabetic="0" />
<glyph unicode=" " glyph-name="space" horiz-adv-x="461" />
<glyph unicode="!" glyph-name="exclam" horiz-adv-x="672" d="M774 1255Q723 1127 668 999T558 749T450 517T352 317Q309 330 271 355T211 408Q242 485 274 580T344 802T426 1091T528 1466Q567 1450 608 1420T685 1358T744 1298T774 1255ZM315 129Q315 121 301
93T269 33T232 -24T205 -49Q200 -49 185 -44T151 -30T111 -10T73 11T45 29T33 41Q33 59 46 92T78 158T112 214T135 238Q145 238 162 231T200 214T240 190T277 164T304 143T315 129Z" />
<glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="760" d="M530 1325Q523 1308 506 1274T465 1197T417 1111T369 1028T330 964T307 932Q305 930 303 930T299 930Q284 930 261 940T215 963T178 989T162 1010Q164 1016 174 1049T198 1129T229 1228T262
1325T293 1398T317 1427Q335 1427 369 1415T437 1387T498 1353T530 1325ZM879 1325Q872 1308 854 1274T813 1197T765 1111T717 1028T678 964T655 932Q653 930 651 930T647 930Q632 930 609 940T563 963T526 989T510 1010Q512 1016 522 1049T546 1129T577 1228T611
1325T642 1398T666 1427Q684 1427 717 1415T785 1387T847 1353T879 1325Z" />
<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="983" d="M895 1161Q866 1097 829 1018T749 850Q791 852 828 854T894 858T941 861T963 864Q954 848 938 826T903 783T869 743T842 717Q835 716 792 716T686 719L628 600Q670 600 706 600T771 599T816 599T838
598Q828 583 811 561T776 516T742 475T717 451Q708 451 666 454T562 464Q508 354 464 262T393 111Q364 120 345 129T309 147Q312 154 324 182T355 253T398 353T449 475L297 491Q240 372 192 273T115 111Q86 120 67 129T31 147Q34 154 47 184T80 262T126 371T181
502L37 518Q40 544 46 563T61 598Q68 599 113 599T223 601L276 728Q206 730 160 731T109 733Q111 752 119 770T139 813Q143 815 192 818T318 827L498 1257Q509 1251 524 1241T556 1218T588 1191T616 1161Q585 1094 546 1011T463 836Q498 838 532 839T603 843L776
1257Q788 1251 803 1241T834 1218T867 1191T895 1161ZM410 725L350 601H501L552 721L410 725Z" />
<glyph unicode="$" glyph-name="dollar" horiz-adv-x="952" d="M922 1489Q910 1460 893 1418T852 1325Q879 1312 904 1292T952 1250T991 1207T1018 1171Q1029 1154 1031 1142T1034 1116Q1034 1092 1028 1061T1011 994T984 923T948 852L776 958Q798 983 818 1008T855
1060T881 1114T891 1171Q891 1181 885 1192T868 1212T844 1229T816 1239L589 715Q613 676 636 637T678 558T707 478T719 397Q719 342 702 287T652 179T576 81T479 0T365 -59T239 -89L150 -297Q122 -291 102 -274T63 -248Q66 -241 85 -196T135 -76Q105 -62 76 -40T22
8T-23 56T-53 94Q-63 108 -67 127T-72 166Q-72 198 -63 234T-40 304T-11 368T16 418L188 311Q153 255 129 203T104 92Q104 73 121 56T180 32Q228 146 285 286T405 579Q381 619 356 661T311 746T279 830T266 913Q266 1009 301 1083T398 1211T541 1296T715 1337L805
1559Q816 1553 830 1547T861 1532T893 1514T922 1489ZM502 352Q502 375 495 400T475 452L295 37Q344 50 383 79T448 150T488 243T502 352ZM475 981Q475 949 485 915T514 845L664 1212Q621 1193 586 1166T527 1107T489 1042T475 981Z" />
<glyph unicode="%" glyph-name="percent" horiz-adv-x="1735" d="M1436 1346Q1394 1286 1328 1194T1182 990T1012 753T832 503T655 258T496 40T369 -134T287 -244Q258 -228 235 -209T197 -172Q211 -153 244 -106T325 9T431 162T556 342T691 538T829 740T963 936T1085
1116Q1022 1085 952 1071T823 1051Q788 973 732 907T611 791T478 714T350 686Q315 686 279 707T212 758T163 823T143 883Q143 970 167 1057T241 1219T368 1351T553 1438Q556 1440 564 1441T578 1442Q594 1442 612 1430T646 1403T672 1374T682 1356Q679 1350 657
1341T602 1311T527 1252T444 1151Q413 1104 389 1057T349 969T324 894T315 840Q315 821 317 804T332 786Q359 786 398 811T482 879T569 976T647 1092Q642 1110 641 1129T639 1159Q639 1184 646 1213T665 1268T693 1310T727 1327Q740 1327 758 1313T793 1275T825
1223T844 1163Q896 1163 951 1172T1063 1211T1178 1293T1296 1432Q1299 1437 1301 1440T1305 1446Q1315 1439 1330 1428T1364 1403T1401 1374T1436 1346ZM1571 334Q1571 277 1548 219T1486 107T1397 6T1291 -75T1179 -130T1073 -150Q1038 -150 1002 -129T935 -78T886
-13T866 49Q866 160 904 261T1011 440T1171 562T1372 608Q1382 608 1398 598T1434 572T1473 538T1509 502T1537 472T1550 455Q1558 440 1562 423T1568 389T1570 358T1571 334ZM1038 8Q1038 0 1039 -10T1044 -28T1052 -41T1063 -47Q1097 -47 1134 -25T1207 33T1276
117T1337 214T1384 312T1412 400T1417 467T1393 500Q1378 500 1354 490T1299 459T1235 402T1169 317Q1137 270 1113 224T1072 137T1047 62T1038 8Z" />
<glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="1210" d="M1141 1364Q1144 1358 1146 1352T1149 1339Q1149 1288 1127 1237T1065 1133T972 1029T858 922T730 813T598 702Q597 684 597 667T596 633Q596 572 610 508T648 381Q720 456 776 526T871 650T931
737T954 770Q958 770 963 754T972 711T981 652T989 587T995 527T997 483V469Q995 449 974 420T917 354T835 276T734 194Q761 143 788 99T839 21T881 -37T909 -70Q887 -73 846 -74T759 -76T671 -75T604 -72Q599 -64 578 -32T531 53Q479 21 429 -6T333 -53T247 -84T176
-96Q156 -96 132 -83T84 -48T38 -1T-2 51T-30 100T-41 137Q-41 232 -1 319T107 488T260 646T439 796Q457 896 486 989T554 1162T638 1309T735 1422T842 1494T956 1520Q982 1520 1009 1504T1061 1463T1106 1412T1141 1364ZM464 214Q442 280 428 354T414 512V530Q364
478 322 425T249 317T201 204T184 88Q184 83 187 78T199 72Q212 72 238 81T299 108T376 152T464 214ZM977 1409Q915 1409 863 1370T769 1268T694 1122T639 952Q711 1009 774 1064T886 1175T961 1286T989 1397Q989 1409 977 1409Z" />
<glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="412" d="M530 1325Q523 1308 506 1274T465 1197T417 1111T369 1028T330 964T307 932Q305 930 303 930T299 930Q284 930 261 940T215 963T178 989T162 1010Q164 1016 174 1049T198 1129T229 1228T262
1325T293 1398T317 1427Q335 1427 369 1415T437 1387T498 1353T530 1325Z" />
<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="778" d="M983 1391Q883 1329 784 1244T593 1050T424 805T288 506T197 150T164 -266Q149 -268 135 -268T108 -269T80 -268T47 -266Q45 -245 44 -219T43 -164T42 -110T41 -61Q41 185 85 420T220 870T452
1269T786 1599Q840 1551 890 1499T983 1391Z" />
<glyph unicode=")" glyph-name="parenright" horiz-adv-x="778" d="M432 1530Q519 1561 585 1575T711 1599Q720 1545 725 1464T731 1284Q731 1058 680 845T532 437T297 66T-16 -258Q-50 -244 -74 -230T-123 -199Q12 -77 108 43T270 280T375 511T435 735T462 952T469
1161Q469 1210 466 1261T458 1361T447 1453T432 1530Z" />
<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="922" d="M1036 1059Q1015 1055 977 1050Q944 1045 890 1039T750 1024Q763 993 781 956T817 883T852 813T881 756Q833 733 785 711T692 672Q683 707 672 752Q663 790 652 844T629 965Q572 874 537 822T482
741Q459 708 449 698Q434 710 412 729T367 768T325 808T295 844Q310 857 340 883Q366 906 411 946T528 1050Q468 1069 425 1084T353 1111Q320 1123 299 1133Q314 1165 328 1191T356 1239T386 1283T416 1327Q421 1323 468 1290T613 1184Q627 1237 638 1283T657 1363Q667
1403 674 1436Q692 1434 721 1429T780 1417T835 1405T870 1395Q863 1378 849 1348T819 1284T785 1216T753 1156Q822 1188 864 1206T931 1236Q958 1248 971 1253Q980 1232 990 1205T1010 1149T1027 1097T1036 1059Z" />
<glyph unicode="+" glyph-name="plus" horiz-adv-x="717" d="M487 793Q472 752 456 711T421 628Q460 631 494 633T556 637T600 640T623 641Q615 618 607 594T590 549T574 509T561 479Q552 479 532 479T484 479T422 479T350 478Q317 410 283 350T217 242Q195 248
165 255T115 268Q129 297 148 351T191 476L0 475Q5 486 13 504T31 541T47 578T59 606Q70 606 119 608T235 616Q255 682 273 750T307 883Q322 878 348 866T401 840T452 813T487 793Z" />
<glyph unicode="," glyph-name="comma" horiz-adv-x="512" d="M281 98Q281 63 260 17T206 -75T138 -160T74 -223Q69 -222 60 -217T42 -204T25 -190T16 -180Q27 -171 44 -150T76 -106T103 -61T115 -29Q115 -14 101 1T68 30T32 54T10 70Q14 90 28 117T58 169T91
213T115 238Q130 238 158 225T213 191T261 145T281 98Z" />
<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="922" d="M672 522Q668 504 661 474T644 413T626 355T610 319Q598 319 557 319T459 318T340 316T223 315T132 316T88 319Q91 331 96 354T109 402T123 449T135 479Q143 482 183 486T281 496T404 505T527 513T624
519T672 522Z" />
<glyph unicode="." glyph-name="period" horiz-adv-x="512" d="M295 129Q295 121 281 93T248 33T211 -24T184 -49Q176 -49 149 -37T91 -10T36 20T12 41Q12 59 25 92T57 158T92 214T115 238Q125 238 142 231T180 214T220 190T257 164T284 143T295 129Z" />
<glyph unicode="/" glyph-name="slash" horiz-adv-x="1067" d="M1272 1391Q1239 1350 1176 1272T1028 1090T845 866T642 618T435 368T240 134T73 -64T-51 -205Q-67 -185 -79 -171T-101 -143T-121 -118T-143 -90Q-16 60 92 190T299 444T492 689T687 944T900 1227T1145
1556Q1167 1529 1183 1509T1212 1471T1240 1435T1272 1391Z" />
<glyph unicode="0" glyph-name="zero" horiz-adv-x="1188" d="M1161 1219Q1175 1171 1182 1119T1190 1006Q1190 920 1169 824T1108 630T1013 436T890 253T747 92T588 -37T419 -123T246 -154Q212 -154 171 -128T93 -65T27 12T-8 80Q-10 85 -12 100T-17 135T-21
176T-23 213Q-23 276 -13 347T24 498T98 663T219 842Q230 846 248 851T289 861T336 871T383 881Q401 983 451 1081T573 1256T732 1380T913 1427Q949 1427 987 1405T1060 1350T1121 1282T1161 1219ZM406 592Q398 612 391 637T378 704Q339 635 299 558T226 401T173
243T152 92Q152 75 157 59T172 30T192 10T213 2Q264 2 326 34T455 124T590 260T722 432T842 627T939 835T1004 1044T1028 1243Q1028 1272 1012 1294T965 1317Q913 1317 851 1289T734 1200T643 1047T606 823Q606 776 612 733T624 657T637 601T643 573Q624 569 590
570T519 575T451 583T406 592Z" />
<glyph unicode="1" glyph-name="one" horiz-adv-x="672" d="M770 1245Q757 1213 724 1142T645 974T542 764T427 533T311 302T205 92T120 -75T66 -178Q57 -172 36 -158T-10 -127T-55 -96T-86 -74Q7 98 86 269T233 602T359 916T470 1201Q436 1179 402 1159T339 1122T289
1094T260 1079Q253 1083 239 1095T211 1120T185 1144T174 1157Q182 1162 205 1175T261 1207T334 1252T415 1306T497 1368T573 1436Q595 1416 626 1386T686 1327T739 1274T770 1245Z" />
<glyph unicode="2" glyph-name="two" horiz-adv-x="1147" d="M1139 1186Q1144 1178 1145 1158T1147 1122Q1147 1027 1126 938T1056 763T927 590T730 416T456 234T93 38Q167 48 246 64T400 97T544 133T666 166T755 190T799 199Q803 199 803 195Q803 190 794 173T768
132T732 78T691 20T650 -37T614 -86Q578 -88 526 -89T411 -91T282 -94T149 -96T23 -99T-86 -102Q-95 -92 -106 -75T-129 -37T-150 5T-164 45Q57 146 225 253T518 469T727 685T862 895T934 1091T956 1268Q956 1276 955 1286T949 1306T939 1321T922 1327Q890 1327
847 1308T756 1255T657 1177T558 1083T467 984T393 887T343 802T326 737Q326 729 326 725T332 721Q342 721 371 744T437 805T515 888T586 981Q599 969 619 950T658 911T695 873T719 848Q688 806 636 766T526 694T409 644T309 625Q299 625 284 635T251 662T216 698T185
736T163 768T154 788Q154 865 187 942T276 1091T406 1225T564 1333T735 1405T903 1432Q923 1430 946 1415T993 1376T1041 1324T1085 1269T1119 1220T1139 1186Z" />
<glyph unicode="3" glyph-name="three" horiz-adv-x="1014" d="M1067 1178Q1075 1161 1075 1133Q1075 1057 1052 995T987 881T892 788T776 713T649 653T520 606Q598 578 646 562T721 536Q753 525 768 520Q782 514 782 500Q782 468 752 411T669 286T541 144T380
5T194 -110T-6 -182Q-12 -178 -26 -162T-58 -123T-97 -75T-136 -26T-169 17T-190 45Q-142 45 -77 57T62 94T211 152T359 232T490 331T592 449Q515 473 473 487T411 510Q387 520 383 524Q374 528 361 550T335 600T313 652T303 686Q402 686 483 715T627 791T737 900T814
1025T859 1152T874 1266Q874 1284 866 1297T836 1311Q807 1311 760 1293T658 1244T547 1175T446 1095T373 1013T344 938Q344 924 358 924Q379 924 408 942T470 988T533 1048T590 1106Q600 1098 615 1084T647 1053T680 1020T707 991Q669 954 623 924T528 873T430
839T338 827Q329 827 323 827T311 829Q296 832 273 851T227 894T188 941T172 973Q172 1029 204 1085T290 1191T413 1285T556 1361T702 1412T834 1430Q847 1429 867 1415T910 1379T956 1330T1001 1276T1040 1223T1067 1178Z" />
<glyph unicode="4" glyph-name="four" horiz-adv-x="1188" d="M680 1094Q642 1039 607 991T536 898T461 811T377 726T277 638T156 543Q261 547 367 556T583 580Q623 677 660 776T732 979T802 1196T870 1432Q892 1409 919 1380T975 1319T1032 1255T1085 1194Q1029
1059 964 913T826 615Q895 626 964 637T1106 662L963 424Q908 422 850 420T730 416Q652 255 576 107T430 -170Q416 -161 394 -149T348 -124T305 -100T279 -84Q344 49 401 170T511 411Q401 409 305 407T141 403Q122 422 99 453T56 518T20 579T0 618Q84 695 162 782T310
963T440 1155T549 1352Q553 1360 557 1360Q565 1360 577 1344T603 1303T631 1248T655 1188T673 1133T680 1094Z" />
<glyph unicode="5" glyph-name="five" horiz-adv-x="967" d="M1116 1444Q1120 1444 1120 1440Q1120 1435 1110 1419T1084 1380T1047 1330T1004 1277T961 1228T922 1190Q853 1190 798 1191T699 1194T618 1198T550 1204L335 885Q452 915 522 930T630 951T679 957T692
958Q704 958 722 947T759 917T797 878T832 837T856 802T866 780Q866 687 830 589T732 395T585 211T403 48T200 -84T-8 -174Q-30 -150 -57 -117T-110 -51T-155 8T-182 45Q-104 58 -11 94T178 183T364 305T530 452T654 616T718 790Q676 795 629 791T533 776T440 751T357
724T292 701T252 688Q243 695 228 711T198 747T170 784T152 811Q155 820 170 849T211 921T269 1019T341 1136T422 1265T510 1399Q587 1399 667 1402T827 1411T979 1425T1116 1444Z" />
<glyph unicode="6" glyph-name="six" horiz-adv-x="942" d="M956 1438Q951 1399 944 1359T929 1282T913 1218T901 1176Q792 1119 701 1054T535 918T401 775T295 629Q374 701 448 750T579 829T669 872T702 885Q715 885 733 874T772 845T812 806T848 763T874 725T887
698Q881 653 861 592T808 463T733 322T639 181T529 51T409 -56T282 -129T152 -156Q140 -156 123 -145T87 -117T50 -79T15 -37T-14 0T-31 27Q-39 39 -45 59T-51 111Q-51 258 -14 398T91 668T251 913T457 1127T695 1304T956 1438ZM692 736Q550 678 416 592T176 393Q137
290 121 202T104 49Q104 12 112 -5T133 -23Q174 -23 223 11T325 104T431 238T533 398T623 570T692 736Z" />
<glyph unicode="7" glyph-name="seven" horiz-adv-x="915" d="M997 1268Q941 1180 888 1091T782 904T672 695T551 453T413 166T252 -176Q246 -174 225 -165T176 -141T117 -109T57 -76T7 -46T-20 -23Q95 143 201 304T410 623T618 936T832 1247Q761 1238 696 1230T559
1213T405 1195T215 1174Q213 1205 207 1244T193 1321T180 1391T172 1440Q263 1431 362 1427T555 1421T733 1418T879 1415Q886 1410 902 1390T936 1347T971 1301T997 1268Z" />
<glyph unicode="8" glyph-name="eight" horiz-adv-x="979" d="M840 1434Q858 1434 881 1422T930 1391T979 1348T1024 1299T1058 1251T1077 1212Q1077 1207 1079 1199T1081 1180Q1081 1084 1043 1012T942 882T798 777T630 682Q649 616 669 553T706 437T734 345T745
289Q745 217 713 155T630 42T513 -48T382 -115T254 -156T150 -170Q124 -170 96 -155T42 -114T-8 -58T-49 7T-77 70T-88 123Q-88 222 -50 299T53 439T199 555T371 660Q347 737 330 805T313 918Q313 982 333 1045T390 1166T476 1273T584 1357T708 1413T840 1434ZM475
272Q475 293 469 323T454 389T431 466T404 551Q343 510 290 462T198 356T136 226T113 66Q113 57 113 42T118 10T131 -17T156 -29Q185 -29 220 -18T291 13T360 61T418 122T459 194T475 272ZM887 1329Q813 1320 755 1285T657 1199T595 1092T573 981Q573 943 580 896T599
798Q664 842 721 891T820 999T886 1127T911 1282Q911 1298 909 1313T887 1329Z" />
<glyph unicode="9" glyph-name="nine" horiz-adv-x="942" d="M-23 -156Q-18 -117 -11 -77T5 0T20 64T33 106Q142 163 232 228T398 362T532 505T638 651Q558 579 485 531T354 453T264 410T231 397Q218 397 200 408T162 437T122 476T86 519T59 557T47 584Q53 629
73 690T126 819T201 960T295 1101T405 1231T525 1338T652 1411T782 1438Q794 1438 811 1427T846 1399T884 1361T919 1319T947 1282T965 1255Q973 1243 979 1223T985 1171Q985 1024 948 884T843 614T683 369T477 155T238 -22T-23 -156ZM242 546Q312 575 381 611T517
690T643 782T756 888Q796 991 812 1079T829 1233Q829 1270 821 1287T801 1305Q760 1305 711 1271T609 1178T503 1044T401 884T311 712T242 546Z" />
<glyph unicode=":" glyph-name="colon" horiz-adv-x="614" d="M346 129Q346 121 332 93T300 33T263 -24T236 -49Q231 -49 216 -44T182 -30T142 -10T104 11T75 29T63 41Q63 53 69 72T86 114T108 158T132 198T153 227T166 238Q176 238 193 231T231 214T271 190T308
164T335 143T346 129ZM467 539Q467 534 461 519T444 483T420 442T395 402T373 372T356 360Q351 360 337 365T303 380T263 399T225 420T196 438T184 451Q184 463 190 482T207 523T229 567T252 607T273 636T287 647Q297 647 314 640T352 623T392 599T429 574T456
553T467 539Z" />
<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="614" d="M332 98Q332 63 311 17T257 -75T189 -160T125 -223Q120 -222 112 -217T94 -204T77 -190T68 -180Q78 -171 95 -150T127 -106T154 -61T166 -29Q166 -14 152 1T119 30T83 54T61 70Q65 90 79 117T109
169T142 213T166 238Q181 238 209 225T264 191T312 145T332 98ZM467 539Q467 534 461 519T444 483T420 442T395 402T373 372T356 360Q351 360 337 365T303 380T263 399T225 420T196 438T184 451Q184 463 190 482T207 523T229 567T252 607T273 636T287 647Q297 647
314 640T352 623T392 599T429 574T456 553T467 539Z" />
<glyph unicode="&lt;" glyph-name="less" horiz-adv-x="717" d="M573 682Q536 669 481 651Q433 635 360 610T182 549Q257 514 320 487T431 439Q486 416 530 399Q518 375 503 350T471 300T439 254T410 217Q396 225 363 243T289 286T202 337T117 385T50 424T16 444Q21
466 29 493T48 548T71 604T98 655Q99 658 122 668T181 694T263 728T358 766T454 805T541 839T606 866T639 881Q634 852 626 824T609 770T591 722T573 682Z" />
<glyph unicode="=" glyph-name="equal" horiz-adv-x="717" d="M604 559Q596 536 588 512T571 467T556 427T543 397Q529 397 484 397T378 396T252 395T127 394T29 394T-18 393Q-13 404 -5 422T13 459T29 496T41 524Q48 524 75 525T141 529T229 535T326 541T423
548T509 553T573 557T604 559ZM688 823Q680 800 672 777T655 731T640 691T627 662Q612 662 567 662T462 661T336 660T211 659T113 658T66 657Q71 668 79 686T97 723T113 760T125 788Q132 788 159 789T225 793T313 799T410 805T507 812T593 817T657 821T688 823Z"
/>
<glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="717" d="M106 465Q114 466 137 471T201 485T303 510T446 549Q371 584 313 611T215 659Q167 681 133 698Q145 722 160 748T192 798T225 844T254 881Q268 873 298 855T366 812T445 761T521 712T581 673T612
653Q607 632 599 605T581 550T557 493T530 442Q528 439 505 429T445 404T361 370T264 332T166 293T77 259T11 232T-23 217Q-11 246 5 279T38 346T72 410T106 465Z" />
<glyph unicode="?" glyph-name="question" horiz-adv-x="1110" d="M1196 1171Q1205 1157 1208 1142T1212 1112Q1212 1056 1186 996T1114 876T1003 759T863 651T701 561T526 494Q503 452 484 415T450 351Q432 319 418 293Q403 297 381 306T337 326T296 348T266
369Q274 389 283 413T302 464T321 518T340 569Q422 580 503 614T657 697T793 808T901 933T973 1062T999 1184Q999 1214 995 1233T981 1263T960 1278T932 1282Q903 1282 853 1269T742 1221T615 1125T489 967Q482 967 464 977T421 1002T370 1036T320 1072T279 1104T258
1124Q267 1135 296 1162T372 1223T478 1295T610 1362T762 1411T930 1430Q951 1430 975 1415T1026 1377T1077 1324T1126 1266T1167 1212T1196 1171ZM397 129Q397 121 383 93T351 33T314 -24T287 -49Q282 -49 267 -44T233 -30T193 -10T155 11T127 29T115 41Q115 59
128 92T160 158T194 214T217 238Q227 238 244 231T282 214T322 190T359 164T386 143T397 129Z" />
<glyph unicode="@" glyph-name="at" horiz-adv-x="1741" d="M1108 444Q1108 420 1120 408T1151 395Q1174 395 1205 407T1268 447T1333 518T1390 623T1430 763T1446 944Q1446 1022 1419 1088T1344 1203T1233 1279T1098 1307Q1017 1307 927 1276T751 1186T586 1046T447
861T352 638T317 385Q317 319 335 253T395 133T502 46T662 12Q713 12 765 26T867 66T966 126T1059 201L1143 43Q1105 18 1056 -11T945 -65T810 -106T651 -123Q551 -123 472 -100T331 -37T227 54T156 163T115 278T102 389Q102 523 141 654T251 903T417 1121T626
1295T864 1410T1118 1452Q1239 1452 1334 1409T1495 1292T1595 1122T1630 922Q1630 825 1609 741T1550 586T1464 460T1361 366T1251 307T1143 287Q1073 287 1028 310T965 377T957 483T1008 623Q975 588 923 546T812 465T697 394T598 348Q593 346 590 346T584 346Q574
346 557 356T524 383T497 421T485 463Q485 468 491 502T519 588T586 707T707 842Q746 877 791 908Q829 934 878 961T981 1004Q983 1004 984 1005T989 1004Q1001 1000 1017 992T1050 973T1079 954T1096 938Q1097 936 1096 935Q1095 934 1094 934Q1049 910 1009 881T937
825Q901 794 870 764Q798 692 770 639T741 563Q741 547 756 547Q770 547 791 558T840 589T899 635T967 690Q998 715 1027 744Q1052 768 1078 799T1124 862Q1127 865 1128 864Q1140 856 1154 838T1180 798T1200 756T1208 725Q1186 677 1168 632T1136 548T1116 483T1108
444Z" />
<glyph unicode="A" glyph-name="A" horiz-adv-x="1231" d="M1292 1278Q1292 1231 1273 1174T1222 1056T1149 934T1064 819Q1090 793 1111 772T1141 743Q1127 719 1103 673T1051 567T995 442T943 313T906 193T891 98Q891 48 904 5T944 -70T1010 -124T1102 -152L1053
-217Q1041 -217 1016 -212T960 -193T895 -156T831 -98T778 -13T746 104Q698 54 643 5T528 -83T409 -146T291 -170Q258 -170 224 -152T156 -105T92 -36T38 44T-1 127T-20 203Q-20 216 -20 234T-18 273T-16 312T-12 346Q3 435 36 534T116 735T224 938T354 1131T502
1301T662 1437T830 1528T1001 1561Q1030 1561 1063 1546T1128 1507T1190 1453T1242 1391T1278 1330T1292 1278ZM250 4Q269 4 305 26T390 89T496 190T611 325T725 491T831 685L713 803Q730 821 766 851T846 922T936 1013T1021 1122T1085 1245T1110 1380Q1110 1419
1095 1439T1067 1460Q1008 1460 939 1418T796 1303T650 1133T509 926T383 700T281 473T213 262T188 86Q188 4 250 4Z" />
<glyph unicode="B" glyph-name="B" horiz-adv-x="1290" d="M1495 1288Q1495 1240 1457 1182T1360 1064T1227 948T1083 846Q1024 809 970 779T868 721T781 670T713 620Q785 607 841 595T930 565Q954 548 979 515T1024 446T1056 383T1069 348Q1069 304 1047 255T985
158T891 64T772 -17T635 -79T489 -113Q456 -86 425 -56T369 1T327 47T306 72Q270 16 233 -30T160 -107T87 -155T14 -170Q-1 -169 -17 -159T-48 -132T-76 -97T-100 -61T-117 -29T-123 -8Q-123 97 -79 226T43 493T225 769T451 1032Q491 1176 516 1312T543 1561Q609
1526 649 1493T712 1433Q738 1402 750 1374Q756 1356 756 1323Q756 1317 756 1311T754 1297Q894 1397 1032 1456T1298 1516Q1314 1516 1335 1504T1377 1472T1420 1428T1458 1378T1485 1329T1495 1288ZM548 568Q495 432 435 305T308 74Q422 84 520 107T697 170T835
266T933 400Q913 411 890 420T840 436T788 448T736 459Q678 469 616 475Q602 477 584 505T548 568ZM704 1043Q687 981 667 914T622 774Q712 847 815 912T1021 1044T1214 1188T1370 1362Q1374 1367 1374 1374T1369 1387T1359 1398T1343 1403Q1287 1403 1215 1377T1059
1303T886 1189T704 1043ZM18 20Q27 20 44 42T85 105T137 203T197 330T260 480T325 646Q266 571 214 495T121 342T50 192T6 47Q3 33 7 27T18 20Z" />
<glyph unicode="C" glyph-name="C" horiz-adv-x="1120" d="M786 893Q816 912 849 941T916 1008T981 1089T1035 1177T1073 1266T1087 1352Q1087 1383 1082 1402T1069 1431T1049 1446T1026 1450Q978 1450 917 1410T789 1300T651 1137T514 938T390 718T288 495T219
285T193 104Q193 74 197 55T210 24T232 8T262 4Q291 4 330 28T414 92T504 179T590 273T662 359T711 422Q711 421 735 401T793 353T859 297T909 250Q885 223 848 181T765 93T665 -1T556 -85T443 -146T332 -170Q293 -170 249 -147T162 -86T82 -3T20 88Q-10 144 -15
191T-20 266Q-20 343 2 440T65 642T164 857T292 1068T445 1260T618 1417T805 1522T1001 1561Q1029 1561 1060 1547T1121 1509T1179 1454T1228 1391T1261 1326T1274 1266Q1274 1206 1250 1134T1185 988T1088 844T967 719L786 893Z" />
<glyph unicode="D" glyph-name="D" horiz-adv-x="1415" d="M1389 1284Q1402 1267 1411 1249T1425 1208T1432 1156T1434 1087Q1430 958 1401 822T1316 556T1182 307T1001 90T775 -77T504 -178Q457 -148 422 -120T362 -69T322 -28T299 -1Q246 -79 194 -124T92 -170Q68
-170 44 -157T-1 -122T-42 -75T-74 -25T-96 19T-104 49Q-104 111 -85 188T-30 351T54 529T163 713T291 896T434 1070Q462 1208 479 1343T502 1602Q559 1566 605 1531T685 1467Q724 1434 754 1403L751 1358Q846 1426 938 1464T1114 1503Q1155 1503 1193 1481T1267
1425T1333 1354T1389 1284ZM707 1090Q688 1001 663 904T606 708T540 511T467 323T388 153T306 10Q431 29 538 77T736 196T899 354T1030 538T1129 734T1199 930T1239 1113T1253 1270Q1253 1291 1248 1313T1231 1353T1204 1382T1165 1393Q1123 1393 1071 1371T960
1308T837 1212T707 1090ZM49 18Q68 9 99 54T168 183T247 384T329 639Q265 550 211 465T118 305T57 167T35 61Q35 27 49 18Z" />
<glyph unicode="E" glyph-name="E" horiz-adv-x="1126" d="M842 973Q880 1004 916 1050T980 1147T1025 1251T1042 1350Q1042 1387 1025 1412T961 1438Q922 1438 875 1420T780 1371T687 1296T606 1201T550 1094T528 981Q528 932 540 897T575 834T630 783T705 735Q579
682 474 605T292 437T174 252T131 68Q131 37 146 14T193 -10Q235 -10 287 13T395 73T507 156T613 248T702 337T764 408Q824 360 868 323T950 254Q933 231 894 190T800 102T681 7T550 -81T418 -145T299 -170Q252 -170 206 -154T117 -112T40 -51T-22 21T-65 95T-82
164V188Q-82 293 -45 386T56 557T207 699T393 810Q375 828 358 849T327 896T305 956T297 1030Q297 1100 322 1167T389 1293T487 1401T607 1485T736 1541T864 1561Q967 1561 1008 1540Q1042 1522 1081 1488T1155 1414T1212 1332T1235 1257Q1235 1200 1216 1138T1166
1018T1095 908T1014 821L842 973Z" />
<glyph unicode="F" glyph-name="F" horiz-adv-x="1511" d="M1458 637Q1460 637 1460 631Q1460 621 1449 595T1417 533T1366 459T1296 385Q1276 380 1245 375T1175 364T1089 354T993 343Q934 250 879 158T774 -20T684 -187T612 -336Q590 -345 547 -354T458 -373T371
-390T315 -403Q409 -202 504 -25T700 317Q648 313 602 310T521 304T464 301T438 299Q432 299 432 307Q432 318 442 339T465 381T493 419T516 438Q594 445 663 453T796 470Q959 723 1130 945T1477 1378Q1481 1382 1481 1395Q1481 1401 1478 1407T1462 1409Q1249
1351 1077 1280T771 1137T540 995T379 871T286 779T256 737Q256 734 258 729T276 723Q308 723 344 732T417 755T488 785T551 817Q552 794 553 764T556 702T559 643T561 596Q549 590 522 584T457 572T370 563T266 559Q260 559 257 560T250 561Q241 562 224 577T185
615T142 665T102 718T73 765T61 797Q61 858 106 923T229 1054T409 1182T624 1301T854 1404T1078 1486T1275 1539T1425 1559Q1442 1559 1464 1546T1509 1512T1554 1465T1593 1413T1622 1364T1634 1325Q1634 1319 1614 1286T1557 1198T1472 1070T1365 910T1243 727T1112
528Q1202 549 1266 568T1372 603T1435 627T1458 637Z" />
<glyph unicode="G" glyph-name="G" horiz-adv-x="1206" d="M1047 537Q1041 530 1020 485T970 369T906 205T839 9T778 -204T733 -416Q706 -424 672 -432T603 -447T541 -458T500 -463Q518 -386 535 -316T574 -180T620 -48T680 86Q642 37 600 -9T513 -91T423 -148T332
-170Q301 -170 263 -153T185 -107T109 -37T44 51T-2 150T-20 254Q-20 340 4 442T71 652T175 869T309 1080T465 1268T639 1421T822 1523T1008 1561Q1043 1561 1076 1546T1139 1507T1193 1455T1235 1403Q1255 1374 1271 1336T1288 1260Q1288 1196 1269 1125T1215
984T1135 849T1036 731L860 895Q890 926 932 975T1012 1085T1077 1216T1104 1358Q1104 1370 1103 1385T1097 1413T1080 1435T1047 1444Q991 1444 925 1402T788 1289T646 1122T508 919T385 700T285 481T218 282T193 121Q193 58 208 31T252 4Q286 4 329 26T418 85T511
167T598 259T671 349T723 422Q741 451 754 482T784 545Q822 545 854 544T918 542T981 539T1047 537Z" />
<glyph unicode="H" glyph-name="H" horiz-adv-x="1360" d="M668 1372Q623 1254 579 1144T491 930T403 726T314 529Q389 540 466 552T610 574T725 591T788 601Q873 805 951 1014T1108 1442Q1137 1413 1171 1379T1236 1314T1290 1260T1321 1227Q1251 1078 1184 936T1051
658Q1140 680 1193 698T1273 727T1308 740T1313 733Q1310 725 1300 705T1276 658T1243 604T1208 551T1174 511T1147 494Q1126 490 1098 486Q1074 482 1039 477T957 464Q853 252 762 80T596 -211Q559 -181 526 -152T461 -111Q442 7 390 145T263 421Q192 271 118
124T-39 -180Q-82 -145 -121 -119T-188 -72Q-144 15 -92 126T15 368T128 644T241 945T350 1260T449 1581Q478 1553 508 1526T568 1472T623 1420T668 1372ZM544 52Q633 238 717 431Q570 412 376 392Q403 350 427 304T473 213T512 127T544 52Z" />
<glyph unicode="I" glyph-name="I" horiz-adv-x="1018" d="M1128 1384Q1133 1373 1137 1356T1141 1313Q1141 1251 1123 1175T1073 1012T995 832T894 644T775 456T642 275Q685 223 733 178T836 98Q803 73 774 59Q735 76 685 112T580 200Q463 63 346 -37T113 -186Q99
-192 78 -196T22 -201Q-6 -201 -36 -180T-93 -130T-142 -72T-176 -25Q-189 -6 -197 22T-205 92Q-205 143 -194 196T-154 317Q-142 322 -112 331T-45 351T28 370T88 383Q58 338 32 297T-12 214T-42 129T-53 37Q-53 17 -46 -1T-18 -20Q13 -20 60 11T164 97T287 227T420
389Q382 443 350 503T295 629T258 764T244 905Q244 1011 277 1101T366 1264T493 1394T641 1488T791 1545T928 1565Q962 1565 979 1552Q996 1541 1019 1519T1064 1471T1104 1423T1128 1384ZM420 797Q420 730 441 653T500 497Q560 580 617 667T726 842T821 1013T896
1172T945 1312T963 1425Q963 1438 958 1441T944 1444Q930 1444 886 1428T783 1377T661 1290T544 1165T455 1001T420 797Z" />
<glyph unicode="J" glyph-name="J" horiz-adv-x="1192" d="M1149 1319Q1171 1286 1171 1217Q1171 1152 1152 1073T1099 904T1018 719T914 525Q962 453 984 362T1006 172Q1006 149 1005 133T1004 106Q975 87 936 67Q903 50 857 28T752 -16Q767 15 780 55T802 142T817
237T823 334Q823 345 823 355T821 376Q757 277 687 183T546 6T403 -148T264 -268T136 -347T25 -375Q8 -375 -12 -362T-54 -328T-95 -282T-131 -233T-159 -190T-174 -162Q-177 -154 -182 -133T-188 -86Q-188 0 -160 92T-81 273T39 440T189 578T359 672T539 707Q647
707 730 673Q785 768 832 862T914 1044T967 1211T987 1356Q987 1403 972 1424T911 1446Q879 1446 831 1435T730 1404T622 1355T525 1288T455 1206T428 1110Q428 1083 438 1048T473 973T541 890T653 803Q602 793 556 786T471 774T406 766T367 762Q347 774 319 799T265
863T220 953T201 1067Q201 1164 241 1239T344 1369T485 1461T641 1522T785 1555T893 1565Q922 1565 951 1550T1006 1512T1056 1459T1098 1403T1130 1353T1149 1319ZM-27 -158Q8 -158 56 -131T162 -54T283 64T413 213T544 386T670 574Q665 575 655 575Q575 575 493
540T334 447T190 315T72 164T-8 12T-37 -121Q-37 -136 -35 -147T-27 -158Z" />
<glyph unicode="K" glyph-name="K" horiz-adv-x="1196" d="M731 1372Q644 1146 561 947T392 561Q471 625 554 697T719 847T879 1006T1027 1169T1155 1330T1255 1485Q1280 1467 1310 1443T1371 1393T1431 1341T1483 1296Q1386 1192 1287 1095T1073 900T818 704T503
496Q633 269 740 103T946 -182Q936 -186 904 -201T832 -236T752 -275T686 -305Q623 -174 543 28T368 509Q288 336 204 167T25 -180Q-19 -145 -60 -119T-129 -72Q-85 15 -33 126T74 368T187 644T301 945T409 1260T508 1581Q537 1553 568 1526T630 1472T686 1420T731
1372Z" />
<glyph unicode="L" glyph-name="L" horiz-adv-x="1038" d="M-152 -63Q-100 26 -42 139T76 383T196 659T312 956T418 1267T508 1581Q537 1553 568 1526T630 1472T686 1420T731 1372Q694 1264 645 1145T541 902T428 656T313 422T205 213T114 41Q174 41 256 41T434
39T636 36T850 31Q834 9 813 -17T769 -70T721 -124T672 -174Q582 -169 499 -161T337 -143T185 -121T37 -99Q26 -119 20 -128T14 -135L-152 -63Z" />
<glyph unicode="M" glyph-name="M" horiz-adv-x="1460" d="M1460 1411Q1400 1245 1347 1074T1254 709T1190 289T1165 -211Q1153 -219 1130 -232T1078 -261T1018 -293T959 -324T907 -351T872 -369Q873 -294 882 -204T906 -15T942 192T987 408Q915 311 850 247T733
143Q674 97 623 70Q602 58 572 68T513 98T459 142T424 182Q414 198 403 273T386 488Q343 432 293 370T192 247T90 128T-3 23T-81 -59T-135 -109Q-145 -98 -159 -84T-189 -55T-220 -24T-246 6Q-100 134 50 367T336 930Q351 917 364 905T389 881Q397 1039 413 1231T461
1659Q466 1657 484 1640T528 1598T581 1543T634 1486T679 1438T705 1409Q703 1401 696 1366T680 1276T659 1150T639 1000T624 836T616 670Q615 636 615 592T614 500T615 408T620 326T628 266T643 240Q654 237 696 269T797 363T925 513T1060 712Q1090 829 1120 938T1179
1140T1233 1306T1278 1427Q1298 1426 1323 1425T1375 1421T1423 1416T1460 1411Z" />
<glyph unicode="N" glyph-name="N" horiz-adv-x="1358" d="M1335 1223Q1335 1171 1326 1101T1296 939T1238 734T1147 483Q1088 333 1027 218T912 22T818 -102T762 -154Q736 -166 705 -166Q679 -166 652 -158T606 -133Q594 -123 567 -82T508 34T448 223T405 492Q362
436 311 372T207 245T102 121T3 10T-79 -76T-135 -129Q-146 -119 -160 -105T-190 -76T-220 -44T-246 -14Q-100 114 50 347T336 909Q353 895 368 881T397 853Q401 993 406 1102T419 1294T432 1438T445 1540T455 1608T463 1651Q473 1642 493 1623T538 1579T590 1529T642
1478T685 1435T711 1407Q698 1357 682 1291T651 1135T626 930T616 668Q617 531 626 403Q630 348 635 290T649 175T670 66T697 -27Q822 179 896 372T1011 750T1063 1114T1075 1473V1542Q1127 1502 1174 1453T1257 1360Q1299 1309 1335 1257V1223Z" />
<glyph unicode="O" glyph-name="O" horiz-adv-x="1274" d="M1239 1341Q1246 1329 1254 1318T1269 1285T1281 1229T1286 1135Q1286 1011 1257 889T1178 652T1060 432T914 235T750 69T581 -59T416 -141T268 -170Q241 -170 213 -157T157 -123T105 -77T61 -28T28 17T10
47Q5 57 -2 71T-15 106T-25 159T-29 236Q-29 305 -16 386T33 562T128 762T283 987Q291 978 307 961T342 921T382 875T421 828T453 789T471 762Q423 707 380 643T301 514T234 384T183 265T151 167T139 100Q139 84 145 70T160 44T179 27T197 20Q249 20 316 50T456
134T607 264T756 432T891 629T1003 849T1078 1082T1106 1321Q1106 1357 1098 1381T1077 1421T1048 1443T1014 1450Q937 1450 877 1421T772 1346T701 1247T664 1143Q649 1059 659 993T687 877T724 798T745 754Q721 757 688 759T619 765T548 771T485 780Q473 794
459 820T434 880T414 954T406 1036Q406 1116 431 1186T500 1315T598 1419T712 1496T829 1544T936 1561Q968 1561 1000 1549T1064 1516T1123 1471T1175 1422T1214 1376T1239 1341Z" />
<glyph unicode="P" glyph-name="P" horiz-adv-x="1268" d="M1452 1249Q1452 1177 1427 1103T1357 956T1254 816T1129 692T992 591T854 520Q843 536 827 558T791 605T753 654T715 700Q858 756 971 833T1164 994T1286 1165T1329 1327Q1329 1337 1326 1348T1316 1367T1298
1378T1270 1378Q1223 1368 1167 1341T1048 1274T918 1180T781 1066Q744 950 696 821T592 563T475 313T350 92T223 -82T100 -188Q85 -196 64 -203T10 -213Q-2 -214 -18 -203T-52 -175T-86 -137T-117 -97T-141 -63T-154 -43Q-162 -28 -162 -8T-158 33Q-138 100 -102
180T-18 347T90 527T218 711T362 892T518 1062Q569 1221 602 1363T641 1610Q681 1594 717 1569T782 1517T833 1463T868 1415Q866 1398 863 1381T855 1343Q956 1408 1053 1444T1243 1481Q1262 1481 1284 1469T1330 1438T1374 1394T1413 1346T1440 1300T1452 1264V1249ZM4
-8Q27 -8 66 43T153 182T256 387T363 635Q284 541 217 449T100 275T22 123T-6 4Q-6 -8 4 -8Z" />
<glyph unicode="Q" glyph-name="Q" horiz-adv-x="1274" d="M936 1561Q968 1561 1000 1549T1064 1516T1123 1471T1175 1422T1214 1376T1239 1341Q1246 1329 1254 1317T1269 1284T1281 1228T1286 1135Q1286 995 1250 858T1151 593T1006 351T830 144Q894 52 967 -31T1116
-201Q1057 -204 977 -208T805 -213Q763 -158 726 -108T655 -7Q551 -84 452 -127T268 -170Q240 -170 212 -157T156 -123T105 -77T62 -28T29 17T10 47Q5 57 -2 70T-15 105T-25 158T-29 236Q-29 305 -16 386T33 562T128 762T283 987Q290 979 302 966T328 936T359 900T392
862Q398 953 426 1040T496 1205T593 1348T706 1461T824 1534T936 1561ZM602 862Q602 713 629 591T704 362Q785 456 858 568T986 803T1073 1057T1106 1321Q1106 1357 1098 1381T1077 1421T1048 1443T1014 1450Q953 1450 899 1425T799 1356T717 1254T655 1131T616
997T602 862ZM536 192Q475 310 441 430T396 690Q357 635 323 576T261 459T210 345T172 242T148 158T139 100Q139 84 145 70T160 44T179 27T197 20Q265 20 353 65T536 192Z" />
<glyph unicode="R" glyph-name="R" horiz-adv-x="1415" d="M1477 1233Q1477 1131 1441 1022T1328 808T1132 610T848 446Q889 347 932 257T1018 88T1099 -59T1169 -180Q1142 -189 1105 -201T1029 -225T953 -249T887 -268Q879 -246 864 -199T830 -87T789 60T746
232T705 419T670 612Q797 656 897 711T1074 827T1203 954T1289 1082T1338 1203T1354 1311Q1354 1330 1351 1344T1339 1368T1314 1379T1270 1378Q1223 1368 1167 1341T1048 1274T918 1180T781 1066Q744 950 696 821T592 563T475 313T350 92T223 -82T100 -188Q85
-196 64 -203T10 -213Q-2 -214 -18 -203T-52 -175T-86 -137T-117 -97T-141 -63T-154 -43Q-162 -28 -162 -8T-158 33Q-138 100 -102 180T-18 347T90 527T218 711T362 892T518 1062Q569 1221 602 1363T641 1610Q681 1594 717 1569T782 1517T833 1463T868 1415Q866
1398 863 1381T855 1343Q956 1408 1053 1444T1243 1481Q1265 1481 1291 1469T1342 1436T1392 1389T1434 1335T1464 1281T1477 1233ZM4 -8Q27 -8 66 43T153 182T256 387T363 635Q284 541 217 449T100 275T22 123T-6 4Q-6 -8 4 -8Z" />
<glyph unicode="S" glyph-name="S" horiz-adv-x="1235" d="M1346 1337Q1347 1335 1350 1328T1356 1311T1361 1292T1364 1278Q1364 1244 1350 1197T1312 1096T1254 988T1184 884T1108 794T1030 729Q1016 742 997 760T955 798T911 840T870 881Q899 904 935 941T1009
1025T1083 1120T1145 1214T1187 1297T1198 1356Q1195 1367 1189 1371T1165 1376Q1104 1376 1024 1352T857 1283T682 1171T516 1022T378 840T285 629Q355 630 418 634T538 644T647 653T748 657Q774 657 804 629T860 562T903 482T920 416Q920 345 884 274T786 136T643
12T473 -88T290 -155T113 -180Q102 -171 84 -153T46 -112T4 -64T-36 -16T-69 26T-88 55Q-33 47 44 51T208 73T381 124T545 209T679 330T763 494Q705 493 658 489T567 479T477 469T375 465Q357 465 336 465T294 468T254 477T223 494Q196 517 171 542T126 594T94
648T82 700Q82 776 120 869T225 1058T385 1242T585 1402T814 1514T1057 1556Q1100 1556 1135 1543T1200 1509T1252 1463T1293 1413T1324 1369T1346 1337Z" />
<glyph unicode="T" glyph-name="T" horiz-adv-x="1165" d="M1524 1270Q1475 1272 1425 1275T1318 1281T1193 1286T1038 1288Q928 1288 825 1283T621 1262T419 1220T212 1149Q255 1029 281 914T321 695T341 500T346 336Q346 267 343 215T336 127Q332 85 326 55Q374
169 419 296T506 549T582 792T643 1002T687 1157T709 1237Q731 1219 762 1191T826 1133T885 1076T928 1030Q903 937 862 825T772 594T668 356T563 129T469 -66T397 -211Q382 -196 360 -170T315 -118T273 -68T244 -35Q246 -23 251 6T262 80T272 184T276 315Q276
397 269 491T242 688T183 898T84 1116Q83 1116 83 1117Q82 1118 82 1122Q82 1132 89 1149T107 1187T132 1228T158 1264Q163 1270 206 1292T324 1346T504 1412T736 1476T1009 1525T1315 1544Q1322 1536 1337 1518T1373 1475T1415 1422T1459 1366T1497 1313T1524
1270Z" />
<glyph unicode="U" glyph-name="U" horiz-adv-x="1346" d="M678 -74Q730 76 780 191T873 403Q824 329 782 273T707 179Q669 134 637 102Q561 29 502 -24T396 -111T314 -163T252 -180Q231 -180 208 -166T162 -130T119 -84T84 -41Q59 -9 56 42T53 168Q53 283 72
409T128 662T215 916T329 1159T465 1378T618 1561Q639 1539 666 1511T720 1452T773 1393T817 1341Q732 1264 658 1168T521 962T410 734T328 494T276 251T256 17Q367 73 460 153T630 327T771 526T886 736T978 945T1052 1139T1110 1305T1157 1430Q1167 1415 1184
1393T1220 1346T1260 1294T1298 1246T1329 1207T1346 1184Q1292 1045 1249 923T1169 688T1100 468T1034 250T965 23T885 -225L678 -74Z" />
<glyph unicode="V" glyph-name="V" horiz-adv-x="1262" d="M1329 1251Q1296 1075 1225 910T1061 597T858 322T639 96T427 -73T246 -174Q235 -179 227 -180T215 -182Q195 -182 174 -166T133 -129T99 -87T78 -55Q73 -47 68 -32T63 4Q63 56 74 144T106 347T155 595T220
872T297 1162T383 1450Q398 1434 420 1408T466 1353T513 1293T555 1239T585 1200T596 1184Q542 1026 496 867T409 556T333 261T268 -5Q386 67 489 166T680 381T835 627T951 889T1024 1152T1049 1403Q1049 1437 1047 1461T1041 1503T1036 1529T1032 1544L1329 1251Z"
/>
<glyph unicode="W" glyph-name="W" horiz-adv-x="1812" d="M903 57Q903 37 903 22T904 -5Q999 62 1087 159T1253 373T1394 621T1503 886T1574 1152T1599 1403Q1599 1437 1597 1461T1592 1503T1587 1529T1583 1544L1880 1251Q1849 1075 1784 910T1633 597T1448
322T1248 96T1053 -73T883 -174Q873 -179 865 -180T854 -182Q834 -182 814 -169T776 -137T745 -100T725 -70Q723 -66 720 -57T713 -37T708 -14T705 8Q705 36 706 78T710 173Q457 -86 246 -174Q235 -179 227 -180T215 -182Q195 -182 174 -166T133 -129T99 -87T78
-55Q73 -47 68 -32T63 4Q63 56 74 144T106 347T155 595T220 872T297 1162T383 1450Q398 1434 420 1408T466 1353T513 1293T555 1239T585 1200T596 1184Q542 1026 495 863T406 543T328 240T262 -30Q393 50 512 160T727 404Q736 497 749 587T781 750T822 866T874
911Q887 911 911 894T961 854T1009 807T1042 770Q1047 764 1052 753T1057 721Q1057 673 1048 633T1022 557T982 484T930 408Q922 353 916 294Q911 243 907 181T903 57Z" />
<glyph unicode="X" glyph-name="X" horiz-adv-x="1085" d="M809 -276Q788 -283 765 -289T721 -299T680 -307T649 -313Q590 -161 538 -7T439 306Q310 183 166 65T-147 -170Q-158 -159 -172 -143T-200 -110T-226 -78T-246 -55Q-63 73 93 214T385 504Q329 713 287
919T215 1329Q235 1319 265 1304T330 1270T398 1233T461 1198T509 1172T532 1159Q545 938 574 730Q755 966 877 1194T1065 1620Q1086 1596 1116 1558T1176 1478T1231 1400T1268 1341Q1128 1118 969 903T614 481Q649 294 696 109T809 -276Z" />
<glyph unicode="Y" glyph-name="Y" horiz-adv-x="1294" d="M590 -1004Q558 -972 531 -943T476 -886T421 -829T360 -768Q402 -644 450 -519T557 -255T689 38T855 377Q809 309 770 258T701 172Q667 132 637 102Q561 29 502 -24T396 -111T314 -163T252 -180Q231 -180
208 -166T162 -130T119 -84T84 -41Q59 -9 56 42T53 168Q53 283 72 409T128 662T215 916T329 1159T465 1378T618 1561Q639 1539 666 1511T720 1452T773 1393T817 1341Q732 1264 658 1168T521 962T410 734T328 494T276 251T256 17Q367 73 460 153T630 327T771 526T886
736T978 945T1052 1139T1110 1305T1157 1430Q1167 1415 1184 1393T1220 1346T1260 1294T1298 1246T1329 1207T1346 1184Q1293 1058 1242 933T1136 668T1024 366T900 3T757 -446T590 -1004Z" />
<glyph unicode="Z" glyph-name="Z" horiz-adv-x="1075" d="M1260 1217Q1205 1139 1132 1055T972 883T792 709T603 540T415 383T239 244T86 130T-33 49Q26 51 104 52T268 56T441 61T606 71T746 86T842 109Q817 77 787 35T726 -52T663 -140T606 -215Q559 -212 481
-206T311 -191T121 -172T-63 -150Q-89 -124 -112 -96T-155 -39T-193 14T-225 59Q-101 168 37 291T323 555T622 861T925 1217Q857 1202 786 1192T643 1174T502 1163T369 1155Q346 1176 308 1213T231 1291T155 1371T98 1438Q120 1434 157 1429T249 1420T379 1412T555
1409Q666 1409 746 1411T882 1416T973 1423T1029 1430T1060 1436T1077 1438Q1091 1428 1109 1409T1147 1366T1186 1317T1221 1270T1247 1234T1260 1217Z" />
<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="860" d="M1106 1573Q1084 1511 1051 1465T979 1380Q956 1381 902 1382T747 1382L84 -103Q204 -97 278 -90T393 -77T448 -68T463 -68Q463 -75 455 -93T432 -133T401 -180T367 -225T336 -259T315 -272Q278
-274 228 -276T125 -281T19 -284T-73 -286T-139 -285T-162 -279Q-158 -270 -136 -214T-79 -67T1 139T97 386T201 652T304 917T398 1161T477 1363T532 1503T555 1561Q691 1563 825 1565T1106 1573Z" />
<glyph unicode="\" glyph-name="backslash" horiz-adv-x="1067" d="M399 1561Q430 1435 467 1291T543 994T624 686T705 383T783 100T854 -147Q829 -161 810 -170T775 -186T747 -198T723 -207Q674 -48 632 91T550 361T472 619T393 880T307 1160T209 1477Q265 1503
309 1523T399 1561Z" />
<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="860" d="M-188 -291Q-167 -229 -134 -182T-61 -98Q-48 -98 -35 -98T2 -99T62 -100T162 -99L676 1386Q554 1380 482 1373T372 1359T323 1350T311 1350Q310 1357 319 1375T342 1415T373 1462T407 1507T438
1541T459 1554Q496 1556 545 1557T649 1560T759 1561T861 1561T945 1561T997 1561Q993 1552 972 1496T915 1349T835 1143T739 896T635 630T532 365T438 121T359 -81T304 -221T281 -279Q213 -280 159 -280T51 -282T-59 -286T-188 -291Z" />
<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="1024" d="M930 1047Q901 1038 874 1030T822 1014T779 1003T748 997Q737 1019 723 1052T692 1124T653 1204T608 1286Q591 1263 566 1228T513 1154T458 1075T410 1006Q391 1011 368 1022T323 1046T281
1071T250 1092Q258 1108 277 1135T321 1194T374 1261T429 1327T478 1385T514 1427Q529 1430 562 1429T633 1424T705 1417T756 1409Q762 1398 777 1369T811 1301T850 1222T888 1144T916 1081T930 1047Z" />
<glyph unicode="_" glyph-name="underscore" horiz-adv-x="768" d="M522 -297Q518 -315 511 -339T495 -386T478 -430T463 -459Q451 -459 396 -459T263 -460T98 -462T-65 -463T-192 -462T-250 -459Q-247 -447 -240 -426T-225 -381T-209 -338T-195 -309Q-189 -307
-157 -305T-74 -302T38 -300T164 -299T291 -298T402 -297T484 -297T522 -297Z" />
<glyph unicode="`" glyph-name="grave" horiz-adv-x="717" d="M477 715Q454 704 434 698T385 684Q370 710 352 743T314 814T275 896T240 985Q291 1004 332 1014T393 1028L477 715V715Z" />
<glyph unicode="a" glyph-name="a" horiz-adv-x="846" d="M516 88Q516 82 522 82Q531 82 552 95T600 128T657 173T716 222T766 266T801 297Q810 288 823 273T848 246Q824 224 791 193T719 127T639 60T559 0T485 -42T424 -59Q406 -59 385 -52T345 -33T315 -3T303
35Q303 43 303 54T304 84T312 129T330 195Q297 160 253 122T159 50T61 -11T-31 -53Q-36 -55 -39 -55T-45 -55Q-55 -55 -71 -45T-104 -19T-131 19T-143 61Q-143 67 -137 101T-109 187T-42 305T78 440Q117 475 162 506Q200 532 249 559T352 602Q354 602 355 603T360
602Q372 598 388 590T421 572T450 553T467 537Q468 535 467 534L465 532Q420 508 380 479T309 423Q273 392 242 362Q169 290 141 238T113 162Q113 145 127 145Q141 145 162 156T211 187T270 233T338 289Q369 314 398 343Q423 367 450 398T496 461Q496 462 497 463Q498
464 500 463Q511 455 525 437T551 396T571 354T580 322Q557 275 545 237T526 169T518 120T516 88Z" />
<glyph unicode="b" glyph-name="b" horiz-adv-x="735" d="M416 109Q408 109 402 109T388 111Q355 76 318 46T242 -7T168 -42T98 -55Q67 -55 34 -33T-28 19T-74 82T-92 133Q-92 180 -81 259T-42 440T34 660T158 901Q257 1063 348 1165T515 1325T648 1408T735 1440Q757
1440 783 1429T834 1398T879 1354T907 1303Q895 1233 861 1162T776 1018T660 871T520 723T364 574T198 426Q183 376 171 330T151 245T138 177T133 129Q133 101 137 92T154 82Q167 82 184 92T221 121T260 162T298 212Q297 219 297 225T297 236Q297 274 309 311T340
381T382 443T430 495Q442 486 454 471T479 437T503 396T526 354Q521 316 503 275T455 193H459Q493 193 524 198T584 217T643 253T702 309Q712 300 726 285T750 258Q708 214 667 186T585 140T503 116T416 109ZM362 844Q336 796 311 739T263 619Q372 725 466 828T628
1022T735 1184T774 1303Q774 1317 764 1317Q749 1317 713 1296T625 1221T506 1076T362 844Z" />
<glyph unicode="c" glyph-name="c" horiz-adv-x="653" d="M39 -74Q21 -74 -2 -63T-49 -32T-95 14T-133 70Q-139 81 -141 95T-143 131Q-143 188 -126 245T-77 355T-3 452T92 531T201 583T319 602Q328 602 343 593T377 567T413 531T447 491T471 451T481 416Q476
397 450 375T389 333T314 300T246 287Q229 287 229 297Q229 308 244 329T277 376T311 427T326 471Q326 480 322 486T309 492Q287 492 263 472T215 419T169 344T131 256T104 166T94 84Q94 62 107 54T147 45Q214 45 276 67T396 125T506 205T604 293Q615 280 631 268T655
246Q593 181 524 123T377 21T216 -48T39 -74Z" />
<glyph unicode="d" glyph-name="d" horiz-adv-x="911" d="M551 111Q551 86 567 86Q586 86 612 98T668 129T727 173T783 220T831 263T864 295Q874 286 888 272T913 246Q887 220 854 188T784 123T706 58T625 2T547 -38T475 -53Q457 -53 431 -37T381 4T341 54T324
102Q324 148 330 198Q285 158 243 122T159 55T72 -3T-23 -49Q-38 -55 -49 -55Q-59 -55 -75 -45T-106 -20T-132 15T-143 53Q-143 94 -128 144T-83 248T-11 355T86 456T205 542T344 604Q358 602 380 592T421 570Q457 673 503 776T602 975T712 1154T826 1302T938 1407T1044
1456Q1066 1456 1090 1442T1137 1407T1174 1364T1194 1327Q1194 1281 1171 1220T1108 1089T1012 941T892 785T758 626T616 473Q586 371 569 279T551 111ZM1053 1335Q1036 1335 1012 1310T957 1241T892 1135T823 1002T753 849T687 685Q762 777 829 869T948 1045T1029
1197T1059 1311Q1059 1317 1059 1326T1053 1335ZM104 145Q137 145 202 191T349 316Q358 362 371 409T400 506Q342 467 287 417T188 318T119 227T92 162Q92 145 104 145Z" />
<glyph unicode="e" glyph-name="e" horiz-adv-x="645" d="M647 246Q555 156 474 95T318 -3T177 -56T45 -72Q18 -72 -15 -52T-76 -4T-124 56T-143 109Q-143 191 -121 259T-61 383T23 480T122 550T225 592T319 606Q350 606 380 588T436 544T476 490T492 440Q492
406 464 371T383 298T258 223T97 145Q94 121 94 98Q94 67 107 56T158 45Q224 45 282 67T395 124T499 204T598 295L647 246ZM295 496Q275 496 251 475T203 418T157 338T119 243Q156 267 191 294T255 350T300 411T317 473Q317 482 312 489T295 496Z" />
<glyph unicode="f" glyph-name="f" horiz-adv-x="616" d="M629 256Q555 181 482 122T333 18T179 -61T19 -117Q-21 -235 -64 -368T-154 -653L-416 -739Q-367 -586 -320 -443T-225 -165Q-257 -170 -289 -173T-356 -178L-371 -76Q-320 -71 -275 -66T-187 -55Q-70
274 44 540T276 1002T515 1316T770 1468Q788 1464 808 1454T847 1429T883 1400T911 1370Q916 1365 918 1360T920 1341Q920 1279 894 1205T820 1049T707 881T562 711T394 546T211 394Q177 311 139 211T57 -9Q128 10 191 36T317 100T443 188T582 307L629 256ZM403
815Q392 795 376 764Q362 738 343 698T300 603Q370 668 434 739T555 884T657 1027T736 1160T787 1272T805 1354Q805 1368 795 1368Q776 1368 745 1338T667 1242T554 1071T403 815Z" />
<glyph unicode="g" glyph-name="g" horiz-adv-x="778" d="M782 246Q696 158 610 85T438 -53Q422 -99 404 -146T365 -242Q336 -308 298 -368T216 -480T128 -573T42 -644T-35 -689T-96 -705Q-113 -705 -136 -690T-179 -653T-214 -604T-229 -553Q-229 -501 -194 -451T-96
-348T51 -237T233 -110Q255 -53 282 25T348 219Q312 169 264 121T165 34T64 -27T-29 -51Q-40 -51 -57 -41T-92 -13T-122 27T-135 76Q-135 109 -119 155T-73 254T1 360T99 461T218 546T356 604Q367 604 387 596T426 577T460 556T475 543Q475 541 472 538Q470 537
469 537Q446 523 410 498T334 442T254 374T182 303T129 235T109 176Q109 167 113 161T127 154Q152 154 183 171T248 217T314 279T376 347T429 410T465 457Q467 459 468 461T473 465Q481 463 494 445T521 404T543 357T553 324V322Q553 321 551 315Q540 280 523 217T480
72Q544 123 608 179T737 299L782 246ZM-111 -571Q-91 -571 -54 -541T26 -463T108 -358T176 -246Q111 -293 57 -334T-35 -415T-95 -490T-117 -563Q-117 -571 -111 -571Z" />
<glyph unicode="h" glyph-name="h" horiz-adv-x="862" d="M512 84Q527 84 552 97T607 130T670 174T731 222T784 265T819 295Q828 286 840 272T864 246Q842 224 809 194T738 131T659 68T579 12T506 -28T449 -43Q430 -43 405 -34T356 -10T316 22T299 57Q300 100
315 157T350 274T394 392T438 497Q430 495 407 475T352 421T281 338T205 229T133 100T76 -47Q73 -58 68 -63T49 -68Q40 -68 21 -59T-19 -38T-60 -11T-92 14Q-98 21 -102 27T-106 45Q-106 111 -84 207T-24 415T66 650T176 891T298 1115T423 1303T541 1434T645 1487Q668
1480 691 1465T736 1432T773 1397T799 1368Q805 1360 807 1349T809 1333Q809 1297 789 1244T733 1125T646 984T532 829T397 668T245 511Q225 457 209 406Q263 462 308 500T388 560T447 592T485 602Q494 602 517 591T565 563T611 530T637 502Q639 497 637 489T633
475Q624 448 612 413T585 338T556 258T531 185T513 126T506 90Q506 84 512 84ZM424 944Q400 893 378 843T334 741Q401 827 464 915T576 1085T656 1236T686 1352Q686 1374 678 1374Q666 1374 642 1342T583 1252T509 1116T424 944Z" />
<glyph unicode="i" glyph-name="i" horiz-adv-x="428" d="M18 -55Q3 -55 -20 -45T-64 -19T-100 16T-115 53Q-105 97 -88 154T-52 270T-11 385T28 486T59 557T76 584Q82 584 106 571T156 540T204 501T225 465Q225 462 224 458T221 446Q213 421 201 387T174 317T146
244T121 175T103 119T96 84Q96 78 102 78Q113 78 135 91T185 125T245 171T304 220T356 265T391 295Q400 286 412 272T436 246Q414 224 381 193T310 128T230 62T149 3T76 -39T18 -55ZM414 889Q413 885 407 870T391 834T371 791T348 749T327 718T311 705Q293 706
268 716T219 738T179 763T162 780Q162 801 174 834T202 899T234 954T260 977Q278 977 304 966T354 939T396 910T414 889Z" />
<glyph unicode="j" glyph-name="j" horiz-adv-x="442" d="M451 246Q360 184 265 124T75 4Q58 -48 38 -105T-16 -240Q-60 -340 -119 -424T-242 -570T-368 -667T-479 -702Q-495 -702 -516 -686T-557 -647T-590 -600T-604 -561Q-604 -502 -570 -441T-476 -316T-334
-189T-156 -58Q-130 16 -105 93T-58 244T-16 383T19 498T44 575T57 604Q63 604 88 589T141 554T191 513T213 481Q213 476 212 472T209 463Q189 403 174 353T147 261T125 182T106 112Q181 159 256 205T406 299L451 246ZM371 889Q370 885 364 870T348 834T328 791T305
749T284 718T268 705Q250 706 225 716T176 738T136 763T119 780Q119 802 131 836T159 901T192 954T217 977Q235 977 261 966T311 939T353 910T371 889ZM-242 -274Q-232 -254 -223 -232T-204 -186Q-268 -234 -321 -283T-412 -381T-472 -479T-494 -580Q-494 -594
-483 -594Q-465 -594 -435 -566T-370 -491T-302 -388T-242 -274Z" />
<glyph unicode="k" glyph-name="k" horiz-adv-x="836" d="M502 100Q518 100 542 112T596 142T655 184T713 229T763 270T797 299Q806 290 818 276T842 250Q820 228 787 197T716 132T636 66T555 7T481 -35T424 -51Q385 -51 354 -36T297 4T249 60T208 125Q191 103
174 77T141 26T116 -16T103 -38Q101 -46 97 -49T84 -53Q69 -53 49 -42T7 -11T-34 30T-70 76Q-78 87 -80 101T-82 135Q-82 201 -66 284T-21 458T48 647T138 840T244 1027T362 1197T487 1339T616 1442Q626 1448 634 1450T649 1452Q661 1452 683 1439T729 1406T775
1368T807 1337Q813 1328 813 1311Q813 1245 769 1147T645 930T452 678T199 411Q184 360 170 310T144 208Q238 343 310 421T435 540T519 592T565 604Q577 604 593 592T625 563T652 531T668 508Q669 498 647 468T586 397T494 313T377 230Q409 184 432 158T471 119Q489
104 502 100ZM395 907Q365 847 334 774T271 619Q382 745 460 853T589 1048T663 1203T686 1315Q686 1318 686 1321T680 1325Q668 1325 641 1297T576 1215T492 1084T395 907Z" />
<glyph unicode="l" glyph-name="l" horiz-adv-x="543" d="M164 70Q180 70 207 84T268 119T337 167T404 218T461 264T498 295Q507 286 519 272T543 246Q521 224 488 193T417 128T337 62T256 3T182 -39T125 -55Q94 -55 60 -33T-5 18T-56 78T-80 123Q-82 129 -82
137T-82 156Q-82 206 -70 282T-36 444T12 614T70 764Q131 897 195 1000T322 1179T441 1308T543 1392T620 1438T664 1452Q683 1445 702 1432T739 1403T769 1374T788 1352Q796 1344 798 1337T801 1317Q801 1293 789 1251T744 1145T653 990T500 780Q456 724 407 666Q365
616 310 557T197 444Q168 334 157 250T145 119Q145 88 150 79T164 70ZM324 803Q307 765 293 729T265 658Q296 693 321 725T365 780Q386 807 403 831Q473 929 524 1011T608 1155T656 1259T672 1319Q672 1324 672 1326T666 1329Q657 1329 625 1300T547 1206T443 1043T324
803Z" />
<glyph unicode="m" glyph-name="m" horiz-adv-x="1161" d="M223 483Q211 452 199 419T176 352Q239 427 280 472T349 542T395 577T428 592Q437 592 458 582T504 558T551 528T582 502Q590 494 584 479Q572 447 561 415T538 348Q605 425 650 471T723 543T768 576T793
584Q806 584 832 571T884 539T930 500T950 465Q950 462 949 458T946 446Q938 421 926 387T899 317T871 244T846 175T828 119T821 84Q821 78 827 78Q838 78 860 91T910 125T970 171T1029 220T1081 265T1116 295Q1125 286 1137 272T1161 246Q1139 224 1106 193T1035
128T955 62T874 3T801 -39T743 -55Q728 -55 705 -45T661 -19T625 16T610 53Q619 94 634 146T667 252T704 360T742 458Q722 434 689 400T614 311T524 173T428 -27Q422 -47 399 -47Q387 -47 370 -43T333 -29T293 -5T254 29Q254 36 261 71T283 162T318 285T363 425Q339
399 303 359T226 261T142 127T61 -45Q55 -66 33 -66Q16 -66 -5 -57T-49 -32T-94 3T-135 41Q-135 47 -130 75T-114 145T-90 242T-56 357T-14 479T35 600Q77 580 128 551T223 483Z" />
<glyph unicode="n" glyph-name="n" horiz-adv-x="823" d="M236 483Q224 451 212 418T188 350Q251 422 296 467T373 539T424 574T455 584Q468 584 494 571T546 539T592 500T612 465Q612 462 611 458T608 446Q600 421 588 387T561 317T533 244T508 175T490 119T483
84Q483 78 489 78Q500 78 522 91T572 125T632 171T691 220T743 265T778 295Q788 286 800 272T823 246Q801 224 768 193T697 128T617 62T536 3T463 -39T406 -55Q391 -55 368 -45T324 -19T287 16T272 53Q281 94 296 146T330 252T367 360T405 459L403 457Q384 434
349 397T268 301T173 160T75 -36Q69 -50 64 -58T45 -66Q28 -66 7 -57T-37 -32T-82 3T-123 41Q-123 47 -118 75T-102 145T-77 242T-43 357T-2 479T47 600Q89 580 140 551T236 483Z" />
<glyph unicode="o" glyph-name="o" horiz-adv-x="672" d="M74 102Q74 72 96 72Q119 72 157 108T236 201Q234 212 234 220T233 236Q233 256 237 283T260 346Q272 373 289 399Q303 422 323 448T367 498L373 504Q383 492 399 472T432 430T461 390T477 365Q477 322
462 279T420 194Q480 198 531 224T639 311Q648 302 662 287T686 260Q644 216 604 187T523 141T440 117T354 109Q320 73 281 43T202 -9T121 -43T45 -55Q15 -55 -17 -37T-75 7T-118 64T-135 117Q-135 193 -115 268T-51 408T60 524T221 600Q224 602 231 603T244 604Q258
604 273 594T302 570T325 545T334 528Q332 523 319 516T284 490T232 439T166 350Q112 269 93 204T74 102Z" />
<glyph unicode="p" glyph-name="p" horiz-adv-x="809" d="M173 369Q227 436 272 479T351 548T410 584T446 594Q462 594 481 582T518 553T553 518T580 489Q591 478 593 466T596 440Q596 393 580 338T538 228T479 124T412 41Q441 53 471 70T532 108T591 149T646
192Q707 240 764 295L809 246Q776 215 736 180T651 111T562 46T474 -9T396 -47T334 -61Q316 -61 289 -51T237 -25T193 7T174 39Q174 47 184 53T215 77T263 128T326 227Q345 263 362 301T392 373T412 431T420 465Q420 474 418 477T413 483Q409 484 406 483Q392 479
350 439T250 323T129 139T8 -109Q-39 -243 -86 -380T-178 -653L-432 -713Q-374 -548 -312 -386T-188 -61T-67 265T47 592Q50 603 52 607T63 612Q79 607 102 594T147 563T188 527T213 496Q215 493 213 486T207 469L173 369Z" />
<glyph unicode="q" glyph-name="q" horiz-adv-x="829" d="M829 246Q797 217 762 187Q732 161 694 130T614 70Q617 56 617 40T618 6Q618 -66 602 -146T559 -306T495 -458T418 -584T334 -670T250 -700Q231 -699 203 -681T146 -638T92 -588T53 -549Q48 -543 45 -536T41
-516Q41 -492 57 -445T99 -337T159 -204T227 -58T294 89T352 223Q311 178 262 131T159 44T52 -21T-51 -47Q-62 -47 -80 -35T-117 -5T-148 37T-162 82Q-162 127 -140 177T-80 277T7 375T109 463T217 533T319 578Q329 578 349 571T389 554T425 534T440 516Q440 512
436 510Q414 498 380 475T307 421T228 356T156 286T104 218T84 160Q84 139 102 139Q119 139 145 152T204 189T273 243T345 311T414 387T473 467Q475 469 475 470T479 471Q488 471 506 452T543 408T574 360T588 326Q589 315 575 277T538 181T484 54T422 -92T360
-241T305 -379T267 -492T252 -565Q252 -571 256 -571Q285 -571 318 -534T383 -439T446 -307T499 -161T535 -26T549 78V98Q549 110 559 117T596 142T668 194T784 295L829 246Z" />
<glyph unicode="r" glyph-name="r" horiz-adv-x="633" d="M406 414Q393 375 374 325T336 227T306 140T293 84Q293 78 299 78Q310 78 332 91T382 125T442 171T501 220T553 265T588 295Q597 286 609 272T633 246Q611 224 578 193T507 128T427 62T346 3T272 -39T215
-55Q200 -55 177 -45T133 -19T97 16T82 53Q97 120 112 170T140 255T163 313T178 346Q166 351 155 357T133 369Q117 352 98 333T58 295T18 258T-18 225L-66 274Q-40 299 -4 334T68 406Q43 421 23 434T-11 459Q-28 471 -41 481Q-47 484 -47 494Q-47 505 -39 525T-17
569T11 617T40 662T64 694T78 707Q80 707 91 702T116 691T140 676T154 662Q155 657 156 641T158 602Q197 582 238 557T313 508Q353 482 389 455Q402 447 405 435T406 414Z" />
<glyph unicode="s" glyph-name="s" horiz-adv-x="645" d="M-66 276Q-43 298 -14 326T45 387T100 458T141 540Q145 563 153 588T172 635T193 670T211 684Q223 677 247 658T295 616T337 576T356 553Q344 507 344 470T350 397T362 321T369 227Q369 195 359 154T322
79Q373 109 423 146T512 217Q558 256 600 295L645 246Q612 215 574 180T494 111T409 46T324 -9T243 -47T170 -61Q141 -61 106 -47T40 -13T-14 29T-41 66Q-41 68 -37 74T-28 88T-17 100T-8 106Q-2 106 16 97T76 88Q99 88 115 100T143 132T159 178T164 233Q164 275
160 314T151 391Q134 371 112 349T68 306T23 264T-18 227L-66 276V276Z" />
<glyph unicode="t" glyph-name="t" horiz-adv-x="469" d="M51 -55Q34 -55 7 -40T-47 -2T-92 45T-111 86Q-111 116 -95 181T-51 329T10 508T80 694H-61H-62Q-63 694 -63 696Q-63 702 -59 713T-48 737T-33 760T-16 774L114 780Q142 848 167 905T213 1004Q218 1015
223 1027T239 1052T267 1078T315 1106Q337 1117 368 1130T430 1154T486 1172T522 1180Q532 1180 532 1176V1174Q532 1173 530 1169Q524 1159 508 1126T469 1042T417 927T358 790L598 799Q608 799 604 787T589 759T564 726T539 700Q537 698 531 696T516 694H318Q282
607 249 518T190 349T149 202T133 92Q133 86 139 86Q150 86 172 98T221 131T280 175T339 222T389 265T424 295Q433 286 445 272T469 246Q447 224 414 193T343 128T263 62T182 3T108 -39T51 -55Z" />
<glyph unicode="u" glyph-name="u" horiz-adv-x="821" d="M475 88Q475 82 481 82Q492 82 514 95T566 128T627 173T688 221T740 265T776 295Q785 286 797 272T821 246Q799 224 766 193T693 129T611 63T528 5T453 -37T395 -53Q378 -53 357 -43T318 -16T287 21T274
59Q274 75 286 120T315 225Q270 164 227 118T148 38T85 -15T45 -45Q37 -50 26 -52T6 -55Q-13 -55 -36 -44T-78 -15T-111 23T-125 63Q-125 85 -111 136T-72 258T-14 417T57 602Q59 607 60 607T66 606Q85 603 118 591T182 563T237 535T260 516Q257 509 245 483T216
421T181 342T147 260T121 190T111 143Q111 139 115 139Q123 139 150 160T216 228T306 346T410 521L438 600Q441 608 451 608Q458 608 481 595T531 564T579 529T602 504Q602 501 601 494T598 481Q588 454 575 418T549 342T522 262T499 188T482 127T475 88Z" />
<glyph unicode="v" glyph-name="v" horiz-adv-x="713" d="M420 104Q378 104 347 118Q314 83 278 53T207 -1T138 -39T74 -55Q59 -55 31 -42T-25 -9T-73 38T-94 92Q-94 158 -81 224T-49 356T-6 483T39 604Q90 581 138 553T229 487Q214 457 199 418T170 337T144 253T123
175T109 112T104 72Q104 64 107 58T119 51Q135 51 154 61T196 87T240 126T284 174Q266 205 266 236Q266 257 272 286T290 348T314 412T342 473T370 522T395 553Q418 544 443 529T489 496T523 462T539 434Q539 413 529 385T502 325T460 257T406 185Q412 183 418
182T434 180Q474 180 505 188T564 211T619 250T678 303Q687 294 701 280T725 254Q683 212 646 184T572 138T498 112T420 104Z" />
<glyph unicode="w" glyph-name="w" horiz-adv-x="1081" d="M438 -55Q424 -55 401 -45T353 -19T306 19T275 65Q223 16 171 -18T74 -55Q59 -55 31 -42T-25 -9T-73 38T-94 92Q-94 158 -80 227T-44 366T3 500T49 625Q100 602 149 574T240 508Q225 478 209 437T178
352T150 263T126 180T110 113T104 72Q104 64 107 58T119 51Q134 51 152 62T191 91T233 132T276 182Q283 235 297 287T328 390T364 490T401 588Q452 565 501 537T592 471Q577 441 562 403T534 325T508 245T488 171T474 110T469 72Q469 64 472 58T483 51Q499 51 520
62T563 93T609 139T654 193Q645 224 645 264Q645 296 656 341T684 432T721 515T760 573Q783 565 807 550T853 517T887 482T903 455Q903 433 892 402T862 335T816 260T758 182Q776 160 819 160Q869 160 919 195T1034 291Q1044 282 1058 268T1081 242Q997 159 931
122T801 84Q741 84 702 117Q669 82 635 52T566 -2T500 -39T438 -55Z" />
<glyph unicode="x" glyph-name="x" horiz-adv-x="836" d="M459 84Q462 78 468 69T494 59Q505 59 528 73T581 111T644 161T707 215T761 263T797 295Q806 286 818 272T842 246Q820 224 787 192T713 126T630 58T547 -3T472 -46T414 -63Q351 -63 304 -45T248 8Q240
36 233 65T219 123L-23 -76Q-30 -76 -43 -70T-68 -56T-90 -40T-100 -29Q-100 -26 -99 -24T-96 -20L198 227Q184 298 175 354T158 436Q151 425 135 401T95 347T43 285T-20 225L-68 274Q0 343 41 403T107 508T143 578T164 604Q184 604 212 600T270 589T326 573T367
551Q370 541 378 498T397 395L629 590Q640 598 647 598Q653 598 665 591T690 575T712 557T721 545Q721 543 717 539Q714 536 689 515T623 459T528 380T416 287Q423 250 429 215T441 153T451 107T459 84Z" />
<glyph unicode="y" glyph-name="y" horiz-adv-x="799" d="M805 248Q715 167 620 95T430 -44Q416 -86 398 -133T354 -240Q325 -306 288 -369T210 -487T124 -589T38 -668T-44 -720T-117 -739Q-133 -739 -156 -727T-200 -697T-235 -657T-250 -618Q-250 -555 -216
-495T-123 -373T17 -250T191 -121Q220 -44 247 39T301 205Q258 150 218 109T144 40T85 -6T47 -33Q39 -38 28 -40T8 -43Q-11 -43 -34 -32T-76 -3T-109 36T-123 76Q-123 98 -109 146T-70 264T-12 419T59 602Q61 607 62 607T68 606Q87 603 120 591T184 563T239 535T262
516Q259 509 247 483T218 421T183 342T149 260T123 190T113 143Q113 139 117 139Q124 139 147 157T206 214T285 313T378 459Q398 525 411 564T428 604Q434 604 459 589T512 554T562 513T584 481Q584 476 583 472T580 463Q557 393 540 337T510 233T486 147T465 70Q540
124 614 180T760 299L805 248ZM-123 -629Q-105 -629 -73 -595T-4 -506T70 -386T137 -255Q99 -287 52 -325T-36 -408T-105 -504T-133 -614Q-133 -629 -123 -629Z" />
<glyph unicode="z" glyph-name="z" horiz-adv-x="723" d="M725 244Q657 179 585 118T440 -4Q441 -11 441 -18T442 -33Q442 -109 411 -189T331 -347T219 -494T94 -614T-24 -696T-119 -727Q-147 -725 -173 -707T-220 -666T-253 -620T-266 -582Q-266 -531 -223 -470T-109
-341T54 -201T243 -54Q254 -10 254 23Q254 26 253 32T248 44T237 54T217 59Q203 59 190 55T150 41Q146 39 134 45T104 62T69 84T34 108T8 127T-2 137Q48 167 93 201T172 272T226 345T246 416Q246 419 245 428T241 448T232 467T217 475Q201 475 181 453T133 396T68
316T-18 227Q-27 237 -36 247Q-44 255 -52 263T-66 279Q-2 339 44 399T126 507T189 584T242 614Q262 614 292 603T354 574T414 536T459 496Q467 486 468 467T469 436Q469 388 458 346T426 268T380 202T326 147Q353 140 376 122T415 76Q490 133 557 188T678 295L725
244ZM-150 -608Q-122 -608 -79 -574T11 -483T104 -355T185 -211Q112 -271 49 -326T-60 -431T-132 -522T-158 -600Q-158 -608 -150 -608Z" />
<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="848" d="M991 1401Q896 1379 820 1328T691 1203T610 1039T582 846Q582 811 585 775T596 700Q558 696 522 693T450 687T376 679T296 670Q359 638 406 617T485 583T533 563T549 551Q495 519 434 476T321
372T234 227T199 31Q199 -27 207 -83T227 -187T254 -269T281 -315Q250 -320 222 -322T162 -326Q142 -298 118 -251T71 -146T35 -20T20 119Q20 175 31 231T69 340T138 443T247 535Q212 551 190 561T156 579Q142 587 135 592Q124 615 121 646T117 705Q117 719 117
731T121 754Q130 759 163 768Q192 776 248 788T405 818Q383 899 383 983Q383 1082 413 1176T497 1349T624 1490T784 1585Q812 1567 861 1522T991 1401Z" />
<glyph unicode="|" glyph-name="bar" horiz-adv-x="819" d="M551 1487Q550 1453 548 1378T543 1201T537 975T529 717T522 446T514 181T507 -60T502 -259T499 -397T498 -457H319Q319 -451 319 -394T318 -243T317 -26T316 234T314 515T313 797T312 1057T311 1273T310
1424T309 1487H551V1487Z" />
<glyph unicode="}" glyph-name="braceright" horiz-adv-x="848" d="M768 1202Q768 1143 755 1083T712 965T632 851T510 748Q555 730 584 719T633 699Q655 690 668 686Q668 664 664 637T654 586T641 542T629 514Q599 506 564 499Q534 493 494 486T408 473Q416 442
420 411T424 352Q424 248 385 148T284 -42T143 -204T-14 -326Q-31 -309 -43 -297T-64 -276T-81 -258T-98 -240Q-36 -195 19 -131T116 11T182 173T207 346Q207 411 194 473T154 596Q150 604 158 604Q193 606 218 606T274 607T348 609T464 613Q401 645 356 667T278
703Q241 720 215 731Q285 765 341 812T435 917T493 1038T514 1167Q514 1248 482 1326T381 1473Q453 1503 515 1528T643 1573Q666 1545 688 1506T728 1418T757 1315T768 1202Z" />
<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="717" d="M623 516Q605 503 582 486T534 454T482 429T430 418Q392 418 360 438T301 482T251 527T207 547Q184 547 163 534T123 502T89 466T63 436Q55 449 47 470T32 513T20 553T12 580Q33 604 55 624T99
660T143 685T188 694Q232 694 264 675T323 633T374 590T426 571Q447 571 466 581T502 606T530 634T549 657Q577 617 593 582T623 516Z" />
<glyph unicode="&#xa0;" glyph-name="nbspace" horiz-adv-x="461" />
<glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="672" d="M-193 -412Q-142 -285 -87 -156T24 94T131 326T229 526Q273 514 311 489T371 436Q339 358 307 263T238 41T155 -248T53 -623Q15 -607 -26 -577T-103 -515T-163 -455T-193 -412ZM555 784Q555
776 541 748T508 688T471 631T444 606Q436 606 409 618T351 645T296 675T272 696Q272 714 285 747T317 813T352 869T375 893Q385 893 402 886T440 869T480 845T517 820T544 798T555 784Z" />
<glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="737" d="M686 1145Q664 1082 629 995T550 805Q565 790 578 773T602 740T619 709T625 682Q621 667 603 650T560 616T504 585T445 562Q416 497 388 433T332 307Q398 321 463 351T578 416L618 350Q543 294
461 255T286 201Q238 92 202 7T147 -129Q127 -126 110 -118T74 -102L191 193H182Q164 193 141 204T94 235T48 281T10 336Q4 347 2 361T0 397Q0 454 17 510T65 619T138 716T231 794T339 847T456 868Q483 938 507 999T549 1107T578 1184T592 1223Q614 1212 637 1193T686
1145ZM197 371Q197 352 205 330T233 300L416 765Q394 752 369 727T320 668T273 597T234 519T207 441T197 371Z" />
<glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="1083" d="M836 633Q827 617 812 597T780 559T747 524T721 500L490 505Q467 459 445 415T399 330Q342 227 285 152Q300 150 314 150T342 150Q399 150 445 151T531 154T607 161T682 172T764 188T862
211Q811 144 771 94T702 8Q668 -32 641 -61Q583 -55 524 -44T406 -20T291 7T185 34Q114 -34 55 -60T-49 -86Q-74 -86 -101 -77T-154 -54T-198 -27T-227 -4Q-238 7 -238 29Q-238 56 -224 85T-187 139T-138 180T-88 197Q-53 197 -3 190T108 173Q139 230 176 312T265
510Q230 511 201 512T149 513T113 515T96 516Q98 535 106 563T127 616Q129 617 144 618T184 620T242 622T314 624Q358 726 402 826T492 1018T586 1188T688 1323T799 1413T922 1446Q953 1446 991 1425T1064 1373T1121 1306T1145 1239Q1145 1207 1139 1169T1121 1090T1087
1007T1036 924L879 1030Q903 1060 925 1093T964 1161T991 1228T1001 1292Q1001 1329 993 1338T975 1348Q952 1348 924 1319T862 1239T792 1119T716 970T635 803T551 627Q605 628 654 628T741 629T805 631T836 633ZM-109 2Q-62 2 -28 16T41 71Q6 80 -20 85T-63 90Q-72
90 -82 81T-100 60T-115 34T-123 14Q-123 8 -121 5T-109 2Z" />
<glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="1157" d="M942 1061Q951 1053 963 1040T990 1011T1020 978T1047 944L852 772Q878 738 891 698T905 621Q905 578 896 542T871 475T834 418T788 367L928 160Q916 148 898 137T862 115T826 98T799 86Q789
100 778 116T751 154T716 207T668 281Q621 258 575 246T481 233Q444 233 407 244T332 285L135 102Q123 112 109 130T81 167T56 203T39 231Q59 251 108 295T225 401Q213 423 208 453T203 508Q203 588 237 658T328 786L172 999Q181 1005 196 1014T230 1035T267 1059T305
1081L451 874Q486 893 526 903T612 913Q643 913 672 907T737 881Q787 926 841 970T942 1061ZM618 799Q563 799 515 773T432 704T377 609T356 502Q356 471 364 444T389 395T431 362T489 350Q540 350 587 372T669 433T726 525T748 643Q748 670 740 697T715 747T674
784T618 799Z" />
<glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="1085" d="M993 754Q989 736 983 716T968 675T952 638T938 612L690 608L627 547Q624 536 621 527T616 506L907 508Q903 490 897 470T882 429T866 393T852 367L582 362L475 -121Q438 -96 404 -75T341 -35T294
-1T270 29Q293 97 319 179T375 362Q317 361 265 361T172 362T106 364T78 367Q81 378 87 396T101 434T116 470T129 496Q133 497 158 498T221 501T310 504T416 506Q419 512 420 519T424 532L406 608Q357 608 315 608T240 608T187 609T164 612Q167 624 173 642T187
680T202 716T215 741Q221 743 265 745T375 750Q354 842 334 938T296 1125T264 1300T240 1452Q260 1442 286 1427T342 1393T400 1356T452 1321T492 1295T512 1282Q514 1245 517 1195T524 1088T532 972T542 857T551 753T561 670Q621 748 665 819T743 956T800 1084T844
1209T883 1333T924 1460Q945 1436 972 1400T1025 1324T1072 1249T1106 1192Q1034 1077 964 967T815 754H993V754Z" />
<glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="819" d="M520 1487Q519 1444 517 1387T512 1265T506 1132T501 997T495 871T491 764T488 686T487 645H309Q309 653 309 692T308 789T306 919T304 1067T302 1214T301 1344T300 1440T299 1487H520ZM520
442Q518 385 515 304T508 133T501 -47T494 -211T488 -336T487 -399H309Q309 -391 309 -352T308 -255T306 -125T304 22T302 169T301 299T300 395T299 442H520Z" />
<glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="872" d="M686 678Q692 625 680 575T643 481T579 403T493 346Q508 318 518 287T532 221Q539 148 517 83T450 -33T345 -116T213 -156Q190 -158 165 -144T117 -107T76 -62T47 -23Q38 -7 35 4T29 27Q27
49 25 75T22 130T28 192T45 262L201 182Q189 159 179 131T162 76T152 25T150 -12Q153 -32 163 -41T195 -49Q243 -45 275 -22T325 35T350 106T354 178Q351 213 336 244T299 307T253 371T206 441T168 520T145 614Q140 668 151 718T189 811T253 888T338 945Q323 974
313 1005T299 1071Q292 1144 314 1209T381 1326T486 1409T618 1448Q641 1450 666 1436T714 1399T755 1354T784 1315Q794 1299 797 1288T803 1266Q805 1243 807 1218T809 1163T803 1100T786 1030L631 1110Q643 1133 653 1161T669 1217T679 1268T682 1305Q679 1325
669 1334T637 1341Q589 1336 557 1313T506 1257T481 1186T477 1114Q481 1079 496 1048T533 985T578 921T625 851T663 772T686 678ZM498 668Q495 692 486 714T464 759T433 804T399 850Q361 825 343 769T334 625Q339 577 368 533T432 441Q470 467 488 523T498 668Z"
/>
<glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="717" d="M385 883Q385 877 373 853T346 802T315 754T293 733Q286 733 262 743T213 766T167 791T147 809Q147 824 158 852T185 907T214 955T233 975Q246 975 271 963T322 934T366 903T385 883ZM672
862Q672 856 660 832T633 782T602 734T580 713Q573 713 549 722T500 745T454 770T434 788Q434 803 445 831T472 886T501 934T520 954Q533 954 558 942T609 914T653 883T672 862Z" />
<glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="1843" d="M999 1464Q1090 1464 1178 1445T1345 1386T1490 1288T1605 1151T1681 976T1708 762Q1708 653 1678 549T1591 353T1457 184T1282 52T1075 -35T844 -66Q768 -66 686 -50T525 0T375 86T250
211T165 377T133 588Q133 736 169 858T269 1078T416 1248T597 1368T796 1440T999 1464ZM360 567Q360 439 397 342T501 180T660 82T864 49Q959 49 1042 82T1196 172T1320 304T1413 464T1471 637T1491 809Q1491 932 1456 1033T1354 1207T1194 1320T983 1360Q889 1360
807 1330T655 1245T531 1117T438 954T380 768T360 567ZM1006 809Q1021 824 1036 848T1062 901T1080 959T1087 1014Q1087 1039 1080 1053T1063 1067Q1036 1067 1006 1041T946 969T889 865T841 741T808 610T795 485Q795 442 798 415T808 372T823 350T842 344Q864
344 885 371T925 435T959 512T985 577Q987 575 1012 569T1069 554T1133 537T1180 522Q1165 493 1146 460T1105 394T1056 331T999 278T934 241T862 227Q841 227 810 235T746 257T684 289T639 328Q608 366 598 411T588 508Q588 564 600 635T636 781T696 927T780 1054T888
1144T1022 1178Q1050 1178 1089 1162T1164 1124T1228 1077T1262 1034Q1267 1019 1268 1004T1270 971Q1270 914 1248 857T1192 752L1006 809Z" />
<glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="719" d="M870 995Q843 972 812 950T751 910T695 881T651 870Q636 870 618 876T585 892T559 917T549 950Q549 958 549 968T549 993T555 1031T571 1087Q543 1057 505 1025T426 964T342 911T264 877Q260
874 252 874Q243 874 229 883T202 906T178 937T168 973Q168 977 173 1006T197 1080T254 1181T356 1296Q389 1326 428 1352Q461 1375 503 1397T590 1434Q592 1434 593 1435T598 1434Q607 1431 621 1424T649 1408T674 1391T688 1378Q689 1376 688 1375Q687 1374 686
1374Q648 1354 614 1330T553 1282Q522 1256 496 1229Q434 1167 411 1123T387 1059Q387 1053 389 1049T399 1044Q411 1044 429 1054T470 1081T520 1120T578 1167Q578 1167 594 1180T631 1215T676 1263T715 1315Q725 1309 737 1293T759 1259T777 1223T784 1196Q765
1156 754 1124T738 1066T731 1023T729 997Q729 991 735 991Q738 991 748 995T772 1005T800 1018T823 1032L870 995ZM692 786Q671 738 651 709T616 657Q603 656 564 656T471 656T359 655T248 655T159 655T111 655Q125 680 143 711T178 780Q183 779 221 779T313 780T429
781T547 783T643 784T692 786Z" />
<glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="950" d="M403 471Q366 451 324 430Q288 411 241 388T141 340Q179 308 219 279T294 228Q334 202 371 180Q361 161 349 141T323 101T297 64T274 35Q252 52 217 83T144 148T75 215T25 266Q33 300
43 344T74 434Q75 437 102 454T169 495T256 548T346 600T419 642T457 664Q453 641 447 614T433 560T417 510T403 471ZM780 471Q742 451 700 430Q664 411 617 388T518 340Q556 308 596 279T670 228Q710 202 748 180Q738 161 726 141T700 101T674 64T651 35Q636 46
615 64T570 104T521 149T473 194T431 235T401 266Q409 300 420 344T451 434Q452 437 479 454T546 495T633 548T723 600T796 642T834 664Q830 641 824 614T810 560T794 510T780 471Z" />
<glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="717" d="M664 721Q644 672 623 619T582 510T541 402T500 299Q489 302 472 305T437 313T402 320T375 326Q388 359 399 394T421 462T439 526T455 580Q415 580 371 580T282 580T197 579T124 579T71
578T45 578Q50 588 60 609T81 654T101 698T115 729Q124 729 163 729T257 729T375 728T496 728T598 727T659 727Q667 727 664 721Z" />
<glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="922" d="M672 522Q668 504 661 474T644 413T626 355T610 319Q598 319 557 319T459 318T340 316T223 315T132 316T88 319Q91 331 96 354T109 402T123 449T135 479Q143 482 183 486T281 496T404 505T527
513T624 519T672 522Z" />
<glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="1026" d="M651 1434Q726 1434 795 1410T919 1337T1005 1216T1038 1049Q1038 959 1001 877T901 733T751 633T565 596Q503 596 435 615T309 678T214 788T176 952Q176 1074 219 1164T331 1315T484 1404T651
1434ZM303 938Q303 871 324 822T383 741T471 692T580 676Q655 676 717 712T825 806T895 932T920 1067Q920 1131 900 1182T843 1271T755 1328T643 1348Q568 1348 506 1314T398 1224T328 1093T303 938ZM827 1182Q827 1124 790 1072T665 983Q687 931 710 887T750 815Q742
813 726 810T691 803T657 797T633 791Q630 799 624 818T611 864T595 922T580 987Q565 952 550 920T518 862T485 816T453 788Q450 786 444 784T430 782Q425 781 412 791T385 815T359 841T346 856Q338 872 340 886T344 907Q353 937 372 973T418 1047T478 1121T550
1187Q558 1217 561 1244T567 1292Q576 1289 588 1284T612 1272T636 1260T654 1249Q697 1266 739 1266Q748 1266 762 1256T791 1231T816 1203T827 1182ZM648 1177Q640 1146 627 1109T599 1032Q639 1050 664 1072T703 1116T722 1155T727 1182Q727 1210 717 1210Q705
1210 688 1201T648 1177ZM410 879Q420 879 432 893T458 931T484 986T510 1053Q488 1029 469 1005T435 959T412 918T403 886Q403 884 404 882T410 879Z" />
<glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="717" d="M659 909Q638 861 618 832T584 780Q571 779 537 779T460 779T367 778T276 778T202 778T160 778Q174 803 192 834T227 903Q232 903 264 903T341 903T438 904T536 906T616 907T659 909Z" />
<glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="512" d="M764 1212Q764 1147 734 1088T655 985T547 915T428 889Q396 889 359 906T289 951T235 1014T213 1087Q213 1151 237 1213T304 1324T408 1403T541 1434Q571 1434 609 1415T682 1364T740 1293T764
1212ZM598 1335Q566 1335 532 1309T469 1242T422 1149T403 1044Q403 1027 407 1018T432 1008Q466 1008 501 1030T566 1091T614 1178T633 1282Q633 1308 623 1321T598 1335Z" />
<glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="717" d="M487 793Q472 752 456 711T421 628Q460 631 494 633T556 637T600 640T623 641Q615 618 607 594T590 549T574 509T561 479Q552 479 532 479T484 479T422 479T350 478Q317 410 283 350T217
242Q195 248 165 255T115 268Q129 297 148 351T191 476L0 475Q5 486 13 504T31 541T47 578T59 606Q70 606 119 608T235 616Q255 682 273 750T307 883Q322 878 348 866T401 840T452 813T487 793ZM500 190Q492 167 484 144T467 98T451 58T438 29Q424 29 379 29T274
28T147 27T23 26T-75 26T-123 25Q-118 35 -110 53T-92 90T-75 128T-63 156Q-56 156 -29 157T37 161T124 167T222 173T319 179T405 184T469 188T500 190Z" />
<glyph unicode="&#xb2;" glyph-name="twosuperior" horiz-adv-x="774" d="M911 1284Q914 1279 916 1267T918 1245Q918 1161 886 1084T778 930T572 774T250 605Q323 616 398 631T535 661T639 686T690 696Q692 696 692 694Q692 689 677 667T640 615T595 557T557
508Q533 507 496 506T414 505T322 503T227 502T137 500T61 498Q55 504 47 516T32 542T18 570T8 596Q232 689 377 786T607 977T725 1158T758 1321Q758 1332 753 1345T733 1358Q704 1358 664 1340T581 1292T494 1226T418 1153T364 1084T344 1030Q344 1020 348 1020Q355
1020 374 1032T416 1064T465 1111T512 1165Q521 1158 535 1146T563 1120T589 1094T606 1077Q585 1052 550 1028T476 984T397 954T328 942Q318 942 297 955T255 986T219 1019T203 1040Q203 1087 226 1134T288 1226T379 1308T490 1374T611 1418T731 1434Q751 1432
779 1413T835 1368T884 1319T911 1284Z" />
<glyph unicode="&#xb3;" glyph-name="threesuperior" horiz-adv-x="682" d="M881 1280Q887 1268 887 1251Q887 1182 853 1131T764 1041T642 976T511 930Q563 913 595 904T646 889Q667 883 678 881Q688 876 688 866Q688 847 666 812T606 736T515 650T401 566T272
496T135 451Q131 454 121 465T96 493T66 527T36 561T11 591T-4 610Q28 610 72 616T166 634T269 664T371 707T462 762T534 830Q486 844 459 852T419 865Q404 870 401 872Q396 875 387 890T368 923T351 957T344 979Q444 979 517 1015T637 1104T706 1216T729 1323Q729
1334 724 1343T705 1352Q686 1352 654 1342T586 1314T514 1274T448 1228T400 1184T381 1145Q381 1140 383 1140T391 1139Q405 1139 423 1148T462 1172T501 1203T537 1237Q544 1232 555 1223T577 1204T598 1184T616 1167Q591 1144 560 1126T495 1094T429 1074T367
1067H330Q319 1068 303 1080T272 1106T247 1135T236 1155Q236 1189 257 1222T315 1287T398 1345T497 1391T602 1422T702 1434Q715 1432 741 1415T795 1373T847 1324T881 1280Z" />
<glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="717" d="M541 930Q485 861 420 799T289 684Q284 687 274 695T252 713T231 731T217 745Q242 776 273 818T333 901T385 977T418 1030Q439 1020 458 1005T494 974T523 947T541 930Z" />
<glyph unicode="&#xb5;" glyph-name="micro" horiz-adv-x="788" d="M686 123Q647 91 606 60T525 3T452 -37T395 -53Q378 -53 357 -43T318 -16T287 21T274 59Q274 75 285 118T313 219Q236 99 184 37T106 -45Q98 -50 88 -52T68 -55Q59 -55 50 -49T33 -31T18 -5T8
25Q-34 -109 -63 -221T-119 -414L-338 -473Q-287 -329 -240 -197T-145 64T-49 326T57 602Q59 607 60 607T66 606Q84 603 113 592T171 568T221 541T246 522Q242 515 231 489T204 425T173 345T143 262T120 190T111 143Q111 139 115 139Q123 139 149 160T216 227T305
345T410 518Q419 549 427 570T438 600Q441 608 451 608Q458 608 481 595T531 564T579 529T602 504Q602 501 601 494T598 481Q588 454 575 418T549 342T522 262T499 188T482 127T475 88Q475 82 481 82Q490 82 506 90T544 113T590 145T641 184L686 123Z" />
<glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="1331" d="M1118 1348Q1096 1346 1075 1344T1033 1338Q1016 1261 994 1166T947 967T895 753T840 536T788 328T741 141T703 -12T676 -121Q644 -119 615 -109T563 -90Q570 -62 586 9T626 183T678 410T735
672Q674 649 603 636T463 623Q399 623 351 635T267 666T207 711T169 762T149 813T143 860Q143 935 185 1007T303 1143T482 1262T709 1355T970 1416T1251 1438H1300Q1285 1362 1263 1265T1215 1057T1159 828T1101 594T1045 368T993 164T951 -4T922 -121Q890 -119
861 -109T809 -90Q814 -68 826 -17T855 109T893 276T936 473T983 690T1031 916T1077 1138T1118 1348ZM475 866Q475 809 501 784T570 755T663 763T762 796Q789 926 815 1053T864 1299Q770 1268 698 1223T576 1121T501 1000T475 866Z" />
<glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="512" d="M336 535Q336 530 330 515T313 479T289 438T264 398T242 368T225 356Q217 356 190 368T132 395T77 425T53 446Q53 465 66 498T98 563T133 619T156 643Q166 643 183 636T221 619T261 595T298
570T325 549T336 535Z" />
<glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="717" d="M301 -176Q301 -208 289 -244T246 -313T160 -371T20 -408Q13 -400 7 -385T-4 -351T-14 -317T-23 -289Q3 -286 39 -279T109 -260T165 -231T188 -188Q188 -187 187 -183T180 -174T166 -166T141
-162Q119 -162 101 -164T70 -167T50 -169T43 -166Q52 -145 64 -119T89 -67T111 -16T129 29H211L150 -109Q168 -104 182 -101T221 -98Q232 -98 245 -105T269 -123T290 -148T301 -176Z" />
<glyph unicode="&#xb9;" glyph-name="onesuperior" horiz-adv-x="442" d="M645 1305Q637 1285 615 1241T561 1139T491 1011T414 869T336 728T264 601T206 499T170 436Q164 440 146 451T108 474T70 497T45 512Q108 617 160 718T257 916T339 1101T411 1271Q389 1258
368 1246T329 1224T298 1208T279 1198Q275 1200 266 1210T247 1231T230 1252T223 1264Q231 1268 261 1283T330 1321T413 1373T492 1434Q507 1422 531 1402T578 1362T621 1325T645 1305Z" />
<glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="571" d="M371 1006Q371 981 389 981Q403 981 425 999T473 1047T523 1115T569 1192T603 1269T616 1337Q616 1346 625 1348Q634 1338 648 1321T675 1285T700 1251T713 1229Q713 1187 696 1144T651
1062T585 988T506 928T424 887T346 872Q321 872 294 887T245 925T208 973T193 1018Q193 1083 210 1147T265 1267T359 1365T496 1430Q498 1432 504 1433T514 1434Q526 1434 539 1425T564 1405T584 1383T592 1368Q590 1364 579 1358T549 1336T505 1292T449 1217Q402
1147 387 1092T371 1006ZM578 786Q556 738 536 709T502 657Q489 656 456 656T378 656T286 655T194 655T120 655T78 655Q92 680 110 711T145 780Q150 779 182 779T259 780T356 781T454 783T535 784T578 786Z" />
<glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="950" d="M451 227Q488 247 530 268Q566 286 613 309T713 356Q675 389 635 418T560 470Q520 496 483 518Q493 537 505 557T531 597T558 634T582 664Q603 647 638 615T710 549T779 482T829 432Q821
398 811 354T780 264Q779 261 753 244T686 203T598 150T509 98T435 56T397 35Q402 58 408 85T422 138T437 188T451 227ZM74 227Q112 247 154 268Q190 286 237 309T336 356Q298 389 258 418T183 470Q143 496 106 518Q116 537 128 557T154 597T181 634T205 664Q219
653 240 635T284 594T333 549T381 503T423 463T453 432Q445 398 434 354T403 264Q402 261 376 244T309 203T221 150T132 98T58 56T20 35Q25 58 31 85T45 138T60 188T74 227Z" />
<glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="1495" d="M1073 1452Q1083 1445 1098 1434T1132 1410T1169 1381T1204 1352Q1162 1292 1098 1204T955 1011T788 790T612 557T440 330T285 127T161 -36T80 -141Q51 -126 28 -107T-10 -70Q4 -51 46
6T149 147T286 338T447 562T618 801T787 1040T943 1262T1073 1452ZM1057 569Q1025 526 996 490T933 421T860 356T768 286Q868 291 971 301Q994 355 1015 410T1056 524T1097 645T1139 776Q1152 764 1174 746T1221 708T1269 668T1307 633Q1275 561 1236 483T1154
323Q1196 328 1237 334T1321 348L1229 205L1088 202Q1040 114 994 34T907 -117Q899 -112 883 -104T849 -86T817 -69T799 -57Q835 12 866 74T927 199Q867 198 816 198T727 197Q715 206 700 225T671 264T647 302T633 326Q735 411 821 515T967 727Q970 733 973 733Q980
733 994 712T1022 662T1046 607T1057 569ZM625 1317Q617 1299 597 1260T549 1167T486 1052T417 925T346 798T282 683T230 591T197 535Q191 539 175 548T141 569T107 590T84 604Q141 698 188 790T276 968T350 1134T414 1287Q394 1275 375 1265T340 1245T312 1230T295
1221Q291 1223 283 1232T266 1251T251 1269T244 1280Q251 1284 278 1297T340 1332T415 1379T485 1434Q499 1423 520 1405T564 1369T603 1336T625 1317Z" />
<glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="1520" d="M1370 641Q1373 636 1374 625T1376 606Q1376 529 1348 460T1250 321T1066 181T779 28Q845 38 911 52T1033 80T1126 102T1171 111Q1174 111 1174 109Q1174 103 1160 83T1126 36T1085 -16T1051
-59Q1018 -61 961 -62T838 -64T710 -67T602 -70Q597 -64 590 -53T576 -30T563 -4T555 18Q690 74 793 132T971 249T1097 364T1177 475T1220 579T1233 674Q1233 685 1228 696T1210 707Q1184 707 1148 691T1072 648T994 588T925 522T876 460T858 412Q858 401 862 401Q868
401 885 412T924 441T969 484T1010 535Q1017 528 1030 516T1056 492T1080 469T1096 455Q1076 432 1044 410T976 370T905 343T844 332Q835 332 816 344T778 372T745 402T731 420Q731 463 751 506T807 588T890 662T991 722T1099 761T1208 776Q1226 774 1251 757T1302
718T1346 673T1370 641ZM1073 1452Q1083 1445 1098 1434T1132 1410T1169 1381T1204 1352Q1162 1292 1098 1204T955 1011T788 790T612 557T440 330T285 127T161 -36T80 -141Q51 -126 28 -107T-10 -70Q4 -51 46 6T149 147T286 338T447 562T618 801T787 1040T943 1262T1073
1452ZM625 1317Q617 1299 597 1260T549 1167T486 1052T417 925T346 798T282 683T230 591T197 535Q191 539 175 548T141 569T107 590T84 604Q141 698 188 790T276 968T350 1134T414 1287Q394 1275 375 1265T340 1245T312 1230T295 1221Q291 1223 283 1232T266 1251T251
1269T244 1280Q251 1284 278 1297T340 1332T415 1379T485 1434Q499 1423 520 1405T564 1369T603 1336T625 1317Z" />
<glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="1686" d="M1264 1452Q1274 1445 1289 1434T1323 1410T1360 1381T1395 1352Q1353 1292 1289 1204T1145 1011T979 790T803 557T630 330T475 127T351 -36T270 -141Q241 -126 219 -107T180 -70Q194
-51 236 6T339 147T477 338T638 562T809 801T978 1040T1134 1262T1264 1452ZM1247 569Q1215 526 1186 490T1123 421T1050 356T958 286Q1057 290 1162 301Q1208 409 1247 524T1329 776Q1342 764 1364 746T1411 708T1459 668T1497 633Q1465 561 1426 483T1344 323Q1386
329 1427 335T1511 348L1419 205L1279 202Q1231 114 1185 34T1098 -117Q1089 -112 1073 -104T1039 -86T1007 -69T989 -57Q1026 12 1057 74T1117 199Q1057 198 1006 198T918 197Q906 206 891 225T862 264T837 302T823 326Q925 411 1011 515T1157 727Q1160 733 1163
733Q1171 733 1185 712T1213 662T1237 607T1247 569ZM846 1296Q852 1284 852 1270Q852 1207 821 1161T741 1080T632 1023T513 982Q560 967 589 959T635 945Q654 940 664 938Q674 933 674 924Q674 906 655 875T600 807T518 730T416 654T299 591T176 551Q171 555
153 575T114 619T75 664T51 694Q94 694 160 706T296 743T431 805T535 892Q491 904 467 911T432 923Q419 927 416 930Q411 932 403 945T386 975T371 1006T365 1026Q455 1026 520 1058T628 1138T691 1239T711 1335Q711 1345 706 1352T688 1360Q670 1360 642 1351T582
1326T516 1290T457 1250T414 1209T397 1174Q397 1169 408 1169Q420 1169 436 1177T470 1199T505 1227T537 1257Q544 1252 553 1244T573 1226T592 1209T608 1194Q563 1152 497 1128T352 1104Q342 1105 328 1116T300 1140T276 1165T266 1184Q266 1214 285 1244T337
1302T413 1354T502 1396T596 1424T686 1434Q698 1432 721 1417T770 1379T816 1334T846 1296Z" />
<glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="1110" d="M-160 -328Q-169 -314 -172 -298T-176 -268Q-176 -213 -150 -153T-78 -33T33 84T173 192T334 283T509 350Q532 392 551 428T586 492Q604 524 618 551Q633 547 655 538T699 518T740 496T770
475Q762 455 753 431T734 380T715 326T696 274Q614 263 533 229T379 146T244 36T135 -89T63 -218T37 -340Q37 -370 41 -389T55 -419T76 -434T104 -438Q132 -438 182 -425T294 -377T421 -281T547 -123Q553 -123 572 -133T615 -158T666 -192T716 -228T757 -260T778
-281Q769 -292 740 -319T665 -380T559 -451T427 -518T274 -568T106 -586Q86 -586 62 -571T11 -533T-41 -480T-90 -422T-131 -368T-160 -328ZM930 782Q930 774 916 746T883 686T846 629T819 604Q811 604 784 616T726 643T671 673T647 694Q647 712 660 745T692 811T727
867T750 891Q760 891 777 884T815 867T855 843T892 818T919 796T930 782Z" />
<glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="1231" d="M1292 1278Q1292 1231 1273 1174T1222 1056T1149 934T1064 819Q1090 793 1111 772T1141 743Q1127 719 1103 673T1051 567T995 442T943 313T906 193T891 98Q891 48 904 5T944 -70T1010 -124T1102
-152L1053 -217Q1041 -217 1016 -212T960 -193T895 -156T831 -98T778 -13T746 104Q698 54 643 5T528 -83T409 -146T291 -170Q258 -170 224 -152T156 -105T92 -36T38 44T-1 127T-20 203Q-20 216 -20 234T-18 273T-16 312T-12 346Q3 435 36 534T116 735T224 938T354
1131T502 1301T662 1437T830 1528T1001 1561Q1030 1561 1063 1546T1128 1507T1190 1453T1242 1391T1278 1330T1292 1278ZM250 4Q269 4 305 26T390 89T496 190T611 325T725 491T831 685L713 803Q730 821 766 851T846 922T936 1013T1021 1122T1085 1245T1110 1380Q1110
1419 1095 1439T1067 1460Q1008 1460 939 1418T796 1303T650 1133T509 926T383 700T281 473T213 262T188 86Q188 4 250 4ZM1188 1682Q1165 1671 1145 1665T1096 1651Q1081 1677 1063 1710T1025 1781T986 1863T951 1952Q1002 1971 1043 1981T1104 1995L1188 1682V1682Z"
/>
<glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="1231" d="M1292 1278Q1292 1231 1273 1174T1222 1056T1149 934T1064 819Q1090 793 1111 772T1141 743Q1127 719 1103 673T1051 567T995 442T943 313T906 193T891 98Q891 48 904 5T944 -70T1010 -124T1102
-152L1053 -217Q1041 -217 1016 -212T960 -193T895 -156T831 -98T778 -13T746 104Q698 54 643 5T528 -83T409 -146T291 -170Q258 -170 224 -152T156 -105T92 -36T38 44T-1 127T-20 203Q-20 216 -20 234T-18 273T-16 312T-12 346Q3 435 36 534T116 735T224 938T354
1131T502 1301T662 1437T830 1528T1001 1561Q1030 1561 1063 1546T1128 1507T1190 1453T1242 1391T1278 1330T1292 1278ZM250 4Q269 4 305 26T390 89T496 190T611 325T725 491T831 685L713 803Q730 821 766 851T846 922T936 1013T1021 1122T1085 1245T1110 1380Q1110
1419 1095 1439T1067 1460Q1008 1460 939 1418T796 1303T650 1133T509 926T383 700T281 473T213 262T188 86Q188 4 250 4ZM1346 1897Q1290 1828 1225 1766T1094 1651Q1089 1654 1079 1662T1057 1680T1036 1698T1022 1712Q1047 1743 1078 1785T1138 1868T1190 1944T1223
1997Q1244 1987 1263 1972T1299 1941T1328 1914T1346 1897Z" />
<glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="1231" d="M1292 1278Q1292 1231 1273 1174T1222 1056T1149 934T1064 819Q1090 793 1111 772T1141 743Q1127 719 1103 673T1051 567T995 442T943 313T906 193T891 98Q891 48 904 5T944 -70T1010
-124T1102 -152L1053 -217Q1041 -217 1016 -212T960 -193T895 -156T831 -98T778 -13T746 104Q698 54 643 5T528 -83T409 -146T291 -170Q258 -170 224 -152T156 -105T92 -36T38 44T-1 127T-20 203Q-20 216 -20 234T-18 273T-16 312T-12 346Q3 435 36 534T116 735T224
938T354 1131T502 1301T662 1437T830 1528T1001 1561Q1030 1561 1063 1546T1128 1507T1190 1453T1242 1391T1278 1330T1292 1278ZM250 4Q269 4 305 26T390 89T496 190T611 325T725 491T831 685L713 803Q730 821 766 851T846 922T936 1013T1021 1122T1085 1245T1110
1380Q1110 1419 1095 1439T1067 1460Q1008 1460 939 1418T796 1303T650 1133T509 926T383 700T281 473T213 262T188 86Q188 4 250 4ZM1307 1669Q1281 1664 1254 1660T1196 1651Q1182 1689 1167 1737T1141 1839Q1090 1795 1040 1754T924 1661Q913 1677 901 1688T871
1719Q905 1750 942 1785T1014 1856T1081 1923T1139 1981Q1184 1975 1214 1963T1270 1936Q1273 1908 1277 1871T1287 1797T1297 1725T1307 1669Z" />
<glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="1231" d="M1292 1278Q1292 1231 1273 1174T1222 1056T1149 934T1064 819Q1090 793 1111 772T1141 743Q1127 719 1103 673T1051 567T995 442T943 313T906 193T891 98Q891 48 904 5T944 -70T1010 -124T1102
-152L1053 -217Q1041 -217 1016 -212T960 -193T895 -156T831 -98T778 -13T746 104Q698 54 643 5T528 -83T409 -146T291 -170Q258 -170 224 -152T156 -105T92 -36T38 44T-1 127T-20 203Q-20 216 -20 234T-18 273T-16 312T-12 346Q3 435 36 534T116 735T224 938T354
1131T502 1301T662 1437T830 1528T1001 1561Q1030 1561 1063 1546T1128 1507T1190 1453T1242 1391T1278 1330T1292 1278ZM250 4Q269 4 305 26T390 89T496 190T611 325T725 491T831 685L713 803Q730 821 766 851T846 922T936 1013T1021 1122T1085 1245T1110 1380Q1110
1419 1095 1439T1067 1460Q1008 1460 939 1418T796 1303T650 1133T509 926T383 700T281 473T213 262T188 86Q188 4 250 4ZM1246 1823Q1262 1823 1278 1830T1308 1848T1336 1874T1360 1903Q1379 1894 1394 1882T1430 1858Q1414 1833 1391 1803T1338 1747T1270 1704T1188
1686Q1171 1686 1149 1703T1103 1741T1058 1779T1022 1798Q1011 1798 996 1791T963 1771T930 1743T899 1710Q873 1727 860 1739T830 1764Q849 1787 876 1816T935 1872T1003 1916T1078 1934Q1094 1934 1116 1917T1162 1879T1207 1841T1246 1823Z" />
<glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="1231" d="M1292 1278Q1292 1231 1273 1174T1222 1056T1149 934T1064 819Q1090 793 1111 772T1141 743Q1127 719 1103 673T1051 567T995 442T943 313T906 193T891 98Q891 48 904 5T944 -70T1010 -124T1102
-152L1053 -217Q1041 -217 1016 -212T960 -193T895 -156T831 -98T778 -13T746 104Q698 54 643 5T528 -83T409 -146T291 -170Q258 -170 224 -152T156 -105T92 -36T38 44T-1 127T-20 203Q-20 216 -20 234T-18 273T-16 312T-12 346Q3 435 36 534T116 735T224 938T354
1131T502 1301T662 1437T830 1528T1001 1561Q1030 1561 1063 1546T1128 1507T1190 1453T1242 1391T1278 1330T1292 1278ZM250 4Q269 4 305 26T390 89T496 190T611 325T725 491T831 685L713 803Q730 821 766 851T846 922T936 1013T1021 1122T1085 1245T1110 1380Q1110
1419 1095 1439T1067 1460Q1008 1460 939 1418T796 1303T650 1133T509 926T383 700T281 473T213 262T188 86Q188 4 250 4ZM1096 1850Q1096 1844 1084 1820T1057 1769T1026 1721T1004 1700Q997 1700 973 1710T924 1733T878 1758T858 1776Q858 1791 869 1819T896
1874T925 1922T944 1942Q957 1942 982 1930T1033 1901T1077 1870T1096 1850ZM1383 1829Q1383 1823 1371 1799T1344 1749T1313 1701T1291 1680Q1284 1680 1260 1689T1211 1712T1165 1737T1145 1755Q1145 1770 1156 1798T1183 1853T1212 1901T1231 1921Q1244 1921
1269 1909T1320 1881T1364 1850T1383 1829Z" />
<glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="1231" d="M1292 1278Q1292 1231 1273 1174T1222 1056T1149 934T1064 819Q1090 793 1111 772T1141 743Q1127 719 1103 673T1051 567T995 442T943 313T906 193T891 98Q891 48 904 5T944 -70T1010 -124T1102
-152L1053 -217Q1041 -217 1016 -212T960 -193T895 -156T831 -98T778 -13T746 104Q698 54 643 5T528 -83T409 -146T291 -170Q258 -170 224 -152T156 -105T92 -36T38 44T-1 127T-20 203Q-20 216 -20 234T-18 273T-16 312T-12 346Q3 435 36 534T116 735T224 938T354
1131T502 1301T662 1437T830 1528T1001 1561Q1030 1561 1063 1546T1128 1507T1190 1453T1242 1391T1278 1330T1292 1278ZM250 4Q269 4 305 26T390 89T496 190T611 325T725 491T831 685L713 803Q730 821 766 851T846 922T936 1013T1021 1122T1085 1245T1110 1380Q1110
1419 1095 1439T1067 1460Q1008 1460 939 1418T796 1303T650 1133T509 926T383 700T281 473T213 262T188 86Q188 4 250 4ZM1288 1850Q1288 1805 1267 1766T1213 1696T1139 1649T1057 1631Q1035 1631 1010 1642T962 1673T926 1716T911 1766Q911 1809 927 1851T974
1926T1045 1980T1135 2001Q1156 2001 1182 1988T1232 1954T1272 1905T1288 1850ZM1174 1934Q1152 1934 1129 1917T1086 1871T1053 1808T1040 1737Q1040 1725 1043 1718T1061 1710Q1084 1710 1108 1725T1151 1767T1183 1827T1196 1899Q1196 1934 1174 1934Z" />
<glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="1845" d="M1561 973Q1599 1004 1635 1050T1699 1147T1744 1251T1761 1350Q1761 1387 1743 1412T1679 1438Q1641 1438 1594 1420T1499 1371T1406 1296T1325 1201T1269 1094T1247 981Q1247 932 1259 897T1293
834T1349 783T1423 735Q1297 682 1192 605T1011 437T893 252T850 68Q850 37 864 14T911 -10Q953 -10 1005 13T1114 73T1226 156T1332 248T1421 337T1483 408Q1543 360 1587 323T1669 254Q1652 231 1613 190T1519 102T1400 7T1269 -81T1137 -145T1018 -170Q967 -170
918 -152T824 -105T744 -37T682 41Q638 0 590 -38T491 -106T390 -152T291 -170Q258 -170 224 -152T156 -105T92 -36T38 44T-1 127T-20 203Q-20 216 -20 234T-18 273T-16 312T-12 346Q3 435 36 534T116 735T224 938T354 1131T502 1301T662 1437T830 1528T1001 1561Q1037
1561 1079 1539T1159 1482Q1170 1517 1180 1551T1200 1618Q1215 1607 1234 1594T1275 1566T1319 1536T1361 1504Q1417 1531 1473 1546T1583 1561Q1687 1561 1726 1540Q1760 1522 1800 1488T1874 1414T1931 1332T1954 1257Q1954 1200 1935 1138T1885 1018T1814 908T1733
821L1561 973ZM721 481Q786 587 887 669T1112 810Q1094 828 1077 849T1046 896T1024 956T1016 1030Q1016 1093 1035 1152T1089 1265Q1092 1273 1095 1281T1100 1298Q1105 1318 1107 1338T1110 1380Q1110 1419 1095 1439T1067 1460Q1008 1460 939 1418T796 1303T650
1133T509 926T383 700T281 473T213 262T188 86Q188 4 250 4Q273 4 323 37T439 132T578 282T721 481Z" />
<glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="1120" d="M455 -322Q455 -354 443 -390T399 -458T313 -516T174 -553Q167 -545 161 -530T150 -497T140 -462T131 -434Q157 -431 193 -424T263 -405T319 -376T342 -334Q342 -333 341 -329T334 -319T320
-311T295 -307Q250 -307 224 -313T197 -311Q211 -277 231 -235T266 -156Q232 -141 197 -115T129 -55T68 16T20 88Q-10 144 -15 191T-20 266Q-20 343 2 440T65 642T164 857T292 1068T445 1260T618 1417T805 1522T1001 1561Q1029 1561 1060 1547T1121 1509T1179 1454T1228
1391T1261 1326T1274 1266Q1274 1206 1250 1134T1185 988T1088 844T967 719L786 893Q816 912 849 941T916 1008T981 1089T1035 1177T1073 1266T1087 1352Q1087 1383 1082 1402T1069 1431T1049 1446T1026 1450Q978 1450 917 1410T789 1300T651 1137T514 938T390
718T288 495T219 285T193 104Q193 74 197 55T210 24T232 8T262 4Q291 4 330 28T414 92T504 179T590 273T662 359T711 422Q711 421 735 401T793 353T859 297T909 250Q885 223 849 182T767 95T669 3T561 -80T450 -142T340 -168L303 -254Q322 -249 336 -247T375 -244Q385
-244 398 -251T423 -269T444 -294T455 -322Z" />
<glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="1126" d="M842 973Q880 1004 916 1050T980 1147T1025 1251T1042 1350Q1042 1387 1025 1412T961 1438Q922 1438 875 1420T780 1371T687 1296T606 1201T550 1094T528 981Q528 932 540 897T575 834T630
783T705 735Q579 682 474 605T292 437T174 252T131 68Q131 37 146 14T193 -10Q235 -10 287 13T395 73T507 156T613 248T702 337T764 408Q824 360 868 323T950 254Q933 231 894 190T800 102T681 7T550 -81T418 -145T299 -170Q252 -170 206 -154T117 -112T40 -51T-22
21T-65 95T-82 164V188Q-82 293 -45 386T56 557T207 699T393 810Q375 828 358 849T327 896T305 956T297 1030Q297 1100 322 1167T389 1293T487 1401T607 1485T736 1541T864 1561Q967 1561 1008 1540Q1042 1522 1081 1488T1155 1414T1212 1332T1235 1257Q1235 1200
1216 1138T1166 1018T1095 908T1014 821L842 973ZM1040 1682Q1017 1671 997 1665T948 1651Q933 1677 915 1710T877 1781T838 1863T803 1952Q854 1971 895 1981T956 1995L1040 1682V1682Z" />
<glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="1126" d="M842 973Q880 1004 916 1050T980 1147T1025 1251T1042 1350Q1042 1387 1025 1412T961 1438Q922 1438 875 1420T780 1371T687 1296T606 1201T550 1094T528 981Q528 932 540 897T575 834T630
783T705 735Q579 682 474 605T292 437T174 252T131 68Q131 37 146 14T193 -10Q235 -10 287 13T395 73T507 156T613 248T702 337T764 408Q824 360 868 323T950 254Q933 231 894 190T800 102T681 7T550 -81T418 -145T299 -170Q252 -170 206 -154T117 -112T40 -51T-22
21T-65 95T-82 164V188Q-82 293 -45 386T56 557T207 699T393 810Q375 828 358 849T327 896T305 956T297 1030Q297 1100 322 1167T389 1293T487 1401T607 1485T736 1541T864 1561Q967 1561 1008 1540Q1042 1522 1081 1488T1155 1414T1212 1332T1235 1257Q1235 1200
1216 1138T1166 1018T1095 908T1014 821L842 973ZM1198 1897Q1142 1828 1077 1766T946 1651Q941 1654 931 1662T909 1680T888 1698T874 1712Q899 1743 930 1785T990 1868T1042 1944T1075 1997Q1096 1987 1115 1972T1151 1941T1180 1914T1198 1897Z" />
<glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="1126" d="M842 973Q880 1004 916 1050T980 1147T1025 1251T1042 1350Q1042 1387 1025 1412T961 1438Q922 1438 875 1420T780 1371T687 1296T606 1201T550 1094T528 981Q528 932 540 897T575 834T630
783T705 735Q579 682 474 605T292 437T174 252T131 68Q131 37 146 14T193 -10Q235 -10 287 13T395 73T507 156T613 248T702 337T764 408Q824 360 868 323T950 254Q933 231 894 190T800 102T681 7T550 -81T418 -145T299 -170Q252 -170 206 -154T117 -112T40 -51T-22
21T-65 95T-82 164V188Q-82 293 -45 386T56 557T207 699T393 810Q375 828 358 849T327 896T305 956T297 1030Q297 1100 322 1167T389 1293T487 1401T607 1485T736 1541T864 1561Q967 1561 1008 1540Q1042 1522 1081 1488T1155 1414T1212 1332T1235 1257Q1235 1200
1216 1138T1166 1018T1095 908T1014 821L842 973ZM1159 1669Q1133 1664 1106 1660T1048 1651Q1034 1689 1019 1737T993 1839Q942 1795 892 1754T776 1661Q765 1677 753 1688T723 1719Q757 1750 794 1785T866 1856T933 1923T991 1981Q1036 1975 1066 1963T1122 1936Q1125
1908 1129 1871T1139 1797T1149 1725T1159 1669Z" />
<glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="1126" d="M842 973Q880 1004 916 1050T980 1147T1025 1251T1042 1350Q1042 1387 1025 1412T961 1438Q922 1438 875 1420T780 1371T687 1296T606 1201T550 1094T528 981Q528 932 540 897T575 834T630
783T705 735Q579 682 474 605T292 437T174 252T131 68Q131 37 146 14T193 -10Q235 -10 287 13T395 73T507 156T613 248T702 337T764 408Q824 360 868 323T950 254Q933 231 894 190T800 102T681 7T550 -81T418 -145T299 -170Q252 -170 206 -154T117 -112T40 -51T-22
21T-65 95T-82 164V188Q-82 293 -45 386T56 557T207 699T393 810Q375 828 358 849T327 896T305 956T297 1030Q297 1100 322 1167T389 1293T487 1401T607 1485T736 1541T864 1561Q967 1561 1008 1540Q1042 1522 1081 1488T1155 1414T1212 1332T1235 1257Q1235 1200
1216 1138T1166 1018T1095 908T1014 821L842 973ZM948 1850Q948 1844 936 1820T909 1769T878 1721T856 1700Q849 1700 825 1710T776 1733T730 1758T710 1776Q710 1791 721 1819T748 1874T777 1922T796 1942Q809 1942 834 1930T885 1901T929 1870T948 1850ZM1235
1829Q1235 1823 1223 1799T1196 1749T1165 1701T1143 1680Q1136 1680 1112 1689T1063 1712T1017 1737T997 1755Q997 1770 1008 1798T1035 1853T1064 1901T1083 1921Q1096 1921 1121 1909T1172 1881T1216 1850T1235 1829Z" />
<glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="1018" d="M1128 1384Q1133 1373 1137 1356T1141 1313Q1141 1251 1123 1175T1073 1012T995 832T894 644T775 456T642 275Q685 223 733 178T836 98Q803 73 774 59Q735 76 685 112T580 200Q463 63 346 -37T113
-186Q99 -192 78 -196T22 -201Q-6 -201 -36 -180T-93 -130T-142 -72T-176 -25Q-189 -6 -197 22T-205 92Q-205 143 -194 196T-154 317Q-142 322 -112 331T-45 351T28 370T88 383Q58 338 32 297T-12 214T-42 129T-53 37Q-53 17 -46 -1T-18 -20Q13 -20 60 11T164 97T287
227T420 389Q382 443 350 503T295 629T258 764T244 905Q244 1011 277 1101T366 1264T493 1394T641 1488T791 1545T928 1565Q962 1565 979 1552Q996 1541 1019 1519T1064 1471T1104 1423T1128 1384ZM420 797Q420 730 441 653T500 497Q560 580 617 667T726 842T821
1013T896 1172T945 1312T963 1425Q963 1438 958 1441T944 1444Q930 1444 886 1428T783 1377T661 1290T544 1165T455 1001T420 797ZM1075 1682Q1052 1671 1032 1665T983 1651Q968 1677 950 1710T912 1781T873 1863T838 1952Q889 1971 930 1981T991 1995L1075 1682V1682Z"
/>
<glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="1018" d="M1128 1384Q1133 1373 1137 1356T1141 1313Q1141 1251 1123 1175T1073 1012T995 832T894 644T775 456T642 275Q685 223 733 178T836 98Q803 73 774 59Q735 76 685 112T580 200Q463 63 346 -37T113
-186Q99 -192 78 -196T22 -201Q-6 -201 -36 -180T-93 -130T-142 -72T-176 -25Q-189 -6 -197 22T-205 92Q-205 143 -194 196T-154 317Q-142 322 -112 331T-45 351T28 370T88 383Q58 338 32 297T-12 214T-42 129T-53 37Q-53 17 -46 -1T-18 -20Q13 -20 60 11T164 97T287
227T420 389Q382 443 350 503T295 629T258 764T244 905Q244 1011 277 1101T366 1264T493 1394T641 1488T791 1545T928 1565Q962 1565 979 1552Q996 1541 1019 1519T1064 1471T1104 1423T1128 1384ZM420 797Q420 730 441 653T500 497Q560 580 617 667T726 842T821
1013T896 1172T945 1312T963 1425Q963 1438 958 1441T944 1444Q930 1444 886 1428T783 1377T661 1290T544 1165T455 1001T420 797ZM1233 1897Q1177 1828 1112 1766T981 1651Q976 1654 966 1662T944 1680T923 1698T909 1712Q934 1743 965 1785T1025 1868T1077 1944T1110
1997Q1131 1987 1150 1972T1186 1941T1215 1914T1233 1897Z" />
<glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="1018" d="M1128 1384Q1133 1373 1137 1356T1141 1313Q1141 1251 1123 1175T1073 1012T995 832T894 644T775 456T642 275Q685 223 733 178T836 98Q803 73 774 59Q735 76 685 112T580 200Q463 63
346 -37T113 -186Q99 -192 78 -196T22 -201Q-6 -201 -36 -180T-93 -130T-142 -72T-176 -25Q-189 -6 -197 22T-205 92Q-205 143 -194 196T-154 317Q-142 322 -112 331T-45 351T28 370T88 383Q58 338 32 297T-12 214T-42 129T-53 37Q-53 17 -46 -1T-18 -20Q13 -20
60 11T164 97T287 227T420 389Q382 443 350 503T295 629T258 764T244 905Q244 1011 277 1101T366 1264T493 1394T641 1488T791 1545T928 1565Q962 1565 979 1552Q996 1541 1019 1519T1064 1471T1104 1423T1128 1384ZM420 797Q420 730 441 653T500 497Q560 580 617
667T726 842T821 1013T896 1172T945 1312T963 1425Q963 1438 958 1441T944 1444Q930 1444 886 1428T783 1377T661 1290T544 1165T455 1001T420 797ZM1194 1669Q1168 1664 1141 1660T1083 1651Q1069 1689 1054 1737T1028 1839Q977 1795 927 1754T811 1661Q800 1677
788 1688T758 1719Q792 1750 829 1785T901 1856T968 1923T1026 1981Q1071 1975 1101 1963T1157 1936Q1160 1908 1164 1871T1174 1797T1184 1725T1194 1669Z" />
<glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="1018" d="M1128 1384Q1133 1373 1137 1356T1141 1313Q1141 1251 1123 1175T1073 1012T995 832T894 644T775 456T642 275Q685 223 733 178T836 98Q803 73 774 59Q735 76 685 112T580 200Q463 63 346
-37T113 -186Q99 -192 78 -196T22 -201Q-6 -201 -36 -180T-93 -130T-142 -72T-176 -25Q-189 -6 -197 22T-205 92Q-205 143 -194 196T-154 317Q-142 322 -112 331T-45 351T28 370T88 383Q58 338 32 297T-12 214T-42 129T-53 37Q-53 17 -46 -1T-18 -20Q13 -20 60
11T164 97T287 227T420 389Q382 443 350 503T295 629T258 764T244 905Q244 1011 277 1101T366 1264T493 1394T641 1488T791 1545T928 1565Q962 1565 979 1552Q996 1541 1019 1519T1064 1471T1104 1423T1128 1384ZM420 797Q420 730 441 653T500 497Q560 580 617
667T726 842T821 1013T896 1172T945 1312T963 1425Q963 1438 958 1441T944 1444Q930 1444 886 1428T783 1377T661 1290T544 1165T455 1001T420 797ZM983 1850Q983 1844 971 1820T944 1769T913 1721T891 1700Q884 1700 860 1710T811 1733T765 1758T745 1776Q745
1791 756 1819T783 1874T812 1922T831 1942Q844 1942 869 1930T920 1901T964 1870T983 1850ZM1270 1829Q1270 1823 1258 1799T1231 1749T1200 1701T1178 1680Q1171 1680 1147 1689T1098 1712T1052 1737T1032 1755Q1032 1770 1043 1798T1070 1853T1099 1901T1118
1921Q1131 1921 1156 1909T1207 1881T1251 1850T1270 1829Z" />
<glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="1436" d="M1409 1284Q1422 1267 1431 1249T1445 1208T1453 1156T1454 1087Q1451 958 1421 822T1337 556T1203 307T1022 90T795 -77T524 -178Q478 -149 443 -121T383 -70T342 -28T319 -1Q266 -79 215 -124T113
-170Q89 -170 65 -157T19 -122T-22 -75T-54 -25T-76 19T-84 49Q-84 99 -72 159T-36 285T20 422T95 567Q30 568 -11 568T-57 571Q-54 583 -48 601T-34 639T-19 675T-6 700Q1 702 51 704T179 708Q240 802 309 893T455 1070Q482 1208 500 1343T522 1602Q580 1566 626
1531T706 1467Q745 1434 774 1403L771 1358Q867 1426 958 1464T1135 1503Q1175 1503 1214 1481T1288 1425T1353 1354T1409 1284ZM899 713Q895 695 889 675T874 634T858 597T844 571L581 569Q525 406 461 261T327 10Q452 29 559 77T756 196T919 354T1050 538T1150
734T1219 930T1260 1113T1274 1270Q1274 1291 1269 1313T1252 1353T1224 1382T1186 1393Q1144 1393 1092 1371T981 1308T858 1212T728 1090Q709 1001 684 906T628 712L899 713ZM70 18Q88 10 116 48T179 161T252 339T328 567H297Q243 489 199 415T122 274T73 154T55
61Q55 26 70 18Z" />
<glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="1358" d="M1335 1223Q1335 1171 1326 1101T1296 939T1238 734T1147 483Q1088 333 1027 218T912 22T818 -102T762 -154Q736 -166 705 -166Q679 -166 652 -158T606 -133Q594 -123 567 -82T508 34T448 223T405
492Q362 436 311 372T207 245T102 121T3 10T-79 -76T-135 -129Q-146 -119 -160 -105T-190 -76T-220 -44T-246 -14Q-100 114 50 347T336 909Q353 895 368 881T397 853Q401 993 406 1102T419 1294T432 1438T445 1540T455 1608T463 1651Q473 1642 493 1623T538 1579T590
1529T642 1478T685 1435T711 1407Q698 1357 682 1291T651 1135T626 930T616 668Q617 531 626 403Q630 348 635 290T649 175T670 66T697 -27Q822 179 896 372T1011 750T1063 1114T1075 1473V1542Q1127 1502 1174 1453T1257 1360Q1299 1309 1335 1257V1223ZM1057
1794Q1073 1794 1089 1801T1119 1819T1147 1845T1171 1874Q1190 1865 1205 1853T1241 1829Q1225 1804 1202 1774T1149 1718T1081 1675T999 1657Q982 1657 960 1674T914 1712T869 1750T833 1769Q822 1769 807 1762T774 1742T741 1714T710 1681Q684 1698 671 1710T641
1735Q660 1758 687 1787T746 1843T814 1887T889 1905Q905 1905 927 1888T973 1850T1018 1812T1057 1794Z" />
<glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="1274" d="M1239 1341Q1246 1329 1254 1318T1269 1285T1281 1229T1286 1135Q1286 1011 1257 889T1178 652T1060 432T914 235T750 69T581 -59T416 -141T268 -170Q241 -170 213 -157T157 -123T105 -77T61
-28T28 17T10 47Q5 57 -2 71T-15 106T-25 159T-29 236Q-29 305 -16 386T33 562T128 762T283 987Q291 978 307 961T342 921T382 875T421 828T453 789T471 762Q423 707 380 643T301 514T234 384T183 265T151 167T139 100Q139 84 145 70T160 44T179 27T197 20Q249
20 316 50T456 134T607 264T756 432T891 629T1003 849T1078 1082T1106 1321Q1106 1357 1098 1381T1077 1421T1048 1443T1014 1450Q937 1450 877 1421T772 1346T701 1247T664 1143Q649 1059 659 993T687 877T724 798T745 754Q721 757 688 759T619 765T548 771T485
780Q473 794 459 820T434 880T414 954T406 1036Q406 1116 431 1186T500 1315T598 1419T712 1496T829 1544T936 1561Q968 1561 1000 1549T1064 1516T1123 1471T1175 1422T1214 1376T1239 1341ZM1095 1682Q1072 1671 1052 1665T1003 1651Q988 1677 970 1710T932 1781T893
1863T858 1952Q909 1971 950 1981T1011 1995L1095 1682V1682Z" />
<glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="1274" d="M1239 1341Q1246 1329 1254 1318T1269 1285T1281 1229T1286 1135Q1286 1011 1257 889T1178 652T1060 432T914 235T750 69T581 -59T416 -141T268 -170Q241 -170 213 -157T157 -123T105 -77T61
-28T28 17T10 47Q5 57 -2 71T-15 106T-25 159T-29 236Q-29 305 -16 386T33 562T128 762T283 987Q291 978 307 961T342 921T382 875T421 828T453 789T471 762Q423 707 380 643T301 514T234 384T183 265T151 167T139 100Q139 84 145 70T160 44T179 27T197 20Q249
20 316 50T456 134T607 264T756 432T891 629T1003 849T1078 1082T1106 1321Q1106 1357 1098 1381T1077 1421T1048 1443T1014 1450Q937 1450 877 1421T772 1346T701 1247T664 1143Q649 1059 659 993T687 877T724 798T745 754Q721 757 688 759T619 765T548 771T485
780Q473 794 459 820T434 880T414 954T406 1036Q406 1116 431 1186T500 1315T598 1419T712 1496T829 1544T936 1561Q968 1561 1000 1549T1064 1516T1123 1471T1175 1422T1214 1376T1239 1341ZM1254 1897Q1198 1828 1133 1766T1002 1651Q997 1654 987 1662T965 1680T944
1698T930 1712Q955 1743 986 1785T1046 1868T1098 1944T1131 1997Q1152 1987 1171 1972T1207 1941T1236 1914T1254 1897Z" />
<glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="1274" d="M1239 1341Q1246 1329 1254 1318T1269 1285T1281 1229T1286 1135Q1286 1011 1257 889T1178 652T1060 432T914 235T750 69T581 -59T416 -141T268 -170Q241 -170 213 -157T157 -123T105
-77T61 -28T28 17T10 47Q5 57 -2 71T-15 106T-25 159T-29 236Q-29 305 -16 386T33 562T128 762T283 987Q291 978 307 961T342 921T382 875T421 828T453 789T471 762Q423 707 380 643T301 514T234 384T183 265T151 167T139 100Q139 84 145 70T160 44T179 27T197
20Q249 20 316 50T456 134T607 264T756 432T891 629T1003 849T1078 1082T1106 1321Q1106 1357 1098 1381T1077 1421T1048 1443T1014 1450Q937 1450 877 1421T772 1346T701 1247T664 1143Q649 1059 659 993T687 877T724 798T745 754Q721 757 688 759T619 765T548
771T485 780Q473 794 459 820T434 880T414 954T406 1036Q406 1116 431 1186T500 1315T598 1419T712 1496T829 1544T936 1561Q968 1561 1000 1549T1064 1516T1123 1471T1175 1422T1214 1376T1239 1341ZM1214 1669Q1188 1664 1161 1660T1103 1651Q1089 1689 1074
1737T1048 1839Q997 1795 947 1754T831 1661Q820 1677 808 1688T778 1719Q812 1750 849 1785T921 1856T988 1923T1046 1981Q1091 1975 1121 1963T1177 1936Q1180 1908 1184 1871T1194 1797T1204 1725T1214 1669Z" />
<glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="1274" d="M1239 1341Q1246 1329 1254 1318T1269 1285T1281 1229T1286 1135Q1286 1011 1257 889T1178 652T1060 432T914 235T750 69T581 -59T416 -141T268 -170Q241 -170 213 -157T157 -123T105 -77T61
-28T28 17T10 47Q5 57 -2 71T-15 106T-25 159T-29 236Q-29 305 -16 386T33 562T128 762T283 987Q291 978 307 961T342 921T382 875T421 828T453 789T471 762Q423 707 380 643T301 514T234 384T183 265T151 167T139 100Q139 84 145 70T160 44T179 27T197 20Q249
20 316 50T456 134T607 264T756 432T891 629T1003 849T1078 1082T1106 1321Q1106 1357 1098 1381T1077 1421T1048 1443T1014 1450Q937 1450 877 1421T772 1346T701 1247T664 1143Q649 1059 659 993T687 877T724 798T745 754Q721 757 688 759T619 765T548 771T485
780Q473 794 459 820T434 880T414 954T406 1036Q406 1116 431 1186T500 1315T598 1419T712 1496T829 1544T936 1561Q968 1561 1000 1549T1064 1516T1123 1471T1175 1422T1214 1376T1239 1341ZM1153 1823Q1169 1823 1185 1830T1215 1848T1243 1874T1267 1903Q1286
1894 1301 1882T1337 1858Q1321 1833 1298 1803T1245 1747T1177 1704T1095 1686Q1078 1686 1056 1703T1010 1741T965 1779T929 1798Q918 1798 903 1791T870 1771T837 1743T806 1710Q780 1727 767 1739T737 1764Q756 1787 783 1816T842 1872T910 1916T985 1934Q1001
1934 1023 1917T1069 1879T1114 1841T1153 1823Z" />
<glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="1274" d="M1239 1341Q1246 1329 1254 1318T1269 1285T1281 1229T1286 1135Q1286 1011 1257 889T1178 652T1060 432T914 235T750 69T581 -59T416 -141T268 -170Q241 -170 213 -157T157 -123T105 -77T61
-28T28 17T10 47Q5 57 -2 71T-15 106T-25 159T-29 236Q-29 305 -16 386T33 562T128 762T283 987Q291 978 307 961T342 921T382 875T421 828T453 789T471 762Q423 707 380 643T301 514T234 384T183 265T151 167T139 100Q139 84 145 70T160 44T179 27T197 20Q249
20 316 50T456 134T607 264T756 432T891 629T1003 849T1078 1082T1106 1321Q1106 1357 1098 1381T1077 1421T1048 1443T1014 1450Q937 1450 877 1421T772 1346T701 1247T664 1143Q649 1059 659 993T687 877T724 798T745 754Q721 757 688 759T619 765T548 771T485
780Q473 794 459 820T434 880T414 954T406 1036Q406 1116 431 1186T500 1315T598 1419T712 1496T829 1544T936 1561Q968 1561 1000 1549T1064 1516T1123 1471T1175 1422T1214 1376T1239 1341ZM1003 1850Q1003 1844 991 1820T964 1769T933 1721T911 1700Q904 1700
880 1710T831 1733T785 1758T765 1776Q765 1791 776 1819T803 1874T832 1922T851 1942Q864 1942 889 1930T940 1901T984 1870T1003 1850ZM1290 1829Q1290 1823 1278 1799T1251 1749T1220 1701T1198 1680Q1191 1680 1167 1689T1118 1712T1072 1737T1052 1755Q1052
1770 1063 1798T1090 1853T1119 1901T1138 1921Q1151 1921 1176 1909T1227 1881T1271 1850T1290 1829Z" />
<glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="717" d="M303 887Q320 839 338 788T374 682Q419 722 460 758T532 822T584 868T608 889Q616 867 622 844T634 800T644 761T651 731Q644 725 623 708T571 667T501 612T420 548Q444 478 468 413T516 291Q506
284 493 276T467 259T442 243T420 229Q403 264 371 323T299 453L18 231Q16 243 13 258T7 290T0 321T-6 346Q-2 350 19 369T74 417T149 484T238 562Q203 625 169 687T104 805Q119 813 147 825T205 849T262 871T303 887Z" />
<glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="1274" d="M1360 1737Q1337 1700 1287 1620T1168 1427Q1194 1401 1212 1378T1239 1341Q1246 1329 1254 1318T1269 1285T1281 1229T1286 1135Q1286 1011 1257 889T1178 652T1060 432T914 235T750 69T581
-59T416 -141T268 -170Q250 -170 232 -165T196 -149Q122 -264 65 -351T-27 -487Q-45 -469 -58 -457T-83 -433T-106 -410T-131 -385Q-77 -305 -24 -223T85 -56Q56 -24 36 4T10 47Q5 57 -2 71T-15 106T-25 159T-29 236Q-29 305 -16 386T33 562T128 762T283 987Q291
978 307 961T342 921T382 875T421 828T453 789T471 762Q423 707 380 643T301 514T234 384T183 265T151 167T139 100Q139 86 143 74T155 51Q265 224 376 402T599 767Q567 769 538 772T485 780Q473 794 459 820T434 880T414 954T406 1036Q406 1116 431 1186T500 1315T598
1419T712 1496T829 1544T936 1561Q964 1561 992 1551T1049 1524L1239 1849Q1264 1825 1278 1813T1304 1792T1327 1772T1360 1737ZM324 54Q401 89 489 158T664 322T830 533T971 778T1069 1045T1106 1321V1325Q1023 1190 926 1030T726 703T520 370T324 54ZM664 1143Q650
1068 657 1008T679 900Q761 1037 842 1174T1005 1449Q930 1447 871 1418T769 1344T700 1246T664 1143Z" />
<glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="1346" d="M678 -74Q730 76 780 191T873 403Q824 329 782 273T707 179Q669 134 637 102Q561 29 502 -24T396 -111T314 -163T252 -180Q231 -180 208 -166T162 -130T119 -84T84 -41Q59 -9 56 42T53 168Q53
283 72 409T128 662T215 916T329 1159T465 1378T618 1561Q639 1539 666 1511T720 1452T773 1393T817 1341Q732 1264 658 1168T521 962T410 734T328 494T276 251T256 17Q367 73 460 153T630 327T771 526T886 736T978 945T1052 1139T1110 1305T1157 1430Q1167 1415
1184 1393T1220 1346T1260 1294T1298 1246T1329 1207T1346 1184Q1292 1045 1249 923T1169 688T1100 468T1034 250T965 23T885 -225L678 -74ZM1188 1651Q1165 1640 1145 1634T1096 1620Q1081 1646 1063 1679T1025 1750T986 1832T951 1921Q1002 1940 1043 1950T1104
1964L1188 1651V1651Z" />
<glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="1346" d="M678 -74Q730 76 780 191T873 403Q824 329 782 273T707 179Q669 134 637 102Q561 29 502 -24T396 -111T314 -163T252 -180Q231 -180 208 -166T162 -130T119 -84T84 -41Q59 -9 56 42T53 168Q53
283 72 409T128 662T215 916T329 1159T465 1378T618 1561Q639 1539 666 1511T720 1452T773 1393T817 1341Q732 1264 658 1168T521 962T410 734T328 494T276 251T256 17Q367 73 460 153T630 327T771 526T886 736T978 945T1052 1139T1110 1305T1157 1430Q1167 1415
1184 1393T1220 1346T1260 1294T1298 1246T1329 1207T1346 1184Q1292 1045 1249 923T1169 688T1100 468T1034 250T965 23T885 -225L678 -74ZM1346 1866Q1290 1797 1225 1735T1094 1620Q1089 1623 1079 1631T1057 1649T1036 1667T1022 1681Q1047 1712 1078 1754T1138
1837T1190 1913T1223 1966Q1244 1956 1263 1941T1299 1910T1328 1883T1346 1866Z" />
<glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="1346" d="M678 -74Q730 76 780 191T873 403Q824 329 782 273T707 179Q669 134 637 102Q561 29 502 -24T396 -111T314 -163T252 -180Q231 -180 208 -166T162 -130T119 -84T84 -41Q59 -9 56 42T53
168Q53 283 72 409T128 662T215 916T329 1159T465 1378T618 1561Q639 1539 666 1511T720 1452T773 1393T817 1341Q732 1264 658 1168T521 962T410 734T328 494T276 251T256 17Q367 73 460 153T630 327T771 526T886 736T978 945T1052 1139T1110 1305T1157 1430Q1167
1415 1184 1393T1220 1346T1260 1294T1298 1246T1329 1207T1346 1184Q1292 1045 1249 923T1169 688T1100 468T1034 250T965 23T885 -225L678 -74ZM1307 1638Q1281 1633 1254 1629T1196 1620Q1182 1658 1167 1706T1141 1808Q1090 1764 1040 1723T924 1630Q913 1646
901 1657T871 1688Q905 1719 942 1754T1014 1825T1081 1892T1139 1950Q1184 1944 1214 1932T1270 1905Q1273 1877 1277 1840T1287 1766T1297 1694T1307 1638Z" />
<glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="1346" d="M678 -74Q730 76 780 191T873 403Q824 329 782 273T707 179Q669 134 637 102Q561 29 502 -24T396 -111T314 -163T252 -180Q231 -180 208 -166T162 -130T119 -84T84 -41Q59 -9 56 42T53 168Q53
283 72 409T128 662T215 916T329 1159T465 1378T618 1561Q639 1539 666 1511T720 1452T773 1393T817 1341Q732 1264 658 1168T521 962T410 734T328 494T276 251T256 17Q367 73 460 153T630 327T771 526T886 736T978 945T1052 1139T1110 1305T1157 1430Q1167 1415
1184 1393T1220 1346T1260 1294T1298 1246T1329 1207T1346 1184Q1292 1045 1249 923T1169 688T1100 468T1034 250T965 23T885 -225L678 -74ZM1096 1819Q1096 1813 1084 1789T1057 1738T1026 1690T1004 1669Q997 1669 973 1679T924 1702T878 1727T858 1745Q858 1760
869 1788T896 1843T925 1891T944 1911Q957 1911 982 1899T1033 1870T1077 1839T1096 1819ZM1383 1798Q1383 1792 1371 1768T1344 1718T1313 1670T1291 1649Q1284 1649 1260 1658T1211 1681T1165 1706T1145 1724Q1145 1739 1156 1767T1183 1822T1212 1870T1231 1890Q1244
1890 1269 1878T1320 1850T1364 1819T1383 1798Z" />
<glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="1294" d="M590 -1004Q558 -972 531 -943T476 -886T421 -829T360 -768Q402 -644 450 -519T557 -255T689 38T855 377Q809 309 770 258T701 172Q667 132 637 102Q561 29 502 -24T396 -111T314 -163T252
-180Q231 -180 208 -166T162 -130T119 -84T84 -41Q59 -9 56 42T53 168Q53 283 72 409T128 662T215 916T329 1159T465 1378T618 1561Q639 1539 666 1511T720 1452T773 1393T817 1341Q732 1264 658 1168T521 962T410 734T328 494T276 251T256 17Q367 73 460 153T630
327T771 526T886 736T978 945T1052 1139T1110 1305T1157 1430Q1167 1415 1184 1393T1220 1346T1260 1294T1298 1246T1329 1207T1346 1184Q1293 1058 1242 933T1136 668T1024 366T900 3T757 -446T590 -1004ZM1291 1886Q1235 1817 1170 1755T1039 1640Q1034 1643
1024 1651T1002 1669T981 1687T967 1701Q992 1732 1023 1774T1083 1857T1135 1933T1168 1986Q1189 1976 1208 1961T1244 1930T1273 1903T1291 1886Z" />
<glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="1268" d="M1288 922Q1288 850 1264 778T1199 638T1101 509T981 395T847 301T711 233Q700 249 684 271T648 318T609 368T571 414Q714 470 824 540T1011 687T1126 844T1165 999Q1165 1009 1162 1020T1152
1039T1134 1051T1106 1051Q1016 1031 915 983T707 866Q667 756 621 643T525 422T420 216T312 37T205 -102T100 -188Q85 -196 64 -203T10 -213Q-2 -214 -18 -203T-52 -175T-86 -137T-117 -97T-141 -63T-154 -43Q-162 -28 -162 -8T-158 33Q-126 138 -67 253T72 481T249
701T456 894Q493 998 525 1101T581 1299T621 1479T641 1630Q681 1614 717 1590T782 1538T833 1484T868 1436Q860 1373 838 1285T783 1090Q857 1120 931 1136T1079 1153Q1098 1153 1120 1141T1166 1110T1210 1066T1249 1018T1276 972T1288 936V922ZM4 -8Q25 -8 60
36T138 156T229 336T327 558Q255 486 194 412T88 267T19 128T-6 4Q-6 -8 4 -8Z" />
<glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="829" d="M897 1370Q902 1365 903 1360T905 1341Q905 1263 890 1191T843 1046T759 898T635 741Q569 667 547 601T524 473Q524 439 528 407T538 344T548 284T553 227Q553 195 543 154T506 78Q557 109
606 146T696 217Q743 256 784 295L829 242Q796 211 758 177T678 108T593 44T508 -10T427 -47T354 -61Q325 -61 290 -47T224 -13T171 29T143 66Q143 68 147 74T156 88T167 100T176 106Q182 106 200 97T260 88Q283 88 300 100T329 132T346 178T352 233Q352 261 349
291T343 349T337 402T334 444Q334 502 353 553T405 651T479 743T562 837T646 938T719 1054T771 1191T791 1354Q791 1368 780 1368Q765 1368 735 1338T658 1242T545 1071T393 815Q320 682 232 475Q157 298 55 20T-168 -653L-430 -739Q-329 -422 -230 -142T-31 376T166
804T362 1135T558 1359T756 1468Q774 1464 793 1454T832 1429T868 1400T897 1370Z" />
<glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="846" d="M516 88Q516 82 522 82Q531 82 552 95T600 128T657 173T716 222T766 266T801 297Q810 288 823 273T848 246Q824 224 791 193T719 127T639 60T559 0T485 -42T424 -59Q406 -59 385 -52T345 -33T315
-3T303 35Q303 43 303 54T304 84T312 129T330 195Q297 160 253 122T159 50T61 -11T-31 -53Q-36 -55 -39 -55T-45 -55Q-55 -55 -71 -45T-104 -19T-131 19T-143 61Q-143 67 -137 101T-109 187T-42 305T78 440Q117 475 162 506Q200 532 249 559T352 602Q354 602 355
603T360 602Q372 598 388 590T421 572T450 553T467 537Q468 535 467 534L465 532Q420 508 380 479T309 423Q273 392 242 362Q169 290 141 238T113 162Q113 145 127 145Q141 145 162 156T211 187T270 233T338 289Q369 314 398 343Q423 367 450 398T496 461Q496 462
497 463Q498 464 500 463Q511 455 525 437T551 396T571 354T580 322Q557 275 545 237T526 169T518 120T516 88ZM551 715Q528 704 508 698T459 684Q444 710 426 743T388 814T349 896T314 985Q365 1004 406 1014T467 1028L551 715V715Z" />
<glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="846" d="M516 88Q516 82 522 82Q531 82 552 95T600 128T657 173T716 222T766 266T801 297Q810 288 823 273T848 246Q824 224 791 193T719 127T639 60T559 0T485 -42T424 -59Q406 -59 385 -52T345 -33T315
-3T303 35Q303 43 303 54T304 84T312 129T330 195Q297 160 253 122T159 50T61 -11T-31 -53Q-36 -55 -39 -55T-45 -55Q-55 -55 -71 -45T-104 -19T-131 19T-143 61Q-143 67 -137 101T-109 187T-42 305T78 440Q117 475 162 506Q200 532 249 559T352 602Q354 602 355
603T360 602Q372 598 388 590T421 572T450 553T467 537Q468 535 467 534L465 532Q420 508 380 479T309 423Q273 392 242 362Q169 290 141 238T113 162Q113 145 127 145Q141 145 162 156T211 187T270 233T338 289Q369 314 398 343Q423 367 450 398T496 461Q496 462
497 463Q498 464 500 463Q511 455 525 437T551 396T571 354T580 322Q557 275 545 237T526 169T518 120T516 88ZM709 930Q653 861 588 799T457 684Q452 687 442 695T420 713T399 731T385 745Q410 776 441 818T501 901T553 977T586 1030Q607 1020 626 1005T662 974T691
947T709 930Z" />
<glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="846" d="M516 88Q516 82 522 82Q531 82 552 95T600 128T657 173T716 222T766 266T801 297Q810 288 823 273T848 246Q824 224 791 193T719 127T639 60T559 0T485 -42T424 -59Q406 -59 385 -52T345
-33T315 -3T303 35Q303 43 303 54T304 84T312 129T330 195Q297 160 253 122T159 50T61 -11T-31 -53Q-36 -55 -39 -55T-45 -55Q-55 -55 -71 -45T-104 -19T-131 19T-143 61Q-143 67 -137 101T-109 187T-42 305T78 440Q117 475 162 506Q200 532 249 559T352 602Q354
602 355 603T360 602Q372 598 388 590T421 572T450 553T467 537Q468 535 467 534L465 532Q420 508 380 479T309 423Q273 392 242 362Q169 290 141 238T113 162Q113 145 127 145Q141 145 162 156T211 187T270 233T338 289Q369 314 398 343Q423 367 450 398T496 461Q496
462 497 463Q498 464 500 463Q511 455 525 437T551 396T571 354T580 322Q557 275 545 237T526 169T518 120T516 88ZM670 702Q644 697 617 693T559 684Q545 722 530 770T504 872Q453 828 403 787T287 694Q276 710 264 721T234 752Q268 783 305 818T377 889T444 956T502
1014Q547 1008 577 996T633 969Q636 941 640 904T650 830T660 758T670 702Z" />
<glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="846" d="M516 88Q516 82 522 82Q531 82 552 95T600 128T657 173T716 222T766 266T801 297Q810 288 823 273T848 246Q824 224 791 193T719 127T639 60T559 0T485 -42T424 -59Q406 -59 385 -52T345 -33T315
-3T303 35Q303 43 303 54T304 84T312 129T330 195Q297 160 253 122T159 50T61 -11T-31 -53Q-36 -55 -39 -55T-45 -55Q-55 -55 -71 -45T-104 -19T-131 19T-143 61Q-143 67 -137 101T-109 187T-42 305T78 440Q117 475 162 506Q200 532 249 559T352 602Q354 602 355
603T360 602Q372 598 388 590T421 572T450 553T467 537Q468 535 467 534L465 532Q420 508 380 479T309 423Q273 392 242 362Q169 290 141 238T113 162Q113 145 127 145Q141 145 162 156T211 187T270 233T338 289Q369 314 398 343Q423 367 450 398T496 461Q496 462
497 463Q498 464 500 463Q511 455 525 437T551 396T571 354T580 322Q557 275 545 237T526 169T518 120T516 88ZM609 856Q625 856 641 863T671 881T699 907T723 936Q742 927 757 915T793 891Q777 866 754 836T701 780T633 737T551 719Q534 719 512 736T466 774T421
812T385 831Q374 831 359 824T326 804T293 776T262 743Q236 760 223 772T193 797Q212 820 239 849T298 905T366 949T441 967Q457 967 479 950T525 912T570 874T609 856Z" />
<glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="846" d="M516 88Q516 82 522 82Q531 82 552 95T600 128T657 173T716 222T766 266T801 297Q810 288 823 273T848 246Q824 224 791 193T719 127T639 60T559 0T485 -42T424 -59Q406 -59 385 -52T345
-33T315 -3T303 35Q303 43 303 54T304 84T312 129T330 195Q297 160 253 122T159 50T61 -11T-31 -53Q-36 -55 -39 -55T-45 -55Q-55 -55 -71 -45T-104 -19T-131 19T-143 61Q-143 67 -137 101T-109 187T-42 305T78 440Q117 475 162 506Q200 532 249 559T352 602Q354
602 355 603T360 602Q372 598 388 590T421 572T450 553T467 537Q468 535 467 534L465 532Q420 508 380 479T309 423Q273 392 242 362Q169 290 141 238T113 162Q113 145 127 145Q141 145 162 156T211 187T270 233T338 289Q369 314 398 343Q423 367 450 398T496 461Q496
462 497 463Q498 464 500 463Q511 455 525 437T551 396T571 354T580 322Q557 275 545 237T526 169T518 120T516 88ZM459 883Q459 877 447 853T420 802T389 754T367 733Q360 733 336 743T287 766T241 791T221 809Q221 824 232 852T259 907T288 955T307 975Q320 975
345 963T396 934T440 903T459 883ZM746 862Q746 856 734 832T707 782T676 734T654 713Q647 713 623 722T574 745T528 770T508 788Q508 803 519 831T546 886T575 934T594 954Q607 954 632 942T683 914T727 883T746 862Z" />
<glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="846" d="M516 88Q516 82 522 82Q531 82 552 95T600 128T657 173T716 222T766 266T801 297Q810 288 823 273T848 246Q824 224 791 193T719 127T639 60T559 0T485 -42T424 -59Q406 -59 385 -52T345 -33T315
-3T303 35Q303 43 303 54T304 84T312 129T330 195Q297 160 253 122T159 50T61 -11T-31 -53Q-36 -55 -39 -55T-45 -55Q-55 -55 -71 -45T-104 -19T-131 19T-143 61Q-143 67 -137 101T-109 187T-42 305T78 440Q117 475 162 506Q200 532 249 559T352 602Q354 602 355
603T360 602Q372 598 388 590T421 572T450 553T467 537Q468 535 467 534L465 532Q420 508 380 479T309 423Q273 392 242 362Q169 290 141 238T113 162Q113 145 127 145Q141 145 162 156T211 187T270 233T338 289Q369 314 398 343Q423 367 450 398T496 461Q496 462
497 463Q498 464 500 463Q511 455 525 437T551 396T571 354T580 322Q557 275 545 237T526 169T518 120T516 88ZM651 883Q651 838 630 799T576 729T502 682T420 664Q398 664 373 675T325 706T289 749T274 799Q274 842 290 884T337 959T408 1013T498 1034Q519 1034
545 1021T595 987T635 938T651 883ZM537 967Q515 967 492 950T449 904T416 841T403 770Q403 758 406 751T424 743Q447 743 471 758T514 800T546 860T559 932Q559 967 537 967Z" />
<glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="1106" d="M1108 246Q1016 156 935 95T779 -3T638 -56T506 -72Q479 -72 446 -52T385 -4T337 56T317 109Q317 141 320 171Q279 136 235 102T145 38T56 -15T-31 -53Q-36 -55 -39 -55T-45 -55Q-55 -55 -71 -45T-104
-19T-131 19T-143 61Q-143 106 -126 160T-73 270T14 379T134 478T288 556T475 602Q477 602 478 603T483 602Q492 599 505 593T532 579T558 563T579 547Q632 576 683 591T780 606Q811 606 841 588T896 544T936 490T952 440Q952 406 924 371T843 298T719 223T558
145Q555 121 555 98Q555 67 568 56T618 45Q684 45 743 67T856 124T960 204T1059 295L1108 246ZM338 289Q340 290 343 293Q345 295 348 298T356 304Q385 373 431 426T532 518Q456 496 381 458T247 372T150 270T113 162Q113 145 127 145Q141 145 162 156T211 187T270
233T338 289ZM756 496Q736 496 712 475T664 419T618 339T581 244Q618 268 653 295T716 351T761 412T778 473Q778 482 773 489T756 496Z" />
<glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="653" d="M262 -217Q262 -249 250 -285T207 -354T121 -412T-18 -449Q-25 -441 -31 -426T-43 -392T-52 -358T-61 -330Q-35 -327 1 -320T70 -301T126 -272T150 -229Q150 -228 149 -224T142 -215T127 -207T102
-203Q80 -203 62 -205T31 -208T11 -210T4 -207Q16 -178 33 -143T66 -74H39Q21 -74 -2 -63T-49 -32T-95 14T-133 70Q-139 81 -141 95T-143 131Q-143 188 -126 245T-77 355T-3 452T92 531T201 583T319 602Q328 602 343 593T377 567T413 531T447 491T471 451T481 416Q476
397 450 375T389 333T314 300T246 287Q229 287 229 297Q229 308 244 329T277 376T311 427T326 471Q326 480 322 486T309 492Q287 492 263 472T215 419T169 344T131 256T104 166T94 84Q94 62 107 54T147 45Q214 45 276 67T396 125T506 205T604 293Q615 280 631 268T655
246Q602 190 544 140T423 49T291 -21T147 -63L111 -150Q129 -145 143 -142T182 -139Q193 -139 206 -146T230 -164T251 -189T262 -217Z" />
<glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="645" d="M647 246Q555 156 474 95T318 -3T177 -56T45 -72Q18 -72 -15 -52T-76 -4T-124 56T-143 109Q-143 191 -121 259T-61 383T23 480T122 550T225 592T319 606Q350 606 380 588T436 544T476 490T492
440Q492 406 464 371T383 298T258 223T97 145Q94 121 94 98Q94 67 107 56T158 45Q224 45 282 67T395 124T499 204T598 295L647 246ZM295 496Q275 496 251 475T203 418T157 338T119 243Q156 267 191 294T255 350T300 411T317 473Q317 482 312 489T295 496ZM695 715Q672
704 652 698T603 684Q588 710 570 743T532 814T493 896T458 985Q509 1004 550 1014T611 1028L695 715V715Z" />
<glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="645" d="M647 246Q555 156 474 95T318 -3T177 -56T45 -72Q18 -72 -15 -52T-76 -4T-124 56T-143 109Q-143 191 -121 259T-61 383T23 480T122 550T225 592T319 606Q350 606 380 588T436 544T476 490T492
440Q492 406 464 371T383 298T258 223T97 145Q94 121 94 98Q94 67 107 56T158 45Q224 45 282 67T395 124T499 204T598 295L647 246ZM295 496Q275 496 251 475T203 418T157 338T119 243Q156 267 191 294T255 350T300 411T317 473Q317 482 312 489T295 496ZM596 930Q540
861 475 799T344 684Q339 687 329 695T307 713T286 731T272 745Q297 776 328 818T388 901T440 977T473 1030Q494 1020 513 1005T549 974T578 947T596 930Z" />
<glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="645" d="M647 246Q555 156 474 95T318 -3T177 -56T45 -72Q18 -72 -15 -52T-76 -4T-124 56T-143 109Q-143 191 -121 259T-61 383T23 480T122 550T225 592T319 606Q350 606 380 588T436 544T476 490T492
440Q492 406 464 371T383 298T258 223T97 145Q94 121 94 98Q94 67 107 56T158 45Q224 45 282 67T395 124T499 204T598 295L647 246ZM295 496Q275 496 251 475T203 418T157 338T119 243Q156 267 191 294T255 350T300 411T317 473Q317 482 312 489T295 496ZM814 702Q788
697 761 693T703 684Q689 722 674 770T648 872Q597 828 547 787T431 694Q420 710 408 721T378 752Q412 783 449 818T521 889T588 956T646 1014Q691 1008 721 996T777 969Q780 941 784 904T794 830T804 758T814 702Z" />
<glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="645" d="M647 246Q555 156 474 95T318 -3T177 -56T45 -72Q18 -72 -15 -52T-76 -4T-124 56T-143 109Q-143 191 -121 259T-61 383T23 480T122 550T225 592T319 606Q350 606 380 588T436 544T476 490T492
440Q492 406 464 371T383 298T258 223T97 145Q94 121 94 98Q94 67 107 56T158 45Q224 45 282 67T395 124T499 204T598 295L647 246ZM295 496Q275 496 251 475T203 418T157 338T119 243Q156 267 191 294T255 350T300 411T317 473Q317 482 312 489T295 496ZM603 883Q603
877 591 853T564 802T533 754T511 733Q504 733 480 743T431 766T385 791T365 809Q365 824 376 852T403 907T432 955T451 975Q464 975 489 963T540 934T584 903T603 883ZM890 862Q890 856 878 832T851 782T820 734T798 713Q791 713 767 722T718 745T672 770T652
788Q652 803 663 831T690 886T719 934T738 954Q751 954 776 942T827 914T871 883T890 862Z" />
<glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="428" d="M18 -55Q3 -55 -20 -45T-64 -19T-100 16T-115 53Q-105 97 -88 154T-52 270T-11 385T28 486T59 557T76 584Q82 584 106 571T156 540T204 501T225 465Q225 462 224 458T221 446Q213 421 201 387T174
317T146 244T121 175T103 119T96 84Q96 78 102 78Q113 78 135 91T185 125T245 171T304 220T356 265T391 295Q400 286 412 272T436 246Q414 224 381 193T310 128T230 62T149 3T76 -39T18 -55ZM322 715Q299 704 279 698T230 684Q215 710 197 743T159 814T120 896T85
985Q136 1004 177 1014T238 1028L322 715V715Z" />
<glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="428" d="M18 -55Q3 -55 -20 -45T-64 -19T-100 16T-115 53Q-105 97 -88 154T-52 270T-11 385T28 486T59 557T76 584Q82 584 106 571T156 540T204 501T225 465Q225 462 224 458T221 446Q213 421 201 387T174
317T146 244T121 175T103 119T96 84Q96 78 102 78Q113 78 135 91T185 125T245 171T304 220T356 265T391 295Q400 286 412 272T436 246Q414 224 381 193T310 128T230 62T149 3T76 -39T18 -55ZM737 930Q681 861 616 799T485 684Q480 687 470 695T448 713T427 731T413
745Q438 776 469 818T529 901T581 977T614 1030Q635 1020 654 1005T690 974T719 947T737 930Z" />
<glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="428" d="M18 -55Q3 -55 -20 -45T-64 -19T-100 16T-115 53Q-105 97 -88 154T-52 270T-11 385T28 486T59 557T76 584Q82 584 106 571T156 540T204 501T225 465Q225 462 224 458T221 446Q213 421 201
387T174 317T146 244T121 175T103 119T96 84Q96 78 102 78Q113 78 135 91T185 125T245 171T304 220T356 265T391 295Q400 286 412 272T436 246Q414 224 381 193T310 128T230 62T149 3T76 -39T18 -55ZM441 702Q415 697 388 693T330 684Q316 722 301 770T275 872Q224
828 174 787T58 694Q47 710 35 721T5 752Q39 783 76 818T148 889T215 956T273 1014Q318 1008 348 996T404 969Q407 941 411 904T421 830T431 758T441 702Z" />
<glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="428" d="M18 -55Q3 -55 -20 -45T-64 -19T-100 16T-115 53Q-105 97 -88 154T-52 270T-11 385T28 486T59 557T76 584Q82 584 106 571T156 540T204 501T225 465Q225 462 224 458T221 446Q213 421 201
387T174 317T146 244T121 175T103 119T96 84Q96 78 102 78Q113 78 135 91T185 125T245 171T304 220T356 265T391 295Q400 286 412 272T436 246Q414 224 381 193T310 128T230 62T149 3T76 -39T18 -55ZM230 883Q230 877 218 853T191 802T160 754T138 733Q131 733
107 743T58 766T12 791T-8 809Q-8 824 3 852T30 907T59 955T78 975Q91 975 116 963T167 934T211 903T230 883ZM517 862Q517 856 505 832T478 782T447 734T425 713Q418 713 394 722T345 745T299 770T279 788Q279 803 290 831T317 886T346 934T365 954Q378 954 403
942T454 914T498 883T517 862Z" />
<glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="655" d="M717 1241Q737 1218 758 1191T809 1120Q761 1105 705 1087T587 1048Q595 1001 599 952T604 850Q604 767 587 668T536 468T455 273T344 106T207 -11T45 -55Q15 -55 -17 -37T-75 7T-118 64T-135 117Q-135
193 -115 268T-51 408T60 524T221 600Q224 602 231 603T244 604Q258 604 273 594T302 570T325 545T334 528Q332 523 319 516T284 490T232 439T166 350Q112 269 93 204T74 102Q74 72 96 72Q135 72 175 103T254 187T326 307T385 448T425 593T440 729Q440 801 432
864T410 985Q311 950 221 911Q207 925 193 950T166 1006Q208 1026 261 1050T371 1098Q325 1200 256 1274L406 1411Q503 1314 553 1174Q617 1200 662 1218T717 1241Z" />
<glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="823" d="M236 483Q224 451 212 418T188 350Q251 422 296 467T373 539T424 574T455 584Q468 584 494 571T546 539T592 500T612 465Q612 462 611 458T608 446Q600 421 588 387T561 317T533 244T508 175T490
119T483 84Q483 78 489 78Q500 78 522 91T572 125T632 171T691 220T743 265T778 295Q788 286 800 272T823 246Q801 224 768 193T697 128T617 62T536 3T463 -39T406 -55Q391 -55 368 -45T324 -19T287 16T272 53Q281 94 296 146T330 252T367 360T405 459L403 457Q384
434 349 397T268 301T173 160T75 -36Q69 -50 64 -58T45 -66Q28 -66 7 -57T-37 -32T-82 3T-123 41Q-123 47 -118 75T-102 145T-77 242T-43 357T-2 479T47 600Q89 580 140 551T236 483ZM778 856Q794 856 810 863T840 881T868 907T892 936Q911 927 926 915T962 891Q946
866 923 836T870 780T802 737T720 719Q703 719 681 736T635 774T590 812T554 831Q543 831 528 824T495 804T462 776T431 743Q405 760 392 772T362 797Q381 820 408 849T467 905T535 949T610 967Q626 967 648 950T694 912T739 874T778 856Z" />
<glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="672" d="M74 102Q74 72 96 72Q119 72 157 108T236 201Q234 212 234 220T233 236Q233 256 237 283T260 346Q272 373 289 399Q303 422 323 448T367 498L373 504Q383 492 399 472T432 430T461 390T477 365Q477
322 462 279T420 194Q480 198 531 224T639 311Q648 302 662 287T686 260Q644 216 604 187T523 141T440 117T354 109Q320 73 281 43T202 -9T121 -43T45 -55Q15 -55 -17 -37T-75 7T-118 64T-135 117Q-135 193 -115 268T-51 408T60 524T221 600Q224 602 231 603T244
604Q258 604 273 594T302 570T325 545T334 528Q332 523 319 516T284 490T232 439T166 350Q112 269 93 204T74 102ZM687 715Q664 704 644 698T595 684Q580 710 562 743T524 814T485 896T450 985Q501 1004 542 1014T603 1028L687 715V715Z" />
<glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="672" d="M74 102Q74 72 96 72Q119 72 157 108T236 201Q234 212 234 220T233 236Q233 256 237 283T260 346Q272 373 289 399Q303 422 323 448T367 498L373 504Q383 492 399 472T432 430T461 390T477 365Q477
322 462 279T420 194Q480 198 531 224T639 311Q648 302 662 287T686 260Q644 216 604 187T523 141T440 117T354 109Q320 73 281 43T202 -9T121 -43T45 -55Q15 -55 -17 -37T-75 7T-118 64T-135 117Q-135 193 -115 268T-51 408T60 524T221 600Q224 602 231 603T244
604Q258 604 273 594T302 570T325 545T334 528Q332 523 319 516T284 490T232 439T166 350Q112 269 93 204T74 102ZM588 930Q532 861 467 799T336 684Q331 687 321 695T299 713T278 731T264 745Q289 776 320 818T380 901T432 977T465 1030Q486 1020 505 1005T541
974T570 947T588 930Z" />
<glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="672" d="M74 102Q74 72 96 72Q119 72 157 108T236 201Q234 212 234 220T233 236Q233 256 237 283T260 346Q272 373 289 399Q303 422 323 448T367 498L373 504Q383 492 399 472T432 430T461 390T477
365Q477 322 462 279T420 194Q480 198 531 224T639 311Q648 302 662 287T686 260Q644 216 604 187T523 141T440 117T354 109Q320 73 281 43T202 -9T121 -43T45 -55Q15 -55 -17 -37T-75 7T-118 64T-135 117Q-135 193 -115 268T-51 408T60 524T221 600Q224 602 231
603T244 604Q258 604 273 594T302 570T325 545T334 528Q332 523 319 516T284 490T232 439T166 350Q112 269 93 204T74 102ZM806 702Q780 697 753 693T695 684Q681 722 666 770T640 872Q589 828 539 787T423 694Q412 710 400 721T370 752Q404 783 441 818T513 889T580
956T638 1014Q683 1008 713 996T769 969Q772 941 776 904T786 830T796 758T806 702Z" />
<glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="672" d="M74 102Q74 72 96 72Q119 72 157 108T236 201Q234 212 234 220T233 236Q233 256 237 283T260 346Q272 373 289 399Q303 422 323 448T367 498L373 504Q383 492 399 472T432 430T461 390T477 365Q477
322 462 279T420 194Q480 198 531 224T639 311Q648 302 662 287T686 260Q644 216 604 187T523 141T440 117T354 109Q320 73 281 43T202 -9T121 -43T45 -55Q15 -55 -17 -37T-75 7T-118 64T-135 117Q-135 193 -115 268T-51 408T60 524T221 600Q224 602 231 603T244
604Q258 604 273 594T302 570T325 545T334 528Q332 523 319 516T284 490T232 439T166 350Q112 269 93 204T74 102ZM745 856Q761 856 777 863T807 881T835 907T859 936Q878 927 893 915T929 891Q913 866 890 836T837 780T769 737T687 719Q670 719 648 736T602 774T557
812T521 831Q510 831 495 824T462 804T429 776T398 743Q372 760 359 772T329 797Q348 820 375 849T434 905T502 949T577 967Q593 967 615 950T661 912T706 874T745 856Z" />
<glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="672" d="M74 102Q74 72 96 72Q119 72 157 108T236 201Q234 212 234 220T233 236Q233 256 237 283T260 346Q272 373 289 399Q303 422 323 448T367 498L373 504Q383 492 399 472T432 430T461 390T477
365Q477 322 462 279T420 194Q480 198 531 224T639 311Q648 302 662 287T686 260Q644 216 604 187T523 141T440 117T354 109Q320 73 281 43T202 -9T121 -43T45 -55Q15 -55 -17 -37T-75 7T-118 64T-135 117Q-135 193 -115 268T-51 408T60 524T221 600Q224 602 231
603T244 604Q258 604 273 594T302 570T325 545T334 528Q332 523 319 516T284 490T232 439T166 350Q112 269 93 204T74 102ZM595 883Q595 877 583 853T556 802T525 754T503 733Q496 733 472 743T423 766T377 791T357 809Q357 824 368 852T395 907T424 955T443 975Q456
975 481 963T532 934T576 903T595 883ZM882 862Q882 856 870 832T843 782T812 734T790 713Q783 713 759 722T710 745T664 770T644 788Q644 803 655 831T682 886T711 934T730 954Q743 954 768 942T819 914T863 883T882 862Z" />
<glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="717" d="M623 641Q615 618 607 594T590 549T574 509T561 479Q547 479 502 479T397 478T270 477T146 476T48 476T0 475Q5 486 13 504T31 541T47 578T59 606Q69 606 112 608T216 615T344 623T472 632T574
638T623 641ZM487 831Q487 824 476 800T449 750T418 703T395 682Q389 682 366 692T318 714T272 739T252 758Q252 773 263 800T290 855T319 902T338 922Q350 922 375 910T425 882T468 851T487 831ZM356 330Q356 325 351 312T337 283T318 248T297 215T278 190T264
180Q258 180 235 190T187 213T141 238T121 256Q121 271 132 298T159 353T188 400T207 420Q219 420 244 408T294 380T337 349T356 330Z" />
<glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="672" d="M549 674L399 473Q411 458 423 442T447 410T467 382T477 365Q477 322 462 279T420 194Q480 198 531 224T639 311Q648 302 662 287T686 260Q644 216 604 187T523 141T440 117T354 109Q320 73
281 43T202 -9T121 -43T45 -55Q34 -55 24 -53T3 -46Q-42 -104 -82 -155T-156 -250L-225 -197Q-187 -149 -148 -100T-69 2Q-98 29 -116 60T-135 117Q-135 193 -115 268T-51 408T60 524T221 600Q224 602 231 603T244 604Q256 604 270 596T296 576T318 552T332 533Q368
583 404 631T475 727L549 674ZM125 350Q82 286 62 232T36 138Q108 232 179 328T323 521Q312 515 291 505T243 476T186 427T125 350ZM233 254Q197 206 163 161T94 72H96Q133 72 170 101T243 177Q236 194 235 210T233 236V254Z" />
<glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="821" d="M475 88Q475 82 481 82Q492 82 514 95T566 128T627 173T688 221T740 265T776 295Q785 286 797 272T821 246Q799 224 766 193T693 129T611 63T528 5T453 -37T395 -53Q378 -53 357 -43T318 -16T287
21T274 59Q274 75 286 120T315 225Q270 164 227 118T148 38T85 -15T45 -45Q37 -50 26 -52T6 -55Q-13 -55 -36 -44T-78 -15T-111 23T-125 63Q-125 85 -111 136T-72 258T-14 417T57 602Q59 607 60 607T66 606Q85 603 118 591T182 563T237 535T260 516Q257 509 245
483T216 421T181 342T147 260T121 190T111 143Q111 139 115 139Q123 139 150 160T216 228T306 346T410 521L438 600Q441 608 451 608Q458 608 481 595T531 564T579 529T602 504Q602 501 601 494T598 481Q588 454 575 418T549 342T522 262T499 188T482 127T475 88ZM716
715Q693 704 673 698T624 684Q609 710 591 743T553 814T514 896T479 985Q530 1004 571 1014T632 1028L716 715V715Z" />
<glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="821" d="M475 88Q475 82 481 82Q492 82 514 95T566 128T627 173T688 221T740 265T776 295Q785 286 797 272T821 246Q799 224 766 193T693 129T611 63T528 5T453 -37T395 -53Q378 -53 357 -43T318 -16T287
21T274 59Q274 75 286 120T315 225Q270 164 227 118T148 38T85 -15T45 -45Q37 -50 26 -52T6 -55Q-13 -55 -36 -44T-78 -15T-111 23T-125 63Q-125 85 -111 136T-72 258T-14 417T57 602Q59 607 60 607T66 606Q85 603 118 591T182 563T237 535T260 516Q257 509 245
483T216 421T181 342T147 260T121 190T111 143Q111 139 115 139Q123 139 150 160T216 228T306 346T410 521L438 600Q441 608 451 608Q458 608 481 595T531 564T579 529T602 504Q602 501 601 494T598 481Q588 454 575 418T549 342T522 262T499 188T482 127T475 88ZM617
930Q561 861 496 799T365 684Q360 687 350 695T328 713T307 731T293 745Q318 776 349 818T409 901T461 977T494 1030Q515 1020 534 1005T570 974T599 947T617 930Z" />
<glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="821" d="M475 88Q475 82 481 82Q492 82 514 95T566 128T627 173T688 221T740 265T776 295Q785 286 797 272T821 246Q799 224 766 193T693 129T611 63T528 5T453 -37T395 -53Q378 -53 357 -43T318
-16T287 21T274 59Q274 75 286 120T315 225Q270 164 227 118T148 38T85 -15T45 -45Q37 -50 26 -52T6 -55Q-13 -55 -36 -44T-78 -15T-111 23T-125 63Q-125 85 -111 136T-72 258T-14 417T57 602Q59 607 60 607T66 606Q85 603 118 591T182 563T237 535T260 516Q257
509 245 483T216 421T181 342T147 260T121 190T111 143Q111 139 115 139Q123 139 150 160T216 228T306 346T410 521L438 600Q441 608 451 608Q458 608 481 595T531 564T579 529T602 504Q602 501 601 494T598 481Q588 454 575 418T549 342T522 262T499 188T482 127T475
88ZM835 702Q809 697 782 693T724 684Q710 722 695 770T669 872Q618 828 568 787T452 694Q441 710 429 721T399 752Q433 783 470 818T542 889T609 956T667 1014Q712 1008 742 996T798 969Q801 941 805 904T815 830T825 758T835 702Z" />
<glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="821" d="M475 88Q475 82 481 82Q492 82 514 95T566 128T627 173T688 221T740 265T776 295Q785 286 797 272T821 246Q799 224 766 193T693 129T611 63T528 5T453 -37T395 -53Q378 -53 357 -43T318
-16T287 21T274 59Q274 75 286 120T315 225Q270 164 227 118T148 38T85 -15T45 -45Q37 -50 26 -52T6 -55Q-13 -55 -36 -44T-78 -15T-111 23T-125 63Q-125 85 -111 136T-72 258T-14 417T57 602Q59 607 60 607T66 606Q85 603 118 591T182 563T237 535T260 516Q257
509 245 483T216 421T181 342T147 260T121 190T111 143Q111 139 115 139Q123 139 150 160T216 228T306 346T410 521L438 600Q441 608 451 608Q458 608 481 595T531 564T579 529T602 504Q602 501 601 494T598 481Q588 454 575 418T549 342T522 262T499 188T482 127T475
88ZM624 883Q624 877 612 853T585 802T554 754T532 733Q525 733 501 743T452 766T406 791T386 809Q386 824 397 852T424 907T453 955T472 975Q485 975 510 963T561 934T605 903T624 883ZM911 862Q911 856 899 832T872 782T841 734T819 713Q812 713 788 722T739
745T693 770T673 788Q673 803 684 831T711 886T740 934T759 954Q772 954 797 942T848 914T892 883T911 862Z" />
<glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="799" d="M805 248Q715 167 620 95T430 -44Q416 -86 398 -133T354 -240Q325 -306 288 -369T210 -487T124 -589T38 -668T-44 -720T-117 -739Q-133 -739 -156 -727T-200 -697T-235 -657T-250 -618Q-250
-555 -216 -495T-123 -373T17 -250T191 -121Q220 -44 247 39T301 205Q258 150 218 109T144 40T85 -6T47 -33Q39 -38 28 -40T8 -43Q-11 -43 -34 -32T-76 -3T-109 36T-123 76Q-123 98 -109 146T-70 264T-12 419T59 602Q61 607 62 607T68 606Q87 603 120 591T184 563T239
535T262 516Q259 509 247 483T218 421T183 342T149 260T123 190T113 143Q113 139 117 139Q124 139 147 157T206 214T285 313T378 459Q398 525 411 564T428 604Q434 604 459 589T512 554T562 513T584 481Q584 476 583 472T580 463Q557 393 540 337T510 233T486 147T465
70Q540 124 614 180T760 299L805 248ZM-123 -629Q-105 -629 -73 -595T-4 -506T70 -386T137 -255Q99 -287 52 -325T-36 -408T-105 -504T-133 -614Q-133 -629 -123 -629ZM635 930Q579 861 514 799T383 684Q378 687 368 695T346 713T325 731T311 745Q336 776 367 818T427
901T479 977T512 1030Q533 1020 552 1005T588 974T617 947T635 930Z" />
<glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="809" d="M276 1450Q341 1400 386 1357T471 1272Q434 1152 397 1037T323 809T248 587T171 366Q226 433 271 477T351 547T410 583T446 594Q462 594 481 582T518 553T553 518T580 489Q591 478 593 466T596
440Q596 393 580 338T538 228T479 124T412 41Q441 53 471 70T532 108T591 149T646 192Q707 240 764 295L809 246Q776 215 736 180T651 111T562 46T474 -9T396 -47T334 -61Q316 -61 289 -51T237 -25T193 7T174 39Q174 47 184 53T215 77T263 128T326 227Q345 263
362 301T392 374T412 432T420 465Q420 473 418 476T413 482Q409 484 406 483Q392 479 350 439T250 325T129 145T8 -98Q-37 -231 -83 -367T-178 -653L-432 -713Q-334 -440 -234 -176T-40 354T134 891T276 1450Z" />
<glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="799" d="M805 248Q715 167 620 95T430 -44Q416 -86 398 -133T354 -240Q325 -306 288 -369T210 -487T124 -589T38 -668T-44 -720T-117 -739Q-133 -739 -156 -727T-200 -697T-235 -657T-250 -618Q-250
-555 -216 -495T-123 -373T17 -250T191 -121Q220 -44 247 39T301 205Q258 150 218 109T144 40T85 -6T47 -33Q39 -38 28 -40T8 -43Q-11 -43 -34 -32T-76 -3T-109 36T-123 76Q-123 98 -109 146T-70 264T-12 419T59 602Q61 607 62 607T68 606Q87 603 120 591T184 563T239
535T262 516Q259 509 247 483T218 421T183 342T149 260T123 190T113 143Q113 139 117 139Q124 139 147 157T206 214T285 313T378 459Q398 525 411 564T428 604Q434 604 459 589T512 554T562 513T584 481Q584 476 583 472T580 463Q557 393 540 337T510 233T486 147T465
70Q540 124 614 180T760 299L805 248ZM-123 -629Q-105 -629 -73 -595T-4 -506T70 -386T137 -255Q99 -287 52 -325T-36 -408T-105 -504T-133 -614Q-133 -629 -123 -629ZM385 883Q385 877 373 853T346 802T315 754T293 733Q286 733 262 743T213 766T167 791T147 809Q147
824 158 852T185 907T214 955T233 975Q246 975 271 963T322 934T366 903T385 883ZM672 862Q672 856 660 832T633 782T602 734T580 713Q573 713 549 722T500 745T454 770T434 788Q434 803 445 831T472 886T501 934T520 954Q533 954 558 942T609 914T653 883T672
862Z" />
<glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="1024" d="M815 481Q811 463 805 443T790 403T774 366T760 340Q748 340 693 340T560 339T395 337T232 336T105 337T47 340Q50 352 56 370T70 407T85 443T98 469Q104 471 136 473T219 476T331 478T457
479T583 480T695 481T777 481T815 481Z" />
<glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="2048" d="M1931 481Q1927 463 1921 443T1906 403T1890 366T1876 340Q1858 340 1793 340T1628 340T1403 339T1139 338T856 337T575 337T316 336T101 337T-50 338T-117 340Q-114 352 -108 370T-94 407T-79
443T-66 469Q-54 471 7 472T165 475T387 477T650 478T935 479T1219 480T1482 481T1703 481T1859 481T1931 481Z" />
<glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="410" d="M242 1112Q242 1147 263 1193T317 1285T384 1371T449 1434Q453 1433 462 1428T480 1415T497 1401T506 1391Q495 1382 479 1361T446 1316T419 1271T408 1239Q408 1224 422 1209T455 1180T490
1156T512 1141Q508 1121 494 1094T464 1042T431 997T408 973Q393 973 365 986T310 1020T262 1065T242 1112Z" />
<glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="410" d="M614 1294Q614 1259 593 1213T540 1121T472 1036T408 973Q403 974 394 979T376 992T359 1006T350 1016Q361 1025 378 1046T410 1090T437 1135T449 1167Q449 1182 435 1197T401 1226T365
1250T344 1266Q348 1286 362 1313T392 1365T425 1409T449 1434Q464 1434 491 1421T546 1387T594 1341T614 1294Z" />
<glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="410" d="M150 98Q150 63 128 17T75 -75T7 -160T-57 -223Q-62 -222 -71 -217T-89 -204T-106 -190T-115 -180Q-104 -171 -87 -150T-55 -106T-28 -61T-16 -29Q-16 -14 -30 1T-64 30T-100 54T-121
70Q-117 90 -103 117T-73 169T-40 213T-16 238Q-1 238 27 225T82 191T130 145T150 98Z" />
<glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="737" d="M242 1112Q242 1147 263 1193T317 1285T384 1371T449 1434Q453 1433 462 1428T480 1415T497 1401T506 1391Q495 1382 479 1361T446 1316T419 1271T408 1239Q408 1224 422 1209T455 1180T490
1156T512 1141Q508 1121 494 1094T464 1042T431 997T408 973Q393 973 365 986T310 1020T262 1065T242 1112ZM569 1112Q569 1147 590 1193T644 1285T711 1371T776 1434Q780 1433 789 1428T807 1415T824 1401T834 1391Q823 1382 806 1361T774 1316T747 1271T735 1239Q735
1224 749 1209T782 1180T818 1156T840 1141Q836 1121 822 1094T792 1042T759 997T735 973Q720 973 692 986T637 1020T589 1065T569 1112Z" />
<glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="737" d="M942 1294Q942 1259 921 1213T867 1121T799 1036T735 973Q730 974 722 979T704 992T687 1006T678 1016Q689 1025 705 1046T738 1090T765 1135T776 1167Q776 1182 762 1197T729 1226T693
1250T672 1266Q676 1286 690 1313T720 1365T752 1409T776 1434Q791 1434 819 1421T874 1387T922 1341T942 1294ZM614 1294Q614 1259 593 1213T540 1121T472 1036T408 973Q403 974 394 979T376 992T359 1006T350 1016Q361 1025 378 1046T410 1090T437 1135T449 1167Q449
1182 435 1197T401 1226T365 1250T344 1266Q348 1286 362 1313T392 1365T425 1409T449 1434Q464 1434 491 1421T546 1387T594 1341T614 1294Z" />
<glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="737" d="M150 98Q150 63 128 17T75 -75T7 -160T-57 -223Q-62 -222 -71 -217T-89 -204T-106 -190T-115 -180Q-104 -171 -87 -150T-55 -106T-28 -61T-16 -29Q-16 -14 -30 1T-64 30T-100 54T-121
70Q-117 90 -103 117T-73 169T-40 213T-16 238Q-1 238 27 225T82 191T130 145T150 98ZM477 98Q477 63 456 17T402 -75T334 -160T270 -223Q265 -222 257 -217T239 -204T222 -190T213 -180Q224 -171 240 -150T273 -106T300 -61T311 -29Q311 -14 297 1T264 30T228
54T207 70Q211 90 225 117T255 169T287 213T311 238Q326 238 354 225T409 191T457 145T477 98Z" />
<glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="614" d="M453 555Q453 505 430 461T371 382T290 329T199 309Q175 309 147 322T94 356T54 404T37 459Q37 507 55 554T106 638T184 698T285 721Q308 721 337 707T392 669T435 616T453 555Z" />
<glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="573" d="M403 471Q366 451 324 430Q288 411 241 388T141 340Q179 308 219 279T294 228Q334 202 371 180Q361 161 349 141T323 101T297 64T274 35Q252 52 217 83T144 148T75 215T25 266Q33 300
43 344T74 434Q75 437 102 454T169 495T256 548T346 600T419 642T457 664Q453 641 447 614T433 560T417 510T403 471Z" />
<glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="573" d="M74 227Q112 247 154 268Q190 286 237 309T336 356Q298 389 258 418T183 470Q143 496 106 518Q116 537 128 557T154 597T181 634T205 664Q219 653 240 635T284 594T333 549T381 503T423
463T453 432Q445 398 434 354T403 264Q402 261 376 244T309 203T221 150T132 98T58 56T20 35Q25 58 31 85T45 138T60 188T74 227Z" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 147 KiB

View File

@@ -1,4 +1,6 @@
// based on https://github.com/Akryum/v-tooltip/blob/83615e394c96ca491a4df04b892ae87e833beb97/demo-src/src/App.vue#L179-L303 // based on https://github.com/Akryum/v-tooltip/blob/83615e394c96ca491a4df04b892ae87e833beb97/demo-src/src/App.vue#L179-L303
@import "@/presentation/styles/colors.scss";
.tooltip { .tooltip {
display: block !important; display: block !important;
z-index: 10000; z-index: 10000;

View File

@@ -1,7 +1,15 @@
// Overrides base styling for LiquorTree // Overrides base styling for LiquorTree
@import "@/presentation/styles/colors.scss";
.tree {
background-color: $slate;
}
.tree-node > .tree-content > .tree-anchor > span { .tree-node > .tree-content > .tree-anchor > span {
color: $white !important; color: $white !important;
text-transform: uppercase;
color: $light-gray;
font-size: 1.5em;
} }
.tree-node { .tree-node {

20
src/shims-tsx.d.ts vendored
View File

@@ -1,13 +1,17 @@
import Vue, { VNode } from 'vue'; import Vue, { VNode } from 'vue';
declare global { declare global {
namespace JSX { namespace JSX {
// tslint:disable no-empty-interface // tslint:disable no-empty-interface
interface Element extends VNode {} interface Element extends VNode {
// tslint:disable no-empty-interface }
interface ElementClass extends Vue {}
interface IntrinsicElements { // tslint:disable no-empty-interface
[elem: string]: any; interface ElementClass extends Vue {
}
interface IntrinsicElements {
[elem: string]: any;
}
} }
}
} }

4
src/shims-vue.d.ts vendored
View File

@@ -1,4 +1,4 @@
declare module '*.vue' { declare module '*.vue' {
import Vue from 'vue'; import Vue from 'vue';
export default Vue; export default Vue;
} }

View File

@@ -11,7 +11,7 @@ describe('UserSelection', () => {
// arrange // arrange
const app = new ApplicationStub() const app = new ApplicationStub()
.withCategory(new CategoryStub(1) .withCategory(new CategoryStub(1)
.withScripts('s1', 's2', 's3', 's4')); .withScriptIds('s1', 's2', 's3', 's4'));
const selectedScripts = [new ScriptStub('s1'), new ScriptStub('s2'), new ScriptStub('s3')]; const selectedScripts = [new ScriptStub('s1'), new ScriptStub('s2'), new ScriptStub('s3')];
const sut = new UserSelection(app, selectedScripts); const sut = new UserSelection(app, selectedScripts);
@@ -26,7 +26,7 @@ describe('UserSelection', () => {
// arrange // arrange
const app = new ApplicationStub() const app = new ApplicationStub()
.withCategory(new CategoryStub(1) .withCategory(new CategoryStub(1)
.withScripts('s1', 's2', 's3', 's4')); .withScriptIds('s1', 's2', 's3', 's4'));
const selectedScripts = [new ScriptStub('s1'), new ScriptStub('s2'), new ScriptStub('s3')]; const selectedScripts = [new ScriptStub('s1'), new ScriptStub('s2'), new ScriptStub('s3')];
const sut = new UserSelection(app, selectedScripts); const sut = new UserSelection(app, selectedScripts);
const expected = [new ScriptStub('s2'), new ScriptStub('s3'), new ScriptStub('s4')]; const expected = [new ScriptStub('s2'), new ScriptStub('s3'), new ScriptStub('s4')];

View File

@@ -0,0 +1,62 @@
import { ScriptStub } from './../stubs/ScriptStub';
import { CategoryStub } from './../stubs/CategoryStub';
import { Application } from './../../../src/domain/Application';
import 'mocha';
import { expect } from 'chai';
describe('Application', () => {
it('getRecommendedScripts returns as expected', () => {
// arrange
const expected = [
new ScriptStub('S3').withIsRecommended(true),
new ScriptStub('S4').withIsRecommended(true),
];
const sut = new Application('name', 'repo', 2, [
new CategoryStub(3).withScripts(expected[0], new ScriptStub('S1').withIsRecommended(false)),
new CategoryStub(2).withScripts(expected[1], new ScriptStub('S2').withIsRecommended(false)),
]);
// act
const actual = sut.getRecommendedScripts();
// assert
expect(expected[0]).to.deep.equal(actual[0]);
expect(expected[1]).to.deep.equal(actual[1]);
});
it('cannot construct without categories', () => {
// arrange
const categories = [];
// act
function construct() { return new Application('name', 'repo', 2, categories); }
// assert
expect(construct).to.throw('Application must consist of at least one category');
});
it('cannot construct without scripts', () => {
// arrange
const categories = [
new CategoryStub(3),
new CategoryStub(2),
];
// act
function construct() { return new Application('name', 'repo', 2, categories); }
// assert
expect(construct).to.throw('Application must consist of at least one script');
});
it('cannot construct without any recommended scripts', () => {
// arrange
const categories = [
new CategoryStub(3).withScripts(new ScriptStub('S1').withIsRecommended(false)),
new CategoryStub(2).withScripts(new ScriptStub('S2').withIsRecommended(false)),
];
// act
function construct() { return new Application('name', 'repo', 2, categories); }
// assert
expect(construct).to.throw('Application must consist of at least one recommended script');
});
});

View File

@@ -0,0 +1,17 @@
import 'mocha';
import { expect } from 'chai';
import { Script } from '@/domain/Script';
describe('Script', () => {
it('cannot construct with duplicate lines', () => {
// arrange
const code = 'duplicate\nduplicate\ntest\nduplicate';
// act
function construct() { return new Script('ScriptName', code, [], true); }
// assert
expect(construct).to.throw();
});
});

View File

@@ -1,6 +1,11 @@
import { IApplication, ICategory, IScript } from '@/domain/IApplication'; import { IApplication, ICategory, IScript } from '@/domain/IApplication';
export class ApplicationStub implements IApplication { export class ApplicationStub implements IApplication {
public readonly totalScripts = 0;
public readonly totalCategories = 0;
public readonly name = 'StubApplication';
public readonly repositoryUrl = 'https://privacy.sexy';
public readonly version = 1;
public readonly categories = new Array<ICategory>(); public readonly categories = new Array<ICategory>();
public withCategory(category: ICategory): IApplication { public withCategory(category: ICategory): IApplication {
@@ -10,12 +15,16 @@ export class ApplicationStub implements IApplication {
public findCategory(categoryId: number): ICategory { public findCategory(categoryId: number): ICategory {
throw new Error('Method not implemented.'); throw new Error('Method not implemented.');
} }
public getRecommendedScripts(): readonly IScript[] {
throw new Error('Method not implemented.');
}
public findScript(scriptId: string): IScript { public findScript(scriptId: string): IScript {
throw new Error('Method not implemented.'); throw new Error('Method not implemented.');
} }
public getAllScripts(): ReadonlyArray<IScript> { public getAllScripts(): ReadonlyArray<IScript> {
throw new Error('Method not implemented.'); throw new Error('Method not implemented.');
} }
public getAllCategories(): ReadonlyArray<ICategory> {
throw new Error('Method not implemented.');
}
} }

View File

@@ -11,10 +11,16 @@ export class CategoryStub extends BaseEntity<number> implements ICategory {
constructor(id: number) { constructor(id: number) {
super(id); super(id);
} }
public withScripts(...scriptIds: string[]): CategoryStub { public withScriptIds(...scriptIds: string[]): CategoryStub {
for (const scriptId of scriptIds) { for (const scriptId of scriptIds) {
this.scripts.push(new ScriptStub(scriptId)); this.scripts.push(new ScriptStub(scriptId));
} }
return this; return this;
} }
public withScripts(...scripts: IScript[]): CategoryStub {
for (const script of scripts) {
this.scripts.push(script);
}
return this;
}
} }

View File

@@ -5,8 +5,14 @@ export class ScriptStub extends BaseEntity<string> implements IScript {
public readonly name = `name${this.id}`; public readonly name = `name${this.id}`;
public readonly code = `name${this.id}`; public readonly code = `name${this.id}`;
public readonly documentationUrls = new Array<string>(); public readonly documentationUrls = new Array<string>();
public isRecommended = false;
constructor(public readonly id: string) { constructor(public readonly id: string) {
super(id); super(id);
} }
public withIsRecommended(value: boolean): ScriptStub {
this.isRecommended = value;
return this;
}
} }