<!doctypehtml><html dir=ltr xmlns=http://www.w3.org/1999/xhtml><head lang=en><meta http-equiv=X-UA-Compatible content="IE=edge"><meta content="text/html; charset=utf-8"http-equiv=Content-Type><meta name=viewport content="user-scalable=1,initial-scale=1,minimum-scale=1,maximum-scale=1"><meta name=apple-mobile-web-app-capable content=yes><meta name=format-detection content="telephone=no"><meta name=robots content=noindex,nofollow><link rel=manifest href={{{domainurl}}}manifest.json><link rel="shortcut icon"type=image/x-icon href={{{domainurl}}}favicon.ico><link keeplink=1 type=text/css href=styles/style.css media=screen rel=stylesheet title=CSS><link rel=apple-touch-icon href=/favicon-303x303.png><script src=scripts/common-0.0.1{{min}}.js></script><script keeplink=1 src=scripts/u2f-api{{min}}.js></script><title>{{{title}}} - Login</title><body id=body onload='"undefined"!=typeof startup&&startup()'class="arg_hide login"><div id=container><div id=masthead><div style=float:left>{{{titlehtml}}}</div><div class=title>{{{title1}}}</div><div class=title2>{{{title2}}}</div></div><div id=topbar class="noselect style3"style=height:24px><div id=uiMenuButton title="Käyttöliittymän valinta"onclick=showUserInterfaceSelectMenu()>♦<div id=uiMenu style=display:none><div id=uiViewButton1 class=uiSelector onclick=userInterfaceSelectMenu(1) title="Palkki vasemmalla käyttöliittymä"><div class=uiSelector1></div></div><div id=uiViewButton2 class=uiSelector onclick=userInterfaceSelectMenu(2) title="Yläpalkki käyttöliittymä"><div class=uiSelector2></div></div><div id=uiViewButton3 class=uiSelector onclick=userInterfaceSelectMenu(3) title="Kiinteä leveyksinen käyttöliittymä"><div class=uiSelector3></div></div><div id=uiViewButton4 class=uiSelector onclick=toggleNightMode() title="Vaihda yötilaa"><div class=uiSelector4></div></div></div></div></div><div id=column_l><h1>Tervetuloa</h1><div id=welcomeText style=display:none>Yhdistä kotiisi tai toimistolaitteihisi mistä päin maailmaa tahansa käyttämällä MeshCentralia, reaaliaikaista, avoimen lähdekoodin etävalvonta- ja hallinta-verkkosivustoa. Joudut lataamaan ja asentamaan hallintaagentin tietokoneillesi. Asennuksen jälkeen tietokoneet näkyvät tämän verkkosivuston "Omat laitteet" -osiossa, ja voit seurata niitä ja hallita niitä.</div><table id=centralTable><tr><td id=welcomeimage><picture><img alt=""src=welcome.jpg style=border-radius:20px></picture><td id=logincell><div id=loginpanel style=display:none><form method=post><input type=hidden name=action value=login><div id=message1></div><div id=loginuserpassdiv style=display:none><div><b>Kirjaudu sisään</b></div><table><tr><td id=loginusername align=right width=100>Käyttäjätunnus:<td><input id=username {{{autocomplete}}}=username maxlength=64 name=username required onchange=validateLogin(1) onkeyup=validateLogin(1,event)><tr><td align=right>Salasana:<td><input id=password {{{autocomplete}}}=current-password type=password maxlength=256 name=password required onchange=validateLogin(2) onkeyup=validateLogin(2,event)><tr><td><div id=showPassHintLink style=display:none><a onclick="return showPassHint(event)"href=# style=cursor:pointer>Näytä vihje</a></div><td align=right><input id=loginButton type=submit value="Kirjaudu sisään"></table><div id=hrAccountDiv style=display:none><hr></div><div id=resetAccountDiv style=display:none;padding:2px><span id=resetAccountSpan>Unohditko käyttäjätunnuksen/salasanan?</span> <a onclick="return xgo(3,event)"href=# style=cursor:pointer>Nollaa tili</a>.</div><div id=newAccountDiv style=display:none;padding:2px>Eikö sinulla ole tiliä? <a onclick="return xgo(2,event)"href=# style=cursor:pointer>Luo yksi</a>.</div></div><input id=loginformargs name=urlargs type=hidden><div id=authStrategies style=display:none><hr id=loginuserpasshr style=display:none><div style=margin-bottom:8px>Kirjaudu sisään käyttämällä olemassa olevaa tiliä</div><a id=auth-twitter href=auth-twitter style=display:none><img src=images/login/twitter32.png srcset="images/login/twitter64.png 2x"loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen Twitterillä"></a><a id=auth-google href=auth-google style=display:none><img src=images/login/google32.png srcset="images/login/google64.png 2x"loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen Googlella"></a><a id=auth-github href=auth-github style=display:none><img src=images/login/github32.png srcset="images/login/github64.png 2x"loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen GitHubilla"></a><a id=auth-azure href=auth-azure style=display:none><img src=images/login/azure32.png srcset="images/login/azure64.png 2x"loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen Azuren avulla"></a><a id=auth-oidc href=auth-oidc style=display:none><img src=images/login/oidc32.png srcset="images/login/oidc64.png 2x"loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjaudu sisään OpenID Connectilla"></a><a id=auth-oidc-azure href=auth-oidc style=display:none><img src=images/login/azure32.png srcset="images/login/azure64.png 2x"loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Sign-in with Azure using OpenID Connect"></a><a id=auth-oidc-google href=auth-oidc style=display:none><img src=images/login/google32.png srcset="images/login/google64.png 2x"loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Sign-in with Google using OpenID Connect"></a><a id=auth-jumpcloud href=auth-jumpcloud style=display:none><img src=images/login/jumpcloud32.png srcset="images/login/jumpcloud64.png 2x"loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen JumpCloudilla"></a><a id=auth-intel href=auth-intel style=display:none><img src=images/login/intel32.png srcset="images/login/intel64.png 2x"loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen Intelin avulla"></a><a id=auth-saml href=auth-saml style=display:none><img src=images/login/generic32.png srcset="images/login/generic64.png 2x"loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title=Kertakirjautuminen></a></div></form></div><div id=createpanel style=display:none;position:relative><form method=post><input type=hidden name=action value=createaccount><div id=message2></div><div><b>Tilin luominen</b></div><div id=passwordPolicyCallout style=display:none></div><table><tr id=nuUserRow><td id=nuUser align=right width=100>Käyttäjätunnus:<td><input id=ausername {{{autocomplete}}}=username name=username onchange=validateCreate(1) maxlength=64 onkeydown=haltReturn(event) onkeyup=validateCreate(1,event)><tr><td id=nuEmail align=right width=100>Sähköposti:<td><input id=aemail {{{autocomplete}}}=email inputmode=email name=email onchange=validateCreate(2) maxlength=256 onkeydown=haltReturn(event) onkeyup=validateCreate(2,event)><tr><td id=nuPass1 align=right>Salasana:<td><input id=apassword1 type=password name=password1 {{{autocomplete}}}=new-password maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(3,event) onkeyup=validateCreate(3,event)><tr><td id=nuPass2 align=right>Salasana:<td><input id=apassword2 type=password name=password2 {{{autocomplete}}}=new-password maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(4,event) onkeyup=validateCreate(4,event)><tr id=createPanelHint style=display:none><td id=nuHint align=right>Salasana Vihje:<td><input id=apasswordhint name=apasswordhint {{{autocomplete}}}=off maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(5,event) onkeyup=validateCreate(5,event)><tr id=newAccountPass title="Anna tilin luontitunnus"><td id=nuToken align=right>Luontitunnus:<td><input id=anewaccountpass type=password name=anewaccountpass {{{autocomplete}}}=off maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(6,event) onkeyup=validateCreate(6,event)><tr id=newAccountCaptchaImg title="CAPTCHA image"><td><td colspan=2><img src={{{newAccountCaptchaImage}}} loading=lazy><tr id=newAccountCaptcha title="Security check"><td id=nuCaptcha align=right>Security Check:<td><input id=anewaccountcaptcha name=anewaccountcaptcha {{{autocomplete}}}=off maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(7,event) onkeyup=validateCreate(7,event)><tr><td colspan=2><div style=float:right><input id=createButton type=submit value="Luo käyttäjätunnus"disabled></div><div id=passWarning style=padding-top:6px></div></table><hr><a onclick="return xgo(1,event)"href=# style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=createformargs name=urlargs type=hidden> <input id=createformcaptcha name=captchaargs type=hidden value={{{newAccountCaptcha}}}></form></div><div id=resetpanel style=display:none><form method=post><input type=hidden name=action value=resetaccount><div id=message3></div><div><b>Tilin palautus</b></div><table><tr><td align=right width=100>Sähköposti:<td><input id=remail inputmode=email name=email maxlength=256 onchange=validateReset() onkeyup=validateReset(event)><tr><td colspan=2><div style=float:right><input id=eresetButton type=submit value="Nollaa Tili"disabled></div><div id=passWarning style=padding-top:6px></div></table><hr><a onclick="return xgo(1,event)"href=# style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=resetformargs name=urlargs type=hidden></form></div><div id=tokenpanel style=display:none><form method=post {{{autocomplete}}}=off><input type=hidden name=action value=tokenlogin> <input type=hidden name=hwstate value={{{hwstate}}}><div id=message4></div><table><tr><td align=right width=100>Kirjautumistunnus:<td><input id=tokenInput {{{autocomplete}}}=one-time-code inputmode=numeric name=token maxlength=50 onchange=checkToken(event) onpaste=checkToken(event) onkeyup=checkToken(event) onkeydown=checkToken(event)><br><input id=hwtokenInput name=hwtoken style=display:none><tr><td colspan=2 style=align-content:center><label id=tokenInputRememberLabel><input id=tokenInputRemember name=remembertoken type=checkbox><span id=tokenInputRememberSpan></span></label><tr><td colspan=2><div style=float:right><input id=tokenOkButton type=submit value="Kirjaudu sisään"disabled></div><div style=float:right><input style=display:none;float:right id=securityKeyButton type=button value="Käytä suojausavainta"onclick=useSecurityKey(1)> <input style=display:none;float:right id=emailKeyButton type=button value=Sähköposti onclick=useEmailToken(1)> <input style=display:none;float:right id=smsKeyButton type=button value=Tekstiviesti onclick=useSMSToken(1)> <input style=display:none;float:right id=msgKeyButton type=button value=Messaging onclick=useMsgToken(1)> <input style=display:none;float:right id=duoKeyButton type=button value=Duo onclick=useDuoToken(1)></div></table><hr><a onclick="return xgo(1,event)"href=# style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=tokenformargs name=urlargs type=hidden></form></div><div id=resettokenpanel style=display:none><form method=post><input type=hidden name=action value=resetaccount><div id=message5></div><table><tr><td align=right width=100>Kirjautumistunnus:<td><input id=resetTokenInput name=token maxlength=50 onchange=resetCheckToken(event) onkeyup=resetCheckToken(event) onkeydown=resetCheckToken(event)> <input id=resetHwtokenInput name=hwtoken style=display:none><tr><td colspan=2><div style=float:right><input id=resetTokenOkButton type=submit value="Kirjaudu sisään"disabled></div><div style=float:right><input style=display:none;float:right id=securityKeyButton2 type=button value="Käytä suojausavainta"onclick=useSecurityKey(2)> <input style=display:none;float:right id=emailKeyButton2 type=button value=Sähköposti onclick=useEmailToken(2)> <input style=display:none;float:right id=smsKeyButton2 type=button value=Tekstiviesti onclick=useSMSToken(2)> <input style=display:none;float:right id=msgKeyButton2 type=button value=Messaging onclick=useMsgToken(2)> <input style=display:none;float:right id=duoKeyButton2 type=button value=Duo onclick=useDuoToken(2)></div></table><hr><a onclick="return xgo(1,event)"href=# style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=resettokenformargs name=urlargs type=hidden></form></div><div id=resetpasswordpanel style=display:none;position:relative><form method=post><input type=hidden name=action value=resetpassword><div id=message6></div><div id=rpasswordPolicyCallout style=display:none></div><table><tr><td id=rnuPass1 width=100 align=right>Salasana:<td><input id=rapassword1 type=password name=rpassword1 {{{autocomplete}}}=off maxlength=256 onkeydown=haltReturn(event) onchange=validatePassReset(3,event) onkeyup=validatePassReset(3,event)><tr><td id=rnuPass2 align=right>Salasana:<td><input id=rapassword2 type=password name=rpassword2 {{{autocomplete}}}=off maxlength=256 onkeydown=haltReturn(event) onchange=validatePassReset(4,event) onkeyup=validatePassReset(4,event)><tr id=resetpasswordpanelHint style=display:none><td id=rnuHint align=right>Salasana Vihje:<td><input id=rapasswordhint name=rpasswordhint {{{autocomplete}}}=off maxlength=256 onkeydown=haltReturn(event) onchange=validatePassReset(5,event) onkeyup=validatePassReset(5,event)><tr><td colspan=2><div style=float:right><input id=resetPassButton type=submit value="Nollaa Salasana"disabled></div><div id=rpassWarning style=padding-top:6px></div></table><hr><a onclick="return xgo(1,event)"href=# style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=resetpasswordformargs name=urlargs type=hidden></form></div><div id=checkemailpanel style=display:none;position:relative><form method=post><input type=hidden name=action value=checkemail><div id=message7></div><table id=checkCheckOperations style=width:100%;display:none><tr><td><div id=unconfirmedEmail></div><br><tr><td><div><input id=changeEmailButton type=button value="Vaihda sähköpostiosoite"onclick=changeEmailAddress()> <input id=checkEmailButton2 type=button value="Lähetä vahvistussähköposti uudelleen"onclick=resentEmailConfirmation()> <input id=checkEmailButton type=submit style=display:none> <input id=checkEmailVal name=email type=hidden></div></table><hr><a onclick="return xgo(1,event)"href=# style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=checkemailformargs name=urlargs type=hidden></form></div></table><br></div><div id=footer><div class=footer1>{{{footer}}}</div><div class=footer2>{{{rootCertLink}}} &nbsp;<a id=termsLinkFooter href=terms>Ehdot ja yksityisyys</a></div></div></div><div id=dialog style=display:none><div id=dialogHeader><div id=id_dialogclose style=float:right;padding:5px;cursor:pointer onclick=setDialogMode()><b>X</b></div><div id=id_dialogtitle style=padding:5px></div><div style=width:100%;margin:6px></div></div><div id=dialogBody><div id=dialog1><div id=id_dialogMessage></div></div><div id=dialog2><div id=id_dialogOptions></div></div></div><div id=idx_dlgButtonBar><input id=idx_dlgCancelButton type=button value=Peruuta onclick=dialogclose(0)> <input id=idx_dlgOkButton type=button value=OK onclick=dialogclose(1)></div></div><script>var xxdialogMode,xxdialogFunc,xxdialogButtons,xxdialogTag,random="{{{randomlength}}}",passlogin="{{{passlogin}}}",passhint="{{{passhint}}}",loginMode="{{{loginmode}}}",newAccount="{{{newAccount}}}",newAccountPass=parseInt("{{{newAccountPass}}}"),newAccountCaptcha="{{{newAccountCaptcha}}}",emailCheck="{{{emailcheck}}}",passRequirements="{{{passRequirements}}}",hardwareKeyChallenge=decodeURIComponent("{{{hkey}}}"),passRequirementsEx=null!=(passRequirements=""!=passRequirements?JSON.parse(decodeURIComponent(passRequirements)):{}).min||null!=passRequirements.max||null!=passRequirements.upper||null!=passRequirements.lower||null!=passRequirements.numeric||null!=passRequirements.nonalpha,features=parseInt("{{{features}}}"),welcomeText=decodeURIComponent("{{{welcometext}}}"),currentpanel=0,uiMode=parseInt(getstore("uiMode","1")),webPageFullScreen=!0,nightMode="1"==getstore("_nightMode","0"),publicKeyCredentialRequestOptions=null,otpduo="true"===decodeURIComponent("{{{otpduo}}}"),otpemail="true"===decodeURIComponent("{{{otpemail}}}"),otpsms="true"===decodeURIComponent("{{{otpsms}}}"),otpmsg="true"===decodeURIComponent("{{{otpmsg}}}"),autofido="true"===decodeURIComponent("{{{autofido}}}"),twoFactorCookieDays=parseInt("{{{twoFactorCookieDays}}}"),authStrategies="{{{authStrategies}}}".split(","),tokenTimeout=parseInt("{{{tokenTimeout}}}");function startup(){var e=parseInt("{{{messageid}}}"),t=["","Salasanan nollaus viesti lähetetty, jos sähköposti osoite on kelvollinen.","Sähköposti lähetetty.","Sähköposti vahvistus vaaditaan, tarkista postilaatikkosi ja napsauta vahvistuslinkkiä.","Tekstiviesti lähetetty.","Ilmoitusta lähetetään ...","Message sent."],n=["Tiliä ei voitu luoda.","Tiliraja saavutettu.","Olemassa oleva tili tällä sähköpostiosoitteella.","Virheellinen tilin luontitunnus.","Käyttäjätunnus on jo olemassa.","Salasana hylätty, käytä toista salasanaa.","Virheellinen sähköpostiosoite.","Tiliä ei löytynyt.","Virheellinen tunnus, yritä uudelleen.","Sähköpostin lähettäminen epäonnistui.","Tili lukittu","Pääsy evätty.","Sisäänkirjautuminen epäonnistui, tarkista käyttäjänimi ja salasana.","Salasanan vaihtoa pyydetty.","IP-osoite estetty, yritä myöhemmin uudelleen.","Palvelinta ylläpidetään.","Laiteilmoituksen lähettäminen ei onnistu.","Invalid security check."];if(0<e){var a="";if(e<100&&e<t.length?a=t[e]:100<=e&&e-100<n.length&&(a=n[e-100]),""!=a)for(a=100<=e?'<span class="msg error"><b style=color:#8C001A>'+a+"<b></span><br /><br />":'<span class="msg success"><b>'+a+"</b></span><br /><br />",s=1;s<8;s++)QH("message"+s,a)}var o=JSON.parse("{{{flashErrors}}}");if(o&&0<o.length){for(var a="",s=0;s<o.length;s++)o[s]&&(a+='<span class="msg error"><b style=color:#8C001A>'+o[s]+"<b></span><br /><br />");QH("message1",a),QV("message1",!0)}t=parseUriArgs();if(t.key&&(Q("termsLinkFooter").href+="?key="+t.key),passlogin="true"==passlogin,1===t.passlogin&&(passlogin=!0),0===t.passlogin&&(passlogin=!1),QV("loginuserpassdiv",passlogin),QV("loginuserpasshr",passlogin),0<twoFactorCookieDays?(QV("tokenInputRememberLabel",!0),QH("tokenInputRememberSpan",format("Muista tämä laite {0} päivän ajan.",twoFactorCookieDays))):QV("tokenInputRememberLabel",!1),0<window.location.href.indexOf("?")&&(n=window.location.href.substring(window.location.href.indexOf("?")),Q("loginformargs").value=n,Q("createformargs").value=n,Q("resetformargs").value=n,Q("tokenformargs").value=n,Q("resettokenformargs").value=n,Q("resetpasswordformargs").value=n,Q("checkemailformargs").value=n),0==(32&features)){t=null;try{t=top.location.toString().toLowerCase()}catch(e){}if(top!=self&&(null==t||0==top.active))return void(top.location=self.location)}if(2097152&features&&(QH("loginusername","Sähköposti:"),QH("resetAccountSpan","Unohtuiko salasana?"),QV("nuUserRow",!1)),nightMode&&QC("body").add("night"),QV("createPanelHint",!0===passRequirements.hint),QV("resetpasswordpanelHint",!0===passRequirements.hint),""!=authStrategies&&(QV("authStrategies",!0),0<=authStrategies.indexOf("twitter")&&QV("auth-twitter",!0),0<=authStrategies.indexOf("google")&&QV("auth-google",!0),0<=authStrategies.indexOf("github")&&QV("auth-github",!0),0<=authStrategies.indexOf("azure")&&QV("auth-azure",!0),0<=authStrategies.indexOf("oidc")&&QV("auth-oidc",!0),0<=authStrategies.indexOf("oidc-azure")&&QV("auth-oidc-azure",!0),0<=authStrategies.indexOf("oidc-google")&&QV("auth-oidc-google",!0),0<=authStrategies.indexOf("jumpcloud")&&QV("auth-jumpcloud",!0),0<=authStrategies.indexOf("intel")&&QV("auth-intel",!0),0<=authStrategies.indexOf("saml"))&&QV("auth-saml",!0),welcomeText?QH("welcomeText",welcomeText):QH("welcomeText",addTextLink("MeshCentral",Q("welcomeText").innerHTML,"http://www.meshcommander.com/meshcentral2")),QV("welcomeText",!0),(window.onresize=center)(),validateCreate(),0!=loginMode.length?go(parseInt(loginMode)):go(1),QV("newAccountDiv","1"===newAccount||"true"===newAccount),null!=passhint&&0<passhint.length&&QV("showPassHintLink",!0),QV("newAccountPass",1==newAccountPass),QV("newAccountCaptcha",""!=newAccountCaptcha),QV("newAccountCaptchaImg",""!=newAccountCaptcha),QV("resetAccountDiv","true"==emailCheck),QV("hrAccountDiv","true"==emailCheck||1==newAccountPass),"4"==loginMode){0<tokenTimeout&&setTimeout(function(){Q("hwtokenInput").value="**timeout**",QE("tokenOkButton",!0),Q("tokenOkButton").click()},tokenTimeout);try{hardwareKeyChallenge=0<hardwareKeyChallenge.length?JSON.parse(hardwareKeyChallenge):null}catch(e){hardwareKeyChallenge=null}var l=null!=hardwareKeyChallenge&&"webAuthn"==hardwareKeyChallenge.type;QV("securityKeyButton",l),QV("emailKeyButton",otpemail&&2!=e&&4!=e&&6!=e),QV("smsKeyButton",otpsms&&2!=e&&4!=e&&6!=e),QV("msgKeyButton",otpmsg&&2!=e&&4!=e&&6!=e),QV("duoKeyButton",otpduo&&2!=e&&4!=e&&6!=e),autofido&&l&&setTimeout(function(){useSecurityKey(1)},300)}if("5"==loginMode){0<tokenTimeout&&setTimeout(function(){Q("hwtokenInput").value="**timeout**",QE("tokenOkButton",!0),Q("tokenOkButton").click()},tokenTimeout);try{hardwareKeyChallenge=0<hardwareKeyChallenge.length?JSON.parse(hardwareKeyChallenge):null}catch(e){hardwareKeyChallenge=null}l=null!=hardwareKeyChallenge&&"webAuthn"==hardwareKeyChallenge.type;QV("securityKeyButton2",l),QV("emailKeyButton2",otpemail&&2!=e&&4!=e&&6!=e),QV("smsKeyButton2",otpsms&&2!=e&&4!=e&&6!=e),QV("msgKeyButton2",otpmsg&&2!=e&&4!=e&&6!=e),QV("duoKeyButton2",otpduo&&2!=e&&4!=e&&6!=e),autofido&&l&&setTimeout(function(){useSecurityKey(2)},300)}userInterfaceSelectMenu()}function useSecurityKey(t){if(null!=hardwareKeyChallenge&&"webAuthn"==hardwareKeyChallenge.type){"string"==typeof hardwareKeyChallenge.challenge&&(hardwareKeyChallenge.challenge=Uint8Array.from(atob(hardwareKeyChallenge.challenge),function(e){return e.charCodeAt(0)}).buffer),publicKeyCredentialRequestOptions={challenge:hardwareKeyChallenge.challenge,allowCredentials:[],timeout:hardwareKeyChallenge.timeout};for(var e=0;e<hardwareKeyChallenge.keyIds.length;e++)publicKeyCredentialRequestOptions.allowCredentials.push({id:Uint8Array.from(atob(hardwareKeyChallenge.keyIds[e]),function(e){return e.charCodeAt(0)}),type:"public-key",transports:["usb","ble","nfc","internal"]});navigator.credentials.get({publicKey:publicKeyCredentialRequestOptions}).then(function(e){e={id:btoa(String.fromCharCode.apply(null,new Uint8Array(e.rawId))),clientDataJSON:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.clientDataJSON))),userHandle:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.userHandle))),signature:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.signature))),authenticatorData:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.authenticatorData)))};1==t?(Q("hwtokenInput").value=JSON.stringify(e),QE("tokenOkButton",!0),Q("tokenOkButton").click()):2==t&&(Q("resetHwtokenInput").value=JSON.stringify(e),QE("resetTokenOkButton",!0),Q("resetTokenOkButton").click())},function(e){console.log("credentials-get error",e)})}}function useEmailToken(e){1==otpemail&&setDialogMode(1,"Suojattu kirjautuminen",3,useEmailKeyEx,"Lähetetäänkö tunnus rekisteröityyn sähköpostiosoitteeseen?",e)}function useEmailKeyEx(e,t){1==t?(Q("hwtokenInput").value="**email**",QE("tokenOkButton",!0),Q("tokenOkButton").click()):2==t&&(Q("resetHwtokenInput").value="**email**",QE("resetTokenOkButton",!0),Q("resetTokenOkButton").click())}function useSMSToken(e){1==otpsms&&setDialogMode(1,"Suojattu kirjautuminen",3,useSMSTokenEx,"Lähetetäänkö tunnus rekisteröityyn puhelinnumeroon?",e)}function useSMSTokenEx(e,t){1==t?(Q("hwtokenInput").value="**sms**",QE("tokenOkButton",!0),Q("tokenOkButton").click()):2==t&&(Q("resetHwtokenInput").value="**sms**",QE("resetTokenOkButton",!0),Q("resetTokenOkButton").click())}function useMsgToken(e){1==otpmsg&&setDialogMode(1,"Suojattu kirjautuminen",3,useMsgTokenEx,"Send token to messaging application?",e)}function useMsgTokenEx(e,t){1==t?(Q("hwtokenInput").value="**msg**",QE("tokenOkButton",!0),Q("tokenOkButton").click()):2==t&&(Q("resetHwtokenInput").value="**msg**",QE("resetTokenOkButton",!0),Q("resetTokenOkButton").click())}function useDuoToken(e){1==e?(Q("hwtokenInput").value="**duo**",QE("tokenOkButton",!0),Q("tokenOkButton").click()):2==e&&(Q("resetHwtokenInput").value="**duo**",QE("resetTokenOkButton",!0),Q("resetTokenOkButton").click())}function showPassHint(e){return messagebox("Salasana Vihje",passhint),haltEvent(e),!1}function xgo(e,t){return QV("message1",!1),QV("message2",!1),QV("message3",!1),QV("message4",!1),QV("message5",!1),QV("message6",!1),QV("message7",!1),go(e),haltEvent(t),!1}function go(e){currentpanel=e,setDialogMode(0),QV("showPassHintLink",!1),QV("loginpanel",1==e),QV("createpanel",2==e),QV("resetpanel",3==e),QV("tokenpanel",4==e),QV("resettokenpanel",5==e),QV("resetpasswordpanel",6==e),QV("checkemailpanel",7==e),1==e&&Q("username").focus(),2==e&&(2097152&features?Q("aemail"):Q("ausername")).focus(),3==e&&Q("remail").focus(),4==e&&Q("tokenInput").focus(),5==e&&Q("resetTokenInput").focus(),6==e&&Q("rapassword1").focus(),7==e&&(QH("unconfirmedEmail",passhint),QV("checkCheckOperations",""!=Q("unconfirmedEmail").innerHTML),QH("checkEmailVal",passhint))}function validateLogin(e,t){setTimeout(function(){setDialogMode(0),null!=t&&13==t.keyCode&&(1==e&&""!=Q("username").value?Q("password").focus():2==e&&""!=Q("password").value&&Q("loginButton").click()),null!=t&&haltEvent(t)},100)}function validateCreate(e,t){setDialogMode(0);var n=!1,n=!!(2097152&features)||0<Q("ausername").value.length&&-1==Q("ausername").value.indexOf(" ")&&-1==Q("ausername").value.indexOf('"')&&-1==Q("ausername").value.indexOf(","),a=1==validateEmail(Q("aemail").value),o=0<Q("apassword1").value.length,s=0<Q("apassword2").value.length&&Q("apassword2").value==Q("apassword1").value,l=0==newAccountPass||0<Q("anewaccountpass").value.length,i=""==newAccountCaptcha||0<Q("anewaccountcaptcha").value.length,r=n&&a&&o&&s&&l;QS("nuUser").color=n?"black":"#7b241c",QS("nuEmail").color=a?"black":"#7b241c",QS("nuPass1").color=o?"black":"#7b241c",QS("nuPass2").color=s?"black":"#7b241c",QS("nuToken").color=l?"black":"#7b241c",QS("nuCaptcha").color=i?"black":"#7b241c",""==Q("apassword1").value?(QH("passWarning",""),QV("passwordPolicyCallout",!1)):passRequirementsEx?0==checkPasswordRequirements(Q("apassword1").value,passRequirements)?(r=!1,QS("nuPass1").color="#7b241c",QS("nuPass2").color="#7b241c",QH("passWarning","<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Salasana käytäntö</b><div>"),QV("passwordPolicyCallout",!0),QH("passwordPolicyCallout",passwordPolicyText(Q("apassword1").value))):(QH("passWarning",""),QV("passwordPolicyCallout",!1)):80<=(l=checkPasswordStrength(Q("apassword1").value))?QH("passWarning","<span style=color:green><b>Vahva Salasana</b><span>"):60<=l?QH("passWarning","<span style=color:blue><b>Hyvä salasana</b><span>"):QH("passWarning","<span style=color:red><b>Heikko Salasana</b><span>"),null!=t&&13==t.keyCode&&(1==e&&n&&Q("aemail").focus(),2==e&&a&&Q("apassword1").focus(),3==e&&o&&Q("apassword2").focus(),4==e&&s&&(!0===passRequirements.hint?Q("apasswordhint").focus():e=5),5==e&&(1==newAccountPass?Q("anewaccountpass").focus():e=6),6==e&&(""!=newAccountCaptcha?Q("anewaccountcaptcha").focus():e=7),7==e)&&Q("createButton").click(),null!=t&&haltEvent(t),QE("createButton",r)}function validatePassReset(e,t){setDialogMode(0);var n=0<Q("rapassword1").value.length,a=0<Q("rapassword2").value.length&&Q("rapassword2").value==Q("rapassword1").value,o=n&&a;QS("rnuPass1").color=n?"black":"#7b241c",QS("rnuPass2").color=a?"black":"#7b241c",""==Q("rapassword1").value?(QH("rpassWarning",""),QV("rpasswordPolicyCallout",!1)):passRequirementsEx?0==checkPasswordRequirements(Q("rapassword1").value,passRequirements)?(o=!1,QS("rnuPass1").color="#7b241c",QS("rnuPass2").color="#7b241c",QH("rpassWarning","<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Salasana käytäntö</b><div>"),QV("rpasswordPolicyCallout",!0),QH("rpasswordPolicyCallout",passwordPolicyText(Q("rapassword1").value))):(QH("rpassWarning",""),QV("rpasswordPolicyCallout",!1)):80<=(n=checkPasswordStrength(Q("rapassword1").value))?QH("rpassWarning","<span style=color:green><b>Vahva Salasana</b><span>"):60<=n?QH("rpassWarning","<span style=color:blue><b>Hyvä salasana</b><span>"):QH("rpassWarning","<span style=color:red><b>Heikko Salasana</b><span>"),null!=t&&13==t.keyCode&&(2==e&&Q("rapassword1").focus(),3==e&&Q("rapassword2").focus(),4==e&&Q("rapasswordhint").focus(),6==e)&&Q("resetPassButton").click(),null!=t&&haltEvent(t),QE("resetPassButton",o)}function passwordPolicyText(e){var t="<div style=text-align:left>",n=strCount(e);return passRequirements.min&&(null==e||e.length<passRequirements.min)&&(t+=format("Vähimmäispituus {0}",passRequirements.min)+"<br />"),passRequirements.max&&(null==e||e.length>passRequirements.max)&&(t+=format("Enimmäispituus {0}",passRequirements.max)+"<br />"),passRequirements.upper&&(null==e||n.upper<passRequirements.upper)&&(t+=format("{0} isot kirjaimet",passRequirements.upper)+"<br />"),passRequirements.lower&&(null==e||n.lower<passRequirements.lower)&&(t+=format("{0} pienet kirjaimet",passRequirements.lower)+"<br />"),passRequirements.numeric&&(null==e||n.numeric<passRequirements.numeric)&&(t+=format("{0} numeerinen",passRequirements.numeric)+"<br />"),passRequirements.nonalpha&&(null==e||n.nonalpha<passRequirements.nonalpha)&&(t+=format("{0} ei-aakkosnumeerinen",passRequirements.nonalpha)+"<br />"),t+="</div>"}function showPasswordPolicy(){messagebox("Salasana käytäntö",passwordPolicyText())}function validateReset(e){setDialogMode(0);var t=validateEmail(Q("remail").value);QE("eresetButton",t),null!=e&&13==e.keyCode&&1==t&&Q("eresetButton").click(),null!=e&&haltEvent(e)}function checkPasswordStrength(e){var t=0,n={},a=0,o={digits:/\d/.test(e),lower:/[a-z]/.test(e),upper:/[A-Z]/.test(e),nonWords:/\W/.test(e)};if(!e)return 0;for(var s,l=0;l<e.length;l++)n[e[l]]=(n[e[l]]||0)+1,t+=5/n[e[l]];for(s in o)a+=1==o[s]?1:0;return parseInt(t+10*(a-1))}function checkPasswordRequirements(e,t){return null==t||""==t||"object"!=typeof t||!(t.min&&e.length<t.min||t.max&&e.length>t.max||(e=strCount(e),t.numeric&&e.numeric<t.numeric)||t.lower&&e.lower<t.lower||t.upper&&e.upper<t.upper||t.nonalpha&&e.nonalpha<t.nonalpha)}function strCount(e){var t={numeric:0,lower:0,upper:0,nonalpha:0};if("string"==typeof e)for(var n=0;n<e.length;n++)/\d/.test(e[n])&&t.numeric++,/[a-z]/.test(e[n])&&t.lower++,/[A-Z]/.test(e[n])&&t.upper++,/\W/.test(e[n])&&t.nonalpha++;return t}function checkToken(){var e=Q("tokenInput").value,t=e.split(" ").join("");e!=t&&(Q("tokenInput").value=t),QE("tokenOkButton",6==Q("tokenInput").value.length||8==Q("tokenInput").value.length||44==Q("tokenInput").value.length)}function resetCheckToken(){var e=Q("resetTokenInput").value,t=e.split(" ").join("");e!=t&&(Q("resetTokenInput").value=t),QE("resetTokenOkButton",6==Q("resetTokenInput").value.length||8==Q("resetTokenInput").value.length||44==Q("resetTokenInput").value.length)}function changeEmailAddress(){setDialogMode(1,"Sähköpostivarmistus",3,changeEmailAddressEx,addHtmlValue("Sähköposti",'<input id=dp1email style=width:230px maxlength=256 value="'+Q("unconfirmedEmail").innerHTML+'" {{{autocomplete}}}=off onchange=validateEmailAddress() onkeyup=validateEmailAddress() />')),validateEmailAddress()}function validateEmailAddress(){QE("idx_dlgOkButton",1==validateEmail(Q("dp1email").value))}function changeEmailAddressEx(){Q("checkEmailVal").value=Q("dp1email").value,QH("unconfirmedEmail",Q("dp1email").value),Q("checkEmailButton").click()}function resentEmailConfirmation(){Q("checkEmailVal").value=Q("unconfirmedEmail").innerHTML,Q("checkEmailButton").click()}var xxcurrentView=0;function setDialogMode(e,t,n,a,o,s){xxdialogMode=e,xxdialogFunc=a,xxdialogButtons=n,xxdialogTag=s,QE("idx_dlgOkButton",!0),QV("idx_dlgOkButton",1&n),QV("idx_dlgCancelButton",2&n),QV("id_dialogclose",2&n||8&n),QV("idx_dlgButtonBar",7&n),t&&QH("id_dialogtitle",t);for(var l=1;l<24;l++)QV("dialog"+l,l==e);QV("dialog",e),o&&(2==e?QH("id_dialogOptions",o):QH("id_dialogMessage",o))}function dialogclose(e){var t=xxdialogFunc,n=xxdialogButtons,a=xxdialogTag;setDialogMode(),(8&n||e)&&t&&t(e,a)}function toggleFullScreen(e){0==webPageFullScreen?QC("body").remove("fullscreen"):QC("body").add("fullscreen"),QV("body",!0),center()}function showUserInterfaceSelectMenu(){Q("uiViewButton1").classList.remove("uiSelectorSel"),Q("uiViewButton2").classList.remove("uiSelectorSel"),Q("uiViewButton3").classList.remove("uiSelectorSel");try{Q("uiViewButton"+uiMode).classList.add("uiSelectorSel")}catch(e){}QV("uiMenu","none"==QS("uiMenu").display),nightMode&&Q("uiViewButton4").classList.add("uiSelectorSel")}function userInterfaceSelectMenu(e){e&&putstore("uiMode",uiMode=e),webPageFullScreen=uiMode<3,toggleFullScreen(0)}function toggleNightMode(){(nightMode=!nightMode)?QC("body").add("night"):QC("body").remove("night"),putstore("_nightMode",nightMode?"1":"0")}function center(){var e;0==webPageFullScreen?QS("centralTable")["margin-top"]="":((e=Q("column_l").clientHeight/2-220)<0&&(e=0),QS("centralTable")["margin-top"]=e+"px")}function messagebox(e,t){QH("id_dialogMessage",t),setDialogMode(1,e,1)}function statusbox(e,t){QH("id_dialogMessage",t),setDialogMode(1,e)}function getDocWidth(){return window.innerWidth||(document.documentElement&&document.documentElement.clientWidth&&0!=document.documentElement.clientWidth?document.documentElement:document.getElementsByTagName("body")[0]).clientWidth}function haltEvent(e){return e.preventDefault&&e.preventDefault(),e.stopPropagation&&e.stopPropagation(),!1}function haltReturn(e){13==e.keyCode&&haltEvent(e)}function validateEmail(e){return/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)}function putstore(e,t){try{"undefined"!=typeof localStorage&&localStorage.setItem(e,t)}catch(e){}}function getstore(e,t){try{var n;return"undefined"==typeof localStorage?t:null==(n=localStorage.getItem(e))?t:n}catch(e){return t}}function format(e){var n=Array.prototype.slice.call(arguments,1);return e.replace(/{(\d+)}/g,function(e,t){return void 0!==n[t]?n[t]:e})}function addTextLink(e,t,n){var a=t.toLowerCase().indexOf(e.toLowerCase());return-1==a?t:t.substring(0,a)+'<a href="'+n+'">'+e+"</a>"+t.substring(a+e.length)}function addHtmlValue(e,t){return"<table><td style=width:120px;text-align:left>"+e+"<td><b>"+t+"</b></table>"}</script>