Merge remote-tracking branch 'origin/develop' tag1.1.7 into chapril
Conflicts: locale/fr.json
This commit is contained in:
commit
9a6784c6a6
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
.htaccess
|
.htaccess
|
||||||
|
.htdigest
|
||||||
.htpasswd
|
.htpasswd
|
||||||
admin/stdout.log
|
admin/stdout.log
|
||||||
composer.phar
|
composer.phar
|
||||||
@ -8,6 +9,8 @@ app/inc/config.php
|
|||||||
vendor
|
vendor
|
||||||
cache/
|
cache/
|
||||||
tpl_c/
|
tpl_c/
|
||||||
|
.php_cs.cache
|
||||||
|
.zanata-cache/
|
||||||
|
|
||||||
# Temp files
|
# Temp files
|
||||||
*~
|
*~
|
||||||
|
108
.gitlab-ci.yml
Normal file
108
.gitlab-ci.yml
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
image: framasoft/framadate-ci
|
||||||
|
stages:
|
||||||
|
- test
|
||||||
|
- deploy
|
||||||
|
- beta
|
||||||
|
- funky
|
||||||
|
|
||||||
|
# Run php-cs-fixer and phpunit on all branches
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- composer install -o --no-interaction --no-progress --prefer-dist
|
||||||
|
- mkdir tpl_c
|
||||||
|
- php vendor/bin/php-cs-fixer fix --verbose --dry-run
|
||||||
|
- vendor/bin/phpunit --bootstrap app/tests/bootstrap.php --debug app/tests
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- vendor/
|
||||||
|
|
||||||
|
check-trad:
|
||||||
|
stage: test
|
||||||
|
allow_failure: true
|
||||||
|
script:
|
||||||
|
- if [ -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then echo "*** Unable to check if translations need to be pulled, exiting ***"; exit 1; fi
|
||||||
|
- export ORIG=$(git diff-files --shortstat)
|
||||||
|
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi
|
||||||
|
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make push-locales; fi
|
||||||
|
- git status > /dev/null 2>&1
|
||||||
|
- export CHANGES=$(git diff-files --shortstat)
|
||||||
|
- if [[ $CHANGES != $ORIG ]]; then echo "*** There is changes in locales ***"; echo "*** You need to do `make pull-locales` in your repo ***"; exit 1; fi
|
||||||
|
only:
|
||||||
|
- develop
|
||||||
|
|
||||||
|
# Create artifacts on master
|
||||||
|
pages:
|
||||||
|
stage: deploy
|
||||||
|
script:
|
||||||
|
- latesttag=$(git describe --tags)
|
||||||
|
- git checkout ${latesttag}
|
||||||
|
- composer install -o --no-interaction --no-progress --prefer-dist --no-dev
|
||||||
|
- composer dump-autoload --optimize --no-dev --classmap-authoritative
|
||||||
|
- mkdir tpl_c
|
||||||
|
- mkdir framadate
|
||||||
|
- mv `ls -A | grep -v framadate` ./framadate
|
||||||
|
- chmod -R 644 framadate/ && chmod -R 770 framadate/tpl_c/ && chmod -R 770 framadate/app/inc/
|
||||||
|
- zip -r latest.zip framadate
|
||||||
|
- mkdir .public
|
||||||
|
- cp latest.zip .public
|
||||||
|
- mv .public public
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- public
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
|
except:
|
||||||
|
- (beta|alpha)
|
||||||
|
|
||||||
|
# Deploy on develop
|
||||||
|
beta:
|
||||||
|
stage: beta
|
||||||
|
script:
|
||||||
|
- git checkout develop
|
||||||
|
- composer install -o --no-interaction --no-progress --prefer-dist --no-dev
|
||||||
|
- composer dump-autoload --optimize --no-dev --classmap-authoritative
|
||||||
|
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi
|
||||||
|
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make pull-locales; fi
|
||||||
|
- mkdir tpl_c
|
||||||
|
- mkdir .public
|
||||||
|
- cp -r * .public
|
||||||
|
- cp -r .git .public
|
||||||
|
- mv .public public
|
||||||
|
- mkdir "${HOME}/.ssh"
|
||||||
|
- chmod 700 "${HOME}/.ssh"
|
||||||
|
- if [ ! -z ${DEPLOYEMENT_KNOWN_HOSTS+x} ]; then echo -e "${DEPLOYEMENT_KNOWN_HOSTS}" > ${HOME}/.ssh/known_hosts; fi
|
||||||
|
- eval `ssh-agent -s`
|
||||||
|
- if [ ! -z ${BETA_KEY+x} ]; then ssh-add <(echo "${BETA_KEY}" | base64 --decode -i); fi
|
||||||
|
- if [ ! -z ${BETA_KEY+x} ]; then rsync -a --delete --exclude admin/.stdout.log --exclude admin/.htpasswd --exclude app/inc/config.php --exclude stats/ --exclude error/ public/ ${BETA_USER}@${DEPLOYEMENT_HOST}:../../web/; fi
|
||||||
|
only:
|
||||||
|
- develop
|
||||||
|
|
||||||
|
# Deploy on funky
|
||||||
|
funky:
|
||||||
|
stage: funky
|
||||||
|
script:
|
||||||
|
- git checkout funky
|
||||||
|
- composer install
|
||||||
|
- mkdir tpl_c
|
||||||
|
- mkdir .public
|
||||||
|
- cp -r * .public
|
||||||
|
- mv .public public
|
||||||
|
- mkdir "${HOME}/.ssh"
|
||||||
|
- chmod 700 "${HOME}/.ssh"
|
||||||
|
- if [ ! -z ${DEPLOYEMENT_KNOWN_HOSTS+x} ]; then echo -e "${DEPLOYEMENT_KNOWN_HOSTS}" > ${HOME}/.ssh/known_hosts; fi
|
||||||
|
- eval `ssh-agent -s`
|
||||||
|
- if [ ! -z ${DEPLOYEMENT_KEY+x} ]; then ssh-add <(echo "${DEPLOYEMENT_KEY}" | base64 --decode -i); fi
|
||||||
|
- if [ ! -z ${DEPLOYEMENT_KEY+x} ]; then rsync -a --delete --exclude admin/.stdout.log --exclude admin/.htpasswd --exclude app/inc/config.php --exclude stats/ --exclude error/ public/ ${DEPLOYEMENT_USER}@${DEPLOYEMENT_HOST}:../../web/; fi
|
||||||
|
only:
|
||||||
|
- funky
|
||||||
|
|
||||||
|
# Push new translations strings to https://trad.framasoft.org
|
||||||
|
trads:
|
||||||
|
stage: deploy
|
||||||
|
image: framasoft/push-trad:latest
|
||||||
|
script:
|
||||||
|
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then mkdir -p ${HOME}/.config; echo -e "${ZANATA_CONFIG_FRAMABOT}" > ${HOME}/.config/zanata.ini; fi
|
||||||
|
- if [ ! -z ${ZANATA_CONFIG_FRAMABOT+x} ]; then make push-locales; fi
|
||||||
|
only:
|
||||||
|
- develop
|
45
.php_cs
Normal file
45
.php_cs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return PhpCsFixer\Config::create()
|
||||||
|
->setRiskyAllowed(true)
|
||||||
|
->setRules([
|
||||||
|
'array_syntax' => [
|
||||||
|
'syntax' => 'short'
|
||||||
|
],
|
||||||
|
'combine_consecutive_unsets' => true,
|
||||||
|
'heredoc_to_nowdoc' => true,
|
||||||
|
'no_extra_consecutive_blank_lines' => [
|
||||||
|
'break',
|
||||||
|
'continue',
|
||||||
|
'extra',
|
||||||
|
'return',
|
||||||
|
'throw',
|
||||||
|
'use',
|
||||||
|
'parenthesis_brace_block',
|
||||||
|
'square_brace_block',
|
||||||
|
'curly_brace_block'
|
||||||
|
],
|
||||||
|
'no_unreachable_default_argument_value' => true,
|
||||||
|
'no_useless_else' => true,
|
||||||
|
'no_useless_return' => true,
|
||||||
|
'ordered_class_elements' => true,
|
||||||
|
'ordered_imports' => true,
|
||||||
|
'php_unit_strict' => true,
|
||||||
|
'phpdoc_order' => true,
|
||||||
|
// 'psr4' => true,
|
||||||
|
'strict_comparison' => true,
|
||||||
|
'strict_param' => true,
|
||||||
|
'concat_space' => [
|
||||||
|
'spacing' => 'one'
|
||||||
|
],
|
||||||
|
])
|
||||||
|
->setFinder(
|
||||||
|
PhpCsFixer\Finder::create()
|
||||||
|
->exclude([
|
||||||
|
'vendor',
|
||||||
|
'var',
|
||||||
|
'web'
|
||||||
|
])
|
||||||
|
->in(__DIR__)
|
||||||
|
)
|
||||||
|
;
|
9
.po2json.sh
Executable file
9
.po2json.sh
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
po2json -i po/en.po -t locale/en.json --progress none -o po/default.json
|
||||||
|
|
||||||
|
for i in po/*.po
|
||||||
|
do
|
||||||
|
j=$(echo $i | cut -d '.' -f 1 | cut -d '/' -f 2)
|
||||||
|
po2json -i $i -t locale/en.json --progress none | ./.renest_json.pl > po/$j.json
|
||||||
|
mv po/$j.json locale/
|
||||||
|
done
|
40
.renest_json.pl
Executable file
40
.renest_json.pl
Executable file
@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use JSON;
|
||||||
|
|
||||||
|
my $json = JSON->new->utf8->space_before(0)->space_after(1)->indent(4)->canonical(1);
|
||||||
|
|
||||||
|
my $en_file = 'po/default.json';
|
||||||
|
my $en;
|
||||||
|
{
|
||||||
|
open my $fh, '<', $en_file or die;
|
||||||
|
local $/ = undef;
|
||||||
|
$en = <$fh>;
|
||||||
|
close $fh;
|
||||||
|
}
|
||||||
|
|
||||||
|
$en = $json->decode($en);
|
||||||
|
|
||||||
|
my $new_json = {};
|
||||||
|
my $old_json = '';
|
||||||
|
|
||||||
|
while (defined(my $line = <STDIN>)) {
|
||||||
|
$old_json .= $line;
|
||||||
|
}
|
||||||
|
|
||||||
|
$old_json = $json->decode($old_json);
|
||||||
|
for my $key (keys %{$old_json}) {
|
||||||
|
my $index = index($key, '.');
|
||||||
|
my $real_key = substr($key, 0, $index++);
|
||||||
|
my $trad_key = substr($key, $index);
|
||||||
|
|
||||||
|
if ($old_json->{$key}) {
|
||||||
|
$new_json->{$real_key}->{$trad_key} = $old_json->{$key};
|
||||||
|
} else {
|
||||||
|
$new_json->{$real_key}->{$trad_key} = $en->{$key};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print $json->encode($new_json);
|
83
INSTALL.md
83
INSTALL.md
@ -1,82 +1 @@
|
|||||||
# Pré-installation
|
# [Now available here](https://framagit.org/framasoft/framadate/wikis/home)
|
||||||
|
|
||||||
## Base de données
|
|
||||||
|
|
||||||
Framadate fonctionne indépendemment de la base SQL utilisée.
|
|
||||||
|
|
||||||
Cependant la base de donnée doit être créée au préalable,
|
|
||||||
après avoir renseigné les paramètres de la base de données, créez la.
|
|
||||||
|
|
||||||
### PostgreSQL
|
|
||||||
|
|
||||||
```bash
|
|
||||||
su - pgsql
|
|
||||||
createdb framadate
|
|
||||||
```
|
|
||||||
|
|
||||||
Attention : Si vous créez la base de données avec l'utilisateur "pgsql",
|
|
||||||
il vous faudra faire un "grant all on <chaque table> to `framadate`" pour donner les droits à l'utilisateur `framadate` de lire et modifier la base.
|
|
||||||
Les tables de l'applications sont décrites plus loin dans ce fichier dans la partie "Tables de la base de données".
|
|
||||||
|
|
||||||
### MySQL
|
|
||||||
|
|
||||||
```sql
|
|
||||||
-- Créer une base de données
|
|
||||||
CREATE DATABASE IF NOT EXISTS `framadate_db` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
|
|
||||||
|
|
||||||
-- Créer un utilisateur
|
|
||||||
CREATE USER 'framadate_user'@'localhost' IDENTIFIED BY '<password>';
|
|
||||||
GRANT ALL PRIVILEGES ON `framadate_db`.* TO 'framadate_user'@'localhost';
|
|
||||||
```
|
|
||||||
|
|
||||||
# Installation
|
|
||||||
|
|
||||||
Pour installer l'application Framadate, rendez-vous sur la page http://monsite/admin/install.php et remplisez le formulaire.
|
|
||||||
|
|
||||||
Une fois le formulaire rempli et envoyé, un script va générer le fichier `app/inc/config.php` puis vous rediriger vers la page de migration.
|
|
||||||
|
|
||||||
La page de migration s'occupe :
|
|
||||||
- D'installer toute la base de données (tables + données d'exemple)
|
|
||||||
- De mettre à jour la base de données lors des mises à jour de l'applciation.
|
|
||||||
|
|
||||||
! Attention, le chargement de la page de migration peu prendre du temps étant donné qu'elle applique toutes les mises à jours requises !
|
|
||||||
|
|
||||||
# Accès à la page administrateur
|
|
||||||
|
|
||||||
Le répertoire `admin/` fournit l'accès à certainnes actions et informations à protéger.
|
|
||||||
|
|
||||||
Il convient de mettre en place un couple de fichiers `.htaccess`/`.htpasswd`, pour restreindre l'accès à la page d'administration de l'application.
|
|
||||||
Il existe une multitude de tutoriels sur internet à ce sujet.
|
|
||||||
|
|
||||||
# Journal de l'application
|
|
||||||
|
|
||||||
Un fichier `admin/stdout.log` doit être créé et accessible en écriture
|
|
||||||
par votre serveur Web. Quelque chose comme devrait convenir:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
touch admin/stdout.log
|
|
||||||
chmod 700 admin/stdout.log
|
|
||||||
chown www-data admin/stdout.log
|
|
||||||
```
|
|
||||||
|
|
||||||
# Maintenance
|
|
||||||
|
|
||||||
Framadate dispose d'une possibilité de mise en maintenance par le biais d'un fichier `.htaccess`.
|
|
||||||
|
|
||||||
La section `<Directory>` relative à Framadate, dans la configuration d'Apache doit au moins contenir :
|
|
||||||
`AllowOverride AuthConfig Options`
|
|
||||||
|
|
||||||
Le fichier `.htaccess` correspondant doit être modifier pour y configurer
|
|
||||||
l'adresse IP depuis laquelle s'effectue la maintenance.
|
|
||||||
N'oubliez pas de le recommenter en intégralité une fois la maintenance effectuée.
|
|
||||||
|
|
||||||
# Tables de la base de données
|
|
||||||
|
|
||||||
Voici la structure des tables de l'application, le nom des tables est donné sans préfixe.
|
|
||||||
|
|
||||||
La base se compose de quatre tables :
|
|
||||||
|
|
||||||
- `poll` : Le paramètrage des sondages;
|
|
||||||
- `slot` : les choix disponibles pour chaque sondage;
|
|
||||||
- `vote` : les votes effectués par les utilisateurs pour chaque sondage;
|
|
||||||
- `comment` : les commentaires apportés à chaque sondage.
|
|
12
Makefile
Normal file
12
Makefile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
locales:
|
||||||
|
json2po -P -i locale/en.json -t locale/en.json -o po/framadate.pot
|
||||||
|
|
||||||
|
push-locales: locales
|
||||||
|
zanata-cli -q -B push
|
||||||
|
|
||||||
|
pull-locales:
|
||||||
|
zanata-cli -q -B pull --min-doc-percent 50
|
||||||
|
./.po2json.sh
|
||||||
|
|
||||||
|
stats-locales:
|
||||||
|
zanata-cli -q stats
|
78
README.md
78
README.md
@ -1,85 +1,39 @@
|
|||||||
# Présentation du projet
|
# Framadate
|
||||||
|
|
||||||
![Gitlab](https://git.framasoft.org/assets/logo-black-f52905a40830b30aa287f784b537c823.png)[https://git.framasoft.org](https://git.framasoft.org)
|
![English](https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Flag_of_the_United_Kingdom.svg/20px-Flag_of_the_United_Kingdom.svg.png) Framadate is an online service for planning an appointment or making a decision quickly and easily. No registration is required.
|
||||||
|
|
||||||
![English](https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Flag_of_the_United_Kingdom.svg/20px-Flag_of_the_United_Kingdom.svg.png) **Framasoft uses GitLab** for the development of its free softwares. Our Github repositories are only mirrors.
|
![Français](https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/20px-Flag_of_France.svg.png) Framadate est un service en ligne permettant de planifier un rendez-vous ou prendre des décisions rapidement et simplement. Aucune inscription préalable n’est nécessaire.
|
||||||
If you want to work with us, **fork us on [git.framasoft.org](https://git.framasoft.org)**. (no registration needed, you can sign in with your Github account)
|
|
||||||
|
|
||||||
![Français](https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/20px-Flag_of_France.svg.png) **Framasoft utilise GitLab** pour le développement de ses logiciels libres. Nos dépôts Github ne sont que des mirroirs.
|
|
||||||
Si vous souhaitez travailler avec nous, **forkez-nous sur [git.framasoft.org](https://git.framasoft.org)**. (l'inscription n'est pas nécessaire, vous pouvez vous connecter avec votre compte Github)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Compatibilités des navigateurs
|
|
||||||
_Dernière mise à jour le 21 avril 2014_
|
|
||||||
|
|
||||||
| Navigateur | Version testée |
|
|
||||||
|------------|-------------------------|
|
|
||||||
| Firefox | Ubuntu 13.10/FF28 |
|
|
||||||
| Chrome | Ubuntu 13.10/Chromium33 |
|
|
||||||
| Opera | (non testé) |
|
|
||||||
| Konqueror | (non testé) |
|
|
||||||
| Links | (non testé, inutile) |
|
|
||||||
| Safari | (non testé) |
|
|
||||||
| IE | Win7/IE9 |
|
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
Un fichier est dédié à l'installation de framadate : [INSTALL.md](INSTALL.md).
|
Follow the instructions on our Wiki : <https://framagit.org/framasoft/framadate/wikis/home>
|
||||||
|
|
||||||
# Comment contribuer
|
# Contribute
|
||||||
|
|
||||||
## De votre côté
|
## Code
|
||||||
|
Follow the instructions on <https://framagit.org/framasoft/framadate/wikis/coding>
|
||||||
1. Créer un compte sur [https://git.framasoft.org](https://git.framasoft.org)
|
|
||||||
1. Créer un fork du projet principal : [Créer le fork](https://git.framasoft.org/framasoft/framadate/fork/new)
|
|
||||||
1. Créer une branche nommée feature/[Description]
|
|
||||||
* Où [Description] est une description en anglais très courte de ce qui va être fait
|
|
||||||
1. Faire des commits dans votre branche
|
|
||||||
1. Pusher la branche sur votre fork
|
|
||||||
1. Demander une merge request
|
|
||||||
|
|
||||||
## La suite se passe de notre côté
|
|
||||||
|
|
||||||
1. Quelqu'un relira votre travail
|
|
||||||
* Essayez de rendre ce travail plus facile en organisant vos commits
|
|
||||||
1. S'il y a des remarques sur le travail, le relecteur fera des commentaires sur la merge request
|
|
||||||
1. Si la merge request lui semble correcte il peut merger votre travail avec la branche **develop**
|
|
||||||
|
|
||||||
## Corrections suite à une relecture
|
|
||||||
|
|
||||||
La relecture de la merge request peut vous amener à faire des corrections.
|
|
||||||
Vous pouvez faire ces corrections dans votre branche, ce qui aura pour effet de les ajouter à la merge request.
|
|
||||||
|
|
||||||
## Comprendre le code
|
|
||||||
|
|
||||||
Un fichier est dédié à l'appréhension du code de framadate : [Document technique](doc/TECHNICAL.md).
|
|
||||||
|
|
||||||
# Traductions
|
# Traductions
|
||||||
|
|
||||||
Les traductions se trouvent dans le dossier `locale`. Chaque langue est dans un fichier JSON différent organisé par section.
|
Follow the instructions on <https://framagit.org/framasoft/framadate/wikis/translating>
|
||||||
|
|
||||||
# Synthèses des librairies utilisées
|
# Used libraries
|
||||||
|
|
||||||
[Smarty](http://www.smarty.net/),
|
* PHP [PHP 5.6](http://php.net)
|
||||||
gestion des templates pour PHP
|
* Templating [Smarty](http://www.smarty.net/),
|
||||||
|
* I18N [o80-i18n](https://github.com/olivierperez/o80-i18n)
|
||||||
[o80-i18n](https://github.com/olivierperez/o80-i18n),
|
* Database: PostgreSQL ou [MySQL 5.5](https://dev.mysql.com/downloads/mysql/5.5.html)
|
||||||
système d'internationalisation
|
|
||||||
|
|
||||||
[PHP 5.4.4](http://php.net)
|
|
||||||
|
|
||||||
PostgreSQL ou MySQL
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Framadate est un fork du projet [STUdS](https://sourcesup.cru.fr/projects/studs/), il motorise framadate.org pour framasoft.org
|
Framadate is a fork of the [STUdS](https://sourcesup.cru.fr/projects/studs/) project, that works at framadate.org for framasoft.org
|
||||||
|
|
||||||
Les auteurs principaux de Framadate sont :
|
Previous main authors of Framadate were :
|
||||||
* Simon LEBLANC
|
* Simon LEBLANC
|
||||||
* Pierre-Yves GOSSET
|
* Pierre-Yves GOSSET
|
||||||
|
|
||||||
Les auteurs principaux du projet STUdS sont :
|
Main authors of project STUdS are :
|
||||||
* Guilhem BORGHESI
|
* Guilhem BORGHESI
|
||||||
* Raphaël DROZ
|
* Raphaël DROZ
|
||||||
|
|
||||||
|
@ -16,13 +16,13 @@
|
|||||||
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
||||||
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
||||||
*/
|
*/
|
||||||
use Framadate\Services\LogService;
|
use Framadate\Message;
|
||||||
use Framadate\Services\PollService;
|
|
||||||
use Framadate\Services\InputService;
|
use Framadate\Services\InputService;
|
||||||
|
use Framadate\Services\LogService;
|
||||||
use Framadate\Services\MailService;
|
use Framadate\Services\MailService;
|
||||||
use Framadate\Services\NotificationService;
|
use Framadate\Services\NotificationService;
|
||||||
|
use Framadate\Services\PollService;
|
||||||
use Framadate\Services\SecurityService;
|
use Framadate\Services\SecurityService;
|
||||||
use Framadate\Message;
|
|
||||||
|
|
||||||
include_once __DIR__ . '/../app/inc/init.php';
|
include_once __DIR__ . '/../app/inc/init.php';
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ $poll_id = null;
|
|||||||
$poll = null;
|
$poll = null;
|
||||||
$message = null;
|
$message = null;
|
||||||
$result = false;
|
$result = false;
|
||||||
$comments = array();
|
$comments = [];
|
||||||
$is_admin = false;
|
$is_admin = false;
|
||||||
|
|
||||||
/* Services */
|
/* Services */
|
||||||
@ -42,7 +42,7 @@ $is_admin = false;
|
|||||||
$logService = new LogService();
|
$logService = new LogService();
|
||||||
$pollService = new PollService($connect, $logService);
|
$pollService = new PollService($connect, $logService);
|
||||||
$inputService = new InputService();
|
$inputService = new InputService();
|
||||||
$mailService = new MailService($config['use_smtp']);
|
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
|
||||||
$notificationService = new NotificationService($mailService);
|
$notificationService = new NotificationService($mailService);
|
||||||
$securityService = new SecurityService();
|
$securityService = new SecurityService();
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ if (!empty($_POST['poll'])) {
|
|||||||
if (!empty($_POST['poll_admin'])) {
|
if (!empty($_POST['poll_admin'])) {
|
||||||
$admin_poll_id = filter_input(INPUT_POST, 'poll_admin', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => POLL_REGEX]]);
|
$admin_poll_id = filter_input(INPUT_POST, 'poll_admin', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => POLL_REGEX]]);
|
||||||
if (strlen($admin_poll_id) === 24) {
|
if (strlen($admin_poll_id) === 24) {
|
||||||
$is_admin = ($pollService->findByAdminId($admin_poll_id) != null);
|
$is_admin = ($pollService->findByAdminId($admin_poll_id) !== null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,11 +69,11 @@ if (!$poll) {
|
|||||||
$name = $inputService->filterName($_POST['name']);
|
$name = $inputService->filterName($_POST['name']);
|
||||||
$comment = $inputService->filterComment($_POST['comment']);
|
$comment = $inputService->filterComment($_POST['comment']);
|
||||||
|
|
||||||
if ($name == null) {
|
if ($name === null) {
|
||||||
$message = new Message('danger', __('Error', 'The name is invalid.'));
|
$message = new Message('danger', __('Error', 'The name is invalid.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($message == null) {
|
if ($message === null) {
|
||||||
// Add comment
|
// Add comment
|
||||||
$result = $pollService->addComment($poll_id, $name, $comment);
|
$result = $pollService->addComment($poll_id, $name, $comment);
|
||||||
if ($result) {
|
if ($result) {
|
||||||
@ -90,6 +90,6 @@ $smarty->error_reporting = E_ALL & ~E_NOTICE;
|
|||||||
$smarty->assign('comments', $comments);
|
$smarty->assign('comments', $comments);
|
||||||
$comments_html = $smarty->fetch('part/comments_list.tpl');
|
$comments_html = $smarty->fetch('part/comments_list.tpl');
|
||||||
|
|
||||||
$response = array('result' => $result, 'message' => $message, 'comments' => $comments_html);
|
$response = ['result' => $result, 'message' => $message, 'comments' => $comments_html];
|
||||||
|
|
||||||
echo json_encode($response);
|
echo json_encode($response);
|
||||||
|
@ -17,18 +17,18 @@
|
|||||||
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Framadate\Services\SessionService;
|
|
||||||
use Framadate\Services\PollService;
|
|
||||||
use Framadate\Services\MailService;
|
|
||||||
use Framadate\Services\LogService;
|
|
||||||
use Framadate\Message;
|
use Framadate\Message;
|
||||||
|
use Framadate\Services\LogService;
|
||||||
|
use Framadate\Services\MailService;
|
||||||
|
use Framadate\Services\PollService;
|
||||||
|
use Framadate\Services\SessionService;
|
||||||
use Framadate\Utils;
|
use Framadate\Utils;
|
||||||
|
|
||||||
include_once __DIR__ . '/../app/inc/init.php';
|
include_once __DIR__ . '/../app/inc/init.php';
|
||||||
|
|
||||||
$logService = new LogService();
|
$logService = new LogService();
|
||||||
$sessionService = new SessionService();
|
$sessionService = new SessionService();
|
||||||
$mailService = new MailService($config['use_smtp']);
|
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
|
||||||
$pollService = new PollService($connect, $logService);
|
$pollService = new PollService($connect, $logService);
|
||||||
|
|
||||||
$result = false;
|
$result = false;
|
||||||
@ -45,7 +45,7 @@ if (!empty($_POST['poll'])) {
|
|||||||
$token = $sessionService->get("Common", SESSION_EDIT_LINK_TOKEN);
|
$token = $sessionService->get("Common", SESSION_EDIT_LINK_TOKEN);
|
||||||
$token_form_value = empty($_POST['token']) ? null : $_POST['token'];
|
$token_form_value = empty($_POST['token']) ? null : $_POST['token'];
|
||||||
$editedVoteUniqueId = filter_input(INPUT_POST, 'editedVoteUniqueId', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => POLL_REGEX]]);
|
$editedVoteUniqueId = filter_input(INPUT_POST, 'editedVoteUniqueId', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => POLL_REGEX]]);
|
||||||
if (is_null($poll) || $config['use_smtp'] == false || is_null($token) || is_null($token_form_value)
|
if (is_null($poll) || $config['use_smtp'] === false || is_null($token) || is_null($token_form_value)
|
||||||
|| !$token->check($token_form_value) || is_null($editedVoteUniqueId)) {
|
|| !$token->check($token_form_value) || is_null($editedVoteUniqueId)) {
|
||||||
$message = new Message('error', __('Error', 'Something is going wrong...'));
|
$message = new Message('error', __('Error', 'Something is going wrong...'));
|
||||||
}
|
}
|
||||||
@ -69,7 +69,6 @@ if (is_null($message)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (is_null($message)) {
|
if (is_null($message)) {
|
||||||
$url = Utils::getUrlSondage($poll_id, false, $editedVoteUniqueId);
|
$url = Utils::getUrlSondage($poll_id, false, $editedVoteUniqueId);
|
||||||
|
|
||||||
@ -78,9 +77,9 @@ if (is_null($message)) {
|
|||||||
$smarty->assign('editedVoteUniqueId', $editedVoteUniqueId);
|
$smarty->assign('editedVoteUniqueId', $editedVoteUniqueId);
|
||||||
$body = $smarty->fetch('mail/remember_edit_link.tpl');
|
$body = $smarty->fetch('mail/remember_edit_link.tpl');
|
||||||
|
|
||||||
$subject = '[' . NOMAPPLICATION . ']['.__('EditLink', 'REMINDER').'] '.__f('EditLink', 'Edit link for poll "%s"', $poll->title);
|
$subject = '[' . NOMAPPLICATION . '][' . __('EditLink', 'REMINDER') . '] ' . __f('EditLink', 'Edit link for poll "%s"', $poll->title);
|
||||||
|
|
||||||
//$mailService->send($email, $subject, $body);
|
$mailService->send($email, $subject, $body);
|
||||||
$sessionService->remove("Common", SESSION_EDIT_LINK_TOKEN);
|
$sessionService->remove("Common", SESSION_EDIT_LINK_TOKEN);
|
||||||
$sessionService->set("Common", SESSION_EDIT_LINK_TIME, time());
|
$sessionService->set("Common", SESSION_EDIT_LINK_TIME, time());
|
||||||
|
|
||||||
@ -90,7 +89,6 @@ if (is_null($message)) {
|
|||||||
|
|
||||||
$smarty->error_reporting = E_ALL & ~E_NOTICE;
|
$smarty->error_reporting = E_ALL & ~E_NOTICE;
|
||||||
|
|
||||||
$response = array('result' => $result, 'message' => $message);
|
$response = ['result' => $result, 'message' => $message];
|
||||||
|
|
||||||
|
|
||||||
echo json_encode($response);
|
echo json_encode($response);
|
@ -35,7 +35,7 @@ if (!file_exists(ROOT_DIR . 'vendor/autoload.php') || !file_exists(ROOT_DIR . 'v
|
|||||||
require_once ROOT_DIR . 'vendor/autoload.php';
|
require_once ROOT_DIR . 'vendor/autoload.php';
|
||||||
require_once ROOT_DIR . 'vendor/o80/i18n/src/shortcuts.php';
|
require_once ROOT_DIR . 'vendor/o80/i18n/src/shortcuts.php';
|
||||||
require_once ROOT_DIR . 'app/inc/constants.php';
|
require_once ROOT_DIR . 'app/inc/constants.php';
|
||||||
if (session_id() == '') {
|
if (session_id() === '') {
|
||||||
session_start();
|
session_start();
|
||||||
}
|
}
|
||||||
$ALLOWED_LANGUAGES = [
|
$ALLOWED_LANGUAGES = [
|
||||||
@ -49,7 +49,6 @@ $ALLOWED_LANGUAGES = [
|
|||||||
];
|
];
|
||||||
const DEFAULT_LANGUAGE = 'en';
|
const DEFAULT_LANGUAGE = 'en';
|
||||||
require_once ROOT_DIR . 'app/inc/i18n.php';
|
require_once ROOT_DIR . 'app/inc/i18n.php';
|
||||||
require_once '../app/inc/php_version.php';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function to sort messages by type (priorise errors on warning, warning on info, etc.)
|
* Function to sort messages by type (priorise errors on warning, warning on info, etc.)
|
||||||
@ -60,27 +59,26 @@ require_once '../app/inc/php_version.php';
|
|||||||
*/
|
*/
|
||||||
function compareCheckMessage(Message $a, Message $b)
|
function compareCheckMessage(Message $a, Message $b)
|
||||||
{
|
{
|
||||||
$values = array(
|
$values = [
|
||||||
'danger' => 0,
|
'danger' => 0,
|
||||||
'warning' => 1,
|
'warning' => 1,
|
||||||
'info' => 2,
|
'info' => 2,
|
||||||
'success' => 3
|
'success' => 3
|
||||||
);
|
];
|
||||||
$vA = $values[$a->type];
|
$vA = $values[$a->type];
|
||||||
$vB = $values[$b->type];
|
$vB = $values[$b->type];
|
||||||
|
|
||||||
if ($vA == $vB) {
|
if ($vA === $vB) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return ($vA < $vB) ? -1 : 1;
|
return ($vA < $vB) ? -1 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Vars
|
* Vars
|
||||||
*/
|
*/
|
||||||
$messages = array();
|
$messages = [];
|
||||||
$inc_directory = ROOT_DIR. 'app/inc/';
|
$inc_directory = ROOT_DIR . 'app/inc/';
|
||||||
$conf_filename = $inc_directory . 'config.php';
|
$conf_filename = $inc_directory . 'config.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,10 +86,10 @@ $conf_filename = $inc_directory . 'config.php';
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// PHP Version
|
// PHP Version
|
||||||
if (PHP_VERSION_ID >= php_string_to_version_id(PHP_NEEDED_VERSION)) {
|
if (version_compare(PHP_VERSION, PHP_NEEDED_VERSION) >= 0) {
|
||||||
$messages[] = new Message('info', __f('Check','PHP version %s is enough (needed at least PHP %s).',phpversion(), PHP_NEEDED_VERSION));
|
$messages[] = new Message('info', __f('Check','PHP version %s is enough (needed at least PHP %s).', PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION, PHP_NEEDED_VERSION));
|
||||||
} else {
|
} else {
|
||||||
$messages[] = new Message('danger', __f('Check','Your PHP version (%s) is too old. This application needs at least PHP %s.',phpversion(), PHP_NEEDED_VERSION));
|
$messages[] = new Message('danger', __f('Check','Your PHP version (%s) is too old. This application needs at least PHP %s.', phpversion(), PHP_NEEDED_VERSION));
|
||||||
}
|
}
|
||||||
|
|
||||||
// INTL extension
|
// INTL extension
|
||||||
@ -101,8 +99,10 @@ if (extension_loaded('intl')) {
|
|||||||
$messages[] = new Message('danger', __('Check','You need to enable the PHP Intl extension.'));
|
$messages[] = new Message('danger', __('Check','You need to enable the PHP Intl extension.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is template compile dir writable ?
|
// Is template compile dir exists and writable ?
|
||||||
if (is_writable(ROOT_DIR . COMPILE_DIR)) {
|
if (!file_exists(ROOT_DIR . COMPILE_DIR)) {
|
||||||
|
$messages[] = new Message('danger', __f('Check','The template compile directory (%s) doesn\'t exist in "%s". Retry the installation process.', COMPILE_DIR, realpath(ROOT_DIR)));
|
||||||
|
} elseif (is_writable(ROOT_DIR . COMPILE_DIR)) {
|
||||||
$messages[] = new Message('info', __f('Check','The template compile directory (%s) is writable.', realpath(ROOT_DIR . COMPILE_DIR)));
|
$messages[] = new Message('info', __f('Check','The template compile directory (%s) is writable.', realpath(ROOT_DIR . COMPILE_DIR)));
|
||||||
} else {
|
} else {
|
||||||
$messages[] = new Message('danger', __f('Check','The template compile directory (%s) is not writable.', realpath(ROOT_DIR . COMPILE_DIR)));
|
$messages[] = new Message('danger', __f('Check','The template compile directory (%s) is not writable.', realpath(ROOT_DIR . COMPILE_DIR)));
|
||||||
@ -114,7 +114,7 @@ if (file_exists($conf_filename)) {
|
|||||||
} elseif (is_writable($inc_directory)) {
|
} elseif (is_writable($inc_directory)) {
|
||||||
$messages[] = new Message('info', __('Check','The config file directory (%s) is writable.', $inc_directory));
|
$messages[] = new Message('info', __('Check','The config file directory (%s) is writable.', $inc_directory));
|
||||||
} else {
|
} else {
|
||||||
$messages[] = new Message('danger', __f('Check','The config file directory (%s) is not writable and the config file (%s) dos not exists.', $inc_directory, $conf_filename));
|
$messages[] = new Message('danger', __f('Check','The config file directory (%s) is not writable and the config file (%s) does not exists.', $inc_directory, $conf_filename));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Security
|
// Security
|
||||||
@ -124,6 +124,12 @@ if (extension_loaded('openssl')) {
|
|||||||
$messages[] = new Message('warning', __('Check','Consider enabling the PHP extension OpenSSL for increased security.'));
|
$messages[] = new Message('warning', __('Check','Consider enabling the PHP extension OpenSSL for increased security.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ini_get('session.cookie_httponly') === '1') {
|
||||||
|
$messages[] = new Message('info', __('Check', 'Cookies are served from HTTP only.'));
|
||||||
|
} else {
|
||||||
|
$messages[] = new Message('warning', __('Check', "Consider setting « session.cookie_httponly = 1 » inside your php.ini or add « php_value session.cookie_httponly 1 » to your .htaccess so that cookies can't be accessed through Javascript."));
|
||||||
|
}
|
||||||
|
|
||||||
// Datetime
|
// Datetime
|
||||||
$timezone = ini_get('date.timezone');
|
$timezone = ini_get('date.timezone');
|
||||||
if (!empty($timezone)) {
|
if (!empty($timezone)) {
|
||||||
@ -132,14 +138,13 @@ if (!empty($timezone)) {
|
|||||||
$messages[] = new Message('warning', __('Check','Consider setting the date.timezone in php.ini.'));
|
$messages[] = new Message('warning', __('Check','Consider setting the date.timezone in php.ini.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// The percentage of steps needed to be ready to launch the application
|
// The percentage of steps needed to be ready to launch the application
|
||||||
$errors = 0;
|
$errors = 0;
|
||||||
$warnings = 0;
|
$warnings = 0;
|
||||||
foreach ($messages as $message) {
|
foreach ($messages as $message) {
|
||||||
if ($message->type == 'danger') {
|
if ($message->type === 'danger') {
|
||||||
$errors++;
|
$errors++;
|
||||||
} else if ($message->type == 'warning') {
|
} else if ($message->type === 'warning') {
|
||||||
$warnings++;
|
$warnings++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -174,7 +179,7 @@ usort($messages, 'compareCheckMessage');
|
|||||||
<div class="input-group input-group-sm pull-right col-xs-12 col-sm-2">
|
<div class="input-group input-group-sm pull-right col-xs-12 col-sm-2">
|
||||||
<select name="lang" class="form-control" title="<?=__('Language selector', 'Select the language')?>" >
|
<select name="lang" class="form-control" title="<?=__('Language selector', 'Select the language')?>" >
|
||||||
<?php foreach ($ALLOWED_LANGUAGES as $lang_key => $language) { ?>
|
<?php foreach ($ALLOWED_LANGUAGES as $lang_key => $language) { ?>
|
||||||
<option lang="fr" <?php if (substr($lang_key, 0, 2)==$locale) { echo 'selected';} ?> value="<?=substr($lang_key, 0, 2)?>"><?=$language?></option>
|
<option lang="fr" <?php if (substr($lang_key, 0, 2)===$locale) { echo 'selected';} ?> value="<?=substr($lang_key, 0, 2)?>"><?=$language?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
@ -196,9 +201,9 @@ usort($messages, 'compareCheckMessage');
|
|||||||
<div>
|
<div>
|
||||||
<?php
|
<?php
|
||||||
foreach ($messages as $message) {
|
foreach ($messages as $message) {
|
||||||
echo '<div class="alert alert-'. $message->type .'" role="alert">';
|
echo '<div class="alert alert-' . $message->type . '" role="alert">';
|
||||||
echo Utils::htmlEscape($message->message);
|
echo Utils::htmlEscape($message->message);
|
||||||
echo '<span class="sr-only">'. $message->type .'</span>';
|
echo '<span class="sr-only">' . $message->type . '</span>';
|
||||||
echo '</div>';
|
echo '</div>';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
@ -208,7 +213,7 @@ usort($messages, 'compareCheckMessage');
|
|||||||
<a class="btn btn-info" role="button" href=""><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> <?= __('Check', 'Check again') ?></a>
|
<a class="btn btn-info" role="button" href=""><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> <?= __('Check', 'Check again') ?></a>
|
||||||
<?php
|
<?php
|
||||||
if (!is_file($conf_filename)) {
|
if (!is_file($conf_filename)) {
|
||||||
if ($errors == 0) {
|
if ($errors === 0) {
|
||||||
?>
|
?>
|
||||||
<a class="btn btn-primary" role="button" href="<?= Utils::get_server_name() . 'admin/install.php' ?>"><span class=" glyphicon glyphicon-arrow-right" aria-hidden="true"></span> <?= __('Check', 'Continue the installation') ?></a>
|
<a class="btn btn-primary" role="button" href="<?= Utils::get_server_name() . 'admin/install.php' ?>"><span class=" glyphicon glyphicon-arrow-right" aria-hidden="true"></span> <?= __('Check', 'Continue the installation') ?></a>
|
||||||
<?php
|
<?php
|
||||||
|
@ -37,9 +37,8 @@ if (!empty($_POST)) {
|
|||||||
if ($result['status'] === 'OK') {
|
if ($result['status'] === 'OK') {
|
||||||
header(('Location: ' . Utils::get_server_name() . 'admin/migration.php'));
|
header(('Location: ' . Utils::get_server_name() . 'admin/migration.php'));
|
||||||
exit;
|
exit;
|
||||||
} else {
|
|
||||||
$error = __('Error', $result['code']);
|
|
||||||
}
|
}
|
||||||
|
$error = __('Error', $result['code']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$smarty->assign('error', $error);
|
$smarty->assign('error', $error);
|
||||||
|
@ -17,15 +17,17 @@
|
|||||||
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Framadate\Migration\From_0_0_to_0_8_Migration;
|
use Framadate\Migration\AddColumn_hidden_In_poll_For_0_9;
|
||||||
use Framadate\Migration\From_0_8_to_0_9_Migration;
|
|
||||||
use Framadate\Migration\AddColumn_receiveNewComments_For_0_9;
|
use Framadate\Migration\AddColumn_receiveNewComments_For_0_9;
|
||||||
use Framadate\Migration\AddColumn_uniqId_In_vote_For_0_9;
|
use Framadate\Migration\AddColumn_uniqId_In_vote_For_0_9;
|
||||||
use Framadate\Migration\AddColumn_hidden_In_poll_For_0_9;
|
use Framadate\Migration\AddColumn_ValueMax_In_poll_For_1_1;
|
||||||
use Framadate\Migration\Alter_Comment_table_for_name_length;
|
|
||||||
use Framadate\Migration\Alter_Comment_table_adding_date;
|
|
||||||
use Framadate\Migration\Generate_uniqId_for_old_votes;
|
|
||||||
use Framadate\Migration\AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9;
|
use Framadate\Migration\AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9;
|
||||||
|
use Framadate\Migration\Alter_Comment_table_adding_date;
|
||||||
|
use Framadate\Migration\Alter_Comment_table_for_name_length;
|
||||||
|
use Framadate\Migration\Fix_MySQL_No_Zero_Date;
|
||||||
|
use Framadate\Migration\From_0_0_to_0_8_Migration;
|
||||||
|
use Framadate\Migration\From_0_8_to_0_9_Migration;
|
||||||
|
use Framadate\Migration\Generate_uniqId_for_old_votes;
|
||||||
use Framadate\Migration\Increase_pollId_size;
|
use Framadate\Migration\Increase_pollId_size;
|
||||||
use Framadate\Migration\Migration;
|
use Framadate\Migration\Migration;
|
||||||
use Framadate\Migration\RPadVotes_from_0_8;
|
use Framadate\Migration\RPadVotes_from_0_8;
|
||||||
@ -42,21 +44,25 @@ $migrations = [
|
|||||||
new AddColumn_receiveNewComments_For_0_9(),
|
new AddColumn_receiveNewComments_For_0_9(),
|
||||||
new AddColumn_uniqId_In_vote_For_0_9(),
|
new AddColumn_uniqId_In_vote_For_0_9(),
|
||||||
new AddColumn_hidden_In_poll_For_0_9(),
|
new AddColumn_hidden_In_poll_For_0_9(),
|
||||||
|
new AddColumn_ValueMax_In_poll_For_1_1(),
|
||||||
new Generate_uniqId_for_old_votes(),
|
new Generate_uniqId_for_old_votes(),
|
||||||
new RPadVotes_from_0_8(),
|
new RPadVotes_from_0_8(),
|
||||||
new Alter_Comment_table_for_name_length(),
|
new Alter_Comment_table_for_name_length(),
|
||||||
new Alter_Comment_table_adding_date(),
|
new Alter_Comment_table_adding_date(),
|
||||||
new AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9(),
|
new AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9(),
|
||||||
new Increase_pollId_size()
|
new Increase_pollId_size(),
|
||||||
|
new AddColumn_ValueMax_In_poll_For_1_1(),
|
||||||
|
new Fix_MySQL_No_Zero_Date(),
|
||||||
];
|
];
|
||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
|
|
||||||
// Check if MIGRATION_TABLE already exists
|
// Check if MIGRATION_TABLE already exists
|
||||||
|
/** @var \Framadate\FramaDB $connect */
|
||||||
$tables = $connect->allTables();
|
$tables = $connect->allTables();
|
||||||
$pdo = $connect->getPDO();
|
$pdo = $connect->getPDO();
|
||||||
$prefixedMigrationTable = Utils::table(MIGRATION_TABLE);
|
$prefixedMigrationTable = Utils::table(MIGRATION_TABLE);
|
||||||
|
|
||||||
if (!in_array($prefixedMigrationTable, $tables)) {
|
if (!in_array($prefixedMigrationTable, $tables, true)) {
|
||||||
$pdo->exec('
|
$pdo->exec('
|
||||||
CREATE TABLE IF NOT EXISTS `' . $prefixedMigrationTable . '` (
|
CREATE TABLE IF NOT EXISTS `' . $prefixedMigrationTable . '` (
|
||||||
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
@ -104,7 +110,6 @@ foreach ($migrations as $migration) {
|
|||||||
} else {
|
} else {
|
||||||
$countSkipped++;
|
$countSkipped++;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$countTotal = $countSucceeded + $countFailed + $countSkipped;
|
$countTotal = $countSucceeded + $countFailed + $countSkipped;
|
||||||
|
@ -19,15 +19,17 @@
|
|||||||
use Framadate\Editable;
|
use Framadate\Editable;
|
||||||
use Framadate\Exception\AlreadyExistsException;
|
use Framadate\Exception\AlreadyExistsException;
|
||||||
use Framadate\Exception\ConcurrentEditionException;
|
use Framadate\Exception\ConcurrentEditionException;
|
||||||
|
use Framadate\Exception\ConcurrentVoteException;
|
||||||
use Framadate\Exception\MomentAlreadyExistsException;
|
use Framadate\Exception\MomentAlreadyExistsException;
|
||||||
use Framadate\Message;
|
use Framadate\Message;
|
||||||
|
use Framadate\Security\PasswordHasher;
|
||||||
use Framadate\Services\AdminPollService;
|
use Framadate\Services\AdminPollService;
|
||||||
use Framadate\Services\InputService;
|
use Framadate\Services\InputService;
|
||||||
use Framadate\Services\LogService;
|
use Framadate\Services\LogService;
|
||||||
use Framadate\Services\MailService;
|
use Framadate\Services\MailService;
|
||||||
use Framadate\Services\PollService;
|
|
||||||
use Framadate\Services\NotificationService;
|
use Framadate\Services\NotificationService;
|
||||||
use Framadate\Security\PasswordHasher;
|
use Framadate\Services\PollService;
|
||||||
|
use Framadate\Services\SessionService;
|
||||||
use Framadate\Utils;
|
use Framadate\Utils;
|
||||||
|
|
||||||
include_once __DIR__ . '/app/inc/init.php';
|
include_once __DIR__ . '/app/inc/init.php';
|
||||||
@ -48,8 +50,9 @@ $logService = new LogService();
|
|||||||
$pollService = new PollService($connect, $logService);
|
$pollService = new PollService($connect, $logService);
|
||||||
$adminPollService = new AdminPollService($connect, $pollService, $logService);
|
$adminPollService = new AdminPollService($connect, $pollService, $logService);
|
||||||
$inputService = new InputService();
|
$inputService = new InputService();
|
||||||
$mailService = new MailService($config['use_smtp']);
|
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
|
||||||
$notificationService = new NotificationService($mailService);
|
$notificationService = new NotificationService($mailService);
|
||||||
|
$sessionService = new SessionService();
|
||||||
|
|
||||||
/* PAGE */
|
/* PAGE */
|
||||||
/* ---- */
|
/* ---- */
|
||||||
@ -69,6 +72,18 @@ if ($poll) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------
|
||||||
|
// creation message
|
||||||
|
// -------------------------------
|
||||||
|
|
||||||
|
$messagePollCreated = $sessionService->get("Framadate", "messagePollCreated", FALSE);
|
||||||
|
|
||||||
|
if ($messagePollCreated) {
|
||||||
|
$sessionService->remove("Framadate", "messagePollCreated");
|
||||||
|
|
||||||
|
$message = new Message('success', __('adminstuds', 'The poll is created.'));
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------
|
// -------------------------------
|
||||||
// Update poll info
|
// Update poll info
|
||||||
// -------------------------------
|
// -------------------------------
|
||||||
@ -79,25 +94,25 @@ if (isset($_POST['update_poll_info'])) {
|
|||||||
'rules', 'expiration_date', 'name', 'hidden', 'removePassword', 'password']);
|
'rules', 'expiration_date', 'name', 'hidden', 'removePassword', 'password']);
|
||||||
|
|
||||||
// Update the right poll field
|
// Update the right poll field
|
||||||
if ($field == 'title') {
|
if ($field === 'title') {
|
||||||
$title = $inputService->filterTitle($_POST['title']);
|
$title = $inputService->filterTitle($_POST['title']);
|
||||||
if ($title) {
|
if ($title) {
|
||||||
$poll->title = $title;
|
$poll->title = $title;
|
||||||
$updated = true;
|
$updated = true;
|
||||||
}
|
}
|
||||||
} elseif ($field == 'admin_mail') {
|
} elseif ($field === 'admin_mail') {
|
||||||
$admin_mail = $inputService->filterMail($_POST['admin_mail']);
|
$admin_mail = $inputService->filterMail($_POST['admin_mail']);
|
||||||
if ($admin_mail) {
|
if ($admin_mail) {
|
||||||
$poll->admin_mail = $admin_mail;
|
$poll->admin_mail = $admin_mail;
|
||||||
$updated = true;
|
$updated = true;
|
||||||
}
|
}
|
||||||
} elseif ($field == 'description') {
|
} elseif ($field === 'description') {
|
||||||
$description = $inputService->filterDescription($_POST['description']);
|
$description = $inputService->filterDescription($_POST['description']);
|
||||||
if ($description) {
|
if ($description) {
|
||||||
$poll->description = $description;
|
$poll->description = $description;
|
||||||
$updated = true;
|
$updated = true;
|
||||||
}
|
}
|
||||||
} elseif ($field == 'rules') {
|
} elseif ($field === 'rules') {
|
||||||
$rules = strip_tags($_POST['rules']);
|
$rules = strip_tags($_POST['rules']);
|
||||||
switch ($rules) {
|
switch ($rules) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -121,39 +136,58 @@ if (isset($_POST['update_poll_info'])) {
|
|||||||
$updated = true;
|
$updated = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} elseif ($field == 'expiration_date') {
|
} elseif ($field === 'expiration_date') {
|
||||||
$expiration_date = $inputService->filterDate($_POST['expiration_date']);
|
$expiration_date = $inputService->filterDate($_POST['expiration_date']);
|
||||||
if ($expiration_date) {
|
if ($expiration_date) {
|
||||||
$poll->end_date = $expiration_date;
|
$poll->end_date = $expiration_date;
|
||||||
$updated = true;
|
$updated = true;
|
||||||
}
|
}
|
||||||
} elseif ($field == 'name') {
|
} elseif ($field === 'name') {
|
||||||
$admin_name = $inputService->filterName($_POST['name']);
|
$admin_name = $inputService->filterName($_POST['name']);
|
||||||
if ($admin_name) {
|
if ($admin_name) {
|
||||||
$poll->admin_name = $admin_name;
|
$poll->admin_name = $admin_name;
|
||||||
$updated = true;
|
$updated = true;
|
||||||
}
|
}
|
||||||
} elseif ($field == 'hidden') {
|
} elseif ($field === 'hidden') {
|
||||||
$hidden = isset($_POST['hidden']) ? $inputService->filterBoolean($_POST['hidden']) : false;
|
$hidden = isset($_POST['hidden']) ? $inputService->filterBoolean($_POST['hidden']) : false;
|
||||||
if ($hidden != $poll->hidden) {
|
if ($hidden !== $poll->hidden) {
|
||||||
$poll->hidden = $hidden;
|
$poll->hidden = $hidden;
|
||||||
|
$poll->results_publicly_visible = false;
|
||||||
$updated = true;
|
$updated = true;
|
||||||
}
|
}
|
||||||
} elseif ($field == 'removePassword') {
|
} elseif ($field === 'removePassword') {
|
||||||
$removePassword = isset($_POST['removePassword']) ? $inputService->filterBoolean($_POST['removePassword']) : false;
|
$removePassword = isset($_POST['removePassword']) ? $inputService->filterBoolean($_POST['removePassword']) : false;
|
||||||
if ($removePassword) {
|
if ($removePassword) {
|
||||||
$poll->results_publicly_visible = false;
|
$poll->results_publicly_visible = false;
|
||||||
$poll->password_hash = null;
|
$poll->password_hash = null;
|
||||||
$updated = true;
|
$updated = true;
|
||||||
}
|
}
|
||||||
} elseif ($field == 'password') {
|
} elseif ($field === 'password') {
|
||||||
$password = isset($_POST['password']) ? $_POST['password'] : null;
|
$password = isset($_POST['password']) ? $_POST['password'] : null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Did the user choose results to be publicly visible ?
|
||||||
|
*/
|
||||||
$resultsPubliclyVisible = isset($_POST['resultsPubliclyVisible']) ? $inputService->filterBoolean($_POST['resultsPubliclyVisible']) : false;
|
$resultsPubliclyVisible = isset($_POST['resultsPubliclyVisible']) ? $inputService->filterBoolean($_POST['resultsPubliclyVisible']) : false;
|
||||||
|
/**
|
||||||
|
* If there's one, save the password
|
||||||
|
*/
|
||||||
if (!empty($password)) {
|
if (!empty($password)) {
|
||||||
$poll->password_hash = PasswordHasher::hash($password);
|
$poll->password_hash = PasswordHasher::hash($password);
|
||||||
$updated = true;
|
$updated = true;
|
||||||
}
|
}
|
||||||
if ($resultsPubliclyVisible != $poll->results_publicly_visible) {
|
|
||||||
|
/**
|
||||||
|
* If not pasword was set and the poll should be hidden, hide the results
|
||||||
|
*/
|
||||||
|
if ($poll->password_hash === null || $poll->hidden === true) {
|
||||||
|
$poll->results_publicly_visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We don't have a password, the poll is hidden and we change the results public visibility
|
||||||
|
*/
|
||||||
|
if ($resultsPubliclyVisible !== $poll->results_publicly_visible && $poll->password_hash !== null && $poll->hidden === false) {
|
||||||
$poll->results_publicly_visible = $resultsPubliclyVisible;
|
$poll->results_publicly_visible = $resultsPubliclyVisible;
|
||||||
$updated = true;
|
$updated = true;
|
||||||
}
|
}
|
||||||
@ -181,6 +215,8 @@ if (!empty($_GET['vote'])) {
|
|||||||
// Something to save (edit or add)
|
// Something to save (edit or add)
|
||||||
// -------------------------------
|
// -------------------------------
|
||||||
|
|
||||||
|
$selectedNewVotes = [];
|
||||||
|
|
||||||
if (!empty($_POST['save'])) { // Save edition of an old vote
|
if (!empty($_POST['save'])) { // Save edition of an old vote
|
||||||
$name = $inputService->filterName($_POST['name']);
|
$name = $inputService->filterName($_POST['name']);
|
||||||
$editedVote = filter_input(INPUT_POST, 'save', FILTER_VALIDATE_INT);
|
$editedVote = filter_input(INPUT_POST, 'save', FILTER_VALIDATE_INT);
|
||||||
@ -190,11 +226,11 @@ if (!empty($_POST['save'])) { // Save edition of an old vote
|
|||||||
if (empty($editedVote)) {
|
if (empty($editedVote)) {
|
||||||
$message = new Message('danger', __('Error', 'Something is going wrong...'));
|
$message = new Message('danger', __('Error', 'Something is going wrong...'));
|
||||||
}
|
}
|
||||||
if (count($choices) != count($_POST['choices'])) {
|
if (count($choices) !== count($_POST['choices'])) {
|
||||||
$message = new Message('danger', __('Error', 'There is a problem with your choices'));
|
$message = new Message('danger', __('Error', 'There is a problem with your choices'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($message == null) {
|
if ($message === null) {
|
||||||
// Update vote
|
// Update vote
|
||||||
try {
|
try {
|
||||||
$result = $pollService->updateVote($poll_id, $editedVote, $name, $choices, $slots_hash);
|
$result = $pollService->updateVote($poll_id, $editedVote, $name, $choices, $slots_hash);
|
||||||
@ -203,8 +239,12 @@ if (!empty($_POST['save'])) { // Save edition of an old vote
|
|||||||
} else {
|
} else {
|
||||||
$message = new Message('danger', __('Error', 'Update vote failed'));
|
$message = new Message('danger', __('Error', 'Update vote failed'));
|
||||||
}
|
}
|
||||||
|
} catch (AlreadyExistsException $aee) {
|
||||||
|
$message = new Message('danger', __('Error', 'The name you\'ve chosen already exist in this poll!'));
|
||||||
} catch (ConcurrentEditionException $cee) {
|
} catch (ConcurrentEditionException $cee) {
|
||||||
$message = new Message('danger', __('Error', 'Poll has been updated before you vote'));
|
$message = new Message('danger', __('Error', 'Poll has been updated before you vote'));
|
||||||
|
} catch (ConcurrentVoteException $cve) {
|
||||||
|
$message = new Message('danger', __('Error', "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} elseif (isset($_POST['save'])) { // Add a new vote
|
} elseif (isset($_POST['save'])) { // Add a new vote
|
||||||
@ -212,14 +252,14 @@ if (!empty($_POST['save'])) { // Save edition of an old vote
|
|||||||
$choices = $inputService->filterArray($_POST['choices'], FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => CHOICE_REGEX]]);
|
$choices = $inputService->filterArray($_POST['choices'], FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => CHOICE_REGEX]]);
|
||||||
$slots_hash = $inputService->filterMD5($_POST['control']);
|
$slots_hash = $inputService->filterMD5($_POST['control']);
|
||||||
|
|
||||||
if ($name == null) {
|
if ($name === null) {
|
||||||
$message = new Message('danger', __('Error', 'The name is invalid.'));
|
$message = new Message('danger', __('Error', 'The name is invalid.'));
|
||||||
}
|
}
|
||||||
if (count($choices) != count($_POST['choices'])) {
|
if (count($choices) !== count($_POST['choices'])) {
|
||||||
$message = new Message('danger', __('Error', 'There is a problem with your choices'));
|
$message = new Message('danger', __('Error', 'There is a problem with your choices'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($message == null) {
|
if ($message === null) {
|
||||||
// Add vote
|
// Add vote
|
||||||
try {
|
try {
|
||||||
$result = $pollService->addVote($poll_id, $name, $choices, $slots_hash);
|
$result = $pollService->addVote($poll_id, $name, $choices, $slots_hash);
|
||||||
@ -230,8 +270,11 @@ if (!empty($_POST['save'])) { // Save edition of an old vote
|
|||||||
}
|
}
|
||||||
} catch (AlreadyExistsException $aee) {
|
} catch (AlreadyExistsException $aee) {
|
||||||
$message = new Message('danger', __('Error', 'You already voted'));
|
$message = new Message('danger', __('Error', 'You already voted'));
|
||||||
|
$selectedNewVotes = $choices;
|
||||||
} catch (ConcurrentEditionException $cee) {
|
} catch (ConcurrentEditionException $cee) {
|
||||||
$message = new Message('danger', __('Error', 'Poll has been updated before you vote'));
|
$message = new Message('danger', __('Error', 'Poll has been updated before you vote'));
|
||||||
|
} catch (ConcurrentVoteException $cve) {
|
||||||
|
$message = new Message('danger', __('Error', "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -401,7 +444,6 @@ $slots = $pollService->allSlotsByPoll($poll);
|
|||||||
$votes = $pollService->allVotesByPollId($poll_id);
|
$votes = $pollService->allVotesByPollId($poll_id);
|
||||||
$comments = $pollService->allCommentsByPollId($poll_id);
|
$comments = $pollService->allCommentsByPollId($poll_id);
|
||||||
|
|
||||||
|
|
||||||
// Assign data to template
|
// Assign data to template
|
||||||
$smarty->assign('poll_id', $poll_id);
|
$smarty->assign('poll_id', $poll_id);
|
||||||
$smarty->assign('admin_poll_id', $admin_poll_id);
|
$smarty->assign('admin_poll_id', $admin_poll_id);
|
||||||
@ -412,7 +454,7 @@ $smarty->assign('deletion_date', strtotime($poll->end_date) + PURGE_DELAY * 8640
|
|||||||
$smarty->assign('slots', $poll->format === 'D' ? $pollService->splitSlots($slots) : $slots);
|
$smarty->assign('slots', $poll->format === 'D' ? $pollService->splitSlots($slots) : $slots);
|
||||||
$smarty->assign('slots_hash', $pollService->hashSlots($slots));
|
$smarty->assign('slots_hash', $pollService->hashSlots($slots));
|
||||||
$smarty->assign('votes', $pollService->splitVotes($votes));
|
$smarty->assign('votes', $pollService->splitVotes($votes));
|
||||||
$smarty->assign('best_choices', $pollService->computeBestChoices($votes));
|
$smarty->assign('best_choices', $pollService->computeBestChoices($votes, $poll));
|
||||||
$smarty->assign('comments', $comments);
|
$smarty->assign('comments', $comments);
|
||||||
$smarty->assign('editingVoteId', $editingVoteId);
|
$smarty->assign('editingVoteId', $editingVoteId);
|
||||||
$smarty->assign('message', $message);
|
$smarty->assign('message', $message);
|
||||||
@ -421,5 +463,7 @@ $smarty->assign('hidden', false);
|
|||||||
$smarty->assign('accessGranted', true);
|
$smarty->assign('accessGranted', true);
|
||||||
$smarty->assign('resultPubliclyVisible', true);
|
$smarty->assign('resultPubliclyVisible', true);
|
||||||
$smarty->assign('editedVoteUniqueId', '');
|
$smarty->assign('editedVoteUniqueId', '');
|
||||||
|
$smarty->assign('default_to_marldown_editor', $config['markdown_editor_by_default']);
|
||||||
|
$smarty->assign('selectedNewVotes', $selectedNewVotes);
|
||||||
|
|
||||||
$smarty->display('studs.tpl');
|
$smarty->display('studs.tpl');
|
||||||
|
@ -33,7 +33,7 @@ class Choice
|
|||||||
public function __construct($name='')
|
public function __construct($name='')
|
||||||
{
|
{
|
||||||
$this->name = $name;
|
$this->name = $name;
|
||||||
$this->slots = array();
|
$this->slots = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addSlot($slot)
|
public function addSlot($slot)
|
||||||
@ -55,5 +55,4 @@ class Choice
|
|||||||
{
|
{
|
||||||
return strcmp($a->name, $b->name);
|
return strcmp($a->name, $b->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
|
|
||||||
namespace Framadate;
|
namespace Framadate;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Editable
|
* Class Editable
|
||||||
*
|
*
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
namespace Framadate\Exception;
|
namespace Framadate\Exception;
|
||||||
|
|
||||||
class AlreadyExistsException extends \Exception {
|
class AlreadyExistsException extends \Exception {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
namespace Framadate\Exception;
|
namespace Framadate\Exception;
|
||||||
|
|
||||||
class ConcurrentEditionException extends \Exception {
|
class ConcurrentEditionException extends \Exception {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
12
app/classes/Framadate/Exception/ConcurrentVoteException.php
Normal file
12
app/classes/Framadate/Exception/ConcurrentVoteException.php
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
namespace Framadate\Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ConcurrentVoteException
|
||||||
|
*
|
||||||
|
* Thrown when a poll has a maximum votes constraint for options, and a vote happened since the poll was rendered
|
||||||
|
*/
|
||||||
|
class ConcurrentVoteException extends \Exception {
|
||||||
|
function __construct() {
|
||||||
|
}
|
||||||
|
}
|
@ -2,8 +2,6 @@
|
|||||||
namespace Framadate\Exception;
|
namespace Framadate\Exception;
|
||||||
|
|
||||||
class MomentAlreadyExistsException extends \Exception {
|
class MomentAlreadyExistsException extends \Exception {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,6 @@ namespace Framadate;
|
|||||||
|
|
||||||
class Form
|
class Form
|
||||||
{
|
{
|
||||||
|
|
||||||
public $title;
|
public $title;
|
||||||
public $id;
|
public $id;
|
||||||
public $description;
|
public $description;
|
||||||
@ -29,6 +28,7 @@ class Form
|
|||||||
public $format;
|
public $format;
|
||||||
public $end_date;
|
public $end_date;
|
||||||
public $choix_sondage;
|
public $choix_sondage;
|
||||||
|
public $ValueMax;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tells if users can modify their choices.
|
* Tells if users can modify their choices.
|
||||||
@ -50,6 +50,12 @@ class Form
|
|||||||
* If true, only the poll maker can see the poll's results
|
* If true, only the poll maker can see the poll's results
|
||||||
* @var boolean
|
* @var boolean
|
||||||
*/
|
*/
|
||||||
|
public $use_ValueMax;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* if true, there will be a limit of voters per option
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
public $hidden;
|
public $hidden;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -87,7 +93,7 @@ class Form
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function clearChoices() {
|
public function clearChoices() {
|
||||||
$this->choices = array();
|
$this->choices = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addChoice(Choice $choice)
|
public function addChoice(Choice $choice)
|
||||||
@ -102,7 +108,6 @@ class Form
|
|||||||
|
|
||||||
public function sortChoices()
|
public function sortChoices()
|
||||||
{
|
{
|
||||||
usort($this->choices, array('Framadate\Choice', 'compare'));
|
usort($this->choices, ['Framadate\Choice', 'compare']);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
namespace Framadate;
|
namespace Framadate;
|
||||||
|
|
||||||
class Message {
|
class Message {
|
||||||
|
|
||||||
var $type;
|
var $type;
|
||||||
var $message;
|
var $message;
|
||||||
var $link;
|
var $link;
|
||||||
@ -35,6 +34,5 @@ class Message {
|
|||||||
$this->linkIcon = $linkIcon;
|
$this->linkIcon = $linkIcon;
|
||||||
$this->includeTemplate = $includeTemplate;
|
$this->includeTemplate = $includeTemplate;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,70 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This software is governed by the CeCILL-B license. If a copy of this license
|
||||||
|
* is not distributed with this file, you can obtain one at
|
||||||
|
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
|
||||||
|
*
|
||||||
|
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
|
||||||
|
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
|
||||||
|
*
|
||||||
|
* =============================
|
||||||
|
*
|
||||||
|
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
|
||||||
|
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
|
||||||
|
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
|
||||||
|
*
|
||||||
|
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
||||||
|
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
||||||
|
*/
|
||||||
|
namespace Framadate\Migration;
|
||||||
|
|
||||||
|
use Framadate\Utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This migration adds the field Value_Max on the poll table.
|
||||||
|
*
|
||||||
|
* @package Framadate\Migration
|
||||||
|
* @version 0.9
|
||||||
|
*/
|
||||||
|
class AddColumn_ValueMax_In_poll_For_1_1 implements Migration {
|
||||||
|
function __construct() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method should describe in english what is the purpose of the migration class.
|
||||||
|
*
|
||||||
|
* @return string The description of the migration class
|
||||||
|
*/
|
||||||
|
function description() {
|
||||||
|
return 'Add column "ValueMax" in table "vote" for version 0.9';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method could check if the execute method should be called.
|
||||||
|
* It is called before the execute method.
|
||||||
|
*
|
||||||
|
* @param \PDO $pdo The connection to database
|
||||||
|
* @return bool true is the Migration should be executed.
|
||||||
|
*/
|
||||||
|
function preCondition(\PDO $pdo) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called only one time in the migration page.
|
||||||
|
*
|
||||||
|
* @param \PDO $pdo The connection to database
|
||||||
|
* @return bool true is the execution succeeded
|
||||||
|
*/
|
||||||
|
function execute(\PDO $pdo) {
|
||||||
|
$this->alterPollTable($pdo);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function alterPollTable(\PDO $pdo) {
|
||||||
|
$pdo->exec('
|
||||||
|
ALTER TABLE `' . Utils::table('poll') . '`
|
||||||
|
ADD `ValueMax` TINYINT NULL;');
|
||||||
|
}
|
||||||
|
}
|
@ -27,7 +27,6 @@ use Framadate\Utils;
|
|||||||
* @version 0.9
|
* @version 0.9
|
||||||
*/
|
*/
|
||||||
class AddColumn_hidden_In_poll_For_0_9 implements Migration {
|
class AddColumn_hidden_In_poll_For_0_9 implements Migration {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,5 +72,4 @@ class AddColumn_hidden_In_poll_For_0_9 implements Migration {
|
|||||||
ALTER TABLE `' . Utils::table('poll') . '`
|
ALTER TABLE `' . Utils::table('poll') . '`
|
||||||
ADD `hidden` TINYINT( 1 ) NOT NULL DEFAULT "0"');
|
ADD `hidden` TINYINT( 1 ) NOT NULL DEFAULT "0"');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,6 @@ use Framadate\Utils;
|
|||||||
* @version 0.9
|
* @version 0.9
|
||||||
*/
|
*/
|
||||||
class AddColumn_receiveNewComments_For_0_9 implements Migration {
|
class AddColumn_receiveNewComments_For_0_9 implements Migration {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,5 +73,4 @@ ALTER TABLE `' . Utils::table('poll') . '`
|
|||||||
ADD `receiveNewComments` TINYINT(1) DEFAULT \'0\'
|
ADD `receiveNewComments` TINYINT(1) DEFAULT \'0\'
|
||||||
AFTER `receiveNewVotes`');
|
AFTER `receiveNewVotes`');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,6 @@ use Framadate\Utils;
|
|||||||
* @version 0.9
|
* @version 0.9
|
||||||
*/
|
*/
|
||||||
class AddColumn_uniqId_In_vote_For_0_9 implements Migration {
|
class AddColumn_uniqId_In_vote_For_0_9 implements Migration {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,5 +74,4 @@ class AddColumn_uniqId_In_vote_For_0_9 implements Migration {
|
|||||||
AFTER `id`,
|
AFTER `id`,
|
||||||
ADD INDEX (`uniqId`) ;');
|
ADD INDEX (`uniqId`) ;');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,6 @@ use Framadate\Utils;
|
|||||||
* @version 0.9
|
* @version 0.9
|
||||||
*/
|
*/
|
||||||
class AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9 implements Migration {
|
class AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9 implements Migration {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,5 +73,4 @@ class AddColumns_password_hash_And_results_publicly_visible_In_poll_For_0_9 impl
|
|||||||
ADD `password_hash` VARCHAR(255) NULL DEFAULT NULL ,
|
ADD `password_hash` VARCHAR(255) NULL DEFAULT NULL ,
|
||||||
ADD `results_publicly_visible` TINYINT(1) NULL DEFAULT NULL');
|
ADD `results_publicly_visible` TINYINT(1) NULL DEFAULT NULL');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,6 @@ use Framadate\Utils;
|
|||||||
* @version 1.0
|
* @version 1.0
|
||||||
*/
|
*/
|
||||||
class Alter_Comment_table_adding_date implements Migration {
|
class Alter_Comment_table_adding_date implements Migration {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,5 +67,4 @@ class Alter_Comment_table_adding_date implements Migration {
|
|||||||
ALTER TABLE `' . Utils::table('comment') . '`
|
ALTER TABLE `' . Utils::table('comment') . '`
|
||||||
ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;');
|
ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,6 @@ use Framadate\Utils;
|
|||||||
* @version 1.0
|
* @version 1.0
|
||||||
*/
|
*/
|
||||||
class Alter_Comment_table_for_name_length implements Migration {
|
class Alter_Comment_table_for_name_length implements Migration {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,5 +67,4 @@ class Alter_Comment_table_for_name_length implements Migration {
|
|||||||
ALTER TABLE `' . Utils::table('comment') . '`
|
ALTER TABLE `' . Utils::table('comment') . '`
|
||||||
CHANGE `name` `name` VARCHAR( 64 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ;');
|
CHANGE `name` `name` VARCHAR( 64 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ;');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
70
app/classes/Framadate/Migration/Fix_MySQL_No_Zero_Date.php
Normal file
70
app/classes/Framadate/Migration/Fix_MySQL_No_Zero_Date.php
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This software is governed by the CeCILL-B license. If a copy of this license
|
||||||
|
* is not distributed with this file, you can obtain one at
|
||||||
|
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
|
||||||
|
*
|
||||||
|
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
|
||||||
|
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
|
||||||
|
*
|
||||||
|
* =============================
|
||||||
|
*
|
||||||
|
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
|
||||||
|
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
|
||||||
|
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
|
||||||
|
*
|
||||||
|
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
||||||
|
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
||||||
|
*/
|
||||||
|
namespace Framadate\Migration;
|
||||||
|
|
||||||
|
use Framadate\Utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This migration sets Poll.end_date to NULL by default
|
||||||
|
*
|
||||||
|
* @package Framadate\Migration
|
||||||
|
* @version 1.1
|
||||||
|
*/
|
||||||
|
class Fix_MySQL_No_Zero_Date implements Migration {
|
||||||
|
function __construct() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method should describe in english what is the purpose of the migration class.
|
||||||
|
*
|
||||||
|
* @return string The description of the migration class
|
||||||
|
*/
|
||||||
|
function description() {
|
||||||
|
return 'Sets Poll end_date to NULL by default (work around MySQL NO_ZERO_DATE)';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method could check if the execute method should be called.
|
||||||
|
* It is called before the execute method.
|
||||||
|
*
|
||||||
|
* @param \PDO $pdo The connection to database
|
||||||
|
* @return bool true if the Migration should be executed.
|
||||||
|
*/
|
||||||
|
function preCondition(\PDO $pdo) {
|
||||||
|
$stmt = $pdo->prepare("SELECT Column_Default from Information_Schema.Columns where Table_Name = ? AND Column_Name = ?;");
|
||||||
|
$stmt->bindValue(1, Utils::table('poll'));
|
||||||
|
$stmt->bindValue(2, 'end_date');
|
||||||
|
$stmt->execute();
|
||||||
|
$default = $stmt->fetch(\PDO::FETCH_COLUMN);
|
||||||
|
|
||||||
|
$driver_name = $pdo->getAttribute(\PDO::ATTR_DRIVER_NAME);
|
||||||
|
|
||||||
|
return $default !== null && $driver_name === 'mysql';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called only one time in the migration page.
|
||||||
|
*
|
||||||
|
* @param \PDO $pdo The connection to database
|
||||||
|
* @return bool|void if the execution succeeded
|
||||||
|
*/
|
||||||
|
function execute(\PDO $pdo) {
|
||||||
|
$pdo->exec('ALTER TABLE ' . Utils::table('poll') . ' MODIFY end_date TIMESTAMP NULL DEFAULT NULL;');
|
||||||
|
}
|
||||||
|
}
|
@ -27,7 +27,6 @@ use Framadate\Utils;
|
|||||||
* @version 0.8
|
* @version 0.8
|
||||||
*/
|
*/
|
||||||
class From_0_0_to_0_8_Migration implements Migration {
|
class From_0_0_to_0_8_Migration implements Migration {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,7 +71,7 @@ CREATE TABLE IF NOT EXISTS `sondage` (
|
|||||||
`titre` text,
|
`titre` text,
|
||||||
`id_sondage_admin` char(24) DEFAULT NULL,
|
`id_sondage_admin` char(24) DEFAULT NULL,
|
||||||
`date_creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
`date_creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
`date_fin` timestamp NOT NULL,
|
`date_fin` timestamp NULL DEFAULT NULL,
|
||||||
`format` varchar(2) DEFAULT NULL,
|
`format` varchar(2) DEFAULT NULL,
|
||||||
`mailsonde` tinyint(1) DEFAULT \'0\',
|
`mailsonde` tinyint(1) DEFAULT \'0\',
|
||||||
`statut` int(11) NOT NULL DEFAULT \'1\' COMMENT \'1 = actif ; 0 = inactif ; \',
|
`statut` int(11) NOT NULL DEFAULT \'1\' COMMENT \'1 = actif ; 0 = inactif ; \',
|
||||||
|
@ -27,7 +27,6 @@ use Framadate\Utils;
|
|||||||
* @version 0.9
|
* @version 0.9
|
||||||
*/
|
*/
|
||||||
class From_0_8_to_0_9_Migration implements Migration {
|
class From_0_8_to_0_9_Migration implements Migration {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,7 +89,7 @@ CREATE TABLE IF NOT EXISTS `' . Utils::table('poll') . '` (
|
|||||||
`admin_name` VARCHAR(64) DEFAULT NULL,
|
`admin_name` VARCHAR(64) DEFAULT NULL,
|
||||||
`admin_mail` VARCHAR(128) DEFAULT NULL,
|
`admin_mail` VARCHAR(128) DEFAULT NULL,
|
||||||
`creation_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
`creation_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
`end_date` TIMESTAMP NOT NULL,
|
`end_date` TIMESTAMP NULL DEFAULT NULL,
|
||||||
`format` VARCHAR(1) DEFAULT NULL,
|
`format` VARCHAR(1) DEFAULT NULL,
|
||||||
`editable` TINYINT(1) DEFAULT \'0\',
|
`editable` TINYINT(1) DEFAULT \'0\',
|
||||||
`receiveNewVotes` TINYINT(1) DEFAULT \'0\',
|
`receiveNewVotes` TINYINT(1) DEFAULT \'0\',
|
||||||
@ -265,14 +264,14 @@ VALUE (?,?,?)');
|
|||||||
$slots[] = $slot;
|
$slots[] = $slot;
|
||||||
} else { // Date poll
|
} else { // Date poll
|
||||||
$values = explode('@', $atomicSlot);
|
$values = explode('@', $atomicSlot);
|
||||||
if ($lastSlot == null || $lastSlot->title !== $values[0]) {
|
if ($lastSlot === null || $lastSlot->title !== $values[0]) {
|
||||||
$lastSlot = new \stdClass();
|
$lastSlot = new \stdClass();
|
||||||
$lastSlot->poll_id = $sujet->id_sondage;
|
$lastSlot->poll_id = $sujet->id_sondage;
|
||||||
$lastSlot->title = $values[0];
|
$lastSlot->title = $values[0];
|
||||||
$lastSlot->moments = count($values) == 2 ? $values[1] : '-';
|
$lastSlot->moments = count($values) === 2 ? $values[1] : '-';
|
||||||
$slots[] = $lastSlot;
|
$slots[] = $lastSlot;
|
||||||
} else {
|
} else {
|
||||||
$lastSlot->moments .= ',' . (count($values) == 2 ? $values[1] : '-');
|
$lastSlot->moments .= ',' . (count($values) === 2 ? $values[1] : '-');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,6 @@ use Framadate\Utils;
|
|||||||
* @version 0.9
|
* @version 0.9
|
||||||
*/
|
*/
|
||||||
class Generate_uniqId_for_old_votes implements Migration {
|
class Generate_uniqId_for_old_votes implements Migration {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,7 +51,6 @@ class Generate_uniqId_for_old_votes implements Migration {
|
|||||||
* @return bool true is the execution succeeded
|
* @return bool true is the execution succeeded
|
||||||
*/
|
*/
|
||||||
function execute(\PDO $pdo) {
|
function execute(\PDO $pdo) {
|
||||||
|
|
||||||
$pdo->beginTransaction();
|
$pdo->beginTransaction();
|
||||||
$this->generateUniqIdsForEmptyOnes($pdo);
|
$this->generateUniqIdsForEmptyOnes($pdo);
|
||||||
$pdo->commit();
|
$pdo->commit();
|
||||||
@ -79,5 +77,4 @@ UPDATE `' . Utils::table('vote') . '`
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ namespace Framadate\Migration;
|
|||||||
use Framadate\Utils;
|
use Framadate\Utils;
|
||||||
|
|
||||||
class Increase_pollId_size implements Migration {
|
class Increase_pollId_size implements Migration {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
namespace Framadate\Migration;
|
namespace Framadate\Migration;
|
||||||
|
|
||||||
interface Migration {
|
interface Migration {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method should describe in english what is the purpose of the migration class.
|
* This method should describe in english what is the purpose of the migration class.
|
||||||
*
|
*
|
||||||
@ -43,6 +42,5 @@ interface Migration {
|
|||||||
* @return bool true if the execution succeeded
|
* @return bool true if the execution succeeded
|
||||||
*/
|
*/
|
||||||
function execute(\PDO $pdo);
|
function execute(\PDO $pdo);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -28,7 +28,6 @@ use Framadate\Utils;
|
|||||||
* @version 0.9
|
* @version 0.9
|
||||||
*/
|
*/
|
||||||
class RPadVotes_from_0_8 implements Migration {
|
class RPadVotes_from_0_8 implements Migration {
|
||||||
|
|
||||||
function description() {
|
function description() {
|
||||||
return 'RPad votes from version 0.8.';
|
return 'RPad votes from version 0.8.';
|
||||||
}
|
}
|
||||||
@ -43,7 +42,6 @@ class RPadVotes_from_0_8 implements Migration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function execute(\PDO $pdo) {
|
function execute(\PDO $pdo) {
|
||||||
|
|
||||||
$pdo->beginTransaction();
|
$pdo->beginTransaction();
|
||||||
$this->rpadVotes($pdo);
|
$this->rpadVotes($pdo);
|
||||||
$pdo->commit();
|
$pdo->commit();
|
||||||
@ -52,13 +50,13 @@ class RPadVotes_from_0_8 implements Migration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function rpadVotes($pdo) {
|
private function rpadVotes($pdo) {
|
||||||
$pdo->exec('UPDATE '. Utils::table('vote') .' fv
|
$pdo->exec('UPDATE ' . Utils::table('vote') . ' fv
|
||||||
INNER JOIN (
|
INNER JOIN (
|
||||||
SELECT v.id, RPAD(v.choices, inn.slots_count, \'0\') new_choices
|
SELECT v.id, RPAD(v.choices, inn.slots_count, \'0\') new_choices
|
||||||
FROM '. Utils::table('vote') .' v
|
FROM ' . Utils::table('vote') . ' v
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
(SELECT s.poll_id, SUM(IFNULL(LENGTH(s.moments) - LENGTH(REPLACE(s.moments, \',\', \'\')) + 1, 1)) slots_count
|
(SELECT s.poll_id, SUM(IFNULL(LENGTH(s.moments) - LENGTH(REPLACE(s.moments, \',\', \'\')) + 1, 1)) slots_count
|
||||||
FROM '. Utils::table('slot') .' s
|
FROM ' . Utils::table('slot') . ' s
|
||||||
GROUP BY s.poll_id
|
GROUP BY s.poll_id
|
||||||
ORDER BY s.poll_id) inn ON inn.poll_id = v.poll_id
|
ORDER BY s.poll_id) inn ON inn.poll_id = v.poll_id
|
||||||
WHERE LENGTH(v.choices) != inn.slots_count
|
WHERE LENGTH(v.choices) != inn.slots_count
|
||||||
|
@ -4,7 +4,6 @@ namespace Framadate\Repositories;
|
|||||||
use Framadate\FramaDB;
|
use Framadate\FramaDB;
|
||||||
|
|
||||||
abstract class AbstractRepository {
|
abstract class AbstractRepository {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var FramaDB
|
* @var FramaDB
|
||||||
*/
|
*/
|
||||||
@ -41,5 +40,4 @@ abstract class AbstractRepository {
|
|||||||
function lastInsertId() {
|
function lastInsertId() {
|
||||||
return $this->connect->lastInsertId();
|
return $this->connect->lastInsertId();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,13 @@ use Framadate\FramaDB;
|
|||||||
use Framadate\Utils;
|
use Framadate\Utils;
|
||||||
|
|
||||||
class CommentRepository extends AbstractRepository {
|
class CommentRepository extends AbstractRepository {
|
||||||
|
|
||||||
function __construct(FramaDB $connect) {
|
function __construct(FramaDB $connect) {
|
||||||
parent::__construct($connect);
|
parent::__construct($connect);
|
||||||
}
|
}
|
||||||
|
|
||||||
function findAllByPollId($poll_id) {
|
function findAllByPollId($poll_id) {
|
||||||
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('comment') . '` WHERE poll_id = ? ORDER BY id');
|
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('comment') . '` WHERE poll_id = ? ORDER BY id');
|
||||||
$prepared->execute(array($poll_id));
|
$prepared->execute([$poll_id]);
|
||||||
|
|
||||||
return $prepared->fetchAll();
|
return $prepared->fetchAll();
|
||||||
}
|
}
|
||||||
@ -51,9 +50,8 @@ class CommentRepository extends AbstractRepository {
|
|||||||
|
|
||||||
public function exists($poll_id, $name, $comment) {
|
public function exists($poll_id, $name, $comment) {
|
||||||
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('comment') . '` WHERE poll_id = ? AND name = ? AND comment = ?');
|
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('comment') . '` WHERE poll_id = ? AND name = ? AND comment = ?');
|
||||||
$prepared->execute(array($poll_id, $name, $comment));
|
$prepared->execute([$poll_id, $name, $comment]);
|
||||||
|
|
||||||
return $prepared->rowCount() > 0;
|
return $prepared->rowCount() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,23 +6,22 @@ use Framadate\Utils;
|
|||||||
use PDO;
|
use PDO;
|
||||||
|
|
||||||
class PollRepository extends AbstractRepository {
|
class PollRepository extends AbstractRepository {
|
||||||
|
|
||||||
function __construct(FramaDB $connect) {
|
function __construct(FramaDB $connect) {
|
||||||
parent::__construct($connect);
|
parent::__construct($connect);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function insertPoll($poll_id, $admin_poll_id, $form) {
|
public function insertPoll($poll_id, $admin_poll_id, $form) {
|
||||||
$sql = 'INSERT INTO `' . Utils::table('poll') . '`
|
$sql = 'INSERT INTO `' . Utils::table('poll') . '`
|
||||||
(id, admin_id, title, description, admin_name, admin_mail, end_date, format, editable, receiveNewVotes, receiveNewComments, hidden, password_hash, results_publicly_visible)
|
(id, admin_id, title, description, admin_name, admin_mail, end_date, format, editable, receiveNewVotes, receiveNewComments, hidden, password_hash, results_publicly_visible,ValueMax)
|
||||||
VALUES (?,?,?,?,?,?,FROM_UNIXTIME(?),?,?,?,?,?,?,?)';
|
VALUES (?,?,?,?,?,?,FROM_UNIXTIME(?),?,?,?,?,?,?,?,?)';
|
||||||
$prepared = $this->prepare($sql);
|
$prepared = $this->prepare($sql);
|
||||||
$prepared->execute(array($poll_id, $admin_poll_id, $form->title, $form->description, $form->admin_name, $form->admin_mail, $form->end_date, $form->format, ($form->editable>=0 && $form->editable<=2) ? $form->editable : 0, $form->receiveNewVotes ? 1 : 0, $form->receiveNewComments ? 1 : 0, $form->hidden ? 1 : 0, $form->password_hash, $form->results_publicly_visible ? 1 : 0));
|
$prepared->execute([$poll_id, $admin_poll_id, $form->title, $form->description, $form->admin_name, $form->admin_mail, $form->end_date, $form->format, ($form->editable>=0 && $form->editable<=2) ? $form->editable : 0, $form->receiveNewVotes ? 1 : 0, $form->receiveNewComments ? 1 : 0, $form->hidden ? 1 : 0, $form->password_hash, $form->results_publicly_visible ? 1 : 0,$form->ValueMax]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function findById($poll_id) {
|
function findById($poll_id) {
|
||||||
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE id = ?');
|
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE id = ?');
|
||||||
|
|
||||||
$prepared->execute(array($poll_id));
|
$prepared->execute([$poll_id]);
|
||||||
$poll = $prepared->fetch();
|
$poll = $prepared->fetch();
|
||||||
$prepared->closeCursor();
|
$prepared->closeCursor();
|
||||||
|
|
||||||
@ -32,7 +31,7 @@ class PollRepository extends AbstractRepository {
|
|||||||
public function findByAdminId($admin_poll_id) {
|
public function findByAdminId($admin_poll_id) {
|
||||||
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE admin_id = ?');
|
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE admin_id = ?');
|
||||||
|
|
||||||
$prepared->execute(array($admin_poll_id));
|
$prepared->execute([$admin_poll_id]);
|
||||||
$poll = $prepared->fetch();
|
$poll = $prepared->fetch();
|
||||||
$prepared->closeCursor();
|
$prepared->closeCursor();
|
||||||
|
|
||||||
@ -42,7 +41,7 @@ class PollRepository extends AbstractRepository {
|
|||||||
public function existsById($poll_id) {
|
public function existsById($poll_id) {
|
||||||
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('poll') . '` WHERE id = ?');
|
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('poll') . '` WHERE id = ?');
|
||||||
|
|
||||||
$prepared->execute(array($poll_id));
|
$prepared->execute([$poll_id]);
|
||||||
|
|
||||||
return $prepared->rowCount() > 0;
|
return $prepared->rowCount() > 0;
|
||||||
}
|
}
|
||||||
@ -50,7 +49,7 @@ class PollRepository extends AbstractRepository {
|
|||||||
public function existsByAdminId($admin_poll_id) {
|
public function existsByAdminId($admin_poll_id) {
|
||||||
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('poll') . '` WHERE admin_id = ?');
|
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('poll') . '` WHERE admin_id = ?');
|
||||||
|
|
||||||
$prepared->execute(array($admin_poll_id));
|
$prepared->execute([$admin_poll_id]);
|
||||||
|
|
||||||
return $prepared->rowCount() > 0;
|
return $prepared->rowCount() > 0;
|
||||||
}
|
}
|
||||||
@ -80,7 +79,7 @@ class PollRepository extends AbstractRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search polls in databse.
|
* Search polls in database.
|
||||||
*
|
*
|
||||||
* @param array $search Array of search : ['id'=>..., 'title'=>..., 'name'=>..., 'mail'=>...]
|
* @param array $search Array of search : ['id'=>..., 'title'=>..., 'name'=>..., 'mail'=>...]
|
||||||
* @param int $start The number of first entry to select
|
* @param int $start The number of first entry to select
|
||||||
@ -89,28 +88,48 @@ class PollRepository extends AbstractRepository {
|
|||||||
*/
|
*/
|
||||||
public function findAll($search, $start, $limit) {
|
public function findAll($search, $start, $limit) {
|
||||||
// Polls
|
// Polls
|
||||||
$prepared = $this->prepare('
|
|
||||||
SELECT p.*,
|
|
||||||
(SELECT count(1) FROM `' . Utils::table('vote') . '` v WHERE p.id=v.poll_id) votes
|
|
||||||
FROM `' . Utils::table('poll') . '` p
|
|
||||||
WHERE (:id = "" OR p.id LIKE :id)
|
|
||||||
AND (:title = "" OR p.title LIKE :title)
|
|
||||||
AND (:name = "" OR p.admin_name LIKE :name)
|
|
||||||
AND (:mail = "" OR p.admin_mail LIKE :mail)
|
|
||||||
ORDER BY p.title ASC
|
|
||||||
LIMIT :start, :limit
|
|
||||||
');
|
|
||||||
|
|
||||||
$poll = $search['poll'] . '%';
|
$request = "";
|
||||||
$title = '%' . $search['title'] . '%';
|
$request .= "SELECT p.*,";
|
||||||
$name = '%' . $search['name'] . '%';
|
$request .= " (SELECT count(1) FROM `" . Utils::table('vote') . "` v WHERE p.id=v.poll_id) votes";
|
||||||
$mail = '%' . $search['mail'] . '%';
|
$request .= " FROM `" . Utils::table('poll') . "` p";
|
||||||
$prepared->bindParam(':id', $poll, PDO::PARAM_STR);
|
$request .= " WHERE 1";
|
||||||
$prepared->bindParam(':title', $title, PDO::PARAM_STR);
|
|
||||||
$prepared->bindParam(':name', $name, PDO::PARAM_STR);
|
$values = [];
|
||||||
$prepared->bindParam(':mail', $mail, PDO::PARAM_STR);
|
|
||||||
|
if (!empty($search["poll"])) {
|
||||||
|
$request .= " AND p.id LIKE :poll";
|
||||||
|
$values["poll"] = "{$search["poll"]}%";
|
||||||
|
}
|
||||||
|
|
||||||
|
$fields = [
|
||||||
|
// key of $search => column name
|
||||||
|
"title" => "title",
|
||||||
|
"name" => "admin_name",
|
||||||
|
"mail" => "admin_mail",
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($fields as $searchKey => $columnName) {
|
||||||
|
if (empty($search[$searchKey])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$request .= " AND p.$columnName LIKE :$searchKey";
|
||||||
|
$values[$searchKey] = "%{$search[$searchKey]}%";
|
||||||
|
}
|
||||||
|
|
||||||
|
$request .= " ORDER BY p.title ASC";
|
||||||
|
$request .= " LIMIT :start, :limit";
|
||||||
|
|
||||||
|
$prepared = $this->prepare($request);
|
||||||
|
|
||||||
|
foreach ($values as $searchKey => $value) {
|
||||||
|
$prepared->bindParam(":$searchKey", $value, PDO::PARAM_STR);
|
||||||
|
}
|
||||||
|
|
||||||
$prepared->bindParam(':start', $start, PDO::PARAM_INT);
|
$prepared->bindParam(':start', $start, PDO::PARAM_INT);
|
||||||
$prepared->bindParam(':limit', $limit, PDO::PARAM_INT);
|
$prepared->bindParam(':limit', $limit, PDO::PARAM_INT);
|
||||||
|
|
||||||
$prepared->execute();
|
$prepared->execute();
|
||||||
|
|
||||||
return $prepared->fetchAll();
|
return $prepared->fetchAll();
|
||||||
@ -124,7 +143,7 @@ SELECT p.*,
|
|||||||
*/
|
*/
|
||||||
public function findAllByAdminMail($mail) {
|
public function findAllByAdminMail($mail) {
|
||||||
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE admin_mail = :admin_mail');
|
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('poll') . '` WHERE admin_mail = :admin_mail');
|
||||||
$prepared->execute(array('admin_mail' => $mail));
|
$prepared->execute(['admin_mail' => $mail]);
|
||||||
|
|
||||||
return $prepared->fetchAll();
|
return $prepared->fetchAll();
|
||||||
}
|
}
|
||||||
@ -145,9 +164,9 @@ SELECT count(1) nb
|
|||||||
AND (:name = "" OR p.admin_name LIKE :name)
|
AND (:name = "" OR p.admin_name LIKE :name)
|
||||||
ORDER BY p.title ASC');
|
ORDER BY p.title ASC');
|
||||||
|
|
||||||
$poll = $search == null ? '' : $search['poll'] . '%';
|
$poll = $search === null ? '' : $search['poll'] . '%';
|
||||||
$title = $search == null ? '' : '%' . $search['title'] . '%';
|
$title = $search === null ? '' : '%' . $search['title'] . '%';
|
||||||
$name = $search == null ? '' : '%' . $search['name'] . '%';
|
$name = $search === null ? '' : '%' . $search['name'] . '%';
|
||||||
$prepared->bindParam(':id', $poll, PDO::PARAM_STR);
|
$prepared->bindParam(':id', $poll, PDO::PARAM_STR);
|
||||||
$prepared->bindParam(':title', $title, PDO::PARAM_STR);
|
$prepared->bindParam(':title', $title, PDO::PARAM_STR);
|
||||||
$prepared->bindParam(':name', $name, PDO::PARAM_STR);
|
$prepared->bindParam(':name', $name, PDO::PARAM_STR);
|
||||||
@ -162,5 +181,4 @@ SELECT count(1) nb
|
|||||||
|
|
||||||
return $count->nb;
|
return $count->nb;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,16 +4,16 @@
|
|||||||
* is not distributed with this file, you can obtain one at
|
* is not distributed with this file, you can obtain one at
|
||||||
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
|
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
|
||||||
*
|
*
|
||||||
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
|
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
|
||||||
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
|
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
|
||||||
*
|
*
|
||||||
* =============================
|
* =============================
|
||||||
*
|
*
|
||||||
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
|
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
|
||||||
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
|
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
|
||||||
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
|
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
|
||||||
*
|
*
|
||||||
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
||||||
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
||||||
*/
|
*/
|
||||||
namespace Framadate\Repositories;
|
namespace Framadate\Repositories;
|
||||||
@ -21,7 +21,6 @@ namespace Framadate\Repositories;
|
|||||||
use Framadate\FramaDB;
|
use Framadate\FramaDB;
|
||||||
|
|
||||||
class RepositoryFactory {
|
class RepositoryFactory {
|
||||||
|
|
||||||
private static $connect;
|
private static $connect;
|
||||||
|
|
||||||
private static $pollRepository;
|
private static $pollRepository;
|
||||||
@ -40,7 +39,7 @@ class RepositoryFactory {
|
|||||||
* @return PollRepository The singleton of PollRepository
|
* @return PollRepository The singleton of PollRepository
|
||||||
*/
|
*/
|
||||||
static function pollRepository() {
|
static function pollRepository() {
|
||||||
if (self::$pollRepository == null) {
|
if (self::$pollRepository === null) {
|
||||||
self::$pollRepository = new PollRepository(self::$connect);
|
self::$pollRepository = new PollRepository(self::$connect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,7 +50,7 @@ class RepositoryFactory {
|
|||||||
* @return SlotRepository The singleton of SlotRepository
|
* @return SlotRepository The singleton of SlotRepository
|
||||||
*/
|
*/
|
||||||
static function slotRepository() {
|
static function slotRepository() {
|
||||||
if (self::$slotRepository == null) {
|
if (self::$slotRepository === null) {
|
||||||
self::$slotRepository = new SlotRepository(self::$connect);
|
self::$slotRepository = new SlotRepository(self::$connect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,7 +61,7 @@ class RepositoryFactory {
|
|||||||
* @return VoteRepository The singleton of VoteRepository
|
* @return VoteRepository The singleton of VoteRepository
|
||||||
*/
|
*/
|
||||||
static function voteRepository() {
|
static function voteRepository() {
|
||||||
if (self::$voteRepository == null) {
|
if (self::$voteRepository === null) {
|
||||||
self::$voteRepository = new VoteRepository(self::$connect);
|
self::$voteRepository = new VoteRepository(self::$connect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,11 +72,10 @@ class RepositoryFactory {
|
|||||||
* @return CommentRepository The singleton of CommentRepository
|
* @return CommentRepository The singleton of CommentRepository
|
||||||
*/
|
*/
|
||||||
static function commentRepository() {
|
static function commentRepository() {
|
||||||
if (self::$commentRepository == null) {
|
if (self::$commentRepository === null) {
|
||||||
self::$commentRepository = new CommentRepository(self::$connect);
|
self::$commentRepository = new CommentRepository(self::$connect);
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::$commentRepository;
|
return self::$commentRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,6 @@ use Framadate\FramaDB;
|
|||||||
use Framadate\Utils;
|
use Framadate\Utils;
|
||||||
|
|
||||||
class SlotRepository extends AbstractRepository {
|
class SlotRepository extends AbstractRepository {
|
||||||
|
|
||||||
function __construct(FramaDB $connect) {
|
function __construct(FramaDB $connect) {
|
||||||
parent::__construct($connect);
|
parent::__construct($connect);
|
||||||
}
|
}
|
||||||
@ -37,7 +36,6 @@ class SlotRepository extends AbstractRepository {
|
|||||||
$prepared = $this->prepare('INSERT INTO `' . Utils::table('slot') . '` (poll_id, title, moments) VALUES (?, ?, ?)');
|
$prepared = $this->prepare('INSERT INTO `' . Utils::table('slot') . '` (poll_id, title, moments) VALUES (?, ?, ?)');
|
||||||
|
|
||||||
foreach ($choices as $choice) {
|
foreach ($choices as $choice) {
|
||||||
|
|
||||||
// We prepared the slots (joined by comas)
|
// We prepared the slots (joined by comas)
|
||||||
$joinedSlots = '';
|
$joinedSlots = '';
|
||||||
$first = true;
|
$first = true;
|
||||||
@ -52,17 +50,16 @@ class SlotRepository extends AbstractRepository {
|
|||||||
|
|
||||||
// We execute the insertion
|
// We execute the insertion
|
||||||
if (empty($joinedSlots)) {
|
if (empty($joinedSlots)) {
|
||||||
$prepared->execute(array($poll_id, $choice->getName(), null));
|
$prepared->execute([$poll_id, $choice->getName(), null]);
|
||||||
} else {
|
} else {
|
||||||
$prepared->execute(array($poll_id, $choice->getName(), $joinedSlots));
|
$prepared->execute([$poll_id, $choice->getName(), $joinedSlots]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function listByPollId($poll_id) {
|
function listByPollId($poll_id) {
|
||||||
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('slot') . '` WHERE poll_id = ? ORDER BY id');
|
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('slot') . '` WHERE poll_id = ? ORDER BY id');
|
||||||
$prepared->execute(array($poll_id));
|
$prepared->execute([$poll_id]);
|
||||||
|
|
||||||
return $prepared->fetchAll();
|
return $prepared->fetchAll();
|
||||||
}
|
}
|
||||||
@ -128,5 +125,4 @@ class SlotRepository extends AbstractRepository {
|
|||||||
|
|
||||||
return $prepared->execute([$poll_id]);
|
return $prepared->execute([$poll_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,13 @@ use Framadate\FramaDB;
|
|||||||
use Framadate\Utils;
|
use Framadate\Utils;
|
||||||
|
|
||||||
class VoteRepository extends AbstractRepository {
|
class VoteRepository extends AbstractRepository {
|
||||||
|
|
||||||
function __construct(FramaDB $connect) {
|
function __construct(FramaDB $connect) {
|
||||||
parent::__construct($connect);
|
parent::__construct($connect);
|
||||||
}
|
}
|
||||||
|
|
||||||
function allUserVotesByPollId($poll_id) {
|
function allUserVotesByPollId($poll_id) {
|
||||||
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('vote') . '` WHERE poll_id = ? ORDER BY id');
|
$prepared = $this->prepare('SELECT * FROM `' . Utils::table('vote') . '` WHERE poll_id = ? ORDER BY id');
|
||||||
$prepared->execute(array($poll_id));
|
$prepared->execute([$poll_id]);
|
||||||
|
|
||||||
return $prepared->fetchAll();
|
return $prepared->fetchAll();
|
||||||
}
|
}
|
||||||
@ -83,8 +82,22 @@ class VoteRepository extends AbstractRepository {
|
|||||||
*/
|
*/
|
||||||
public function existsByPollIdAndName($poll_id, $name) {
|
public function existsByPollIdAndName($poll_id, $name) {
|
||||||
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('vote') . '` WHERE poll_id = ? AND name = ?');
|
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('vote') . '` WHERE poll_id = ? AND name = ?');
|
||||||
$prepared->execute(array($poll_id, $name));
|
$prepared->execute([$poll_id, $name]);
|
||||||
return $prepared->rowCount() > 0;
|
return $prepared->rowCount() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if name is already used for the given poll and another vote.
|
||||||
|
*
|
||||||
|
* @param int $poll_id ID of the poll
|
||||||
|
* @param string $name Name of the vote
|
||||||
|
* @param int $vote_id ID of the current vote
|
||||||
|
* @return bool true if vote already exists
|
||||||
|
*/
|
||||||
|
public function existsByPollIdAndNameAndVoteId($poll_id, $name, $vote_id) {
|
||||||
|
$prepared = $this->prepare('SELECT 1 FROM `' . Utils::table('vote') . '` WHERE poll_id = ? AND name = ? AND id != ?');
|
||||||
|
$prepared->execute([$poll_id, $name, $vote_id]);
|
||||||
|
return $prepared->rowCount() > 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@ namespace Framadate\Security;
|
|||||||
* @package Framadate\Security
|
* @package Framadate\Security
|
||||||
*/
|
*/
|
||||||
class PasswordHasher {
|
class PasswordHasher {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hash a password
|
* Hash a password
|
||||||
*
|
*
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
namespace Framadate\Security;
|
namespace Framadate\Security;
|
||||||
|
|
||||||
class Token {
|
class Token {
|
||||||
|
|
||||||
const DEFAULT_LENGTH = 64;
|
const DEFAULT_LENGTH = 64;
|
||||||
private $time;
|
private $time;
|
||||||
private $value;
|
private $value;
|
||||||
@ -15,10 +14,6 @@ class Token {
|
|||||||
$this->value = $this->generate();
|
$this->value = $this->generate();
|
||||||
}
|
}
|
||||||
|
|
||||||
private function generate() {
|
|
||||||
return self::getToken($this->length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTime() {
|
public function getTime() {
|
||||||
return $this->time;
|
return $this->time;
|
||||||
}
|
}
|
||||||
@ -71,6 +66,10 @@ class Token {
|
|||||||
return $token;
|
return $token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function generate() {
|
||||||
|
return self::getToken($this->length);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
|
* @author http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
|
||||||
*/
|
*/
|
||||||
@ -87,6 +86,5 @@ class Token {
|
|||||||
} while ($rnd >= $range);
|
} while ($rnd >= $range);
|
||||||
return $min + $rnd;
|
return $min + $rnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -12,7 +12,6 @@ use Framadate\Utils;
|
|||||||
* @package Framadate\Services
|
* @package Framadate\Services
|
||||||
*/
|
*/
|
||||||
class AdminPollService {
|
class AdminPollService {
|
||||||
|
|
||||||
private $connect;
|
private $connect;
|
||||||
private $pollService;
|
private $pollService;
|
||||||
private $logService;
|
private $logService;
|
||||||
@ -36,9 +35,8 @@ class AdminPollService {
|
|||||||
global $config;
|
global $config;
|
||||||
if ($poll->end_date > $poll->creation_date) {
|
if ($poll->end_date > $poll->creation_date) {
|
||||||
return $this->pollRepository->update($poll);
|
return $this->pollRepository->update($poll);
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -120,9 +118,9 @@ class AdminPollService {
|
|||||||
$slots = $this->pollService->allSlotsByPoll($poll);
|
$slots = $this->pollService->allSlotsByPoll($poll);
|
||||||
|
|
||||||
// We can't delete the last slot
|
// We can't delete the last slot
|
||||||
if ($poll->format == 'D' && count($slots) === 1 && strpos($slots[0]->moments, ',') === false) {
|
if ($poll->format === 'D' && count($slots) === 1 && strpos($slots[0]->moments, ',') === false) {
|
||||||
return false;
|
return false;
|
||||||
} elseif ($poll->format == 'A' && count($slots) === 1) {
|
} elseif ($poll->format === 'A' && count($slots) === 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,8 +133,8 @@ class AdminPollService {
|
|||||||
$moments = explode(',', $aSlot->moments);
|
$moments = explode(',', $aSlot->moments);
|
||||||
|
|
||||||
foreach ($moments as $rowMoment) {
|
foreach ($moments as $rowMoment) {
|
||||||
if ($datetime == $aSlot->title) {
|
if ($datetime === $aSlot->title) {
|
||||||
if ($moment == $rowMoment) {
|
if ($moment === $rowMoment) {
|
||||||
$indexToDelete = $index;
|
$indexToDelete = $index;
|
||||||
} else {
|
} else {
|
||||||
$newMoments[] = $rowMoment;
|
$newMoments[] = $rowMoment;
|
||||||
@ -173,7 +171,7 @@ class AdminPollService {
|
|||||||
|
|
||||||
// Search the index of the slot to delete
|
// Search the index of the slot to delete
|
||||||
foreach ($slots as $aSlot) {
|
foreach ($slots as $aSlot) {
|
||||||
if ($slot_title == $aSlot->title) {
|
if ($slot_title === $aSlot->title) {
|
||||||
$indexToDelete = $index;
|
$indexToDelete = $index;
|
||||||
}
|
}
|
||||||
$index++;
|
$index++;
|
||||||
@ -209,19 +207,18 @@ class AdminPollService {
|
|||||||
// Begin transaction
|
// Begin transaction
|
||||||
$this->connect->beginTransaction();
|
$this->connect->beginTransaction();
|
||||||
|
|
||||||
if ($result->slot != null) {
|
if ($result->slot !== null) {
|
||||||
$slot = $result->slot;
|
$slot = $result->slot;
|
||||||
$moments = explode(',', $slot->moments);
|
$moments = explode(',', $slot->moments);
|
||||||
|
|
||||||
// Check if moment already exists (maybe not necessary)
|
// Check if moment already exists (maybe not necessary)
|
||||||
if (in_array($new_moment, $moments)) {
|
if (in_array($new_moment, $moments, true)) {
|
||||||
throw new MomentAlreadyExistsException();
|
throw new MomentAlreadyExistsException();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update found slot
|
// Update found slot
|
||||||
$moments[] = $new_moment;
|
$moments[] = $new_moment;
|
||||||
$this->slotRepository->update($poll_id, $datetime, implode(',', $moments));
|
$this->slotRepository->update($poll_id, $datetime, implode(',', $moments));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$this->slotRepository->insert($poll_id, $datetime, $new_moment);
|
$this->slotRepository->insert($poll_id, $datetime, $new_moment);
|
||||||
}
|
}
|
||||||
@ -230,7 +227,6 @@ class AdminPollService {
|
|||||||
|
|
||||||
// Commit transaction
|
// Commit transaction
|
||||||
$this->connect->commit();
|
$this->connect->commit();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -252,12 +248,11 @@ class AdminPollService {
|
|||||||
$titles = array_map(function ($slot) {
|
$titles = array_map(function ($slot) {
|
||||||
return $slot->title;
|
return $slot->title;
|
||||||
}, $slots);
|
}, $slots);
|
||||||
if (in_array($title, $titles)) {
|
if (in_array($title, $titles, true)) {
|
||||||
// The moment already exists
|
// The moment already exists
|
||||||
throw new MomentAlreadyExistsException();
|
throw new MomentAlreadyExistsException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Begin transaction
|
// Begin transaction
|
||||||
$this->connect->beginTransaction();
|
$this->connect->beginTransaction();
|
||||||
|
|
||||||
@ -268,7 +263,6 @@ class AdminPollService {
|
|||||||
|
|
||||||
// Commit transaction
|
// Commit transaction
|
||||||
$this->connect->commit();
|
$this->connect->commit();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -293,7 +287,7 @@ class AdminPollService {
|
|||||||
$rowDatetime = $slot->title;
|
$rowDatetime = $slot->title;
|
||||||
$moments = explode(',', $slot->moments);
|
$moments = explode(',', $slot->moments);
|
||||||
|
|
||||||
if ($datetime == $rowDatetime) {
|
if ($datetime === $rowDatetime) {
|
||||||
// Here we have to insert at the end of a slot
|
// Here we have to insert at the end of a slot
|
||||||
$result->insert += count($moments);
|
$result->insert += count($moments);
|
||||||
$result->slot = $slot;
|
$result->slot = $slot;
|
||||||
@ -301,13 +295,11 @@ class AdminPollService {
|
|||||||
} elseif ($datetime < $rowDatetime) {
|
} elseif ($datetime < $rowDatetime) {
|
||||||
// We have to insert before this slot
|
// We have to insert before this slot
|
||||||
break;
|
break;
|
||||||
} else {
|
|
||||||
$result->insert += count($moments);
|
|
||||||
}
|
}
|
||||||
|
$result->insert += count($moments);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -18,12 +18,13 @@
|
|||||||
*/
|
*/
|
||||||
namespace Framadate\Services;
|
namespace Framadate\Services;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
|
use Egulias\EmailValidator\EmailValidator;
|
||||||
|
use Egulias\EmailValidator\Validation\RFCValidation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class helps to clean all inputs from the users or external services.
|
* This class helps to clean all inputs from the users or external services.
|
||||||
*/
|
*/
|
||||||
class InputService {
|
class InputService {
|
||||||
|
|
||||||
function __construct() {}
|
function __construct() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -66,7 +67,26 @@ class InputService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function filterMail($mail) {
|
public function filterMail($mail) {
|
||||||
return filter_var($mail, FILTER_VALIDATE_EMAIL);
|
///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// formatting
|
||||||
|
|
||||||
|
$mail = trim($mail);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// e-mail validation
|
||||||
|
|
||||||
|
$resultat = FALSE;
|
||||||
|
|
||||||
|
$validator = new EmailValidator();
|
||||||
|
|
||||||
|
if ($validator->isValid($mail, new RFCValidation())) {
|
||||||
|
$resultat = $mail;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// return
|
||||||
|
|
||||||
|
return $resultat;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function filterDescription($description) {
|
public function filterDescription($description) {
|
||||||
@ -78,6 +98,15 @@ class InputService {
|
|||||||
return filter_var($control, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => MD5_REGEX]]);
|
return filter_var($control, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => MD5_REGEX]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function filterInteger($int) {
|
||||||
|
return filter_var($int, FILTER_VALIDATE_INT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function filterValueMax($int)
|
||||||
|
{
|
||||||
|
return $this->filterInteger($int) >= 1 ? $this->filterInteger($int) : false;
|
||||||
|
}
|
||||||
|
|
||||||
public function filterBoolean($boolean) {
|
public function filterBoolean($boolean) {
|
||||||
return !!filter_var($boolean, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => BOOLEAN_TRUE_REGEX]]);
|
return !!filter_var($boolean, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => BOOLEAN_TRUE_REGEX]]);
|
||||||
}
|
}
|
||||||
@ -112,5 +141,4 @@ class InputService {
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -24,8 +24,7 @@ use Smarty;
|
|||||||
* This class helps to clean all inputs from the users or external services.
|
* This class helps to clean all inputs from the users or external services.
|
||||||
*/
|
*/
|
||||||
class InstallService {
|
class InstallService {
|
||||||
|
private $fields = [
|
||||||
private $fields = array(
|
|
||||||
// General
|
// General
|
||||||
'appName' => 'Framadate',
|
'appName' => 'Framadate',
|
||||||
'appMail' => '',
|
'appMail' => '',
|
||||||
@ -39,7 +38,7 @@ class InstallService {
|
|||||||
'dbPassword' => '',
|
'dbPassword' => '',
|
||||||
'dbPrefix' => 'fd_',
|
'dbPrefix' => 'fd_',
|
||||||
'migrationTable' => 'framadate_migration'
|
'migrationTable' => 'framadate_migration'
|
||||||
);
|
];
|
||||||
|
|
||||||
function __construct() {}
|
function __construct() {}
|
||||||
|
|
||||||
@ -101,10 +100,10 @@ class InstallService {
|
|||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
function ok() {
|
function ok() {
|
||||||
return array(
|
return [
|
||||||
'status' => 'OK',
|
'status' => 'OK',
|
||||||
'msg' => __f('Installation', 'Ended', Utils::get_server_name())
|
'msg' => __f('Installation', 'Ended', Utils::get_server_name())
|
||||||
);
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -112,14 +111,13 @@ class InstallService {
|
|||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
function error($msg) {
|
function error($msg) {
|
||||||
return array(
|
return [
|
||||||
'status' => 'ERROR',
|
'status' => 'ERROR',
|
||||||
'code' => $msg
|
'code' => $msg
|
||||||
);
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFields() {
|
public function getFields() {
|
||||||
return $this->fields;
|
return $this->fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,6 @@ namespace Framadate\Services;
|
|||||||
* @package Framadate\Services
|
* @package Framadate\Services
|
||||||
*/
|
*/
|
||||||
class LogService {
|
class LogService {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -20,6 +19,5 @@ class LogService {
|
|||||||
function log($tag, $message) {
|
function log($tag, $message) {
|
||||||
error_log(date('Ymd His') . ' [' . $tag . '] ' . $message . "\n", 3, ROOT_DIR . LOG_FILE);
|
error_log(date('Ymd His') . ' [' . $tag . '] ' . $message . "\n", 3, ROOT_DIR . LOG_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,31 +1,35 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Framadate\Services;
|
namespace Framadate\Services;
|
||||||
|
|
||||||
use PHPMailer;
|
use PHPMailer\PHPMailer\PHPMailer;
|
||||||
|
|
||||||
class MailService {
|
class MailService {
|
||||||
|
|
||||||
private $smtp_allowed;
|
|
||||||
|
|
||||||
const DELAY_BEFORE_RESEND = 300;
|
const DELAY_BEFORE_RESEND = 300;
|
||||||
|
|
||||||
const MAILSERVICE_KEY = 'mailservice';
|
const MAILSERVICE_KEY = 'mailservice';
|
||||||
|
|
||||||
|
private $smtp_allowed;
|
||||||
|
|
||||||
|
private $smtp_options = [];
|
||||||
|
|
||||||
private $logService;
|
private $logService;
|
||||||
|
|
||||||
function __construct($smtp_allowed) {
|
function __construct($smtp_allowed, $smtp_options = []) {
|
||||||
$this->logService = new LogService();
|
$this->logService = new LogService();
|
||||||
$this->smtp_allowed = $smtp_allowed;
|
$this->smtp_allowed = $smtp_allowed;
|
||||||
|
if (true === is_array($smtp_options)) {
|
||||||
|
$this->smtp_options = $smtp_options;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function isValidEmail($email) {
|
public function isValidEmail($email) {
|
||||||
return filter_var($email, FILTER_VALIDATE_EMAIL);
|
return filter_var($email, FILTER_VALIDATE_EMAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
function send($to, $subject, $body, $msgKey = null) {
|
public function send($to, $subject, $body, $msgKey = null) {
|
||||||
if ($this->smtp_allowed == true && $this->canSendMsg($msgKey)) {
|
if ($this->smtp_allowed === true && $this->canSendMsg($msgKey)) {
|
||||||
$mail = new PHPMailer(true);
|
$mail = new PHPMailer(true);
|
||||||
$mail->isSMTP();
|
$this->configureMailer($mail);
|
||||||
|
|
||||||
// From
|
// From
|
||||||
$mail->FromName = NOMAPPLICATION;
|
$mail->FromName = NOMAPPLICATION;
|
||||||
@ -61,8 +65,8 @@ class MailService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function canSendMsg($msgKey) {
|
public function canSendMsg($msgKey) {
|
||||||
if ($msgKey == null) {
|
if ($msgKey === null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,5 +76,27 @@ class MailService {
|
|||||||
return !isset($_SESSION[self::MAILSERVICE_KEY][$msgKey]) || time() - $_SESSION[self::MAILSERVICE_KEY][$msgKey] > self::DELAY_BEFORE_RESEND;
|
return !isset($_SESSION[self::MAILSERVICE_KEY][$msgKey]) || time() - $_SESSION[self::MAILSERVICE_KEY][$msgKey] > self::DELAY_BEFORE_RESEND;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
/**
|
||||||
|
* Configure the mailer with the options
|
||||||
|
*
|
||||||
|
* @param PHPMailer $mailer
|
||||||
|
*/
|
||||||
|
private function configureMailer(PHPMailer $mailer) {
|
||||||
|
$mailer->isSMTP();
|
||||||
|
|
||||||
|
$available_options = [
|
||||||
|
'host' => 'Host',
|
||||||
|
'auth' => 'SMTPAuth',
|
||||||
|
'username' => 'Username',
|
||||||
|
'password' => 'Password',
|
||||||
|
'secure' => 'SMTPSecure',
|
||||||
|
'port' => 'Port',
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($available_options as $config_option => $mailer_option) {
|
||||||
|
if (true === isset($this->smtp_options[$config_option]) && false === empty($this->smtp_options[$config_option])) {
|
||||||
|
$mailer->{$mailer_option} = $this->smtp_options[$config_option];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -3,13 +3,11 @@
|
|||||||
|
|
||||||
namespace Framadate\Services;
|
namespace Framadate\Services;
|
||||||
|
|
||||||
|
use \stdClass;
|
||||||
use Framadate\Services\MailService;
|
use Framadate\Services\MailService;
|
||||||
use Framadate\Utils;
|
use Framadate\Utils;
|
||||||
use \stdClass;
|
|
||||||
|
|
||||||
|
|
||||||
class NotificationService {
|
class NotificationService {
|
||||||
|
|
||||||
const UPDATE_VOTE = 1;
|
const UPDATE_VOTE = 1;
|
||||||
const ADD_VOTE = 2;
|
const ADD_VOTE = 2;
|
||||||
const ADD_COMMENT = 3;
|
const ADD_COMMENT = 3;
|
||||||
@ -34,8 +32,11 @@ class NotificationService {
|
|||||||
$_SESSION['mail_sent'] = [];
|
$_SESSION['mail_sent'] = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($poll->receiveNewVotes) {
|
$isVoteAndCanSendIt = ($type === self::UPDATE_VOTE || $type === self::ADD_VOTE) && $poll->receiveNewVotes;
|
||||||
|
$isCommentAndCanSendIt = $type === self::ADD_COMMENT && $poll->receiveNewComments;
|
||||||
|
$isOtherType = $type !== self::UPDATE_VOTE && $type !== self::ADD_VOTE && $type !== self::ADD_COMMENT;
|
||||||
|
|
||||||
|
if ($isVoteAndCanSendIt || $isCommentAndCanSendIt || $isOtherType) {
|
||||||
if (self::isParticipation($type)) {
|
if (self::isParticipation($type)) {
|
||||||
$translationString = 'Poll\'s participation: %s';
|
$translationString = 'Poll\'s participation: %s';
|
||||||
} else {
|
} else {
|
||||||
@ -44,7 +45,6 @@ class NotificationService {
|
|||||||
|
|
||||||
$subject = '[' . NOMAPPLICATION . '] ' . __f('Mail', $translationString, $poll->title);
|
$subject = '[' . NOMAPPLICATION . '] ' . __f('Mail', $translationString, $poll->title);
|
||||||
|
|
||||||
|
|
||||||
$message = '';
|
$message = '';
|
||||||
|
|
||||||
$urlSondage = Utils::getUrlSondage($poll->admin_id, true);
|
$urlSondage = Utils::getUrlSondage($poll->admin_id, true);
|
||||||
@ -72,7 +72,6 @@ class NotificationService {
|
|||||||
case self::DELETED_POLL:
|
case self::DELETED_POLL:
|
||||||
$message = __f('Mail', 'Someone just delete your poll %s.', Utils::htmlEscape($poll->title)) . "\n\n";
|
$message = __f('Mail', 'Someone just delete your poll %s.', Utils::htmlEscape($poll->title)) . "\n\n";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$messageTypeKey = $type . '-' . $poll->id;
|
$messageTypeKey = $type . '-' . $poll->id;
|
||||||
@ -84,5 +83,4 @@ class NotificationService {
|
|||||||
{
|
{
|
||||||
return $type >= self::UPDATE_POLL;
|
return $type >= self::UPDATE_POLL;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -20,14 +20,13 @@ namespace Framadate\Services;
|
|||||||
|
|
||||||
use Framadate\Exception\AlreadyExistsException;
|
use Framadate\Exception\AlreadyExistsException;
|
||||||
use Framadate\Exception\ConcurrentEditionException;
|
use Framadate\Exception\ConcurrentEditionException;
|
||||||
|
use Framadate\Exception\ConcurrentVoteException;
|
||||||
use Framadate\Form;
|
use Framadate\Form;
|
||||||
use Framadate\FramaDB;
|
use Framadate\FramaDB;
|
||||||
use Framadate\Repositories\RepositoryFactory;
|
use Framadate\Repositories\RepositoryFactory;
|
||||||
use Framadate\Security\Token;
|
use Framadate\Security\Token;
|
||||||
use Framadate\Utils;
|
|
||||||
|
|
||||||
class PollService {
|
class PollService {
|
||||||
|
|
||||||
private $connect;
|
private $connect;
|
||||||
private $logService;
|
private $logService;
|
||||||
|
|
||||||
@ -77,33 +76,43 @@ class PollService {
|
|||||||
|
|
||||||
function allSlotsByPoll($poll) {
|
function allSlotsByPoll($poll) {
|
||||||
$slots = $this->slotRepository->listByPollId($poll->id);
|
$slots = $this->slotRepository->listByPollId($poll->id);
|
||||||
if ($poll->format == 'D') {
|
if ($poll->format === 'D') {
|
||||||
$this->sortSlorts($slots);
|
$this->sortSlorts($slots);
|
||||||
}
|
}
|
||||||
return $slots;
|
return $slots;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $poll_id
|
||||||
|
* @param $vote_id
|
||||||
|
* @param $name
|
||||||
|
* @param $choices
|
||||||
|
* @param $slots_hash
|
||||||
|
* @throws AlreadyExistsException
|
||||||
|
* @throws ConcurrentEditionException
|
||||||
|
* @throws ConcurrentVoteException
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
public function updateVote($poll_id, $vote_id, $name, $choices, $slots_hash) {
|
public function updateVote($poll_id, $vote_id, $name, $choices, $slots_hash) {
|
||||||
$poll = $this->findById($poll_id);
|
$this->checkVoteConstraints($choices, $poll_id, $slots_hash, $name, $vote_id);
|
||||||
|
|
||||||
// Check if slots are still the same
|
|
||||||
$this->checkThatSlotsDidntChanged($poll, $slots_hash);
|
|
||||||
|
|
||||||
// Update vote
|
// Update vote
|
||||||
$choices = implode($choices);
|
$choices = implode($choices);
|
||||||
return $this->voteRepository->update($poll_id, $vote_id, $name, $choices);
|
return $this->voteRepository->update($poll_id, $vote_id, $name, $choices);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $poll_id
|
||||||
|
* @param $name
|
||||||
|
* @param $choices
|
||||||
|
* @param $slots_hash
|
||||||
|
* @throws AlreadyExistsException
|
||||||
|
* @throws ConcurrentEditionException
|
||||||
|
* @throws ConcurrentVoteException
|
||||||
|
* @return \stdClass
|
||||||
|
*/
|
||||||
function addVote($poll_id, $name, $choices, $slots_hash) {
|
function addVote($poll_id, $name, $choices, $slots_hash) {
|
||||||
$poll = $this->findById($poll_id);
|
$this->checkVoteConstraints($choices, $poll_id, $slots_hash, $name);
|
||||||
|
|
||||||
// Check if slots are still the same
|
|
||||||
$this->checkThatSlotsDidntChanged($poll, $slots_hash);
|
|
||||||
|
|
||||||
// Check if vote already exists
|
|
||||||
if ($this->voteRepository->existsByPollIdAndName($poll_id, $name)) {
|
|
||||||
throw new AlreadyExistsException();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Insert new vote
|
// Insert new vote
|
||||||
$choices = implode($choices);
|
$choices = implode($choices);
|
||||||
@ -114,14 +123,14 @@ class PollService {
|
|||||||
function addComment($poll_id, $name, $comment) {
|
function addComment($poll_id, $name, $comment) {
|
||||||
if ($this->commentRepository->exists($poll_id, $name, $comment)) {
|
if ($this->commentRepository->exists($poll_id, $name, $comment)) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
return $this->commentRepository->insert($poll_id, $name, $comment);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $this->commentRepository->insert($poll_id, $name, $comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Form $form
|
* @param Form $form
|
||||||
* @return string
|
* @return array
|
||||||
*/
|
*/
|
||||||
function createPoll(Form $form) {
|
function createPoll(Form $form) {
|
||||||
// Generate poll IDs, loop while poll ID already exists
|
// Generate poll IDs, loop while poll ID already exists
|
||||||
@ -131,13 +140,11 @@ class PollService {
|
|||||||
$poll_id = $this->random(16);
|
$poll_id = $this->random(16);
|
||||||
} while ($this->pollRepository->existsById($poll_id));
|
} while ($this->pollRepository->existsById($poll_id));
|
||||||
$admin_poll_id = $poll_id . $this->random(8);
|
$admin_poll_id = $poll_id . $this->random(8);
|
||||||
|
|
||||||
} else { // User have choosen the poll id
|
} else { // User have choosen the poll id
|
||||||
$poll_id = $form->id;
|
$poll_id = $form->id;
|
||||||
do {
|
do {
|
||||||
$admin_poll_id = $this->random(24);
|
$admin_poll_id = $this->random(24);
|
||||||
} while ($this->pollRepository->existsByAdminId($admin_poll_id));
|
} while ($this->pollRepository->existsByAdminId($admin_poll_id));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert poll + slots
|
// Insert poll + slots
|
||||||
@ -148,15 +155,25 @@ class PollService {
|
|||||||
|
|
||||||
$this->logService->log('CREATE_POLL', 'id:' . $poll_id . ', title: ' . $form->title . ', format:' . $form->format . ', admin:' . $form->admin_name . ', mail:' . $form->admin_mail);
|
$this->logService->log('CREATE_POLL', 'id:' . $poll_id . ', title: ' . $form->title . ', format:' . $form->format . ', admin:' . $form->admin_name . ', mail:' . $form->admin_mail);
|
||||||
|
|
||||||
return array($poll_id, $admin_poll_id);
|
return [$poll_id, $admin_poll_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findAllByAdminMail($mail) {
|
public function findAllByAdminMail($mail) {
|
||||||
return $this->pollRepository->findAllByAdminMail($mail);
|
return $this->pollRepository->findAllByAdminMail($mail);
|
||||||
}
|
}
|
||||||
|
|
||||||
function computeBestChoices($votes) {
|
/**
|
||||||
$result = ['y' => [0], 'inb' => [0]];
|
* @param array $votes
|
||||||
|
* @param \stdClass $poll
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function computeBestChoices($votes, $poll) {
|
||||||
|
if (0 === count($votes)) {
|
||||||
|
return $this->computeEmptyBestChoices($poll);
|
||||||
|
}
|
||||||
|
$result = ['y' => [], 'inb' => []];
|
||||||
|
|
||||||
|
// if there are votes
|
||||||
foreach ($votes as $vote) {
|
foreach ($votes as $vote) {
|
||||||
$choices = str_split($vote->choices);
|
$choices = str_split($vote->choices);
|
||||||
foreach ($choices as $i => $choice) {
|
foreach ($choices as $i => $choice) {
|
||||||
@ -164,10 +181,10 @@ class PollService {
|
|||||||
$result['inb'][$i] = 0;
|
$result['inb'][$i] = 0;
|
||||||
$result['y'][$i] = 0;
|
$result['y'][$i] = 0;
|
||||||
}
|
}
|
||||||
if ($choice == 1) {
|
if ($choice === "1") {
|
||||||
$result['inb'][$i]++;
|
$result['inb'][$i]++;
|
||||||
}
|
}
|
||||||
if ($choice == 2) {
|
if ($choice === "2") {
|
||||||
$result['y'][$i]++;
|
$result['y'][$i]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -177,7 +194,7 @@ class PollService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function splitSlots($slots) {
|
function splitSlots($slots) {
|
||||||
$splitted = array();
|
$splitted = [];
|
||||||
foreach ($slots as $slot) {
|
foreach ($slots as $slot) {
|
||||||
$obj = new \stdClass();
|
$obj = new \stdClass();
|
||||||
$obj->day = $slot->title;
|
$obj->day = $slot->title;
|
||||||
@ -200,7 +217,7 @@ class PollService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function splitVotes($votes) {
|
function splitVotes($votes) {
|
||||||
$splitted = array();
|
$splitted = [];
|
||||||
foreach ($votes as $vote) {
|
foreach ($votes as $vote) {
|
||||||
$obj = new \stdClass();
|
$obj = new \stdClass();
|
||||||
$obj->id = $vote->id;
|
$obj->id = $vote->id;
|
||||||
@ -214,10 +231,6 @@ class PollService {
|
|||||||
return $splitted;
|
return $splitted;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function random($length) {
|
|
||||||
return Token::getToken($length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return int The max timestamp allowed for expiry date
|
* @return int The max timestamp allowed for expiry date
|
||||||
*/
|
*/
|
||||||
@ -233,6 +246,84 @@ class PollService {
|
|||||||
return time() + 86400;
|
return time() + 86400;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function sortSlorts(&$slots) {
|
||||||
|
uasort($slots, function ($a, $b) {
|
||||||
|
return $a->title > $b->title;
|
||||||
|
});
|
||||||
|
return $slots;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \stdClass $poll
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function computeEmptyBestChoices($poll)
|
||||||
|
{
|
||||||
|
$result = ['y' => [], 'inb' => []];
|
||||||
|
// if there is no votes, calculates the number of slot
|
||||||
|
|
||||||
|
$slots = $this->allSlotsByPoll($poll);
|
||||||
|
|
||||||
|
if ($poll->format === 'A') {
|
||||||
|
// poll format classic
|
||||||
|
|
||||||
|
for ($i = 0; $i < count($slots); $i++) {
|
||||||
|
$result['y'][] = 0;
|
||||||
|
$result['inb'][] = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// poll format date
|
||||||
|
|
||||||
|
$slots = $this->splitSlots($slots);
|
||||||
|
|
||||||
|
foreach ($slots as $slot) {
|
||||||
|
for ($i = 0; $i < count($slot->moments); $i++) {
|
||||||
|
$result['y'][] = 0;
|
||||||
|
$result['inb'][] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function random($length) {
|
||||||
|
return Token::getToken($length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $choices
|
||||||
|
* @param $poll_id
|
||||||
|
* @param $slots_hash
|
||||||
|
* @param $name
|
||||||
|
* @param string $vote_id
|
||||||
|
* @throws AlreadyExistsException
|
||||||
|
* @throws ConcurrentVoteException
|
||||||
|
* @throws ConcurrentEditionException
|
||||||
|
*/
|
||||||
|
private function checkVoteConstraints($choices, $poll_id, $slots_hash, $name, $vote_id = FALSE) {
|
||||||
|
// Check if vote already exists with the same name
|
||||||
|
if (FALSE === $vote_id) {
|
||||||
|
$exists = $this->voteRepository->existsByPollIdAndName($poll_id, $name);
|
||||||
|
} else {
|
||||||
|
$exists = $this->voteRepository->existsByPollIdAndNameAndVoteId($poll_id, $name, $vote_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($exists) {
|
||||||
|
throw new AlreadyExistsException();
|
||||||
|
}
|
||||||
|
|
||||||
|
$poll = $this->findById($poll_id);
|
||||||
|
|
||||||
|
// Check that no-one voted in the meantime and it conflicts the maximum votes constraint
|
||||||
|
$this->checkMaxVotes($choices, $poll, $poll_id);
|
||||||
|
|
||||||
|
// Check if slots are still the same
|
||||||
|
$this->checkThatSlotsDidntChanged($poll, $slots_hash);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method checks if the hash send by the user is the same as the computed hash.
|
* This method checks if the hash send by the user is the same as the computed hash.
|
||||||
*
|
*
|
||||||
@ -248,13 +339,24 @@ class PollService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return mixed
|
* This method checks if the votes doesn't conflicts the maximum votes constraint
|
||||||
|
*
|
||||||
|
* @param $user_choice
|
||||||
|
* @param \stdClass $poll
|
||||||
|
* @param string $poll_id
|
||||||
|
* @throws ConcurrentVoteException
|
||||||
*/
|
*/
|
||||||
public function sortSlorts(&$slots) {
|
private function checkMaxVotes($user_choice, $poll, $poll_id) {
|
||||||
uasort($slots, function ($a, $b) {
|
$votes = $this->allVotesByPollId($poll_id);
|
||||||
return $a->title > $b->title;
|
if (count($votes) <= 0) {
|
||||||
});
|
return;
|
||||||
return $slots;
|
}
|
||||||
|
$best_choices = $this->computeBestChoices($votes, $poll);
|
||||||
|
foreach ($best_choices['y'] as $i => $nb_choice) {
|
||||||
|
// if for this option we have reached maximum value and user wants to add itself too
|
||||||
|
if ($poll->ValueMax !== null && $nb_choice >= $poll->ValueMax && $user_choice[$i] === "2") {
|
||||||
|
throw new ConcurrentVoteException();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ use Framadate\Repositories\RepositoryFactory;
|
|||||||
* @package Framadate\Services
|
* @package Framadate\Services
|
||||||
*/
|
*/
|
||||||
class PurgeService {
|
class PurgeService {
|
||||||
|
|
||||||
private $logService;
|
private $logService;
|
||||||
private $pollRepository;
|
private $pollRepository;
|
||||||
private $slotRepository;
|
private $slotRepository;
|
||||||
@ -38,9 +37,9 @@ class PurgeService {
|
|||||||
|
|
||||||
foreach ($oldPolls as $poll) {
|
foreach ($oldPolls as $poll) {
|
||||||
if ($this->purgePollById($poll->id)) {
|
if ($this->purgePollById($poll->id)) {
|
||||||
$this->logService->log('EXPIRATION_SUCCESS', 'id: ' . $poll->id . ', title:' . $poll->title . ', format: '.$poll->format . ', admin: ' . $poll->admin_name);
|
$this->logService->log('EXPIRATION_SUCCESS', 'id: ' . $poll->id . ', title:' . $poll->title . ', format: ' . $poll->format . ', admin: ' . $poll->admin_name);
|
||||||
} else {
|
} else {
|
||||||
$this->logService->log('EXPIRATION_FAILED', 'id: ' . $poll->id . ', title:' . $poll->title . ', format: '.$poll->format . ', admin: ' . $poll->admin_name);
|
$this->logService->log('EXPIRATION_FAILED', 'id: ' . $poll->id . ', title:' . $poll->title . ', format: ' . $poll->format . ', admin: ' . $poll->admin_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -71,6 +70,5 @@ class PurgeService {
|
|||||||
|
|
||||||
return $done;
|
return $done;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,11 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Framadate\Services;
|
namespace Framadate\Services;
|
||||||
|
|
||||||
use Framadate\Security\Token;
|
|
||||||
use Framadate\Security\PasswordHasher;
|
use Framadate\Security\PasswordHasher;
|
||||||
|
use Framadate\Security\Token;
|
||||||
|
|
||||||
class SecurityService {
|
class SecurityService {
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,10 +64,9 @@ class SecurityService {
|
|||||||
$currentPassword = isset($_SESSION['poll_security'][$poll->id]) ? $_SESSION['poll_security'][$poll->id] : null;
|
$currentPassword = isset($_SESSION['poll_security'][$poll->id]) ? $_SESSION['poll_security'][$poll->id] : null;
|
||||||
if (!empty($currentPassword) && PasswordHasher::verify($currentPassword, $poll->password_hash)) {
|
if (!empty($currentPassword) && PasswordHasher::verify($currentPassword, $poll->password_hash)) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
}
|
||||||
unset($_SESSION['poll_security'][$poll->id]);
|
unset($_SESSION['poll_security'][$poll->id]);
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,9 +84,8 @@ class SecurityService {
|
|||||||
|
|
||||||
private function ensureSessionPollSecurityIsCreated() {
|
private function ensureSessionPollSecurityIsCreated() {
|
||||||
if (!isset($_SESSION['poll_security'])) {
|
if (!isset($_SESSION['poll_security'])) {
|
||||||
$_SESSION['poll_security'] = array();
|
$_SESSION['poll_security'] = [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -3,9 +3,7 @@
|
|||||||
|
|
||||||
namespace Framadate\Services;
|
namespace Framadate\Services;
|
||||||
|
|
||||||
|
|
||||||
class SessionService {
|
class SessionService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get value of $key in $section, or $defaultValue
|
* Get value of $key in $section, or $defaultValue
|
||||||
*
|
*
|
||||||
@ -59,8 +57,7 @@ class SessionService {
|
|||||||
|
|
||||||
private function initSectionIfNeeded($section) {
|
private function initSectionIfNeeded($section) {
|
||||||
if (!isset($_SESSION[$section])) {
|
if (!isset($_SESSION[$section])) {
|
||||||
$_SESSION[$section] = array();
|
$_SESSION[$section] = [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -9,7 +9,6 @@ use Framadate\Repositories\RepositoryFactory;
|
|||||||
* @package Framadate\Services
|
* @package Framadate\Services
|
||||||
*/
|
*/
|
||||||
class SuperAdminService {
|
class SuperAdminService {
|
||||||
|
|
||||||
private $pollRepository;
|
private $pollRepository;
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
@ -30,9 +29,7 @@ class SuperAdminService {
|
|||||||
$count = $this->pollRepository->count($search);
|
$count = $this->pollRepository->count($search);
|
||||||
$total = $this->pollRepository->count();
|
$total = $this->pollRepository->count();
|
||||||
|
|
||||||
|
|
||||||
return ['polls' => $polls, 'count' => $count, 'total' => $total];
|
return ['polls' => $polls, 'count' => $count, 'total' => $total];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -18,16 +18,19 @@
|
|||||||
*/
|
*/
|
||||||
namespace Framadate;
|
namespace Framadate;
|
||||||
|
|
||||||
|
use Parsedown;
|
||||||
|
|
||||||
class Utils {
|
class Utils {
|
||||||
/**
|
/**
|
||||||
* @return string Server name
|
* @return string Server name
|
||||||
*/
|
*/
|
||||||
public static function get_server_name() {
|
public static function get_server_name() {
|
||||||
$scheme = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')) ? 'https' : 'http';
|
$scheme = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')) ? 'https' : 'http';
|
||||||
$port = in_array($_SERVER['SERVER_PORT'], [80, 443]) ? '' : ':' . $_SERVER['SERVER_PORT'];
|
$port = in_array($_SERVER['SERVER_PORT'], ['80', '443'], true) ? '' : ':' . $_SERVER['SERVER_PORT'];
|
||||||
$dirname = dirname($_SERVER['SCRIPT_NAME']);
|
$dirname = dirname($_SERVER['SCRIPT_NAME']);
|
||||||
$dirname = $dirname === '\\' ? '/' : $dirname . '/';
|
$dirname = $dirname === '\\' ? '/' : $dirname . '/';
|
||||||
$dirname = str_replace('/admin', '', $dirname);
|
$dirname = str_replace('/admin', '', $dirname);
|
||||||
|
$dirname = str_replace('/action', '', $dirname);
|
||||||
$server_name = (defined('APP_URL') ? APP_URL : $_SERVER['SERVER_NAME']) . $port . $dirname;
|
$server_name = (defined('APP_URL') ? APP_URL : $_SERVER['SERVER_NAME']) . $port . $dirname;
|
||||||
|
|
||||||
return $scheme . '://' . preg_replace('#//+#', '/', $server_name);
|
return $scheme . '://' . preg_replace('#//+#', '/', $server_name);
|
||||||
@ -57,10 +60,10 @@ class Utils {
|
|||||||
<link rel="stylesheet" href="' . self::get_server_name() . 'css/style.css" />
|
<link rel="stylesheet" href="' . self::get_server_name() . 'css/style.css" />
|
||||||
<link rel="stylesheet" href="' . self::get_server_name() . 'css/frama.css" />
|
<link rel="stylesheet" href="' . self::get_server_name() . 'css/frama.css" />
|
||||||
<link rel="stylesheet" href="' . self::get_server_name() . 'css/print.css" media="print" />
|
<link rel="stylesheet" href="' . self::get_server_name() . 'css/print.css" media="print" />
|
||||||
<script type="text/javascript" src="' . self::get_server_name() . 'js/jquery-1.11.1.min.js"></script>
|
<script type="text/javascript" src="' . self::get_server_name() . 'js/jquery-1.12.4.min.js"></script>
|
||||||
<script type="text/javascript" src="' . self::get_server_name() . 'js/bootstrap.min.js"></script>
|
<script type="text/javascript" src="' . self::get_server_name() . 'js/bootstrap.min.js"></script>
|
||||||
<script type="text/javascript" src="' . self::get_server_name() . 'js/bootstrap-datepicker.js"></script>';
|
<script type="text/javascript" src="' . self::get_server_name() . 'js/bootstrap-datepicker.js"></script>';
|
||||||
if ('en' != $locale) {
|
if ('en' !== $locale) {
|
||||||
echo '
|
echo '
|
||||||
<script type="text/javascript" src="' . self::get_server_name() . 'js/locales/bootstrap-datepicker.' . $locale . '.js"></script>';
|
<script type="text/javascript" src="' . self::get_server_name() . 'js/locales/bootstrap-datepicker.' . $locale . '.js"></script>';
|
||||||
}
|
}
|
||||||
@ -81,11 +84,13 @@ class Utils {
|
|||||||
* @param string $id The poll's id
|
* @param string $id The poll's id
|
||||||
* @param bool $admin True to generate an admin URL, false for a public one
|
* @param bool $admin True to generate an admin URL, false for a public one
|
||||||
* @param string $vote_id (optional) The vote's unique id
|
* @param string $vote_id (optional) The vote's unique id
|
||||||
|
* @param null $action
|
||||||
|
* @param null $action_value
|
||||||
* @return string The poll's URL.
|
* @return string The poll's URL.
|
||||||
*/
|
*/
|
||||||
public static function getUrlSondage($id, $admin = false, $vote_id = '', $action = null, $action_value = null) {
|
public static function getUrlSondage($id, $admin = false, $vote_id = '', $action = null, $action_value = null) {
|
||||||
// URL-Encode $action_value
|
// URL-Encode $action_value
|
||||||
$action_value = $action_value == null ? null : Utils::base64url_encode($action_value);
|
$action_value = $action_value ? Utils::base64url_encode($action_value) : null;
|
||||||
|
|
||||||
if (URL_PROPRE) {
|
if (URL_PROPRE) {
|
||||||
if ($admin === true) {
|
if ($admin === true) {
|
||||||
@ -93,10 +98,10 @@ class Utils {
|
|||||||
} else {
|
} else {
|
||||||
$url = self::get_server_name() . $id;
|
$url = self::get_server_name() . $id;
|
||||||
}
|
}
|
||||||
if ($vote_id != '') {
|
if ($vote_id !== '') {
|
||||||
$url .= '/vote/' . $vote_id . "#edit";
|
$url .= '/vote/' . $vote_id . "#edit";
|
||||||
} elseif ($action != null) {
|
} elseif ($action) {
|
||||||
if ($action_value != null) {
|
if ($action_value) {
|
||||||
$url .= '/action/' . $action . '/' . $action_value;
|
$url .= '/action/' . $action . '/' . $action_value;
|
||||||
} else {
|
} else {
|
||||||
$url .= '/action/' . $action;
|
$url .= '/action/' . $action;
|
||||||
@ -108,10 +113,10 @@ class Utils {
|
|||||||
} else {
|
} else {
|
||||||
$url = self::get_server_name() . 'studs.php?poll=' . $id;
|
$url = self::get_server_name() . 'studs.php?poll=' . $id;
|
||||||
}
|
}
|
||||||
if ($vote_id != '') {
|
if ($vote_id !== '') {
|
||||||
$url .= '&vote=' . $vote_id . "#edit";
|
$url .= '&vote=' . $vote_id . "#edit";
|
||||||
} elseif ($action != null) {
|
} elseif ($action) {
|
||||||
if ($action_value != null) {
|
if ($action_value) {
|
||||||
$url .= '&' . $action . "=" . $action_value;
|
$url .= '&' . $action . "=" . $action_value;
|
||||||
} else {
|
} else {
|
||||||
$url .= '&' . $action . "=";
|
$url .= '&' . $action . "=";
|
||||||
@ -137,32 +142,29 @@ class Utils {
|
|||||||
return TABLENAME_PREFIX . $tableName;
|
return TABLENAME_PREFIX . $tableName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function markdown($md, $clear) {
|
public static function markdown($md, $clear=false, $line=true) {
|
||||||
preg_match_all('/\[!\[(.*?)\]\((.*?)\)\]\((.*?)\)/', $md, $md_a_img); // Markdown [![alt](src)](href)
|
$parseDown = new Parsedown();
|
||||||
preg_match_all('/!\[(.*?)\]\((.*?)\)/', $md, $md_img); // Markdown ![alt](src)
|
|
||||||
preg_match_all('/\[(.*?)\]\((.*?)\)/', $md, $md_a); // Markdown [text](href)
|
|
||||||
if (isset($md_a_img[2][0]) && $md_a_img[2][0] != '' && isset($md_a_img[3][0]) && $md_a_img[3][0] != '') { // [![alt](src)](href)
|
|
||||||
|
|
||||||
$text = self::htmlEscape($md_a_img[1][0]);
|
$parseDown
|
||||||
$html = '<a href="' . self::htmlEscape($md_a_img[3][0]) . '"><img src="' . self::htmlEscape($md_a_img[2][0]) . '" class="img-responsive" alt="' . $text . '" title="' . $text . '" /></a>';
|
->setBreaksEnabled(true)
|
||||||
|
->setSafeMode(true)
|
||||||
} elseif (isset($md_img[2][0]) && $md_img[2][0] != '') { // ![alt](src)
|
;
|
||||||
|
|
||||||
$text = self::htmlEscape($md_img[1][0]);
|
|
||||||
$html = '<img src="' . self::htmlEscape($md_img[2][0]) . '" class="img-responsive" alt="' . $text . '" title="' . $text . '" />';
|
|
||||||
|
|
||||||
} elseif (isset($md_a[2][0]) && $md_a[2][0] != '') { // [text](href)
|
|
||||||
|
|
||||||
$text = self::htmlEscape($md_a[1][0]);
|
|
||||||
$html = '<a href="' . $md_a[2][0] . '">' . $text . '</a>';
|
|
||||||
|
|
||||||
} else { // text only
|
|
||||||
|
|
||||||
$text = self::htmlEscape($md);
|
|
||||||
$html = $text;
|
|
||||||
|
|
||||||
|
if ($line) {
|
||||||
|
$html = $parseDown->line($md);
|
||||||
|
} else {
|
||||||
|
$md = preg_replace_callback(
|
||||||
|
'#( ){2,}#',
|
||||||
|
function ($m) {
|
||||||
|
return str_repeat(' ', strlen($m[0]));
|
||||||
|
},
|
||||||
|
$md
|
||||||
|
);
|
||||||
|
$html = $parseDown->text($md);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$text = strip_tags($html);
|
||||||
|
|
||||||
return $clear ? $text : $html;
|
return $clear ? $text : $html;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,6 +180,7 @@ class Utils {
|
|||||||
$escaped = str_replace('"', '""', $text);
|
$escaped = str_replace('"', '""', $text);
|
||||||
$escaped = str_replace("\r\n", '', $escaped);
|
$escaped = str_replace("\r\n", '', $escaped);
|
||||||
$escaped = str_replace("\n", '', $escaped);
|
$escaped = str_replace("\n", '', $escaped);
|
||||||
|
$escaped = preg_replace("/^(=|\+|\-|\@)/", "'$1", $escaped);
|
||||||
|
|
||||||
return '"' . $escaped . '"';
|
return '"' . $escaped . '"';
|
||||||
}
|
}
|
||||||
@ -198,6 +201,6 @@ class Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static function base64url_decode($input) {
|
public static function base64url_decode($input) {
|
||||||
return base64_decode(str_pad(strtr($input, '-_', '+/'), strlen($input) % 4, '=', STR_PAD_RIGHT));
|
return base64_decode(str_pad(strtr($input, '-_', '+/'), strlen($input) % 4, '=', STR_PAD_RIGHT), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,97 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* This software is governed by the CeCILL-B license. If a copy of this license
|
|
||||||
* is not distributed with this file, you can obtain one at
|
|
||||||
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
|
|
||||||
*
|
|
||||||
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
|
|
||||||
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
|
|
||||||
*
|
|
||||||
* =============================
|
|
||||||
*
|
|
||||||
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
|
|
||||||
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
|
|
||||||
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
|
|
||||||
*
|
|
||||||
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
|
||||||
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Fully qualified domain name of your webserver.
|
|
||||||
// If this is unset or empty, the servername is determined automatically.
|
|
||||||
// You *have to set this* if you are running Framedate behind a reverse proxy.
|
|
||||||
// const APP_URL = '<www.mydomain.fr>';
|
|
||||||
|
|
||||||
// Application name
|
|
||||||
const NOMAPPLICATION = '<Application name>';
|
|
||||||
|
|
||||||
// Database administrator email
|
|
||||||
const ADRESSEMAILADMIN = '<email address>';
|
|
||||||
|
|
||||||
// Email for automatic responses (you should set it to "no-reply")
|
|
||||||
const ADRESSEMAILREPONSEAUTO = '<no-reply@mydomain.com>';
|
|
||||||
|
|
||||||
// Database user
|
|
||||||
const DB_USER= '<database user>';
|
|
||||||
|
|
||||||
// Database password
|
|
||||||
const DB_PASSWORD = '<database password>';
|
|
||||||
|
|
||||||
// Database server name, leave empty to use a socket
|
|
||||||
const DB_CONNECTION_STRING = 'mysql:host=<database host>;dbname=<database name>;port=<database port>';
|
|
||||||
|
|
||||||
// Name of the table that store migration script already executed
|
|
||||||
const MIGRATION_TABLE = 'framadate_migration';
|
|
||||||
|
|
||||||
// Table name prefix
|
|
||||||
const TABLENAME_PREFIX = 'fd_';
|
|
||||||
|
|
||||||
// Default Language
|
|
||||||
const DEFAULT_LANGUAGE = 'fr';
|
|
||||||
|
|
||||||
// List of supported languages, fake constant as arrays can be used as constants only in PHP >=5.6
|
|
||||||
$ALLOWED_LANGUAGES = [
|
|
||||||
'fr' => 'Français',
|
|
||||||
'en' => 'English',
|
|
||||||
'oc' => 'Occitan',
|
|
||||||
'es' => 'Español',
|
|
||||||
'de' => 'Deutsch',
|
|
||||||
'nl' => 'Dutch',
|
|
||||||
'it' => 'Italiano',
|
|
||||||
'br' => 'Brezhoneg',
|
|
||||||
];
|
|
||||||
|
|
||||||
// Nom et emplacement du fichier image contenant le titre
|
|
||||||
const IMAGE_TITRE = 'images/logo-framadate.png';
|
|
||||||
|
|
||||||
// Clean URLs, boolean
|
|
||||||
const URL_PROPRE = false;
|
|
||||||
|
|
||||||
// Use REMOTE_USER data provided by web server
|
|
||||||
const USE_REMOTE_USER = true;
|
|
||||||
|
|
||||||
// Path to the log file
|
|
||||||
const LOG_FILE = 'admin/stdout.log';
|
|
||||||
|
|
||||||
// Days (after expiration date) before purge a poll
|
|
||||||
const PURGE_DELAY = 60;
|
|
||||||
|
|
||||||
// Max slots per poll
|
|
||||||
const MAX_SLOTS_PER_POLL = 366;
|
|
||||||
|
|
||||||
// Number of seconds before we allow to resend an "Remember Edit Link" email.
|
|
||||||
const TIME_EDIT_LINK_EMAIL = 60;
|
|
||||||
|
|
||||||
// Config
|
|
||||||
$config = [
|
|
||||||
/* general config */
|
|
||||||
'use_smtp' => true, // use email for polls creation/modification/responses notification
|
|
||||||
/* home */
|
|
||||||
'show_what_is_that' => true, // display "how to use" section
|
|
||||||
'show_the_software' => true, // display technical information about the software
|
|
||||||
'show_cultivate_your_garden' => true, // display "developpement and administration" information
|
|
||||||
/* create_classic_poll.php / create_date_poll.php */
|
|
||||||
'default_poll_duration' => 180, // default values for the new poll duration (number of days).
|
|
||||||
/* create_classic_poll.php */
|
|
||||||
'user_can_add_img_or_link' => true, // user can add link or URL when creating his poll.
|
|
||||||
];
|
|
@ -18,10 +18,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// FRAMADATE version
|
// FRAMADATE version
|
||||||
const VERSION = '1.0';
|
const VERSION = '1.1.7';
|
||||||
|
|
||||||
// PHP Needed version
|
// PHP Needed version
|
||||||
const PHP_NEEDED_VERSION = '5.4.4';
|
const PHP_NEEDED_VERSION = '5.6';
|
||||||
|
|
||||||
// Config constants
|
// Config constants
|
||||||
const COMPILE_DIR = '/tpl_c/';
|
const COMPILE_DIR = '/tpl_c/';
|
||||||
|
@ -23,13 +23,13 @@ $i18n->setDefaultLang(DEFAULT_LANGUAGE);
|
|||||||
$i18n->setPath(__DIR__ . '/../../locale');
|
$i18n->setPath(__DIR__ . '/../../locale');
|
||||||
|
|
||||||
// Change langauge when user asked for it
|
// Change langauge when user asked for it
|
||||||
if (isset($_POST['lang']) && is_string($_POST['lang']) && in_array($_POST['lang'], array_keys($ALLOWED_LANGUAGES))) {
|
if (isset($_POST['lang']) && is_string($_POST['lang']) && in_array($_POST['lang'], array_keys($ALLOWED_LANGUAGES), true)) {
|
||||||
$_SESSION['lang'] = $_POST['lang'];
|
$_SESSION['lang'] = $_POST['lang'];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <html lang="$locale"> */
|
/* <html lang="$locale"> */
|
||||||
$i18n->get('', 'Something, just to load the dictionary');
|
$i18n->get('', 'Something, just to load the dictionary');
|
||||||
$locale = $i18n->getLoadedLang();
|
$locale = str_replace('_', '-', $i18n->getLoadedLang());
|
||||||
|
|
||||||
/* Date Format */
|
/* Date Format */
|
||||||
$date_format['txt_full'] = __('Date', 'FULL'); //summary in create_date_poll.php and removal date in choix_(date|autre).php
|
$date_format['txt_full'] = __('Date', 'FULL'); //summary in create_date_poll.php and removal date in choix_(date|autre).php
|
||||||
@ -38,7 +38,7 @@ $date_format['txt_day'] = __('Date', 'DAY');
|
|||||||
$date_format['txt_date'] = __('Date', 'DATE');
|
$date_format['txt_date'] = __('Date', 'DATE');
|
||||||
$date_format['txt_month_year'] = __('Date', 'MONTH_YEAR');
|
$date_format['txt_month_year'] = __('Date', 'MONTH_YEAR');
|
||||||
$date_format['txt_datetime_short'] = __('Date', 'DATETIME');
|
$date_format['txt_datetime_short'] = __('Date', 'DATETIME');
|
||||||
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { //%e can't be used on Windows platform, use %#d instead
|
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { //%e can't be used on Windows platform, use %#d instead
|
||||||
foreach ($date_format as $k => $v) {
|
foreach ($date_format as $k => $v) {
|
||||||
$date_format[$k] = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $v); //replace %e by %#d for windows
|
$date_format[$k] = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $v); //replace %e by %#d for windows
|
||||||
}
|
}
|
||||||
|
@ -23,11 +23,11 @@ use Framadate\Repositories\RepositoryFactory;
|
|||||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||||
require_once __DIR__ . '/../../vendor/o80/i18n/src/shortcuts.php';
|
require_once __DIR__ . '/../../vendor/o80/i18n/src/shortcuts.php';
|
||||||
|
|
||||||
if (session_id() == '') {
|
if (session_id() === '') {
|
||||||
session_start();
|
session_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ini_get('date.timezone') == '') {
|
if (ini_get('date.timezone') === '') {
|
||||||
date_default_timezone_set('Europe/Paris');
|
date_default_timezone_set('Europe/Paris');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
|
|
||||||
function php_version_id_to_string($versionId) {
|
|
||||||
$major = substr($versionId, 0, 2);
|
|
||||||
$minor = substr($versionId, 2, 2);
|
|
||||||
$release = substr($versionId, 4, 2);
|
|
||||||
return $major.'.'.$minor.'.'.$release;
|
|
||||||
}
|
|
||||||
function php_version_to_version_id($major, $minor, $release) {
|
|
||||||
return ($major * 10000 +$minor * 100 + $release);
|
|
||||||
}
|
|
||||||
function php_string_to_version_id($version) {
|
|
||||||
$version = explode('.', $version);
|
|
||||||
return php_version_to_version_id($version[0], $version[1], $version[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (!defined('PHP_VERSION_ID')) {
|
|
||||||
$version = explode('.',PHP_VERSION);
|
|
||||||
define('PHP_VERSION_ID', php_version_to_version_id($version[0], $version[1], $version[2]));
|
|
||||||
}
|
|
||||||
if (PHP_VERSION_ID < 50207) { // This constants do not exists before 5.2.7
|
|
||||||
define('PHP_MAJOR_VERSION', $version[0]);
|
|
||||||
define('PHP_MINOR_VERSION', $version[1]);
|
|
||||||
define('PHP_RELEASE_VERSION', $version[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
@ -30,21 +30,26 @@ $smarty->assign('SERVER_URL', Utils::get_server_name());
|
|||||||
$smarty->assign('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
|
$smarty->assign('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
|
||||||
$smarty->assign('TITLE_IMAGE', IMAGE_TITRE);
|
$smarty->assign('TITLE_IMAGE', IMAGE_TITRE);
|
||||||
$smarty->assign('use_nav_js', strstr($_SERVER['SERVER_NAME'], 'framadate.org'));
|
$smarty->assign('use_nav_js', strstr($_SERVER['SERVER_NAME'], 'framadate.org'));
|
||||||
|
$smarty->assign('provide_fork_awesome', !isset($config['provide_fork_awesome']) || $config['provide_fork_awesome']);
|
||||||
$smarty->assign('locale', $locale);
|
$smarty->assign('locale', $locale);
|
||||||
$smarty->assign('langs', $ALLOWED_LANGUAGES);
|
$smarty->assign('langs', $ALLOWED_LANGUAGES);
|
||||||
$smarty->assign('date_format', $date_format);
|
$smarty->assign('date_format', $date_format);
|
||||||
|
if (isset($config['tracking_code'])) {
|
||||||
|
$smarty->assign('tracking_code', $config['tracking_code']);
|
||||||
|
}
|
||||||
|
if (defined('FAVICON')) {
|
||||||
|
$smarty->assign('favicon', FAVICON);
|
||||||
|
}
|
||||||
|
|
||||||
// Dev Mode
|
// Dev Mode
|
||||||
if (isset($_SERVER['FRAMADATE_DEVMODE']) && $_SERVER['FRAMADATE_DEVMODE']) {
|
if (isset($_SERVER['FRAMADATE_DEVMODE']) && $_SERVER['FRAMADATE_DEVMODE']) {
|
||||||
$smarty->force_compile = true;
|
$smarty->force_compile = true;
|
||||||
$smarty->compile_check = true;
|
$smarty->compile_check = true;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$smarty->force_compile = false;
|
$smarty->force_compile = false;
|
||||||
$smarty->compile_check = false;
|
$smarty->compile_check = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function smarty_function_poll_url($params, Smarty_Internal_Template $template) {
|
function smarty_function_poll_url($params, Smarty_Internal_Template $template) {
|
||||||
$poll_id = filter_var($params['id'], FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => POLL_REGEX]]);
|
$poll_id = filter_var($params['id'], FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => POLL_REGEX]]);
|
||||||
$admin = (isset($params['admin']) && $params['admin']) ? true : false;
|
$admin = (isset($params['admin']) && $params['admin']) ? true : false;
|
||||||
@ -57,8 +62,8 @@ function smarty_function_poll_url($params, Smarty_Internal_Template $template) {
|
|||||||
return Utils::getUrlSondage($poll_id, $admin, $vote_unique_id, $action, $action_value);
|
return Utils::getUrlSondage($poll_id, $admin, $vote_unique_id, $action, $action_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function smarty_modifier_markdown($md, $clear = false) {
|
function smarty_modifier_markdown($md, $clear = false, $inline=true) {
|
||||||
return Utils::markdown($md, $clear);
|
return Utils::markdown($md, $clear, $inline);
|
||||||
}
|
}
|
||||||
|
|
||||||
function smarty_modifier_resource($link) {
|
function smarty_modifier_resource($link) {
|
||||||
@ -71,3 +76,33 @@ function smarty_modifier_addslashes_single_quote($string) {
|
|||||||
function smarty_modifier_html($html) {
|
function smarty_modifier_html($html) {
|
||||||
return Utils::htmlEscape($html);
|
return Utils::htmlEscape($html);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function smarty_modifier_html_special_chars($html) {
|
||||||
|
return Utils::htmlMailEscape($html);
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_modifier_datepicker_path($lang) {
|
||||||
|
$i = 0;
|
||||||
|
while (!is_file(path_for_datepicker_locale($lang)) && $i < 3) {
|
||||||
|
$lang_arr = explode('-', $lang);
|
||||||
|
if ($lang_arr && count($lang_arr) > 1) {
|
||||||
|
$lang = $lang_arr[0];
|
||||||
|
} else {
|
||||||
|
$lang = 'en';
|
||||||
|
}
|
||||||
|
$i += 1;
|
||||||
|
}
|
||||||
|
return 'js/locales/bootstrap-datepicker.' . $lang . '.js';
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_modifier_locale_2_lang($locale) {
|
||||||
|
$lang_arr = explode('-', $locale);
|
||||||
|
if ($lang_arr && count($lang_arr) > 1) {
|
||||||
|
return $lang_arr[0];
|
||||||
|
}
|
||||||
|
return $locale;
|
||||||
|
}
|
||||||
|
|
||||||
|
function path_for_datepicker_locale($lang) {
|
||||||
|
return __DIR__ . '/../../js/locales/bootstrap-datepicker.' . $lang . '.js';
|
||||||
|
}
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Framadate;
|
namespace Framadate;
|
||||||
|
|
||||||
abstract class FramaTestCase extends \PHPUnit_Framework_TestCase {
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
abstract class FramaTestCase extends TestCase {
|
||||||
protected function getTestResourcePath($resourcepath) {
|
protected function getTestResourcePath($resourcepath) {
|
||||||
return __DIR__ . '/../resources/'.$resourcepath;
|
return __DIR__ . '/../resources/' . $resourcepath;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function readTestResource($resourcepath) {
|
protected function readTestResource($resourcepath) {
|
||||||
@ -19,5 +20,4 @@ abstract class FramaTestCase extends \PHPUnit_Framework_TestCase {
|
|||||||
$params = array_slice(func_get_args(), 2); // get all the parameters after $methodName
|
$params = array_slice(func_get_args(), 2); // get all the parameters after $methodName
|
||||||
return $reflectionMethod->invokeArgs($object, $params);
|
return $reflectionMethod->invokeArgs($object, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
32
app/tests/Framadate/Services/InputServiceUnitTest.php
Normal file
32
app/tests/Framadate/Services/InputServiceUnitTest.php
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
namespace Framadate\Services;
|
||||||
|
|
||||||
|
use Framadate\FramaTestCase;
|
||||||
|
|
||||||
|
class InputServiceUnitTest extends FramaTestCase
|
||||||
|
{
|
||||||
|
public function liste_emails() {
|
||||||
|
return [
|
||||||
|
// valids addresses
|
||||||
|
"valid address" => ["example@example.com", "example@example.com"],
|
||||||
|
"local address" => ["test@localhost", "test@localhost"],
|
||||||
|
"IP address" => ["ip.email@127.0.0.1", "ip.email@127.0.0.1"],
|
||||||
|
"with spaces arround" => [" with@spaces ", "with@spaces"],
|
||||||
|
"unicode caracters" => ["unicode.éà@idn-œ.com", "unicode.éà@idn-œ.com"],
|
||||||
|
// invalids addresses
|
||||||
|
"without domain" => ["without-domain", FALSE],
|
||||||
|
"space inside" => ["example example@example.com", FALSE],
|
||||||
|
"forbidden chars" => ["special_chars.@example.com", FALSE],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider liste_emails
|
||||||
|
*/
|
||||||
|
public function test_filterMail($email, $expected) {
|
||||||
|
$inputService = new InputService();
|
||||||
|
$filtered = $inputService->filterMail($email);
|
||||||
|
|
||||||
|
$this->assertSame($expected, $filtered);
|
||||||
|
}
|
||||||
|
}
|
@ -6,10 +6,7 @@ use Framadate\FramaTestCase;
|
|||||||
class MailServiceUnitTest extends FramaTestCase {
|
class MailServiceUnitTest extends FramaTestCase {
|
||||||
const MSG_KEY = '666';
|
const MSG_KEY = '666';
|
||||||
|
|
||||||
/**
|
public function test_should_send_a_2nd_mail_after_a_good_interval() {
|
||||||
* @test
|
|
||||||
*/
|
|
||||||
function should_send_a_2nd_mail_after_a_good_interval() {
|
|
||||||
// Given
|
// Given
|
||||||
$mailService = new MailService(true);
|
$mailService = new MailService(true);
|
||||||
$_SESSION[MailService::MAILSERVICE_KEY] = [self::MSG_KEY => time() - 1000];
|
$_SESSION[MailService::MAILSERVICE_KEY] = [self::MSG_KEY => time() - 1000];
|
||||||
@ -18,13 +15,10 @@ class MailServiceUnitTest extends FramaTestCase {
|
|||||||
$canSendMsg = $mailService->canSendMsg(self::MSG_KEY);
|
$canSendMsg = $mailService->canSendMsg(self::MSG_KEY);
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
$this->assertEquals(true, $canSendMsg);
|
$this->assertSame(true, $canSendMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function test_should_not_send_2_mails_in_a_short_interval() {
|
||||||
* @test
|
|
||||||
*/
|
|
||||||
function should_not_send_2_mails_in_a_short_interval() {
|
|
||||||
// Given
|
// Given
|
||||||
$mailService = new MailService(true);
|
$mailService = new MailService(true);
|
||||||
$_SESSION[MailService::MAILSERVICE_KEY] = [self::MSG_KEY => time()];
|
$_SESSION[MailService::MAILSERVICE_KEY] = [self::MSG_KEY => time()];
|
||||||
@ -33,7 +27,6 @@ class MailServiceUnitTest extends FramaTestCase {
|
|||||||
$canSendMsg = $mailService->canSendMsg(self::MSG_KEY);
|
$canSendMsg = $mailService->canSendMsg(self::MSG_KEY);
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
$this->assertEquals(false, $canSendMsg);
|
$this->assertSame(false, $canSendMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
<?php
|
<?php
|
||||||
$loader = require __DIR__ . '/../../vendor/autoload.php';
|
$loader = require __DIR__ . '/../../vendor/autoload.php';
|
||||||
$loader->addPsr4('Framadate\\', __DIR__.'/Framadate');
|
$loader->addPsr4('Framadate\\', __DIR__ . '/Framadate');
|
||||||
|
21
bandeaux.php
21
bandeaux.php
@ -24,22 +24,22 @@ include_once __DIR__ . '/app/inc/init.php';
|
|||||||
function bandeau_titre($titre)
|
function bandeau_titre($titre)
|
||||||
{
|
{
|
||||||
global $ALLOWED_LANGUAGES;
|
global $ALLOWED_LANGUAGES;
|
||||||
$img = ( IMAGE_TITRE ) ? '<img src="'. Utils::get_server_name(). IMAGE_TITRE. '" alt="'.NOMAPPLICATION.'" class="img-responsive">' : '';
|
$img = ( IMAGE_TITRE ) ? '<img src="' . Utils::get_server_name() . IMAGE_TITRE . '" alt="' . NOMAPPLICATION . '" class="img-responsive">' : '';
|
||||||
echo '
|
echo '
|
||||||
<header role="banner">';
|
<header role="banner">';
|
||||||
if(count($ALLOWED_LANGUAGES) > 1){
|
if(count($ALLOWED_LANGUAGES) > 1){
|
||||||
echo '<form method="post" action="" class="hidden-print">
|
echo '<form method="post" action="" class="hidden-print">
|
||||||
<div class="input-group input-group-sm pull-right col-md-2 col-xs-4">
|
<div class="input-group input-group-sm pull-right col-md-2 col-xs-4">
|
||||||
<select name="lang" class="form-control" title="'. __('Language selector', 'Select the language') .'" >' . liste_lang() . '</select>
|
<select name="lang" class="form-control" title="' . __('Language selector', 'Select the language') . '" >' . liste_lang() . '</select>
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
<button type="submit" class="btn btn-default btn-sm" title="'. __('Language selector', 'Change the language') .'">OK</button>
|
<button type="submit" class="btn btn-default btn-sm" title="' . __('Language selector', 'Change the language') . '">OK</button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</form>';
|
</form>';
|
||||||
}
|
}
|
||||||
echo '
|
echo '
|
||||||
<h1><a href="' . Utils::get_server_name() . '" title="' . __('Generic', 'Home') . ' - ' . NOMAPPLICATION . '">' . $img . '</a></h1>
|
<h1><a href="' . Utils::get_server_name() . '" title="' . __('Generic', 'Home') . ' - ' . NOMAPPLICATION . '">' . $img . '</a></h1>
|
||||||
<h2 class="lead"><i>'. $titre .'</i></h2>
|
<h2 class="lead"><i>' . $titre . '</i></h2>
|
||||||
<hr class="trait" role="presentation" />
|
<hr class="trait" role="presentation" />
|
||||||
</header>
|
</header>
|
||||||
<main role="main">';
|
<main role="main">';
|
||||||
@ -47,12 +47,11 @@ function bandeau_titre($titre)
|
|||||||
global $connect;
|
global $connect;
|
||||||
$tables = $connect->allTables();
|
$tables = $connect->allTables();
|
||||||
$diff = array_diff([Utils::table('comment'), Utils::table('poll'), Utils::table('slot'), Utils::table('vote')], $tables);
|
$diff = array_diff([Utils::table('comment'), Utils::table('poll'), Utils::table('slot'), Utils::table('vote')], $tables);
|
||||||
if (0 != count($diff)) {
|
if (0 !== count($diff)) {
|
||||||
echo '<div class="alert alert-danger">'. __('Error', 'Framadate is not properly installed, please check the "INSTALL" to setup the database before continuing.') .'</div>';
|
echo '<div class="alert alert-danger">' . __('Error', 'Framadate is not properly installed, please check the "INSTALL" to setup the database before continuing.') . '</div>';
|
||||||
bandeau_pied();
|
bandeau_pied();
|
||||||
die();
|
die();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function liste_lang()
|
function liste_lang()
|
||||||
@ -62,10 +61,10 @@ function liste_lang()
|
|||||||
$str = '';
|
$str = '';
|
||||||
|
|
||||||
foreach ($ALLOWED_LANGUAGES as $k => $v ) {
|
foreach ($ALLOWED_LANGUAGES as $k => $v ) {
|
||||||
if (substr($k,0,2)==$locale) {
|
if (substr($k,0,2)===$locale) {
|
||||||
$str .= '<option lang="'.substr($k,0,2).'" selected value="' . $k . '">' . $v . '</option>' . "\n" ;
|
$str .= '<option lang="' . substr($k,0,2) . '" selected value="' . $k . '">' . $v . '</option>' . "\n" ;
|
||||||
} else {
|
} else {
|
||||||
$str .= '<option lang="'.substr($k,0,2).'" value="' . $k . '">' . $v . '</option>' . "\n" ;
|
$str .= '<option lang="' . substr($k,0,2) . '" value="' . $k . '">' . $v . '</option>' . "\n" ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,5 +77,5 @@ function bandeau_pied()
|
|||||||
</main>
|
</main>
|
||||||
</div> <!-- .container -->
|
</div> <!-- .container -->
|
||||||
</body>
|
</body>
|
||||||
</html>'."\n";
|
</html>' . "\n";
|
||||||
}
|
}
|
||||||
|
@ -28,15 +28,14 @@ include_once __DIR__ . '/app/inc/init.php';
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$diffSection and array_keys($good)!=array_keys($test)) {
|
if (!$diffSection and array_keys($good)!==array_keys($test)) {
|
||||||
var_dump(array_keys($good));
|
var_dump(array_keys($good));
|
||||||
var_dump(array_keys($test));
|
var_dump(array_keys($test));
|
||||||
} else {
|
} else {
|
||||||
echo 'All sections are in two langs.' . "\n";
|
echo 'All sections are in two langs.' . "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$diff = [];
|
||||||
$diff = array();
|
|
||||||
|
|
||||||
foreach ($good as $sectionName => $section) {
|
foreach ($good as $sectionName => $section) {
|
||||||
$diffSection = false;
|
$diffSection = false;
|
||||||
@ -47,7 +46,7 @@ include_once __DIR__ . '/app/inc/init.php';
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$diffSection and array_keys($good[$sectionName]) != array_keys($test[$sectionName])) {
|
if (!$diffSection and array_keys($good[$sectionName]) !== array_keys($test[$sectionName])) {
|
||||||
$diff[$sectionName]['order_good'] = array_keys($good[$sectionName]);
|
$diff[$sectionName]['order_good'] = array_keys($good[$sectionName]);
|
||||||
$diff[$sectionName]['order_test'] = array_keys($test[$sectionName]);
|
$diff[$sectionName]['order_test'] = array_keys($test[$sectionName]);
|
||||||
}
|
}
|
||||||
|
@ -1,28 +1,84 @@
|
|||||||
{
|
{
|
||||||
"name": "framasoft/framadate",
|
"name": "framasoft/framadate",
|
||||||
"description": "Application to facilitate the schedule of events or classic polls",
|
"description": "Application to facilitate the schedule of events or classic polls",
|
||||||
"keywords": [
|
"homepage": "https://framadate.org/",
|
||||||
"poll"
|
"keywords": ["poll", "framadate"],
|
||||||
],
|
|
||||||
"version": "0.9.0",
|
"version": "0.9.0",
|
||||||
"license": "CECILL-B",
|
"license": "CECILL-B",
|
||||||
|
|
||||||
"type": "project",
|
"type": "project",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://framagit.org/framasoft/framadate/issues"
|
||||||
|
},
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Thomas CITHAREL",
|
||||||
|
"email": "tcit@tcit.fr",
|
||||||
|
"role": "Maintainer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "JosephK",
|
||||||
|
"email": "joseph@framasoft.org",
|
||||||
|
"role": "Maintainer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Olivier PEREZ",
|
||||||
|
"email": "olivier@olivierperez.fr",
|
||||||
|
"role": "Former maintainer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Antonin MURTIN",
|
||||||
|
"email": "antonin.murtin@gmail.com",
|
||||||
|
"role": "Former developper"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Simon LEBLANC",
|
||||||
|
"role": "Former developper",
|
||||||
|
"email": "contact@leblanc-simon.eu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Pierre-Yves GOSSET",
|
||||||
|
"role": "Former developper",
|
||||||
|
"email": "pyg@framasoft.org"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Guilhem BORGHESI",
|
||||||
|
"role": "Studs developper",
|
||||||
|
"email": "borghesi@unistra.fr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Raphaël DROZ",
|
||||||
|
"role": "Studs developper",
|
||||||
|
"email": "raphael.droz@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
"require": {
|
"require": {
|
||||||
"smarty/smarty": "3.1.21",
|
"php": ">=5.6.0",
|
||||||
|
"ext-pdo": "*",
|
||||||
|
"smarty/smarty": "^3.1",
|
||||||
"o80/i18n": "dev-develop",
|
"o80/i18n": "dev-develop",
|
||||||
"phpmailer/phpmailer": "~5.2",
|
"phpmailer/phpmailer": "~6.0",
|
||||||
"ircmaxell/password-compat": "dev-master"
|
"ircmaxell/password-compat": "dev-master",
|
||||||
|
"roave/security-advisories": "dev-master",
|
||||||
|
"erusev/parsedown": "^1.7",
|
||||||
|
"egulias/email-validator": "~2.1"
|
||||||
},
|
},
|
||||||
|
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "^4.5"
|
"phpunit/phpunit": "^5.7",
|
||||||
|
"friendsofphp/php-cs-fixer": "~2.0"
|
||||||
},
|
},
|
||||||
|
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"Framadate\\": "app/classes/Framadate/"
|
"Framadate\\": "app/classes/Framadate/"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"config": {
|
||||||
|
"platform": {
|
||||||
|
"php": "5.6.0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2026
composer.lock
generated
2026
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -16,12 +16,13 @@
|
|||||||
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
||||||
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
||||||
*/
|
*/
|
||||||
use Framadate\Services\LogService;
|
|
||||||
use Framadate\Services\PollService;
|
|
||||||
use Framadate\Services\MailService;
|
|
||||||
use Framadate\Services\PurgeService;
|
|
||||||
use Framadate\Utils;
|
|
||||||
use Framadate\Choice;
|
use Framadate\Choice;
|
||||||
|
use Framadate\Services\LogService;
|
||||||
|
use Framadate\Services\MailService;
|
||||||
|
use Framadate\Services\PollService;
|
||||||
|
use Framadate\Services\PurgeService;
|
||||||
|
use Framadate\Services\SessionService;
|
||||||
|
use Framadate\Utils;
|
||||||
|
|
||||||
include_once __DIR__ . '/app/inc/init.php';
|
include_once __DIR__ . '/app/inc/init.php';
|
||||||
|
|
||||||
@ -29,8 +30,9 @@ include_once __DIR__ . '/app/inc/init.php';
|
|||||||
/*---------*/
|
/*---------*/
|
||||||
$logService = new LogService();
|
$logService = new LogService();
|
||||||
$pollService = new PollService($connect, $logService);
|
$pollService = new PollService($connect, $logService);
|
||||||
$mailService = new MailService($config['use_smtp']);
|
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
|
||||||
$purgeService = new PurgeService($connect, $logService);
|
$purgeService = new PurgeService($connect, $logService);
|
||||||
|
$sessionService = new SessionService();
|
||||||
|
|
||||||
if (is_file('bandeaux_local.php')) {
|
if (is_file('bandeaux_local.php')) {
|
||||||
include_once('bandeaux_local.php');
|
include_once('bandeaux_local.php');
|
||||||
@ -40,13 +42,11 @@ if (is_file('bandeaux_local.php')) {
|
|||||||
|
|
||||||
// Step 1/4 : error if $_SESSION from info_sondage are not valid
|
// Step 1/4 : error if $_SESSION from info_sondage are not valid
|
||||||
if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || (($config['use_smtp']) ? empty($_SESSION['form']->admin_mail) : false)) {
|
if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || (($config['use_smtp']) ? empty($_SESSION['form']->admin_mail) : false)) {
|
||||||
|
|
||||||
$smarty->assign('title', __('Error', 'Error!'));
|
$smarty->assign('title', __('Error', 'Error!'));
|
||||||
$smarty->assign('error', __('Error', 'You haven\'t filled the first section of the poll creation.'));
|
$smarty->assign('error', __('Error', 'You haven\'t filled the first section of the poll creation.'));
|
||||||
$smarty->display('error.tpl');
|
$smarty->display('error.tpl');
|
||||||
exit;
|
exit;
|
||||||
|
}
|
||||||
} else {
|
|
||||||
// Min/Max archive date
|
// Min/Max archive date
|
||||||
$min_expiry_time = $pollService->minExpiryDate();
|
$min_expiry_time = $pollService->minExpiryDate();
|
||||||
$max_expiry_time = $pollService->maxExpiryDate();
|
$max_expiry_time = $pollService->maxExpiryDate();
|
||||||
@ -59,14 +59,13 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || (
|
|||||||
|
|
||||||
// Step 4 : Data prepare before insert in DB
|
// Step 4 : Data prepare before insert in DB
|
||||||
if (isset($_POST['confirmation'])) {
|
if (isset($_POST['confirmation'])) {
|
||||||
|
|
||||||
// Define expiration date
|
// Define expiration date
|
||||||
$enddate = filter_input(INPUT_POST, 'enddate', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '#^[0-9]{2}/[0-9]{2}/[0-9]{4}$#']]);
|
$enddate = filter_input(INPUT_POST, 'enddate', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '#^[0-9]{2}/[0-9]{2}/[0-9]{4}$#']]);
|
||||||
|
|
||||||
if (!empty($enddate)) {
|
if (!empty($enddate)) {
|
||||||
$registredate = explode('/', $enddate);
|
$registredate = explode('/', $enddate);
|
||||||
|
|
||||||
if (is_array($registredate) && count($registredate) == 3) {
|
if (is_array($registredate) && count($registredate) === 3) {
|
||||||
$time = mktime(0, 0, 0, $registredate[1], $registredate[0], $registredate[2]);
|
$time = mktime(0, 0, 0, $registredate[1], $registredate[0], $registredate[2]);
|
||||||
|
|
||||||
if ($time < $min_expiry_time) {
|
if ($time < $min_expiry_time) {
|
||||||
@ -89,7 +88,6 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || (
|
|||||||
$poll_id = $ids[0];
|
$poll_id = $ids[0];
|
||||||
$admin_poll_id = $ids[1];
|
$admin_poll_id = $ids[1];
|
||||||
|
|
||||||
|
|
||||||
// Send confirmation by mail if enabled
|
// Send confirmation by mail if enabled
|
||||||
if ($config['use_smtp'] === true) {
|
if ($config['use_smtp'] === true) {
|
||||||
$message = __('Mail', "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.");
|
$message = __('Mail', "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.");
|
||||||
@ -112,13 +110,14 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || (
|
|||||||
// Delete old polls
|
// Delete old polls
|
||||||
$purgeService->purgeOldPolls();
|
$purgeService->purgeOldPolls();
|
||||||
|
|
||||||
|
// creation message
|
||||||
|
$sessionService->set("Framadate", "messagePollCreated", TRUE);
|
||||||
|
|
||||||
// Redirect to poll administration
|
// Redirect to poll administration
|
||||||
header('Location:' . Utils::getUrlSondage($admin_poll_id, true));
|
header('Location:' . Utils::getUrlSondage($admin_poll_id, true));
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
} // Step 3/4 : Confirm poll creation and choose a removal date
|
} // Step 3/4 : Confirm poll creation and choose a removal date
|
||||||
else if (isset($_POST['fin_sondage_autre'])) {
|
else if (isset($_POST['fin_sondage_autre'])) {
|
||||||
|
|
||||||
// Store choices in $_SESSION
|
// Store choices in $_SESSION
|
||||||
if (isset($_POST['choices'])) {
|
if (isset($_POST['choices'])) {
|
||||||
$_SESSION['form']->clearChoices();
|
$_SESSION['form']->clearChoices();
|
||||||
@ -137,30 +136,21 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || (
|
|||||||
// Summary
|
// Summary
|
||||||
$summary = '<ol>';
|
$summary = '<ol>';
|
||||||
foreach ($_SESSION['form']->getChoices() as $i=>$choice) {
|
foreach ($_SESSION['form']->getChoices() as $i=>$choice) {
|
||||||
|
|
||||||
preg_match_all('/\[!\[(.*?)\]\((.*?)\)\]\((.*?)\)/', $choice->getName(), $md_a_img); // Markdown [![alt](src)](href)
|
preg_match_all('/\[!\[(.*?)\]\((.*?)\)\]\((.*?)\)/', $choice->getName(), $md_a_img); // Markdown [![alt](src)](href)
|
||||||
preg_match_all('/!\[(.*?)\]\((.*?)\)/', $choice->getName(), $md_img); // Markdown ![alt](src)
|
preg_match_all('/!\[(.*?)\]\((.*?)\)/', $choice->getName(), $md_img); // Markdown ![alt](src)
|
||||||
preg_match_all('/\[(.*?)\]\((.*?)\)/', $choice->getName(), $md_a); // Markdown [text](href)
|
preg_match_all('/\[(.*?)\]\((.*?)\)/', $choice->getName(), $md_a); // Markdown [text](href)
|
||||||
if (isset($md_a_img[2][0]) && $md_a_img[2][0] != '' && isset($md_a_img[3][0]) && $md_a_img[3][0] != '') { // [![alt](src)](href)
|
if (isset($md_a_img[2][0]) && $md_a_img[2][0] !== '' && isset($md_a_img[3][0]) && $md_a_img[3][0] !== '') { // [![alt](src)](href)
|
||||||
|
$li_subject_text = (isset($md_a_img[1][0]) && $md_a_img[1][0] !== '') ? stripslashes($md_a_img[1][0]) : __('Generic', 'Choice') . ' ' . ($i + 1);
|
||||||
$li_subject_text = (isset($md_a_img[1][0]) && $md_a_img[1][0] != '') ? stripslashes($md_a_img[1][0]) : __('Generic', 'Choice') . ' ' . ($i + 1);
|
|
||||||
$li_subject_html = '<a href="' . $md_a_img[3][0] . '"><img src="' . $md_a_img[2][0] . '" class="img-responsive" alt="' . $li_subject_text . '" /></a>';
|
$li_subject_html = '<a href="' . $md_a_img[3][0] . '"><img src="' . $md_a_img[2][0] . '" class="img-responsive" alt="' . $li_subject_text . '" /></a>';
|
||||||
|
} elseif (isset($md_img[2][0]) && $md_img[2][0] !== '') { // ![alt](src)
|
||||||
} elseif (isset($md_img[2][0]) && $md_img[2][0] != '') { // ![alt](src)
|
$li_subject_text = (isset($md_img[1][0]) && $md_img[1][0] !== '') ? stripslashes($md_img[1][0]) : __('Generic', 'Choice') . ' ' . ($i + 1);
|
||||||
|
|
||||||
$li_subject_text = (isset($md_img[1][0]) && $md_img[1][0] != '') ? stripslashes($md_img[1][0]) : __('Generic', 'Choice') . ' ' . ($i + 1);
|
|
||||||
$li_subject_html = '<img src="' . $md_img[2][0] . '" class="img-responsive" alt="' . $li_subject_text . '" />';
|
$li_subject_html = '<img src="' . $md_img[2][0] . '" class="img-responsive" alt="' . $li_subject_text . '" />';
|
||||||
|
} elseif (isset($md_a[2][0]) && $md_a[2][0] !== '') { // [text](href)
|
||||||
} elseif (isset($md_a[2][0]) && $md_a[2][0] != '') { // [text](href)
|
$li_subject_text = (isset($md_a[1][0]) && $md_a[1][0] !== '') ? stripslashes($md_a[1][0]) : __('Generic', 'Choice') . ' ' . ($i + 1);
|
||||||
|
|
||||||
$li_subject_text = (isset($md_a[1][0]) && $md_a[1][0] != '') ? stripslashes($md_a[1][0]) : __('Generic', 'Choice') . ' ' . ($i + 1);
|
|
||||||
$li_subject_html = '<a href="' . $md_a[2][0] . '">' . $li_subject_text . '</a>';
|
$li_subject_html = '<a href="' . $md_a[2][0] . '">' . $li_subject_text . '</a>';
|
||||||
|
|
||||||
} else { // text only
|
} else { // text only
|
||||||
|
|
||||||
$li_subject_text = stripslashes($choice->getName());
|
$li_subject_text = stripslashes($choice->getName());
|
||||||
$li_subject_html = $li_subject_text;
|
$li_subject_html = $li_subject_text;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$summary .= '<li>' . $li_subject_html . '</li>' . "\n";
|
$summary .= '<li>' . $li_subject_html . '</li>' . "\n";
|
||||||
@ -262,6 +252,5 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || (
|
|||||||
' . "\n";
|
' . "\n";
|
||||||
|
|
||||||
bandeau_pied();
|
bandeau_pied();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
|
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
|
||||||
*
|
*
|
||||||
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
|
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
|
||||||
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft https://git.framasoft.org/framasoft/framadate/)
|
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft https://framagit.org/framasoft/framadate/)
|
||||||
*
|
*
|
||||||
* =============================
|
* =============================
|
||||||
*
|
*
|
||||||
@ -14,7 +14,7 @@
|
|||||||
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
|
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
|
||||||
*
|
*
|
||||||
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
||||||
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft https://git.framasoft.org/framasoft/framadate/)
|
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft https://framagit.org/framasoft/framadate/)
|
||||||
*/
|
*/
|
||||||
use Framadate\Choice;
|
use Framadate\Choice;
|
||||||
use Framadate\Services\InputService;
|
use Framadate\Services\InputService;
|
||||||
@ -22,6 +22,7 @@ use Framadate\Services\LogService;
|
|||||||
use Framadate\Services\MailService;
|
use Framadate\Services\MailService;
|
||||||
use Framadate\Services\PollService;
|
use Framadate\Services\PollService;
|
||||||
use Framadate\Services\PurgeService;
|
use Framadate\Services\PurgeService;
|
||||||
|
use Framadate\Services\SessionService;
|
||||||
use Framadate\Utils;
|
use Framadate\Utils;
|
||||||
|
|
||||||
include_once __DIR__ . '/app/inc/init.php';
|
include_once __DIR__ . '/app/inc/init.php';
|
||||||
@ -30,9 +31,10 @@ include_once __DIR__ . '/app/inc/init.php';
|
|||||||
/*---------*/
|
/*---------*/
|
||||||
$logService = new LogService();
|
$logService = new LogService();
|
||||||
$pollService = new PollService($connect, $logService);
|
$pollService = new PollService($connect, $logService);
|
||||||
$mailService = new MailService($config['use_smtp']);
|
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
|
||||||
$purgeService = new PurgeService($connect, $logService);
|
$purgeService = new PurgeService($connect, $logService);
|
||||||
$inputService = new InputService();
|
$inputService = new InputService();
|
||||||
|
$sessionService = new SessionService();
|
||||||
|
|
||||||
if (is_readable('bandeaux_local.php')) {
|
if (is_readable('bandeaux_local.php')) {
|
||||||
include_once('bandeaux_local.php');
|
include_once('bandeaux_local.php');
|
||||||
@ -66,7 +68,6 @@ switch ($step) {
|
|||||||
$smarty->display('error.tpl');
|
$smarty->display('error.tpl');
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
// Step 2/4 : Select dates of the poll
|
// Step 2/4 : Select dates of the poll
|
||||||
|
|
||||||
@ -95,7 +96,6 @@ switch ($step) {
|
|||||||
$smarty->display('create_date_poll_step_2.tpl');
|
$smarty->display('create_date_poll_step_2.tpl');
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
// Step 3/4 : Confirm poll creation
|
// Step 3/4 : Confirm poll creation
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ switch ($step) {
|
|||||||
$_SESSION['form']->clearChoices();
|
$_SESSION['form']->clearChoices();
|
||||||
|
|
||||||
// Reorder moments to deal with suppressed dates
|
// Reorder moments to deal with suppressed dates
|
||||||
$moments = array();
|
$moments = [];
|
||||||
$i = 0;
|
$i = 0;
|
||||||
while(count($moments) < count($_POST['days'])) {
|
while(count($moments) < count($_POST['days'])) {
|
||||||
if (!empty($_POST['horaires' . $i])) {
|
if (!empty($_POST['horaires' . $i])) {
|
||||||
@ -130,7 +130,6 @@ switch ($step) {
|
|||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for ($i = 0; $i < count($_POST['days']); $i++) {
|
for ($i = 0; $i < count($_POST['days']); $i++) {
|
||||||
$day = $_POST['days'][$i];
|
$day = $_POST['days'][$i];
|
||||||
|
|
||||||
@ -178,18 +177,16 @@ switch ($step) {
|
|||||||
$smarty->display('create_classic_poll_step3.tpl');
|
$smarty->display('create_classic_poll_step3.tpl');
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
// Step 4 : Data prepare before insert in DB
|
// Step 4 : Data prepare before insert in DB
|
||||||
|
|
||||||
// Define expiration date
|
// Define expiration date
|
||||||
$enddate = filter_input(INPUT_POST, 'enddate', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '#^[0-9]{2}/[0-9]{2}/[0-9]{4}$#']]);
|
$enddate = filter_input(INPUT_POST, 'enddate', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '#^[0-9]{2}/[0-9]{2}/[0-9]{4}$#']]);
|
||||||
|
|
||||||
|
|
||||||
if (!empty($enddate)) {
|
if (!empty($enddate)) {
|
||||||
$registredate = explode('/', $enddate);
|
$registredate = explode('/', $enddate);
|
||||||
|
|
||||||
if (is_array($registredate) && count($registredate) == 3) {
|
if (is_array($registredate) && count($registredate) === 3) {
|
||||||
$time = mktime(0, 0, 0, $registredate[1], $registredate[0], $registredate[2]);
|
$time = mktime(0, 0, 0, $registredate[1], $registredate[0], $registredate[2]);
|
||||||
|
|
||||||
if ($time < $min_expiry_time) {
|
if ($time < $min_expiry_time) {
|
||||||
@ -212,7 +209,6 @@ switch ($step) {
|
|||||||
$poll_id = $ids[0];
|
$poll_id = $ids[0];
|
||||||
$admin_poll_id = $ids[1];
|
$admin_poll_id = $ids[1];
|
||||||
|
|
||||||
|
|
||||||
// Send confirmation by mail if enabled
|
// Send confirmation by mail if enabled
|
||||||
if ($config['use_smtp'] === true) {
|
if ($config['use_smtp'] === true) {
|
||||||
$message = __('Mail', "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.");
|
$message = __('Mail', "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.");
|
||||||
@ -238,6 +234,9 @@ switch ($step) {
|
|||||||
// Delete old polls
|
// Delete old polls
|
||||||
$purgeService->purgeOldPolls();
|
$purgeService->purgeOldPolls();
|
||||||
|
|
||||||
|
// creation message
|
||||||
|
$sessionService->set("Framadate", "messagePollCreated", TRUE);
|
||||||
|
|
||||||
// Redirect to poll administration
|
// Redirect to poll administration
|
||||||
header('Location:' . Utils::getUrlSondage($admin_poll_id, true));
|
header('Location:' . Utils::getUrlSondage($admin_poll_id, true));
|
||||||
exit;
|
exit;
|
||||||
|
@ -27,7 +27,6 @@ include_once __DIR__ . '/app/inc/init.php';
|
|||||||
|
|
||||||
const GO_TO_STEP_2 = 'gotostep2';
|
const GO_TO_STEP_2 = 'gotostep2';
|
||||||
|
|
||||||
|
|
||||||
/* Services */
|
/* Services */
|
||||||
/*----------*/
|
/*----------*/
|
||||||
|
|
||||||
@ -42,8 +41,8 @@ if (!isset($_SESSION['form'])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Type de sondage
|
// Type de sondage
|
||||||
if (isset($_GET['type']) && $_GET['type'] == 'date' ||
|
if (isset($_GET['type']) && $_GET['type'] === 'date' ||
|
||||||
isset($_POST['type']) && $_POST['type'] == 'date'
|
isset($_POST['type']) && $_POST['type'] === 'date'
|
||||||
) {
|
) {
|
||||||
$poll_type = 'date';
|
$poll_type = 'date';
|
||||||
$_SESSION['form']->choix_sondage = $poll_type;
|
$_SESSION['form']->choix_sondage = $poll_type;
|
||||||
@ -56,10 +55,14 @@ if (isset($_GET['type']) && $_GET['type'] == 'date' ||
|
|||||||
$goToStep2 = filter_input(INPUT_POST, GO_TO_STEP_2, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^(date|classic)$/']]);
|
$goToStep2 = filter_input(INPUT_POST, GO_TO_STEP_2, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^(date|classic)$/']]);
|
||||||
if ($goToStep2) {
|
if ($goToStep2) {
|
||||||
$title = $inputService->filterTitle($_POST['title']);
|
$title = $inputService->filterTitle($_POST['title']);
|
||||||
|
|
||||||
|
$use_ValueMax = isset($_POST['use_ValueMax']) ? $inputService->filterBoolean($_POST['use_ValueMax']) : false;
|
||||||
|
$ValueMax = $use_ValueMax === true ? $inputService->filterValueMax($_POST['ValueMax']) : null;
|
||||||
|
|
||||||
$use_customized_url = isset($_POST['use_customized_url']) ? $inputService->filterBoolean($_POST['use_customized_url']) : false;
|
$use_customized_url = isset($_POST['use_customized_url']) ? $inputService->filterBoolean($_POST['use_customized_url']) : false;
|
||||||
$customized_url = $use_customized_url == true ? $inputService->filterId($_POST['customized_url']) : null;
|
$customized_url = $use_customized_url === true ? $inputService->filterId($_POST['customized_url']) : null;
|
||||||
$name = $inputService->filterName($_POST['name']);
|
$name = $inputService->filterName($_POST['name']);
|
||||||
$mail = $config['use_smtp'] == true ? $inputService->filterMail($_POST['mail']) : null;
|
$mail = $config['use_smtp'] === true ? $inputService->filterMail($_POST['mail']) : null;
|
||||||
$description = $inputService->filterDescription($_POST['description']);
|
$description = $inputService->filterDescription($_POST['description']);
|
||||||
$editable = $inputService->filterEditable($_POST['editable']);
|
$editable = $inputService->filterEditable($_POST['editable']);
|
||||||
$receiveNewVotes = isset($_POST['receiveNewVotes']) ? $inputService->filterBoolean($_POST['receiveNewVotes']) : false;
|
$receiveNewVotes = isset($_POST['receiveNewVotes']) ? $inputService->filterBoolean($_POST['receiveNewVotes']) : false;
|
||||||
@ -78,10 +81,13 @@ if ($goToStep2) {
|
|||||||
$error_on_password = false;
|
$error_on_password = false;
|
||||||
$error_on_password_repeat = false;
|
$error_on_password_repeat = false;
|
||||||
$error_on_customized_url = false;
|
$error_on_customized_url = false;
|
||||||
|
$error_on_ValueMax = false;
|
||||||
|
|
||||||
$_SESSION['form']->title = $title;
|
$_SESSION['form']->title = $title;
|
||||||
$_SESSION['form']->id = $customized_url;
|
$_SESSION['form']->id = $customized_url;
|
||||||
$_SESSION['form']->use_customized_url = $use_customized_url;
|
$_SESSION['form']->use_customized_url = $use_customized_url;
|
||||||
|
$_SESSION['form']->use_ValueMax = $use_ValueMax;
|
||||||
|
$_SESSION['form']->ValueMax = $ValueMax;
|
||||||
$_SESSION['form']->admin_name = $name;
|
$_SESSION['form']->admin_name = $name;
|
||||||
$_SESSION['form']->admin_mail = $mail;
|
$_SESSION['form']->admin_mail = $mail;
|
||||||
$_SESSION['form']->description = $description;
|
$_SESSION['form']->description = $description;
|
||||||
@ -92,11 +98,8 @@ if ($goToStep2) {
|
|||||||
$_SESSION['form']->use_password = ($use_password !== null);
|
$_SESSION['form']->use_password = ($use_password !== null);
|
||||||
$_SESSION['form']->results_publicly_visible = ($results_publicly_visible !== null);
|
$_SESSION['form']->results_publicly_visible = ($results_publicly_visible !== null);
|
||||||
|
|
||||||
|
if ($config['use_smtp'] === true && empty($mail)) {
|
||||||
if ($config['use_smtp'] == true) {
|
$error_on_mail = true;
|
||||||
if (empty($mail)) {
|
|
||||||
$error_on_mail = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($title !== $_POST['title']) {
|
if ($title !== $_POST['title']) {
|
||||||
@ -109,9 +112,16 @@ if ($goToStep2) {
|
|||||||
} else if ($pollRepository->existsById($customized_url)) {
|
} else if ($pollRepository->existsById($customized_url)) {
|
||||||
$error_on_customized_url = true;
|
$error_on_customized_url = true;
|
||||||
$error_on_customized_url_msg = __('Error', 'Poll id already used');
|
$error_on_customized_url_msg = __('Error', 'Poll id already used');
|
||||||
|
} else if (in_array($customized_url, ['admin', 'vote', 'action'], true)) {
|
||||||
|
$error_on_customized_url = true;
|
||||||
|
$error_on_customized_url_msg = __('Error', 'This id is not allowed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($use_ValueMax && $ValueMax === false) {
|
||||||
|
$error_on_ValueMax = true;
|
||||||
|
}
|
||||||
|
|
||||||
if ($name !== $_POST['name']) {
|
if ($name !== $_POST['name']) {
|
||||||
$error_on_name = true;
|
$error_on_name = true;
|
||||||
}
|
}
|
||||||
@ -121,7 +131,7 @@ if ($goToStep2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Si pas d'erreur dans l'adresse alors on change de page vers date ou autre
|
// Si pas d'erreur dans l'adresse alors on change de page vers date ou autre
|
||||||
if ($config['use_smtp'] == true) {
|
if ($config['use_smtp'] === true) {
|
||||||
$email_OK = $mail && !$error_on_mail;
|
$email_OK = $mail && !$error_on_mail;
|
||||||
} else {
|
} else {
|
||||||
$email_OK = true;
|
$email_OK = true;
|
||||||
@ -130,15 +140,14 @@ if ($goToStep2) {
|
|||||||
if ($use_password) {
|
if ($use_password) {
|
||||||
if (empty($password)) {
|
if (empty($password)) {
|
||||||
$error_on_password = true;
|
$error_on_password = true;
|
||||||
} else if ($password != $password_repeat) {
|
} else if ($password !== $password_repeat) {
|
||||||
$error_on_password_repeat = true;
|
$error_on_password_repeat = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($title && $name && $email_OK && !$error_on_title && !$error_on_customized_url && !$error_on_description && !$error_on_name
|
if ($title && $name && $email_OK && !$error_on_title && !$error_on_customized_url && !$error_on_description && !$error_on_name
|
||||||
&& !$error_on_password && !$error_on_password_repeat
|
&& !$error_on_password && !$error_on_password_repeat &&!$error_on_ValueMax
|
||||||
) {
|
) {
|
||||||
|
|
||||||
// If no errors, we hash the password if needed
|
// If no errors, we hash the password if needed
|
||||||
if ($_SESSION['form']->use_password) {
|
if ($_SESSION['form']->use_password) {
|
||||||
$_SESSION['form']->password_hash = PasswordHasher::hash($password);
|
$_SESSION['form']->password_hash = PasswordHasher::hash($password);
|
||||||
@ -147,16 +156,15 @@ if ($goToStep2) {
|
|||||||
$_SESSION['form']->results_publicly_visible = null;
|
$_SESSION['form']->results_publicly_visible = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($goToStep2 == 'date') {
|
if ($goToStep2 === 'date') {
|
||||||
header('Location:create_date_poll.php');
|
header('Location:create_date_poll.php');
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($goToStep2 == 'classic') {
|
if ($goToStep2 === 'classic') {
|
||||||
header('Location:create_classic_poll.php');
|
header('Location:create_classic_poll.php');
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Title Erreur !
|
// Title Erreur !
|
||||||
$title = __('Error', 'Error!') . ' - ' . __('Step 1', 'Poll creation (1 on 3)');
|
$title = __('Error', 'Error!') . ' - ' . __('Step 1', 'Poll creation (1 on 3)');
|
||||||
@ -167,43 +175,48 @@ if ($goToStep2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Prepare error messages
|
// Prepare error messages
|
||||||
$errors = array(
|
$errors = [
|
||||||
'title' => array(
|
'title' => [
|
||||||
'msg' => '',
|
'msg' => '',
|
||||||
'aria' => '',
|
'aria' => '',
|
||||||
'class' => ''
|
'class' => ''
|
||||||
),
|
],
|
||||||
'customized_url' => array(
|
'customized_url' => [
|
||||||
'msg' => '',
|
'msg' => '',
|
||||||
'aria' => '',
|
'aria' => '',
|
||||||
'class' => ''
|
'class' => ''
|
||||||
),
|
],
|
||||||
'description' => array(
|
'description' => [
|
||||||
'msg' => '',
|
'msg' => '',
|
||||||
'aria' => '',
|
'aria' => '',
|
||||||
'class' => ''
|
'class' => ''
|
||||||
),
|
],
|
||||||
'name' => array(
|
'name' => [
|
||||||
'msg' => '',
|
'msg' => '',
|
||||||
'aria' => '',
|
'aria' => '',
|
||||||
'class' => ''
|
'class' => ''
|
||||||
),
|
],
|
||||||
'email' => array(
|
'email' => [
|
||||||
'msg' => '',
|
'msg' => '',
|
||||||
'aria' => '',
|
'aria' => '',
|
||||||
'class' => ''
|
'class' => ''
|
||||||
),
|
],
|
||||||
'password' => array(
|
'password' => [
|
||||||
'msg' => '',
|
'msg' => '',
|
||||||
'aria' => '',
|
'aria' => '',
|
||||||
'class' => ''
|
'class' => ''
|
||||||
),
|
],
|
||||||
'password_repeat' => array(
|
'ValueMax' => [
|
||||||
'msg' => '',
|
'msg' => '',
|
||||||
'aria' => '',
|
'aria' => '',
|
||||||
'class' => ''
|
'class' => ''
|
||||||
)
|
],
|
||||||
);
|
'password_repeat' => [
|
||||||
|
'msg' => '',
|
||||||
|
'aria' => '',
|
||||||
|
'class' => ''
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
if (!empty($_POST[GO_TO_STEP_2])) {
|
if (!empty($_POST[GO_TO_STEP_2])) {
|
||||||
if (empty($_POST['title'])) {
|
if (empty($_POST['title'])) {
|
||||||
@ -219,7 +232,7 @@ if (!empty($_POST[GO_TO_STEP_2])) {
|
|||||||
if ($error_on_customized_url) {
|
if ($error_on_customized_url) {
|
||||||
$errors['customized_url']['aria'] = 'aria-describeby="customized_url" ';
|
$errors['customized_url']['aria'] = 'aria-describeby="customized_url" ';
|
||||||
$errors['customized_url']['class'] = ' has-error';
|
$errors['customized_url']['class'] = ' has-error';
|
||||||
$errors['customized_url']['msg'] = isset($error_on_customized_url_msg) ? $error_on_customized_url_msg : __('Error', 'Something is wrong with the format');
|
$errors['customized_url']['msg'] = isset($error_on_customized_url_msg) ? $error_on_customized_url_msg : __('Error', "Something is wrong with the format: customized urls should only consist of alphanumeric characters and hyphens.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($error_on_description) {
|
if ($error_on_description) {
|
||||||
@ -235,7 +248,7 @@ if (!empty($_POST[GO_TO_STEP_2])) {
|
|||||||
} elseif ($error_on_name) {
|
} elseif ($error_on_name) {
|
||||||
$errors['name']['aria'] = 'aria-describeby="poll_name_error" ';
|
$errors['name']['aria'] = 'aria-describeby="poll_name_error" ';
|
||||||
$errors['name']['class'] = ' has-error';
|
$errors['name']['class'] = ' has-error';
|
||||||
$errors['name']['msg'] = __('Error', 'Something is wrong with the format');
|
$errors['name']['msg'] = __('Error', "Something is wrong with the format: name shouldn't have any spaces before or after");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($_POST['mail'])) {
|
if (empty($_POST['mail'])) {
|
||||||
@ -258,6 +271,11 @@ if (!empty($_POST[GO_TO_STEP_2])) {
|
|||||||
$errors['password_repeat']['class'] = ' has-error';
|
$errors['password_repeat']['class'] = ' has-error';
|
||||||
$errors['password_repeat']['msg'] = __('Error', 'Passwords do not match');
|
$errors['password_repeat']['msg'] = __('Error', 'Passwords do not match');
|
||||||
}
|
}
|
||||||
|
if ($error_on_ValueMax) {
|
||||||
|
$errors['ValueMax']['aria'] = 'aria-describeby="poll_ValueMax" ';
|
||||||
|
$errors['ValueMax']['class'] = ' has-error';
|
||||||
|
$errors['ValueMax']['msg'] = __('Error', 'Error on amount of voters limitation : value must be an integer greater than 0');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$useRemoteUser = USE_REMOTE_USER && isset($_SERVER['REMOTE_USER']);
|
$useRemoteUser = USE_REMOTE_USER && isset($_SERVER['REMOTE_USER']);
|
||||||
@ -265,14 +283,18 @@ $useRemoteUser = USE_REMOTE_USER && isset($_SERVER['REMOTE_USER']);
|
|||||||
$smarty->assign('title', $title);
|
$smarty->assign('title', $title);
|
||||||
$smarty->assign('useRemoteUser', $useRemoteUser);
|
$smarty->assign('useRemoteUser', $useRemoteUser);
|
||||||
$smarty->assign('errors', $errors);
|
$smarty->assign('errors', $errors);
|
||||||
|
$smarty->assign('advanced_errors', $goToStep2 && ($error_on_ValueMax || $error_on_customized_url || $error_on_password || $error_on_password_repeat));
|
||||||
$smarty->assign('use_smtp', $config['use_smtp']);
|
$smarty->assign('use_smtp', $config['use_smtp']);
|
||||||
|
$smarty->assign('default_to_marldown_editor', $config['markdown_editor_by_default']);
|
||||||
$smarty->assign('goToStep2', GO_TO_STEP_2);
|
$smarty->assign('goToStep2', GO_TO_STEP_2);
|
||||||
|
|
||||||
$smarty->assign('poll_type', $poll_type);
|
$smarty->assign('poll_type', $poll_type);
|
||||||
$smarty->assign('poll_title', Utils::fromPostOrDefault('title', $_SESSION['form']->title));
|
$smarty->assign('poll_title', Utils::fromPostOrDefault('title', $_SESSION['form']->title));
|
||||||
$smarty->assign('customized_url', Utils::fromPostOrDefault('customized_url', $_SESSION['form']->id));
|
$smarty->assign('customized_url', Utils::fromPostOrDefault('customized_url', $_SESSION['form']->id));
|
||||||
$smarty->assign('use_customized_url', Utils::fromPostOrDefault('use_customized_url', $_SESSION['form']->use_customized_url));
|
$smarty->assign('use_customized_url', Utils::fromPostOrDefault('use_customized_url', $_SESSION['form']->use_customized_url));
|
||||||
$smarty->assign('poll_description', Utils::fromPostOrDefault('description', $_SESSION['form']->description));
|
$smarty->assign('ValueMax', Utils::fromPostOrDefault('ValueMax', $_SESSION['form']->ValueMax));
|
||||||
|
$smarty->assign('use_ValueMax', Utils::fromPostOrDefault('use_ValueMax', $_SESSION['form']->use_ValueMax));
|
||||||
|
$smarty->assign('poll_description', !empty($_POST['description']) ? $_POST['description'] : $_SESSION['form']->description);
|
||||||
$smarty->assign('poll_name', Utils::fromPostOrDefault('name', $_SESSION['form']->admin_name));
|
$smarty->assign('poll_name', Utils::fromPostOrDefault('name', $_SESSION['form']->admin_name));
|
||||||
$smarty->assign('poll_mail', Utils::fromPostOrDefault('mail', $_SESSION['form']->admin_mail));
|
$smarty->assign('poll_mail', Utils::fromPostOrDefault('mail', $_SESSION['form']->admin_mail));
|
||||||
$smarty->assign('poll_editable', Utils::fromPostOrDefault('editable', $_SESSION['form']->editable));
|
$smarty->assign('poll_editable', Utils::fromPostOrDefault('editable', $_SESSION['form']->editable));
|
||||||
|
@ -23,9 +23,3 @@
|
|||||||
border-top: 0 none;
|
border-top: 0 none;
|
||||||
content: "";
|
content: "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 767px) {
|
|
||||||
#optionnal {
|
|
||||||
margin-top: 15px;
|
|
||||||
}
|
|
||||||
}
|
|
261
css/bootstrap-theme.css
vendored
261
css/bootstrap-theme.css
vendored
@ -1,9 +1,8 @@
|
|||||||
/*!
|
/*!
|
||||||
* Bootstrap v3.2.0 (http://getbootstrap.com)
|
* Bootstrap v3.3.7 (http://getbootstrap.com)
|
||||||
* Copyright 2011-2014 Twitter, Inc.
|
* Copyright 2011-2016 Twitter, Inc.
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.btn-default,
|
.btn-default,
|
||||||
.btn-primary,
|
.btn-primary,
|
||||||
.btn-success,
|
.btn-success,
|
||||||
@ -29,6 +28,35 @@
|
|||||||
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
||||||
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
||||||
}
|
}
|
||||||
|
.btn-default.disabled,
|
||||||
|
.btn-primary.disabled,
|
||||||
|
.btn-success.disabled,
|
||||||
|
.btn-info.disabled,
|
||||||
|
.btn-warning.disabled,
|
||||||
|
.btn-danger.disabled,
|
||||||
|
.btn-default[disabled],
|
||||||
|
.btn-primary[disabled],
|
||||||
|
.btn-success[disabled],
|
||||||
|
.btn-info[disabled],
|
||||||
|
.btn-warning[disabled],
|
||||||
|
.btn-danger[disabled],
|
||||||
|
fieldset[disabled] .btn-default,
|
||||||
|
fieldset[disabled] .btn-primary,
|
||||||
|
fieldset[disabled] .btn-success,
|
||||||
|
fieldset[disabled] .btn-info,
|
||||||
|
fieldset[disabled] .btn-warning,
|
||||||
|
fieldset[disabled] .btn-danger {
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.btn-default .badge,
|
||||||
|
.btn-primary .badge,
|
||||||
|
.btn-success .badge,
|
||||||
|
.btn-info .badge,
|
||||||
|
.btn-warning .badge,
|
||||||
|
.btn-danger .badge {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
.btn:active,
|
.btn:active,
|
||||||
.btn.active {
|
.btn.active {
|
||||||
background-image: none;
|
background-image: none;
|
||||||
@ -55,34 +83,66 @@
|
|||||||
background-color: #e0e0e0;
|
background-color: #e0e0e0;
|
||||||
border-color: #dbdbdb;
|
border-color: #dbdbdb;
|
||||||
}
|
}
|
||||||
.btn-default:disabled,
|
.btn-default.disabled,
|
||||||
.btn-default[disabled] {
|
.btn-default[disabled],
|
||||||
|
fieldset[disabled] .btn-default,
|
||||||
|
.btn-default.disabled:hover,
|
||||||
|
.btn-default[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-default:hover,
|
||||||
|
.btn-default.disabled:focus,
|
||||||
|
.btn-default[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-default:focus,
|
||||||
|
.btn-default.disabled.focus,
|
||||||
|
.btn-default[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-default.focus,
|
||||||
|
.btn-default.disabled:active,
|
||||||
|
.btn-default[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-default:active,
|
||||||
|
.btn-default.disabled.active,
|
||||||
|
.btn-default[disabled].active,
|
||||||
|
fieldset[disabled] .btn-default.active {
|
||||||
background-color: #e0e0e0;
|
background-color: #e0e0e0;
|
||||||
background-image: none;
|
background-image: none;
|
||||||
}
|
}
|
||||||
.btn-primary {
|
.btn-primary {
|
||||||
background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
|
||||||
background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
|
background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
|
||||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2));
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
|
||||||
background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
|
background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
background-repeat: repeat-x;
|
background-repeat: repeat-x;
|
||||||
border-color: #2b669a;
|
border-color: #245580;
|
||||||
}
|
}
|
||||||
.btn-primary:hover,
|
.btn-primary:hover,
|
||||||
.btn-primary:focus {
|
.btn-primary:focus {
|
||||||
background-color: #2d6ca2;
|
background-color: #265a88;
|
||||||
background-position: 0 -15px;
|
background-position: 0 -15px;
|
||||||
}
|
}
|
||||||
.btn-primary:active,
|
.btn-primary:active,
|
||||||
.btn-primary.active {
|
.btn-primary.active {
|
||||||
background-color: #2d6ca2;
|
background-color: #265a88;
|
||||||
border-color: #2b669a;
|
border-color: #245580;
|
||||||
}
|
}
|
||||||
.btn-primary:disabled,
|
.btn-primary.disabled,
|
||||||
.btn-primary[disabled] {
|
.btn-primary[disabled],
|
||||||
background-color: #2d6ca2;
|
fieldset[disabled] .btn-primary,
|
||||||
|
.btn-primary.disabled:hover,
|
||||||
|
.btn-primary[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-primary:hover,
|
||||||
|
.btn-primary.disabled:focus,
|
||||||
|
.btn-primary[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-primary:focus,
|
||||||
|
.btn-primary.disabled.focus,
|
||||||
|
.btn-primary[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-primary.focus,
|
||||||
|
.btn-primary.disabled:active,
|
||||||
|
.btn-primary[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-primary:active,
|
||||||
|
.btn-primary.disabled.active,
|
||||||
|
.btn-primary[disabled].active,
|
||||||
|
fieldset[disabled] .btn-primary.active {
|
||||||
|
background-color: #265a88;
|
||||||
background-image: none;
|
background-image: none;
|
||||||
}
|
}
|
||||||
.btn-success {
|
.btn-success {
|
||||||
@ -105,8 +165,24 @@
|
|||||||
background-color: #419641;
|
background-color: #419641;
|
||||||
border-color: #3e8f3e;
|
border-color: #3e8f3e;
|
||||||
}
|
}
|
||||||
.btn-success:disabled,
|
.btn-success.disabled,
|
||||||
.btn-success[disabled] {
|
.btn-success[disabled],
|
||||||
|
fieldset[disabled] .btn-success,
|
||||||
|
.btn-success.disabled:hover,
|
||||||
|
.btn-success[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-success:hover,
|
||||||
|
.btn-success.disabled:focus,
|
||||||
|
.btn-success[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-success:focus,
|
||||||
|
.btn-success.disabled.focus,
|
||||||
|
.btn-success[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-success.focus,
|
||||||
|
.btn-success.disabled:active,
|
||||||
|
.btn-success[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-success:active,
|
||||||
|
.btn-success.disabled.active,
|
||||||
|
.btn-success[disabled].active,
|
||||||
|
fieldset[disabled] .btn-success.active {
|
||||||
background-color: #419641;
|
background-color: #419641;
|
||||||
background-image: none;
|
background-image: none;
|
||||||
}
|
}
|
||||||
@ -130,8 +206,24 @@
|
|||||||
background-color: #2aabd2;
|
background-color: #2aabd2;
|
||||||
border-color: #28a4c9;
|
border-color: #28a4c9;
|
||||||
}
|
}
|
||||||
.btn-info:disabled,
|
.btn-info.disabled,
|
||||||
.btn-info[disabled] {
|
.btn-info[disabled],
|
||||||
|
fieldset[disabled] .btn-info,
|
||||||
|
.btn-info.disabled:hover,
|
||||||
|
.btn-info[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-info:hover,
|
||||||
|
.btn-info.disabled:focus,
|
||||||
|
.btn-info[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-info:focus,
|
||||||
|
.btn-info.disabled.focus,
|
||||||
|
.btn-info[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-info.focus,
|
||||||
|
.btn-info.disabled:active,
|
||||||
|
.btn-info[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-info:active,
|
||||||
|
.btn-info.disabled.active,
|
||||||
|
.btn-info[disabled].active,
|
||||||
|
fieldset[disabled] .btn-info.active {
|
||||||
background-color: #2aabd2;
|
background-color: #2aabd2;
|
||||||
background-image: none;
|
background-image: none;
|
||||||
}
|
}
|
||||||
@ -155,8 +247,24 @@
|
|||||||
background-color: #eb9316;
|
background-color: #eb9316;
|
||||||
border-color: #e38d13;
|
border-color: #e38d13;
|
||||||
}
|
}
|
||||||
.btn-warning:disabled,
|
.btn-warning.disabled,
|
||||||
.btn-warning[disabled] {
|
.btn-warning[disabled],
|
||||||
|
fieldset[disabled] .btn-warning,
|
||||||
|
.btn-warning.disabled:hover,
|
||||||
|
.btn-warning[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-warning:hover,
|
||||||
|
.btn-warning.disabled:focus,
|
||||||
|
.btn-warning[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-warning:focus,
|
||||||
|
.btn-warning.disabled.focus,
|
||||||
|
.btn-warning[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-warning.focus,
|
||||||
|
.btn-warning.disabled:active,
|
||||||
|
.btn-warning[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-warning:active,
|
||||||
|
.btn-warning.disabled.active,
|
||||||
|
.btn-warning[disabled].active,
|
||||||
|
fieldset[disabled] .btn-warning.active {
|
||||||
background-color: #eb9316;
|
background-color: #eb9316;
|
||||||
background-image: none;
|
background-image: none;
|
||||||
}
|
}
|
||||||
@ -180,8 +288,24 @@
|
|||||||
background-color: #c12e2a;
|
background-color: #c12e2a;
|
||||||
border-color: #b92c28;
|
border-color: #b92c28;
|
||||||
}
|
}
|
||||||
.btn-danger:disabled,
|
.btn-danger.disabled,
|
||||||
.btn-danger[disabled] {
|
.btn-danger[disabled],
|
||||||
|
fieldset[disabled] .btn-danger,
|
||||||
|
.btn-danger.disabled:hover,
|
||||||
|
.btn-danger[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-danger:hover,
|
||||||
|
.btn-danger.disabled:focus,
|
||||||
|
.btn-danger[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-danger:focus,
|
||||||
|
.btn-danger.disabled.focus,
|
||||||
|
.btn-danger[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-danger.focus,
|
||||||
|
.btn-danger.disabled:active,
|
||||||
|
.btn-danger[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-danger:active,
|
||||||
|
.btn-danger.disabled.active,
|
||||||
|
.btn-danger[disabled].active,
|
||||||
|
fieldset[disabled] .btn-danger.active {
|
||||||
background-color: #c12e2a;
|
background-color: #c12e2a;
|
||||||
background-image: none;
|
background-image: none;
|
||||||
}
|
}
|
||||||
@ -203,12 +327,12 @@
|
|||||||
.dropdown-menu > .active > a,
|
.dropdown-menu > .active > a,
|
||||||
.dropdown-menu > .active > a:hover,
|
.dropdown-menu > .active > a:hover,
|
||||||
.dropdown-menu > .active > a:focus {
|
.dropdown-menu > .active > a:focus {
|
||||||
background-color: #357ebd;
|
background-color: #2e6da4;
|
||||||
background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
|
||||||
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
|
||||||
background-repeat: repeat-x;
|
background-repeat: repeat-x;
|
||||||
}
|
}
|
||||||
.navbar-default {
|
.navbar-default {
|
||||||
@ -223,12 +347,13 @@
|
|||||||
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
||||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
||||||
}
|
}
|
||||||
|
.navbar-default .navbar-nav > .open > a,
|
||||||
.navbar-default .navbar-nav > .active > a {
|
.navbar-default .navbar-nav > .active > a {
|
||||||
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
|
background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
|
||||||
background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
|
background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
|
||||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3));
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
|
||||||
background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
|
background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
|
||||||
background-repeat: repeat-x;
|
background-repeat: repeat-x;
|
||||||
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
||||||
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
||||||
@ -245,13 +370,15 @@
|
|||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
background-repeat: repeat-x;
|
background-repeat: repeat-x;
|
||||||
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
.navbar-inverse .navbar-nav > .open > a,
|
||||||
.navbar-inverse .navbar-nav > .active > a {
|
.navbar-inverse .navbar-nav > .active > a {
|
||||||
background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
|
background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
|
||||||
background-image: -o-linear-gradient(top, #222 0%, #282828 100%);
|
background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
|
||||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828));
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
|
||||||
background-image: linear-gradient(to bottom, #222 0%, #282828 100%);
|
background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
|
||||||
background-repeat: repeat-x;
|
background-repeat: repeat-x;
|
||||||
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
||||||
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
||||||
@ -265,6 +392,19 @@
|
|||||||
.navbar-fixed-bottom {
|
.navbar-fixed-bottom {
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.navbar .navbar-nav .open .dropdown-menu > .active > a,
|
||||||
|
.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
|
||||||
|
.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
|
||||||
|
color: #fff;
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
}
|
||||||
.alert {
|
.alert {
|
||||||
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
|
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
|
||||||
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
|
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
|
||||||
@ -315,11 +455,11 @@
|
|||||||
background-repeat: repeat-x;
|
background-repeat: repeat-x;
|
||||||
}
|
}
|
||||||
.progress-bar {
|
.progress-bar {
|
||||||
background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
|
||||||
background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
|
background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
|
||||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9));
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
|
||||||
background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
|
background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
|
||||||
background-repeat: repeat-x;
|
background-repeat: repeat-x;
|
||||||
}
|
}
|
||||||
.progress-bar-success {
|
.progress-bar-success {
|
||||||
@ -367,14 +507,19 @@
|
|||||||
.list-group-item.active,
|
.list-group-item.active,
|
||||||
.list-group-item.active:hover,
|
.list-group-item.active:hover,
|
||||||
.list-group-item.active:focus {
|
.list-group-item.active:focus {
|
||||||
text-shadow: 0 -1px 0 #3071a9;
|
text-shadow: 0 -1px 0 #286090;
|
||||||
background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
|
||||||
background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
|
||||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3));
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
|
||||||
background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
|
||||||
background-repeat: repeat-x;
|
background-repeat: repeat-x;
|
||||||
border-color: #3278b3;
|
border-color: #2b669a;
|
||||||
|
}
|
||||||
|
.list-group-item.active .badge,
|
||||||
|
.list-group-item.active:hover .badge,
|
||||||
|
.list-group-item.active:focus .badge {
|
||||||
|
text-shadow: none;
|
||||||
}
|
}
|
||||||
.panel {
|
.panel {
|
||||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
|
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
|
||||||
@ -389,11 +534,11 @@
|
|||||||
background-repeat: repeat-x;
|
background-repeat: repeat-x;
|
||||||
}
|
}
|
||||||
.panel-primary > .panel-heading {
|
.panel-primary > .panel-heading {
|
||||||
background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
|
||||||
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
|
||||||
background-repeat: repeat-x;
|
background-repeat: repeat-x;
|
||||||
}
|
}
|
||||||
.panel-success > .panel-heading {
|
.panel-success > .panel-heading {
|
||||||
|
File diff suppressed because one or more lines are too long
7
css/bootstrap-theme.min.css
vendored
7
css/bootstrap-theme.min.css
vendored
File diff suppressed because one or more lines are too long
1
css/bootstrap-theme.min.css.map
Normal file
1
css/bootstrap-theme.min.css.map
Normal file
File diff suppressed because one or more lines are too long
1238
css/bootstrap.css
vendored
1238
css/bootstrap.css
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7
css/bootstrap.min.css
vendored
7
css/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
1
css/bootstrap.min.css.map
Normal file
1
css/bootstrap.min.css.map
Normal file
File diff suppressed because one or more lines are too long
2431
css/fork-awesome.css
Normal file
2431
css/fork-awesome.css
Normal file
File diff suppressed because it is too large
Load Diff
4
css/fork-awesome.min.css
vendored
Normal file
4
css/fork-awesome.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
css/fork-awesome.min.css.map
Normal file
1
css/fork-awesome.min.css.map
Normal file
File diff suppressed because one or more lines are too long
10
css/jquery-ui.min.css
vendored
10
css/jquery-ui.min.css
vendored
File diff suppressed because one or more lines are too long
7
css/simplemde.min.css
vendored
Normal file
7
css/simplemde.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -37,6 +37,10 @@ body {
|
|||||||
margin: 15px auto 30px;
|
margin: 15px auto 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hide {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
/* Commentaires */
|
/* Commentaires */
|
||||||
div.comment{
|
div.comment{
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
@ -69,15 +73,19 @@ header h1 {
|
|||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
.container {
|
.container {
|
||||||
padding:30px;
|
padding: 30px;
|
||||||
}
|
}
|
||||||
.container .jumbotron {
|
.container .jumbotron {
|
||||||
padding:20px 20px;
|
padding: 20px 20px;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
}
|
}
|
||||||
.container .jumbotron p {
|
.container .jumbotron p {
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
}
|
}
|
||||||
|
.container .jumbotron .btn-group >.btn {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
.summary h4 {
|
.summary h4 {
|
||||||
margin-top:0;
|
margin-top:0;
|
||||||
@ -115,9 +123,15 @@ header h1 {
|
|||||||
/* Description du sondage */
|
/* Description du sondage */
|
||||||
/* studs.php et adminstuds.php */
|
/* studs.php et adminstuds.php */
|
||||||
header .lead {
|
header .lead {
|
||||||
padding:10px 0;
|
padding: 10px 0;
|
||||||
margin:0;
|
margin:0;
|
||||||
}
|
}
|
||||||
|
header form .input-group .form-control {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
header form .input-group .input-group-btn {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
#admin-link, #public-link {
|
#admin-link, #public-link {
|
||||||
cursor:text;
|
cursor:text;
|
||||||
@ -136,10 +150,26 @@ header .lead {
|
|||||||
|
|
||||||
.poll-description {
|
.poll-description {
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
white-space: pre-wrap;
|
|
||||||
word-break: initial;
|
word-break: initial;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Description in markdown **/
|
||||||
|
.form-group .CodeMirror, .form-group .CodeMirror-scroll {
|
||||||
|
min-height: 200px;
|
||||||
|
}
|
||||||
|
#description-form .CodeMirror {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.editor-toolbar {
|
||||||
|
margin-top: 10px;
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
#poll_comments {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
h4.control-label {
|
h4.control-label {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
@ -212,13 +242,8 @@ caption {
|
|||||||
|
|
||||||
/* Tableau du sondage */
|
/* Tableau du sondage */
|
||||||
#tableContainer {
|
#tableContainer {
|
||||||
overflow-x:hidden;
|
|
||||||
margin:5px auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tableContainer:focus,
|
|
||||||
#tableContainer:hover {
|
|
||||||
overflow-x:auto;
|
overflow-x:auto;
|
||||||
|
margin:5px auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.results {
|
table.results {
|
||||||
@ -245,7 +270,7 @@ table.results tbody td {
|
|||||||
table.results thead th {
|
table.results thead th {
|
||||||
text-align:center;
|
text-align:center;
|
||||||
border:2px solid white;
|
border:2px solid white;
|
||||||
padding:5px;
|
padding: 5px;
|
||||||
min-width:40px;
|
min-width:40px;
|
||||||
font-size:12px;
|
font-size:12px;
|
||||||
max-width:100px;
|
max-width:100px;
|
||||||
@ -253,9 +278,13 @@ table.results thead th {
|
|||||||
text-overflow:ellipsis;
|
text-overflow:ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table.results thead th img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
table.results thead .btn {
|
table.results thead .btn {
|
||||||
margin:0 auto;
|
margin: 0 auto;
|
||||||
display:block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.results th.rbd.day,
|
table.results th.rbd.day,
|
||||||
@ -305,11 +334,22 @@ table.results .btn-link.btn-sm {
|
|||||||
padding-right:30px;
|
padding-right:30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Formulaire de création de sondage */
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
#formulaire .col-xs-12 {
|
||||||
|
padding-left: 0;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Formulaire de vote */
|
/* Formulaire de vote */
|
||||||
#vote-form td ul, #vote-form td label {
|
#vote-form td ul, #vote-form td label {
|
||||||
margin:0;
|
margin:0;
|
||||||
font-size:12px;
|
font-size:12px;
|
||||||
}
|
}
|
||||||
|
#vote-form td label {
|
||||||
|
padding: 1px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
#vote-form td {
|
#vote-form td {
|
||||||
border-top:2px solid white;
|
border-top:2px solid white;
|
||||||
@ -321,11 +361,11 @@ table.results .btn-link.btn-sm {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: 1px;
|
width: 1px;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
padding: 0px;
|
padding: 0;
|
||||||
margin: -1px;
|
margin: -1px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
clip: rect(0px, 0px, 0px, 0px);
|
clip: rect(0px, 0px, 0px, 0px);
|
||||||
border: 0px none;
|
border: 0 none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.choice input:focus + label {
|
.choice input:focus + label {
|
||||||
@ -333,17 +373,25 @@ table.results .btn-link.btn-sm {
|
|||||||
outline-offset: -2px;
|
outline-offset: -2px;
|
||||||
}
|
}
|
||||||
.choice {
|
.choice {
|
||||||
width:32px;
|
width: 35px;
|
||||||
margin:0 auto !important;
|
margin:0 auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.choice label {
|
.choice label {
|
||||||
cursor:pointer;
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.btn-edit {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.edit-username-left {
|
||||||
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.yes .btn, .ifneedbe .btn, .no .btn {
|
.yes .btn, .ifneedbe .btn, .no .btn {
|
||||||
width:32px;
|
width: 35px;
|
||||||
color:#555;
|
color: #555;
|
||||||
}
|
}
|
||||||
|
|
||||||
.yes .btn,.yes .btn:hover {
|
.yes .btn,.yes .btn:hover {
|
||||||
@ -501,6 +549,12 @@ table.results > tbody > tr:hover > td .glyphicon {
|
|||||||
#poll_search {
|
#poll_search {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
.table-of-polls {
|
||||||
|
overflow-x: scroll;
|
||||||
|
margin-bottom: 0;
|
||||||
|
border: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
/* Studs */
|
/* Studs */
|
||||||
.password_request {
|
.password_request {
|
||||||
@ -511,3 +565,8 @@ table.results > tbody > tr:hover > td .glyphicon {
|
|||||||
#password-form .btn-cancel {
|
#password-form .btn-cancel {
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Buttons */
|
||||||
|
.btn {
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
@ -4,16 +4,16 @@
|
|||||||
* is not distributed with this file, you can obtain one at
|
* is not distributed with this file, you can obtain one at
|
||||||
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
|
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
|
||||||
*
|
*
|
||||||
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
|
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
|
||||||
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
|
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
|
||||||
*
|
*
|
||||||
* =============================
|
* =============================
|
||||||
*
|
*
|
||||||
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
|
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
|
||||||
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
|
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
|
||||||
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
|
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
|
||||||
*
|
*
|
||||||
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
|
||||||
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ include_once __DIR__ . '/app/inc/init.php';
|
|||||||
/* -------- */
|
/* -------- */
|
||||||
$logService = new LogService();
|
$logService = new LogService();
|
||||||
$pollService = new PollService($connect, $logService);
|
$pollService = new PollService($connect, $logService);
|
||||||
$mailService = new MailService($config['use_smtp']);
|
$mailService = new MailService($config['use_smtp'], $config['smtp_options']);
|
||||||
|
|
||||||
/* PAGE */
|
/* PAGE */
|
||||||
/* ---- */
|
/* ---- */
|
||||||
@ -43,7 +43,7 @@ if (!empty($_POST['mail'])) {
|
|||||||
$smarty->assign('polls', $polls);
|
$smarty->assign('polls', $polls);
|
||||||
$body = $smarty->fetch('mail/find_polls.tpl');
|
$body = $smarty->fetch('mail/find_polls.tpl');
|
||||||
|
|
||||||
$mailService->send($mail, __('FindPolls', 'List of your polls').' - '.NOMAPPLICATION, $body, 'SEND_POLLS');
|
$mailService->send($mail, __('FindPolls', 'List of your polls') . ' - ' . NOMAPPLICATION, $body, 'SEND_POLLS');
|
||||||
$message = new Message('success', __('FindPolls', 'Polls sent'));
|
$message = new Message('success', __('FindPolls', 'Polls sent'));
|
||||||
} else {
|
} else {
|
||||||
$message = new Message('warning', __('Error', 'No polls found'));
|
$message = new Message('warning', __('Error', 'No polls found'));
|
||||||
@ -53,7 +53,6 @@ if (!empty($_POST['mail'])) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$smarty->assign('title', __('Homepage', 'Where are my polls'));
|
$smarty->assign('title', __('Homepage', 'Where are my polls'));
|
||||||
$smarty->assign('message', $message);
|
$smarty->assign('message', $message);
|
||||||
|
|
||||||
|
BIN
fonts/forkawesome-webfont.eot
Normal file
BIN
fonts/forkawesome-webfont.eot
Normal file
Binary file not shown.
2692
fonts/forkawesome-webfont.svg
Normal file
2692
fonts/forkawesome-webfont.svg
Normal file
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 443 KiB |
BIN
fonts/forkawesome-webfont.ttf
Normal file
BIN
fonts/forkawesome-webfont.ttf
Normal file
Binary file not shown.
BIN
fonts/forkawesome-webfont.woff
Normal file
BIN
fonts/forkawesome-webfont.woff
Normal file
Binary file not shown.
BIN
fonts/forkawesome-webfont.woff2
Normal file
BIN
fonts/forkawesome-webfont.woff2
Normal file
Binary file not shown.
Binary file not shown.
@ -6,224 +6,283 @@
|
|||||||
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
|
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
|
||||||
<font-face units-per-em="1200" ascent="960" descent="-240" />
|
<font-face units-per-em="1200" ascent="960" descent="-240" />
|
||||||
<missing-glyph horiz-adv-x="500" />
|
<missing-glyph horiz-adv-x="500" />
|
||||||
<glyph />
|
<glyph horiz-adv-x="0" />
|
||||||
<glyph />
|
<glyph horiz-adv-x="400" />
|
||||||
<glyph unicode="
" />
|
|
||||||
<glyph unicode=" " />
|
<glyph unicode=" " />
|
||||||
<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
|
<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
|
||||||
<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
|
<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode=" " />
|
<glyph unicode=" " />
|
||||||
<glyph unicode=" " horiz-adv-x="652" />
|
<glyph unicode="¥" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
|
||||||
<glyph unicode=" " horiz-adv-x="1304" />
|
<glyph unicode=" " horiz-adv-x="650" />
|
||||||
<glyph unicode=" " horiz-adv-x="652" />
|
<glyph unicode=" " horiz-adv-x="1300" />
|
||||||
<glyph unicode=" " horiz-adv-x="1304" />
|
<glyph unicode=" " horiz-adv-x="650" />
|
||||||
<glyph unicode=" " horiz-adv-x="434" />
|
<glyph unicode=" " horiz-adv-x="1300" />
|
||||||
<glyph unicode=" " horiz-adv-x="326" />
|
<glyph unicode=" " horiz-adv-x="433" />
|
||||||
<glyph unicode=" " horiz-adv-x="217" />
|
<glyph unicode=" " horiz-adv-x="325" />
|
||||||
<glyph unicode=" " horiz-adv-x="217" />
|
<glyph unicode=" " horiz-adv-x="216" />
|
||||||
<glyph unicode=" " horiz-adv-x="163" />
|
<glyph unicode=" " horiz-adv-x="216" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="162" />
|
||||||
<glyph unicode=" " horiz-adv-x="260" />
|
<glyph unicode=" " horiz-adv-x="260" />
|
||||||
<glyph unicode=" " horiz-adv-x="72" />
|
<glyph unicode=" " horiz-adv-x="72" />
|
||||||
<glyph unicode=" " horiz-adv-x="260" />
|
<glyph unicode=" " horiz-adv-x="260" />
|
||||||
<glyph unicode=" " horiz-adv-x="326" />
|
<glyph unicode=" " horiz-adv-x="325" />
|
||||||
<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
|
<glyph unicode="€" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
|
||||||
<glyph unicode="−" d="M200 400h900v300h-900v-300z" />
|
<glyph unicode="₽" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
|
||||||
|
<glyph unicode="−" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="⌛" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
|
||||||
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
|
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
|
||||||
<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
|
<glyph unicode="☁" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
|
||||||
<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
|
<glyph unicode="⛺" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
|
||||||
<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
|
<glyph unicode="✉" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
|
||||||
<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
|
<glyph unicode="✏" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
|
||||||
<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
|
<glyph unicode="" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
|
||||||
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
|
<glyph unicode="" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
|
||||||
<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
|
<glyph unicode="" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
|
||||||
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
|
<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
|
||||||
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
|
<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
|
||||||
<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
|
<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
|
||||||
<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
|
<glyph unicode="" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
|
||||||
<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
|
<glyph unicode="" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
|
||||||
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
|
<glyph unicode="" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
|
<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
|
<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
|
<glyph unicode="" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
|
||||||
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
|
<glyph unicode="" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
|
||||||
<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
|
<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
|
<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
|
<glyph unicode="" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
|
||||||
<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
|
<glyph unicode="" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
|
<glyph unicode="" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
|
||||||
<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
|
<glyph unicode="" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
|
||||||
<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
|
<glyph unicode="" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
|
||||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
|
<glyph unicode="" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
|
||||||
<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
|
<glyph unicode="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
|
||||||
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
|
<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
|
||||||
<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
|
||||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
|
<glyph unicode="" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
|
||||||
<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
|
||||||
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
|
<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
|
||||||
<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
|
<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
|
||||||
<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
|
<glyph unicode="" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
|
<glyph unicode="" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
|
||||||
<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
|
<glyph unicode="" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
|
||||||
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
|
<glyph unicode="" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
|
||||||
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
|
<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
|
||||||
<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
|
<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
|
||||||
<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
|
<glyph unicode="" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
|
||||||
<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
|
<glyph unicode="" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
|
||||||
<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
|
<glyph unicode="" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
|
||||||
<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
|
<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
|
||||||
<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
|
<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
|
||||||
<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
|
<glyph unicode="" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
|
||||||
<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
|
<glyph unicode="" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
|
<glyph unicode="" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
|
||||||
<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
|
<glyph unicode="" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
|
||||||
<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
|
<glyph unicode="" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
|
||||||
<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
|
<glyph unicode="" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
|
||||||
<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
|
<glyph unicode="" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
|
||||||
<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
|
<glyph unicode="" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
|
||||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
|
<glyph unicode="" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
|
||||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
|
<glyph unicode="" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
|
<glyph unicode="" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
|
<glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
|
<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
|
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
|
<glyph unicode="" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
|
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
|
<glyph unicode="" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
|
||||||
<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
|
<glyph unicode="" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
|
||||||
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
|
<glyph unicode="" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
|
||||||
<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
|
||||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
|
<glyph unicode="" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
|
||||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
|
<glyph unicode="" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
|
||||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
|
<glyph unicode="" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
|
||||||
<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
|
<glyph unicode="" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
|
||||||
<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
<glyph unicode="" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
|
||||||
<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
<glyph unicode="" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
|
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" />
|
<glyph unicode="" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
|
||||||
<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
|
<glyph unicode="" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
|
||||||
<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
|
<glyph unicode="" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
|
<glyph unicode="" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
|
||||||
<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
|
<glyph unicode="" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
|
||||||
<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
|
<glyph unicode="" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
|
<glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
|
<glyph unicode="" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
|
<glyph unicode="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
|
||||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
|
<glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
|
||||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
|
||||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
|
||||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
|
||||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
|
||||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
|
<glyph unicode="" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
|
||||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
|
||||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
|
||||||
<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
|
||||||
<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
|
<glyph unicode="" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
|
||||||
<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
|
<glyph unicode="" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
|
||||||
<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" />
|
<glyph unicode="" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
|
||||||
<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
|
<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
|
<glyph unicode="" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
|
||||||
<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
|
<glyph unicode="" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
|
||||||
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
|
<glyph unicode="" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
|
||||||
<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
|
<glyph unicode="" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
|
||||||
<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
|
<glyph unicode="" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
|
||||||
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
|
<glyph unicode="" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
|
||||||
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
|
<glyph unicode="" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
|
||||||
<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
|
<glyph unicode="" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
|
||||||
<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
|
<glyph unicode="" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
|
||||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
|
<glyph unicode="" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
|
||||||
<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
|
<glyph unicode="" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
|
||||||
<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
|
<glyph unicode="" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
|
||||||
<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
|
<glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
|
||||||
<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
|
<glyph unicode="" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
|
||||||
<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
|
<glyph unicode="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
|
||||||
<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
|
<glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
|
||||||
<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
|
<glyph unicode="" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||||
<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
|
<glyph unicode="" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
|
||||||
<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
|
<glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
|
||||||
<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
|
<glyph unicode="" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
|
||||||
<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
|
<glyph unicode="" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||||
<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
|
<glyph unicode="" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
|
||||||
<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
|
<glyph unicode="" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
|
||||||
<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
|
<glyph unicode="" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
|
||||||
<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
|
<glyph unicode="" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
|
||||||
<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
|
<glyph unicode="" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
|
||||||
<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
|
<glyph unicode="" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
|
<glyph unicode="" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
|
||||||
<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
|
<glyph unicode="" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
|
<glyph unicode="" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
|
<glyph unicode="" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
|
<glyph unicode="" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
|
||||||
<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
|
||||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
|
||||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
|
||||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
|
<glyph unicode="" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
|
||||||
<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
|
<glyph unicode="" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
|
||||||
<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
|
<glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
|
||||||
<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
|
<glyph unicode="" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
|
||||||
<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
|
<glyph unicode="" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
|
||||||
<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
|
<glyph unicode="" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
|
||||||
<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
|
<glyph unicode="" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
|
||||||
<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
|
<glyph unicode="" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
|
||||||
<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
|
<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
|
||||||
<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
|
<glyph unicode="" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
|
||||||
<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
|
<glyph unicode="" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
|
||||||
<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
|
<glyph unicode="" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
|
||||||
<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
|
<glyph unicode="" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
|
||||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
|
<glyph unicode="" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
|
||||||
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||||
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
|
<glyph unicode="" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
|
||||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
|
||||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
|
||||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
|
||||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
|
||||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
|
||||||
<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
|
<glyph unicode="" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
|
||||||
<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
|
<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
|
||||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
|
<glyph unicode="" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
|
||||||
<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
|
<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
|
||||||
<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
|
<glyph unicode="" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
|
||||||
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
|
<glyph unicode="" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
|
||||||
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
|
<glyph unicode="" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
|
||||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
|
<glyph unicode="" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
|
||||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
|
<glyph unicode="" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
|
||||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
|
<glyph unicode="" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
|
||||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
|
<glyph unicode="" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
|
||||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
|
<glyph unicode="" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
|
||||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
|
<glyph unicode="" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
|
||||||
<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
|
<glyph unicode="" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
|
||||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
|
<glyph unicode="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
|
||||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
|
<glyph unicode="" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
|
||||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
|
<glyph unicode="" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
|
||||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
|
<glyph unicode="" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
|
||||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
|
<glyph unicode="" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
|
<glyph unicode="" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
|
||||||
<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
|
<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
|
||||||
<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
|
<glyph unicode="" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
|
||||||
<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
|
<glyph unicode="" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
|
||||||
<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
|
<glyph unicode="" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
|
||||||
<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
|
<glyph unicode="" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
|
||||||
<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
|
<glyph unicode="" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
|
||||||
<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
|
<glyph unicode="" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
|
||||||
<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
|
<glyph unicode="" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
|
<glyph unicode="" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
|
||||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
|
||||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
|
||||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
|
||||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
|
||||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
|
||||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
|
||||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
|
||||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
|
||||||
<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
|
<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
|
||||||
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
|
<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
|
||||||
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
|
<glyph unicode="" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
|
<glyph unicode="" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
|
||||||
<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
|
<glyph unicode="" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
|
||||||
|
<glyph unicode="" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
|
||||||
|
<glyph unicode="" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
|
||||||
|
<glyph unicode="" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
|
||||||
|
<glyph unicode="" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
|
||||||
|
<glyph unicode="" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
|
||||||
|
<glyph unicode="" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
|
||||||
|
<glyph unicode="" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
|
||||||
|
<glyph unicode="" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
|
||||||
|
<glyph unicode="" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
|
||||||
|
<glyph unicode="" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
|
||||||
|
<glyph unicode="" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
|
||||||
|
<glyph unicode="" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
|
||||||
|
<glyph unicode="" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
|
||||||
|
<glyph unicode="" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
|
||||||
|
<glyph unicode="" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
|
||||||
|
<glyph unicode="" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
|
||||||
|
<glyph unicode="" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
|
||||||
|
<glyph unicode="" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
|
||||||
|
<glyph unicode="" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
|
||||||
|
<glyph unicode="" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
|
||||||
|
<glyph unicode="" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
|
||||||
|
<glyph unicode="" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
|
||||||
|
<glyph unicode="" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
|
||||||
|
<glyph unicode="" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
|
||||||
|
<glyph unicode="" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
|
||||||
|
<glyph unicode="" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
|
||||||
|
<glyph unicode="" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
|
||||||
|
<glyph unicode="" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
|
||||||
|
<glyph unicode="" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
|
||||||
|
<glyph unicode="" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
|
||||||
|
<glyph unicode="" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
|
||||||
|
<glyph unicode="" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
|
||||||
|
<glyph unicode="" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
|
||||||
|
<glyph unicode="" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
|
||||||
|
<glyph unicode="" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
|
||||||
|
<glyph unicode="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
|
||||||
|
<glyph unicode="" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
|
||||||
|
<glyph unicode="" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
|
||||||
|
<glyph unicode="" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
|
||||||
|
<glyph unicode="" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
|
||||||
|
<glyph unicode="" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
|
||||||
|
<glyph unicode="" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
|
||||||
|
<glyph unicode="" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
|
||||||
|
<glyph unicode="🔑" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
|
||||||
|
<glyph unicode="🚪" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
|
||||||
</font>
|
</font>
|
||||||
</defs></svg>
|
</defs></svg>
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 106 KiB |
Binary file not shown.
Binary file not shown.
BIN
fonts/glyphicons-halflings-regular.woff2
Normal file
BIN
fonts/glyphicons-halflings-regular.woff2
Normal file
Binary file not shown.
198
js/app/adminstuds.js
Normal file
198
js/app/adminstuds.js
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
wrapper = new MDEWrapper($('.js-desc textarea')[0], $('#rich-editor-button'), $('#simple-editor-button'));
|
||||||
|
var firstOpening = true;
|
||||||
|
$('[data-toggle="popover"]').popover();
|
||||||
|
|
||||||
|
function createNode(text) {
|
||||||
|
var node = document.createElement('pre');
|
||||||
|
node.style.width = '1px';
|
||||||
|
node.style.height = '1px';
|
||||||
|
node.style.position = 'fixed';
|
||||||
|
node.style.top = '5px';
|
||||||
|
node.textContent = text;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyNode(node) {
|
||||||
|
var selection = getSelection();
|
||||||
|
selection.removeAllRanges();
|
||||||
|
|
||||||
|
var range = document.createRange();
|
||||||
|
range.selectNodeContents(node);
|
||||||
|
selection.addRange(range);
|
||||||
|
|
||||||
|
document.execCommand('copy');
|
||||||
|
selection.removeAllRanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyText(text) {
|
||||||
|
var node = createNode(text);
|
||||||
|
document.body.appendChild(node);
|
||||||
|
copyNode(node);
|
||||||
|
document.body.removeChild(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When clicked on a .clipboard-url link, copy link inside clipboard and show popover confirmation for 2 seconds
|
||||||
|
*/
|
||||||
|
$('body').on('click', '.clipboard-url', function(e) {
|
||||||
|
var btn = $(e.target);
|
||||||
|
/**
|
||||||
|
* Kind of workaround for clicking child instead of button (because propagation is stopped with preventDefault())
|
||||||
|
*/
|
||||||
|
if (!btn.get(0).hasAttribute('data-toggle')) {
|
||||||
|
btn = btn.parent();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Try catch because reasons : https://caniuse.com/#feat=clipboard
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
copyText(btn.attr('href'));
|
||||||
|
btn.popover('show');
|
||||||
|
setTimeout(function () {
|
||||||
|
btn.popover('hide');
|
||||||
|
}, 2000);
|
||||||
|
e.preventDefault();
|
||||||
|
} catch (err) {
|
||||||
|
console.log('Oops, unable to copy');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#title-form .btn-edit').on('click', function() {
|
||||||
|
$('#title-form h3').hide();
|
||||||
|
$('.js-title').removeClass('hidden');
|
||||||
|
$('.js-title input').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#title-form .btn-cancel').on('click', function() {
|
||||||
|
$('#title-form h3').show();
|
||||||
|
$('#title-form .js-title').addClass('hidden');
|
||||||
|
$('#title-form .btn-edit').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#name-form .btn-edit').on('click', function() {
|
||||||
|
$('#name-form p').hide();
|
||||||
|
$('.js-name').removeClass('hidden');
|
||||||
|
$('.js-name input').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#name-form .btn-cancel').on('click', function() {
|
||||||
|
$('#name-form p').show();
|
||||||
|
$('#name-form .js-name').addClass('hidden');
|
||||||
|
$('#name-form .btn-edit').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#email-form .btn-edit').on('click', function() {
|
||||||
|
$('#email-form p').hide();
|
||||||
|
$('#email-form .js-email').removeClass('hidden');
|
||||||
|
$('.js-email input').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#email-form .btn-cancel').on('click', function() {
|
||||||
|
$('#email-form p').show();
|
||||||
|
$('#email-form .js-email').addClass('hidden');
|
||||||
|
$('#email-form .btn-edit').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#description-form .btn-edit').on('click', function() {
|
||||||
|
$('#description-form .well').hide();
|
||||||
|
$('#description-form .control-label .btn-edit').hide();
|
||||||
|
$('#description-form .js-desc').removeClass('hidden');
|
||||||
|
$('.js-desc textarea').focus();
|
||||||
|
if (firstOpening) {
|
||||||
|
firstOpening = false;
|
||||||
|
if ($('#rich-editor-button').hasClass('active')) {
|
||||||
|
wrapper.enable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#description-form .btn-cancel').on('click', function() {
|
||||||
|
$('#description-form .well').show();
|
||||||
|
$('#description-form .control-label .btn-edit').show();
|
||||||
|
$('#description-form .js-desc').addClass('hidden');
|
||||||
|
$('.js-desc .btn-edit').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#poll-rules-form .btn-edit').on('click', function() {
|
||||||
|
$('#poll-rules-form p').hide();
|
||||||
|
$('#poll-rules-form .js-poll-rules').removeClass('hidden');
|
||||||
|
$('.js-poll-rules select').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#poll-rules-form .btn-cancel').on('click', function() {
|
||||||
|
$('#poll-rules-form p').show();
|
||||||
|
$('#poll-rules-form .js-poll-rules').addClass('hidden');
|
||||||
|
$('.js-poll-rules .btn-edit').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#poll-hidden-form .btn-edit').on('click', function() {
|
||||||
|
$('#poll-hidden-form p').hide();
|
||||||
|
$('#poll-hidden-form .js-poll-hidden').removeClass('hidden');
|
||||||
|
$('.js-poll-hidden input[type=checkbox]').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#poll-hidden-form .btn-cancel').on('click', function() {
|
||||||
|
$('#poll-hidden-form p').show();
|
||||||
|
$('#poll-hidden-form .js-poll-hidden').addClass('hidden');
|
||||||
|
$('.js-poll-hidden .btn-edit').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#expiration-form .btn-edit').on('click', function() {
|
||||||
|
$('#expiration-form p').hide();
|
||||||
|
$('.js-expiration').removeClass('hidden');
|
||||||
|
$('.js-expiration input').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#expiration-form .btn-cancel').on('click', function() {
|
||||||
|
$('#expiration-form p').show();
|
||||||
|
$('#expiration-form .js-expiration').addClass('hidden');
|
||||||
|
$('#expiration-form .btn-edit').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$('#password-form .btn-edit').on('click', function() {
|
||||||
|
$('#password-form p').hide();
|
||||||
|
$('#password-form .js-password').removeClass('hidden');
|
||||||
|
$('#password').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#password-form .btn-cancel').on('click', function() {
|
||||||
|
$('#password-form p').show();
|
||||||
|
$('#password-form .js-password').addClass('hidden');
|
||||||
|
$('.js-password .btn-edit').focus();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Hiding other field when the admin wants to remove the password protection
|
||||||
|
var removePassword = $('#removePassword');
|
||||||
|
removePassword.on('click', function() {
|
||||||
|
var removeButton = removePassword.siblings('button');
|
||||||
|
if (removePassword.is(":checked")) {
|
||||||
|
$('#password_information').addClass('hidden');
|
||||||
|
removeButton.removeClass('hidden');
|
||||||
|
} else {
|
||||||
|
$('#password_information').removeClass('hidden');
|
||||||
|
removeButton.addClass('hidden');
|
||||||
|
}
|
||||||
|
removeButton.focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user