web: dark/light theme fixes (#7872)
* web: fix css for user tree-view Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix unrelated things Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix header button colors Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix missing fallback not showing default slant Signed-off-by: Jens Langhammer <jens@goauthentik.io> * move global theme-dark css to only use for SSR rendered pages Signed-off-by: Jens Langhammer <jens@goauthentik.io> --------- Signed-off-by: Jens Langhammer <jens@goauthentik.io> # Conflicts: # .github/workflows/ci-main.yml # web/xliff/fr.xlf
This commit is contained in:
parent
a6b9274c4f
commit
29a6530742
|
@ -48,25 +48,38 @@ jobs:
|
||||||
- name: run migrations
|
- name: run migrations
|
||||||
run: poetry run python -m lifecycle.migrate
|
run: poetry run python -m lifecycle.migrate
|
||||||
test-migrations-from-stable:
|
test-migrations-from-stable:
|
||||||
|
name: test-migrations-from-stable - PostgreSQL ${{ matrix.psql }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
continue-on-error: true
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
psql:
|
||||||
|
- 12-alpine
|
||||||
|
- 15-alpine
|
||||||
|
- 16-alpine
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Setup authentik env
|
- name: Setup authentik env
|
||||||
uses: ./.github/actions/setup
|
uses: ./.github/actions/setup
|
||||||
|
with:
|
||||||
|
postgresql_version: ${{ matrix.psql }}
|
||||||
- name: checkout stable
|
- name: checkout stable
|
||||||
run: |
|
run: |
|
||||||
|
# Delete all poetry envs
|
||||||
|
rm -rf /home/runner/.cache/pypoetry
|
||||||
# Copy current, latest config to local
|
# Copy current, latest config to local
|
||||||
cp authentik/lib/default.yml local.env.yml
|
cp authentik/lib/default.yml local.env.yml
|
||||||
cp -R .github ..
|
cp -R .github ..
|
||||||
cp -R scripts ..
|
cp -R scripts ..
|
||||||
git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
|
git checkout version/$(python -c "from authentik import __version__; print(__version__)")
|
||||||
rm -rf .github/ scripts/
|
rm -rf .github/ scripts/
|
||||||
mv ../.github ../scripts .
|
mv ../.github ../scripts .
|
||||||
- name: Setup authentik env (ensure stable deps are installed)
|
- name: Setup authentik env (ensure stable deps are installed)
|
||||||
uses: ./.github/actions/setup
|
uses: ./.github/actions/setup
|
||||||
|
with:
|
||||||
|
postgresql_version: ${{ matrix.psql }}
|
||||||
- name: run migrations to stable
|
- name: run migrations to stable
|
||||||
run: poetry run python -m lifecycle.migrate
|
run: poetry run python -m lifecycle.migrate
|
||||||
- name: checkout current code
|
- name: checkout current code
|
||||||
|
@ -76,11 +89,16 @@ jobs:
|
||||||
git reset --hard HEAD
|
git reset --hard HEAD
|
||||||
git clean -d -fx .
|
git clean -d -fx .
|
||||||
git checkout $GITHUB_SHA
|
git checkout $GITHUB_SHA
|
||||||
poetry install
|
# Delete previous poetry env
|
||||||
|
rm -rf $(poetry env info --path)
|
||||||
- name: Setup authentik env (ensure latest deps are installed)
|
- name: Setup authentik env (ensure latest deps are installed)
|
||||||
uses: ./.github/actions/setup
|
uses: ./.github/actions/setup
|
||||||
|
with:
|
||||||
|
postgresql_version: ${{ matrix.psql }}
|
||||||
- name: migrate to latest
|
- name: migrate to latest
|
||||||
run: poetry run python -m lifecycle.migrate
|
run: |
|
||||||
|
poetry install
|
||||||
|
poetry run python -m lifecycle.migrate
|
||||||
test-unittest:
|
test-unittest:
|
||||||
name: test-unittest - PostgreSQL ${{ matrix.psql }}
|
name: test-unittest - PostgreSQL ${{ matrix.psql }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -97,7 +115,7 @@ jobs:
|
||||||
- name: Setup authentik env
|
- name: Setup authentik env
|
||||||
uses: ./.github/actions/setup
|
uses: ./.github/actions/setup
|
||||||
with:
|
with:
|
||||||
postgresql_tag: ${{ matrix.psql }}
|
postgresql_version: ${{ matrix.psql }}
|
||||||
- name: run unittest
|
- name: run unittest
|
||||||
run: |
|
run: |
|
||||||
poetry run make test
|
poetry run make test
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
{% block head_before %}
|
{% block head_before %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
<link rel="stylesheet" type="text/css" href="{% static 'dist/authentik.css' %}">
|
<link rel="stylesheet" type="text/css" href="{% static 'dist/authentik.css' %}">
|
||||||
<link rel="stylesheet" type="text/css" href="{% static 'dist/theme-dark.css' %}" media="(prefers-color-scheme: dark)">
|
|
||||||
<link rel="stylesheet" type="text/css" href="{% static 'dist/custom.css' %}" data-inject>
|
<link rel="stylesheet" type="text/css" href="{% static 'dist/custom.css' %}" data-inject>
|
||||||
<script src="{% static 'dist/poly.js' %}?version={{ version }}" type="module"></script>
|
<script src="{% static 'dist/poly.js' %}?version={{ version }}" type="module"></script>
|
||||||
<script src="{% static 'dist/standalone/loading/index.js' %}?version={{ version }}" type="module"></script>
|
<script src="{% static 'dist/standalone/loading/index.js' %}?version={{ version }}" type="module"></script>
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
{% block head_before %}
|
{% block head_before %}
|
||||||
<link rel="prefetch" href="/static/dist/assets/images/flow_background.jpg" />
|
<link rel="prefetch" href="/static/dist/assets/images/flow_background.jpg" />
|
||||||
<link rel="stylesheet" type="text/css" href="{% static 'dist/patternfly.min.css' %}">
|
<link rel="stylesheet" type="text/css" href="{% static 'dist/patternfly.min.css' %}">
|
||||||
|
<link rel="stylesheet" type="text/css" href="{% static 'dist/theme-dark.css' %}" media="(prefers-color-scheme: dark)">
|
||||||
{% include "base/header_js.html" %}
|
{% include "base/header_js.html" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -310,6 +310,12 @@ select[multiple] option:checked {
|
||||||
--pf-c-wizard__nav-link--before--BackgroundColor: transparent;
|
--pf-c-wizard__nav-link--before--BackgroundColor: transparent;
|
||||||
}
|
}
|
||||||
/* tree view */
|
/* tree view */
|
||||||
|
.pf-c-tree-view__node {
|
||||||
|
--pf-c-tree-view__node--Color: var(--ak-dark-foreground);
|
||||||
|
}
|
||||||
|
.pf-c-tree-view__node-toggle {
|
||||||
|
--pf-c-tree-view__node-toggle--Color: var(--ak-dark-foreground);
|
||||||
|
}
|
||||||
.pf-c-tree-view__node:focus {
|
.pf-c-tree-view__node:focus {
|
||||||
--pf-c-tree-view__node--focus--BackgroundColor: var(--ak-dark-background-light-ish);
|
--pf-c-tree-view__node--focus--BackgroundColor: var(--ak-dark-background-light-ish);
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,9 +82,9 @@ export class UserInterface extends Interface {
|
||||||
:host([theme="dark"]) .pf-c-page__header {
|
:host([theme="dark"]) .pf-c-page__header {
|
||||||
color: var(--ak-dark-foreground) !important;
|
color: var(--ak-dark-foreground) !important;
|
||||||
}
|
}
|
||||||
.pf-c-page__header-tools-item .fas,
|
:host([theme="light"]) .pf-c-page__header-tools-item .fas,
|
||||||
.pf-c-notification-badge__count,
|
:host([theme="light"]) .pf-c-notification-badge__count,
|
||||||
.pf-c-page__header-tools-group .pf-c-button {
|
:host([theme="light"]) .pf-c-page__header-tools-group .pf-c-button {
|
||||||
color: var(--ak-global--Color--100) !important;
|
color: var(--ak-global--Color--100) !important;
|
||||||
}
|
}
|
||||||
.pf-c-page {
|
.pf-c-page {
|
||||||
|
@ -183,7 +183,7 @@ export class UserInterface extends Interface {
|
||||||
<ak-enterprise-status interface="user"></ak-enterprise-status>
|
<ak-enterprise-status interface="user"></ak-enterprise-status>
|
||||||
<div class="pf-c-page">
|
<div class="pf-c-page">
|
||||||
<div class="background-wrapper" style="${this.uiConfig.theme.background}">
|
<div class="background-wrapper" style="${this.uiConfig.theme.background}">
|
||||||
${this.uiConfig.theme.background === ""
|
${(this.uiConfig.theme.background || "") === ""
|
||||||
? html`<div class="background-default-slant"></div>`
|
? html`<div class="background-default-slant"></div>`
|
||||||
: html``}
|
: html``}
|
||||||
</div>
|
</div>
|
||||||
|
|
144
web/xliff/fr.xlf
144
web/xliff/fr.xlf
|
@ -2561,31 +2561,6 @@ Il y a <x id="0" equiv-text="${ago}"/> jour(s)</target>
|
||||||
<source>If the password's score is less than or equal this value, the policy will fail.</source>
|
<source>If the password's score is less than or equal this value, the policy will fail.</source>
|
||||||
<target>Si le score du mot de passe est inférieur ou égal à cette valeur, la politique échoue.</target>
|
<target>Si le score du mot de passe est inférieur ou égal à cette valeur, la politique échoue.</target>
|
||||||
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="s1bfe7505059d164f">
|
|
||||||
<source>0: Too guessable: risky password. (guesses < 10^3)</source>
|
|
||||||
<target>0: Trop prévisible: mot de passe risqué. (essais < 10^3)</target>
|
|
||||||
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="s423d1f2477998d0b">
|
|
||||||
<source>1: Very guessable: protection from throttled online attacks. (guesses < 10^6)</source>
|
|
||||||
<target>1: Très prévisible: protection contre les attaques en ligne limitées. (essais < 10^6)</target>
|
|
||||||
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="s33849cc046eb901d">
|
|
||||||
<source>2: Somewhat guessable: protection from unthrottled online attacks. (guesses < 10^8)</source>
|
|
||||||
<target>2: Quelque peu prévisible: protection contre les attaques en ligne non limitées. (essais < 10^8)</target>
|
|
||||||
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="s578dcce295718e1b">
|
|
||||||
<source>3: Safely unguessable: moderate protection from offline slow-hash scenario. (guesses < 10^10)</source>
|
|
||||||
<target>3: Sûrement imprévisible: protection modérée contre les attaques de hash-lent hors ligne. (essais < 10^10)</target>
|
|
||||||
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="s7a46de49f4eba5d7">
|
|
||||||
<source>4: Very unguessable: strong protection from offline slow-hash scenario. (guesses >= 10^10)</source>
|
|
||||||
<target>4: Très imprévisible: forte protection control les attaques de hash-lent hors ligne. (essais >= 10^10)</target>
|
|
||||||
|
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="sd6cd7ce2310a73a4">
|
<trans-unit id="sd6cd7ce2310a73a4">
|
||||||
<source>Checks the value from the policy request against several rules, mostly used to ensure password strength.</source>
|
<source>Checks the value from the policy request against several rules, mostly used to ensure password strength.</source>
|
||||||
|
@ -6583,9 +6558,9 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti
|
||||||
|
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s96b3cddf33e1c853">
|
<trans-unit id="s96b3cddf33e1c853">
|
||||||
<source>You're currently impersonating <x id="0" equiv-text="${this.user.user.username}"/>. Click to stop.</source>
|
<source>You're currently impersonating <x id="0" equiv-text="${this.impersonation}"/>. Click to stop.</source>
|
||||||
<target>Vous vous faites actuellement passer pour
|
<target>Vous vous faites actuellement passer pour
|
||||||
<x id="0" equiv-text="${this.user.user.username}"/>. Cliquer pour arrêter.</target>
|
<x id="0" equiv-text="${this.impersonation}"/>. Cliquer pour arrêter.</target>
|
||||||
|
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s7031e6928c44cedd">
|
<trans-unit id="s7031e6928c44cedd">
|
||||||
|
@ -7642,14 +7617,6 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti
|
||||||
<source>Your application has been saved</source>
|
<source>Your application has been saved</source>
|
||||||
<target>L'application a été sauvegardée</target>
|
<target>L'application a été sauvegardée</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="sf60f1e5b76897c93">
|
|
||||||
<source>In the Application:</source>
|
|
||||||
<target>Dans l'application :</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="s7ce65cf482b7bff0">
|
|
||||||
<source>In the Provider:</source>
|
|
||||||
<target>Dans le fournisseur :</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="s67d858051b34c38b">
|
<trans-unit id="s67d858051b34c38b">
|
||||||
<source>Method's display Name.</source>
|
<source>Method's display Name.</source>
|
||||||
<target>Nom d'affichage de la méthode.</target>
|
<target>Nom d'affichage de la méthode.</target>
|
||||||
|
@ -7950,24 +7917,131 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="sb35c08e3a541188f">
|
<trans-unit id="sb35c08e3a541188f">
|
||||||
<source>Also known as Client ID.</source>
|
<source>Also known as Client ID.</source>
|
||||||
|
<target>Également appelé Client ID.</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="sd46fd9b647cfea10">
|
<trans-unit id="sd46fd9b647cfea10">
|
||||||
<source>Also known as Client Secret.</source>
|
<source>Also known as Client Secret.</source>
|
||||||
|
<target>Également appelé Client Secret.</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s4476e9c50cfd13f4">
|
<trans-unit id="s4476e9c50cfd13f4">
|
||||||
<source>Global status</source>
|
<source>Global status</source>
|
||||||
|
<target>État global</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="sd21a971eea208533">
|
<trans-unit id="sd21a971eea208533">
|
||||||
<source>Vendor</source>
|
<source>Vendor</source>
|
||||||
|
<target>Fournisseur</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="sadadfe9dfa06d7dd">
|
<trans-unit id="sadadfe9dfa06d7dd">
|
||||||
<source>No sync status.</source>
|
<source>No sync status.</source>
|
||||||
|
<target>Pas d'état de synchronisation.</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s2b1c81130a65a55b">
|
<trans-unit id="s2b1c81130a65a55b">
|
||||||
<source>Sync currently running.</source>
|
<source>Sync currently running.</source>
|
||||||
|
<target>Synchronisation en cours.</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="sf36170f71cea38c2">
|
<trans-unit id="sf36170f71cea38c2">
|
||||||
<source>Connectivity</source>
|
<source>Connectivity</source>
|
||||||
|
<target>Connectivité</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sd94e99af8b41ff54">
|
||||||
|
<source>0: Too guessable: risky password. (guesses &lt; 10^3)</source>
|
||||||
|
<target>0: Trop prévisible: mot de passe risqué. (essais &lt; 10^3)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc926385d1a624c3a">
|
||||||
|
<source>1: Very guessable: protection from throttled online attacks. (guesses &lt; 10^6)</source>
|
||||||
|
<target>1: Très prévisible: protection contre les attaques en ligne limitées. (essais &lt; 10^6)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s8aae61c41319602c">
|
||||||
|
<source>2: Somewhat guessable: protection from unthrottled online attacks. (guesses &lt; 10^8)</source>
|
||||||
|
<target>2: Quelque peu prévisible: protection contre les attaques en ligne non limitées. (essais &lt; 10^8)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sc1f4b57e722a89d6">
|
||||||
|
<source>3: Safely unguessable: moderate protection from offline slow-hash scenario. (guesses &lt; 10^10)</source>
|
||||||
|
<target>3: Sûrement imprévisible: protection modérée contre les attaques de hash-lent hors ligne. (essais &lt; 10^10)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sd47f3d3c9741343d">
|
||||||
|
<source>4: Very unguessable: strong protection from offline slow-hash scenario. (guesses &gt;= 10^10)</source>
|
||||||
|
<target>4: Très imprévisible: forte protection control les attaques de hash-lent hors ligne. (essais &gt;= 10^10)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s3d2a8b86a4f5a810">
|
||||||
|
<source>Successfully created user and added to group <x id="0" equiv-text="${this.group.name}"/></source>
|
||||||
|
<target>Utilisateur créé et ajouté au groupe <x id="0" equiv-text="${this.group.name}"/> avec succès</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s824e0943a7104668">
|
||||||
|
<source>This user will be added to the group "<x id="0" equiv-text="${this.targetGroup.name}"/>".</source>
|
||||||
|
<target>Cet utilisateur sera ajouté au groupe &quot;<x id="0" equiv-text="${this.targetGroup.name}"/>&quot;.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s62e7f6ed7d9cb3ca">
|
||||||
|
<source>Pretend user exists</source>
|
||||||
|
<target>Faire comme si l'utilisateur existe</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s52bdc80690a9a8dc">
|
||||||
|
<source>When enabled, the stage will always accept the given user identifier and continue.</source>
|
||||||
|
<target>Lorsqu'activé, l'étape acceptera toujours l'identifiant utilisateur donné et continuera.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="scda8dc24b561e205">
|
||||||
|
<source>There was an error in the application.</source>
|
||||||
|
<target>Une erreur a été rencontrée dans l'application.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sdaca9c2c0361ed3a">
|
||||||
|
<source>Review the application.</source>
|
||||||
|
<target>Passer en revue l'application.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sb50000a8fada5672">
|
||||||
|
<source>There was an error in the provider.</source>
|
||||||
|
<target>Une erreur a été rencontrée dans le fournisseur.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s21f95eaf151d4ce3">
|
||||||
|
<source>Review the provider.</source>
|
||||||
|
<target>Passer en revue le fournisseur.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s9fd39a5cb20b4e61">
|
||||||
|
<source>There was an error</source>
|
||||||
|
<target>Il y a eu une erreur</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s7a6b3453209e1066">
|
||||||
|
<source>There was an error creating the application, but no error message was sent. Please review the server logs.</source>
|
||||||
|
<target>Il y a eu une erreur lors de la création de l'application, mais aucun message d'erreur n'a été envoyé. Veuillez consulter les logs du serveur.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s1a711c19cda48375">
|
||||||
|
<source>Configure LDAP Provider</source>
|
||||||
|
<target>Configurer le fournisseur LDAP</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s9368e965b5c292ab">
|
||||||
|
<source>Configure OAuth2/OpenId Provider</source>
|
||||||
|
<target>Configurer le fournisseur OAuth2/OpenID</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sf5cbccdc6254c8dc">
|
||||||
|
<source>Configure Proxy Provider</source>
|
||||||
|
<target>Configurer le fournisseur Proxy</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sf6d46bb442b77e91">
|
||||||
|
<source>AdditionalScopes</source>
|
||||||
|
<target>Scopes additionels</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s2c8c6f89089b31d4">
|
||||||
|
<source>Configure Radius Provider</source>
|
||||||
|
<target>Configurer le fournisseur Radius</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sfe906cde5dddc041">
|
||||||
|
<source>Configure SAML Provider</source>
|
||||||
|
<target>Configurer le fournisseur SAML</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sb3defbacd01ad972">
|
||||||
|
<source>Property mappings used for user mapping.</source>
|
||||||
|
<target>Mappages de propriété utilisés pour la correspondance des utilisateurs.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s7ccce0ec8d228db6">
|
||||||
|
<source>Configure SCIM Provider</source>
|
||||||
|
<target>Configurer le fournisseur SCIM</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sd7728d2b6e1d25e9">
|
||||||
|
<source>Property mappings used for group creation.</source>
|
||||||
|
<target>Mappages de propriétés utilisés lors de la création des groupe</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="s7513372fe60f6387">
|
||||||
|
<source>Event volume</source>
|
||||||
|
<target>Volume d'événements</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
|
|
Reference in New Issue