This commit is contained in:
boyska 2025-01-01 20:46:23 +01:00
commit 31f801f706
136 changed files with 9030 additions and 0 deletions

4
.agignore Normal file
View file

@ -0,0 +1,4 @@
*/*.min.css
*/*.min.js
themes/*/static/*/*.min.*
output

9
.gitignore vendored Normal file
View file

@ -0,0 +1,9 @@
output
output/*
.*.sw.
cache
*.pid
*.pyc
.*.swp
public/
/*.ics

61
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,61 @@
stages:
- build
- deploy
variables:
GIT_SUBMODULE_STRATEGY: recursive
build:
stage: build
image: python:alpine3.18
script:
- apk add build-base python3-dev
- pip3 install -r requirements.txt
- pelican --version
- env TZ=Europe/Rome pelican ./content/ --ignore-cache -o public/ -s publishconf.py -v
- echo -e "commit=${CI_COMMIT_SHA}\nbuildDate=$(date -Iseconds)\n" > public/buildinfo.txt
- find public -type f
artifacts:
paths:
- public
.deploys:
needs: ["build"]
variables:
GIT_STRATEGY: none
stage: deploy
deploy-testing:
extends: .deploys
image: amd64/debian:bullseye
before_script:
- mkdir -p ~/.ssh
- apt-get update -qq && apt-get install -y -qq rsync openssh-client
- cp ${TESTDEPLOY_SSH_PRIVATE_KEY} ~/.ssh/id_ed25519
- chmod 600 ~/.ssh/id_ed25519
script:
- rsync -avz -e "ssh -o StrictHostKeyChecking=no -p ${TESTDEPLOY_PORT} -i ~/.ssh/id_ed25519" public/ ${TESTDEPLOY_USERNAME}@"${TESTDEPLOY_SERVER}":${TESTDEPLOY_PATH}${CI_COMMIT_BRANCH:-}
# deploy-production:
# extends: .deploys
# only:
# - master
# image: tubia/webdav-upload
# script:
# - webdav-upload --verbose --user="$WEBDAV_USER" --password="$WEBDAV_PASSWORD" --url "${WEBDAV_HOST}/${WEBDAV_USER}/" public $WEBDAV_HOST_FOLDER
deploy-production:
extends: .deploys
only:
- master
image:
name: rclone/rclone:latest
entrypoint: [""]
script:
- "rclone sync -P -v -u --webdav-url ${WEBDAV_HOST}/${WEBDAV_USER}/ --webdav-user ${WEBDAV_USER} --webdav-pass $(echo -n \"${WEBDAV_PASSWORD}\" | rclone obscure -) ./public/ :webdav:${WEBDAV_HOST_FOLDER}/"

74
Makefile Normal file
View file

@ -0,0 +1,74 @@
PY?=python
PELICAN?=pelican
PELICANOPTS=
BASEDIR=$(CURDIR)
INPUTDIR=$(BASEDIR)/content
OUTPUTDIR=$(BASEDIR)/output
CONFFILE=$(BASEDIR)/pelicanconf.py
PUBLISHCONF=$(BASEDIR)/publishconf.py
DEBUG ?= 0
ifeq ($(DEBUG), 1)
PELICANOPTS += -D
endif
VERBOSE ?= 0
ifeq ($(VERBOSE), 1)
PELICANOPTS += -v
endif
all: publish
help:
@echo 'Makefile for a pelican Web site '
@echo ' '
@echo 'Usage: '
@echo ' make html (re)generate the web site '
@echo ' make clean remove the generated files '
@echo ' make regenerate regenerate files upon modification '
@echo ' make publish generate using production settings '
@echo ' make serve [PORT=8000] serve site at http://localhost:8000'
@echo ' make devserver [PORT=8000] start/restart develop_server.sh '
@echo ' make stopserver stop local server '
@echo ' '
@echo 'Set the VERBOSE variable to 1 for some more messages, e.g. make VERBOSE=1 html'
@echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html'
@echo ' '
html:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
clean:
[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR)
regenerate:
$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
serve:
ifdef PORT
@echo http://localhost:$(PORT)/
pelican --ignore-cache -lr -p $(PORT)
else
@echo http://localhost:8000/
pelican --ignore-cache -lr
endif
devserver:
ifdef PORT
$(BASEDIR)/develop_server.sh restart $(PORT)
else
$(BASEDIR)/develop_server.sh restart
endif
stopserver:
kill -9 `cat pelican.pid`
kill -9 `cat srv.pid`
@echo 'Stopped Pelican and SimpleHTTPServer processes running in background.'
publish:
$(PELICAN) $(INPUTDIR) --ignore-cache -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS)
autopublish:
while true; do inotifywait -r content pelicanconf.py publishconf.py Makefile themes -e modify -e create -e delete; make clean publish; sleep 0.1; done
.PHONY: html help clean regenerate serve devserver publish

75
README.md Normal file
View file

@ -0,0 +1,75 @@
Hackmeeting 2025
==================
Sources for Italian Hackmeeting 0x1C (2025) website.
Il sito viene gestito - in massima parte - dalla commissione comunicazione di hackmeeting. Se vuoi metterti in
contatto con loro, scrivi nella [mailing list](https://hackmeeting.org/hackit24/contact.html) per coordinarti
con loro. Se vuoi provare lo stesso a metterci le mani, fai pure... noi ti abbiamo avvertito!
Schema di massima
--------------------
Questo repository git viene automaticamente "sincronizzato" (continous deployment) e il risultato va a finire
su https://hackmeeting.org/hackit25/
Per fare modifiche al sito:
- fatti un account personale su git.lattuga.net
- fai una modifica al sito
- apri una pull request
- quando la pull request viene approvata, e il tutto finisce in "master", la modifica è online
HowTo
-------
So you want to contribute, nice! You'll need a UNIX (Linux, BSD...) system and some proficiency with the terminal and with
[Git-based workflows](https://git-scm.com/book/en/v2).
### Setup your development environment
Clona questo repository sul tuo computer
Installa mkvirtualenv (`apt install virtualenvwrapper`, su sistemi Debian-based)
```
mkvirtualenv -p `which python3` hackmeeting-website
pip install -r requirements.txt
make all serve
firefox http://localhost:8000/
```
Also, `make help` is your friend.
For debug, `make DEBUG=1`
### Change content
Most content is in `content/pages/`. Just go there, find the relevant file, change it.
Now, `make all serve`, see the result in your browser
repeat until you like it
### Commit and push
usual git workflow
Griglia dei seminari
----------------------
I talk compaiono in questo repository come cartelle all'interno della cartella `talks/`. Tuttavia, la cosa
corretta da fare **NON** è modificare i contenuti direttamente lì, ma modificare un calendario nextcloud da cui
queste informazioni provengono.
Infatti il calendario viene gestito dalla commissione griglia: [coordinati con
loro](https://hackmeeting.org/hackit24/contact.html) se vuoi toccare questa parte del sito.
Altre modifiche al sito
-------------------------
Il sito è un'istanza di [pelican](https://docs.getpelican.com/en/latest/), più alcuni plugin custom:
- `langmenu`, per avere un menu che punta alle versioni localizzate della pagina
- `talks`, per gestire i talk in modo "speciale" per hackmeeting
Puoi quindi riferirti alla documentazione di pelican per fare delle prove e capire come modificare il sito.

0
content/images/.keepme Normal file
View file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

BIN
content/images/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View file

@ -0,0 +1,65 @@
Title: Accessibilità
slug: accessibility
navbar_sort: 2
Hackmeeting è uno spazio e una comunità autogestita: tutto quello che
troverai è autocostruito con povertà di mezzi, generalmente recuperando
strutture abbandonate e riadeguandole il più possibile ai nostri bisogni.
Abbiamo cercato di rendere Hackmeeting più accessibile che potevamo, ma
ci sono sicuramente ancora tante cose che non ci sono riuscite e altre
che dovremmo migliorare. Abbi pazienza e aiutaci segnalandoci cosa non
va, in modo da fare meglio il prossimo anno!
## Lo spazio
Hackit {{ hm.year }} si svolgerà al {{ hm.location.name }} a {{ hm.location.city }}
Il Magazzino47 è dislocato interamente al piano terra, tutte le aree sono accessibili anche tramite delle apposite rampe, il cortile è dotato di passaggio in asfalto per facilitare il passaggio per persone a mobilità ridotta.
## Aule seminari
Saranno allestiti 3 spazi seminari + un'eventuale spazio laboratorio (ma un po' piccolo)
## Dormire
Gli spazi tende e dormitorio sono senza gradini e raggiungibili tramite apposite rampe.
Il tendone può ospitare all'incirca 80-100 persone munite di materassino, stuoia o brandina. Il tendone non può ospitare tende. Non ci sono letti a disposizione o stanze singole.
Lo spazio esterno è molto risicato e può ospitare all'incirca 20 tende o poco più. Si invita chi ne ha la possibilità a trovare sistemazioni esterne allo spazio.
Sarà disponibile uno spazio tende esterno all'evento raggiungibile a 15 min di auto.
## Bagni
Sono presenti tre turche e 1 bagno con doccia per persone a mobilità ridotta. Verranno allestite delle doccie esterne.
## Modalità aereo
C'è una piccola saletta che va sistemata (è il backstage artisti) ed è utilizzabile come sala modalità aereo.
## Clima
A giugno il clima è abbastanza variabile, si può passare da giornate di pioggia a giornate molto calde. Uno spazio seminario è al chiuso gli altri sono esterni ma comunque coperti da tendone o tettoia.
## Linguaggi
Non siamo ancora in grado di garantire un servizio di traduzioni in
simultanea, ma Hackmeeting è frequentato da persone che parlano diverse
lingue, compresa la LIS. Se hai bisogno, o se vuoi offrirti per
tradurre, rivolgiti all'info point.
## Cani da assistenza
Se hai un cane che ti accompagna è il benvenuto. Troverà acqua e
probabilmente altri cani con cui giocare. Se quest'ultima cosa dovesse
essere un problema segnalacelo all'info point all'ingresso e cercheremo
di limitare l'eventuale invadenza degli altri cani.
## Altre info
Nello spazio saranno presenti un po' ovunque prese per ricaricare
qualunque dispositivo.
La musica ad alto volume sarà presente in modo continuativo solo venerdì
sera e in un luogo lontano dagli altri spazi comuni.
Per qualsiasi altra informazione o necessità che non stiamo
considerando, puoi rivolgerti all'info point all'ingresso.
Torna alla pagina delle [informazioni principali]({filename}info.md)

51
content/pages/call.en.md Normal file
View file

@ -0,0 +1,51 @@
Title: Call for contents
slug: call
navbar_sort: 4
lang: en
Hackmeeting is the yearly meeting of the Italian countercultures related to
hacking, communities which have a critical relationship with technology.
Our idea of hacking touches every aspect of our lives and it doesn't stop at
the digital realm: we believe in the use of knowledge and technology to
understand, modify and re-create what is around us.
It's not a vague idea, generic guidelines or aspiration, it's a pragmatic
organization effort based on solidarity, complicity and sharing of knowledge,
methods and tools to take back everything and take it back together, one piece
at a time.
Hackmeeting will be held in {{hm.location.city}} from Friday 14 June to Sunday 16 June at {{hm.location.name}}
If you think you can enrich the event with a contribution, send your proposal
joining the [hackmeeting mailing list](https://www.autistici.org/mailman/listinfo/hackmeeting) with subject `[talk] title` or `[lab]
lab_title` and this info:
* Length (multiple of 30 minutes, max 2 hours)
* (optional) day/time of the day requirements
* Abstract, optional links and references
* Nickname
* Language
* Projector
* Can we record you? (audio only)
* Anything else you might need
#### More concretely
We will set up three outdoor locations (indoor in case of
rain), with microphone/speakers and projector.
If you think your presentation will not need this much time, you can propose
something directly at hackmeeting: a `ten minute talk` of a maximum of 10
minutes.
These talks will be held in the largest available space at the end of of the
day on Saturday. There will be someone who will warn you if you are about to
exceed the allocated time.
If you want to share your discoveries or curiosities in an even more informal
and chaotic way, you will be able to to get a place with your hardware on the
shared tables in the `LAN space`. You will find morbid curiosity, power and
wired connection (bring a power strip, network cables and whatever you might
find useful).
Have any questions or you are shy? Write us at [infohackit@tracciabi.li](mailto:infohackit@tracciabi.li)

36
content/pages/call.md Normal file
View file

@ -0,0 +1,36 @@
Title: Call for contents
slug: call
navbar_sort: 4
lang: it
Hackmeeting è lincontro annuale delle controculture digitali legate allhacking e hacktivismo, rivolto a tutte le comunità e persone che vivono in maniera critica il rapporto con la tecnologia, i mass-media, i social e ogni aspetto della vita imposta.
Hackmeeting investe ogni ambito delle nostre vite e non si limita al digitale: crediamo nella diffusione del sapere e della tecnologia per conoscere, modificare e ricreare quanto ci sta attorno. Crediamo fortemente nelle pratiche di autogestione e DIY. Crediamo che la tecnologia debba rispettare le nostre volontà e non le logiche del profitto.
Hackmeeting non è un idea vaga, una generica linea guida o aspirazione. E' una reale capacità organizzativa basata sulla solidarietà, sull'inclusività e sulla condivisione delle conoscenze e degli strumenti per riprenderci tutto e riprendercelo insieme.
Hackmeeting è il contributo di ogni singola persona, non ci sono partecipantɜ ma solo organizzatorɜ.
Hackmeeting questanno si svolgerà a {{hm.location.city}} da venerdì 14 giugno a domenica 16 giugno presso il {{hm.location.name}}.
Se pensi di poter arricchire levento con un tuo contributo:
iscriviti alla mailing list di Hackmeeting <https://www.autistici.org/mailman/listinfo/hackmeeting>
Manda una mail a hackmeeting@inventati.org con:
- oggetto [Talk e titolo del talk oppure Laboratorio e titolo del laboratorio]
- durata [un multiplo di 30 minuti per un massimo di due ore]
- eventuali esigenze di giorno/ora
- breve spiegazione, eventuali link e/o riferimenti utili
- Nickname
- lingua
- necessità di proiettore e/o particolari tecnologie
- eventuale disponibilità a farti registrare [solo audio]
- altre necessità o particolari indicazioni.
Allestiremo spazi allaperto (al coperto in caso di pioggia) muniti di amplificazione e proiettore.
Se pensi che la tua presentazione non abbia bisogno di tempi così lunghi, puoi proporre direttamente ad Hackmeeting un Ten Minute Talk dalla durata di massimo 10 minuti. Questi talk si terranno al termine delle giornate di venerdì e sabato durante la sera.
Se invece vuoi condividere le tue scoperte e curiosità in modo ancora più informale e caotico, potrai sistemarti sui tavoli collettivi dell'area LAN Space. Troverai curiosità, corrente alternata e rete via cavo. Ricordati di portare una presa multipla, un cavo di rete e quel che vorresti trovare e che ti serve.
Hai una domanda? Scrivi a [infohackit@tracciabi.li](mailto:infohackit@tracciabi.li)

View file

@ -0,0 +1,26 @@
Title: How to get there
slug: come-arrivare
lang: en
Hackit {{hm.year}} will be held at [{{hm.location.name}}]({{hm.location.website}}) - [{{hm.location.address}}, {{hm.location.city}}](https://www.openstreetmap.org/#map=16/{{hm.location.geo.lat}}/{{hm.location.geo.lon}})
<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://www.openstreetmap.org/export/embed.html?bbox={{hm.osm.bbox}}&amp;layer=mapnik&amp;marker={{hm.location.geo.lat}}%2C{{hm.location.geo.lon}}" style="border: 1px solid black"></iframe><br/><small><a href="https://www.openstreetmap.org/?mlat={{hm.location.geo.lat}}&amp;mlon={{hm.location.geo.lon}}#map=18/{{hm.location.geo.lat}}/{{hm.location.geo.lon}}" target="_blank">View Map</a></small>
Hackmeeting it's easy to reach. If you get lost just search for Brescia's monumental cemetery that's next to Magazzino 47.
## By train or autobus
Hackmeeting is 20 minutes walking from the train and the autobus stations.
Out of the train station is possible to take the autobus number 3 direction **Mandolossa** and the number 9 direction **Violino** that stops in via Milano, just after the cemetery.
## By car
Hackmeeting it's easy to reach from highway A4, exit Brescia Ovest.
Around the space it's possible to park for free, also for camper and vans.
## By Airplane
The closest airport is Milano Bergamo (BGY), 40km from Brescia. There are fast autobus linking the airport with Brescia train station in about 1 hour, the price for the ticket is 12€.
Another option to reach Brescia is to take an urban bus to Bergamo (3€) and then the train (5.20€) but it'll take 30 minutes more.

View file

@ -0,0 +1,31 @@
Title: Come arrivare
slug: come-arrivare
navbar_sort: 2
lang: it
Hackit {{hm.year}} si svolgerà al [{{hm.location.name}}]({{hm.location.website}}), in [{{hm.location.address}}, {{hm.location.city}}](https://www.openstreetmap.org/#map=16/{{hm.location.geo.lat}}/{{hm.location.geo.lon}})
<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://www.openstreetmap.org/export/embed.html?bbox={{hm.osm.bbox}}&amp;layer=mapnik&amp;marker={{hm.location.geo.lat}}%2C{{hm.location.geo.lon}}" style="border: 1px solid black"></iframe><br/><small><a href="https://www.openstreetmap.org/?mlat={{hm.location.geo.lat}}&amp;mlon={{hm.location.geo.lon}}#map=18/{{hm.location.geo.lat}}/{{hm.location.geo.lon}}" target="_blank">Visualizza Mappa</a></small>
Il centro sociale è facilmente raggiungibile. Se vi disorientate cercate il cimitero monumentale di Brescia che è a fianco del Magazzino 47.
## Con i piedi
Saprai come fare, ne siamo certi. Da dove parti parti.
## Con il treno e l'autobus
Lo spazio dista circa 20 min a piedi dalla stazione dei treni e dei bus di Brescia.
Fuori dalla stazione dei treni è possibile prendere l'autobus numero 3 direzione Mandolossa e il 9 in direzione Violino con fermata in via Milano subito dopo il cimitero.
## Con veicoli a motore
Il Magazzino 47 è facilmente raggiungibile dall'autostrada A4, uscita Brescia Ovest.
Intorno allo spazio sono presenti diversi parcheggi gratuiti con possibilità di posteggiare camper e furgoni in diverse aree e vie adiacenti anche se siamo in città.
## Con l'aereo
L'aeroporto più servito e più vicino è quello di Milano Bergamo (BGY), distante circa 40km da Brescia.
Sono disponibili autobus autostradali che collegano l'aeroporto con la stazione di Brescia in circa un'ora al costo di 12€.
Per raggiungere Brescia, è anche possibile passare prima per Bergamo con gli autobus urbani (3€) e poi prendere il treno (5.20€), ma i tempi si allungano di altri trenta minuti.

View file

@ -0,0 +1,17 @@
Contact
###########
:slug: contact
:navbar_sort: 6
:lang: en
**Mailing List**
There is a `mailing list <https://www.autistici.org/mailman/listinfo/hackmeeting>`_ where you can ask for info and follow the discussions about the meeting. It is mostly in italian but feel free to ask questions in english.
**IRC**
There is also an IRC (Internet Relay Chat) channel where discuss and chat with other participants: connect to server ``irc.autistici.org`` and join channel ``#hackit99`` (again, it will be mostly in italian, but english speakers are welcome).
If you prefer XMPP/Jabber, you can reach the same channel as room ``#hackit99@mufhd0.esiliati.org`` (please
include the hash)

View file

@ -0,0 +1,22 @@
Contatti
###########
:slug: contact
:navbar_sort: 6
:lang: it
**Mailing List**
La comunità Hackmeeting ha una `lista di discussione <https://www.autistici.org/mailman/listinfo/hackmeeting>`_ dove poter chiedere informazioni e seguire le attività della comunità. La lista ha un `archivio pubblico <http://lists.autistici.org/list/hackmeeting.html>`_, quindi puoi leggerla anche senza iscriverti. L'iscrizione è invece necessaria per scrivere.
**IRC**
Esiste anche un canale IRC (Internet Relay Chat) dove poter discutere e chiacchierare con tutti i membri della comunità: collegati al server ``irc.autistici.org`` ed entra nel canale ``#hackit99``.
Se preferisci XMPP/Jabber, puoi raggiungere lo stesso canale come ``#hackit99@mufhd0.esiliati.org`` (includi il cancelletto).
Sito
---------
Se vuoi modificare il sito, vedi le info su https://0xacab.org/hackit/sito-hackit-{{hm.year - 2000}}#user-content-hackmeeting-{{hm.year}}

View file

@ -0,0 +1,30 @@
About
#####
:navbar_sort: 1
:lang: en
:slug: index
.. raw:: html
<div class='twelve columns'>
<div class='six columns'>
<img src='{static}/images/locandina24_color2_web.jpg'>
</div>
<div class='five columns offset-by-one'>
<h3><br/><br/><br/>
{{ hm.when }}<br/>
{{ hm.location.name }}<br> {{ hm.location.city }}
</h3><br/><br/><br/>
<!-- <h5><a href="{filename}/pages/info.md">Informazioni ospitalità</h5></p> -->
</div>
</div>
Hackmeeting is the yearly Italian digital counter-cultures meeting; it gathers those communities that take a hard look at how technologies work in our society. And that's not all. We tell you, just you, in a whisper (don't even tell anybody!): Hack-it is just for real hackers, that is to say for those people who want to manage their own lives as they want and are ready to fight for this right, even though they haven't ever seen a computer in their life.
Three days of lessons, games, parties, debates, crossfires and collective learning, analyzing together those technologies that we use everyday, the way they change and how they can impact on our real or virtual lives; which role we can play in order to redirect these changes and set us free of control from those who want to monopolize their development, letting society crumble and relegating us in even tighter virtual spaces.
**The event is totally self-managed: there are neither promoters nor users, just participants.**

View file

@ -0,0 +1,28 @@
About
###################
:slug: index
:navbar_sort: 1
:lang: es
.. raw:: html
<div class='twelve columns'>
<div class='six columns'>
<img src='{static}/images/locandina24_color2_web.jpg'>
</div>
<div class='five columns offset-by-one'>
<h3><br/><br/><br/>
{{ hm.when }}<br/>
{{ hm.location.name }}<br>{{ hm.location.city }}
</h3><br/><br/><br/>
<!-- <h5><a href="{filename}/pages/info.md">Informazioni ospitalità</h5></p> -->
</div>
</div>
Hackmeeting es el encuentro anual de las contraculturas digitales italianas, de aquellas comunidades que analizan de manera crítica los mecanismos de desarollo de las tecnologías en nuestra sociedad. Pero hackmeeting no es sólo esto, es mucho más. Te lo contamos al oído, no se lo digas a nadie, el hackmeeting es solamente para verdaderos hackers, para quienes quieran gestionarse la vida como quieran y luchan por eso, aunque no hayan visto un ordenador en su vida.
Tres días de charlas, juegos, fiestas, debates, intercambios de ideas y aprendizaje colectivo, para analizar juntxs las tecnologías que usamos todos los días, cómo cambian y cómo pueden impactar en nuestras vidas, tanto reales como virtuales. Un encuentro para indagar qué papel podemos jugar en este cambio y liberarnos del control de aquellos que quieren monopolizar su desarrollo, rompiendo nuestras estructuras sociales y relegándonos a espacios virtuales cada vez más limitados.
**El evento es totalmente autogestionado: no hay ni organizador@s ni asistentes, solamente participantes!**

38
content/pages/index.fr.md Normal file
View file

@ -0,0 +1,38 @@
Title: About
Date: 2016-04-17
Slug: index
navbar_sort: 1
lang: fr
<div class='twelve columns'>
<div class='six columns'>
<img src='{static}/images/locandina24_color2_web.jpg'>
</div>
<div class='five columns offset-by-one'>
<h3><br/><br/><br/>
{{ hm.when }}<br/>
{{ hm.location.name }}<br> {{ hm.location.city }}
</h3><br/><br/><br/>
<!-- <h5><a href="{filename}/pages/info.md">Informazioni ospitalità</h5></p> -->
</div>
</div>
*Hackmeeting* est la rencontre annuel des cultures numériques alternatives
italiennes, des communautés qui agissent de façon critique face aux mécanismes
de développement des technologies dans notre société. Mais c'est pas seulement
ça: on y trouve bien plus. On te le chuchote à l'oreille, ne le dis à personne:
hackit est seulement pour les vrais hackers, c'est à dire pour ceux/celles qui
veulent conduire leur vie comme ils/elles préfèrent, et qui savent comment se
battre pour accomplir leur objectif; même s'ils/elles n'ont jamais vu un ordi.
Trois jours entre talk techniques, jeux, fêtes, débats, discussions et
apprentissage collectif, tout ça pour étudier tous ensemble les technologies
qu'on utilise tous les jours, leur développement et les changements qu'elles
provoquent dans le réel et le virtuel des nos vies; pour comprendre quel soit
le rôle qu'on puisse jouer pour adresser ces changement vers la libération à
las fois des technologies elles-mêmes et des nos vies.
**L'événement est complètement autogéré: il n'y a que des participants, pas
d'organisateurs, pas d'entrepreneurs.**

23
content/pages/index.md Normal file
View file

@ -0,0 +1,23 @@
Title: About
Slug: index
navbar_sort: 1
lang: it
<div class='twelve columns'>
<div class='six columns'>
<img src='{static}/images/locandina24_color2_web.jpg'>
</div>
<div class='five columns offset-by-one'>
<h3><br/><br/><br/>
{{ hm.when }}<br/>
{{ hm.location.name }} <br>{{ hm.location.city }}
</h3><br/><br/><br/>
<h5><a href="{filename}/pages/info.md">Informazioni ospitalità</h5></p>
</div>
</div>
L'*hackmeeting* è l'[incontro]({filename}/pages/info.md) annuale delle controculture digitali italiane, di quelle comunità che si pongono in maniera critica rispetto ai meccanismi di sviluppo delle tecnologie all'interno della nostra società. Ma non solo, molto di più. Lo sussuriamo nel tuo orecchio e soltanto nel tuo, non devi dirlo a nessuno: l'hackit è solo per hackers, ovvero per chi vuole gestirsi la vita come preferisce e sa s/battersi per farlo. Anche se non ha mai visto un computer in vita sua.
Tre giorni di [seminari, giochi, dibattiti]({filename}/pages/programma.rst), scambi di idee e apprendimento collettivo, per analizzare assieme le tecnologie che utilizziamo quotidianamente, come cambiano e che stravolgimenti inducono sulle nostre vite reali e virtuali, quale ruolo possiamo rivestire nell'indirizzare questo cambiamento per liberarlo dal controllo di chi vuole monopolizzarne lo sviluppo, sgretolando i tessuti sociali e relegandoci in spazi virtuali sempre più stretti.
**L'evento è totalmente autogestito: non esiste chi organizza o fruisce, esiste solo chi partecipa.**

View file

@ -0,0 +1,27 @@
About
###################
:slug: index
:navbar_sort: 1
:lang: pt
.. raw:: html
<div class='twelve columns'>
<div class='six columns'>
<img src='{static}/images/locandina24_color2_web.jpg'>
</div>
<div class='five columns offset-by-one'>
<h3><br/><br/><br/>
{{ hm.when }}<br/>
{{ hm.location.name }}, {{ hm.location.city }}
</h3><br/><br/><br/>
<!-- <h5><a href="{filename}/pages/info.md">Informazioni ospitalità</h5></p> -->
</div>
</div>
Hackmeeting é o encontro anual das contro-culturas digitais italianas, quer dizer daquelas comunidades que se colocam criticamente ao respeito dos mecanismos de desenvolvimento das tecnologías nas nossas sociedades. Mais não simplesmente isso, é muito mais. A gente sussurra no seu ouvido e só no seu, você não precisa contar para ninguém: o hackit é só para hackers de verdade, ou seja, para quem quer administrar sua vida como prefere e sabe comprometer-se a lutar por isso. Mesmo que nunca tenha visto um computador na sua vida.
Três dias de seminários, jogos, debates, trocas de ideias e aprendizagem coletivo, para analisarmos juntos as tecnologías que usamos todos os dias, como elas mudam e quais profundas mudanças induzem em nossas vidas reais e virtuais, que papel podemos desempenhar no direcionamento dessas mudanças para libertá-las do controle daqueles que querem monopolizar seu desenvolvimento, desintegrando o tecido social e nos relegando a espaços virtuais cada vez mais estreitos.
O evento é totalmente autogerido: não há organizador@s e usuári@s, só participantes.

112
content/pages/info.en.md Normal file
View file

@ -0,0 +1,112 @@
Title: Info
slug: info
navbar_sort: 1
lang: en
#### Where
{{hm.location.name}}, {{hm.location.address}}, {{hm.location.city}}, Italia
[Here is how to arrive]({filename}/pages/come_arrivare.en.md)
#### When
From Friday 14 June to Sunday 16 June 2024
#### Sleeping
TBD_EN
#### Map
TBD
##### Can I arrive before Friday 14?
TBD_EN
##### Can I stay even beyond Sunday 16?
TBD_EN
#### Eating
TBD_EN
#### Who is organizing?
Hackmeeting is a yearly meeting of a community that communicates
through
[a mailing list](https://www.autistici.org/mailman/listinfo/hackmeeting). There
is no distinction between organizers and users. Everyone can subscribe
and partecipate in the organization by visiting the site
[it.hackmeeting.org](https://it.hackmeeting.org) and entering the community.
#### What is an hacker?
Hackers are curious people, always eager to discover how things are
done. Whether it is technology or not, hackers reclaim freedom to
experiment, disassemble and reassemble things or concepts, to
understand how are they made, to improve them, and then to share how
to do it again. Hackers solve problems and build things, believing in
freedom and sharing. They do not like closed systems. Hackers' forma
mentis is not restricted to the field of software hacking: there are
people that keep the hacker mentality in every existing field, driven
by their creative impulse.
#### Who holds the talks?
Whoever wants to. If someone wants to propose a talk, they just has to
propose it on the mailing list. If the proposal is well received, it
gets on calendar. If there are some problems, the community will be
happy to help improve the proposal.
### Whats in there, besides talks?
There is a LAN space, as to say an area dedicated to the net: everyone
can plug their laptop, forming a network with the other participants. In
general, this is the right place to meet other attendees, to ask for
help in installing Linux, to solve a doubt, or just to have a chat.
Hackmeeting is an open-air festival, a meeting, an hacking party, a
moment of consideration, an occasion to learn something together, an act
of rebellion, an exhange of ideas, experiences, dreams, utopias.
#### How much does it cost?
Traditionally, entrance in Hackmeeting is totally free: always keep in
mind that organizing the event has a cost. Expenses are sustained
through voluntary contributions, selling shirts and other gadgets and
sometimes through the earnings of the bar.
Please donate whatever you can, every small donation counts.
#### What shall I bring?
If you want to bring a computer, take a power
strip too. Do not forget networking hardware (like Ethernet cables,
switches, WiFi access points). Remember to bring the hardware that
you will want to hack in company. We will try to get some internet
connection for everybody to share, but we can't really guarantee anything.
If you think that you need it, bring a 3G/4G stick with you
and the necessary to share it with friends! Try to be as independent
as possible regarding your hardware.
#### May I take photos, make videos, post, tag, share, upload?
We think that the freedom to choose the dimensions of ones own private
sphere and public profile must be guaranteed to every participant: in
this spirit, photos and/or videos are admitted only if explicitly
authorized by every person that appears in the media. Nobody should be
photographed without knowing.
Many people at Hackmeeting really care about their privacy, please ask
before taking a picture.
#### How are people expected to behave?
Hackmeeting is a self-managed space, a temporary independent space and
whoever passes through is expected to behave according to the principles
of antisexism, antiracism and antifascism. If you are victim or witness
of an act of oppression, aggression, brute force, port scan, ping flood
and other non-consensual DOS and you do not know how to react, always
count on the communitys support and do not hesitate to attract
attention and ask for help.

128
content/pages/info.md Normal file
View file

@ -0,0 +1,128 @@
Title: Info
slug: info
navbar_sort: 1
#### Dove
{{hm.location.name}}, {{hm.location.address}}, {{hm.location.city}}, Italia
[Qui trovi tutte le informazioni su come arrivare]({filename}/pages/come_arrivare.md)
#### Quando
Da Venerdì 14 Giugno a Domenica 16 Giugno 2024
#### Dormire
All'interno dello spazio l'area tendone è stata adibita a spazio dormitorio (al coperto), all'interno del tendone sarà possibile pernottare con brandine, stuoie e materassini (niente tende). La disponibilità del tendone è di circa 100 posti letto.
Nelle poche aree verdi del centro sociale sarà possibile campeggiare per un max di 20 tende piccole.
Vista la scarsa capienza del magazzino47 per il pernottamento chiediamo a chi ne ha le possibilità di trovare una sistemazione alternativa nelle vicinanze (ostello, b&b, appartementi, amici e parenti).
Per chi comunque volesse dormire nello spazio si consiglia di munirsi di:
- tappetino,stuoia, materassino (suolo in cemento)
- tappi per le orecchie (lo spazio è piccolo ed è facile essere disturbati)
- antizanzare
- brandine e maschere per dormire (per i più attrezzati)
Sarà possibile campeggiare in uno spazio diverso dal Magazzino47 per chi non dovesse trovare una sistemazione all'interno del centro sociale e per chi non ha la possibilità di una sistemazione alternativa indipendente. Il luogo individuato si trova a 15min di macchina dal Magazzino47 in località: LAGO PONTE MELLA.
Ricordiamo che è un prato rencintato con possibilità di campeggio (non c'è sorveglianza): munirsi di antizanzare - INDISPENSABILE, tappi per orecchie, mascherine oscuranti (pochi alberi presenti), frontalino/luci e tutto il necessario per pernottare. In loco è presente solamente 1 bagno e no doccia. Non sono presenti prese per l'elettricità.
#### Mappa
[Clicca qui per aprire la mappa]({static}/images/map.png)
#### Posso arrivare prima di Venerdì 14?
E' possibile arrivare ad hackmeeting anche nei giorni precedenti all'evento per dare una mano. Per chi ha intenzione di arrivare durante la settimana può segnarsi sul seguente pad: <https://pad.cisti.org/p/hackit0x1b-arrivi>
#### Posso rimanere anche oltre Domenica 16?
E' possibile rimanere fino a lunedì all'interno degli spazi del Magazzino47.
#### Mangiare
Saranno garantite anche colazioni/pranzi/cene a un prezzo popolare.
La cucina sarà vegana, con alternative celiache se avete delle necessità particolari (allergie o altro) segnalatecelo.
#### Lavarsi
C'è una doccia nel bagno per mobilità ridotta e verranno allestite delle doccie esterne. Lavatevi poco che fa male.
#### Hackmeeting è accessibile?
Speriamo di sì! Trovi tutte le informazioni nella [pagina dedicata
all'accessibilità]({filename}accessibilita.md)
#### Chi organizza l'hackmeeting?
Lhackmeeting è un momento annuale di incontro di una comunità che si riunisce
intorno a [una mailing list](https://www.autistici.org/mailman/listinfo/hackmeeting).
Non esistono chi organizza e chi fruisce. Tutte le persone possono iscriversi e partecipare
allorganizzazione dell'evento, semplicemente visitando il sito [hackmeeting.org](https://hackmeeting.org) ed entrando nella comunità.
#### Chi è un@ hacker?
Le persone cosiddette hacker sono persone curiose, che non accettano di non poter mettere le mani
sulle cose. Che si tratti di tecnologia o meno chi è hackers reclama la libertà
di sperimentare. Smontare tutto, e per poi rifarlo o semplicemente capire come
funziona. Sono persone che risolvono problemi e costruiscono le cose, credono nella
libertà e nella condivisione. Non amano i sistemi chiusi. La forma mentis
di chi è hacker non è ristretta allambito del software-hacking: ci sono persone
che mantengono un attitudine all'hacking in ogni campo dellesistente, sono persone curiose spinte
da un istinto creativo.
#### Chi tiene i seminari?
Chi ne ha voglia. Se qualche persona vuole proporre un seminario, non deve fare altro
che proporlo in lista. Se la proposta piace, si calendarizza. Se non piace, si
danno utili consigli per farla piacere.
#### Ma cosa si fa, a parte seguire i seminari?
Esiste un “LAN-space”, vale a dire unarea dedicata alla rete: ogni persona arriva
col proprio portatile e si può mettere in rete con altre persone. In genere in
questa zona è facile conoscere altre creature curiose, magari disponibili per farsi aiutare a
installare Linux, per risolvere un dubbio, o anche solo per scambiare quattro
chiacchiere. Lhackmeeting è un open-air festival, un meeting, un hacking
party, un momento di riflessione, unoccasione di apprendimento collettivo, un
atto di ribellione, uno scambio di idee, esperienze, sogni, utopie.
#### Quanto costa lingresso?
Come ogni anno, lingresso allHackmeeting è del tutto libero; ricordati però
che organizzare lHackmeeting ha un costo. Le spese sono sostenute grazie ai
contributi volontari, alla vendita di magliette e altri gadget e in alcuni casi
allintroito del bar e della cucina.
#### Cosa devo portare?
Se hai intenzione di utilizzare un computer, portalo accompagnato da una
ciabatta elettrica. Non dimenticare una periferica di rete di qualche tipo
(cavi ethernet, switch, access point). Ricordati inoltre di portare tutto
lhardware su cui vorrai smanettare con gli altri. Durante levento la
connessione internet sarà limitata quindi, se vuoi avere la certezza
organizzati portando il necessario per te e per chi ne avra' bisogno.
In generale ogni persona organizza e partecipa cercando di essere autosufficiente
sul lato tecnologico portandosi l'hardware o costruendoselo al hackmeeting!
#### Posso scattare foto, girare video, postare, taggare, condividere, uploadare?
Pensiamo che ad ogni partecipante debba essere garantita la libertà di
scegliere in autonomia lampiezza della propria sfera privata e dei propri
profili pubblici; per questo allinterno di hackmeeting sono ammessi fotografie
o video SOLO SE CHIARAMENTE SEGNALATI E PRECEDENTEMENTE AUTORIZZATI da tutte e
tutti quanti vi compaiano.
Le persone che attraversano hackmeeting hanno particolarmente a cuore il concetto di privacy: prima di fare
una foto, esplicitalo!
#### Come ci si aspetta che si comportino tutte e tutti?
Hackmeeting è uno spazio autogestito, una zona temporaneamente autonoma e chi
ci transita è responsabile che le giornate di hackit si svolgano nel rispetto
dellantisessismo, antirazzismo e antifascimo. Se subisci o assisti a episodi
di oppressione, aggressione, brute force, port scan, ping flood e altri DoS non
consensuali e non sai come reagire o mitigare lattacco, conta sul sostegno di
tutta la comunità e non esitare a richiamare pubblicamente lattenzione e
chiedere aiuto.

View file

@ -0,0 +1,42 @@
Schedule
===========
:slug: schedule
:navbar_sort: 3
:lang: en
.. `Add the schedule <schedule.ics>`_ |ics| as a calendar
.. |ics| image:: {attach}/images/ics.png
:height: 2em
:target: webcals://it.hackmeeting.org/schedule.ics
To track the schedule, you might want to:
* `add it to Android <https://ggt.gaa.st/#url=https://it.hackmeeting.org/schedule.ics>`_
* `add it to your desktop calendar <webcals://it.hackmeeting.org/schedule.ics>`_ (ie: Thunderbird)
* `raw URL <https://it.hackmeeting.org/schedule.ics>`_
The schedule is still work in progress: a large part of hackmeeting
contents are scheduled last-minute! We will **stop** updating this page on Thursday, 23:00. From that time,
the only authoritative source will be the paper-made schedule in the LAN space.
Read the `call for contents <{filename}call.en.md>`_ and propose yours in `mailing list <{filename}contatti.rst>`_.
Contents in a language other than Italian are not only accepted, but
appreciated!
Hackmeeting (still) hasn't a proper translation system, but you can
find a bunch of people to ask to do translations when you need it.
.. raw:: html
To see the map, <a href="{static}/images/mappa_hm23.png" target="_blank" rel="noopener noreferrer">click here</a>
.. talkgrid::
:lang: en
.. talklist::
:lang: en

View file

@ -0,0 +1,34 @@
Programma
===========
:slug: schedule
:navbar_sort: 3
:lang: it
..
Gli audio dell'hackmeeting sono disponibili `qui
<https://archive.org/search.php?query=creator%3A%28radiowombatfirenze%29%20AND%20subject%3A%28hackmeeting%202019%29>`_.
Per seguire il calendario con più comodità:
* `aggiungilo ad android <https://ggt.gaa.st/#url=https://it.hackmeeting.org/schedule.ics>`_
* `aggiungilo al tuo calendario desktop <webcals://it.hackmeeting.org/schedule.ics>`_ (ad esempio Thunderbird)
* `URL grezzo <https://it.hackmeeting.org/schedule.ics>`_
Il programma è soggetto a variazioni continue: vieni ad hackmeeting e vivitelo! In particolare, questa pagina **non** verrà più aggiornata con regolarità a partire da giovedì alle 23. Da quel momento, vale solo il tabellone di carta che si trova nel LAN space.
Fatti coraggio, `rispondi alla call for contents <{filename}call.md>`_, proponi il tuo contenuto in `mailing list <{filename}contatti.rst>`_: crea un nuovo thread
dedicato alla tua proposta. Nel subject inserisci ``[TALK]``
(ad esempio ``[TALK] come sbucciare le mele con un cluster di GPU``) così che sia facile ritrovarlo per chi è
interessato.
.. raw:: html
Per consultare la mappa, <a href="{static}/images/map.png" target="_blank" rel="noopener noreferrer">clicca qui</a>
.. talkgrid::
:lang: it
.. talklist::
:lang: it

130
content/pages/propaganda.md Normal file
View file

@ -0,0 +1,130 @@
Title: Propaganda
slug: propaganda
lang: it
navbar_sort: 10
#### Logo Hackmeeting
<img src='{static}/theme/images/logoHM24_color2_sito.png' width='350px' />
[download png color alta risoluzione]({static}/images/logo_color2_hires.png) -
[download png color web]({static}/theme/images/logoHM24_color2_sito.png)
<img src='{static}/theme/images/logoHM24_sito.png' width='350px' />
[download jpg n/n alta risoluzione]({static}/images/logo_hires.jpg) -
[download png b/n web]({static}/theme/images/logoHM24_sito.png)
#### Locandine
Realizzate da ouch_bruh e judaskisss
<img alt='locandina color web' src='{static}/images/locandina24_color2_web.jpg' width='400px'/>
[download color png da stampare]({static}/images/locandina24_color2_stampa.png) -
[download color jpg web]({static}/images/locandina24_color2_web.jpg)
<img alt='locandina web' src='{static}/images/locandina24_web.jpg' width='400px'/>
[download b/n jpg da stampare]({static}/images/locandina24_stampa.jpg) -
[download b/n jpg web]({static}/images/locandina24_web.jpg)
<!--
#### Flyer
<img alt='flyer web' src='{static}/images/flyer_hm2023_web.png' width='400px'/>
[download pdf]({static}/images/flyer_hm2023.pdf) -
[download png]({static}/images/flyer_hm2023_web.png)
##### Sticker & postcard
[download sticker pdf]({static}/images/stickerHM_date.pdf) -
[download postcard pdf]({static}/images/cartolinaHM.pdf)
### Spot radio
Ecco alcuni spot che è possibile mandare in radio:
##### Forum version
<audio controls >
<source src="{static}/images/hackit-forum.ogg" type="audio/ogg" />
</audio> [download]({static}/images/hackit-forum.ogg)
##### Tearz version
<audio controls >
<source src="{static}/images/hackit-tearz.ogg" type="audio/ogg" />
</audio> [download]({static}/images/hackit-tearz.ogg)
##### Conquista di mondo version
<audio controls >
<source src="{static}/images/hackit-conquista-mondo.ogg" type="audio/ogg" />
</audio> [download]({static}/images/hackit-conquista-mondo.ogg)
-->
<!--
In questa pagina trovate alcuni materiali utili per diffondere il verbo di hackmeeting in ogni dove.
## Grafiche
### Logo
[Logo (nero su trasparente)]({static}/images/logo-hm-trasp.png)
[Grafica maya completa (nero su bianco)](https://hackmeeting.org/media/hackit20/grafica-maya-nerosubianco.jpg)
[Grafica maya completa (bianco su nero)](https://hackmeeting.org/media/hackit20/grafica-maya-biancosunero.jpg)
### Locandina
[Versione stampabile A3 in PDF](https://hackmeeting.org/media/hackit20/hm2020-locandina-print.pdf)
### Flier
[Flier in PDF](https://hackmeeting.org/media/hackit20/flier-print.pdf) vanno stampati fronte retro e poi
tagliati "a croce" in modo da ottenere 4 volantini A6 fronte retro per ogni foglio.
## Spot radio
Ecco alcuni spot che è possibile mandare in radio:
### Fratellino beriversion
<audio controls >
<source
src="https://archive.org/download/spot-hackit20-fratellino/spot-hackit20-fratellino-beriedition-compressed.ogg" type="audio/ogg" />
<source
src="https://archive.org/download/spot-hackit20-fratellino/spot-hackit20-fratellino-beriedition-compressed.mp3"
type="audio/mpeg" />
</audio> -->
<!-- ### Fratellino franceversion
<audio controls >
<source
src="https://archive.org/download/spot-hackit20-fratellino/spot-hackit20-fratellino-franceedition-compressed.ogg"
type="audio/ogg" />
<source
src="https://archive.org/download/spot-hackit20-fratellino/spot-hackit20-fratellino-franceedition-compressed.mp3"
type="audio/mpeg" />
</audio>
-->

76
content/pages/stampa.rst Normal file
View file

@ -0,0 +1,76 @@
Stampa
#########
:slug: press
:navbar_sort: 9
:lang: it
Cartella stampa
""""""""""""""""""""""""""""""""""""""
Propaganda
"""""""""""""""""""""""""""""""""""""""
I materiali utili per la diffusione di hackmeeting {{hm.year}} sono nell'apposita pagina `Propaganda
<{filename}propaganda.md>`_
Foto
"""""""""""""""""""""""""""""""""""""""
.. image:: images/press/2016-IMG_0578.jpg
:height: 200px
:alt: La bacheca dei seminari dell'hackmeeting 2016, a Pisa
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0578.jpg
.. image:: images/press/2016-IMG_0581.jpg
:height: 200px
:alt: Sessione di elettronica digitale
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0581.jpg
.. image:: images/press/2016-IMG_0584.jpg
:height: 200px
:alt: Programmazione
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0584.jpg
.. image:: images/press/2016-IMG_0586.jpg
:height: 200px
:alt: Computer
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0586.jpg
.. image:: images/press/2016-IMG_0589.jpg
:height: 200px
:alt: Il LAN party: un posto dove sperimentare insieme
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0589.jpg
.. image:: images/press/2016-IMG_0574.jpg
:height: 200px
:alt: Un hack su Emilio: il famoso robottino degli anni '90 è stato riprogrammato
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0574.jpg
Comunicati stampa
"""""""""""""""""""""""""""""""""""""""
Comunicato Stampa 13 Giugno
=================================
| HACKMEETING
| 14-16 giugno 2024
| Centro Sociale Autogestito Magazzino 47
| Via Industriale 10, BRESCIA
|
Strumenti per la programmazione dei robot, scoprire i segreti dell'intelligenza artificiale, viaggiare nel cuore di un motore di ricerca, conoscere la storia della Radio antagonista bresciana, cucinare e conoscere la cucina vegana e palestinese, cantare sulle note dell' HTTPS. Sono solo alcuni dei temi al centro dell'Hackmeeting, incontro annuale delle controculture digitali che giunge nel 2024 alla sua ventisettesima edizione e che si svolge questanno a Brescia, al CSA Magazzino 47, in via Industriale 10, dal 14 al 16 giugno. Il Magazzino 47, sede del movimento antagonista dal 1985, e' strettamente legato allemittente Radio Onda dUrto, punto di riferimento della galassia antagonista bresciana, uno spazio autogestito dove limpegno politico si intreccia con lattività sociale, la cultura e la musica. Un festival (il programma è disponibile su www.hackmeeting.org) dellinsegnamento reciproco e dello scambio libero e gratuito, per scoprire come configurare server autogestiti a prova di privacy, con approfondimenti dal punto di vista tecnico e legale, ma anche reti digitali in assenza di internet o sistemi anticollisione per droni. Obiettivo: riportare la tecnologia sotto il controllo delle persone in un mondo in cui sempre di più sono le persone a finire sotto il dominio dei dispositivi, e cioè delle grandi aziende che ci stanno dietro. LHackIT è solo per "hackers" con un' eccezzione diversa da quella comune, ovvero per chi vuole gestirsi la vita come preferisce e sa mettersi in gioco per farlo. Anche se non ha mai visto un computer in vita sua.
Si parte dalle basi - l'utilizzo di un tester elettrico o l'installazione di Linux sul proprio computer - per lanciarsi verso la conquista del controllo della propria indipendenza digitale. Seminari aperti a tutte le persone e gratuiti, per mettere insieme idee e competenze. Una formula consolidata, figlia di un'idea che precorse i tempi. La prima edizione risale al 1998, in oltre un quarto di secolo, l'Hackmeeting ha accompagnato tutte le fasi della rete. Lanciando l'allarme con anni di anticipo su quello che sarebbe successo in Italia e nel mondo. La voracità di Google sui dati delle persone, la pervasività dei social e le dipendenze che hanno provocato, il controllo sociale attraverso i dispositivi, le bolle digitali fatte di propaganda personalizzata, la trasformazione delle criptovalute da strumenti di libertà a mezzi speculativi, la fine della neutralità della rete, le insidie del telefonino nei rapporti di lavoro o come strumento di sorveglianza.
Ogni anno, la comunità dell'Hackmeeting si riunisce in una città diversa e, tenacemente, continua a interrogarsi sulle trasformazioni che la tecnologia sta impoendo al mondo, alla ricerca di strade alternative. Fatte di meno dominio e controllo; e di più autonomia, condivisione e consapevolezza.

217
content/pages/storia.md Normal file
View file

@ -0,0 +1,217 @@
Title: Storia
slug: storia
navbar_sort: 8
####La storia dell'HackMeeting
* **1998 - Firenze - CPA Firenze Sud**
Viene organizzato il primo hackmeeting al Cpa di Firenze. [Strano Network](http://strano.net/), [Avana BBS](http://avana.forteprenestino.net/), [Ecn](http://www.ecn.org), [Freaknet](http://www.freaknet.org), Decoder, Metro Olografix e la rete
Cybernet decidono di fare un meeting perché quattro anni prima cera stato un primo giro di vite contro gli hacker italiani. Il problema era
che i media iniziavano ad accorgersi che cera il fenomeno digitale e identificavano il tentativo di capire la logica delle nuove tecnologie
come fenomeno “criminali”. La comunità hacker invece voleva sottolineare che il computer era uno strumento di massa, domestico e non solo
tecnico-universitario o militare, di controllo o di mercato.
Linformazione che su quella rete di pc passava, doveva essere libera. Radio Cybernet strimmava i seminari su web, prima webradio italiana. Da
allora, la radio ci sarà praticamente ogni anno. I tre giorni di Firenze sono quelli in cui e nato limpianto dellhackmeeting attuale. Il
messaggio era: usciamo dal digitale e portiamo nel reale e alla portata di tutti questioni tecniche e opportunità di comunicazione diretta;
siamo noi a dirtelo senza mediazioni (”dont hate the media, become the media” da lì a qualche anno avrebbe affiancato “information wants to be
free”). Quellanno per esempio esce Kryptonite, un libro che raccoglie how-to su strumenti specifici, legati alla privacy e allanonimato
(anonimous remailer, gpg, packet radio). Lintenzione divulgativa dellhackmeeting è chiara. Allhackmeeting partecipa tutta la scena più
rappresentativa dellunderground italiano. La prima generazione di hacker che si riconosce nel termine non nel senso più comunemente
attribuito dai media. Strumenti tecnici: corsi di linux per principianti e workshop sulla accessibilità delle tecnologie e dei siti.
* **1999 - Milano - Deposito Bulk**
Viene deciso collettivamente di uscire dalla dimensione dei tre giorni per darsi spazi tutto lanno, e dare origine agli hacklab dove
incontrarsi, avere un laboratorio, condividere il lavoro, divulgare tematiche. Ospite di rilievo è Wau Holland, un hacker libertario
cofondatore del Chaos Computer Club, che senza carta di identità arrivò in Italia in modi rocamboleschi. Connessioni internazionali vengono
fatte conoscere alla comunità italiana. Strumenti tecnici: si ricorda il seminario su attaccare i protocolli di comunicazione (ip icmp tcp udp +
servizi), per capire/spiegare un po meglio come funzionano i protocolli di rete e quindi dove e perché sono vulnerabili. Un altro tema che
diventerà ricorrente negli hackmeting.
* **2000 - Roma - Forte Prenestino**
Sede di Avana BBS, primo hackmeeting organizzato con gli hacklab, diventati ormai realtà concrete. Jaromil si presenta con asciicam,
costruendo le relazioni declinate in altri ambiti come la net art, aspetto artistico, giocoso e capace di critica dellhacking. È anche un
hackmeeting dedicato ai diritti in rete, alla cooperazione sociale, allaccessibilità in rete. Molti i seminari su etica e web.
* **2001 - Catania - Freaknet media lab**
Un posto particolare, visto che era nato prima degli hacklab e già si apriva al pubblico con i bollettini meteo per i pescatori, via internet,
e le tastiere in arabo per gli immigrati. È lhackmeeting più forte dal punto di vista del numero di ore passato sul codice. Viene presentato il
progetto autistici.org/inventati.org come server autogestito che si affiancava a ecn. Viene presentato anche Bolic1, che diventerà poi
Dynebolic (the media hacktivist tool). Il Freaknet propone nelluniversità scientifica di Catania che si adotti il software libero
come software di base e allhackmeeting viene proposto di estenderlo anche ad altre città. Passeranno per questo meeting anche quelli che poi
creeranno il media center del G8. Vengono proposti strumenti e persone che poi si coaguleranno per dare vita a media come Indymedia. Si inizia
a parlare di reddito e lavoro nella net economy. Strumenti tecnici: si tiene un seminario di reverse engineering, ovvero
modificare il comportamento di un programma senza conoscere il codice sorgente.
* **2002 - Bologna - TPO**
Hackmeeting mondano. la parola mediattivismo è uscita e diffusa, Indymedia è un media consolidato, NGvision rappresenta un archivio video
su web consistente, ci sono le telestreet, lhackmeeeting diventa non più solo da hacker ma da attivismo media, e non a caso compaiono le
donne. Viene Richard Stallman. Strumenti tecnici: viene presentato il Retrocomputing ovvero la passione per il recupero dellhardware.
* **2003 - Torino - Barrio**
Viene fatto il mitico seminario di stiraggio acrobatico e la questione genere/tecnologie viene proposta dal Sexy shock di Bologna, collettivo
di donne, sottolineando che ci sono questioni di genere anche tra hacker e che sarebbe il caso di occuparsene. Alle aule vengono dati nomi
storici dellanarchismo. Strumenti tecnici: Honeypots, sicurezza informatica sul web sono tra gli argomenti trattati. Wireless diffuso.
* **2004 - Genova - Buridda**
Si apre ulteriormente lambito, vengono presentati seminari di robotica, ma anche sulla prostituzione. E sopratutto a partire da Reload di Milano
viene lanciato il concetto di reality hacking, hacking della vita quotidiana e della politica, chiedendo agli hacklab di uscire dagli
stretti ambiti nerd per entrare in quelli più allargati dellagire politico. Strumenti tecnici: Bluetooth security uno dei seminari.
* **2005 - Napoli - TerraTerra**
Viene presentato Open non è free, il secondo libro che esce dalla comunità di hackmeeting. Visto che nella società iniziano a circolare i
concetti di open source e di free software, la comunità sente la necessità di sottolineare la necessità di approcciare in maniera critica
queste tematiche che sono comunque ormai assorbite anche dal mercato. Strumenti tecnici: introduzione al Phreaking, ovvero come telefonare
gratis, dal fischietto di Captain Crunch al vOIP.
* **2006 - Parma - Collettivo Mario Lupo**
Gli hacklab non sono più lelemento principale di organizzazione ma cè una percezione più comunitaria che permette loccupazione di uno spazio
per la durata dellhackmeeting. Loccupazione avviene in un momento ambiguo e cosparso di sgomberi nel territorio parmense e prende la forma
politica di una TAZ, anche se cera la speranza di fare molto di più (tenere il posto, che poi invece verrà sgomberato). Nellambito dei
seminari si apre ulteriormente lapplicazione della filosofia hack in ambiti vari, per esempio, serpicanaro e la licenza open per la
produzione materiale, bucare un sistema che non è solo informatico ma reale e di mercato. Viene presentato The darkside of Google, altro libro
scritto da persone della comunità su aspetti ancora (allora) poco noti di Google. Strumenti tecnici: Web Semantico e Ontologie informatiche; si discute di Copyleft e fightsharing.
* **2007 - Pisa - Rebeldia**
Rispetto allanno precedente si recupera di nuovo sul profilo internazionale, vengono Emmanuel Goldstein, parte della scena americana storica dei phreakers e media hacktivist. Andy Muller Maghun, membro del CCC, esordisce dicendo “il CCC nasce come progetto politico”, segno di come in Europa sin dall82 si considerava il potenziale politico dellhacking come concetto, Armin Medosh, che fa una ricostruzione storica in chiave marxista dellevoluzione tecnologica. Appaiono seminari che impongono una presa di coscienza collettiva ecologica: viene fatto il seminario “hack the bread”, che riporta laccento su pratiche politiche anche a livello personale. Viene introdotto lo spazio capanne dei suchi, uno spazio diverso dal workshop, di discussione libera e lavoro in comune. Strumenti tecnici: metodi di compromissione dellanonimato, come difendersi. Voip Security, necessità di attenzione anche su Voip. IPSec, Meccanismi per proteggersi da attacchi basati sullanalisi statistica del traffico (Web site fingerprinting, etc ).
* **2008 - Palermo - AsK 191**
Hackmeeting importante per il luogo, lincontro con le persone dellAsk ha prodotto un momento di autogestione in comune molto forte. Conferma
spirito forte comunitario, non molto aperto perché non cera risposta da parte del pubblico palermitano. Limpronta ecologica continua, si parla
di compost, di rifiuti, di energia solare e onde radio. Sharing not exploiting: Prosumer vs. Corporation, riflessione su social network e
web 2.0, ritorni economici delle corporation. Dal punto di vista dellimmaginario compare il workshop sullo steampunk, il dopo cyberpunk.
Strumenti tecnici: Web semantico, come approccio al web 3.0
* **2009 - Rho - Fornace**
Di nuovo lhackmeeting va a supportare unautogestione in difficoltà. Lo scenario è Rho, hinterland milanese devastato dalla speculazione Expo,
un enorme capannone vuoto occupato da pochi giorni. Si parla di paura, di creazione della paura, di come uscire da questo modello sociale di
persone spaventate, che si guardano in cagnesco. Licona dellhackit è il babau, il cattivo delle favole. Si stabilizza allinterno delle
tematiche linteresse per la questione precariato e modelli di vita conseguenti. Si inaugura la pratica dei warm up, seminari che introducono nelle settimane precedenti sia nella città ospite, che nel resto dItalia levento principale. A livello di immaginario si parla di fantascienza, di retrocomputing e restauro, videogiochi per cellulari. Strumenti tecnici: streaming audio/video giss, sniffjoke, reti gsm, reti mesh
* **2010 - Roma - La Torre**
Hackmeeting tra gli ulivi nel caldo romano, tutti in tenda, ci si riprende dallhinterland milanese dellanno prima. Si parla di controllo, di quanto ne abbiamo intorno, di quali strumenti utilizza. Le tematiche ecologiste rientrano dalla porta principale con il seminario sulle pale eoliche, la presentazione della rete per lautocostruzione e il seminario sugli orti urbani. Nel lan space presenti sempre più arduini, e un modello di elicottero radiocomandato. Ospite dellhackit Margaret killjoy, un buffo personaggio dello Steampunk Magazine, un rivista autoprodotta americana, presentata assieme a Ruggine, una rivista autoprodotta italiana di racconti e disegni. Affollatissimo il seminario di pr0n, misterisca e intrigante estensione di firefox. Strumenti tecnici: ipv6 e reti mesh, opencv, arduino.
* **2011 - Firenze - csa nExt Emerson**
Il tema di questa edizione è stato quello dellapocalisse. Dalle nuvole dei disastri nucleari alle nuvole del cloud computing: la tecnologia e la conoscenza quando centralizzate per interessi economici e politici e in contrasto con le aspirazioni individuali e collettive di autonomia portano inevitabilmente alla… apocalisse.
* **2012 - LAquila - Asilo Occupato**
Una presenza significativa in una città come LAquila che non assomiglia più ad una città. Hack the town!! Se non è più possibile riparare i danni, dare un senso a ciò che è andato distrutto, hackmeeting prova a capire se è possibile farla funzionare in un altro modo, partendo dalla ricostruzione dei tessuti sociali e relazionali, delle connessioni vitali della città.
* **2013 - Cosenza - Ex-Officine**
Si è tenuto nellarea occupata delle ex officine Ferrovie della Calabria ed ha avuto come tema la “iattura del controllo”. Lidea dellHackmeeting 2013 era quello di stimolare una nuova saggezza popolare 2.0 per far fronte alle forze avverse che minacciano le libertà di espressione e di condivisione nella rete. Neanche a farlo apposta, fra iatture e superstizioni, proprio nei giorni di questhackmeeting escono le prime rivelazioni di Snowden.
Lattività di chi controlla i movimenti in rete, per affari, o per controllo è il tema chiave, ma gli argomenti trattati sono stati molteplici: dalla privacy alle tecnologie di comunicazione, dalla contrasessualità alle relazioni di inchiesta sui software spia utilizzati da governi e non. Degno di nota è anche lesperimento di media trolling che porta hackmeeting sulle pagine dei più importanti quotidiani nazionali attraverso un divertente e totalmente infondato “scoop”.
* **2014 - Bologna - XM24**
Xm24 ospita gli ultimi 3 giorni di un hackmeeting durato molto più a lungo:
l'articolato percorso di warmup cittadino, coordinato dall'hacklabbo ma che
vede la partecipazione di molte realtà, antagoniste e non, porta ad un'edizione
particolarmente partecipata.
Grazie alla lunga storia mediattivista di Xm24, la visibilità e il carattere
universitario di Bologna e alla rete di comunità che si intrecciano nella lista
hackmeeting prende vita un evento che dimostra alla sua stessa comunità come la
scena sia tutt'altro che morta, ma anzi particolarmente attenta e attiva.
Durante le tre giornate la necessità e la centralita' di un evento costruito
dal basso viene riaffermato con forza non soltato dalla partecipazione della
comunità storica, ma anche dalle assemblee di comunita' trasversali ad
hackmeeting(eg. quella delle WCN italiane), l'affacciarsi di molti volti nuovi
e i moltissimi talk di grande attualità (eg. Citizen Lab con il lavoro sulla
sorveglianza digitale).
PS: il logo è un non morto, non un gorilla, non un fattone ;)
* **2015 - Napoli - Mensa occupata**
Dopo dieci anni Hackmeeting torna a Napoli e si riprende il centro della città.
La collocazione centralissima della Mensa Occupata favorisce lo svolgimento di un hackmeeting di livello non esclusivamentetecnico e molto divulgativo. A meno di due mesi del primo maggio e delle lotte contro Expo, la riflessione sul lato più politico e militante dell'hacking si impone: tecniche di autodifesa neuro-digitali, studio delle legislazioni in materia di intercettazioni, Tor, crittografia e resistenza digitale. Alla comunità si è aggiunta tanta gente nuova e questa diventa l'occasione per reinventarsi. Si scopre che i fritti favoriscono la concentrazione.
* **2016 - Pisa - Polo Fibonacci**
Polo Fibonacci, l'hackmeeting si ritrova a Pisa il 3-5 Giugno e occupa un polo
universitario riempiendolo di giochi, feste, workshop e dibattiti. Per parlare di
tecnologia, di privacy, di sicurezza, ma anche di differenze, di gender e di
piu' inclusione all'interno del hackmeeting.
Si analizzano malware, si discute di crittografia quantistica e
ci si ritrova a giocare a retrogame alle 3 di mattina tra musica punk e la
birra che ormai e' finita da un po'
I bagni non divisi per genere si chiamano come gli editor: VIM, NANO o EMACS, mentre
alcune faccie internazionali e non rispondo ad email e scrivono pezzi di python nel mezzo del Lan Space
mentre altri cercano per la prima volta di installare Linux.
L'attenzione si sposta parecchio sui malware, anche detti captatori informatici
si prova ad analizzarli e vedere la demo di hacking-team, poi Ippolita presenta [Anime Elettriche](http://www.vita.it/it/interview/2016/04/27/anime-elettriche-corpi-digitali-linee-di-fuga-e-tattiche-di-resistenza/52/) e la sera
alcuni propongono giochi sulla comprensione del consenso, tavole rotonde sulle
discussioni di genere e tentativi di migliorare la comunita'
Poi all'improvviso e' gia' domenica e abbracci e baci, si accolla il prossimo
hackit ai Torinesi, ci vediamo in Val Susa.
* **2017 - Venaus, Val di Susa - Borgata 8 Dicembre e Presidio permanente**
E' il ventesimo hackmeeting e per celebrare l'occasione, si pensa di
farlo in un posto diverso. L'idea gira in lista, piace subito e così si parte.
Si impara a saldare, a fare il dado vegetale, a costruire un'antenna, a
farsi il formaggio con il latte di capra.
Si parla di sicurezza digitale, di anonimato, di fisica quantistica, di
cyberspionaggio, di pokemon, di controllo, di radio e di reti mesh.
Ci si mischia con i resistenti valsusini, ci si contagia, si scambiano
racconti, esperienze, sogni.La comunità condivide con la valle, la valle si racconta alla comunità.
Si dorme in tenda si cucina e ci si lava all'aperto, si cena al cantiere
di Chiomonte, si cammina in montagna.
Tagliare le reti, insomma, ci sta!
* **2018 - Buridda Genova**
Dopo 14 anni hackmeeting torna a Genova, nelle stanze del Buridda.
L'impronta del luogo è sicuramente l'attenzione all'autocostruzione, ma
non mancano dibattiti storici come la presentazione del numero di
Zapruder (numero dedicato all'hacking), una spiegazione pratica degli
avanzamenti crittografici negli ultimi anni, un workshop con pc e USB
alla mano come quello su Tails ed anche confronti interessanti e
contraddittori sui temi tecnici e politici come quello sul voto elettronico.
Viene presentato Stop al Panico, una raccolta di suggermenti tecnici e
legali da affrontare in caso di sequestro, si parla di sistemi operativi
alternativi per cellulari.
Si discute di social, di nolike e dell'uso tossico di questi strumenti,
riflettendo su come riappropriarci delle tecnologie "social" anche
presentando l'esperimento Bolognese di mastodon.bida.im
Dopo 3 giorni intensi, l'assemblea della domenica è molto partecipata:
scopriamo che i posti che hanno ospitato l'hackmeeting riprendono
energie mentre in varie città stanno nascendo vari hacklab mossi non
solo dalla volonta di smontare e comprendere la tecnologia come un tempo
o dalla mancanza di internet in casa, ma dal desiderio di incontrarsi,
discutere e condividere le impressioni su questi strumenti che oggi
abbiamo intorno e cercare alternative comuni insieme.
Ultimo giro al bar, dove quest'anno la birra non e' ancora finita, poi
una tuffo al mare per chi riesce, saluti sparsi a tutte le creature di
questo hackmeeting con la promessa di rivederci presto a sud a nord
online o offline, non fa differenza, l'importante e' che ci siamo.
* **2019 - Firenze - csa nExt Emerson**
* **2020 - Roma - C.S.O.A Forte Prenestino**
* **2021 - Bologna - Casona di Ponticelli**
* **2022 - Torino - C.S.O.A Gabrio**
* **2023 - Gallico Marina, Reggio Calabria - CSOA Angelina Cartella**

245
content/pages/warmup.rst Normal file
View file

@ -0,0 +1,245 @@
Warmup
======
:slug: warmup
:navbar_sort: 5
:lang: it
Cosa sono
"""""""""""""""""""""""""""""""""""""""
I warmup sono eventi "preparatori" ad hackmeeting. Avvengono in giro per l'Italia, e possono trattare gli argomenti più disparati.
Proporre un warmup
"""""""""""""""""""""""""""""""""""""""
Vuoi fare un warmup? ottimo!
* iscriviti alla `mailing list di hackmeeting <https://www.autistici.org/mailman/listinfo/hackmeeting>`_.
* scrivi in mailing list riguardo al tuo warmup: non c'è bisogno di alcuna "approvazione ufficiale", ma segnalarlo in lista è comunque un passaggio utile per favorire dibattito e comunicazione.
Elenco
"""""""""""""""""""""""""""""""""""""""
.. contents:: :local:
==========================
Fighting Technologies of Domination: From decentralised event platforms to the right to analogue
-------------------------------------------------------------------------------------------------
Domenica 9 giugno @ Disruption Network Lab (Berlino)
https://www.disruptionlab.org/event/fighting-technologies-of-domination
Si discuterà del diritto a vivere senza smartphone e di software fuori dal radar GAFAM con il collettivo Balotta.org di Bologna che condurrà un laboratorio su Gancio. Oltre a balotta ci sarà Agnese del collettivo [C.I.R.C.E.](https://circex.org) a moderare e Roberta Barone che approfondirà il tema del diritto a non avere uno smartphone mostrando alcune clip dal documentario ["Digital Dissidents"](https://digitalnisvobody.cz/wp-content/uploads/2022/09/Digitalni-disidenti_ABOUT-FILM.pdf). [Qui il trailer](https://iteroni.com/watch?v=qd9VGM4Q3WI).
* 15:00-16:30: Open discussion From decentralised platforms to the right to analogue.
The first part of the meetup will be dedicated to an open discussion, on the one hand to name the contradictions of the acritical adoption of smartphones and to give a voice and a framework to doubts, questions and demands that remain largely unspoken, and on the other hand to explore the possibilities of grassroots technologies and decentralised open-source software to share events and collect experiences beyond the use of social media platforms.
* 16:45-18:15: Gancio and Balotta.org Exploring open-source software for event publishing.
After a short break, the second part of the meetup will be hosted by the Balotta Collective (Italy) and we will delve deeper into the exploration of Gancio.
Born in Turin (Italy) out of political hacking movements, Gancio is a free open-source software designed for event publishing.
Oooh issaa! ...ooooh issaaa! il MIAI salpa!
--------------------------------------------
Naviganti! dal primo marzo scioglieremo le vele e tireremo su lancora. Si riparte con lallestimento del MIAI! Fino ad ora abbiamo pulito, ristrutturato, ammobiliato, allestito parte della Biblioteca e realizzato un affresco :) Si è fatta ora di affrontare la massa. La quantità di materia informatica che attende ormai da troppo tempo di essere liberata dal suo involucro di plastica e cartone per ritornare alla luce nel pieno del suo splendore. I pallet sono lì...intombati...aspettano soltanto noi!
Grazie anche ad Hackmeeting abbiamo resistito.
Questo museo è frutto anche di questa comunità.
per chiarezza, i primi fine settimana dei prossimi mesi sono piccoli Warm Up di costruzione del MIAI in attesa dell'appuntamento Hackmeeting a Brescia :)
E' l'occasione per scoprire i reperti, familiarizzare, prendersene cura, riaccenderli.
* Ecco le date dei venerdì-sabato-domenica:
1-2-3 marzo
5-6-7 aprile
3-4-5 maggio
31 maggio 1-2 giugno
5-6-7 luglio inizia il Cool Down con sessione di restauro del GE-120 da tenersi il 26-27-28 ultimo fine settimana di luglio.
Questi sono appuntamenti fissi, ma se qualcun in transito volesse fermarsi in date diverse, male non fa!
Per informazioni su ospitalità e altro scrivete a info@verdebinario.org
Ti invitiamo a salire a bordo e a dare una mano in questa impresa!
Obiettivo?
Allestire il Museo Interattivo di Archeologia Informatica - MIAI.
Quando?
Ogni primo fine settimana del mese da marzo a luglio, qui al MIAI, in Calabria, a Rende (CS) -Via C.B.Cavour 4.
Ospitalità?
Provate a organizzarvi e nel caso vogliate un supporto contattateci in privato.
E se non posso venire?
Siamo liet* anche di un piccolo/grande contributo monetario che è utile per affrontare gli imprevisti di un allestimento di questo genere
E alla fine?
Cool Down! Dopo Hackmeeting 2024, una sessione di restauro del GE-120 da tenersi il 26-27-28 ultimo fine settimana di luglio!
E alla fine fine?
Arrivare in porto, attraccare e vivere il MIAI funzionante!
Museo Interattivo di Archeologia Informatica - MIAI https://miai.musif.eu/
Questo titolo non è autogenerato
---------------------------------
Martedì 28 maggio @ via Mascarella 59A ZEM GARDEN (Bologna)
https://balotta.org/event/questo-titolo-non-e-autogenerato
Tranquillu il tuo lavoro da titolista sopravviverà alle AI.
Una serata dedicata al futuro dell'intelligenza artificiale insieme al collettivo Hacklabbo.
RADIO EUSTACHIO: due giorni di incontri, costruzioni, accrocchi e musica!
--------------------------------------------------------------------------
Sabartolomenica 25 e 26 maggio @ Gigi Piccoli (Verona)
https://lasitua.org/event/radio-eustachio-due-giorni-di-incontri-costruzioni-accrocchi-e-musica
**sabato 25/05**
* ore 11.00: Come funziona lo strumento radio: onde medie e corte
* ore 15.00: Calendari condivisi. Presentazione di Gancio e le istanze gancio.cisti.org, balotta.org e lasitua.org
* ore 17.00: Autocostruzione di un ricevitore AM (o qualcosa di simile)
* ore 19.00: Concerto con i Kani Sholty e a seguire selecta musicale con djset eustachiani!
**domenica 26/05**
* ore 11.00: Mercato autoproduzioni del Gigi Piccoli con diretta a microfono aperto
* ore 15.00: Chiacchiera su Gancio: una proposta per un calendario condiviso locale
* ore 17.00: Concerto e streaming di DucalicRock! con The Slurmies e Maybe Wonders
Radio Eustachio ha un blog: https://eustachio.indivia.net/blog
Il tutto si svolgerà al Gigi Piccoli, in via Caroto 1, Verona
Presentazione A-K-M-E, astro cyber crypto bluff
------------------------------------------------
Sabato 25 maggio @ Piano Terra Lab (Milano)
* ore 19.30 cibo per tutti i palati
* ore 20.30 presentazione dei libri Cyber bluff e Crypto bluff con lautore ginox
Cyber bluff, Collana BookBlock, Eris edizioni
Sono poche le persone che si interrogano sulla rete a cui questi servizi si appoggiano per capire da dove viene, comè nata e da chi è controllata. Sappiamo come funziona questo strumento, questa rete che è onnipresente nelle nostre vite? Sappiamo dove vanno i nostri dati e chi ne trae profitto? Abbiamo davvero bisogno di comunicazioni istantanee? Internet è davvero democratico? Il libro descrive i servizi online più diffusi, raccontandone la genesi, il funzionamento, e fornendo alcuni consigli utili per utilizzarli in maniera più consapevole.
Crypto bluff, Collana BookBlock, Eris edizioni
Bitcoin e NFT, blockchain e miner: questi termini provocano reazioni contrastanti. Da un lato suscitano un forte hype, dallaltro appaiono come lennesima bolla finanziaria speculativa, neppure troppo raffinata. Non si tratta di un libro su come svoltare. Lobiettivo è spogliare le criptovalute dal glamour che le circonda e spiegare come la componente rivoluzionaria e libertaria di cui si fregiano sia solo una strategia di marketing.
* ore 22:00 Acaroroscopo, ovvero loroscopo che non ti aspettavi! Musica live e testi a cura di Lobo
Cosa accade quando un hacker decide di darsi allastrologia? Vieni a scoprire finalmente cosa dicono le stelle del tuo benessere digitale e della tua privacy. Con lAcaroroscopo, la tua guida allhacking astrale, i misteri informatici del tuo destino non avranno piu segreti!
* ore 23:00 Low-tech live di Pablito el drito
25 maggio a partire dalle 19:30
https://akme.vado.li
https://www.pianoterralab.org/events/a-k-m-e-astro-cyber/
Assemblea di istanza mastodon bida.im e pranzo di autofinanziamento
-------------------------------------------------------------------
Domenica 19 maggio 2020 dalle 12.00 @ Spazio Libero Autogestito @Vag61 (in via Paolo Fabbri 110 a Bologna)
https://bida.im/news/quarta-assemblea-generale-distanza-mastodon-bida-im/
Presentazione del libro Cyber Bluff (Catania)
----------------------------------------------
Sabato 18 maggio @ Laboratorio Urbano Popolare Occupato (in Piazza Pietro Lupo 25, Catania)
Presentazione del libro Cyber Bluff: storie rischi e vantaggi della rete per navigare consapevolmente (2021, eris). Discuteremo e approfondiremo insieme all'autore Ginox dei temi trattati nel libro.
https://www.attoppa.it/event/presentazione-di-cyber-bluff
Presentazione Antennine/Ninux in appennino + cena benefit
----------------------------------------------------------
Lunedì 13 Maggio @ Circolo Anarchico Berneri, Bologna (BO)
https://circoloberneri.indivia.net/events/event/presentazione-del-progetto-antennine-in-appennino-bolognese-e-cena-di-autofinanziamento
Brugole e merletti
-------------------
10-11-12 maggio @ NextEmerson Via di Bellagio 15 - Firenze
https://doityourtrash.noblogs.org/
Instant Messaging e sicurezza
------------------------------
10 maggio a partire dalle 21:00 @ Pianoterra Lab, Milano
https://www.pianoterralab.org/events/a-k-m-e-instant-messaging/
Sono cambiati i mezzi con i quali comunichiamo: sempre meno si usano email, sempre di più le app da cellulare, in particolare, per la messaggistica istantanea. LInstant Messaging è diventato il sistema di comunicazione più diffuso, anche nellorganizzazione del lavoro. Usati spesso da attivist* e agitator* a causa della loro enorme diffusione, questi sistemi immediatamente disponibili sono diventati un obbiettivo appetibile. La vulnerabilità di queste applicazioni può così mettere a rischio la libertà, la privacy e la sicurezza delle persone. Crittografia asimmetrica, metadati, immagini, backup, codice sorgente, ne discutiamo in una tavola rotonda allargata sulla base di strategie e alternative disponibili.
con samba underscore hacklab (Torino)
10 maggio a partire dalle 21:00
A-K-M-E
https://akme.vado.li
Workshop mappe dalla carta al digitale
---------------------------------------
Martedì 9 aprile @ Vag 61, via Paolo Fabbri 110, Bologna (BO)
https://ciemmona.noblogs.org/workshop-mappe-dalla-carta-al-digitale/

222
dev-utils/ics2yaml.py Executable file
View file

@ -0,0 +1,222 @@
#!/usr/bin/python3
import logging
import argparse
import os.path
from typing import Iterable
from pathlib import Path
from datetime import timedelta
import json
import yaml
from icalendar import Calendar, Event
def get_parser():
p = argparse.ArgumentParser()
p.add_argument("files", nargs="+", type=str)
p.add_argument("--hm-json", default='./hackmeeting.json', type=Path)
p.add_argument(
"--out-talks-dir",
help="Output directory for markdown files",
default="talks/",
type=Path,
)
p.add_argument("--trust-location", type=str, nargs="*", default=[])
p.add_argument(
"--slot-size",
type=int,
metavar="MINUTES",
default=15,
help="Round times to the nearest */MINUTES",
)
p.add_argument("--night-threshold", metavar="HOUR", default=5, type=int)
p.add_argument("--mode", choices=["pelican"], default="pelican")
return p
def round_down(num, divisor):
"""
>>> round_down(1000, 10)
1000
>>> round_down(1001, 10)
1000
>>> round_down(1009, 10)
1000
"""
return num - (num % divisor)
def round_down_time(hhmm: str, divisor: int):
hh = hhmm[:-2]
mm = hhmm[-2:]
mm = round_down(int(mm, base=10), divisor)
return int('%s%02d' % (hh,mm) , base=10)
class Converter:
"""
This class takes care of everything converter-related.
Objects are used to enable multiple output formats to be added pretty easily by subclassing
"""
def __init__(self, args):
self.args = args
self.rooms = []
self.talks = {}
self.talk_room = {} # map talk uid to room name
self.talk_location = {} # same, but see --trust-location
self.changed_files = []
def _fname_to_room(self, fpath: str) -> str:
return os.path.splitext(os.path.basename(fpath))[0]
def get_vevents_from_calendar(self, cal: Calendar) -> Iterable[Event]:
for subc in cal.subcomponents:
if type(subc) is Event:
yield subc
def load_input(self):
with self.args.hm_json.open() as buf:
self.hackmeeting_metadata = json.load(buf)
for fpath in self.args.files:
room = self._fname_to_room(fpath)
with open(fpath) as buf:
file_content = buf.read()
cal = Calendar.from_ical(file_content, multiple=True)
for subcal in cal:
for ev in self.get_vevents_from_calendar(subcal):
if ev.decoded('DTSTART').year != self.hackmeeting_metadata['year']:
continue
uid = ev.decoded("uid").decode("ascii")
self.talks[uid] = ev
self.talk_room[uid] = room
self.talk_location[uid] = room
if fpath in self.args.trust_location:
try:
self.talk_location[uid] = ev.decoded("location").decode(
"utf8"
)
except:
pass
def run(self):
self.rooms = [self._fname_to_room(fpath) for fpath in self.args.files]
self.load_input()
self.output()
for fpath in self.changed_files:
print(fpath)
class PelicanConverter(Converter):
"""
add relevant output features to the base converter
"""
def load_input(self):
super().load_input()
talks_meta = self.args.out_talks_dir / 'meta.yaml'
with talks_meta.open() as buf:
self.talks_metadata = yaml.safe_load(buf)
def output_markdown(self):
for uid in sorted(self.talks):
talk = self.talks[uid]
fname = 'meta.yaml'
talkdir = self.args.out_talks_dir / uid
talkdir.mkdir(exist_ok=True)
fpath = talkdir / fname
self.changed_files.append(fpath)
day = (talk.decoded('DTSTART').date() - self.talks_metadata['startdate']).days
frontmatter = dict(
key=uid,
title=talk.decoded("SUMMARY").decode("utf8"),
format="conference",
start=talk.decoded("DTSTART"),
time=talk.decoded("DTSTART").strftime('%H:%M'),
day=day,
end=talk.decoded("DTEND"),
room=self.talk_location[uid],
duration=int(
(talk.decoded("DTEND") - talk.decoded("DTSTART")).total_seconds()
// 60
),
tags=[],
)
if "CATEGORIES" in talk:
try:
vobject = talk.get("CATEGORIES")
if hasattr(vobject, "cats"):
vobject = vobject.cats
frontmatter["tags"] = [str(t) for t in vobject]
else:
frontmatter["tags"] = [str(vobject)]
except Exception as exc:
logging.warning("Error parsing categories: %s", str(exc))
if "base" in frontmatter["tags"]:
frontmatter["level"] = "beginner"
if "DESCRIPTION" in talk:
frontmatter['text'] = talk.decoded("DESCRIPTION").decode("utf8")
else:
frontmatter['text'] = ''
with open(str(fpath), "w") as buf:
yaml.safe_dump(frontmatter, buf)
# body
def output_schedule(self):
days = {}
for uid in sorted(self.talks):
talk = self.talks[uid]
# TODO: talk just after midnight should belong to the preceding day
dt = talk.decoded("dtstart")
after_midnight = dt.time().hour < self.args.night_threshold
if after_midnight:
dt = dt - timedelta(days=1)
day = dt.strftime("%Y-%m-%d")
hour = talk.decoded("dtstart").time().hour
minute = talk.decoded("dtstart").time().minute
if after_midnight:
hour += 24
start = "%02d:%02d" % (hour, minute)
if day not in days:
days[day] = dict(day=day, start=start, rooms={})
if days[day]["start"] > start:
days[day]["start"] = start
room = self.talk_room[uid]
days[day]["rooms"].setdefault(room, dict(room=room, slots=[]))
talkstart = round_down_time('%02d%02d' % (hour, minute), self.args.slot_size)
duration = talk.decoded("dtend") - talk.decoded("dtstart")
duration_minutes = int(duration.total_seconds() // 60)
duration_minutes = round_down(duration_minutes, self.args.slot_size)
slot = "%04d-%dmin" % (talkstart, duration_minutes)
days[day]["rooms"][room]["slots"].append(dict(slot=slot, talk=uid))
# convert from our intermediate format to the correct one
for d in sorted(days):
# vanity: let's sort
for room in sorted(days[d]["rooms"]):
days[d]["rooms"][room]["slots"].sort(key=lambda x: x["slot"])
# convert dict to list
days[d]["rooms"] = [days[d]["rooms"][k] for k in sorted(days[d]["rooms"])]
out = {"schedule": [days[k] for k in sorted(days)]}
# XXX: dump, finally
def output(self):
self.output_markdown()
def main():
converter_register = {"pelican": PelicanConverter}
args = get_parser().parse_args()
c = converter_register[args.mode](args)
c.run()
if __name__ == "__main__":
main()

16
dev-utils/sincronizza.sh Executable file
View file

@ -0,0 +1,16 @@
#!/bin/sh
set -eu
git reset --hard HEAD
git ls-files | grep -E '^talks/.*/meta\.yaml$' | xargs -r git rm -f
curl -s 'https://files.esiliati.org/remote.php/dav/public-calendars/2w2meG65B4p9yfLD?export' > room1.ics
curl -s 'https://files.esiliati.org/remote.php/dav/public-calendars/YpCMj9qgnWjHtAyd?export' > room2.ics
curl -s 'https://files.esiliati.org/remote.php/dav/public-calendars/grWX9kAXpyxiBTDG?export' > room3.ics
curl -s 'https://files.esiliati.org/remote.php/dav/public-calendars/RYWGzPpr2eYdXPX9?export' > extra.ics
mkdir -p content/talks/
"$(dirname "$0")/ics2yaml.py" room1.ics room2.ics room3.ics extra.ics | stest -f | xargs -r git add
git commit --author='calendarioBot <calendario@example.com>' -m 'update calendar from remote ICS file'

12
hackmeeting.json Normal file
View file

@ -0,0 +1,12 @@
{
"year": 2025,
"location": {
"name": "Sa domu",
"website": "",
"city": "Cagliari",
"address": "",
"geo": {
}
},
"when": "30 Maggio - 1 Giugno 2025"
}

12
new-year.md Normal file
View file

@ -0,0 +1,12 @@
Anno nuovo sito nuovo
=========================
Come fare un sito per l'anno nuovo, abbastanza simile a quello vecchio?
copia ed aggiorna le date. Dove?
* `README.md`
* `content/pages/index.*` ci sono le date/luogo
* `content/pages/info*` c'è sicuramente roba da cambiare
* `hackmeeting.json` cambia il campo `year`
* `talks/meta.yaml`: cambia la startdate: deve essere quella del primo giorno da mettere in programma. Siccome a volte ci sono anche cose dal mercoledì, per prudenza indica il mercoledì come giorno di inizio.

113
pelicanconf.py Normal file
View file

@ -0,0 +1,113 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
import json
import math
with open('hackmeeting.json') as buf:
hm_metadata = json.load(buf)
# Non so dove metterla quindi le metto qui, poi vediamo
def geo_to_bbox(lat, lon, zoom):
width = 425
height = 350
# m/pixel at zoom level
# see https://wiki.openstreetmap.org/wiki/Zoom_levels to change
meters_pixel = 156543/(2**zoom)
r_earth = 6371000
dy = (width/2)*meters_pixel
dx = (height/2)*meters_pixel
latitude = lat
longitude = lon
lat_s = latitude + (dy / r_earth) * (180 / math.pi)
lon_s = longitude + (dx / r_earth) * (180 / math.pi) / math.cos(latitude * math.pi/180)
lat_e = latitude - (dy / r_earth) * (180 / math.pi)
lon_e = longitude - (dx / r_earth) * (180 / math.pi) / math.cos(latitude * math.pi/180)
bbox = f"{lon_s}%2C{lat_s}%2C{lon_e}%2C{lat_e}"
return bbox
# da un anno all'altro cambiare solo la variabile YEAR è sufficiente per le operazioni più base!
YEAR = hm_metadata['year']
EDITION = hex(YEAR - 1997)
AUTHOR = "Hackmeeting"
SITENAME = "Hackmeeting %s" % EDITION
CC_LICENSE = "by-nc-sa"
SITEURL = "/hackit%d" % (YEAR - 2000)
JINJA_GLOBALS = { 'hm': { 'edition': EDITION, **hm_metadata, 'osm': { 'bbox': geo_to_bbox(hm_metadata['location']['geo']['lat'], hm_metadata['location']['geo']['lon'], 18) } } }
PATH = "content"
PAGE_PATHS = ["pages"]
ARTICLE_PATHS = ["news"]
STATIC_PATHS = ["images", "talks", "extra"]
# DIRECT_TEMPLATES = ('search',) # tipue search
TIMEZONE = "Europe/Paris"
DEFAULT_LANG = "it"
# Feed generation is usually not desired when developing
INDEX_SAVE_AS = "news.html"
ARTICLE_URL = "news/{slug}.html"
ARTICLE_SAVE_AS = "news/{slug}.html"
FEED_DOMAIN = "https://it.hackmeeting.org"
FEED_ALL_ATOM = "news.xml"
CATEGORY_FEED_ATOM = None
TRANSLATION_FEED_ATOM = None
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None
# Blogroll
LINKS = None
# Social widget
SOCIAL = None
DEFAULT_PAGINATION = 10
USE_OPEN_GRAPH = False # COL CAZZO
# Uncomment following line if you want document-relative URLs when developing
RELATIVE_URLS = True
DEFAULT_DATE = (YEAR, 3, 1)
TYPOGRIFY = True
PAGE_ORDER_BY = "navbar_sort"
PAGE_URL = "{slug}.html"
PAGE_SAVE_AS = "{slug}.html"
PAGE_LANG_URL = "{slug}.{lang}.html"
PAGE_LANG_SAVE_AS = "{slug}.{lang}.html"
BANNER = True
BANNER_ALL_PAGES = True
SITELOGO = "logo/logo.png"
# PAGE_BACKGROUND = 'images/background.jpg'
# THEME = 'themes/hackit0x15/'
THEME = "themes/to0x19/"
FAVICON = "images/cyberrights.png"
FONT_URL = "theme/css/anaheim.css"
# Custom css by sticazzi.
# CUSTOM_CSS = 'theme/css/hackit.css'
EXTRA_PATH_METADATA = {
# 'extra/main.css': {'path': 'themes/pelican-bootstrap3/static/css/main.css' },
"extra/favicon.png": {"path": "images/favicon.png"},
"images/locandina.jpg": {"path": "images/locandina.jpg"},
}
# Pelican bootstrap 3 theme settings
BOOTSTRAP_THEME = "darkly"
HIDE_SITENAME = True
HIDE_SIDEBAR = True
PLUGIN_PATHS = ["plugins"]
PLUGINS = ["langmenu", "talks", "tipue_search", "pelican_webassets", "pelican.plugins.jinja2content"]
# plugin/talks.py
SCHEDULEURL = "https://hackmeeting.org" + SITEURL + "/schedule.html"
TALKS_GRID_STEP = 15
MARKDOWN = {"extension_configs": {"markdown.extensions.toc": {}}}

39
plugins/langmenu.py Normal file
View file

@ -0,0 +1,39 @@
'''
This plugin attemps to create something similar to menuitems,
but more meaningful with respect to l10n
'''
from __future__ import print_function
from pelican import signals
def add_localmenuitems(generator):
menu = {} # lang: list of pages
for page in generator.context['pages']:
menu.setdefault(page.lang, [])
for tr in page.translations:
menu.setdefault(tr.lang, [])
print('we have langs ' + ','.join(menu.keys()))
for page in sorted(generator.context['pages'],
key=lambda x: int(x.navbar_sort)):
defined_langs = []
menu[page.lang].append(page)
defined_langs.append(page.lang)
for tr in page.translations:
menu[tr.lang].append(tr)
defined_langs.append(tr.lang)
for lang in menu.keys():
if lang not in defined_langs:
menu[lang].append(page)
menuitems = {}
for lang in menu:
menuitems[lang] = []
for page in menu[lang]:
menuitems[lang].append((page.title, page.url))
generator.context['LOCALMENUITEMS'] = menuitems
def register():
signals.page_generator_finalized.connect(add_localmenuitems)

View file

@ -0,0 +1 @@
from .assets import register

View file

@ -0,0 +1,64 @@
from pelican import signals
import os
from webassets import Environment
from webassets.ext.jinja2 import AssetsExtension
import logging
logger = logging.getLogger(__name__)
def add_extension(pelican):
"""add webassets' jinja2 extension to pelican"""
jinja_env = pelican.settings['JINJA_ENVIRONMENT']
if type(jinja_env) == dict: # pelican 3.7+
jinja_env = jinja_env['extensions']
jinja_env.append(AssetsExtension)
logger.debug("'pelican-webassets' added to jinja2 environment")
def create_environment(generator):
"""define the webassets environment for the generator"""
theme_static_dir = generator.settings['THEME_STATIC_DIR']
assets_destination = os.path.join(generator.output_path, theme_static_dir)
generator.env.assets_environment = Environment(
assets_destination, theme_static_dir)
# are we in debug mode?
in_debug = generator.settings.get(
'WEBASSETS_DEBUG', logger.getEffectiveLevel() <= logging.DEBUG
)
if in_debug:
logger.info("'webassets' running in DEBUG mode")
generator.env.assets_environment.debug = in_debug
# pass along the additional congiuration options
for item in generator.settings.get('WEBASSETS_CONFIG', []):
generator.env.assets_environment.config[item[0]] = item[1]
logger.debug(
"'webassets' adding config: '%s' -> %s",
item[0], item[1]
)
# pass along the named bundles
for name, args, kwargs in generator.settings.get('WEBASSETS_BUNDLES', []):
generator.env.assets_environment.register(name, *args, **kwargs)
logger.debug("'webassets' registered bundle: '%s'", name)
# pass along the additional directories for webassets
paths = (
generator.settings['THEME_STATIC_PATHS'] +
generator.settings.get('WEBASSETS_SOURCE_PATHS', [])
)
logger.debug("'webassets' looding for files in: %s", paths)
for path in (paths):
generator.env.assets_environment.append_path(
os.path.join(generator.theme, path)
)
def register():
signals.initialized.connect(add_extension)
signals.generator_init.connect(create_environment)

View file

@ -0,0 +1,3 @@
from .talks import *
# flake8: noqa

104
plugins/talks/style.css Normal file
View file

@ -0,0 +1,104 @@
.talk-resources {
word-break: break-all;
}
.talk-grid {
table-layout: auto;
min-width: 100%;
border-collapse: separate;
text-align: center;
}
.talk-grid > thead th:first-child {
max-width: 5em;
}
.talk-grid > thead th {
text-align: center;
}
.talk-grid tr {
height: 1.5em;
}
.rooms-4 .talk {
width: 25%;
}
.rooms-3 .talk {
width: 33%;
}
.rooms-2 .talk {
width: 50%;
}
.rooms-1 .talk {
width: 100%;
}
td.talk {
border: 1px solid #444;
padding: 4px;
vertical-align: middle;
}
td.talk > a {
text-decoration: none;
border: none;
}
.talk-grid tr {
line-height: 1em;
}
.talk-title a,
.talk-title a:hover,
.talk-title a:focus {
border-bottom: none;
}
.talk-description strong {
background: inherit;
color: inherit;
}
/* tag speciali nei talk {{{ */
/* generati guardando i tag di glypicon come glyphicon-pushpin e copiandone il campo content */
td.talk::before {
font-family: 'Glyphicons Halflings';
float: right;
}
td.tag-presentazione_libro::before {
content: "\e043";
}
td.tag-percorso_base::before {
content: "\e146";
}
/* tag speciali nei talk }}} */
/* END TALK }}} */
/* Pagine speciali */
.body-info .entry-content > ul {
list-style: none;
}
/*media query min dal piccolo, max dal grande*/
@media all and (max-width: 770px) {
.talk-grid {
font-size: 0.8em;
}
.talk-grid td {
hyphens: auto;
}
}
@media all and (max-width: 450px) {
.talk-grid {
font-size: 0.5em;
}
}

607
plugins/talks/talks.py Normal file
View file

@ -0,0 +1,607 @@
# -*- coding: utf-8 -*-
"""
Manage talks scheduling in a semantic way
"""
from __future__ import print_function
import os
import io
from functools import wraps
import logging
import re
import datetime
import shutil
from copy import copy
import locale
from contextlib import contextmanager
import inspect
from babel.dates import format_date, format_datetime, format_time, get_timezone
from markdown import markdown
from docutils import nodes
from docutils.parsers.rst import directives, Directive
import six
from pelican import signals, generators
import jinja2
try:
import ics
except ImportError:
ICS_ENABLED = False
else:
ICS_ENABLED = True
try:
import unidecode
except ImportError:
logging.warning("unidecode not available")
UNIDECODE_ENABLED = False
else:
UNIDECODE_ENABLED = True
import dateutil
try:
Markup = jinja2.Markup
except AttributeError:
from markupsafe import Markup
pelican = None # This will be set during register()
if 'TZ' not in os.environ:
os.environ['TZ'] = 'Europe/Rome'
def memoize(function):
"""decorators to cache"""
memo = {}
@wraps(function)
def wrapper(*args):
if args in memo:
return memo[args]
else:
rv = function(*args)
memo[args] = rv
return rv
return wrapper
@contextmanager
def setlocale(name):
saved = locale.setlocale(locale.LC_ALL)
try:
yield locale.setlocale(locale.LC_ALL, name)
finally:
locale.setlocale(locale.LC_ALL, saved)
@memoize
def get_talk_names():
names = [
name
for name in os.listdir(pelican.settings["TALKS_PATH"])
if not name.startswith("_") and get_talk_data(name) is not None
]
names.sort()
return names
def all_talks():
return [get_talk_data(tn) for tn in get_talk_names()]
def unique_attr(iterable, attr):
return {x[attr] for x in iterable if attr in x}
@memoize
def get_global_data():
fname = os.path.join(pelican.settings["TALKS_PATH"], "meta.yaml")
if not os.path.isfile(fname):
return None
with io.open(fname, encoding="utf8") as buf:
try:
data = yaml.safe_load(buf)
except Exception:
logging.exception("Syntax error reading %s; skipping", fname)
return None
if data is None:
return None
if "startdate" not in data:
logging.error("Missing startdate in global data")
data["startdate"] = datetime.datetime.now()
if "rooms" not in data:
data["rooms"] = {}
if "names" not in data["rooms"]:
data["rooms"]["names"] = {}
if "order" not in data["rooms"]:
data["rooms"]["order"] = []
return data
def _get_time_shift(timestring):
"""Il problema che abbiamo è che vogliamo dire che le 2 di notte del sabato sono in realtà "parte" del
venerdì. Per farlo accettiamo orari che superano le 24, ad esempio 25.30 vuol dire 1.30.
Questa funzione ritorna una timedelta in base alla stringa passata
"""
timeparts = re.findall(r"\d+", timestring)
if not timeparts or len(timeparts) > 2:
raise ValueError("Malformed time %s" % timestring)
timeparts += [0, 0] # "padding" per essere sicuro ci siano anche [1] e [2]
duration = datetime.timedelta(
hours=int(timeparts[0]),
minutes=int(timeparts[1]),
seconds=int(timeparts[2]),
)
if duration.total_seconds() > 3600 * 31 or duration.total_seconds() < 0:
raise ValueError("Sforamento eccessivo: %d" % duration.hours)
return duration
@memoize
def get_talk_data(talkname):
fname = os.path.join(pelican.settings["TALKS_PATH"], talkname, "meta.yaml")
if not os.path.isfile(fname):
return None
with io.open(fname, encoding="utf8") as buf:
try:
data = yaml.safe_load(buf)
except Exception:
logging.exception("Syntax error reading %s; skipping", fname)
return None
if data is None:
return None
try:
gridstep = pelican.settings["TALKS_GRID_STEP"]
data.setdefault("nooverlap", [])
if "title" not in data:
logging.warn("Talk <{}> has no `title` field".format(talkname))
data["title"] = six.text_type(talkname)
else:
data["title"] = six.text_type(data["title"])
if "text" not in data:
logging.warn("Talk <{}> has no `text` field".format(talkname))
data["text"] = ""
else:
data["text"] = six.text_type(data["text"])
if "duration" not in data:
logging.info(
"Talk <{}> has no `duration` field (50min used)".format(
talkname
)
)
data["duration"] = 50
data["duration"] = int(data["duration"])
if data["duration"] < gridstep:
logging.info(
"Talk <{}> lasts only {} minutes; changing to {}".format(
talkname, data["duration"], gridstep
)
)
data["duration"] = gridstep
if "links" not in data or not data["links"]:
data["links"] = []
if "contacts" not in data or not data["contacts"]:
data["contacts"] = []
if "needs" not in data or not data["needs"]:
data["needs"] = []
if "room" not in data:
logging.warn("Talk <{}> has no `room` field".format(talkname))
else:
if data["room"] in get_global_data()["rooms"]["names"]:
data["room"] = get_global_data()["rooms"]["names"][
data["room"]
]
if "time" not in data or "day" not in data:
logging.warn("Talk <{}> has no `time` or `day`".format(talkname))
if "time" in data:
del data["time"]
if "day" in data:
del data["day"]
else:
data["day"] = get_global_data()["startdate"] + datetime.timedelta(
days=data["day"]
)
del data["time"]
logging.debug("parsed: %s - %s" % (data["title"], data.get('start', None)))
data["id"] = talkname
resdir = os.path.join(
pelican.settings["TALKS_PATH"],
talkname,
pelican.settings["TALKS_ATTACHMENT_PATH"],
)
if os.path.isdir(resdir) and os.listdir(resdir):
data["resources"] = resdir
return data
except Exception:
logging.exception("Error on talk %s", talkname)
raise
def overlap(interval_a, interval_b):
"""how many minutes do they overlap?"""
return max(
0,
min(interval_a[1], interval_b[1]) - max(interval_a[0], interval_b[0]),
)
def get_talk_overlaps(name):
data = get_talk_data(name)
overlapping_talks = set()
if "time" not in data:
return overlapping_talks
start = int(data["start"].strftime("%s"))
end = start + data["duration"] * 60
for other in get_talk_names():
if other == name:
continue
if "time" not in get_talk_data(other):
continue
other_start = int(get_talk_data(other)["time"].strftime("%s"))
other_end = other_start + get_talk_data(other)["duration"] * 60
minutes = overlap((start, end), (other_start, other_end))
if minutes > 0:
overlapping_talks.add(other)
return overlapping_talks
@memoize
def check_overlaps():
for t in get_talk_names():
over = get_talk_overlaps(t)
noover = get_talk_data(t)["nooverlap"]
contacts = set(get_talk_data(t)["contacts"])
for overlapping in over:
if overlapping in noover or set(
get_talk_data(overlapping)["contacts"]
).intersection(contacts):
logging.warning("Talk %s overlaps with %s" % (t, overlapping))
@memoize
def jinja_env():
env = jinja2.Environment(
loader=jinja2.FileSystemLoader(
os.path.join(pelican.settings["TALKS_PATH"], "_templates")
),
autoescape=True,
)
env.filters["markdown"] = lambda text: Markup(markdown(text))
env.filters["dateformat"] = format_date
env.filters["datetimeformat"] = format_datetime
env.filters["timeformat"] = format_time
env.filters["parsetime"] = lambda iso: datetime.datetime.fromisoformat(iso).time()
return env
@memoize
def get_css():
plugindir = os.path.dirname(
os.path.abspath(inspect.getfile(inspect.currentframe()))
)
with open(os.path.join(plugindir, "style.css")) as buf:
return buf.read()
class TalkListDirective(Directive):
final_argument_whitespace = True
has_content = True
option_spec = {"lang": directives.unchanged}
def run(self):
lang = self.options.get("lang", "C")
tmpl = jinja_env().get_template("talk.html")
def _sort_date(name):
"""
This function is a helper to sort talks by start date
When no date is available, put at the beginning
"""
d = get_talk_data(name)
room = d.get("room", "")
time = d.get(
"start",
datetime.datetime(1, 1, 1).replace(
tzinfo=dateutil.tz.gettz(os.environ['TZ'])
),
)
title = d.get("title", "")
return (time, room, title)
return [
nodes.raw(
"", tmpl.render(lang=lang,
local_tz=get_timezone(os.environ['TZ']),
**get_talk_data(n)), format="html"
)
for n in sorted(get_talk_names(), key=_sort_date)
]
class TalkDirective(Directive):
required_arguments = 1
final_argument_whitespace = True
has_content = True
option_spec = {"lang": directives.unchanged}
def run(self):
lang = self.options.get("lang", "C")
tmpl = jinja_env().get_template("talk.html")
data = get_talk_data(self.arguments[0])
if data is None:
return []
return [nodes.raw("", tmpl.render(lang=lang,
local_tz=get_timezone(os.environ['TZ']),
**data), format="html")]
def _approx_time(time: datetime.datetime) -> datetime.datetime:
gridstep = pelican.settings["TALKS_GRID_STEP"]
minutes = time.minute
new_minutes = minutes // gridstep * gridstep
diff = new_minutes - minutes
if diff != 0:
new_dt = time + datetime.timedelta(minutes=diff)
return new_dt
else:
return time
class TalkGridDirective(Directive):
"""A complete grid"""
final_argument_whitespace = True
has_content = True
option_spec = {"lang": directives.unchanged}
def run(self):
try:
lang = self.options.get("lang", "C")
tmpl = jinja_env().get_template("grid.html")
output = []
days = unique_attr(all_talks(), "day")
gridstep = pelican.settings["TALKS_GRID_STEP"]
for day in sorted(days):
talks = {
talk["id"]
for talk in all_talks()
if talk.get("day", None) == day
and "start" in talk
and "room" in talk
}
if not talks:
continue
talks = [get_talk_data(t) for t in talks]
rooms = set()
for t in talks:
if type(t["room"]) is list:
for r in t["room"]:
rooms.add(r)
else:
rooms.add(t["room"])
def _room_sort_key(r):
order = get_global_data()["rooms"]["order"]
base = None
for k, v in get_global_data()["rooms"]["names"].items():
if v == r:
base = k
break
else:
if type(r) is str:
return ord(r[0])
# int?
return r
return order.index(base)
rooms = list(sorted(rooms, key=_room_sort_key))
# room=* is not a real room.
# Remove it unless that day only has special rooms
if "*" in rooms and len(rooms) > 1:
del rooms[rooms.index("*")]
mintime = min({talk["start"] for talk in talks})
maxtime = max(
{
(talk["start"]
+ datetime.timedelta(minutes=talk["duration"])
)
for talk in talks
}
)
times = {}
t = mintime
while t <= maxtime:
times[t.isoformat('T', timespec="minutes")] = [None] * len(rooms)
t += datetime.timedelta(minutes=gridstep)
for talk in sorted(talks, key=lambda x: x["start"]):
try:
position = _approx_time(talk["start"]).isoformat('T', timespec="minutes")
if talk["room"] == "*":
roomnums = range(len(rooms))
elif type(talk["room"]) is list:
roomnums = [rooms.index(r) for r in talk["room"]]
else:
roomnums = [rooms.index(talk["room"])]
for roomnum in roomnums:
if times[position][roomnum] is not None:
logging.error(
"Talk %s and %s overlap! (room %s)",
times[position][roomnum]["id"],
talk["id"],
rooms[roomnum],
)
continue
times[position][roomnum] = copy(talk)
times[position][roomnum]["skip"] = False
for i in range(1, talk["duration"] // gridstep):
p = _approx_time(talk["start"] + i *
datetime.timedelta(minutes=pelican.settings["TALKS_GRID_STEP"])).isoformat('T', timespec="minutes")
times[p][roomnum] = copy(talk)
times[p][roomnum]["skip"] = True
except Exception:
logging.exception(
"Error on talk %s", talk.get("title", "?")
)
render = tmpl.render(
local_tz=get_timezone(os.environ['TZ']),
times=times,
rooms=rooms,
mintime=mintime,
maxtime=maxtime,
timestep=gridstep,
lang=lang,
)
date_formatted = format_date(day, format="full", locale=lang)
output.append(
nodes.raw(
"",
f'<section class="talk-grid-day '
f'talk-grid-day-{day}">'
f'<h4>{date_formatted}</h4>'
f'{render}'
f'</section>',
format="html",
)
)
except:
logging.exception("Error on talk grid")
import traceback
traceback.print_exc()
return []
css = get_css()
if css:
output.insert(
0,
nodes.raw(
"",
'<style type="text/css">%s</style>' % css,
format="html",
),
)
return output
def talks_to_ics():
c = ics.Calendar()
c.creator = "pelican"
for t in all_talks():
e = talk_to_ics(t)
if e is not None:
c.events.add(e)
else:
logging.warning("Event '%s' not added to ICS" % t.get('title', ''))
return six.text_type(c)
def talk_to_ics(talk):
def _decode(s):
if UNIDECODE_ENABLED:
return unidecode.unidecode(s)
else:
return s
if "start" not in talk or "duration" not in talk:
return None
e = ics.Event(
uid="%s@%d.hackmeeting.org"
% (talk["id"], get_global_data()["startdate"].year),
name=_decode(talk["title"]),
begin=talk["start"],
duration=datetime.timedelta(minutes=talk["duration"]),
transparent=True,
)
# ics.py has some problems with unicode
# unidecode replaces letters with their most similar ASCII counterparts
# (ie: accents get stripped)
if "text" in talk:
e.description = _decode(talk["text"])
e.url = pelican.settings["SCHEDULEURL"] + "#talk-" + talk["id"]
if "room" in talk:
e.location = talk["room"]
return e
class TalksGenerator(generators.Generator):
def __init__(self, *args, **kwargs):
self.talks = []
super(TalksGenerator, self).__init__(*args, **kwargs)
def generate_context(self):
self.talks = {n: get_talk_data(n) for n in get_talk_names()}
self._update_context(("talks",))
check_overlaps()
def generate_output(self, writer=None):
for talkname in sorted(self.talks):
if "resources" in self.talks[talkname]:
outdir = os.path.join(
self.output_path,
pelican.settings["TALKS_PATH"],
talkname,
pelican.settings["TALKS_ATTACHMENT_PATH"],
)
if os.path.isdir(outdir):
shutil.rmtree(outdir)
shutil.copytree(self.talks[talkname]["resources"], outdir)
if ICS_ENABLED:
logging.info("Generating ics...")
with io.open(
os.path.join(
self.output_path, pelican.settings.get("TALKS_ICS")
),
"w",
encoding="utf8",
) as buf:
content = talks_to_ics()
logging.info("ics is %d characters" % len(content))
buf.write(content)
else:
logging.warning(
"module `ics` not found. " "ICS calendar will not be generated"
)
def add_talks_option_defaults(pelican):
pelican.settings.setdefault("TALKS_PATH", "talks")
pelican.settings.setdefault("TALKS_ATTACHMENT_PATH", "res")
pelican.settings.setdefault("TALKS_ICS", "schedule.ics")
pelican.settings.setdefault("TALKS_GRID_STEP", 30)
def get_generators(gen):
return TalksGenerator
def pelican_init(pelicanobj):
global pelican
pelican = pelicanobj
try:
import yaml
except ImportError:
print("ERROR: yaml not found. Talks plugins will be disabled")
def register():
pass
else:
def register():
signals.initialized.connect(pelican_init)
signals.get_generators.connect(get_generators)
signals.initialized.connect(add_talks_option_defaults)
directives.register_directive("talklist", TalkListDirective)
directives.register_directive("talk", TalkDirective)
directives.register_directive("talkgrid", TalkGridDirective)

View file

@ -0,0 +1,67 @@
Tipue Search
============
A Pelican plugin to serialize generated HTML to JSON that can be used by jQuery plugin - Tipue Search.
Copyright (c) Talha Mansoor
Author | Talha Mansoor
----------------|-----
Author Email | talha131@gmail.com
Author Homepage | http://onCrashReboot.com
Github Account | https://github.com/talha131
Why do you need it?
===================
Static sites do not offer search feature out of the box. [Tipue Search](http://www.tipue.com/search/)
is a jQuery plugin that search the static site without using any third party service, like DuckDuckGo or Google.
Tipue Search offers 4 search modes. Its [JSON search mode](http://www.tipue.com/search/docs/json/) is the best search mode
especially for large sites.
Tipue's JSON search mode requires the textual content of site in JSON format.
Requirements
============
Tipue Search requires BeautifulSoup.
```bash
pip install beautifulsoup4
```
How Tipue Search works
=========================
Tipue Search serializes the generated HTML into JSON. Format of JSON is as follows
```python
{
"pages": [
{
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero.",
"tags": "Example Category",
"url" : "http://oncrashreboot.com/plugin-example.html",
"title": "Everything you want to know about Lorem Ipsum"
},
{
"text": "Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh.",
"tags": "Example Category",
"url" : "http://oncrashreboot.com/plugin-example-2.html",
"title": "Review of the book Lorem Ipsum"
}
]
}
```
JSON is written to file `tipuesearch_content.json` which is created in the root of `output` directory.
How to use
==========
To utilize JSON Search mode, your theme needs to have Tipue Search properly configured in it. [Official documentation](http://www.tipue.com/search/docs/#json) has the required details.
Pelican [Elegant Theme](https://github.com/talha131/pelican-elegant) and [Plumage
theme](https://github.com/kdeldycke/plumage) have Tipue Search configured. You can view their
code to understand the configuration.

View file

@ -0,0 +1 @@
from .tipue_search import *

View file

@ -0,0 +1,107 @@
# -*- coding: utf-8 -*-
"""
Tipue Search
============
A Pelican plugin to serialize generated HTML to JSON
that can be used by jQuery plugin - Tipue Search.
Copyright (c) Talha Mansoor
"""
from __future__ import unicode_literals
import os.path
import json
from bs4 import BeautifulSoup
from codecs import open
try:
from urlparse import urljoin
except ImportError:
from urllib.parse import urljoin
from pelican import signals
class Tipue_Search_JSON_Generator(object):
def __init__(self, context, settings, path, theme, output_path, *null):
self.output_path = output_path
self.context = context
self.siteurl = settings.get('SITEURL')
self.relative_urls = settings.get('RELATIVE_URLS')
self.tpages = settings.get('TEMPLATE_PAGES')
self.output_path = output_path
self.json_nodes = []
def create_json_node(self, page):
if getattr(page, 'status', 'published') != 'published':
return
soup_title = BeautifulSoup(page.title.replace('&nbsp;', ' '), 'html.parser')
page_title = soup_title.get_text(' ', strip=True).replace('', '"').replace('', '"').replace('', "'").replace('^', '&#94;')
soup_text = BeautifulSoup(page.content, 'html.parser')
page_text = soup_text.get_text(' ', strip=True).replace('', '"').replace('', '"').replace('', "'").replace('', ' ').replace('^', '&#94;')
page_text = ' '.join(page_text.split())
page_category = page.category.name if getattr(page, 'category', 'None') != 'None' else ''
page_url = '.'
if page.url:
page_url = page.url if self.relative_urls else (self.siteurl + '/' + page.url)
node = {'title': page_title,
'text': page_text,
'tags': page_category,
'loc': page_url}
self.json_nodes.append(node)
def create_tpage_node(self, srclink):
with open(os.path.join(self.output_path, self.tpages[srclink]),
encoding='utf-8') as srcfile:
soup = BeautifulSoup(srcfile, 'html.parser')
page_title = soup.title.string if soup.title is not None else ''
page_text = soup.get_text()
# Should set default category?
page_category = ''
page_url = urljoin(self.siteurl, self.tpages[srclink])
node = {'title': page_title,
'text': page_text,
'tags': page_category,
'url': page_url}
self.json_nodes.append(node)
def generate_output(self, writer):
# bisognerebbe cambiare usando questo coso
# for p in self.context['PAGES']:
# print 'U', p.url
path = os.path.join(self.output_path, 'tipuesearch_content.json')
pages = self.context['pages'] + self.context['articles']
for article in self.context['articles']:
pages += article.translations
for srclink in self.tpages:
self.create_tpage_node(srclink)
for page in pages:
self.create_json_node(page)
root_node = {'pages': self.json_nodes}
with open(path, 'w', encoding='utf-8') as fd:
json.dump(root_node, fd, separators=(',', ':'), ensure_ascii=False)
def get_generators(generators):
return Tipue_Search_JSON_Generator
def register():
signals.get_generators.connect(get_generators)

14
publishconf.py Normal file
View file

@ -0,0 +1,14 @@
#!/usr/bin/env python
# This file is only used if you use `make publish` or
# explicitly specify it as your config file.
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
import os
import sys
sys.path.append(os.curdir) # isort:skip
from pelicanconf import * # isort:skip
from pelicanconf import YEAR # isort:skip
SITEURL = "https://hackmeeting.org/hackit%d/" % (YEAR - 2000)

2
pyproject.toml Normal file
View file

@ -0,0 +1,2 @@
[tool.black]
line-length=79

34
requirements.txt Normal file
View file

@ -0,0 +1,34 @@
anyio==4.3.0
arrow==1.3.0
attrs==23.2.0
Babel==2.14.0
beautifulsoup4==4.12.3
blinker==1.7.0
docutils==0.20.1
feedgenerator==2.1.0
ics==0.7.2
idna==3.6
Jinja2==3.1.3
libsass==0.23.0
Markdown==3.6
markdown-it-py==3.0.0
MarkupSafe==2.1.5
mdurl==0.1.2
ordered-set==4.1.0
pelican==4.9.1
pelican-jinja2content==1.0.1
Pygments==2.17.2
python-dateutil==2.9.0.post0
pytz==2024.1
PyYAML==6.0.1
rich==13.7.1
six==1.16.0
smartypants==2.0.1
sniffio==1.3.1
soupsieve==2.5
TatSu==5.12.0
types-python-dateutil==2.9.0.20240316
typogrify==2.0.7
Unidecode==1.3.8
watchfiles==0.21.0
webassets==2.0

5
talks/README.md Normal file
View file

@ -0,0 +1,5 @@
Per aggiungere un talk, copia la directory `_talk_example` in una nuova
directory che contenga **solo caratteri alfabetici**, quindi
cambia il file ``meta.yaml`` a tuo piacimento.
Usa UTF-8 o morirai.
**NOTA BENE**: in realta' abbiamo usato il calendario di nextcloud con uno script magico che autopusha

View file

@ -0,0 +1,40 @@
<table class="talk-grid rooms-{{-rooms|length}}">
<thead>
<tr>
<th></th>
{% for room in rooms %}
<th>{{room}}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for time in times|sort %}
<tr>
<td class="talk-grid-time talk-grid-time-minutes-{{(time | parsetime | timeformat(format='short', locale=lang, tzinfo=local_tz))[-2:]}}">
<time datetime="{{time}}">
{{time | parsetime | timeformat(format='short', locale=lang, tzinfo=local_tz)}}
</time>
</td>
{% for talk in times[time] %}
{% if not loop.first and talk.room == '*' %}
{# skip: covered by colspan #}
{% elif talk == None %}
<td></td>
{% elif not talk.skip %}
<td id="t-cell-{{talk.id}}" class="talk
{% if talk.room == '*' -%}allrooms{%endif-%}
{% for t in talk.tags %} tag-{{t|replace(' ', '_')}} {%endfor-%}
"
rowspan="{{talk.duration // timestep}}"
{% if talk.room == '*' %}colspan="{{rooms|length}}"{%endif%}>
<a href="#talk-{{talk.id}}"
title="{{talk.tags|join(",")}}"
>{{talk.title}}</a>
</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
{# vim: set ft=jinja: #}

View file

@ -0,0 +1,63 @@
{% macro durata_human(d) %}
{%- if d >= 60 -%}{{d//60}}h{%- endif -%}
{%- if d % 60 != 0 -%}{{d%60}}m {%- endif -%}
{% endmacro %}
{% macro durata_html(d) %}
PT{%- if d >= 60 -%}{{d//60}}H{%- endif -%}
{%- if d % 60 != 0 -%}{{d%60}}M{%- endif -%}
{% endmacro %}
<div id="talk-{{id}}"
class="{% for t in tags -%} tag-{{t|replace(' ', '_')}} {% endfor -%}">
<h3 class="talk-title"><a href="#t-cell-{{id}}">{{title.strip()}}</a></h3>
<div class="talk-info">
<p>
{% if start is defined and day is defined %}
{# Vedi http://babel.pocoo.org/en/latest/dates.html #}
<time datetime="{{start}}">
{{start.date()|dateformat(format='EEEE', locale=lang)}}
-
{{start.time()|timeformat(format='short', locale=lang, tzinfo=local_tz)}}
{% if duration %} (<time datetime="{{durata_html(duration)}}">{{durata_human(duration)}}</time>) {% endif %}
</time>
{% else %}
<i>L'orario non è ancora stato fissato</i>
{% if duration %} <p>Durata: {{durata_human(duration)}}</p> {% endif %}
{% endif %} {# date-time #}
{% if room is defined %}
<span>Stanza {{ room }}</span>
{% endif %}
</p>
{% if needs: %}
<div class="talk-needs">
<strong>Materiale necessario:</strong>
{{needs|join(", ")}}
</div>
{% endif %}
</div>
<div class="talk-description">{{text | markdown}}
{% if contacts: %}
<p class="contacts">A cura di {{contacts|join(', ')}}</p>
{% endif %}
</div>
{% if links or resources or mail: %}
<div class="talk-resources">
<h4>Link utili:</h4>
<ul>
{% if links is defined: %}
{% for link in links %}
<li>{{link|urlize}}</li>
{% endfor %}
{% endif %}
{% if resources is defined: %}
<li><a href="{{resources}}/">Materiali</a></li>
{% endif %}
{% if mail is defined and mail: %}
<li><a href="{{mail}}">Mail</a></li>
{% endif %}
</ul>
</div>
{% endif %}
</div>
{# vim: set ft=jinja: #}

8
talks/meta.yaml Normal file
View file

@ -0,0 +1,8 @@
startdate: 2025-05-30
rooms:
names:
room1: "a"
room2: "b"
room3: "c"
arena: "xyz"
order: [room1, room2, room3, arena, extra]

View file

@ -0,0 +1,458 @@
/*
Name: Smashing HTML5
Date: July 2009
Description: Sample layout for HTML5 and CSS3 goodness.
Version: 1.0
License: MIT <http://opensource.org/licenses/MIT>
Licensed by: Smashing Media GmbH <http://www.smashingmagazine.com/>
Original author: Enrique Ramírez <http://enrique-ramirez.com/>
*/
/* Imports */
@import url("reset.css");
@import url("pygment.css");
@import url("typogrify.css");
@import url("fonts.css");
/***** Global *****/
/* Body */
body * {
box-sizing: border-box;
}
body {
background: #000; /*#FFF;*/
color: #FFF;
/*font-size: 87.5%; /* Base font size: 14px ***
font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;*/
font-size:18px;
font-family: 'Typo';
line-height: 1.429;
margin: 0;
padding: 0;
text-align: left;
}
/* Headings */
h1 {font-size: 2em }
h2 {font-size: 1.571em} /* 22px */
h3 {font-size: 1.429em} /* 20px */
h4 {font-size: 1.286em} /* 18px */
h5 {font-size: 1.143em} /* 16px */
h6 {font-size: 1em} /* 14px */
h1, h2, h3, h4, h5, h6 {
font-weight: 400;
line-height: 1.1;
margin-bottom: .8em;
font-family: 'Typo', arial, serif;
color: #e85520;
}
h3, h4, h5, h6 { margin-top: .8em; }
hr { border: 2px solid #EEEEEE; }
/* Anchors */
a {outline: 0;}
a img {border: 0px; text-decoration: none;}
a:link, a:visited {
color: #FFF;
padding: 0 1px;
text-decoration: underline;
}
a:hover, a:active {
background-color: #000;
color: #fff;
text-decoration: none;
text-shadow: 1px 1px 1px #333;
}
h1 a:hover {
background-color: inherit
}
/* Paragraphs */
div.line-block,
p { margin-top: 1em;
margin-bottom: 1em;}
strong, b {font-weight: bold;}
em, i {font-style: italic;}
/* Lists */
ul {
list-style: outside disc;
margin: 0em 0 0 1.5em;
}
ol {
list-style: outside decimal;
margin: 0em 0 0 1.5em;
}
li { margin-top: 0.5em;}
.post-info {
float:right;
margin:10px;
padding:5px;
}
.post-info p{
margin-top: 1px;
margin-bottom: 1px;
}
.readmore { float: right }
dl {margin: 0 0 1.5em 0;}
dt {font-weight: bold;}
dd {margin-left: 1.5em;}
pre{ padding: 10px; margin: 10px; overflow: auto;}
/* Quotes */
blockquote {
margin: 20px;
font-style: italic;
}
cite {}
q {}
div.note {
float: right;
margin: 5px;
font-size: 85%;
max-width: 300px;
}
.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
/* Tables */
table {margin: .5em auto 1.5em auto; width: 98%;}
/* Thead */
thead th {padding: .5em .4em; text-align: left;}
thead td {}
/* Tbody */
tbody td {padding: .5em .4em;}
tbody th {}
tbody .alt td {}
tbody .alt th {}
/* Tfoot */
tfoot th {}
tfoot td {}
/* HTML5 tags */
header, section,
aside, nav, article, figure {
display: block;
}
footer {display:none}
/***** Layout *****/
.body {clear: both; margin: 0 auto; width: 100%;}
img.right, figure.right {float: right; margin: 0 0 2em 2em;}
img.left, figure.left {float: left; margin: 0 2em 2em 0;}
/*
Header
*****************/
#banner {
margin: 0 auto;
padding: 2.5em 0 0 0;
display: flex;
flex-direction: column;
align-items: center;
}
/* Banner */
#banner h1 {font-size: 3.571em; line-height: 1;}
#banner h1 a:link, #banner h1 a:visited {
color: #e85520;
display: block;
font-weight: bold;
margin: 0 0 .6em .2em;
text-decoration: none;
}
#banner h1 a:hover, #banner h1 a:active {
background: none;
color: #FFF;
text-shadow: none;
}
#banner h1 strong {font-size: 0.36em; font-weight: normal;}
/* Main Nav */
#banner nav {
background: #000;
font-size: 1.143em;
height: 40px;
line-height: 30px;
margin: 0 auto 2em auto;
padding: 0;
text-align: center;
width: 100%;
}
#banner nav ul {list-style: none; margin: 0 auto; width: 100%;display: flex;justify-content: center;flex-wrap:wrap;}
#banner nav li {float: left; display: inline; margin: 0;}
#banner nav a:link, #banner nav a:visited {
color: #FFF;
display: inline-block;
height: 40px;
padding: 5px 1.5em;
text-decoration: none;
border:0;
position:relative;
text-transform:uppercase;
font-family: 'Typo';
}
#banner nav a:hover, #banner nav a:active,
#banner nav .active a:link, #banner nav .active a:visited {
background: transparent;
color: #FFF;
text-shadow: none !important;
}
#banner nav a:before {
transition: width ease-in 0.3s;
content: "";
background: #e85520;
width: 0px;
height: 2px;
position: absolute;
top: 35px;
z-index: 1000;
left: 50%;
margin-left: -25px;
}
#banner nav a:hover:before, #banner nav .active a:before {
width:50px;
}
/*
Featured
*****************/
#featured {
margin-bottom: 2em;
overflow: hidden;
padding: 20px;
width: 760px;
}
#featured figure {
border: 2px solid #eee;
float: right;
margin: 0.786em 2em 0 5em;
width: 248px;
}
#featured figure img {display: block; float: right;}
#featured h2 {color: #C74451; font-size: 1.714em; margin-bottom: 0.333em;}
#featured h3 {font-size: 1.429em; margin-bottom: .5em;}
#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;}
#featured h3 a:hover, #featured h3 a:active {color: #fff;}
/*
Body
*****************/
#content {
background: #000;
margin-bottom: 2em;
overflow: hidden;
padding: 20px 20px;
max-width: 1200px;
font-family:Arial;
border-radius: 10px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
}
/*
Extras
*****************/
#extras {margin: 0 auto 3em auto; overflow: hidden;}
#extras ul {list-style: none; margin: 0;}
#extras li {border-bottom: 1px solid #fff;}
#extras h2 {
color: #C74350;
font-size: 1.429em;
margin-bottom: .25em;
padding: 0 3px;
}
#extras a:link, #extras a:visited {
color: #444;
display: block;
border-bottom: 1px solid #F4E3E3;
text-decoration: none;
padding: .3em .25em;
}
#extras a:hover, #extras a:active {color: #fff;}
/* Blogroll */
#extras .blogroll {
float: left;
width: 615px;
}
#extras .blogroll li {float: left; margin: 0 20px 0 0; width: 185px;}
/* Social */
#extras .social {
float: right;
width: 175px;
}
#extras div[class='social'] a {
background-repeat: no-repeat;
background-position: 3px 6px;
padding-left: 25px;
}
/*
About
*****************/
#about {
background: #fff;
font-style: normal;
margin-bottom: 2em;
overflow: hidden;
padding: 20px;
text-align: left;
width: 760px;
border-radius: 10px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
}
#about .primary {float: left; width: 165px;}
#about .primary strong {color: #C64350; display: block; font-size: 1.286em;}
#about .photo {float: left; margin: 5px 20px;}
#about .url:link, #about .url:visited {text-decoration: none;}
#about .bio {float: right; width: 500px;}
/*
Footer
*****************/
#contentinfo {padding-bottom: 2em; text-align: right;}
/***** Sections *****/
/* Blog */
.hentry {
display: block;
clear: both;
border-bottom: 1px solid #eee;
padding: 1.5em 0;
}
li:last-child .hentry, #content > .hentry {border: 0; margin: 0;}
#content > .hentry {padding: 1em 0;}
.hentry img{display : none ;}
.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;}
.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #ccc;}
.entry-title a:visited {background-color: #fff;}
.news article .entry-content { font-family: Arial; }
.hentry .post-info * {font-style: normal;}
/* Content */
.hentry footer {margin-bottom: 2em;}
.hentry footer address {display: inline;}
#posts-list footer address {display: block;}
/* Blog Index */
#posts-list {list-style: none; margin: 0;}
#posts-list .hentry {padding-left: 10px; position: relative;}
#posts-list footer {
left: 10px;
position: relative;
float: left;
top: 0.5em;
width: 190px;
}
/* About the Author */
#about-author {
background: #f9f9f9;
clear: both;
font-style: normal;
margin: 2em 0;
padding: 10px 20px 15px 20px;
border-radius: 5px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
}
#about-author strong {
color: #C64350;
clear: both;
display: block;
font-size: 1.429em;
}
#about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;}
/* Comments */
#comments-list {list-style: none; margin: 0 1em;}
#comments-list blockquote {
background: #f8f8f8;
clear: both;
font-style: normal;
margin: 0;
padding: 15px 20px;
border-radius: 5px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
}
#comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;}
#comments-list li:nth-child(2n) blockquote {background: #F5f5f5;}
/* Add a Comment */
#add-comment label {clear: left; float: left; text-align: left; width: 150px;}
#add-comment input[type='text'],
#add-comment input[type='email'],
#add-comment input[type='url'] {float: left; width: 200px;}
#add-comment textarea {float: left; height: 150px; width: 495px;}
#add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;}
#add-comment input[type='submit'] {float: right; margin: 0 .5em;}
#add-comment * {margin-bottom: .5em;}
@media screen and (max-width:767px) {
h4 {font-size:1.1em;}
#banner h1 a:link, #banner h1 a:visited {
font-size:30px;
text-align:center;
}
#banner nav {
height:auto;
}
.entry-title {
font-size:1.8em;
}
}

View file

@ -0,0 +1,205 @@
.hll {
background-color:#eee;
}
.c {
color:#408090;
font-style:italic;
}
.err {
border:1px solid #FF0000;
}
.k {
color:#007020;
font-weight:bold;
}
.o {
color:#666666;
}
.cm {
color:#408090;
font-style:italic;
}
.cp {
color:#007020;
}
.c1 {
color:#408090;
font-style:italic;
}
.cs {
background-color:#FFF0F0;
color:#408090;
}
.gd {
color:#A00000;
}
.ge {
font-style:italic;
}
.gr {
color:#FF0000;
}
.gh {
color:#000080;
font-weight:bold;
}
.gi {
color:#00A000;
}
.go {
color:#303030;
}
.gp {
color:#C65D09;
font-weight:bold;
}
.gs {
font-weight:bold;
}
.gu {
color:#800080;
font-weight:bold;
}
.gt {
color:#0040D0;
}
.kc {
color:#007020;
font-weight:bold;
}
.kd {
color:#007020;
font-weight:bold;
}
.kn {
color:#007020;
font-weight:bold;
}
.kp {
color:#007020;
}
.kr {
color:#007020;
font-weight:bold;
}
.kt {
color:#902000;
}
.m {
color:#208050;
}
.s {
color:#4070A0;
}
.na {
color:#4070A0;
}
.nb {
color:#007020;
}
.nc {
color:#0E84B5;
font-weight:bold;
}
.no {
color:#60ADD5;
}
.nd {
color:#555555;
font-weight:bold;
}
.ni {
color:#D55537;
font-weight:bold;
}
.ne {
color:#007020;
}
.nf {
color:#06287E;
}
.nl {
color:#002070;
font-weight:bold;
}
.nn {
color:#0E84B5;
font-weight:bold;
}
.nt {
color:#062873;
font-weight:bold;
}
.nv {
color:#BB60D5;
}
.ow {
color:#007020;
font-weight:bold;
}
.w {
color:#BBBBBB;
}
.mf {
color:#208050;
}
.mh {
color:#208050;
}
.mi {
color:#208050;
}
.mo {
color:#208050;
}
.sb {
color:#4070A0;
}
.sc {
color:#4070A0;
}
.sd {
color:#4070A0;
font-style:italic;
}
.s2 {
color:#4070A0;
}
.se {
color:#4070A0;
font-weight:bold;
}
.sh {
color:#4070A0;
}
.si {
color:#70A0D0;
font-style:italic;
}
.sx {
color:#C65D09;
}
.sr {
color:#235388;
}
.s1 {
color:#4070A0;
}
.ss {
color:#517918;
}
.bp {
color:#007020;
}
.vc {
color:#BB60D5;
}
.vg {
color:#BB60D5;
}
.vi {
color:#BB60D5;
}
.il {
color:#208050;
}

View file

@ -0,0 +1,52 @@
/*
Name: Reset Stylesheet
Description: Resets browser's default CSS
Author: Eric Meyer
Author URI: http://meyerweb.com/eric/tools/css/reset/
*/
/* v1.0 | 20080212 */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
background: transparent;
border: 0;
font-size: 100%;
margin: 0;
outline: 0;
padding: 0;
vertical-align: baseline;
}
body {line-height: 1;}
ol, ul {list-style: none;}
blockquote, q {quotes: none;}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
/* remember to define focus styles! */
:focus {
outline: 0;
}
/* remember to highlight inserts somehow! */
ins {text-decoration: none;}
del {text-decoration: line-through;}
/* tables still need 'cellspacing="0"' in the markup */
table {
border-collapse: collapse;
border-spacing: 0;
}

View file

@ -0,0 +1,3 @@
.caps {font-size:.92em;}
.amp {color:#666; font-size:1.05em;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua",serif; font-style:italic;}
.dquo {margin-left:-.38em;}

View file

@ -0,0 +1,48 @@
@import url("main.css");
body {
font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif;
}
.post-info{
display: none;
}
#banner nav {
display: none;
-moz-border-radius: 0px;
margin-bottom: 20px;
overflow: hidden;
font-size: 1em;
background: #F5F4EF;
}
#banner nav ul{
padding-right: 50px;
}
#banner nav li{
float: right;
color: #000;
}
#banner nav li a {
color: #000;
}
#banner h1 {
margin-bottom: -18px;
}
#featured, #extras {
padding: 50px;
}
#featured {
padding-top: 20px;
}
#extras {
padding-top: 0px;
padding-bottom: 0px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

View file

@ -0,0 +1,19 @@
{% if PIWIK_URL and PIWIK_SITE_ID %}
<script type="text/javascript">
{% if PIWIK_SSL_URL %}
var pkBaseURL = "{{ PIWIK_SSL_URL }}";
{% else %}
var pkBaseURL = "{{ PIWIK_URL }}";
{% endif %}
var _paq = _paq || [];
_paq.push(["trackPageView"]);
_paq.push(["enableLinkTracking"]);
(function() {
var u=(("https:" == document.location.protocol) ? "https" : "http")+"://"+pkBaseURL+"/";
_paq.push(["setTrackerUrl", u+"piwik.php"]);
_paq.push(["setSiteId", "{{ PIWIK_SITE_ID }}"]);
var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0]; g.type="text/javascript";
g.defer=true; g.async=true; g.src=u+"piwik.js"; s.parentNode.insertBefore(g,s);
})();
</script>
{% endif %}

View file

@ -0,0 +1,13 @@
{% extends "base.html" %}
{% block content %}
<section id="content" class="body">
<h1>Archives for {{ SITENAME }}</h1>
<dl>
{% for article in dates %}
<dt>{{ article.locale_date }}</dt>
<dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
{% endfor %}
</dl>
</section>
{% endblock %}

View file

@ -0,0 +1,45 @@
{% extends "base.html" %}
{% block html_lang %}{{ article.lang }}{% endblock %}
{% block title %}{{ article.title|striptags }}{% endblock %}
{% block extra_head %}
{% import 'translations.html' as translations with context %}
{% if translations.entry_hreflang(article) %}
{{ translations.entry_hreflang(article) }}
{% endif %}
{% endblock %}
{% block content %}
<section id="content" class="body">
<article>
<header>
<h1 class="entry-title">
<a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark"
title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h1>
</header>
<div class="entry-content">
{% include 'article_infos.html' %}
{{ article.content }}
</div><!-- /.entry-content -->
{% if DISQUS_SITENAME and SITEURL and article.status != "draft" %}
<div class="comments">
<h2>Comments !</h2>
<div id="disqus_thread"></div>
<script type="text/javascript">
var disqus_shortname = '{{ DISQUS_SITENAME }}';
var disqus_identifier = '{{ article.url }}';
var disqus_url = '{{ SITEURL }}/{{ article.url }}';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//{{ DISQUS_SITENAME }}.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the comments.</noscript>
</div>
{% endif %}
</article>
</section>
{% endblock %}

View file

@ -0,0 +1,23 @@
<footer class="post-info">
<abbr class="published" title="{{ article.date.isoformat() }}">
Published: {{ article.locale_date }}
</abbr>
{% if article.modified %}
<br />
<abbr class="modified" title="{{ article.modified.isoformat() }}">
Updated: {{ article.locale_modified }}
</abbr>
{% endif %}
{% if article.authors %}
<address class="vcard author">
By {% for author in article.authors %}
<a class="url fn" href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a>
{% endfor %}
</address>
{% endif %}
<p>In <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>.</p>
{% include 'taglist.html' %}
{% import 'translations.html' as translations with context %}
{{ translations.translations_for(article) }}
</footer><!-- /.post-info -->

View file

@ -0,0 +1,2 @@
{% extends "index.html" %}
{% block title %}{{ SITENAME }} - {{ author }}{% endblock %}

View file

@ -0,0 +1,16 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - Authors{% endblock %}
{% block content %}
<section id="content" class="body">
<h1>Authors on {{ SITENAME }}</h1>
<ul>
{% for author, articles in authors|sort %}
<li><a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a> ({{ articles|count }})</li>
{% endfor %}
</ul>
</section>
{% endblock %}

View file

@ -0,0 +1,73 @@
<!DOCTYPE html>
<html lang="{% block html_lang %}{{ DEFAULT_LANG }}{% endblock html_lang %}">
<head>
<meta charset="utf-8" />
<title>{% block title %}{{ SITENAME }}{%endblock%}</title>
<link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/{{ CSS_FILE }}" />
{% if FAVICON %}
<link href="{{ SITEURL }}/{{ FAVICON }}" rel="icon">
{% endif %}
{% if FEED_ALL_ATOM %}
<link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}{% else %}{{ FEED_ALL_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Atom Feed" />
{% endif %}
{% if FEED_ALL_RSS %}
<link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} RSS Feed" />
{% endif %}
{% block extra_head %}{% endblock extra_head %}
</head>
<body id="index" class="home">
<header id="banner" class="body">
<h1><a href="{{ SITEURL }}/">{{ SITENAME }} {% if SITESUBTITLE %}<strong>{{ SITESUBTITLE }}</strong>{% endif %}</a></h1>
<nav><ul>
{% for title, link in MENUITEMS %}
<li><a href="{{ link }}">{{ title }}</a></li>
{% endfor %}
{% if DISPLAY_PAGES_ON_MENU -%}
{% for pg in pages %}
<li{% if pg == page %} class="active"{% endif %}><a href="{{ SITEURL }}/{{ pg.url }}">{{ pg.title }}</a></li>
{% endfor %}
{% endif %}
{% if DISPLAY_CATEGORIES_ON_MENU -%}
{% for cat, null in categories %}
<li{% if cat == category %} class="active"{% endif %}><a href="{{ SITEURL }}/{{ cat.url }}">{{ cat }}</a></li>
{% endfor %}
{% endif %}
</ul></nav>
</header><!-- /#banner -->
{% block content %}
{% endblock %}
<section id="extras" class="body">
{% if LINKS %}
<div class="blogroll">
<h2>{{ LINKS_WIDGET_NAME | default('links') }}</h2>
<ul>
{% for name, link in LINKS %}
<li><a href="{{ link }}">{{ name }}</a></li>
{% endfor %}
</ul>
</div><!-- /.blogroll -->
{% endif %}
{% if FEED_ALL_ATOM or FEED_ALL_RSS %}
<div class="social">
{% if FEED_ALL_ATOM %}
<div>
<a href="{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}
{% else %}{{
FEED_ALL_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate">atom
feed</a></div>
{% endif %}
{% if FEED_ALL_RSS %}
<div><a href="{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}
{% else %}{{ FEED_ALL_RSS }}{% endif %}" type="application/rss+xml" rel="alternate">rss feed</a></div>
{% endif %}
</div><!-- /.social -->
{% endif %}
</section><!-- /#extras -->
<footer id="contentinfo" class="body">
</footer><!-- /#contentinfo -->
</body>
</html>

View file

@ -0,0 +1,2 @@
{% extends "index.html" %}
{% block title %}{{ SITENAME }} - {{ category }}{% endblock %}

View file

View file

@ -0,0 +1,37 @@
{% extends "base.html" %}
{% block content_title %}{% endblock %}
{% block content %}
<div class="news">
{% if articles %}
{% for article in articles_page.object_list %}
{% if loop.first %}
<section id="content" class="body">
<ol id="posts-list" class="hfeed" start="{{ articles_paginator.per_page -1 }}">
{% endif %}
<li><article class="hentry">
<header>
<h1><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark"
title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h1>
</header>
<div class="entry-content">
{% include 'article_infos.html' %}
{{ article.summary }}
<a class="readmore" href="{{ SITEURL }}/{{ article.url }}">read more</a>
{% include 'comments.html' %}
</div><!-- /.entry-content -->
</article></li>
{% if loop.last %}
{% if loop.length > 1 or articles_page.has_other_pages() %}
</ol><!-- /#posts-list -->
{% if articles_page.has_other_pages() %}
{% include 'pagination.html' %}
{% endif %}
</section><!-- /#content -->
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
</div>
{% endblock content %}

View file

@ -0,0 +1,19 @@
{% extends "base.html" %}
{% block html_lang %}{{ page.lang }}{% endblock %}
{% block title %}{{ page.title }}{% endblock %}
{% block extra_head %}
{% import 'translations.html' as translations with context %}
{% if translations.entry_hreflang(page) %}
{{ translations.entry_hreflang(page) }}
{% endif %}
{% endblock %}
{% block content %}
<section id="content" class="body">
<h1 class="entry-title">{{ page.title }}</h1>
{% import 'translations.html' as translations with context %}
{{ translations.translations_for(page) }}
{{ page.content }}
</section>
{% endblock %}

View file

@ -0,0 +1,13 @@
{% extends "base.html" %}
{% block content %}
<section id="content" class="body">
<h1>Archives for {{ period | reverse | join(' ') }}</h1>
<dl>
{% for article in dates %}
<dt>{{ article.locale_date }}</dt>
<dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
{% endfor %}
</dl>
</section>
{% endblock %}

View file

@ -0,0 +1,2 @@
{% extends "index.html" %}
{% block title %}{{ SITENAME }} - {{ tag }}{% endblock %}

View file

@ -0,0 +1 @@
{% if article.tags %}<p>tags: {% for tag in article.tags %}<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag | escape }}</a> {% endfor %}</p>{% endif %}

View file

@ -0,0 +1,16 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - Tags{% endblock %}
{% block content %}
<section id="content" class="body">
<h1>Tags for {{ SITENAME }}</h1>
<ul>
{% for tag, articles in tags|sort %}
<li><a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> ({{ articles|count }})</li>
{% endfor %}
</ul>
</section>
{% endblock %}

View file

@ -0,0 +1,18 @@
{% macro translations_for(article) %}
{% if article.translations %}
<div class="translations-available">
Translations:
{% for translation in article.translations %}
<a href="{{ SITEURL }}/{{ translation.url }}" hreflang="{{ translation.lang }}">{{ translation.lang }}</a>
{% endfor %}
</div>
{% endif %}
{% endmacro %}
{% macro entry_hreflang(entry) %}
{% if entry.translations %}
{% for translation in entry.translations %}
<link rel="alternate" hreflang="{{ translation.lang }}" href="{{ SITEURL }}/{{ translation.url }}">
{% endfor %}
{% endif %}
{% endmacro %}

View file

View file

@ -0,0 +1,78 @@
/* pulse {{{ */
.pulse {
border-radius: 50%;
cursor: pointer;
box-shadow: 0 0 0 rgba(255,255,255, 0);
}
.pulse:hover {
animation: none;
}
@-webkit-keyframes pulse {
0% {
-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
}
17% {
-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
}
20% {
-webkit-box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
}
23% {
-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
}
26% {
-webkit-box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
}
29% {
-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
}
100% {
-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
}
}
@keyframes pulse {
0% {
-moz-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
}
17% {
-moz-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
}
20% {
-moz-box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
}
23% {
-moz-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
}
26% {
-moz-box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
}
29% {
-moz-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
}
100% {
-moz-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
}
}
/* pulse }}} */
/* rotate {{{ */
.rotate {
animation: rotation 1s infinite ease-out;
}
@keyframes rotation {
from {
transform: rotate(0deg);
}
to {
transform: rotate(1440deg);
}
}
/* rotate }}} */

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,698 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata>
Created by FontForge 20200427 at Fri Oct 27 00:40:41 2017
By www
Copyright (c) 2016 by Chris Simpson.
</metadata>
<defs>
<font id="Metropolis-Regular" horiz-adv-x="1212" >
<font-face
font-family="Metropolis"
font-weight="400"
font-stretch="normal"
units-per-em="2048"
panose-1="0 0 5 0 0 0 0 0 0 0"
ascent="1628"
descent="-420"
x-height="1059"
cap-height="1407"
bbox="-117 -393 2138 1976"
underline-thickness="40"
underline-position="-472"
unicode-range="U+0020-25FC"
/>
<missing-glyph horiz-adv-x="748"
d="M68 0v1365h544v-1365h-544zM136 68h408v1229h-408v-1229z" />
<glyph glyph-name=".notdef" horiz-adv-x="748"
d="M68 0v1365h544v-1365h-544zM136 68h408v1229h-408v-1229z" />
<glyph glyph-name="glyph1" horiz-adv-x="0"
/>
<glyph glyph-name="glyph2" horiz-adv-x="682"
/>
<glyph glyph-name="space" unicode=" " horiz-adv-x="593"
/>
<glyph glyph-name="exclam" unicode="!" horiz-adv-x="559"
d="M170 88q0 43 33 76t80 33q44 0 76 -33t32 -76q0 -46 -32 -79.5t-76 -33.5q-47 0 -80 33.5t-33 79.5zM190 1407h189l-41 -1012h-109z" />
<glyph glyph-name="quotedbl" unicode="&#x22;" horiz-adv-x="847"
d="M145 1288q0 38 28.5 66t66.5 28t66 -28t28 -66q0 -46 -7.5 -113.5t-23 -171t-18.5 -124.5h-90q-4 26 -19 126t-23 168.5t-8 114.5zM514 1288q0 38 28 66t66 28t66 -28t28 -66q0 -46 -7.5 -113.5t-23 -171t-18.5 -124.5h-90q-3 21 -18.5 124.5t-23 171t-7.5 113.5z" />
<glyph glyph-name="numbersign" unicode="#" horiz-adv-x="1380"
d="M80 367l31 125h231l107 421h-234l31 125h235l92 369h136l-93 -369h308l92 369h135l-92 -369h239l-30 -125h-242l-106 -421h241l-31 -125h-241l-92 -367h-135l92 367h-308l-92 -367h-135l92 367h-231zM477 492h307l107 421h-307z" />
<glyph glyph-name="dollar" unicode="$" horiz-adv-x="1255"
d="M94 201l101 125q157 -157 346 -193v518q-98 25 -167 55t-123.5 74t-81 106.5t-26.5 145.5q0 153 112 264.5t286 133.5v124h159v-124q223 -27 408 -197l-98 -125q-148 141 -310 170v-492q83 -20 146.5 -42.5t122 -56t95.5 -75t59 -99.5t22 -130q0 -165 -116 -277.5
t-329 -125.5v-132h-159v136q-260 33 -447 217zM305 1044q0 -81 58 -130t178 -85v453q-104 -19 -170 -86t-66 -152zM700 125q134 10 208.5 80t74.5 164q0 92 -68.5 146t-214.5 95v-485z" />
<glyph glyph-name="percent" unicode="%" horiz-adv-x="1630"
d="M96 1063q0 153 93 254.5t235 101.5q144 0 235 -101.5t91 -250.5q0 -151 -92.5 -251.5t-235.5 -100.5t-234.5 101t-91.5 247zM225 1065q0 -101 57 -170.5t142 -69.5q86 0 141.5 68.5t55.5 171.5q0 105 -56.5 174.5t-142.5 69.5t-141.5 -69t-55.5 -175zM268 0l963 1407h135
l-963 -1407h-135zM879 332q0 148 91.5 250t235.5 102q143 0 234.5 -102t91.5 -248q0 -151 -93 -252.5t-235 -101.5q-141 0 -233 100.5t-92 251.5zM1008 334q0 -105 55.5 -174.5t142.5 -69.5t142 68.5t55 173.5q0 103 -56.5 172t-142.5 69t-141 -69t-55 -170z" />
<glyph glyph-name="ampersand" unicode="&#x26;" horiz-adv-x="1372"
d="M84 373q0 269 322 411q-119 165 -119 310q0 140 101 234.5t257 94.5q140 0 236 -96t96 -229q0 -68 -24.5 -122t-73.5 -96t-106 -73t-140 -64q122 -144 321 -352q98 148 160 316l133 -60q-101 -224 -194 -356l233 -238l-145 -67l-185 186q-190 -197 -430 -197
q-192 0 -317 108.5t-125 289.5zM238 377q0 -121 84.5 -192.5t209.5 -71.5q177 0 326 159q-240 249 -373 410q-247 -115 -247 -305zM440 1094q0 -112 111 -252q148 58 210 112.5t62 139.5q0 82 -50.5 137t-127.5 55q-90 0 -147.5 -51.5t-57.5 -140.5z" />
<glyph glyph-name="quotesingle" unicode="'" horiz-adv-x="479"
d="M145 1288q0 38 28.5 66t66.5 28t66 -28t28 -66q0 -46 -7.5 -113.5t-23 -171t-18.5 -124.5h-90q-4 26 -19 126t-23 168.5t-8 114.5z" />
<glyph glyph-name="parenleft" unicode="(" horiz-adv-x="731"
d="M127 543q0 263 110.5 490.5t317.5 400.5l82 -86q-174 -179 -260 -370.5t-86 -434.5q0 -242 86 -434t260 -369l-82 -88q-207 173 -317.5 401t-110.5 490z" />
<glyph glyph-name="parenright" unicode=")" horiz-adv-x="731"
d="M94 -260q174 177 260 369t86 434q0 243 -86 434.5t-260 370.5l82 86q207 -173 317.5 -400.5t110.5 -490.5q0 -262 -110.5 -490t-317.5 -401z" />
<glyph glyph-name="asterisk" unicode="*" horiz-adv-x="837"
d="M123.5 976q4.5 19 19.5 28q43 25 131.5 58.5t106.5 41.5q-18 8 -106.5 41.5t-131.5 58.5q-15 9 -19.5 28t5.5 38q10 18 30.5 24.5t35.5 -2.5q43 -25 114 -83t90 -72q-2 14 -17 109.5t-15 146.5q0 19 14.5 32t36.5 13t36.5 -13t14.5 -32q0 -51 -15.5 -145t-17.5 -111
q18 13 90 71.5t115 83.5q15 9 35.5 2.5t30.5 -24.5q10 -19 5 -38t-20 -28q-43 -25 -131.5 -59t-105.5 -41q17 -7 105.5 -41t131.5 -59q15 -9 20 -28t-5 -38t-30.5 -25.5t-35.5 2.5q-43 25 -114 83.5t-91 72.5q2 -17 17.5 -111t15.5 -145q0 -19 -14.5 -32t-36.5 -13t-36.5 13
t-14.5 32q0 51 15 146.5t17 109.5q-20 -15 -90.5 -73t-113.5 -83q-15 -9 -35.5 -2.5t-30.5 25.5t-5.5 38z" />
<glyph glyph-name="plus" unicode="+" horiz-adv-x="1214"
d="M137 608v152h393v395h154v-395h393v-152h-393v-393h-154v393h-393z" />
<glyph glyph-name="comma" unicode="," horiz-adv-x="540"
d="M158 88q0 44 32 76.5t80 32.5q57 0 91 -46t34 -118q0 -62 -33 -126.5t-124 -178.5l-76 57q81 93 106 190q-45 0 -77.5 33.5t-32.5 79.5z" />
<glyph glyph-name="hyphen" unicode="-" horiz-adv-x="759"
d="M115 481v150h530v-150h-530z" />
<glyph glyph-name="period" unicode="." horiz-adv-x="518"
d="M150 88q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5z" />
<glyph glyph-name="slash" unicode="/" horiz-adv-x="849"
d="M-33 -152l719 1674h174l-719 -1674h-174z" />
<glyph glyph-name="zero" unicode="0" horiz-adv-x="1411"
d="M121 705q0 211 74.5 376.5t208 258t303.5 92.5q169 0 302 -92.5t207 -258.5t74 -376q0 -211 -74 -378t-207 -259.5t-302 -92.5q-170 0 -303.5 92.5t-208 259.5t-74.5 378zM283 705q0 -255 119 -418.5t305 -163.5q122 0 218.5 74t149.5 207t53 301q0 255 -117.5 417
t-303.5 162t-305 -162t-119 -417z" />
<glyph glyph-name="one" unicode="1" horiz-adv-x="722"
d="M53 1171l346 236h129v-1407h-159v1212l-246 -159z" />
<glyph glyph-name="two" unicode="2" horiz-adv-x="1206"
d="M100 0v133l514 438q148 126 214.5 233t66.5 212q0 123 -87 197.5t-206 74.5q-217 0 -377 -219l-112 92q191 271 495 271q188 0 318.5 -115t130.5 -299q0 -142 -76.5 -267.5t-255.5 -279.5l-369 -319h715v-152h-971z" />
<glyph glyph-name="three" unicode="3" horiz-adv-x="1200"
d="M82 217l111 105q72 -93 174.5 -147t226.5 -54q148 0 238 74t90 194q0 122 -97 186t-266 64h-149v147l151 -2q145 -2 237.5 64.5t92.5 183.5q0 110 -89 182t-222 72q-111 0 -199 -51t-168 -148l-107 97q186 248 482 248q202 0 333.5 -106.5t131.5 -274.5q0 -127 -77 -211
t-196 -119q57 -13 108 -39t96.5 -66.5t72 -101t26.5 -133.5q0 -178 -135.5 -292t-353.5 -114q-165 0 -297.5 67t-214.5 175z" />
<glyph glyph-name="four" unicode="4" horiz-adv-x="1275"
d="M82 475l698 932h185v-920h211v-145h-211v-342h-160v342h-703zM264 487h541v727z" />
<glyph glyph-name="five" unicode="5" horiz-adv-x="1226"
d="M115 199l104 116q180 -196 397 -196q145 0 238.5 89t93.5 224t-94 219t-242 84q-169 0 -313 -108l-117 57l21 723h831v-152h-676l-14 -473q142 95 301 95q96 0 180 -30t147.5 -84.5t100.5 -138.5t37 -186q0 -207 -140.5 -335t-359.5 -128q-298 0 -495 224z" />
<glyph glyph-name="six" unicode="6" horiz-adv-x="1275"
d="M123 682q0 155 44.5 294t120 239t181 158.5t223.5 58.5q225 0 400 -168l-88 -125q-73 72 -147 109.5t-169 37.5q-111 0 -203.5 -80t-146 -219t-53.5 -305v-18q65 102 169 158.5t228 56.5q130 0 235.5 -50.5t170.5 -152t65 -236.5q0 -198 -139.5 -331.5t-356.5 -133.5
q-139 0 -243.5 54t-167 151.5t-93 223t-30.5 278.5zM303 479q32 -168 121 -267t231 -99q101 0 179.5 47.5t117.5 119.5t39 152q0 141 -96.5 225t-241.5 84q-133 0 -228.5 -72t-121.5 -190z" />
<glyph glyph-name="seven" unicode="7" horiz-adv-x="1228"
d="M121 1255v152h952v-121l-606 -1286h-184l600 1255h-762z" />
<glyph glyph-name="eight" unicode="8" horiz-adv-x="1241"
d="M106 369q0 126 87.5 220t224.5 138q-127 48 -201 132t-74 200q0 85 40.5 156.5t107.5 118t152.5 72.5t177.5 26q127 0 235.5 -44.5t176 -131.5t67.5 -199q0 -120 -77 -203t-198 -127q136 -46 223 -139t87 -219q0 -117 -68.5 -207.5t-185 -138.5t-260.5 -48
q-145 0 -262 48.5t-185 138.5t-68 207zM268 379q0 -114 102 -186t251 -72t250.5 72t101.5 186q0 61 -34 113.5t-87 85.5t-113.5 52t-117.5 21q-56 -2 -116.5 -21t-114 -52t-88 -85.5t-34.5 -113.5zM305 1042q0 -58 30 -106.5t78.5 -78t101.5 -46.5t106 -20q54 3 108 20.5
t101.5 47.5t77.5 78t30 105q0 105 -92 174.5t-225 69.5t-224.5 -69.5t-91.5 -174.5z" />
<glyph glyph-name="nine" unicode="9" horiz-adv-x="1275"
d="M123 967q0 198 139 331.5t356 133.5q139 0 243.5 -54t167.5 -151.5t93.5 -223t30.5 -278.5q0 -155 -44.5 -294t-120 -239t-181 -158.5t-223.5 -58.5q-225 0 -400 168l88 125q73 -72 147 -109.5t169 -37.5q111 0 203.5 80t146 219t53.5 305v18q-65 -102 -169 -158.5
t-228 -56.5q-130 0 -235.5 50.5t-170.5 152t-65 236.5zM285 975q0 -141 96.5 -225t241.5 -84q133 0 228.5 72t121.5 190q-32 168 -121 267t-231 99q-101 0 -179.5 -47.5t-117.5 -119.5t-39 -152z" />
<glyph glyph-name="colon" unicode=":" horiz-adv-x="518"
d="M150 88q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5zM150 938q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5z" />
<glyph glyph-name="semicolon" unicode=";" horiz-adv-x="540"
d="M158 88q0 44 32 76.5t80 32.5q57 0 91 -46t34 -118q0 -62 -33 -126.5t-124 -178.5l-76 57q81 93 106 190q-45 0 -77.5 33.5t-32.5 79.5zM158 938q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5z" />
<glyph glyph-name="less" unicode="&#x3c;" horiz-adv-x="1200"
d="M113 643v121l931 463v-144l-780 -378l780 -379v-146z" />
<glyph glyph-name="equal" unicode="=" horiz-adv-x="1214"
d="M137 383v152h940v-152h-940zM137 834v151h940v-151h-940z" />
<glyph glyph-name="greater" unicode="&#x3e;" horiz-adv-x="1200"
d="M156 180v146l780 379l-780 378v144l931 -463v-121z" />
<glyph glyph-name="question" unicode="?" horiz-adv-x="1038"
d="M55 1196q191 236 463 236q191 0 310.5 -107.5t119.5 -267.5q0 -137 -114.5 -249.5t-294.5 -150.5v-262h-162v383q179 15 294 89.5t115 174.5q0 99 -76 171.5t-200 72.5q-108 0 -191.5 -51t-158.5 -143zM346 88q0 43 33 76t80 33q44 0 76 -33t32 -76q0 -46 -32 -79.5
t-76 -33.5q-47 0 -80 33.5t-33 79.5z" />
<glyph glyph-name="at" unicode="@" horiz-adv-x="1804"
d="M90 530q0 170 69 327.5t184 272.5t273.5 183.5t329.5 68.5q154 0 296 -59t245.5 -157t165 -233t61.5 -280q0 -120 -32 -217t-85 -155.5t-117.5 -89.5t-133.5 -31q-95 0 -157 47t-79 129q-61 -79 -146.5 -127.5t-185.5 -48.5q-149 0 -244.5 98t-95.5 256q0 104 41 200.5
t108 164t153.5 107.5t174.5 40q102 0 173 -46.5t108 -119.5l27 135l137 -10q-15 -76 -35 -179.5t-31 -159t-22.5 -115.5t-16 -92.5t-4.5 -47.5q0 -64 36.5 -99.5t98.5 -35.5q45 0 88 22.5t81 67.5t61.5 124.5t23.5 182.5q0 131 -56 252.5t-150 209.5t-223.5 141t-268.5 53
q-155 0 -298 -62.5t-247 -167t-166.5 -248.5t-62.5 -299q0 -112 36.5 -218t102.5 -192t153.5 -151t195.5 -101t221 -36q126 0 228 29t214 96l37 -55q-119 -75 -232 -108.5t-252 -33.5q-208 0 -388.5 104t-287 281.5t-106.5 382.5zM586 522q0 -109 62.5 -175t166.5 -66
q140 0 230 100.5t106 255.5q12 126 -43 197t-174 71q-141 0 -244.5 -114.5t-103.5 -268.5z" />
<glyph glyph-name="A" unicode="A" horiz-adv-x="1546"
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM446 471h654l-326 739z" />
<glyph glyph-name="B" unicode="B" horiz-adv-x="1396"
d="M193 0v1407h645q170 0 278.5 -98t108.5 -252q0 -107 -50 -178.5t-151 -130.5q123 -62 189.5 -155.5t66.5 -207.5q0 -169 -117.5 -277t-300.5 -108h-669zM352 145h469q130 0 213.5 73.5t83.5 187.5t-83.5 187t-213.5 73h-469v-521zM352 811h445q117 0 191.5 63.5
t74.5 161.5q0 99 -74.5 162.5t-191.5 63.5h-445v-451z" />
<glyph glyph-name="C" unicode="C" horiz-adv-x="1392"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 275 -56.5t231 -158.5l-108 -111q-78 84 -181.5 131t-216.5 47q-149 0 -278 -79t-205 -212.5t-76 -287.5q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47q113 0 216.5 47t181.5 131l108 -111
q-101 -101 -232 -158t-274 -57q-191 0 -357.5 99.5t-265 268t-98.5 362.5z" />
<glyph glyph-name="D" unicode="D" horiz-adv-x="1560"
d="M193 0v1407h475q220 0 394 -89t271 -249.5t97 -363.5q0 -204 -97 -364.5t-271 -250.5t-394 -90h-475zM352 145h316q264 0 432 157t168 403q0 161 -76 288t-213 198t-311 71h-316v-1117z" />
<glyph glyph-name="E" unicode="E" horiz-adv-x="1284"
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-489h847v-152h-1009z" />
<glyph glyph-name="F" unicode="F" horiz-adv-x="1247"
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-641h-162z" />
<glyph glyph-name="G" unicode="G" horiz-adv-x="1525"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q148 0 299 -58.5t248 -156.5l-108 -111q-75 80 -198 129t-241 49q-149 0 -278 -79t-205 -212.5t-76 -287.5q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47q98 0 203.5 35.5t183.5 95.5v336h-403v151h563
v-551q-97 -97 -248 -156t-299 -59q-191 0 -357.5 99.5t-265 268t-98.5 362.5z" />
<glyph glyph-name="H" unicode="H" horiz-adv-x="1472"
d="M162 0v1407h160v-614h829v614h160v-1407h-160v641h-829v-641h-160z" />
<glyph glyph-name="I" unicode="I" horiz-adv-x="483"
d="M162 0v1407h160v-1407h-160z" />
<glyph glyph-name="J" unicode="J" horiz-adv-x="1105"
d="M53 209l117 115q41 -89 129.5 -146t185.5 -57q125 0 205 94.5t80 243.5v948h160v-948q0 -212 -125 -348t-320 -136q-125 0 -246.5 65.5t-185.5 168.5z" />
<glyph glyph-name="K" unicode="K" horiz-adv-x="1351"
d="M188 0v1407h160v-778l713 778h211l-592 -643l631 -764h-207l-535 655l-221 -233v-422h-160z" />
<glyph glyph-name="L" unicode="L" horiz-adv-x="1136"
d="M139 0v1407h160v-1255h768v-152h-928z" />
<glyph glyph-name="M" unicode="M" horiz-adv-x="1748"
d="M193 0v1407h159l522 -981l523 981h159v-1407h-159v1063l-523 -981l-522 981v-1063h-159z" />
<glyph glyph-name="N" unicode="N" horiz-adv-x="1576"
d="M193 0v1407h159l873 -1145v1145h159v-1407h-159l-873 1145v-1145h-159z" />
<glyph glyph-name="O" unicode="O" horiz-adv-x="1652"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5z" />
<glyph glyph-name="P" unicode="P" horiz-adv-x="1318"
d="M162 0v1407h571q220 0 369 -127.5t149 -323.5q0 -129 -68.5 -232.5t-187 -160.5t-262.5 -57h-411v-506h-160zM322 657h383q174 0 279.5 80t105.5 219t-105.5 219t-279.5 80h-383v-598z" />
<glyph glyph-name="Q" unicode="Q" horiz-adv-x="1652"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -249 -157 -449l157 -137l-102 -119l-164 143q-202 -168 -453 -168q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186
t179 -125.5t214.5 -47q186 0 336 121l-219 190l103 119l225 -195q112 154 112 347q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5z" />
<glyph glyph-name="R" unicode="R" horiz-adv-x="1331"
d="M162 0v1407h571q220 0 369 -127.5t149 -323.5q0 -163 -106.5 -281.5t-276.5 -154.5l365 -520h-182l-357 506h-372v-506h-160zM322 657h383q174 0 279.5 80t105.5 219t-105.5 219t-279.5 80h-383v-598z" />
<glyph glyph-name="S" unicode="S" horiz-adv-x="1255"
d="M94 201l101 125q203 -203 460 -203q155 0 241.5 72t86.5 174q0 106 -89.5 163t-289.5 103q-91 21 -157.5 43t-126.5 54.5t-97 73t-58.5 97.5t-21.5 129q0 170 135 286t336 116q276 0 494 -201l-98 -125q-186 180 -404 180q-128 0 -214.5 -72.5t-86.5 -171.5
q0 -43 17.5 -77t46 -58.5t79.5 -46t103.5 -37t132.5 -34.5q109 -26 186.5 -56.5t143 -77.5t98.5 -115.5t33 -158.5q0 -176 -130 -291t-366 -115q-328 0 -555 224z" />
<glyph glyph-name="T" unicode="T" horiz-adv-x="1290"
d="M92 1255v152h1106v-152h-473v-1255h-160v1255h-473z" />
<glyph glyph-name="U" unicode="U" horiz-adv-x="1527"
d="M176 584v823h160v-823q0 -203 120.5 -333t307.5 -130t307.5 130t120.5 333v823h160v-823q0 -267 -165 -438t-423 -171t-423 171t-165 438z" />
<glyph glyph-name="V" unicode="V" horiz-adv-x="1546"
d="M66 1407h174l534 -1210l533 1210h174l-621 -1407h-174z" />
<glyph glyph-name="W" unicode="W" horiz-adv-x="2213"
d="M76 1407h180l389 -1139l373 1139h178l373 -1139l389 1139h180l-481 -1407h-158l-391 1198l-393 -1198h-158z" />
<glyph glyph-name="X" unicode="X" horiz-adv-x="1427"
d="M78 0l538 702l-538 705h196l441 -576l440 576h195l-539 -702l539 -705h-197l-440 575l-441 -575h-194z" />
<glyph glyph-name="Y" unicode="Y" horiz-adv-x="1374"
d="M37 1407h199l452 -682l457 682h192l-565 -834v-573h-168v573z" />
<glyph glyph-name="Z" unicode="Z" horiz-adv-x="1308"
d="M119 0v127l848 1128h-834v152h1053v-127l-850 -1128h858v-152h-1075z" />
<glyph glyph-name="bracketleft" unicode="[" horiz-adv-x="749"
d="M166 -236v1739h483v-117h-348v-1505h348v-117h-483z" />
<glyph glyph-name="backslash" unicode="\" horiz-adv-x="849"
d="M-10 1522h174l719 -1674h-174z" />
<glyph glyph-name="bracketright" unicode="]" horiz-adv-x="749"
d="M100 -119h349v1505h-349v117h484v-1739h-484v117z" />
<glyph glyph-name="asciicircum" unicode="^" horiz-adv-x="1003"
d="M111 846l331 561h121l330 -561h-133l-258 448l-260 -448h-131z" />
<glyph glyph-name="underscore" unicode="_"
d="M-4 -154h1221v-137h-1221v137z" />
<glyph glyph-name="grave" unicode="`" horiz-adv-x="667"
d="M129 1438l162 37l248 -295h-119z" />
<glyph glyph-name="a" unicode="a" horiz-adv-x="1173"
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156z" />
<glyph glyph-name="b" unicode="b" horiz-adv-x="1306"
d="M170 0v1432h154v-572q61 106 160 164.5t225 58.5q210 0 348.5 -155.5t138.5 -397.5q0 -243 -138.5 -399t-348.5 -156q-125 0 -224.5 59t-160.5 165v-199h-154zM324 530q0 -183 99.5 -300t256.5 -117q155 0 254.5 117t99.5 300t-99.5 299.5t-254.5 116.5
q-157 0 -256.5 -116.5t-99.5 -299.5z" />
<glyph glyph-name="c" unicode="c" horiz-adv-x="1110"
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q106 0 203.5 -41t173.5 -114l-106 -105q-53 58 -123.5 90.5t-147.5 32.5q-158 0 -272.5 -123.5t-114.5 -292.5q0 -170 114.5 -293.5t272.5 -123.5q78 0 150 34t127 95l106 -105q-76 -76 -175.5 -119t-207.5 -43
q-109 0 -210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5z" />
<glyph glyph-name="d" unicode="d" horiz-adv-x="1306"
d="M111 530q0 242 138.5 397.5t348.5 155.5q126 0 225 -58.5t160 -164.5v572h154v-1432h-154v199q-61 -106 -160.5 -165t-224.5 -59q-210 0 -348.5 156t-138.5 399zM272 530q0 -183 100 -300t255 -117q157 0 256.5 117t99.5 300t-99.5 299.5t-256.5 116.5
q-155 0 -255 -116.5t-100 -299.5z" />
<glyph glyph-name="e" unicode="e" horiz-adv-x="1218"
d="M98 532q0 154 71 281t191 198.5t261 71.5q237 0 369 -165t132 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-105 0 -203 41.5t-172 114t-118 177.5t-44 224zM258 608h713q-16 150 -104 244t-240 94
q-142 0 -244.5 -93t-124.5 -245z" />
<glyph glyph-name="f" unicode="f" horiz-adv-x="718"
d="M76 922v137h166v145q0 119 72 195t186 76q109 0 196 -68l-75 -113q-40 43 -111 43q-47 0 -81 -38t-34 -95v-145h260v-137h-260v-922h-153v922h-166z" />
<glyph glyph-name="g" unicode="g" horiz-adv-x="1302"
d="M106 582q0 221 137 361t351 140q124 0 223.5 -54t161.5 -152v182h154v-946q0 -204 -146 -334.5t-375 -130.5q-126 0 -240 39t-188 102l68 121q62 -59 152 -92t188 -33q183 0 285 86.5t102 241.5v172q-62 -98 -161.5 -152.5t-223.5 -54.5q-214 0 -351 141.5t-137 362.5z
M268 582q0 -161 100 -264t255 -103q157 0 256.5 103t99.5 264q0 160 -99.5 262t-256.5 102q-155 0 -255 -102t-100 -262z" />
<glyph glyph-name="h" unicode="h"
d="M158 0v1432h153v-543q46 86 141.5 140t206.5 54q175 0 286.5 -114.5t111.5 -294.5v-674h-154v653q0 129 -73.5 211t-190.5 82q-133 0 -230.5 -81t-97.5 -191v-674h-153z" />
<glyph glyph-name="i" unicode="i" horiz-adv-x="460"
d="M129 1354q0 40 30 70t72 30q41 0 71 -30t30 -70q0 -41 -30 -72t-71 -31q-42 0 -72 30.5t-30 72.5zM154 0v1059h153v-1059h-153z" />
<glyph glyph-name="j" unicode="j" horiz-adv-x="460"
d="M-117 -332l25 127q61 -22 131 -22q51 0 83 37t32 96v1153h153v-1153q0 -119 -72 -195t-186 -76q-91 0 -166 33zM129 1354q0 40 30 70t72 30q41 0 71 -30t30 -70q0 -41 -30 -72t-71 -31q-42 0 -72 30.5t-30 72.5z" />
<glyph glyph-name="k" unicode="k" horiz-adv-x="1112"
d="M154 0v1432h153v-959l580 586h196l-477 -486l451 -573h-193l-366 469l-191 -188v-281h-153z" />
<glyph glyph-name="l" unicode="l" horiz-adv-x="464"
d="M156 0v1432h153v-1432h-153z" />
<glyph glyph-name="m" unicode="m" horiz-adv-x="1832"
d="M156 0v1059h153v-156q40 84 121.5 132t185.5 48q118 0 208.5 -60.5t133.5 -164.5q32 102 126.5 163.5t215.5 61.5q166 0 271.5 -114.5t105.5 -294.5v-674h-153v653q0 129 -68.5 211t-175.5 82q-126 0 -206.5 -76t-80.5 -196v-674h-153v653q0 129 -68.5 211t-175.5 82
q-126 0 -206.5 -76t-80.5 -196v-674h-153z" />
<glyph glyph-name="n" unicode="n"
d="M158 0v1059h153v-170q46 86 141.5 140t206.5 54q175 0 286.5 -114.5t111.5 -294.5v-674h-154v653q0 129 -73.5 211t-190.5 82q-133 0 -230.5 -81t-97.5 -191v-674h-153z" />
<glyph glyph-name="o" unicode="o" horiz-adv-x="1292"
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5z" />
<glyph glyph-name="p" unicode="p" horiz-adv-x="1306"
d="M170 -352v1411h154v-199q61 106 160 164.5t225 58.5q210 0 348.5 -155.5t138.5 -397.5q0 -243 -138.5 -399t-348.5 -156q-125 0 -224.5 59t-160.5 165v-551h-154zM324 530q0 -183 99.5 -300t256.5 -117q155 0 254.5 117t99.5 300t-99.5 299.5t-254.5 116.5
q-157 0 -256.5 -116.5t-99.5 -299.5z" />
<glyph glyph-name="q" unicode="q" horiz-adv-x="1306"
d="M111 530q0 242 138.5 397.5t348.5 155.5q126 0 225 -58.5t160 -164.5v199h154v-1411h-154v551q-61 -106 -160.5 -165t-224.5 -59q-210 0 -348.5 156t-138.5 399zM272 530q0 -183 100 -300t255 -117q157 0 256.5 117t99.5 300t-99.5 299.5t-256.5 116.5
q-155 0 -255 -116.5t-100 -299.5z" />
<glyph glyph-name="r" unicode="r" horiz-adv-x="790"
d="M170 0v1059h154v-207q48 107 156 169t253 62v-137q-180 0 -294.5 -99.5t-114.5 -254.5v-592h-154z" />
<glyph glyph-name="s" unicode="s" horiz-adv-x="1015"
d="M92 133l80 113q183 -133 358 -133q105 0 169.5 45.5t64.5 120.5q0 24 -8 45t-19 36t-33.5 30t-40 24.5t-51 21t-54 18t-60.5 17.5q-195 56 -275 122.5t-80 178.5q0 142 104.5 226.5t266.5 84.5q199 0 379 -118l-74 -119q-156 100 -305 100q-94 0 -155.5 -40.5
t-61.5 -114.5q0 -65 56 -99t218 -86q47 -15 73.5 -23.5t69 -26t66.5 -32.5t54 -39t46 -50t27 -62t11 -78q0 -144 -110.5 -232t-277.5 -88q-112 0 -228 41.5t-210 116.5z" />
<glyph glyph-name="t" unicode="t" horiz-adv-x="757"
d="M76 922v137h166v291h153v-291h260v-137h-260v-676q0 -57 34 -95t81 -38q71 0 111 43l75 -113q-87 -68 -196 -68q-114 0 -186 76t-72 195v676h-166z" />
<glyph glyph-name="u" unicode="u"
d="M156 385v674h153v-653q0 -129 73.5 -211t190.5 -82q133 0 230.5 81t97.5 191v674h154v-1059h-154v170q-46 -86 -141.5 -140.5t-206.5 -54.5q-175 0 -286 115t-111 295z" />
<glyph glyph-name="v" unicode="v" horiz-adv-x="1153"
d="M55 1059h172l353 -879l346 879h172l-445 -1059h-147z" />
<glyph glyph-name="w" unicode="w" horiz-adv-x="1705"
d="M72 1059h164l264 -854l288 854h134l288 -854l265 854h163l-356 -1059h-145l-281 846l-285 -846h-145z" />
<glyph glyph-name="x" unicode="x" horiz-adv-x="1128"
d="M66 0l409 541l-393 518h180l303 -400l301 400h181l-392 -518l408 -541h-180l-318 422l-319 -422h-180z" />
<glyph glyph-name="y" unicode="y" horiz-adv-x="1214"
d="M61 1059h170l371 -881l350 881h166l-483 -1178q-54 -132 -132 -190t-190 -60q-93 0 -168 35l37 131q53 -26 125 -26q53 0 88.5 21t65.5 73l61 131z" />
<glyph glyph-name="z" unicode="z" horiz-adv-x="1052"
d="M111 0v121l624 792h-612v146h819v-121l-627 -793h631v-145h-835z" />
<glyph glyph-name="braceleft" unicode="{" horiz-adv-x="806"
d="M88 487v113q109 0 155 46t46 149v286q0 110 37 178t127 109.5t247 58.5l13 -108q-94 -14 -148.5 -30.5t-88 -46t-44 -67.5t-10.5 -102l2 -295q0 -94 -38.5 -150t-115.5 -83q78 -28 116 -84.5t38 -151.5l-2 -293q0 -86 23.5 -131t83.5 -71t184 -45l-13 -109
q-158 17 -248 59t-126.5 110t-36.5 177v289q0 103 -46.5 147.5t-154.5 44.5z" />
<glyph glyph-name="bar" unicode="|" horiz-adv-x="569"
d="M223 -152v1674h123v-1674h-123z" />
<glyph glyph-name="braceright" unicode="}" horiz-adv-x="806"
d="M94 -231q124 19 184 45t83.5 71t23.5 131l-2 293q0 95 38 151.5t116 84.5q-77 27 -115.5 83t-38.5 150l2 295q0 64 -10.5 102t-44 67.5t-88 46t-148.5 30.5l12 108q232 -26 322 -104.5t90 -241.5v-286q0 -103 46 -149t155 -46v-113q-108 0 -154.5 -44.5t-46.5 -147.5
v-289q0 -109 -37 -177t-127 -110t-248 -59z" />
<glyph glyph-name="asciitilde" unicode="~" horiz-adv-x="911"
d="M127 625q31 243 197 243q41 0 80.5 -21t65.5 -46.5t58 -46.5t60 -21q40 0 65 33t37 106l94 -14q-31 -244 -196 -244q-41 0 -80.5 21t-65.5 47t-58 47t-60 21q-80 0 -103 -140z" />
<glyph glyph-name="uni00A0" unicode="&#xa0;" horiz-adv-x="593"
/>
<glyph glyph-name="exclamdown" unicode="&#xa1;" horiz-adv-x="559"
d="M168 971q0 46 32 79t76 33q47 0 80 -33t33 -79q0 -43 -33 -76t-80 -33q-44 0 -76 33t-32 76zM180 -348l41 1012h109l39 -1012h-189z" />
<glyph glyph-name="cent" unicode="&#xa2;" horiz-adv-x="1110"
d="M98 530q0 196 127.5 350t315.5 193v133h159v-125q186 -21 324 -153l-106 -105q-91 101 -218 119v-825q131 21 224 125l106 -105q-139 -139 -330 -160v-129h-159v138q-188 40 -315.5 194t-127.5 350zM260 530q0 -139 79.5 -250.5t201.5 -150.5v801q-121 -39 -201 -150.5
t-80 -249.5z" />
<glyph glyph-name="sterling" unicode="&#xa3;" horiz-adv-x="1267"
d="M113 0v78l133 74v383h-127v137h127v276q0 212 124.5 348t319.5 136q141 0 261.5 -65.5t170.5 -168.5l-116 -115q-26 89 -114.5 146t-201.5 57q-125 0 -204.5 -94.5t-79.5 -243.5v-276h413v-137h-413v-383h768v-152h-1061z" />
<glyph glyph-name="yen" unicode="&#xa5;" horiz-adv-x="1374"
d="M37 1407h199l452 -682l457 682h192l-497 -733h356v-137h-424v-164h424v-137h-424v-236h-168v236h-424v137h424v164h-424v137h357z" />
<glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="839"
d="M129 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM522 1317q0 37 27.5 65.5t66.5 28.5q38 0 66.5 -28.5t28.5 -65.5q0 -38 -28.5 -66t-66.5 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
<glyph glyph-name="uni00AD" unicode="&#xad;" horiz-adv-x="759"
d="M115 481v150h530v-150h-530z" />
<glyph glyph-name="macron" unicode="&#xaf;" horiz-adv-x="892"
d="M129 1217v112h635v-112h-635z" />
<glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="667"
d="M129 1180l248 295l162 -37l-291 -258h-119z" />
<glyph glyph-name="cedilla" unicode="&#xb8;" horiz-adv-x="638"
d="M129 -336l39 86q58 -47 133 -47q44 0 73 22t29 56q0 31 -20 50t-59 19q-42 0 -70 -22l-33 35l68 160h106l-49 -117q8 2 23 2q62 0 101.5 -37.5t39.5 -97.5q0 -74 -57.5 -120t-143.5 -46q-109 0 -180 57z" />
<glyph glyph-name="questiondown" unicode="&#xbf;" horiz-adv-x="1038"
d="M90 2q0 137 115 249t295 150v263h162v-383q-179 -15 -294.5 -90t-115.5 -175q0 -99 76 -171t200 -72q108 0 192 51t159 143l104 -104q-191 -236 -463 -236q-191 0 -310.5 107.5t-119.5 267.5zM471 971q0 46 32.5 79t76.5 33q47 0 79.5 -33t32.5 -79q0 -43 -33 -76
t-79 -33q-44 0 -76.5 33t-32.5 76z" />
<glyph glyph-name="Agrave" unicode="&#xc0;" horiz-adv-x="1546"
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM426 1786l162 37l248 -295h-119zM446 471h654l-326 739z" />
<glyph glyph-name="Aacute" unicode="&#xc1;" horiz-adv-x="1546"
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM446 471h654l-326 739zM711 1528l247 295l162 -37l-291 -258h-118z" />
<glyph glyph-name="Acircumflex" unicode="&#xc2;" horiz-adv-x="1546"
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM446 471h654l-326 739zM496 1528l204 280h144l209 -280h-119l-162 176l-160 -176h-116z" />
<glyph glyph-name="Atilde" unicode="&#xc3;" horiz-adv-x="1546"
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM442 1536q31 244 197 244q41 0 80.5 -21t65.5 -46.5t58 -46.5t60 -21q80 0 103 139l94 -15q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5t-60 21q-40 0 -65 -33t-37 -106zM446 471h654
l-326 739z" />
<glyph glyph-name="Adieresis" unicode="&#xc4;" horiz-adv-x="1546"
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM446 471h654l-326 739zM481 1665q0 37 27.5 65.5t66.5 28.5q38 0 66.5 -28.5t28.5 -65.5q0 -38 -28.5 -66t-66.5 -28q-39 0 -66.5 27.5t-27.5 66.5zM874 1665q0 37 28 65.5t67 28.5q38 0 66 -28.5
t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -67 27.5t-28 66.5z" />
<glyph glyph-name="Aring" unicode="&#xc5;" horiz-adv-x="1546"
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM446 471h654l-326 739zM561 1765q0 88 61.5 149.5t149.5 61.5t149.5 -61.5t61.5 -149.5t-61.5 -149.5t-149.5 -61.5t-149.5 61.5t-61.5 149.5zM651 1765q0 -49 35.5 -84.5t85.5 -35.5t85.5 35.5
t35.5 84.5t-35.5 85t-85.5 36t-85.5 -36t-35.5 -85z" />
<glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="2097"
d="M66 0l811 1407h1108v-152h-848v-462h764v-152h-764v-489h848v-152h-1010v319h-541l-184 -319h-184zM522 471h453v784z" />
<glyph glyph-name="Ccedilla" unicode="&#xc7;" horiz-adv-x="1392"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 275 -56.5t231 -158.5l-108 -111q-78 84 -181.5 131t-216.5 47q-149 0 -278 -79t-205 -212.5t-76 -287.5q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47q113 0 216.5 47t181.5 131l108 -111
q-94 -94 -215.5 -151t-255.5 -64l-28 -69q8 2 22 2q62 0 101.5 -37.5t39.5 -97.5q0 -74 -57 -120t-143 -46q-110 0 -181 57l39 86q58 -47 133 -47q44 0 73.5 22t29.5 56q0 31 -20 50t-60 19q-42 0 -70 -22l-32 35l49 117q-177 18 -326.5 120t-237.5 262.5t-88 342.5z" />
<glyph glyph-name="Egrave" unicode="&#xc8;" horiz-adv-x="1284"
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-489h847v-152h-1009zM401 1786l162 37l248 -295h-119z" />
<glyph glyph-name="Eacute" unicode="&#xc9;" horiz-adv-x="1284"
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-489h847v-152h-1009zM504 1528l248 295l161 -37l-290 -258h-119z" />
<glyph glyph-name="Ecircumflex" unicode="&#xca;" horiz-adv-x="1284"
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-489h847v-152h-1009zM391 1528l205 280h143l209 -280h-119l-161 176l-160 -176h-117z" />
<glyph glyph-name="Edieresis" unicode="&#xcb;" horiz-adv-x="1284"
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-489h847v-152h-1009zM377 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM770 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66
t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
<glyph glyph-name="Igrave" unicode="&#xcc;" horiz-adv-x="483"
d="M-106 1786l161 37l248 -295h-119zM162 0v1407h160v-1407h-160z" />
<glyph glyph-name="Iacute" unicode="&#xcd;" horiz-adv-x="483"
d="M162 0v1407h160v-1407h-160zM180 1528l248 295l162 -37l-291 -258h-119z" />
<glyph glyph-name="Icircumflex" unicode="&#xce;" horiz-adv-x="483"
d="M-35 1528l205 280h143l209 -280h-119l-161 176l-160 -176h-117zM162 0v1407h160v-1407h-160z" />
<glyph glyph-name="Idieresis" unicode="&#xcf;" horiz-adv-x="483"
d="M-49 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM162 0v1407h160v-1407h-160zM344 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
<glyph glyph-name="Eth" unicode="&#xd0;" horiz-adv-x="1595"
d="M86 641v152h141v614h475q220 0 394 -89t271 -249.5t97 -363.5q0 -204 -97 -364.5t-271 -250.5t-394 -90h-475v641h-141zM387 145h315q264 0 432.5 157t168.5 403q0 161 -76.5 288t-213.5 198t-311 71h-315v-469h414l-2 -152h-412v-496z" />
<glyph glyph-name="Ntilde" unicode="&#xd1;" horiz-adv-x="1576"
d="M193 0v1407h159l873 -1145v1145h159v-1407h-159l-873 1145v-1145h-159zM459 1536q31 244 196 244q41 0 80.5 -21t66 -46.5t58.5 -46.5t60 -21q40 0 65 33t37 106l94 -15q-31 -243 -196 -243q-41 0 -80.5 21t-66 46.5t-58.5 46.5t-60 21q-40 0 -65 -33t-37 -106z" />
<glyph glyph-name="Ograve" unicode="&#xd2;" horiz-adv-x="1652"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5zM483 1786l162 37l248 -295h-119z" />
<glyph glyph-name="Oacute" unicode="&#xd3;" horiz-adv-x="1652"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5zM766 1528l248 295l162 -37l-291 -258h-119z" />
<glyph glyph-name="Ocircumflex" unicode="&#xd4;" horiz-adv-x="1652"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5zM551 1528l205 280h143l209 -280h-119l-162 176l-159 -176h-117z" />
<glyph glyph-name="Otilde" unicode="&#xd5;" horiz-adv-x="1652"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5zM498 1536q31 244 196 244q41 0 80.5 -21t65.5 -46.5t58 -46.5t60 -21q80 0 103 139l94 -15q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5
t-60 21q-40 0 -65 -33t-37 -106z" />
<glyph glyph-name="Odieresis" unicode="&#xd6;" horiz-adv-x="1652"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5zM537 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM930 1665q0 37 27.5 65.5t66.5 28.5
q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
<glyph glyph-name="multiply" unicode="&#xd7;" horiz-adv-x="1107"
d="M168 406l278 278l-278 279l108 108l279 -278l279 278l106 -108l-276 -277l276 -278l-109 -109l-276 279l-279 -279z" />
<glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1652"
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q234 0 424 -144l105 119h174l-180 -207q93 -100 144.5 -227.5t51.5 -267.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-230 0 -424 144l-104 -119h-174l180 207q-94 100 -146.5 229t-52.5 269zM268 705
q0 -105 37 -204t103 -177l743 850q-145 110 -324 110q-149 0 -278 -79t-205 -212.5t-76 -287.5zM504 233q145 -110 323 -110q111 0 214.5 47t178 125.5t119.5 186t45 223.5q0 213 -139 378z" />
<glyph glyph-name="Ugrave" unicode="&#xd9;" horiz-adv-x="1527"
d="M176 584v823h160v-823q0 -203 120.5 -333t307.5 -130t307.5 130t120.5 333v823h160v-823q0 -267 -165 -438t-423 -171t-423 171t-165 438zM498 1786l161 37l248 -295h-119z" />
<glyph glyph-name="Uacute" unicode="&#xda;" horiz-adv-x="1527"
d="M176 584v823h160v-823q0 -203 120.5 -333t307.5 -130t307.5 130t120.5 333v823h160v-823q0 -267 -165 -438t-423 -171t-423 171t-165 438zM600 1528l248 295l162 -37l-291 -258h-119z" />
<glyph glyph-name="Ucircumflex" unicode="&#xdb;" horiz-adv-x="1527"
d="M176 584v823h160v-823q0 -203 120.5 -333t307.5 -130t307.5 130t120.5 333v823h160v-823q0 -267 -165 -438t-423 -171t-423 171t-165 438zM487 1528l205 280h144l208 -280h-118l-162 176l-160 -176h-117z" />
<glyph glyph-name="Udieresis" unicode="&#xdc;" horiz-adv-x="1527"
d="M176 584v823h160v-823q0 -203 120.5 -333t307.5 -130t307.5 130t120.5 333v823h160v-823q0 -267 -165 -438t-423 -171t-423 171t-165 438zM473 1665q0 37 27.5 65.5t66.5 28.5q38 0 66.5 -28.5t28.5 -65.5q0 -38 -28.5 -66t-66.5 -28q-39 0 -66.5 27.5t-27.5 66.5z
M866 1665q0 37 28 65.5t67 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -67 27.5t-28 66.5z" />
<glyph glyph-name="Yacute" unicode="&#xdd;" horiz-adv-x="1374"
d="M37 1407h199l452 -682l457 682h192l-565 -834v-573h-168v573zM524 1528l248 295l162 -37l-291 -258h-119z" />
<glyph glyph-name="Thorn" unicode="&#xde;" horiz-adv-x="1318"
d="M162 0v1407h164v-248h407q144 0 262.5 -57t187 -160.5t68.5 -232.5q0 -196 -149 -323.5t-369 -127.5h-411v-258h-160zM322 410h383q174 0 279.5 80t105.5 219t-105.5 219t-279.5 80h-383v-598z" />
<glyph glyph-name="germandbls" unicode="&#xdf;" horiz-adv-x="1179"
d="M172 0v1077q0 163 120 267t308 104q187 0 306.5 -104t119.5 -267q0 -212 -201 -329q123 -62 189.5 -155.5t66.5 -207.5q0 -169 -117 -277t-300 -108h-179v145h138q130 0 213.5 73.5t83.5 187.5t-83.5 187t-213.5 73h-138v145h113q115 0 190.5 72.5t75.5 173.5
q0 107 -74.5 176.5t-191.5 69.5t-191.5 -71t-74.5 -181v-1051h-160z" />
<glyph glyph-name="agrave" unicode="&#xe0;" horiz-adv-x="1173"
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM334 1438l162 37l247 -295h-118z" />
<glyph glyph-name="aacute" unicode="&#xe1;" horiz-adv-x="1173"
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM436 1180l248 295l162 -37l-291 -258h-119z" />
<glyph glyph-name="acircumflex" unicode="&#xe2;" horiz-adv-x="1173"
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM324 1180l204 280h144l209 -280h-119l-162 176l-160 -176h-116z" />
<glyph glyph-name="atilde" unicode="&#xe3;" horiz-adv-x="1173"
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM270 1188q31 244 197 244q41 0 80.5 -21t65.5 -47t58 -47t60 -21q80 0 103 140l94 -15q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5t-60 21q-40 0 -65 -33t-37 -106z
" />
<glyph glyph-name="adieresis" unicode="&#xe4;" horiz-adv-x="1173"
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM309 1317q0 37 27.5 65.5t66.5 28.5q38 0 66.5 -28.5t28.5 -65.5q0 -38 -28.5 -66t-66.5 -28q-39 0 -66.5 27.5t-27.5 66.5zM702 1317q0 37 28 65.5t67 28.5q38 0 66 -28.5
t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -67 27.5t-28 66.5z" />
<glyph glyph-name="aring" unicode="&#xe5;" horiz-adv-x="1173"
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM389 1417q0 88 61.5 149.5t149.5 61.5t149.5 -61.5t61.5 -149.5t-61.5 -149.5t-149.5 -61.5t-149.5 61.5t-61.5 149.5zM479 1417q0 -49 35.5 -85t85.5 -36t85.5 36t35.5 85
t-35.5 85t-85.5 36t-85.5 -36t-35.5 -85z" />
<glyph glyph-name="ae" unicode="&#xe6;" horiz-adv-x="1982"
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q143 0 239.5 -56t143.5 -157q73 100 182 156.5t233 56.5q237 0 369.5 -165t132.5 -447h-866q18 -158 120.5 -258
t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-134 0 -253 65t-192 179q-67 -110 -186.5 -177t-257.5 -67q-192 0 -300 89t-108 249zM252 319q0 -98 75.5 -153t209.5 -55q132 0 228.5 90.5t96.5 214.5v78q-153 43 -319 43
q-121 0 -206 -62t-85 -156zM1022 608h713q-16 150 -104 244t-240 94q-142 0 -244.5 -93t-124.5 -245z" />
<glyph glyph-name="ccedilla" unicode="&#xe7;" horiz-adv-x="1110"
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q106 0 203.5 -41t173.5 -114l-106 -105q-53 58 -123.5 90.5t-147.5 32.5q-158 0 -272.5 -123.5t-114.5 -292.5q0 -170 114.5 -293.5t272.5 -123.5q78 0 150 34t127 95l106 -105q-148 -148 -346 -160l-31 -71q8 2 23 2
q62 0 101.5 -37.5t39.5 -97.5q0 -74 -57.5 -120t-143.5 -46q-109 0 -180 57l39 86q58 -47 133 -47q44 0 73.5 22t29.5 56q0 31 -20 50t-60 19q-42 0 -70 -22l-33 35l50 117q-98 14 -187 63t-153 122t-102 168t-38 197z" />
<glyph glyph-name="egrave" unicode="&#xe8;" horiz-adv-x="1218"
d="M98 532q0 154 71 281t191 198.5t261 71.5q237 0 369 -165t132 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-105 0 -203 41.5t-172 114t-118 177.5t-44 224zM258 608h713q-16 150 -104 244t-240 94
q-142 0 -244.5 -93t-124.5 -245zM354 1438l162 37l248 -295h-119z" />
<glyph glyph-name="eacute" unicode="&#xe9;" horiz-adv-x="1218"
d="M98 532q0 154 71 281t191 198.5t261 71.5q237 0 369 -165t132 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-105 0 -203 41.5t-172 114t-118 177.5t-44 224zM258 608h713q-16 150 -104 244t-240 94
q-142 0 -244.5 -93t-124.5 -245zM457 1180l248 295l161 -37l-291 -258h-118z" />
<glyph glyph-name="ecircumflex" unicode="&#xea;" horiz-adv-x="1218"
d="M98 532q0 154 71 281t191 198.5t261 71.5q237 0 369 -165t132 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-105 0 -203 41.5t-172 114t-118 177.5t-44 224zM258 608h713q-16 150 -104 244t-240 94
q-142 0 -244.5 -93t-124.5 -245zM344 1180l205 280h143l209 -280h-119l-161 176l-160 -176h-117z" />
<glyph glyph-name="edieresis" unicode="&#xeb;" horiz-adv-x="1218"
d="M98 532q0 154 71 281t191 198.5t261 71.5q237 0 369 -165t132 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-105 0 -203 41.5t-172 114t-118 177.5t-44 224zM258 608h713q-16 150 -104 244t-240 94
q-142 0 -244.5 -93t-124.5 -245zM330 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM723 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
<glyph glyph-name="igrave" unicode="&#xec;" horiz-adv-x="460"
d="M-117 1438l162 37l248 -295h-119zM154 0v1059h153v-1059h-153z" />
<glyph glyph-name="iacute" unicode="&#xed;" horiz-adv-x="460"
d="M154 0v1059h153v-1059h-153zM170 1180l248 295l162 -37l-291 -258h-119z" />
<glyph glyph-name="icircumflex" unicode="&#xee;" horiz-adv-x="460"
d="M-45 1180l205 280h143l209 -280h-119l-162 176l-159 -176h-117zM154 0v1059h153v-1059h-153z" />
<glyph glyph-name="idieresis" unicode="&#xef;" horiz-adv-x="460"
d="M-59 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM154 0v1059h153v-1059h-153zM334 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
<glyph glyph-name="eth" unicode="&#xf0;" horiz-adv-x="1284"
d="M123 508q0 224 134 368t343 144q202 0 342 -166q-85 165 -276 332l-250 -111l-56 127l187 82q-101 75 -166 119l156 63q100 -78 149 -118l203 90l55 -127l-145 -66q185 -171 273.5 -335.5t88.5 -358.5q0 -254 -144.5 -415t-371.5 -161q-229 0 -375.5 150t-146.5 383z
M283 506q0 -172 101 -281.5t261 -109.5q155 0 254.5 108.5t99.5 278.5q0 163 -99 273t-261 110q-157 0 -256.5 -106.5t-99.5 -272.5z" />
<glyph glyph-name="ntilde" unicode="&#xf1;"
d="M158 0v1059h153v-170q46 86 141.5 140t206.5 54q175 0 286.5 -114.5t111.5 -294.5v-674h-154v653q0 129 -73.5 211t-190.5 82q-133 0 -230.5 -81t-97.5 -191v-674h-153zM311 1188q31 244 197 244q41 0 80.5 -21t65.5 -47t58 -47t60 -21q79 0 102 140l95 -15
q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5t-60 21q-40 0 -65 -33t-37 -106z" />
<glyph glyph-name="ograve" unicode="&#xf2;" horiz-adv-x="1292"
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM381 1438l162 37l248 -295h-119z" />
<glyph glyph-name="oacute" unicode="&#xf3;" horiz-adv-x="1292"
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM483 1180l248 295l162 -37l-291 -258h-119z" />
<glyph glyph-name="ocircumflex" unicode="&#xf4;" horiz-adv-x="1292"
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM371 1180l204 280h144l209 -280h-119l-162 176l-160 -176h-116z" />
<glyph glyph-name="otilde" unicode="&#xf5;" horiz-adv-x="1292"
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM317 1188q31 244 197 244q41 0 80.5 -21t65.5 -47t58 -47t60 -21q80 0 103 140l94 -15q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5t-60 21q-40 0 -65 -33t-37 -106z
" />
<glyph glyph-name="odieresis" unicode="&#xf6;" horiz-adv-x="1292"
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM356 1317q0 37 28 65.5t67 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -67 27.5t-28 66.5zM750 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5
q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
<glyph glyph-name="divide" unicode="&#xf7;" horiz-adv-x="1214"
d="M137 608v152h940v-152h-940zM498 354q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79t-76.5 -33q-47 0 -79.5 33t-32.5 79zM498 1018q0 43 32.5 75.5t79.5 32.5q44 0 76.5 -32.5t32.5 -75.5q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5z
" />
<glyph glyph-name="oslash" unicode="&#xf8;" horiz-adv-x="1292"
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q162 0 305 -96l62 72h174l-137 -160q143 -159 143 -369q0 -111 -44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5q-161 0 -303 95l-59 -70h-174l135 158q-70 75 -109 171.5t-39 200.5zM260 530q0 -145 84 -256l514 603
q-98 69 -211 69q-158 0 -272.5 -123.5t-114.5 -292.5zM438 180q95 -67 209 -67q157 0 271 123.5t114 293.5q0 134 -80 252z" />
<glyph glyph-name="ugrave" unicode="&#xf9;"
d="M156 385v674h153v-653q0 -129 73.5 -211t190.5 -82q133 0 230.5 81t97.5 191v674h154v-1059h-154v170q-46 -86 -141.5 -140.5t-206.5 -54.5q-175 0 -286 115t-111 295zM338 1438l162 37l248 -295h-119z" />
<glyph glyph-name="uacute" unicode="&#xfa;"
d="M156 385v674h153v-653q0 -129 73.5 -211t190.5 -82q133 0 230.5 81t97.5 191v674h154v-1059h-154v170q-46 -86 -141.5 -140.5t-206.5 -54.5q-175 0 -286 115t-111 295zM440 1180l248 295l162 -37l-291 -258h-119z" />
<glyph glyph-name="ucircumflex" unicode="&#xfb;"
d="M156 385v674h153v-653q0 -129 73.5 -211t190.5 -82q133 0 230.5 81t97.5 191v674h154v-1059h-154v170q-46 -86 -141.5 -140.5t-206.5 -54.5q-175 0 -286 115t-111 295zM328 1180l204 280h144l209 -280h-119l-162 176l-160 -176h-116z" />
<glyph glyph-name="udieresis" unicode="&#xfc;"
d="M156 385v674h153v-653q0 -129 73.5 -211t190.5 -82q133 0 230.5 81t97.5 191v674h154v-1059h-154v170q-46 -86 -141.5 -140.5t-206.5 -54.5q-175 0 -286 115t-111 295zM313 1317q0 37 28 65.5t67 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-40 0 -67.5 27.5
t-27.5 66.5zM707 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
<glyph glyph-name="yacute" unicode="&#xfd;" horiz-adv-x="1214"
d="M61 1059h170l371 -881l350 881h166l-483 -1178q-54 -132 -132 -190t-190 -60q-93 0 -168 35l37 131q53 -26 125 -26q53 0 88.5 21t65.5 73l61 131zM438 1180l248 295l162 -37l-291 -258h-119z" />
<glyph glyph-name="thorn" unicode="&#xfe;" horiz-adv-x="1306"
d="M170 -352v1784h154v-572q61 106 160 164.5t225 58.5q210 0 348.5 -155.5t138.5 -397.5q0 -243 -138.5 -399t-348.5 -156q-125 0 -224.5 59t-160.5 165v-551h-154zM324 530q0 -183 99.5 -300t256.5 -117q155 0 254.5 117t99.5 300t-99.5 299.5t-254.5 116.5
q-157 0 -256.5 -116.5t-99.5 -299.5z" />
<glyph glyph-name="ydieresis" unicode="&#xff;" horiz-adv-x="1214"
d="M61 1059h170l371 -881l350 881h166l-483 -1178q-54 -132 -132 -190t-190 -60q-93 0 -168 35l37 131q53 -26 125 -26q53 0 88.5 21t65.5 73l61 131zM311 1317q0 37 28 65.5t67 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-40 0 -67.5 27.5t-27.5 66.5zM705 1317
q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
<glyph glyph-name="OE" unicode="&#x152;" horiz-adv-x="2113"
d="M106 684q0 145 58.5 279t156 231t230.5 155t276 58h1174v-152h-848v-462h764v-152h-764v-489h848v-152h-1174q-193 0 -358 87.5t-264 245.5t-99 351zM268 684q0 -154 76.5 -278t204 -191.5t278.5 -67.5h164v1113h-164q-112 0 -215 -46.5t-178.5 -124t-120.5 -184
t-45 -221.5z" />
<glyph glyph-name="oe" unicode="&#x153;" horiz-adv-x="2154"
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q142 0 265 -71.5t198 -190.5q70 121 188 191.5t258 70.5q237 0 369.5 -165t132.5 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-141 0 -264 72
t-195 195q-75 -121 -199 -194t-266 -73q-109 0 -210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM1194 608h713
q-16 150 -104 244t-240 94q-142 0 -244.5 -93t-124.5 -245z" />
<glyph glyph-name="Ydieresis" unicode="&#x178;" horiz-adv-x="1374"
d="M37 1407h199l452 -682l457 682h192l-565 -834v-573h-168v573zM397 1665q0 37 28 65.5t67 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-40 0 -67.5 27.5t-27.5 66.5zM791 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28
q-39 0 -66.5 27.5t-27.5 66.5z" />
<glyph glyph-name="circumflex" unicode="&#x2c6;" horiz-adv-x="815"
d="M129 1180l205 280h143l209 -280h-119l-161 176l-160 -176h-117z" />
<glyph glyph-name="tilde" unicode="&#x2dc;" horiz-adv-x="923"
d="M133 1188q31 244 197 244q41 0 80.5 -21t65.5 -47t58 -47t60 -21q79 0 102 140l95 -15q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5t-60 21q-80 0 -103 -139z" />
<glyph glyph-name="uni2000" unicode="&#x2000;" horiz-adv-x="988"
/>
<glyph glyph-name="uni2001" unicode="&#x2001;" horiz-adv-x="1976"
/>
<glyph glyph-name="uni2002" unicode="&#x2002;" horiz-adv-x="988"
/>
<glyph glyph-name="uni2003" unicode="&#x2003;" horiz-adv-x="1976"
/>
<glyph glyph-name="uni2004" unicode="&#x2004;" horiz-adv-x="658"
/>
<glyph glyph-name="uni2005" unicode="&#x2005;" horiz-adv-x="494"
/>
<glyph glyph-name="uni2006" unicode="&#x2006;" horiz-adv-x="329"
/>
<glyph glyph-name="uni2007" unicode="&#x2007;" horiz-adv-x="329"
/>
<glyph glyph-name="uni2008" unicode="&#x2008;" horiz-adv-x="247"
/>
<glyph glyph-name="uni2009" unicode="&#x2009;" horiz-adv-x="395"
/>
<glyph glyph-name="uni200A" unicode="&#x200a;" horiz-adv-x="109"
/>
<glyph glyph-name="uni2010" unicode="&#x2010;" horiz-adv-x="759"
d="M115 481v150h530v-150h-530z" />
<glyph glyph-name="uni2011" unicode="&#x2011;" horiz-adv-x="759"
d="M115 481v150h530v-150h-530z" />
<glyph glyph-name="figuredash" unicode="&#x2012;" horiz-adv-x="759"
d="M115 481v150h530v-150h-530z" />
<glyph glyph-name="endash" unicode="&#x2013;" horiz-adv-x="1181"
d="M115 483v146h952v-146h-952z" />
<glyph glyph-name="emdash" unicode="&#x2014;" horiz-adv-x="1806"
d="M115 483v146h1577v-146h-1577z" />
<glyph glyph-name="quoteleft" unicode="&#x2018;" horiz-adv-x="540"
d="M145 1073q0 62 33 126t125 179l76 -57q-82 -94 -107 -191q46 0 78.5 -33t32.5 -79q0 -44 -32.5 -76.5t-80.5 -32.5q-57 0 -91 46t-34 118z" />
<glyph glyph-name="quoteright" unicode="&#x2019;" horiz-adv-x="540"
d="M158 1274q0 44 32 76t80 32q57 0 91 -45.5t34 -117.5q0 -62 -33 -127t-124 -179l-76 58q81 93 106 190q-45 0 -77.5 33.5t-32.5 79.5z" />
<glyph glyph-name="quotedblleft" unicode="&#x201c;" horiz-adv-x="950"
d="M145 1073q0 62 33 126t125 179l76 -57q-82 -94 -107 -191q46 0 78.5 -33t32.5 -79q0 -44 -32.5 -76.5t-80.5 -32.5q-57 0 -91 46t-34 118zM555 1073q0 62 33 126t125 179l75 -57q-81 -93 -106 -191q46 0 78.5 -33t32.5 -79q0 -44 -32.5 -76.5t-80.5 -32.5q-57 0 -91 46
t-34 118z" />
<glyph glyph-name="quotedblright" unicode="&#x201d;" horiz-adv-x="950"
d="M158 1274q0 44 32 76t80 32q57 0 91 -45.5t34 -117.5q0 -62 -33 -127t-124 -179l-76 58q81 93 106 190q-45 0 -77.5 33.5t-32.5 79.5zM567 1274q0 44 32.5 76t80.5 32q57 0 91 -45.5t34 -117.5q0 -62 -33 -126.5t-125 -179.5l-76 58q83 95 107 190q-46 0 -78.5 33.5
t-32.5 79.5z" />
<glyph glyph-name="ellipsis" unicode="&#x2026;" horiz-adv-x="1339"
d="M150 88q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5zM559 88q0 43 33 76t80 33q44 0 76 -33t32 -76q0 -46 -32 -79.5t-76 -33.5q-47 0 -80 33.5t-33 79.5zM969 88q0 44 32.5 76.5t79.5 32.5q44 0 76.5 -33
t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5z" />
<glyph glyph-name="uni202F" unicode="&#x202f;" horiz-adv-x="395"
/>
<glyph glyph-name="uni205F" unicode="&#x205f;" horiz-adv-x="494"
/>
<glyph glyph-name="Euro" unicode="&#x20ac;" horiz-adv-x="1392"
d="M-49 483v138h160q-5 67 -5 84q0 49 11 120h-166v138h205q81 207 264.5 338t406.5 131q144 0 275 -56.5t231 -158.5l-108 -111q-78 84 -181.5 131t-216.5 47q-158 0 -292.5 -88.5t-204.5 -232.5h637v-138h-686q-13 -63 -13 -120q0 -43 6 -84h693v-138h-656
q65 -159 206.5 -259.5t309.5 -100.5q113 0 216.5 47t181.5 131l108 -111q-101 -101 -232 -158t-274 -57q-232 0 -422.5 143.5t-263.5 364.5h-190z" />
<glyph glyph-name="uni25FC" unicode="&#x25fc;" horiz-adv-x="1054"
d="M0 0v1055h1055v-1055h-1055z" />
<hkern u1="&#x2f;" u2="&#x2f;" k="256" />
<hkern u1="Y" u2="c" k="233" />
<hkern u1="\" u2="\" k="256" />
<hkern u1="\" u2="&#x2f;" k="-143" />
<hkern u1="&#xdd;" u2="c" k="233" />
<hkern u1="&#x178;" u2="c" k="233" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring"
g2="G"
k="39" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring"
g2="T"
k="127" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring"
g2="V"
k="182" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring"
g2="W"
k="82" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring"
g2="Y,Yacute,Ydieresis"
k="72" />
<hkern g1="C,Ccedilla"
g2="O,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE"
k="31" />
<hkern g1="D"
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
k="109" />
<hkern g1="K"
g2="O,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE"
k="61" />
<hkern g1="K"
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
k="-41" />
<hkern g1="L"
g2="T"
k="55" />
<hkern g1="L"
g2="V"
k="223" />
<hkern g1="O,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash"
g2="W"
k="51" />
<hkern g1="R"
g2="Y,Yacute,Ydieresis"
k="72" />
<hkern g1="T"
g2="O,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE"
k="88" />
<hkern g1="T"
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
k="143" />
<hkern g1="V"
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
k="182" />
<hkern g1="V"
g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae"
k="61" />
<hkern g1="V"
g2="c,ccedilla"
k="139" />
<hkern g1="V"
g2="e,egrave,eacute,ecircumflex,edieresis"
k="139" />
<hkern g1="V"
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
k="139" />
<hkern g1="W"
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
k="82" />
<hkern g1="W"
g2="c,ccedilla"
k="113" />
<hkern g1="W"
g2="e,egrave,eacute,ecircumflex,edieresis"
k="113" />
<hkern g1="W"
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
k="113" />
<hkern g1="Y,Yacute,Ydieresis"
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
k="72" />
<hkern g1="Y,Yacute,Ydieresis"
g2="e,egrave,eacute,ecircumflex,edieresis"
k="233" />
<hkern g1="Y,Yacute,Ydieresis"
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
k="233" />
<hkern g1="c,ccedilla"
g2="V"
k="139" />
<hkern g1="c,ccedilla"
g2="W"
k="113" />
<hkern g1="c,ccedilla"
g2="Y,Yacute,Ydieresis"
k="233" />
<hkern g1="c,ccedilla"
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
k="23" />
<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis"
g2="V"
k="139" />
<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis"
g2="W"
k="113" />
<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis"
g2="Y,Yacute,Ydieresis"
k="233" />
<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis"
g2="w"
k="51" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
g2="V"
k="139" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
g2="W"
k="113" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
g2="Y,Yacute,Ydieresis"
k="233" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
g2="w"
k="41" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
g2="v"
k="41" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
g2="y,yacute,ydieresis"
k="41" />
<hkern g1="r"
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
k="35" />
<hkern g1="v"
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
k="41" />
<hkern g1="v"
g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae"
k="82" />
<hkern g1="v"
g2="d"
k="39" />
<hkern g1="v"
g2="e,egrave,eacute,ecircumflex,edieresis"
k="72" />
<hkern g1="v"
g2="comma"
k="256" />
<hkern g1="v"
g2="period"
k="256" />
<hkern g1="w"
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
k="41" />
<hkern g1="w"
g2="e,egrave,eacute,ecircumflex,edieresis"
k="51" />
<hkern g1="w"
g2="comma"
k="205" />
<hkern g1="w"
g2="period"
k="205" />
<hkern g1="y,yacute,ydieresis"
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
k="41" />
<hkern g1="y,yacute,ydieresis"
g2="e,egrave,eacute,ecircumflex,edieresis"
k="47" />
<hkern g1="y,yacute,ydieresis"
g2="comma"
k="256" />
<hkern g1="y,yacute,ydieresis"
g2="period"
k="256" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 59 KiB

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