Обновите страницу или попробуйте позже."}):a}},A=e=>S({url:"/api/login_check",method:"post",body:e}),k=e=>S({url:"/api/login/2fa_check",method:"post",body:e}),H=()=>new Promise(async(e,t)=>{try{const n=new AbortController,s=3e4,a=setTimeout(()=>{n.abort()},s),r=await fetch("/get_captcha_sources",{redirect:"follow",signal:typeof AbortSignal.timeout=="function"?AbortSignal.timeout(s):n.signal});if(clearTimeout(a),r.redirected&&location.assign(r.url),!r.ok)return t(new Error(r.statusText));const o=await r.json(),l=document.createElement("div");l.classList.add("modal"),l.innerHTML="",document.body.append(l),document.body.style.overflow="hidden";let i=0;const d=()=>{document.body.style.overflow="auto",clearInterval(i),removeEventListener("message",h),l.remove()},h=p=>{typeof p.data=="object"&&(p.data?.type==="captcha:error"&&(d(),t(p.data.data)),p.data?.type==="captcha:redirect"&&location.assign(p.data.data),p.data?.type==="captcha:success"&&(d(),e(p.data.data)))};l.addEventListener("click",()=>{d(),t(new Error("Капча не пройдена"))});const w=l.querySelector("iframe"),c=w.contentWindow?.document;c.write(o.data.html);const u=c.createElement("style");u.innerHTML=o.data.style,c.head.append(u);const y=c.createElement("script");y.innerHTML=o.data.script,c.body.append(y),i=setInterval(()=>{w.style.height=c.body.scrollHeight+"px"},100),addEventListener("message",h)}catch(n){t(n)}}),b=e=>(t,n,s)=>{const{element:a,getValue:r,setValue:o}=e(t,s);let l=null;const i=document.createElement("div");return i.classList.add("input__error"),i.style.display="none",a.append(i),{element:a,validators:n,getValue:r,setValue:o,hasError:()=>l!=null,setError:d=>{a.style.display==="none"||!d?(l=null,i.innerHTML="",a.querySelector("input")?.classList.remove("invalid"),i.style.display="none"):(l=d,i.innerHTML=d??"",a.querySelector("input")?.classList.add("invalid"),i.style.display="flex")}}},j=b((e,t)=>{const n=e;return n.addEventListener("input",()=>t(n.value)),{element:n.parentElement,getValue:()=>n.value,setValue:s=>n.value=s}}),F=b((e,t)=>{const n=e;n.addEventListener("input",()=>t(n.value));const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.innerHTML='';const a=document.createElementNS("http://www.w3.org/2000/svg","svg");a.innerHTML='',a.style.display="none";const r=document.createElement("div");return r.classList.add("input__visibility"),r.append(s),r.append(a),r.addEventListener("click",()=>{n.type==="password"?(s.style.display="none",a.style.display="flex",n.type="text"):(s.style.display="flex",a.style.display="none",n.type="password")}),n.after(r),{element:n.parentElement,getValue:()=>n.value,setValue:o=>n.value=o}}),R=b((e,t)=>{let n="";return e.querySelectorAll("input").forEach(s=>{s.addEventListener("change",()=>{n=s.value,t(s.value)}),s.checked&&(n=s.value)}),{element:e,getValue:()=>n,setValue:s=>n=s}}),z=b(e=>{const t=e,n=document.createElement("div");return n.classList.add("input__notify"),n.innerHTML="Скопировано",e.parentElement?.append(n),t.addEventListener("click",s=>{s.stopPropagation(),B(t.value),n.style.opacity="1",n.style.top="-25px",setTimeout(()=>n.removeAttribute("style"),1500)}),{element:t.parentElement,getValue:()=>t.value,setValue:s=>t.value=s}}),B=e=>{if(navigator?.clipboard?.writeText)return navigator.clipboard.writeText(e);if(navigator?.clipboard?.write&&ClipboardItem)return navigator.clipboard.write([new ClipboardItem({"text/plain":new Blob([e],{type:"text/plain"})})]);{const t=document.createElement("textarea");t.value=e,Object.assign(t.style,{position:"absolute",top:"-9999px",left:"-9999px"}),document.body.appendChild(t),t.select(),t.setSelectionRange(0,e.length),document.execCommand("copy"),document.body.removeChild(t)}},N={password:F,radio:R,text:j,textarea:z},x=(e,t,n)=>{let s=!1;const a=document.querySelector("#"+e),r=a.querySelector(".form__error"),o=a.querySelector("button[type=submit]");o.innerHTML=''+o.innerHTML;const l=Object.entries(t).reduce((c,[u,y])=>{const[p,C,q]=y,v=N[p](a.querySelector("#"+u),C.map(g=>g[0]==="required"?()=>v.getValue()?null:g[1]:g[0]==="minLength"?()=>v.getValue().lengthv.getValue()!==l[g[1]].getValue()?g[2]:null),()=>{v.setError(null),s&&w(),q?.(l)});return c[u]=v,c},{}),i=Object.values(l),d=()=>{s=!1,a.classList.remove("disabled"),o.disabled=!1,r.style.display="none",i.forEach(c=>c.setValue(""))},h=c=>{r.innerHTML=c,r.style.display="flex"},w=()=>i.map(c=>{for(const u of c.validators)if(c.setError(u()),c.hasError())return!1;return!0}).every(c=>c);return a.addEventListener("submit",async c=>{if(c.preventDefault(),s=!0,!!w()){a.classList.add("disabled"),o.disabled=!0,r.style.display="none";try{await n(l)}catch(u){if(a.classList.remove("disabled"),o.disabled=!1,u.data?.validationErrors)for(const y of u.data.validationErrors)l[y.field.replace("[","").replace("]","")].setError(y.message);else h(u.message||"Произошла ошибка при выполнении запроса")}}}),{...l,element:a,reset:d,setError:h}},_={click:{getVal:e=>e.target.id||e.target.tagName,type:4},mousemove:{getVal:e=>`${e.x}:${e.y}`,type:1},touchend:{getVal:e=>`${e.changedTouches.item(0)?.clientX??0}:${e.changedTouches.item(0)?.clientX??0}`,type:3},touchstart:{getVal:e=>`${e.changedTouches.item(0)?.clientX??0}:${e.changedTouches.item(0)?.clientX??0}`,type:2},blur:{getVal:e=>e.target.id||e.target.tagName,type:6,targets:["input"]},focus:{getVal:e=>e.target.id||e.target.tagName,type:5,targets:["input"]},keyup:{getVal:e=>["password","confirm_password"].includes(e.target?.id)?"*":`${e.ctrlKey?"CTRL_":""}${e.shiftKey?"SHIFT_":""}${e.key}`,type:8},keydown:{getVal:e=>["password","confirm_password"].includes(e.target?.id)?"*":`${e.ctrlKey?"CTRL_":""}${e.shiftKey?"SHIFT_":""}${e.key}`,type:7}},O=()=>{const e=[],t=a=>r=>{const o={ts:r.timeStamp,type:a.type,val:a.getVal(r)};e.push(o)},n=(a,r,o,l)=>{Array.isArray(a)?a.forEach(i=>i.forEach(d=>{d[l](r,o)})):a[l](r,o)},s={};for(const a in _){const r=a;if(r){const o=_[r],l=t(o),i=o?.targets?o.targets.map(d=>document.querySelectorAll(d)):window;s[r]={handler:l,targets:i},n(i,r,l,"addEventListener")}}return[()=>{for(const a in s){const{handler:r,targets:o}=s[a]??{};o&&r&&n(o,a,r,"removeEventListener")}},()=>e.map(({ts:r,val:o,type:l})=>`${r};${l};${o};`).join(`
`)]},K=()=>{const e=document.getElementById("tgBtn");return e&&(e.style.display="inline-flex"),e};I();K();const[V,T]=O(),m=x("login",{username:["text",[["required","Введите логин"]]],password:["password",[["required","Введите пароль"]]]},async e=>{const t=await H(),n={username:e.username.getValue(),password:e.password.getValue(),captcha_token:t};return n.s=T(),L(A(n))}),f=x("pgp_2fa",{pgp_secret:["textarea",[]],pgp_code:["text",[["required","Введите код"]]]},async e=>{const t={data:{authCode:e.pgp_code.getValue()}};return t.s=T(),L(k(t))}),E=x("google_2fa",{google_code:["text",[["required","Введите код"]]]},async e=>{const t={data:{authCode:e.google_code.getValue()}};return t.s=T(),L(k(t))}),L=async e=>{try{const t=await e;$(t.token),V(),location.assign("/")}catch(t){if(t.data?.code===401)throw new Error(t.data?.message);if(t.status===423)localStorage.setItem("username",m.username.getValue()),V(),location.assign("/oops.html");else if(t.data?.two_factor_next_challenge==="pgp")f.pgp_secret.setValue(t.data?.meta?.secret??""),f.pgp_code.setValue(""),m.element.style.display="none",f.element.style.display="flex",E.element.style.display="none";else if(t.data?.two_factor_next_challenge==="google")E.google_code.setValue(""),m.element.style.display="none",f.element.style.display="none",E.element.style.display="flex";else if(t.data?.error==="2fa_failed"){const n=m.username.getValue();m.reset(),m.username.setValue(n),m.setError("Проверочный код указан неверно"),f.reset(),E.reset(),m.element.style.display="flex",f.element.style.display="none",E.element.style.display="none"}else throw t}};