# Rakenna pankkisovellus, osa 2: Luo kirjautumis- ja rekisteröintilomake
```mermaid
journey
title Your Form Development Journey
section HTML Foundation
Understand form elements: 3: Student
Learn input types: 4: Student
Master accessibility: 4: Student
section JavaScript Integration
Handle form submission: 4: Student
Implement AJAX communication: 5: Student
Process server responses: 5: Student
section Validation Systems
Create multi-layer validation: 5: Student
Enhance user experience: 5: Student
Ensure data integrity: 5: Student
```
## Ennakkokysely
[Ennakkokysely](https://ff-quizzes.netlify.app/web/quiz/43)
Oletko koskaan täyttänyt lomaketta verkossa ja saanut virheilmoituksen sähköpostiosoitteen muodosta? Tai menettänyt kaikki tiedot, kun klikkasit "lähetä"? Me kaikki olemme kokeneet näitä turhauttavia tilanteita.
Lomakkeet ovat silta käyttäjien ja sovelluksesi toiminnallisuuden välillä. Kuten lennonjohtajien tarkat protokollat, jotka ohjaavat lentokoneet turvallisesti määränpäähänsä, hyvin suunnitellut lomakkeet antavat selkeää palautetta ja estävät kalliita virheitä. Huonot lomakkeet taas voivat karkottaa käyttäjät nopeammin kuin väärinkäsitys vilkkaassa lentokentässä.
Tässä oppitunnissa muutamme staattisen pankkisovelluksesi interaktiiviseksi sovellukseksi. Opit rakentamaan lomakkeita, jotka validoivat käyttäjän syötteet, kommunikoivat palvelimien kanssa ja antavat hyödyllistä palautetta. Ajattele tätä ohjausliittymän rakentamisena, joka antaa käyttäjille mahdollisuuden navigoida sovelluksesi ominaisuuksissa.
Lopuksi sinulla on täydellinen kirjautumis- ja rekisteröintijärjestelmä, jossa on validointi, joka ohjaa käyttäjiä kohti onnistumista eikä turhautumista.
```mermaid
mindmap
root((Form Development))
HTML Foundation
Semantic Elements
Input Types
Accessibility
Label Association
User Experience
Validation Feedback
Error Prevention
Loading States
Success Messaging
JavaScript Integration
Event Handling
AJAX Communication
Data Processing
Error Management
Validation Layers
HTML5 Validation
Client-side Logic
Server-side Security
Progressive Enhancement
Modern Patterns
Fetch API
Async/Await
Form Data API
Promise Handling
```
## Esivaatimukset
Ennen kuin aloitamme lomakkeiden rakentamisen, varmistetaan, että kaikki on asetettu oikein. Tämä oppitunti jatkuu suoraan siitä, mihin edellinen jäi, joten jos olet hypännyt eteenpäin, kannattaa palata ja varmistaa perusasiat ensin.
### Vaadittavat asetukset
| Komponentti | Tila | Kuvaus |
|-------------|------|--------|
| [HTML-mallit](../1-template-route/README.md) | ✅ Vaadittu | Pankkisovelluksesi perusrakenne |
| [Node.js](https://nodejs.org) | ✅ Vaadittu | JavaScript-ajoympäristö palvelimelle |
| [Pankin API-palvelin](../api/README.md) | ✅ Vaadittu | Tietojen tallennuksen taustapalvelu |
> 💡 **Kehitysvinkki**: Sinulla tulee olla kaksi erillistä palvelinta käynnissä samanaikaisesti – yksi pankkisovelluksen käyttöliittymälle ja toinen taustapalvelun API:lle. Tämä asetus jäljittelee todellista kehitysympäristöä, jossa käyttöliittymä ja taustapalvelut toimivat itsenäisesti.
### Palvelimen konfigurointi
**Kehitysympäristösi sisältää:**
- **Käyttöliittymäpalvelin**: Palvelee pankkisovellustasi (tyypillisesti portti `3000`)
- **Taustapalvelimen API**: Käsittelee tietojen tallennusta ja hakua (portti `5000`)
- **Molemmat palvelimet** voivat toimia samanaikaisesti ilman konflikteja
**API-yhteyden testaaminen:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Jos näet API-version vastauksen, voit jatkaa!**
---
## HTML-lomakkeiden ja kontrollien ymmärtäminen
HTML-lomakkeet ovat tapa, jolla käyttäjät kommunikoivat verkkosovelluksesi kanssa. Ajattele niitä kuin 1800-luvun lennätinjärjestelmää – ne ovat viestintäprotokolla käyttäjän tarkoituksen ja sovelluksen vastauksen välillä. Huolellisesti suunniteltuina ne havaitsevat virheet, ohjaavat syötteen muotoilua ja antavat hyödyllisiä ehdotuksia.
Modernit lomakkeet ovat huomattavasti kehittyneempiä kuin pelkät tekstikentät. HTML5 esitteli erikoistuneita syötetyyppejä, jotka käsittelevät sähköpostin validointia, numeromuotoilua ja päivämäärän valintaa automaattisesti. Nämä parannukset hyödyttävät sekä saavutettavuutta että mobiilikäyttäjäkokemusta.
### Välttämättömät lomake-elementit
**Rakennuspalikat, joita jokainen lomake tarvitsee:**
```html
```
**Tämä koodi tekee seuraavaa:**
- **Luo** lomakekontainerin, jolla on yksilöllinen tunniste
- **Määrittää** HTTP-menetelmän tietojen lähettämiseen
- **Yhdistää** etiketit syötteisiin saavutettavuuden parantamiseksi
- **Määrittää** lähetyspainikkeen lomakkeen käsittelyyn
### Modernit syötetyypit ja attribuutit
| Syötetyyppi | Tarkoitus | Esimerkki |
|-------------|----------|-----------|
| `text` | Yleinen tekstisyöte | `` |
| `email` | Sähköpostin validointi | `` |
| `password` | Piilotettu tekstisyöte | `` |
| `number` | Numeerinen syöte | `` |
| `tel` | Puhelinnumerot | `` |
> 💡 **Modernin HTML5:n etu**: Käyttämällä tiettyjä syötetyyppejä saat automaattisen validoinnin, sopivat mobiilinäppäimistöt ja paremman saavutettavuuden ilman lisättyä JavaScriptiä!
### Painiketyypit ja niiden toiminta
```html
```
**Tässä mitä kukin painiketyyppi tekee:**
- **Lähetyspainikkeet**: Käynnistävät lomakkeen lähetyksen ja lähettävät tiedot määritettyyn päätepisteeseen
- **Palautuspainikkeet**: Palauttavat kaikki lomakekentät alkuperäiseen tilaansa
- **Tavalliset painikkeet**: Eivät tarjoa oletustoimintoa, vaativat mukautettua JavaScriptiä toiminnallisuuteen
> ⚠️ **Tärkeä huomio**: ``-elementti on itsestään sulkeutuva eikä vaadi sulkevaa tagia. Moderni paras käytäntö on kirjoittaa `` ilman vinoviivaa.
### Kirjautumislomakkeen rakentaminen
Rakennetaan nyt käytännöllinen kirjautumislomake, joka havainnollistaa moderneja HTML-lomakekäytäntöjä. Aloitamme perusrakenteesta ja parannamme sitä asteittain saavutettavuusominaisuuksilla ja validoinnilla.
```html
Bank App
Login
```
**Tässä mitä tapahtuu:**
- **Rakentaa** lomakkeen semanttisilla HTML5-elementeillä
- **Ryhmittelee** liittyvät elementit `div`-kontainereihin merkityksellisillä luokilla
- **Yhdistää** etiketit syötteisiin `for`- ja `id`-attribuuttien avulla
- **Sisältää** moderneja attribuutteja kuten `autocomplete` ja `placeholder` paremman käyttökokemuksen vuoksi
- **Lisää** `novalidate` käsittelemään validointia JavaScriptillä selaimen oletusten sijaan
### Oikeiden etikettien voima
**Miksi etiketit ovat tärkeitä modernissa verkkokehityksessä:**
```mermaid
graph TD
A[Label Element] --> B[Screen Reader Support]
A --> C[Click Target Expansion]
A --> D[Form Validation]
A --> E[SEO Benefits]
B --> F[Accessible to all users]
C --> G[Better mobile experience]
D --> H[Clear error messaging]
E --> I[Better search ranking]
```
**Mitä oikeat etiketit saavuttavat:**
- **Mahdollistavat** ruudunlukijoiden selkeän ilmoituksen lomakekentistä
- **Laajentavat** klikkausaluetta (etiketin klikkaaminen kohdistaa syötteen)
- **Parantavat** mobiilikäytettävyyttä suuremmilla kosketuskohteilla
- **Tukevat** lomakevalidointia merkityksellisillä virheilmoituksilla
- **Parantavat** SEO:ta antamalla semanttista merkitystä lomake-elementeille
> 🎯 **Saavutettavuustavoite**: Jokaisella lomakesyötteellä tulisi olla siihen liittyvä etiketti. Tämä yksinkertainen käytäntö tekee lomakkeistasi kaikkien, myös vammaisten käyttäjien, käytettävissä ja parantaa kaikkien käyttäjien kokemusta.
### Rekisteröintilomakkeen luominen
Rekisteröintilomake vaatii yksityiskohtaisempia tietoja täydellisen käyttäjätilin luomiseksi. Rakennetaan se moderneilla HTML5-ominaisuuksilla ja parannetulla saavutettavuudella.
```html
Register
```
**Yllä olevassa olemme:**
- **Järjestäneet** jokaisen kentän kontainer-diveihin paremman tyylin ja asettelun vuoksi
- **Lisänneet** sopivat `autocomplete`-attribuutit selaimen automaattisen täytön tueksi
- **Sisällyttäneet** hyödyllistä placeholder-tekstiä ohjaamaan käyttäjän syötettä
- **Asettaneet** järkevät oletusarvot `value`-attribuutin avulla
- **Soveltaneet** validointiattribuutteja kuten `required`, `maxlength` ja `min`
- **Käyttäneet** `type="number"` saldo-kentässä desimaalitarkkuuden tukemiseksi
### Syötetyyppien ja toiminnan tutkiminen
**Modernit syötetyypit tarjoavat parannettua toiminnallisuutta:**
| Ominaisuus | Hyöty | Esimerkki |
|------------|-------|----------|
| `type="number"` | Numeerinen näppäimistö mobiilissa | Helpompi saldon syöttö |
| `step="0.01"` | Desimaalitarkkuuden hallinta | Mahdollistaa senttien käytön valuutassa |
| `autocomplete` | Selaimen automaattinen täyttö | Nopeampi lomakkeen täyttö |
| `placeholder` | Kontekstuaaliset vihjeet | Ohjaa käyttäjän odotuksia |
> 🎯 **Saavutettavuushaaste**: Kokeile navigoida lomakkeissa vain näppäimistön avulla! Käytä `Tab` siirtyäksesi kenttien välillä, `Space` valintaruutujen valintaan ja `Enter` lomakkeen lähettämiseen. Tämä kokemus auttaa ymmärtämään, miten ruudunlukijakäyttäjät vuorovaikuttavat lomakkeidesi kanssa.
### 🔄 **Pedagoginen tarkistus**
**Lomakeperustan ymmärtäminen**: Ennen JavaScriptin käyttöönottoa varmista, että ymmärrät:
- ✅ Kuinka semanttinen HTML luo saavutettavia lomakerakenteita
- ✅ Miksi syötetyypit ovat tärkeitä mobiilinäppäimistöille ja validoinnille
- ✅ Etikettien ja lomakekontrollien välinen suhde
- ✅ Kuinka lomakeattribuutit vaikuttavat selaimen oletuskäyttäytymiseen
**Nopea itsearviointi**: Mitä tapahtuu, jos lähetät lomakkeen ilman JavaScript-käsittelyä?
*Vastaus: Selaimen oletuslähetys tapahtuu, yleensä uudelleenohjaus action-URL:ään*
**HTML5-lomakkeiden edut**: Modernit lomakkeet tarjoavat:
- **Sisäänrakennettu validointi**: Automaattinen sähköpostin ja numeron muodon tarkistus
- **Mobiilioptimointi**: Sopivat näppäimistöt eri syötetyypeille
- **Saavutettavuus**: Ruudunlukijatuki ja näppäimistönavigointi
- **Progressiivinen parannus**: Toimii myös, kun JavaScript on pois päältä
## Lomakkeen lähetysmenetelmien ymmärtäminen
Kun joku täyttää lomakkeesi ja painaa "lähetä", tiedot täytyy lähettää jonnekin – yleensä palvelimelle, joka voi tallentaa ne. On olemassa muutamia eri tapoja, joilla tämä voi tapahtua, ja oikean valitseminen voi säästää sinut myöhemmiltä päänsäryiltä.
Katsotaanpa, mitä oikeastaan tapahtuu, kun joku klikkaa lähetyspainiketta.
### Lomakkeen oletuskäyttäytyminen
Ensiksi tarkastellaan, mitä tapahtuu peruslomakkeen lähetyksessä:
**Testaa nykyiset lomakkeesi:**
1. Klikkaa lomakkeesi *Rekisteröidy*-painiketta
2. Tarkkaile muutoksia selaimesi osoiterivillä
3. Huomaa, kuinka sivu latautuu uudelleen ja tiedot näkyvät URL-osoitteessa

### HTTP-menetelmien vertailu
```mermaid
graph TD
A[Form Submission] --> B{HTTP Method}
B -->|GET| C[Data in URL]
B -->|POST| D[Data in Request Body]
C --> E[Visible in address bar]
C --> F[Limited data size]
C --> G[Bookmarkable]
D --> H[Hidden from URL]
D --> I[Large data capacity]
D --> J[More secure]
```
**Ymmärrä erot:**
| Menetelmä | Käyttötapaus | Tietojen sijainti | Turvallisuustaso | Kokorajoitus |
|-----------|--------------|-------------------|------------------|--------------|
| `GET` | Hakukyselyt, suodattimet | URL-parametrit | Matala (näkyvä) | ~2000 merkkiä |
| `POST` | Käyttäjätilit, arkaluontoiset tiedot | Pyynnön runko | Korkeampi (piilotettu) | Ei käytännön rajoitusta |
**Peruserojen ymmärtäminen:**
- **GET**: Lisää lomaketiedot URL-osoitteeseen kyselyparametreina (sopii hakutoimintoihin)
- **POST**: Sisältää tiedot pyynnön rungossa (välttämätön arkaluontoisille tiedoille)
- **GET-rajoitukset**: Kokorajoitukset, näkyvät tiedot, pysyvä selaushistoria
- **POST-edut**: Suuri tietokapasiteetti, yksityisyyden suoja, tiedostojen lataustuki
> 💡 **Paras käytäntö**: Käytä `GET` hakulomakkeisiin ja suodattimiin (tietojen haku), käytä `POST` käyttäjätilien luomiseen, kirjautumiseen ja tietojen luomiseen.
### Lomakkeen lähetyksen konfigurointi
Konfiguroidaan rekisteröintilomakkeesi kommunikoimaan oikein taustapalvelimen API:n kanssa POST-menetelmää käyttäen:
```html
```
**Parannetun validoinnin ymmärtäminen:**
- **Yhdistää** pakollisten kenttien indikaattorit hyödyllisiin kuvauksiin
- **Sisältää** `pattern`-attribuutit muotovalidointia varten
- **Tarjoaa** `title`-attribuutit saavutettavuuden ja työkaluvihjeiden vuoksi
- **Lisää** aputekstiä ohjaamaan käyttäjän syötettä
- **Käyttää** semanttista HTML-rakennetta paremman saavutettavuuden vuoksi
### Edistyneet validointisäännöt
**Mitä kukin validointisääntö saavuttaa:**
| Kenttä | Validointisäännöt | Käyttäjän hyöty |
|--------|-------------------|-----------------|
| Käyttäjänimi | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Varmistaa kelvolliset, yksilölliset tunnisteet |
| Valuutta | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | Hyväksyy yleiset valuuttasymbolit |
| Saldo | `min="0"`, `step="0.01"`, `type="number"` | Estää negatiiviset saldot |
| Kuvaus | `maxlength="100"` | Kohtuulliset pituusrajat |
### Validointikäyttäytymisen testaaminen
**Kokeile näitä validointiskenaarioita:**
1. **Lähetä** lomake tyhjillä pakollisilla kentillä
2. **Syötä** käyttäjänimi, joka on alle 3 merkkiä pitkä
3. **Kokeile** erikoismerkkejä käyttäjänimi-kentässä
4. **Anna** negatiivinen saldo

**Mitä huomaat:**
- **Selaimen näyttämät** natiivivalidointiviestit
- **Tyylimuutokset** perustuvat `:valid` ja `:invalid`-tiloihin
- **Lomakkeen lähetys** estetään, kunnes kaikki validoinnit läpäistään
- **Fokus siirtyy automaattisesti** ensimmäiseen virheelliseen kenttään
### Asiakaspuolen vs palvelinpuolen validointi
```mermaid
graph LR
A[Client-Side Validation] --> B[Instant Feedback]
A --> C[Better UX]
A --> D[Reduced Server Load]
E[Server-Side Validation] --> F[Security]
E --> G[Data Integrity]
E --> H[Business Rules]
A -.-> I[Both Required]
E -.-> I
```
**Miksi tarvitset molemmat kerrokset:**
- **Asiakaspuolen validointi**: Tarjoaa välitöntä palautetta ja parantaa käyttäjäkokemusta
- **Palvelinpuolen validointi**: Varmistaa turvallisuuden ja käsittelee monimutkaisia liiketoimintasääntöjä
- **Yhdistetty lähestymistapa**: Luo vankkoja, käyttäjäystävällisiä ja turvallisia sovelluksia
- **Progressiivinen parannus**: Toimii myös, kun JavaScript on pois päältä
> 🛡️ **Tietoturvamuistutus**: Älä koskaan luota pelkkään asiakaspuolen validointiin! Haitalliset käyttäjät voivat ohittaa asiakaspuolen tarkistukset, joten palvelinpuolen validointi on välttämätöntä turvallisuuden ja datan eheyden varmistamiseksi.
### ⚡ **Mitä voit tehdä seuraavan 5 minuutin aikana**
- [ ] Testaa lomakettasi virheellisillä tiedoilla nähdäksesi validointiviestit
- [ ] Kokeile lomakkeen lähettämistä ilman JavaScriptiä nähdäksesi HTML5-validoinnin
- [ ] Avaa selaimen kehittäjätyökalut ja tarkista palvelimelle lähetettävä lomakedata
- [ ] Kokeile erilaisia syöttötyyppejä nähdäksesi mobiilin näppäimistön muutokset
### 🎯 **Mitä voit saavuttaa tämän tunnin aikana**
- [ ] Suorita oppitunnin jälkeinen kysely ja ymmärrä lomakekäsittelyn käsitteet
- [ ] Toteuta kattava validointihaaste reaaliaikaisella palautteella
- [ ] Lisää CSS-tyylit ammattimaisen näköisten lomakkeiden luomiseksi
- [ ] Luo virheenkäsittelyä kaksoiskäyttäjänimille ja palvelinvirheille
- [ ] Lisää salasanan vahvistuskentät vastaavuusvalidoinnilla
### 📅 **Viikon mittainen lomakemestaruusmatkasi**
- [ ] Viimeistele koko pankkisovellus edistyneillä lomaketoiminnoilla
- [ ] Toteuta tiedostojen latausominaisuudet profiilikuville tai asiakirjoille
- [ ] Lisää monivaiheiset lomakkeet etenemisen ilmaisimilla ja tilanhallinnalla
- [ ] Luo dynaamisia lomakkeita, jotka mukautuvat käyttäjän valintojen mukaan
- [ ] Toteuta lomakkeen automaattinen tallennus ja palautus paremman käyttäjäkokemuksen vuoksi
- [ ] Lisää edistynyttä validointia, kuten sähköpostin vahvistus ja puhelinnumeron muotoilu
### 🌟 **Kuukauden mittainen frontend-kehityksen mestaruus**
- [ ] Rakenna monimutkaisia lomakesovelluksia ehdollisella logiikalla ja työnkuluilla
- [ ] Opi lomakekirjastoja ja -kehyksiä nopeaan kehitykseen
- [ ] Hallitse saavutettavuusohjeet ja inklusiivisen suunnittelun periaatteet
- [ ] Toteuta kansainvälistäminen ja lokalisaatio globaalien lomakkeiden luomiseksi
- [ ] Luo uudelleenkäytettäviä lomakekomponenttikirjastoja ja suunnittelujärjestelmiä
- [ ] Osallistu avoimen lähdekoodin lomakeprojekteihin ja jaa parhaita käytäntöjä
## 🎯 Lomakekehityksen mestaruusaikataulusi
```mermaid
timeline
title Form Development & User Experience Learning Progression
section HTML Foundation (15 minutes)
Semantic Forms: Form elements
: Input types
: Labels and accessibility
: Progressive enhancement
section JavaScript Integration (25 minutes)
Event Handling: Form submission
: Data collection
: AJAX communication
: Async/await patterns
section Validation Systems (35 minutes)
Multi-layer Security: HTML5 validation
: Client-side logic
: Server-side verification
: Error handling
section User Experience (45 minutes)
Interface Polish: Loading states
: Success messaging
: Error recovery
: Accessibility features
section Advanced Patterns (1 week)
Professional Forms: Dynamic validation
: Multi-step workflows
: File uploads
: Real-time feedback
section Enterprise Skills (1 month)
Production Applications: Form libraries
: Testing strategies
: Performance optimization
: Security best practices
```
### 🛠️ Lomakekehityksen työkalupakin yhteenveto
Tämän oppitunnin jälkeen olet hallinnut:
- **HTML5-lomakkeet**: Semanttinen rakenne, syöttötyypit ja saavutettavuusominaisuudet
- **JavaScript-lomakekäsittely**: Tapahtumien hallinta, datan keräys ja AJAX-kommunikaatio
- **Validointiarkkitehtuuri**: Monikerroksinen validointi turvallisuutta ja käyttäjäkokemusta varten
- **Asynkroninen ohjelmointi**: Moderni Fetch API ja async/await-mallit
- **Virheiden hallinta**: Kattava virheenkäsittely ja käyttäjäpalautesysteemit
- **Käyttäjäkokemuksen suunnittelu**: Lataustilat, onnistumisviestit ja virheiden palautus
- **Progressiivinen parannus**: Lomakkeet, jotka toimivat kaikilla selaimilla ja ominaisuuksilla
**Todelliset sovellukset**: Lomakekehitystaitosi soveltuvat suoraan:
- **Verkkokauppasovelluksiin**: Kassaprosessit, tilin rekisteröinti ja maksulomakkeet
- **Yritysohjelmistoihin**: Tietojen syöttöjärjestelmät, raportointikäyttöliittymät ja työnkulut
- **Sisällönhallintaan**: Julkaisualustat, käyttäjien tuottama sisältö ja hallinnolliset käyttöliittymät
**Prompt:** Luo täydellinen lomakkeen validointijärjestelmä rekisteröintilomakkeelle, joka sisältää: 1) Reaaliaikaisen validointipalautteen jokaiselle kentälle käyttäjän kirjoittaessa, 2) Mukautetut validointiviestit, jotka näkyvät jokaisen syöttökentän alla, 3) Salasanan vahvistuskentän, jossa on vastaavuusvalidointi, 4) Visuaaliset indikaattorit (kuten vihreät valintamerkit kelvollisille kentille ja punaiset varoitukset virheellisille), 5) Lähetä-painikkeen, joka aktivoituu vasta, kun kaikki validoinnit ovat kunnossa. Käytä HTML5-validointiominaisuuksia, CSS:ää validointitilojen tyylittelyyn ja JavaScriptiä interaktiiviseen toimintaan.
Lisätietoja [agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) -tilasta löytyy täältä.
## 🚀 Haaste
Näytä virheilmoitus HTML:ssä, jos käyttäjä on jo olemassa.
Tässä on esimerkki siitä, miltä lopullinen kirjautumissivu voi näyttää pienen tyylittelyn jälkeen:

## Luentojälkeinen kysely
[Luentojälkeinen kysely](https://ff-quizzes.netlify.app/web/quiz/44)
## Kertaus ja itseopiskelu
Kehittäjät ovat olleet erittäin luovia lomakkeiden rakentamisessa, erityisesti validointistrategioiden osalta. Tutustu erilaisiin lomakevirtoihin selaamalla [CodePen](https://codepen.com); löydätkö mielenkiintoisia ja inspiroivia lomakkeita?
## Tehtävä
[Muotoile pankkisovelluksesi](assignment.md)
---
**Vastuuvapauslauseke**:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.