Browse Source

initial commit in new repo

tags/1.0.0
Ro 2 years ago
parent
commit
6f7fed59f3
100 changed files with 52093 additions and 0 deletions
  1. +1
    -0
      .babelrc
  2. +13
    -0
      .gitignore
  3. +109
    -0
      brain/app.js
  4. +101
    -0
      brain/models/Bookmark.js
  5. +94
    -0
      brain/models/FolioProject.js
  6. +116
    -0
      brain/models/Post.js
  7. +80
    -0
      brain/models/User.js
  8. +51
    -0
      brain/models/index.js
  9. +339
    -0
      brain/routes/back/index.js
  10. +46
    -0
      brain/routes/front/fipamo.js
  11. +112
    -0
      brain/routes/front/index.js
  12. +68
    -0
      brain/routes/front/post.js
  13. +37
    -0
      brain/routes/front/work.js
  14. +95
    -0
      brain/utils/DateUtils.js
  15. +112
    -0
      brain/utils/RightsManager.js
  16. +104
    -0
      init.js
  17. +63
    -0
      package.json
  18. +2410
    -0
      themes/dash/assets/css/dash.css
  19. +1
    -0
      themes/dash/assets/css/dash.css.map
  20. BIN
     
  21. +4581
    -0
      themes/dash/assets/css/fonts/Apercu-Bold.svg
  22. BIN
     
  23. BIN
     
  24. BIN
     
  25. BIN
     
  26. +5663
    -0
      themes/dash/assets/css/fonts/Apercu-BoldItalic.svg
  27. BIN
     
  28. BIN
     
  29. BIN
     
  30. BIN
     
  31. +6595
    -0
      themes/dash/assets/css/fonts/Apercu-Italic.svg
  32. BIN
     
  33. BIN
     
  34. BIN
     
  35. BIN
     
  36. +4265
    -0
      themes/dash/assets/css/fonts/Apercu-Light.svg
  37. BIN
     
  38. BIN
     
  39. BIN
     
  40. BIN
     
  41. +5937
    -0
      themes/dash/assets/css/fonts/Apercu-LightItalic.svg
  42. BIN
     
  43. BIN
     
  44. BIN
     
  45. BIN
     
  46. +5562
    -0
      themes/dash/assets/css/fonts/Apercu-Medium.svg
  47. BIN
     
  48. BIN
     
  49. BIN
     
  50. BIN
     
  51. +5771
    -0
      themes/dash/assets/css/fonts/Apercu-MediumItalic.svg
  52. BIN
     
  53. BIN
     
  54. BIN
     
  55. BIN
     
  56. +670
    -0
      themes/dash/assets/css/fonts/Apercu-Mono.svg
  57. BIN
     
  58. BIN
     
  59. BIN
     
  60. BIN
     
  61. +5062
    -0
      themes/dash/assets/css/fonts/Apercu.svg
  62. BIN
     
  63. BIN
     
  64. BIN
     
  65. BIN
     
  66. BIN
     
  67. BIN
     
  68. BIN
     
  69. BIN
     
  70. +823
    -0
      themes/dash/assets/images/sprite.svg
  71. +12
    -0
      themes/dash/assets/images/the-logo.svg
  72. +1952
    -0
      themes/dash/assets/js/dash.min.js
  73. +1
    -0
      themes/dash/assets/js/dash.min.map
  74. +1
    -0
      themes/dash/assets/js/dashkit.min.js
  75. +29
    -0
      themes/dash/entries-index.pug
  76. +84
    -0
      themes/dash/entry-edit.pug
  77. +28
    -0
      themes/dash/fipamo-edit.pug
  78. +32
    -0
      themes/dash/fipamo-index.pug
  79. +29
    -0
      themes/dash/frame.pug
  80. +9
    -0
      themes/dash/index.pug
  81. +21
    -0
      themes/dash/partials/folio-hub.pug
  82. +39
    -0
      themes/dash/partials/folio-project-display.pug
  83. +32
    -0
      themes/dash/partials/front.pug
  84. +9
    -0
      themes/dash/partials/login.pug
  85. +14
    -0
      themes/dash/partials/project-panel.pug
  86. +10
    -0
      themes/dash/partials/signup-form.pug
  87. +6
    -0
      themes/dash/settings.pug
  88. +44
    -0
      themes/dash/src/com/Base.jsx
  89. +6
    -0
      themes/dash/src/com/Start.jsx
  90. +164
    -0
      themes/dash/src/com/controllers/DashEntry.jsx
  91. +58
    -0
      themes/dash/src/com/controllers/DashIndex.jsx
  92. +56
    -0
      themes/dash/src/com/controllers/DisplayAdminFipamo.jsx
  93. +75
    -0
      themes/dash/src/com/controllers/DisplayAdminFolio.jsx
  94. +36
    -0
      themes/dash/src/com/controllers/DisplayBlog.jsx
  95. +79
    -0
      themes/dash/src/com/controllers/DisplayClient.jsx
  96. +35
    -0
      themes/dash/src/com/controllers/DisplayFi.jsx
  97. +65
    -0
      themes/dash/src/com/controllers/DisplayIndex.jsx
  98. +75
    -0
      themes/dash/src/com/controllers/DisplayManager.jsx
  99. +130
    -0
      themes/dash/src/com/controllers/DisplayWork.jsx
  100. +81
    -0
      themes/dash/src/com/tasks/EntryTasks.jsx

+ 1
- 0
.babelrc View File

@@ -0,0 +1 @@
{ "presets": ["env"] }

+ 13
- 0
.gitignore View File

@@ -0,0 +1,13 @@
content/
node_modules/
.sass-cache/
.cache/
content/folio-images
.ftpconfig
.vscode/
config.development.json
*.swp
/_migrations/
/config.json
/_maintenance/
*.DS_Store

+ 109
- 0
brain/app.js View File

@@ -0,0 +1,109 @@
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var MemoryStore = require('memorystore')(session)
var flash = require('connect-flash');
var theme = "default";
var app = express();

// view engine setup
app.set('views', path.join(__dirname, '../themes'));
app.set('view engine', 'pug');
//app.use(express.static(__dirname+'/content/data'));
app.use(express.static(__dirname + '../content/folio-images'));

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(cookieParser());
//app.use(require('node-compass')({mode: 'expanded', css:'styles', sass: 'styles', project: path.join(__dirname, 'src')}));
app.use(express.static(path.join(__dirname, '../content')));
app.use(express.static(path.join(__dirname, '../themes')));

// Why Do we need this key ?
/**
app.use(session({
secret: '1KqZ18W8KskE1iSw',
saveUninitialized: false,
resave: false,
cookie:{maxAge:608800000}
}));
**/

app.use(session({
store: new MemoryStore({
checkPeriod: 86400000 // prune expired entries every 24h
}),
secret: '1KqZ18W8KskE1iSw',
saveUninitialized: false,
resave: false,
cookie: { maxAge: 608800000 }
}))


app.use(flash());

//sections
var front = require('./routes/front/index')(session);
var back = require('./routes/back/index');

//api
var folioLibrary = require('./api/content/folio');
var blogLibrary = require('./api/content/posts');
var projectLibrary = require('./api/content/project');
var bookmarkLibrary = require('./api/content/bookmarks');
var postLibrary = require('./api/content/posts');
var mailer = require('./api/content/mailer');

// API PATHS
app.use('/api/folio', folioLibrary);
app.use('/api/projects', projectLibrary);
app.use('/api/bookmarks', bookmarkLibrary);
app.use('/api/posts', postLibrary);
app.use('/api/blog', blogLibrary);

// PAGES
app.use('/', front);
app.use('/@/dashboard', back);
//app.use('/mailer', mailer);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render(theme+'/error', {
message: err.message,
error: err
});
});
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render(theme+'/error', {
message: err.message,
error: {}
});
});

module.exports = app;

+ 101
- 0
brain/models/Bookmark.js View File

@@ -0,0 +1,101 @@
module.exports = function (sequelize, DataTypes) {
var Bookmark = sequelize.define('Bookmark', {
id: {
type: DataTypes.INTEGER,
unique: true,
allowNull: false,
autoIncrement: true,
primaryKey: true
},
url: {
type: DataTypes.STRING(500),
unique: false,
allowNull: true
},
source: {
type: DataTypes.STRING(500),
allowNull: true
},
title: {
type: DataTypes.STRING(500),
unique: false,
allowNull: true
},
image: {
type: DataTypes.STRING(500),
unique: false,
allowNull: true
},
comments: {
type: DataTypes.STRING,
unique: false,
allowNull: true
},
author: {
type: DataTypes.STRING,
unique: false,
allowNull: true
},
tags: {
type: DataTypes.ARRAY(DataTypes.TEXT),
unique: false,
allowNull: true
},
listed: {
type: DataTypes.BOOLEAN,
unique: false,
allowNull: true
}
}, {
timestamps: true,

// don't delete database entries but set the newly added attribute deletedAt
// to the current date (when deletion was done). paranoid will only work if
// timestamps are enabled
paranoid: true,

// don't use camelcase for automatically added attributes but underscore style
// so updatedAt will be updated_at
underscored: true,

// disable the modification of table names; By default, sequelize will automatically
// transform all passed model names (first parameter of define) into plural.
// if you don't want that, set the following
freezeTableName: false,

// define the table's name
tableName: 'Bookmarks',

// Enable optimistic locking. When enabled, sequelize will add a version count attriubte
// to the model and throw an OptimisticLockingError error when stale instances are saved.
// Set to true or a string with the attribute name you want to use to enable.
version: true
});

return Bookmark;
};

/**
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

var Bookmark = new mongoose.Schema({
url: String,
source:String,
title:String,
image: String,
comments:Array,
created: String,
edited: String,
author:Object,
tags:Array,
listed:Boolean
}, {
collection: 'bookmarks'
});

module.exports = mongoose.model('Bookmark', Bookmark);



**/

+ 94
- 0
brain/models/FolioProject.js View File

@@ -0,0 +1,94 @@
module.exports = function (sequelize, DataTypes) {
var FolioProject = sequelize.define('FolioProject', {
type: {
type: DataTypes.STRING(500),
unique: false,
allowNull: true
},
description: {
type: DataTypes.STRING(500),
allowNull: true
},
url: {
type: DataTypes.STRING(500),
unique: false,
allowNull: true
},
tools: {
type: DataTypes.STRING(500),
unique: false,
allowNull: true
},
title: {
type: DataTypes.STRING,
unique: false,
allowNull: true
},
slug: {
type: DataTypes.STRING,
unique: false,
allowNull: true
},
images: {
type: DataTypes.STRING(2000),
unique: false,
allowNull: true
},
sortIndex: {
type: DataTypes.INTEGER,
unique: false,
allowNull: true
}
}, {
timestamps: true,

// don't delete database entries but set the newly added attribute deletedAt
// to the current date (when deletion was done). paranoid will only work if
// timestamps are enabled
paranoid: true,

// don't use camelcase for automatically added attributes but underscore style
// so updatedAt will be updated_at
underscored: true,

// disable the modification of table names; By default, sequelize will automatically
// transform all passed model names (first parameter of define) into plural.
// if you don't want that, set the following
freezeTableName: false,

// define the table's name
tableName: 'Folio',

// Enable optimistic locking. When enabled, sequelize will add a version count attriubte
// to the model and throw an OptimisticLockingError error when stale instances are saved.
// Set to true or a string with the attribute name you want to use to enable.
version: true
});

return FolioProject;
};

/**
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

var Bookmark = new mongoose.Schema({
url: String,
source:String,
title:String,
image: String,
comments:Array,
created: String,
edited: String,
author:Object,
tags:Array,
listed:Boolean
}, {
collection: 'bookmarks'
});

module.exports = mongoose.model('Bookmark', Bookmark);



**/

+ 116
- 0
brain/models/Post.js View File

@@ -0,0 +1,116 @@
module.exports = function (sequelize, DataTypes) {
var Post = sequelize.define('Post', {
uuid: {
type: DataTypes.STRING(50),
unique: true,
allowNull: false
},
title: {
type: DataTypes.STRING(500),
allowNull: true
},
slug: {
type: DataTypes.STRING(500),
unique: false,
allowNull: true
},
tags: {
type: DataTypes.STRING(2000),
unique: false,
allowNull: true
},
entry_html: {
type: DataTypes.TEXT,
unique: false,
allowNull: true
},
entry_plaintext: {
type: DataTypes.TEXT,
unique: false,
allowNull: true
},
feature_image: {
type: DataTypes.STRING,
unique: false,
allowNull: true
},
page: {
type: DataTypes.BOOLEAN,
unique: false,
allowNull: true
},
author_id: {
type: DataTypes.INTEGER,
unique: false,
allowNull: true
}
}, {
timestamps: true,

// don't delete database entries but set the newly added attribute deletedAt
// to the current date (when deletion was done). paranoid will only work if
// timestamps are enabled
paranoid: true,

// don't use camelcase for automatically added attributes but underscore style
// so updatedAt will be updated_at
underscored: true,

// disable the modification of table names; By default, sequelize will automatically
// transform all passed model names (first parameter of define) into plural.
// if you don't want that, set the following
freezeTableName: false,

// define the table's name
tableName: 'Posts',

// Enable optimistic locking. When enabled, sequelize will add a version count attriubte
// to the model and throw an OptimisticLockingError error when stale instances are saved.
// Set to true or a string with the attribute name you want to use to enable.
version: true
});

return Post;
};

/**


post: {
"id": "59711abc12d3ab0bd61c3abc",
"uuid": "ec630e45-3342-4d7f-a24c-e448263c975b",
"title": "Welcome to Ghost",
"slug": "welcome-to-ghost",
"mobiledoc": "{\"version\":\"0.3.1\",\"markups\":[],\"atoms\":[],\"cards\":[[\"card-markdown\",{\"cardName\":\"card-markdown\",\"markdown\":\"You're live nice!\"}]],\"sections\":[[10,0]]}",
"html": "<p>You're live! Nice.</p>",
"plaintext": "You're live! Nice.",
"amp": "Not what you think!",
"feature_image": "/content/images/2014/12/my-image.png",
"featured": false,
"page": false,
"status": "published",
"locale": null,
"visibility": "public",
"meta_title": null,
"meta_description": null,
"author_id": "59711abc78f1ab0bd61c3efg",
"created_at": "2014-04-15T12:36:28.353Z",
"created_by": "59711abc78f1ab0bd61c3efg",
"updated_at": "2014-04-15T12:36:28.353Z",
"updated_by": "59711abc78f1ab0bd61c3efg",
"published_at": "2014-04-15T12:36:28.363Z",
"published_by": "59711abc78f1ab0bd61c3efg",
"custom_excerpt": null,
"codeinjection_head": null,
"codeinjection_foot": null,
"og_image": null,
"og_title": null,
"og_description": null,
"twitter_image": null,
"twitter_title": null,
"twitter_description": null
}



**/

+ 80
- 0
brain/models/User.js View File

@@ -0,0 +1,80 @@
module.exports = function (sequelize, DataTypes) {
var User = sequelize.define('User', {
avatar: {
type: DataTypes.STRING,
unique: false,
allowNull: true
},
handle: {
type: DataTypes.STRING,
unique: true,
allowNull: true
},
email: {
type: DataTypes.STRING,
unique: false,
allowNull: true
},
role: {
type: DataTypes.STRING,
unique: false,
allowNull: true
},
password: {
type: DataTypes.STRING,
unique: true,
allowNull: false
}
}, {
timestamps: true,

// don't delete database entries but set the newly added attribute deletedAt
// to the current date (when deletion was done). paranoid will only work if
// timestamps are enabled
paranoid: true,

// don't use camelcase for automatically added attributes but underscore style
// so updatedAt will be updated_at
underscored: true,

// disable the modification of table names; By default, sequelize will automatically
// transform all passed model names (first parameter of define) into plural.
// if you don't want that, set the following
freezeTableName: false,

// define the table's name
tableName: 'Users',

// Enable optimistic locking. When enabled, sequelize will add a version count attriubte
// to the model and throw an OptimisticLockingError error when stale instances are saved.
// Set to true or a string with the attribute name you want to use to enable.
version: true
});

return User;
};

/**
var User = new mongoose.Schema({
avatar: String,
handle: String,
firstname: String,
lastname: String,
email: String,
password: String,
bio: {
type: String,
default: 'I\'m actually really interesting, but, alas, I am kind of lazy.'
},
role: {
type: String,
default: 'client'
},
created_at: Date,
last_login: Date
}, {
collection: 'users'
});

module.exports = mongoose.model('User', User);
**/

+ 51
- 0
brain/models/index.js View File

@@ -0,0 +1,51 @@
'use strict';

var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var basename = path.basename(__filename);
var env = process.env.NODE_ENV || 'development';
var config = require('../../config.json')[env];
var db = {};


//console.log(config.database);

/**
if (config.use_env_variable) {
var sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
var sequelize = new Sequelize(config.local.database, config.local.user, config.local.password, config.local.options);
}
**/
var sequelize = new Sequelize(config.database, config.user, config.password, config.options);

/**
sequelize.authenticate().then(() => {
console.log("Success!");
}).catch((err) => {
console.log(""+err);
});
**/


fs
.readdirSync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(file => {
var model = sequelize['import'](path.join(__dirname, file));
db[model.name] = model;
});

Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});

db.sequelize = sequelize;
//db.Sequelize = Sequelize;

module.exports = db;

+ 339
- 0
brain/routes/back/index.js View File

@@ -0,0 +1,339 @@
var express = require('express');
var router = express.Router();
var Models = require('../../models');
var DateUtils = require('../../utils/DateUtils');
var hljs = require('highlight.js/lib/highlight');
var hljs_md = require('highlight.js/lib/languages/markdown');
hljs.registerLanguage('markdown', hljs_md);

//--------------------------
// Index
//--------------------------
router.get('/', function (req, res) {
var loggedIn = false
if (req.session.user)
loggedIn = true;

Models.Post.findAll({
order: [
['id', 'DESC']
],
limit: 10
}).then(function (posts) {
res.render('dash/index', {
title: 'Dashboard',
user_status: loggedIn,
items: posts
});
}).then(function (value) {
//console.log(value);
}).catch(function (err) {
//next(err);
})
});

//--------------------------
// SETTINGS
//--------------------------
router.get('/settings/', function (req, res) {
if (req.session.user) {
res.render('dash/settings', {
title: 'Dashboard | Settings',
mode: 'admin'
});
} else {
res.redirect('/@/dashboard');
}
});


//--------------------------
// ENTRIES
//--------------------------
router.get('/entries/:page?', function (req, res) {
var pageNum = req.params.page;
if(pageNum == "" || pageNum == null) pageNum = 1;
var offset = ((pageNum*5) -5);
if (req.session.user) {
Models.Post.findAll({
order: [
['id', 'DESC']
]
}).then(function (posts) {
var count = Math.round(posts.length / 6);
//console.log("COUNT: "+count);
var pageItems = [];
var itemLimit = 6;
var rangeStart = (pageNum * itemLimit) - itemLimit;
for (var i = 0; i < itemLimit; i++) {
try {
if (posts[i + rangeStart].id != null) {
pageItems.push(posts[i + rangeStart]);
}
} catch (e) {
//console.log(e)
}
}
res.render('dash/entries-index', {
title: 'Dashbord Entries',
mode: 'admin',
items: pageItems,
page_index: pageNum,
page_count: count
});
}).then(function (value) {
//console.log(value);
}).catch(function (err) {
//next(err);
})
} else {
res.redirect('/@/dashboard');
}
});


//--------------------------
// BLOG POST ADD DISPLAY
//--------------------------
router.get('/entries/add/', function (req, res) {
if (req.session.user) {
res.render('dash/entry-edit', {
title: 'Add Entry',
mode: 'admin',
edit: false
});
} else {
res.redirect('/@/dashboard');
}
});
//--------------------------
// BLOG POST EDIT DISPLAY
//--------------------------
router.get('/entries/edit/:id', function (req, res) {
if (req.session.user) {
Models.Post.findOne({
where: {
slug: req.params.id
}
}).then(entry => {
let featured_img = JSON.parse(entry.feature_image);
let featured = 'null';
if (featured_img.length != 0)
featured = featured_img[0].substr(7, featured_img[0].length);
let pretty = hljs.highlight('markdown', entry.entry_plaintext).value;

let newdate = new Date(entry.created_at);
let formattedDate = newdate.getFullYear()+"-"+newdate.getMonth()+"-"+newdate.getDate();
console.log(DateUtils.getDate('null', 'full'));
res.render('dash/entry-edit', {
title: 'Edit Entry',
mode: 'admin',
post: entry,
date:formattedDate,
colored: pretty,
html: entry.entry_plaintext,
feature: featured,
edit: true
});
}).then(function (value) {
console.log("VALUE: " + value);
}).catch(function (err) {
console.log(err);
})
} else {
res.redirect('/@/dashboard');
}
});
/**
//--------------------------
// MAIN FIPAMO DISPLAY
//--------------------------
router.get('/fipamo/', function (req, res) {
if (req.session.user) {
Models.Bookmark.findAll({
order: [['id', 'DESC']]
}).then(function (saved) {
res.render('admin/admin-fipamo-index', {
title: 'Manage Saved',
mode: 'admin',
saved: saved
});
}).then(function (value) {
//console.log(value);
}).catch(function (err) {
//next(err);
})
} else {
res.redirect('/admin');
}
});

router.get('/fipamo/edit/:id', function (req, res) {
if (req.session.user) {
Models.Bookmark.findOne({
where: {
id: req.params.id
}
}).then(saved => {
res.render('admin/admin-fipamo-edit', {
title: 'FIPAMO | EDIT ' + saved.title,
mode: 'admin',
bookmark: saved,
edit: true
});
}).then(function (value) {
console.log("VALUE: " + value);
}).catch(function (err) {
console.log(err);
})
} else {
res.redirect('/admin');
}
});



//--------------------------
// MAIN FOLIO DISPLAY
//--------------------------
router.get('/folio/', function (req, res) {
if (req.session.user) {
Models.FolioProject.findAll().then(function (projects) {
res.render('folio-hub', {
title: 'manage folio',
mode: 'admin',
projects: projects
});
}).then(function (value) {
//console.log(value);
}).catch(function (err) {
//next(err);
})
} else {
res.redirect('/admin');
}
});

//--------------------------
// PROJECT DISPLAY
//--------------------------

router.get('/folio/:id', function (req, res) {
if (req.session.user) {
console.log(req.params.id)
Models.FolioProject.findOne({
where: {
slug: req.params.id
}
}).then(function (project) {
//var item = project[0]
res.render('folio-project-display', {
title: project.title,
project: project,
edit: true,
mode: 'admin'
});
}).then(function (value) {
//console.log(value);
}).catch(function (err) {
//next(err);
});
} else {
res.redirect('/admin');
}
});

router.get('/folio/task/add', function (req, res) {
if (req.user) {
res.render('folio-project-display', {
title: 'Add New Project',
edit: false,
mode: 'admin'
});
} else {
res.redirect('/admin');
}
});



//--------------------------
// ADMIN PAGE
//--------------------------
router.get('/admin/:include/:id?', function (req, res) {
if (req.user) {
if (req.user.role == 2) {
switch (req.params.include) {
case "edit-project":
FolioProject.findById(req.params.id).exec().then(function (project) {
res.render('includes/folio-project', {
formTitle: "EDIT " + project.title,
project: project,
mode: req.params.include
});
}).catch(function (err) {
//console.log(err)
});
break
case "add-project":
res.render('includes/folio-project', {
formTitle: 'Fo r mle ss ADMIN | Add New Project',
mode: req.params.include
});
break
case "folio-hub":
FolioProject.find().exec().then(function (entries) {
//res.json(entries);
res.render('content/folio-hub', {
title: 'Fo r mle ss ADMIN | Folio Manager',
entries: entries
});
}).then(function (value) {
//console.log(value);
}).catch(function (err) {
next(err);
});
break
}
}
} else {
res.json({
message: 'NOT AUTHORIZED'
});
}
});
router.get('/includes/admin-menu/', function (req, res) {
if (req.user) {
if (req.user == 1) {
res.render('client-panel')
} else {
res.render('includes/admin-menu', {
title: 'Fo r mle ss | Admin',
user_status: "What up, random entity",
name: "What up, " + req.user.firstname
})
}
} else {
res.render('index', {
title: 'Fo r mle ss',
user_status: "What up, random entity"
});
}
});
router.get('/content/admin/', function (req, res) {
if (req.user) {
if (req.user == 1) {
res.render('client-panel')
} else {
res.render('content/admin', {
title: 'Fo r mle ss | Admin'
})
}
} else {
res.render('content/index', {
title: 'Fo r mle ss'
});
}
});
*/
module.exports = router;

+ 46
- 0
brain/routes/front/fipamo.js View File

@@ -0,0 +1,46 @@
var express = require('express');
var router = express.Router();
var Models = require('../../models');
var config = require('../../../config.json');
router.get('/:page_num?', function (req, res) {
var page_num = req.params.page_num;
var pageNum = page_num;
if (page_num == null)
pageNum = 1
Models.Bookmark.findAll({
order: [['id', 'DESC']]
}).then(function (bookmarks) {
//console.log("num: "+pageNum);
//real page count
var count = Math.floor(bookmarks.length / 10);
var pageItems = [];
var itemLimit = 10;
var rangeStart = (pageNum * itemLimit) - itemLimit;
//console.log("RANGE START "+rangeStart);
for (var i = 0; i < itemLimit; i++) {
try {
if (bookmarks[i + rangeStart].id != null) {
//console.log(bookmarks[i+rangeStart]._id )
pageItems.push(bookmarks[i + rangeStart]);
}
} catch (e) {
//console.log(e)
}
}
//console.log("items count: "+pageItems.length)
res.render(config.theme+'/fipamo', {
theme: config.theme,
title: 'The Twelfth House | Fipamo',
page_index: pageNum,
page_count: Math.round(bookmarks.length / 10),
items: pageItems,
mode: 'bookmarks'
});
}).then(function (value) {
//console.log(value);
}).catch(function (err) {
console.log(err);
})
});
router.get('/:id', function (req, res) {});
module.exports = router;

+ 112
- 0
brain/routes/front/index.js View File

@@ -0,0 +1,112 @@
var express = require('express');
var router = express.Router();
var Models = require('../../models');
var bCrypt = require('bcrypt-nodejs');
var config = require('../../../config.json');
module.exports = function (session) {
//--------------------------
// Index
//--------------------------
router.get('/:page?', function (req, res) {

if (req.params.page == null || req.params.page == "") {
Models.FolioProject.findAll({
limit: 5,
order: [
['id', 'DESC']
]
}).then(entries => {
Models.Post.findAll({
limit: 5,
order: [
['id', 'DESC']
]
}).then(posts => {
Models.Bookmark.findAll({
limit: 5,
order: [
['id', 'DESC']
]
}).then(saved => {
res.render(config.theme + '/index', {
theme: config.theme,
title: 'The Twelfth House | Home of creative technologist, beat maker and over-thinker, Ro',
user_status: "What up, random person",
mode: 'index',
folio: entries,
posts: posts,
bookmarks: saved
});

}).catch(err => {
console.log(err);
})

})

}).then(function (value) {
//console.log(value);
}).catch(function (err) {
console.log(err);
})
} else {
switch (req.params.page) {
case "dashboard":
console.log('here')
break;
default:
console.log(req.params.page)
break;
}
}


});

//--------------------------
// Login
//--------------------------
/* Handle Login POST */
router.post('/login', function (req, res, next) {

Models.User.findOne({
where: {
handle: req.body.handle
}
}).then(user => {
if (!isValidPassword(user, req.body.password)) {
console.log('Invalid Password');
//return done(null, false, req.flash('message', 'Invalid Password')); // redirect back to login page
return res.json({
message: 'CHECK YOUR PASSWORD'
});
}
let session = req.session;
session.user = user;
res.redirect('/@/dashboard');
//return done(null, user);

}).catch(err => {
console.log(err);
return res.json({
message: 'NOT FOUND BOSS'
});
})
});

//--------------------------
// Logout
//--------------------------
router.post('/logout', function (req, res, next) {
req.logout();
return res.json({
message: 'LOGGED OUT'
});
});
return router;
}

var isValidPassword = function (user, password) {
return bCrypt.compareSync(password, user.password);
}

+ 68
- 0
brain/routes/front/post.js View File

@@ -0,0 +1,68 @@
var express = require('express');
var router = express.Router();
var Models = require('../../models');
var config = require('../../../config.json');
router.get('/', function(req, res) {
res.redirect('/blog/page/1');
});

router.get('/page/:page_num?', function (req, res) {
var page_num = req.params.page_num;
var pageNum = page_num;
if (page_num == null)
pageNum = 1
Models.Post.findAll({
order: [['id', 'DESC']]
}).then(function (post) {
//console.log("num: "+pageNum);
//real page count
var count = Math.floor(post.length / 6);
var pageItems = [];
var itemLimit = 6;
var rangeStart = (pageNum * itemLimit) - itemLimit;
//console.log("RANGE START "+rangeStart);
for (var i = 0; i < itemLimit; i++) {
try {
if (post[i + rangeStart].id != null) {
pageItems.push(post[i + rangeStart]);
}
} catch (e) {
//console.log(e)
}
}
//console.log("items count: "+pageItems.length)
res.render(config.theme+'/blog', {
theme: config.theme,
title: 'The Twelfth House | Thoughts and Such',
page_index: pageNum,
page_count: Math.round(post.length / 6),
items: pageItems,
mode: 'blog'
});
}).then(function (value) {
//console.log(value);
}).catch(function (err) {
console.log(err);
})
});

router.get('/:id', function(req, res) {
Models.Post.findOne({where:{slug: req.params.id}}).then((post) => {
console.log(post.feature_image)
res.render(config.theme+'/blog-post', {
theme: config.theme,
title: post.title,
entry: post.entry_html,
feature_image: JSON.parse(post.feature_image),
mode:'blog'
});

}).catch((err) => {
console.log(err);
});
});


module.exports = router;

+ 37
- 0
brain/routes/front/work.js View File

@@ -0,0 +1,37 @@
var express = require('express');
var router = express.Router();
var Models = require('../../models');
var config = require('../../../config.json');
router.get('/', function(req, res) {
Models.FolioProject.findAll({order:[['sortIndex', 'DESC']]}).then(projects=> {
res.render(config.theme+'/work', {
theme: config.theme,
title: 'The Twelfth House | Creative Works and Projects',
projects: projects,
mode: 'projects'
});
}).then(function(value) {
//console.log(value);
}).catch(function(err) {
//next(err);
})
});

router.get('/:id', function(req, res) {
Models.FolioProject.findOne({where:{slug: req.params.id}}).then((project) => {
res.render(config.theme+'/work-project', {
title: project.title,
type: project.type,
desc: project.description,
images: JSON.parse(project.images),
mode:'folio',
url:project.url
});

}).catch((err) => {
console.log(err);
});
});


module.exports = router;

+ 95
- 0
brain/utils/DateUtils.js View File

@@ -0,0 +1,95 @@
module.exports = {
decodeHTML: function(string, quote_style) {
var optTemp = 0,
i = 0,
noquotes = false;
if (typeof quote_style === 'undefined') {
quote_style = 2;
}
string = string.toString().replace(/&lt;/g, '<').replace(/&gt;/g, '>');
var OPTS = {
'ENT_NOQUOTES': 0,
'ENT_HTML_QUOTE_SINGLE': 1,
'ENT_HTML_QUOTE_DOUBLE': 2,
'ENT_COMPAT': 2,
'ENT_QUOTES': 3,
'ENT_IGNORE': 4
};
if (quote_style === 0) {
noquotes = true;
}
if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
quote_style = [].concat(quote_style);
for (i = 0; i < quote_style.length; i++) {
// Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4
if (OPTS[quote_style[i]] === 0) {
noquotes = true;
} else if (OPTS[quote_style[i]]) {
optTemp = optTemp | OPTS[quote_style[i]];
}
}
quote_style = optTemp;
}
if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
string = string.replace(/&#0*39;/g, "'"); // PHP doesn't currently escape if more than one 0, but it should
// string = string.replace(/&apos;|&#x0*27;/g, "'"); // This would also be useful here, but not a part of PHP
}
if (!noquotes) {
string = string.replace(/&quot;/g, '"');
}
// Put this in last place to avoid escape being double-decoded
string = string.replace(/&amp;/g, '&');
return string;
},
cleanString: function(str) {
return (str + '').replace(/\\(.?)/g, function(s, n1) {
switch (n1) {
case '\\':
return '\\';
case '0':
return '\u0000';
case '':
return '';
default:
return n1;
}
});
},
cleanString: function(string) {
var clean = string.replace(/(^\-+|[^a-zA-Z0-9\/_| -]+|\-+$)/g, '').toLowerCase().replace(/[\/_| -]+/g, '-');
return clean;
},


getDate: function(type, rawdate) {
var day = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCDate()) : String(new Date().getUTCDate()));
var month = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCMonth()+1) : String(new Date().getUTCMonth()+1));
var year = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCFullYear()) : String(new Date().getUTCFullYear()));
var hour = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCHours()) : String(new Date().getUTCHours()));
var minute = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCMinutes()) : String(new Date().getUTCMinutes()));
var seconds = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCSeconds()) : String(new Date().getUTCSeconds()));
var millisecond = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCMilliseconds()) : String(new Date().getUTCMilliseconds()));
if (day.length == 1)
day = String("0" + day);
if (month.length == 1)
month = String("0" + month);
switch (type) {
case "day":
return day;
break;
case "month":
return month;
break;
case "year":
return year;
break;
case "stamp":
return String(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + seconds+"."+millisecond);
break
default:
return String(year + "-" + month + "-" + day + " : " + hour + "-" + minute + "-" + seconds);
break;
}
}
};

+ 112
- 0
brain/utils/RightsManager.js View File

@@ -0,0 +1,112 @@
var roles = {
hnic: {
"client_admin": {
"create": true,
"read": true,
"update": true,
"delete": true
},
"client_user": {
"create": true,
"read": true,
"update": true,
"delete": true
},
"client_project": {
"create": true,
"read": true,
"update": true,
"delete": true
},
"folio_project": {
"create": true,
"read": true,
"update": true,
"delete": true
},
"bookmark": {
"create": true,
"read": true,
"update": true,
"delete": true
}

},
client: {
"client_admin": {
"create": false,
"read": true,
"update": false,
"delete": false
},
"client_user": {
"create": true,
"read": true,
"update": true,
"delete": true
},
"client_project": {
"create": true,
"read": true,
"update": true,
"delete": false
},
"folio_project": {
"create": false,
"read": false,
"update": false,
"delete": false
}
},
user: {
"client_admin": {
"create": false,
"read": false,
"update": false,
"delete": false
},
"client_user": {
"create": false,
"read": true,
"update": false,
"delete": false
},
"client_project": {
"create": false,
"read": true,
"update": true,
"delete": false
},
"folio_project": {
"create": false,
"read": false,
"update": false,
"delete": false
},
"bookmark": {
"create": true,
"read": true,
"update": true,
"delete": true
}
}
};
module.exports = {
TASK_CREATE: 'create',
TASK_UPDATE: 'update',
TASK_READ: 'read',
TASK_DELETE: 'delete',
OBJECT_CLIENT_ADMIN: 'client_admin',
OBJECT_CLIENT_USER: 'client_user',
OBJECT_PROJECT_CLIENT: 'client_project',
OBJECT_PROJECT_FOLIO: 'folio_project',
OBJECT_BOOKMARK: 'bookmark',
check: function(role, object, task) {
for (var i = 0; i < object.length; i++) {
if(!roles[role][object[i]][task])
return false
}
return true;
},
hey: function() {}
};

+ 104
- 0
init.js View File

@@ -0,0 +1,104 @@
#!/usr/bin/env node

/**
* Module dependencies.
*/

var app = require('./brain/app');
var debug = require('debug')('thetwelfthhouse:server');
var http = require('http');
var models = require('./brain/models');

/**
* Get port from environment and store in Express.
*/

var port = normalizePort(process.env.PORT || '2700');
app.set('port', port);

/**
* Create HTTP server.
*/

var server = http.createServer(app);

/**
* Listen on provided port, on all network interfaces.
*/

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);


models.sequelize.sync().then(function() {
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port, function() {
debug('Express server listening on port ' + server.address().port);
});
server.on('error', onError);
server.on('listening', onListening);
});


/**
* Normalize a port into a number, string, or false.
*/

function normalizePort(val) {
var port = parseInt(val, 10);

if (isNaN(port)) {
// named pipe
return val;
}

if (port >= 0) {
// port number
return port;
}

return false;
}

/**
* Event listener for HTTP server "error" event.
*/

function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}

var bind = typeof port === 'string' ?
'Pipe ' + port :
'Port ' + port

// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}

/**
* Event listener for HTTP server "listening" event.
*/

function onListening() {
var addr = server.address();
var bind = typeof addr === 'string' ?
'pipe ' + addr :
'port ' + addr.port;
debug('Listening on ' + bind);
}

+ 63
- 0
package.json View File

@@ -0,0 +1,63 @@
{
"name": "the-twelfth-house",
"version": "3.0.0",
"private": true,
"description": "The personal site of Roland X. Pulliam",
"repository": "https://code.playvicio.us/Are0h/thetwelfthhouse",
"theme": "default",
"scripts": {
"start": "forever start init.js",
"stop": "forever stop init.js",
"dev": "nodemon init.js",
"watch-front-scripts": "parcel watch themes/$npm_package_theme/src/com/Start.jsx --out-dir themes/$npm_package_theme/assets/js --out-file start.min.js --public-url /$npm_package_theme/assets/js",
"watch-front-styles": "stylus -w -m -o themes/$npm_package_theme/assets/css themes/$npm_package_theme/src/styles/base.styl",
"build-front-kit": "uglifyjs node_modules/scramble-text/dist/ScrambleText.min.js node_modules/animejs/anime.min.js node_modules/reframe.js/dist/reframe.min.js -c -o themes/$npm_package_theme/assets/js/toolkit.min.js",
"watch-back-scripts": "parcel watch themes/dash/src/com/Start.jsx --out-dir themes/dash/assets/js --out-file dash.min.js --public-url /dash/assets/js",
"watch-back-styles": "stylus -w -m -o themes/dash/assets/css themes/dash/src/styles/dash.styl",
"build-back-kit": "uglifyjs themes/dash/src/libraries/highlight.pack.js node_modules/scramble-text/dist/ScrambleText.min.js node_modules/animejs/anime.min.js node_modules/reframe.js/dist/reframe.min.js -c -o themes/dash/assets/js/dashkit.min.js"
},
"engines": {
"node": ">=8.12.0"
},
"dependencies": {
"bcrypt-nodejs": "latest",
"bluebird": "^3.4.1",
"body-parser": "latest",
"caret-pos": "^1.2.1",
"connect-flash": "latest",
"cookie-parser": "~1.3.3",
"debug": "^4.1.0",
"entypo": "^2.1.0",
"express": "^4.16.4",
"express-session": "^1.15.6",
"fs-extra": "latest",
"highlight.js": "^9.13.1",
"jsdom": "^12.2.0",
"mailgun-js": "^0.18.0",
"markdown-it": "^8.4.1",
"memorystore": "^1.6.0",
"morgan": "latest",
"multer": "latest",
"nodemailer": "latest",
"pg": "^7.5.0",
"pg-hstore": "^2.3.2",
"prismjs": "^1.15.0",
"pug": "latest",
"reframe.js": "^2.2.1",
"request": "^2.83.0",
"sanitize-html": "^1.19.1",
"scrape-metadata": "^2.0.0",
"sequelize": "^4.37.6",
"serve-favicon": "latest",
"uuid": "^3.2.1"
},
"devDependencies": {
"@babel/cli": "^7.1.2",
"@babel/core": "^7.1.2",
"@babel/preset-env": "^7.1.0",
"animejs": "^2.2.0",
"babel-preset-env": "^1.7.0",
"bulma.styl": "^0.6.11",
"scramble-text": "0.0.8"
}
}

+ 2410
- 0
themes/dash/assets/css/dash.css
File diff suppressed because it is too large
View File


+ 1
- 0
themes/dash/assets/css/dash.css.map
File diff suppressed because it is too large
View File


BIN
View File


+ 4581
- 0
themes/dash/assets/css/fonts/Apercu-Bold.svg
File diff suppressed because it is too large
View File


BIN
View File


BIN
View File


BIN
View File


BIN
View File


+ 5663
- 0
themes/dash/assets/css/fonts/Apercu-BoldItalic.svg
File diff suppressed because it is too large
View File


BIN
View File


BIN
View File


BIN
View File


BIN
View File


+ 6595
- 0
themes/dash/assets/css/fonts/Apercu-Italic.svg
File diff suppressed because it is too large
View File


BIN
View File


BIN
View File


BIN
View File


BIN
View File


+ 4265
- 0
themes/dash/assets/css/fonts/Apercu-Light.svg
File diff suppressed because it is too large
View File


BIN
View File


BIN
View File


BIN
View File


BIN
View File


+ 5937
- 0
themes/dash/assets/css/fonts/Apercu-LightItalic.svg
File diff suppressed because it is too large
View File


BIN
View File


BIN
View File


BIN
View File


BIN
View File


+ 5562
- 0
themes/dash/assets/css/fonts/Apercu-Medium.svg
File diff suppressed because it is too large
View File


BIN
View File


BIN
View File


BIN
View File


BIN
View File


+ 5771
- 0
themes/dash/assets/css/fonts/Apercu-MediumItalic.svg
File diff suppressed because it is too large
View File


BIN
View File


BIN
View File


BIN
View File


BIN
View File


+ 670
- 0
themes/dash/assets/css/fonts/Apercu-Mono.svg View File

@@ -0,0 +1,670 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata>
Created by FontForge 20170910 at Fri Aug 27 16:54:26 2010
By Jimmy Wärting
Copyright (c) 2009 by The Entente (AS &#38; EH). All rights reserved.
</metadata>
<defs>
<font id="Apercu-Mono" horiz-adv-x="620" >
<font-face
font-family="Apercu"
font-weight="400"
font-stretch="normal"
units-per-em="1000"
panose-1="2 0 5 6 3 0 0 2 0 4"
ascent="800"
descent="-200"
x-height="504"
cap-height="700"
bbox="-11 -244 612 949"
underline-thickness="50"
underline-position="-100"
unicode-range="U+0020-FB02"
/>
<missing-glyph
d="M533 0h-447v700h447v-700zM449 76v548h-279v-548h279z" />
<glyph glyph-name=".notdef"
d="M533 0h-447v700h447v-700zM449 76v548h-279v-548h279z" />
<glyph glyph-name="NULL" horiz-adv-x="0"
/>
<glyph glyph-name="CR" horiz-adv-x="333"
/>
<glyph glyph-name="space" unicode=" "
/>
<glyph glyph-name="exclam" unicode="!"
d="M277 200l-24 500h114l-24 -500h-66zM240 65c0 40 30 71 70 71s70 -31 70 -71c0 -39 -30 -68 -70 -68s-70 29 -70 68z" />
<glyph glyph-name="quotedbl" unicode="&#x22;"
d="M246 462h-64l-25 246h114zM437 462h-64l-25 246h114z" />
<glyph glyph-name="numbersign" unicode="#"
d="M182 418h-102v74h114l33 208h78l-33 -208h131l34 208h78l-34 -208h98v-74h-110l-22 -136h102v-74h-114l-33 -208h-78l33 208h-131l-34 -208h-78l34 208h-98v74h110zM391 418h-131l-22 -136h131z" />
<glyph glyph-name="dollar" unicode="$"
d="M540 558l-77 -39c-31 71 -78 106 -142 106c-77 0 -126 -41 -126 -109c0 -34 13 -59 38 -74c26 -15 67 -30 124 -45c51 -13 78 -21 115 -41c55 -28 81 -68 84 -141c0 -133 -73 -208 -192 -221v-94h-80v94c-116 13 -197 86 -221 206l82 32c27 -104 87 -156 179 -156
c88 0 144 44 144 127c0 29 -12 51 -25 64c-7 7 -18 13 -34 19c-31 13 -49 19 -100 31c-49 12 -73 19 -113 39c-56 29 -85 73 -89 157c0 103 65 180 177 193v94h80v-96c89 -15 148 -73 176 -146z" />
<glyph glyph-name="percent" unicode="%"
d="M59 434c-31 31 -46 69 -46 114s15 82 46 113s69 47 114 47s83 -16 114 -47s46 -68 46 -113s-15 -83 -46 -114s-69 -46 -114 -46s-83 15 -114 46zM109 612c-15 -17 -23 -38 -23 -64s8 -48 23 -65c16 -17 37 -25 64 -25s48 8 63 25c16 17 24 39 24 65s-8 47 -24 64
c-15 17 -36 26 -63 26s-48 -9 -64 -26zM333 38c-31 31 -46 69 -46 114s15 82 46 113s69 47 114 47s83 -16 114 -47s46 -68 46 -113s-15 -83 -46 -114s-69 -46 -114 -46s-83 15 -114 46zM383 216c-15 -17 -23 -38 -23 -64s8 -48 23 -65c16 -17 37 -25 64 -25s48 8 63 25
c16 17 24 39 24 65s-8 47 -24 64c-15 17 -36 26 -63 26s-48 -9 -64 -26zM40 199l507 353l34 -48l-507 -353z" />
<glyph glyph-name="ampersand" unicode="&#x26;"
d="M265 -8c-128 0 -212 79 -212 208c0 97 60 174 136 213c-41 55 -61 104 -61 146c0 43 15 79 44 107c30 28 67 42 111 42c47 0 84 -14 113 -42s43 -61 43 -98c0 -27 -8 -56 -25 -85c-19 -32 -56 -62 -111 -91l146 -185c13 27 29 67 47 119l56 -61c-15 -46 -33 -87 -52 -123
l112 -142h-101l-59 74c-48 -55 -110 -82 -187 -82zM265 68c56 0 102 22 139 67l-172 221c-63 -36 -95 -89 -95 -158c0 -80 57 -130 128 -130zM208 555c0 -30 16 -66 49 -109c67 33 103 66 103 117c0 41 -32 73 -77 73s-75 -34 -75 -81z" />
<glyph glyph-name="quotesingle" unicode="'"
d="M342 462h-64l-25 246h114z" />
<glyph glyph-name="parenleft" unicode="("
d="M344 750h84c-71 -112 -106 -245 -106 -400s35 -288 106 -400h-84c-72 113 -108 247 -108 400s36 287 108 400z" />
<glyph glyph-name="parenright" unicode=")"
d="M196 750h84c72 -113 108 -247 108 -400s-36 -287 -108 -400h-84c71 112 106 245 106 400s-35 288 -106 400z" />
<glyph glyph-name="asterisk" unicode="*"
d="M276 708h68v-138l131 43l21 -65l-130 -43l80 -111l-55 -39l-81 111l-81 -111l-55 39l80 111l-130 43l21 65l131 -43v138z" />
<glyph glyph-name="plus" unicode="+"
d="M273 356v183h74v-183h183v-74h-183v-183h-74v183h-183v74h183z" />
<glyph glyph-name="comma" unicode=","
d="M271 -107h-73l96 217h123z" />
<glyph glyph-name="hyphen" unicode="-"
d="M485 280h-349v74h349v-74z" />
<glyph glyph-name="period" unicode="."
d="M253 19c-31 31 -31 83 0 114s83 31 114 0s31 -83 0 -114s-83 -31 -114 0z" />
<glyph glyph-name="slash" unicode="/"
d="M62 -50l406 800h86l-406 -800h-86z" />
<glyph glyph-name="zero" unicode="0"
d="M498 88c-45 -64 -107 -96 -188 -96s-144 32 -189 96c-45 65 -67 152 -67 262s22 197 67 261c45 65 108 97 189 97s143 -32 188 -97c45 -64 68 -151 68 -261s-23 -197 -68 -262zM142 350c0 -77 12 -141 37 -190l208 445c-23 15 -48 23 -77 23c-107 0 -168 -106 -168 -278z
M310 72c107 0 168 106 168 278c0 79 -12 142 -37 190l-208 -445c23 -15 48 -23 77 -23z" />
<glyph glyph-name="one" unicode="1"
d="M122 562l227 138h32v-624h180v-76h-444v76h180v498l-175 -104v92z" />
<glyph glyph-name="two" unicode="2"
d="M551 0h-432v39l276 342c44 55 57 88 57 133c0 33 -9 59 -26 80c-19 23 -47 34 -84 34c-65 0 -112 -51 -123 -127l-85 16c5 55 28 100 68 136c40 37 87 55 140 55c65 0 116 -20 152 -61c29 -33 44 -78 44 -133c0 -54 -19 -105 -56 -152l-226 -282h295v-80z" />
<glyph glyph-name="three" unicode="3"
d="M80 192l84 11c13 -87 59 -131 139 -131c84 0 140 55 140 148c0 95 -55 148 -140 148c-23 0 -44 -4 -62 -13l-35 47l159 218h-252v80h380v-27l-178 -241c6 2 15 3 28 3c54 0 98 -20 133 -60c35 -39 53 -91 53 -155c0 -67 -21 -122 -63 -165c-42 -42 -96 -63 -163 -63
c-59 0 -109 18 -151 55s-66 85 -72 145z" />
<glyph glyph-name="four" unicode="4"
d="M452 0h-86v149h-304v35l296 516h94v-471h106v-80h-106v-149zM366 568l-190 -339h190v339z" />
<glyph glyph-name="five" unicode="5"
d="M95 183l85 16c12 -83 63 -127 135 -127c85 0 142 63 142 156c0 95 -50 156 -134 156c-63 0 -122 -33 -157 -78l-55 12l40 382h342v-80h-269l-26 -203c28 27 84 47 131 47c133 0 214 -91 214 -236c0 -69 -21 -126 -64 -170c-42 -44 -97 -66 -164 -66
c-119 0 -208 68 -220 191z" />
<glyph glyph-name="six" unicode="6"
d="M329 448c64 0 116 -21 156 -64c41 -42 61 -97 61 -164c0 -65 -21 -119 -63 -163c-41 -43 -94 -65 -158 -65s-117 22 -159 65c-41 44 -62 98 -62 163c0 47 12 90 36 131l207 357h96l-152 -267c10 5 23 7 38 7zM192 220c0 -85 56 -148 133 -148s133 63 133 148
c0 89 -54 148 -133 148s-133 -59 -133 -148z" />
<glyph glyph-name="seven" unicode="7"
d="M556 663l-312 -663h-93l295 620h-339v80h449v-37z" />
<glyph glyph-name="eight" unicode="8"
d="M503 521c0 -59 -33 -119 -80 -144c64 -29 104 -92 104 -176c0 -64 -21 -115 -63 -153c-42 -37 -93 -56 -154 -56s-112 19 -154 56c-42 38 -63 89 -63 153c0 84 40 147 104 176c-47 25 -80 85 -80 144c0 53 18 97 54 133c37 36 83 54 139 54s102 -18 138 -54
c37 -36 55 -80 55 -133zM403 295c-24 23 -55 35 -93 35s-69 -12 -93 -35s-36 -55 -36 -94s12 -71 36 -94s55 -35 93 -35s69 12 93 35s36 55 36 94s-12 71 -36 94zM388 601c-19 21 -45 31 -78 31s-59 -10 -78 -31s-29 -47 -29 -80s10 -59 29 -80s45 -31 78 -31s59 10 78 31
s29 47 29 80s-10 59 -29 80z" />
<glyph glyph-name="nine" unicode="9"
d="M299 252c-64 0 -116 21 -157 63c-40 43 -60 98 -60 165c0 65 21 119 62 162c42 44 95 66 159 66s117 -22 158 -66c42 -43 63 -97 63 -162c0 -47 -12 -90 -36 -131l-207 -357h-96l152 267c-10 -5 -23 -7 -38 -7zM436 480c0 85 -56 148 -133 148s-133 -63 -133 -148
c0 -89 54 -148 133 -148s133 59 133 148z" />
<glyph glyph-name="colon" unicode=":"
d="M253 19c-31 31 -31 83 0 114s83 31 114 0s31 -83 0 -114s-83 -31 -114 0zM253 361c-31 31 -31 83 0 114s83 31 114 0s31 -83 0 -114s-83 -31 -114 0z" />
<glyph glyph-name="semicolon" unicode=";"
d="M234 -107h-73l96 217h123zM253 361c-31 31 -31 83 0 114s83 31 114 0s31 -83 0 -114s-83 -31 -114 0z" />
<glyph glyph-name="less" unicode="&#x3c;"
d="M507 70l-409 196v88l409 196v-87l-325 -153l325 -153v-87z" />
<glyph glyph-name="equal" unicode="="
d="M510 356h-399v74h399v-74zM510 190h-399v74h399v-74z" />
<glyph glyph-name="greater" unicode="&#x3e;"
d="M113 550l409 -196v-88l-409 -196v87l325 153l-325 153v87z" />
<glyph glyph-name="question" unicode="?"
d="M247 63c0 39 29 68 66 68c39 0 68 -29 68 -68c0 -37 -29 -66 -68 -66c-37 0 -66 29 -66 66zM382 330l65 -23c-24 -70 -69 -105 -134 -105c-80 0 -132 48 -132 124c0 55 28 97 85 126c29 16 72 30 92 41c29 15 43 39 43 71c0 23 -7 40 -21 52c-16 14 -38 21 -65 21
c-51 0 -89 -36 -105 -92l-78 13c16 91 83 150 183 150c51 0 93 -15 124 -44s46 -64 46 -105c0 -54 -26 -94 -77 -119l-101 -49c-33 -18 -49 -41 -49 -69c0 -32 20 -51 52 -51c31 0 55 20 72 59z" />
<glyph glyph-name="at" unicode="@"
d="M579 491v-384h-78l-8 44c-26 -35 -62 -52 -108 -52c-54 0 -98 19 -131 58s-49 88 -49 147c0 60 16 109 49 147s76 57 131 57c51 0 90 -15 117 -44v21c0 100 -66 161 -167 161c-127 0 -209 -115 -209 -328v-34c0 -195 77 -307 224 -307c71 0 131 24 179 72l39 -61
c-56 -55 -129 -82 -218 -82c-196 0 -308 136 -308 376v39c0 256 106 397 293 397c151 0 244 -80 244 -227zM287 304c0 -77 41 -131 106 -131s106 54 106 131c0 79 -39 130 -106 130s-106 -51 -106 -130z" />
<glyph glyph-name="A" unicode="A"
d="M19 0l249 700h84l249 -700h-91l-63 187h-274l-63 -187h-91zM418 271l-108 315l-108 -315h216z" />
<glyph glyph-name="B" unicode="B"
d="M96 0v700h246c125 0 199 -65 199 -180c0 -60 -33 -112 -80 -137c69 -28 115 -91 115 -175c0 -129 -82 -208 -218 -208h-262zM345 331h-161v-247h161c93 0 140 41 140 124c0 82 -47 123 -140 123zM340 616h-156v-201h156c68 0 110 35 110 100c0 67 -43 101 -110 101z" />
<glyph glyph-name="C" unicode="C"
d="M506 230l83 -25c-32 -129 -120 -213 -251 -213c-84 0 -153 31 -208 92c-54 61 -81 150 -81 266s27 205 81 266c55 61 124 92 208 92c131 0 219 -84 251 -213l-83 -25c-32 104 -81 154 -168 154c-124 0 -198 -89 -198 -274s74 -274 198 -274c87 0 136 50 168 154z" />
<glyph glyph-name="D" unicode="D"
d="M78 0v700h177c95 0 170 -30 226 -89c57 -59 85 -146 85 -261s-28 -202 -85 -261c-56 -59 -131 -89 -226 -89h-177zM246 616h-80v-532h80c147 0 226 78 226 266s-79 266 -226 266z" />
<glyph glyph-name="E" unicode="E"
d="M91 0v700h444v-84h-356v-201h306v-84h-306v-247h366v-84h-454z" />
<glyph glyph-name="F" unicode="F"
d="M91 0v700h437v-84h-349v-209h300v-84h-300v-323h-88z" />
<glyph glyph-name="G" unicode="G"
d="M581 0h-73l-5 94c-31 -67 -99 -102 -176 -102c-81 0 -148 31 -202 92c-54 62 -81 151 -81 266c0 116 27 205 81 266c55 61 124 92 208 92c132 0 219 -82 251 -213l-83 -25c-32 104 -81 154 -168 154c-124 0 -198 -89 -198 -274s74 -274 198 -274c95 0 148 64 157 193
h-157v84h248v-353z" />
<glyph glyph-name="H" unicode="H"
d="M464 414v286h88v-700h-88v330h-308v-330h-88v700h88v-286h308z" />
<glyph glyph-name="I" unicode="I"
d="M523 76v-76h-426v76h169v548h-169v76h426v-76h-169v-548h169z" />
<glyph glyph-name="J" unicode="J"
d="M418 222v478h88v-476c0 -75 -20 -133 -60 -173c-40 -39 -92 -59 -155 -59c-61 0 -110 18 -148 54s-61 81 -70 136l89 19c16 -79 61 -125 129 -125c79 0 127 47 127 146z" />
<glyph glyph-name="K" unicode="K"
d="M267 385l324 -385h-112l-293 351v-351h-88v700h88v-281l268 281h115z" />
<glyph glyph-name="L" unicode="L"
d="M578 84v-84h-445v700h88v-616h357z" />
<glyph glyph-name="M" unicode="M"
d="M67 0v700h94l149 -388l149 388h94v-700h-88v513l-122 -312h-66l-122 312v-513h-88z" />
<glyph glyph-name="N" unicode="N"
d="M460 160v540h88v-700h-96l-293 540v-540h-88v700h96z" />
<glyph glyph-name="O" unicode="O"
d="M114 615c51 62 116 93 196 93s145 -31 196 -93c51 -61 76 -150 76 -265s-25 -204 -76 -266c-51 -61 -116 -92 -196 -92s-145 31 -196 92c-51 62 -76 151 -76 266s25 204 76 265zM442 557c-33 45 -77 67 -132 67s-99 -22 -132 -67c-33 -44 -49 -113 -49 -207
s16 -163 49 -208c33 -44 77 -66 132 -66s99 22 132 66c33 45 49 114 49 208s-16 163 -49 207z" />
<glyph glyph-name="P" unicode="P"
d="M364 300h-177v-300h-88v700h265c133 0 208 -76 208 -200s-75 -200 -208 -200zM187 384h175c79 0 119 39 119 116s-40 116 -119 116h-175v-232z" />
<glyph glyph-name="Q" unicode="Q"
d="M582 350c0 -93 -17 -170 -52 -230l65 -65l-61 -63l-60 60c-45 -40 -100 -60 -164 -60c-80 0 -145 31 -196 92c-51 62 -76 151 -76 266s25 204 76 265c51 62 116 93 196 93s145 -31 196 -93c51 -61 76 -150 76 -265zM414 112l-72 74l61 63l62 -63c17 45 26 99 26 164
c0 94 -16 163 -49 207c-33 45 -77 67 -132 67s-99 -22 -132 -67c-33 -44 -49 -113 -49 -207c0 -188 70 -274 181 -274c41 0 76 12 104 36z" />
<glyph glyph-name="R" unicode="R"
d="M594 0h-104l-205 330h-117v-330h-88v700h245c128 0 206 -64 206 -185c0 -99 -49 -159 -146 -179zM327 616h-159v-202h159c75 0 113 34 113 101s-38 101 -113 101z" />
<glyph glyph-name="S" unicode="S"
d="M536 558l-77 -39c-31 70 -78 105 -142 105c-77 0 -126 -40 -126 -108c0 -34 13 -59 38 -74c26 -15 67 -30 124 -45c51 -13 78 -21 115 -41c55 -28 81 -68 84 -141c0 -148 -91 -223 -232 -223c-135 0 -234 73 -261 208l82 32c27 -104 87 -156 179 -156
c88 0 144 44 144 127c0 29 -12 51 -25 64c-7 7 -18 13 -34 19c-31 13 -49 19 -100 31c-49 12 -73 19 -113 39c-56 29 -85 73 -89 157c0 57 19 104 57 140c38 37 90 55 157 55c113 0 187 -65 219 -150z" />
<glyph glyph-name="T" unicode="T"
d="M266 616h-218v84h524v-84h-218v-616h-88v616z" />
<glyph glyph-name="U" unicode="U"
d="M62 243v457h88v-463c0 -96 59 -161 160 -161s160 65 160 161v463h88v-457c0 -78 -23 -139 -70 -184s-106 -67 -178 -67s-131 22 -178 67s-70 106 -70 184z" />
<glyph glyph-name="V" unicode="V"
d="M310 125l196 575h91l-245 -700h-84l-245 700h91z" />
<glyph glyph-name="W" unicode="W"
d="M456 130l42 570h91l-67 -700h-109l-103 411l-103 -411h-109l-67 700h91l42 -570l106 427h80z" />
<glyph glyph-name="X" unicode="X"
d="M260 376l-190 324h101l139 -238l139 238h101l-190 -324l221 -376h-101l-170 290l-170 -290h-101z" />
<glyph glyph-name="Y" unicode="Y"
d="M266 0v276l-225 424h97l172 -336l172 336h97l-225 -424v-276h-88z" />
<glyph glyph-name="Z" unicode="Z"
d="M416 616h-329v84h456v-42l-343 -574h354v-84h-481v42z" />
<glyph glyph-name="bracketleft" unicode="["
d="M473 -50h-268v800h268v-76h-188v-648h188v-76z" />
<glyph glyph-name="backslash" unicode="\"
d="M473 -50l-406 800h86l406 -800h-86z" />
<glyph glyph-name="bracketright" unicode="]"
d="M147 750h268v-800h-268v76h188v648h-188v76z" />
<glyph glyph-name="asciicircum" unicode="^"
d="M90 421l187 279h66l187 -279h-86l-134 203l-134 -203h-86z" />
<glyph glyph-name="underscore" unicode="_"
d="M550 -80h-480v80h480v-80z" />
<glyph glyph-name="grave" unicode="`"
d="M215 704h121l67 -144h-66z" />
<glyph glyph-name="a" unicode="a"
d="M197 145c0 -48 32 -77 83 -77c40 0 77 13 110 38c34 26 51 65 51 116v16h-110c-85 0 -134 -36 -134 -93zM525 318v-318h-68l-12 71c-32 -47 -103 -79 -178 -79c-89 0 -156 54 -156 153c0 109 85 165 228 165h102v22c0 73 -48 104 -116 104c-57 0 -103 -35 -119 -86
l-74 20c23 87 100 142 193 142c124 0 200 -61 200 -194z" />
<glyph glyph-name="b" unicode="b"
d="M338 -8c-65 0 -123 32 -154 75v-67h-84v708h84v-268c31 41 87 72 154 72c145 0 231 -103 231 -260s-86 -260 -231 -260zM442 119c27 34 41 78 41 133s-14 99 -41 133s-65 51 -112 51s-85 -17 -112 -51s-41 -78 -41 -133s14 -99 41 -133s65 -51 112 -51s85 17 112 51z" />
<glyph glyph-name="c" unicode="c"
d="M470 161l73 -30c-41 -93 -112 -139 -213 -139c-74 0 -133 25 -176 76s-65 112 -65 184s22 133 65 184s102 76 176 76c101 0 172 -46 213 -139l-73 -30c-27 62 -73 93 -140 93c-97 0 -155 -76 -155 -184s58 -184 155 -184c67 0 113 31 140 93z" />
<glyph glyph-name="d" unicode="d"
d="M301 512c67 0 123 -31 154 -72v268h84v-708h-84v67c-31 -43 -89 -75 -154 -75c-145 0 -231 103 -231 260s86 260 231 260zM197 385c-27 -34 -41 -78 -41 -133s14 -99 41 -133s65 -51 112 -51s85 17 112 51s41 78 41 133s-14 99 -41 133s-65 51 -112 51s-85 -17 -112 -51z
" />
<glyph glyph-name="e" unicode="e"
d="M556 269v-35h-394c5 -100 66 -166 155 -166c72 0 126 33 162 100l67 -35c-49 -94 -125 -141 -229 -141c-72 0 -130 25 -175 74c-44 49 -66 111 -66 186c0 73 22 135 65 185c44 50 103 75 176 75c75 0 134 -23 176 -70c42 -46 63 -104 63 -173zM317 436
c-79 0 -132 -47 -149 -126h299c-15 80 -69 126 -150 126z" />
<glyph glyph-name="f" unicode="f"
d="M497 679l-21 -74c-28 18 -55 27 -81 27c-49 0 -74 -32 -74 -95v-33h196v-76h-196v-428h-84v428h-142v76h142v31c0 115 52 173 155 173c38 0 73 -10 105 -29z" />
<glyph glyph-name="g" unicode="g"
d="M142 343c0 51 17 92 50 123c34 31 77 46 128 46c36 0 69 -9 99 -26l105 54l38 -69l-85 -44c14 -24 21 -52 21 -84c0 -51 -17 -92 -50 -123s-76 -46 -128 -46c-35 0 -66 7 -93 21c-31 -12 -46 -29 -46 -52c0 -28 24 -42 71 -42h131c108 0 169 -48 169 -139
c0 -59 -23 -102 -69 -131s-102 -43 -167 -43c-147 0 -233 58 -233 166c0 45 17 81 52 108c-24 19 -36 44 -36 77c0 45 27 84 74 101c-21 28 -31 62 -31 103zM381 29h-119c-21 0 -38 1 -52 4c-29 -15 -43 -40 -43 -76c0 -59 58 -95 149 -95c95 0 150 35 150 92
c0 50 -28 75 -85 75zM251 414c-18 -17 -27 -41 -27 -71s9 -54 27 -71c19 -17 42 -26 69 -26s50 8 68 25c19 17 28 41 28 72s-9 54 -28 71c-18 17 -41 26 -68 26s-50 -9 -69 -26z" />
<glyph glyph-name="h" unicode="h"
d="M529 348v-348h-84v330c0 71 -31 106 -93 106c-43 0 -80 -20 -112 -61s-48 -95 -48 -164v-211h-84v708h84v-297c40 59 108 101 183 101c103 0 154 -55 154 -164z" />
<glyph glyph-name="i" unicode="i"
d="M283 430h-154v74h238v-430h186v-74h-444v74h174v356zM250 638c0 39 30 70 69 70s69 -31 69 -70s-30 -68 -69 -68s-69 31 -69 68z" />
<glyph glyph-name="j" unicode="j"
d="M241 -212l-28 80c96 32 135 83 135 182v380h-198v74h282v-476c0 -67 -19 -121 -56 -160c-37 -40 -82 -67 -135 -80zM315 638c0 39 30 70 69 70s69 -31 69 -70s-30 -68 -69 -68s-69 31 -69 68z" />
<glyph glyph-name="k" unicode="k"
d="M111 0v708h84v-415l215 211h110l-235 -231l258 -273h-110l-238 253v-253h-84z" />
<glyph glyph-name="l" unicode="l"
d="M201 190v434h-139v76h223v-510c0 -81 35 -122 106 -122c65 0 104 41 117 122l76 -15c-17 -120 -88 -183 -193 -183c-117 0 -190 73 -190 198z" />
<glyph glyph-name="m" unicode="m"
d="M588 376v-376h-84v358c0 55 -16 77 -55 77c-52 0 -89 -65 -89 -198v-237h-84v358c0 55 -16 77 -55 77c-52 0 -89 -65 -89 -198v-237h-84v504h84v-64c30 48 69 72 118 72c54 0 89 -27 104 -82c27 49 72 82 124 82c67 0 110 -44 110 -136z" />
<glyph glyph-name="n" unicode="n"
d="M522 351v-351h-84v333c0 69 -31 103 -93 103c-41 0 -76 -21 -105 -64c-29 -42 -43 -98 -43 -169v-203h-84v504h84v-93c37 60 102 101 171 101c103 0 154 -61 154 -161z" />
<glyph glyph-name="o" unicode="o"
d="M130 68c-45 51 -68 112 -68 184s23 133 68 184s105 76 180 76s135 -25 180 -76s68 -112 68 -184s-23 -133 -68 -184s-105 -76 -180 -76s-135 25 -180 76zM192 382c-29 -36 -44 -79 -44 -130s15 -94 44 -130s69 -54 118 -54s89 18 118 54s44 79 44 130s-15 94 -44 130
s-69 54 -118 54s-89 -18 -118 -54z" />
<glyph glyph-name="p" unicode="p"
d="M342 -8c-67 0 -123 31 -154 72v-268h-84v708h84v-67c31 43 89 75 154 75c145 0 231 -103 231 -260s-86 -260 -231 -260zM446 119c27 34 41 78 41 133s-14 99 -41 133s-65 51 -112 51s-85 -17 -112 -51s-41 -78 -41 -133s14 -99 41 -133s65 -51 112 -51s85 17 112 51z" />
<glyph glyph-name="q" unicode="q"
d="M288 512c65 0 123 -32 154 -75v67h84v-708h-84v268c-31 -41 -87 -72 -154 -72c-145 0 -231 103 -231 260s86 260 231 260zM184 385c-27 -34 -41 -78 -41 -133s14 -99 41 -133s65 -51 112 -51s85 17 112 51s41 78 41 133s-14 99 -41 133s-65 51 -112 51s-85 -17 -112 -51z
" />
<glyph glyph-name="r" unicode="r"
d="M559 344h-84c-7 61 -40 92 -97 92c-47 0 -88 -22 -121 -67c-33 -44 -50 -106 -50 -187v-182h-84v504h84v-93c43 67 105 101 186 101c100 0 161 -60 166 -168z" />
<glyph glyph-name="s" unicode="s"
d="M308 512c83 0 144 -36 184 -109l-66 -47c-29 53 -70 80 -121 80c-48 0 -87 -22 -87 -67c0 -41 37 -62 117 -78c43 -9 70 -15 103 -30c47 -20 78 -54 78 -107c0 -50 -19 -90 -56 -119s-83 -43 -138 -43c-104 0 -188 53 -219 146l80 30c23 -63 71 -100 139 -100
c61 0 107 27 107 78c0 40 -38 54 -130 74c-103 21 -163 57 -163 146c0 44 17 79 50 106s74 40 122 40z" />
<glyph glyph-name="t" unicode="t"
d="M200 428h-134v76h134v151l84 53v-204h246v-76h-246v-258c0 -68 29 -102 87 -102c45 0 86 20 124 60l31 -71c-43 -43 -95 -65 -155 -65c-111 0 -171 59 -171 175v261z" />
<glyph glyph-name="u" unicode="u"
d="M103 153v351h84v-333c0 -69 31 -103 93 -103c41 0 76 21 105 63c29 43 43 99 43 170v203h84v-504h-84v93c-37 -60 -102 -101 -171 -101c-103 0 -154 61 -154 161z" />
<glyph glyph-name="v" unicode="v"
d="M310 100l162 404h91l-211 -504h-84l-211 504h91z" />
<glyph glyph-name="w" unicode="w"
d="M438 131l69 373h86l-110 -504h-76l-97 354l-97 -354h-76l-110 504h86l69 -373l86 323h84z" />
<glyph glyph-name="x" unicode="x"
d="M310 337l111 167h99l-164 -237l183 -267h-95l-134 198l-134 -198h-95l183 267l-164 237h99z" />
<glyph glyph-name="y" unicode="y"
d="M335 135l149 369h91l-299 -708h-84l98 238l-218 470h94z" />
<glyph glyph-name="z" unicode="z"
d="M374 428h-251v76h378v-36l-267 -392h279v-76h-403v36z" />
<glyph glyph-name="braceleft" unicode="{"
d="M265 50v172c0 67 -35 90 -100 90v76c65 0 100 23 100 90v172c0 60 40 100 100 100h138v-76h-113c-32 0 -45 -13 -45 -45v-181c0 -63 -25 -86 -70 -98c45 -12 70 -35 70 -98v-181c0 -32 13 -45 45 -45h113v-76h-138c-60 0 -100 40 -100 100z" />
<glyph glyph-name="bar" unicode="|"
d="M270 -50v800h80v-800h-80z" />
<glyph glyph-name="braceright" unicode="}"
d="M355 222v-172c0 -60 -40 -100 -100 -100h-138v76h113c32 0 45 13 45 45v181c0 63 25 86 70 98c-45 12 -70 35 -70 98v181c0 32 -13 45 -45 45h-113v76h138c60 0 100 -40 100 -100v-172c0 -67 35 -90 100 -90v-76c-65 0 -100 -23 -100 -90z" />
<glyph glyph-name="asciitilde" unicode="~"
d="M125 268l-49 51c29 55 77 88 132 88c29 0 63 -8 102 -25s69 -25 92 -25c37 0 68 15 93 45l49 -51c-29 -55 -77 -88 -132 -88c-29 0 -63 8 -102 25s-69 25 -92 25c-37 0 -68 -15 -93 -45z" />
<glyph glyph-name="uni00A0" unicode="&#xa0;"
/>
<glyph glyph-name="exclamdown" unicode="&#xa1;"
d="M343 296l24 -500h-114l24 500h66zM240 431c0 39 30 68 70 68s70 -29 70 -68c0 -40 -30 -71 -70 -71s-70 31 -70 71z" />
<glyph glyph-name="cent" unicode="&#xa2;"
d="M464 259l73 -30c-35 -81 -93 -126 -173 -137v-142h-80v143c-63 9 -112 38 -148 86c-35 49 -53 106 -53 171s18 121 53 169c36 49 85 78 148 88v143h80v-143c79 -10 137 -55 173 -136l-73 -30c-27 62 -73 93 -140 93c-97 0 -155 -76 -155 -184s58 -184 155 -184
c67 0 113 31 140 93z" />
<glyph glyph-name="sterling" unicode="&#xa3;"
d="M192 324h-80v80h53c-15 40 -22 74 -22 103c0 61 19 110 56 146c37 37 84 55 141 55c96 0 164 -50 196 -138l-75 -35c-29 67 -65 93 -121 93c-64 0 -113 -42 -113 -122c0 -32 7 -66 20 -102h164v-80h-138c5 -21 7 -42 7 -63c0 -67 -26 -126 -79 -177c30 18 59 27 87 27
c20 0 42 -7 67 -20s43 -19 56 -19c36 0 59 16 90 68l66 -36c-40 -75 -90 -112 -151 -112c-28 0 -57 7 -87 20c-29 13 -52 20 -67 20c-39 0 -77 -13 -113 -40l-57 62c79 75 111 130 111 197c0 21 -4 45 -11 73z" />
<glyph glyph-name="currency" unicode="&#xa4;"
d="M147 422l-88 67l69 69l67 -87c68 51 162 51 230 0l67 87l69 -69l-88 -67c47 -68 47 -162 0 -230l88 -67l-69 -69l-67 87c-68 -51 -162 -51 -230 0l-67 -87l-69 69l88 67c-47 68 -47 162 0 230zM225 398c-21 -23 -32 -54 -32 -91s11 -68 32 -91s50 -35 85 -35s64 12 85 35
s32 54 32 91s-11 68 -32 91s-50 35 -85 35s-64 -12 -85 -35z" />
<glyph glyph-name="yen" unicode="&#xa5;"
d="M266 116h-156v72h156v88h-156v72h118l-183 352h97l168 -336l168 336h97l-183 -352h118v-72h-156v-88h156v-72h-156v-116h-88v116z" />
<glyph glyph-name="brokenbar" unicode="&#xa6;"
d="M270 -50v349h80v-349h-80zM350 750v-349h-80v349h80z" />
<glyph glyph-name="section" unicode="&#xa7;"
d="M534 222c0 -56 -23 -101 -70 -136c29 -31 43 -68 43 -112c0 -57 -18 -103 -53 -136s-81 -50 -136 -50c-108 0 -180 59 -204 158l77 25c25 -69 67 -103 127 -103c64 0 105 38 105 102c0 35 -13 61 -44 81c-15 11 -29 19 -44 26c-14 7 -34 15 -59 26s-46 21 -62 29
c-80 41 -112 78 -112 142c0 56 23 101 70 136c-29 31 -43 68 -43 112c0 57 18 103 53 136s81 50 136 50c108 0 180 -59 204 -158l-77 -25c-25 69 -67 103 -127 103c-64 0 -105 -38 -105 -102c0 -35 14 -61 43 -82c15 -10 30 -18 44 -25l60 -27c25 -11 46 -20 62 -28
c80 -41 112 -78 112 -142zM455 213c0 37 -36 70 -75 87c-19 9 -44 19 -74 32s-53 24 -70 33c-37 -23 -55 -50 -55 -82c0 -37 36 -70 75 -87c19 -9 44 -19 74 -32s53 -24 70 -33c37 23 55 50 55 82z" />
<glyph glyph-name="dieresis" unicode="&#xa8;"
d="M217 708c33 0 57 -25 57 -57s-24 -56 -57 -56c-31 0 -56 24 -56 56s25 57 56 57zM401 708c33 0 57 -25 57 -57s-24 -56 -57 -56c-31 0 -56 24 -56 56s25 57 56 57z" />
<glyph glyph-name="copyright" unicode="&#xa9;"
d="M116 151c-51 53 -77 120 -77 199s26 145 77 198s116 80 194 80s143 -27 194 -80s77 -119 77 -198s-26 -146 -77 -199s-116 -79 -194 -79s-143 26 -194 79zM160 505c-38 -41 -57 -93 -57 -155s19 -114 57 -155c39 -41 89 -62 150 -62s111 21 149 62c39 41 58 93 58 155
s-19 114 -58 155c-38 41 -88 62 -149 62s-111 -21 -150 -62zM381 302l51 -12c-11 -57 -59 -92 -122 -92c-37 0 -70 13 -99 39c-28 26 -42 64 -42 113s14 87 42 113c29 26 62 39 99 39c63 0 111 -35 122 -92l-51 -12c-13 34 -37 51 -71 51c-49 0 -82 -32 -82 -99
s33 -99 82 -99c34 0 58 17 71 51z" />
<glyph glyph-name="ordfeminine" unicode="&#xaa;"
d="M215 415c0 -37 24 -59 65 -59c31 0 60 10 86 30c27 20 40 50 40 90v13h-87c-67 0 -104 -29 -104 -74zM472 551v-251h-54l-9 58c-25 -37 -81 -62 -140 -62c-71 0 -122 40 -122 119c0 84 68 130 179 130h80v17c0 57 -40 82 -95 82c-43 0 -77 -27 -90 -67l-57 15
c17 68 75 112 147 112c99 0 161 -49 161 -153z" />
<glyph glyph-name="guillemotleft" unicode="&#xab;"
d="M337 80l-294 199v62l294 199v-90l-209 -140l209 -140v-90zM577 80l-294 199v62l294 199v-90l-209 -140l209 -140v-90z" />
<glyph glyph-name="logicalnot" unicode="&#xac;"
d="M459 313h-366v76h450v-247h-84v171z" />
<glyph glyph-name="uni00AD" unicode="&#xad;"
d="M485 280h-349v74h349v-74z" />
<glyph glyph-name="registered" unicode="&#xae;"
d="M116 151c-51 53 -77 120 -77 199s26 145 77 198s116 80 194 80s143 -27 194 -80s77 -119 77 -198s-26 -146 -77 -199s-116 -79 -194 -79s-143 26 -194 79zM160 505c-38 -41 -57 -93 -57 -155s19 -114 57 -155c39 -41 89 -62 150 -62s111 21 149 62c39 41 58 93 58 155
s-19 114 -58 155c-38 41 -88 62 -149 62s-111 -21 -150 -62zM436 202h-59l-88 126h-24v-126h-52v296h106c60 0 94 -34 94 -85c0 -43 -27 -74 -66 -82zM316 449h-51v-72h51c29 0 43 12 43 36s-14 36 -43 36z" />
<glyph glyph-name="overscore" unicode="&#xaf;"
d="M435 632h-249v76h249v-76z" />
<glyph glyph-name="degree" unicode="&#xb0;"
d="M199 443c-29 29 -43 66 -43 110s14 80 43 109s66 44 111 44s82 -15 111 -44s43 -65 43 -109s-14 -81 -43 -110s-66 -43 -111 -43s-82 14 -111 43zM248 616c-15 -16 -23 -37 -23 -63s8 -47 23 -63s36 -24 62 -24s47 8 62 24s23 37 23 63s-8 47 -23 63s-36 24 -62 24
s-47 -8 -62 -24z" />
<glyph glyph-name="plusminus" unicode="&#xb1;"
d="M530 0h-440v74h440v-74zM273 436v183h74v-183h183v-74h-183v-183h-74v183h-183v74h183z" />
<glyph glyph-name="uni00B2" unicode="&#xb2;"
d="M261 602l-59 15c9 56 50 95 111 95c69 0 107 -40 107 -100c0 -33 -11 -64 -34 -91l-74 -93h116v-60h-225v25l126 155c17 21 25 42 25 63c0 24 -14 41 -41 41s-44 -17 -52 -50z" />
<glyph glyph-name="uni00B3" unicode="&#xb3;"
d="M203 467l64 15c4 -35 26 -58 57 -58c33 0 49 18 49 55c0 39 -16 58 -49 58c-11 0 -22 -4 -33 -13l-29 41l66 83h-107v60h202v-23l-84 -104c64 0 100 -39 100 -102c0 -71 -46 -115 -115 -115c-67 0 -116 42 -121 103z" />
<glyph glyph-name="acute" unicode="&#xb4;"
d="M283 560h-66l67 144h121z" />
<glyph glyph-name="mu" unicode="&#xb5;"
d="M190 -204h-84v708h84v-333c0 -69 31 -103 93 -103c41 0 76 21 105 63c29 43 43 99 43 170v203h84v-504h-84v93c-37 -60 -102 -101 -171 -101c-28 0 -51 4 -70 12v-208z" />
<glyph glyph-name="mu" unicode="&#x3bc;"
d="M190 -204h-84v708h84v-333c0 -69 31 -103 93 -103c41 0 76 21 105 63c29 43 43 99 43 170v203h84v-504h-84v93c-37 -60 -102 -101 -171 -101c-28 0 -51 4 -70 12v-208z" />
<glyph glyph-name="paragraph" unicode="&#xb6;"
d="M245 700h312v-76h-62v-828h-84v828h-82v-828h-84v518c-53 0 -99 19 -137 56c-37 38 -56 84 -56 137s19 99 56 136c38 38 84 57 137 57z" />
<glyph glyph-name="middot" unicode="&#xb7;"
d="M253 295c-31 31 -31 83 0 114s83 31 114 0s31 -83 0 -114s-83 -31 -114 0z" />
<glyph glyph-name="cedilla" unicode="&#xb8;"
d="M329 -60h70l-83 -175l-95 45z" />
<glyph glyph-name="uni00B9" unicode="&#xb9;"
d="M419 368h-220v56h79v195l-75 -34v71l113 52h24v-284h79v-56z" />
<glyph glyph-name="ordmasculine" unicode="&#xba;"
d="M168 355c-35 40 -53 88 -53 145s18 105 53 144c35 40 82 60 141 60s106 -20 141 -60c36 -39 54 -87 54 -144s-18 -105 -54 -145c-35 -39 -82 -59 -141 -59s-106 20 -141 59zM216 602c-23 -28 -34 -62 -34 -102s11 -74 34 -103c23 -28 54 -42 93 -42s69 14 92 42
c23 29 35 63 35 103s-12 74 -35 102s-53 42 -92 42s-70 -14 -93 -42z" />
<glyph glyph-name="guillemotright" unicode="&#xbb;" horiz-adv-x="618"
d="M281 540l294 -199v-62l-294 -199v90l209 140l-209 140v90zM41 540l294 -199v-62l-294 -199v90l209 140l-209 140v90z" />
<glyph glyph-name="onequarter" unicode="&#xbc;"
d="M525 -8h-62v61h-150v27l139 252h73v-219h50v-60h-50v-61zM463 244l-69 -131h69v131zM61 196l507 353l34 -48l-507 -353zM249 368h-220v56h79v195l-75 -34v71l113 52h24v-284h79v-56z" />
<glyph glyph-name="onehalf" unicode="&#xbd;"
d="M249 368h-220v56h79v195l-75 -34v71l113 52h24v-284h79v-56zM61 196l507 353l34 -48l-507 -353zM417 234l-59 15c9 56 50 95 111 95c69 0 107 -40 107 -100c0 -33 -11 -64 -34 -91l-74 -93h116v-60h-225v25l126 155c17 21 25 42 25 63c0 24 -14 41 -41 41
s-44 -17 -52 -50z" />
<glyph glyph-name="threequarters" unicode="&#xbe;"
d="M23 467l64 15c4 -35 26 -58 57 -58c33 0 49 18 49 55c0 39 -16 58 -49 58c-11 0 -22 -4 -33 -13l-29 41l66 83h-107v60h202v-23l-84 -104c64 0 100 -39 100 -102c0 -71 -46 -115 -115 -115c-67 0 -116 42 -121 103zM61 196l507 353l34 -48l-507 -353zM525 -8h-62v61h-150
v27l139 252h73v-219h50v-60h-50v-61zM463 244l-69 -131h69v131z" />
<glyph glyph-name="questiondown" unicode="&#xbf;"
d="M388 433c0 -39 -29 -68 -66 -68s-68 29 -68 68c0 37 29 66 68 66c37 0 66 -29 66 -66zM253 166l-65 23c24 70 69 105 134 105c80 0 132 -48 132 -124c0 -55 -28 -97 -85 -126c-29 -16 -72 -30 -92 -41c-29 -15 -43 -39 -43 -71c0 -23 7 -40 21 -52c16 -14 38 -21 65 -21
c51 0 89 36 105 92l78 -13c-16 -91 -83 -150 -183 -150c-51 0 -93 15 -124 44s-46 64 -46 105c0 54 26 94 77 119l101 49c33 18 49 41 49 69c0 32 -20 51 -52 51c-31 0 -55 -20 -72 -59z" />
<glyph glyph-name="Agrave" unicode="&#xc0;"
d="M19 0l249 700h84l249 -700h-91l-63 187h-274l-63 -187h-91zM418 271l-108 315l-108 -315h216zM175 900h121l67 -144h-66z" />
<glyph glyph-name="Aacute" unicode="&#xc1;"
d="M19 0l249 700h84l249 -700h-91l-63 187h-274l-63 -187h-91zM418 271l-108 315l-108 -315h216zM322 756h-66l67 144h121z" />
<glyph glyph-name="Acircumflex" unicode="&#xc2;"
d="M19 0l249 700h84l249 -700h-91l-63 187h-274l-63 -187h-91zM418 271l-108 315l-108 -315h216zM230 762h-87l154 164h26l154 -164h-87l-80 85z" />
<glyph glyph-name="Atilde" unicode="&#xc3;"
d="M19 0l249 700h84l249 -700h-91l-63 187h-274l-63 -187h-91zM418 271l-108 315l-108 -315h216zM183 782l-49 38c24 45 64 76 107 76c24 0 48 -7 72 -20s44 -20 59 -20c25 0 47 12 66 36l49 -39c-24 -44 -64 -75 -107 -75c-24 0 -48 7 -72 20s-44 20 -59 20
c-25 0 -47 -12 -66 -36z" />
<glyph glyph-name="Adieresis" unicode="&#xc4;"
d="M19 0l249 700h84l249 -700h-91l-63 187h-274l-63 -187h-91zM418 271l-108 315l-108 -315h216zM218 904c33 0 57 -25 57 -57s-24 -56 -57 -56c-31 0 -56 24 -56 56s25 57 56 57zM402 904c33 0 57 -25 57 -57s-24 -56 -57 -56c-31 0 -56 24 -56 56s25 57 56 57z" />
<glyph glyph-name="Aring" unicode="&#xc5;"
d="M19 0l249 700h84l249 -700h-91l-63 187h-274l-63 -187h-91zM418 271l-108 315l-108 -315h216zM211 849c0 56 43 100 99 100c57 0 99 -44 99 -100c0 -55 -42 -96 -99 -96c-56 0 -99 41 -99 96zM267 850c-5 -57 91 -57 86 0c5 60 -91 60 -86 0z" />
<glyph glyph-name="AE" unicode="&#xc6;"
d="M-11 0l194 700h392v-84h-206v-201h166v-84h-166v-247h216v-84h-304v187h-152l-52 -187h-88zM281 586h-47l-85 -315h132v315z" />
<glyph glyph-name="Ccedilla" unicode="&#xc7;"
d="M506 230l83 -25c-32 -129 -120 -213 -251 -213c-84 0 -153 31 -208 92c-54 61 -81 150 -81 266s27 205 81 266c55 61 124 92 208 92c131 0 219 -84 251 -213l-83 -25c-32 104 -81 154 -168 154c-124 0 -198 -89 -198 -274s74 -274 198 -274c87 0 136 50 168 154zM322 -60
h70l-83 -175l-95 45z" />
<glyph glyph-name="Egrave" unicode="&#xc8;"
d="M91 0v700h444v-84h-356v-201h306v-84h-306v-247h366v-84h-454zM193 900h121l67 -144h-66z" />
<glyph glyph-name="Eacute" unicode="&#xc9;"
d="M91 0v700h444v-84h-356v-201h306v-84h-306v-247h366v-84h-454zM312 756h-66l67 144h121z" />
<glyph glyph-name="Ecircumflex" unicode="&#xca;"
d="M91 0v700h444v-84h-356v-201h306v-84h-306v-247h366v-84h-454zM230 762h-87l154 164h26l154 -164h-87l-80 85z" />
<glyph glyph-name="Edieresis" unicode="&#xcb;"
d="M91 0v700h444v-84h-356v-201h306v-84h-306v-247h366v-84h-454zM222 904c33 0 57 -25 57 -57s-24 -56 -57 -56c-31 0 -56 24 -56 56s25 57 56 57zM406 904c33 0 57 -25 57 -57s-24 -56 -57 -56c-31 0 -56 24 -56 56s25 57 56 57z" />
<glyph glyph-name="Igrave" unicode="&#xcc;"
d="M523 76v-76h-426v76h169v548h-169v76h426v-76h-169v-548h169zM205 900h121l67 -144h-66z" />
<glyph glyph-name="Iacute" unicode="&#xcd;"
d="M523 76v-76h-426v76h169v548h-169v76h426v-76h-169v-548h169zM292 756h-66l67 144h121z" />
<glyph glyph-name="Icircumflex" unicode="&#xce;"
d="M523 76v-76h-426v76h169v548h-169v76h426v-76h-169v-548h169zM231 762h-87l154 164h26l154 -164h-87l-80 85z" />
<glyph glyph-name="Idieresis" unicode="&#xcf;"
d="M523 76v-76h-426v76h169v548h-169v76h426v-76h-169v-548h169zM219 904c33 0 57 -25 57 -57s-24 -56 -57 -56c-31 0 -56 24 -56 56s25 57 56 57zM403 904c33 0 57 -25 57 -57s-24 -56 -57 -56c-31 0 -56 24 -56 56s25 57 56 57z" />
<glyph glyph-name="Eth" unicode="&#xd0;"
d="M75 308h-49v84h49v308h189c95 0 170 -30 226 -89c57 -59 85 -146 85 -261s-28 -202 -85 -261c-56 -59 -131 -89 -226 -89h-189v308zM255 616h-92v-224h109v-84h-109v-224h92c147 0 226 78 226 266s-79 266 -226 266z" />
<glyph glyph-name="Ntilde" unicode="&#xd1;"
d="M460 160v540h88v-700h-96l-293 540v-540h-88v700h96zM186 782l-49 38c24 45 64 76 107 76c24 0 48 -7 72 -20s44 -20 59 -20c25 0 47 12 66 36l49 -39c-24 -44 -64 -75 -107 -75c-24 0 -48 7 -72 20s-44 20 -59 20c-25 0 -47 -12 -66 -36z" />
<glyph glyph-name="Ograve" unicode="&#xd2;"
d="M114 615c51 62 116 93 196 93s145 -31 196 -93c51 -61 76 -150 76 -265s-25 -204 -76 -266c-51 -61 -116 -92 -196 -92s-145 31 -196 92c-51 62 -76 151 -76 266s25 204 76 265zM442 557c-33 45 -77 67 -132 67s-99 -22 -132 -67c-33 -44 -49 -113 -49 -207
s16 -163 49 -208c33 -44 77 -66 132 -66s99 22 132 66c33 45 49 114 49 208s-16 163 -49 207zM187 900h121l67 -144h-66z" />
<glyph glyph-name="Oacute" unicode="&#xd3;"