CINXE.COM
2024
<!DOCTYPE html> <html lang="en"> <head> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- OneTrust Cookies Consent Notice start for contest.techbriefs.com --> <script src="https://cdn-ukwest.onetrust.com/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="64457799-0d46-4cbd-b1bc-b931e8f8df9a" tb-donotmove></script> <script type="text/javascript" tb-donotmove> function OptanonWrapper() { } </script> <!-- OneTrust Cookies Consent Notice end for contest.techbriefs.com --> <link rel="preconnect" href="https://cdnjs.cloudflare.com/"> <link rel="preconnect" href="https://fonts.gstatic.com/"> <link rel="preconnect" href="https://fonts.googleapis.com/"> <link rel="preconnect" href="https://res.cloudinary.com/"> <link rel="preconnect" href="https://kit.fontawesome.com/"> <link rel="preconnect" href="https://kit-pro.fontawesome.com/"> <link rel="preconnect" href="https://www.googletagmanager.com/"> <link rel="preconnect" href="https://www.googletagservices.com/"> <link rel="preconnect" href="https://www.google-analytics.com/"> <link rel="preconnect" href="https://cdn.shareaholic.net"> <link rel="preconnect" href="https://olytics.omeda.com"> <link rel="preconnect" href="https://securepubads.g.doubleclick.net/"> <link rel="preconnect" href="https://px.ads.linkedin.com"> <link rel="preconnect" href="https://snap.licdn.com"> <link rel="preconnect" href="https://cdn-ukwest.onetrust.com"> <link rel="preconnect" href="https://agent.extrawatch.com"> <link rel="preload" as="style" href="/templates/ctf_2019/css/template.min.css?t=1716788610" integrity="sha512-F9gZzNqGLMtFzYq2oxq8kTyzLIjCuSsA2lb2mTTPvqkKnEZ0oqTEpujAJ5zywetxQT4izs4tIjAWmpw/QYCXPQ==" crossorigin="anonymous" referrerpolicy="no-referrer"/> <link rel="preload" as="script" href="https://cdnjs.cloudflare.com/ajax/libs/cloudinary-core/2.13.1/cloudinary-core-shrinkwrap.min.js" integrity="sha512-stp48jOOmT4TXnB4bMJ0rlcR7XagE92cqr7pEb+oFQox6qNSyKiN31GajDsg5VVn+HgM5mhOZinSRXowsRmgPg==" crossorigin="anonymous" referrerpolicy="no-referrer"/> <link rel="preload" as="script" href="https://kit.fontawesome.com/796c614b26.js" crossorigin="anonymous" referrerpolicy="no-referrer"/> <link rel="preload" as="script" href="https://cdnjs.cloudflare.com/ajax/libs/masonry/4.2.2/masonry.pkgd.min.js" integrity="sha512-JRlcvSZAXT8+5SQQAvklXGJuxXTouyq8oIMaYERZQasB8SBDHZaUbeASsJWpk0UUrf89DP3/aefPPrlMR1h1yQ==" crossorigin="anonymous" referrerpolicy="no-referrer"/> <link rel="preload" as="script" href="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.3.2/lazysizes.min.js" integrity="sha512-q583ppKrCRc7N5O0n2nzUiJ+suUv7Et1JGels4bXOaMFQcamPk9HjdUknZuuFjBNs7tsMuadge5k9RzdmO+1GQ==" crossorigin="anonymous" referrerpolicy="no-referrer"/> <link rel="preload" as="script" href="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.3.2/plugins/print/ls.print.min.js" integrity="sha512-tY3D/iSWSdQE2NSLW/mRWQd/bvHAGjyCLRwSd23sqNbbgVnUaah2t+ZpX7hdBOskZ7PqYvwe4E+qxNARGojJGQ==" crossorigin="anonymous" referrerpolicy="no-referrer"/> <link rel="preload" as="script" href="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer"/> <link rel="preload" as="script" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.3/js/bootstrap.bundle.min.js" integrity="sha512-i9cEfJwUwViEPFKdC1enz4ZRGBj8YQo6QByFTF92YXHi7waCqyexvRD75S5NVTsSiTv7rKWqG9Y5eFxmRsOn0A==" crossorigin="anonymous" referrerpolicy="no-referrer"/> <link rel="preload" as="script" href="https://cdnjs.cloudflare.com/ajax/libs/limonte-sweetalert2/11.14.5/sweetalert2.all.min.js" integrity="sha512-m4zOGknNg3h+mK09EizkXi9Nf7B3zwsN9ow+YkYIPZoA6iX2vSzLezg4FnW0Q6Z1CPaJdwgUFQ3WSAUC4E/5Hg==" crossorigin="anonymous" referrerpolicy="no-referrer"/> <link rel="preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.14.0-beta3/css/bootstrap-select.min.css" integrity="sha512-g2SduJKxa4Lbn3GW+Q7rNz+pKP9AWMR++Ta8fgwsZRCUsawjPvF/BxSMkGS61VsR9yinGoEgrHPGPn2mrj8+4w==" crossorigin="anonymous" referrerpolicy="no-referrer"/> <link rel="preload" as="script" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.14.0-beta3/js/bootstrap-select.min.js" integrity="sha512-yrOmjPdp8qH8hgLfWpSFhC/+R9Cj9USL8uJxYIveJZGAiedxyIxwNw4RsLDlcjNlIRR4kkHaDHSmNHAkxFTmgg==" crossorigin="anonymous" referrerpolicy="no-referrer"/> <meta charset="utf-8"> <meta name="author" content="<a href="https://contest.techbriefs.com/account/profile/imnotblue">Keiko Wong (imnotblue)</a>"> <meta name="keywords" content="Tech Briefs, Design Engineering, Technology Transfer, electronics, semiconductors, ICs, sensors, test & measurement, data acquisition, photonics, materials, computer software, mechanics, mechanical components, machinery, automation, manufacturing, fabrication, prototyping, mathematics, information sciences, life sciences, motion control, imaging"> <meta name="description" content="The Create the Future Design Contest was launched in 2002 by the publishers of NASA Tech Briefs magazine to help stimulate and reward engineering innovation. Th"> <title>2024</title> <link href="https://contest.techbriefs.com/2024" rel="canonical"> <style> /*! inlined from /media/plg_system_webauthn/css/button.min.css by ntb_minifier */ @charset "UTF-8"; button[class*="plg_system_webauthn_login_button"] { max-height: 3rem; padding: .25rem; } button[class*="plg_system_webauthn_login_button"] span[class*="icon"] { text-align: center; vertical-align: sub; width: 1em; font-size: 1.25em; display: inline-block; } button[class*="plg_system_webauthn_login_button"] img[class*="icon"] { text-align: center; vertical-align: middle; height: 2.5rem; padding: 0 .25em 2px; font-size: 1.5em; display: inline-block; } button[class*="plg_system_webauthn_login_button"] span[class*="icon"]:not(:last-child) { margin-inline-end: .5em; } /* end /media/plg_system_webauthn/css/button.min.css */ </style> <style>/** * Critical CSS created by criticalcss.com * file: /css/critical/article-default.css' * createdAt : 2024-05-27T05:52:29.000Z * resultStatus : GOOD * originalSize : 558272 * size : 0 * validationStatus : GOOD */ @charset "UTF-8";@font-face{font-family:Cabin;font-style:normal;font-weight:400;font-stretch:normal;font-display:swap;src:url(https://fonts.gstatic.com/s/cabin/v27/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkV2EH7ilwg.ttf) format('truetype')}@font-face{font-family:Cabin;font-style:normal;font-weight:700;font-stretch:normal;font-display:swap;src:url(https://fonts.gstatic.com/s/cabin/v27/u-4X0qWljRw-PfU81xCKCpdpbgZJl6XFpfEd7eA9BIxxkbqDH7ilwg.ttf) format('truetype')}@font-face{font-family:'Exo 2';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/exo2/v21/7cH1v4okm5zmbvwkAx_sfcEuiD8jvvKsN9C6.ttf) format('truetype')}@font-face{font-family:'Exo 2';font-style:normal;font-weight:600;font-display:swap;src:url(https://fonts.gstatic.com/s/exo2/v21/7cH1v4okm5zmbvwkAx_sfcEuiD8jYPWsN9C6.ttf) format('truetype')}:root{--bs-blue:#144c89;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#b9519f;--bs-red:#ec1f27;--bs-orange:#f79420;--bs-yellow:#f3ec19;--bs-green:#69bd45;--bs-teal:#6ecddd;--bs-cyan:#00abe9;--bs-white:#ffffff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-inverse:#000000;--bs-navbar:#adb5bd;--bs-navitem:#ffffff;--bs-primary-light:#144c89;--bs-error:#ec1f27;--bs-primary:#144c89;--bs-secondary:#00abe9;--bs-success:#69bd45;--bs-info:#00abe9;--bs-warning:#f3ec19;--bs-danger:#ec1f27;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-inverse-rgb:0,0,0;--bs-navbar-rgb:173,181,189;--bs-navitem-rgb:255,255,255;--bs-primary-light-rgb:20,76,137;--bs-error-rgb:236,31,39;--bs-primary-rgb:20,76,137;--bs-secondary-rgb:0,171,233;--bs-success-rgb:105,189,69;--bs-info-rgb:0,171,233;--bs-warning-rgb:243,236,25;--bs-danger-rgb:236,31,39;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:"Cabin",sans-serif;--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:Cabin,sans-serif;--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#ffffff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.25rem;--bs-border-radius-sm:0.2rem;--bs-border-radius-lg:0.3rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#144c89;--bs-link-hover-color:#0a2746;--bs-code-color:#b9519f;--bs-highlight-bg:#fdfbd1}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid #495057;opacity:.25}h2,h3,h4,h5{margin-top:0;margin-bottom:.5rem;font-family:"Exo 2",sans-serif;font-weight:600;line-height:1.2}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}p{margin-top:0}ol,ul{padding-left:2rem;margin-top:0}ol,p,ul{margin-bottom:1rem}a{color:var(--bs-link-color);text-decoration:none}img,svg{vertical-align:middle}button{border-radius:0;text-transform:none}button,input{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}[type=button],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{padding:0;border-style:none}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}iframe{border:0}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}img{max-width:100%;height:auto}.container,.container-fluid,.container-xl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-xl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--bs-gutter-y));margin-right:calc(-.5*var(--bs-gutter-x));margin-left:calc(-.5*var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-top:var(--bs-gutter-y)}.col-2{flex:0 0 auto;width:16.66666667%}.col-4{flex:0 0 auto;width:33.33333333%}.col-6{flex:0 0 auto;width:50%}.col-8{flex:0 0 auto;width:66.66666667%}.offset-2{margin-left:16.66666667%}@media (min-width:576px){.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}}@media (min-width:768px){.col-md-1,.col-md-2{flex:0 0 auto;width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-7{flex:0 0 auto;width:58.33333333%}}@media (min-width:992px){.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}}@media (min-width:1200px){.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-4{flex:0 0 auto;width:33.33333333%}}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group .btn{position:relative;z-index:2}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.btn{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:#212529;--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.25rem;--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);text-align:center;vertical-align:middle;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-image:var(--bs-gradient)}.btn-primary{--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-color:#ffffff;--bs-btn-bg:#144c89;--bs-btn-border-color:#144c89;--bs-btn-hover-color:#ffffff;--bs-btn-hover-bg:#114174;--bs-btn-hover-border-color:#103d6e;--bs-btn-focus-shadow-rgb:55,103,155;--bs-btn-active-color:#ffffff;--bs-btn-active-bg:#103d6e;--bs-btn-active-border-color:#0f3967;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:#144c89;--bs-btn-disabled-border-color:#144c89}.btn-secondary{--bs-btn-color:#000000;--bs-btn-bg:#00abe9;--bs-btn-border-color:#00abe9;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#26b8ec;--bs-btn-hover-border-color:#1ab3eb;--bs-btn-focus-shadow-rgb:0,145,198;--bs-btn-active-color:#000000;--bs-btn-active-bg:#33bced;--bs-btn-active-border-color:#1ab3eb;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#00abe9;--bs-btn-disabled-border-color:#00abe9;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125)}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.nav{--bs-nav-link-padding-x:0.7rem;--bs-nav-link-padding-y:0.7rem;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#6c757d;display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color)}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(0, 0, 0, 0.55);--bs-navbar-hover-color:rgba(0, 0, 0, 0.7);--bs-navbar-disabled-color:rgba(0, 0, 0, 0.3);--bs-navbar-active-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-padding-y:0.25rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-hover-color:rgba(0, 0, 0, 0.9);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--bs-navbar-toggler-border-radius:0.25rem;--bs-navbar-toggler-focus-width:0.25rem;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);background-image:var(--bs-gradient)}.navbar>.container-xl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.7rem;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius)}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}.navbar-dark{--bs-navbar-color:rgba(255, 255, 255, 0.85);--bs-navbar-hover-color:rgba(255, 255, 255, 0.5);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#ffffff;--bs-navbar-brand-color:#ffffff;--bs-navbar-brand-hover-color:#ffffff;--bs-navbar-toggler-border-color:transparent;--bs-navbar-toggler-icon-bg:none}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.25rem;--bs-card-inner-border-radius:calc(0.25rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0, 0, 0, 0.03);--bs-card-bg:#ffffff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.breadcrumb{display:flex;list-style:none;--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0.5rem;--bs-breadcrumb-margin-bottom:0;--bs-breadcrumb-font-size:0.875rem;--bs-breadcrumb-bg:transparent;--bs-breadcrumb-divider-color:#adb5bd;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#adb5bd;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "|")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.25rem;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-inverse{--bs-alert-color:black;--bs-alert-bg:#cccccc;--bs-alert-border-color:#b3b3b3}.alert-inverse .alert-link{color:#000}.alert-inverse,.alert-navbar,.alert-navitem{background-image:var(--bs-gradient)}.alert-navbar{--bs-alert-color:#686d71;--bs-alert-bg:#eff0f2;--bs-alert-border-color:#e6e9eb}.alert-navbar .alert-link{color:#53575a}.alert-navitem{--bs-alert-color:#666666;--bs-alert-bg:white;--bs-alert-border-color:white}.alert-navitem .alert-link{color:#525252}.alert-cdnjs,.alert-cleanup,.alert-primary,.alert-primary-light{--bs-alert-color:#0c2e52;--bs-alert-bg:#d0dbe7;--bs-alert-border-color:#b9c9dc;background-image:var(--bs-gradient)}.alert-cdnjs .alert-link,.alert-cleanup .alert-link,.alert-primary .alert-link,.alert-primary-light .alert-link{color:#0a2542}.alert-admin,.alert-cloudinary,.alert-criticalcss,.alert-secondary{--bs-alert-color:#00678c;--bs-alert-bg:#cceefb;--bs-alert-border-color:#b3e6f8;background-image:var(--bs-gradient)}.alert-admin .alert-link,.alert-cloudinary .alert-link,.alert-criticalcss .alert-link,.alert-secondary .alert-link{color:#005270}.alert-success{--bs-alert-color:#3f7129;--bs-alert-bg:#e1f2da;--bs-alert-border-color:#d2ebc7;background-image:var(--bs-gradient)}.alert-success .alert-link{color:#325a21}.alert-cache,.alert-info{--bs-alert-color:#00678c;--bs-alert-bg:#cceefb;--bs-alert-border-color:#b3e6f8;background-image:var(--bs-gradient)}.alert-cache .alert-link,.alert-info .alert-link{color:#005270}.alert-notice,.alert-warning{--bs-alert-color:#615e0a;--bs-alert-bg:#fdfbd1;--bs-alert-border-color:#fbf9ba;background-image:var(--bs-gradient)}.alert-notice .alert-link,.alert-warning .alert-link{color:#4e4b08}.alert-danger,.alert-error{--bs-alert-color:#8e1317;--bs-alert-bg:#fbd2d4;--bs-alert-border-color:#f9bcbe}.alert-danger .alert-link,.alert-error .alert-link{color:#720f12}.alert-danger,.alert-dark,.alert-error,.alert-light{background-image:var(--bs-gradient)}.alert-light{--bs-alert-color:#636464;--bs-alert-bg:#fefefe;--bs-alert-border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{--bs-alert-color:#141619;--bs-alert-bg:#d3d3d4;--bs-alert-border-color:#bcbebf}.alert-dark .alert-link{color:#101214}.list-group{--bs-list-group-color:#212529;--bs-list-group-bg:#ffffff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.25rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#495057;--bs-list-group-action-hover-color:#495057;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#212529;--bs-list-group-action-active-bg:#e9ecef;--bs-list-group-disabled-color:#6c757d;--bs-list-group-disabled-bg:#ffffff;--bs-list-group-active-color:#ffffff;--bs-list-group-active-bg:#144c89;--bs-list-group-active-border-color:#144c89;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item+.list-group-item{border-top-width:0}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-bg:#ffffff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.3rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(0.3rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin)}.modal.fade .modal-dialog{transform:translate(0,-50px)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}.align-top{vertical-align:top!important}.d-inline-block{display:inline-block!important}.d-flex{display:flex!important}.d-none{display:none!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-100{height:100%!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-nowrap{flex-wrap:nowrap!important}.justify-content-center{justify-content:center!important}.justify-content-around{justify-content:space-around!important}.align-items-end{align-items:flex-end!important}.m-0{margin:0!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.mt-1{margin-top:.25rem!important}.mt-5{margin-top:3rem!important}.me-2{margin-right:.5rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-3{margin-bottom:1rem!important}.ms-3{margin-left:1rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.pt-3{padding-top:1rem!important}.pb-0{padding-bottom:0!important}.text-center{text-align:center!important}.text-uppercase{text-transform:uppercase!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.bg-navbar{--bs-bg-opacity:1;background-color:rgba(var(--bs-navbar-rgb),var(--bs-bg-opacity))!important}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-error-rgb),var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.nav-link{font-family:"Exo 2",sans-serif;font-weight:600;font-size:16px;text-transform:uppercase}.menu-top-nav .nav-bottom .nav-item .nav-link{font-size:11px;border-left:1px solid #fff;height:100%;letter-spacing:.1em}@media (max-width:1000px){.menu-top-nav .nav-bottom .nav-item .nav-link{letter-spacing:.05em;padding-left:.45rem;padding-right:.45rem}}@media (max-width:925px){.menu-top-nav .nav-bottom .nav-item .nav-link{letter-spacing:.025em;padding-left:.4rem;padding-right:.4rem}}@media (max-width:875px){.menu-top-nav .nav-bottom .nav-item .nav-link{letter-spacing:.01em;padding-left:.35rem;padding-right:.35rem}}@media (max-width:850px){.menu-top-nav .nav-bottom .nav-item .nav-link{padding-left:.25rem;padding-right:.25rem}}.menu-top-nav .nav-bottom li:last-child{border-right:1px solid #fff}.navbar{font-family:Cabin,sans-serif;font-weight:700}.navbar-side{position:fixed;top:0;left:0;border-right:2px solid #495057;overflow-y:scroll;z-index:1000;transform:translateX(-100%);width:100%}@media (min-width:576px){.navbar-side{width:50%}}@media (min-width:768px){.d-md-block{display:block!important}.d-md-flex{display:flex!important}.navbar-side{width:35%}}@media (min-width:1200px){.navbar-side{width:28%}}.navbar-side .nav-link{font-size:16px;padding-top:.5rem;padding-bottom:.5rem}.navbar-toggler{padding:.75rem!important}.navbar-toggler-left{position:absolute}.module.card h4{color:#fff;text-transform:uppercase;padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;font-weight:400;letter-spacing:.25rem;font-size:1.1rem}.module.card .card-body,.module.card .card-header{padding-top:.25rem;padding-bottom:.25rem}.module.card .card-header{background:#00abe9}.module.card .card-header h4{font-size:1.25rem}.module.card .list-group-item{font-size:1.25rem;font-family:"Exo 2",sans-serif}.module.card .card-body{background:#adb5bd;font-family:Cabin,sans-serif}.alert-message{font-size:smaller}article{font-family:Cabin,sans-serif}.blur-up{filter:blur(5px)}.overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#000;opacity:.6;z-index:990}nav.header-nav .logolarge{vertical-align:middle;height:150px;max-height:150px}@media (max-width:1199.98px){nav.header-nav .logolarge{max-height:140px}}@media (max-width:991.98px){nav.header-nav .logolarge{max-height:130px}}@media (max-width:767.98px){.navbar{border-bottom:5px solid #adb5bd}nav.header-nav .logolarge{max-height:120px}}@media (max-width:575.98px){nav.header-nav .logolarge{max-height:100px;max-width:100%;padding-left:5px;padding-right:5px}}nav.header-nav .principal-sponsors{max-width:400px;max-height:165px;border-radius:.5rem;background-image:linear-gradient(rgba(20,76,137,.15),rgba(255,255,255,0) 50%,rgba(20,76,137,.15))}@media (max-width:1199.98px){nav.header-nav .principal-sponsors{max-height:155px;max-width:375px}}@media (max-width:991.98px){nav.header-nav .principal-sponsors{max-height:145px;max-width:325px}}nav.header-nav .principal-sponsors-header h3{line-height:.5;font-weight:200;font-size:1.1rem;letter-spacing:.35rem}@media (max-width:1199.98px){nav.header-nav .principal-sponsors-header h3{font-size:1rem;letter-spacing:.35rem}}@media (max-width:991.98px){nav.header-nav .principal-sponsors-header h3{font-size:.9rem;letter-spacing:.3rem}div#login-menu ul{flex-direction:column!important}}@media (max-width:767.98px){nav.header-nav .principal-sponsors{max-height:135px;max-width:280px}nav.header-nav .principal-sponsors-header h3{font-size:.8rem;letter-spacing:.25rem}}@media (max-width:575.98px){nav.header-nav .principal-sponsors{max-height:100px;max-width:40%;padding-left:5px;padding-right:5px}nav.header-nav .principal-sponsors-header h3{font-size:.5rem;letter-spacing:.1rem}}.overlay,.printmessage{display:none}.cls-1{fill:#6fccdd}.cls-2{fill:#fff}.cls-3{fill:#06b0d8}.cls-4{fill:#f79420}.cls-5{fill:#fbb03a}.cls-6{fill:#faed23}.cls-7{fill:#f7ec13}.cls-8{fill:#6abd45}.cls-9{fill:#b9529f}.cls-10{fill:#c1272d}.cls-11{fill:#ec2027}.cls-12{fill:#d2d3d4}:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.cb_template .alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.cb_template .alert-heading{color:inherit}.cb_template .alert-link{font-weight:700}.cb_template .alert-dismissible{padding-right:4rem}.cb_template .alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.cb_template .alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.cb_template .alert-primary hr{border-top-color:#9fcdff}.cb_template .alert-primary .alert-link{color:#002752}.cb_template .alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.cb_template .alert-secondary hr{border-top-color:#c8cbcf}.cb_template .alert-secondary .alert-link{color:#202326}.cb_template .alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.cb_template .alert-success hr{border-top-color:#b1dfbb}.cb_template .alert-success .alert-link{color:#0b2e13}.cb_template .alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.cb_template .alert-info hr{border-top-color:#abdde5}.cb_template .alert-info .alert-link{color:#062c33}.cb_template .alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.cb_template .alert-warning hr{border-top-color:#ffe8a1}.cb_template .alert-warning .alert-link{color:#533f03}.cb_template .alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.cb_template .alert-danger hr{border-top-color:#f1b0b7}.cb_template .alert-danger .alert-link{color:#491217}.cb_template .alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.cb_template .alert-light hr{border-top-color:#ececf6}.cb_template .alert-light .alert-link{color:#686868}.cb_template .alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.cb_template .alert-dark hr{border-top-color:#b9bbbe}.cb_template .alert-dark .alert-link{color:#040505}</style> <script type="application/json" class="joomla-script-options new">{"joomla.jtext":{"PLG_SYSTEM_WEBAUTHN_ERR_CANNOT_FIND_USERNAME":"Cannot find the username field in the login module. Sorry, Passwordless authentication will not work on this site unless you use a different login module.","PLG_SYSTEM_WEBAUTHN_ERR_EMPTY_USERNAME":"You need to enter your username (but NOT your password) before selecting the Web Authentication login button.","PLG_SYSTEM_WEBAUTHN_ERR_INVALID_USERNAME":"The specified username does not correspond to a user account that has enabled passwordless login on this site."},"system.paths":{"root":"","rootFull":"https:\/\/contest.techbriefs.com\/","base":"","baseFull":"https:\/\/contest.techbriefs.com\/"},"csrf.token":"870c1934c9a8e5dd31dcbb27def6f297","system.keepalive":{"interval":3600000,"uri":"\/component\/ajax\/?format=json"}}</script> <script type="module"> /*! inlined from /media/vendor/bootstrap/js/toast.min.js by ntb_minifier */ import { e as enableDismissTrigger, d as define$Plugin, B as BaseComponent, E as EventHandler, r as reflow } from './dom.js?5.3.0'; /** * -------------------------------------------------------------------------- * Bootstrap toast.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'toast'; const DATA_KEY = 'bs.toast'; const EVENT_KEY = `.${DATA_KEY}`; const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`; const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`; const EVENT_FOCUSIN = `focusin${EVENT_KEY}`; const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`; const EVENT_HIDE = `hide${EVENT_KEY}`; const EVENT_HIDDEN = `hidden${EVENT_KEY}`; const EVENT_SHOW = `show${EVENT_KEY}`; const EVENT_SHOWN = `shown${EVENT_KEY}`; const CLASS_NAME_FADE = 'fade'; const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOWING = 'showing'; const DefaultType = { animation: 'boolean', autohide: 'boolean', delay: 'number' }; const Default = { animation: true, autohide: true, delay: 5000 }; /** * Class definition */ class Toast extends BaseComponent { constructor(element, config) { super(element, config); this._timeout = null; this._hasMouseInteraction = false; this._hasKeyboardInteraction = false; this._setListeners(); } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public show() { const showEvent = EventHandler.trigger(this._element, EVENT_SHOW); if (showEvent.defaultPrevented) { return; } this._clearTimeout(); if (this._config.animation) { this._element.classList.add(CLASS_NAME_FADE); } const complete = () => { this._element.classList.remove(CLASS_NAME_SHOWING); EventHandler.trigger(this._element, EVENT_SHOWN); this._maybeScheduleHide(); }; this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated reflow(this._element); this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING); this._queueCallback(complete, this._element, this._config.animation); } hide() { if (!this.isShown()) { return; } const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE); if (hideEvent.defaultPrevented) { return; } const complete = () => { this._element.classList.add(CLASS_NAME_HIDE); // @deprecated this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW); EventHandler.trigger(this._element, EVENT_HIDDEN); }; this._element.classList.add(CLASS_NAME_SHOWING); this._queueCallback(complete, this._element, this._config.animation); } dispose() { this._clearTimeout(); if (this.isShown()) { this._element.classList.remove(CLASS_NAME_SHOW); } super.dispose(); } isShown() { return this._element.classList.contains(CLASS_NAME_SHOW); } // Private _maybeScheduleHide() { if (!this._config.autohide) { return; } if (this._hasMouseInteraction || this._hasKeyboardInteraction) { return; } this._timeout = setTimeout(() => { this.hide(); }, this._config.delay); } _onInteraction(event, isInteracting) { switch (event.type) { case 'mouseover': case 'mouseout': { this._hasMouseInteraction = isInteracting; break; } case 'focusin': case 'focusout': { this._hasKeyboardInteraction = isInteracting; break; } } if (isInteracting) { this._clearTimeout(); return; } const nextElement = event.relatedTarget; if (this._element === nextElement || this._element.contains(nextElement)) { return; } this._maybeScheduleHide(); } _setListeners() { EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true)); EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false)); EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true)); EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false)); } _clearTimeout() { clearTimeout(this._timeout); this._timeout = null; } // Static static $Interface(config) { return this.each(function () { const data = Toast.getOrCreateInstance(this, config); if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError(`No method named "${config}"`); } data[config](this); } }); } } /** * Data API implementation */ enableDismissTrigger(Toast); /** * $ */ define$Plugin(Toast); window.bootstrap = window.bootstrap || {}; window.bootstrap.Toast = Toast; if (Joomla && Joomla.getOptions) { // Get the elements/configurations from the PHP const toasts = Joomla.getOptions('bootstrap.toast'); // Initialise the elements if (typeof toasts === 'object' && toasts !== null) { Object.keys(toasts).forEach(toast => { const opt = toasts[toast]; const options = { animation: opt.animation ? opt.animation : true, autohide: opt.autohide ? opt.autohide : true, delay: opt.delay ? opt.delay : 5000 }; const elements = Array.from(document.querySelectorAll(toast)); if (elements.length) { elements.map(el => new window.bootstrap.Toast(el, options)); } }); } } export { Toast as T }; /* end /media/vendor/bootstrap/js/toast.min.js */ </script> <script type="module"> /*! inlined from /media/vendor/bootstrap/js/scrollspy.min.js by ntb_minifier */ import { E as EventHandler, S as SelectorEngine, d as define$Plugin, B as BaseComponent, c as getElement, f as isDisabled, i as isVisible } from './dom.js?5.3.0'; /** * -------------------------------------------------------------------------- * Bootstrap scrollspy.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'scrollspy'; const DATA_KEY = 'bs.scrollspy'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const EVENT_ACTIVATE = `activate${EVENT_KEY}`; const EVENT_CLICK = `click${EVENT_KEY}`; const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`; const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; const CLASS_NAME_ACTIVE = 'active'; const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; const SELECTOR_TARGET_LINKS = '[href]'; const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; const SELECTOR_NAV_LINKS = '.nav-link'; const SELECTOR_NAV_ITEMS = '.nav-item'; const SELECTOR_LIST_ITEMS = '.list-group-item'; const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`; const SELECTOR_DROPDOWN = '.dropdown'; const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; const Default = { offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons rootMargin: '0px 0px -25%', smoothScroll: false, target: null, threshold: [0.1, 0.5, 1] }; const DefaultType = { offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons rootMargin: 'string', smoothScroll: 'boolean', target: 'element', threshold: 'array' }; /** * Class definition */ class ScrollSpy extends BaseComponent { constructor(element, config) { super(element, config); // this._element is the observablesContainer and config.target the menu links wrapper this._targetLinks = new Map(); this._observableSections = new Map(); this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element; this._activeTarget = null; this._observer = null; this._previousScrollData = { visibleEntryTop: 0, parentScrollTop: 0 }; this.refresh(); // initialize } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public refresh() { this._initializeTargetsAndObservables(); this._maybeEnableSmoothScroll(); if (this._observer) { this._observer.disconnect(); } else { this._observer = this._getNewObserver(); } for (const section of this._observableSections.values()) { this._observer.observe(section); } } dispose() { this._observer.disconnect(); super.dispose(); } // Private _configAfterMerge(config) { // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case config.target = getElement(config.target) || document.body; // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin; if (typeof config.threshold === 'string') { config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value)); } return config; } _maybeEnableSmoothScroll() { if (!this._config.smoothScroll) { return; } // unregister any previous listeners EventHandler.off(this._config.target, EVENT_CLICK); EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => { const observableSection = this._observableSections.get(event.target.hash); if (observableSection) { event.preventDefault(); const root = this._rootElement || window; const height = observableSection.offsetTop - this._element.offsetTop; if (root.scrollTo) { root.scrollTo({ top: height, behavior: 'smooth' }); return; } // Chrome 60 doesn't support `scrollTo` root.scrollTop = height; } }); } _getNewObserver() { const options = { root: this._rootElement, threshold: this._config.threshold, rootMargin: this._config.rootMargin }; return new IntersectionObserver(entries => this._observerCallback(entries), options); } // The logic of selection _observerCallback(entries) { const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`); const activate = entry => { this._previousScrollData.visibleEntryTop = entry.target.offsetTop; this._process(targetElement(entry)); }; const parentScrollTop = (this._rootElement || document.documentElement).scrollTop; const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop; this._previousScrollData.parentScrollTop = parentScrollTop; for (const entry of entries) { if (!entry.isIntersecting) { this._activeTarget = null; this._clearActiveClass(targetElement(entry)); continue; } const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop if (userScrollsDown && entryIsLowerThanPrevious) { activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration if (!parentScrollTop) { return; } continue; } // if we are scrolling up, pick the smallest offsetTop if (!userScrollsDown && !entryIsLowerThanPrevious) { activate(entry); } } } _initializeTargetsAndObservables() { this._targetLinks = new Map(); this._observableSections = new Map(); const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target); for (const anchor of targetLinks) { // ensure that the anchor has an id and is not disabled if (!anchor.hash || isDisabled(anchor)) { continue; } const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element); // ensure that the observableSection exists & is visible if (isVisible(observableSection)) { this._targetLinks.set(decodeURI(anchor.hash), anchor); this._observableSections.set(anchor.hash, observableSection); } } } _process(target) { if (this._activeTarget === target) { return; } this._clearActiveClass(this._config.target); this._activeTarget = target; target.classList.add(CLASS_NAME_ACTIVE); this._activateParents(target); EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target }); } _activateParents(target) { // Activate dropdown parents if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE); return; } for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) { // Set triggered links parents as active // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) { item.classList.add(CLASS_NAME_ACTIVE); } } } _clearActiveClass(parent) { parent.classList.remove(CLASS_NAME_ACTIVE); const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent); for (const node of activeNodes) { node.classList.remove(CLASS_NAME_ACTIVE); } } // Static static $Interface(config) { return this.each(function () { const data = ScrollSpy.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { throw new TypeError(`No method named "${config}"`); } data[config](); }); } } /** * Data API implementation */ EventHandler.on(window, EVENT_LOAD_DATA_API, () => { for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) { ScrollSpy.getOrCreateInstance(spy); } }); /** * $ */ define$Plugin(ScrollSpy); window.bootstrap = window.bootstrap || {}; window.bootstrap.Scrollspy = ScrollSpy; if (Joomla && Joomla.getOptions) { // Get the elements/configurations from the PHP const scrollspys = Joomla.getOptions('bootstrap.scrollspy'); // Initialise the elements if (typeof scrollspys === 'object' && scrollspys !== null) { Object.keys(scrollspys).forEach(scrollspy => { const opt = scrollspys[scrollspy]; const options = { offset: opt.offset ? opt.offset : 10, method: opt.method ? opt.method : 'auto' }; if (opt.target) { options.target = opt.target; } const elements = Array.from(document.querySelectorAll(scrollspy)); if (elements.length) { elements.map(el => new window.bootstrap.Scrollspy(el, options)); } }); } } export { ScrollSpy as S }; /* end /media/vendor/bootstrap/js/scrollspy.min.js */ </script> <script type="module"> /*! inlined from /media/vendor/bootstrap/js/offcanvas.min.js by ntb_minifier */ import { E as EventHandler, S as SelectorEngine, f as isDisabled, i as isVisible, e as enableDismissTrigger, d as define$Plugin, B as BaseComponent, k as ScrollBarHelper, l as Backdrop, F as FocusTrap } from './dom.js?5.3.0'; /** * -------------------------------------------------------------------------- * Bootstrap offcanvas.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'offcanvas'; const DATA_KEY = 'bs.offcanvas'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`; const ESCAPE_KEY = 'Escape'; const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOWING = 'showing'; const CLASS_NAME_HIDING = 'hiding'; const CLASS_NAME_BACKDROP = 'offcanvas-backdrop'; const OPEN_SELECTOR = '.offcanvas.show'; const EVENT_SHOW = `show${EVENT_KEY}`; const EVENT_SHOWN = `shown${EVENT_KEY}`; const EVENT_HIDE = `hide${EVENT_KEY}`; const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`; const EVENT_HIDDEN = `hidden${EVENT_KEY}`; const EVENT_RESIZE = `resize${EVENT_KEY}`; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]'; const Default = { backdrop: true, keyboard: true, scroll: false }; const DefaultType = { backdrop: '(boolean|string)', keyboard: 'boolean', scroll: 'boolean' }; /** * Class definition */ class Offcanvas extends BaseComponent { constructor(element, config) { super(element, config); this._isShown = false; this._backdrop = this._initializeBackDrop(); this._focustrap = this._initializeFocusTrap(); this._addEventListeners(); } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public toggle(relatedTarget) { return this._isShown ? this.hide() : this.show(relatedTarget); } show(relatedTarget) { if (this._isShown) { return; } const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget }); if (showEvent.defaultPrevented) { return; } this._isShown = true; this._backdrop.show(); if (!this._config.scroll) { new ScrollBarHelper().hide(); } this._element.setAttribute('aria-modal', true); this._element.setAttribute('role', 'dialog'); this._element.classList.add(CLASS_NAME_SHOWING); const completeCallBack = () => { if (!this._config.scroll || this._config.backdrop) { this._focustrap.activate(); } this._element.classList.add(CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_SHOWING); EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget }); }; this._queueCallback(completeCallBack, this._element, true); } hide() { if (!this._isShown) { return; } const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE); if (hideEvent.defaultPrevented) { return; } this._focustrap.deactivate(); this._element.blur(); this._isShown = false; this._element.classList.add(CLASS_NAME_HIDING); this._backdrop.hide(); const completeCallback = () => { this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING); this._element.removeAttribute('aria-modal'); this._element.removeAttribute('role'); if (!this._config.scroll) { new ScrollBarHelper().reset(); } EventHandler.trigger(this._element, EVENT_HIDDEN); }; this._queueCallback(completeCallback, this._element, true); } dispose() { this._backdrop.dispose(); this._focustrap.deactivate(); super.dispose(); } // Private _initializeBackDrop() { const clickCallback = () => { if (this._config.backdrop === 'static') { EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); return; } this.hide(); }; // 'static' option will be translated to true, and booleans will keep their value const isVisible = Boolean(this._config.backdrop); return new Backdrop({ className: CLASS_NAME_BACKDROP, isVisible, isAnimated: true, rootElement: this._element.parentNode, clickCallback: isVisible ? clickCallback : null }); } _initializeFocusTrap() { return new FocusTrap({ trapElement: this._element }); } _addEventListeners() { EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => { if (event.key !== ESCAPE_KEY) { return; } if (this._config.keyboard) { this.hide(); return; } EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); }); } // Static static $Interface(config) { return this.each(function () { const data = Offcanvas.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { throw new TypeError(`No method named "${config}"`); } data[config](this); }); } } /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { const target = SelectorEngine.getElementFromSelector(this); if (['A', 'AREA'].includes(this.tagName)) { event.preventDefault(); } if (isDisabled(this)) { return; } EventHandler.one(target, EVENT_HIDDEN, () => { // focus on trigger when it is closed if (isVisible(this)) { this.focus(); } }); // avoid conflict when clicking a toggler of an offcanvas, while another is open const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); if (alreadyOpen && alreadyOpen !== target) { Offcanvas.getInstance(alreadyOpen).hide(); } const data = Offcanvas.getOrCreateInstance(target); data.toggle(this); }); EventHandler.on(window, EVENT_LOAD_DATA_API, () => { for (const selector of SelectorEngine.find(OPEN_SELECTOR)) { Offcanvas.getOrCreateInstance(selector).show(); } }); EventHandler.on(window, EVENT_RESIZE, () => { for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) { if (getComputedStyle(element).position !== 'fixed') { Offcanvas.getOrCreateInstance(element).hide(); } } }); enableDismissTrigger(Offcanvas); /** * $ */ define$Plugin(Offcanvas); window.bootstrap = window.bootstrap || {}; window.bootstrap.Offcanvas = Offcanvas; if (Joomla && Joomla.getOptions) { // Get the elements/configurations from the PHP const offcanvases = Joomla.getOptions('bootstrap.offcanvas'); // Initialise the elements if (typeof offcanvases === 'object' && offcanvases !== null) { Object.keys(offcanvases).forEach(offcanvas => { const opt = offcanvases[offcanvas]; const options = { backdrop: opt.backdrop ? opt.backdrop : true, keyboard: opt.keyboard ? opt.keyboard : true, scroll: opt.scroll ? opt.scroll : true }; const elements = Array.from(document.querySelectorAll(offcanvas)); if (elements.length) { elements.map(el => new window.bootstrap.Offcanvas(el, options)); } }); } } export { Offcanvas as O }; /* end /media/vendor/bootstrap/js/offcanvas.min.js */ </script> <script type="module"> /*! inlined from /media/vendor/bootstrap/js/collapse.min.js by ntb_minifier */ import { E as EventHandler, S as SelectorEngine, d as define$Plugin, B as BaseComponent, r as reflow, c as getElement } from './dom.js?5.3.0'; /** * -------------------------------------------------------------------------- * Bootstrap collapse.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'collapse'; const DATA_KEY = 'bs.collapse'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const EVENT_SHOW = `show${EVENT_KEY}`; const EVENT_SHOWN = `shown${EVENT_KEY}`; const EVENT_HIDE = `hide${EVENT_KEY}`; const EVENT_HIDDEN = `hidden${EVENT_KEY}`; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_COLLAPSE = 'collapse'; const CLASS_NAME_COLLAPSING = 'collapsing'; const CLASS_NAME_COLLAPSED = 'collapsed'; const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`; const CLASS_NAME_HORIZONTAL = 'collapse-horizontal'; const WIDTH = 'width'; const HEIGHT = 'height'; const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]'; const Default = { parent: null, toggle: true }; const DefaultType = { parent: '(null|element)', toggle: 'boolean' }; /** * Class definition */ class Collapse extends BaseComponent { constructor(element, config) { super(element, config); this._isTransitioning = false; this._triggerArray = []; const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE); for (const elem of toggleList) { const selector = SelectorEngine.getSelectorFromElement(elem); const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element); if (selector !== null && filterElement.length) { this._triggerArray.push(elem); } } this._initializeChildren(); if (!this._config.parent) { this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()); } if (this._config.toggle) { this.toggle(); } } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public toggle() { if (this._isShown()) { this.hide(); } else { this.show(); } } show() { if (this._isTransitioning || this._isShown()) { return; } let activeChildren = []; // find active children if (this._config.parent) { activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, { toggle: false })); } if (activeChildren.length && activeChildren[0]._isTransitioning) { return; } const startEvent = EventHandler.trigger(this._element, EVENT_SHOW); if (startEvent.defaultPrevented) { return; } for (const activeInstance of activeChildren) { activeInstance.hide(); } const dimension = this._getDimension(); this._element.classList.remove(CLASS_NAME_COLLAPSE); this._element.classList.add(CLASS_NAME_COLLAPSING); this._element.style[dimension] = 0; this._addAriaAndCollapsedClass(this._triggerArray, true); this._isTransitioning = true; const complete = () => { this._isTransitioning = false; this._element.classList.remove(CLASS_NAME_COLLAPSING); this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW); this._element.style[dimension] = ''; EventHandler.trigger(this._element, EVENT_SHOWN); }; const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); const scrollSize = `scroll${capitalizedDimension}`; this._queueCallback(complete, this._element, true); this._element.style[dimension] = `${this._element[scrollSize]}px`; } hide() { if (this._isTransitioning || !this._isShown()) { return; } const startEvent = EventHandler.trigger(this._element, EVENT_HIDE); if (startEvent.defaultPrevented) { return; } const dimension = this._getDimension(); this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`; reflow(this._element); this._element.classList.add(CLASS_NAME_COLLAPSING); this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW); for (const trigger of this._triggerArray) { const element = SelectorEngine.getElementFromSelector(trigger); if (element && !this._isShown(element)) { this._addAriaAndCollapsedClass([trigger], false); } } this._isTransitioning = true; const complete = () => { this._isTransitioning = false; this._element.classList.remove(CLASS_NAME_COLLAPSING); this._element.classList.add(CLASS_NAME_COLLAPSE); EventHandler.trigger(this._element, EVENT_HIDDEN); }; this._element.style[dimension] = ''; this._queueCallback(complete, this._element, true); } _isShown() { let element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._element; return element.classList.contains(CLASS_NAME_SHOW); } // Private _configAfterMerge(config) { config.toggle = Boolean(config.toggle); // Coerce string values config.parent = getElement(config.parent); return config; } _getDimension() { return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT; } _initializeChildren() { if (!this._config.parent) { return; } const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE); for (const element of children) { const selected = SelectorEngine.getElementFromSelector(element); if (selected) { this._addAriaAndCollapsedClass([element], this._isShown(selected)); } } } _getFirstLevelChildren(selector) { const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); // remove children if greater depth return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element)); } _addAriaAndCollapsedClass(triggerArray, isOpen) { if (!triggerArray.length) { return; } for (const element of triggerArray) { element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen); element.setAttribute('aria-expanded', isOpen); } } // Static static $Interface(config) { const _config = {}; if (typeof config === 'string' && /show|hide/.test(config)) { _config.toggle = false; } return this.each(function () { const data = Collapse.getOrCreateInstance(this, _config); if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError(`No method named "${config}"`); } data[config](); } }); } } /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { // preventDefault only for <a> elements (which change the URL) not inside the collapsible element if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') { event.preventDefault(); } for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) { Collapse.getOrCreateInstance(element, { toggle: false }).toggle(); } }); /** * $ */ define$Plugin(Collapse); window.bootstrap = window.bootstrap || {}; window.bootstrap.Collapse = Collapse; if (Joomla && Joomla.getOptions) { // Get the elements/configurations from the PHP const collapses = { ...Joomla.getOptions('bootstrap.collapse'), ...Joomla.getOptions('bootstrap.accordion') }; // Initialise the elements Object.keys(collapses).forEach(collapse => { const opt = collapses[collapse]; const options = { toggle: opt.toggle ? opt.toggle : true }; if (opt.parent) { options.parent = opt.parent; } const elements = Array.from(document.querySelectorAll(collapse)); if (elements.length) { elements.map(el => new window.bootstrap.Collapse(el, options)); } }); } export { Collapse as C }; /* end /media/vendor/bootstrap/js/collapse.min.js */ </script> <script type="module"> /*! inlined from /media/vendor/bootstrap/js/button.min.js by ntb_minifier */ import { E as EventHandler, d as define$Plugin, B as BaseComponent } from './dom.js?5.3.0'; /** * -------------------------------------------------------------------------- * Bootstrap button.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'button'; const DATA_KEY = 'bs.button'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const CLASS_NAME_ACTIVE = 'active'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]'; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; /** * Class definition */ class Button extends BaseComponent { // Getters static get NAME() { return NAME; } // Public toggle() { // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE)); } // Static static $Interface(config) { return this.each(function () { const data = Button.getOrCreateInstance(this); if (config === 'toggle') { data[config](); } }); } } /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => { event.preventDefault(); const button = event.target.closest(SELECTOR_DATA_TOGGLE); const data = Button.getOrCreateInstance(button); data.toggle(); }); /** * $ */ define$Plugin(Button); window.bootstrap = window.bootstrap || {}; window.bootstrap.Button = Button; if (Joomla && Joomla.getOptions) { // Get the elements/configurations from the PHP const buttons = Joomla.getOptions('bootstrap.button'); // Initialise the elements if (buttons && buttons.length) { buttons.forEach(selector => { Array.from(document.querySelectorAll(selector)).map(el => new window.bootstrap.Button(el)); }); } } export { Button as B }; /* end /media/vendor/bootstrap/js/button.min.js */ </script> <script type="module"> /*! inlined from /media/vendor/bootstrap/js/alert.min.js by ntb_minifier */ import { e as enableDismissTrigger, d as define$Plugin, B as BaseComponent, E as EventHandler } from './dom.js?5.3.0'; /** * -------------------------------------------------------------------------- * Bootstrap alert.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'alert'; const DATA_KEY = 'bs.alert'; const EVENT_KEY = `.${DATA_KEY}`; const EVENT_CLOSE = `close${EVENT_KEY}`; const EVENT_CLOSED = `closed${EVENT_KEY}`; const CLASS_NAME_FADE = 'fade'; const CLASS_NAME_SHOW = 'show'; /** * Class definition */ class Alert extends BaseComponent { // Getters static get NAME() { return NAME; } // Public close() { const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE); if (closeEvent.defaultPrevented) { return; } this._element.classList.remove(CLASS_NAME_SHOW); const isAnimated = this._element.classList.contains(CLASS_NAME_FADE); this._queueCallback(() => this._destroyElement(), this._element, isAnimated); } // Private _destroyElement() { this._element.remove(); EventHandler.trigger(this._element, EVENT_CLOSED); this.dispose(); } // Static static $Interface(config) { return this.each(function () { const data = Alert.getOrCreateInstance(this); if (typeof config !== 'string') { return; } if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { throw new TypeError(`No method named "${config}"`); } data[config](this); }); } } /** * Data API implementation */ enableDismissTrigger(Alert, 'close'); /** * $ */ define$Plugin(Alert); window.bootstrap = window.bootstrap || {}; window.bootstrap.Alert = Alert; if (Joomla && Joomla.getOptions) { // Get the elements/configurations from the PHP const alerts = Joomla.getOptions('bootstrap.alert'); // Initialise the elements if (alerts && alerts.length) { alerts.forEach(selector => { Array.from(document.querySelectorAll(selector)).map(el => new window.bootstrap.Alert(el)); }); } } export { Alert as A }; /* end /media/vendor/bootstrap/js/alert.min.js */ </script> <script type="module"> /*! inlined from /media/system/js/keepalive.min.js by ntb_minifier */ /** * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ /** * Keepalive javascript behavior * * Used for keeping the session alive * * @package Joomla.JavaScript * @since 3.7.0 */ if (!window.Joomla) { throw new Error('Joomla API was not properly initialised'); } const keepAliveOptions = Joomla.getOptions('system.keepalive'); const keepAliveInterval = keepAliveOptions && keepAliveOptions.interval ? parseInt(keepAliveOptions.interval, 10) : 45 * 1000; let keepAliveUri = keepAliveOptions && keepAliveOptions.uri ? keepAliveOptions.uri.replace(/&/g, '&') : ''; // Fallback in case no keepalive uri was found. if (keepAliveUri === '') { const systemPaths = Joomla.getOptions('system.paths'); keepAliveUri = `${systemPaths ? `${systemPaths.root}/index.php` : window.location.pathname}?option=com_ajax&format=json`; } setInterval(() => fetch(keepAliveUri, { method: 'POST' }), keepAliveInterval); /* end /media/system/js/keepalive.min.js */ </script> <meta name="pubdate" content="20240216"> <!-- Google Tag Manager --> <script>(function (w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-NBC2RTV');</script> <!-- End Google Tag Manager --> <!-- favicons --> <link rel="apple-touch-icon-precomposed" sizes="57x57" href="/templates/ctf_2019/favicos/apple-touch-icon-57x57.png" /> <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/templates/ctf_2019/favicos/apple-touch-icon-114x114.png" /> <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/templates/ctf_2019/favicos/apple-touch-icon-72x72.png" /> <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/templates/ctf_2019/favicos/apple-touch-icon-144x144.png" /> <link rel="apple-touch-icon-precomposed" sizes="60x60" href="/templates/ctf_2019/favicos/apple-touch-icon-60x60.png" /> <link rel="apple-touch-icon-precomposed" sizes="120x120" href="/templates/ctf_2019/favicos/apple-touch-icon-120x120.png" /> <link rel="apple-touch-icon-precomposed" sizes="76x76" href="/templates/ctf_2019/favicos/apple-touch-icon-76x76.png" /> <link rel="apple-touch-icon-precomposed" sizes="152x152" href="/templates/ctf_2019/favicos/apple-touch-icon-152x152.png" /> <link rel="icon" type="image/png" href="/templates/ctf_2019/favicos/favicon-196x196.png" sizes="196x196" /> <link rel="icon" type="image/png" href="/templates/ctf_2019/favicos/favicon-96x96.png" sizes="96x96" /> <link rel="icon" type="image/png" href="/templates/ctf_2019/favicos/favicon-32x32.png" sizes="32x32" /> <link rel="icon" type="image/png" href="/templates/ctf_2019/favicos/favicon-16x16.png" sizes="16x16" /> <link rel="icon" type="image/png" href="/templates/ctf_2019/favicos/favicon-128.png" sizes="128x128" /> <meta name="application-name" content=" " /> <meta name="msapplication-TileColor" content="#FFFFFF" /> <meta name="msapplication-TileImage" content="/templates/ctf_2019/favicos/mstile-144x144.png" /> <meta name="msapplication-square70x70logo" content="/templates/ctf_2019/favicos/mstile-70x70.png" /> <meta name="msapplication-square150x150logo" content="/templates/ctf_2019/favicos/mstile-150x150.png" /> <meta name="msapplication-wide310x150logo" content="/templates/ctf_2019/favicos/mstile-310x150.png" /> <meta name="msapplication-square310x310logo" content="/templates/ctf_2019/favicos/mstile-310x310.png" /> </head> <body> <!-- Google Tag Manager (noscript) --> <noscript> <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NBC2RTV" height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <!-- End Google Tag Manager (noscript) --> <!--googleoff: all--> <header class="header"> <div class="header-container container-fluid p-0"> <nav class="header-nav navbar navbar-expand-sm navbar-dark bg-primary px-0 py-1"> <div class="row w-100"> <div class="col-xl-2 col-lg-2 col-md-1 col-sm-1 col-xs-1 col-2 align-top h-100"> <button type="button" id="navbar-side-button-small" class="hamburger navbar-toggler navbar-toggler-left" data-bs-toggle="collapse" data-bs-target=".navbar-side"> <span class="fas fa-bars"></span> </button> <div id="hamburger-menu" class="navbar-collapse collapse d-none"> <ul class="navbar-nav me-auto"> <li class="nav-item active"> <a id="navbar-side-button-large" class="nav-link ms-3"> <span class="fas fa-bars"></span> </a></li></ul></div></div> <div class="col-xl-4 col-lg-4 col-md-4 col-sm-5 col-xs-4 col-4 py-2 ctf-logo"> <div class="d-flex justify-content-around align-items-end"> <div> <a href="/"> <svg class="logolarge py-1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2734.14 1993.33"><defs><style>.cls-1{fill:#6fccdd;}.cls-2{fill:#fff;}.cls-3{fill:#06b0d8;}.cls-4{fill:#f79420;}.cls-5{fill:#fbb03a;}.cls-6{fill:#faed23;}.cls-7{fill:#f7ec13;}.cls-8{fill:#6abd45;}.cls-9{fill:#b9529f;}.cls-10{fill:#c1272d;}.cls-11{fill:#ec2027;}.cls-12{fill:#d2d3d4;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><polygon class="cls-1" points="1112.55 1624.74 1112.34 1683.17 606.53 1681.18 606.95 1622.8 1112.55 1624.74"/><path class="cls-2" d="M634.37,536.36V519.21h37.84v78.34H634.37q-16.71-42.43-55.73-42.43-19.36,0-34.37,10.06a67.37,67.37,0,0,0-23.36,27.42,87.79,87.79,0,0,0-8.35,38.5,82.63,82.63,0,0,0,7.91,36.28,66,66,0,0,0,22.1,26.32q14.19,9.82,32.66,9.82a55.9,55.9,0,0,0,39.54-15.74q16.77-15.75,22.54-41.47l43.9,20.84q-24.83,77.46-110.12,77.45-36.66,0-64.07-14t-42.2-39.91Q450,664.79,450,630.2q0-32.67,15.22-58.83a108.58,108.58,0,0,1,42.05-41q26.84-14.85,60.09-14.86Q607.77,515.52,634.37,536.36Z"/><path class="cls-2" d="M830.61,584.84V631.4q-20.4,1.33-32.45,6.43a37.17,37.17,0,0,0-18.62,17.51Q773,667.76,773,690.81v15.38h30.89V742H694.91V706.19h28.53V623H696.39V586.61h72.43v39.46a59.48,59.48,0,0,1,20.25-29.7q14.77-11.82,36.66-11.82A29.45,29.45,0,0,1,830.61,584.84Z"/><path class="cls-2" d="M1007.93,674.7H892q1.77,17.89,12.34,28.31t27.27,10.42q18.47,0,36.06-18.32l38.43,12.41q-12.72,19.07-31.49,28.6t-44.49,9.54q-25.73,0-45.45-9.68a72.26,72.26,0,0,1-30.6-27.42q-10.87-17.73-10.86-41.69A83,83,0,0,1,854.55,624a81.23,81.23,0,0,1,30.6-30.09,84,84,0,0,1,41.91-10.86q24.54,0,42.72,11.31t28,32.08Q1007.63,647.21,1007.93,674.7ZM924.71,616q-13.31,0-21.36,7.68t-10.12,23.51H958q-2.07-13.89-11.31-22.55A31.05,31.05,0,0,0,924.71,616Z"/><path class="cls-2" d="M1172,648.69v57.5h25.12V742h-74.49V729.84q-21.15,14.48-42.27,14.48-25.57,0-40.94-13.16T1024,695.69q0-23.66,17.22-37.91T1087,643.51a66.94,66.94,0,0,1,17.67,2.14,100.08,100.08,0,0,1,18,7.32V640.56q0-11.82-7.39-18.92T1093,614.55q-16.11,0-28.53,12.41l-39.91-7.24q18.18-36.68,75.09-36.67,39,0,55.65,16T1172,648.69Zm-80.56,64.74q13.29,0,31.19-16v-13.9q-16-10.35-29.27-10.35-10.63,0-16.26,5t-5.61,14.34Q1071.44,713.45,1091.39,713.43Z"/><path class="cls-2" d="M1296.05,586.61V623h-28.67v67.84c0,4.83.93,8.46,2.81,10.86s5.37,3.63,10.49,3.63q6.35,0,15.37-3.25v34.44q-20,7.83-37.54,7.83-20.25,0-30.37-10.27T1218,705V623h-19.66V586.6H1218V562.51L1267.38,527v59.57Z"/><path class="cls-2" d="M1475.57,674.7H1359.68Q1361.45,692.6,1372,703t27.27,10.42q18.48,0,36.07-18.32l38.42,12.41q-12.7,19.07-31.48,28.6t-44.49,9.54q-25.72,0-45.46-9.68t-30.59-27.42q-10.87-17.73-10.86-41.69A82.87,82.87,0,0,1,1322.22,624a81.27,81.27,0,0,1,30.59-30.09,84,84,0,0,1,41.91-10.86q24.52,0,42.71,11.31t28,32.08Q1475.27,647.21,1475.57,674.7ZM1392.35,616q-13.3,0-21.36,7.68t-10.13,23.51h64.74q-2.05-13.89-11.3-22.55A31.05,31.05,0,0,0,1392.35,616Z"/><path class="cls-2" d="M1590.06,653.17V674h-16.39v38.78q0,4.14,1.61,6.21t6,2.07a26.65,26.65,0,0,0,8.78-1.86v19.69a59,59,0,0,1-21.46,4.48q-11.58,0-17.36-5.87t-5.79-16.6V674h-11.24V653.17h11.24V639.41l28.22-20.28v34h16.39Z"/><path class="cls-2" d="M1667.11,651.15q13.52,0,20.32,8.19t6.8,23.83v38.35h13.18V742h-41.57V684.52c0-3.67-.7-6.29-2.07-7.86s-3.68-2.36-6.88-2.36q-6.6,0-14.88,5.41v41.82h12.42V742h-55V721.53h14.36V635h-14.36V614.66H1642v45.79Q1655.71,651.14,1667.11,651.15Z"/><path class="cls-2" d="M1808.42,703.52h-66.23q1,10.23,7,16.18t15.58,6q10.56,0,20.62-10.48l22,7.09a47.23,47.23,0,0,1-18,16.35q-10.74,5.45-25.44,5.45t-26-5.54a41.29,41.29,0,0,1-17.49-15.66q-6.19-10.14-6.21-23.83a47.35,47.35,0,0,1,6.47-24.5,46.44,46.44,0,0,1,17.48-17.19,48,48,0,0,1,24-6.21q14,0,24.42,6.46a42.39,42.39,0,0,1,16,18.33Q1808.26,687.81,1808.42,703.52ZM1760.86,670c-5.06,0-9.14,1.47-12.21,4.39s-5,7.41-5.78,13.44h37a21.33,21.33,0,0,0-6.47-12.89A17.69,17.69,0,0,0,1760.86,670Z"/><path class="cls-2" d="M651.51,873V831.77H562.24v68.59h64.64v50.45H562.24v77.06h46.12v50.45H442.41v-50.45h42.38V831.77H442.41V781.32H708.47V873Z"/><path class="cls-2" d="M829.42,1027.08q17,0,36.66-15V919.67H834.35V871.18H931.9v159.44h33.9v47.69H866.08V1061q-30.95,20.49-60.11,20.5-30.15,0-46.9-16.76t-16.76-46.11V919.67H711.17V871.18h96.57v130.47q0,14.58,4.63,20T829.42,1027.08Z"/><path class="cls-2" d="M1106.65,871.18v48.49h-38.23v90.46q0,9.66,3.74,14.48t14,4.83q8.47,0,20.5-4.34V1071q-26.61,10.46-50.06,10.45-27,0-40.5-13.69t-13.5-38.73V919.66H976.38V871.17h26.21V839.05l65.83-47.3v79.41h38.23Z"/><path class="cls-2" d="M1244.36,1027.08q17,0,36.65-15V919.67h-31.72V871.18h97.55v159.44h33.9v47.69H1281V1061q-30.94,20.49-60.1,20.5-30.17,0-46.91-16.76t-16.75-46.11V919.67h-31.14V871.18h96.56v130.47q0,14.58,4.63,20T1244.36,1027.08Z"/><path class="cls-2" d="M1576.57,868.81v62.08q-27.19,1.77-43.25,8.58t-24.83,23.35q-8.77,16.56-8.77,47.31v20.5h41.19v47.69H1395.66v-47.69h38v-111h-36.06V871.18h96.56V923.8a79.4,79.4,0,0,1,27-39.61q19.71-15.77,48.87-15.78A42.06,42.06,0,0,1,1576.57,868.81Z"/><path class="cls-2" d="M1813.41,988.64H1658.9q2.37,23.85,16.46,37.74t36.36,13.9q24.63,0,48.08-24.44l51.24,16.55q-16.95,25.42-42,38.14t-59.31,12.71q-34.29,0-60.61-12.92t-40.8-36.55q-14.47-23.65-14.48-55.57,0-31.53,15.08-57.16a108.09,108.09,0,0,1,40.8-40.1,111.91,111.91,0,0,1,55.87-14.49q32.72,0,57,15.08t37.34,42.77Q1813,952,1813.41,988.64Zm-111-78.24q-17.73,0-28.48,10.25T1660.47,952h86.33q-2.76-18.53-15.08-30.06A41.38,41.38,0,0,0,1702.45,910.4Z"/><polygon class="cls-3" points="467.4 1239.41 513.45 1275.39 345.54 1489.76 299.6 1453.74 467.4 1239.41"/><polygon class="cls-4" points="380.34 1144.36 417.01 1189.68 205.2 1360.76 168.6 1315.47 380.34 1144.36"/><polygon class="cls-5" points="316.86 1032.07 342.43 1084.63 97.53 1203.67 71.99 1151.15 316.86 1032.07"/><polygon class="cls-6" points="280.26 908.45 293.35 965.35 27.88 1026.22 14.89 969.38 280.26 908.45"/><polygon class="cls-7" points="272.44 779.72 272.33 838.04 0 837.66 0.14 779.34 272.44 779.72"/><polygon class="cls-8" points="293.77 652.66 280.53 709.42 15.23 647.8 28.43 590.99 293.77 652.66"/><polygon class="cls-1" points="343.05 533.51 317.45 585.94 72.85 466.17 98.5 413.82 343.05 533.51"/><polygon class="cls-9" points="417.98 428.53 381.24 473.85 169.91 302.15 206.58 256.87 417.98 428.53"/><polygon class="cls-10" points="514.58 343.14 468.61 378.97 301.25 164.12 347.33 128.32 514.58 343.14"/><polygon class="cls-11" points="632.12 295.88 577.39 316.08 483.37 60.48 538.08 40.37 632.12 295.88"/><polygon class="cls-4" points="758.83 271.78 700.95 279.15 666.86 9 724.66 1.62 758.83 271.78"/><polygon class="cls-5" points="887.66 276.82 829.67 270.95 857.18 0 915.23 5.97 887.66 276.82"/><polygon class="cls-7" points="1025.69 305.78 969.84 288.91 1048.85 28.33 1104.63 45.15 1025.69 305.78"/><polygon class="cls-7" points="1141.27 362.9 1090.71 333.9 1226.3 97.71 1276.88 126.83 1141.27 362.9"/><path class="cls-2" d="M604.15,1337.13h27.74c21,0,38.23,17.12,38.23,39.11s-17.37,39.11-38.23,39.11H604.15Zm19.56,61h4.39c11.68,0,21.66-6.64,21.66-21.89,0-14-8.88-21.89-21.46-21.89h-4.59v43.78Z"/><path class="cls-2" d="M723.65,1354.35v13.07h22.06v17.22H723.65v13.49H746.9v17.22H704.09v-78.22H746.9v17.22Z"/><path class="cls-2" d="M825.2,1357.25a20.13,20.13,0,0,0-13-5.18c-3.59,0-8.38,2.18-8.38,6.54,0,4.56,5.29,6.33,8.68,7.47l5,1.56c10.48,3.21,18.56,8.71,18.56,21.37,0,7.77-1.79,15.77-7.78,21s-13.77,7.37-21.36,7.37a45.22,45.22,0,0,1-26.45-8.92l8.39-16.39c4.89,4.47,10.68,8.1,17.36,8.1,4.59,0,9.48-2.39,9.48-7.88,0-5.71-7.68-7.68-11.87-8.92-12.27-3.63-20.36-7-20.36-22.09,0-15.88,10.88-26.26,26-26.26a50,50,0,0,1,23.55,6.44Z"/><path class="cls-2" d="M889.82,1415.35H870.26v-78.22h19.56Z"/><path class="cls-2" d="M1002.55,1371.67c-.2,11.41-1,21.16-7.69,30.91-7.38,10.69-18.46,15.36-31,15.36-23.65,0-40.12-16.71-40.12-41.29,0-25.42,16.57-42.12,40.82-42.12,15.47,0,27.45,7.27,33.93,21.89l-18.56,8.09c-2.7-7.47-8.38-12.45-16.27-12.45-12.87,0-19.56,12.76-19.56,24.69,0,12.14,7,24.49,19.86,24.49,8.48,0,15-4.57,15.77-13.59h-16v-16Z"/><path class="cls-2" d="M1036.43,1337.13H1056l35.83,47.82h.19v-47.82h19.57v78.22H1092l-35.83-47.93h-.2v47.93h-19.56v-78.22Z"/><path class="cls-2" d="M657.94,1501.79a21,21,0,0,0-17.17-8.61c-12,0-20.06,9.54-20.06,21.68,0,12.35,8.19,21.27,20.36,21.27a22.13,22.13,0,0,0,16.86-8.3v24.38c-6.48,2.07-11.18,3.63-17.27,3.63a41,41,0,0,1-28.24-11.51c-8.28-7.78-12.07-17.95-12.07-29.57a41.78,41.78,0,0,1,11.08-28.63,40,40,0,0,1,28.64-12.66,44.52,44.52,0,0,1,17.86,3.94v24.38Z"/><path class="cls-2" d="M757.9,1513.2c0,25.32-17.46,43.16-41.62,43.16s-41.61-17.85-41.61-43.16c0-23.65,20-40.25,41.61-40.25S757.9,1489.55,757.9,1513.2Zm-62.88.1c0,13.49,9.58,23.35,21.26,23.35s21.26-9.85,21.26-23.35c0-10.78-9.58-20.64-21.26-20.64S695,1502.52,695,1513.3Z"/><path class="cls-2" d="M775.4,1475.55H795l35.83,47.82h.2v-47.82h19.56v78.22H831l-35.83-47.93H795v47.93H775.4Z"/><path class="cls-2" d="M901.69,1553.77H882.13v-61H866v-17.22h51.9v17.22H901.7v61Z"/><path class="cls-2" d="M953,1492.77v13.07H975v17.22H953v13.49H976.2v17.22H933.39v-78.22H976.2v17.22Z"/><path class="cls-2" d="M1038,1495.67a20.13,20.13,0,0,0-13-5.18c-3.59,0-8.38,2.18-8.38,6.54,0,4.56,5.29,6.33,8.68,7.47l5,1.56c10.48,3.21,18.56,8.71,18.56,21.37,0,7.77-1.79,15.77-7.78,21s-13.77,7.37-21.36,7.37a45.22,45.22,0,0,1-26.45-8.92l8.39-16.39c4.89,4.47,10.68,8.1,17.36,8.1,4.59,0,9.48-2.39,9.48-7.88,0-5.71-7.68-7.68-11.87-8.92-12.27-3.63-20.36-6.95-20.36-22.09,0-15.88,10.88-26.26,25.95-26.26a50,50,0,0,1,23.55,6.44Z"/><path class="cls-2" d="M1096.59,1553.77H1077v-61h-16.16v-17.22h51.9v17.22H1096.6v61Z"/><path class="cls-1" d="M631.82,1795.7s46.9,5.65,57.67,11.53c82.71,45.16-9.56,184.55,92.28,184.55,92.28,0-39.51,1.55,141.49,1.55l20-1.55c101.84,0,9.57-139.39,92.28-184.55,10.77-5.88,57.67-11.53,57.67-11.53V1738H631.83v57.67Z"/><g id="Layer_2-2" data-name="Layer 2"><path class="cls-2" d="M1646,1583.28h-10.75v-82.94h12.35c26.54,0,34.77,8.8,34.77,24,0,17.49-13.84,24.2-30.2,24.2H1646v34.76Zm0-44h3.43c11,0,22.88-2,22.88-15.18,0-13-12.81-14.52-23.45-14.52H1646v29.7Z"/><path class="cls-2" d="M1777,1583.28h-13l-25.39-35.09h-4.46v35.09h-10.75v-82.94h13c7.66,0,15.9.11,22.76,3.85a23.21,23.21,0,0,1-9.38,43Zm-42.9-43.67h3.43c11,0,22.88-2,22.88-15.18,0-13-12.81-14.85-23.45-14.85h-2.86v30Z"/><path class="cls-2" d="M1901.18,1541.81c0,24.64-20.25,43.23-45.18,43.23s-45.18-18.59-45.18-43.23c0-23.76,20.47-43.23,45.18-43.23S1901.18,1518.05,1901.18,1541.81Zm-10.76,0c0-18.26-14.18-33.55-34.43-33.55s-34.43,15.29-34.43,33.55c0,18.92,15.78,33.55,34.43,33.55S1890.42,1560.73,1890.42,1541.81Z"/><path class="cls-2" d="M1942.13,1500.34H1960c26.42,0,48.38,13.42,48.38,41,0,28.27-21.5,41.91-48.73,41.91h-17.5v-82.94Zm10.75,73.48h3.77c22,0,40.95-7.92,40.95-32s-19-32-40.95-32h-3.77Z"/><path class="cls-2" d="M2059.83,1500.34v49c0,13.53,4.23,26.07,20.82,26.07s20.82-12.54,20.82-26.07v-49h10.75v52.47c0,18.26-11.78,32.23-31.57,32.23s-31.57-14-31.57-32.23v-52.47Z"/><path class="cls-2" d="M2221.34,1516.18a35.68,35.68,0,0,0-22.76-8.14,33.77,33.77,0,1,0-.23,67.54,35.3,35.3,0,0,0,23-8.58v12.21a48.07,48.07,0,0,1-22.65,5.83c-24.59,0-45-18.81-45-42.79,0-24.53,20.47-43.67,45.87-43.67a42.87,42.87,0,0,1,21.73,5.61v12Z"/><path class="cls-2" d="M2265.61,1500.34h46.32v9.46h-35.57V1533h34.54v9.46h-34.54v31.35h35.57v9.46h-46.32Z"/><path class="cls-2" d="M2355.75,1500.34h17.84c26.42,0,48.38,13.42,48.38,41,0,28.27-21.5,41.91-48.73,41.91h-17.5v-82.94Zm10.75,73.48h3.77c22,0,40.95-7.92,40.95-32s-19-32-40.95-32h-3.77Z"/><path class="cls-2" d="M2527.78,1500.34h10.52c16.24,0,31.57,4.07,31.57,22.77,0,6.05-3.43,13.09-9.26,15.73v.22c10.18,1.76,17.27,11.33,17.27,21,0,16.61-14.75,23.21-30,23.21h-20.13v-82.94Zm10.75,36.74h2.75c10.18,0,18.53-2,18.53-13.86,0-11.66-8.24-13.64-18.3-13.64h-3v27.5Zm0,37h8.24c9.95,0,20.36-2.86,20.36-14.63s-12.35-14.08-22-14.08h-6.63V1574Z"/><path class="cls-2" d="M2612.43,1500.34h12.35l21.16,35.42,21.16-35.42h12.35l-28.14,46.86v36.08h-10.75V1547.2Z"/><path class="cls-2" d="M2035.07,1645.34h43.65l33.5,60.87,33.27-60.87h43.88v165.15h-42v-93l-35.16,61.34h-.7L2076.36,1718v92.48h-41.29Z"/><path class="cls-2" d="M2203.28,1645.34H2317v37.28h-71.72v27.13h64.65v35.15h-64.65v28.31h72.66v37.28H2203.28Z"/><path class="cls-2" d="M2327.14,1645.34h54.26c53.08,0,83.28,32.08,83.28,80.69v2.83c0,48.6-30.43,81.63-84,81.63h-53.56V1645.34Zm42.47,38v89.18h12.27c23.59,0,39.4-13.92,39.4-43.41V1727c0-29.73-15.81-43.65-39.4-43.65Z"/><path class="cls-2" d="M2474.59,1645.34h42.46v165.15h-42.46Z"/><path class="cls-2" d="M2578.63,1644.39h42.94l58.27,166.09h-44.59l-9.67-29.73h-51.9l-9.44,29.73h-43.65ZM2615,1746.78l-15.34-48.36-15.34,48.36Z"/><path class="cls-2" d="M1847.41,1810.75v-35.48h98v35.48Zm89.67-65.94v-35.48h-89.66v35.48Zm8.32-65.94v-35.48h-98v35.48Zm-206.59,41.39-27.61,46c4.78-9.83-2.93-15-7.74-16.49-8.08-3.1-33.43-8.09-49.88-12.9a63.26,63.26,0,0,1-18-8.36,44.17,44.17,0,0,1-18.69-36.26c0-10.21,5.09-51.56,68.51-51.56,52.13,0,66.28,30.48,67.52,48.71h-42.65c-1.51-6.64-7.5-14.45-25.8-14.56-4.22,0-21.13.44-22.77,11.42a9.87,9.87,0,0,0,3.95,9.8c2.62,2,7.31,3.07,9,3.58,7.71,2.32,24.59,5.57,32.89,7.61C1722,1710.77,1732.35,1715.14,1738.81,1720.26Zm-53.68,55.36c-16.77,0-27.73-4.28-31.31-21.54h-43.13c0,6.91,3.62,36.25,29.87,48.56,14.7,6.9,31.12,8.12,43.89,8.12l26.36-43.87C1709,1769.37,1705.32,1775.62,1685.13,1775.62Z"/><path class="cls-12" d="M1847.41,1643.39H1785l-46.19,76.87-27.61,46-.4.67-26.36,43.87h44.49l21.33-35.5h58v35.5h39.2V1643.39Zm-39.19,101.38h-39.65l39.65-66Z"/><path class="cls-12" d="M2680.64,1960.54H1635.71V1841.23H2680.64ZM1945.55,1932a39.4,39.4,0,0,0,23.9-8.09v-31.06h-26v12.92h10.32v9.67a13.43,13.43,0,0,1-7.53,1.95c-8.37,0-14.79-6.6-14.79-18.51v-.93c0-10.79,6.32-18,14.6-18,5.58,0,9.3,2.32,12.74,5.39l9.3-12.74a33.4,33.4,0,0,0-22.41-7.91c-18,0-31.34,13.58-31.34,33.11v1.3C1914.3,1919.42,1927.79,1932,1945.55,1932Zm78.83-1.12H2041v-20.18h6l11.06,20.18h18.88l-13.39-23.62c6.88-3.44,11.62-9.49,11.62-19.16v-.46c0-6.6-2-11.63-5.67-15.25-4.19-4.28-10.79-6.6-19.53-6.6h-25.57Zm16.65-33.47v-17h8.18c5.58,0,9.12,2.79,9.12,8.37v.19c0,5.21-3.35,8.46-9,8.46Zm116.41,34.68c17.48,0,30.23-13.67,30.23-33.11v-1.4c0-19.53-12.56-33-30.13-33s-30.23,13.67-30.23,33.11v1.4C2127.31,1918.58,2139.86,1932.06,2157.44,1932.06Zm.09-15.15c-7.72,0-13.12-6.88-13.12-18.13v-1c0-11.25,5.3-18,13-18s13.11,6.88,13.11,18.13v1C2170.55,1910.12,2165.34,1916.91,2157.53,1916.91ZM2267.61,1932c15.9,0,26.59-8.28,26.59-27.15v-39.06h-16.92v39.8c0,7.72-3.72,11.25-9.58,11.25s-9.58-3.72-9.58-11.53v-39.52h-16.83v39.34C2241.29,1923.6,2251.71,1932,2267.61,1932Zm82.09-1.12h16.65V1912h6.41c14.23-.19,25.58-7.62,25.58-23.25v-.37c0-14.6-10.05-22.6-25.39-22.6H2349.7Zm16.65-32.54v-18.23h5.77c6,0,9.48,3.07,9.48,9v.28c0,5.49-3.53,8.93-9.39,8.93Z"/><path class="cls-12" d="M2696.31,1845h-7.26v-3.71h18.52V1845h-7.26v19.08h-4Z"/><path class="cls-12" d="M2711.73,1841.28H2716l6.94,10.78,6.93-10.78h4.27v22.79h-4v-16.35l-7.2,10.75h-.13l-7.13-10.68v16.28h-3.94v-22.79Z"/></g></g></g></svg></a></div></div></div> <div class="principal-sponsors col-xl-4 col-lg-4 col-md-5 col-sm-6 col-xs-7 col-6 mx-auto bg-light"> <div class="d-flex flex-column "> <div class="principal-sponsors-header mx-auto pt-3 mb-0"> <div class="d-flex justify-content-center"> <h3 class="text-primary">PLATINUM SPONSORS</h3></div></div> <div> <img src='https://res.cloudinary.com/tbmg/f_auto,q_auto:best/v1614086394/ctf/extra/sponsors/sponsors_merged_2021.png' class=' lazyload blur-up' width='725' height='236' alt='Platinum Sponsors' /></div></div></div> <div class="col-xl-2 col-lg-2 col-md-2 d-md-block d-none"> <div class="d-flex flex-row-reverse"> <div id="login-menu" class="navbar-collapse collapse"> <ul class="navbar-nav ms-auto"><li class="nav-item"> <a class="nav-link" href="#" data-bs-toggle="modal" data-bs-target="#cb-form">Login</a></li> <li class="nav-item"> <a class="nav-link" href="/account/registration">Sign Up</a></li></ul></div></div></div></div> </nav> <nav class="main-nav bg-navbar navbar navbar-expand-sm navbar-light main-nav py-0"> <div class="main-nav-container container-xl mx-auto px-0"><div class="menu-top-nav"> <ul class="nav navbar-nav nav-bottom flex-nowrap d-md-flex d-none mx-auto"> <li class="nav-item"> <a class="nav-link " href="/how-to-vote">How to Vote</a></li></ul></div><div class="menu-top-nav"> <ul class="nav navbar-nav nav-bottom flex-nowrap d-md-flex d-none mx-auto"> <li class="nav-item"> <a class="nav-link " href="/about">About</a></li> <li class="nav-item"> <a class="nav-link " href="/contest-rules">Rules & Tips</a></li> <li class="nav-item"> <a class="nav-link " href="/2024/entries">Entries</a></li> <li class="nav-item"> <a class="nav-link " href="/archive">Archive</a></li> <li class="nav-item"> <a class="nav-link " href="/prizes">Prizes</a></li> <li class="nav-item"> <a class="nav-link " href="/faqs">FAQs</a></li> <li class="nav-item"> <a class="nav-link contact-us" href="#contactus">Contact</a></li></ul></div><div id="navbarSideContainer" class="navbar-side h-100 p-0 bg-light"> <ul class="nav flex-column nav"> <li id="navbar-side-close" class="nav-item text-right bg-secondary"> <a class="nav-link pb-0" href="#"> <i class="fas fa-2x fa-window-close"></i> </a></li> <li class="nav-item bg-secondary"><form id="searchform" class="form-inline nav-link w-75" action="/search" method="get"> <div class="input-group"> <input type="text" name="q" placeholder="Search" id="searchbox" class="form-control" value=""> <div class="input-group-append"> <button class="btn btn-primary" type="button" onclick="$('#searchform').submit()"> <span class="fas fa-search"></span> </button></div></div></form></li><li class="nav-item"> <a class="nav-link" href="#" data-bs-toggle="modal" data-bs-target="#cb-form">Login</a></li> <li class="nav-item"> <a class="nav-link" href="/account/registration">Sign Up</a></li> <!--<hr class="border border-secondary w-75">--> <hr class="border-secondary m-0 w-100"> <li class="nav-item"> <a class="nav-link" href="/how-to-vote">How to Vote</a></li><hr class="border-secondary m-0 w-100"> <li class="nav-item"> <a class="nav-link" href="/about">About</a></li> <li class="nav-item"> <a class="nav-link" href="/contest-rules">Rules & Tips</a></li> <li class="nav-item"> <a class="nav-link" href="/2024/entries">Entries</a></li> <li class="nav-item"> <a class="nav-link" href="/archive">Archive</a></li> <li class="nav-item"> <a class="nav-link" href="/prizes">Prizes</a></li> <li class="nav-item"> <a class="nav-link" href="/faqs">FAQs</a></li> <li class="nav-item"> <a class="nav-link" href="#contactus">Contact</a></li></ul></div><div class="overlay"></div></div> </nav></div> </header> <section id="print-only-message" class="printmessage"> </section> <!--googleon: all--> <div class="container"> <nav aria-label="breadcrumb"> <ol itemscope itemtype="https://schema.org/BreadcrumbList" class="breadcrumb pt-3 text-uppercase"> <li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> <a itemprop="item" href="/" class="pathway"><span itemprop="name">Home</span></a> <meta itemprop="position" content="1"></li> <li class="breadcrumb-item active" aria-current="page"> <span itemprop="name"> 2024</span> <meta itemprop="position" content="2"></li></ol> </nav> <!-- Main story section --> <section id="content" class="row my-3"> <section id="mainstory" class="left-column col-lg-8 col-md-7 .col-12"> <div> <!--googleoff: all--> <div id="system-message-container"></div> <!--googlon: all--> <article class="item-page" itemscope itemtype="https://schema.org/Article"> <meta itemprop="inLanguage" content="en-GB"/> <div class="card article"> <div class="card-header bg-primary"> <h2 class="font-weight-normal text-white mb-0 " itemprop="headline"> 2024 Create the Future Contest</h2></div><aside class="ms-auto me-2 mt-1 mb-0 d-inline-block"> <ul class="list-inline mb-0"> <li class="list-inline-item"> <a href="https://www.shareaholic.com/api/share/?apikey=18e410eb5fc79f84f064431251ed4713&apitype=1&v=1&service=facebook&link=https://contest.techbriefs.com/2024&title=2024+Create+the+Future+Contest" rel="nofollow" target="_blank"><i class="fa-brands fa-facebook text-secondary"></i></a></li> <li class="list-inline-item"> <i class=""></i> <a href="https://www.shareaholic.com/api/share/?apikey=18e410eb5fc79f84f064431251ed4713&apitype=1&v=1&service=twitter&link=https://contest.techbriefs.com/2024&title=2024+Create+the+Future+Contest" rel="nofollow" target="_blank"><i class="fa-brands fa-x-twitter text-secondary"></i></a></li> <li class="list-inline-item"> <a href="https://www.shareaholic.com/api/share/?apikey=18e410eb5fc79f84f064431251ed4713&apitype=1&v=1&service=linkedin&link=https://contest.techbriefs.com/2024&title=2024+Create+the+Future+Contest" rel="nofollow" target="_blank"><i class="fa-brands fa-linkedin text-secondary"></i></a></li> <li class="list-inline-item"> <a href="#" onclick="$('html, body').animate({scrollTop:($('#disqus_thread').offset().top)},500);"><i class="fa-duotone fa-comment-alt text-secondary"></i></a></li></ul> </aside><div class="card-body article"> <div itemprop="articleBody"> <h3>2024 Entries</h3> <p>>> <a href="/2024/entries">All</a> <br />>> <a href="/2024/entries/aerospace-and-defense">Aerospace & Defense</a> <br />>> <a href="/2024/entries/automotive-transportation">Automotive/Transportation</a> <br />>> <a href="/2024/entries/medical">Medical</a><br />>> <a href="/2024/entries/electronics">Electronics</a><br />>> <a href="/2024/entries/manufacturing-and-materials">Manufacturing & Materials</a><br />>> <a href="/2024/entries/robotics-and-automation">Robotics & Automation</a> <br />>> <a href="/2024/entries/sustainable-technology">Sustainable Technology</a></p> <h3>2024 Participants</h3> <p>>> <a href="/2024/entrants">Entrants</a> <!---<br />>> <a href="/2024/judges">Judges</a>---> </p> <h3>2024 Results</h3> <p><em>To be announced</em></p> <p> <!-- >><p>>> <a href="/2024/top-votes">Top Votes</a> <br /> >> <a href="/2024/winners">Winners</a> <br /> >> <a href="/2024/top-100">Top 100</a><br /> <a href="/2024/press-release">Press Release</a> --> </p></div></div></div> </article></div> </section> <!--googleoff: all--> <section id="sidebar" class="right-column col-lg-4 col-md-5 d-md-block d-none"> <div><div class="module card text-center mb-3"> <div class="card-header py-1"> <h4>View Entries by</h4></div> <div id="mod-custom260" class="mod-custom custom"> <div class="card-body"> <h4>Contest Category</h4></div> <ul class="list-group list-group-flush"> <li class="list-group-item"><a href="/2024/entries/aerospace-and-defense/by-date">Aerospace & Defense</a></li> <li class="list-group-item"><a href="/2024/entries/automotive-transportation/by-date">Automotive/Transportation</a></li> <li class="list-group-item"><a href="/2024/entries/medical/by-date">Medical</a></li> <li class="list-group-item"><a href="/2024/entries/electronics/by-date">Electronics</a></li> <li class="list-group-item"><a href="/2024/entries/manufacturing-and-materials/by-date">Manufacturing & Materials</a></li> <li class="list-group-item"><a href="/2024/entries/robotics-and-automation/by-date">Robotics & Automation</a></li> <li class="list-group-item"><a href="/2024/entries/sustainable-technology/by-date">Sustainable Technology</a></li></ul> <div class="card-body"> <h4>Also</h4></div> <ul class="list-group list-group-flush"> <li class="list-group-item"><a href="/tags">Tag Cloud</a></li> <li class="list-group-item"><a href="/2024/entrants">2024 Entrants</a></li> <li class="list-group-item"><a href="/2024/top-votes">Number of Votes</a></li> <li class="list-group-item"><a href="/2024/entries/by-views">Number of Page Views</a></li> <li class="list-group-item"><a href="/2024/entries">View All Entries</a></li></ul></div></div> <div class="module card text-center mb-3"> <div class="card-header py-1"> <h4>2024 Contest Results</h4></div> <div id="mod-custom216" class="mod-custom custom"> <ul class="list-group list-group-flush"> <li class="list-group-item"><a href="/2024/winners">Grand Prize & Category Winners</a></li> <li class="list-group-item"><a href="/2024/top-100">Top 100 Entries</a></li> <li class="list-group-item"><a href="/2024/entries">Browse All the Entries</a></li> <li class="list-group-item"><a href="/2024/top-votes">Final Voting Scoreboard</a></li> <li class="list-group-item"><a href="/2024/judges">Meet the Judges </a></li></ul></div></div> <div class="_right"> <h3>Follow Us</h3> <div id="ctf_followus" class="mt-3"> <a class="text-info fs-5" href="https://www.shareaholic.com/v2/follow/?apikey=18e410eb5fc79f84f064431251ed4713&service_nickname=facebook&username=CreateTheFutureContest" rel="nofollow" target="_blank"><i class="fa-brands fa-facebook fa-2xl"></i></a> <a class="text-info fs-5 ms-4" href="https://www.shareaholic.com/v2/follow/?apikey=18e410eb5fc79f84f064431251ed4713&service_nickname=twitter&username=CTFcontest" rel="nofollow" target="_blank"><i class="fa-brands fa-twitter fa-2xl"></i></a> <a class="text-info fs-5 ms-4" href="https://www.shareaholic.com/v2/follow/?apikey=18e410eb5fc79f84f064431251ed4713&service_nickname=linkedin_company&username=sae-media-group" rel="nofollow" target="_blank"><i class="fa-brands fa-linkedin fa-2xl"></i></a></div></div></div> </section> <!--googlon: all--> </section> <!--googleoff: all--> <div id="footer"> <footer> <div class="loginbar"> <div id="cb-form" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true" > <div class="modal-dialog modal-sm mt-5" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Sign In</h5> <button type="button" class="btn btn-secondary" data-bs_dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button></div> <div class="modal-body"> <form action="https://contest.techbriefs.com/account/login" method="post" id="login-form" class="form-inline cbLoginForm" data-bs-target="#cb-form"> <input type="hidden" name="option" value="com_comprofiler"/> <input type="hidden" name="view" value="login"/> <input type="hidden" name="op2" value="login"/> <input type="hidden" name="return" value="B:aHR0cHM6Ly9jb250ZXN0LnRlY2hicmllZnMuY29tLzIwMjQ="/> <input type="hidden" name="message" value="0"/> <input type="hidden" name="loginfrom" value="loginmodule"/> <input type="hidden" name="870c1934c9a8e5dd31dcbb27def6f297" value="1" /> <div class="form-group mb-3 w-100"> <input name="username" type="username" class="form-control col-8" id="inputUserName" aria-describedby="userNameHelp" placeholder="Username"></div> <div class="form-group mb-3 w-100"> <input name="passwd" type="password" class="form-control col-8" id="inputPassword" placeholder="Password"></div> <button type="submit" class="btn btn-primary offset-2 col-8 mb-3">Submit <i class="fas fa-sign-in"></i></button> <a href="https://contest.techbriefs.com/account/forgot-login" class=" offset-2 col-8"> <span class="fas fa-unlock-alt"></span></span> Forgot Login? </a></form></div></div></div></div></div> <div class=" notify"> <div id="mod-custom142" class="mod-custom custom"> <p> Contest Notifications: <a href="/2023/winners">Click here for the full list of 2023 winning entries</a></p></div></div> <div class=""> <ul class="mod-menu mod-list nav "> <li class="nav-item item-10"><a href="https://www.saemediagroup.com/" >© 2024 SAE Media Group</a></li><li class="nav-item item-9"><a href="/privacy" class="ms-3">Privacy Policy</a></li><li class="nav-item item-854"><a href="https://status.saemediagroup.com/" class="ms-3">Service Status</a></li></ul></div> </footer> <!-- End of footer --> </div> <!--googleon: all--> </div> <!--googleoff: all--> <script src="https://cdnjs.cloudflare.com/ajax/libs/cloudinary-core/2.13.1/cloudinary-core-shrinkwrap.min.js" tb-donotmove crossorigin="anonymous" referrerpolicy="no-referrer" integrity="sha512-stp48jOOmT4TXnB4bMJ0rlcR7XagE92cqr7pEb+oFQox6qNSyKiN31GajDsg5VVn+HgM5mhOZinSRXowsRmgPg=="></script><script src="https://kit.fontawesome.com/796c614b26.js" tb-donotmove async crossorigin="anonymous" referrerpolicy="no-referrer"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/masonry/4.2.2/masonry.pkgd.min.js" tb-donotmove async crossorigin="anonymous" referrerpolicy="no-referrer" integrity="sha512-JRlcvSZAXT8+5SQQAvklXGJuxXTouyq8oIMaYERZQasB8SBDHZaUbeASsJWpk0UUrf89DP3/aefPPrlMR1h1yQ=="></script><script src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.3.2/lazysizes.min.js" tb-donotmove async crossorigin="anonymous" referrerpolicy="no-referrer" integrity="sha512-q583ppKrCRc7N5O0n2nzUiJ+suUv7Et1JGels4bXOaMFQcamPk9HjdUknZuuFjBNs7tsMuadge5k9RzdmO+1GQ=="></script><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" tb-donotmove crossorigin="anonymous" referrerpolicy="no-referrer" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g=="></script><script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.3/js/bootstrap.bundle.min.js" tb-donotmove crossorigin="anonymous" referrerpolicy="no-referrer" integrity="sha512-i9cEfJwUwViEPFKdC1enz4ZRGBj8YQo6QByFTF92YXHi7waCqyexvRD75S5NVTsSiTv7rKWqG9Y5eFxmRsOn0A=="></script><script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.14.0-beta3/js/bootstrap-select.min.js" defer tb-donotmove crossorigin="anonymous" referrerpolicy="no-referrer" integrity="sha512-yrOmjPdp8qH8hgLfWpSFhC/+R9Cj9USL8uJxYIveJZGAiedxyIxwNw4RsLDlcjNlIRR4kkHaDHSmNHAkxFTmgg=="></script><script type="text/javascript" tb-donotmove> $(function () { var cl = cloudinary.Cloudinary.new({ cloud_name: "tbmg" }); cl.config({ defaultBreakpoints: [100,200,400,500,800,1000,1200], responsive_use_breakpoints: true, }); cl.responsive(); }); var match_md_max = window.matchMedia("(max-width: 991px)"); $(function () { var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl) }) }); </script> <link rel="preload" href="https://cdn.shareaholic.net/assets/pub/shareaholic.js" as="script"/> <meta name="shareaholic:site_id" content="18e410eb5fc79f84f064431251ed4713"/> <script data-cfasync="false" async src="https://cdn.shareaholic.net/assets/pub/shareaholic.js"></script> <script tb-donotmove> window.fwSettings = { 'widget_id': 30000000144 }; !function () { if ("function" != typeof window.FreshworksWidget) { var n = function () { n.q.push(arguments) }; n.q = [], window.FreshworksWidget = n } }() </script> <script type='text/javascript' src='https://widget.freshworks.com/widgets/30000000144.js' async defer tb-donotmove> </script> <script src="/media/system/js/core.js" tb-donotmove></script> <!--googleon: all--> <!-- moved to end by ntb_minifier --> <link href="https://olytics.omeda.com/olytics/css/v3/p/olytics.css" rel="stylesheet" /> <link href="/components/com_comprofiler/plugin/templates/default/bootstrap.min.css?v=49a2bdfe30936590" rel="stylesheet" /> <link href="/components/com_comprofiler/plugin/templates/default/fontawesome.min.css?v=49a2bdfe30936590" rel="stylesheet" /> <link href="/components/com_comprofiler/plugin/templates/default/template.min.css?v=49a2bdfe30936590" rel="stylesheet" /> <script src="/media/system/js/core.js?37ffe4186289eba9c5df81bea44080aff77b9684"></script> <script src="/media/vendor/bootstrap/js/bootstrap-es5.min.js?5.3.2" nomodule defer></script> <script src="/media/vendor/bootstrap/js/tab.min.js?5.3.2" type="module"></script> <script src="/media/vendor/bootstrap/js/popover.min.js?5.3.2" type="module"></script> <script src="/media/vendor/bootstrap/js/modal.min.js?5.3.2" type="module"></script> <script src="/media/vendor/bootstrap/js/dropdown.min.js?5.3.2" type="module"></script> <script src="/media/vendor/bootstrap/js/carousel.min.js?5.3.2" type="module"></script> <link rel="stylesheet" href="/templates/ctf_2019/css/template.min.css?t=1716788610" crossorigin="anonymous" referrerpolicy="no-referrer" integrity="sha512-F9gZzNqGLMtFzYq2oxq8kTyzLIjCuSsA2lb2mTTPvqkKnEZ0oqTEpujAJ5zywetxQT4izs4tIjAWmpw/QYCXPQ=="/> <script src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.3.2/plugins/print/ls.print.min.js" defer crossorigin="anonymous" referrerpolicy="no-referrer" integrity="sha512-tY3D/iSWSdQE2NSLW/mRWQd/bvHAGjyCLRwSd23sqNbbgVnUaah2t+ZpX7hdBOskZ7PqYvwe4E+qxNARGojJGQ=="></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/limonte-sweetalert2/11.14.5/sweetalert2.all.min.js" crossorigin="anonymous" referrerpolicy="no-referrer" integrity="sha512-m4zOGknNg3h+mK09EizkXi9Nf7B3zwsN9ow+YkYIPZoA6iX2vSzLezg4FnW0Q6Z1CPaJdwgUFQ3WSAUC4E/5Hg=="></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.14.0-beta3/css/bootstrap-select.min.css" media="print" onload="this.media='all'" crossorigin="anonymous" referrerpolicy="no-referrer" integrity="sha512-g2SduJKxa4Lbn3GW+Q7rNz+pKP9AWMR++Ta8fgwsZRCUsawjPvF/BxSMkGS61VsR9yinGoEgrHPGPn2mrj8+4w=="/> <!-- inline scripts moved by ntb_minifier --> <script> /*! inlined from /media/system/js/keepalive-es5.min.js by ntb_minifier */ (function(){'use strict';if(!window.Joomla){throw new Error('Joomla API was not properly initialised');} var keepAliveOptions=Joomla.getOptions('system.keepalive');var keepAliveInterval=keepAliveOptions&&keepAliveOptions.interval?parseInt(keepAliveOptions.interval,10):45*1000;var keepAliveUri=keepAliveOptions&&keepAliveOptions.uri?keepAliveOptions.uri.replace(/&/g,'&'):'';if(keepAliveUri===''){var systemPaths=Joomla.getOptions('system.paths');keepAliveUri=(systemPaths?systemPaths.root+"/index.php":window.location.pathname)+"?option=com_ajax&format=json";} setInterval(function(){return fetch(keepAliveUri,{method:'POST'});},keepAliveInterval);})(); /*! inlined from /media/plg_system_webauthn/js/login.min.js by ntb_minifier */ window.Joomla=window.Joomla||{};((Joomla,document)=>{const interpolateParameters=(object,prefix='')=>{let encodedString='';Object.keys(object).forEach(prop=>{if(typeof object[prop]!=='object'){if(encodedString.length>0){encodedString+='&';} if(prefix===''){encodedString+=`${encodeURIComponent(prop)}=${encodeURIComponent(object[prop])}`;}else{encodedString+=`${encodeURIComponent(prefix)}[${encodeURIComponent(prop)}]=${encodeURIComponent(object[prop])}`;} return;} encodedString+=`${interpolateParameters(object[prop], prop)}`;});return encodedString;};const findField=(form,fieldSelector)=>{const elInputs=form.querySelectorAll(fieldSelector);if(!elInputs.length){return null;} return elInputs[0];};const lookForField=(outerElement,fieldSelector)=>{let elInput=null;if(!outerElement){return elInput;} const elElement=outerElement.parentElement;if(elElement.nodeName==='FORM'){elInput=findField(elElement,fieldSelector);return elInput;} const elForms=elElement.querySelectorAll('form');if(elForms.length){for(let i=0;i<elForms.length;i+=1){elInput=findField(elForms[i],fieldSelector);if(elInput!==null){return elInput;}}} return null;};const handleLoginError=message=>{Joomla.renderMessages({error:[message]});};const handleLoginChallenge=publicKey=>{const arrayToBase64String=a=>btoa(String.fromCharCode(...a));const base64url2base64=input=>{let output=input.replace(/-/g,'+').replace(/_/g,'/');const pad=output.length%4;if(pad){if(pad===1){throw new Error('InvalidLengthError: Input base64url string is the wrong length to determine padding');} output+=new Array(5-pad).join('=');} return output;};if(!publicKey.challenge){handleLoginError(Joomla.Text._('PLG_SYSTEM_WEBAUTHN_ERR_INVALID_USERNAME'));return;} publicKey.challenge=Uint8Array.from(window.atob(base64url2base64(publicKey.challenge)),c=>c.charCodeAt(0));if(publicKey.allowCredentials){publicKey.allowCredentials=publicKey.allowCredentials.map(data=>{data.id=Uint8Array.from(window.atob(base64url2base64(data.id)),c=>c.charCodeAt(0));return data;});} navigator.credentials.get({publicKey}).then(data=>{const publicKeyCredential={id:data.id,type:data.type,rawId:arrayToBase64String(new Uint8Array(data.rawId)),response:{authenticatorData:arrayToBase64String(new Uint8Array(data.response.authenticatorData)),clientDataJSON:arrayToBase64String(new Uint8Array(data.response.clientDataJSON)),signature:arrayToBase64String(new Uint8Array(data.response.signature)),userHandle:data.response.userHandle?arrayToBase64String(new Uint8Array(data.response.userHandle)):null}};const paths=Joomla.getOptions('system.paths');window.location=`${paths ? `${paths.base}/index.php` : window.location.pathname}?${Joomla.getOptions('csrf.token')}=1&option=com_ajax&group=system&plugin=webauthn&`+`format=raw&akaction=login&encoding=redirect&data=${btoa(JSON.stringify(publicKeyCredential))}`;}).catch(error=>{handleLoginError(error);});};Joomla.plgSystemWebauthnLogin=formId=>{const elFormContainer=document.getElementById(formId);const elUsername=lookForField(elFormContainer,'input[name=username]');const elReturn=lookForField(elFormContainer,'input[name=return]');if(elUsername===null){Joomla.renderMessages({error:[Joomla.Text._('PLG_SYSTEM_WEBAUTHN_ERR_CANNOT_FIND_USERNAME')]});return false;} const username=elUsername.value;const returnUrl=elReturn?elReturn.value:null;if(username===''){Joomla.renderMessages({error:[Joomla.Text._('PLG_SYSTEM_WEBAUTHN_ERR_EMPTY_USERNAME')]});return false;} const postBackData={option:'com_ajax',group:'system',plugin:'webauthn',format:'raw',akaction:'challenge',encoding:'raw',username,returnUrl};postBackData[Joomla.getOptions('csrf.token')]=1;const paths=Joomla.getOptions('system.paths');Joomla.request({url:`${paths ? `${paths.base}/index.php` : window.location.pathname}?${Joomla.getOptions('csrf.token')}=1`,method:'POST',data:interpolateParameters(postBackData),onSuccess(rawResponse){let jsonData={};try{jsonData=JSON.parse(rawResponse);}catch(e){} handleLoginChallenge(jsonData);},onError:xhr=>{handleLoginError(`${xhr.status} ${xhr.statusText}`);}});return false;};const loginButtons=[].slice.call(document.querySelectorAll('.plg_system_webauthn_login_button'));if(loginButtons.length){loginButtons.forEach(button=>{button.addEventListener('click',({currentTarget})=>{Joomla.plgSystemWebauthnLogin(currentTarget.getAttribute('data-webauthn-form'));});});}})(Joomla,document); /*! inlined from /media/mod_menu/js/menu-es5.min.js by ntb_minifier */ (function(){'use strict';(function(){function topLevelMouseOver(el,settings){var ulChild=el.querySelector('ul');if(ulChild){ulChild.setAttribute('aria-hidden','false');ulChild.classList.add(settings.menuHoverClass);}} function topLevelMouseOut(el,settings){var ulChild=el.querySelector('ul');if(ulChild){ulChild.setAttribute('aria-hidden','true');ulChild.classList.remove(settings.menuHoverClass);}} function setupNavigation(nav){var settings={menuHoverClass:'show-menu',dir:'ltr'};var topLevelChilds=nav.querySelectorAll(':scope > li');topLevelChilds.forEach(function(topLevelEl){var linkEl=topLevelEl.querySelector('a');if(linkEl){linkEl.tabIndex='0';linkEl.addEventListener('mouseover',topLevelMouseOver(topLevelEl,settings));linkEl.addEventListener('mouseout',topLevelMouseOut(topLevelEl,settings));} var spanEl=topLevelEl.querySelector('span');if(spanEl){spanEl.tabIndex='0';spanEl.addEventListener('mouseover',topLevelMouseOver(topLevelEl,settings));spanEl.addEventListener('mouseout',topLevelMouseOut(topLevelEl,settings));} topLevelEl.addEventListener('mouseover',function(_ref){var target=_ref.target;var ulChild=target.querySelector('ul');if(ulChild){ulChild.setAttribute('aria-hidden','false');ulChild.classList.add(settings.menuHoverClass);}});topLevelEl.addEventListener('mouseout',function(_ref2){var target=_ref2.target;var ulChild=target.querySelector('ul');if(ulChild){ulChild.setAttribute('aria-hidden','true');ulChild.classList.remove(settings.menuHoverClass);}});topLevelEl.addEventListener('focus',function(_ref3){var target=_ref3.target;var ulChild=target.querySelector('ul');if(ulChild){ulChild.setAttribute('aria-hidden','true');ulChild.classList.add(settings.menuHoverClass);}});topLevelEl.addEventListener('blur',function(_ref4){var target=_ref4.target;var ulChild=target.querySelector('ul');if(ulChild){ulChild.setAttribute('aria-hidden','false');ulChild.classList.remove(settings.menuHoverClass);}});topLevelEl.addEventListener('keydown',function(event){var keyName=event.key;var curEl=event.target;var curLiEl=curEl.parentElement;var curUlEl=curLiEl.parentElement;var prevLiEl=curLiEl.previousElementSibling;var nextLiEl=curLiEl.nextElementSibling;if(!prevLiEl){prevLiEl=curUlEl.children[curUlEl.children.length-1];} if(!nextLiEl){var _curUlEl$children=curUlEl.children;nextLiEl=_curUlEl$children[0];} switch(keyName){case'ArrowLeft':event.preventDefault();if(settings.dir==='rtl'){nextLiEl.children[0].focus();}else{prevLiEl.children[0].focus();} break;case'ArrowRight':event.preventDefault();if(settings.dir==='rtl'){prevLiEl.children[0].focus();}else{nextLiEl.children[0].focus();} break;case'ArrowUp':{event.preventDefault();var parent=curLiEl.parentElement.parentElement;if(parent.nodeName==='LI'){parent.children[0].focus();}else{prevLiEl.children[0].focus();} break;} case'ArrowDown':event.preventDefault();if(curLiEl.classList.contains('parent')){var child=curLiEl.querySelector('ul');if(child!=null){var childLi=child.querySelector('li');childLi.children[0].focus();}else{nextLiEl.children[0].focus();}}else{nextLiEl.children[0].focus();} break;}});});} document.addEventListener('DOMContentLoaded',function(){var navs=document.querySelectorAll('.nav');[].forEach.call(navs,function(nav){setupNavigation(nav);});});})();})();(function(){var cx='015407278790088682131:yshqqymtj30';var gcse=document.createElement('script');gcse.type='text/javascript';gcse.async=true;gcse.src=(document.location.protocol=='https:'?'https:':'http:')+'//www.google.com/cse/cse.js?cx='+cx;var s=document.getElementsByTagName('script')[0];s.parentNode.insertBefore(gcse,s);})();window.olytics||(window.olytics=[]),window.olytics.methods=["fire","confirm"],window.olytics.factory=function(i){return function(){var t=Array.prototype.slice.call(arguments);return t.unshift(i),window.olytics.push(t),window.olytics}};for(var i=0;i<window.olytics.methods.length;i++){var method=window.olytics.methods[i];window.olytics[method]=window.olytics.factory(method)} olytics.load=function(i){if(!document.getElementById("olyticsImport")){window.a=window.olytics;var t=document.createElement("script");t.async=!0,t.id="olyticsImport",t.type="text/javascript";var o="";void 0!==i&&void 0!==i.oid&&(o=i.oid),t.setAttribute("data-oid",o),t.src="https://olytics.omeda.com/olytics/js/v3/p/olytics.min.js",t.addEventListener("load",function(t){for(olytics.initialize({Olytics:i});window.a.length>0;){var o=window.a.shift(),s=o.shift();olytics[s]&&olytics[s].apply(olytics,o)}},!1);var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(t,s)}},olytics.load({oid:"c1d61b8c10b7440fb3c59fe5b6424a6b"});$(document).ready(function(){olytics.fire({behaviorId:'7566A8018245A8G',category:'Article,2024',tag:''});});$(document).ready(function(){$('#cb-form').on('shown.bs.modal',function(){$('#inputUserName').focus();})});var _extraWatchParams=_extraWatchParams||[];_extraWatchParams.projectId='db832384-b716-4141-b539-b453c5613e25';(function(){var ew=document.createElement('script');ew.type='text/javascript';ew.async=true;ew.src='https://agent.extrawatch.com/agent/js/ew.js';var s=document.getElementsByTagName('script')[0];s.parentNode.insertBefore(ew,s);})();FreshworksWidget('hide','launcher');FreshworksWidget('identify','ticketForm',{name:'',email:'',});FreshworksWidget('prefill','ticketForm',{group_id:30000055696,});FreshworksWidget('hide','ticketForm',['group_id']);$(function(){$("a.contact-us").click(function(){FreshworksWidget('open');});}); /*! inlined from /templates/ctf_2019/js/custom.min.js by ntb_minifier */ $(window).scroll(function(){if($(document).scrollTop()>202){$('nav').addClass('shrink');$('.main-nav').addClass('main-nav-stick');$('body').addClass('body-pad');}else{$('nav').removeClass('shrink');$('.main-nav').removeClass('main-nav-stick');$('body').removeClass('body-pad');}});$(function(){function showNavbarSide(){$('#navbarSideContainer').addClass('reveal');$('.overlay').show();} function hideNavbarSide(){$('#navbarSideContainer').removeClass('reveal');$('.overlay').hide();} $('[id*=navbar-side-button]').on('click',function(){showNavbarSide();});$('[id*=search-side-button]').on('click',function(){showNavbarSide();$('#searchbox').focus();});$('.overlay').on('click',function(){hideNavbarSide();});$('#navbar-side-close').on('click',function(){hideNavbarSide();});});function checkWidth(){if($(window).width()>=768)$('.tb-filter-show').addClass("show");else $('.tb-filter-show').removeClass("show");} $(document).ready(checkWidth);$(window).resize(checkWidth); </script> <!-- JoomlaWorks "Disqus Comments (for Joomla)" (v3.7.0) --> <script>var disqus_config = function(){this.language = '';};</script> <script id="dsq-count-scr" src="//createthefuture.disqus.com/count.js" async></script> </body> </html>