Skip to content

Commit

Permalink
[v6][cherry-pick] adds new privacy link to Riverty (#2781) (#2785)
Browse files Browse the repository at this point in the history
* [v5] adds new privacy link to Riverty (#2781)

* adds new privacy link to riverty

* update translations

* update test selector

* chore: clean up constructor

* fix linting issues
  • Loading branch information
m1aw authored Aug 12, 2024
1 parent fc126cf commit e20bae2
Show file tree
Hide file tree
Showing 31 changed files with 102 additions and 32 deletions.
5 changes: 5 additions & 0 deletions .changeset/witty-seals-mix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@adyen/adyen-web": patch
---

adds privacy link to Riverty
10 changes: 8 additions & 2 deletions packages/lib/src/components/Riverty/Riverty.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { render, screen } from '@testing-library/preact';
import { Resources } from '../../core/Context/Resources';
import { SRPanel } from '../../core/Errors/SRPanel';
import getDataset from '../../core/Services/get-dataset';
import { termsAndConditionsUrlMap } from './config';
import { privacyPolicyUrlMap, termsAndConditionsUrlMap } from './config';
import type { OpenInvoiceConfiguration } from '../helpers/OpenInvoiceContainer/types';

jest.mock('../../core/Services/get-dataset');
Expand Down Expand Up @@ -109,8 +109,14 @@ describe('Riverty', () => {
describe('terms and conditions', () => {
test('should show the correct t&c urls', async () => {
render(new Riverty(global.core, props).render());
const tcLink = await screen.findByRole('link', { name: 'payment conditions' });
const tcLink = await screen.findByRole('link', { name: 'Terms & Conditions' });
expect(tcLink).toHaveAttribute('href', termsAndConditionsUrlMap[props.countryCode.toLowerCase()].en);
});

test('should show the correct privacy urls', async () => {
render(new Riverty(global.core, props).render());
const tcLink = await screen.findByRole('link', { name: 'here' });
expect(tcLink).toHaveAttribute('href', privacyPolicyUrlMap[props.countryCode.toLowerCase()].en);
});
});
});
18 changes: 14 additions & 4 deletions packages/lib/src/components/Riverty/Riverty.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import { h } from 'preact';
import OpenInvoiceContainer from '../helpers/OpenInvoiceContainer';
import {
DISCLAIMER_MESSAGE_TRANSLATION_KEY,
allowedBillingCountries,
allowedDeliveryCountries,
deliveryAddressSpecification,
personalDetailsRequiredFields,
termsAndConditionsUrlMap
termsAndConditionsUrlMap,
privacyPolicyUrlMap
} from './config';
import ConsentCheckboxLabel from '../internal/ConsentCheckboxLabel';
import { getConsentUrl } from '../../utils/getConsentUrl';
import { LabelOnlyDisclaimerMessage } from '../internal/DisclaimerMessage/DisclaimerMessage';
import type { OpenInvoiceConfiguration } from '../helpers/OpenInvoiceContainer/types';
import { TxVariants } from '../tx-variants';

Expand All @@ -22,14 +24,22 @@ export default class Riverty extends OpenInvoiceContainer {
};

formatProps(props: OpenInvoiceConfiguration) {
const tocURL = getConsentUrl(props.countryCode, props.i18n?.locale, termsAndConditionsUrlMap);
const privacyURL = getConsentUrl(props.countryCode, props.i18n?.locale, privacyPolicyUrlMap);

return {
...super.formatProps(props),
billingAddressSpecification: {
...props.billingAddressSpecification,
allowedCountries: props.countryCode ? [props.countryCode] : allowedBillingCountries
},
deliveryAddressSpecification: { ...props.deliveryAddressSpecification, allowedCountries: allowedDeliveryCountries },
consentCheckboxLabel: <ConsentCheckboxLabel url={getConsentUrl(props.countryCode, props.i18n?.locale, termsAndConditionsUrlMap)} />
deliveryAddressSpecification: {
...props.deliveryAddressSpecification,
allowedCountries: allowedDeliveryCountries
},
consentCheckboxLabel: (
<LabelOnlyDisclaimerMessage message={props.i18n.get(DISCLAIMER_MESSAGE_TRANSLATION_KEY)} urls={[tocURL, privacyURL]} />
)
};
}
}
18 changes: 18 additions & 0 deletions packages/lib/src/components/Riverty/config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { CITY, COUNTRY, FIRST_NAME, HOUSE_NUMBER_OR_NAME, LAST_NAME, POSTAL_CODE, STREET } from '../internal/Address/constants';
import { AddressSpecifications } from '../internal/Address/types';

export const DISCLAIMER_MESSAGE_TRANSLATION_KEY = 'riverty.termsAndConditions';

export const allowedBillingCountries = ['AT', 'CH', 'DE'];
export const allowedDeliveryCountries = ['NO', 'SE', 'FI', 'DK', 'DE', 'AT', 'CH', 'NL', 'BE'];
export const personalDetailsRequiredFields = ['firstName', 'lastName', 'dateOfBirth', 'shopperEmail', 'telephoneNumber'];
Expand Down Expand Up @@ -43,3 +45,19 @@ export const termsAndConditionsUrlMap = {
de: 'https://documents.riverty.com/terms_conditions/payment_methods/invoice/de_de'
}
};

export const privacyPolicyUrlMap = {
at: {
en: 'https://documents.riverty.com/privacy_statement/checkout/at_en',
de: 'https://documents.riverty.com/privacy_statement/checkout/at_de'
},
ch: {
en: 'https://documents.riverty.com/privacy_statement/checkout/ch_en',
de: 'https://documents.riverty.com/privacy_statement/checkout/h_de',
fr: 'https://documents.riverty.com/privacy_statement/checkout/ch_fr'
},
de: {
en: 'https://documents.riverty.com/privacy_statement/checkout/de_en',
de: 'https://documents.riverty.com/privacy_statement/checkout/de_de'
}
};
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { h } from 'preact';
import { Fragment, h } from 'preact';
import { isValidHttpUrl } from '../../../utils/isValidURL';
import './DisclaimerMessage.scss';
import { interpolateElement } from '../../../language/utils';

export interface DisclaimerMsgObject {
message: string;
linkText: string;
Expand All @@ -13,22 +14,6 @@ interface InternalDisclaimerMsgObject {
urls: Array<string>;
}

function render(message: string, urls: Array<string>) {
return (
<span className="adyen-checkout-disclaimer__label">
{interpolateElement(
message,
// eslint-disable-next-line react/display-name
urls.map(url => translation => (
<a className="adyen-checkout-link" href={url} target="_blank" rel="noopener noreferrer">
{translation}
</a>
))
)}
</span>
);
}

/**
* props: {
* message: 'By continuing you agree with the %#terms and conditions%#',
Expand All @@ -38,14 +23,34 @@ function render(message: string, urls: Array<string>) {
*/

export default function DisclaimerMessage({ message, urls }: InternalDisclaimerMsgObject) {
try {
const messageIsStr = typeof message === 'string';
const validUrls = urls.every(url => typeof url === 'string' && isValidHttpUrl(url));
if (!messageIsStr || !validUrls) return null;
return (
<span className="adyen-checkout-disclaimer__label">
<LabelOnlyDisclaimerMessage message={message} urls={urls} />
</span>
);
}

export function LabelOnlyDisclaimerMessage({ message, urls }: InternalDisclaimerMsgObject) {
const messageIsStr = typeof message === 'string';
const validUrls = urls.every(url => typeof url === 'string' && isValidHttpUrl(url));
if (!messageIsStr || !validUrls) return null;

return render(message, urls);
} catch (e) {
console.warn('Errors rendering disclaimer message');
return null;
}
return (
<Fragment>
{interpolateElement(
message,
urls.map(
// for each URL in the URLs array, return a createLink function
url =>
function createLink(translation) {
return (
<a className="adyen-checkout__link" href={url} target="_blank" rel="noopener noreferrer">
{translation}
</a>
);
}
)
)}
</Fragment>
);
}
1 change: 1 addition & 0 deletions packages/server/translations/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "اختيار البنك",
"privacyPolicy": "سياسة الخصوصية",
"afterPay.agreement": "أوافق على ٪ @ لشركة Riverty",
"riverty.termsAndConditions": "أوافق على %#الشروط والأحكام%# العامة لوسيلة دفع Riverty. يمكن العثور على سياسة الخصوصية لـ Riverty %#هنا%#.",
"paymentConditions": "شروط الدفع",
"openApp": "فتح التطبيق",
"voucher.readInstructions": "قراءة التعليمات",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/cs-CZ.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Výběr banky",
"privacyPolicy": "Zásady ochrany osobních údajů",
"afterPay.agreement": "Souhlasím s %@ of Riverty",
"riverty.termsAndConditions": "Souhlasím s obecnými %#Smluvními podmínkami%# platební metody Riverty. Zásady ochrany osobních údajů společnosti Riverty najdete %#tady%#.",
"paymentConditions": "platebními podmínkami",
"openApp": "Otevřete aplikaci",
"voucher.readInstructions": "Přečtěte si pokyny",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/da-DK.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Bankvalg",
"privacyPolicy": "Politik om privatlivets fred",
"afterPay.agreement": "Jeg accepterer %@ fra Riverty",
"riverty.termsAndConditions": "Jeg accepterer de generelle %#vilkår og betingelser%# for Riverty-betalingsmåden. Rivertys privatlivspolitik kan findes %#her%#.",
"paymentConditions": "betalingsbetingelser",
"openApp": "Åbn appen",
"voucher.readInstructions": "Læs anvisningerne",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/de-DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Auswahl der Bank",
"privacyPolicy": "Datenschutz",
"afterPay.agreement": "Ich stimme den %@ von Riverty zu",
"riverty.termsAndConditions": "Ich bin mit den allgemeinen %#Geschäftsbedingungen%# für die Zahlungsmethode Riverty einverstanden. Die Datenschutzerklärung von Riverty finden Sie %#hier%#.",
"paymentConditions": "Zahlungsbedingungen",
"openApp": "App öffnen",
"voucher.readInstructions": "Anweisungen lesen",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/el-GR.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Επιλογή τράπεζας",
"privacyPolicy": "Πολιτική απορρήτου",
"afterPay.agreement": "Αποδέχομαι τους %@ του Riverty",
"riverty.termsAndConditions": "Συμφωνώ με τους γενικούς %#Όρους και προϋποθέσεις%# για τη μέθοδο πληρωμής Riverty. Μπορείτε να βρείτε την πολιτική απορρήτου της Riverty %#εδώ%#.",
"paymentConditions": "όρους πληρωμής",
"openApp": "Άνοιγμα της εφαρμογής",
"voucher.readInstructions": "Διαβάστε τις οδηγίες",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Bank selection",
"privacyPolicy": "Privacy policy",
"afterPay.agreement": "I agree with the %@ of Riverty",
"riverty.termsAndConditions": "I agree with the general %#Terms & Conditions%# for the Riverty Payment Method. The privacy policy of Riverty can be found %#here%#.",
"paymentConditions": "payment conditions",
"openApp": "Open the app",
"voucher.readInstructions": "Read instructions",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/es-ES.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Selección del banco",
"privacyPolicy": "Política de privacidad",
"afterPay.agreement": "Sí, acepto las %@ de Riverty",
"riverty.termsAndConditions": "Acepto los %#términos y condiciones%# generales para el método de pago Riverty. Puede consultar la política de privacidad de Riverty %#aquí%#.",
"paymentConditions": "condiciones de pago",
"openApp": "Abrir la aplicación",
"voucher.readInstructions": "Leer instrucciones",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/fi-FI.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Pankin valinta",
"privacyPolicy": "Tietosuojamenettely",
"afterPay.agreement": "Hyväksyn Rivertyn %@",
"riverty.termsAndConditions": "Hyväksyn Riverty-maksutavan yleiset %#ehdot%#. Rivertyn tietosuojakäytäntö löytyy %#täältä%#.",
"paymentConditions": "maksuehdot",
"openApp": "Avaa sovellus",
"voucher.readInstructions": "Lue ohjeet",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/fr-FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Choix de la banque",
"privacyPolicy": "Politique de confidentialité",
"afterPay.agreement": "J'accepte les %@ de Riverty",
"riverty.termsAndConditions": "J'accepte les %#Conditions générales%# du mode de paiement Riverty. La Politique de confidentialité de Riverty peut être consultée %#ici%#.",
"paymentConditions": "conditions de paiement",
"openApp": "Ouvrir l'application",
"voucher.readInstructions": "Lire les instructions",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/hr-HR.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Odabir banke",
"privacyPolicy": "Politika privatnosti",
"afterPay.agreement": "Slažem se s %@ Rivertyja",
"riverty.termsAndConditions": "Slažem se s općim %#Uvjetima i odredbama%# za način plaćanja Riverty. Pravila privatnosti tvrtke Riverty nalaze se %#ovdje%#.",
"paymentConditions": "uvjetima plaćanja",
"openApp": "Otvorite aplikaciju",
"voucher.readInstructions": "Pročitajte upute",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/hu-HU.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Bankválasztás",
"privacyPolicy": "Adatvédelmi szabályzat",
"afterPay.agreement": "Elfogadom a következőt: Riverty %@",
"riverty.termsAndConditions": "Elfogadom a Riverty fizetési módra vonatkozó %#általános szerződési feltételeket%#. A Riverty adatvédelmi szabályzata %#itt%# található.",
"paymentConditions": "fizetési feltételeit",
"openApp": "Alkalmazás megnyitása",
"voucher.readInstructions": "Olvassa el az utasításokat",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/it-IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Selezione della banca",
"privacyPolicy": "Informativa sulla privacy",
"afterPay.agreement": "Accetto i %@ di Riverty",
"riverty.termsAndConditions": "Accetto con i %#Termini e le condizioni%# generali per il metodo di Pagamento Riverty. L'informativa sulla privacy di Riverty è disponibile %#qui%#.",
"paymentConditions": "termini di pagamento",
"openApp": "Apri l'app",
"voucher.readInstructions": "Leggi le istruzioni",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/ja-JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "銀行選択",
"privacyPolicy": "プライバシーポリシー",
"afterPay.agreement": "Rivertyの%@で同意",
"riverty.termsAndConditions": "Rivertyの支払方法の一般的な%#利用規約%#に同意します。Rivertyのプライバシーポリシーについては、%#こちら%#をご覧ください。",
"paymentConditions": "支払条件",
"openApp": "アプリを開く",
"voucher.readInstructions": "手順を参照してください",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/ko-KR.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "은행 선택",
"privacyPolicy": "개인정보 보호정책",
"afterPay.agreement": "Riverty의 %@에 동의합니다.",
"riverty.termsAndConditions": "Riverty 결제 수단에 대한 일반 %#이용 약관%#에 동의합니다. Riverty의 개인정보 보호정책은 %#여기%#에서 확인할 수 있습니다.",
"paymentConditions": "결제 조건",
"openApp": "앱 열기",
"voucher.readInstructions": "안내 읽기",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/nl-NL.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Bankselectie",
"privacyPolicy": "Privacybeleid",
"afterPay.agreement": "Ik ga akkoord met de %@ van Riverty",
"riverty.termsAndConditions": "Ik ga akkoord met de %#algemene voorwaarden%# voor de betalingsmethode Riverty. Het privacybeleid van Riverty vindt u %#hier%#.",
"paymentConditions": "betalingsvoorwaarden",
"openApp": "Open de app",
"voucher.readInstructions": "Instructies lezen",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/no-NO.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Valg av bank",
"privacyPolicy": "Retningslinjer for personvern",
"afterPay.agreement": "Jeg godtar Rivertys %@",
"riverty.termsAndConditions": "Jeg godtar de generelle %#vilkårene%# for Riverty-betalingsmetoden. Personvernerklæringen til Riverty finner du %#her%#.",
"paymentConditions": "betalingsbetingelser",
"openApp": "Åpne appen",
"voucher.readInstructions": "Les instruksjoner",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/pl-PL.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Wybór banku",
"privacyPolicy": "Polityka prywatności.",
"afterPay.agreement": "Zgadzam się z %@ Riverty",
"riverty.termsAndConditions": "Zgadzam się z ogólnym %#Regulaminem%# metody płatności Riverty. Politykę prywatności Riverty można znaleźć %#tutaj%#.",
"paymentConditions": "warunki płatności",
"openApp": "Otwórz aplikację",
"voucher.readInstructions": "Przeczytaj instrukcje",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/pt-BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Seleção do banco",
"privacyPolicy": "Política de Privacidade",
"afterPay.agreement": "Concordo com o %@ da Riverty",
"riverty.termsAndConditions": "Concordo com os %#Termos e Condições%# gerais do método de pagamento Riverty. A política de privacidade da Riverty de encontra %#aqui%#.",
"paymentConditions": "condições de pagamento",
"openApp": "Abrir o aplicativo",
"voucher.readInstructions": "Leia as instruções",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/pt-PT.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Seleção do banco",
"privacyPolicy": "Política de Privacidade",
"afterPay.agreement": "Concordo com o %@ da Riverty",
"riverty.termsAndConditions": "Concordo com os %#Termos e Condições%# gerais para o Método de Pagamento Riverty. A política de privacidade da Riverty pode ser encontrada %#aqui%#.",
"paymentConditions": "condições de pagamento",
"openApp": "Abra a aplicação",
"voucher.readInstructions": "Ler instruções",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/ro-RO.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Selectarea băncii",
"privacyPolicy": "Politica de confidențialitate",
"afterPay.agreement": "Sunt de acord cu %@ aparținând Riverty",
"riverty.termsAndConditions": "Sunt de acord cu %#Termenii și condițiile%# generale pentru metoda de plată Riverty. Politica de confidențialitate Riverty este disponibilă %#aici%#.",
"paymentConditions": "condiții de plată",
"openApp": "Deschideți aplicația",
"voucher.readInstructions": "Citiți instrucțiunile",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/ru-RU.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Выбор банка",
"privacyPolicy": "Политика конфиденциальности",
"afterPay.agreement": "Я принимаю %@ Riverty",
"riverty.termsAndConditions": "Я выражаю согласие с общими %#Условиями%# использования платежного средства Riverty. С политикой конфиденциальности Riverty можно ознакомиться %#здесь%#.",
"paymentConditions": "условия оплаты",
"openApp": "Открыть приложение",
"voucher.readInstructions": "Прочитайте инструкции",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/sk-SK.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Výber banky",
"privacyPolicy": "Zásady ochrany osobných údajov",
"afterPay.agreement": "Súhlasím, že budem dodržiavať %@ spoločnosti Riverty",
"riverty.termsAndConditions": "Súhlasím so všeobecnými %#Zmluvnými podmienkami%# pre spôsob platby Riverty. Zásady ochrany osobných údajov spoločnosti Riverty nájdete %#tu%#.",
"paymentConditions": "podmienkami platby",
"openApp": "Otvorte aplikáciu",
"voucher.readInstructions": "Prečítajte si pokyny",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/sl-SI.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Izbira banke",
"privacyPolicy": "Pravilnik o zasebnosti",
"afterPay.agreement": "Strinjam se s %@ ponudnika Riverty",
"riverty.termsAndConditions": "Strinjam se s splošnimi %#pogoji in določili%# za način plačila Riverty. Pravilnik o zasebnosti storitve Riverty je na voljo %#tukaj%#.",
"paymentConditions": "plačilnimi pogoji",
"openApp": "Odprite aplikacijo",
"voucher.readInstructions": "Preberite navodila",
Expand Down
1 change: 1 addition & 0 deletions packages/server/translations/sv-SE.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
"issuerList.selectField.label": "Val av bank",
"privacyPolicy": "Sekretesspolicy",
"afterPay.agreement": "Jag godkänner Rivertys %@",
"riverty.termsAndConditions": "Jag godkänner de allmänna %#villkoren%# för betalningssättet Riverty. Rivertys sekretesspolicy finns %#här%#.",
"paymentConditions": "betalvillkor",
"openApp": "Öppna appen",
"voucher.readInstructions": "Läs instruktionerna",
Expand Down
Loading

0 comments on commit e20bae2

Please sign in to comment.