PageSourceSearch

https://posgradoucg.casagrande.edu.ec/login?ret=/

html casagrande.edu.ec collected 2026-09-25 03:47:24 UTC 34,877 bytes, 863 lines download raw bytes

1
2<!DOCTYPE html>
3<html lang="es">
4
5
6<!-- Mirrored from codescandy.com/geeks-bootstrap-5/pages/sign-in.html by HTTrack Website Copier/3.x [XR&CO'2014], Tue, 17 May 2022 19:21:58 GMT -->
7<head>
8    <!-- Required meta tags -->
9    <meta charset="utf-8">
10    <meta name="viewport" content="width=device-width, initial-scale=1">
11    <meta name="description"
12          content="Geeks is a fully responsive and yet modern premium bootstrap 5 template & snippets. Geek is feature-rich components and beautifully designed pages that help you create the best possible website and web application projects. Bootstrap Snippet "/>
13    <meta name="keywords"
14          content="Geeks UI, bootstrap, bootstrap 5, Course, Sass, landing, Marketing, admin themes, bootstrap admin, bootstrap dashboard, ui kit, web app, multipurpose"/>
15
16
17    <!-- Favicon icon-->
18    <link rel="shortcut icon" type="image/x-icon" href="/static/images/logo_casa_grande.png">
19
20
21    <!-- Libs CSS -->
22    <link href="/static/geeks/assets/fonts/feather/feather.css" rel="stylesheet">
23    <link href="/static/geeks/assets/libs/bootstrap-icons/font/bootstrap-icons.css" rel="stylesheet"/>
24    <link href="/static/geeks/assets/libs/dragula/dist/dragula.min.css" rel="stylesheet"/>
25    <link href="/static/geeks/assets/libs/%2540mdi/font/css/materialdesignicons.min.css" rel="stylesheet"/>
26    <link href="/static/geeks/assets/libs/dropzone/dist/dropzone.css" rel="stylesheet"/>
27    <link href="/static/geeks/assets/libs/magnific-popup/dist/magnific-popup.css" rel="stylesheet"/>
28    <link href="/static/geeks/assets/libs/bootstrap-select/dist/css/bootstrap-select.min.css" rel="stylesheet">
29    <link href="/static/geeks/assets/libs/%2540yaireo/tagify/dist/tagify.css" rel="stylesheet">
30    <link href="/static/geeks/assets/libs/tiny-slider/dist/tiny-slider.css" rel="stylesheet">
31    <link href="/static/geeks/assets/libs/tippy.js/dist/tippy.css" rel="stylesheet">
32    <link href="/static/geeks/assets/libs/datatables.net-bs5/css/dataTables.bootstrap5.min.css" rel="stylesheet">
33    <link href="/static/geeks/assets/libs/prismjs/themes/prism-okaidia.min.css" rel="stylesheet">
34    <link href="/static/geeks/assets/libs/simplebar/dist/simplebar.min.css" rel="stylesheet">
35    <link href="/static/geeks/assets/libs/nouislider/dist/nouislider.min.css" rel="stylesheet">
36    <link href="/static/geeks/assets/libs/glightbox/dist/css/glightbox.min.css" rel="stylesheet">
37    <link href="/static/vendor/toastr/css/toastr.min.css" rel="stylesheet">
38
39    <style>
40        :root {
41            --upse-navy: #c9d4dd; /* azul oscuro del héroe */
42            --upse-orange: #f39c12; /* naranja para acento y botón */
43            --upse-gray: #f7f7f9; /* gris muy claro para el fondo del panel */
44        }
45
46        .login-wrap .hero {
47            background: var(--upse-navy);
48            position: relative;
49            min-height: 100vh;
50            overflow: hidden;
51        }
52
53        /* imagen recortada del graduado (PNG con fondo transparente) */
54        .login-wrap .hero-figure {
55            position: absolute;
56            left: 3rem;
57            bottom: 0;
58            width: min(26rem, 40vw);
59            height: auto;
60            pointer-events: none;
61            user-select: none;
62        }
63
64        /* copy grande del lado izquierdo */
65        .login-wrap .hero-copy {
66            color: #fff;
67            max-width: 36rem;
68            margin-left: min(34rem, 41vw);
69            padding: 0 2rem;
70        }
71
72        .login-wrap .hero-copy h1 {
73            font-weight: 800;
74            line-height: 1.05;
75            font-size: clamp(1.8rem, 3.8vw + 1rem, 3.6rem);
76            margin-bottom: .5rem;
77        }
78
79        .login-wrap .hero-copy .accent {
80            color: var(--upse-orange);
81            font-style: italic;
82            font-weight: 900;
83        }
84
85        .login-wrap .hero-copy .bar {
86            width: .25rem;
87            height: 3.5rem;
88            background: var(--upse-orange);
89            margin-right: 1rem;
90            border-radius: .25rem;
91        }
92
93        /* panel derecho */
94        .login-panel {
95            background: #fff;
96            min-height: 100vh;
97            display: flex;
98            align-items: center;
99            justify-content: center;
100            padding: 2rem 1rem;
101        }
102
103        .login-card {
104            width: 100%;
105            max-width: 420px;
106            background: #fff;
107            border-radius: 1rem;
108        }
109
110        .login-card .card-body {
111            padding: 2.25rem;
112        }
113
114        .brand {
115            text-align: center;
116            margin-bottom: 1rem;
117        }
118
119        .brand img {
120            height: 48px;
121            width: auto;
122        }
123
124        .brand .title {
125            font-weight: 800;
126            letter-spacing: .06em;
127            font-size: 1.75rem;
128            line-height: 1.1;
129        }
130
131        .form-control {
132            height: 48px;
133        }
134
135        .btn-upse {
136            background: var(--upse-orange);
137            border: none;
138        }
139
140        .btn-upse:hover {
141            filter: brightness(.95);
142        }
143
144        .helper-links a {
145            font-size: .875rem;
146        }
147
148        /* responsive tweaks */
149        @media (max-width: 991.98px) {
150            .login-wrap .hero {
151                min-height: 56vh;
152            }
153
154            .login-wrap .hero-figure {
155                left: 1rem;
156                width: 16rem;
157                opacity: .95;
158            }
159
160            .login-wrap .hero-copy {
161                margin: 0;
162                padding: 3rem 1.5rem 4rem;
163            }
164        }
165    </style>
166    <style>
167        /* Aumenta tamaño del logo con respuesta fluida */
168        .login-card .brand img {
169            height: clamp(80px, 10vw, 80px); /* mínimo 80px, crece hasta 140px */
170            width: auto;
171            display: block; /* elimina espacio extra debajo de la imagen */
172            margin-inline: auto; /* centrado */
173        }
174
175        /* Opcional: en pantallas muy pequeñas, un poco menos grande */
176        @media (max-width: 576px) {
177            .login-card .brand img {
178                height: 42px;
179            }
180        }
181    </style>
182    <style>
183  /* OVERRIDE: el banner ocupa 100% del panel izquierdo */
184  .login-wrap .hero{
185    position: relative;
186    min-height: 100vh;
187  }
188
189  .login-wrap .hero-figure{
190    position: absolute;
191    inset: 0;             /* top:0; right:0; bottom:0; left:0 */
192    width: 100%;
193    height: 100%;
194    object-fit: cover;    /* recorte proporcional para llenar */
195    object-position: center;
196    margin: 0;
197    pointer-events: none;
198    user-select: none;
199  }
200</style>
201
202    
202<script>
203        function alertaSuccess(mensaje, time = 10000) {
204            Swal.fire({
205                toast: true,
206                position: 'top-end',
207                type: 'success',
208                title: mensaje,
209                showConfirmButton: false,
210                timer: time
211            })
212        }
213
214        function alertaWarning(mensaje, time = 5000) {
215            Swal.fire({
216                toast: true,
217                position: 'top-end',
218                type: 'warning',
219                title: mensaje,
220                showConfirmButton: false,
221                timer: time
222            })
223        }
224
225        function alertaDanger(mensaje, time = 5000) {
226            Swal.fire({
227                toast: true,
228                position: 'top-end',
229                type: 'error',
230                title: mensaje,
231                showConfirmButton: false,
232                timer: time
233            })
234        }
235
236        function alertaInfo(mensaje, time = 5000) {
237            Swal.fire({
238                toast: true,
239                position: 'top-end',
240                type: 'info',
241                title: mensaje,
242                showConfirmButton: false,
243                timer: time
244            })
245        }
246
247        const recuperar_claves_de_acceso = () => {
248            // Limpiar el campo de cédula al abrir el primer modal
249            document.getElementById('cedulaInput').value = '';
250            // Mostrar el primer modal
251            const modalCedula = new bootstrap.Modal(document.getElementById('modalCedula'));
252            modalCedula.show();
253        }
254
255
256        async function validarCedula() {
257            const identificacion = document.getElementById('cedulaInput').value.trim();
258            ;
259            if (!identificacion) {
260                alertaDanger("Por favor, ingrese un número de cédula válido.");
261                return;
262            }
263
264            try {
265                // Simular una petición POST al servidor para validar la cédula
266                const response = await fetch('/validar_cedula', {
267                    method: 'POST',
268                    headers: {
269                        'Content-Type': 'application/json',
270                        'X-CSRFToken': getCookie('csrftoken') // Si usas Django o un sistema con CSRF
271                    },
272                    body: JSON.stringify({identificacion: identificacion})
273                });
274
275                if (!response.ok) {
276                    throw new Error("Error al validar la cédula");
277                }
278
279                const data = await response.json();
280
281                if (data.result === 'ok') {
282                    // Mostrar el nombre de usuario en el segundo modal
283                    document.getElementById('usuarioLabel').textContent = data.usuario;
284
285                    const modalCedula = bootstrap.Modal.getInstance(document.getElementById('modalCedula'));
286                    modalCedula.hide();
287
288                    const modalNacimiento = new bootstrap.Modal(document.getElementById('modalNacimiento'));
289                    modalNacimiento.show();
290                } else {
291                    alertaSuccess(data.mensaje || "No se encontró un usuario con esta cédula.");
292                }
293            } catch (error) {
294                console.error(error);
295                alertaDanger("Ocurrió un error al validar la cédula.");
296            }
297        }
298
299        async function cambiarClave() {
300            const fechaNacimiento = document.getElementById('nacimientoInput').value;
301            const cedula = document.getElementById('cedulaInput').value.trim();
302            ;
303            if (!fechaNacimiento) {
304                alertaDanger("Por favor, ingrese una fecha de nacimiento válida.");
305                return;
306            }
307
308            try {
309                // Simular una petición POST al servidor para cambiar la clave
310                const response = await fetch('/cambiar_clave', {
311                    method: 'POST',
312                    headers: {
313                        'Content-Type': 'application/json',
314                        'X-CSRFToken': getCookie('csrftoken')
315                    },
316                    body: JSON.stringify({cedula: cedula, fechaNacimiento: fechaNacimiento})
317                });
318
319                if (!response.ok) {
320                    throw new Error("Error al cambiar la clave");
321                }
322
323                const data = await response.json();
324
325                if (data.result === 'ok') {
326                    alertaSuccess("¡Su contraseña es su número de identificación: " + document.getElementById('cedulaInput').value);
327                    // Limpiar los campos y cerrar el modal
328                    document.getElementById('cedulaInput').value = '';
329                    document.getElementById('nacimientoInput').value = '';
330
331                    // Cerrar el segundo modal
332                    const modalNacimiento = bootstrap.Modal.getInstance(document.getElementById('modalNacimiento'));
333                    modalNacimiento.hide();
334                } else {
335                    alertaInfo(data.mensaje || "No se pudo cambiar la clave.");
336                }
337            } catch (error) {
338                console.error(error);
339                alertaDanger("Ocurrió un error al cambiar la clave.");
340            }
341        }
342
343        function getCookie(name) {
344            let cookieValue = null;
345            if (document.cookie && document.cookie !== '') {
346                const cookies = document.cookie.split(';');
347                for (let i = 0; i < cookies.length; i++) {
348                    const cookie = cookies[i].trim();
349                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
350                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
351                        break;
352                    }
353                }
354            }
355            return cookieValue;
356        }
357    </script>
357
358
359    <!-- Theme CSS -->
360    <link rel="stylesheet" href="/static/geeks/assets/css/theme.min.css">
361    <title>Login</title>
362</head>
363
364<body>
365<!-- Modal 1: Solicitar número de cédula -->
366<div class="modal fade" id="modalCedula" tabindex="-1" aria-labelledby="modalCedulaLabel" aria-hidden="true">
367    <div class="modal-dialog">
368        <div class="modal-content">
369            <div class="modal-header">
370                <h5 class="modal-title" id="modalCedulaLabel">Recuperar datos de cuenta</h5>
371                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
372            </div>
373            <div class="modal-body">
374                <p>Ingrese su número de documento para validar su cuenta:</p>
375                <input type="text" id="cedulaInput" class="form-control" placeholder="Ingrese su número de cédula/RUC">
376            </div>
377            <div class="modal-footer">
378                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
379                <button type="button" class="btn btn-warning" onclick="validarCedula()">Resetear</button>
380            </div>
381        </div>
382    </div>
383</div>
384
385<!-- Modal 2: Solicitar fecha de nacimiento -->
386<div class="modal fade" id="modalNacimiento" tabindex="-1" aria-labelledby="modalNacimientoLabel" aria-hidden="true">
387    <div class="modal-dialog">
388        <div class="modal-content">
389            <div class="modal-header">
390                <h5 class="modal-title" id="modalNacimientoLabel">Datos de cuenta</h5>
391                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
392            </div>
393            <div class="modal-body">
394                <p>Su nombre de usuario es: <strong id="usuarioLabel">[Cargando...]</strong></p>
395                <p>Registre su fecha de nacimiento para poder resetear su clave:</p>
396                <p>¿Desea recuperar su contraseña?</p>
397                <input type="date" id="nacimientoInput" class="form-control" placeholder="dd/mm/aaaa">
398            </div>
399            <div class="modal-footer">
400                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
401                <button type="button" class="btn btn-warning" onclick="cambiarClave()">Validar</button>
402            </div>
403        </div>
404    </div>
405</div>
406
407
408<div class="login-wrap">
409    <div class="row g-0 min-vh-100">
410        <!-- LADO IZQUIERDO (HÉROE) -->
411        <div class="col-lg-9 hero d-none d-lg-block">
412            <img class="hero-figure"
413                 src="/media/logo/UCG-portada.jpg"
414                 alt="Graduado UPSE">
415            <div class="hero-copy d-flex align-items-start gap-3">
416                <div>
417
418                </div>
419            </div>
420        </div>
421
422        <!-- LADO DERECHO (LOGIN) -->
423        <div class="col-lg-3 login-panel">
424            <div class="login-card shadow-sm border-0">
425                <div class="card-body">
426                    <div class="brand">
427                        <!-- usa tu logo o deja el texto -->
428                        <img src="/static/images/logo_casa_grande.png" alt="Postgrado UPSE">
429                    </div>
430
431                    <h2 class="text-center mb-4" >Iniciar sesión</h2>
432                    <p class="text-muted text-center mb-0" style="font-size:.8rem">
433                       <b>¡Bienvenido/a a tu plataforma académica! </b> </p>
434                      <p class="text-muted text-center mb-0" style="font-size:.8rem"> <b>Por favor, inicia sesión con tus credenciales. </p>
435                    <form action="index.html">
436                        <div class="mb-4">
437                            <label class="mb-1 text-black">Usuario:</label>
438                            <input type="email" id="username" class="form-control" value="">
439                        </div>
440                        <div class="mb-4">
441                            <label class="mb-1 text-black">Contraseña:</label>
442                            <input type="password" id="password" class="form-control" value="">
443                        </div>
444
445                        <div class="text-center mb-4">
446                            <a href="javascript:;" id="login" class="btn btn-warning text-white  btn-block  w-100 py-2 btn-lg">Iniciar sesión</a>
447                        </div>
448                        <p class="text-center">¿No tienes usuario y clave para ingresar?
449                            <a target="_blank" class="btn-link text-primary"
450                               href="https://www.casagrande.edu.ec/posgrado/">Regístrate aquí</a>
451                        </p>
452                        <p class="text-center">
453                            <a class="btn-link text-primary" onclick="recuperar_claves_de_acceso()"
454                               href="Javascript:void(0);">Recuperar tus credenciales de acceso aqui!</a>
455                        </p>
456
457                    </form>
458
459                    <div class="mt-4 helper-links text-center">
460                        
461                        
462                        
463                        
464
465                    </div>
466                </div>
467            </div>
468        </div>
469        <!-- /panel -->
470    </div>
471</div>
472
473<div id="preloader" style="display:none">
474    <div class="sk-three-bounce">
475        <div class="sk-child sk-bounce1"></div>
476        <div class="sk-child sk-bounce2"></div>
477        <div class="sk-child sk-bounce3"></div>
478    </div>
479</div>
480
481
482<!-- Scripts -->
483
484
485<!-- Libs JS -->
486<script src="/static/geeks/assets/libs/jquery/dist/jquery.min.js"></script>
486
487
488<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.blockUI/2.70/jquery.blockUI.min.js"></script>
488
489
490
491<script src="/static/geeks/assets/libs/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
vendor: 1 bytes, line 491
491
492<script src="/static/geeks/assets/libs/odometer/odometer.min.js"></script>
vendor: 1 bytes, line 492
492
493<script src="/static/geeks/assets/libs/magnific-popup/dist/jquery.magnific-popup.min.js"></script>
vendor: 1 bytes, line 493
493
494<script src="/static/geeks/assets/libs/bootstrap-select/dist/js/bootstrap-select.min.js"></script>
vendor: 1 bytes, line 494
494
495<script src="/static/geeks/assets/libs/flatpickr/dist/flatpickr.min.js"></script>
vendor: 1 bytes, line 495
495
496<script src="/static/geeks/assets/libs/inputmask/dist/jquery.inputmask.min.js"></script>
vendor: 1 bytes, line 496
496
497<script src="/static/geeks/assets/libs/apexcharts/dist/apexcharts.min.js"></script>
vendor: 1 bytes, line 497
497
498<script src="/static/geeks/assets/libs/quill/dist/quill.min.js"></script>
vendor: 1 bytes, line 498
498
499<script src="/static/geeks/assets/libs/file-upload-with-preview/dist/file-upload-with-preview.min.js"></script>
vendor: 1 bytes, line 499
499
500<script src="/static/geeks/assets/libs/dragula/dist/dragula.min.js"></script>
vendor: 1 bytes, line 500
500
501<script src="/static/geeks/assets/libs/bs-stepper/dist/js/bs-stepper.min.js"></script>
vendor: 1 bytes, line 501
501
502<script src="/static/geeks/assets/libs/dropzone/dist/min/dropzone.min.js"></script>
vendor: 1 bytes, line 502
502
503<script src="/static/geeks/assets/libs/jQuery.print/jQuery.print.js"></script>
vendor: 1 bytes, line 503
503
504<script src="/static/geeks/assets/libs/prismjs/prism.js"></script>
vendor: 1 bytes, line 504
504
505<script src="/static/geeks/assets/libs/prismjs/components/prism-scss.min.js"></script>
vendor: 1 bytes, line 505
505
506<script src="/static/geeks/assets/libs/%2540yaireo/tagify/dist/tagify.min.js"></script>
vendor: 1 bytes, line 506
506
507<script src="/static/geeks/assets/libs/tiny-slider/dist/min/tiny-slider.js"></script>
vendor: 1 bytes, line 507
507
508<script src="/static/geeks/assets/libs/%2540popperjs/core/dist/umd/popper.min.js"></script>
vendor: 1 bytes, line 508
508
509<script src="/static/geeks/assets/libs/tippy.js/dist/tippy-bundle.umd.min.js"></script>
vendor: 1 bytes, line 509
509
510<script src="/static/geeks/assets/libs/typed.js/lib/typed.min.js"></script>
vendor: 1 bytes, line 510
510
511<script src="/static/geeks/assets/libs/jsvectormap/dist/js/jsvectormap.min.js"></script>
vendor: 1 bytes, line 511
511
512<script src="/static/geeks/assets/libs/jsvectormap/dist/maps/world.js"></script>
vendor: 1 bytes, line 512
512
513<script src="/static/geeks/assets/libs/datatables.net/js/jquery.dataTables.min.js"></script>
vendor: 1 bytes, line 513
513
514<script src="/static/geeks/assets/libs/datatables.net-bs5/js/dataTables.bootstrap5.min.js"></script>
vendor: 1 bytes, line 514
514
515<script src="/static/geeks/assets/libs/datatables.net-responsive/js/dataTables.responsive.min.js"></script>
vendor: 1 bytes, line 515
515
516<script src="/static/geeks/assets/libs/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js"></script>
vendor: 1 bytes, line 516
516
517<script src="/static/geeks/assets/libs/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
vendor: 1 bytes, line 517
517
518<script src="/static/geeks/assets/libs/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
vendor: 1 bytes, line 518
518
519<script src="/static/geeks/assets/libs/fullcalendar/main.min.js"></script>
vendor: 1 bytes, line 519
519
520<script src="/static/geeks/assets/libs/%2540lottiefiles/lottie-player/dist/lottie-player.js"></script>
vendor: 1 bytes, line 520
520
521<script src="/static/geeks/assets/libs/simplebar/dist/simplebar.min.js"></script>
vendor: 1 bytes, line 521
521
522<script src="/static/geeks/assets/libs/nouislider/dist/nouislider.min.js"></script>
vendor: 1 bytes, line 522
522
523<script src="/static/geeks/assets/libs/wnumb/wNumb.min.js"></script>
vendor: 1 bytes, line 523
523
524<script src="/static/geeks/assets/libs/glightbox/dist/js/glightbox.min.js"></script>
vendor: 1 bytes, line 524
524
525<script src="/static/vendor/toastr/js/toastr.min.js "></script>
525
526
527
528<!-- Theme JS -->
529<script src="/static/geeks/assets/js/theme.min.js"></script>
vendor: 1 bytes, line 529
529
530<script src="/static/js/manage.js"></script>
530
531
532<script src="/static/vendor/sweetalert2/dist/sweetalert2.min.js"></script>
vendor: 1 bytes, line 532
532
533<script src="/static/js/plugins-init/sweetalert.init.js"></script>
533
534<link href="/static/sweet2/sweetalert2.css?2.0.3" rel="stylesheet"/>
535<script src="/static/sweet2/sweetalert2.js?1.0.1"></script>
vendor: 1 bytes, line 535
535
536<script type="text/javascript">
537    $(document).ready(function () {
538        var mobile = false;
539        bloquearpantalla = function () {
540            if (typeof jQuery.blockUI !== 'function') {
541                console.warn('jquery.blockUI no está cargado');
542                return;
543            }
544            if (!$(".blockUI").length) {
545                $.blockUI({
546                    message: $('#preloader'),
547                    css: {
548                        backgroundColor: 'transparent',
549                        border: '0',
550                        zIndex: 9999999
551                    },
552                    overlayCSS: {
553                        backgroundColor: '#fff',
554                        opacity: 0.8,
555                        zIndex: 9999990
556                    }
557                });
558            }
559        };
560        clienteinfo = function (window) {
561            {
562                var unknown = '-';
563
564                // screen
565                var screenSize = '';
566                if (screen.width) {
567                    width = (screen.width) ? screen.width : '';
568                    height = (screen.height) ? screen.height : '';
569                    screenSize += '' + width + " x " + height;
570                }
571
572                // browser
573                var nVer = navigator.appVersion;
574                var nAgt = navigator.userAgent;
575                var browser = navigator.appName;
576                var version = '' + parseFloat(navigator.appVersion);
577                var majorVersion = parseInt(navigator.appVersion, 10);
578                var nameOffset, verOffset, ix;
579
580                // Opera
581                if ((verOffset = nAgt.indexOf('Opera')) != -1) {
582                    browser = 'Opera';
583                    version = nAgt.substring(verOffset + 6);
584                    if ((verOffset = nAgt.indexOf('Version')) != -1) {
585                        version = nAgt.substring(verOffset + 8);
586                    }
587                }
588                // Opera Next
589                if ((verOffset = nAgt.indexOf('OPR')) != -1) {
590                    browser = 'Opera';
591                    version = nAgt.substring(verOffset + 4);
592                }
593                // MSIE
594                else if ((verOffset = nAgt.indexOf('MSIE')) != -1) {
595                    browser = 'Microsoft Internet Explorer';
596                    version = nAgt.substring(verOffset + 5);
597                }
598                // Chrome
599                else if ((verOffset = nAgt.indexOf('Chrome')) != -1) {
600                    browser = 'Chrome';
601                    version = nAgt.substring(verOffset + 7);
602                }
603                // Safari
604                else if ((verOffset = nAgt.indexOf('Safari')) != -1) {
605                    browser = 'Safari';
606                    version = nAgt.substring(verOffset + 7);
607                    if ((verOffset = nAgt.indexOf('Version')) != -1) {
608                        version = nAgt.substring(verOffset + 8);
609                    }
610                }
611                // Firefox
612                else if ((verOffset = nAgt.indexOf('Firefox')) != -1) {
613                    browser = 'Firefox';
614                    version = nAgt.substring(verOffset + 8);
615                }
616                // MSIE 11+
617                else if (nAgt.indexOf('Trident/') != -1) {
618                    browser = 'Microsoft Internet Explorer';
619                    version = nAgt.substring(nAgt.indexOf('rv:') + 3);
620                }
621                // Other browsers
622                else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
623                    browser = nAgt.substring(nameOffset, verOffset);
624                    version = nAgt.substring(verOffset + 1);
625                    if (browser.toLowerCase() == browser.toUpperCase()) {
626                        browser = navigator.appName;
627                    }
628                }
629                // trim the version string
630                if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix);
631                if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix);
632                if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix);
633
634                majorVersion = parseInt('' + version, 10);
635                if (isNaN(majorVersion)) {
636                    version = '' + parseFloat(navigator.appVersion);
637                    majorVersion = parseInt(navigator.appVersion, 10);
638                }
639
640                // mobile version
641                mobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);
642                // cookie
643                var cookieEnabled = (navigator.cookieEnabled) ? true : false;
644
645                if (typeof navigator.cookieEnabled == 'undefined' && !cookieEnabled) {
646                    document.cookie = 'testcookie';
647                    cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
648                }
649
650                // system
651                var os = unknown;
652                var clientStrings = [
653                    {s: 'Windows 10', r: /(Windows 10.0|Windows NT 10.0)/},
654                    {s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/},
655                    {s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/},
656                    {s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/},
657                    {s: 'Windows Vista', r: /Windows NT 6.0/},
658                    {s: 'Windows Server 2003', r: /Windows NT 5.2/},
659                    {s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/},
660                    {s: 'Windows 2000', r: /(Windows NT 5.0|Windows 2000)/},
661                    {s: 'Windows ME', r: /(Win 9x 4.90|Windows ME)/},
662                    {s: 'Windows 98', r: /(Windows 98|Win98)/},
663                    {s: 'Windows 95', r: /(Windows 95|Win95|Windows_95)/},
664                    {s: 'Windows NT 4.0', r: /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
665                    {s: 'Windows CE', r: /Windows CE/},
666                    {s: 'Windows 3.11', r: /Win16/},
667                    {s: 'Android', r: /Android/},
668                    {s: 'Open BSD', r: /OpenBSD/},
669                    {s: 'Sun OS', r: /SunOS/},
670                    {s: 'Linux', r: /(Linux|X11)/},
671                    {s: 'iOS', r: /(iPhone|iPad|iPod)/},
672                    {s: 'Mac OS X', r: /Mac OS X/},
673                    {s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
674                    {s: 'QNX', r: /QNX/},
675                    {s: 'UNIX', r: /UNIX/},
676                    {s: 'BeOS', r: /BeOS/},
677                    {s: 'OS/2', r: /OS\/2/},
678                    {s: 'Search Bot', r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/}
679                ];
680                for (var id in clientStrings) {
681                    var cs = clientStrings[id];
682                    if (cs.r.test(nAgt)) {
683                        os = cs.s;
684                        break;
685                    }
686                }
687
688                var osVersion = unknown;
689
690                if (/Windows/.test(os)) {
691                    osVersion = /Windows (.*)/.exec(os)[1];
692                    os = 'Windows';
693                }
694
695                switch (os) {
696                    case 'Mac OS X':
697                        osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
698                        break;
699
700                    case 'Android':
701                        osVersion = /Android ([\.\_\d]+)/.exec(nAgt)[1];
702                        break;
703
704                    case 'iOS':
705                        osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
706                        osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
707                        break;
708                }
709
710                // flash (you'll need to include swfobject)
711                /* script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" */
712                var flashVersion = 'no check';
713                if (typeof swfobject != 'undefined') {
714                    var fv = swfobject.getFlashPlayerVersion();
715                    if (fv.major > 0) {
716                        flashVersion = fv.major + '.' + fv.minor + ' r' + fv.release;
717                    } else {
718                        flashVersion = unknown;
719                    }
720                }
721            }
722
723            window.jscd = {
724                screen: screenSize,
725                browser: browser,
726                browserVersion: version,
727                browserMajorVersion: majorVersion,
728                mobile: mobile,
729                os: os,
730                osVersion: osVersion,
731                cookies: cookieEnabled,
732                flashVersion: flashVersion
733            };
734        };
735
736        function mensajeErrorSwal(titulo, mensaje) {
737            Swal.fire({
738                allowOutsideClick: false,
739                allowEscapeKey: false,
740                allowEnterKey: false,
741                type: 'error',
742                customClass: {
743                    confirmButton: 'btn btn-warning'
744                },
745                title: titulo,
746                text: mensaje,
747                confirmButtonText: 'Aceptar',
748            })
749        }
750
751        clienteinfo(window);
752        $("#username").on("input", function () {
753            if ($(this).val().length != 0) {
754                $("#invalid-username").html('').show();
755            }
756        });
757        $("#password").on("input", function () {
758            if ($(this).val().length != 0) {
759                $("#invalid-password").html('').show();
760            }
761        });
762        $('#username').keyup(function (e) {
763            if (e.keyCode == 13) {
764                $("#password").focus();
765            }
766        });
767        $('#password').keyup(function (e) {
768            if (e.keyCode == 13) {
769                $("#login").trigger("click");
770            }
771        });
772        $("#login").click(function () {
773            var usuario = $("#username").val();
774            if (usuario.length == 0) {
775                $("#invalid-username").html('Debe Ingresar su usuario').show();
776                $("#username").focus();
777                return false;
778            }
779            var clave = $("#password").val();
780            if (clave.length == 0) {
781                $("#invalid-password").html('Debe Ingresar su contraseña').show();
782                $("#password").focus();
783                return false;
784            }
785            $("#login").attr({"disabled": "disabled"});
786            bloquearpantalla();
787            $.ajax({
788                type: "POST",
789                url: "/login",
790                dataType: "json",
791                data: {"action": "login", "usuario": usuario, "clave": clave, csrfmiddlewaretoken: 'hQ4FJAQNHHe6HUP91oS9wZH1gh5iE8zBaBZpzpW0ZGhCWSAHdgTzmcuvBBRtzcqj',},
792                success: function (data) {
793                    if (data.result == 'ok') {
794                        window.location.href = data.next_url || '/';
795                    } else {
796                        $.unblockUI();
797                        console.log("Bad at love")
798                        mensajeErrorSwal('Login Fallido', data.mensaje);
799
800                        
801                        
802                        
803                    }
804                },
805                error: function () {
806                    $("#login").removeAttr('disabled');
807                    $("#invalid-data").html('Error al enviar los datos').show();
808                },
809            });
810        });
811
812
813        var navegador = jscd.browser + ' ' + jscd.browserMajorVersion;
814        var os = jscd.os + ' ' + jscd.osVersion;
815        var cookies = jscd.cookies;
816        var screensize = jscd.screen;
817
818        const urlParams = new URLSearchParams(window.location.search);
819        if (urlParams.get('expired') === '1') {
820            Swal.fire({
821                type: 'warning',
822                title: 'Sesión expirada',
823                text: 'Tu sesión ha expirado por inactividad. Por favor, inicia sesión nuevamente.',
824                confirmButtonText: 'Entendido',
825                allowOutsideClick: false
826            });
827        }
828
829    });
830
831    function getCookie(name) {
832        var cookieValue = null;
833        if (document.cookie && document.cookie !== '') {
834            var cookies = document.cookie.split(';');
835            for (var i = 0; i < cookies.length; i++) {
836                var cookie = jQuery.trim(cookies[i]);
837                // Does this cookie string begin with the name we want?
838                if (cookie.substring(0, name.length + 1) === (name + '=')) {
839                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
840                    break;
841                }
842            }
843        }
844        return cookieValue;
845    }
846
847    var csrftoken = getCookie('csrftoken');
848
849    function csrfSafeMethod(method) {
850        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
851    }
852
853    $.ajaxSetup({
854        beforeSend: function (xhr, settings) {
855            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
856                xhr.setRequestHeader("X-CSRFToken", csrftoken);
857            }
858        }
859    });
860
861</script>
861
862</body>
863</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.