<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
<style>
:root {
--background-color-main: #171717;
--background-image-main: url('');
--header-container-color: linear-gradient(to right, #f2295b, #712de0);
--background-container-color: #171717;
--border-color: linear-gradient(to right, #f2295b, #712de0);
--border-loading-color: #ffffff;
--text-color: #ffffff;
--text-alert-color: #ff0000;
--icons-color: #ffffff;
--background-buttons-color: linear-gradient(to right, #712de0, #f2295b);
--margem-do-topo-do-modal: 10px;
--margem-do-bottom-do-modal: 10px;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,
body,
main {
width: 100%;
height: 100%;
}
body {
background-color: var(--background-color-main);
background-image: var(--background-image-main);
background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
main {
display: flex;
flex-direction: column;
align-items: center;
gap: 20px;
position: relative;
transition: padding-bottom 0.3s ease 0.2s;
overflow: hidden;
}
.container-logo {
width: 95%;
height: auto;
display: flex;
justify-content: center;
align-items: center;
margin-top: 40px;
padding: 5px 3px;
}
.container-logo img {
width: 50%;
max-width: 300px;
}
.container {
width: 95%;
max-width: 450px;
height: auto;
position: relative;
border-radius: 5px;
background: transparent;
}
.container header {
width: 95%;
height: 45px;
display: flex;
align-items: center;
gap: 10px;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
margin: auto;
padding: 5px 10px;
background: #171717;
}
.container header button:first-child {
visibility: hidden;
}
.container header button {
flex: 1;
height: 100%;
border: 0;
border-radius: 20px;
color: var(--text-color);
font-family: 'Roboto', sans-serif;
background: var(--background-buttons-color);
}
.container form {
width: 100%;
height: calc(100% - 45px);
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
margin: 10px 0px;
padding: 0px 3px;
}
.container form div {
width: 95%;
height: 45px;
display: flex;
align-items: center;
border-radius: 50px;
padding: 0px 10px;
background: #000;
}
.container form div#uuid-container {
display: none;
}
.container form div svg {
width: 38px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
align-content: center;
padding: 0px 10px;
border-right: 1px solid var(--border-color);
color: var(--icons-color);
}
.container form div svg path {
transform: scale(1);
}
.container form div input {
width: 100%;
height: 100%;
border: 0;
outline: none;
padding-left: 5px;
color: var(--text-color);
font-family: 'Roboto', sans-serif;
font-size: 1rem;
background: transparent;
}
.container form div input::placeholder {
color: #dddddd;
}
.form-buttons {
width: 100%;
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 10px;
padding: 0px 5px;
}
.form-buttons button {
flex: 1;
height: 45px;
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
border: 0;
border-radius: 20px;
color: var(--text-color);
font-family: 'Roboto', sans-serif;
background: #000;
}
.form-buttons button:last-child {
width: 50%;
flex-basis: 100%;
margin-top: 10px;
}
.menu {
width: 100%;
height: calc(100% - 45px);
position: absolute;
top: 45px;
left: 0;
right: 0;
bottom: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 13px;
padding: 10px 5px;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
opacity: 0;
transform: perspective(800px) rotateX(90deg) rotateY(0deg);
transform-origin: 100% 100%;
background: #171717;
}
.menu button {
width: 95%;
height: 45px;
display: flex;
align-items: center;
justify-content: center;
border: 0;
border-radius: 17.5px;
background: var(--background-buttons-color);
}
.menu button svg {
color: var(--icons-color);
margin-right: 5px;
}
.menu button span {
color: var(--text-color);
font-family: 'Roboto', sans-serif;
}
.status-vpn {
width: 100%;
height: auto;
padding: 0px 10px;
}
.status-vpn section {
width: 95%;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
margin: 0 auto;
padding: 0px 10px;
border-radius: 20px;
background: #000;
}
.status-vpn section svg {
color: #ffffff;
}
.status-vpn section h1 {
color: #ffffff;
font-family: 'Roboto', sans-serif;
font-weight: 400;
font-size: 1rem;
}
.home-menu {
width: 95%;
max-width: 450px;
height: auto;
display: flex;
flex-direction: column;
justify-content: center;
gap: 10px;
position: absolute;
bottom: 20px;
padding: 0px 10px;
}
.home-menu button {
width: auto;
height: 45px;
display: flex;
justify-content: center;
align-items: center;
gap: 5px;
padding: 0px 10px;
border: 0px;
border-radius: 20px;
background: var(--background-buttons-color);
}
.home-menu button svg {
height: 100%;
color: var(--icons-color);
}
.home-menu button span {
color: var(--text-color);
}
.modal-speedtest,
.modal-configs,
.modal-logs,
.modal-alert-clear-data,
.modal-error-alert,
.modal-status-vpn,
.modal-checkuser,
.modal-loading,
.modal-gen-test,
.modal-buy-access,
.modal-call-support {
width: 98%;
max-width: 450px;
height: calc(100% - var(--margem-do-bottom-do-modal) - var(--margem-do-topo-do-modal));
position: absolute;
top: var(--margem-do-topo-do-modal);
left: auto;
right: auto;
bottom: var(--margem-do-bottom-do-modal);
z-index: 2;
display: flex;
flex-direction: column;
border-radius: 5px;
overflow: hidden;
opacity: 0;
transform: scale(0);
transform-origin: center;
transition: all 0.3s ease 0.1s;
}
.show {
opacity: 1;
transform: scale(1);
}
.modal-speedtest header,
.modal-configs header,
.modal-logs header,
.modal-alert-clear-data header,
.modal-error-alert header,
.modal-status-vpn header,
.modal-checkuser header,
.modal-loading header,
.modal-gen-test header,
.modal-buy-access header,
.modal-call-support header {
width: 100%;
height: 40px;
display: flex;
align-items: center;
padding: 0px 10px;
background: var(--header-container-color);
}
.modal-speedtest header svg,
.modal-configs header svg,
.modal-logs header svg,
.modal-alert-clear-data header svg,
.modal-error-alert header svg,
.modal-status-vpn header svg,
.modal-checkuser header svg,
.modal-loading header svg,
.modal-gen-test header svg,
.modal-buy-access header svg,
.modal-call-support header svg {
margin-left: auto;
color: var(--icons-color);
}
.modal-speedtest section,
.modal-configs section,
.modal-logs section,
.modal-alert-clear-data section,
.modal-error-alert section,
.modal-status-vpn section,
.modal-checkuser section,
.modal-loading section,
.modal-gen-test section,
.modal-buy-access section,
.modal-call-support section {
background: var(--background-container-color);
}
.modal-speedtest section,
.modal-gen-test section,
.modal-buy-access section,
.modal-call-support section {
width: 100%;
height: calc(100% - 40px);
position: relative;
display: flex;
justify-content: center;
align-items: center;
}
.modal-logs section,
.modal-checkuser section {
width: 100%;
height: calc(100% - 40px);
position: relative;
display: flex;
flex-direction: column;
align-items: center;
}
.modal-logs section p {
width: 100%;
height: auto;
max-height: calc(100% - 65px);
margin: 10px 0px;
padding: 0px 10px;
overflow-y: auto;
color: var(--text-color);
font-family: 'Roboto', sans-serif;
font-size: 0.7rem;
}
.modal-logs section button {
width: 80%;
height: 45px;
margin-top: auto;
margin-bottom: 5px;
display: flex;
align-items: center;
justify-content: center;
border: 0;
border-radius: 17.5px;
background: var(--background-buttons-color);
}
.modal-logs section button svg {
color: var(--icons-color);
margin-right: 5px;
}
.modal-logs section button span {
color: var(--text-color);
font-family: 'Roboto', sans-serif;
}
.modal-speedtest section iframe,
.modal-gen-test section iframe,
.modal-buy-access section iframe,
.modal-call-support section iframe {
width: 100%;
height: 100%;
border: 0;
overflow: hidden;
}
.modal-checkuser section {
padding: 10px;
justify-content: center;
}
.modal-checkuser section h1 {
width: 100%;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
margin: 20px;
border-bottom: 2px solid var(--background-buttons-color);
color: var(--text-color);
font-family: 'Roboto', sans-serif;
font-weight: 400;
}
.modal-checkuser section div {
width: 100%;
height: 40px;
display: flex;
align-items: center;
margin: 10px 0px;
border-radius: 20px;
background: var(--background-buttons-color);
overflow: hidden;
}
.modal-checkuser section div i {
width: 40px;
height: 40px;
display: flex;
justify-content: center;
align-items: center;
color: var(--icons-color);
}
.modal-checkuser section div span {
width: calc(100% - 40px);
height: 100%;
display: flex;
align-items: center;
color: var(--text-color);
font-family: 'Roboto', sans-serif;
}
.modal-configs section {
width: 100%;
height: calc(100% - 40px);
overflow-y: auto;
}
.modal-configs section div {
width: 100%;
height: auto;
margin-top: 10px;
display: flex;
flex-direction: column;
align-items: center;
}
.modal-configs section div h1.title {
width: 90%;
min-height: 30px;
display: flex;
justify-content: center;
align-items: center;
margin: 10px 0px;
margin-top: 10px;
border-radius: 15px;
color: var(--text-color);
font-family: 'Roboto', sans-serif;
font-size: 0.9rem;
background: var(--background-buttons-color);
}
.modal-configs section div ul {
width: 100%;
height: auto;
margin-top: 5px;
padding: 0px 10px;
border-radius: 15px;
}
.modal-configs section div ul li {
width: 100%;
height: 60px;
min-height: 60px;
display: flex;
align-items: center;
margin: 0px 0px 10px 0px;
padding: 5px;
padding-left: 15px;
border-radius: 30px;
overflow: hidden;
background: #000;
}
.modal-configs section ul li img {
width: 30px;
height: 30px;
}
.modal-configs section ul li div {
width: calc(100% - 40px);
height: 40px;
margin-left: 5px;
display: flex;
flex-direction: column;
align-items: flex-start;
overflow: hidden;
}
.modal-configs section ul li div h1 {
color: var(--text-color);
font-size: 0.7rem;
font-weight: 600;
font-family: 'Roboto', sans-serif;
}
.modal-configs section ul li div p {
color: var(--text-color);
font-family: 'Roboto', sans-serif;
font-size: 0.6rem;
font-weight: 400;
}
.modal-alert-clear-data section,
.modal-error-alert section,
.modal-status-vpn section,
.modal-loading section {
width: 100%;
height: calc(100% - 40px);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.modal-alert-clear-data section svg,
.modal-error-alert section svg {
width: 128px;
height: auto;
color: var(--text-alert-color);
}
.modal-alert-clear-data section h1,
.modal-error-alert section h1 {
margin: 10px 0px;
color: var(--text-alert-color);
font-family: 'Roboto', sans-serif;
}
.modal-alert-clear-data section p,
.modal-error-alert section p {
height: 145px;
max-height: 145px;
overflow-y: auto;
margin-bottom: 10px;
padding: 10px;
color: var(--text-color);
font-family: 'Roboto', sans-serif;
font-weight: 300;
}
.modal-error-alert section p {
text-align: center;
}
.modal-alert-clear-data section div {
width: 95%;
height: auto;
margin-top: 10px;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
.modal-alert-clear-data section div button {
width: 150px;
height: 45px;
display: flex;
align-items: center;
justify-content: center;
padding: 0px 5px;
border: 0;
border-radius: 20px;
background: var(--background-buttons-color);
}
.modal-alert-clear-data section div button svg {
width: 16px;
height: auto;
margin-left: 6px;
color: var(--icons-color);
}
.modal-alert-clear-data section div button span {
margin-left: 5px;
color: var(--text-color);
font-family: 'Roboto', sans-serif;
font-size: 0.7rem;
}
.modal-status-vpn section {
position: relative;
}
.modal-status-vpn section div.loading-status,
.modal-loading section div {
width: 70px;
height: 70px;
position: relative;
border: 4px solid var(--border-loading-color);
border-radius: 50%;
border-top: 4px solid transparent;
animation: spin 1s infinite linear;
}
.modal-status-vpn section div.loading-status svg,
.modal-loading section svg {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
color: var(--icons-color);
padding: 15px;
position: absolute;
top: auto;
left: auto;
right: auto;
bottom: auto;
animation: spin 1s infinite linear reverse;
}
.modal-status-vpn section h1 {
margin-top: 15%;
color: var(--text-color);
font-family: 'Roboto', sans-serif;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.boingInUp {
-webkit-animation-name: boingInUp;
animation-name: boingInUp;
}
@-webkit-keyframes boingInUp {
0% {
opacity: 0;
transform: perspective(800px) rotateX(-90deg);
transform-origin: 50% 0;
}
50% {
opacity: 1;
transform: perspective(800px) rotateX(50deg);
transform-origin: 50% 0;
}
to {
opacity: 1;
transform: perspective(800px) rotateX(0deg);
transform-origin: 50% 0;
}
}
@keyframes boingInUp {
0% {
opacity: 0;
transform: perspective(800px) rotateX(-90deg);
transform-origin: 50% 0;
}
50% {
opacity: 1;
transform: perspective(800px) rotateX(50deg);
transform-origin: 50% 0;
}
to {
opacity: 1;
transform: perspective(800px) rotateX(0deg);
transform-origin: 50% 0;
}
}
.boingOutDown {
-webkit-animation-name: boingOutDown;
animation-name: boingOutDown;
}
@-webkit-keyframes boingOutDown {
0% {
opacity: 1;
transform: perspective(800px) rotateX(0deg) rotateY(0deg);
transform-origin: 100% 100%;
}
20% {
opacity: 1;
transform: perspective(800px) rotateX(0deg) rotateY(10deg);
transform-origin: 100% 100%;
}
30% {
opacity: 1;
transform: perspective(800px) rotateX(0deg) rotateY(0deg);
transform-origin: 0 100%;
}
40% {
opacity: 1;
transform: perspective(800px) rotateX(10deg) rotateY(10deg);
transform-origin: 0 100%;
}
to {
opacity: 0;
transform: perspective(800px) rotateX(90deg) rotateY(0deg);
transform-origin: 100% 100%;
}
}
@keyframes boingOutDown {
0% {
opacity: 1;
transform: perspective(800px) rotateX(0deg) rotateY(0deg);
transform-origin: 100% 100%;
}
20% {
opacity: 1;
transform: perspective(800px) rotateX(0deg) rotateY(10deg);
transform-origin: 100% 100%;
}
30% {
opacity: 1;
transform: perspective(800px) rotateX(0deg) rotateY(0deg);
transform-origin: 0 100%;
}
40% {
opacity: 1;
transform: perspective(800px) rotateX(10deg) rotateY(10deg);
transform-origin: 0 100%;
}
to {
opacity: 0;
transform: perspective(800px) rotateX(90deg) rotateY(0deg);
transform-origin: 100% 100%;
}
}
.magictime {
-webkit-animation-duration: 1s;
animation-duration: 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
}
@media (prefers-reduced-motion), (print) {
.magictime {
-webkit-animation: unset !important;
animation: unset !important;
transition: none !important;
}
}
@media (max-width: 375px) {
.container form div {
height: 35px;
}
.form-buttons button {
height: 35px;
}
.home-menu button {
height: 35px;
}
}
</style>
</head>
<body>
<main>
<section class="container-logo">
<!-- PARA TROCAR A LOGO É SÓ COLOCAR UM LINK COM A IMAGEM DIRETO NO SRC -->
<img id="app-logo" src="" alt="Logo do app" />
</section>
<section class="container">
<header>
<button>Log-in</button>
<button id="configuracao">Configurações</button>
</header>
<form>
<div id="operadora">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="currentColor"
class="bi bi-ethernet"
viewBox="0 0 16 16"
>
<path
d="M14 13.5v-7a.5.5 0 0 0-.5-.5H12V4.5a.5.5 0 0 0-.5-.5h-1v-.5A.5.5 0 0 0 10 3H6a.5.5 0 0 0-.5.5V4h-1a.5.5 0 0 0-.5.5V6H2.5a.5.5 0 0 0-.5.5v7a.5.5 0 0 0 .5.5h11a.5.5 0 0 0 .5-.5ZM3.75 11h.5a.25.25 0 0 1 .25.25v1.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-1.5a.25.25 0 0 1 .25-.25Zm2 0h.5a.25.25 0 0 1 .25.25v1.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-1.5a.25.25 0 0 1 .25-.25Zm1.75.25a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v1.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-1.5ZM9.75 11h.5a.25.25 0 0 1 .25.25v1.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-1.5a.25.25 0 0 1 .25-.25Zm1.75.25a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v1.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-1.5Z"
/>
<path
d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2ZM1 2a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2Z"
/>
</svg>
<input
id="operator-selected"
type="text"
placeholder="Escolha sua operadora"
readonly
/>
</div>
<div id="user-container">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-person"
viewBox="0 0 16 16"
>
<path
d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4Zm-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664h10Z"
/>
</svg>
<input id="user" type="text" placeholder="Usuário" />
</div>
<div id="password-container">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-key"
viewBox="0 0 16 16"
>
<path
d="M0 8a4 4 0 0 1 7.465-2H14a.5.5 0 0 1 .354.146l1.5 1.5a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0L13 9.207l-.646.647a.5.5 0 0 1-.708 0L11 9.207l-.646.647a.5.5 0 0 1-.708 0L9 9.207l-.646.647A.5.5 0 0 1 8 10h-.535A4 4 0 0 1 0 8zm4-3a3 3 0 1 0 2.712 4.285A.5.5 0 0 1 7.163 9h.63l.853-.854a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.793-.793-1-1h-6.63a.5.5 0 0 1-.451-.285A3 3 0 0 0 4 5z"
/>
<path d="M4 8a1 1 0 1 1-2 0 1 1 0 0 1 2 0z" />
</svg>
<input id="password" type="password" placeholder="Senha" />
</div>
<div id="uuid-container">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-fingerprint"
viewBox="0 0 16 16"
>
<path
d="M8.06 6.5a.5.5 0 0 1 .5.5v.776a11.5 11.5 0 0 1-.552 3.519l-1.331 4.14a.5.5 0 0 1-.952-.305l1.33-4.141a10.5 10.5 0 0 0 .504-3.213V7a.5.5 0 0 1 .5-.5Z"
/>
<path
d="M6.06 7a2 2 0 1 1 4 0 .5.5 0 1 1-1 0 1 1 0 1 0-2 0v.332c0 .409-.022.816-.066 1.221A.5.5 0 0 1 6 8.447c.04-.37.06-.742.06-1.115V7Zm3.509 1a.5.5 0 0 1 .487.513 11.5 11.5 0 0 1-.587 3.339l-1.266 3.8a.5.5 0 0 1-.949-.317l1.267-3.8a10.5 10.5 0 0 0 .535-3.048A.5.5 0 0 1 9.569 8Zm-3.356 2.115a.5.5 0 0 1 .33.626L5.24 14.939a.5.5 0 1 1-.955-.296l1.303-4.199a.5.5 0 0 1 .625-.329Z"
/>
<path
d="M4.759 5.833A3.501 3.501 0 0 1 11.559 7a.5.5 0 0 1-1 0 2.5 2.5 0 0 0-4.857-.833.5.5 0 1 1-.943-.334Zm.3 1.67a.5.5 0 0 1 .449.546 10.72 10.72 0 0 1-.4 2.031l-1.222 4.072a.5.5 0 1 1-.958-.287L4.15 9.793a9.72 9.72 0 0 0 .363-1.842.5.5 0 0 1 .546-.449Zm6 .647a.5.5 0 0 1 .5.5c0 1.28-.213 2.552-.632 3.762l-1.09 3.145a.5.5 0 0 1-.944-.327l1.089-3.145c.382-1.105.578-2.266.578-3.435a.5.5 0 0 1 .5-.5Z"
/>
<path
d="M3.902 4.222a4.996 4.996 0 0 1 5.202-2.113.5.5 0 0 1-.208.979 3.996 3.996 0 0 0-4.163 1.69.5.5 0 0 1-.831-.556Zm6.72-.955a.5.5 0 0 1 .705-.052A4.99 4.99 0 0 1 13.059 7v1.5a.5.5 0 1 1-1 0V7a3.99 3.99 0 0 0-1.386-3.028.5.5 0 0 1-.051-.705ZM3.68 5.842a.5.5 0 0 1 .422.568c-.029.192-.044.39-.044.59 0 .71-.1 1.417-.298 2.1l-1.14 3.923a.5.5 0 1 1-.96-.279L2.8 8.821A6.531 6.531 0 0 0 3.058 7c0-.25.019-.496.054-.736a.5.5 0 0 1 .568-.422Zm8.882 3.66a.5.5 0 0 1 .456.54c-.084 1-.298 1.986-.64 2.934l-.744 2.068a.5.5 0 0 1-.941-.338l.745-2.07a10.51 10.51 0 0 0 .584-2.678.5.5 0 0 1 .54-.456Z"
/>
<path
d="M4.81 1.37A6.5 6.5 0 0 1 14.56 7a.5.5 0 1 1-1 0 5.5 5.5 0 0 0-8.25-4.765.5.5 0 0 1-.5-.865Zm-.89 1.257a.5.5 0 0 1 .04.706A5.478 5.478 0 0 0 2.56 7a.5.5 0 0 1-1 0c0-1.664.626-3.184 1.655-4.333a.5.5 0 0 1 .706-.04ZM1.915 8.02a.5.5 0 0 1 .346.616l-.779 2.767a.5.5 0 1 1-.962-.27l.778-2.767a.5.5 0 0 1 .617-.346Zm12.15.481a.5.5 0 0 1 .49.51c-.03 1.499-.161 3.025-.727 4.533l-.07.187a.5.5 0 0 1-.936-.351l.07-.187c.506-1.35.634-2.74.663-4.202a.5.5 0 0 1 .51-.49Z"
/>
</svg>
<input id="uuid" type="password" placeholder="UUID" />
</div>
<section class="form-buttons">
<button id="update-config" type="button" title="Atualizar">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-arrow-clockwise"
viewBox="0 0 16 16"
>
<path
fill-rule="evenodd"
d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z"
/>
<path
d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z"
/>
</svg>
<span>ATUALIZAR</span>
</button>
<button id="logs-button" type="button" title="Registro">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-journal"
viewBox="0 0 16 16"
>
<path
d="M3 0h10a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2v-1h1v1a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v1H1V2a2 2 0 0 1 2-2z"
/>
<path
d="M1 5v-.5a.5.5 0 0 1 1 0V5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1zm0 3v-.5a.5.5 0 0 1 1 0V8h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1zm0 3v-.5a.5.5 0 0 1 1 0v.5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1z"
/>
</svg>
<span>REGISTRO</span>
</button>
<button id="vpn-start" type="button" title="Conectar">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-plug"
viewBox="0 0 16 16"
>
<path
d="M6 0a.5.5 0 0 1 .5.5V3h3V.5a.5.5 0 0 1 1 0V3h1a.5.5 0 0 1 .5.5v3A3.5 3.5 0 0 1 8.5 10c-.002.434-.01.845-.04 1.22-.041.514-.126 1.003-.317 1.424a2.083 2.083 0 0 1-.97 1.028C6.725 13.9 6.169 14 5.5 14c-.998 0-1.61.33-1.974.718A1.922 1.922 0 0 0 3 16H2c0-.616.232-1.367.797-1.968C3.374 13.42 4.261 13 5.5 13c.581 0 .962-.088 1.218-.219.241-.123.4-.3.514-.55.121-.266.193-.621.23-1.09.027-.34.035-.718.037-1.141A3.5 3.5 0 0 1 4 6.5v-3a.5.5 0 0 1 .5-.5h1V.5A.5.5 0 0 1 6 0zM5 4v2.5A2.5 2.5 0 0 0 7.5 9h1A2.5 2.5 0 0 0 11 6.5V4H5z"
/>
</svg>
<span>CONECTAR</span>
</button>
</section>
</form>
<section class="menu">
<button id="battery-optimization">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-battery-half"
viewBox="0 0 16 16"
>
<path d="M2 6h5v4H2V6z" />
<path
d="M2 4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H2zm10 1a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h10zm4 3a1.5 1.5 0 0 1-1.5 1.5v-3A1.5 1.5 0 0 1 16 8z"
/>
</svg>
<span>OTIMIZAÇÃO DE BATERIA</span>
</button>
<button id="apn-configuration">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-wrench-adjustable"
viewBox="0 0 16 16"
>
<path
d="M16 4.5a4.492 4.492 0 0 1-1.703 3.526L13 5l2.959-1.11c.027.2.041.403.041.61Z"
/>
<path
d="M11.5 9c.653 0 1.273-.139 1.833-.39L12 5.5 11 3l3.826-1.53A4.5 4.5 0 0 0 7.29 6.092l-6.116 5.096a2.583 2.583 0 1 0 3.638 3.638L9.908 8.71A4.49 4.49 0 0 0 11.5 9Zm-1.292-4.361-.596.893.809-.27a.25.25 0 0 1 .287.377l-.596.893.809-.27.158.475-1.5.5a.25.25 0 0 1-.287-.376l.596-.893-.809.27a.25.25 0 0 1-.287-.377l.596-.893-.809.27-.158-.475 1.5-.5a.25.25 0 0 1 .287.376ZM3 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"
/>
</svg>
<span>CONFIGURAR APN</span>
</button>
<button id="checkuser">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-person-lines-fill"
viewBox="0 0 16 16"
>
<path
d="M6 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-5 6s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1H1zM11 3.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5zm.5 2.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1h-4zm2 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1h-2zm0 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1h-2z"
/>
</svg>
<span>DETALHES DO USUÁRIO</span>
</button>
<button id="speedtest-button">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-router"
viewBox="0 0 16 16"
>
<path
d="M5.525 3.025a3.5 3.5 0 0 1 4.95 0 .5.5 0 1 0 .707-.707 4.5 4.5 0 0 0-6.364 0 .5.5 0 0 0 .707.707Z"
/>
<path
d="M6.94 4.44a1.5 1.5 0 0 1 2.12 0 .5.5 0 0 0 .708-.708 2.5 2.5 0 0 0-3.536 0 .5.5 0 0 0 .707.707ZM2.5 11a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1Zm4.5-.5a.5.5 0 1 0 1 0 .5.5 0 0 0-1 0Zm2.5.5a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1Zm1.5-.5a.5.5 0 1 0 1 0 .5.5 0 0 0-1 0Zm2 0a.5.5 0 1 0 1 0 .5.5 0 0 0-1 0Z"
/>
<path
d="M2.974 2.342a.5.5 0 1 0-.948.316L3.806 8H1.5A1.5 1.5 0 0 0 0 9.5v2A1.5 1.5 0 0 0 1.5 13H2a.5.5 0 0 0 .5.5h2A.5.5 0 0 0 5 13h6a.5.5 0 0 0 .5.5h2a.5.5 0 0 0 .5-.5h.5a1.5 1.5 0 0 0 1.5-1.5v-2A1.5 1.5 0 0 0 14.5 8h-2.306l1.78-5.342a.5.5 0 1 0-.948-.316L11.14 8H4.86L2.974 2.342ZM14.5 9a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5h-13a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5h13Z"
/>
<path d="M8.5 5.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0Z" />
</svg>
<span>TESTAR REDE</span>
</button>
<button id="clean-data-app">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-trash"
viewBox="0 0 16 16"
>
<path
d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6Z"
/>
<path
d="M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1ZM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118ZM2.5 3h11V2h-11v1Z"
/>
</svg>
<span>LIMPAR DADOS</span>
</button>
</section>
</section>
<section class="status-vpn">
<section>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-outlet"
viewBox="0 0 16 16"
>
<path
d="M3.34 2.994c.275-.338.68-.494 1.074-.494h7.172c.393 0 .798.156 1.074.494.578.708 1.84 2.534 1.84 5.006 0 2.472-1.262 4.297-1.84 5.006-.276.338-.68.494-1.074.494H4.414c-.394 0-.799-.156-1.074-.494C2.762 12.297 1.5 10.472 1.5 8c0-2.472 1.262-4.297 1.84-5.006zm1.074.506a.376.376 0 0 0-.299.126C3.599 4.259 2.5 5.863 2.5 8c0 2.137 1.099 3.74 1.615 4.374.06.073.163.126.3.126h7.17c.137 0 .24-.053.3-.126.516-.633 1.615-2.237 1.615-4.374 0-2.137-1.099-3.74-1.615-4.374a.376.376 0 0 0-.3-.126h-7.17z"
/>
<path
d="M6 5.5a.5.5 0 0 1 .5.5v1.5a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm4 0a.5.5 0 0 1 .5.5v1.5a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zM7 10v1h2v-1a1 1 0 0 0-2 0z"
/>
</svg>
<h1>DESCONECTADO</h1>
</section>
</section>
<section class="home-menu">
<button id="gen-test">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-cloud"
viewBox="0 0 16 16"
>
<path
d="M4.406 3.342A5.53 5.53 0 0 1 8 2c2.69 0 4.923 2 5.166 4.579C14.758 6.804 16 8.137 16 9.773 16 11.569 14.502 13 12.687 13H3.781C1.708 13 0 11.366 0 9.318c0-1.763 1.266-3.223 2.942-3.593.143-.863.698-1.723 1.464-2.383zm.653.757c-.757.653-1.153 1.44-1.153 2.056v.448l-.445.049C2.064 6.805 1 7.952 1 9.318 1 10.785 2.23 12 3.781 12h8.906C13.98 12 15 10.988 15 9.773c0-1.216-1.02-2.228-2.313-2.228h-.5v-.5C12.188 4.825 10.328 3 8 3a4.53 4.53 0 0 0-2.941 1.1z"
/>
</svg>
<span>Gerar Teste Grátis</span>
</button>
<button id="buy-access">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-wallet2"
viewBox="0 0 16 16"
>
<path
d="M12.136.326A1.5 1.5 0 0 1 14 1.78V3h.5A1.5 1.5 0 0 1 16 4.5v9a1.5 1.5 0 0 1-1.5 1.5h-13A1.5 1.5 0 0 1 0 13.5v-9a1.5 1.5 0 0 1 1.432-1.499L12.136.326zM5.562 3H13V1.78a.5.5 0 0 0-.621-.484L5.562 3zM1.5 4a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h13a.5.5 0 0 0 .5-.5v-9a.5.5 0 0 0-.5-.5h-13z"
/>
</svg>
<span>Comprar Acesso</span>
</button>
<button id="contact-support">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-whatsapp"
viewBox="0 0 16 16"
>
<path
d="M13.601 2.326A7.854 7.854 0 0 0 7.994 0C3.627 0 .068 3.558.064 7.926c0 1.399.366 2.76 1.057 3.965L0 16l4.204-1.102a7.933 7.933 0 0 0 3.79.965h.004c4.368 0 7.926-3.558 7.93-7.93A7.898 7.898 0 0 0 13.6 2.326zM7.994 14.521a6.573 6.573 0 0 1-3.356-.92l-.24-.144-2.494.654.666-2.433-.156-.251a6.56 6.56 0 0 1-1.007-3.505c0-3.626 2.957-6.584 6.591-6.584a6.56 6.56 0 0 1 4.66 1.931 6.557 6.557 0 0 1 1.928 4.66c-.004 3.639-2.961 6.592-6.592 6.592zm3.615-4.934c-.197-.099-1.17-.578-1.353-.646-.182-.065-.315-.099-.445.099-.133.197-.513.646-.627.775-.114.133-.232.148-.43.05-.197-.1-.836-.308-1.592-.985-.59-.525-.985-1.175-1.103-1.372-.114-.198-.011-.304.088-.403.087-.088.197-.232.296-.346.1-.114.133-.198.198-.33.065-.134.034-.248-.015-.347-.05-.099-.445-1.076-.612-1.47-.16-.389-.323-.335-.445-.34-.114-.007-.247-.007-.38-.007a.729.729 0 0 0-.529.247c-.182.198-.691.677-.691 1.654 0 .977.71 1.916.81 2.049.098.133 1.394 2.132 3.383 2.992.47.205.84.326 1.129.418.475.152.904.129 1.246.08.38-.058 1.171-.48 1.338-.943.164-.464.164-.86.114-.943-.049-.084-.182-.133-.38-.232z"
/>
</svg>
<span>Pedir Suporte</span>
</button>
</section>
<section class="modal-speedtest">
<header>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-x-lg"
id="close"
viewBox="0 0 16 16"
>
<path
d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z"
/>
</svg>
</header>
<section>
<div class="loading"></div>
<iframe title="fast" id="iframe-speedtest"></iframe>
</section>
</section>
<section class="modal-configs">
<header>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-x-lg"
viewBox="0 0 16 16"
>
<path
d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z"
/>
</svg>
</header>
<section>
<div>
<h1 class="title">VIVO</h1>
<ul>
<li>
<img src="https://basteon.me/assets/images/app/operadoras/VIVO.png" alt="icon" />
<div>
<h1>VIVO 1 ➜ CONFIG 1 ➜ SV01.QFN</h1>
<p>SERVIDOR: ?? ➜ LATÊNCIA BAIXA</p>
</div>
</li>
<li>
<img src="https://basteon.me/assets/images/app/operadoras/VIVO.png" alt="icon" />
<div>
<h1>VIVO 1 ➜ CONFIG 1 ➜ SV01.QFN</h1>
<p>SERVIDOR: ?? ➜ LATÊNCIA BAIXA</p>
</div>
</li>
<li>
<img src="https://basteon.me/assets/images/app/operadoras/VIVO.png" alt="icon" />
<div>
<h1>VIVO 1 ➜ CONFIG 1 ➜ SV01.QFN</h1>
<p>SERVIDOR: ?? ➜ LATÊNCIA BAIXA</p>
</div>
</li>
</ul>
</div>
<div>
<h1 class="title">TIM</h1>
<ul>
<li>
<img src="https://basteon.me/assets/images/app/operadoras/VIVO.png" alt="icon" />
<div>
<h1>TIM 1 ➜ CONFIG 1 ➜ SV01.QFN</h1>
<p>SERVIDOR: ?? ➜ LATÊNCIA BAIXA</p>
</div>
</li>
<li>
<img src="https://basteon.me/assets/images/app/operadoras/VIVO.png" alt="icon" />
<div>
<h1>TIM 1 ➜ CONFIG 1 ➜ SV01.QFN</h1>
<p>SERVIDOR: ?? ➜ LATÊNCIA BAIXA</p>
</div>
</li>
<li>
<img src="https://basteon.me/assets/images/app/operadoras/VIVO.png" alt="icon" />
<div>
<h1>TIM 1 ➜ CONFIG 1 ➜ SV01.QFN</h1>
<p>SERVIDOR: ?? ➜ LATÊNCIA BAIXA</p>
</div>
</li>
</ul>
</div>
<div>
<h1 class="title">CLARO</h1>
<ul>
<li>
<img src="https://basteon.me/assets/images/app/operadoras/VIVO.png" alt="icon" />
<div>
<h1>CLARO 1 ➜ CONFIG 1 ➜ SV01.QFN</h1>
<p>SERVIDOR: ?? ➜ LATÊNCIA BAIXA</p>
</div>
</li>
<li>
<img src="https://basteon.me/assets/images/app/operadoras/VIVO.png" alt="icon" />
<div>
<h1>CLARO 1 ➜ CONFIG 1 ➜ SV01.QFN</h1>
<p>SERVIDOR: ?? ➜ LATÊNCIA BAIXA</p>
</div>
</li>
<li>
<img src="https://basteon.me/assets/images/app/operadoras/VIVO.png" alt="icon" />
<div>
<h1>CLARO 1 ➜ CONFIG 1 ➜ SV01.QFN</h1>
<p>SERVIDOR: ?? ➜ LATÊNCIA BAIXA</p>
</div>
</li>
</ul>
</div>
</section>
</section>
<section class="modal-logs">
<header>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-x-lg"
viewBox="0 0 16 16"
>
<path
d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z"
/>
</svg>
</header>
<section>
<p></p>
<button class="clear-logs" type="button">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-stars"
viewBox="0 0 16 16"
>
<path
d="M7.657 6.247c.11-.33.576-.33.686 0l.645 1.937a2.89 2.89 0 0 0 1.829 1.828l1.936.645c.33.11.33.576 0 .686l-1.937.645a2.89 2.89 0 0 0-1.828 1.829l-.645 1.936a.361.361 0 0 1-.686 0l-.645-1.937a2.89 2.89 0 0 0-1.828-1.828l-1.937-.645a.361.361 0 0 1 0-.686l1.937-.645a2.89 2.89 0 0 0 1.828-1.828l.645-1.937zM3.794 1.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387A1.734 1.734 0 0 0 4.593 5.69l-.387 1.162a.217.217 0 0 1-.412 0L3.407 5.69A1.734 1.734 0 0 0 2.31 4.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387A1.734 1.734 0 0 0 3.407 2.31l.387-1.162zM10.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l-.258-.774a1.156 1.156 0 0 0-.732-.732L9.1 2.137a.145.145 0 0 1 0-.274l.774-.258c.346-.115.617-.386.732-.732L10.863.1z"
/>
</svg>
<span>Limpar Registro</span>
</button>
</section>
</section>
<section class="modal-alert-clear-data">
<header>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-x-lg"
viewBox="0 0 16 16"
>
<path
d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z"
/>
</svg>
</header>
<section>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-exclamation-triangle"
viewBox="0 0 16 16"
>
<path
d="M7.938 2.016A.13.13 0 0 1 8.002 2a.13.13 0 0 1 .063.016.146.146 0 0 1 .054.057l6.857 11.667c.036.06.035.124.002.183a.163.163 0 0 1-.054.06.116.116 0 0 1-.066.017H1.146a.115.115 0 0 1-.066-.017.163.163 0 0 1-.054-.06.176.176 0 0 1 .002-.183L7.884 2.073a.147.147 0 0 1 .054-.057zm1.044-.45a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566z"
/>
<path
d="M7.002 12a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 5.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995z"
/>
</svg>
<h1>ATENÇÃO</h1>
<p>
Ao limpar os dados do aplicativo, o aplicativo será redefinido como se estivesse sendo
instalado pela primeira vez! Essa ação é irreversível. Será necessário inserir o usuário
e senha novamente e atualizar o aplicativo para carregar as configurações atuais de
conexão VPN.
</p>
<div>
<button type="button" id="back-clear-data-button">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-caret-left"
viewBox="0 0 16 16"
>
<path
d="M10 12.796V3.204L4.519 8 10 12.796zm-.659.753-5.48-4.796a1 1 0 0 1 0-1.506l5.48-4.796A1 1 0 0 1 11 3.204v9.592a1 1 0 0 1-1.659.753z"
/>
</svg>
<span>VOLTAR</span>
</button>
<button type="button" id="clear-data-button-confirm">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-trash"
viewBox="0 0 16 16"
>
<path
d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6Z"
/>
<path
d="M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1ZM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118ZM2.5 3h11V2h-11v1Z"
/>
</svg>
<span>LIMPAR DADOS</span>
</button>
</div>
</section>
</section>
<section class="modal-error-alert">
<header>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-x-lg"
viewBox="0 0 16 16"
>
<path
d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z"
/>
</svg>
</header>
<section></section>
</section>
<section class="modal-status-vpn">
<header>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-x-lg"
id="close-modal-status-vpn"
viewBox="0 0 16 16"
>
<path
d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z"
/>
</svg>
</header>
<section class="modal-status-content">
<div class="loading-status">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-shield-x"
viewBox="0 0 16 16"
>
<path
d="M5.338 1.59a61.44 61.44 0 0 0-2.837.856.481.481 0 0 0-.328.39c-.554 4.157.726 7.19 2.253 9.188a10.725 10.725 0 0 0 2.287 2.233c.346.244.652.42.893.533.12.057.218.095.293.118a.55.55 0 0 0 .101.025.615.615 0 0 0 .1-.025c.076-.023.174-.061.294-.118.24-.113.547-.29.893-.533a10.726 10.726 0 0 0 2.287-2.233c1.527-1.997 2.807-5.031 2.253-9.188a.48.48 0 0 0-.328-.39c-.651-.213-1.75-.56-2.837-.855C9.552 1.29 8.531 1.067 8 1.067c-.53 0-1.552.223-2.662.524zM5.072.56C6.157.265 7.31 0 8 0s1.843.265 2.928.56c1.11.3 2.229.655 2.887.87a1.54 1.54 0 0 1 1.044 1.262c.596 4.477-.787 7.795-2.465 9.99a11.775 11.775 0 0 1-2.517 2.453 7.159 7.159 0 0 1-1.048.625c-.28.132-.581.24-.829.24s-.548-.108-.829-.24a7.158 7.158 0 0 1-1.048-.625 11.777 11.777 0 0 1-2.517-2.453C1.928 10.487.545 7.169 1.141 2.692A1.54 1.54 0 0 1 2.185 1.43 62.456 62.456 0 0 1 5.072.56z"
/>
<path
d="M6.146 5.146a.5.5 0 0 1 .708 0L8 6.293l1.146-1.147a.5.5 0 1 1 .708.708L8.707 7l1.147 1.146a.5.5 0 0 1-.708.708L8 7.707 6.854 8.854a.5.5 0 1 1-.708-.708L7.293 7 6.146 5.854a.5.5 0 0 1 0-.708z"
/>
</svg>
</div>
<h1 id="modal-status-text">CONECTADO!</h1>
</section>
</section>
<section class="modal-checkuser">
<header>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-x-lg"
id="close-modal-checkuser"
viewBox="0 0 16 16"
>
<path
d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z"
/>
</svg>
</header>
<section></section>
</section>
<section class="modal-loading">
<header>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-x-lg"
id="close-modal-loading"
id="close-modal-checkuser"
viewBox="0 0 16 16"
>
<path
d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z"
/>
</svg>
</header>
<section>
<div>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-calendar3"
viewBox="0 0 16 16"
>
<path
d="M14 0H2a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zM1 3.857C1 3.384 1.448 3 2 3h12c.552 0 1 .384 1 .857v10.286c0 .473-.448.857-1 .857H2c-.552 0-1-.384-1-.857V3.857z"
/>
<path
d="M6.5 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm-9 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm-9 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"
/>
</svg>
</div>
</section>
</section>
</main>
<!-- FUNÇÕES DO APP -->
<script>
const dtStatusBarHeight = () => DtGetStatusBarHeight.execute()
const dtNavbarHeight = () => DtGetNavigationBarHeight.execute()
const dtAppLogo = () => DtGetAppConfig.execute('APP_LOGO')
const dtVpnState = () => DtGetVpnState.execute()
const dtTranslateText = (label) => DtTranslateText.execute(label)
const dtAllConfigs = () => DtGetConfigs.execute()
const dtSetConfig = (id) => DtSetConfig.execute(id)
const dtGetDefaultConfig = () => DtGetDefaultConfig.execute()
const dtGetLogs = () => DtGetLogs.execute()
const dtClearLogs = () => DtClearLogs.execute()
const dtGetUsername = () => DtUsername.get()
const dtSetUsername = (username) => DtUsername.set(username)
const dtGetPassword = () => DtPassword.get()
const dtSetPassword = (password) => DtPassword.set(password)
const dtGetUUID = () => DtUuid.get()
const dtSetUUID = (uuid) => DtUuid.set(uuid)
const dtUpdate = () => DtStartAppUpdate.execute()
const dtStartVpn = () => DtExecuteVpnStart.execute()
const dtStopVpn = () => DtExecuteVpnStop.execute()
const dtBatteryOptimization = () => DtIgnoreBatteryOptimizations.execute()
const dtApnConfiguration = () => DtStartApnActivity.execute()
const dtStartCheckUser = () => DtStartCheckUser.execute()
const dtCleanDataApp = () => DtCleanApp.execute()
const dtStartWebView = (url) => DtStartWebViewActivity.execute(url)
const dtOpenBrowser = (url) => DtOpenExternalUrl.execute(url)
</script>
<!-- FUNÇÕES PARA O APP -->
<script>
const dtOnNewLogListener = () => writeModalContent()
const dtConfigClickListener = () => writeInputCarrierList()
const dtCheckUserStartedListener = () => showModalLoading()
const dtVpnStateListener = (state) => vpnState(state)
const dtCheckUserModelListener = (model) => writeModalCheckUser(model)
const dtMessageErrorListener = (model) => writeModalError(model)
</script>
<!-- FUNÇÕES DE AJUDA -->
<script>
const createSvgIcon = (iconPath, Class = '') => {
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')
svg.setAttribute('width', '16')
svg.setAttribute('height', '16')
svg.setAttribute('fill', 'currentColor')
svg.setAttribute('viewBox', '0 0 16 16')
svg.setAttribute('class', Class)
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')
path.setAttribute('d', iconPath)
svg.appendChild(path)
return svg
}
const createListItem = (iconPath, Class = '', text) => {
const li = document.createElement('li')
const svg = createSvgIcon(iconPath, Class)
const span = document.createElement('span')
span.setAttribute('class', Class)
span.innerHTML = text
li.appendChild(svg)
li.appendChild(span)
return li
}
</script>
<!-- FUNÇÕES DO LAYOUT -->
<script>
const vpnState = (state) => {
const stateLabel = state || dtVpnState()
switch (stateLabel) {
case 'DISCONNECTED':
StartStopVPNButton.html(dtTranslateText('LBL_BTN_START'))
writeModalVpnState(disconnected())
hiddenModalVpnState()
writeStatusVpn(disconnected())
return disconnected()
case 'CONNECTING':
StartStopVPNButton.html(dtTranslateText('LBL_BTN_STOP'))
writeModalVpnState(connecting())
writeStatusVpn(connecting())
return connecting()
case 'CONNECTED':
StartStopVPNButton.html(dtTranslateText('LBL_BTN_STOP'))
writeModalVpnState(connected())
writeStatusVpn(connected())
return connected()
case 'STOPPING':
StartStopVPNButton.html(dtTranslateText('LBL_BTN_STOPPING'))
writeModalVpnState(stopping())
writeStatusVpn(stopping())
return stopping()
case 'NO_NETWORK':
StartStopVPNButton.html(dtTranslateText('LBL_BTN_STOP'))
writeModalVpnState(noNetwork())
writeStatusVpn(noNetwork())
return noNetwork()
case 'AUTH':
StartStopVPNButton.html(dtTranslateText('LBL_BTN_STOP'))
writeModalVpnState(auth())
writeStatusVpn(auth())
return auth()
case 'AUTH_FAILED':
StartStopVPNButton.html(dtTranslateText('LBL_BTN_STOP'))
writeModalVpnState(authFailed())
writeStatusVpn(authFailed())
return authFailed()
default:
return 'Não foi possível obter o status da conexão'
}
}
const showConfigMenu = () => {
const menu = document.querySelector('section.menu')
if (!menu.className.includes('boingInUp') && !menu.className.includes('boingOutDown')) {
menu.classList.add('magictime', 'boingInUp')
HomeMenu.style({ visibility: `hidden` })
} else if (menu.className.includes('boingInUp')) {
menu.classList.remove('magictime', 'boingInUp')
menu.classList.add('magictime', 'boingOutDown')
HomeMenu.style({ visibility: `visible` })
} else if (menu.className.includes('boingOutDown')) {
menu.classList.remove('magictime', 'boingOutDown')
menu.classList.add('magictime', 'boingInUp')
HomeMenu.style({ visibility: `hidden` })
} else {
console.log('ocorreu um erro')
}
}
const showModalSpeedtest = () => {
ModalSpeedtest.addClass('show')
IframeSpeedtest.attr({ src: 'https://fast.com/pt/' })
}
const hiddenModalSpeedtest = () => {
IframeSpeedtest.attr({ src: '' })
ModalSpeedtest.removeClass('show')
}
const writeCarrierList = () => {
const writeCarrierList = document.querySelector('section.modal-configs section')
writeCarrierList.innerHTML = ''
const data = JSON.parse(dtAllConfigs())
data.sort((a, b) => a.sorter - b.sorter)
data.forEach((item, index) => item.items.sort((a, b) => a.sorter - b.sorter))
data.forEach((category) => {
const div = document.createElement('div')
const h1 = document.createElement('h1')
h1.classList.add('title')
h1.innerHTML = category.name
const ul = document.createElement('ul')
category.items.forEach((item) => {
const li = document.createElement('li')
li.innerHTML = `<img src="${item.icon}" alt="icon" /><div><h1>${item.name}</h1><p>${
item.description ?? ''
}</p></div>`
li.addEventListener('click', () => {
dtSetConfig(item.id)
ModalCarrierList.removeClass('show')
})
ul.appendChild(li)
})
div.appendChild(h1)
div.appendChild(ul)
writeCarrierList.appendChild(div)
})
}
const writeInputCarrierList = () => {
const data = JSON.parse(dtGetDefaultConfig())
const isV2ray = data?.mode?.toLowerCase()?.startsWith('v2ray')
InputCarrierValue.attr({ placeholder: data.name ?? 'Escolha sua operadora' })
if (!data?.auth?.v2ray_uuid && isV2ray) {
ContainerInputUser.style({ display: 'none' })
ContainerInputPassword.style({ display: 'none' })
ContainerInputUUID.style({ display: 'flex' })
InputUUIDValue.attr({ value: dtGetUUID() ?? '' })
} else {
ContainerInputPassword.style({ display: 'flex' })
ContainerInputUUID.style({ display: 'none' })
InputUserValue.attr({ value: dtGetUsername() ?? '' })
InputPasswordValue.attr({ value: dtGetPassword() ?? '' })
}
}
const showModalCarrierList = () => {
writeCarrierList()
ModalCarrierList.addClass('show')
}
const hiddenModalCarrierList = () => {
ModalCarrierList.removeClass('show')
}
const writeModalContent = () => {
const data = JSON.parse(dtGetLogs())
let content = ''
data.forEach((item) => {
content += `${Object.keys(item)} ${item[Object.keys(item)]} <br>`
})
ModalLoggerContent.html(content)
}
const showModalLogger = () => {
dtOnNewLogListener()
const modal = document.querySelector('section.modal-logs')
if (!modal.className.includes('show')) {
ModalLogger.addClass('show')
}
}
const hiddenModalLogger = () => {
ModalLogger.removeClass('show')
}
const startStopVpn = () => {
const state = dtVpnState()
if (state !== 'CONNECTED') {
dtStartVpn()
showModalVpnState()
} else {
dtStopVpn()
}
}
const writeStatusVpn = (state) => {
const icon = state.icon
const text = `<h1 style="color: ${state.color}">${state.text}</h1>`
ContentContainerSVpnState.html(icon + text)
return icon + text
}
const writeModalVpnState = (state) => {
const divIcon = `<div class="loading-status">${state.icon}</div>`
const titleStatus = `<h1>${state.text}</h1>`
ContentModalVpnState.html(divIcon + titleStatus)
return divIcon + titleStatus
}
const showModalVpnState = () => {
const data = JSON.parse(dtGetDefaultConfig())
if (!data || !dtGetUsername() || !dtGetPassword()) {
return
} else {
ModalVpnState.addClass('show')
}
}
const hiddenModalVpnState = () => {
ModalVpnState.removeClass('show')
}
const showModalLoading = () => {
if (!JSON.parse(dtGetDefaultConfig())?.urlCheckUser) {
hiddenModalVpnState()
} else {
hiddenModalVpnState()
ModalLoading.addClass('show')
}
}
const hiddenModalLoading = () => {
ModalLoading.removeClass('show')
}
const writeModalCheckUser = (model) => {
const data = JSON.parse(model)
ContentModalCheckUser.html(`
<h1>DETALHES DO USUÁRIO</h1>
<div>
<i class="bi bi-person"></i>
<span>Nome do usuário: ${data.username}</span>
</div>
<div>
<i class="bi bi-calendar-week"></i>
<span>Expiração: ${data.expiration_date}</span>
</div>
<div>
<i class="bi bi-hourglass-split"></i>
<span>Dias restantes: ${data.expiration_days}</span>
</div>
<div>
<i class="bi bi-people"></i>
<span>Dispositivos: ${data.count_connections}|${data.limit_connections}</span>
</div>
`)
showModalCheckUser()
}
const showModalCheckUser = () => {
hiddenModalLoading()
ModalCheckUser.addClass('show')
}
const hiddenModalCheckUser = () => {
ModalCheckUser.removeClass('show')
}
const showModalAlertClearData = () => {
ModalAlertClearData.addClass('show')
}
const hiddenModalAlertClearData = () => {
ModalAlertClearData.removeClass('show')
}
const writeModalError = (model) => {
const data = JSON.parse(model)
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-triangle" viewBox="0 0 16 16"><path d="M7.938 2.016A.13.13 0 0 1 8.002 2a.13.13 0 0 1 .063.016.146.146 0 0 1 .054.057l6.857 11.667c.036.06.035.124.002.183a.163.163 0 0 1-.054.06.116.116 0 0 1-.066.017H1.146a.115.115 0 0 1-.066-.017.163.163 0 0 1-.054-.06.176.176 0 0 1 .002-.183L7.884 2.073a.147.147 0 0 1 .054-.057zm1.044-.45a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566z"/><path d="M7.002 12a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 5.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995z"/></svg>`
const h1 = `<h1 id="title-error-alert-title">${data.title}</h1>`
const p = `<p id="title-error-alert-description">${data.content}</p>`
ContentModalError.html(svg + h1 + p)
hiddenModalSpeedtest()
hiddenModalCarrierList()
hiddenModalLogger()
hiddenModalVpnState()
hiddenModalLoading()
hiddenModalCheckUser()
showModalError()
}
const showModalError = () => {
ModalError.addClass('show')
}
const hiddenModalError = () => {
ModalError.removeClass('show')
}
const getAppLogo = () => {
const logo = dtAppLogo()
if (!logo) {
return false
} else {
return JSON.parse(logo).value
}
}
</script>
<!-- ESTADOS DE CONEXÃO -->
<script>
const disconnected = () => {
const state = {
icon: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-outlet" viewBox="0 0 16 16"><path d="M3.34 2.994c.275-.338.68-.494 1.074-.494h7.172c.393 0 .798.156 1.074.494.578.708 1.84 2.534 1.84 5.006 0 2.472-1.262 4.297-1.84 5.006-.276.338-.68.494-1.074.494H4.414c-.394 0-.799-.156-1.074-.494C2.762 12.297 1.5 10.472 1.5 8c0-2.472 1.262-4.297 1.84-5.006zm1.074.506a.376.376 0 0 0-.299.126C3.599 4.259 2.5 5.863 2.5 8c0 2.137 1.099 3.74 1.615 4.374.06.073.163.126.3.126h7.17c.137 0 .24-.053.3-.126.516-.633 1.615-2.237 1.615-4.374 0-2.137-1.099-3.74-1.615-4.374a.376.376 0 0 0-.3-.126h-7.17z"/><path d="M6 5.5a.5.5 0 0 1 .5.5v1.5a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm4 0a.5.5 0 0 1 .5.5v1.5a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zM7 10v1h2v-1a1 1 0 0 0-2 0z"/></svg>`,
color: '#FFFFFF',
text: dtTranslateText('LBL_STATE_DISCONNECTED'),
}
return state
}
const connecting = () => {
const state = {
icon: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plug" viewBox="0 0 16 16"><path d="M6 0a.5.5 0 0 1 .5.5V3h3V.5a.5.5 0 0 1 1 0V3h1a.5.5 0 0 1 .5.5v3A3.5 3.5 0 0 1 8.5 10c-.002.434-.01.845-.04 1.22-.041.514-.126 1.003-.317 1.424a2.083 2.083 0 0 1-.97 1.028C6.725 13.9 6.169 14 5.5 14c-.998 0-1.61.33-1.974.718A1.922 1.922 0 0 0 3 16H2c0-.616.232-1.367.797-1.968C3.374 13.42 4.261 13 5.5 13c.581 0 .962-.088 1.218-.219.241-.123.4-.3.514-.55.121-.266.193-.621.23-1.09.027-.34.035-.718.037-1.141A3.5 3.5 0 0 1 4 6.5v-3a.5.5 0 0 1 .5-.5h1V.5A.5.5 0 0 1 6 0zM5 4v2.5A2.5 2.5 0 0 0 7.5 9h1A2.5 2.5 0 0 0 11 6.5V4H5z"/></svg>`,
color: '#FFFF00',
text: dtTranslateText('LBL_STATE_CONNECTING'),
}
return state
}
const connected = () => {
const state = {
icon: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plugin" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M1 8a7 7 0 1 1 2.898 5.673c-.167-.121-.216-.406-.002-.62l1.8-1.8a3.5 3.5 0 0 0 4.572-.328l1.414-1.415a.5.5 0 0 0 0-.707l-.707-.707 1.559-1.563a.5.5 0 1 0-.708-.706l-1.559 1.562-1.414-1.414 1.56-1.562a.5.5 0 1 0-.707-.706l-1.56 1.56-.707-.706a.5.5 0 0 0-.707 0L5.318 5.975a3.5 3.5 0 0 0-.328 4.571l-1.8 1.8c-.58.58-.62 1.6.121 2.137A8 8 0 1 0 0 8a.5.5 0 0 0 1 0Z"/></svg>`,
color: '#00FF00',
text: dtTranslateText('LBL_STATE_CONNECTED'),
}
return state
}
const stopping = () => {
const state = {
icon: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-stop" viewBox="0 0 16 16"><path d="M3.5 5A1.5 1.5 0 0 1 5 3.5h6A1.5 1.5 0 0 1 12.5 5v6a1.5 1.5 0 0 1-1.5 1.5H5A1.5 1.5 0 0 1 3.5 11V5zM5 4.5a.5.5 0 0 0-.5.5v6a.5.5 0 0 0 .5.5h6a.5.5 0 0 0 .5-.5V5a.5.5 0 0 0-.5-.5H5z"/></svg>`,
color: '#FFFF00',
text: dtTranslateText('LBL_STATE_STOPPING'),
}
return state
}
const noNetwork = () => {
const state = {
icon: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-wifi-off" viewBox="0 0 16 16"><path d="M10.706 3.294A12.545 12.545 0 0 0 8 3C5.259 3 2.723 3.882.663 5.379a.485.485 0 0 0-.048.736.518.518 0 0 0 .668.05A11.448 11.448 0 0 1 8 4c.63 0 1.249.05 1.852.148l.854-.854zM8 6c-1.905 0-3.68.56-5.166 1.526a.48.48 0 0 0-.063.745.525.525 0 0 0 .652.065 8.448 8.448 0 0 1 3.51-1.27L8 6zm2.596 1.404.785-.785c.63.24 1.227.545 1.785.907a.482.482 0 0 1 .063.745.525.525 0 0 1-.652.065 8.462 8.462 0 0 0-1.98-.932zM8 10l.933-.933a6.455 6.455 0 0 1 2.013.637c.285.145.326.524.1.75l-.015.015a.532.532 0 0 1-.611.09A5.478 5.478 0 0 0 8 10zm4.905-4.905.747-.747c.59.3 1.153.645 1.685 1.03a.485.485 0 0 1 .047.737.518.518 0 0 1-.668.05 11.493 11.493 0 0 0-1.811-1.07zM9.02 11.78c.238.14.236.464.04.66l-.707.706a.5.5 0 0 1-.707 0l-.707-.707c-.195-.195-.197-.518.04-.66A1.99 1.99 0 0 1 8 11.5c.374 0 .723.102 1.021.28zm4.355-9.905a.53.53 0 0 1 .75.75l-10.75 10.75a.53.53 0 0 1-.75-.75l10.75-10.75z"/></svg>`,
color: '#FF0000',
text: dtTranslateText('LBL_STATE_NO_NETWORK'),
}
return state
}
const auth = () => {
const state = {
icon: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-person-lock" viewBox="0 0 16 16"><path d="M11 5a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM8 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm0 5.996V14H3s-1 0-1-1 1-4 6-4c.564 0 1.077.038 1.544.107a4.524 4.524 0 0 0-.803.918A10.46 10.46 0 0 0 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664h5ZM9 13a1 1 0 0 1 1-1v-1a2 2 0 1 1 4 0v1a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1v-2Zm3-3a1 1 0 0 0-1 1v1h2v-1a1 1 0 0 0-1-1Z"/></svg>`,
color: '#FFFF00',
text: dtTranslateText('LBL_STATE_AUTH'),
}
return state
}
const authFailed = () => {
const state = {
icon: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-person-slash" viewBox="0 0 16 16"><path d="M13.879 10.414a2.501 2.501 0 0 0-3.465 3.465l3.465-3.465Zm.707.707-3.465 3.465a2.501 2.501 0 0 0 3.465-3.465Zm-4.56-1.096a3.5 3.5 0 1 1 4.949 4.95 3.5 3.5 0 0 1-4.95-4.95ZM11 5a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM8 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm.256 7a4.474 4.474 0 0 1-.229-1.004H3c.001-.246.154-.986.832-1.664C4.484 10.68 5.711 10 8 10c.26 0 .507.009.74.025.226-.341.496-.65.804-.918C9.077 9.038 8.564 9 8 9c-5 0-6 3-6 4s1 1 1 1h5.256Z"/></svg>`,
color: '#FF0000',
text: dtTranslateText('LBL_STATE_AUTH_FAILED'),
}
return state
}
</script>
<!-- DOM WRAPPER -->
<script>
const Dom = (selector) => {
const _elements = document.querySelectorAll(selector)
const wrapper = {
on(listeners) {
for (const [event, listener] of Object.entries(listeners)) {
_elements.forEach((element) => {
element.addEventListener(event, listener)
})
}
return wrapper
},
addClass: (...tokens) => {
_elements.forEach((element) => {
element.classList.add(...tokens)
})
return wrapper
},
removeClass: (...tokens) => {
_elements.forEach((element) => {
element.classList.remove(...tokens)
})
return wrapper
},
toggleClass: (token, force) => {
_elements.forEach((element) => {
element.classList.toggle(token, force)
})
return wrapper
},
style(styles) {
for (const [property, value] of Object.entries(styles)) {
console.log(value)
_elements.forEach((element) => {
element.style[property] = value
})
}
return wrapper
},
attr(attrs) {
for (const [name, value] of Object.entries(attrs)) {
_elements.forEach((element) => element.setAttribute(name, value))
}
return wrapper
},
html(value) {
_elements.forEach((element) => (element.innerHTML = value))
return wrapper
},
}
return wrapper
}
</script>
<!-- VÁRIAVEIS -->
<script>
const Main = Dom('main')
const AppLogo = Dom('#app-logo')
const ConfigMenu = Dom('#configuracao')
const ContainerConfigMenu = Dom('section.menu')
const BatteryOptimizationButton = Dom('#battery-optimization')
const ApnConfigurationButton = Dom('#apn-configuration')
const CheckuserButton = Dom('#checkuser')
const SpeedtestButton = Dom('#speedtest-button')
const ClearDataAppButton = Dom('#clean-data-app')
const GenTestButton = Dom('#gen-test')
const BuyAccessButton = Dom('#buy-access')
const ContactSupportButton = Dom('#contact-support')
const ModalSpeedtest = Dom('section.modal-speedtest')
const CloseModalSpeedtest = Dom('section.modal-speedtest header svg')
const LoadingSpeedtest = Dom('section.modal-speedtest section div.loading')
const IframeSpeedtest = Dom('#iframe-speedtest')
const SelectCarrierButton = Dom('#operadora')
const ModalCarrierList = Dom('section.modal-configs')
const CloseModalCarrierList = Dom('section.modal-configs header svg')
const ModalContentCarrierList = Dom('section.modal-configs section')
const ContainerInputUser = Dom('#user-container')
const ContainerInputPassword = Dom('#password-container')
const ContainerInputUUID = Dom('#uuid-container')
const InputCarrierValue = Dom('#operadora input')
const InputUserValue = Dom('#user-container input')
const InputPasswordValue = Dom('#password-container input')
const InputUUIDValue = Dom('#uuid-container input')
const RefreshButton = Dom('#update-config')
const LoggerButton = Dom('#logs-button')
const StartStopVPNButton = Dom('#vpn-start')
const ContainerSVpnState = Dom('section.status-vpn')
const ContentContainerSVpnState = Dom('section.status-vpn section')
const ModalVpnState = Dom('section.modal-status-vpn')
const CloseModalVpnState = Dom('section.modal-status-vpn header svg')
const ContentModalVpnState = Dom('section.modal-status-vpn section.modal-status-content')
const ModalLogger = Dom('section.modal-logs')
const CloseModalLogger = Dom('section.modal-logs header svg')
const ModalLoggerContent = Dom('section.modal-logs section p')
const CleanLoggerContent = Dom('section.modal-logs section button')
const ModalLoading = Dom('section.modal-loading')
const CloseModalLoading = Dom('section.modal-loading header svg')
const ModalCheckUser = Dom('section.modal-checkuser')
const CloseModalCheckUser = Dom('section.modal-checkuser header svg')
const ContentModalCheckUser = Dom('section.modal-checkuser section')
const ModalAlertClearData = Dom('section.modal-alert-clear-data')
const CloseModalAlertClearData = Dom('section.modal-alert-clear-data header svg')
const BackModalAlertClearData = Dom('#back-clear-data-button')
const ConfirmModalAlertClearData = Dom('#clear-data-button-confirm')
const ModalError = Dom('section.modal-error-alert')
const CloseModalError = Dom('section.modal-error-alert header svg')
const ContentModalError = Dom('section.modal-error-alert section')
const HomeMenu = Dom('section.home-menu')
</script>
<!-- VARIAVEIS ROOT -->
<script>
document.documentElement.style.setProperty(
'--margem-do-topo-do-modal',
`${dtStatusBarHeight() + 10}px`
)
document.documentElement.style.setProperty(
'--margem-do-bottom-do-modal',
`${dtNavbarHeight() + 10}px`
)
</script>
<!-- AÇÕES -->
<script>
Main.style({ padding: `${dtStatusBarHeight() + 10}px 0px 0px 0px` })
HomeMenu.style({ bottom: `${dtNavbarHeight() + 10}px` })
AppLogo.attr({ src: getAppLogo() })
ConfigMenu.on({ click: () => showConfigMenu() })
BatteryOptimizationButton.on({ click: () => dtBatteryOptimization() })
ApnConfigurationButton.on({ click: () => dtApnConfiguration() })
SpeedtestButton.on({ click: () => showModalSpeedtest() })
CloseModalSpeedtest.on({ click: () => hiddenModalSpeedtest() })
SelectCarrierButton.on({ click: () => showModalCarrierList() })
CloseModalCarrierList.on({ click: () => hiddenModalCarrierList() })
InputUserValue.on({ input: (e) => dtSetUsername(e.target.value) })
InputPasswordValue.on({ input: (e) => dtSetPassword(e.target.value) })
InputUUIDValue.on({ input: (e) => dtSetUUID(e.target.value) })
RefreshButton.on({ click: () => dtUpdate() })
LoggerButton.on({ click: () => showModalLogger() })
CloseModalLogger.on({ click: () => hiddenModalLogger() })
CleanLoggerContent.on({ click: () => dtClearLogs() })
StartStopVPNButton.on({ click: () => startStopVpn() })
ContentContainerSVpnState.html(vpnState())
ContentModalVpnState.html(vpnState())
CloseModalVpnState.on({ click: () => hiddenModalVpnState() })
CloseModalLoading.on({ click: () => hiddenModalLoading() })
CloseModalCheckUser.on({ click: () => hiddenModalCheckUser() })
CheckuserButton.on({ click: () => dtStartCheckUser() })
ClearDataAppButton.on({ click: () => showModalAlertClearData() })
CloseModalAlertClearData.on({ click: () => hiddenModalAlertClearData() })
BackModalAlertClearData.on({ click: () => hiddenModalAlertClearData() })
ConfirmModalAlertClearData.on({ click: () => dtCleanDataApp() })
CloseModalError.on({ click: () => hiddenModalError() })
GenTestButton.on({
click: () => dtOpenBrowser('https://fusionnet-ilimitada.com/redirecionar-teste/'),
})
BuyAccessButton.on({
click: () => dtOpenBrowser('https://fusionnet-ilimitada.com/escolher-plano/'),
})
ContactSupportButton.on({
click: () =>
dtOpenBrowser(
'https://api.whatsapp.com/send?phone=5594981158898&text=Vim%20Pelo%20App.%20Pode%20me%20ajudar?'
),
})
writeInputCarrierList()
</script>
</body>
</html>