add murph - add most of the previous blog pages

This commit is contained in:
Simon Vieille 2021-03-29 13:58:05 +02:00
parent 40ed84dea3
commit 38bec1c0fa
152 changed files with 14834 additions and 220 deletions

View file

@ -13,6 +13,7 @@ $pagination-active-bg: #343a40;
@import "~choices.js/src/styles/choices.scss";
@import "~bootstrap/scss/bootstrap.scss";
@import "~@fortawesome/fontawesome-free/css/all.css";
@import "~simplemde/dist/simplemde.min.css";
#logo {
width: 30px;

749
assets/css/app.scss Normal file
View file

@ -0,0 +1,749 @@
@import "app/config";
@import "~wire.css/src/scss/wire";
@import 'app/prism';
@import 'app/alert';
@font-face {
font-family: "MainFont";
src: url(../fonts/ubuntu/ubuntu-light.woff) format('woff');
}
@font-face {
font-family: "deblan-icon";
src: url('../fonts/deblan/deblan-icon.eot?v=5');
src: url('../fonts/deblan/deblan-icon.woff?vmatrix5') format('woff'),
url('../fonts/deblan/deblan-icon.ttf?v=5') format('truetype');
font-style: normal;
font-weight: normal;
text-rendering: optimizeLegibility;
}
@mixin make-pre {
padding: 10px;
border: 1px solid $color-code-border;
overflow: auto;
background: $color-code-background;
color: $color-code-text;
font-size: 13px;
}
@mixin make-pre-code {
color: $color-code-text;
display: inline-block;
max-width: 100%;
}
html, body {
scroll-behavior: smooth;
}
$dicons: coffee server search project share contact list response twitter diaspora github code rss linkedin mastodon pixelfed gpg matrix;
.deblan-icon {
font-family: 'deblan-icon';
vertical-align: middle;
@each $dicon in $dicons {
&-#{$dicon}::before {
content: "#{$dicon}";
}
}
}
.button .deblan-icon {
margin-right: 5px;
margin-left: -3px;
}
li, p {
-webkit-hyphens: auto;
-moz-hyphens: auto;
-ms-hyphens: auto;
-o-hyphens: auto;
hyphens: auto;
}
code mark {
color: inherit;
background: $color-code-mark-background;
}
a:focus .logo-svg * {
fill: $color-grey;
}
.page {
min-height: 100vh;
background: $color-white;
font-family: "MainFont";
}
.no-margin {
margin: 0;
}
.navigation {
padding-top: 35px;
font-size: 15px;
.deblan-icon {
margin-right: 9px;
}
ul {
margin: 0;
padding: 0;
list-style: none;
}
li {
margin: 0 0 3px 0;
padding: 0;
}
a {
color: $color-white;
display: block;
padding: 12px 15px;
background: $color-navigation-item-background;
&:hover, &.active, &:focus {
background: $color-navigation-item-background-active;
}
}
}
.small-menu {
background: $color-small-menu-background;
padding: 5px;
position: fixed;
bottom: 0;
width: 100%;
z-index: 1000;
.navigation {
padding-top: 0;
float: right;
a {
margin-left: 2px;
}
.deblan-icon {
margin-right: 0;
}
}
img {
padding: 10px;
}
}
.wide-menu {
width: 230px;
background: linear-gradient(to bottom, $color-wide-menu-background-from 0%, $color-wide-menu-background-to 500px);
padding: 34px 25px;
min-height: calc(100vh - 130px);
.navigation {
li {
$radius: 8px;
&:first-child a {
border-top-right-radius: $radius;
border-top-left-radius: $radius;
}
&:last-child a {
border-bottom-right-radius: $radius;
border-bottom-left-radius: $radius;
}
}
}
}
@keyframes gradientBackground {
0% {
background-position: 0 0%;
}
50% {
background-position: 0 75%;
}
100% {
background-position: 0 0%;
}
}
.header {
padding: 30px;
background: linear-gradient(180deg, $color-header-background-from, $color-header-background-to);
background-size: 100% 200%;
color: $color-white;
animation: gradientBackground 10s ease infinite;
}
.fixed-menu {
position: fixed;
width: calc(230px - 50px);
}
.content {
background: $color-content-background;
width: calc(100% - 230px);
}
.header {
color: $color-header-text;
p, h1, ul {
position: relative;
z-index: 1000;
}
#particles {
width: 100%;
top: 0;
overflow: hidden;
position: absolute;
z-index: 50;
}
.h1 {
font-weight: normal;
font-size: 24px;
}
.h3 {
font-size: 17px;
font-weight: normal;
}
a {
color: $color-header-text !important;
&:focus {
color: $color-blue !important;
background: $color-white;
}
}
}
.body {
padding: 25px 40px;
max-width: 900px;
iframe {
margin-bottom: 25px;
border: none;
}
img {
width: auto;
cursor: zoom-in;
}
a, h1, h2, h3, h4, h5, p, ul {
color: $color-body-text;
}
p a, ul a {
border-bottom: 1px dotted $color-body-link-border;
}
blockquote {
border-left: 2px solid $color-blockquote-border;
margin: 10px;
padding: 5px 20px;
p {
margin: 0;
padding: 0;
}
}
code {
color: $code-color;
}
}
.content hr {
border: 0;
border-bottom: 1px dashed $color-hr-border;
background: $color-hr-background;
}
.reviews {
padding: 0 40px;
max-width: 900px;
hr:first-child {
margin-bottom: 30px;
}
blockquote {
border-left: 2px solid $color-blockquote-border;
margin: 10px;
padding: 5px 20px;
p {
margin: 0;
padding: 0;
}
}
}
.review-body {
code {
color: $code-color;
}
pre {
@include make-pre;
code {
@include make-pre-code;
}
}
}
@for $i from 1 through 6 {
.review.offset-#{$i} {
margin-left: 5% * $i - 1%;
width: 100% - ($i * 5%);
}
}
.review {
width: 100%;
.review-avatar {
display: inline-block;
width: 60px;
margin-right: 10px;
}
.review-content {
display: inline-block;
width: calc(100% - 75px);
}
ul {
margin: 0;
padding: 0 0 25px 0;
}
a svg {
display: inline-block;
height: 21px;
width: 15px;
vertical-align: middle;
margin-right: 3px;
}
.review-header {
border-bottom: 1px solid $color-very-light-grey;
padding-bottom: 5px;
margin-bottom: 5px;
color: $color-dark-grey;
.review-anchor-link {
color: $color-dark-grey;
}
}
.review-body {
color: $color-dark-grey;
margin-bottom: 10px;
ul {
margin: 0 !important;
padding: 0 0 10px 10px !important;
}
li {
list-style: disc;
margin: 0 0 0 15px;
padding: 0;
}
}
}
.body {
pre {
@include make-pre;
code {
@include make-pre-code;
}
&.with-title {
margin-top: 0;
border-top-right-radius: 0;
border-top-left-radius: 0;
}
}
}
.code-title {
background: $color-code-title-background;
padding: 10px 15px;
color: $color-code-title-text;
}
.body-content {
line-height: 30px;
}
.quick-image {
img {
width: 100%;
height: 350px;
background-position: center center;
background: #f2f2f2 url('../images/quick-post-load.png') no-repeat center center;
border: 2px solid $color-very-light-grey;
border-bottom: 0;
cursor: pointer;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
}
}
.quick-video {
.video-ratio {
border: 2px solid $color-very-light-grey;
border-bottom: 0;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
iframe {
border-top-left-radius: 5px;
border-top-right-radius: 5px;
}
}
}
.video-ratio {
position: relative;
width: 100%;
height: 0;
iframe {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
}
}
.quick-body {
padding: 10px 10px 0 10px;
border: 2px solid $color-very-light-grey;
margin-top: -7px;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
> p:last-child {
margin-bottom: 8px;
}
}
.error_list {
color: $color-red !important;
padding: 4px 0 !important;
}
.content-footer {
font-size: 14px;
background: darken($color-dark-grey, 10%);
text-align: center;
border-top: 1px dotted $color-very-dark-grey;
color: $color-white;
padding-top: 20px;
padding-bottom: 20px;
a {
font-weight: bold;
color: $color-white;
}
ul {
margin: 0;
padding: 0 0 10px 0;
}
li {
padding: 0;
margin: 0;
&::after {
content: '-';
margin: 0 5px;
}
&:last-child::after {
display: none;
}
}
p {
margin-bottom: 0;
margin-top: 10px;
padding: 0;
}
}
.links {
margin: 0;
padding: 5px 0 0 0;
text-align: center;
}
.link {
margin: 0 1px;
display: inline-block;
a {
display: block;
font-size: 13px;
padding-top: 1px;
padding-right: 1px;
height: 20px;
width: 20px;
overflow: hidden;
color: $color-white;
span {
display: none;
}
}
}
.links a:focus, .wide-menu a:focus .fixed {
border: 1px solid $color-white;
}
$links: (
twitter: #20b8ff,
rss: #fd9f13,
linkedin: #006699,
diaspora: #90b92e,
github: #8cc345,
code: #51d066,
mastodon: #2984d2,
pixelfed: #e72151,
matrix: #1a588a,
gpg: #42a73b
);
@each $site, $bg in $links {
.link-#{$site} {
background-color: $bg;
&:hover a, &:focus a, a:focus, a:hover {
color: $color-very-light-grey;
}
}
}
.form .field input[type="checkbox"] + label, .form .field input[type="radio"] + label {
margin-left: 1rem;
margin-top: -2px;
}
.preview-button {
cursor: pointer;
margin-left: 3px;
}
.content-footer, .body, .review, form {
a:focus {
background: $color-blue;
color: $color-white;
}
}
.button {
&:focus {
background: $color-very-dark-grey;
}
}
.button, .btn, input[type="submit"], input[type="button"] {
background: $color-blue;
}
.button:hover, .btn:hover, input:hover[type="submit"], input:hover[type="button"] {
background: $color-blue2;
}
.button:focus, .btn:focus, input:focus[type="submit"], input:focus[type="button"] {
background: $color-blue2;
}
.pager {
padding: 20px 20px 0 20px;
.pager-page {
padding: 0 2px 2px 2px;
&.active {
font-weight: bold;
}
}
.button {
padding: 8px;
}
}
@keyframes bounceIn {
0%{
opacity: 0;
}
50%{
opacity: 0.9;
}
80%{
opacity: 1;
}
100%{
opacity: 1;
}
}
@keyframes knmc {
0%{
left: -256px;;
}
100%{
left: 150vw;
}
}
.knmc {
animation-name: knmc;
animation-duration: 15s;
animation-iteration-count: 1;
}
.logo-svg {
animation-name: bounceIn;
animation-duration: 1s;
}
.logo-svg {
animation-name: bounceIn;
animation-duration: 1s;
}
@media screen and (max-width: 980px) {
.quick-image img {
height: 200px;
}
}
@media screen and (max-width: 719px) {
.content-footer {
margin-bottom: 40px;
}
}
@media screen and (max-width: 550px) {
.body {
padding: 10px 10px 20px 10px;
}
.reviews {
padding: 10px 10px 20px 10px;
}
}
@media screen and (max-width: 719px) {
.content {
width: 100%;
}
.review {
.review-avatar {
display: none;
}
.review-content {
width: 100%;
margin: 0;
}
}
}
@media screen and (max-width: 380px) {
.navigation {
a {
padding: 7px 10px;
}
}
.small-menu {
img {
width: 20px;
margin-top: 11px;
padding: 0;
}
}
}
@media (prefers-color-scheme: dark) {
.content {
background: #35363f;
}
.body, .review, #form {
a, h1, h2, h3, h4, h5, p, ul, li, label, th, td,
.h1, .h2, .h3, .h4, .h5, .review-body {
color: #fff;
}
}
.review .review-header .review-anchor-link {
color: #ccc;
}
.body p a, .body ul a {
border-bolor: #ccc;
}
img.border {
border-color: #32333b;
}
.form .field {
input[type=text],
input[type=email],
input[type=url],
textarea {
border-color: #32333b;
background: #86899f;
}
}
.content hr {
background: none;
}
.quick-body,
.quick-video .video-ratio,
.quick-image img,
.content hr,
.alert
{
border-color: #86899f;
}
.code-title {
background: #0f1017;
}
}

34
assets/css/app/alert.scss Normal file
View file

@ -0,0 +1,34 @@
.alert {
padding: 20px;
border: 1px solid #333;
&-success {
border-color: #9db024;
background: #c6ff69;
color: #415f29;
}
&-notice {
border-color: $color-blue;
background: #66e6ff;
color: #254e5f;
}
&-warning {
border-color: #b07f29;
background: #ffd465;
color: #5f4520;
}
&-error {
border-color: #b02e2a;
background: #ff6363;
color: #5f2521;
}
&-notice-light {
border-color: $color-blue;
background: #d9fffc;
color: #254e5f;
}
}

View file

@ -0,0 +1,41 @@
/*$wire-debug: false;*/
$color-white: #fff;
$color-very-light-grey: #e0e0e0;
$color-light-blue: #b9d4e3;
$color-blue: #0269a0;
$color-blue2: #48a8ce;
$color-grey: #ccc;
$color-dark-grey: #454651;
$color-very-dark-grey: #333;
$color-red: #b02e2a;
$code-color: $color-red;
$color-navigation-item-background: darken($color-dark-grey, 8%);
$color-navigation-item-background-active: lighten($color-dark-grey, 10%);
$color-small-menu-background: $color-dark-grey;
$color-wide-menu-background-from: $color-dark-grey;
$color-wide-menu-background-to: darken($color-dark-grey, 5%);
$color-header-background-from: $color-blue2;
$color-header-background-to: $color-blue;
$color-header-text: $color-white;
$color-body-text: $color-dark-grey;
$color-body-link-border: $color-blue;
$color-blockquote-border: $color-grey;
$color-hr-border: $color-grey;
$color-hr-background: $color-grey;
$color-content-background: $color-white;
/* GIST compatiblity */
$color-code-border: #3c3c3c;
$color-code-background: #222222;
$color-code-text: #f8f8f2;
$color-code-mark-background: $color-light-blue;
$color-code-title-background: #3c3c3c;
$color-code-title-text: #999;
/* --- */

126
assets/css/app/prism.scss Normal file
View file

@ -0,0 +1,126 @@
/* PrismJS 1.22.0
https://prismjs.com/download.html#themes=prism-okaidia&languages=markup+css+clike+javascript+bash+markdown+markup-templating+nginx+php+python+sql+yaml&plugins=keep-markup */
/**
* okaidia theme for JavaScript, CSS and HTML
* Loosely based on Monokai textmate theme by http://www.monokai.nl/
* @author ocodia
*/
code[class*="language-"],
pre[class*="language-"] {
color: #f8f8f2;
background: none;
text-shadow: 0 1px rgba(0, 0, 0, 0.3);
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
font-size: 1em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
border-radius: 0.3em;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background: #272822;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #8292a2;
}
.token.punctuation {
color: #f8f8f2;
}
.token.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.constant,
.token.symbol,
.token.deleted {
color: #f92672;
}
.token.boolean,
.token.number {
color: #ae81ff;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #a6e22e;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string,
.token.variable {
color: #f8f8f2;
}
.token.atrule,
.token.attr-value,
.token.function,
.token.class-name {
color: #e6db74;
}
.token.keyword {
color: #66d9ef;
}
.token.regex,
.token.important {
color: #fd971f;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,422 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0"
width="1066.6666"
height="1066.6666"
id="svg5496"
sodipodi:version="0.32"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="deblan-icon.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<metadata
id="metadata5594">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
inkscape:window-height="1027"
inkscape:window-width="1918"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:zoom="0.31914415"
inkscape:cx="2138.9405"
inkscape:cy="205.31477"
inkscape:window-x="0"
inkscape:window-y="21"
inkscape:current-layer="svg5496"
inkscape:window-maximized="0"
inkscape:snap-grids="false"
inkscape:snap-to-guides="false"
inkscape:snap-smooth-nodes="true">
<sodipodi:guide
orientation="horizontal"
position="4327.7,213.33333"
id="guide5596"
inkscape:locked="false" />
</sodipodi:namedview>
<defs
id="defs5498">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 533.33333 : 1"
inkscape:vp_y="0 : 1066.6667 : 0"
inkscape:vp_z="1066.6667 : 533.33333 : 1"
inkscape:persp3d-origin="533.33333 : 355.55555 : 1"
id="perspective3931" />
<font
horiz-adv-x="1024"
id="font3933"
inkscape:label="font 1"
horiz-origin-x="0"
horiz-origin-y="0"
vert-origin-x="45"
vert-origin-y="90"
vert-adv-y="90">
<font-face
units-per-em="1024"
id="font-face3935"
font-family="deblan-icon" />
<missing-glyph
d="M0,0h1000v1024h-1000z"
id="missing-glyph3937" />
<glyph
glyph-name="glyph 1"
id="glyph3939"
unicode="coffee"
d="m 145.48656,925.05618 c -25.7046,0 -46.542797,-20.83819 -46.542797,-46.54269 v -775.6954 c 0,-25.7046 20.838197,-46.5409 46.542797,-46.5409 h 527.4723 c 25.7046,0 46.5409,20.8363 46.5409,46.5409 v 81.6615 l 156.3149,69.7684 c 55.8307,24.9192 91.9082,80.5269 91.9082,141.6671 v 249.8901 c 0,85.5437 -69.5958,155.1395 -155.1395,155.1395 h -93.0836 v 77.5688 c 0,25.7045 -20.8363,46.54269 -46.5409,46.54269 z m 170.6524,-186.16729 c 17.1351,0 31.0279,-13.8928 31.0279,-31.0279 v -434.3886 c 0,-17.1351 -13.8928,-31.0279 -31.0279,-31.0279 -17.1351,0 -31.0279,13.8928 -31.0279,31.0279 v 434.3886 c 0,17.1351 13.8928,31.0279 31.0279,31.0279 z m 186.1675,0 c 17.135,0 31.0279,-13.8928 31.0279,-31.0279 v -434.3886 c 0,-17.1351 -13.8929,-31.0279 -31.0279,-31.0279 -17.1351,0 -31.028,13.8928 -31.028,31.0279 v 434.3886 c 0,17.1351 13.8929,31.0279 31.028,31.0279 z m 217.1933,-62.0558 h 93.0836 c 17.108,0 31.028,-13.9199 31.028,-31.0279 v -249.8901 a 31.062702,31.062702 0 0 0 -18.3817,-28.3349 l -105.7299,-47.1894 z" />
<glyph
glyph-name="glyph 2"
id="glyph3941"
unicode="list"
d="m 138.84902,925.05619 c -55.363697,0 -100.243997,-44.8802 -100.243997,-100.2439 0,-55.3638 44.8803,-100.244 100.243997,-100.244 55.3638,0 100.2439,44.8802 100.2439,100.244 0,55.3637 -44.8801,100.2439 -100.2439,100.2439 z m 200.4879,-25.0624 c -18.4553,0 -33.4146,-14.9574 -33.4146,-33.4127 v -83.5376 c 0,-18.4553 14.9593,-33.4147 33.4146,-33.4147 H 994.6468 c 18.4554,0 33.4148,14.9594 33.4148,33.4147 v 83.5376 c 0,18.4553 -14.9594,33.4127 -33.4148,33.4127 z m -200.4879,-309.0841 c -55.363697,0 -100.243997,-44.8802 -100.243997,-100.244 0,-55.3637 44.8803,-100.2439 100.243997,-100.2439 55.3638,0 100.2439,44.8802 100.2439,100.2439 0,55.3638 -44.8801,100.244 -100.2439,100.244 z m 200.4879,-25.0605 c -18.4553,0 -33.4146,-14.9594 -33.4146,-33.4146 v -83.5357 c 0,-18.4552 14.9593,-33.4146 33.4146,-33.4146 H 994.6468 c 18.4554,0 33.4148,14.9594 33.4148,33.4146 v 83.5357 c 0,18.4552 -14.9594,33.4146 -33.4148,33.4146 z m -200.4879,-309.084 c -55.363697,0 -100.243997,-44.8802 -100.243997,-100.244 0,-55.3637 44.8803,-100.244 100.243997,-100.244 55.3638,0 100.2439,44.8803 100.2439,100.244 0,55.3638 -44.8801,100.244 -100.2439,100.244 z m 200.4879,-25.0625 c -18.4553,0 -33.4146,-14.9574 -33.4146,-33.4127 v -83.5376 c 0,-18.4553 14.9593,-33.4147 33.4146,-33.4147 H 994.6468 c 18.4554,0 33.4148,14.9594 33.4148,33.4147 v 83.5376 c 0,18.4553 -14.9594,33.4127 -33.4148,33.4127 z" />
<glyph
glyph-name="glyph 3"
id="glyph3943"
unicode="search"
d="m 451.92416,925.05619 c -194.9475,0 -352.906902,-157.95951 -352.906902,-352.90691 0,-194.9474 157.959402,-352.9068 352.906902,-352.9068 81.9491,0 157.2819,27.8252 217.1744,74.6533 v -27.6553 c 0,-10.8587 4.242,-21.209 11.8771,-28.844 L 850.13336,68.23871 c 15.9488,-15.9487 41.7374,-15.9487 57.5163,0 l 48.0167,48.01497 c 15.9487,15.9487 15.9491,41.7392 0.17,57.6879 l -169.1594,169.1579 c -7.635,7.635 -17.9837,11.877 -28.8424,11.877 h -27.6569 c 46.8281,59.8925 74.655,135.2236 74.655,217.1728 0,194.9474 -157.9611,352.9069 -352.9085,352.90691 z m 0,-135.73241 c 119.9545,0 217.1744,-97.0502 217.1744,-217.1745 0,-119.9546 -97.0502,-217.1728 -217.1744,-217.1728 -119.9546,0 -217.1728,97.0485 -217.1728,217.1728 0,119.9546 97.0485,217.1745 217.1728,217.1745 z" />
<glyph
glyph-name="glyph 4"
id="glyph3945"
unicode="server"
d="m 349.64471,879.42274 c -32.49503,-1.8e-4 -62.84003,-16.24125 -80.86518,-43.27853 L 73.331637,542.9764 c 19.737185,8.25805 40.921863,12.50082 62.316753,12.48211 h 795.3699 c 21.39494,0.0179 42.5797,-4.22406 62.31671,-12.48211 L 797.88922,836.14421 c -18.0265,27.0371 -48.37177,43.27799 -80.86724,43.27853 z M 135.64839,490.6657 c -53.676567,0 -97.189211,-43.51264 -97.189211,-97.1893 V 199.09985 c 0,-53.67666 43.512644,-97.18921 97.189211,-97.18921 h 795.3699 c 53.6767,0 97.18911,43.51255 97.18911,97.18921 V 393.4764 c 0,53.67666 -43.51241,97.1893 -97.18911,97.1893 z M 639.45244,361.08196 c 35.78378,0 64.7929,-29.00911 64.7929,-64.7929 0,-35.78369 -29.00912,-64.79281 -64.7929,-64.79281 -35.78369,0 -64.7929,29.00912 -64.7929,64.79281 0,35.78379 29.00921,64.7929 64.7929,64.7929 z m 194.37664,0 c 35.78369,0 64.79272,-29.00911 64.79272,-64.7929 0,-35.78369 -29.00903,-64.79281 -64.79272,-64.79281 -35.78387,0 -64.7929,29.00912 -64.7929,64.79281 0,35.78379 29.00903,64.7929 64.7929,64.7929 z" />
<glyph
glyph-name="glyph 5"
id="glyph3947"
unicode="contact"
d="m 157.50472,869.38667 c -47.882,0 -86.729902,-42.40901 -86.729902,-94.68024 v -37.47747 c 0,-14.59649 6.1438,-28.20628 16.6238,-37.27978 55.290002,-47.14272 73.540402,-63.90899 313.311602,-253.86065 30.3553,-24.0645 90.7047,-82.4502 132.6239,-81.66121 41.9194,-0.78899 102.2688,57.59671 132.6241,81.66121 239.7712,189.95166 258.0199,206.52067 313.3099,253.86065 10.4799,8.87625 16.62369,22.68329 16.62369,37.27978 v 37.47747 c 0,52.27124 -38.84779,94.68024 -86.72979,94.68024 z m 827.3111,-247.58779 c -2.2155,-0.0229 -4.4694,-0.80648 -6.4513,-2.52626 -40.4739,-34.32148 -93.9565,-78.10959 -278.2569,-224.27177 -36.6794,-29.19299 -102.2682,-94.48311 -166.7735,-93.89137 -64.1437,-0.39449 -128.4691,63.51489 -166.5939,93.89137 -184.3004,146.16218 -237.9641,189.7545 -278.438002,224.07598 -7.2275,6.11475 -17.5274,0.59009 -17.5274,-9.27242 V 206.62694 c 0,-52.27122 38.847902,-94.68023 86.729902,-94.68023 h 751.6573 c 47.882,0 86.72979,42.40901 86.72979,94.68023 V 610.0021 c 0,6.9469 -5.41419,11.85548 -11.07599,11.79678 z" />
<glyph
glyph-name="glyph 6"
id="glyph3949"
unicode="project"
d="m 767.46321,925.05678 c -10.4138,0 -20.8476,-3.98816 -28.8223,-11.96289 L 110.84211,285.29702 c -15.949497,-15.7798 -15.949497,-41.57203 0,-57.52149 l 159.664,-159.66408 c 15.9495,-15.7798 41.7417,-15.7798 57.5215,0 l 627.7969,627.79885 c 15.9495,15.77979 15.9495,41.57007 0,57.51953 l -159.6641,159.66406 c -7.8899,7.97473 -18.2834,11.96289 -28.6972,11.96289 z m -587.0547,-27.97656 c -2.2906,0.0212 -4.5799,-1.20768 -5.7676,-3.66797 l -13.2344,-26.80859 -29.6933,-4.41211 c -5.26,-0.84838 -7.467,-7.29645 -3.5645,-11.0293 l 21.3789,-20.86914 -5.0898,-29.52344 c -0.8484,-5.25993 4.751,-9.33224 9.5019,-6.78711 l 26.4688,13.91406 26.4707,-13.91406 c 4.7509,-2.54513 10.3503,1.52718 9.5019,6.78711 l -5.0918,29.52344 21.3809,20.86914 c 3.9025,3.73285 1.6955,10.3506 -3.5645,11.0293 l -29.6933,4.24218 -13.2344,26.8086 c -1.1877,2.54513 -3.4789,3.81668 -5.7695,3.83789 z m 325.7773,0 c -2.2906,0.0212 -4.5818,-1.20768 -5.7695,-3.66797 l -13.2344,-26.80859 -29.6933,-4.41211 c -5.26,-0.84838 -7.4651,-7.29645 -3.5625,-11.0293 l 21.3789,-20.86914 -5.0899,-29.52344 c -0.8484,-5.25993 4.7511,-9.33224 9.502,-6.78711 l 26.4687,13.91406 26.4688,-13.91406 c 4.7509,-2.54513 10.3503,1.52718 9.5019,6.78711 l -5.0898,29.52344 21.3789,20.86914 c 3.9025,3.73285 1.6974,10.3506 -3.5625,11.0293 l -29.6934,4.24218 -13.2343,26.8086 c -1.1878,2.54513 -3.479,3.81668 -5.7696,3.83789 z m -162.8242,-33.42578 c -3.4571,-0.0212 -6.9352,-1.80206 -8.7168,-5.36524 l -19.8535,-40.38281 -44.4551,-6.44727 c -7.9747,-1.18772 -11.1967,-11.02962 -5.4277,-16.6289 l 32.2383,-31.38867 -7.6368,-44.28516 c -1.3574,-7.97473 6.9577,-14.08441 14.084,-10.35156 l 39.7032,21.04101 39.705,-20.87109 c 7.1264,-3.73285 15.4395,2.37488 14.0821,10.34961 l -7.6348,44.28516 32.2383,31.39062 c 5.7689,5.59927 2.545,15.44118 -5.4297,16.62891 l -44.4551,6.44726 -19.8516,40.38281 c -1.6967,3.47834 -5.1327,5.21653 -8.5898,5.19532 z m 423.9531,-56.26758 82.8028,-82.80078 -152.5391,-152.53906 -82.8008,82.80078 z m 118.9434,-289.63477 c -2.2906,0 -4.5818,-1.189 -5.7695,-3.56445 l -13.2344,-26.80859 -29.6934,-4.24219 c -5.2599,-0.84837 -7.465,-7.2945 -3.5625,-11.02734 l 21.3789,-20.8711 -5.0898,-29.52344 c -0.8484,-5.25992 4.751,-9.33224 9.5019,-6.78711 l 26.4688,13.91407 26.4687,-13.91407 c 4.7509,-2.54513 10.3504,1.52719 9.502,6.78711 l -5.0899,29.52344 21.379,20.8711 c 3.9025,3.73284 1.6974,10.34864 -3.5625,11.02734 l -29.6934,4.24219 -13.2344,26.80859 c -1.1877,2.37545 -3.4789,3.56445 -5.7695,3.56445 z" />
<glyph
glyph-name="glyph 7"
id="glyph3951"
unicode="share"
d="m 750.52766,925.05632 c -89.9644,0 -162.8945,-72.932 -162.8945,-162.89644 0,-12.14594 1.3398,-23.97582 3.8613,-35.36328 L 417.59216,618.10714 c -27.8332,22.18781 -63.0911,35.45508 -101.4532,35.45508 -89.9644,0 -162.8965,-72.93204 -162.8965,-162.89648 0,-89.96445 72.9321,-162.89454 162.8965,-162.89454 38.3621,0 73.62,13.26728 101.4532,35.45508 l 173.9023,-108.68945 a 163.40682,163.40682 0 0 1 -3.8613,-35.36328 c 0,-89.96445 72.9301,-162.89649 162.8945,-162.89649 89.9644,0 162.8965,72.93204 162.8965,162.89649 0,89.96445 -72.9321,162.89453 -162.8965,162.89453 -38.362,0 -73.62,-13.26728 -101.4531,-35.45508 l -173.9024,108.68945 a 163.83103,163.83103 0 0 1 0,70.72852 l 173.9024,108.68945 c 27.8331,-22.1895 63.0911,-35.45703 101.4531,-35.45703 89.9644,0 162.8965,72.93205 162.8965,162.89649 0,89.96444 -72.9321,162.89644 -162.8965,162.89644 z" />
<glyph
glyph-name="glyph 8"
id="glyph107476"
unicode="response"
d="m 435.29883,879.41797 c -9.14707,-0.12727 -18.44126,-3.29524 -26.37891,-10.15039 L 103.46094,605.49609 c -19.239927,-16.61756 -19.213895,-46.45383 0,-63.04882 L 408.91992,278.65039 c 26.70438,-23.06326 68.87696,-4.40173 68.87696,31.52344 V 462.75195 C 746.94583,458.87828 862.9667,392.06315 784.27148,140.39258 775.5349,112.45425 809.30501,90.82319 833,108.05859 c 75.93227,55.22931 144.625,160.86624 144.625,267.49805 0,264.19058 -221.05401,320.06229 -499.82812,323.25391 v 138.93359 c -10e-6,25.22084 -20.83394,41.97526 -42.49805,41.67383 z" />
<glyph
glyph-name="glyph 9"
id="glyph125347"
unicode="rss"
d="m 98.944613,925.05534 v -158.0098 c 392.513897,0 710.767597,-318.2536 710.767597,-710.7675 h 158.0098 c 0,479.6151 -389.1623,868.7773 -868.777397,868.7773 z m 0,-316.0195 v -158.0117 c 217.753097,0 394.746097,-176.993 394.746097,-394.7461 h 158.0118 c 0,305.4126 -247.3452,552.7578 -552.757897,552.7578 z M 220.66141,299.71354 A 121.7184,121.7184 0 0 1 98.944613,177.99484 121.7184,121.7184 0 0 1 220.66141,56.27804 a 121.7184,121.7184 0 0 1 121.7188,121.7168 121.7184,121.7184 0 0 1 -121.7188,121.7187 z" />
<glyph
glyph-name="glyph 10"
id="glyph125349"
unicode="code"
d="m 591.3003,925.05138 c -7.94936,-0.1842 -15.20948,-5.8711 -17.47005,-14.6953 l -210.9873,-797.9121 c -2.78223,-10.8606 2.78141,-22.2307 12.67382,-25.2852 l 94.28841,-30.0351 c 9.89242,-3.2242 20.09452,3.0535 23.03123,13.914 l 210.9873,797.9121 c 2.78223,10.8605 -2.78314,22.2307 -12.67555,25.2852 l -94.28668,30.0351 c -1.85479,0.5728 -3.72679,0.8238 -5.56118,0.7813 z m 194.79272,-184.668 c -4.75297,-0.1485 -9.46732,-2.2691 -13.02241,-6.3418 l -67.23836,-78.7402 c -7.11019,-8.3151 -6.64665,-21.5512 1.2364,-29.1875 l 140.04146,-135.416 -140.04146,-135.2481 c -7.88305,-7.6363 -8.50116,-20.8724 -1.2364,-29.1875 l 67.23836,-78.7402 c 6.95562,-8.3151 18.70227,-8.654 26.27618,-1.0176 l 222.73601,229.2598 c 7.8831,7.9757 7.8831,21.7216 0,29.6973 l -222.73601,229.4277 c -3.70967,3.8181 -8.50071,5.6426 -13.25377,5.4941 z m -505.40379,-0.1054 c -4.75297,0.1697 -9.58418,-1.6556 -13.37109,-5.5586 L 44.583917,505.62948 c -7.883145,-7.9757 -7.883145,-21.7196 0,-29.6953 L 267.31814,246.67438 c 7.57391,-7.8061 19.32229,-7.4674 26.278,0.8477 l 67.23654,78.7402 c 7.11019,8.3151 6.64665,21.5512 -1.2364,29.1875 l -140.03973,135.2481 140.03973,135.2461 c 7.88305,7.6363 8.50116,20.8743 1.2364,29.1894 l -67.23654,78.7383 c -3.47785,4.0727 -8.15385,6.2366 -12.90691,6.4063 z" />
<glyph
glyph-name="glyph 11"
id="glyph125351"
unicode="github"
d="m 527.58531,925.05608 c -249.1683,0 -439.773499,-189.16571 -439.773499,-438.33401 0,-199.2268 125.393499,-369.7113 304.499999,-429.7129 22.9946,-4.1318 31.0782,10.0614 31.0782,21.7383 0,11.138 -0.5391,72.5772 -0.5391,110.3027 0,0 -125.7522,-26.948 -152.1601,53.5332 0,0 -20.4797,52.2765 -49.9415,65.75 0,0 -41.1381,28.205 2.875,27.6661 0,0 44.7323,-3.5939 69.3438,-46.3496 39.3423,-69.3431 105.2716,-49.4016 130.9609,-37.545 4.1319,28.7433 15.8097,48.6843 28.7442,60.541 -100.4218,11.138 -201.7422,25.689 -201.7422,198.5079 0,49.4025 13.6532,74.1929 42.3965,105.8105 -4.6708,11.677 -19.9415,59.8232 4.6699,121.9805 37.5459,11.677 123.9551,-48.5039 123.9551,-48.5039 35.9291,10.0602 74.5538,15.2695 112.8183,15.2695 38.2645,0 76.8873,-5.2093 112.8164,-15.2695 0,0 86.4112,60.3605 123.9571,48.5039 24.6114,-62.337 9.3406,-110.3035 4.6699,-121.9805 28.7432,-31.7972 46.3476,-56.5876 46.3476,-105.8105 0,-173.3579 -105.8106,-187.1903 -206.2324,-198.5079 16.5273,-14.192 30.5391,-41.1387 30.5391,-83.3554 0,-60.5405 -0.5371,-135.4527 -0.5371,-150.1836 0,-11.677 8.2632,-25.8702 31.0781,-21.7383 179.6455,59.6423 301.4453,230.1267 301.4453,429.3535 0,249.1683 -202.1012,438.33401 -451.2695,438.33401 z M 247.05991,321.81777 c -1.8298,-0.0526 -3.2473,-0.6838 -4.0332,-1.8066 -1.2575,-2.3354 0.5379,-5.2094 4.1309,-7.0059 2.8742,-1.7964 6.4671,-1.2573 7.7246,1.2578 1.2575,2.3354 -0.538,5.2095 -4.1309,7.0059 -1.3473,0.4042 -2.5935,0.5804 -3.6914,0.5488 z m 18.5918,-15.1426 c -1.22,0.0306 -2.3488,-0.339 -3.2246,-1.2148 -2.3354,-1.7964 -1.7961,-5.9286 1.2578,-9.3418 2.8744,-2.8744 7.0064,-4.1323 9.3418,-1.7969 2.3354,1.7965 1.7962,5.9285 -1.2578,9.3418 -1.7965,1.7965 -4.0839,2.9609 -6.1172,3.0117 z m 18.2012,-23.1757 c -1.1285,0.0223 -2.2034,-0.3054 -3.1016,-1.0352 -2.8744,-1.7964 -2.8744,-6.4657 0,-10.5976 2.8743,-4.1319 7.7251,-5.9294 10.0605,-4.1329 2.8743,2.3354 2.8743,7.0068 0,11.1387 -1.729,2.8406 -4.4763,4.5777 -6.9589,4.627 z m 21.8222,-25.6446 c -1.8147,0.0642 -3.4216,-0.5393 -4.4433,-1.7968 -2.8744,-2.3354 -1.7959,-7.7254 2.3359,-11.1387 4.1319,-4.1318 9.3404,-4.6712 11.6758,-1.7969 2.3354,2.3354 1.257,7.7254 -2.3359,11.1387 -2.2232,2.3241 -4.8992,3.5112 -7.2325,3.5937 z m 32.7832,-19.7285 c -3.8309,0.1271 -7.4625,-1.6061 -8.4843,-4.5254 -1.2575,-3.5929 2.3352,-7.7248 7.7246,-8.8027 4.6708,-1.7965 10.0607,8e-4 11.1386,3.5937 1.0779,3.5929 -2.3353,7.725 -7.7246,9.3418 -0.8757,0.2358 -1.7702,0.3633 -2.6543,0.3926 z m 72.8496,-1.4004 c -0.6322,0.019 -1.2784,-0.003 -1.9296,-0.0703 -5.2097,-1.2575 -8.8027,-4.6709 -8.2637,-8.8027 0.5389,-3.5929 5.2103,-5.9294 10.5996,-4.6719 5.2098,1.2575 8.8027,4.6708 8.2637,8.2637 -0.4716,2.9865 -4.244,5.1486 -8.67,5.2812 z m -34.5234,-4.6797 c -0.3303,-0.008 -0.6632,-0.0288 -1,-0.0625 -5.2097,0 -9.3418,-2.8739 -9.3418,-6.4668 0,-4.1319 4.1323,-7.0057 10.0606,-6.4668 5.2097,0 9.3417,2.8739 9.3417,6.4668 0,3.8736 -4.1066,6.6425 -9.0605,6.5293 z" />
<glyph
glyph-name="glyph 12"
id="glyph125353"
unicode="linkedin"
d="m 160.80596,925.05534 c -34.1306,0 -61.861297,-28.1182 -61.861297,-62.6367 v -743.5039 c 0,-34.5185 27.730697,-62.6367 61.861297,-62.6367 h 744.8613 c 34.1306,0 62.0547,28.1182 62.0547,62.6367 v 743.5039 c 0,34.5185 -27.9241,62.6367 -62.0547,62.6367 z m 136.3281,-124.1113 c 41.1119,0 74.6602,-33.5484 74.6602,-74.6602 0,-41.3058 -33.3544,-74.6601 -74.6602,-74.6601 -41.3058,0 -74.6601,33.5482 -74.6601,74.6601 0,41.1118 33.3543,74.6602 74.6601,74.6602 z m 392.502,-195.668 c 130.3169,0 154.5566,-85.9092 154.5566,-197.6094 v -227.2773 h -128.7656 v 201.6797 c 0,48.0931 -0.9682,109.9551 -66.9024,109.9551 -67.0977,0 -77.3769,-52.3601 -77.3769,-106.4649 v -205.1699 h -128.7656 v 414.6094 h 123.5312 v -56.627 h 1.7442 c 17.2592,32.5793 59.3411,66.9043 121.9785,66.9043 z m -456.8848,-10.2773 h 128.959 v -414.6094 h -0.1934 -128.7656 z" />
<glyph
glyph-name="glyph 13"
id="glyph125355"
unicode="diaspora"
d="m 536.25046,925.05512 c -79.3992,0.014 -101.02667,-0.2906 -101.76757,-1.4355 -0.5176,-0.7996 -1.35865,-65.8277 -1.86914,-144.5079 -0.51061,-78.6801 -1.17527,-144.2325 -1.47657,-145.6718 -0.3012,-1.4392 -1.19121,-2.6185 -1.97851,-2.6192 -0.7874,-7e-4 -64.42251,20.7216 -141.41211,46.0489 -76.9895,25.3272 -140.3686,45.6093 -140.8418,45.0703 -0.4734,-0.5392 -14.86979,-45.1866 -31.99219,-99.2149 -23.816303,-75.1495 -30.758923,-98.3775 -29.544923,-98.8515 0.8728,-0.3406 61.250733,-20.5111 134.173833,-44.8223 117.5955,-39.2041 132.58789,-44.4674 132.58789,-46.5488 0,-1.2907 -37.85299,-57.174 -84.11719,-124.1856 -46.2642,-67.0116 -83.94763,-122.3298 -83.74023,-122.9277 0.4291,-1.2358 167.11796,-118.64452 168.44336,-118.64452 0.4739,0 38.9926,52.33702 85.5957,116.30462 48.9103,67.1348 85.48151,116.2943 86.50391,116.2813 0.9951,-0.0128 19.90579,-25.3704 43.15039,-57.8613 22.7585,-31.8112 61.90925,-86.4934 87.00195,-121.5157 25.0928,-35.0222 46.08283,-63.67572 46.64453,-63.67572 1.3835,0 166.81413,121.85632 167.26953,123.21092 0.1983,0.5897 -35.81376,54.0086 -80.02735,118.709 -44.9084,65.7173 -80.22678,118.4961 -80.02148,119.584 0.2781,1.4733 33.41015,13.1444 136.11133,47.9492 74.65818,25.3012 136.07458,46.3343 136.48048,46.7402 0.743,0.7432 -59.615,197.2426 -61.1016,198.9199 -0.4385,0.4948 -61.0067,-19.524 -134.59568,-44.4863 -73.5891,-24.9624 -134.6054,-45.3867 -135.5918,-45.3867 -2.5438,0 -2.6335,2.1383 -6.8164,161.6641 -2.5475,97.1534 -4.06899,140.4095 -4.95899,141.0019 -0.7062,0.4699 -46.65527,0.8591 -102.10937,0.8711 z" />
<glyph
glyph-name="glyph 14"
id="glyph125357"
unicode="twitter"
d="m 192.02734,925.05664 c -51.38982,0 -93.083981,-41.69416 -93.083981,-93.08398 V 149.36133 c 0,-51.38983 41.694161,-93.08399 93.083981,-93.08399 h 682.61133 c 51.38983,0 93.08399,41.69416 93.08399,93.08399 v 682.61133 c 0,51.38982 -41.69416,93.08398 -93.08399,93.08398 z M 652.5957,742.76758 c 36.65161,0 69.61976,-15.32033 92.89063,-40.14258 28.70073,5.42987 56.23746,16.09633 80.67187,30.64062 -9.50227,-29.47642 -29.47596,-54.29802 -55.84961,-70.00585 25.59796,2.71493 50.41972,9.88917 73.30274,19.77929 -17.25922,-25.40403 -38.97852,-47.89867 -63.80078,-65.93359 0.38785,-5.42987 0.38867,-11.05451 0.38867,-16.48438 0,-168.13201 -127.99108,-361.86132 -361.86328,-361.86132 -72.13968,0 -139.04333,20.94383 -195.28125,57.01367 10.27796,-1.16355 20.16873,-1.55078 30.64062,-1.55078 59.53463,0 114.22064,20.16627 157.85352,54.29687 -55.85008,1.16355 -102.77932,37.81612 -118.875,88.23633 19.58631,-2.90886 37.23425,-2.90978 57.40234,2.32617 C 291.899,450.91138 248.26563,502.10899 248.26562,563.9707 v 1.55078 c 16.87139,-9.50227 36.65054,-15.32 57.4004,-16.0957 a 126.91736,126.91736 0 0 0 -56.625,105.88281 c 0,23.65871 6.2061,45.37688 17.25976,64.1875 62.63741,-77.18171 156.689,-127.60138 262.1836,-133.03125 -18.03492,86.29613 46.54177,156.30274 124.11132,156.30274 z" />
<glyph
glyph-name="glyph 15"
id="glyph125367"
unicode="mastodon"
d="m 532.95339,925.05595 c -110.6159,-0.0727 -221.0878,-13.9848 -281.0976,-41.5176 0,0 -123.5098,-55.2587 -123.5098,-243.7226 0,-224.334 -12.7958,-502.9588 204.752,-560.545 78.5266,-20.7465 146.001,-25.2057 200.291,-22.1035 98.4976,5.429 153.7578,35.0957 153.7578,35.0957 l -3.2969,71.5469 c 0,0 -70.3839,-22.1046 -149.4922,-19.584 -78.3328,2.7145 -160.9295,8.5303 -173.7265,104.7012 -1.1633,8.5312 -1.7461,17.4504 -1.7461,26.9512 165.9724,-40.5236 307.5138,-17.6437 346.4863,-12.9903 108.7739,12.9909 203.5881,80.0776 215.6094,141.3477 19.0015,96.5587 17.4511,235.5801 17.4511,235.5801 0,188.4639 -123.5097,243.7226 -123.5097,243.7226 -60.5916,27.8237 -171.3529,41.5903 -281.9688,41.5176 z m -124.8887,-146.7031 c 39.4311,-0.0248 78.8378,-16.9155 102.8321,-53.8067 l 22.4922,-37.8086 22.4922,37.8086 c 46.7282,71.9342 151.4292,67.4754 201.2597,11.8282 45.9526,-52.9328 35.6758,-102.7632 35.6758,-339.3125 h -90.3535 v 221.4257 c 0,96.3648 -124.0918,100.0484 -124.0918,-13.3789 v -121.1836 h -89.7715 v 121.1836 c 0,113.4273 -124.0918,109.7437 -124.0918,13.3789 v -221.4257 h -90.5488 c 0,236.7432 -10.081,286.7675 35.6777,339.3125 24.3245,27.1419 61.3864,42.0017 98.4277,41.9785 z" />
<glyph
glyph-name="glyph 16"
id="glyph5008"
unicode="pixelfed"
d="m 533.44336,963.43945 c -62.83681,0 -116.9395,-43.95637 -131.21484,-103.95898 4.23451,-3.4296 8.15647,-6.93695 11.85156,-10.63281 l 95.49609,-95.51563 c 18.107,-18.11088 31.53801,-39.9363 39.82617,-64.0332 3.17035,-9.20462 5.52773,-18.62565 7.06836,-28.15235 h 33.31055 c 25.035,0 48.60069,-6.17018 69.20508,-17.04687 6.24236,15.67197 9.5039,32.24627 9.5039,49.18945 v 135.07617 c 0,6.64806 -0.63753,13.57785 -1.89453,21.39063 -10.47236,64.91772 -66.96706,113.68359 -133.15234,113.68359 z M 295.74023,864.25 c -35.13091,0.29634 -70.19855,-12.95463 -96.51953,-39.28125 -44.43039,-44.43991 -51.61022,-113.77846 -19.28515,-166.30273 5.36187,0.55324 10.53222,0.83789 15.67187,0.83789 H 330.6543 c 24.19891,0 47.33557,-5.19239 68.29687,-14.56055 14.02223,10.1827 31.37332,16.20312 50.15625,16.20312 h 73.04883 c -1.17742,5.78721 -2.73474,11.51142 -4.67187,17.13282 -6.67171,19.35161 -17.37456,36.74646 -31.78321,51.1582 l -95.49414,95.53125 c -4.73,4.731 -10.09276,9.19228 -16.46484,13.78516 -23.31659,16.84041 -50.67791,25.26561 -78.00196,25.49609 z m 475.17774,-0.004 c -24.08894,-0.24347 -48.19875,-6.85474 -69.53125,-19.98828 0.57138,-5.43369 0.86523,-10.67826 0.86523,-15.89258 V 693.28906 c 0,-23.8622 -5.14661,-47.12096 -14.89257,-68.74023 29.90461,-26.28856 48.72265,-64.47727 48.72265,-106.97852 0,-1.59647 -0.028,-3.18759 -0.0801,-4.77148 13.3942,6.45695 25.58579,15.0425 36.16797,25.62695 l 95.4961,95.51563 c 4.72999,4.73102 9.18944,10.0947 13.7832,16.4707 38.49263,53.29724 33.01565,127.73199 -13.78516,174.55859 -26.37794,26.38308 -61.53919,39.63124 -96.74609,39.27539 z M 195.60742,625.73438 c -4.9918,0 -18.27056,-1.40255 -21.00976,-1.86915 C 109.41622,613.47168 60.560547,556.92685 60.560547,490.6582 c 0,-62.9425 44.001553,-117.20484 103.988283,-131.44922 3.48205,4.31463 7.0437,8.30462 10.79883,12.06055 l 95.49414,95.51563 c 18.09027,18.09415 39.89775,31.51629 64.01953,39.83593 9.7482,3.35901 19.73998,5.80394 29.84179,7.33399 v 64.35937 c 10e-6,14.43347 3.76128,28.00399 10.375,39.82032 -13.96274,4.92561 -28.92445,7.59961 -44.42382,7.59961 z m 706.56446,-3.83204 c -3.42937,-4.23617 -6.9372,-8.15905 -10.63282,-11.85546 l -95.49609,-95.51563 c -18.09027,-18.09415 -39.8958,-31.5163 -64.01758,-39.83594 -0.96078,-0.33113 -1.9252,-0.65341 -2.89062,-0.96679 -12.64201,-38.73176 -41.5844,-70.30583 -78.90625,-86.94532 8.2783,-6.85806 17.38331,-12.75076 27.14257,-17.50781 18.39235,-8.96547 38.25064,-13.69336 58.64258,-13.69336 h 135.04688 c 6.64751,0 13.57668,0.63792 21.38281,1.89453 64.90537,10.47329 113.66404,66.98112 113.66404,133.18164 0,62.85588 -43.95246,116.97936 -103.93552,131.24414 z M 364.70312,479.70508 c -6.36817,-1.2113 -12.6658,-2.88234 -18.83984,-5.00977 -19.3479,-6.67311 -36.74059,-17.37813 -51.14844,-31.78906 L 199.2207,347.39258 c -4.72999,-4.73101 -9.18936,-10.0953 -13.78125,-16.46875 -38.48414,-53.30648 -33.01161,-127.75571 13.78125,-174.5586 44.42597,-44.43548 113.76738,-51.618 166.2793,-19.28906 -0.57138,5.43369 -0.86523,10.67826 -0.86523,15.89258 v 135.07617 c 0,1.5885 0.0221,3.17294 0.0684,4.75586 z M 612.79883,375.76172 c -7.49866,-1.16302 -15.18577,-1.76758 -23.01758,-1.76758 h -45.17383 c -4.67622,-23.54763 -3.07774,-48.09992 4.79492,-70.95703 6.67169,-19.35203 17.37341,-36.74727 31.78125,-51.1582 l 95.4961,-95.51368 c 4.72998,-4.731 10.09083,-9.19228 16.46289,-13.78515 53.29506,-38.49238 127.73058,-33.01773 174.52344,13.78515 44.43237,44.4419 51.61543,113.7993 19.28515,166.31446 -5.43331,-0.57158 -10.67674,-0.86524 -15.89062,-0.86524 H 736.01367 c -25.59909,0 -50.50338,5.92601 -73.43359,17.10352 -18.81051,9.16897 -35.66556,21.71228 -49.78125,36.84375 z m -125.66992,-1.76758 -88.73243,-85.57812 c -3.4e-4,-0.12369 0,-0.2476 0,-0.3711 V 152.96875 c 0,-6.64893 0.63812,-13.58086 1.89454,-21.38867 C 410.76207,66.66079 467.25703,17.8926 533.44336,17.8926 c 62.84041,0 116.94325,43.96279 131.21484,103.97068 -4.23246,3.42948 -8.14685,6.92631 -11.83593,10.60547 l -95.51172,95.5332 c -18.10702,18.11088 -31.53995,39.93435 -39.82813,64.03125 -9.09713,26.41221 -11.4843,54.60934 -7.16211,81.96094 z" />
<glyph
glyph-name="glyph 17"
id="glyph111495"
unicode="gpg"
d="M 700.46094,852.77539 C 637.50963,851.10412 584.58653,829.37755 542.80469,787.5957 501.02284,745.81386 479.85291,693.44786 478.18164,629.93945 c 0,-16.71273 1.67112,-32.86929 5.01367,-49.58203 L 143.36914,239.97656 v -55.71094 l 55.70898,-55.70898 h 111.41797 l 55.70899,55.70898 v 55.71094 h 55.71094 v 55.70899 H 477.625 v 55.70898 h 111.41797 l 60.72265,61.83594 c 16.71275,-4.45673 32.8684,-6.12695 50.69532,-6.12695 63.5084,1.67127 115.8744,23.39784 157.65625,65.17968 41.78184,41.78185 63.5084,94.14785 65.17969,157.65625 -1.67129,63.50841 -23.39785,115.87441 -65.17969,157.65625 -41.78185,41.78185 -94.14785,63.50842 -157.65625,65.17969 z m 55.70898,-90.24805 c 42.89603,0 76.87891,-33.98288 76.87891,-76.8789 0,-42.89603 -33.98288,-76.87891 -76.87891,-76.87891 -42.89603,0 -76.8789,33.98288 -76.8789,76.87891 0,42.89602 33.98287,76.8789 76.8789,76.8789 z" />
<glyph
glyph-name="glyphe 18"
id="glyph1027"
unicode="matrix"
d="M 112.33624,894.87002 V 86.46335 H 328.1321 v 59.34549 H 184.95967 v 689.7178 H 328.1321 v 59.34338 z m 626.1962,0 V 835.52664 H 881.70487 V 145.80884 H 738.53244 V 86.46335 H 954.33039 V 894.87002 Z M 491.36211,638.33333 c -16.20834,0 -30.79551,-3.49657 -43.76218,-10.49175 C 434.63326,620.8464 420.8117,611.1202 406.13892,598.6654 v 31.73351 H 316.56745 V 343.00004 h 89.57147 v 203.7147 c 6.65399,4.60657 13.48022,8.61434 20.47541,12.02657 6.99508,3.41231 14.15941,5.11885 21.49581,5.11885 9.55444,-10e-6 16.97739,-1.44993 22.26636,-4.3504 5.45964,-2.72981 9.46941,-7.1652 12.02867,-13.30733 2.55916,-6.14203 4.09469,-14.16168 4.60655,-24.05733 0.6825,-9.725 1.0225,-21.58334 1.0225,-35.5737 V 343.00004 h 90.08379 v 203.7147 c 7.84823,5.45963 15.10018,9.6385 21.75406,12.53887 6.65399,3.07112 13.39262,4.60655 20.21715,4.60655 9.725,-10e-6 17.23144,-1.44993 22.52042,-4.3504 5.45973,-2.72981 9.46951,-7.1652 12.02867,-13.30733 2.55926,-6.14203 4.09478,-14.07618 4.60655,-23.80118 0.51185,-9.725 0.76845,-21.66883 0.76845,-35.82985 V 343.00004 h 90.08378 v 187.07949 c 0,20.4736 -2.04664,37.02192 -6.14136,49.64738 -3.92406,12.79601 -9.89498,23.80112 -17.91387,33.01427 -7.33638,8.53075 -16.29486,14.92936 -26.87292,19.19464 -10.57805,4.26537 -22.51978,6.39751 -35.82775,6.39751 -15.69647,0 -31.22256,-4.34989 -46.57775,-13.05118 -15.18463,-8.53064 -31.39284,-20.81458 -48.62488,-36.85236 -6.99519,16.54955 -17.14699,29.00248 -30.45485,37.36257 -13.30787,8.36008 -28.74836,12.54097 -46.3216,12.54097 z" />
</font>
<symbol
id="beer">
<title
id="beer-title">beer</title>
<path
d="M368 96h-48V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56v400c0 13.255 10.745 24 24 24h272c13.255 0 24-10.745 24-24v-42.11l80.606-35.977C429.396 365.063 448 336.388 448 304.86V176c0-44.112-35.888-80-80-80zm16 208.86a16.018 16.018 0 0 1-9.479 14.611L320 343.805V160h48c8.822 0 16 7.178 16 16v128.86zM208 384c-8.836 0-16-7.164-16-16V144c0-8.836 7.164-16 16-16s16 7.164 16 16v224c0 8.836-7.164 16-16 16zm-96 0c-8.836 0-16-7.164-16-16V144c0-8.836 7.164-16 16-16s16 7.164 16 16v224c0 8.836-7.164 16-16 16z"
id="path95333" />
</symbol>
<symbol
id="list-ul">
<title
id="list-ul-title">list-ul</title>
<path
d="M96 96c0 26.51-21.49 48-48 48S0 122.51 0 96s21.49-48 48-48 48 21.49 48 48zM48 208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm0 160c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm96-236h352c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z"
id="path96129" />
</symbol>
<symbol
id="search">
<title
id="search-title">Search</title>
<path
d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
id="path96485" />
</symbol>
<symbol
id="hdd">
<title
id="hdd-title">HDD</title>
<path
d="M576 304v96c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48v-96c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48zm-48-80a79.557 79.557 0 0 1 30.777 6.165L462.25 85.374A48.003 48.003 0 0 0 422.311 64H153.689a48 48 0 0 0-39.938 21.374L17.223 230.165A79.557 79.557 0 0 1 48 224h480zm-48 96c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm-96 0c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z"
id="path95977" />
</symbol>
<symbol
id="magic">
<title
id="magic-title">magic</title>
<path
d="M101.1 505L7 410.9c-9.4-9.4-9.4-24.6 0-33.9L377 7c9.4-9.4 24.6-9.4 33.9 0l94.1 94.1c9.4 9.4 9.4 24.6 0 33.9L135 505c-9.3 9.3-24.5 9.3-33.9 0zM304 159.2l48.8 48.8 89.9-89.9-48.8-48.8-89.9 89.9zM138.9 39.3l-11.7 23.8-26.2 3.8c-4.7.7-6.6 6.5-3.2 9.8l19 18.5-4.5 26.1c-.8 4.7 4.1 8.3 8.3 6.1L144 115l23.4 12.3c4.2 2.2 9.1-1.4 8.3-6.1l-4.5-26.1 19-18.5c3.4-3.3 1.5-9.1-3.2-9.8L160.8 63l-11.7-23.8c-2-4.1-8.1-4.1-10.2.1zm97.7-20.7l-7.8 15.8-17.5 2.6c-3.1.5-4.4 4.3-2.1 6.5l12.6 12.3-3 17.4c-.5 3.1 2.8 5.5 5.6 4L240 69l15.6 8.2c2.8 1.5 6.1-.9 5.6-4l-3-17.4 12.6-12.3c2.3-2.2 1-6.1-2.1-6.5l-17.5-2.5-7.8-15.8c-1.4-3-5.4-3-6.8-.1zm-192 0l-7.8 15.8L19.3 37c-3.1.5-4.4 4.3-2.1 6.5l12.6 12.3-3 17.4c-.5 3.1 2.8 5.5 5.6 4L48 69l15.6 8.2c2.8 1.5 6.1-.9 5.6-4l-3-17.4 12.6-12.3c2.3-2.2 1-6.1-2.1-6.5l-17.5-2.5-7.8-15.8c-1.4-3-5.4-3-6.8-.1zm416 223.5l-7.8 15.8-17.5 2.5c-3.1.5-4.4 4.3-2.1 6.5l12.6 12.3-3 17.4c-.5 3.1 2.8 5.5 5.6 4l15.6-8.2 15.6 8.2c2.8 1.5 6.1-.9 5.6-4l-3-17.4 12.6-12.3c2.3-2.2 1-6.1-2.1-6.5l-17.5-2.5-7.8-15.8c-1.4-2.8-5.4-2.8-6.8 0z"
id="path96165" />
</symbol>
<symbol
id="share-alt">
<title
id="share-alt-title">Alternate Share</title>
<path
d="M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.551 96.551 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.301 96.301 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96-42.981-96-96-96z"
id="path96505" />
</symbol>
<symbol
id="envelope">
<title
id="envelope-title">Envelope</title>
<path
d="M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"
id="path95709" />
</symbol>
<symbol
id="reply">
<title
id="reply-title">Reply</title>
<path
d="M8.309 189.836L184.313 37.851C199.719 24.546 224 35.347 224 56.015v80.053c160.629 1.839 288 34.032 288 186.258 0 61.441-39.581 122.309-83.333 154.132-13.653 9.931-33.111-2.533-28.077-18.631 45.344-145.012-21.507-183.51-176.59-185.742V360c0 20.7-24.3 31.453-39.687 18.164l-176.004-152c-11.071-9.562-11.086-26.753 0-36.328z"
id="path96495" />
</symbol>
<symbol
id="ic_rss_feed_24px">
<circle
cx="6.18"
cy="17.82"
r="2.18"
id="circle73845" />
<path
d="M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z"
id="path73847" />
</symbol>
<symbol
id="github">
<title
id="github-title">GitHub</title>
<path
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"
id="path94272" />
</symbol>
<symbol
id="github-alt">
<title
id="github-alt-title">Alternate GitHub</title>
<path
d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"
id="path94276" />
</symbol>
<symbol
id="linkedin-in">
<title
id="linkedin-in-title">LinkedIn In</title>
<path
d="M100.3 480H7.4V180.9h92.9V480zM53.8 140.1C24.1 140.1 0 115.5 0 85.8 0 56.1 24.1 32 53.8 32c29.7 0 53.8 24.1 53.8 53.8 0 29.7-24.1 54.3-53.8 54.3zM448 480h-92.7V334.4c0-34.7-.7-79.2-48.3-79.2-48.3 0-55.7 37.7-55.7 76.7V480h-92.8V180.9h89.1v40.8h1.3c12.4-23.5 42.7-48.3 87.9-48.3 94 0 111.3 61.9 111.3 142.3V480z"
id="path94484" />
</symbol>
<symbol
id="linkedin">
<title
id="linkedin-title">LinkedIn</title>
<path
d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"
id="path94480" />
</symbol>
<symbol
id="twitter-square">
<title
id="twitter-square-title">Twitter Square</title>
<path
d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-48.9 158.8c.2 2.8.2 5.7.2 8.5 0 86.7-66 186.6-186.6 186.6-37.2 0-71.7-10.8-100.7-29.4 5.3.6 10.4.8 15.8.8 30.7 0 58.9-10.4 81.4-28-28.8-.6-53-19.5-61.3-45.5 10.1 1.5 19.2 1.5 29.6-1.2-30-6.1-52.5-32.5-52.5-64.4v-.8c8.7 4.9 18.9 7.9 29.6 8.3a65.447 65.447 0 0 1-29.2-54.6c0-12.2 3.2-23.4 8.9-33.1 32.3 39.8 80.8 65.8 135.2 68.6-9.3-44.5 24-80.6 64-80.6 18.9 0 35.9 7.9 47.9 20.7 14.8-2.8 29-8.3 41.6-15.8-4.9 15.2-15.2 28-28.8 36.1 13.2-1.4 26-5.1 37.8-10.2-8.9 13.1-20.1 24.7-32.9 34z"
id="path94928" />
</symbol>
<symbol
id="code">
<title
id="code-title">Code</title>
<path
d="M278.9 511.5l-61-17.7c-6.4-1.8-10-8.5-8.2-14.9L346.2 8.7c1.8-6.4 8.5-10 14.9-8.2l61 17.7c6.4 1.8 10 8.5 8.2 14.9L293.8 503.3c-1.9 6.4-8.5 10.1-14.9 8.2zm-114-112.2l43.5-46.4c4.6-4.9 4.3-12.7-.8-17.2L117 256l90.6-79.7c5.1-4.5 5.5-12.3.8-17.2l-43.5-46.4c-4.5-4.8-12.1-5.1-17-.5L3.8 247.2c-5.1 4.7-5.1 12.8 0 17.5l144.1 135.1c4.9 4.6 12.5 4.4 17-.5zm327.2.6l144.1-135.1c5.1-4.7 5.1-12.8 0-17.5L492.1 112.1c-4.8-4.5-12.4-4.3-17 .5L431.6 159c-4.6 4.9-4.3 12.7.8 17.2L523 256l-90.6 79.7c-5.1 4.5-5.5 12.3-.8 17.2l43.5 46.4c4.5 4.9 12.1 5.1 17 .6z"
id="path95567" />
</symbol>
<symbol
id="wifi">
<title
id="wifi-title">WiFi</title>
<path
d="M384 416c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-35.346 28.654-64 64-64s64 28.654 64 64zm136.659-124.443c6.465-6.465 6.245-17.065-.564-23.167-113.793-101.985-286.526-101.869-400.19 0-6.809 6.102-7.029 16.702-.564 23.167l34.006 34.006c5.927 5.927 15.464 6.32 21.769.796 82.88-72.609 207.074-72.447 289.768 0 6.305 5.524 15.842 5.132 21.769-.796l34.006-34.006zm112.11-113.718c6.385-6.385 6.254-16.816-.35-22.973-175.768-163.86-449.134-163.8-624.837 0-6.604 6.157-6.735 16.589-.35 22.973l33.966 33.966c6.095 6.095 15.891 6.231 22.224.383 144.763-133.668 368.356-133.702 513.156 0 6.333 5.848 16.129 5.712 22.224-.383l33.967-33.966z"
id="path96931" />
</symbol>
<symbol
id="key">
<title
id="title78444">key</title>
<path
d="M12.83 2.17C12.08 1.42 11.14 1.03 10 1c-1.13.03-2.08.42-2.83 1.17S6.04 3.86 6.01 5c0 .3.03.59.09.89L0 12v1l1 1h2l1-1v-1h1v-1h1v-1h2l1.09-1.11c.3.08.59.11.91.11 1.14-.03 2.08-.42 2.83-1.17S13.97 6.14 14 5c-.03-1.14-.42-2.08-1.17-2.83zM11 5.38c-.77 0-1.38-.61-1.38-1.38 0-.77.61-1.38 1.38-1.38.77 0 1.38.61 1.38 1.38 0 .77-.61 1.38-1.38 1.38z"
id="path78446" />
</symbol>
</defs>
<g
id="layer1" />
<path
style="fill:#000000;stroke:none;stroke-width:1.93923736"
d="m -6970.5302,-3812.4449 c -25.7046,0 -46.5428,20.8382 -46.5428,46.5427 v 775.6953 c 0,25.7046 20.8382,46.5409 46.5428,46.5409 h 527.4723 c 25.7046,0 46.5409,-20.8363 46.5409,-46.5409 v -81.6615 l 156.3149,-69.7683 c 55.8307,-24.9192 91.9082,-80.5269 91.9082,-141.6671 v -249.8901 c 0,-85.5437 -69.5958,-155.1395 -155.1395,-155.1395 h -93.0836 v -77.5688 c 0,-25.7045 -20.8363,-46.5427 -46.5409,-46.5427 z m 170.6524,186.1673 c 17.1351,0 31.0279,13.8928 31.0279,31.0279 v 434.3886 c 0,17.1351 -13.8928,31.0279 -31.0279,31.0279 -17.1351,0 -31.0279,-13.8928 -31.0279,-31.0279 v -434.3886 c 0,-17.1351 13.8928,-31.0279 31.0279,-31.0279 z m 186.1675,0 c 17.135,0 31.0279,13.8928 31.0279,31.0279 v 434.3886 c 0,17.1351 -13.8929,31.0279 -31.0279,31.0279 -17.1351,0 -31.028,-13.8928 -31.028,-31.0279 v -434.3886 c 0,-17.1351 13.8929,-31.0279 31.028,-31.0279 z m 217.1933,62.0558 h 93.0836 c 17.108,0 31.028,13.9199 31.028,31.0279 v 249.8901 a 31.062702,31.062702 0 0 1 -18.3817,28.3349 l -105.7299,47.1894 z"
id="path114424"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke:none;stroke-width:2.08840966"
d="m -5186.0615,-3860.8533 c -55.3637,0 -100.244,44.8802 -100.244,100.2439 0,55.3638 44.8803,100.244 100.244,100.244 55.3638,0 100.2439,-44.8802 100.2439,-100.244 0,-55.3637 -44.8801,-100.2439 -100.2439,-100.2439 z m 200.4879,25.0624 c -18.4553,0 -33.4146,14.9574 -33.4146,33.4127 v 83.5376 c 0,18.4553 14.9593,33.4147 33.4146,33.4147 h 655.3099 c 18.4554,0 33.4148,-14.9594 33.4148,-33.4147 v -83.5376 c 0,-18.4553 -14.9594,-33.4127 -33.4148,-33.4127 z m -200.4879,309.0841 c -55.3637,0 -100.244,44.8802 -100.244,100.244 0,55.3637 44.8803,100.2439 100.244,100.2439 55.3638,0 100.2439,-44.8802 100.2439,-100.2439 0,-55.3638 -44.8801,-100.244 -100.2439,-100.244 z m 200.4879,25.0605 c -18.4553,0 -33.4146,14.9594 -33.4146,33.4146 v 83.5357 c 0,18.4552 14.9593,33.4146 33.4146,33.4146 h 655.3099 c 18.4554,0 33.4148,-14.9594 33.4148,-33.4146 v -83.5357 c 0,-18.4552 -14.9594,-33.4146 -33.4148,-33.4146 z m -200.4879,309.084 c -55.3637,0 -100.244,44.8802 -100.244,100.244 0,55.3637 44.8803,100.244 100.244,100.244 55.3638,0 100.2439,-44.8803 100.2439,-100.244 0,-55.3638 -44.8801,-100.244 -100.2439,-100.244 z m 200.4879,25.0625 c -18.4553,0 -33.4146,14.9574 -33.4146,33.4127 v 83.5376 c 0,18.4553 14.9593,33.4147 33.4146,33.4147 h 655.3099 c 18.4554,0 33.4148,-14.9594 33.4148,-33.4147 v -83.5376 c 0,-18.4553 -14.9594,-33.4127 -33.4148,-33.4127 z"
id="path114430"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ssssssssssssssssssssssssssssssssssssssssss" />
<path
style="fill:#000000;stroke:none;stroke-width:1.69667041"
d="m -3052.8352,-3802.7634 c -194.9475,0 -352.9069,157.9595 -352.9069,352.9069 0,194.9474 157.9594,352.9068 352.9069,352.9068 81.9491,0 157.2819,-27.8252 217.1744,-74.6533 v 27.6553 c 0,10.8587 4.242,21.209 11.8771,28.844 l 169.1577,169.1578 c 15.9488,15.9487 41.7374,15.9487 57.5163,0 l 48.0167,-48.015 c 15.9487,-15.9487 15.9491,-41.7392 0.17,-57.6879 l -169.1594,-169.1579 c -7.635,-7.635 -17.9837,-11.877 -28.8424,-11.877 h -27.6569 c 46.8281,-59.8925 74.655,-135.2236 74.655,-217.1728 0,-194.9474 -157.9611,-352.9069 -352.9085,-352.9069 z m 0,135.7324 c 119.9545,0 217.1744,97.0502 217.1744,217.1745 0,119.9546 -97.0502,217.1728 -217.1744,217.1728 -119.9546,0 -217.1728,-97.0485 -217.1728,-217.1728 0,-119.9546 97.0485,-217.1745 217.1728,-217.1745 z"
id="path114436"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke:none;stroke-width:2.02477026"
d="m -1596.368,-3805.5382 c -32.4951,2e-4 -62.8401,16.2412 -80.8652,43.2785 l -195.4479,293.1678 c 19.7372,-8.258 40.9219,-12.5008 62.3168,-12.4821 h 795.3699 c 21.39487,-0.018 42.57967,4.2241 62.31667,12.4821 l -195.44577,-293.1678 c -18.0265,-27.0371 -48.3718,-43.278 -80.8673,-43.2785 z m -213.9963,388.757 c -53.6766,0 -97.1893,43.5127 -97.1893,97.1893 v 194.3766 c 0,53.6766 43.5127,97.1892 97.1893,97.1892 h 795.3699 c 53.67667,0 97.18907,-43.5126 97.18907,-97.1892 v -194.3766 c 0,-53.6766 -43.5124,-97.1893 -97.18907,-97.1893 z m 503.804,129.5838 c 35.7838,0 64.7929,29.0091 64.7929,64.7929 0,35.7837 -29.0091,64.7928 -64.7929,64.7928 -35.7837,0 -64.7929,-29.0091 -64.7929,-64.7928 0,-35.7838 29.0092,-64.7929 64.7929,-64.7929 z m 194.3766,0 c 35.7837,0 64.7928,29.0091 64.7928,64.7929 0,35.7837 -29.0091,64.7928 -64.7928,64.7928 -35.7838,0 -64.7929,-29.0091 -64.7929,-64.7928 0,-35.7838 29.0091,-64.7929 64.7929,-64.7929 z"
id="path114442"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke:none;stroke-width:1.69675112"
d="m 2190.6666,-3754.3557 c -10.4138,0 -20.8476,3.9882 -28.8223,11.9629 l -627.7988,627.7969 c -15.9495,15.7798 -15.9495,41.572 0,57.5215 l 159.664,159.664 c 15.9495,15.7798 41.7417,15.7798 57.5215,0 l 627.7969,-627.7988 c 15.9495,-15.7798 15.9495,-41.5701 0,-57.5195 l -159.6641,-159.6641 c -7.8899,-7.9747 -18.2834,-11.9629 -28.6972,-11.9629 z m -587.0547,27.9766 c -2.2906,-0.021 -4.5799,1.2077 -5.7676,3.6679 l -13.2344,26.8086 -29.6933,4.4121 c -5.26,0.8484 -7.467,7.2965 -3.5645,11.0293 l 21.3789,20.8692 -5.0898,29.5234 c -0.8484,5.26 4.751,9.3323 9.5019,6.7871 l 26.4688,-13.914 26.4707,13.914 c 4.7509,2.5452 10.3503,-1.5271 9.5019,-6.7871 l -5.0918,-29.5234 21.3809,-20.8692 c 3.9025,-3.7328 1.6955,-10.3506 -3.5645,-11.0293 l -29.6933,-4.2421 -13.2344,-26.8086 c -1.1877,-2.5452 -3.4789,-3.8167 -5.7695,-3.8379 z m 325.7773,0 c -2.2906,-0.021 -4.5818,1.2077 -5.7695,3.6679 l -13.2344,26.8086 -29.6933,4.4121 c -5.26,0.8484 -7.4651,7.2965 -3.5625,11.0293 l 21.3789,20.8692 -5.0899,29.5234 c -0.8484,5.26 4.7511,9.3323 9.502,6.7871 l 26.4687,-13.914 26.4688,13.914 c 4.7509,2.5452 10.3503,-1.5271 9.5019,-6.7871 l -5.0898,-29.5234 21.3789,-20.8692 c 3.9025,-3.7328 1.6974,-10.3506 -3.5625,-11.0293 l -29.6934,-4.2421 -13.2343,-26.8086 c -1.1878,-2.5452 -3.479,-3.8167 -5.7696,-3.8379 z m -162.8242,33.4258 c -3.4571,0.021 -6.9352,1.802 -8.7168,5.3652 l -19.8535,40.3828 -44.4551,6.4473 c -7.9747,1.1877 -11.1967,11.0296 -5.4277,16.6289 l 32.2383,31.3886 -7.6368,44.2852 c -1.3574,7.9747 6.9577,14.0844 14.084,10.3516 l 39.7032,-21.041 39.705,20.871 c 7.1264,3.7329 15.4395,-2.3748 14.0821,-10.3496 l -7.6348,-44.2851 32.2383,-31.3906 c 5.7689,-5.5993 2.545,-15.4412 -5.4297,-16.629 l -44.4551,-6.4472 -19.8516,-40.3828 c -1.6967,-3.4784 -5.1327,-5.2166 -8.5898,-5.1953 z m 423.9531,56.2675 82.8028,82.8008 -152.5391,152.5391 -82.8008,-82.8008 z m 118.9434,289.6348 c -2.2906,0 -4.5818,1.189 -5.7695,3.5645 l -13.2344,26.8085 -29.6934,4.2422 c -5.2599,0.8484 -7.465,7.2945 -3.5625,11.0274 l 21.3789,20.8711 -5.0898,29.5234 c -0.8484,5.2599 4.751,9.3323 9.5019,6.7871 l 26.4688,-13.914 26.4687,13.914 c 4.7509,2.5452 10.3504,-1.5272 9.502,-6.7871 l -5.0899,-29.5234 21.379,-20.8711 c 3.9025,-3.7329 1.6974,-10.3487 -3.5625,-11.0274 l -29.6934,-4.2422 -13.2344,-26.8085 c -1.1877,-2.3755 -3.4789,-3.5645 -5.7695,-3.5645 z"
id="path114460"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke:none;stroke-width:1.69683409"
d="m 3461.3912,-3734.9919 c -89.9644,0 -162.8945,72.932 -162.8945,162.8965 0,12.1459 1.3398,23.9758 3.8613,35.3632 l -173.9023,108.6895 c -27.8332,-22.1878 -63.0911,-35.4551 -101.4532,-35.4551 -89.9644,0 -162.8965,72.9321 -162.8965,162.8965 0,89.9644 72.9321,162.8945 162.8965,162.8945 38.3621,0 73.62,-13.2672 101.4532,-35.455 l 173.9023,108.6894 a 163.40682,163.40682 0 0 0 -3.8613,35.3633 c 0,89.9644 72.9301,162.8965 162.8945,162.8965 89.9644,0 162.8965,-72.9321 162.8965,-162.8965 0,-89.9645 -72.9321,-162.8945 -162.8965,-162.8945 -38.362,0 -73.62,13.2672 -101.4531,35.455 l -173.9024,-108.6894 a 163.83103,163.83103 0 0 0 0,-70.7285 l 173.9024,-108.6895 c 27.8331,22.1895 63.0911,35.457 101.4531,35.457 89.9644,0 162.8965,-72.932 162.8965,-162.8964 0,-89.9645 -72.9321,-162.8965 -162.8965,-162.8965 z"
id="path114454"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke:none;stroke-width:1.88786757"
d="m 2.5982163,-3640.5956 c -47.8820003,0 -86.7299003,42.409 -86.7299003,94.6802 v 37.4775 c 0,14.5965 6.1438,28.2063 16.6238,37.2798 55.29,47.1427 73.5404003,63.909 313.311604,253.8606 30.3553,24.0645 90.7047,82.4502 132.6239,81.6612 41.9194,0.789 102.2688,-57.5967 132.6241,-81.6612 239.7712,-189.9516 258.0199,-206.5206 313.3099,-253.8606 10.4799,-8.8763 16.6237,-22.6833 16.6237,-37.2798 v -37.4775 c 0,-52.2712 -38.8478,-94.6802 -86.7298,-94.6802 z m 827.3111037,247.5878 c -2.2155,0.023 -4.4694,0.8065 -6.4513,2.5262 -40.4739,34.3215 -93.9565,78.1096 -278.2569,224.2718 -36.6794,29.193 -102.2682,94.4831 -166.7735,93.8914 -64.1437,0.3945 -128.4691,-63.5149 -166.5939,-93.8914 -184.300404,-146.1622 -237.964104,-189.7545 -278.438004,-224.076 -7.2275,-6.1147 -17.5274,-0.5901 -17.5274,9.2724 v 403.1775 c 0,52.2712 38.8479,94.6802 86.7299003,94.6802 H 754.25552 c 47.882,0 86.7298,-42.409 86.7298,-94.6802 v -403.3751 c 0,-6.9469 -5.4142,-11.8555 -11.076,-11.7968 z"
id="path114448"
inkscape:connector-curvature="0" />
<g
id="use107462"
style="fill:#000000;stroke:none;stroke-width:0.57619768"
transform="matrix(1.7355155,0,0,1.7355155,4077.8833,-3706.1683)">
<title
id="title107478">Reply</title>
<path
style="stroke-width:1"
d="m 435.29883,144.58203 c -9.14707,0.12727 -18.44126,3.29524 -26.37891,10.15039 L 103.46094,418.50391 c -19.239927,16.61756 -19.213895,46.45383 0,63.04882 l 305.45898,263.79688 c 26.70438,23.06326 68.87696,4.40173 68.87696,-31.52344 V 561.24805 c 269.14895,3.87367 385.16982,70.6888 306.4746,322.35937 C 775.5349,911.54575 809.30501,933.17681 833,915.94141 908.93227,860.7121 977.625,755.07517 977.625,648.44336 977.625,384.25278 756.57099,328.38107 477.79688,325.18945 V 186.25586 c -10e-6,-25.22084 -20.83394,-41.97526 -42.49805,-41.67383 z"
transform="matrix(0.57619768,0,0,0.57619768,-51.305354,-51.305017)"
id="path107480"
inkscape:connector-curvature="0" />
</g>
<path
style="fill:#000000;stroke:none;stroke-width:55.83412552"
d="m -6968.6639,-2263.3793 v 158.0098 c 392.5139,0 710.7676,318.2536 710.7676,710.7675 h 158.0098 c 0,-479.6151 -389.1623,-868.7773 -868.7774,-868.7773 z m 0,316.0195 v 158.0117 c 217.7531,0 394.7461,176.993 394.7461,394.7461 h 158.0118 c 0,-305.4126 -247.3452,-552.7578 -552.7579,-552.7578 z m 121.7168,309.3223 a 121.7184,121.7184 0 0 0 -121.7168,121.7187 121.7184,121.7184 0 0 0 121.7168,121.7168 121.7184,121.7184 0 0 0 121.7188,-121.7168 121.7184,121.7184 0 0 0 -121.7188,-121.7187 z"
id="circle125306"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke:none;stroke-width:1.79645503"
d="m -3480.6201,-2302.1067 c -249.1683,0 -439.7735,189.1658 -439.7735,438.3341 0,199.2268 125.3935,369.7113 304.5,429.7129 22.9946,4.1318 31.0782,-10.0614 31.0782,-21.7383 0,-11.138 -0.5391,-72.5772 -0.5391,-110.3027 0,0 -125.7522,26.948 -152.1601,-53.5332 0,0 -20.4797,-52.2765 -49.9415,-65.75 0,0 -41.1381,-28.205 2.875,-27.6661 0,0 44.7323,3.5939 69.3438,46.3496 39.3423,69.3431 105.2716,49.4016 130.9609,37.545 4.1319,-28.7433 15.8097,-48.6843 28.7442,-60.541 -100.4218,-11.138 -201.7422,-25.689 -201.7422,-198.5079 0,-49.4025 13.6532,-74.1929 42.3965,-105.8105 -4.6708,-11.677 -19.9415,-59.8232 4.6699,-121.9805 37.5459,-11.677 123.9551,48.5039 123.9551,48.5039 35.9291,-10.0602 74.5538,-15.2695 112.8183,-15.2695 38.2645,0 76.8873,5.2093 112.8164,15.2695 0,0 86.4112,-60.3605 123.9571,-48.5039 24.6114,62.337 9.3406,110.3035 4.6699,121.9805 28.7432,31.7972 46.3476,56.5876 46.3476,105.8105 0,173.3579 -105.8106,187.1903 -206.2324,198.5079 16.5273,14.192 30.5391,41.1387 30.5391,83.3554 0,60.5405 -0.5371,135.4527 -0.5371,150.1836 0,11.677 8.2632,25.8702 31.0781,21.7383 179.6455,-59.6423 301.4453,-230.1267 301.4453,-429.3535 0,-249.1683 -202.1012,-438.3341 -451.2695,-438.3341 z m -280.5254,603.2384 c -1.8298,0.053 -3.2473,0.6838 -4.0332,1.8066 -1.2575,2.3354 0.5379,5.2094 4.1309,7.0059 2.8742,1.7964 6.4671,1.2573 7.7246,-1.2578 1.2575,-2.3354 -0.538,-5.2095 -4.1309,-7.0059 -1.3473,-0.4042 -2.5935,-0.5804 -3.6914,-0.5488 z m 18.5918,15.1426 c -1.22,-0.031 -2.3488,0.339 -3.2246,1.2148 -2.3354,1.7964 -1.7961,5.9286 1.2578,9.3418 2.8744,2.8744 7.0064,4.1323 9.3418,1.7969 2.3354,-1.7965 1.7962,-5.9285 -1.2578,-9.3418 -1.7965,-1.7965 -4.0839,-2.9609 -6.1172,-3.0117 z m 18.2012,23.1757 c -1.1285,-0.022 -2.2034,0.3054 -3.1016,1.0352 -2.8744,1.7964 -2.8744,6.4657 0,10.5976 2.8743,4.1319 7.7251,5.9294 10.0605,4.1329 2.8743,-2.3354 2.8743,-7.0068 0,-11.1387 -1.729,-2.8406 -4.4763,-4.5777 -6.9589,-4.627 z m 21.8222,25.6446 c -1.8147,-0.064 -3.4216,0.5393 -4.4433,1.7968 -2.8744,2.3354 -1.7959,7.7254 2.3359,11.1387 4.1319,4.1318 9.3404,4.6712 11.6758,1.7969 2.3354,-2.3354 1.257,-7.7254 -2.3359,-11.1387 -2.2232,-2.3241 -4.8992,-3.5112 -7.2325,-3.5937 z m 32.7832,19.7285 c -3.8309,-0.1271 -7.4625,1.6061 -8.4843,4.5254 -1.2575,3.5929 2.3352,7.7248 7.7246,8.8027 4.6708,1.7965 10.0607,-8e-4 11.1386,-3.5937 1.0779,-3.5929 -2.3353,-7.725 -7.7246,-9.3418 -0.8757,-0.2358 -1.7702,-0.3633 -2.6543,-0.3926 z m 72.8496,1.4004 c -0.6322,-0.019 -1.2784,0 -1.9296,0.07 -5.2097,1.2575 -8.8027,4.6709 -8.2637,8.8027 0.5389,3.5929 5.2103,5.9294 10.5996,4.6719 5.2098,-1.2575 8.8027,-4.6708 8.2637,-8.2637 -0.4716,-2.9865 -4.244,-5.1486 -8.67,-5.2812 z m -34.5234,4.6797 c -0.3303,0.01 -0.6632,0.029 -1,0.062 -5.2097,0 -9.3418,2.8739 -9.3418,6.4668 0,4.1319 4.1323,7.0057 10.0606,6.4668 5.2097,0 9.3417,-2.8739 9.3417,-6.4668 0,-3.8736 -4.1066,-6.6425 -9.0605,-6.5293 z"
id="path125325"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke:none;stroke-width:1.93923879"
d="m -2375.7878,-2166.5627 c -34.1306,0 -61.8613,28.1182 -61.8613,62.6367 v 743.5039 c 0,34.5185 27.7307,62.6367 61.8613,62.6367 h 744.8613 c 34.1306,0 62.0547,-28.1182 62.0547,-62.6367 v -743.5039 c 0,-34.5185 -27.9241,-62.6367 -62.0547,-62.6367 z m 136.3281,124.1113 c 41.1119,0 74.6602,33.5484 74.6602,74.6602 0,41.3058 -33.3544,74.6601 -74.6602,74.6601 -41.3058,0 -74.6601,-33.5482 -74.6601,-74.6601 0,-41.1118 33.3543,-74.6602 74.6601,-74.6602 z m 392.502,195.668 c 130.3169,0 154.5566,85.9092 154.5566,197.6094 v 227.2773 h -128.7656 v -201.6797 c 0,-48.0931 -0.9682,-109.9551 -66.9024,-109.9551 -67.0977,0 -77.3769,52.3601 -77.3769,106.4649 v 205.1699 h -128.7656 v -414.6094 h 123.5312 v 56.627 h 1.7442 c 17.2592,-32.5793 59.3411,-66.9043 121.9785,-66.9043 z m -456.8848,10.2773 h 128.959 v 414.6094 h -0.1934 -128.7656 z"
id="path125333"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke:none;stroke-width:1.93923879"
d="m 521.20363,-2108.4741 c -51.38982,0 -93.08398,41.6942 -93.08398,93.084 v 682.6113 c 0,51.3898 41.69416,93.084 93.08398,93.084 H 1203.815 c 51.3898,0 93.0839,-41.6942 93.0839,-93.084 v -682.6113 c 0,-51.3898 -41.6941,-93.084 -93.0839,-93.084 z m 460.56836,182.2891 c 36.65161,0 69.61971,15.3203 92.89061,40.1425 28.7007,-5.4298 56.2375,-16.0963 80.6719,-30.6406 -9.5023,29.4764 -29.476,54.298 -55.8496,70.0059 25.5979,-2.715 50.4197,-9.8892 73.3027,-19.7793 -17.2592,25.404 -38.9785,47.8986 -63.8008,65.9336 0.3879,5.4298 0.3887,11.0545 0.3887,16.4843 0,168.1321 -127.99107,361.8614 -361.86327,361.8614 -72.13968,0 -139.04333,-20.9439 -195.28125,-57.0137 10.27796,1.1635 20.16873,1.5508 30.64062,1.5508 59.53463,0 114.22064,-20.1663 157.85352,-54.2969 -55.85008,-1.1635 -102.77932,-37.8161 -118.875,-88.2363 19.58631,2.9088 37.23425,2.9098 57.40234,-2.3262 -58.17717,-11.8293 -101.81054,-63.027 -101.81055,-124.8887 v -1.5507 c 16.87139,9.5022 36.65054,15.32 57.4004,16.0957 a 126.91736,126.91736 0 0 1 -56.625,-105.8829 c 0,-23.6587 6.2061,-45.3768 17.25976,-64.1875 62.63741,77.1818 156.689,127.6014 262.1836,133.0313 -18.03492,-86.2961 46.54177,-156.3027 124.11132,-156.3027 z"
id="path125361"
inkscape:connector-curvature="0" />
<path
style="fill:#2b0000;stroke:none;stroke-width:1.61956465"
d="m -4965.97,-2147.1955 c -7.9493,0.1842 -15.2095,5.8711 -17.47,14.6953 l -210.9873,797.9121 c -2.7823,10.8606 2.7814,22.2307 12.6738,25.2852 l 94.2884,30.0351 c 9.8924,3.2242 20.0945,-3.0535 23.0312,-13.914 l 210.9873,-797.9121 c 2.7823,-10.8605 -2.7831,-22.2307 -12.6755,-25.2852 l -94.2867,-30.0351 c -1.8548,-0.5728 -3.7268,-0.8238 -5.5612,-0.7813 z m 194.7927,184.668 c -4.7529,0.1485 -9.4673,2.2691 -13.0224,6.3418 l -67.2383,78.7402 c -7.1102,8.3151 -6.6467,21.5512 1.2364,29.1875 l 140.0414,135.416 -140.0414,135.2481 c -7.8831,7.6363 -8.5012,20.8724 -1.2364,29.1875 l 67.2383,78.7402 c 6.9556,8.3151 18.7023,8.654 26.2762,1.0176 l 222.736,-229.2598 c 7.8831,-7.9757 7.8831,-21.7216 0,-29.6973 l -222.736,-229.4277 c -3.7097,-3.8181 -8.5007,-5.6426 -13.2538,-5.4941 z m -505.4038,0.1054 c -4.7529,-0.1697 -9.5841,1.6556 -13.371,5.5586 l -222.7343,229.0899 c -7.8831,7.9757 -7.8831,21.7196 0,29.6953 l 222.7343,229.2598 c 7.5739,7.8061 19.3222,7.4674 26.278,-0.8477 l 67.2365,-78.7402 c 7.1102,-8.3151 6.6466,-21.5512 -1.2364,-29.1875 l -140.0397,-135.2481 140.0397,-135.2461 c 7.883,-7.6363 8.5012,-20.8743 1.2364,-29.1894 l -67.2365,-78.7383 c -3.4779,-4.0727 -8.1539,-6.2366 -12.907,-6.4063 z"
id="path125317"
inkscape:connector-curvature="0" />
<path
style="stroke-width:1.93892837"
d="m 2391.8313,-2147.2 c -110.6159,0.073 -221.0878,13.9848 -281.0976,41.5176 0,0 -123.5098,55.2587 -123.5098,243.7226 0,224.334 -12.7958,502.9588 204.752,560.545 78.5266,20.7465 146.001,25.2057 200.291,22.1035 98.4976,-5.429 153.7578,-35.0957 153.7578,-35.0957 l -3.2969,-71.5469 c 0,0 -70.3839,22.1046 -149.4922,19.584 -78.3328,-2.7145 -160.9295,-8.5303 -173.7265,-104.7012 -1.1633,-8.5312 -1.7461,-17.4504 -1.7461,-26.9512 165.9724,40.5236 307.5138,17.6437 346.4863,12.9903 108.7739,-12.9909 203.5881,-80.0776 215.6094,-141.3477 19.0015,-96.5587 17.4511,-235.5801 17.4511,-235.5801 0,-188.4639 -123.5097,-243.7226 -123.5097,-243.7226 -60.5916,-27.8237 -171.3529,-41.5903 -281.9688,-41.5176 z m -124.8887,146.7031 c 39.4311,0.025 78.8378,16.9155 102.8321,53.8067 l 22.4922,37.8086 22.4922,-37.8086 c 46.7282,-71.9342 151.4292,-67.4754 201.2597,-11.8282 45.9526,52.9328 35.6758,102.7632 35.6758,339.3125 h -90.3535 v -221.4257 c 0,-96.3648 -124.0918,-100.0484 -124.0918,13.3789 v 121.1836 h -89.7715 v -121.1836 c 0,-113.4273 -124.0918,-109.7437 -124.0918,-13.3789 v 221.4257 h -90.5488 c 0,-236.7432 -10.081,-286.7675 35.6777,-339.3125 24.3245,-27.1419 61.3864,-42.0017 98.4277,-41.9785 z"
id="path125238"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke-width:1.16304731"
d="m -451.27841,-2127.8359 c -79.3992,-0.014 -101.02667,0.2906 -101.76757,1.4355 -0.5176,0.7996 -1.35865,65.8277 -1.86914,144.5079 -0.51061,78.6801 -1.17527,144.2325 -1.47657,145.6718 -0.3012,1.4392 -1.19121,2.6185 -1.97851,2.6192 -0.7874,7e-4 -64.42251,-20.7216 -141.41211,-46.0489 -76.9895,-25.3272 -140.3686,-45.6093 -140.8418,-45.0703 -0.4734,0.5392 -14.86979,45.1866 -31.99219,99.2149 -23.8163,75.1495 -30.75892,98.3775 -29.54492,98.8515 0.8728,0.3406 61.25073,20.5111 134.17383,44.8223 117.5955,39.2041 132.58789,44.4674 132.58789,46.5488 0,1.2907 -37.85299,57.174 -84.11719,124.1856 -46.2642,67.0116 -83.94763,122.3298 -83.74023,122.9277 0.4291,1.2358 167.11796,118.6445 168.44336,118.6445 0.4739,0 38.9926,-52.337 85.5957,-116.3046 48.9103,-67.1348 85.48151,-116.2943 86.50391,-116.2813 0.9951,0.013 19.90579,25.3704 43.15039,57.8613 22.7585,31.8112 61.90925,86.4934 87.00195,121.5157 25.0928,35.0222 46.08283,63.6757 46.64453,63.6757 1.3835,0 166.81413,-121.8563 167.26953,-123.2109 0.1983,-0.5897 -35.81376,-54.0086 -80.02735,-118.709 -44.9084,-65.7173 -80.22678,-118.4961 -80.02148,-119.584 0.2781,-1.4733 33.41015,-13.1444 136.11133,-47.9492 74.658185,-25.3012 136.0745847,-46.3343 136.4804847,-46.7402 0.743,-0.7432 -59.6149997,-197.2426 -61.1015997,-198.9199 -0.4385,-0.4948 -61.006705,19.524 -134.595685,44.4863 -73.5891,24.9624 -134.6054,45.3867 -135.5918,45.3867 -2.5438,0 -2.6335,-2.1383 -6.8164,-161.6641 -2.5475,-97.1534 -4.06899,-140.4095 -4.95899,-141.0019 -0.7062,-0.4699 -46.65527,-0.8591 -102.10937,-0.8711 z"
id="path4093"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1"
d="m -2408.9193,60.560547 c -62.8368,0 -116.9395,43.956373 -131.2148,103.958983 4.2345,3.4296 8.1565,6.93695 11.8516,10.63281 l 95.4961,95.51563 c 18.107,18.11088 31.538,39.9363 39.8261,64.0332 3.1704,9.20462 5.5278,18.62565 7.0684,28.15235 h 33.3105 c 25.035,0 48.6007,6.17018 69.2051,17.04687 6.2424,-15.67197 9.5039,-32.24627 9.5039,-49.18945 V 195.63477 c 0,-6.64806 -0.6375,-13.57785 -1.8945,-21.39063 -10.4724,-64.91772 -66.9671,-113.683593 -133.1524,-113.683593 z M -2646.6224,159.75 c -35.1309,-0.29634 -70.1985,12.95463 -96.5195,39.28125 -44.4304,44.43991 -51.6102,113.77846 -19.2852,166.30273 5.3619,-0.55324 10.5323,-0.83789 15.6719,-0.83789 h 135.0469 c 24.1989,0 47.3356,5.19239 68.2969,14.56055 14.0222,-10.1827 31.3733,-16.20312 50.1562,-16.20312 h 73.0488 c -1.1774,-5.78721 -2.7347,-11.51142 -4.6718,-17.13282 -6.6717,-19.35161 -17.3746,-36.74646 -31.7832,-51.1582 l -95.4942,-95.53125 c -4.73,-4.731 -10.0927,-9.19228 -16.4648,-13.78516 -23.3166,-16.84041 -50.6779,-25.26561 -78.002,-25.49609 z m 475.1778,0.004 c -24.089,0.24347 -48.1988,6.85474 -69.5313,19.98828 0.5714,5.43369 0.8652,10.67826 0.8652,15.89258 v 135.07617 c 0,23.8622 -5.1466,47.12096 -14.8925,68.74023 29.9046,26.28856 48.7226,64.47727 48.7226,106.97852 0,1.59647 -0.028,3.18759 -0.08,4.77148 13.3942,-6.45695 25.5858,-15.0425 36.168,-25.62695 l 95.4961,-95.51563 c 4.73,-4.73102 9.1894,-10.0947 13.7832,-16.4707 38.4926,-53.29724 33.0157,-127.73199 -13.7852,-174.55859 -26.3779,-26.38308 -61.5391,-39.63124 -96.746,-39.27539 z m -575.3106,238.51171 c -4.9918,0 -18.2706,1.40255 -21.0098,1.86915 -65.1814,10.39355 -114.0371,66.93838 -114.0371,133.20703 0,62.9425 44.0016,117.20484 103.9883,131.44922 3.4821,-4.31463 7.0437,-8.30462 10.7988,-12.06055 l 95.4942,-95.51563 c 18.0903,-18.09415 39.8977,-31.51629 64.0195,-39.83593 9.7482,-3.35901 19.74,-5.80394 29.8418,-7.33399 v -64.35937 c 0,-14.43347 3.7613,-28.00399 10.375,-39.82032 -13.9627,-4.92561 -28.9244,-7.59961 -44.4238,-7.59961 z m 706.5645,3.83204 c -3.4294,4.23617 -6.9372,8.15905 -10.6329,11.85546 l -95.496,95.51563 c -18.0903,18.09415 -39.8958,31.5163 -64.0176,39.83594 -0.9608,0.33113 -1.9252,0.65341 -2.8906,0.96679 -12.6421,38.73176 -41.5844,70.30583 -78.9063,86.94532 8.2783,6.85806 17.3833,12.75076 27.1426,17.50781 18.3923,8.96547 38.2506,13.69336 58.6426,13.69336 h 135.0468 c 6.6475,0 13.5767,-0.63792 21.3828,-1.89453 64.9054,-10.47329 113.6641,-66.98112 113.6641,-133.18164 0,-62.85588 -43.9525,-116.97936 -103.9355,-131.24414 z m -537.4688,142.19726 c -6.3682,1.2113 -12.6658,2.88234 -18.8398,5.00977 -19.3479,6.67311 -36.7406,17.37813 -51.1485,31.78906 l -95.4941,95.51367 c -4.73,4.73101 -9.1894,10.0953 -13.7813,16.46875 -38.4841,53.30648 -33.0116,127.75571 13.7813,174.5586 44.426,44.43548 113.7674,51.618 166.2793,19.28906 -0.5714,-5.43369 -0.8652,-10.67826 -0.8652,-15.89258 V 735.95508 c 0,-1.5885 0.022,-3.17294 0.068,-4.75586 z m 248.0957,103.94336 c -7.4986,1.16302 -15.1858,1.76758 -23.0176,1.76758 h -45.1738 c -4.6762,23.54763 -3.0777,48.09992 4.7949,70.95703 6.6717,19.35203 17.3734,36.74727 31.7813,51.1582 l 95.4961,95.51368 c 4.73,4.731 10.0908,9.19228 16.4629,13.78515 53.295,38.49238 127.7305,33.01773 174.5234,-13.78515 44.4324,-44.4419 51.6154,-113.7993 19.2852,-166.31446 -5.4334,0.57158 -10.6768,0.86524 -15.8907,0.86524 h -135.0468 c -25.5991,0 -50.5034,-5.92601 -73.4336,-17.10352 -18.8105,-9.16897 -35.6656,-21.71228 -49.7813,-36.84375 z m -125.6699,1.76758 -88.7324,85.57812 c -4e-4,0.12369 0,0.2476 0,0.3711 v 135.07617 c 0,6.64893 0.6381,13.58086 1.8945,21.38867 10.4711,64.91929 66.966,113.68748 133.1523,113.68748 62.8405,0 116.9433,-43.96279 131.2149,-103.97068 -4.2325,-3.42948 -8.1469,-6.92631 -11.8359,-10.60547 l -95.5118,-95.5332 c -18.107,-18.11088 -31.5399,-39.93435 -39.8281,-64.03125 -9.0971,-26.41221 -11.4843,-54.60934 -7.1621,-81.96094 z"
id="Combined-Shape"
inkscape:connector-curvature="0" />
<path
style="stroke-width:55.70912552"
d="m -1253.7287,-763.77314 c -62.9513,1.67127 -115.8744,23.39784 -157.6562,65.17969 -41.7819,41.78184 -62.9518,94.14784 -64.6231,157.65625 0,16.71273 1.6712,32.86929 5.0137,49.58203 l -339.8262,340.38086 v 55.710942 l 55.709,55.70898 h 111.418 l 55.709,-55.70898 v -55.710942 h 55.7109 v -55.70899 h 55.709 v -55.70898 h 111.418 l 60.7226,-61.83594 c 16.7128,4.45673 32.8684,6.12695 50.6953,6.12695 63.5084,-1.67127 115.8744,-23.39784 157.6563,-65.17968 41.7818,-41.78185 63.5084,-94.14785 65.1797,-157.65625 -1.6713,-63.50841 -23.3979,-115.87441 -65.1797,-157.65625 -41.7819,-41.78185 -94.1479,-63.50842 -157.6563,-65.17969 z m 55.709,90.24805 c 42.896,0 76.8789,33.98288 76.8789,76.8789 0,42.89603 -33.9829,76.87891 -76.8789,76.87891 -42.896,0 -76.8789,-33.98288 -76.8789,-76.87891 0,-42.89602 33.9829,-76.8789 76.8789,-76.8789 z"
id="path111501"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
style="stroke-width:55.70912552"
d="m 2834.7518,-828.66181 c -62.9513,1.67127 -115.8744,23.39784 -157.6562,65.17969 -41.7819,41.78184 -62.9518,94.14784 -64.6231,157.65625 0,16.71273 1.6711,32.86929 5.0137,49.58203 L 2277.66,-215.86298 v 55.71094 l 55.709,55.70895 h 111.418 l 55.709,-55.70895 v -55.71094 h 55.7109 v -55.70899 h 55.709 v -55.70898 h 111.418 l 60.7226,-61.83594 c 16.7128,4.45673 32.8684,6.12695 50.6953,6.12695 63.5084,-1.67127 115.8744,-23.39784 157.6563,-65.17968 41.7819,-41.78185 63.5084,-94.14785 65.1797,-157.65625 -1.6713,-63.50841 -23.3978,-115.87441 -65.1797,-157.65625 -41.7819,-41.78185 -94.1479,-63.50842 -157.6563,-65.17969 z m 55.709,90.24805 c 42.896,0 76.8789,33.98288 76.8789,76.8789 0,42.89603 -33.9829,76.87891 -76.8789,76.87891 -42.896,0 -76.8789,-33.98288 -76.8789,-76.87891 0,-42.89602 33.9829,-76.8789 76.8789,-76.8789 z"
id="path111501-3" />
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:580.38262939px;line-height:125%;font-family:Tahoma;-inkscape-font-specification:'Tahoma, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 112.33624,129.12998 V 937.53665 H 328.1321 V 878.19116 H 184.95967 V 188.47336 H 328.1321 v -59.34338 z m 626.1962,0 v 59.34338 h 143.17243 v 689.7178 H 738.53244 v 59.34549 H 954.33039 V 129.12998 Z M 491.36211,385.66667 c -16.20834,0 -30.79551,3.49657 -43.76218,10.49175 -12.96667,6.99518 -26.78823,16.72138 -41.46101,29.17618 v -31.73351 h -89.57147 v 287.39887 h 89.57147 v -203.7147 c 6.65399,-4.60657 13.48022,-8.61434 20.47541,-12.02657 6.99508,-3.41231 14.15941,-5.11885 21.49581,-5.11885 9.55444,1e-5 16.97739,1.44993 22.26636,4.3504 5.45964,2.72981 9.46941,7.1652 12.02867,13.30733 2.55916,6.14203 4.09469,14.16168 4.60655,24.05733 0.6825,9.725 1.0225,21.58334 1.0225,35.5737 v 143.57136 h 90.08379 v -203.7147 c 7.84823,-5.45963 15.10018,-9.6385 21.75406,-12.53887 6.65399,-3.07112 13.39262,-4.60655 20.21715,-4.60655 9.725,1e-5 17.23144,1.44993 22.52042,4.3504 5.45973,2.72981 9.46951,7.1652 12.02867,13.30733 2.55926,6.14203 4.09478,14.07618 4.60655,23.80118 0.51185,9.725 0.76845,21.66883 0.76845,35.82985 v 143.57136 h 90.08378 V 493.92047 c 0,-20.4736 -2.04664,-37.02192 -6.14136,-49.64738 -3.92406,-12.79601 -9.89498,-23.80112 -17.91387,-33.01427 -7.33638,-8.53075 -16.29486,-14.92936 -26.87292,-19.19464 -10.57805,-4.26537 -22.51978,-6.39751 -35.82775,-6.39751 -15.69647,0 -31.22256,4.34989 -46.57775,13.05118 -15.18463,8.53064 -31.39284,20.81458 -48.62488,36.85236 -6.99519,-16.54955 -17.14699,-29.00248 -30.45485,-37.36257 -13.30787,-8.36008 -28.74836,-12.54097 -46.3216,-12.54097 z"
id="path1008"
inkscape:connector-curvature="0" />
</svg>

After

Width:  |  Height:  |  Size: 68 KiB

View file

@ -0,0 +1,21 @@
The Ubuntu Font Family is very long-term endeavour, and the first time
that a professionally-designed font has been funded specifically with
the intent of being an on-going community expanded project:
http://font.ubuntu.com/
Development of the Ubuntu Font Family is undertaken on Launchpad:
http://launchpad.net/ubuntu-font-family/
and this is where milestones, bug management and releases are handled.
Contributions are welcomed. Your work will be used on millions of
computers every single day! Following the initial bootstrapping of
Latin, Cyrillic, Greek, Arabic and Hebrew expansion will be undertaken
by font designers from the font design and Ubuntu communities.
To ensure that the Ubuntu Font Family can be re-licensed to future
widely-used libre font licences, copyright assignment is being required:
https://launchpad.net/~uff-contributors

View file

@ -0,0 +1,292 @@
This is the FONTLOG file for the Ubuntu Font Family and attempts to follow
the recommendations at: http://scripts.sil.org/OFL-FAQ_web#43cecb44
Overview
The new Ubuntu Font Family was started to enable the personality of
Ubuntu to be seen and felt in every menu, button and dialog.
The typeface is sans-serif, uses OpenType features and is manually
hinted for clarity on desktop and mobile computing screens.
The scope of the Ubuntu Font Family includes all the languages used by
the various Ubuntu users around the world in tune with Ubuntu's
philosophy which states that every user should be able to use their
software in the language of their choice. So the Ubuntu Font Family
project will be extended to cover many more written languages.
History
The Ubuntu Font Family has been creating during 2010 and 2011. As of
September 2011 coverage is provided for Latin, Cyrillic and Greek across
Regular, Italic, Bold and Bold-Italic. Further work was uptaken during
2015.
ChangeLog
2015-08-21 (Paul Sladen) Ubuntu Font Family version 0.83
Note: This release was created by binary patching from the v0.80
release using the scripts in 'sources/patch-0.80-0.83/' to rebuild
the necessary tables. The release selectively updates only those
proportional .ttf font files exhibiting the bug below bug number;
the Ubuntu Mono monospace font files remain unchanged, being the
original version 0.80 ones.
[Marc Foley]
* [Engineering] Fixed wrong characters appear in some mac apps. (LP: #1334363)
2011-09-22 (Paul Sladen) Ubuntu Font Family version 0.80
[Vincent Connare/Dalton Maag]
* Wish for addition of a monospaced member to the family (LP: #640382)
* Mono: No hinting yet - Ubuntu Beta Mono font looks jagged in
Netbeans and terrible with ClearType (LP: #820493)
* Emacs: choosing normal monospace font in Emacs but gives bold-italic
(LP: #791076)
* PUA: ensure that Ubuntu Circle of Friends logo is full size: (LP: #853855)
+ U+E0FF becomes large size in proportionals, remains small width in
monospaces
+ U+F0FF becomes small size (proportionals only)
+ U+F200 is full ubuntu logomark (proportionals only)
[Paul Sladen]
* Monospace: Patch Family Name to be "Ubuntu Mono"
* Monospace: Patch U+EFFD version debugging glyph to be '0.8'
[Cody Boisclair]
* Monospace: Force .null HDMX advance to 500
* Monospace: Remap ASCII box-drawing characters (LP: #788757)
[Júlio Reis]
* Date corrections to 'FONTLOG' (LP: #836595)
2011-03-08 (Paul Sladen) Ubuntu Font Family version 0.71.2
* (Production) Adjust Medium WeightClass to 500 (Md, MdIt) (LP: #730912)
2011-03-07 (Paul Sladen) Ubuntu Font Family version 0.71.1
* (Design) Add Capitalised version of glyphs and kern. (Lt, LtIt,
Md, MdIt) DM (LP: #677446)
* (Design) Re-space and tighen Regular and Italic by amount specified
by Mark Shuttleworth (minus 4 FUnits). (Rg, It) (LP: #677149)
* (Design) Design: Latin (U+0192) made straight more like l/c f with
tail (LP: #670768)
* (Design) (U+01B3) should have hook on right, as the lowercase
(U+01B4) (LP: #681026)
* (Design) Tail of Light Italic germandbls, longs and lowercase 'f'
to match Italic/BoldItalic (LP: #623925)
* (Production) Update <case> feature (Lt, LtIt, Md, MdIt). DM
(LP: #676538, #676539)
* (Production) Remove Bulgarian locl feature for Italics. (LP: #708578)
* (Production) Update Description information with new string:
"The Ubuntu Font Family are libre fonts funded by Canonical Ltd
on behalf of the Ubuntu project. The font design work and
technical implementation is being undertaken by Dalton Maag. The
typeface is sans-serif, uses OpenType features and is manually
hinted for clarity on desktop and mobile computing screens. The
scope of the Ubuntu Font Family includes all the languages used
by the various Ubuntu users around the world in tune with
Ubuntu's philosophy which states that every user should be able
to use their software in the language of their choice. The
project is ongoing, and we expect the family will be extended to
cover many written languages in the coming years."
(Rg, It, Bd, BdIt, Lt, LtIt, Md, MdIt) (LP: #690590)
* (Production) Pixel per em indicator added at U+F000 (Lt, LtIt, Md,
MdIt) (LP: #615787)
* (Production) Version number indicator added at U+EFFD (Lt, LtIt, Md,
MdIt) (LP: #640623)
* (Production) fstype bit set to 0 - Editable (Lt, LtIt, Md, MdIt)
(LP: #648406)
* (Production) Localisation of name table has been removed because
of problems with Mac OS/X interpretation of localisation. DM
(LP: #730785)
* (Hinting) Regular '?' dot non-circular (has incorrect control
value). (LP: #654336)
* (Hinting) Too much space after latin capital 'G' in 13pt
regular. Now reduced. (LP: #683437)
* (Hinting) Balance Indian Rupee at 18,19pt (LP: #662177)
* (Hinting) Make Regular '£' less ambiguous at 13-15 ppm (LP: #685562)
* (Hinting) Regular capital 'W' made symmetrical at 31 ppem (LP: #686168)
2010-12-14 (Paul Sladen) Ubuntu Font Family version 0.70.1
Packaging, rebuilt from '2010-12-08 UbuntuFontsSourceFiles_070.zip':
* (Midstream) Fstype bit != 0 (LP: #648406)
* (Midstream) Add unit test to validate fstype bits (LP: #648406)
* (Midstream) Add unit test to validate licence
2010-12-14 (Paul Sladen) Ubuntu Font Family version 0.70
Release notes 0.70:
* (Design) Add Capitalised version of glyphs and kern. (Rg, It, Bd,
BdIt) DM (LP: #676538, #677446)
* (Design) Give acute and grave a slight upright move to more match
the Hungarian double acute angle. (Rg, It, Bd, BdIt) (LP: #656647)
* (Design) Shift Bold Italic accent glyphs to be consistent with the
Italic. (BdIt only) DM (LP: #677449)
* (Design) Check spacing and kerning of dcaron, lcaron and
tcaron. (Rg, It, Bd, BdIt) (LP: #664722)
* (Design) Add positive kerning to () {} [] to open out the
combinations so they are less like a closed box. (Rg, It, Bd,
BdIt) (LP: #671228)
* (Design) Change design of acute.asc and check highest points (Bd
and BdIt only) DM
* (Production) Update <case> feature. DM (LP: #676538, #676539)
* (Production) Remove Romanian locl feature. (Rg, It, Bd, BdIt)
(LP: #635615)
* (Production) Update Copyright information with new
strings. "Copyright 2010 Canonical Ltd. Licensed under the Ubuntu
Font Licence 1.0" Trademark string "Ubuntu and Canonical are
registered trademarks of Canonical Ltd." (Rg, It, Bd, BdIt) DM
(LP: #677450)
* (Design) Check aligning of hyphen, math signs em, en, check braces
and other brackets. 16/11 (LP: #676465)
* (Production) Pixel per em indicator added at U+F000 (Rg, It, Bd,
BdIt) (LP: #615787)
* (Production) Version number indicator added at U+EFFD (Rg, It, Bd,
BdIt) (LP: #640623)
* (Production) fstype bit set to 0 - Editable (Rg, It, Bd, BdIt)
(LP: #648406)
2010-10-05 (Paul Sladen) Ubuntu Font Family version 0.69
[Dalton Maag]
* Italic,
- Hinting on lowercase Italic l amended 19ppm (LP: #632451)
- Hinting on lowercase Italic u amended 12ppm (LP: #626376)
* Regular, Italic, Bold, BoldItalic
- New Rupee Sign added @ U+20B9 (LP: #645987)
- Ubuntu Roundel added @ U+E0FF (LP: #651606)
[Paul Sladen]
* All
- Removed "!ubu" GSUB.calt ligature for U+E0FF (LP: #651606)
Acknowledgements
If you make modifications be sure to add your name (N), email (E),
web-address (if you have one) (W) and description (D). This list is in
alphabetical order.
N: Ryan Abdullah
W: http://www.rayan.de/
D: Arabic calligraphy and design in collaboration with Dalton Maag
D: Arabic testing
N: Cody Boisclair
D: Monospace low-level debugging and patching ('fixboxdrawing-ft.py')
N: Amélie Bonet
W: http://ameliebonet.com/
D: Type design with Dalton Maag, particularly Ubuntu Mono and Ubuntu Condensed
N: Jason Campbell
W: http://www.campbellgraphics.com/design/fonts.shtml
D: Monospace hinting (first phase) at Dalton Maag
N: Pilar Cano
W: http://www.pilarcano.com/
D: Hebrew realisation with Dalton Maag
N: Fernando Caro
D: Type design with Dalton Maag, particularly Ubuntu Condensed
N: Ron Carpenter
W: http://www.daltonmaag.com/
D: Type design with Dalton Maag
D: Arabic realisation in collaboration with Ryan Abdullah
N: Vincent Connare
W: http://www.connare.com/
D: Type design, and engineering with Dalton Maag
D: Monospace hinting (second phase) at Dalton Maag
N: Dave Crossland
E: dave@understandingfonts.com
W: http://understandingfonts.com/
D: Documentation and libre licensing guidance
D: Google Webfont integration at Google
N: Steve Edwards
W: http://www.madebymake.com/
D: font.ubuntu.com revamp implementation with Canonical Web Team
N: Iain Farrell
W: http://www.flickr.com/photos/iain
D: Ubuntu Font Family delivery for the Ubuntu UX team at Canonical
N: Marc Foley
W: http://www.marcfoley.co/
D: Font Engineer at Dalton Maag for the 2015 updates
N: Shiraaz Gabru
W: http://www.daltonmaag.com/
D: Ubuntu Font Family project management at Dalton Maag
N: Marcus Haslam
W: http://design.canonical.com/author/marcus-haslam/
D: Creative inspiration
N: Ben Laenen
D: Inspiration behind the pixels-per-em (PPEM) readout debugging glyph at U+F000
(for this font the concept was re-implemented from scratch by Dalton-Maag)
N: Bruno Maag
W: http://www.daltonmaag.com/
D: Stylistic direction of the Ubuntu Font Family, as head of Dalton Maag
N: Ivanka Majic
W: http://www.ivankamajic.com/
D: Guiding the UX team and Cyrillic feedback
N: David Marshall
W: http://www.daltonmaag.com/
D: Technical guidance and administration at Dalton Maag
N: Malcolm Wooden
W: http://www.daltonmaag.com/
D: Font Engineering at Dalton Maag
N: Lukas Paltram
W: http://www.daltonmaag.com/
D: Type design with Dalton Maag
N: Júlio Reis
D: Date fixes to the documentation
N: Rodrigo Rivas
D: Indian Rupee Sign glyph
N: Mark Shuttleworth
E: mark@ubuntu.com
W: http://www.markshuttleworth.com/
D: Executive quality-control and funding
N: Paul Sladen
E: ubuntu@paul.sladen.org
W: http://www.paul.sladen.org/
D: Bug triaging, packaging at Ubuntu and Canonical
N: Nicolas Spalinger
W: http://planet.open-fonts.org
D: Continuous guidance on libre/open font licensing, best practises in source
tree layout, release and packaging (pkg-fonts Debian team)
N: Kenneth Wimer
D: Initial PPA packaging
* Canonical Ltd is the primary commercial sponsor of the Ubuntu and
Kubuntu operating systems
* Dalton Maag are a custom type foundry headed by Bruno Maag
For further documentation, information on contributors, source code
downloads and those involved with the Ubuntu Font Family, visit:
http://font.ubuntu.com/

View file

@ -0,0 +1,177 @@
Ubuntu Font Family Licensing FAQ
Stylistic Foundations
The Ubuntu Font Family is the first time that a libre typeface has been
designed professionally and explicitly with the intent of developing a
public and long-term community-based development process.
When developing an open project, it is generally necessary to have firm
foundations: a font needs to maintain harmony within itself even across
many type designers and writing systems. For the [1]Ubuntu Font Family,
the process has been guided with the type foundry Dalton Maag setting
the project up with firm stylistic foundation covering several
left-to-right scripts: Latin, Greek and Cyrillic; and right-to-left
scripts: Arabic and Hebrew (due in 2011).
With this starting point the community will, under the supervision of
[2]Canonical and [3]Dalton Maag, be able to build on the existing font
sources to expand their character coverage. Ultimately everybody will
be able to use the Ubuntu Font Family in their own written languages
across the whole of Unicode (and this will take some time!).
Licensing
The licence chosen by any free software project is one of the
foundational decisions that sets out how derivatives and contributions
can occur, and in turn what kind of community will form around the
project.
Using a licence that is compatible with other popular licences is a
powerful constraint because of the [4]network effects: the freedom to
share improvements between projects allows free software to reach
high-quality over time. Licence-proliferation leads to many
incompatible licences, undermining the network effect, the freedom to
share and ultimately making the libre movement that Ubuntu is a part of
less effective. For all kinds of software, writing a new licence is not
to be taken lightly and is a choice that needs to be thoroughly
justified if this path is taken.
Today it is not clear to Canonical what the best licence for a font
project like the Ubuntu Font Family is: one that starts life designed
by professionals and continues with the full range of community
development, from highly commercial work in new directions to curious
beginners' experimental contributions. The fast and steady pace of the
Ubuntu release cycle means that an interim libre licence has been
necessary to enable the consideration of the font family as part of
Ubuntu 10.10 operating system release.
Before taking any decision on licensing, Canonical as sponsor and
backer of the project has reviewed the many existing licenses used for
libre/open fonts and engaged the stewards of the most popular licenses
in detailed discussions. The current interim licence is the first step
in progressing the state-of-the-art in licensing for libre/open font
development.
The public discussion must now involve everyone in the (comparatively
new) area of the libre/open font community; including font users,
software freedom advocates, open source supporters and existing libre
font developers. Most importantly, the minds and wishes of professional
type designers considering entering the free software business
community must be taken on board.
Conversations and discussion has taken place, privately, with
individuals from the following groups (generally speaking personally on
behalf of themselves, rather than their affiliations):
* [5]SIL International
* [6]Open Font Library
* [7]Software Freedom Law Center
* [8]Google Font API
Document embedding
One issue highlighted early on in the survey of existing font licences
is that of document embedding. Almost all font licences, both free and
unfree, permit embedding a font into a document to a certain degree.
Embedding a font with other works that make up a document creates a
"combined work" and copyleft would normally require the whole document
to be distributed under the terms of the font licence. As beautiful as
the font might be, such a licence makes a font too restrictive for
useful general purpose digital publishing.
The situation is not entirely unique to fonts and is encountered also
with tools such as GNU Bison: a vanilla GNU GPL licence would require
anything generated with Bison to be made available under the terms of
the GPL as well. To avoid this, Bison is [9]published with an
additional permission to the GPL which allows the output of Bison to be
made available under any licence.
The conflict between licensing of fonts and licensing of documents, is
addressed in two popular libre font licences, the SIL OFL and GNU GPL:
* [10]SIL Open Font Licence: When OFL fonts are embedded in a
document, the OFL's terms do not apply to that document. (See
[11]OFL-FAQ for details.
* [12]GPL Font Exception: The situation is resolved by granting an
additional permission to allow documents to not be covered by the
GPL. (The exception is being reviewed).
The Ubuntu Font Family must also resolve this conflict, ensuring that
if the font is embedded and then extracted it is once again clearly
under the terms of its libre licence.
Long-term licensing
Those individuals involved, especially from Ubuntu and Canonical, are
interested in finding a long-term libre licence that finds broad favour
across the whole libre/open font community. The deliberation during the
past months has been on how to licence the Ubuntu Font Family in the
short-term, while knowingly encouraging everyone to pursue a long-term
goal.
* [13]Copyright assignment will be required so that the Ubuntu Font
Family's licensing can be progressively expanded to one (or more)
licences, as best practice continues to evolve within the
libre/open font community.
* Canonical will support and fund legal work on libre font licensing.
It is recognised that the cost and time commitments required are
likely to be significant. We invite other capable parties to join
in supporting this activity.
The GPL version 3 (GPLv3) will be used for Ubuntu Font Family build
scripts and the CC-BY-SA for associated documentation and non-font
content: all items which do not end up embedded in general works and
documents.
Ubuntu Font Licence
For the short-term only, the initial licence is the [14]Ubuntu Font
License (UFL). This is loosely inspired from the work on the SIL
OFL 1.1, and seeks to clarify the issues that arose during discussions
and legal review, from the perspective of the backers, Canonical Ltd.
Those already using established licensing models such as the GPL, OFL
or Creative Commons licensing should have no worries about continuing
to use them. The Ubuntu Font Licence (UFL) and the SIL Open Font
Licence (SIL OFL) are not identical and should not be confused with
each other. Please read the terms precisely. The UFL is only intended
as an interim license, and the overriding aim is to support the
creation of a more suitable and generic libre font licence. As soon as
such a licence is developed, the Ubuntu Font Family will migrate to
it—made possible by copyright assignment in the interium. Between the
OFL 1.1, and the UFL 1.0, the following changes are made to produce the
Ubuntu Font Licence:
* Clarification:
1. Document embedding (see [15]embedding section above).
2. Apply at point of distribution, instead of receipt
3. Author vs. copyright holder disambiguation (type designers are
authors, with the copyright holder normally being the funder)
4. Define "Propagate" (for internationalisation, similar to the GPLv3)
5. Define "Substantially Changed"
6. Trademarks are explicitly not transferred
7. Refine renaming requirement
Streamlining:
8. Remove "not to be sold separately" clause
9. Remove "Reserved Font Name(s)" declaration
A visual demonstration of how these points were implemented can be
found in the accompanying coloured diff between SIL OFL 1.1 and the
Ubuntu Font Licence 1.0: [16]ofl-1.1-ufl-1.0.diff.html
References
1. http://font.ubuntu.com/
2. http://www.canonical.com/
3. http://www.daltonmaag.com/
4. http://en.wikipedia.org/wiki/Network_effect
5. http://scripts.sil.org/
6. http://openfontlibrary.org/
7. http://www.softwarefreedom.org/
8. http://code.google.com/webfonts
9. http://www.gnu.org/licenses/gpl-faq.html#CanIUseGPLToolsForNF
10. http://scripts.sil.org/OFL_web
11. http://scripts.sil.org/OFL-FAQ_web
12. http://www.gnu.org/licenses/gpl-faq.html#FontException
13. https://launchpad.net/~uff-contributors
14. http://font.ubuntu.com/ufl/ubuntu-font-licence-1.0.txt
15. http://font.ubuntu.com/ufl/FAQ.html#embedding
16. http://font.ubuntu.com/ufl/ofl-1.1-ufl-1.0.diff.html

View file

@ -0,0 +1,96 @@
-------------------------------
UBUNTU FONT LICENCE Version 1.0
-------------------------------
PREAMBLE
This licence allows the licensed fonts to be used, studied, modified and
redistributed freely. The fonts, including any derivative works, can be
bundled, embedded, and redistributed provided the terms of this licence
are met. The fonts and derivatives, however, cannot be released under
any other licence. The requirement for fonts to remain under this
licence does not require any document created using the fonts or their
derivatives to be published under this licence, as long as the primary
purpose of the document is not to be a vehicle for the distribution of
the fonts.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this licence and clearly marked as such. This may
include source files, build scripts and documentation.
"Original Version" refers to the collection of Font Software components
as received under this licence.
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to
a new environment.
"Copyright Holder(s)" refers to all individuals and companies who have a
copyright ownership of the Font Software.
"Substantially Changed" refers to Modified Versions which can be easily
identified as dissimilar to the Font Software by users of the Font
Software comparing the Original Version with the Modified Version.
To "Propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification and with or without charging
a redistribution fee), making available to the public, and in some
countries other activities as well.
PERMISSION & CONDITIONS
This licence does not grant any rights under trademark law and all such
rights are reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of the Font Software, to propagate the Font Software, subject to
the below conditions:
1) Each copy of the Font Software must contain the above copyright
notice and this licence. These can be included either as stand-alone
text files, human-readable headers or in the appropriate machine-
readable metadata fields within text or binary files as long as those
fields can be easily viewed by the user.
2) The font name complies with the following:
(a) The Original Version must retain its name, unmodified.
(b) Modified Versions which are Substantially Changed must be renamed to
avoid use of the name of the Original Version or similar names entirely.
(c) Modified Versions which are not Substantially Changed must be
renamed to both (i) retain the name of the Original Version and (ii) add
additional naming elements to distinguish the Modified Version from the
Original Version. The name of such Modified Versions must be the name of
the Original Version, with "derivative X" where X represents the name of
the new work, appended to that name.
3) The name(s) of the Copyright Holder(s) and any contributor to the
Font Software shall not be used to promote, endorse or advertise any
Modified Version, except (i) as required by this licence, (ii) to
acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with
their explicit written permission.
4) The Font Software, modified or unmodified, in part or in whole, must
be distributed entirely under this licence, and must not be distributed
under any other licence. The requirement for fonts to remain under this
licence does not affect any document created using the Font Software,
except any version of the Font Software extracted from a document
created using the Font Software may only be distributed under this
licence.
TERMINATION
This licence becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
DEALINGS IN THE FONT SOFTWARE.

View file

@ -0,0 +1,16 @@
----------------------
Ubuntu Font Family
======================
The Ubuntu Font Family are a set of matching new libre/open fonts in
development during 2010--2011. And with further expansion work and
bug fixing during 2015. The development is being funded by
Canonical Ltd on behalf the wider Free Software community and the
Ubuntu project. The technical font design work and implementation is
being undertaken by Dalton Maag.
Both the final font Truetype/OpenType files and the design files used
to produce the font family are distributed under an open licence and
you are expressly encouraged to experiment, modify, share and improve.
http://font.ubuntu.com/

View file

@ -0,0 +1,4 @@
Ubuntu and Canonical are registered trademarks of Canonical Ltd.
The licence accompanying these works does not grant any rights
under trademark law and all such rights are reserved.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,5 @@
Copyright 2010,2011 Canonical Ltd.
This Font Software is licensed under the Ubuntu Font Licence, Version
1.0. https://launchpad.net/ubuntu-font-licence

Binary file not shown.

BIN
assets/images/links.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
assets/images/mario.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
assets/images/px.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

7799
assets/images/sprite.svg Normal file

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 908 KiB

View file

@ -8,21 +8,22 @@ imagesContext.keys().forEach(imagesContext);*/
import '../css/admin.scss';
require('../../node_modules/bootstrap/dist/js/bootstrap.min.js');
// require('./addons/table-selectable.js')();
require('./addons/table-fixed.js')();
// require('./addons/document-selector.js')();
require('./addons/form-confirm.js')();
require('./addons/form.js')();
require('./addons/dbclick.js')();
require('./addons/toast.js')();
require('./addons/modal.js')();
require('./addons/push-state.js')();
require('./addons/password.js')();
require('./addons/tooltip.js')();
require('./addons/editor.js')();
require('./addons/panel.js')();
require('./addons/choices.js')();
require('./addons/checkbox-checker.js')();
require('./addons/rest-choices.js')();
require('./addons/form-collection.js')();
require('./addons/datepicker.js')();
// require('./admin/table-selectable.js')();
require('./admin/table-fixed.js')();
// require('./admin/document-selector.js')();
require('./admin/form-confirm.js')();
require('./admin/form.js')();
require('./admin/dbclick.js')();
require('./admin/toast.js')();
require('./admin/modal.js')();
require('./admin/push-state.js')();
require('./admin/password.js')();
require('./admin/tooltip.js')();
require('./admin/editor.js')();
require('./admin/panel.js')();
require('./admin/choices.js')();
require('./admin/checkbox-checker.js')();
require('./admin/rest-choices.js')();
require('./admin/form-collection.js')();
require('./admin/datepicker.js')();
require('./admin/simplemde.js')();

View file

@ -0,0 +1,15 @@
const Editor = require('simplemde')
const $ = require('jquery');
module.exports = () => {
elements = $('textarea[data-simplemde]')
elements.each((i, element) => {
$(element).removeClass('form-control')
new Editor({
element: element,
forceSync: true
})
})
}

3
assets/js/app.js Normal file
View file

@ -0,0 +1,3 @@
import '../css/app.scss';

15
assets/js/app/app.js Normal file
View file

@ -0,0 +1,15 @@
var App = function(components) {
this.components = components || [];
}
App.prototype.add = function(c) {
this.components.push(c);
return this;
}
App.prototype.init = function() {
for (var u = 0, x = this.components.length; u < x; u++) {
this.components[u].init();
}
}

42
assets/js/app/code.js Normal file
View file

@ -0,0 +1,42 @@
var Code = function(w) {
this.window = w;
}
Code.prototype.init = function() {
Prism.highlightAllUnder(document);
var elements = this.window.document.querySelectorAll('code[data-title], div[data-title]');
for (var i = 0, len = elements.length; i < len; i++) {
var element = elements[i];
if (element.tagName === 'CODE') {
var code = element;
var pre = code.parentNode;
var post = pre.parentNode;
} else {
var code = element.querySelector('code');
if (!code) {
continue;
}
var pre = code.parentNode;
var post = pre.parentNode;
}
if (!pre || !post) {
continue;
}
pre.classList.add('with-title');
var title = this.window.document.createElement('div');
title.classList.add('code-title');
title.textContent = element.getAttribute('data-title');
post.insertBefore(title, pre);
}
}
module.exports = Code

23
assets/js/app/form-pwn.js Normal file
View file

@ -0,0 +1,23 @@
var FormPnw = function(w) {
this.window = w;
}
FormPnw.prototype.init = function() {
var doc = this.window.document;
doc.addEventListener('mousemove', function() {
var forms = doc.querySelectorAll('form[data-form-bot]');
for (var i = 0, len = forms.length; i < len; i++) {
var form = forms[i];
var action = form.getAttribute('action');
action = action.replace(Routing.generate('form_without_javascript') + '?page=', '');
action = decodeURIComponent(action);
form.setAttribute('action', action);
form.removeAttribute('data-form-bot');
}
});
}
module.exports = FormPnw

32
assets/js/app/knmc.js Normal file
View file

@ -0,0 +1,32 @@
var Knmc = function(w) {
this.window = w;
}
Knmc.prototype.init = function() {
var chars = '';
var seq = '38384040373937396665';
var body = this.window.document.querySelector('body');
body.addEventListener('keyup', function(e) {
chars += e.keyCode.toString();
if (chars.indexOf(seq) !== -1) {
chars = '';
var url = '/bundles/deblanblog/skin2018/frontoffice/img/mario.gif';
var image = new Image();
image.classList.add('fixed');
image.style.position = 'fixed';
image.style.bottom = '-11px';
image.style.left = '-256px';
image.onload = function() {
image.classList.add('knmc');
body.appendChild(image);
}
image.src = url;
}
});
}
module.exports = Knmc

View file

@ -0,0 +1,9 @@
var LazyLoad = function() {
}
LazyLoad.prototype.init = function() {
var observer = lozad('.lazy-img');
observer.observe();
}
module.exports = LazyLoad

View file

@ -0,0 +1,44 @@
var Particles = function(w) {
this.window = w;
}
Particles.prototype.start = function() {
if (this.window.innerWidth < 708) {
return;
}
var height = this.header.offsetHeight;
var width = this.header.offsetWidth - 40;
var canvas;
this.particles.style.maxHeight = height + 'px';
this.particles.style.maxWidth = width + 'px';
particlesJS.load('particles', '/js/particles.json?v=3');
}
Particles.prototype.clean = function() {
this.particles.innerHTML = '';
}
Particles.prototype.init = function() {
this.particles = this.window.document.getElementById('particles');
if (!this.particles) {
return;
}
this.header = this.particles.parentNode;
this.clean();
this.start();
var that = this;
this.window.addEventListener('resize', function() {
that.clean();
that.start();
}, false);
}
module.exports = Particles

118
assets/js/app/post.js Normal file
View file

@ -0,0 +1,118 @@
var Post = function(w) {
this.window = w;
}
Post.prototype.commentsEvents = function() {
var document = this.window.document;
var parentCommentIdField = document.getElementById('comment_parentCommentId');
if (!parentCommentIdField) {
return;
}
var isAnswerAlert = document.getElementById('answer-alert');
var cancelAnswerButton = document.getElementById('cancel-answer');
var toogleAnswerAlert = function() {
if (parentCommentIdField.value) {
isAnswerAlert.classList.remove('hidden');
} else {
isAnswerAlert.classList.add('hidden');
}
}
toogleAnswerAlert();
var answerButtons = document.querySelectorAll('a[data-answer]');
for (var i = 0, len = answerButtons.length; i < len; i++) {
answerButtons[i].addEventListener('click', function(e) {
parentCommentIdField.value = e.target.getAttribute('data-answer');
toogleAnswerAlert();
}, false);
}
cancelAnswerButton.addEventListener('click', function(e) {
e.preventDefault();
parentCommentIdField.value = null;
toogleAnswerAlert();
}, false);
var previewButton = document.querySelector('.preview-button');
var previewRender = document.querySelector('#preview');
previewButton.addEventListener('click', function() {
if (previewRender.innerHTML === '') {
previewRender.innerHTML = '<p>Chargement en cours…</p>';
}
var content = document.querySelector('#comment_content').value;
var httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = function(data) {
if (httpRequest.readyState === 4 && httpRequest.status === 200) {
var json = JSON.parse(httpRequest.response);
previewRender.innerHTML = json.render;
document.location.href = '#preview';
}
};
httpRequest.open('POST', Routing.generate('api_comment_preview'));
httpRequest.setRequestHeader(
'Content-Type',
'application/x-www-form-urlencoded'
);
httpRequest.send('content=' + encodeURIComponent(content));
}, false);
}
Post.prototype.imagesEvents = function() {
var document = this.window.document;
var isFullscreen = false;
var images = document.querySelectorAll('.body img');
var handleClick = function(image) {
if (isFullscreen) {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
}
} else {
if (image.requestFullscreen) {
image.requestFullscreen();
} else if (image.webkitRequestFullscreen) {
image.webkitRequestFullscreen();
} else if (image.mozRequestFullScreen) {
image.mozRequestFullScreen();
}
}
isFullscreen = !isFullscreen;
};
for (var i = 0, len = images.length; i < len; i++) {
var image = images[i];
if (image.parentNode.tagName === 'A') {
continue;
}
(function(i) {
i.addEventListener('click', function() {
handleClick(i);
}, false);
})(image);
}
}
Post.prototype.init = function() {
this.commentsEvents();
this.imagesEvents();
}
module.exports = Post

View file

@ -0,0 +1,25 @@
var QuickPost = function(w) {
this.window = w;
}
QuickPost.prototype.init = function() {
var doc = this.window.document;
var images = doc.querySelectorAll('.quick-image img');
for (var i = 0, len = images.length; i < len; i++) {
(function(image) {
var source = image.getAttribute('data-src');
var loader = new Image();
loader.onload = function() {
image.style.backgroundImage = 'url(' + source + ')';
image.style.backgroundSize = 'cover';
}
loader.src = source;
})(images[i]);
}
}
module.exports = QuickPost

38
assets/js/app/stats.js Normal file
View file

@ -0,0 +1,38 @@
var Stats = function() {
}
Stats.prototype.init = function() {
(function(f, a, t, h, o, m){
a[h]=a[h]||function(){
(a[h].q=a[h].q||[]).push(arguments)
};
o=f.createElement('script'),
m=f.getElementsByTagName('script')[0];
o.async=1; o.src=t; o.id='fathom-script';
m.parentNode.insertBefore(o,m)
})(document, window, '//ftm.deblan.org/tracker.js', 'fathom');
fathom('set', 'siteId', 'HQAWS');
fathom('trackPageview');
/*
var _paq = _paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
var u="//piwik.deblan.org/";
_paq.push(['setTrackerUrl', u+'piwik.php']);
_paq.push(['setSiteId', '1']);
var d= document;
var g= d.createElement('script');
var s= d.getElementsByTagName('script')[0];
g.type='text/javascript';
g.async=true;
g.defer=true;
g.src=u+'piwik.js';
s.parentNode.insertBefore(g,s);
*/
}
module.exports = Stats

View file

@ -0,0 +1,13 @@
var VideoRatio = function(w) {
this.window = w;
}
VideoRatio.prototype.init = function() {
var videos = this.window.document.querySelectorAll('.video-ratio');
for (var i = 0, len = videos.length; i < len; i++) {
videos[i].style.paddingBottom = videos[i].getAttribute('data-ratio');
}
}
module.exports = VideoRatio

View file

@ -14,6 +14,8 @@
"doctrine/doctrine-bundle": "^2.2",
"doctrine/doctrine-migrations-bundle": "^3.0",
"doctrine/orm": "^2.8",
"knplabs/knp-markdown-bundle": "^1.9",
"knplabs/knp-menu-bundle": "^3.1",
"knplabs/knp-paginator-bundle": "^5.4",
"phpdocumentor/reflection-docblock": "^5.2",
"scheb/2fa-google-authenticator": "^5.7",

View file

@ -19,4 +19,6 @@ return [
Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle::class => ['all' => true],
App\Core\Bundle\CoreBundle::class => ['all' => true],
App\Bundle\AppBundle::class => ['all' => true],
Knp\Bundle\MarkdownBundle\KnpMarkdownBundle::class => ['all' => true],
Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true],
];

View file

@ -1,9 +1,21 @@
core:
site:
name: "Murph"
name: "Blog"
logo: "build/images/core/logo.svg"
pages:
App\Entity\Page\SimplePage:
name: 'Page simple'
name: 'Page de contenu'
templates:
- {name: "Template 1", file: "page/simple/page.html.twig"}
- {name: "Par défaut", file: "page/simple/default.html.twig"}
App\Entity\Page\ContactPage:
name: 'Contact'
templates:
- {name: "Par défaut", file: "page/contact/default.html.twig"}
App\Entity\Page\LinksPage:
name: 'Liens partagés'
templates:
- {name: "Par défaut", file: "page/links/default.html.twig"}
App\Entity\Page\TitledPage:
name: 'Page titrée'
templates:
- {name: "Par défaut", file: "page/titled/default.html.twig"}

11
config/packages/knp.yaml Normal file
View file

@ -0,0 +1,11 @@
knp_paginator:
page_range: 4
default_options:
page_name: page # page query parameter name
sort_field_name: sort # sort field query parameter name
sort_direction_name: direction # sort direction query parameter name
distinct: true # ensure distinct results, useful when ORM queries are using GROUP BY statements
template:
pagination: '@Core/pager/sliding.html.twig' # sliding pagination controls template
sortable: '@KnpPaginator/Pagination/sortable_link.html.twig' # sort link template
filtration: '@KnpPaginator/Pagination/filtration.html.twig' # filters template

View file

@ -1,5 +1,5 @@
framework:
default_locale: en
default_locale: fr
translator:
default_path: '%kernel.project_dir%/translations'
paths:

View file

@ -47,8 +47,16 @@ services:
calls:
- [ setAnnotationReader, [ "@annotation_reader" ] ]
App\UrlGenerator\FooUrlGenerator:
App\UrlGenerator\PostGenerator:
public: true
App\Markdown\Parser\Post:
tags:
- {name: markdown.parser, alias: post}
App\Markdown\Parser\Comment:
tags:
- {name: markdown.parser, alias: comment}
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones

View file

@ -0,0 +1,51 @@
<?php
namespace App\Core\Cache;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\KernelInterface;
/**
* class SymfonyCacheManager.
*
* @author Simon Vieille <simon@deblan.fr>
*/
class SymfonyCacheManager
{
protected KernelInterface $kernel;
public function __construct(KernelInterface $kernel)
{
$this->kernel = $kernel;
}
public function cleanRouting()
{
$finder = new Finder();
$finder
->in($this->kernel->getCacheDir())
->depth('== 0')
->name('url_*.php*')
;
foreach ($finder as $file) {
unlink((string) $file->getPathname());
}
}
public function cleanAll()
{
$application = new Application($this->kernel);
$application->setAutoExit(false);
$input = new ArrayInput([
'command' => 'cache:clear',
]);
$output = new BufferedOutput();
$application->run($input, $output);
}
}

View file

@ -19,13 +19,13 @@ class PageController extends AbstractController
$this->siteStore = $siteStore;
}
public function show(Request $request, SiteRequest $siteRequest): Response
public function show(): Response
{
if (!$siteRequest->getPage()) {
if (!$this->siteRequest->getPage()) {
throw $this->createNotFoundException();
}
return $this->defaultRender($siteRequest->getPage()->getTemplate());
return $this->defaultRender($this->siteRequest->getPage()->getTemplate());
}
protected function defaultRender(string $view, array $parameters = [], Response $response = null): Response

View file

@ -53,7 +53,7 @@ class PasswordRequestEventSubscriber implements EventSubscriberInterface
$this->entityManager->update($user);
$this->notifier
->setSubject($translator->trans('Mot de passe perdu'))
->setSubject($this->translator->trans('Mot de passe perdu'))
->addRecipient($user->getEmail())
->notify('@Core/mail/account/resetting_request.html.twig', [
'reseting_update_link' => $this->urlGenerator->generate(

View file

@ -10,6 +10,7 @@ use App\Core\Factory\Site\NodeFactory;
use App\Core\Manager\EntityManager;
use App\Core\Repository\Site\NodeRepository;
use App\Core\Slugify\CodeSlugify;
use App\Core\Cache\SymfonyCacheManager;
/**
* class MenuEventSubscriber.
@ -22,17 +23,20 @@ class MenuEventSubscriber extends EntityManagerEventSubscriber
protected NodeRepository $nodeRepository;
protected EntityManager $entityManager;
protected CodeSlugify $slugify;
protected SymfonyCacheManager $cacheManager;
public function __construct(
NodeFactory $nodeFactory,
NodeRepository $nodeRepository,
EntityManager $entityManager,
CodeSlugify $slugify
CodeSlugify $slugify,
SymfonyCacheManager $cacheManager
) {
$this->nodeFactory = $nodeFactory;
$this->nodeRepository = $nodeRepository;
$this->entityManager = $entityManager;
$this->slugify = $slugify;
$this->cacheManager = $cacheManager;
}
public function support(EntityInterface $entity)
@ -58,11 +62,16 @@ class MenuEventSubscriber extends EntityManagerEventSubscriber
$menu = $event->getEntity();
if (0 !== count($menu->getNodes())) {
if (count($menu->getNodes()) > 2) {
return;
}
$rootNode = $this->nodeFactory->create($menu);
$rootNode = $menu->getRootNode();
if (!$rootNode) {
$rootNode = $this->nodeFactory->create($menu);
}
$childNode = $this->nodeFactory->create($menu, '/');
$childNode
->setParent($rootNode)
@ -78,6 +87,8 @@ class MenuEventSubscriber extends EntityManagerEventSubscriber
$this->entityManager->flush();
$this->nodeRepository->persistAsFirstChild($childNode, $rootNode);
$this->cacheManager->cleanAll();
}
public function onUpdate(EntityManagerEvent $event)

View file

@ -13,6 +13,7 @@ use App\Core\Slugify\CodeSlugify;
use App\Core\Slugify\RouteParameterSlugify;
use App\Core\Slugify\Slugify;
use Symfony\Component\HttpKernel\KernelInterface;
use function Symfony\Component\String\u;
/**
* class NodeEventSubscriber.
@ -83,11 +84,13 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber
}
$parameters = $node->getParameters();
$routeParameters = [];
foreach ($parameters as $key => $parameter) {
$parameter['name'] = $this->routeParameterSlugify->slugify($parameter['name']);
$routeParameter = sprintf('{%s}', $parameter['name']);
$regex = '/'.preg_quote($routeParameter).'/';
$routeParameters[] = $parameter['name'];
if (!preg_match($regex, $generatedUrl)) {
$generatedUrl .= '/'.$routeParameter;
@ -96,6 +99,22 @@ class NodeEventSubscriber extends EntityManagerEventSubscriber
$parameters[$key] = $parameter;
}
preg_match_all('/\{(.*)\}/isU', $generatedUrl, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
if (!in_array($match[1], $routeParameters)) {
$parameters[] = [
'name' => $this->routeParameterSlugify->slugify($match[1]),
'defaultValue' => null,
'requirement' => null,
];
}
}
if (!u($generatedUrl)->startsWith('https://') && !u($generatedUrl)->startsWith('http://')) {
$generatedUrl = str_replace('//', '/', $generatedUrl);
}
$node->setParameters($parameters);
$attributes = $node->getAttributes();

View file

@ -8,10 +8,9 @@ use App\Core\Entity\Site\Navigation;
use App\Core\Entity\Site\Node;
use App\Core\Event\EntityManager\EntityManagerEvent;
use App\Core\EventSuscriber\EntityManagerEventSubscriber;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\KernelInterface;
use App\Core\Cache\SymfonyCacheManager;
/**
* class SiteEventSubscriber.
@ -21,10 +20,12 @@ use Symfony\Component\HttpKernel\KernelInterface;
class SiteEventSubscriber extends EntityManagerEventSubscriber
{
protected KernelInterface $kernel;
protected SymfonyCacheManager $cacheManager;
public function __construct(KernelInterface $kernel)
public function __construct(KernelInterface $kernel, SymfonyCacheManager $cacheManager)
{
$this->kernel = $kernel;
$this->cacheManager = $cacheManager;
}
public function support(EntityInterface $entity)
@ -38,7 +39,11 @@ class SiteEventSubscriber extends EntityManagerEventSubscriber
return;
}
$this->cleanCache();
if ($event->getEntity() instanceof Node) {
$this->cacheManager->cleanRouting();
} else {
$this->cacheManager->cleanAll();
}
}
public function onCreate(EntityManagerEvent $event)
@ -50,17 +55,4 @@ class SiteEventSubscriber extends EntityManagerEventSubscriber
{
return $this->onUpdate($event);
}
protected function cleanCache()
{
$application = new Application($this->kernel);
$application->setAutoExit(false);
$input = new ArrayInput([
'command' => 'cache:clear',
]);
$output = new BufferedOutput();
$application->run($input, $output);
}
}

View file

@ -67,7 +67,7 @@
"New parameter": "Nouveau paramètre"
"New attribut": "Nouveau attribut"
"New menu": "Nouveau menu"
"New": "Nouveau menu"
"New": "Nouveau"
"No action": "Aucune action"
"Route name: <code>%routeName%</code>": "Nom de la route : <code>%routeName%</code>"
"Content": "Contenu"
@ -120,3 +120,4 @@
"Enter your account username or email address. An e-mail will be sent to you to initiate the password change procedure. ": "Saisissez le nom d'utilisateur ou l'adresse e-mail de votre compte. Un e-mail vous sera envoyé pour enclancher la procédure de changement de mot de passe."
"Show the login page": "Afficher la page de connexion"
"A password reset request has been made. If you are the source of this request, click on the link below or copy and paste the address if the link does not work.": "Une demande de réinitialisation de mot de passe a été réalisée. Si vous êtes à l'origine de cette demande, cliquer sur le lien ci-dessous ou copier et coller l'adresse si le lien ne fonctionne pas."
"Edit the routing": "Éditez le routage"

View file

@ -6,7 +6,7 @@
{% set value = form.vars.data %}
{% if value %}
{% if value and value.extension in ['jpg', 'gif', 'png'] %}
{% if value and value.extension in ['jpeg', 'jpg', 'gif', 'png'] %}
<div class="card">
<div class="card-img-top bg-dark text-center">
<a href="{{ asset(value.pathname) }}" target="_blank">

View file

@ -0,0 +1,76 @@
{% if pageCount > 1 %}
<ul class="pagination pagination-sm justify-content-end">
{% if previous is defined %}
<li class="page-item">
<a rel="prev" href="{{ path(route, query|merge({(pageParameterName): previous})) }}" class="page-link">
<span class="fa fa-chevron-left"></span>
</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link">
<span class="fa fa-chevron-left"></span>
</span>
</li>
{% endif %}
{% if startPage > 1 %}
<li class="page-item">
<a href="{{ path(route, query|merge({(pageParameterName): 1})) }}" class="page-link">1</a>
</li>
{% if startPage == 3 %}
<li class="page-item">
<a href="{{ path(route, query|merge({(pageParameterName): 2})) }}" class="page-link">2</a>
</li>
{% elseif startPage != 2 %}
<li class="page-item disabled">
<span class="page-link">&hellip;</span>
</li>
{% endif %}
{% endif %}
{% for page in pagesInRange %}
{% if page != current %}
<li class="page-item">
<a href="{{ path(route, query|merge({(pageParameterName): page})) }}" class="page-link">{{ page }}</a>
</li>
{% else %}
<li class="active page-item">
<span class="page-link">{{ page }}</span>
</li>
{% endif %}
{% endfor %}
{% if pageCount > endPage %}
{% if pageCount > (endPage + 1) %}
{% if pageCount > (endPage + 2) %}
<li class="page-item disabled">
<span class="page-link">&hellip;</span>
</li>
{% else %}
<li class="page-item">
<a href="{{ path(route, query|merge({(pageParameterName): (pageCount - 1)})) }}" class="page-link">{{ pageCount -1 }}</a>
</li>
{% endif %}
{% endif %}
<li>
<a href="{{ path(route, query|merge({(pageParameterName): pageCount})) }}" class="page-link">{{ pageCount }}</a>
</li>
{% endif %}
{% if next is defined %}
<li class="page-item">
<a rel="next" class="page-link" href="{{ path(route, query|merge({(pageParameterName): next})) }}">
<span class="fa fa-chevron-right"></span>
</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link">
<span class="fa fa-chevron-right"></span>
</span>
</li>
{% endif %}
</ul>
{% endif %}

View file

@ -1,7 +1,7 @@
{% extends '@Core/admin/layout.html.twig' %}
{% block body %}
<div class="bg-light pl-5 pr-4 pt-5 {% if pager.getPaginationData.pageCount < 2 %}pb-5{% endif %}">
<div class="bg-light pl-5 pr-4 pt-5 {% if pager.paginationData.pageCount < 2 %}pb-5{% endif %}">
<div class="d-flex">
<div class="mr-auto w-50">
<h1 class="display-5">

View file

@ -1,7 +1,7 @@
{% extends '@Core/admin/layout.html.twig' %}
{% block body %}
<div class="bg-light pl-5 pr-4 pt-5 {% if pager.getPaginationData.pageCount < 2 %}pb-5{% endif %}">
<div class="bg-light pl-5 pr-4 pt-5 {% if pager.paginationData.pageCount < 2 %}pb-5{% endif %}">
<div class="d-flex">
<div class="mr-auto w-50">
<h1 class="display-5">{{ 'Pages'|trans }}</h1>

View file

@ -113,10 +113,8 @@
<span class="ml-3 btn-group">
{% if node.hasExternalUrl %}
<a href="{{ node.url }}" class="btn btn-sm border border-secondary btn-light">
<a href="{{ safe_node_url(node) }}" class="btn btn-sm border border-secondary btn-light">
<span class="fa fa-sign-out-alt text-muted"></span>
{{ node.url }}
</a>
{% else %}
{% if node.parameters|length %}
@ -124,9 +122,19 @@
{{ node.url }}
</span>
{% else %}
<a href="{{ url(node.routeName) }}" target="_blank" class="btn btn-sm border border-secondary btn-light">
{{ node.url }}
</a>
{% set url = safe_node_url(node) %}
{% if url %}
<a href="{{ url ? url : '#' }}" target="_blank" class="btn btn-sm border border-secondary btn-light">
{{ node.url }}
</a>
{% endif %}
{% if url is same as(null) %}
<span class="btn btn-sm border border-secondary btn-light" title="{{ 'Edit the routing'|trans }}">
<span class="fa fa-exclamation"></span>
</span>
{% endif %}
{% endif %}
{% if node.controller %}

View file

@ -1,7 +1,7 @@
{% extends '@Core/admin/layout.html.twig' %}
{% block body %}
<div class="bg-light pl-5 pr-4 pt-5 {% if pager.getPaginationData.pageCount < 2 %}pb-5{% endif %}">
<div class="bg-light pl-5 pr-4 pt-5 {% if pager.paginationData.pageCount < 2 %}pb-5{% endif %}">
<div class="d-flex">
<div class="mr-auto w-50">
<h1 class="display-5">{{ 'Users'|trans }}</h1>

View file

@ -39,6 +39,10 @@ class SiteRouteLoader extends Loader
continue;
}
if (null === $node->getUrl()) {
continue;
}
if ($node->hasExternalUrl()) {
continue;
}

View file

@ -38,10 +38,6 @@ class SitemapBuilder
foreach ($rootNode->getAllChildren() as $node) {
$parameters = $node->getSitemapParameters();
if (!$parameters['isVisible']) {
continue;
}
if ($node->hasExternalUrl()) {
continue;
}

View file

@ -0,0 +1,125 @@
<?php
namespace App\Core\Twig\Extension;
use App\Core\Entity\Site\Node;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Twig\Extension\AbstractExtension;
use Twig\Node\Expression\ArrayExpression;
use Twig\Node\Expression\ConstantExpression;
use Twig\Node\Node as TwigNode;
use Twig\TwigFunction;
class RoutingExtension extends AbstractExtension
{
private UrlGeneratorInterface $generator;
public function __construct(UrlGeneratorInterface $generator)
{
$this->generator = $generator;
}
/**
* {@inheritdoc}
*/
public function getFunctions(): array
{
return [
new TwigFunction('node_url', [$this, 'getNodeUrl'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]),
new TwigFunction('node_path', [$this, 'getNodePath'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]),
new TwigFunction('safe_node_url', [$this, 'getSafeNodeUrl'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]),
new TwigFunction('safe_node_path', [$this, 'getSafeNodePath'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]),
new TwigFunction('safe_url', [$this, 'getSafeUrl'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]),
new TwigFunction('safe_path', [$this, 'getSafePath'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]),
];
}
public function getSafePath(string $route, array $parameters = [], bool $relative = false): ?string
{
try {
return $this->generator->generate(
$route,
$parameters,
$relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH
);
} catch (\Exception $e) {
return null;
}
}
public function getSafeUrl(string $route, array $parameters = [], bool $schemeRelative = false): ?string
{
try {
return $this->generator->generate(
$route,
$parameters,
$schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL
);
} catch (\Exception $e) {
return null;
}
}
public function getNodePath(Node $node, array $parameters = [], bool $relative = false): ?string
{
if ($node->hasExternalUrl()) {
return $node->getUrl();
}
return $this->generator->generate(
$node->getRouteName(),
$parameters,
$relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH
);
}
public function getNodeUrl(Node $node, array $parameters = [], bool $schemeRelative = false): ?string
{
if ($node->hasExternalUrl()) {
return $node->getUrl();
}
return $this->generator->generate(
$node->getRouteName(),
$parameters,
$schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL
);
}
public function getSafeNodePath(Node $node, array $parameters = [], bool $relative = false): ?string
{
try {
return $this->getNodePath($node, $parameters, $relative);
} catch (\Exception $e) {
return null;
}
}
public function getSafeNodeUrl(Node $node, array $parameters = [], bool $schemeRelative = false): ?string
{
try {
return $this->getNodeUrl($node, $parameters, $schemeRelative);
} catch (\Exception $e) {
return null;
}
}
/**
* @see Symfony\Bridge\Twig\Extension\RoutingExtension::isUrlGenerationSafe
*/
public function isUrlGenerationSafe(TwigNode $argsNode): array
{
// support named arguments
$paramsNode = $argsNode->hasNode('parameters') ? $argsNode->getNode('parameters') : (
$argsNode->hasNode(1) ? $argsNode->getNode(1) : null
);
if (null === $paramsNode || $paramsNode instanceof ArrayExpression && \count($paramsNode) <= 2 &&
(!$paramsNode->hasNode(1) || $paramsNode->getNode(1) instanceof ConstantExpression)
) {
return ['html'];
}
return [];
}
}

View file

@ -23,10 +23,13 @@
"bootstrap": "^4.3.1",
"choices.js": "^9.0.1",
"jquery": "^3.6.0",
"particles.js": "^2.0.0",
"popper.js": "^1.16.0",
"qrcodejs": "^1.0.0",
"simplemde": "^1.11.2",
"tinymce": "^5.7.1",
"vanillajs-datepicker": "^1.1.2",
"wire.css": "^1.2.5",
"zxcvbn": "^4.4.2"
}
}

View file

@ -0,0 +1,110 @@
<?php
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use App\Core\Manager\EntityManager;
use App\Entity\Blog\Category;
use App\Entity\Blog\Comment;
use App\Entity\Blog\Post;
class MigrateDataCommand extends Command
{
protected static $defaultName = 'app:migrate-data';
protected static $defaultDescription = '';
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
parent::__construct();
}
protected function configure()
{
$this
->setDescription(self::$defaultDescription)
// ->addArgument('arg1', InputArgument::OPTIONAL, 'Argument description')
// ->addOption('option1', null, InputOption::VALUE_NONE, 'Option description')
;
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
require 'data/category.php';
require 'data/comment.php';
require 'data/post.php';
require 'data/post_has_category.php';
$categories = [];
$posts = [];
$comments = [];
foreach ($oldCategories as $v) {
$category = new Category();
$category->id = (int) $v['id'];
$category->setTitle($v['title']);
$category->setSubTitle(null);
$category->setDescription($v['description'] ?? '');
$category->setIsActive((bool) $v['active']);
$categories[$category->id] = $category;
$this->entityManager->create($category);
}
foreach ($oldPosts as $v) {
$post = new Post();
$post->id = (int) $v['id'];
$post->setTitle($v['title']);
$post->setContent(str_replace("\r\n", "\n", $v['content']));
$post->setContentFormat($v['content_format']);
$post->setTags(explode(',', str_replace(', ', ',', $v['tags'])));
$post->setStatus((int) $v['active']);
$post->setImage($v['picture'] ? ('uploads/posts/2007-2021/'.$v['picture']) : null);
$post->setCreatedAt(new \DateTime($v['created_at']));
$post->setPublishedAt($v['published_at'] ? new \DateTime($v['published_at']) : null);
$post->setIsQuick((int) $v['quick']);
$post->setQuickUrl($v['quick_url']);
$post->setQuickImage($v['quick_image']);
$post->setQuickVideo($v['quick_video']);
$post->setQuickVideoWidth($v['quick_video_width']);
$post->setQuickVideoHeight($v['quick_video_height']);
$post->setSlug($v['slug']);
$posts[$post->id] = $post;
$this->entityManager->create($post);
}
foreach ($post_has_category as $v) {
$posts[(int) $v['post_id']]->addCategory($categories[(int) $v['category_id']]);
$this->entityManager->update($posts[(int) $v['post_id']]);
}
foreach ($oldComments as $v) {
$comment = new Comment();
$comment->id = (int) $v['id'];
$comment->setPost($posts[(int) $v['post_id']]);
$comment->setParentComment($comments[(int) $v['parent_comment_id']] ?? null);
$comment->setAuthor($v['author']);
$comment->setWebsite($v['website']);
$comment->setEmail($v['email']);
$comment->setContent(str_replace("\r\n", "\n", $v['content']));
$comment->setIsActive((bool) $v['active']);
$comment->setCreatedAt(new \DateTime($v['created_at']));
$comments[$comment->id] = $comment;
$this->entityManager->create($comment);
}
return Command::SUCCESS;
}
}

View file

@ -0,0 +1,124 @@
<?php
namespace App\Controller\Blog;
use App\Core\Controller\Admin\AdminController;
use App\Core\Manager\EntityManager;
use App\Entity\Blog\Category as Entity;
use App\Factory\Blog\CategoryFactory as EntityFactory;
use App\Form\Blog\CategoryType as EntityType;
use App\Repository\Blog\CategoryRepositoryQuery as RepositoryQuery;
use App\Repository\Blog\PostRepositoryQuery;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/admin/blog/category")
*/
class CategoryAdminController extends AdminController
{
/**
* @Route("/{page}", name="admin_blog_category_index", requirements={"page": "\d+"})
*/
public function index(int $page = 1, RepositoryQuery $query, Request $request): Response
{
$pager = $query->paginate($page);
return $this->render('blog/category_admin/index.html.twig', [
'pager' => $pager,
]);
}
/**
* @Route("/new", name="admin_blog_category_new")
*/
public function new(EntityFactory $factory, EntityManager $entityManager, Request $request): Response
{
$entity = $factory->create();
$form = $this->createForm(EntityType::class, $entity);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid()) {
$entityManager->create($entity);
$this->addFlash('success', 'Donnée enregistrée.');
return $this->redirectToRoute('admin_blog_category_edit', [
'entity' => $entity->getId(),
]);
}
$this->addFlash('warning', 'Le formulaire est invalide.');
}
return $this->render('blog/category_admin/new.html.twig', [
'form' => $form->createView(),
'entity' => $entity,
]);
}
/**
* @Route("/edit/{entity}", name="admin_blog_category_edit")
*/
public function edit(Entity $entity, EntityManager $entityManager, Request $request): Response
{
$form = $this->createForm(EntityType::class, $entity);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid()) {
$entityManager->update($entity);
$this->addFlash('success', 'Donnée enregistrée.');
return $this->redirectToRoute('admin_blog_category_edit', [
'entity' => $entity->getId(),
]);
}
$this->addFlash('warning', 'Le formulaire est invalide.');
}
return $this->render('blog/category_admin/edit.html.twig', [
'form' => $form->createView(),
'entity' => $entity,
]);
}
/**
* @Route("/show/{entity}", name="admin_blog_category_show")
*/
public function show(Entity $entity, PostRepositoryQuery $postQuery): Response
{
$posts = $postQuery->create()
->orderBy('.publishedAt', 'DESC')
->orderBy('.createdAt', 'DESC')
->inCategory($entity)
->paginate(1, 10)
;
return $this->render('blog/category_admin/show.html.twig', [
'entity' => $entity,
'posts' => $posts,
]);
}
/**
* @Route("/delete/{entity}", name="admin_blog_category_delete", methods={"DELETE"})
*/
public function delete(Entity $entity, EntityManager $entityManager, Request $request): Response
{
if ($this->isCsrfTokenValid('delete'.$entity->getId(), $request->request->get('_token'))) {
$entityManager->delete($entity);
$this->addFlash('success', 'Données supprimée..');
}
return $this->redirectToRoute('admin_blog_category_index');
}
public function getSection(): string
{
return 'blog_category';
}
}

View file

@ -0,0 +1,42 @@
<?php
namespace App\Controller\Blog;
use App\Core\Annotation\UrlGenerator;
use App\Core\Controller\Site\PageController;
use App\Core\Site\SiteRequest;
use App\Entity\Blog\Category;
use App\Entity\Blog\Post;
use App\Repository\Blog\CategoryRepositoryQuery;
use App\UrlGenerator\PostGenerator;
use Symfony\Component\HttpFoundation\Response;
use App\Core\Site\SiteStore;
class CategoryController extends PageController
{
protected CategoryRepositoryQuery $categoryQuery;
public function __construct(CategoryRepositoryQuery $categoryQuery, SiteRequest $siteRequest, SiteStore $siteStore)
{
parent::__construct($siteRequest, $siteStore);
$this->categoryQuery = $categoryQuery;
}
public function categories(): Response
{
$entities = $this->createQuery()->find();
return $this->defaultRender('blog/post/categories.html.twig', [
'categories' => $entities,
]);
}
public function createQuery(): CategoryRepositoryQuery
{
return $this->categoryQuery->create()
->orderBy('.title', 'ASC')
->andWhere('.isActive = 1')
;
}
}

View file

@ -0,0 +1,176 @@
<?php
namespace App\Controller\Blog;
use App\Core\Controller\Admin\AdminController;
use App\Core\Form\FileUploadHandler;
use App\Core\Manager\EntityManager;
use App\Entity\Blog\Post as Entity;
use App\Factory\Blog\PostFactory as EntityFactory;
use App\Form\Blog\PostType as EntityType;
use App\Repository\Blog\PostRepositoryQuery as RepositoryQuery;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
use App\Form\Blog\Filter\PostFilterType;
use Symfony\Component\HttpFoundation\Session\Session;
/**
* @Route("/admin/blog/post")
*/
class PostAdminController extends AdminController
{
protected $filters = [];
/**
* @Route("/{page}", name="admin_blog_post_index", requirements={"page": "\d+"})
*/
public function index(int $page = 1, RepositoryQuery $query, Request $request, Session $session): Response
{
$this->updateFilters($request, $session);
$pager = $query
->orderBy('.id', 'DESC')
->useFilters($this->filters)
->paginate($page);
return $this->render('blog/post_admin/index.html.twig', [
'pager' => $pager,
'hasFilters' => !empty($this->filters),
]);
}
/**
* @Route("/new", name="admin_blog_post_new")
*/
public function new(EntityFactory $factory, EntityManager $entityManager, Request $request): Response
{
$entity = $factory->create($this->getUser());
$form = $this->createForm(EntityType::class, $entity);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid()) {
$entityManager->create($entity);
$this->addFlash('success', 'The data has been saved.');
return $this->redirectToRoute('admin_blog_post_edit', [
'entity' => $entity->getId(),
]);
}
$this->addFlash('warning', 'The form is not valid.');
}
return $this->render('blog/post_admin/new.html.twig', [
'form' => $form->createView(),
'entity' => $entity,
]);
}
/**
* @Route("/edit/{entity}", name="admin_blog_post_edit")
*/
public function edit(Entity $entity, EntityManager $entityManager, FileUploadHandler $fileUpload, Request $request): Response
{
$form = $this->createForm(EntityType::class, $entity);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid()) {
$directory = 'uploads/post/'.date('Y');
$fileUpload->handleForm(
$form->get('image')->getData(),
$directory,
function ($filename) use ($entity, $directory) {
$entity->setImage($directory.'/'.$filename);
}
);
$entityManager->update($entity);
$this->addFlash('success', 'The form is not valid.');
return $this->redirectToRoute('admin_blog_post_edit', [
'entity' => $entity->getId(),
]);
}
$this->addFlash('warning', 'The form is not valid.');
}
return $this->render('blog/post_admin/edit.html.twig', [
'form' => $form->createView(),
'entity' => $entity,
]);
}
/**
* @Route("/show/{entity}", name="admin_blog_post_show")
*/
public function show(Entity $entity): Response
{
return $this->render('blog/post_admin/show.html.twig', [
'entity' => $entity,
]);
}
/**
* @Route("/filters", name="admin_blog_post_filters")
*/
public function filters(Session $session): Response
{
$form = $this->createForm(PostFilterType::class);
$form->submit($session->get('post_filter'));
return $this->render('blog/post_admin/filters.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/delete/{entity}", name="admin_blog_post_delete", methods={"DELETE"})
*/
public function delete(Entity $entity, EntityManager $entityManager, Request $request): Response
{
if ($this->isCsrfTokenValid('delete'.$entity->getId(), $request->request->get('_token'))) {
$entityManager->delete($entity);
$this->addFlash('success', 'The data has been removed.');
}
return $this->redirectToRoute('admin_blog_post_index');
}
protected function updateFilters(Request $request, Session $session)
{
if ($request->query->has('post_filter')) {
$filters = $request->query->get('post_filter');
if ($filters === '0') {
$filters = [];
}
} elseif ($session->has('post_filter')) {
$filters = $session->get('post_filter');
} else {
$filters = [];
}
$form = $this->createForm(PostFilterType::class);
$form->submit($filters);
if (empty($filters)) {
$this->filters = $filters;
$session->set('post_filter', $this->filters);
} elseif ($form->isValid()) {
$this->filters = $form->getData();
$session->set('post_filter', $this->filters);
}
}
public function getSection(): string
{
return 'blog_post';
}
}

View file

@ -0,0 +1,102 @@
<?php
namespace App\Controller\Blog;
use App\Core\Annotation\UrlGenerator;
use App\Core\Controller\Site\PageController;
use App\Core\Site\SiteRequest;
use App\Entity\Blog\Category;
use App\Entity\Blog\Post;
use App\Repository\Blog\PostRepositoryQuery;
use App\UrlGenerator\PostGenerator;
use Symfony\Component\HttpFoundation\Response;
use App\Core\Site\SiteStore;
class PostController extends PageController
{
protected PostRepositoryQuery $postQuery;
public function __construct(PostRepositoryQuery $postQuery, SiteRequest $siteRequest, SiteStore $siteStore)
{
parent::__construct($siteRequest, $siteStore);
$this->postQuery = $postQuery;
}
/**
* @UrlGenerator(service=PostGenerator::class, method="post")
*/
public function post(Post $post, string $slug): Response
{
if (Post::DRAFT === $post->getStatus() && !$this->getUser()) {
throw $this->createNotFoundException();
}
if ($slug !== $post->getSlug()) {
return $this->redirectToRoute(
$this->siteRequest->getNode()->getRouteName(),
[
'post' => $post->getId(),
'slug' => $post->getSlug(),
]
);
}
return $this->defaultRender('blog/post/post.html.twig', [
'post' => $post,
]);
}
public function posts(int $page = 1): Response
{
$entities = $this->createQuery()
->paginate($page, 5)
;
return $this->defaultRender('blog/post/posts.html.twig', [
'pager' => $entities,
]);
}
/**
* @UrlGenerator(service=PostGenerator::class, method="category")
*/
public function category(Category $category, string $slug, int $page = 1): Response
{
$entities = $this->createQuery()
->inCategory($category)
->paginate($page, 5)
;
if (!$category->getIsActive() && !$this->getUser()) {
throw $this->createNotFoundException();
}
if ($slug !== $category->getSlug()) {
return $this->redirectToRoute(
$this->siteRequest->getNode()->getRouteName(),
[
'category' => $category->getId(),
'slug' => $category->getSlug(),
]
);
}
return $this->defaultRender('blog/post/category.html.twig', [
'category' => $category,
'pager' => $entities,
]);
}
public function tag(string $tag, int $page = 1): Response
{
}
public function createQuery(): PostRepositoryQuery
{
return $this->postQuery->create()
->orderBy('.publishedAt', 'DESC')
->published()
;
}
}

View file

@ -0,0 +1,17 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Core\Controller\Site\PageController;
class ContactController extends PageController
{
public function contact(): Response
{
return $this->defaultRender($this->siteRequest->getPage()->getTemplate(), [
]);
}
}

View file

@ -0,0 +1,153 @@
<?php
namespace App\Entity\Blog;
use App\Core\Doctrine\Timestampable;
use App\Core\Entity\EntityInterface;
use App\Repository\Blog\CategoryRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=CategoryRepository::class)
* @ORM\HasLifecycleCallbacks
*/
class Category implements EntityInterface
{
use Timestampable;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $title;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $subTitle;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $description;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $slug;
/**
* @ORM\ManyToMany(targetEntity=Post::class, mappedBy="categories")
*/
private $posts;
/**
* @ORM\Column(type="boolean", options={"default"=1})
*/
private $isActive;
public function __construct()
{
$this->posts = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getSubTitle(): ?string
{
return $this->subTitle;
}
public function setSubTitle(?string $subTitle): self
{
$this->subTitle = $subTitle;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(string $description): self
{
$this->description = $description;
return $this;
}
public function getSlug(): ?string
{
return $this->slug;
}
public function setSlug(?string $slug): self
{
$this->slug = $slug;
return $this;
}
/**
* @return Collection|Post[]
*/
public function getPosts(): Collection
{
return $this->posts;
}
public function addPost(Post $post): self
{
if (!$this->posts->contains($post)) {
$this->posts[] = $post;
$post->addCategory($this);
}
return $this;
}
public function removePost(Post $post): self
{
if ($this->posts->removeElement($post)) {
$post->removeCategory($this);
}
return $this;
}
public function getIsActive(): ?bool
{
return $this->isActive;
}
public function setIsActive(?bool $isActive): self
{
$this->isActive = $isActive;
return $this;
}
}

190
src/Entity/Blog/Comment.php Normal file
View file

@ -0,0 +1,190 @@
<?php
namespace App\Entity\Blog;
use App\Core\Doctrine\Timestampable;
use App\Repository\Blog\CommentRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use App\Core\Entity\EntityInterface;
/**
* @ORM\Entity(repositoryClass=CommentRepository::class)
*/
class Comment implements EntityInterface
{
use Timestampable;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $author;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $website;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $email;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $content;
/**
* @ORM\Column(type="boolean")
*/
private $isActive;
/**
* @ORM\ManyToOne(targetEntity=Post::class, inversedBy="comments")
* @ORM\JoinColumn(nullable=false)
*/
private $post;
/**
* @ORM\ManyToOne(targetEntity=Comment::class, inversedBy="comments")
*/
private $parentComment;
/**
* @ORM\OneToMany(targetEntity=Comment::class, mappedBy="parentComment")
*/
private $comments;
public function __construct()
{
$this->comments = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getAuthor(): ?string
{
return $this->author;
}
public function setAuthor(string $author): self
{
$this->author = $author;
return $this;
}
public function getWebsite(): ?string
{
return $this->website;
}
public function setWebsite(?string $website): self
{
$this->website = $website;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): self
{
$this->email = $email;
return $this;
}
public function getContent(): ?string
{
return $this->content;
}
public function setContent(?string $content): self
{
$this->content = $content;
return $this;
}
public function getIsActive(): ?bool
{
return $this->isActive;
}
public function setIsActive(bool $isActive): self
{
$this->isActive = $isActive;
return $this;
}
public function getPost(): ?Post
{
return $this->post;
}
public function setPost(?Post $post): self
{
$this->post = $post;
return $this;
}
public function getParentComment(): ?self
{
return $this->parentComment;
}
public function setParentComment(?self $parentComment): self
{
$this->parentComment = $parentComment;
return $this;
}
/**
* @return Collection|self[]
*/
public function getComments(): Collection
{
return $this->comments;
}
public function addComment(self $comment): self
{
if (!$this->comments->contains($comment)) {
$this->comments[] = $comment;
$comment->setParentComment($this);
}
return $this;
}
public function removeComment(self $comment): self
{
if ($this->comments->removeElement($comment)) {
// set the owning side to null (unless already changed)
if ($comment->getParentComment() === $this) {
$comment->setParentComment(null);
}
}
return $this;
}
}

368
src/Entity/Blog/Post.php Normal file
View file

@ -0,0 +1,368 @@
<?php
namespace App\Entity\Blog;
use App\Core\Doctrine\Timestampable;
use App\Core\Entity\EntityInterface;
use App\Entity\User;
use App\Repository\Blog\PostRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
/**
* @ORM\Entity(repositoryClass=PostRepository::class)
* @ORM\HasLifecycleCallbacks
*/
class Post implements EntityInterface
{
use Timestampable;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $title;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $content;
/**
* @ORM\Column(type="integer")
*/
private $status;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $slug;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $publishedAt;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $image;
/**
* @ORM\ManyToMany(targetEntity=Category::class, inversedBy="posts")
*/
private $categories;
/**
* @ORM\Column(type="string", length=20)
*/
private $contentFormat;
/**
* @ORM\Column(type="array", nullable=true)
*/
private $tags = [];
/**
* @ORM\Column(type="boolean", options={"default"=0})
*/
private $isQuick = false;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $quickUrl;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $quickImage;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $quickVideo;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $quickVideoWidth;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $quickVideoHeight;
/**
* @ORM\OneToMany(targetEntity=Comment::class, mappedBy="post", orphanRemoval=true)
*/
private $comments;
const DRAFT = 0;
const PUBLISHED = 1;
public function __construct()
{
$this->categories = new ArrayCollection();
$this->comments = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getContent(): ?string
{
return $this->content;
}
public function setContent(?string $content): self
{
$this->content = $content;
return $this;
}
public function getStatus(): ?int
{
return $this->status;
}
public function setStatus(int $status): self
{
$this->status = $status;
return $this;
}
public function getImage()
{
if (is_string($this->image)) {
if (file_exists($this->image)) {
return new File($this->image);
}
return null;
}
return $this->image;
}
public function setImage(?string $image, bool $force = false): self
{
if (false === $force && null === $image) {
return $this;
}
$this->image = $image;
return $this;
}
public function getSlug(): ?string
{
return $this->slug;
}
public function setSlug(?string $slug): self
{
$this->slug = $slug;
return $this;
}
public function getPublishedAt(): ?\DateTimeInterface
{
return $this->publishedAt;
}
public function setPublishedAt(?\DateTimeInterface $publishedAt): self
{
$this->publishedAt = $publishedAt;
return $this;
}
public function getImageCaption(): ?string
{
return $this->imageCaption;
}
public function setImageCaption(?string $imageCaption): self
{
$this->imageCaption = $imageCaption;
return $this;
}
/**
* @return Collection|Category[]
*/
public function getCategories(): Collection
{
return $this->categories;
}
public function addCategory(Category $category): self
{
if (!$this->categories->contains($category)) {
$this->categories[] = $category;
}
return $this;
}
public function removeCategory(Category $category): self
{
$this->categories->removeElement($category);
return $this;
}
public function getContentFormat(): ?string
{
return $this->contentFormat;
}
public function setContentFormat(string $contentFormat): self
{
$this->contentFormat = $contentFormat;
return $this;
}
public function getTags(): ?array
{
return $this->tags;
}
public function setTags(?array $tags): self
{
$this->tags = $tags;
return $this;
}
public function getIsQuick(): ?bool
{
return $this->isQuick;
}
public function setIsQuick(bool $isQuick): self
{
$this->isQuick = $isQuick;
return $this;
}
public function getQuickUrl(): ?string
{
return $this->quickUrl;
}
public function setQuickUrl(?string $quickUrl): self
{
$this->quickUrl = $quickUrl;
return $this;
}
public function getQuickImage(): ?string
{
return $this->quickImage;
}
public function setQuickImage(?string $quickImage): self
{
$this->quickImage = $quickImage;
return $this;
}
public function getQuickVideo(): ?string
{
return $this->quickVideo;
}
public function setQuickVideo(?string $quickVideo): self
{
$this->quickVideo = $quickVideo;
return $this;
}
public function getQuickVideoWidth(): ?int
{
return $this->quickVideoWidth;
}
public function setQuickVideoWidth(?int $quickVideoWidth): self
{
$this->quickVideoWidth = $quickVideoWidth;
return $this;
}
public function getQuickVideoHeight(): ?int
{
return $this->quickVideoHeight;
}
public function setQuickVideoHeight(?int $quickVideoHeight): self
{
$this->quickVideoHeight = $quickVideoHeight;
return $this;
}
/**
* @return Collection|Comment[]
*/
public function getComments(): Collection
{
return $this->comments;
}
public function addComment(Comment $comment): self
{
if (!$this->comments->contains($comment)) {
$this->comments[] = $comment;
$comment->setPost($this);
}
return $this;
}
public function removeComment(Comment $comment): self
{
if ($this->comments->removeElement($comment)) {
// set the owning side to null (unless already changed)
if ($comment->getPost() === $this) {
$comment->setPost(null);
}
}
return $this;
}
}

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