feat: initial commit
This commit is contained in:
commit
b9d0aca7b4
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"markdown.marp.themes": [
|
||||
"./themes/cadoles/theme.css"
|
||||
]
|
||||
}
|
58
NOTES.md
Normal file
58
NOTES.md
Normal file
@ -0,0 +1,58 @@
|
||||
```
|
||||
npx http-server .
|
||||
```
|
||||
|
||||
```js
|
||||
const challenge = Uint8Array.from("myserverchallenge", c => c.charCodeAt(0))
|
||||
|
||||
const userId = Uint8Array.from("myuserid", c => c.charCodeAt(0))
|
||||
|
||||
const options = {
|
||||
challenge,
|
||||
rp: {
|
||||
name: "localhost",
|
||||
id: "localhost",
|
||||
},
|
||||
user: {
|
||||
id: userId,
|
||||
name: "myuser",
|
||||
displayName: "John Doe",
|
||||
},
|
||||
pubKeyCredParams: [{alg: -7, type: "public-key"}],
|
||||
authenticatorSelection: {
|
||||
authenticatorAttachment: "cross-platform",
|
||||
},
|
||||
timeout: 60000,
|
||||
attestation: "direct"
|
||||
};
|
||||
|
||||
const credential = await navigator.credentials.create({
|
||||
publicKey: options
|
||||
});
|
||||
|
||||
|
||||
var decoder = new TextDecoder()
|
||||
decoder.decode(credential.response.clientDataJSON)
|
||||
|
||||
CBOR.decode(credential.response.attestationObject)
|
||||
```
|
||||
|
||||
|
||||
```js
|
||||
const newChallenge = Uint8Array.from("myservernewchallenge", c => c.charCodeAt(0))
|
||||
|
||||
const assertionOptions = {
|
||||
challenge: newChallenge,
|
||||
allowCredentials: [
|
||||
{
|
||||
id: credential.rawId,
|
||||
type: 'public-key'
|
||||
}
|
||||
],
|
||||
timeout: 60000
|
||||
}
|
||||
|
||||
navigator.credentials
|
||||
.get({ publicKey: assertionOptions })
|
||||
|
||||
```
|
167
SLIDES.md
Normal file
167
SLIDES.md
Normal file
@ -0,0 +1,167 @@
|
||||
---
|
||||
marp: true
|
||||
theme: cadoles
|
||||
paginate: true
|
||||
header: "DevFest 2023"
|
||||
footer: '![Logo Cadoles](./images/cadoles-logo.png)'
|
||||
---
|
||||
|
||||
## Dites au revoir aux mots de passe avec WebAuthn !
|
||||
|
||||
_William Petit_
|
||||
|
||||
---
|
||||
|
||||
## Avant de commencer
|
||||
|
||||
- S.C.O.P. dijonnaise de 14 personnes, depuis 2011
|
||||
- Spécialisée dans le logiciel libre
|
||||
|
||||
![bg right:45%](images/logo_Cadoles_carre-sombre.svg)
|
||||
|
||||
---
|
||||
|
||||
## Un peu de contexte
|
||||
|
||||
![bg right:45%](./images/password_tag_cloud.png)
|
||||
|
||||
- Je vous assure que c'est moi !
|
||||
- Le mot de passe, cet ami qu'on aimerait voir moins souvent
|
||||
- Dupon-d ou Dupon-t ?
|
||||
|
||||
---
|
||||
|
||||
## Qu'est ce que WebAuthn ?
|
||||
|
||||
![bg right:45% height:60%](./images/webauthn-svgrepo-com.svg)
|
||||
|
||||
- Une collaboration entre le W3C et l'alliance FIDO
|
||||
- De l'authentification forte par paire de clés cryptographiques
|
||||
- Authentification "sans mot de passe" ou vérification "double facteur"
|
||||
|
||||
---
|
||||
|
||||
## Authentification par paire de clés cryptographiques ? (1)
|
||||
|
||||
### Inscription
|
||||
|
||||
![bg right:60% fit](./images/registration_workflow.svg)
|
||||
|
||||
---
|
||||
|
||||
## Authentification par paire de clés cryptographiques ? (2)
|
||||
|
||||
### Authentification
|
||||
|
||||
![bg right:60% fit](./images/authentication_workflow.svg)
|
||||
|
||||
---
|
||||
|
||||
## Passons à la technique
|
||||
|
||||
Grâce à la [`Credential Management API`](https://developer.mozilla.org/en-US/docs/Web/API/Credential_Management_API) et notamment l'interface [`PublicKeyCredential`](https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredential).
|
||||
|
||||
---
|
||||
|
||||
### Générer une accréditation ("credential")
|
||||
|
||||
```js
|
||||
// Transformation du "challenge" récupéré depuis
|
||||
// le serveur
|
||||
const challenge = Uint8Array.from(challengeFromServer, c => c.charCodeAt(0))
|
||||
|
||||
// Récupération de l'identifiant "opaque" généré par le serveur (<= 64 octets)
|
||||
const userId = Uint8Array.from(userIdFromServer, c => c.charCodeAt(0))
|
||||
|
||||
const credentialOptions = {
|
||||
challenge,
|
||||
rp: { // "Relying Party"
|
||||
name: "Cadoles", // Nom associé au RP
|
||||
id: "cadoles.com", // Identifiant (domaine) associé au RP
|
||||
},
|
||||
user: {
|
||||
id: userId, // Une séquence de données unique représentant l'utilisateur
|
||||
name: "jdoe", // Nom d'utilisateur, spécifié (ou non) par le RP
|
||||
displayName: "John Doe", // Nom d'utilisateur (pour affichage)
|
||||
},
|
||||
pubKeyCredParams: [{alg: -7, type: "public-key"}], // Voir registre COSE, -7 = ES256
|
||||
authenticatorSelection: {
|
||||
authenticatorAttachment: "cross-platform", // Privilégier un module matériel (YubiKey) plutôt que lié à la plaforme (TouchID)
|
||||
},
|
||||
timeout: 60000,
|
||||
attestation: "direct" // On demande à recevoir les données directement générées par l'authentificateur
|
||||
};
|
||||
|
||||
const credential = await navigator.credentials.create({
|
||||
publicKey: credentialOptions
|
||||
});
|
||||
```
|
||||
---
|
||||
|
||||
## Générer une affirmation ("assertion")
|
||||
|
||||
```js
|
||||
// On récupère le "challenge" à faire signer par le module d'authentification (envoyé normalement par le serveur)
|
||||
const newChallenge = Uint8Array.from("myservernewchallenge", c => c.charCodeAt(0))
|
||||
|
||||
// On récupère l'identifiant de la clé associé à l'utilisateur (envoyé normalement par le serveur)
|
||||
const keyRawId = Uint8Array.from("myuserkeyid", c => c.charCodeAt(0))
|
||||
|
||||
const assertionOptions = {
|
||||
challenge: newChallenge,
|
||||
allowCredentials: [
|
||||
{
|
||||
id: keyRawId,
|
||||
type: 'public-key'
|
||||
}
|
||||
],
|
||||
timeout: 60000
|
||||
}
|
||||
|
||||
// On génère notre affirmation
|
||||
navigator.credentials
|
||||
.get({ publicKey: assertionOptions })
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Et le côté serveur alors ?
|
||||
|
||||
- Go - https://github.com/go-webauthn/webauthn
|
||||
- TypeScript - https://github.com/passwordless-id/webauthn
|
||||
- Ruby - https://github.com/cedarcode/webauthn-ruby
|
||||
|
||||
---
|
||||
|
||||
## Quels pièges sur l'implémentation ?
|
||||
|
||||
### Techniques
|
||||
|
||||
- Jongler entre les formats (`string`, `ArrayBuffer`, `Uint8Array`...) et la sérialisation des données (`Base64`, `Base64URL`);
|
||||
- Attention aux domaines (cf. `rp.id`);
|
||||
- Automatisation des procédures de test encore complexe à ce jour.
|
||||
|
||||
### UX
|
||||
|
||||
- La procédure de récupération de compte doit être pensée dès l'amorçage du projet pour pallier à la perte de l'authentificateur;
|
||||
|
||||
---
|
||||
|
||||
## Quels facteurs de risque ?
|
||||
|
||||
- Ne pas essayer de ré-implémenter la partie serveur si vous pouvez utiliser une librairie maintenue par une communauté active (ou si vous êtes un véritable professionnel de la cryptographie);
|
||||
- Pour limiter les risques de "lock-out", il faudrait pousser l'utilisateur à associer au minimum 2 authentificateurs avec son compte
|
||||
|
||||
---
|
||||
|
||||
## Des questions ?
|
||||
|
||||
---
|
||||
|
||||
## Bibliographie
|
||||
|
||||
- https://informationisbeautiful.net/visualizations/top-500-passwords-visualized/
|
||||
- https://www.w3.org/TR/webauthn/
|
||||
- https://webauthn.guide/
|
||||
- https://fidoalliance.org/
|
||||
- https://www.iana.org/assignments/cose/cose.xhtml
|
BIN
SLIDES.pdf
Normal file
BIN
SLIDES.pdf
Normal file
Binary file not shown.
57
SUMMARY.md
Normal file
57
SUMMARY.md
Normal file
@ -0,0 +1,57 @@
|
||||
# Sommaire
|
||||
|
||||
Diapositive 1 : Titre
|
||||
|
||||
Titre : Introduction à WebAuthn
|
||||
Sous-titre : Authentification sans mot de passe
|
||||
|
||||
Diapositives 2-3 : Contexte
|
||||
|
||||
Introduction à l'authentification en ligne
|
||||
Problèmes liés aux mots de passe
|
||||
Besoin d'une solution plus sécurisée
|
||||
|
||||
Diapositives 4-5 : Introduction à WebAuthn
|
||||
|
||||
Qu'est-ce que WebAuthn ?
|
||||
Objectif : fournir une méthode d'authentification forte et sans mot de passe
|
||||
|
||||
Diapositives 6-7 : Comment ça fonctionne ?
|
||||
|
||||
Principes de fonctionnement de WebAuthn
|
||||
Utilisation de clés matérielles et biométrie
|
||||
|
||||
Diapositives 8-9 : Compatibilité et Support
|
||||
|
||||
Compatibilité avec les navigateurs
|
||||
Prise en charge sur différentes plateformes
|
||||
|
||||
Diapositives 10-11 : Avantages de WebAuthn
|
||||
|
||||
Sécurité accrue
|
||||
Élimination des risques liés aux mots de passe
|
||||
|
||||
Diapositives 12-13 : Cas d'utilisation
|
||||
|
||||
Exemples de scénarios d'utilisation de WebAuthn
|
||||
Applications pratiques dans divers contextes
|
||||
|
||||
Diapositives 14-15 : Implémentation
|
||||
|
||||
Processus d'implémentation pour les développeurs
|
||||
Intégration dans les applications web existantes
|
||||
|
||||
Diapositives 16-17 : Considérations de sécurité
|
||||
|
||||
Points à prendre en compte pour garantir la sécurité
|
||||
Bonnes pratiques d'implémentation
|
||||
|
||||
Diapositive 18 : Adoption et Tendances
|
||||
|
||||
Évolution de l'adoption de WebAuthn
|
||||
Tendances futures dans l'authentification en ligne
|
||||
|
||||
Diapositives 19-20 : Conclusion
|
||||
|
||||
Récapitulation des avantages clés
|
||||
Encouragement à l'adoption de WebAuthn
|
9
images/authentication_workflow.mmd
Normal file
9
images/authentication_workflow.mmd
Normal file
@ -0,0 +1,9 @@
|
||||
sequenceDiagram
|
||||
actor Utilisateur
|
||||
Utilisateur->>Service: 1. Je voudrais m'authentifier en tant que $USERNAME !
|
||||
Service->>Service: 2. Recherche d'un utilisateur correspondant à $USERNAME <br />et ayant une clé publique associée.
|
||||
Service->>Utilisateur: 3. Signe ce "challenge" avec la clé privée associée au compte $USERNAME.
|
||||
Utilisateur->>Utilisateur: 4. Signature du "challenge" avec la clé privée.
|
||||
Utilisateur->>Service: 5. Voici le "challenge" signé avec ma clé privée.
|
||||
Service->>Service: 6. Vérification que le "challenge" signé correspond bien à celui envoyé <br />et que la signature correspond bien à la clé publique associée au compte $USERNAME.
|
||||
Service->>Utilisateur: 7. Bonjour $USERNAME !
|
1
images/authentication_workflow.svg
Normal file
1
images/authentication_workflow.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 22 KiB |
BIN
images/cadoles-logo.png
Normal file
BIN
images/cadoles-logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
183
images/logo_Cadoles_carre-sombre.svg
Normal file
183
images/logo_Cadoles_carre-sombre.svg
Normal file
@ -0,0 +1,183 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 28.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="841.9px"
|
||||
height="595.3px" viewBox="0 0 841.9 595.3" style="enable-background:new 0 0 841.9 595.3;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#113142;}
|
||||
.st1{fill:#12100E;}
|
||||
.st2{fill:#C4C4C4;}
|
||||
.st3{fill:#808081;}
|
||||
.st4{fill:#FFFFFF;}
|
||||
.st5{fill:#84C0E1;}
|
||||
.st6{fill:#F59B42;}
|
||||
.st7{fill:#3091C6;}
|
||||
</style>
|
||||
<g id="fond">
|
||||
<rect x="-23" y="-7.1" class="st0" width="950.8" height="616.9"/>
|
||||
</g>
|
||||
<g id="logo">
|
||||
<g>
|
||||
<path class="st2" d="M254.9,432.7c-2.1,0-3.5-0.3-4.2-0.9c-0.7-0.6-1.1-1.9-1.1-3.7v-3c0-1.3-0.2-2.1-0.7-2.6
|
||||
c-0.5-0.5-1.3-0.7-2.5-0.7H245v-1.8h1.5c1.2,0,2-0.2,2.5-0.7c0.4-0.5,0.7-1.4,0.7-2.6v-3c0-1.9,0.4-3.1,1.1-3.7
|
||||
c0.7-0.6,2.1-0.9,4.2-0.9h0.8v1.8h-0.9c-1.2,0-1.9,0.2-2.3,0.5c-0.4,0.4-0.5,1.1-0.5,2.4v3.1c0,1.3-0.2,2.3-0.6,2.9
|
||||
c-0.4,0.6-1,1-2,1.2c0.9,0.2,1.6,0.6,2,1.2c0.4,0.6,0.6,1.6,0.6,2.9v3.1c0,1.2,0.2,2,0.5,2.4c0.4,0.4,1.1,0.5,2.3,0.5h0.9v1.8
|
||||
H254.9z"/>
|
||||
<path class="st2" d="M268.5,432.7c-2.1,0-3.5-0.3-4.2-0.9c-0.7-0.6-1.1-1.9-1.1-3.7v-3c0-1.3-0.2-2.1-0.7-2.6
|
||||
c-0.5-0.5-1.3-0.7-2.5-0.7h-1.5v-1.8h1.5c1.2,0,2-0.2,2.5-0.7c0.4-0.5,0.7-1.4,0.7-2.6v-3c0-1.9,0.4-3.1,1.1-3.7
|
||||
c0.7-0.6,2.1-0.9,4.2-0.9h0.8v1.8h-0.9c-1.2,0-1.9,0.2-2.3,0.5c-0.4,0.4-0.5,1.1-0.5,2.4v3.1c0,1.3-0.2,2.3-0.6,2.9
|
||||
c-0.4,0.6-1,1-2,1.2c0.9,0.2,1.6,0.6,2,1.2c0.4,0.6,0.6,1.6,0.6,2.9v3.1c0,1.2,0.2,2,0.5,2.4c0.4,0.4,1.1,0.5,2.3,0.5h0.9v1.8
|
||||
H268.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M287.1,410.6h2.6v16.7h9.1v2.1h-11.7V410.6z"/>
|
||||
<path class="st5" d="M304.4,429.9c-1.4,0-2.5-0.4-3.4-1.2c-0.9-0.8-1.3-1.9-1.3-3.4c0-1.2,0.3-2.2,0.9-2.9
|
||||
c0.6-0.7,1.4-1.2,2.3-1.4c1-0.3,2-0.4,3-0.4h3.1v-0.4c0-1.2-0.3-2-0.9-2.5c-0.6-0.5-1.5-0.7-2.6-0.7c-0.9,0-1.7,0.1-2.5,0.4
|
||||
c-0.8,0.2-1.6,0.6-2.3,1V416c0.8-0.3,1.6-0.5,2.4-0.7c0.8-0.2,1.6-0.3,2.4-0.3c0.8,0,1.7,0.1,2.5,0.3c0.8,0.2,1.5,0.6,2.1,1.1
|
||||
c0.6,0.5,1,1.2,1.2,2.1c0.1,0.6,0.2,1.6,0.2,2.8v2.9c0,0.8,0,1.7,0.1,2.6c0.1,1,0.3,1.8,0.6,2.6h-2.3c-0.1-0.3-0.3-0.7-0.3-1.1
|
||||
c-0.1-0.4-0.2-0.7-0.2-1.1c-0.5,0.9-1.2,1.5-2.1,1.9S305.4,429.9,304.4,429.9z M305,427.9c1,0,1.7-0.2,2.3-0.7
|
||||
c0.6-0.5,1-1.1,1.3-1.9s0.4-1.6,0.4-2.5v-0.5h-2.9c-0.7,0-1.3,0.1-1.9,0.2c-0.6,0.1-1.1,0.4-1.6,0.8c-0.4,0.4-0.6,1-0.6,1.8
|
||||
c0,0.9,0.3,1.6,0.8,2C303.4,427.7,304.1,427.9,305,427.9z"/>
|
||||
<path class="st5" d="M335.7,429.6c-1.4,0-2.5-0.4-3.2-1.3c-0.8-0.9-1.1-2.2-1.1-3.8v-12.8h-3.7v-1.8h6.1v14.6c0,1,0.2,1.8,0.6,2.4
|
||||
c0.4,0.5,1,0.8,1.7,0.8h2.7v2H335.7z"/>
|
||||
<path class="st5" d="M349.8,429.6c-1.4,0-2.5-0.4-3.2-1.3c-0.8-0.9-1.1-2.2-1.1-3.8v-7.3h-3.1v-1.8h5.4v9.1c0,1,0.2,1.8,0.6,2.4
|
||||
c0.4,0.5,1,0.8,1.7,0.8h2.7v2H349.8z M345.6,412.8c-0.3,0-0.4-0.1-0.4-0.4v-2.2c0-0.3,0.1-0.4,0.4-0.4h1.8c0.3,0,0.4,0.1,0.4,0.4
|
||||
v2.2c0,0.3-0.1,0.4-0.4,0.4H345.6z"/>
|
||||
<path class="st5" d="M361.3,429.9c-1.8,0-3.1-0.7-3.9-2.1l-0.2,1.8H355v-19.7h2.3v7.3c0.4-0.7,0.9-1.3,1.6-1.6s1.5-0.5,2.3-0.5
|
||||
c1,0,1.9,0.2,2.6,0.7c0.7,0.4,1.2,1,1.7,1.7c0.4,0.7,0.7,1.5,0.9,2.4c0.2,0.9,0.3,1.8,0.3,2.6c0,0.9-0.1,1.8-0.3,2.6
|
||||
s-0.5,1.7-0.9,2.4c-0.4,0.7-1,1.3-1.7,1.7C363.1,429.6,362.3,429.9,361.3,429.9z M360.8,427.9c0.7,0,1.3-0.2,1.8-0.5
|
||||
c0.5-0.3,0.8-0.8,1-1.4c0.2-0.6,0.4-1.2,0.5-1.8c0.1-0.6,0.1-1.2,0.1-1.8s0-1.2-0.1-1.8c-0.1-0.6-0.2-1.2-0.5-1.8
|
||||
c-0.2-0.6-0.6-1-1-1.3c-0.5-0.3-1-0.5-1.8-0.5c-0.7,0-1.3,0.2-1.8,0.5c-0.5,0.3-0.8,0.8-1,1.3s-0.4,1.1-0.5,1.8
|
||||
c-0.1,0.6-0.1,1.2-0.1,1.8c0,0.6,0,1.2,0.1,1.8c0.1,0.6,0.2,1.2,0.5,1.8s0.6,1,1,1.3C359.5,427.7,360.1,427.9,360.8,427.9z"/>
|
||||
<path class="st5" d="M374.8,429.9c-2.2,0-3.9-0.7-5.1-2s-1.9-3.1-1.9-5.4c0-1.4,0.2-2.7,0.7-3.8s1.2-2,2.2-2.7s2.2-1,3.6-1
|
||||
c1.9,0,3.4,0.6,4.4,1.8c1,1.2,1.6,2.9,1.6,5v1.1h-10.1v0.1c0,1.5,0.4,2.7,1.2,3.5c0.8,0.9,1.9,1.3,3.4,1.3c0.9,0,1.7-0.1,2.5-0.4
|
||||
c0.8-0.3,1.6-0.6,2.4-1v2.3c-0.8,0.3-1.6,0.6-2.4,0.8C376.5,429.8,375.7,429.9,374.8,429.9z M378,421.1c0-0.8-0.1-1.5-0.4-2.1
|
||||
s-0.6-1.1-1.1-1.5c-0.5-0.4-1.2-0.6-2.1-0.6c-0.9,0-1.6,0.2-2.2,0.6s-1,0.9-1.4,1.5c-0.3,0.6-0.5,1.3-0.6,2.1H378z"/>
|
||||
<path class="st5" d="M383.7,415.3h2.1l0.2,2.8c0.4-1,1-1.8,1.8-2.3c0.8-0.5,1.8-0.8,2.9-0.8c1.2,0,2.2,0.3,3,0.9v2.4
|
||||
c-0.9-0.7-2-1.1-3.2-1.1c-1.4,0-2.5,0.5-3.3,1.4c-0.8,0.9-1.2,2.2-1.2,3.9v7h-2.3V415.3z"/>
|
||||
<path class="st5" d="M403.7,429.5c-1.7,0-3-0.4-3.7-1.1c-0.7-0.7-1.1-1.9-1.1-3.6v-7.7h-3.8v-1.8h3.8v-3.7l2.3-1v4.7h5.3v1.8h-5.3
|
||||
v7.7c0,1,0.2,1.8,0.6,2.2c0.4,0.4,1.1,0.6,2.1,0.6h2.6v1.9H403.7z"/>
|
||||
<path class="st5" d="M415.7,429.9c-2.2,0-3.9-0.7-5.1-2c-1.2-1.3-1.9-3.1-1.9-5.4c0-1.2,0.2-2.2,0.5-3.1s0.8-1.7,1.3-2.3
|
||||
c0.6-0.7,1.3-1.2,2.2-1.5s1.7-0.5,2.7-0.5c1.8,0,3.3,0.6,4.3,1.8c1,1.2,1.5,2.9,1.5,5v1.1h-10.1v0.1c0,1.5,0.4,2.7,1.2,3.6
|
||||
c0.4,0.4,0.9,0.7,1.4,0.9c0.6,0.2,1.2,0.3,2,0.3c0.8,0,1.6-0.1,2.3-0.4c0.4-0.1,0.8-0.3,1.3-0.4c0.4-0.2,0.9-0.4,1.3-0.6v2.3
|
||||
c-0.4,0.2-0.9,0.3-1.4,0.5s-0.9,0.3-1.2,0.3c-0.4,0.1-0.8,0.2-1.2,0.2C416.5,429.8,416.1,429.9,415.7,429.9z M418.9,421.1
|
||||
c0-0.7-0.1-1.3-0.3-1.9s-0.4-0.9-0.7-1.3c-0.6-0.7-1.5-1.1-2.6-1.1c-1.1,0-2.1,0.4-2.8,1.1c-0.7,0.7-1.1,1.8-1.3,3.1L418.9,421.1z
|
||||
M416.9,408.3h2.5l-4.1,4.8h-1.9L416.9,408.3z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M443.1,429.9c-2.2,0-3.9-0.7-5.1-2s-1.9-3.1-1.9-5.4c0-1.4,0.2-2.7,0.7-3.8s1.2-2,2.2-2.7s2.2-1,3.6-1
|
||||
c1.9,0,3.4,0.6,4.4,1.8c1,1.2,1.6,2.9,1.6,5v1.1h-10.1v0.1c0,1.5,0.4,2.7,1.2,3.5c0.8,0.9,1.9,1.3,3.4,1.3c0.9,0,1.7-0.1,2.5-0.4
|
||||
c0.8-0.3,1.6-0.6,2.4-1v2.3c-0.8,0.3-1.6,0.6-2.4,0.8C444.8,429.8,443.9,429.9,443.1,429.9z M446.2,421.1c0-0.8-0.1-1.5-0.4-2.1
|
||||
s-0.6-1.1-1.1-1.5c-0.5-0.4-1.2-0.6-2.1-0.6c-0.9,0-1.6,0.2-2.2,0.6s-1,0.9-1.4,1.5c-0.3,0.6-0.5,1.3-0.6,2.1H446.2z"/>
|
||||
<path class="st2" d="M455.6,429.9c-1.3,0-2.9-0.3-4.8-0.9v-2.4c1.8,0.9,3.3,1.3,4.7,1.3c1,0,1.8-0.2,2.4-0.6s0.9-1,0.9-1.7
|
||||
c0-0.6-0.2-1.1-0.7-1.4c-0.5-0.4-1.3-0.7-2.4-0.9l-1-0.2c-1.3-0.3-2.3-0.7-2.9-1.3c-0.6-0.6-0.9-1.5-0.9-2.5
|
||||
c0-1.4,0.5-2.4,1.4-3.1c0.9-0.7,2.2-1.1,4-1.1c1.5,0,2.9,0.3,4.2,0.8v2.3c-1.3-0.8-2.7-1.2-4.1-1.2c-2,0-3.1,0.7-3.1,2.1
|
||||
c0,0.5,0.1,0.8,0.3,1.1c0.2,0.3,0.5,0.5,1,0.7c0.5,0.2,1.2,0.4,2.2,0.6l0.9,0.2c2.3,0.5,3.5,1.7,3.5,3.8c0,1.4-0.5,2.5-1.5,3.3
|
||||
C458.7,429.5,457.3,429.9,455.6,429.9z"/>
|
||||
<path class="st2" d="M472,429.5c-1.7,0-3-0.4-3.7-1.1c-0.7-0.7-1.1-1.9-1.1-3.6v-7.7h-3.8v-1.8h3.8v-3.7l2.3-1v4.7h5.3v1.8h-5.3
|
||||
v7.7c0,1,0.2,1.8,0.6,2.2c0.4,0.4,1.1,0.6,2.1,0.6h2.6v1.9H472z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st6" d="M495.9,429.9c-2.9,0-4.3-1.9-4.3-5.7v-8.8h2.3v8.8c0,2.5,0.9,3.7,2.8,3.7c1.1,0,1.9-0.4,2.5-1.2
|
||||
c0.6-0.8,0.9-1.9,0.9-3.3v-8h2.3v14.1h-2.1l-0.2-2.1C499.2,429,497.8,429.9,495.9,429.9z"/>
|
||||
<path class="st6" d="M505.2,415.3h2.1l0.2,2.1c0.9-1.6,2.2-2.5,4.2-2.5c2.9,0,4.3,1.9,4.3,5.7v8.8h-2.3v-8.8
|
||||
c0-1.3-0.2-2.2-0.7-2.8c-0.4-0.6-1.1-0.9-2.1-0.9c-1.1,0-2,0.4-2.5,1.2c-0.6,0.8-0.9,1.9-0.9,3.3v8h-2.3V415.3z"/>
|
||||
<path class="st6" d="M538.9,429.9c-1.5,0-2.7-0.3-3.8-0.9s-1.8-1.5-2.3-2.6c-0.5-1.1-0.8-2.4-0.8-3.9c0-1.5,0.3-2.8,0.8-3.9
|
||||
c0.5-1.1,1.3-2,2.3-2.6c1-0.6,2.3-0.9,3.8-0.9c0.8,0,1.5,0.1,2.1,0.3c0.6,0.2,1.3,0.5,1.9,0.8v2.4c-0.6-0.5-1.2-0.9-1.8-1.2
|
||||
s-1.3-0.4-2.1-0.4c-1.1,0-2,0.2-2.7,0.7c-0.7,0.5-1.2,1.1-1.5,2c-0.3,0.8-0.4,1.7-0.4,2.8c0,1,0.2,1.9,0.5,2.8s0.8,1.5,1.5,2
|
||||
c0.7,0.5,1.6,0.7,2.7,0.7c0.7,0,1.4-0.1,2.1-0.4c0.6-0.2,1.2-0.6,1.8-1.2v2.4C541.8,429.5,540.5,429.9,538.9,429.9z"/>
|
||||
<path class="st6" d="M546.1,409.8h2.3v7.6c0.9-1.6,2.2-2.5,4.2-2.5c1.2,0,2.1,0.3,2.7,0.8c0.6,0.5,1,1.2,1.3,2.1
|
||||
c0.2,0.9,0.4,1.8,0.4,2.8v8.8h-2.3v-8.8c0-1.3-0.2-2.2-0.7-2.8c-0.4-0.6-1.1-0.9-2.1-0.9c-0.9,0-1.6,0.2-2.1,0.7
|
||||
c-0.5,0.4-0.8,1-1,1.7c-0.2,0.7-0.3,1.4-0.3,2.1v8h-2.3V409.8z"/>
|
||||
<path class="st6" d="M565.1,429.9c-2,0-3.5-0.6-4.5-1.9s-1.6-3.1-1.6-5.5c0-2.4,0.5-4.2,1.6-5.5s2.5-1.9,4.5-1.9
|
||||
c2,0,3.5,0.6,4.5,1.9c1,1.3,1.6,3.1,1.6,5.5c0,2.4-0.5,4.2-1.6,5.5C568.6,429.2,567.1,429.9,565.1,429.9z M565.1,427.9
|
||||
c1.2,0,2-0.5,2.7-1.4c0.6-0.9,0.9-2.3,0.9-4.1c0-1.8-0.3-3.1-0.9-4c-0.6-0.9-1.5-1.4-2.7-1.4c-1.2,0-2.1,0.5-2.7,1.4
|
||||
c-0.6,0.9-0.9,2.3-0.9,4c0,1.8,0.3,3.1,0.9,4.1C563.1,427.4,564,427.9,565.1,427.9z"/>
|
||||
<path class="st6" d="M581.8,429.6c-1.4,0-2.5-0.4-3.2-1.3c-0.8-0.9-1.1-2.2-1.1-3.8v-7.3h-3.1v-1.8h5.4v9.1c0,1,0.2,1.8,0.6,2.4
|
||||
c0.4,0.5,1,0.8,1.7,0.8h2.7v2H581.8z M577.6,412.8c-0.3,0-0.4-0.1-0.4-0.4v-2.2c0-0.3,0.1-0.4,0.4-0.4h1.8c0.3,0,0.4,0.1,0.4,0.4
|
||||
v2.2c0,0.3-0.1,0.4-0.4,0.4H577.6z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st6" d="M591.1,422.1l-5.1-6.8h2.6l3.8,5.1l3.7-5.1h2.6l-5.1,6.8l5.6,7.4h-2.7l-4.1-5.7l-4.1,5.7h-2.7L591.1,422.1z"
|
||||
/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M615.2,431h0.9c1.2,0,2-0.2,2.3-0.6c0.4-0.4,0.5-1.1,0.5-2.3v-3.1c0-1.3,0.2-2.3,0.6-2.9c0.4-0.6,1-1,2-1.2
|
||||
c-0.9-0.2-1.6-0.6-2-1.2c-0.2-0.3-0.3-0.7-0.4-1.1c-0.1-0.5-0.2-1-0.2-1.8v-3.1c0-1.2-0.2-2-0.5-2.3c-0.4-0.4-1.1-0.6-2.3-0.6
|
||||
h-0.9v-1.8h0.8c2.1,0,3.5,0.3,4.2,0.9c0.7,0.6,1.1,1.9,1.1,3.7v3c0,0.7,0.1,1.2,0.3,1.6c0.2,0.4,0.4,0.8,0.8,1
|
||||
c0.3,0.2,0.7,0.4,1.2,0.5c0.5,0.1,1,0.2,1.6,0.2h0.8v1.8h-0.8c-1.2,0-2.2,0.2-2.8,0.7c-0.4,0.3-0.6,0.6-0.8,1
|
||||
c-0.2,0.4-0.3,1-0.3,1.6v3c0,1.9-0.4,3.1-1.1,3.7c-0.7,0.6-2.1,0.9-4.2,0.9h-0.8V431z"/>
|
||||
<path class="st2" d="M628.8,431h0.9c1.2,0,2-0.2,2.3-0.6c0.4-0.4,0.5-1.1,0.5-2.3v-3.1c0-1.3,0.2-2.3,0.6-2.9c0.4-0.6,1-1,2-1.2
|
||||
c-0.9-0.2-1.6-0.6-2-1.2c-0.2-0.3-0.3-0.7-0.4-1.1c-0.1-0.5-0.2-1-0.2-1.8v-3.1c0-1.2-0.2-2-0.5-2.3c-0.4-0.4-1.1-0.6-2.3-0.6
|
||||
h-0.9v-1.8h0.8c2.1,0,3.5,0.3,4.2,0.9c0.7,0.6,1.1,1.9,1.1,3.7v3c0,0.7,0.1,1.2,0.3,1.6c0.2,0.4,0.4,0.8,0.8,1
|
||||
c0.3,0.2,0.7,0.4,1.2,0.5c0.5,0.1,1,0.2,1.6,0.2h0.8v1.8h-0.8c-1.2,0-2.2,0.2-2.8,0.7c-0.4,0.3-0.6,0.6-0.8,1
|
||||
c-0.2,0.4-0.3,1-0.3,1.6v3c0,1.9-0.4,3.1-1.1,3.7c-0.7,0.6-2.1,0.9-4.2,0.9h-0.8V431z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st7" d="M486.7,152.5c-0.3-0.1-0.6-0.2-0.9-0.3c3.3,2.8,5.3,7,5.3,11.7l-1.6,48.8c-0.1,2-0.1,4.1,0,6.1l1.6,46
|
||||
c0,8.6-6.9,15.5-15.5,15.5h-101c-3,0-5.7-0.9-8.1-2.3c0.4,0.5,0.8,1,1.2,1.5c2.9,3.6,8.2,10.3,9.8,11.3c3,1.8,6.5,2.7,10,2.7h98.3
|
||||
c12.2,0,22.2-9.9,22.2-22.2v-98.3c0-5.4-2-10.4-5.7-14C501,158.2,491,154.2,486.7,152.5z"/>
|
||||
<path class="st4" d="M505,156.4c-0.8-0.8-3.4-2-16.9-7.3c-2-0.8-3.8-1.5-4.1-1.6c-2.3-1.1-4.8-1.7-7.4-1.7H373.9
|
||||
c-9.6,0-17.4,7.8-17.4,17.5l2.3,44.3c0.3,4.9,0.3,9.8,0,14.7l-2.3,43.3l0,0.1c0,4.4,1.7,8.7,4.7,11.9c0.6,0.6,2,2.4,3.5,4.4
|
||||
c4.9,6.2,8.8,11,10.9,12.2c3.6,2.1,7.7,3.2,11.9,3.2h98.3c14.3,0,25.9-11.6,25.9-25.9v-98.3C511.8,166.7,509.4,160.7,505,156.4z
|
||||
M508,271.4c0,12.2-9.9,22.2-22.2,22.2h-98.3c-3.5,0-7-0.9-10-2.7c-1.7-1-7-7.7-9.8-11.3c-0.4-0.5-0.8-1-1.2-1.5
|
||||
c-4.4-2.7-7.4-7.6-7.4-13.2l2.7-40.2c0.5-7.6,0.5-15.2,0-22.8l-2.7-38.1c0-8.6,6.9-15.5,15.5-15.5h101c3.9,0,7.4,1.4,10.2,3.8
|
||||
c0.3,0.1,0.6,0.2,0.9,0.3c4.3,1.7,14.3,5.6,15.7,6.5c3.7,3.6,5.7,8.6,5.7,14V271.4z"/>
|
||||
<path class="st4" d="M475.7,280.4c8.6,0,15.5-6.9,15.5-15.5l-1.6-46c-0.1-2-0.1-4.1,0-6.1l1.6-48.8c0-4.7-2.1-8.8-5.3-11.7
|
||||
c-2.7-2.4-6.3-3.8-10.2-3.8h-101c-8.6,0-15.5,6.9-15.5,15.5l2.7,38.1c0.5,7.6,0.5,15.2,0,22.8l-2.7,40.2c0,5.6,3,10.5,7.4,13.2
|
||||
c2.4,1.4,5.1,2.3,8.1,2.3H475.7z M431.8,244.8c-1.8,0.5-3.7,0.8-5.7,0.8c-1.9,0-3.8-0.3-5.5-0.8c-1-0.3-1.6-1.2-1.6-2.2
|
||||
c0-3.4,0-11,0-11.3c0-1.8,0.7-7.4,7.1-7.4c6.7,0,7.2,6.5,7.2,7.6l0,11.1C433.3,243.6,432.7,244.5,431.8,244.8z M383.7,217.6
|
||||
c0-1.3,1-2.3,2.3-2.3l4.8,0c1,0,1.9-0.7,2.2-1.6c0.5-1.7,1.2-3.3,2-4.8c0.5-0.9,0.3-2-0.4-2.7l-3.4-3.4c-0.9-0.9-0.9-2.4,0-3.3
|
||||
l9.3-9.5c0.9-0.9,2.4-0.9,3.3,0l3.4,3.4c0.7,0.7,1.8,0.8,2.7,0.4c1.1-0.6,2.2-1.1,3.3-1.5c0.8-0.3,1.6-0.6,2.4-0.9
|
||||
c1-0.3,1.7-1.2,1.7-2.2l0-4.8c0-1.3,1-2.3,2.3-2.3l13.3,0.1c1.3,0,2.3,1,2.3,2.3l0,4.8c0,1,0.7,1.9,1.6,2.2
|
||||
c1.8,0.6,3.6,1.3,5.3,2.2c0.9,0.5,2,0.3,2.7-0.4l3.4-3.4c0.9-0.9,2.4-0.9,3.3,0l9.4,9.5c0.9,0.9,0.9,2.4,0,3.3l-3.4,3.4
|
||||
c-0.7,0.7-0.9,1.8-0.4,2.7c0.5,0.9,0.9,1.9,1.3,2.9c0.3,0.8,0.6,1.6,0.9,2.4c0.3,1,1.2,1.7,2.2,1.7l4.8,0c1.3,0,2.3,1,2.3,2.3
|
||||
l-0.1,11.2c0,1.3-1,2.3-2.3,2.3l-6.5,0l-8.6-0.1c-1.3,0-2.3-1-2.3-2.3c0-1.4,0-3.1,0-4.8c0-12.5-10.1-22.6-22.6-22.6
|
||||
s-22.6,10.1-22.6,22.6c0,1.5,0,3.2,0,4.4c0,1.3-1,2.3-2.3,2.3l-8.7-0.1l-6.5,0c-1.3,0-2.3-1-2.3-2.3L383.7,217.6z"/>
|
||||
<path class="st0" d="M385.9,231.2l6.5,0l8.7,0.1c1.3,0,2.3-1,2.3-2.3c0-1.3,0-2.9,0-4.4c0-12.5,10.1-22.6,22.6-22.6
|
||||
s22.6,10.1,22.6,22.6c0,1.6,0,3.4,0,4.8c0,1.3,1,2.3,2.3,2.3l8.6,0.1l6.5,0c1.3,0,2.3-1,2.3-2.3l0.1-11.2c0-1.3-1-2.3-2.3-2.3
|
||||
l-4.8,0c-1,0-1.9-0.7-2.2-1.7c-0.3-0.8-0.5-1.6-0.9-2.4c-0.4-1-0.8-1.9-1.3-2.9c-0.5-0.9-0.3-2,0.4-2.7l3.4-3.4
|
||||
c0.9-0.9,0.9-2.4,0-3.3l-9.4-9.5c-0.9-0.9-2.4-0.9-3.3,0l-3.4,3.4c-0.7,0.7-1.8,0.8-2.7,0.4c-1.7-0.9-3.5-1.6-5.3-2.2
|
||||
c-1-0.3-1.6-1.2-1.6-2.2l0-4.8c0-1.3-1-2.3-2.3-2.3l-13.3-0.1c-1.3,0-2.3,1-2.3,2.3l0,4.8c0,1-0.7,1.9-1.7,2.2
|
||||
c-0.8,0.3-1.6,0.5-2.4,0.9c-1.1,0.5-2.2,1-3.3,1.5c-0.9,0.5-2,0.3-2.7-0.4l-3.4-3.4c-0.9-0.9-2.4-0.9-3.3,0l-9.3,9.5
|
||||
c-0.9,0.9-0.9,2.4,0,3.3l3.4,3.4c0.7,0.7,0.9,1.8,0.4,2.7c-0.8,1.6-1.5,3.2-2,4.8c-0.3,1-1.2,1.6-2.2,1.6l-4.8,0
|
||||
c-1.3,0-2.3,1-2.3,2.3l-0.1,11.2C383.6,230.1,384.6,231.2,385.9,231.2z"/>
|
||||
<path class="st0" d="M426.1,223.9c-6.4,0-7.1,5.6-7.1,7.4c0,0.3,0,7.9,0,11.3c0,1,0.6,1.9,1.6,2.2c1.8,0.5,3.6,0.8,5.5,0.8
|
||||
c2,0,3.9-0.3,5.7-0.8c0.9-0.3,1.6-1.2,1.6-2.2l0-11.1C433.3,230.4,432.8,223.9,426.1,223.9z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st4" d="M276.6,396.5c-9.2,0-16.3-3.1-21.3-9.2c-4.9-6.2-7.4-15.1-7.4-26.7c0-11.7,2.5-20.6,7.4-26.7
|
||||
c4.9-6.2,12-9.2,21.3-9.2c2.7,0,5.2,0.3,7.6,0.8c2.4,0.6,4.7,1.4,6.8,2.5v15.2c-1.4-1.3-2.6-2.3-3.7-3c-1.1-0.7-2.1-1.3-3.1-1.7
|
||||
c-1.2-0.5-2.3-0.9-3.5-1.1c-1.1-0.2-2.3-0.3-3.4-0.3c-4.9,0-8.7,2-11.3,5.9c-2.6,4-3.8,10-3.8,17.7c0,7.8,1.3,13.7,3.8,17.6
|
||||
c2.6,4,6.3,6,11.3,6c2.4,0,4.7-0.5,6.9-1.5c1.1-0.5,2.2-1.1,3.2-1.8c1.1-0.7,2.3-1.7,3.6-2.9v15.2c-2.2,1.1-4.4,1.9-6.8,2.5
|
||||
C281.8,396.2,279.3,396.5,276.6,396.5z"/>
|
||||
<path class="st4" d="M321,396.5c-5.4,0-9.7-1.5-13.1-4.6c-3.3-3.1-5-7.5-5-13.3c0-3.6,0.7-6.6,2-8.9c1.3-2.3,3.1-4.1,5.4-5.4
|
||||
c2.3-1.3,4.8-2.1,7.7-2.6c2.9-0.5,5.9-0.7,9-0.7h9.4v-2.3c0-1.9-0.5-3.3-1.5-4.2c-1-1-2.2-1.6-3.8-1.9c-1.5-0.3-3.1-0.5-4.7-0.5
|
||||
c-3.3,0-6.4,0.4-9.4,1.3c-3,0.9-6,2.2-9,3.8v-11.6c3.2-1.3,6.4-2.2,9.6-2.8c3.2-0.6,6.4-0.9,9.6-0.9c5.7,0,10.2,0.8,13.5,2.4
|
||||
c3.3,1.6,5.7,4.1,7.1,7.5c1.4,3.4,2.1,7.7,2.1,12.9c0,1.2,0,2.8-0.1,4.6c0,1.9-0.1,3.8-0.1,5.7c0,1.7,0,3.2,0,4.7s0,2.7,0,3.8
|
||||
c0,0.9,0,2.1,0.1,3.5c0.1,1.4,0.3,2.9,0.6,4.4c0.3,1.5,0.9,2.7,1.6,3.7h-13.4c-0.6-1-1-1.9-1.3-2.8c-0.3-0.9-0.5-1.9-0.6-3
|
||||
c-1.8,2.4-4.1,4.2-6.8,5.4C327.2,395.9,324.2,396.5,321,396.5z M325.5,387.1c2.8,0,5.1-0.8,6.7-2.3c1.6-1.6,2.7-3.5,3.4-5.9
|
||||
c0.7-2.4,1-4.8,1-7.2v-0.9h-5.4c-2.1,0-4.2,0.1-6.3,0.4c-2.1,0.3-3.8,1-5.2,2.2c-1.4,1.2-2.1,3.1-2.1,5.7c0,2.5,0.7,4.5,2.1,5.9
|
||||
C321,386.4,322.9,387.1,325.5,387.1z"/>
|
||||
<path class="st4" d="M382.5,396.5c-5.8,0-10.4-2.4-13.7-7.3c-3.3-4.8-5-11.5-5-20c0-8.6,1.7-15.3,5-20.1s7.9-7.2,13.8-7.2
|
||||
c5.8,0,10.4,2.9,13.7,8.6V323h13.5v72.1h-12.2l-1.3-7.7C393.4,393.5,388.8,396.5,382.5,396.5z M386.8,385.4c2.9,0,5.2-1.5,6.9-4.4
|
||||
c1.7-2.9,2.6-6.8,2.6-11.7c0-4.9-0.9-8.7-2.6-11.7c-1.7-2.9-4.1-4.4-7-4.4c-2.9,0-5.1,1.4-6.8,4.2c-1.7,2.8-2.5,6.7-2.5,11.5
|
||||
c0,5,0.9,8.9,2.6,11.9C381.7,383.9,384,385.4,386.8,385.4z"/>
|
||||
<path class="st4" d="M447.8,396.5c-4.9,0-9.2-1.1-12.8-3.3c-3.6-2.2-6.4-5.4-8.3-9.4c-1.9-4.1-2.9-8.9-2.9-14.5
|
||||
c0-5.6,1-10.4,2.9-14.5c2-4.1,4.8-7.3,8.4-9.5c3.6-2.2,7.9-3.3,12.9-3.3c4.9,0,9.1,1.1,12.7,3.3c3.6,2.2,6.3,5.3,8.2,9.3
|
||||
c1.9,4,2.9,8.9,2.9,14.4c0,5.7-1,10.5-2.9,14.6c-2,4.1-4.7,7.3-8.3,9.5C457,395.4,452.8,396.5,447.8,396.5z M447.9,385.5
|
||||
c3.2,0,5.7-1.5,7.6-4.4c1.9-2.9,2.8-6.9,2.8-11.8c0-5-0.9-9-2.8-11.9c-1.9-2.9-4.4-4.4-7.6-4.4c-3.2,0-5.8,1.5-7.6,4.4
|
||||
c-1.9,2.9-2.8,6.9-2.8,11.8c0,5,0.9,8.9,2.8,11.8C442.1,384,444.7,385.5,447.9,385.5z"/>
|
||||
<path class="st4" d="M506.6,395.5c-6.4,0-11.1-1.7-13.9-5.1c-2.8-3.4-4.2-8.9-4.2-16.6v-40.4h-13.8V323H502v50.9
|
||||
c0,4,0.6,6.9,1.9,8.6c1.3,1.7,3.4,2.6,6.4,2.6h10.8v10.4H506.6z"/>
|
||||
<path class="st4" d="M558.4,396.5c-8.9,0-15.7-2.3-20.4-6.9c-4.7-4.6-7-11.3-7-20.1c0-5.5,1-10.4,2.9-14.5
|
||||
c1.9-4.1,4.8-7.3,8.6-9.6c3.8-2.3,8.6-3.4,14.3-3.4c4.7,0,8.8,1.1,12.3,3.3c3.5,2.2,6.1,5.2,8,9.2c1.9,3.9,2.9,8.5,2.9,13.7v5.5
|
||||
h-35.2c0,8.1,4.7,12.1,14.2,12.1c6.2,0,12.5-1.9,18.8-5.6v12.5C571.5,395.2,565,396.5,558.4,396.5z M566.3,363.4
|
||||
c0-3.6-0.9-6.3-2.6-8.1c-1.8-1.8-4.3-2.8-7.6-2.8c-3.3,0-6,0.9-7.8,2.8c-1.9,1.9-3,4.6-3.3,8.1H566.3z"/>
|
||||
<path class="st4" d="M612.6,396.5c-5.8,0-12.3-1.1-19.4-3.2v-11.9c6.1,3.5,12.2,5.2,18.3,5.2c6.4,0,9.6-1.9,9.6-5.7
|
||||
c0-1.7-0.8-3-2.3-4c-1.5-1-4.1-1.9-7.7-2.7l-3.8-0.8c-10-2.2-14.9-7.3-14.9-15.3c0-5.1,1.8-9.1,5.5-11.9c3.7-2.8,9-4.2,16.1-4.2
|
||||
c2.7,0,5.4,0.2,8.1,0.7c2.7,0.5,5.4,1.2,8.3,2.2v11.9c-2.7-1.7-5.3-2.9-7.8-3.7c-2.5-0.8-5-1.2-7.7-1.2c-3.1,0-5.5,0.4-7.1,1.3
|
||||
c-1.7,0.9-2.5,2.1-2.5,3.6c0,1.4,0.8,2.6,2.3,3.6c1.6,1,4.1,1.9,7.6,2.7l4.4,1.1c4.9,1.2,8.6,3.1,10.9,5.7c2.3,2.6,3.5,6,3.5,10.3
|
||||
C633.9,391,626.8,396.5,612.6,396.5z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 16 KiB |
BIN
images/password_tag_cloud.png
Normal file
BIN
images/password_tag_cloud.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 MiB |
9
images/registration_workflow.mmd
Normal file
9
images/registration_workflow.mmd
Normal file
@ -0,0 +1,9 @@
|
||||
sequenceDiagram
|
||||
actor Utilisateur
|
||||
Utilisateur->>Service: 1. J'aimerais m'inscrire avec le compte $USERNAME !
|
||||
Service->>Utilisateur: 2. Bien sûr, génère une paire de clé cryptographique <br /> et signe ce "challenge" avec ta clé privée !
|
||||
Utilisateur->>Service: 3. Voici ma clé publique et le "challenge" signé !
|
||||
Service->>Service: 4. Vérification que le "challenge" signé correspond bien au challenge envoyé.
|
||||
Service->>Service: 5. Création du compte $USERNAME <br />et association de la clé publique avec celui ci.
|
||||
Service->>Utilisateur: 6. Ton compte est bien créé <br />et ta clé publique associée à celui ci !
|
||||
|
1
images/registration_workflow.svg
Normal file
1
images/registration_workflow.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 22 KiB |
44
images/webauthn-svgrepo-com.svg
Normal file
44
images/webauthn-svgrepo-com.svg
Normal file
@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
|
||||
<svg
|
||||
fill="#000000"
|
||||
width="800px"
|
||||
height="800px"
|
||||
viewBox="0 0 24 24"
|
||||
role="img"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
sodipodi:docname="webauthn-svgrepo-com.svg"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="0.71875"
|
||||
inkscape:cx="399.30435"
|
||||
inkscape:cy="400"
|
||||
inkscape:window-width="1440"
|
||||
inkscape:window-height="831"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1" />
|
||||
<title
|
||||
id="title1">WebAuthn icon</title>
|
||||
<path
|
||||
d="M15.287 3.63a8.407 8.407 0 00-8.051 7.593h.55a7.805 7.805 0 012.24-4.713 5.825 5.825 0 00.924.695c-.608 1.177-.98 2.556-1.082 4.018h.135c.105-1.467.485-2.819 1.065-3.947.745.434 1.623.754 2.577.94a27.83 27.83 0 00-.25 3.763h-.847v.135h.847c.003 1.334.09 2.617.25 3.764-.954.185-1.832.506-2.577.94a9.997 9.997 0 01-.978-3.137h-.137c.164 1.16.502 2.25.997 3.208a5.825 5.825 0 00-.924.695 7.805 7.805 0 01-2.255-4.875H7.22A8.407 8.407 0 0024 12.034a8.398 8.398 0 00-.688-3.333 8.407 8.407 0 00-8.025-5.072zm.315.546c.155 0 .31.005.464.014.365.34.708 1.07.983 2.114a16.518 16.518 0 01.357 1.79 10.173 10.173 0 01-1.804.16 10.173 10.173 0 01-1.805-.16 16.519 16.519 0 01.357-1.79c.275-1.045.618-1.775.983-2.114a7.97 7.97 0 01.465-.014zm-.665.028c-.345.392-.658 1.093-.913 2.065a16.639 16.639 0 00-.36 1.8c-.939-.183-1.802-.498-2.533-.926.686-1.283 1.635-2.264 2.73-2.775a7.874 7.874 0 011.076-.164zm1.33 0a7.856 7.856 0 011.084.168c1.092.513 2.037 1.492 2.721 2.771-.73.428-1.594.743-2.533.927a16.64 16.64 0 00-.36-1.8c-.255-.972-.568-1.673-.912-2.066zm-2.972.314c-.655.407-1.257.989-1.776 1.73a8.166 8.166 0 00-.506.825 5.69 5.69 0 01-.891-.67 7.814 7.814 0 013.173-1.885zm4.624.006a7.862 7.862 0 013.164 1.877 5.692 5.692 0 01-.893.672 8.166 8.166 0 00-.506-.825c-.516-.738-1.115-1.318-1.765-1.724zm3.26 1.985a7.858 7.858 0 011.638 2.419 7.802 7.802 0 01.642 3.051h-2.095c-.01-1.74-.398-3.396-1.11-4.774a5.823 5.823 0 00.925-.696zm-1.044.767c.679 1.32 1.084 2.945 1.094 4.703h-3.42a27.863 27.863 0 00-.251-3.763c.954-.186 1.833-.506 2.577-.94zm-6.357.965a10.299 10.299 0 001.824.16 10.299 10.299 0 001.823-.16c.16 1.138.246 2.413.249 3.738h-1.178a1.03 1.03 0 01-.093.135h1.27a27.71 27.71 0 01-.248 3.739 10.397 10.397 0 00-3.647 0 27.733 27.733 0 01-.248-3.739h1.294a.99.99 0 01-.09-.135H13.53c.003-1.325.088-2.6.248-3.738zM2.558 9.37a2.585 2.585 0 00-2.547 2.35c-.142 1.541 1.064 2.842 2.566 2.842 1.26 0 2.312-.917 2.533-2.124h4.44v.972h.946v-.972h.837v1.431h.945v-2.376H5.11A2.586 2.586 0 002.558 9.37zm-.058.965a1.639 1.639 0 011.707 1.637 1.64 1.64 0 01-1.639 1.638 1.639 1.639 0 01-.068-3.275zm13.09.388a.75.75 0 00-.345 1.404l-.383 1.958h1.5l-.383-1.958a.75.75 0 00.384-.654.75.75 0 00-.773-.75zm2.218 1.391h3.421c-.01 1.758-.415 3.384-1.094 4.704-.744-.434-1.623-.755-2.577-.94a27.81 27.81 0 00.25-3.764zm3.556 0h2.095a7.805 7.805 0 01-2.281 5.47 5.825 5.825 0 00-.924-.696c.712-1.378 1.1-3.033 1.11-4.774zm-5.52 3.703a10.284 10.284 0 011.562.156 16.518 16.518 0 01-.357 1.791c-.275 1.045-.618 1.774-.982 2.114a7.972 7.972 0 01-.93 0c-.365-.34-.708-1.07-.983-2.114a16.519 16.519 0 01-.357-1.79 10.284 10.284 0 012.048-.157zm1.695.181c.94.184 1.803.5 2.533.926-.686 1.284-1.635 2.265-2.73 2.776a7.874 7.874 0 01-1.075.164c.344-.393.657-1.094.913-2.065a16.64 16.64 0 00.359-1.8zm-3.874 0a16.648 16.648 0 00.359 1.8c.255.973.568 1.674.913 2.066a7.873 7.873 0 01-1.075-.164c-1.096-.511-2.045-1.492-2.731-2.775.73-.428 1.594-.743 2.534-.927zm-2.652.997a8.16 8.16 0 00.506.825c.52.741 1.121 1.323 1.776 1.73a7.814 7.814 0 01-3.174-1.884 5.694 5.694 0 01.892-.67zm9.178 0a5.694 5.694 0 01.891.67 7.814 7.814 0 01-3.173 1.885c.654-.407 1.256-.989 1.775-1.73a8.16 8.16 0 00.507-.825z"
|
||||
id="path1"
|
||||
style="fill:#252525;fill-opacity:1" />
|
||||
</svg>
|
After Width: | Height: | Size: 4.4 KiB |
5
index.html
Normal file
5
index.html
Normal file
@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<body>
|
||||
<script src="https://cdn.jsdelivr.net/npm/cbor-js@latest/cbor.js"></script>
|
||||
</body>
|
||||
</html>
|
202
themes/cadoles/fonts/Roboto/LICENSE.txt
Normal file
202
themes/cadoles/fonts/Roboto/LICENSE.txt
Normal file
@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
BIN
themes/cadoles/fonts/Roboto/Roboto-Black.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-Black.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-BlackItalic.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-BlackItalic.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-Bold.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-Bold.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-BoldItalic.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-Italic.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-Italic.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-Light.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-Light.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-LightItalic.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-LightItalic.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-Medium.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-Medium.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-MediumItalic.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-MediumItalic.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-Regular.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-Regular.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-Thin.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-Thin.ttf
Normal file
Binary file not shown.
BIN
themes/cadoles/fonts/Roboto/Roboto-ThinItalic.ttf
Normal file
BIN
themes/cadoles/fonts/Roboto/Roboto-ThinItalic.ttf
Normal file
Binary file not shown.
36
themes/cadoles/theme.css
Normal file
36
themes/cadoles/theme.css
Normal file
@ -0,0 +1,36 @@
|
||||
/* @theme cadoles */
|
||||
|
||||
@import 'default';
|
||||
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
src: url("./themes/cadoles/fonts/Roboto/Roboto-Regular.ttf") format('truetype');
|
||||
}
|
||||
|
||||
section {
|
||||
font-family: "Roboto" !important;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #4792c9;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
h2, h3 {
|
||||
color: #4792c9;
|
||||
}
|
||||
|
||||
footer img {
|
||||
width: 32px;
|
||||
}
|
||||
|
||||
footer {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
footer a {
|
||||
margin-left: 1em;
|
||||
font-size: 0.9em;
|
||||
}
|
Loading…
Reference in New Issue
Block a user