diff --git a/searx/static/themes/oscar/css/logicodev.min.css.map b/searx/static/themes/oscar/css/logicodev.min.css.map
index a3e25d3cf..7a987dbc4 100644
--- a/searx/static/themes/oscar/css/logicodev.min.css.map
+++ b/searx/static/themes/oscar/css/logicodev.min.css.map
@@ -1 +1 @@
-{"version":3,"sources":["../../__common__/less/new_issue.less","../../__common__/less/stats.less","../src/less/logicodev/preferences.less","../../__common__/less/result_templates.less","../src/less/result_templates.less","../src/less/preferences.less","../src/less/infinite_scroll.less","../src/generated/pygments-logicodev.less","../src/less/logicodev/navbar.less","../src/less/logicodev/footer.less","../src/less/logicodev/checkbox.less","../src/less/logicodev/onoff.less","../src/less/logicodev/results.less","../src/less/logicodev/infobox.less","../src/less/logicodev/search.less","../src/less/logicodev/advanced.less","../src/less/logicodev/cursor.less","../src/less/logicodev/code.less","../src/less/safari.css"],"names":[],"mappings":"AAAA,qBACI,QAAA,MACA,QAAA,IAAA,KACA,YAAA,WACA,UAAA,KACA,MAAA,KACA,iBAAA,kBACA,OAAA,QACA,cAAA,eACA,WAAA,YAAA,EAAA,EAAA,EAAA,EAGgB,2BAChB,iBAAA,QAGJ,YACI,QAAA,KCfA,2BACI,MAAA,MAGJ,4BACI,MAAA,KACA,WAAA,MASJ,kCACI,WAAA,MAGC,iCACD,UAAA,OACA,OAAA,KACA,OAAA,IAAA,MAAA,KAKJ,0BADqB,sDADA,sDAGjB,MAAA,MAGmB,qDAEnB,aAAA,IAAA,MAAA,KACA,QAAA,EAAA,KAAA,EAAA,EACA,OAAA,EAAA,EAAA,EAAA,MAIR,iBACI,MAAA,IACA,QAAA,aACA,WAAA,MACA,cAAA,MAGJ,iBACI,MAAO,kBACP,QAAA,aAGJ,eACI,OAAA,IAAA,MAAA,QACA,OAAA,IAAA,EAGJ,kBACI,OAAA,IAAA,MAAA,QACA,OAAA,IAAA,EACA,MAAA,KAGJ,kBACI,OAAA,IAAA,MAAA,QACA,OAAA,IAAA,EACA,MAAA,KAGJ,MACI,MAAA,EACA,OAAA,ECxEH,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,QD+EO,MAAA,KE/ER,aACI,OAAA,MACA,MAAA,KACA,OAAA,KAAA,ECHJ,qBACI,MAAA,KACA,WAAA,KACA,WAAA,KCHJ,UACI,MAAA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"}
\ No newline at end of file
+{"version":3,"sources":["../../__common__/less/new_issue.less","../../__common__/less/stats.less","../src/less/logicodev/onoff.less","../../__common__/less/result_templates.less","../src/less/result_templates.less","../src/less/preferences.less","../src/less/infinite_scroll.less","../src/generated/pygments-logicodev.less","../src/less/logicodev/navbar.less","../src/less/logicodev/footer.less","../src/less/logicodev/checkbox.less","../src/less/logicodev/results.less","../src/less/logicodev/infobox.less","../src/less/logicodev/search.less","../src/less/logicodev/advanced.less","../src/less/logicodev/cursor.less","../src/less/logicodev/code.less","../src/less/logicodev/preferences.less","../src/less/safari.css"],"names":[],"mappings":"AAAA,qBACI,QAAA,MACA,QAAA,IAAA,KACA,YAAA,WACA,UAAA,KACA,MAAA,KACA,iBAAA,kBACA,OAAA,QACA,cAAA,eACA,WAAA,YAAA,EAAA,EAAA,EAAA,EAGgB,2BAChB,iBAAA,QAGJ,YACI,QAAA,KCfA,2BACI,MAAA,MAGJ,4BACI,MAAA,KACA,WAAA,MASJ,kCACI,WAAA,MAGC,iCACD,UAAA,OACA,OAAA,KACA,OAAA,IAAA,MAAA,KAKJ,0BADqB,sDADA,sDAGjB,MAAA,MAGmB,qDAEnB,aAAA,IAAA,MAAA,KACA,QAAA,EAAA,KAAA,EAAA,EACA,OAAA,EAAA,EAAA,EAAA,MAIR,iBACI,MAAA,IACA,QAAA,aACA,WAAA,MACA,cAAA,MAGJ,iBACI,MAAO,kBACP,QAAA,aAGJ,eACI,OAAA,IAAA,MAAA,QACA,OAAA,IAAA,EAGJ,kBACI,OAAA,IAAA,MAAA,QACA,OAAA,IAAA,EACA,MAAA,KAGJ,kBACI,OAAA,IAAA,MAAA,QACA,OAAA,IAAA,EACA,MAAA,KAGJ,MACI,MAAA,EACA,OAAA,ECxEH,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,MD+EO,MAAA,GC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,OD+EO,MAAA,IC/EP,QD+EO,MAAA,KE/ER,aACI,OAAA,MACA,MAAA,KACA,OAAA,KAAA,ECHJ,qBACI,MAAA,KACA,WAAA,KACA,WAAA,KCHJ,UACI,MAAA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"}
\ No newline at end of file
diff --git a/searx/static/themes/simple/js/searxng.min.js b/searx/static/themes/simple/js/searxng.min.js
index 253920228..a17160961 100644
--- a/searx/static/themes/simple/js/searxng.min.js
+++ b/searx/static/themes/simple/js/searxng.min.js
@@ -4,7 +4,7 @@
  * (C) Copyright Contributors to the searx project (2014 - 2021).
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
-window.searxng=function(t,i){"use strict";if(t.Element){(function(e){e.matches=e.matches||e.matchesSelector||e.webkitMatchesSelector||e.msMatchesSelector||function(e){var t=this,n=(t.parentNode||t.document).querySelectorAll(e),r=-1;while(n[++r]&&n[r]!=t);return!!n[r]}})(Element.prototype)}function s(e,t,n){try{e.call(t,n)}catch(e){console.log(e)}}var a=window.searxng||{};a.on=function(r,e,o,t){t=t||false;if(typeof r!=="string"){r.addEventListener(e,o,t)}else{i.addEventListener(e,function(e){var t=e.target||e.srcElement,n=false;while(t&&t.matches&&t!==i&&!(n=t.matches(r)))t=t.parentElement;if(n)s(o,t,e)},t)}};a.ready=function(e){if(document.readyState!="loading"){e.call(t)}else{t.addEventListener("DOMContentLoaded",e.bind(t))}};a.http=function(r,o,i=null){return new Promise(function(e,t){try{var n=new XMLHttpRequest;n.open(r,o,true);n.timeout=2e4;n.onload=function(){if(n.status==200){e(n.response,n.responseType)}else{t(Error(n.statusText))}};n.onerror=function(){t(Error("Network Error"))};n.onabort=function(){t(Error("Transaction is aborted"))};n.ontimeout=function(){t(Error("Timeout"))};if(i){n.send(i)}else{n.send()}}catch(e){t(e)}})};a.loadStyle=function(e){var t=a.static_path+e,n="style_"+e.replace(".","_"),r=i.getElementById(n);if(r===null){r=i.createElement("link");r.setAttribute("id",n);r.setAttribute("rel","stylesheet");r.setAttribute("type","text/css");r.setAttribute("href",t);i.body.appendChild(r)}};a.loadScript=function(e,t){var n=a.static_path+e,r="script_"+e.replace(".","_"),o=i.getElementById(r);if(o===null){o=i.createElement("script");o.setAttribute("id",r);o.setAttribute("src",n);o.onload=t;o.onerror=function(){o.setAttribute("error","1")};i.body.appendChild(o)}else if(!o.hasAttribute("error")){try{t.apply(o,[])}catch(e){console.log(e)}}else{console.log("callback not executed : script '"+n+"' not loaded.")}};a.insertBefore=function(e,t){t.parentNode.insertBefore(e,t)};a.insertAfter=function(e,t){t.parentNode.insertAfter(e,t.nextSibling)};a.on(".close","click",function(){this.parentNode.classList.add("invisible")});function e(){for(var e of i.getElementsByTagName("body")[0].classList.values()){if(e.endsWith("_endpoint")){return e.split("_")[0]}}return""}a.endpoint=e();return a}(window,document);searxng.ready(function(){"use strict";searxng.infinite_scroll_supported="IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype;if(searxng.endpoint!=="results"){return}if(!searxng.infinite_scroll_supported){console.log("IntersectionObserver not supported");return}let i=document;var s=i.getElementById("results").classList.contains("only_template_images");function n(){var e=i.createElement("div");e.classList.add("loader");return e}function r(t,e){t.textContent="";e.forEach(e=>t.appendChild(e))}function o(o){var e=i.querySelector("#pagination form.next_page");if(!e){return}r(i.querySelector("#pagination"),[n()]);var t=new FormData(e);searxng.http("POST",i.querySelector("#search").getAttribute("action"),t).then(function(e){var t=(new DOMParser).parseFromString(e,"text/html");var n=t.querySelectorAll("#urls article");var r=t.querySelector("#pagination");i.querySelector("#pagination").remove();if(n.length>0&&!s){i.querySelector("#urls").appendChild(i.createElement("hr"))}n.forEach(e=>{i.querySelector("#urls").appendChild(e)});if(r){i.querySelector("#results").appendChild(r);o()}}).catch(function(e){console.log(e);var t=i.createElement("div");t.textContent=searxng.translations.error_loading_next_page;t.classList.add("dialog-error");t.setAttribute("role","alert");r(i.querySelector("#pagination"),[t])})}if(searxng.infinite_scroll&&searxng.infinite_scroll_supported){const a={rootMargin:"20rem"};const l="article.result:last-child";const u=new IntersectionObserver(e=>{const t=e[0];if(t.isIntersecting){u.unobserve(t.target);o(()=>u.observe(i.querySelector(l),a))}});u.observe(i.querySelector(l),a)}});searxng.ready(function(){function e(e){while(e!==undefined){if(e.classList.contains("detail")){return true}if(e.classList.contains("result")){return false}e=e.parentNode}return false}function n(e){while(e!==undefined){if(e.classList.contains("result")){return e}e=e.parentNode}return undefined}function r(e){return e&&e.classList.contains("result-images")}searxng.on(".result","click",function(t){if(!e(t.target)){o(this)(true);let e=n(t.target);if(r(e)){t.preventDefault();searxng.selectImage(e)}}});searxng.on(".result a","focus",function(t){if(!e(t.target)){let e=n(t.target);if(e&&e.getAttribute("data-vim-selected")===null){o(e)(true)}if(r(e)){searxng.selectImage(e)}}},true);var d={27:{key:"Escape",fun:i,des:"remove focus from the focused input",cat:"Control"},73:{key:"i",fun:p,des:"focus on the search input",cat:"Control"},66:{key:"b",fun:u(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},70:{key:"f",fun:u(window.innerHeight),des:"scroll one page down",cat:"Navigation"},85:{key:"u",fun:u(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},68:{key:"d",fun:u(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},71:{key:"g",fun:c(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},86:{key:"v",fun:c(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},75:{key:"k",fun:o("up"),des:"select previous search result",cat:"Results"},74:{key:"j",fun:o("down"),des:"select next search result",cat:"Results"},80:{key:"p",fun:l(),des:"go to previous page",cat:"Results"},78:{key:"n",fun:a(),des:"go to next page",cat:"Results"},79:{key:"o",fun:h(false),des:"open search result",cat:"Results"},84:{key:"t",fun:h(true),des:"open the result in a new tab",cat:"Results"},82:{key:"r",fun:t,des:"reload page from the server",cat:"Control"},72:{key:"h",fun:g,des:"toggle help window",cat:"Other"}};if(searxng.hotkeys){searxng.on(document,"keydown",function(e){if(Object.prototype.hasOwnProperty.call(d,e.keyCode)&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){var t=e.target.tagName.toLowerCase();if(e.keyCode===27){d[e.keyCode].fun(e)}else{if(e.target===document.body||t==="a"||t==="button"){e.preventDefault();d[e.keyCode].fun()}}}})}function o(d){return function(e){var t=document.querySelector(".result[data-vim-selected]"),n=d;if(t===null){t=document.querySelector(".result");if(t===null){return}if(d==="down"||d==="up"){n=t}}var r,o=document.querySelectorAll(".result");if(typeof n!=="string"){r=n}else{switch(n){case"visible":var i=document.documentElement.scrollTop||document.body.scrollTop;var s=i+document.documentElement.clientHeight;for(var a=0;a<o.length;a++){r=o[a];var l=r.offsetTop;var u=l+r.clientHeight;if(u<=s&&l>i){break}}break;case"down":r=t.nextElementSibling;if(r===null){r=o[0]}break;case"up":r=t.previousElementSibling;if(r===null){r=o[o.length-1]}break;case"bottom":r=o[o.length-1];break;case"top":default:r=o[0]}}if(r){t.removeAttribute("data-vim-selected");r.setAttribute("data-vim-selected","true");var c=r.querySelector("h3 a")||r.querySelector("a");if(c!==null){c.focus()}if(!e){f()}}}}function t(){document.location.reload(true)}function i(e){const t=e.target.tagName.toLowerCase();if(document.activeElement&&(t==="input"||t==="select"||t==="textarea")){document.activeElement.blur()}else{searxng.closeDetail()}}function s(t){return function(){var e=document.querySelector(t);if(e){e.click()}}}function a(){return s('nav#pagination .next_page button[type="submit"]')}function l(){return s('nav#pagination .previous_page button[type="submit"]')}function f(){var e=document.querySelector(".result[data-vim-selected]");if(e===null){return}var t=document.documentElement.scrollTop||document.body.scrollTop,n=document.documentElement.clientHeight,r=e.offsetTop,o=r+e.clientHeight,i=120;if(e.previousElementSibling===null&&o<n){window.scroll(window.scrollX,0);return}if(t>r-i){window.scroll(window.scrollX,r-i)}else{var s=t+n;if(s<o+i){window.scroll(window.scrollX,o-n+i)}}}function u(e){return function(){window.scrollBy(0,e);o("visible")()}}function c(e,t){return function(){window.scrollTo(0,e);o(t)()}}function p(){window.scrollTo(0,0);document.querySelector("#q").focus()}function h(n){return function(){var e=document.querySelector(".result[data-vim-selected] h3 a");if(e===null){e=document.querySelector(".result[data-vim-selected] > a")}if(e!==null){var t=e.getAttribute("href");if(n){window.open(t)}else{window.location.href=t}}}}function m(e){var n={};for(var t in d){var r=d[t];n[r.cat]=n[r.cat]||[];n[r.cat].push(r)}var o=Object.keys(n).sort(function(e,t){return n[t].length-n[e].length});if(o.length===0){return}var i='<a href="#" class="close" aria-label="close" title="close">×</a>';i+="<h3>How to navigate searx with Vim-like hotkeys</h3>";i+="<table>";for(var s=0;s<o.length;s++){var a=n[o[s]];var l=s===o.length-1;var u=s%2===0;if(u){i+="<tr>"}i+="<td>";i+="<h4>"+a[0].cat+"</h4>";i+='<ul class="list-unstyled">';for(var c in a){i+="<li><kbd>"+a[c].key+"</kbd> "+a[c].des+"</li>"}i+="</ul>";i+="</td>";if(!u||l){i+="</tr>"}}i+="</table>";e.innerHTML=i}function g(){var e=document.querySelector("#vim-hotkeys-help");if(e===undefined||e===null){e=document.createElement("div");e.id="vim-hotkeys-help";e.className="dialog-modal";m(e);m(e);m(e);var t=document.getElementsByTagName("body")[0];t.appendChild(e)}else{e.classList.toggle("invisible");return}}searxng.scrollPageToSelected=f;searxng.selectNext=o("down");searxng.selectPrevious=o("up")});(function(e,t,n){"use strict";n.ready(function(){n.on(".searxng_init_map","click",function(e){this.classList.remove("searxng_init_map");var d=this.dataset.leafletTarget;var f=parseFloat(this.dataset.mapLon);var p=parseFloat(this.dataset.mapLat);var h=parseFloat(this.dataset.mapZoom);var m=JSON.parse(this.dataset.mapBoundingbox);var g=JSON.parse(this.dataset.mapGeojson);n.loadStyle("css/leaflet.css");n.loadScript("js/leaflet.js",function(){var e=null;if(m){var t=L.latLng(m[0],m[2]);var n=L.latLng(m[1],m[3]);e=L.latLngBounds(t,n)}var r=L.map(d);var o="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";var i='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';var s=new L.TileLayer(o,{minZoom:1,maxZoom:19,attribution:i});var a="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png";var l='Wikimedia maps | Maps data © <a href="https://openstreetmap.org">OpenStreetMap contributors</a>';var u=new L.TileLayer(a,{minZoom:1,maxZoom:19,attribution:l});if(e){setTimeout(function(){r.fitBounds(e,{maxZoom:17})},0)}else if(f&&p){if(h){r.setView(new L.latLng(p,f),h)}else{r.setView(new L.latLng(p,f),8)}}r.addLayer(s);var c={"OSM Mapnik":s,"OSM Wikimedia":u};L.control.layers(c).addTo(r);if(g){L.geoJson(g).addTo(r)}});e.preventDefault()})})})(window,document,window.searxng);(function(e,i,s){"use strict";if(s.endpoint!=="preferences"){return}s.ready(function(){let o=null;function e(){if(o==null){s.http("GET","engine_descriptions.json").then(function(e){o=JSON.parse(e);for(const[t,n]of Object.entries(o)){let e=i.querySelectorAll('[data-engine-name="'+t+'"] .engine-description');for(const r of e){let e=" (<i>"+s.translations["Source"]+":&nbsp;"+n[1]+"</i>)";r.innerHTML=n[0]+e}}})}}for(const t of i.querySelectorAll("[data-engine-name]")){s.on(t,"mouseenter",e)}})})(window,document,window.searxng);(function(e,a,l){"use strict";if(l.endpoint!=="results"){return}l.ready(function(){a.querySelectorAll("#urls img.image").forEach(e=>e.addEventListener("error",()=>{e.style.display="none";e.error=null}));l.on(".btn-collapse","click",function(){var e=this.getAttribute("data-btn-text-collapsed");var t=this.getAttribute("data-btn-text-not-collapsed");var n=this.getAttribute("data-target");var r=a.querySelector(n);var o=this.innerHTML;if(this.classList.contains("collapsed")){o=o.replace(e,t)}else{o=o.replace(t,e)}this.innerHTML=o;this.classList.toggle("collapsed");r.classList.toggle("invisible")});l.on(".media-loader","click",function(){var e=this.getAttribute("data-target");var t=a.querySelector(e+" > iframe");var n=t.getAttribute("src");if(n===null||n===undefined||n===false){t.setAttribute("src",t.getAttribute("data-src"))}});l.selectImage=function(e){if(e){const t=e.querySelector(".result-images-source img");const n=e.querySelector(".image_thumbnail");const r=e.querySelector(".detail");if(t){const o=t.getAttribute("data-src");if(o){const i=a.createElement("div");const s=new Image;i.classList.add("loader");r.appendChild(i);s.onload=e=>{t.src=o;i.remove()};s.onerror=e=>{i.remove()};s.src=o;t.src=n.src;t.removeAttribute("data-src")}}}a.getElementById("results").classList.add("image-detail-open");l.scrollPageToSelected()};l.closeDetail=function(e){a.getElementById("results").classList.remove("image-detail-open");l.scrollPageToSelected()};l.on(".result-detail-close","click",e=>{e.preventDefault();l.closeDetail()});l.on(".result-detail-previous","click",e=>l.selectPrevious(false));l.on(".result-detail-next","click",e=>l.selectNext(false));e.addEventListener("scroll",function(){var e=a.getElementById("backToTop"),t=document.documentElement.scrollTop||document.body.scrollTop,n=a.getElementById("results");if(e!==null){if(t>=100){n.classList.add("scrolling")}else{n.classList.remove("scrolling")}}},true)})})(window,document,window.searxng);(function(t,n,r){"use strict";var o=true,i="q",s;function a(e){if(e.setSelectionRange){var t=e.value.length;e.setSelectionRange(t,t)}}function l(){if(s.value.length>0){var e=document.getElementById("search");setTimeout(e.submit.bind(e),0)}}function u(t){var e=document.getElementById("clear_search");var n=function(){if(t.value.length===0){e.classList.add("empty")}else{e.classList.remove("empty")}};n();e.addEventListener("click",function(e){t.value="";t.focus();n();e.preventDefault()});t.addEventListener("keyup",n,false)}r.ready(function(){s=n.getElementById(i);function e(){if(o){a(s);o=false}else{}}if(s!==null){u(s);if(r.autocompleter){r.autocomplete=AutoComplete.call(t,{Url:"./autocompleter",EmptyMessage:r.translations.no_item_found,HttpMethod:r.method,HttpHeaders:{"Content-type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},MinChars:4,Delay:300,_Position:function(){this.DOMResults.setAttribute("class","autocomplete");this.DOMResults.style.top=this.Input.offsetTop+this.Input.offsetHeight+"px";this.DOMResults.style.left=this.Input.offsetLeft+"px";this.DOMResults.style.width=this.Input.clientWidth+"px"},_Open:function(){var t=this;Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"),function(e){if(e.getAttribute("class")!="locked"){e.onmousedown=function(){t._Select(e)}}})}},"#"+i);t.addEventListener("resize",function(){var e=new CustomEvent("position");s.dispatchEvent(e)})}s.addEventListener("focus",e,false);s.focus()}if(s!==null&&n.querySelector(".help")!=null&&r.search_on_category_select){n.querySelector(".help").className="invisible";r.on("#categories input","change",function(){var e,t=n.querySelectorAll('#categories input[type="checkbox"]');for(e=0;e<t.length;e++){if(t[e]!==this&&t[e].checked){t[e].click()}}if(!this.checked){this.click()}l();return false});r.on(n.getElementById("safesearch"),"change",l);r.on(n.getElementById("time_range"),"change",l);r.on(n.getElementById("language"),"change",l)}})})(window,document,window.searxng);(function(e){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=e()}else if(typeof define==="function"&&define.amd){define([],e)}else{var t;if(typeof window!=="undefined"){t=window}else if(typeof global!=="undefined"){t=global}else if(typeof self!=="undefined"){t=self}else{t=this}t.AutoComplete=e()}})(function(){var e,t,n;return function(){function c(i,s,a){function l(n,e){if(!s[n]){if(!i[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(u)return u(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var o=s[n]={exports:{}};i[n][0].call(o.exports,function(e){var t=i[n][1][e];return l(t||e)},o,o.exports,c,i,s,a)}return s[n].exports}for(var u="function"==typeof require&&require,e=0;e<a.length;e++)l(a[e]);return l}return c}()({1:[function(e,t,n){
+window.searxng=function(t,i){"use strict";if(t.Element){(function(e){e.matches=e.matches||e.matchesSelector||e.webkitMatchesSelector||e.msMatchesSelector||function(e){var t=this,n=(t.parentNode||t.document).querySelectorAll(e),r=-1;while(n[++r]&&n[r]!=t);return!!n[r]}})(Element.prototype)}function s(e,t,n){try{e.call(t,n)}catch(e){console.log(e)}}var a=window.searxng||{};a.on=function(r,e,o,t){t=t||false;if(typeof r!=="string"){r.addEventListener(e,o,t)}else{i.addEventListener(e,function(e){var t=e.target||e.srcElement,n=false;while(t&&t.matches&&t!==i&&!(n=t.matches(r)))t=t.parentElement;if(n)s(o,t,e)},t)}};a.ready=function(e){if(document.readyState!="loading"){e.call(t)}else{t.addEventListener("DOMContentLoaded",e.bind(t))}};a.http=function(r,o,i=null){return new Promise(function(e,t){try{var n=new XMLHttpRequest;n.open(r,o,true);n.timeout=2e4;n.onload=function(){if(n.status==200){e(n.response,n.responseType)}else{t(Error(n.statusText))}};n.onerror=function(){t(Error("Network Error"))};n.onabort=function(){t(Error("Transaction is aborted"))};n.ontimeout=function(){t(Error("Timeout"))};if(i){n.send(i)}else{n.send()}}catch(e){t(e)}})};a.loadStyle=function(e){var t=a.static_path+e,n="style_"+e.replace(".","_"),r=i.getElementById(n);if(r===null){r=i.createElement("link");r.setAttribute("id",n);r.setAttribute("rel","stylesheet");r.setAttribute("type","text/css");r.setAttribute("href",t);i.body.appendChild(r)}};a.loadScript=function(e,t){var n=a.static_path+e,r="script_"+e.replace(".","_"),o=i.getElementById(r);if(o===null){o=i.createElement("script");o.setAttribute("id",r);o.setAttribute("src",n);o.onload=t;o.onerror=function(){o.setAttribute("error","1")};i.body.appendChild(o)}else if(!o.hasAttribute("error")){try{t.apply(o,[])}catch(e){console.log(e)}}else{console.log("callback not executed : script '"+n+"' not loaded.")}};a.insertBefore=function(e,t){t.parentNode.insertBefore(e,t)};a.insertAfter=function(e,t){t.parentNode.insertAfter(e,t.nextSibling)};a.on(".close","click",function(){this.parentNode.classList.add("invisible")});function e(){for(var e of i.getElementsByTagName("body")[0].classList.values()){if(e.endsWith("_endpoint")){return e.split("_")[0]}}return""}a.endpoint=e();return a}(window,document);searxng.ready(function(){"use strict";searxng.infinite_scroll_supported="IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype;if(searxng.endpoint!=="results"){return}if(!searxng.infinite_scroll_supported){console.log("IntersectionObserver not supported");return}let i=document;var s=i.getElementById("results").classList.contains("only_template_images");function n(){var e=i.createElement("div");e.classList.add("loader");return e}function r(t,e){t.textContent="";e.forEach(e=>t.appendChild(e))}function o(o){var e=i.querySelector("#pagination form.next_page");if(!e){return}r(i.querySelector("#pagination"),[n()]);var t=new FormData(e);searxng.http("POST",i.querySelector("#search").getAttribute("action"),t).then(function(e){var t=(new DOMParser).parseFromString(e,"text/html");var n=t.querySelectorAll("#urls article");var r=t.querySelector("#pagination");i.querySelector("#pagination").remove();if(n.length>0&&!s){i.querySelector("#urls").appendChild(i.createElement("hr"))}n.forEach(e=>{i.querySelector("#urls").appendChild(e)});if(r){i.querySelector("#results").appendChild(r);o()}}).catch(function(e){console.log(e);var t=i.createElement("div");t.textContent=searxng.translations.error_loading_next_page;t.classList.add("dialog-error");t.setAttribute("role","alert");r(i.querySelector("#pagination"),[t])})}if(searxng.infinite_scroll&&searxng.infinite_scroll_supported){const a={rootMargin:"20rem"};const l="article.result:last-child";const u=new IntersectionObserver(e=>{const t=e[0];if(t.isIntersecting){u.unobserve(t.target);o(()=>u.observe(i.querySelector(l),a))}});u.observe(i.querySelector(l),a)}});searxng.ready(function(){function e(e){while(e!==undefined){if(e.classList.contains("detail")){return true}if(e.classList.contains("result")){return false}e=e.parentNode}return false}function n(e){while(e!==undefined){if(e.classList.contains("result")){return e}e=e.parentNode}return undefined}function r(e){return e&&e.classList.contains("result-images")}searxng.on(".result","mousedown",function(t){if(!e(t.target)){o(this)(true);let e=n(t.target);if(r(e)){t.preventDefault();searxng.selectImage(e)}}});searxng.on(".result a","focus",function(t){if(!e(t.target)){let e=n(t.target);if(e&&e.getAttribute("data-vim-selected")===null){o(e)(true)}if(r(e)){searxng.selectImage(e)}}},true);var d={27:{key:"Escape",fun:i,des:"remove focus from the focused input",cat:"Control"},73:{key:"i",fun:p,des:"focus on the search input",cat:"Control"},66:{key:"b",fun:u(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},70:{key:"f",fun:u(window.innerHeight),des:"scroll one page down",cat:"Navigation"},85:{key:"u",fun:u(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},68:{key:"d",fun:u(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},71:{key:"g",fun:c(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},86:{key:"v",fun:c(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},75:{key:"k",fun:o("up"),des:"select previous search result",cat:"Results"},74:{key:"j",fun:o("down"),des:"select next search result",cat:"Results"},80:{key:"p",fun:l(),des:"go to previous page",cat:"Results"},78:{key:"n",fun:a(),des:"go to next page",cat:"Results"},79:{key:"o",fun:h(false),des:"open search result",cat:"Results"},84:{key:"t",fun:h(true),des:"open the result in a new tab",cat:"Results"},82:{key:"r",fun:t,des:"reload page from the server",cat:"Control"},72:{key:"h",fun:g,des:"toggle help window",cat:"Other"}};if(searxng.hotkeys){searxng.on(document,"keydown",function(e){if(Object.prototype.hasOwnProperty.call(d,e.keyCode)&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){var t=e.target.tagName.toLowerCase();if(e.keyCode===27){d[e.keyCode].fun(e)}else{if(e.target===document.body||t==="a"||t==="button"){e.preventDefault();d[e.keyCode].fun()}}}})}function o(d){return function(e){var t=document.querySelector(".result[data-vim-selected]"),n=d;if(t===null){t=document.querySelector(".result");if(t===null){return}if(d==="down"||d==="up"){n=t}}var r,o=document.querySelectorAll(".result");if(typeof n!=="string"){r=n}else{switch(n){case"visible":var i=document.documentElement.scrollTop||document.body.scrollTop;var s=i+document.documentElement.clientHeight;for(var a=0;a<o.length;a++){r=o[a];var l=r.offsetTop;var u=l+r.clientHeight;if(u<=s&&l>i){break}}break;case"down":r=t.nextElementSibling;if(r===null){r=o[0]}break;case"up":r=t.previousElementSibling;if(r===null){r=o[o.length-1]}break;case"bottom":r=o[o.length-1];break;case"top":default:r=o[0]}}if(r){t.removeAttribute("data-vim-selected");r.setAttribute("data-vim-selected","true");var c=r.querySelector("h3 a")||r.querySelector("a");if(c!==null){c.focus()}if(!e){f()}}}}function t(){document.location.reload(true)}function i(e){const t=e.target.tagName.toLowerCase();if(document.activeElement&&(t==="input"||t==="select"||t==="textarea")){document.activeElement.blur()}else{searxng.closeDetail()}}function s(t){return function(){var e=document.querySelector(t);if(e){e.click()}}}function a(){return s('nav#pagination .next_page button[type="submit"]')}function l(){return s('nav#pagination .previous_page button[type="submit"]')}function f(){var e=document.querySelector(".result[data-vim-selected]");if(e===null){return}var t=document.documentElement.scrollTop||document.body.scrollTop,n=document.documentElement.clientHeight,r=e.offsetTop,o=r+e.clientHeight,i=120;if(e.previousElementSibling===null&&o<n){window.scroll(window.scrollX,0);return}if(t>r-i){window.scroll(window.scrollX,r-i)}else{var s=t+n;if(s<o+i){window.scroll(window.scrollX,o-n+i)}}}function u(e){return function(){window.scrollBy(0,e);o("visible")()}}function c(e,t){return function(){window.scrollTo(0,e);o(t)()}}function p(){window.scrollTo(0,0);document.querySelector("#q").focus()}function h(n){return function(){var e=document.querySelector(".result[data-vim-selected] h3 a");if(e===null){e=document.querySelector(".result[data-vim-selected] > a")}if(e!==null){var t=e.getAttribute("href");if(n){window.open(t)}else{window.location.href=t}}}}function m(e){var n={};for(var t in d){var r=d[t];n[r.cat]=n[r.cat]||[];n[r.cat].push(r)}var o=Object.keys(n).sort(function(e,t){return n[t].length-n[e].length});if(o.length===0){return}var i='<a href="#" class="close" aria-label="close" title="close">×</a>';i+="<h3>How to navigate searx with Vim-like hotkeys</h3>";i+="<table>";for(var s=0;s<o.length;s++){var a=n[o[s]];var l=s===o.length-1;var u=s%2===0;if(u){i+="<tr>"}i+="<td>";i+="<h4>"+a[0].cat+"</h4>";i+='<ul class="list-unstyled">';for(var c in a){i+="<li><kbd>"+a[c].key+"</kbd> "+a[c].des+"</li>"}i+="</ul>";i+="</td>";if(!u||l){i+="</tr>"}}i+="</table>";e.innerHTML=i}function g(){var e=document.querySelector("#vim-hotkeys-help");if(e===undefined||e===null){e=document.createElement("div");e.id="vim-hotkeys-help";e.className="dialog-modal";m(e);m(e);m(e);var t=document.getElementsByTagName("body")[0];t.appendChild(e)}else{e.classList.toggle("invisible");return}}searxng.scrollPageToSelected=f;searxng.selectNext=o("down");searxng.selectPrevious=o("up")});(function(e,t,n){"use strict";n.ready(function(){n.on(".searxng_init_map","click",function(e){this.classList.remove("searxng_init_map");var d=this.dataset.leafletTarget;var f=parseFloat(this.dataset.mapLon);var p=parseFloat(this.dataset.mapLat);var h=parseFloat(this.dataset.mapZoom);var m=JSON.parse(this.dataset.mapBoundingbox);var g=JSON.parse(this.dataset.mapGeojson);n.loadStyle("css/leaflet.css");n.loadScript("js/leaflet.js",function(){var e=null;if(m){var t=L.latLng(m[0],m[2]);var n=L.latLng(m[1],m[3]);e=L.latLngBounds(t,n)}var r=L.map(d);var o="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";var i='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';var s=new L.TileLayer(o,{minZoom:1,maxZoom:19,attribution:i});var a="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png";var l='Wikimedia maps | Maps data © <a href="https://openstreetmap.org">OpenStreetMap contributors</a>';var u=new L.TileLayer(a,{minZoom:1,maxZoom:19,attribution:l});if(e){setTimeout(function(){r.fitBounds(e,{maxZoom:17})},0)}else if(f&&p){if(h){r.setView(new L.latLng(p,f),h)}else{r.setView(new L.latLng(p,f),8)}}r.addLayer(s);var c={"OSM Mapnik":s,"OSM Wikimedia":u};L.control.layers(c).addTo(r);if(g){L.geoJson(g).addTo(r)}});e.preventDefault()})})})(window,document,window.searxng);(function(e,i,s){"use strict";if(s.endpoint!=="preferences"){return}s.ready(function(){let o=null;function e(){if(o==null){s.http("GET","engine_descriptions.json").then(function(e){o=JSON.parse(e);for(const[t,n]of Object.entries(o)){let e=i.querySelectorAll('[data-engine-name="'+t+'"] .engine-description');for(const r of e){let e=" (<i>"+s.translations["Source"]+":&nbsp;"+n[1]+"</i>)";r.innerHTML=n[0]+e}}})}}for(const t of i.querySelectorAll("[data-engine-name]")){s.on(t,"mouseenter",e)}})})(window,document,window.searxng);(function(e,a,l){"use strict";if(l.endpoint!=="results"){return}l.ready(function(){a.querySelectorAll("#urls img.image").forEach(e=>e.addEventListener("error",()=>{e.style.display="none";e.error=null}));l.on(".btn-collapse","click",function(){var e=this.getAttribute("data-btn-text-collapsed");var t=this.getAttribute("data-btn-text-not-collapsed");var n=this.getAttribute("data-target");var r=a.querySelector(n);var o=this.innerHTML;if(this.classList.contains("collapsed")){o=o.replace(e,t)}else{o=o.replace(t,e)}this.innerHTML=o;this.classList.toggle("collapsed");r.classList.toggle("invisible")});l.on(".media-loader","click",function(){var e=this.getAttribute("data-target");var t=a.querySelector(e+" > iframe");var n=t.getAttribute("src");if(n===null||n===undefined||n===false){t.setAttribute("src",t.getAttribute("data-src"))}});l.selectImage=function(e){if(e){const t=e.querySelector(".result-images-source img");const n=e.querySelector(".image_thumbnail");const r=e.querySelector(".detail");if(t){const o=t.getAttribute("data-src");if(o){const i=a.createElement("div");const s=new Image;i.classList.add("loader");r.appendChild(i);s.onload=e=>{t.src=o;i.remove()};s.onerror=e=>{i.remove()};s.src=o;t.src=n.src;t.removeAttribute("data-src")}}}a.getElementById("results").classList.add("image-detail-open");l.scrollPageToSelected()};l.closeDetail=function(e){a.getElementById("results").classList.remove("image-detail-open");l.scrollPageToSelected()};l.on(".result-detail-close","click",e=>{e.preventDefault();l.closeDetail()});l.on(".result-detail-previous","click",e=>l.selectPrevious(false));l.on(".result-detail-next","click",e=>l.selectNext(false));e.addEventListener("scroll",function(){var e=a.getElementById("backToTop"),t=document.documentElement.scrollTop||document.body.scrollTop,n=a.getElementById("results");if(e!==null){if(t>=100){n.classList.add("scrolling")}else{n.classList.remove("scrolling")}}},true)})})(window,document,window.searxng);(function(t,n,r){"use strict";var o=true,i="q",s;function a(e){if(e.setSelectionRange){var t=e.value.length;e.setSelectionRange(t,t)}}function l(){if(s.value.length>0){var e=document.getElementById("search");setTimeout(e.submit.bind(e),0)}}function u(t){var e=document.getElementById("clear_search");var n=function(){if(t.value.length===0){e.classList.add("empty")}else{e.classList.remove("empty")}};n();e.addEventListener("click",function(e){t.value="";t.focus();n();e.preventDefault()});t.addEventListener("keyup",n,false)}r.ready(function(){s=n.getElementById(i);function e(){if(o){a(s);o=false}else{}}if(s!==null){u(s);if(r.autocompleter){r.autocomplete=AutoComplete.call(t,{Url:"./autocompleter",EmptyMessage:r.translations.no_item_found,HttpMethod:r.method,HttpHeaders:{"Content-type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},MinChars:4,Delay:300,_Position:function(){this.DOMResults.setAttribute("class","autocomplete");this.DOMResults.style.top=this.Input.offsetTop+this.Input.offsetHeight+"px";this.DOMResults.style.left=this.Input.offsetLeft+"px";this.DOMResults.style.width=this.Input.clientWidth+"px"},_Open:function(){var t=this;Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"),function(e){if(e.getAttribute("class")!="locked"){e.onmousedown=function(){t._Select(e)}}})}},"#"+i);t.addEventListener("resize",function(){var e=new CustomEvent("position");s.dispatchEvent(e)})}s.addEventListener("focus",e,false);s.focus()}if(s!==null&&n.querySelector(".help")!=null&&r.search_on_category_select){n.querySelector(".help").className="invisible";r.on("#categories input","change",function(){var e,t=n.querySelectorAll('#categories input[type="checkbox"]');for(e=0;e<t.length;e++){if(t[e]!==this&&t[e].checked){t[e].click()}}if(!this.checked){this.click()}l();return false});r.on(n.getElementById("safesearch"),"change",l);r.on(n.getElementById("time_range"),"change",l);r.on(n.getElementById("language"),"change",l)}})})(window,document,window.searxng);(function(e){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=e()}else if(typeof define==="function"&&define.amd){define([],e)}else{var t;if(typeof window!=="undefined"){t=window}else if(typeof global!=="undefined"){t=global}else if(typeof self!=="undefined"){t=self}else{t=this}t.AutoComplete=e()}})(function(){var e,t,n;return function(){function c(i,s,a){function l(n,e){if(!s[n]){if(!i[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(u)return u(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var o=s[n]={exports:{}};i[n][0].call(o.exports,function(e){var t=i[n][1][e];return l(t||e)},o,o.exports,c,i,s,a)}return s[n].exports}for(var u="function"==typeof require&&require,e=0;e<a.length;e++)l(a[e]);return l}return c}()({1:[function(e,t,n){
 /*
  * @license MIT
  *
diff --git a/searx/static/themes/simple/js/searxng.min.js.map b/searx/static/themes/simple/js/searxng.min.js.map
index daa486c5a..8e72af1d9 100644
--- a/searx/static/themes/simple/js/searxng.min.js.map
+++ b/searx/static/themes/simple/js/searxng.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"searxng.min.js","sources":["../src/js/main/00_toolkit.js","../src/js/main/infinite_scroll.js","../src/js/main/keyboard.js","../src/js/main/mapresult.js","../src/js/main/preferences.js","../src/js/main/results.js","../src/js/main/search.js","../node_modules/autocomplete-js/dist/autocomplete.js"],"sourcesContent":["/**\n * @license\n * (C) Copyright Contributors to the SearXNG project.\n * (C) Copyright Contributors to the searx project (2014 - 2021).\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nwindow.searxng = (function (w, d) {\n\n  'use strict';\n\n  // not invented here tookit with bugs fixed elsewhere\n  // purposes : be just good enough and as small as possible\n\n  // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/\n  if (w.Element) {\n    (function (ElementPrototype) {\n      ElementPrototype.matches = ElementPrototype.matches ||\n      ElementPrototype.matchesSelector ||\n      ElementPrototype.webkitMatchesSelector ||\n      ElementPrototype.msMatchesSelector ||\n      function (selector) {\n        var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;\n        while (nodes[++i] && nodes[i] != node);\n        return !!nodes[i];\n      };\n    })(Element.prototype);\n  }\n\n  function callbackSafe (callback, el, e) {\n    try {\n      callback.call(el, e);\n    } catch (exception) {\n      console.log(exception);\n    }\n  }\n\n  var searxng = window.searxng || {};\n\n  searxng.on = function (obj, eventType, callback, useCapture) {\n    useCapture = useCapture || false;\n    if (typeof obj !== 'string') {\n      // obj HTMLElement, HTMLDocument\n      obj.addEventListener(eventType, callback, useCapture);\n    } else {\n      // obj is a selector\n      d.addEventListener(eventType, function (e) {\n        var el = e.target || e.srcElement, found = false;\n        while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;\n        if (found) callbackSafe(callback, el, e);\n      }, useCapture);\n    }\n  };\n\n  searxng.ready = function (callback) {\n    if (document.readyState != 'loading') {\n      callback.call(w);\n    } else {\n      w.addEventListener('DOMContentLoaded', callback.bind(w));\n    }\n  };\n\n  searxng.http = function (method, url, data = null) {\n    return new Promise(function (resolve, reject) {\n      try {\n        var req = new XMLHttpRequest();\n        req.open(method, url, true);\n        req.timeout = 20000;\n\n        // On load\n        req.onload = function () {\n          if (req.status == 200) {\n            resolve(req.response, req.responseType);\n          } else {\n            reject(Error(req.statusText));\n          }\n        };\n\n        // Handle network errors\n        req.onerror = function () {\n          reject(Error(\"Network Error\"));\n        };\n\n        req.onabort = function () {\n          reject(Error(\"Transaction is aborted\"));\n        };\n\n        req.ontimeout = function () {\n          reject(Error(\"Timeout\"));\n        }\n\n        // Make the request\n        if (data) {\n          req.send(data)\n        } else {\n          req.send();\n        }\n      } catch (ex) {\n        reject(ex);\n      }\n    });\n  };\n\n  searxng.loadStyle = function (src) {\n    var path = searxng.static_path + src,\n      id = \"style_\" + src.replace('.', '_'),\n      s = d.getElementById(id);\n    if (s === null) {\n      s = d.createElement('link');\n      s.setAttribute('id', id);\n      s.setAttribute('rel', 'stylesheet');\n      s.setAttribute('type', 'text/css');\n      s.setAttribute('href', path);\n      d.body.appendChild(s);\n    }\n  };\n\n  searxng.loadScript = function (src, callback) {\n    var path = searxng.static_path + src,\n      id = \"script_\" + src.replace('.', '_'),\n      s = d.getElementById(id);\n    if (s === null) {\n      s = d.createElement('script');\n      s.setAttribute('id', id);\n      s.setAttribute('src', path);\n      s.onload = callback;\n      s.onerror = function () {\n        s.setAttribute('error', '1');\n      };\n      d.body.appendChild(s);\n    } else if (!s.hasAttribute('error')) {\n      try {\n        callback.apply(s, []);\n      } catch (exception) {\n        console.log(exception);\n      }\n    } else {\n      console.log(\"callback not executed : script '\" + path + \"' not loaded.\");\n    }\n  };\n\n  searxng.insertBefore = function (newNode, referenceNode) {\n    referenceNode.parentNode.insertBefore(newNode, referenceNode);\n  };\n\n  searxng.insertAfter = function (newNode, referenceNode) {\n    referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);\n  };\n\n  searxng.on('.close', 'click', function () {\n    this.parentNode.classList.add('invisible');\n  });\n\n  function getEndpoint () {\n    for (var className of d.getElementsByTagName('body')[0].classList.values()) {\n      if (className.endsWith('_endpoint')) {\n        return className.split('_')[0];\n      }\n    }\n    return '';\n  }\n\n  searxng.endpoint = getEndpoint();\n\n  return searxng;\n})(window, document);\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/* global searxng */\n\nsearxng.ready(function () {\n  'use strict';\n\n  searxng.infinite_scroll_supported = (\n    'IntersectionObserver' in window &&\n    'IntersectionObserverEntry' in window &&\n    'intersectionRatio' in window.IntersectionObserverEntry.prototype);\n\n  if (searxng.endpoint !== 'results') {\n    return;\n  }\n\n  if (!searxng.infinite_scroll_supported) {\n    console.log('IntersectionObserver not supported');\n    return;\n  }\n\n  let d = document;\n  var onlyImages = d.getElementById('results').classList.contains('only_template_images');\n\n  function newLoadSpinner () {\n    var loader = d.createElement('div');\n    loader.classList.add('loader');\n    return loader;\n  }\n\n  function replaceChildrenWith (element, children) {\n    element.textContent = '';\n    children.forEach(child => element.appendChild(child));\n  }\n\n  function loadNextPage (callback) {\n    var form = d.querySelector('#pagination form.next_page');\n    if (!form) {\n      return\n    }\n    replaceChildrenWith(d.querySelector('#pagination'), [ newLoadSpinner() ]);\n    var formData = new FormData(form);\n    searxng.http('POST', d.querySelector('#search').getAttribute('action'), formData).then(\n      function (response) {\n        var nextPageDoc = new DOMParser().parseFromString(response, 'text/html');\n        var articleList = nextPageDoc.querySelectorAll('#urls article');\n        var paginationElement = nextPageDoc.querySelector('#pagination');\n        d.querySelector('#pagination').remove();\n        if (articleList.length > 0 && !onlyImages) {\n          // do not add <hr> element when there are only images\n          d.querySelector('#urls').appendChild(d.createElement('hr'));\n        }\n        articleList.forEach(articleElement => {\n          d.querySelector('#urls').appendChild(articleElement);\n        });\n        if (paginationElement) {\n          d.querySelector('#results').appendChild(paginationElement);\n          callback();\n        }\n      }\n    ).catch(\n      function (err) {\n        console.log(err);\n        var e = d.createElement('div');\n        e.textContent = searxng.translations.error_loading_next_page;\n        e.classList.add('dialog-error');\n        e.setAttribute('role', 'alert');\n        replaceChildrenWith(d.querySelector('#pagination'), [ e ]);\n      }\n    )\n  }\n\n  if (searxng.infinite_scroll && searxng.infinite_scroll_supported) {\n    const intersectionObserveOptions = {\n      rootMargin: \"20rem\",\n    };\n    const observedSelector = 'article.result:last-child';\n    const observer = new IntersectionObserver(entries => {\n      const paginationEntry = entries[0];\n      if (paginationEntry.isIntersecting) {\n        observer.unobserve(paginationEntry.target);\n        loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));\n      }\n    });\n    observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);\n  }\n\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global searxng */\n\nsearxng.ready(function () {\n\n  function isElementInDetail (el) {\n    while (el !== undefined) {\n      if (el.classList.contains('detail')) {\n        return true;\n      }\n      if (el.classList.contains('result')) {\n        // we found a result, no need to go to the root of the document:\n        // el is not inside a <div class=\"detail\"> element\n        return false;\n      }\n      el = el.parentNode;\n    }\n    return false;\n  }\n\n  function getResultElement (el) {\n    while (el !== undefined) {\n      if (el.classList.contains('result')) {\n        return el;\n      }\n      el = el.parentNode;\n    }\n    return undefined;\n  }\n\n  function isImageResult (resultElement) {\n    return resultElement && resultElement.classList.contains('result-images');\n  }\n\n  searxng.on('.result', 'click', function (e) {\n    if (!isElementInDetail(e.target)) {\n      highlightResult(this)(true);\n      let resultElement = getResultElement(e.target);\n      if (isImageResult(resultElement)) {\n        e.preventDefault();\n        searxng.selectImage(resultElement);\n      }\n    }\n  });\n\n  searxng.on('.result a', 'focus', function (e) {\n    if (!isElementInDetail(e.target)) {\n      let resultElement = getResultElement(e.target);\n      if (resultElement && resultElement.getAttribute(\"data-vim-selected\") === null) {\n        highlightResult(resultElement)(true);\n      }\n      if (isImageResult(resultElement)) {\n        searxng.selectImage(resultElement);\n      }\n    }\n  }, true);\n\n  var vimKeys = {\n    27: {\n      key: 'Escape',\n      fun: removeFocus,\n      des: 'remove focus from the focused input',\n      cat: 'Control'\n    },\n    73: {\n      key: 'i',\n      fun: searchInputFocus,\n      des: 'focus on the search input',\n      cat: 'Control'\n    },\n    66: {\n      key: 'b',\n      fun: scrollPage(-window.innerHeight),\n      des: 'scroll one page up',\n      cat: 'Navigation'\n    },\n    70: {\n      key: 'f',\n      fun: scrollPage(window.innerHeight),\n      des: 'scroll one page down',\n      cat: 'Navigation'\n    },\n    85: {\n      key: 'u',\n      fun: scrollPage(-window.innerHeight / 2),\n      des: 'scroll half a page up',\n      cat: 'Navigation'\n    },\n    68: {\n      key: 'd',\n      fun: scrollPage(window.innerHeight / 2),\n      des: 'scroll half a page down',\n      cat: 'Navigation'\n    },\n    71: {\n      key: 'g',\n      fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n      des: 'scroll to the top of the page',\n      cat: 'Navigation'\n    },\n    86: {\n      key: 'v',\n      fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n      des: 'scroll to the bottom of the page',\n      cat: 'Navigation'\n    },\n    75: {\n      key: 'k',\n      fun: highlightResult('up'),\n      des: 'select previous search result',\n      cat: 'Results'\n    },\n    74: {\n      key: 'j',\n      fun: highlightResult('down'),\n      des: 'select next search result',\n      cat: 'Results'\n    },\n    80: {\n      key: 'p',\n      fun: GoToPreviousPage(),\n      des: 'go to previous page',\n      cat: 'Results'\n    },\n    78: {\n      key: 'n',\n      fun: GoToNextPage(),\n      des: 'go to next page',\n      cat: 'Results'\n    },\n    79: {\n      key: 'o',\n      fun: openResult(false),\n      des: 'open search result',\n      cat: 'Results'\n    },\n    84: {\n      key: 't',\n      fun: openResult(true),\n      des: 'open the result in a new tab',\n      cat: 'Results'\n    },\n    82: {\n      key: 'r',\n      fun: reloadPage,\n      des: 'reload page from the server',\n      cat: 'Control'\n    },\n    72: {\n      key: 'h',\n      fun: toggleHelp,\n      des: 'toggle help window',\n      cat: 'Other'\n    }\n  };\n\n  if (searxng.hotkeys) {\n    searxng.on(document, \"keydown\", function (e) {\n      // check for modifiers so we don't break browser's hotkeys\n      if (Object.prototype.hasOwnProperty.call(vimKeys, e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {\n        var tagName = e.target.tagName.toLowerCase();\n        if (e.keyCode === 27) {\n          vimKeys[e.keyCode].fun(e);\n        } else {\n          if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n            e.preventDefault();\n            vimKeys[e.keyCode].fun();\n          }\n        }\n      }\n    });\n  }\n\n  function highlightResult (which) {\n    return function (noScroll) {\n      var current = document.querySelector('.result[data-vim-selected]'),\n        effectiveWhich = which;\n      if (current === null) {\n        // no selection : choose the first one\n        current = document.querySelector('.result');\n        if (current === null) {\n          // no first one : there are no results\n          return;\n        }\n        // replace up/down actions by selecting first one\n        if (which === \"down\" || which === \"up\") {\n          effectiveWhich = current;\n        }\n      }\n\n      var next, results = document.querySelectorAll('.result');\n\n      if (typeof effectiveWhich !== 'string') {\n        next = effectiveWhich;\n      } else {\n        switch (effectiveWhich) {\n        case 'visible':\n          var top = document.documentElement.scrollTop || document.body.scrollTop;\n          var bot = top + document.documentElement.clientHeight;\n\n          for (var i = 0; i < results.length; i++) {\n            next = results[i];\n            var etop = next.offsetTop;\n            var ebot = etop + next.clientHeight;\n\n            if ((ebot <= bot) && (etop > top)) {\n              break;\n            }\n          }\n          break;\n        case 'down':\n          next = current.nextElementSibling;\n          if (next === null) {\n            next = results[0];\n          }\n          break;\n        case 'up':\n          next = current.previousElementSibling;\n          if (next === null) {\n            next = results[results.length - 1];\n          }\n          break;\n        case 'bottom':\n          next = results[results.length - 1];\n          break;\n        case 'top':\n          /* falls through */\n        default:\n          next = results[0];\n        }\n      }\n\n      if (next) {\n        current.removeAttribute('data-vim-selected');\n        next.setAttribute('data-vim-selected', 'true');\n        var link = next.querySelector('h3 a') || next.querySelector('a');\n        if (link !== null) {\n          link.focus();\n        }\n        if (!noScroll) {\n          scrollPageToSelected();\n        }\n      }\n    };\n  }\n\n  function reloadPage () {\n    document.location.reload(true);\n  }\n\n  function removeFocus (e) {\n    const tagName = e.target.tagName.toLowerCase();\n    if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {\n      document.activeElement.blur();\n    } else {\n      searxng.closeDetail();\n    }\n  }\n\n  function pageButtonClick (css_selector) {\n    return function () {\n      var button = document.querySelector(css_selector);\n      if (button) {\n        button.click();\n      }\n    };\n  }\n\n  function GoToNextPage () {\n    return pageButtonClick('nav#pagination .next_page button[type=\"submit\"]');\n  }\n\n  function GoToPreviousPage () {\n    return pageButtonClick('nav#pagination .previous_page button[type=\"submit\"]');\n  }\n\n  function scrollPageToSelected () {\n    var sel = document.querySelector('.result[data-vim-selected]');\n    if (sel === null) {\n      return;\n    }\n    var wtop = document.documentElement.scrollTop || document.body.scrollTop,\n      wheight = document.documentElement.clientHeight,\n      etop = sel.offsetTop,\n      ebot = etop + sel.clientHeight,\n      offset = 120;\n    // first element ?\n    if ((sel.previousElementSibling === null) && (ebot < wheight)) {\n      // set to the top of page if the first element\n      // is fully included in the viewport\n      window.scroll(window.scrollX, 0);\n      return;\n    }\n    if (wtop > (etop - offset)) {\n      window.scroll(window.scrollX, etop - offset);\n    } else {\n      var wbot = wtop + wheight;\n      if (wbot < (ebot + offset)) {\n        window.scroll(window.scrollX, ebot - wheight + offset);\n      }\n    }\n  }\n\n  function scrollPage (amount) {\n    return function () {\n      window.scrollBy(0, amount);\n      highlightResult('visible')();\n    };\n  }\n\n  function scrollPageTo (position, nav) {\n    return function () {\n      window.scrollTo(0, position);\n      highlightResult(nav)();\n    };\n  }\n\n  function searchInputFocus () {\n    window.scrollTo(0, 0);\n    document.querySelector('#q').focus();\n  }\n\n  function openResult (newTab) {\n    return function () {\n      var link = document.querySelector('.result[data-vim-selected] h3 a');\n      if (link === null) {\n        link = document.querySelector('.result[data-vim-selected] > a');\n      }\n      if (link !== null) {\n        var url = link.getAttribute('href');\n        if (newTab) {\n          window.open(url);\n        } else {\n          window.location.href = url;\n        }\n      }\n    };\n  }\n\n  function initHelpContent (divElement) {\n    var categories = {};\n\n    for (var k in vimKeys) {\n      var key = vimKeys[k];\n      categories[key.cat] = categories[key.cat] || [];\n      categories[key.cat].push(key);\n    }\n\n    var sorted = Object.keys(categories).sort(function (a, b) {\n      return categories[b].length - categories[a].length;\n    });\n\n    if (sorted.length === 0) {\n      return;\n    }\n\n    var html = '<a href=\"#\" class=\"close\" aria-label=\"close\" title=\"close\">×</a>';\n    html += '<h3>How to navigate searx with Vim-like hotkeys</h3>';\n    html += '<table>';\n\n    for (var i = 0; i < sorted.length; i++) {\n      var cat = categories[sorted[i]];\n\n      var lastCategory = i === (sorted.length - 1);\n      var first = i % 2 === 0;\n\n      if (first) {\n        html += '<tr>';\n      }\n      html += '<td>';\n\n      html += '<h4>' + cat[0].cat + '</h4>';\n      html += '<ul class=\"list-unstyled\">';\n\n      for (var cj in cat) {\n        html += '<li><kbd>' + cat[cj].key + '</kbd> ' + cat[cj].des + '</li>';\n      }\n\n      html += '</ul>';\n      html += '</td>'; // col-sm-*\n\n      if (!first || lastCategory) {\n        html += '</tr>'; // row\n      }\n    }\n\n    html += '</table>';\n\n    divElement.innerHTML = html;\n  }\n\n  function toggleHelp () {\n    var helpPanel = document.querySelector('#vim-hotkeys-help');\n    if (helpPanel === undefined || helpPanel === null) {\n      // first call\n      helpPanel = document.createElement('div');\n      helpPanel.id = 'vim-hotkeys-help';\n      helpPanel.className = 'dialog-modal';\n      initHelpContent(helpPanel);\n      initHelpContent(helpPanel);\n      initHelpContent(helpPanel);\n      var body = document.getElementsByTagName('body')[0];\n      body.appendChild(helpPanel);\n    } else {\n      // togggle hidden\n      helpPanel.classList.toggle('invisible');\n      return;\n    }\n  }\n\n  searxng.scrollPageToSelected = scrollPageToSelected;\n  searxng.selectNext = highlightResult('down');\n  searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n  'use strict';\n\n  searxng.ready(function () {\n    searxng.on('.searxng_init_map', 'click', function (event) {\n      // no more request\n      this.classList.remove(\"searxng_init_map\");\n\n      //\n      var leaflet_target = this.dataset.leafletTarget;\n      var map_lon = parseFloat(this.dataset.mapLon);\n      var map_lat = parseFloat(this.dataset.mapLat);\n      var map_zoom = parseFloat(this.dataset.mapZoom);\n      var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n      var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n      searxng.loadStyle('css/leaflet.css');\n      searxng.loadScript('js/leaflet.js', function () {\n        var map_bounds = null;\n        if (map_boundingbox) {\n          var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n          var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n          map_bounds = L.latLngBounds(southWest, northEast);\n        }\n\n        // init map\n        var map = L.map(leaflet_target);\n        // create the tile layer with correct attribution\n        var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n        var osmMapnikAttrib = 'Map data © <a href=\"https://openstreetmap.org\">OpenStreetMap</a> contributors';\n        var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n        var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n        var osmWikimediaAttrib = 'Wikimedia maps | Maps data © <a href=\"https://openstreetmap.org\">OpenStreetMap contributors</a>';\n        var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n        // init map view\n        if (map_bounds) {\n          // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n          // Still useful ?\n          setTimeout(function () {\n            map.fitBounds(map_bounds, {\n              maxZoom: 17\n            });\n          }, 0);\n        } else if (map_lon && map_lat) {\n          if (map_zoom) {\n            map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n          } else {\n            map.setView(new L.latLng(map_lat, map_lon), 8);\n          }\n        }\n\n        map.addLayer(osmMapnik);\n\n        var baseLayers = {\n          \"OSM Mapnik\": osmMapnik,\n          \"OSM Wikimedia\": osmWikimedia,\n        };\n\n        L.control.layers(baseLayers).addTo(map);\n\n        if (map_geojson) {\n          L.geoJson(map_geojson).addTo(map);\n        } /* else if(map_bounds) {\n          L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n        } */\n      });\n\n      // this event occour only once per element\n      event.preventDefault();\n    });\n  });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n  'use strict';\n\n  if (searxng.endpoint !== 'preferences') {\n    return;\n  }\n\n  searxng.ready(function () {\n    let engine_descriptions = null;\n    function load_engine_descriptions () {\n      if (engine_descriptions == null) {\n        searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n          engine_descriptions = JSON.parse(content);\n          for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n            let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n            for (const element of elements) {\n              let source = ' (<i>' + searxng.translations['Source'] + ':&nbsp;' + description[1] + '</i>)';\n              element.innerHTML = description[0] + source;\n            }\n          }\n        });\n      }\n    }\n\n    for (const el of d.querySelectorAll('[data-engine-name]')) {\n      searxng.on(el, 'mouseenter', load_engine_descriptions);\n    }\n  });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n  'use strict';\n\n  if (searxng.endpoint !== 'results') {\n    return;\n  }\n\n  searxng.ready(function () {\n    d.querySelectorAll('#urls img.image').forEach(\n      img =>\n        img.addEventListener(\n          'error', () => {\n            img.style.display = 'none';\n            img.error = null;\n          }\n        ));\n\n    searxng.on('.btn-collapse', 'click', function () {\n      var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');\n      var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');\n      var target = this.getAttribute('data-target');\n      var targetElement = d.querySelector(target);\n      var html = this.innerHTML;\n      if (this.classList.contains('collapsed')) {\n        html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);\n      } else {\n        html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);\n      }\n      this.innerHTML = html;\n      this.classList.toggle('collapsed');\n      targetElement.classList.toggle('invisible');\n    });\n\n    searxng.on('.media-loader', 'click', function () {\n      var target = this.getAttribute('data-target');\n      var iframe_load = d.querySelector(target + ' > iframe');\n      var srctest = iframe_load.getAttribute('src');\n      if (srctest === null || srctest === undefined || srctest === false) {\n        iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));\n      }\n    });\n\n    searxng.selectImage = function (resultElement) {\n      /* eslint no-unused-vars: 0 */\n      if (resultElement) {\n        // load full size image in background\n        const imgElement = resultElement.querySelector('.result-images-source img');\n        const thumbnailElement = resultElement.querySelector('.image_thumbnail');\n        const detailElement = resultElement.querySelector('.detail');\n        if (imgElement) {\n          const imgSrc = imgElement.getAttribute('data-src');\n          if (imgSrc) {\n            const loader = d.createElement('div');\n            const imgLoader = new Image();\n\n            loader.classList.add('loader');\n            detailElement.appendChild(loader);\n\n            imgLoader.onload = e => {\n              imgElement.src = imgSrc;\n              loader.remove();\n            };\n            imgLoader.onerror = e => {\n              loader.remove();\n            };\n            imgLoader.src = imgSrc;\n            imgElement.src = thumbnailElement.src;\n            imgElement.removeAttribute('data-src');\n          }\n        }\n      }\n      d.getElementById('results').classList.add('image-detail-open');\n      searxng.scrollPageToSelected();\n    }\n\n    searxng.closeDetail = function (e) {\n      d.getElementById('results').classList.remove('image-detail-open');\n      searxng.scrollPageToSelected();\n    }\n    searxng.on('.result-detail-close', 'click', e => {\n      e.preventDefault();\n      searxng.closeDetail();\n    });\n    searxng.on('.result-detail-previous', 'click', e => searxng.selectPrevious(false));\n    searxng.on('.result-detail-next', 'click', e => searxng.selectNext(false));\n\n    w.addEventListener('scroll', function () {\n      var e = d.getElementById('backToTop'),\n        scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n        results = d.getElementById('results');\n      if (e !== null) {\n        if (scrollTop >= 100) {\n          results.classList.add('scrolling');\n        } else {\n          results.classList.remove('scrolling');\n        }\n      }\n    }, true);\n\n  });\n\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global AutoComplete */\n(function (w, d, searxng) {\n  'use strict';\n\n  var firstFocus = true, qinput_id = \"q\", qinput;\n\n  function placeCursorAtEnd (element) {\n    if (element.setSelectionRange) {\n      var len = element.value.length;\n      element.setSelectionRange(len, len);\n    }\n  }\n\n  function submitIfQuery () {\n    if (qinput.value.length  > 0) {\n      var search = document.getElementById('search');\n      setTimeout(search.submit.bind(search), 0);\n    }\n  }\n\n  function createClearButton (qinput) {\n    var cs = document.getElementById('clear_search');\n    var updateClearButton = function () {\n      if (qinput.value.length === 0) {\n        cs.classList.add(\"empty\");\n      } else {\n        cs.classList.remove(\"empty\");\n      }\n    };\n\n    // update status, event listener\n    updateClearButton();\n    cs.addEventListener('click', function (ev) {\n      qinput.value = '';\n      qinput.focus();\n      updateClearButton();\n      ev.preventDefault();\n    });\n    qinput.addEventListener('keyup', updateClearButton, false);\n  }\n\n  searxng.ready(function () {\n    qinput = d.getElementById(qinput_id);\n\n    function placeCursorAtEndOnce () {\n      if (firstFocus) {\n        placeCursorAtEnd(qinput);\n        firstFocus = false;\n      } else {\n        // e.preventDefault();\n      }\n    }\n\n    if (qinput !== null) {\n      // clear button\n      createClearButton(qinput);\n\n      // autocompleter\n      if (searxng.autocompleter) {\n        searxng.autocomplete = AutoComplete.call(w, {\n          Url: \"./autocompleter\",\n          EmptyMessage: searxng.translations.no_item_found,\n          HttpMethod: searxng.method,\n          HttpHeaders: {\n            \"Content-type\": \"application/x-www-form-urlencoded\",\n            \"X-Requested-With\": \"XMLHttpRequest\"\n          },\n          MinChars: 4,\n          Delay: 300,\n          _Position: function () {\n            this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n            this.DOMResults.style.top = (this.Input.offsetTop + this.Input.offsetHeight) + \"px\";\n            this.DOMResults.style.left = this.Input.offsetLeft + \"px\";\n            this.DOMResults.style.width = this.Input.clientWidth + \"px\";\n          },\n          _Open: function () {\n            var params = this;\n            Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n              if (li.getAttribute(\"class\") != \"locked\") {\n                li.onmousedown = function () {\n                  params._Select(li);\n                };\n              }\n            });\n          },\n        }, \"#\" + qinput_id);\n\n        // hack, see : https://github.com/autocompletejs/autocomplete.js/issues/37\n        w.addEventListener('resize', function () {\n          var event = new CustomEvent(\"position\");\n          qinput.dispatchEvent(event);\n        });\n      }\n\n      qinput.addEventListener('focus', placeCursorAtEndOnce, false);\n      qinput.focus();\n    }\n\n    // vanilla js version of search_on_category_select.js\n    if (qinput !== null && d.querySelector('.help') != null && searxng.search_on_category_select) {\n      d.querySelector('.help').className = 'invisible';\n\n      searxng.on('#categories input', 'change', function () {\n        var i, categories = d.querySelectorAll('#categories input[type=\"checkbox\"]');\n        for (i = 0; i < categories.length; i++) {\n          if (categories[i] !== this && categories[i].checked) {\n            categories[i].click();\n          }\n        }\n        if (! this.checked) {\n          this.click();\n        }\n        submitIfQuery();\n        return false;\n      });\n\n      searxng.on(d.getElementById('safesearch'), 'change', submitIfQuery);\n      searxng.on(d.getElementById('time_range'), 'change', submitIfQuery);\n      searxng.on(d.getElementById('language'), 'change', submitIfQuery);\n    }\n\n  });\n\n})(window, document, window.searxng);\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.AutoComplete = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*\n * @license MIT\n *\n * Autocomplete.js v2.7.1\n * Developed by Baptiste Donaux\n * http://autocomplete-js.com\n *\n * (c) 2017, Baptiste Donaux\n */\n\"use strict\";\nvar ConditionOperator;\n(function (ConditionOperator) {\n    ConditionOperator[ConditionOperator[\"AND\"] = 0] = \"AND\";\n    ConditionOperator[ConditionOperator[\"OR\"] = 1] = \"OR\";\n})(ConditionOperator || (ConditionOperator = {}));\nvar EventType;\n(function (EventType) {\n    EventType[EventType[\"KEYDOWN\"] = 0] = \"KEYDOWN\";\n    EventType[EventType[\"KEYUP\"] = 1] = \"KEYUP\";\n})(EventType || (EventType = {}));\n/**\n * Core\n *\n * @class\n * @author Baptiste Donaux <baptiste.donaux@gmail.com> @baptistedonaux\n */\nvar AutoComplete = /** @class */ (function () {\n    // Constructor\n    function AutoComplete(params, selector) {\n        if (params === void 0) { params = {}; }\n        if (selector === void 0) { selector = \"[data-autocomplete]\"; }\n        if (Array.isArray(selector)) {\n            selector.forEach(function (s) {\n                new AutoComplete(params, s);\n            });\n        }\n        else if (typeof selector == \"string\") {\n            var elements = document.querySelectorAll(selector);\n            Array.prototype.forEach.call(elements, function (input) {\n                new AutoComplete(params, input);\n            });\n        }\n        else {\n            var specificParams = AutoComplete.merge(AutoComplete.defaults, params, {\n                DOMResults: document.createElement(\"div\")\n            });\n            AutoComplete.prototype.create(specificParams, selector);\n            return specificParams;\n        }\n    }\n    AutoComplete.prototype.create = function (params, element) {\n        params.Input = element;\n        if (params.Input.nodeName.match(/^INPUT$/i) && (params.Input.hasAttribute(\"type\") === false || params.Input.getAttribute(\"type\").match(/^TEXT|SEARCH$/i))) {\n            params.Input.setAttribute(\"autocomplete\", \"off\");\n            params._Position(params);\n            params.Input.parentNode.appendChild(params.DOMResults);\n            params.$Listeners = {\n                blur: params._Blur.bind(params),\n                destroy: AutoComplete.prototype.destroy.bind(null, params),\n                focus: params._Focus.bind(params),\n                keyup: AutoComplete.prototype.event.bind(null, params, EventType.KEYUP),\n                keydown: AutoComplete.prototype.event.bind(null, params, EventType.KEYDOWN),\n                position: params._Position.bind(params)\n            };\n            for (var event in params.$Listeners) {\n                params.Input.addEventListener(event, params.$Listeners[event]);\n            }\n        }\n    };\n    AutoComplete.prototype.getEventsByType = function (params, type) {\n        var mappings = {};\n        for (var key in params.KeyboardMappings) {\n            var event = EventType.KEYUP;\n            if (params.KeyboardMappings[key].Event !== undefined) {\n                event = params.KeyboardMappings[key].Event;\n            }\n            if (event == type) {\n                mappings[key] = params.KeyboardMappings[key];\n            }\n        }\n        return mappings;\n    };\n    AutoComplete.prototype.event = function (params, type, event) {\n        var eventIdentifier = function (condition) {\n            if ((match === true && mapping.Operator == ConditionOperator.AND) || (match === false && mapping.Operator == ConditionOperator.OR)) {\n                condition = AutoComplete.merge({\n                    Not: false\n                }, condition);\n                if (condition.hasOwnProperty(\"Is\")) {\n                    if (condition.Is == event.keyCode) {\n                        match = !condition.Not;\n                    }\n                    else {\n                        match = condition.Not;\n                    }\n                }\n                else if (condition.hasOwnProperty(\"From\") && condition.hasOwnProperty(\"To\")) {\n                    if (event.keyCode >= condition.From && event.keyCode <= condition.To) {\n                        match = !condition.Not;\n                    }\n                    else {\n                        match = condition.Not;\n                    }\n                }\n            }\n        };\n        for (var name in AutoComplete.prototype.getEventsByType(params, type)) {\n            var mapping = AutoComplete.merge({\n                Operator: ConditionOperator.AND\n            }, params.KeyboardMappings[name]), match = ConditionOperator.AND == mapping.Operator;\n            mapping.Conditions.forEach(eventIdentifier);\n            if (match === true) {\n                mapping.Callback.call(params, event);\n            }\n        }\n    };\n    AutoComplete.prototype.makeRequest = function (params, callback, callbackErr) {\n        var propertyHttpHeaders = Object.getOwnPropertyNames(params.HttpHeaders), request = new XMLHttpRequest(), method = params._HttpMethod(), url = params._Url(), queryParams = params._Pre(), queryParamsStringify = encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(queryParams);\n        if (method.match(/^GET$/i)) {\n            if (url.indexOf(\"?\") !== -1) {\n                url += \"&\" + queryParamsStringify;\n            }\n            else {\n                url += \"?\" + queryParamsStringify;\n            }\n        }\n        request.open(method, url, true);\n        for (var i = propertyHttpHeaders.length - 1; i >= 0; i--) {\n            request.setRequestHeader(propertyHttpHeaders[i], params.HttpHeaders[propertyHttpHeaders[i]]);\n        }\n        request.onreadystatechange = function () {\n            if (request.readyState == 4 && request.status == 200) {\n                params.$Cache[queryParams] = request.response;\n                callback(request.response);\n            }\n            else if (request.status >= 400) {\n                callbackErr();\n            }\n        };\n        return request;\n    };\n    AutoComplete.prototype.ajax = function (params, request, timeout) {\n        if (timeout === void 0) { timeout = true; }\n        if (params.$AjaxTimer) {\n            window.clearTimeout(params.$AjaxTimer);\n        }\n        if (timeout === true) {\n            params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);\n        }\n        else {\n            if (params.Request) {\n                params.Request.abort();\n            }\n            params.Request = request;\n            params.Request.send(params._QueryArg() + \"=\" + params._Pre());\n        }\n    };\n    AutoComplete.prototype.cache = function (params, callback, callbackErr) {\n        var response = params._Cache(params._Pre());\n        if (response === undefined) {\n            var request = AutoComplete.prototype.makeRequest(params, callback, callbackErr);\n            AutoComplete.prototype.ajax(params, request);\n        }\n        else {\n            callback(response);\n        }\n    };\n    AutoComplete.prototype.destroy = function (params) {\n        for (var event in params.$Listeners) {\n            params.Input.removeEventListener(event, params.$Listeners[event]);\n        }\n        params.DOMResults.parentNode.removeChild(params.DOMResults);\n    };\n    AutoComplete.merge = function () {\n        var merge = {}, tmp;\n        for (var i = 0; i < arguments.length; i++) {\n            for (tmp in arguments[i]) {\n                merge[tmp] = arguments[i][tmp];\n            }\n        }\n        return merge;\n    };\n    AutoComplete.defaults = {\n        Delay: 150,\n        EmptyMessage: \"No result here\",\n        Highlight: {\n            getRegex: function (value) {\n                return new RegExp(value, \"ig\");\n            },\n            transform: function (value) {\n                return \"<strong>\" + value + \"</strong>\";\n            }\n        },\n        HttpHeaders: {\n            \"Content-type\": \"application/x-www-form-urlencoded\"\n        },\n        Limit: 0,\n        MinChars: 0,\n        HttpMethod: \"GET\",\n        QueryArg: \"q\",\n        Url: null,\n        KeyboardMappings: {\n            \"Enter\": {\n                Conditions: [{\n                        Is: 13,\n                        Not: false\n                    }],\n                Callback: function (event) {\n                    if (this.DOMResults.getAttribute(\"class\").indexOf(\"open\") != -1) {\n                        var liActive = this.DOMResults.querySelector(\"li.active\");\n                        if (liActive !== null) {\n                            event.preventDefault();\n                            this._Select(liActive);\n                            this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n                        }\n                    }\n                },\n                Operator: ConditionOperator.AND,\n                Event: EventType.KEYDOWN\n            },\n            \"KeyUpAndDown_down\": {\n                Conditions: [{\n                        Is: 38,\n                        Not: false\n                    },\n                    {\n                        Is: 40,\n                        Not: false\n                    }],\n                Callback: function (event) {\n                    event.preventDefault();\n                },\n                Operator: ConditionOperator.OR,\n                Event: EventType.KEYDOWN\n            },\n            \"KeyUpAndDown_up\": {\n                Conditions: [{\n                        Is: 38,\n                        Not: false\n                    },\n                    {\n                        Is: 40,\n                        Not: false\n                    }],\n                Callback: function (event) {\n                    event.preventDefault();\n                    var first = this.DOMResults.querySelector(\"li:first-child:not(.locked)\"), last = this.DOMResults.querySelector(\"li:last-child:not(.locked)\"), active = this.DOMResults.querySelector(\"li.active\");\n                    if (active) {\n                        var currentIndex = Array.prototype.indexOf.call(active.parentNode.children, active), position = currentIndex + (event.keyCode - 39), lisCount = this.DOMResults.getElementsByTagName(\"li\").length;\n                        if (position < 0) {\n                            position = lisCount - 1;\n                        }\n                        else if (position >= lisCount) {\n                            position = 0;\n                        }\n                        active.classList.remove(\"active\");\n                        active.parentElement.children.item(position).classList.add(\"active\");\n                    }\n                    else if (last && event.keyCode == 38) {\n                        last.classList.add(\"active\");\n                    }\n                    else if (first) {\n                        first.classList.add(\"active\");\n                    }\n                },\n                Operator: ConditionOperator.OR,\n                Event: EventType.KEYUP\n            },\n            \"AlphaNum\": {\n                Conditions: [{\n                        Is: 13,\n                        Not: true\n                    }, {\n                        From: 35,\n                        To: 40,\n                        Not: true\n                    }],\n                Callback: function () {\n                    var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\"), currentValue = this._Pre();\n                    if (currentValue !== \"\" && currentValue.length >= this._MinChars()) {\n                        if (!oldValue || currentValue != oldValue) {\n                            this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n                        }\n                        AutoComplete.prototype.cache(this, function (response) {\n                            this._Render(this._Post(response));\n                            this._Open();\n                        }.bind(this), this._Error);\n                    }\n                    else {\n                        this._Close();\n                    }\n                },\n                Operator: ConditionOperator.AND,\n                Event: EventType.KEYUP\n            }\n        },\n        DOMResults: null,\n        Request: null,\n        Input: null,\n        /**\n         * Return the message when no result returns\n         */\n        _EmptyMessage: function () {\n            var emptyMessage = \"\";\n            if (this.Input.hasAttribute(\"data-autocomplete-empty-message\")) {\n                emptyMessage = this.Input.getAttribute(\"data-autocomplete-empty-message\");\n            }\n            else if (this.EmptyMessage !== false) {\n                emptyMessage = this.EmptyMessage;\n            }\n            else {\n                emptyMessage = \"\";\n            }\n            return emptyMessage;\n        },\n        /**\n         * Returns the maximum number of results\n         */\n        _Limit: function () {\n            var limit = this.Input.getAttribute(\"data-autocomplete-limit\");\n            if (isNaN(limit) || limit === null) {\n                return this.Limit;\n            }\n            return parseInt(limit, 10);\n        },\n        /**\n         * Returns the minimum number of characters entered before firing ajax\n         */\n        _MinChars: function () {\n            var minchars = this.Input.getAttribute(\"data-autocomplete-minchars\");\n            if (isNaN(minchars) || minchars === null) {\n                return this.MinChars;\n            }\n            return parseInt(minchars, 10);\n        },\n        /**\n         * Apply transformation on labels response\n         */\n        _Highlight: function (label) {\n            return label.replace(this.Highlight.getRegex(this._Pre()), this.Highlight.transform);\n        },\n        /**\n         * Returns the HHTP method to use\n         */\n        _HttpMethod: function () {\n            if (this.Input.hasAttribute(\"data-autocomplete-method\")) {\n                return this.Input.getAttribute(\"data-autocomplete-method\");\n            }\n            return this.HttpMethod;\n        },\n        /**\n         * Returns the query param to use\n         */\n        _QueryArg: function () {\n            if (this.Input.hasAttribute(\"data-autocomplete-param-name\")) {\n                return this.Input.getAttribute(\"data-autocomplete-param-name\");\n            }\n            return this.QueryArg;\n        },\n        /**\n         * Returns the URL to use for AJAX request\n         */\n        _Url: function () {\n            if (this.Input.hasAttribute(\"data-autocomplete\")) {\n                return this.Input.getAttribute(\"data-autocomplete\");\n            }\n            return this.Url;\n        },\n        /**\n         * Manage the close\n         */\n        _Blur: function (now) {\n            if (now === void 0) { now = false; }\n            if (now) {\n                this._Close();\n            }\n            else {\n                var params = this;\n                setTimeout(function () {\n                    params._Blur(true);\n                }, 150);\n            }\n        },\n        /**\n         * Manage the cache\n         */\n        _Cache: function (value) {\n            return this.$Cache[value];\n        },\n        /**\n         * Manage the open\n         */\n        _Focus: function () {\n            var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\");\n            if ((!oldValue || this.Input.value != oldValue) && this._MinChars() <= this.Input.value.length) {\n                this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n            }\n        },\n        /**\n         * Bind all results item if one result is opened\n         */\n        _Open: function () {\n            var params = this;\n            Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n                if (li.getAttribute(\"class\") != \"locked\") {\n                    li.onclick = function () {\n                        params._Select(li);\n                    };\n                }\n            });\n        },\n        _Close: function () {\n            this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n        },\n        /**\n         * Position the results HTML element\n         */\n        _Position: function () {\n            this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n            this.DOMResults.setAttribute(\"style\", \"top:\" + (this.Input.offsetTop + this.Input.offsetHeight) + \"px;left:\" + this.Input.offsetLeft + \"px;width:\" + this.Input.clientWidth + \"px;\");\n        },\n        /**\n         * Execute the render of results DOM element\n         */\n        _Render: function (response) {\n            var ul;\n            if (typeof response == \"string\") {\n                ul = this._RenderRaw(response);\n            }\n            else {\n                ul = this._RenderResponseItems(response);\n            }\n            if (this.DOMResults.hasChildNodes()) {\n                this.DOMResults.removeChild(this.DOMResults.childNodes[0]);\n            }\n            this.DOMResults.appendChild(ul);\n        },\n        /**\n         * ResponseItems[] rendering\n         */\n        _RenderResponseItems: function (response) {\n            var ul = document.createElement(\"ul\"), li = document.createElement(\"li\"), limit = this._Limit();\n            // Order\n            if (limit < 0) {\n                response = response.reverse();\n            }\n            else if (limit === 0) {\n                limit = response.length;\n            }\n            for (var item = 0; item < Math.min(Math.abs(limit), response.length); item++) {\n                li.innerHTML = response[item].Label;\n                li.setAttribute(\"data-autocomplete-value\", response[item].Value);\n                ul.appendChild(li);\n                li = document.createElement(\"li\");\n            }\n            return ul;\n        },\n        /**\n         * string response rendering (RAW HTML)\n         */\n        _RenderRaw: function (response) {\n            var ul = document.createElement(\"ul\"), li = document.createElement(\"li\");\n            if (response.length > 0) {\n                this.DOMResults.innerHTML = response;\n            }\n            else {\n                var emptyMessage = this._EmptyMessage();\n                if (emptyMessage !== \"\") {\n                    li.innerHTML = emptyMessage;\n                    li.setAttribute(\"class\", \"locked\");\n                    ul.appendChild(li);\n                }\n            }\n            return ul;\n        },\n        /**\n         * Deal with request response\n         */\n        _Post: function (response) {\n            try {\n                var returnResponse = [];\n                //JSON return\n                var json = JSON.parse(response);\n                if (Object.keys(json).length === 0) {\n                    return \"\";\n                }\n                if (Array.isArray(json)) {\n                    for (var i = 0; i < Object.keys(json).length; i++) {\n                        returnResponse[returnResponse.length] = { \"Value\": json[i], \"Label\": this._Highlight(json[i]) };\n                    }\n                }\n                else {\n                    for (var value in json) {\n                        returnResponse.push({\n                            \"Value\": value,\n                            \"Label\": this._Highlight(json[value])\n                        });\n                    }\n                }\n                return returnResponse;\n            }\n            catch (event) {\n                //HTML return\n                return response;\n            }\n        },\n        /**\n         * Return the autocomplete value to send (before request)\n         */\n        _Pre: function () {\n            return this.Input.value;\n        },\n        /**\n         * Choice one result item\n         */\n        _Select: function (item) {\n            if (item.hasAttribute(\"data-autocomplete-value\")) {\n                this.Input.value = item.getAttribute(\"data-autocomplete-value\");\n            }\n            else {\n                this.Input.value = item.innerHTML;\n            }\n            this.Input.setAttribute(\"data-autocomplete-old-value\", this.Input.value);\n        },\n        /**\n         * Handle HTTP error on the request\n         */\n        _Error: function () {\n        },\n        $AjaxTimer: null,\n        $Cache: {},\n        $Listeners: {}\n    };\n    return AutoComplete;\n}());\nmodule.exports = AutoComplete;\n\n},{}]},{},[1])(1)\n});\n"],"names":["window","searxng","w","d","Element","ElementPrototype","matches","matchesSelector","webkitMatchesSelector","msMatchesSelector","selector","node","this","nodes","parentNode","document","querySelectorAll","i","prototype","callbackSafe","callback","el","e","call","exception","console","log","on","obj","eventType","useCapture","addEventListener","target","srcElement","found","parentElement","ready","readyState","bind","http","method","url","data","Promise","resolve","reject","req","XMLHttpRequest","open","timeout","onload","status","response","responseType","Error","statusText","onerror","onabort","ontimeout","send","ex","loadStyle","src","path","static_path","id","replace","s","getElementById","createElement","setAttribute","body","appendChild","loadScript","hasAttribute","apply","insertBefore","newNode","referenceNode","insertAfter","nextSibling","classList","add","getEndpoint","className","getElementsByTagName","values","endsWith","split","endpoint","infinite_scroll_supported","IntersectionObserverEntry","let","onlyImages","contains","newLoadSpinner","loader","replaceChildrenWith","element","children","textContent","forEach","child","loadNextPage","form","querySelector","formData","FormData","getAttribute","then","nextPageDoc","DOMParser","parseFromString","articleList","paginationElement","remove","length","articleElement","catch","err","translations","error_loading_next_page","infinite_scroll","intersectionObserveOptions","rootMargin","observedSelector","observer","IntersectionObserver","entries","paginationEntry","isIntersecting","unobserve","observe","isElementInDetail","undefined","getResultElement","isImageResult","resultElement","highlightResult","preventDefault","selectImage","vimKeys","27","key","fun","removeFocus","des","cat","73","searchInputFocus","66","scrollPage","innerHeight","70","85","68","71","scrollPageTo","scrollHeight","86","75","74","80","GoToPreviousPage","78","GoToNextPage","79","openResult","84","82","reloadPage","72","toggleHelp","hotkeys","Object","hasOwnProperty","keyCode","ctrlKey","altKey","shiftKey","metaKey","tagName","toLowerCase","which","noScroll","current","effectiveWhich","next","results","top","documentElement","scrollTop","bot","clientHeight","etop","offsetTop","ebot","nextElementSibling","previousElementSibling","removeAttribute","link","focus","scrollPageToSelected","location","reload","activeElement","blur","closeDetail","pageButtonClick","css_selector","button","click","sel","wtop","wheight","offset","scroll","scrollX","wbot","amount","scrollBy","position","nav","scrollTo","newTab","href","initHelpContent","divElement","categories","k","push","sorted","keys","sort","a","b","html","lastCategory","first","cj","innerHTML","helpPanel","toggle","selectNext","selectPrevious","event","leaflet_target","dataset","leafletTarget","map_lon","parseFloat","mapLon","map_lat","mapLat","map_zoom","mapZoom","map_boundingbox","JSON","parse","mapBoundingbox","map_geojson","mapGeojson","map_bounds","southWest","L","latLng","northEast","latLngBounds","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","TileLayer","minZoom","maxZoom","attribution","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","setTimeout","fitBounds","setView","addLayer","baseLayers","OSM Mapnik","OSM Wikimedia","control","layers","addTo","geoJson","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","img","style","display","error","btnLabelCollapsed","btnLabelNotCollapsed","targetElement","iframe_load","srctest","imgElement","thumbnailElement","detailElement","imgSrc","imgLoader","Image","firstFocus","qinput_id","qinput","placeCursorAtEnd","setSelectionRange","len","value","submitIfQuery","search","submit","createClearButton","cs","updateClearButton","ev","placeCursorAtEndOnce","autocompleter","autocomplete","AutoComplete","Url","EmptyMessage","no_item_found","HttpMethod","HttpHeaders","Content-type","X-Requested-With","MinChars","Delay","_Position","DOMResults","Input","offsetHeight","left","offsetLeft","width","clientWidth","_Open","params","Array","li","onmousedown","_Select","CustomEvent","dispatchEvent","search_on_category_select","checked","f","exports","module","define","amd","g","global","self","r","n","t","o","c","require","u","code","p","1","ConditionOperator","EventType","isArray","input","specificParams","merge","defaults","create","nodeName","match","$Listeners","_Blur","destroy","_Focus","keyup","KEYUP","keydown","KEYDOWN","getEventsByType","type","mappings","KeyboardMappings","Event","eventIdentifier","condition","mapping","Operator","AND","OR","Not","Is","From","To","name","Conditions","Callback","makeRequest","callbackErr","propertyHttpHeaders","getOwnPropertyNames","request","_HttpMethod","_Url","queryParams","_Pre","queryParamsStringify","encodeURIComponent","_QueryArg","indexOf","setRequestHeader","onreadystatechange","$Cache","ajax","$AjaxTimer","clearTimeout","Request","abort","cache","_Cache","removeEventListener","removeChild","tmp","arguments","Highlight","getRegex","RegExp","transform","Limit","QueryArg","Enter","liActive","KeyUpAndDown_down","KeyUpAndDown_up","last","active","currentIndex","lisCount","item","AlphaNum","oldValue","currentValue","_MinChars","_Render","_Post","_Error","_Close","_EmptyMessage","emptyMessage","_Limit","limit","isNaN","parseInt","minchars","_Highlight","label","now","onclick","ul","_RenderRaw","_RenderResponseItems","hasChildNodes","childNodes","reverse","Math","min","abs","Label","Value","returnResponse","json"],"mappings":";;;;;GAMAA;OAAOC,QAAU,SAAWC,EAAGC,gBAQ7B,GAAID,EAAEE,QAAS,EACb,SAAWC,GACTA,EAAiBC,QAAUD,EAAiBC,SAC5CD,EAAiBE,iBACjBF,EAAiBG,uBACjBH,EAAiBI,mBACjB,SAAUC,GACR,IAAIC,EAAOC,KAAMC,GAASF,EAAKG,YAAcH,EAAKI,UAAUC,iBAAiBN,GAAWO,GAAK,EAC7F,MAAOJ,IAAQI,IAAMJ,EAAMI,IAAMN,GACjC,QAASE,EAAMI,KARnB,CAUGb,QAAQc,WAGb,SAASC,EAAcC,EAAUC,EAAIC,GACnC,IACEF,EAASG,KAAKF,EAAIC,GAClB,MAAOE,GACPC,QAAQC,IAAIF,IAIhB,IAAIvB,EAAUD,OAAOC,SAAW,GAEhCA,EAAQ0B,GAAK,SAAUC,EAAKC,EAAWT,EAAUU,GAC/CA,EAAaA,GAAc,MAC3B,UAAWF,IAAQ,SAAU,CAE3BA,EAAIG,iBAAiBF,EAAWT,EAAUU,OACrC,CAEL3B,EAAE4B,iBAAiBF,EAAW,SAAUP,GACtC,IAAID,EAAKC,EAAEU,QAAUV,EAAEW,WAAYC,EAAQ,MAC3C,MAAOb,GAAMA,EAAGf,SAAWe,IAAOlB,KAAO+B,EAAQb,EAAGf,QAAQsB,IAAOP,EAAKA,EAAGc,cAC3E,GAAID,EAAOf,EAAaC,EAAUC,EAAIC,IACrCQ,KAIP7B,EAAQmC,MAAQ,SAAUhB,GACxB,GAAIL,SAASsB,YAAc,UAAW,CACpCjB,EAASG,KAAKrB,OACT,CACLA,EAAE6B,iBAAiB,mBAAoBX,EAASkB,KAAKpC,MAIzDD,EAAQsC,KAAO,SAAUC,EAAQC,EAAKC,EAAO,MAC3C,OAAO,IAAIC,QAAQ,SAAUC,EAASC,GACpC,IACE,IAAIC,EAAM,IAAIC,eACdD,EAAIE,KAAKR,EAAQC,EAAK,MACtBK,EAAIG,QAAU,IAGdH,EAAII,OAAS,WACX,GAAIJ,EAAIK,QAAU,IAAK,CACrBP,EAAQE,EAAIM,SAAUN,EAAIO,kBACrB,CACLR,EAAOS,MAAMR,EAAIS,eAKrBT,EAAIU,QAAU,WACZX,EAAOS,MAAM,mBAGfR,EAAIW,QAAU,WACZZ,EAAOS,MAAM,4BAGfR,EAAIY,UAAY,WACdb,EAAOS,MAAM,aAIf,GAAIZ,EAAM,CACRI,EAAIa,KAAKjB,OACJ,CACLI,EAAIa,QAEN,MAAOC,GACPf,EAAOe,OAKb3D,EAAQ4D,UAAY,SAAUC,GAC5B,IAAIC,EAAO9D,EAAQ+D,YAAcF,EAC/BG,EAAK,SAAWH,EAAII,QAAQ,IAAK,KACjCC,EAAIhE,EAAEiE,eAAeH,GACvB,GAAIE,IAAM,KAAM,CACdA,EAAIhE,EAAEkE,cAAc,QACpBF,EAAEG,aAAa,KAAML,GACrBE,EAAEG,aAAa,MAAO,cACtBH,EAAEG,aAAa,OAAQ,YACvBH,EAAEG,aAAa,OAAQP,GACvB5D,EAAEoE,KAAKC,YAAYL,KAIvBlE,EAAQwE,WAAa,SAAUX,EAAK1C,GAClC,IAAI2C,EAAO9D,EAAQ+D,YAAcF,EAC/BG,EAAK,UAAYH,EAAII,QAAQ,IAAK,KAClCC,EAAIhE,EAAEiE,eAAeH,GACvB,GAAIE,IAAM,KAAM,CACdA,EAAIhE,EAAEkE,cAAc,UACpBF,EAAEG,aAAa,KAAML,GACrBE,EAAEG,aAAa,MAAOP,GACtBI,EAAEjB,OAAS9B,EACX+C,EAAEX,QAAU,WACVW,EAAEG,aAAa,QAAS,MAE1BnE,EAAEoE,KAAKC,YAAYL,QACd,IAAKA,EAAEO,aAAa,SAAU,CACnC,IACEtD,EAASuD,MAAMR,EAAG,IAClB,MAAO3C,GACPC,QAAQC,IAAIF,QAET,CACLC,QAAQC,IAAI,mCAAqCqC,EAAO,mBAI5D9D,EAAQ2E,aAAe,SAAUC,EAASC,GACxCA,EAAchE,WAAW8D,aAAaC,EAASC,IAGjD7E,EAAQ8E,YAAc,SAAUF,EAASC,GACvCA,EAAchE,WAAWiE,YAAYF,EAASC,EAAcE,cAG9D/E,EAAQ0B,GAAG,SAAU,QAAS,WAC5Bf,KAAKE,WAAWmE,UAAUC,IAAI,eAGhC,SAASC,IACP,IAAK,IAAIC,KAAajF,EAAEkF,qBAAqB,QAAQ,GAAGJ,UAAUK,SAAU,CAC1E,GAAIF,EAAUG,SAAS,aAAc,CACnC,OAAOH,EAAUI,MAAM,KAAK,IAGhC,MAAO,GAGTvF,EAAQwF,SAAWN,IAEnB,OAAOlF,EA7JQ,CA8JdD,OAAQe,UChKXd,QAAQmC,MAAM,wBAGZnC,QAAQyF,0BACN,yBAA0B1F,QAC1B,8BAA+BA,QAC/B,sBAAuBA,OAAO2F,0BAA0BzE,UAE1D,GAAIjB,QAAQwF,WAAa,UAAW,CAClC,OAGF,IAAKxF,QAAQyF,0BAA2B,CACtCjE,QAAQC,IAAI,sCACZ,OAGFkE,IAAIzF,EAAIY,SACR,IAAI8E,EAAa1F,EAAEiE,eAAe,WAAWa,UAAUa,SAAS,wBAEhE,SAASC,IACP,IAAIC,EAAS7F,EAAEkE,cAAc,OAC7B2B,EAAOf,UAAUC,IAAI,UACrB,OAAOc,EAGT,SAASC,EAAqBC,EAASC,GACrCD,EAAQE,YAAc,GACtBD,EAASE,QAAQC,GAASJ,EAAQ1B,YAAY8B,IAGhD,SAASC,EAAcnF,GACrB,IAAIoF,EAAOrG,EAAEsG,cAAc,8BAC3B,IAAKD,EAAM,CACT,OAEFP,EAAoB9F,EAAEsG,cAAc,eAAgB,CAAEV,MACtD,IAAIW,EAAW,IAAIC,SAASH,GAC5BvG,QAAQsC,KAAK,OAAQpC,EAAEsG,cAAc,WAAWG,aAAa,UAAWF,GAAUG,KAChF,SAAUzD,GACR,IAAI0D,GAAc,IAAIC,WAAYC,gBAAgB5D,EAAU,aAC5D,IAAI6D,EAAcH,EAAY9F,iBAAiB,iBAC/C,IAAIkG,EAAoBJ,EAAYL,cAAc,eAClDtG,EAAEsG,cAAc,eAAeU,SAC/B,GAAIF,EAAYG,OAAS,IAAMvB,EAAY,CAEzC1F,EAAEsG,cAAc,SAASjC,YAAYrE,EAAEkE,cAAc,OAEvD4C,EAAYZ,QAAQgB,IAClBlH,EAAEsG,cAAc,SAASjC,YAAY6C,KAEvC,GAAIH,EAAmB,CACrB/G,EAAEsG,cAAc,YAAYjC,YAAY0C,GACxC9F,OAGJkG,MACA,SAAUC,GACR9F,QAAQC,IAAI6F,GACZ,IAAIjG,EAAInB,EAAEkE,cAAc,OACxB/C,EAAE8E,YAAcnG,QAAQuH,aAAaC,wBACrCnG,EAAE2D,UAAUC,IAAI,gBAChB5D,EAAEgD,aAAa,OAAQ,SACvB2B,EAAoB9F,EAAEsG,cAAc,eAAgB,CAAEnF,MAK5D,GAAIrB,QAAQyH,iBAAmBzH,QAAQyF,0BAA2B,CAChE,MAAMiC,EAA6B,CACjCC,WAAY,SAEd,MAAMC,EAAmB,4BACzB,MAAMC,EAAW,IAAIC,qBAAqBC,IACxC,MAAMC,EAAkBD,EAAQ,GAChC,GAAIC,EAAgBC,eAAgB,CAClCJ,EAASK,UAAUF,EAAgBjG,QACnCuE,EAAa,IAAMuB,EAASM,QAAQjI,EAAEsG,cAAcoB,GAAmBF,OAG3EG,EAASM,QAAQjI,EAAEsG,cAAcoB,GAAmBF,MCjFxD1H,QAAQmC,MAAM,WAEZ,SAASiG,EAAmBhH,GAC1B,MAAOA,IAAOiH,UAAW,CACvB,GAAIjH,EAAG4D,UAAUa,SAAS,UAAW,CACnC,OAAO,KAET,GAAIzE,EAAG4D,UAAUa,SAAS,UAAW,CAGnC,OAAO,MAETzE,EAAKA,EAAGP,WAEV,OAAO,MAGT,SAASyH,EAAkBlH,GACzB,MAAOA,IAAOiH,UAAW,CACvB,GAAIjH,EAAG4D,UAAUa,SAAS,UAAW,CACnC,OAAOzE,EAETA,EAAKA,EAAGP,WAEV,OAAOwH,UAGT,SAASE,EAAeC,GACtB,OAAOA,GAAiBA,EAAcxD,UAAUa,SAAS,iBAG3D7F,QAAQ0B,GAAG,UAAW,QAAS,SAAUL,GACvC,IAAK+G,EAAkB/G,EAAEU,QAAS,CAChC0G,EAAgB9H,KAAhB8H,CAAsB,MACtB9C,IAAI6C,EAAgBF,EAAiBjH,EAAEU,QACvC,GAAIwG,EAAcC,GAAgB,CAChCnH,EAAEqH,iBACF1I,QAAQ2I,YAAYH,OAK1BxI,QAAQ0B,GAAG,YAAa,QAAS,SAAUL,GACzC,IAAK+G,EAAkB/G,EAAEU,QAAS,CAChC4D,IAAI6C,EAAgBF,EAAiBjH,EAAEU,QACvC,GAAIyG,GAAiBA,EAAc7B,aAAa,uBAAyB,KAAM,CAC7E8B,EAAgBD,EAAhBC,CAA+B,MAEjC,GAAIF,EAAcC,GAAgB,CAChCxI,QAAQ2I,YAAYH,MAGvB,MAEH,IAAII,EAAU,CACZC,GAAI,CACFC,IAAK,SACLC,IAAKC,EACLC,IAAK,sCACLC,IAAK,WAEPC,GAAI,CACFL,IAAK,IACLC,IAAKK,EACLH,IAAK,4BACLC,IAAK,WAEPG,GAAI,CACFP,IAAK,IACLC,IAAKO,GAAYvJ,OAAOwJ,aACxBN,IAAK,qBACLC,IAAK,cAEPM,GAAI,CACFV,IAAK,IACLC,IAAKO,EAAWvJ,OAAOwJ,aACvBN,IAAK,uBACLC,IAAK,cAEPO,GAAI,CACFX,IAAK,IACLC,IAAKO,GAAYvJ,OAAOwJ,YAAc,GACtCN,IAAK,wBACLC,IAAK,cAEPQ,GAAI,CACFZ,IAAK,IACLC,IAAKO,EAAWvJ,OAAOwJ,YAAc,GACrCN,IAAK,0BACLC,IAAK,cAEPS,GAAI,CACFb,IAAK,IACLC,IAAKa,GAAc9I,SAASwD,KAAKuF,aAAc,OAC/CZ,IAAK,gCACLC,IAAK,cAEPY,GAAI,CACFhB,IAAK,IACLC,IAAKa,EAAa9I,SAASwD,KAAKuF,aAAc,UAC9CZ,IAAK,mCACLC,IAAK,cAEPa,GAAI,CACFjB,IAAK,IACLC,IAAKN,EAAgB,MACrBQ,IAAK,gCACLC,IAAK,WAEPc,GAAI,CACFlB,IAAK,IACLC,IAAKN,EAAgB,QACrBQ,IAAK,4BACLC,IAAK,WAEPe,GAAI,CACFnB,IAAK,IACLC,IAAKmB,IACLjB,IAAK,sBACLC,IAAK,WAEPiB,GAAI,CACFrB,IAAK,IACLC,IAAKqB,IACLnB,IAAK,kBACLC,IAAK,WAEPmB,GAAI,CACFvB,IAAK,IACLC,IAAKuB,EAAW,OAChBrB,IAAK,qBACLC,IAAK,WAEPqB,GAAI,CACFzB,IAAK,IACLC,IAAKuB,EAAW,MAChBrB,IAAK,+BACLC,IAAK,WAEPsB,GAAI,CACF1B,IAAK,IACLC,IAAK0B,EACLxB,IAAK,8BACLC,IAAK,WAEPwB,GAAI,CACF5B,IAAK,IACLC,IAAK4B,EACL1B,IAAK,qBACLC,IAAK,UAIT,GAAIlJ,QAAQ4K,QAAS,CACnB5K,QAAQ0B,GAAGZ,SAAU,UAAW,SAAUO,GAExC,GAAIwJ,OAAO5J,UAAU6J,eAAexJ,KAAKsH,EAASvH,EAAE0J,WAAa1J,EAAE2J,UAAY3J,EAAE4J,SAAW5J,EAAE6J,WAAa7J,EAAE8J,QAAS,CACpH,IAAIC,EAAU/J,EAAEU,OAAOqJ,QAAQC,cAC/B,GAAIhK,EAAE0J,UAAY,GAAI,CACpBnC,EAAQvH,EAAE0J,SAAShC,IAAI1H,OAClB,CACL,GAAIA,EAAEU,SAAWjB,SAASwD,MAAQ8G,IAAY,KAAOA,IAAY,SAAU,CACzE/J,EAAEqH,iBACFE,EAAQvH,EAAE0J,SAAShC,WAO7B,SAASN,EAAiB6C,GACxB,OAAO,SAAUC,GACf,IAAIC,EAAU1K,SAAS0F,cAAc,8BACnCiF,EAAiBH,EACnB,GAAIE,IAAY,KAAM,CAEpBA,EAAU1K,SAAS0F,cAAc,WACjC,GAAIgF,IAAY,KAAM,CAEpB,OAGF,GAAIF,IAAU,QAAUA,IAAU,KAAM,CACtCG,EAAiBD,GAIrB,IAAIE,EAAMC,EAAU7K,SAASC,iBAAiB,WAE9C,UAAW0K,IAAmB,SAAU,CACtCC,EAAOD,MACF,CACL,OAAQA,GACR,IAAK,UACH,IAAIG,EAAM9K,SAAS+K,gBAAgBC,WAAahL,SAASwD,KAAKwH,UAC9D,IAAIC,EAAMH,EAAM9K,SAAS+K,gBAAgBG,aAEzC,IAAK,IAAIhL,EAAI,EAAGA,EAAI2K,EAAQxE,OAAQnG,IAAK,CACvC0K,EAAOC,EAAQ3K,GACf,IAAIiL,EAAOP,EAAKQ,UAChB,IAAIC,EAAOF,EAAOP,EAAKM,aAEvB,GAAKG,GAAQJ,GAASE,EAAOL,EAAM,CACjC,OAGJ,MACF,IAAK,OACHF,EAAOF,EAAQY,mBACf,GAAIV,IAAS,KAAM,CACjBA,EAAOC,EAAQ,GAEjB,MACF,IAAK,KACHD,EAAOF,EAAQa,uBACf,GAAIX,IAAS,KAAM,CACjBA,EAAOC,EAAQA,EAAQxE,OAAS,GAElC,MACF,IAAK,SACHuE,EAAOC,EAAQA,EAAQxE,OAAS,GAChC,MACF,IAAK,MAEL,QACEuE,EAAOC,EAAQ,IAInB,GAAID,EAAM,CACRF,EAAQc,gBAAgB,qBACxBZ,EAAKrH,aAAa,oBAAqB,QACvC,IAAIkI,EAAOb,EAAKlF,cAAc,SAAWkF,EAAKlF,cAAc,KAC5D,GAAI+F,IAAS,KAAM,CACjBA,EAAKC,QAEP,IAAKjB,EAAU,CACbkB,OAMR,SAAShC,IACP3J,SAAS4L,SAASC,OAAO,MAG3B,SAAS3D,EAAa3H,GACpB,MAAM+J,EAAU/J,EAAEU,OAAOqJ,QAAQC,cACjC,GAAIvK,SAAS8L,gBAAkBxB,IAAY,SAAWA,IAAY,UAAYA,IAAY,YAAa,CACrGtK,SAAS8L,cAAcC,WAClB,CACL7M,QAAQ8M,eAIZ,SAASC,EAAiBC,GACxB,OAAO,WACL,IAAIC,EAASnM,SAAS0F,cAAcwG,GACpC,GAAIC,EAAQ,CACVA,EAAOC,UAKb,SAAS9C,IACP,OAAO2C,EAAgB,mDAGzB,SAAS7C,IACP,OAAO6C,EAAgB,uDAGzB,SAASN,IACP,IAAIU,EAAMrM,SAAS0F,cAAc,8BACjC,GAAI2G,IAAQ,KAAM,CAChB,OAEF,IAAIC,EAAOtM,SAAS+K,gBAAgBC,WAAahL,SAASwD,KAAKwH,UAC7DuB,EAAUvM,SAAS+K,gBAAgBG,aACnCC,EAAOkB,EAAIjB,UACXC,EAAOF,EAAOkB,EAAInB,aAClBsB,EAAS,IAEX,GAAKH,EAAId,yBAA2B,MAAUF,EAAOkB,EAAU,CAG7DtN,OAAOwN,OAAOxN,OAAOyN,QAAS,GAC9B,OAEF,GAAIJ,EAAQnB,EAAOqB,EAAS,CAC1BvN,OAAOwN,OAAOxN,OAAOyN,QAASvB,EAAOqB,OAChC,CACL,IAAIG,EAAOL,EAAOC,EAClB,GAAII,EAAQtB,EAAOmB,EAAS,CAC1BvN,OAAOwN,OAAOxN,OAAOyN,QAASrB,EAAOkB,EAAUC,KAKrD,SAAShE,EAAYoE,GACnB,OAAO,WACL3N,OAAO4N,SAAS,EAAGD,GACnBjF,EAAgB,UAAhBA,IAIJ,SAASmB,EAAcgE,EAAUC,GAC/B,OAAO,WACL9N,OAAO+N,SAAS,EAAGF,GACnBnF,EAAgBoF,EAAhBpF,IAIJ,SAASW,IACPrJ,OAAO+N,SAAS,EAAG,GACnBhN,SAAS0F,cAAc,MAAMgG,QAG/B,SAASlC,EAAYyD,GACnB,OAAO,WACL,IAAIxB,EAAOzL,SAAS0F,cAAc,mCAClC,GAAI+F,IAAS,KAAM,CACjBA,EAAOzL,SAAS0F,cAAc,kCAEhC,GAAI+F,IAAS,KAAM,CACjB,IAAI/J,EAAM+J,EAAK5F,aAAa,QAC5B,GAAIoH,EAAQ,CACVhO,OAAOgD,KAAKP,OACP,CACLzC,OAAO2M,SAASsB,KAAOxL,KAM/B,SAASyL,EAAiBC,GACxB,IAAIC,EAAa,GAEjB,IAAK,IAAIC,KAAKxF,EAAS,CACrB,IAAIE,EAAMF,EAAQwF,GAClBD,EAAWrF,EAAII,KAAOiF,EAAWrF,EAAII,MAAQ,GAC7CiF,EAAWrF,EAAII,KAAKmF,KAAKvF,GAG3B,IAAIwF,EAASzD,OAAO0D,KAAKJ,GAAYK,KAAK,SAAUC,EAAGC,GACrD,OAAOP,EAAWO,GAAGvH,OAASgH,EAAWM,GAAGtH,SAG9C,GAAImH,EAAOnH,SAAW,EAAG,CACvB,OAGF,IAAIwH,EAAO,mEACXA,GAAQ,uDACRA,GAAQ,UAER,IAAK,IAAI3N,EAAI,EAAGA,EAAIsN,EAAOnH,OAAQnG,IAAK,CACtC,IAAIkI,EAAMiF,EAAWG,EAAOtN,IAE5B,IAAI4N,EAAe5N,IAAOsN,EAAOnH,OAAS,EAC1C,IAAI0H,EAAQ7N,EAAI,IAAM,EAEtB,GAAI6N,EAAO,CACTF,GAAQ,OAEVA,GAAQ,OAERA,GAAQ,OAASzF,EAAI,GAAGA,IAAM,QAC9ByF,GAAQ,6BAER,IAAK,IAAIG,KAAM5F,EAAK,CAClByF,GAAQ,YAAczF,EAAI4F,GAAIhG,IAAM,UAAYI,EAAI4F,GAAI7F,IAAM,QAGhE0F,GAAQ,QACRA,GAAQ,QAER,IAAKE,GAASD,EAAc,CAC1BD,GAAQ,SAIZA,GAAQ,WAERT,EAAWa,UAAYJ,EAGzB,SAAShE,IACP,IAAIqE,EAAYlO,SAAS0F,cAAc,qBACvC,GAAIwI,IAAc3G,WAAa2G,IAAc,KAAM,CAEjDA,EAAYlO,SAASsD,cAAc,OACnC4K,EAAUhL,GAAK,mBACfgL,EAAU7J,UAAY,eACtB8I,EAAgBe,GAChBf,EAAgBe,GAChBf,EAAgBe,GAChB,IAAI1K,EAAOxD,SAASsE,qBAAqB,QAAQ,GACjDd,EAAKC,YAAYyK,OACZ,CAELA,EAAUhK,UAAUiK,OAAO,aAC3B,QAIJjP,QAAQyM,qBAAuBA,EAC/BzM,QAAQkP,WAAazG,EAAgB,QACrCzI,QAAQmP,eAAiB1G,EAAgB,SC1Z3C,SAAWxI,EAAGC,EAAGF,gBAGfA,EAAQmC,MAAM,WACZnC,EAAQ0B,GAAG,oBAAqB,QAAS,SAAU0N,GAEjDzO,KAAKqE,UAAUkC,OAAO,oBAGtB,IAAImI,EAAiB1O,KAAK2O,QAAQC,cAClC,IAAIC,EAAUC,WAAW9O,KAAK2O,QAAQI,QACtC,IAAIC,EAAUF,WAAW9O,KAAK2O,QAAQM,QACtC,IAAIC,EAAWJ,WAAW9O,KAAK2O,QAAQQ,SACvC,IAAIC,EAAkBC,KAAKC,MAAMtP,KAAK2O,QAAQY,gBAC9C,IAAIC,EAAcH,KAAKC,MAAMtP,KAAK2O,QAAQc,YAE1CpQ,EAAQ4D,UAAU,mBAClB5D,EAAQwE,WAAW,gBAAiB,WAClC,IAAI6L,EAAa,KACjB,GAAIN,EAAiB,CACnB,IAAIO,EAAYC,EAAEC,OAAOT,EAAgB,GAAIA,EAAgB,IAC7D,IAAIU,EAAYF,EAAEC,OAAOT,EAAgB,GAAIA,EAAgB,IAC7DM,EAAaE,EAAEG,aAAaJ,EAAWG,GAIzC,IAAIE,EAAMJ,EAAEI,IAAItB,GAEhB,IAAIuB,EAAe,qDACnB,IAAIC,EAAkB,gFACtB,IAAIC,EAAY,IAAIP,EAAEQ,UAAUH,EAAc,CAACI,QAAS,EAAGC,QAAS,GAAIC,YAAaL,IACrF,IAAIM,EAAkB,sDACtB,IAAIC,EAAqB,kGACzB,IAAIC,EAAe,IAAId,EAAEQ,UAAUI,EAAiB,CAACH,QAAS,EAAGC,QAAS,GAAIC,YAAaE,IAE3F,GAAIf,EAAY,CAGdiB,WAAW,WACTX,EAAIY,UAAUlB,EAAY,CACxBY,QAAS,MAEV,QACE,GAAIzB,GAAWG,EAAS,CAC7B,GAAIE,EAAU,CACZc,EAAIa,QAAQ,IAAIjB,EAAEC,OAAOb,EAASH,GAAUK,OACvC,CACLc,EAAIa,QAAQ,IAAIjB,EAAEC,OAAOb,EAASH,GAAU,IAIhDmB,EAAIc,SAASX,GAEb,IAAIY,EAAa,CACfC,aAAcb,EACdc,gBAAiBP,GAGnBd,EAAEsB,QAAQC,OAAOJ,GAAYK,MAAMpB,GAEnC,GAAIR,EAAa,CACfI,EAAEyB,QAAQ7B,GAAa4B,MAAMpB,MAOjCvB,EAAM1G,sBApEZ,CAuEG3I,OAAQe,SAAUf,OAAOC,UCxE5B,SAAWC,EAAGC,EAAGF,gBAGf,GAAIA,EAAQwF,WAAa,cAAe,CACtC,OAGFxF,EAAQmC,MAAM,WACZwD,IAAIsM,EAAsB,KAC1B,SAASC,IACP,GAAID,GAAuB,KAAM,CAC/BjS,EAAQsC,KAAK,MAAO,4BAA4BsE,KAAK,SAAUuL,GAC7DF,EAAsBjC,KAAKC,MAAMkC,GACjC,IAAK,KAAM,CAACC,EAAaC,KAAgBxH,OAAO9C,QAAQkK,GAAsB,CAC5EtM,IAAI2M,EAAWpS,EAAEa,iBAAiB,sBAAwBqR,EAAc,0BACxE,IAAK,MAAMnM,KAAWqM,EAAU,CAC9B3M,IAAI4M,EAAS,QAAUvS,EAAQuH,aAAa,UAAY,UAAY8K,EAAY,GAAK,QACrFpM,EAAQ8I,UAAYsD,EAAY,GAAKE,OAO/C,IAAK,MAAMnR,KAAMlB,EAAEa,iBAAiB,sBAAuB,CACzDf,EAAQ0B,GAAGN,EAAI,aAAc8Q,OAzBnC,CA4BGnS,OAAQe,SAAUf,OAAOC,UC5B5B,SAAWC,EAAGC,EAAGF,gBAGf,GAAIA,EAAQwF,WAAa,UAAW,CAClC,OAGFxF,EAAQmC,MAAM,WACZjC,EAAEa,iBAAiB,mBAAmBqF,QACpCoM,GACEA,EAAI1Q,iBACF,QAAS,KACP0Q,EAAIC,MAAMC,QAAU,OACpBF,EAAIG,MAAQ,QAIpB3S,EAAQ0B,GAAG,gBAAiB,QAAS,WACnC,IAAIkR,EAAoBjS,KAAKgG,aAAa,2BAC1C,IAAIkM,EAAuBlS,KAAKgG,aAAa,+BAC7C,IAAI5E,EAASpB,KAAKgG,aAAa,eAC/B,IAAImM,EAAgB5S,EAAEsG,cAAczE,GACpC,IAAI4M,EAAOhO,KAAKoO,UAChB,GAAIpO,KAAKqE,UAAUa,SAAS,aAAc,CACxC8I,EAAOA,EAAK1K,QAAQ2O,EAAmBC,OAClC,CACLlE,EAAOA,EAAK1K,QAAQ4O,EAAsBD,GAE5CjS,KAAKoO,UAAYJ,EACjBhO,KAAKqE,UAAUiK,OAAO,aACtB6D,EAAc9N,UAAUiK,OAAO,eAGjCjP,EAAQ0B,GAAG,gBAAiB,QAAS,WACnC,IAAIK,EAASpB,KAAKgG,aAAa,eAC/B,IAAIoM,EAAc7S,EAAEsG,cAAczE,EAAS,aAC3C,IAAIiR,EAAUD,EAAYpM,aAAa,OACvC,GAAIqM,IAAY,MAAQA,IAAY3K,WAAa2K,IAAY,MAAO,CAClED,EAAY1O,aAAa,MAAO0O,EAAYpM,aAAa,gBAI7D3G,EAAQ2I,YAAc,SAAUH,GAE9B,GAAIA,EAAe,CAEjB,MAAMyK,EAAazK,EAAchC,cAAc,6BAC/C,MAAM0M,EAAmB1K,EAAchC,cAAc,oBACrD,MAAM2M,EAAgB3K,EAAchC,cAAc,WAClD,GAAIyM,EAAY,CACd,MAAMG,EAASH,EAAWtM,aAAa,YACvC,GAAIyM,EAAQ,CACV,MAAMrN,EAAS7F,EAAEkE,cAAc,OAC/B,MAAMiP,EAAY,IAAIC,MAEtBvN,EAAOf,UAAUC,IAAI,UACrBkO,EAAc5O,YAAYwB,GAE1BsN,EAAUpQ,OAAS5B,IACjB4R,EAAWpP,IAAMuP,EACjBrN,EAAOmB,UAETmM,EAAU9P,QAAUlC,IAClB0E,EAAOmB,UAETmM,EAAUxP,IAAMuP,EAChBH,EAAWpP,IAAMqP,EAAiBrP,IAClCoP,EAAW3G,gBAAgB,cAIjCpM,EAAEiE,eAAe,WAAWa,UAAUC,IAAI,qBAC1CjF,EAAQyM,wBAGVzM,EAAQ8M,YAAc,SAAUzL,GAC9BnB,EAAEiE,eAAe,WAAWa,UAAUkC,OAAO,qBAC7ClH,EAAQyM,wBAEVzM,EAAQ0B,GAAG,uBAAwB,QAASL,IAC1CA,EAAEqH,iBACF1I,EAAQ8M,gBAEV9M,EAAQ0B,GAAG,0BAA2B,QAASL,GAAKrB,EAAQmP,eAAe,QAC3EnP,EAAQ0B,GAAG,sBAAuB,QAASL,GAAKrB,EAAQkP,WAAW,QAEnEjP,EAAE6B,iBAAiB,SAAU,WAC3B,IAAIT,EAAInB,EAAEiE,eAAe,aACvB2H,EAAYhL,SAAS+K,gBAAgBC,WAAahL,SAASwD,KAAKwH,UAChEH,EAAUzL,EAAEiE,eAAe,WAC7B,GAAI9C,IAAM,KAAM,CACd,GAAIyK,GAAa,IAAK,CACpBH,EAAQ3G,UAAUC,IAAI,iBACjB,CACL0G,EAAQ3G,UAAUkC,OAAO,gBAG5B,SAjGP,CAqGGnH,OAAQe,SAAUf,OAAOC,UCpG5B,SAAWC,EAAGC,EAAGF,gBAGf,IAAIuT,EAAa,KAAMC,EAAY,IAAKC,EAExC,SAASC,EAAkBzN,GACzB,GAAIA,EAAQ0N,kBAAmB,CAC7B,IAAIC,EAAM3N,EAAQ4N,MAAM1M,OACxBlB,EAAQ0N,kBAAkBC,EAAKA,IAInC,SAASE,IACP,GAAIL,EAAOI,MAAM1M,OAAU,EAAG,CAC5B,IAAI4M,EAASjT,SAASqD,eAAe,UACrCmN,WAAWyC,EAAOC,OAAO3R,KAAK0R,GAAS,IAI3C,SAASE,EAAmBR,GAC1B,IAAIS,EAAKpT,SAASqD,eAAe,gBACjC,IAAIgQ,EAAoB,WACtB,GAAIV,EAAOI,MAAM1M,SAAW,EAAG,CAC7B+M,EAAGlP,UAAUC,IAAI,aACZ,CACLiP,EAAGlP,UAAUkC,OAAO,WAKxBiN,IACAD,EAAGpS,iBAAiB,QAAS,SAAUsS,GACrCX,EAAOI,MAAQ,GACfJ,EAAOjH,QACP2H,IACAC,EAAG1L,mBAEL+K,EAAO3R,iBAAiB,QAASqS,EAAmB,OAGtDnU,EAAQmC,MAAM,WACZsR,EAASvT,EAAEiE,eAAeqP,GAE1B,SAASa,IACP,GAAId,EAAY,CACdG,EAAiBD,GACjBF,EAAa,UACR,GAKT,GAAIE,IAAW,KAAM,CAEnBQ,EAAkBR,GAGlB,GAAIzT,EAAQsU,cAAe,CACzBtU,EAAQuU,aAAeC,aAAalT,KAAKrB,EAAG,CAC1CwU,IAAK,kBACLC,aAAc1U,EAAQuH,aAAaoN,cACnCC,WAAY5U,EAAQuC,OACpBsS,YAAa,CACXC,eAAgB,oCAChBC,mBAAoB,kBAEtBC,SAAU,EACVC,MAAO,IACPC,UAAW,WACTvU,KAAKwU,WAAW9Q,aAAa,QAAS,gBACtC1D,KAAKwU,WAAW1C,MAAM7G,IAAOjL,KAAKyU,MAAMlJ,UAAYvL,KAAKyU,MAAMC,aAAgB,KAC/E1U,KAAKwU,WAAW1C,MAAM6C,KAAO3U,KAAKyU,MAAMG,WAAa,KACrD5U,KAAKwU,WAAW1C,MAAM+C,MAAQ7U,KAAKyU,MAAMK,YAAc,MAEzDC,MAAO,WACL,IAAIC,EAAShV,KACbiV,MAAM3U,UAAUmF,QAAQ9E,KAAKX,KAAKwU,WAAW/P,qBAAqB,MAAO,SAAUyQ,GACjF,GAAIA,EAAGlP,aAAa,UAAY,SAAU,CACxCkP,EAAGC,YAAc,WACfH,EAAOI,QAAQF,SAKtB,IAAMrC,GAGTvT,EAAE6B,iBAAiB,SAAU,WAC3B,IAAIsN,EAAQ,IAAI4G,YAAY,YAC5BvC,EAAOwC,cAAc7G,KAIzBqE,EAAO3R,iBAAiB,QAASuS,EAAsB,OACvDZ,EAAOjH,QAIT,GAAIiH,IAAW,MAAQvT,EAAEsG,cAAc,UAAY,MAAQxG,EAAQkW,0BAA2B,CAC5FhW,EAAEsG,cAAc,SAASrB,UAAY,YAErCnF,EAAQ0B,GAAG,oBAAqB,SAAU,WACxC,IAAIV,EAAGmN,EAAajO,EAAEa,iBAAiB,sCACvC,IAAKC,EAAI,EAAGA,EAAImN,EAAWhH,OAAQnG,IAAK,CACtC,GAAImN,EAAWnN,KAAOL,MAAQwN,EAAWnN,GAAGmV,QAAS,CACnDhI,EAAWnN,GAAGkM,SAGlB,IAAMvM,KAAKwV,QAAS,CAClBxV,KAAKuM,QAEP4G,IACA,OAAO,QAGT9T,EAAQ0B,GAAGxB,EAAEiE,eAAe,cAAe,SAAU2P,GACrD9T,EAAQ0B,GAAGxB,EAAEiE,eAAe,cAAe,SAAU2P,GACrD9T,EAAQ0B,GAAGxB,EAAEiE,eAAe,YAAa,SAAU2P,OArHzD,CA0HG/T,OAAQe,SAAUf,OAAOC,UC5H5B,SAAUoW,GAAG,UAAUC,UAAU,iBAAiBC,SAAS,YAAY,CAACA,OAAOD,QAAQD,SAAS,UAAUG,SAAS,YAAYA,OAAOC,IAAI,CAACD,OAAO,GAAGH,OAAO,CAAC,IAAIK,EAAE,UAAU1W,SAAS,YAAY,CAAC0W,EAAE1W,YAAY,UAAU2W,SAAS,YAAY,CAACD,EAAEC,YAAY,UAAUC,OAAO,YAAY,CAACF,EAAEE,SAAS,CAACF,EAAE9V,KAAK8V,EAAEjC,aAAe4B,MAAjU,CAAwU,WAAW,IAAIG,EAAOD,EAAOD,EAAQ,OAAO,WAAY,SAASO,EAAEvV,EAAEwV,EAAEC,GAAG,SAASC,EAAE/V,EAAEoV,GAAG,IAAIS,EAAE7V,GAAG,CAAC,IAAIK,EAAEL,GAAG,CAAC,IAAIgW,EAAE,mBAAmBC,SAASA,QAAQ,IAAIb,GAAGY,EAAE,OAAOA,EAAEhW,GAAG,GAAG,GAAGkW,EAAE,OAAOA,EAAElW,GAAG,GAAG,IAAIyN,EAAE,IAAIpL,MAAM,uBAAuBrC,EAAE,KAAK,MAAMyN,EAAE0I,KAAK,mBAAmB1I,EAAE,IAAI2I,EAAEP,EAAE7V,GAAG,CAACqV,QAAQ,IAAIhV,EAAEL,GAAG,GAAGM,KAAK8V,EAAEf,QAAQ,SAASO,GAAG,IAAIC,EAAExV,EAAEL,GAAG,GAAG4V,GAAG,OAAOG,EAAEF,GAAGD,IAAIQ,EAAEA,EAAEf,QAAQO,EAAEvV,EAAEwV,EAAEC,GAAG,OAAOD,EAAE7V,GAAGqV,QAAQ,IAAI,IAAIa,EAAE,mBAAmBD,SAASA,QAAQjW,EAAE,EAAEA,EAAE8V,EAAE3P,OAAOnG,IAAI+V,EAAED,EAAE9V,IAAI,OAAO+V,EAAE,OAAOH,EAAtc,EAAA,CAA4c,CAACS,EAAE,CAAC,SAASJ,EAAQX,EAAOD;;;;;;;;;;aAW51B,IAAIiB,GACJ,SAAWA,GACPA,EAAkBA,EAAkB,OAAS,GAAK,MAClDA,EAAkBA,EAAkB,MAAQ,GAAK,MAFrD,CAGGA,IAAsBA,EAAoB,KAC7C,IAAIC,GACJ,SAAWA,GACPA,EAAUA,EAAU,WAAa,GAAK,UACtCA,EAAUA,EAAU,SAAW,GAAK,SAFxC,CAGGA,IAAcA,EAAY,KAO7B,IAAI/C,EAA8B,WAE9B,SAASA,EAAamB,EAAQlV,GAC1B,GAAIkV,SAAgB,EAAG,CAAEA,EAAS,GAClC,GAAIlV,SAAkB,EAAG,CAAEA,EAAW,sBACtC,GAAImV,MAAM4B,QAAQ/W,GAAW,CACzBA,EAAS2F,QAAQ,SAAUlC,GACvB,IAAIsQ,EAAamB,EAAQzR,UAG5B,UAAWzD,GAAY,SAAU,CAClC,IAAI6R,EAAWxR,SAASC,iBAAiBN,GACzCmV,MAAM3U,UAAUmF,QAAQ9E,KAAKgR,EAAU,SAAUmF,GAC7C,IAAIjD,EAAamB,EAAQ8B,SAG5B,CACD,IAAIC,EAAiBlD,EAAamD,MAAMnD,EAAaoD,SAAUjC,EAAQ,CACnER,WAAYrU,SAASsD,cAAc,SAEvCoQ,EAAavT,UAAU4W,OAAOH,EAAgBjX,GAC9C,OAAOiX,GAGflD,EAAavT,UAAU4W,OAAS,SAAUlC,EAAQ1P,GAC9C0P,EAAOP,MAAQnP,EACf,GAAI0P,EAAOP,MAAM0C,SAASC,MAAM,cAAgBpC,EAAOP,MAAM3Q,aAAa,UAAY,OAASkR,EAAOP,MAAMzO,aAAa,QAAQoR,MAAM,mBAAoB,CACvJpC,EAAOP,MAAM/Q,aAAa,eAAgB,OAC1CsR,EAAOT,UAAUS,GACjBA,EAAOP,MAAMvU,WAAW0D,YAAYoR,EAAOR,YAC3CQ,EAAOqC,WAAa,CAChBnL,KAAM8I,EAAOsC,MAAM5V,KAAKsT,GACxBuC,QAAS1D,EAAavT,UAAUiX,QAAQ7V,KAAK,KAAMsT,GACnDnJ,MAAOmJ,EAAOwC,OAAO9V,KAAKsT,GAC1ByC,MAAO5D,EAAavT,UAAUmO,MAAM/M,KAAK,KAAMsT,EAAQ4B,EAAUc,OACjEC,QAAS9D,EAAavT,UAAUmO,MAAM/M,KAAK,KAAMsT,EAAQ4B,EAAUgB,SACnE3K,SAAU+H,EAAOT,UAAU7S,KAAKsT,IAEpC,IAAK,IAAIvG,KAASuG,EAAOqC,WAAY,CACjCrC,EAAOP,MAAMtT,iBAAiBsN,EAAOuG,EAAOqC,WAAW5I,OAInEoF,EAAavT,UAAUuX,gBAAkB,SAAU7C,EAAQ8C,GACvD,IAAIC,EAAW,GACf,IAAK,IAAI5P,KAAO6M,EAAOgD,iBAAkB,CACrC,IAAIvJ,EAAQmI,EAAUc,MACtB,GAAI1C,EAAOgD,iBAAiB7P,GAAK8P,QAAUvQ,UAAW,CAClD+G,EAAQuG,EAAOgD,iBAAiB7P,GAAK8P,MAEzC,GAAIxJ,GAASqJ,EAAM,CACfC,EAAS5P,GAAO6M,EAAOgD,iBAAiB7P,IAGhD,OAAO4P,GAEXlE,EAAavT,UAAUmO,MAAQ,SAAUuG,EAAQ8C,EAAMrJ,GACnD,IAAIyJ,EAAkB,SAAUC,GAC5B,GAAKf,IAAU,MAAQgB,EAAQC,UAAY1B,EAAkB2B,KAASlB,IAAU,OAASgB,EAAQC,UAAY1B,EAAkB4B,GAAK,CAChIJ,EAAYtE,EAAamD,MAAM,CAC3BwB,IAAK,OACNL,GACH,GAAIA,EAAUhO,eAAe,MAAO,CAChC,GAAIgO,EAAUM,IAAMhK,EAAMrE,QAAS,CAC/BgN,GAASe,EAAUK,QAElB,CACDpB,EAAQe,EAAUK,UAGrB,GAAIL,EAAUhO,eAAe,SAAWgO,EAAUhO,eAAe,MAAO,CACzE,GAAIsE,EAAMrE,SAAW+N,EAAUO,MAAQjK,EAAMrE,SAAW+N,EAAUQ,GAAI,CAClEvB,GAASe,EAAUK,QAElB,CACDpB,EAAQe,EAAUK,QAKlC,IAAK,IAAII,KAAQ/E,EAAavT,UAAUuX,gBAAgB7C,EAAQ8C,GAAO,CACnE,IAAIM,EAAUvE,EAAamD,MAAM,CAC7BqB,SAAU1B,EAAkB2B,KAC7BtD,EAAOgD,iBAAiBY,IAAQxB,EAAQT,EAAkB2B,KAAOF,EAAQC,SAC5ED,EAAQS,WAAWpT,QAAQyS,GAC3B,GAAId,IAAU,KAAM,CAChBgB,EAAQU,SAASnY,KAAKqU,EAAQvG,MAI1CoF,EAAavT,UAAUyY,YAAc,SAAU/D,EAAQxU,EAAUwY,GAC7D,IAAIC,EAAsB/O,OAAOgP,oBAAoBlE,EAAOd,aAAciF,EAAU,IAAIhX,eAAkBP,EAASoT,EAAOoE,cAAevX,EAAMmT,EAAOqE,OAAQC,EAActE,EAAOuE,OAAQC,EAAuBC,mBAAmBzE,EAAO0E,aAAe,IAAMD,mBAAmBH,GACpR,GAAI1X,EAAOwV,MAAM,UAAW,CACxB,GAAIvV,EAAI8X,QAAQ,QAAU,EAAG,CACzB9X,GAAO,IAAM2X,MAEZ,CACD3X,GAAO,IAAM2X,GAGrBL,EAAQ/W,KAAKR,EAAQC,EAAK,MAC1B,IAAK,IAAIxB,EAAI4Y,EAAoBzS,OAAS,EAAGnG,GAAK,EAAGA,IAAK,CACtD8Y,EAAQS,iBAAiBX,EAAoB5Y,GAAI2U,EAAOd,YAAY+E,EAAoB5Y,KAE5F8Y,EAAQU,mBAAqB,WACzB,GAAIV,EAAQ1X,YAAc,GAAK0X,EAAQ5W,QAAU,IAAK,CAClDyS,EAAO8E,OAAOR,GAAeH,EAAQ3W,SACrChC,EAAS2Y,EAAQ3W,eAEhB,GAAI2W,EAAQ5W,QAAU,IAAK,CAC5ByW,MAGR,OAAOG,GAEXtF,EAAavT,UAAUyZ,KAAO,SAAU/E,EAAQmE,EAAS9W,GACrD,GAAIA,SAAiB,EAAG,CAAEA,EAAU,KACpC,GAAI2S,EAAOgF,WAAY,CACnB5a,OAAO6a,aAAajF,EAAOgF,YAE/B,GAAI3X,IAAY,KAAM,CAClB2S,EAAOgF,WAAa5a,OAAOuR,WAAWkD,EAAavT,UAAUyZ,KAAKrY,KAAK,KAAMsT,EAAQmE,EAAS,OAAQnE,EAAOV,WAE5G,CACD,GAAIU,EAAOkF,QAAS,CAChBlF,EAAOkF,QAAQC,QAEnBnF,EAAOkF,QAAUf,EACjBnE,EAAOkF,QAAQnX,KAAKiS,EAAO0E,YAAc,IAAM1E,EAAOuE,UAG9D1F,EAAavT,UAAU8Z,MAAQ,SAAUpF,EAAQxU,EAAUwY,GACvD,IAAIxW,EAAWwS,EAAOqF,OAAOrF,EAAOuE,QACpC,GAAI/W,IAAakF,UAAW,CACxB,IAAIyR,EAAUtF,EAAavT,UAAUyY,YAAY/D,EAAQxU,EAAUwY,GACnEnF,EAAavT,UAAUyZ,KAAK/E,EAAQmE,OAEnC,CACD3Y,EAASgC,KAGjBqR,EAAavT,UAAUiX,QAAU,SAAUvC,GACvC,IAAK,IAAIvG,KAASuG,EAAOqC,WAAY,CACjCrC,EAAOP,MAAM6F,oBAAoB7L,EAAOuG,EAAOqC,WAAW5I,IAE9DuG,EAAOR,WAAWtU,WAAWqa,YAAYvF,EAAOR,aAEpDX,EAAamD,MAAQ,WACjB,IAAIA,EAAQ,GAAIwD,EAChB,IAAK,IAAIna,EAAI,EAAGA,EAAIoa,UAAUjU,OAAQnG,IAAK,CACvC,IAAKma,KAAOC,UAAUpa,GAAI,CACtB2W,EAAMwD,GAAOC,UAAUpa,GAAGma,IAGlC,OAAOxD,GAEXnD,EAAaoD,SAAW,CACpB3C,MAAO,IACPP,aAAc,iBACd2G,UAAW,CACPC,SAAU,SAAUzH,GAChB,OAAO,IAAI0H,OAAO1H,EAAO,OAE7B2H,UAAW,SAAU3H,GACjB,MAAO,WAAaA,EAAQ,cAGpCgB,YAAa,CACTC,eAAgB,qCAEpB2G,MAAO,EACPzG,SAAU,EACVJ,WAAY,MACZ8G,SAAU,IACVjH,IAAK,KACLkE,iBAAkB,CACdgD,MAAS,CACLnC,WAAY,CAAC,CACLJ,GAAI,GACJD,IAAK,QAEbM,SAAU,SAAUrK,GAChB,GAAIzO,KAAKwU,WAAWxO,aAAa,SAAS2T,QAAQ,UAAY,EAAG,CAC7D,IAAIsB,EAAWjb,KAAKwU,WAAW3O,cAAc,aAC7C,GAAIoV,IAAa,KAAM,CACnBxM,EAAM1G,iBACN/H,KAAKoV,QAAQ6F,GACbjb,KAAKwU,WAAW9Q,aAAa,QAAS,mBAIlD2U,SAAU1B,EAAkB2B,IAC5BL,MAAOrB,EAAUgB,SAErBsD,kBAAqB,CACjBrC,WAAY,CAAC,CACLJ,GAAI,GACJD,IAAK,OAET,CACIC,GAAI,GACJD,IAAK,QAEbM,SAAU,SAAUrK,GAChBA,EAAM1G,kBAEVsQ,SAAU1B,EAAkB4B,GAC5BN,MAAOrB,EAAUgB,SAErBuD,gBAAmB,CACftC,WAAY,CAAC,CACLJ,GAAI,GACJD,IAAK,OAET,CACIC,GAAI,GACJD,IAAK,QAEbM,SAAU,SAAUrK,GAChBA,EAAM1G,iBACN,IAAImG,EAAQlO,KAAKwU,WAAW3O,cAAc,+BAAgCuV,EAAOpb,KAAKwU,WAAW3O,cAAc,8BAA+BwV,EAASrb,KAAKwU,WAAW3O,cAAc,aACrL,GAAIwV,EAAQ,CACR,IAAIC,EAAerG,MAAM3U,UAAUqZ,QAAQhZ,KAAK0a,EAAOnb,WAAWqF,SAAU8V,GAASpO,EAAWqO,GAAgB7M,EAAMrE,QAAU,IAAKmR,EAAWvb,KAAKwU,WAAW/P,qBAAqB,MAAM+B,OAC3L,GAAIyG,EAAW,EAAG,CACdA,EAAWsO,EAAW,OAErB,GAAItO,GAAYsO,EAAU,CAC3BtO,EAAW,EAEfoO,EAAOhX,UAAUkC,OAAO,UACxB8U,EAAO9Z,cAAcgE,SAASiW,KAAKvO,GAAU5I,UAAUC,IAAI,eAE1D,GAAI8W,GAAQ3M,EAAMrE,SAAW,GAAI,CAClCgR,EAAK/W,UAAUC,IAAI,eAElB,GAAI4J,EAAO,CACZA,EAAM7J,UAAUC,IAAI,YAG5B+T,SAAU1B,EAAkB4B,GAC5BN,MAAOrB,EAAUc,OAErB+D,SAAY,CACR5C,WAAY,CAAC,CACLJ,GAAI,GACJD,IAAK,MACN,CACCE,KAAM,GACNC,GAAI,GACJH,IAAK,OAEbM,SAAU,WACN,IAAI4C,EAAW1b,KAAKyU,MAAMzO,aAAa,+BAAgC2V,EAAe3b,KAAKuZ,OAC3F,GAAIoC,IAAiB,IAAMA,EAAanV,QAAUxG,KAAK4b,YAAa,CAChE,IAAKF,GAAYC,GAAgBD,EAAU,CACvC1b,KAAKwU,WAAW9Q,aAAa,QAAS,qBAE1CmQ,EAAavT,UAAU8Z,MAAMpa,KAAM,SAAUwC,GACzCxC,KAAK6b,QAAQ7b,KAAK8b,MAAMtZ,IACxBxC,KAAK+U,SACPrT,KAAK1B,MAAOA,KAAK+b,YAElB,CACD/b,KAAKgc,WAGb3D,SAAU1B,EAAkB2B,IAC5BL,MAAOrB,EAAUc,QAGzBlD,WAAY,KACZ0F,QAAS,KACTzF,MAAO,KAIPwH,cAAe,WACX,IAAIC,EAAe,GACnB,GAAIlc,KAAKyU,MAAM3Q,aAAa,mCAAoC,CAC5DoY,EAAelc,KAAKyU,MAAMzO,aAAa,wCAEtC,GAAIhG,KAAK+T,eAAiB,MAAO,CAClCmI,EAAelc,KAAK+T,iBAEnB,CACDmI,EAAe,GAEnB,OAAOA,GAKXC,OAAQ,WACJ,IAAIC,EAAQpc,KAAKyU,MAAMzO,aAAa,2BACpC,GAAIqW,MAAMD,IAAUA,IAAU,KAAM,CAChC,OAAOpc,KAAK8a,MAEhB,OAAOwB,SAASF,EAAO,KAK3BR,UAAW,WACP,IAAIW,EAAWvc,KAAKyU,MAAMzO,aAAa,8BACvC,GAAIqW,MAAME,IAAaA,IAAa,KAAM,CACtC,OAAOvc,KAAKqU,SAEhB,OAAOiI,SAASC,EAAU,KAK9BC,WAAY,SAAUC,GAClB,OAAOA,EAAMnZ,QAAQtD,KAAK0a,UAAUC,SAAS3a,KAAKuZ,QAASvZ,KAAK0a,UAAUG,YAK9EzB,YAAa,WACT,GAAIpZ,KAAKyU,MAAM3Q,aAAa,4BAA6B,CACrD,OAAO9D,KAAKyU,MAAMzO,aAAa,4BAEnC,OAAOhG,KAAKiU,YAKhByF,UAAW,WACP,GAAI1Z,KAAKyU,MAAM3Q,aAAa,gCAAiC,CACzD,OAAO9D,KAAKyU,MAAMzO,aAAa,gCAEnC,OAAOhG,KAAK+a,UAKhB1B,KAAM,WACF,GAAIrZ,KAAKyU,MAAM3Q,aAAa,qBAAsB,CAC9C,OAAO9D,KAAKyU,MAAMzO,aAAa,qBAEnC,OAAOhG,KAAK8T,KAKhBwD,MAAO,SAAUoF,GACb,GAAIA,SAAa,EAAG,CAAEA,EAAM,MAC5B,GAAIA,EAAK,CACL1c,KAAKgc,aAEJ,CACD,IAAIhH,EAAShV,KACb2Q,WAAW,WACPqE,EAAOsC,MAAM,OACd,OAMX+C,OAAQ,SAAUnH,GACd,OAAOlT,KAAK8Z,OAAO5G,IAKvBsE,OAAQ,WACJ,IAAIkE,EAAW1b,KAAKyU,MAAMzO,aAAa,+BACvC,KAAM0V,GAAY1b,KAAKyU,MAAMvB,OAASwI,IAAa1b,KAAK4b,aAAe5b,KAAKyU,MAAMvB,MAAM1M,OAAQ,CAC5FxG,KAAKwU,WAAW9Q,aAAa,QAAS,uBAM9CqR,MAAO,WACH,IAAIC,EAAShV,KACbiV,MAAM3U,UAAUmF,QAAQ9E,KAAKX,KAAKwU,WAAW/P,qBAAqB,MAAO,SAAUyQ,GAC/E,GAAIA,EAAGlP,aAAa,UAAY,SAAU,CACtCkP,EAAGyH,QAAU,WACT3H,EAAOI,QAAQF,QAK/B8G,OAAQ,WACJhc,KAAKwU,WAAW9Q,aAAa,QAAS,iBAK1C6Q,UAAW,WACPvU,KAAKwU,WAAW9Q,aAAa,QAAS,gBACtC1D,KAAKwU,WAAW9Q,aAAa,QAAS,QAAU1D,KAAKyU,MAAMlJ,UAAYvL,KAAKyU,MAAMC,cAAgB,WAAa1U,KAAKyU,MAAMG,WAAa,YAAc5U,KAAKyU,MAAMK,YAAc,QAKlL+G,QAAS,SAAUrZ,GACf,IAAIoa,EACJ,UAAWpa,GAAY,SAAU,CAC7Boa,EAAK5c,KAAK6c,WAAWra,OAEpB,CACDoa,EAAK5c,KAAK8c,qBAAqBta,GAEnC,GAAIxC,KAAKwU,WAAWuI,gBAAiB,CACjC/c,KAAKwU,WAAW+F,YAAYva,KAAKwU,WAAWwI,WAAW,IAE3Dhd,KAAKwU,WAAW5Q,YAAYgZ,IAKhCE,qBAAsB,SAAUta,GAC5B,IAAIoa,EAAKzc,SAASsD,cAAc,MAAOyR,EAAK/U,SAASsD,cAAc,MAAO2Y,EAAQpc,KAAKmc,SAEvF,GAAIC,EAAQ,EAAG,CACX5Z,EAAWA,EAASya,eAEnB,GAAIb,IAAU,EAAG,CAClBA,EAAQ5Z,EAASgE,OAErB,IAAK,IAAIgV,EAAO,EAAGA,EAAO0B,KAAKC,IAAID,KAAKE,IAAIhB,GAAQ5Z,EAASgE,QAASgV,IAAQ,CAC1EtG,EAAG9G,UAAY5L,EAASgZ,GAAM6B,MAC9BnI,EAAGxR,aAAa,0BAA2BlB,EAASgZ,GAAM8B,OAC1DV,EAAGhZ,YAAYsR,GACfA,EAAK/U,SAASsD,cAAc,MAEhC,OAAOmZ,GAKXC,WAAY,SAAUra,GAClB,IAAIoa,EAAKzc,SAASsD,cAAc,MAAOyR,EAAK/U,SAASsD,cAAc,MACnE,GAAIjB,EAASgE,OAAS,EAAG,CACrBxG,KAAKwU,WAAWpG,UAAY5L,MAE3B,CACD,IAAI0Z,EAAelc,KAAKic,gBACxB,GAAIC,IAAiB,GAAI,CACrBhH,EAAG9G,UAAY8N,EACfhH,EAAGxR,aAAa,QAAS,UACzBkZ,EAAGhZ,YAAYsR,IAGvB,OAAO0H,GAKXd,MAAO,SAAUtZ,GACb,IACI,IAAI+a,EAAiB,GAErB,IAAIC,EAAOnO,KAAKC,MAAM9M,GACtB,GAAI0H,OAAO0D,KAAK4P,GAAMhX,SAAW,EAAG,CAChC,MAAO,GAEX,GAAIyO,MAAM4B,QAAQ2G,GAAO,CACrB,IAAK,IAAInd,EAAI,EAAGA,EAAI6J,OAAO0D,KAAK4P,GAAMhX,OAAQnG,IAAK,CAC/Ckd,EAAeA,EAAe/W,QAAU,CAAE8W,MAASE,EAAKnd,GAAIgd,MAASrd,KAAKwc,WAAWgB,EAAKnd,UAG7F,CACD,IAAK,IAAI6S,KAASsK,EAAM,CACpBD,EAAe7P,KAAK,CAChB4P,MAASpK,EACTmK,MAASrd,KAAKwc,WAAWgB,EAAKtK,OAI1C,OAAOqK,EAEX,MAAO9O,GAEH,OAAOjM,IAMf+W,KAAM,WACF,OAAOvZ,KAAKyU,MAAMvB,OAKtBkC,QAAS,SAAUoG,GACf,GAAIA,EAAK1X,aAAa,2BAA4B,CAC9C9D,KAAKyU,MAAMvB,MAAQsI,EAAKxV,aAAa,+BAEpC,CACDhG,KAAKyU,MAAMvB,MAAQsI,EAAKpN,UAE5BpO,KAAKyU,MAAM/Q,aAAa,8BAA+B1D,KAAKyU,MAAMvB,QAKtE6I,OAAQ,aAER/B,WAAY,KACZF,OAAQ,GACRzC,WAAY,IAEhB,OAAOxD,EA3fsB,GA6fjC8B,EAAOD,QAAU7B,GAEf,KAAK,GAAG,CAAC,GA1hByW,CA0hBrW"}
\ No newline at end of file
+{"version":3,"file":"searxng.min.js","sources":["../src/js/main/00_toolkit.js","../src/js/main/infinite_scroll.js","../src/js/main/keyboard.js","../src/js/main/mapresult.js","../src/js/main/preferences.js","../src/js/main/results.js","../src/js/main/search.js","../node_modules/autocomplete-js/dist/autocomplete.js"],"sourcesContent":["/**\n * @license\n * (C) Copyright Contributors to the SearXNG project.\n * (C) Copyright Contributors to the searx project (2014 - 2021).\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nwindow.searxng = (function (w, d) {\n\n  'use strict';\n\n  // not invented here tookit with bugs fixed elsewhere\n  // purposes : be just good enough and as small as possible\n\n  // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/\n  if (w.Element) {\n    (function (ElementPrototype) {\n      ElementPrototype.matches = ElementPrototype.matches ||\n      ElementPrototype.matchesSelector ||\n      ElementPrototype.webkitMatchesSelector ||\n      ElementPrototype.msMatchesSelector ||\n      function (selector) {\n        var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;\n        while (nodes[++i] && nodes[i] != node);\n        return !!nodes[i];\n      };\n    })(Element.prototype);\n  }\n\n  function callbackSafe (callback, el, e) {\n    try {\n      callback.call(el, e);\n    } catch (exception) {\n      console.log(exception);\n    }\n  }\n\n  var searxng = window.searxng || {};\n\n  searxng.on = function (obj, eventType, callback, useCapture) {\n    useCapture = useCapture || false;\n    if (typeof obj !== 'string') {\n      // obj HTMLElement, HTMLDocument\n      obj.addEventListener(eventType, callback, useCapture);\n    } else {\n      // obj is a selector\n      d.addEventListener(eventType, function (e) {\n        var el = e.target || e.srcElement, found = false;\n        while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;\n        if (found) callbackSafe(callback, el, e);\n      }, useCapture);\n    }\n  };\n\n  searxng.ready = function (callback) {\n    if (document.readyState != 'loading') {\n      callback.call(w);\n    } else {\n      w.addEventListener('DOMContentLoaded', callback.bind(w));\n    }\n  };\n\n  searxng.http = function (method, url, data = null) {\n    return new Promise(function (resolve, reject) {\n      try {\n        var req = new XMLHttpRequest();\n        req.open(method, url, true);\n        req.timeout = 20000;\n\n        // On load\n        req.onload = function () {\n          if (req.status == 200) {\n            resolve(req.response, req.responseType);\n          } else {\n            reject(Error(req.statusText));\n          }\n        };\n\n        // Handle network errors\n        req.onerror = function () {\n          reject(Error(\"Network Error\"));\n        };\n\n        req.onabort = function () {\n          reject(Error(\"Transaction is aborted\"));\n        };\n\n        req.ontimeout = function () {\n          reject(Error(\"Timeout\"));\n        }\n\n        // Make the request\n        if (data) {\n          req.send(data)\n        } else {\n          req.send();\n        }\n      } catch (ex) {\n        reject(ex);\n      }\n    });\n  };\n\n  searxng.loadStyle = function (src) {\n    var path = searxng.static_path + src,\n      id = \"style_\" + src.replace('.', '_'),\n      s = d.getElementById(id);\n    if (s === null) {\n      s = d.createElement('link');\n      s.setAttribute('id', id);\n      s.setAttribute('rel', 'stylesheet');\n      s.setAttribute('type', 'text/css');\n      s.setAttribute('href', path);\n      d.body.appendChild(s);\n    }\n  };\n\n  searxng.loadScript = function (src, callback) {\n    var path = searxng.static_path + src,\n      id = \"script_\" + src.replace('.', '_'),\n      s = d.getElementById(id);\n    if (s === null) {\n      s = d.createElement('script');\n      s.setAttribute('id', id);\n      s.setAttribute('src', path);\n      s.onload = callback;\n      s.onerror = function () {\n        s.setAttribute('error', '1');\n      };\n      d.body.appendChild(s);\n    } else if (!s.hasAttribute('error')) {\n      try {\n        callback.apply(s, []);\n      } catch (exception) {\n        console.log(exception);\n      }\n    } else {\n      console.log(\"callback not executed : script '\" + path + \"' not loaded.\");\n    }\n  };\n\n  searxng.insertBefore = function (newNode, referenceNode) {\n    referenceNode.parentNode.insertBefore(newNode, referenceNode);\n  };\n\n  searxng.insertAfter = function (newNode, referenceNode) {\n    referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);\n  };\n\n  searxng.on('.close', 'click', function () {\n    this.parentNode.classList.add('invisible');\n  });\n\n  function getEndpoint () {\n    for (var className of d.getElementsByTagName('body')[0].classList.values()) {\n      if (className.endsWith('_endpoint')) {\n        return className.split('_')[0];\n      }\n    }\n    return '';\n  }\n\n  searxng.endpoint = getEndpoint();\n\n  return searxng;\n})(window, document);\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/* global searxng */\n\nsearxng.ready(function () {\n  'use strict';\n\n  searxng.infinite_scroll_supported = (\n    'IntersectionObserver' in window &&\n    'IntersectionObserverEntry' in window &&\n    'intersectionRatio' in window.IntersectionObserverEntry.prototype);\n\n  if (searxng.endpoint !== 'results') {\n    return;\n  }\n\n  if (!searxng.infinite_scroll_supported) {\n    console.log('IntersectionObserver not supported');\n    return;\n  }\n\n  let d = document;\n  var onlyImages = d.getElementById('results').classList.contains('only_template_images');\n\n  function newLoadSpinner () {\n    var loader = d.createElement('div');\n    loader.classList.add('loader');\n    return loader;\n  }\n\n  function replaceChildrenWith (element, children) {\n    element.textContent = '';\n    children.forEach(child => element.appendChild(child));\n  }\n\n  function loadNextPage (callback) {\n    var form = d.querySelector('#pagination form.next_page');\n    if (!form) {\n      return\n    }\n    replaceChildrenWith(d.querySelector('#pagination'), [ newLoadSpinner() ]);\n    var formData = new FormData(form);\n    searxng.http('POST', d.querySelector('#search').getAttribute('action'), formData).then(\n      function (response) {\n        var nextPageDoc = new DOMParser().parseFromString(response, 'text/html');\n        var articleList = nextPageDoc.querySelectorAll('#urls article');\n        var paginationElement = nextPageDoc.querySelector('#pagination');\n        d.querySelector('#pagination').remove();\n        if (articleList.length > 0 && !onlyImages) {\n          // do not add <hr> element when there are only images\n          d.querySelector('#urls').appendChild(d.createElement('hr'));\n        }\n        articleList.forEach(articleElement => {\n          d.querySelector('#urls').appendChild(articleElement);\n        });\n        if (paginationElement) {\n          d.querySelector('#results').appendChild(paginationElement);\n          callback();\n        }\n      }\n    ).catch(\n      function (err) {\n        console.log(err);\n        var e = d.createElement('div');\n        e.textContent = searxng.translations.error_loading_next_page;\n        e.classList.add('dialog-error');\n        e.setAttribute('role', 'alert');\n        replaceChildrenWith(d.querySelector('#pagination'), [ e ]);\n      }\n    )\n  }\n\n  if (searxng.infinite_scroll && searxng.infinite_scroll_supported) {\n    const intersectionObserveOptions = {\n      rootMargin: \"20rem\",\n    };\n    const observedSelector = 'article.result:last-child';\n    const observer = new IntersectionObserver(entries => {\n      const paginationEntry = entries[0];\n      if (paginationEntry.isIntersecting) {\n        observer.unobserve(paginationEntry.target);\n        loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));\n      }\n    });\n    observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);\n  }\n\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global searxng */\n\nsearxng.ready(function () {\n\n  function isElementInDetail (el) {\n    while (el !== undefined) {\n      if (el.classList.contains('detail')) {\n        return true;\n      }\n      if (el.classList.contains('result')) {\n        // we found a result, no need to go to the root of the document:\n        // el is not inside a <div class=\"detail\"> element\n        return false;\n      }\n      el = el.parentNode;\n    }\n    return false;\n  }\n\n  function getResultElement (el) {\n    while (el !== undefined) {\n      if (el.classList.contains('result')) {\n        return el;\n      }\n      el = el.parentNode;\n    }\n    return undefined;\n  }\n\n  function isImageResult (resultElement) {\n    return resultElement && resultElement.classList.contains('result-images');\n  }\n\n  searxng.on('.result', 'mousedown', function (e) {\n    if (!isElementInDetail(e.target)) {\n      highlightResult(this)(true);\n      let resultElement = getResultElement(e.target);\n      if (isImageResult(resultElement)) {\n        e.preventDefault();\n        searxng.selectImage(resultElement);\n      }\n    }\n  });\n\n  searxng.on('.result a', 'focus', function (e) {\n    if (!isElementInDetail(e.target)) {\n      let resultElement = getResultElement(e.target);\n      if (resultElement && resultElement.getAttribute(\"data-vim-selected\") === null) {\n        highlightResult(resultElement)(true);\n      }\n      if (isImageResult(resultElement)) {\n        searxng.selectImage(resultElement);\n      }\n    }\n  }, true);\n\n  var vimKeys = {\n    27: {\n      key: 'Escape',\n      fun: removeFocus,\n      des: 'remove focus from the focused input',\n      cat: 'Control'\n    },\n    73: {\n      key: 'i',\n      fun: searchInputFocus,\n      des: 'focus on the search input',\n      cat: 'Control'\n    },\n    66: {\n      key: 'b',\n      fun: scrollPage(-window.innerHeight),\n      des: 'scroll one page up',\n      cat: 'Navigation'\n    },\n    70: {\n      key: 'f',\n      fun: scrollPage(window.innerHeight),\n      des: 'scroll one page down',\n      cat: 'Navigation'\n    },\n    85: {\n      key: 'u',\n      fun: scrollPage(-window.innerHeight / 2),\n      des: 'scroll half a page up',\n      cat: 'Navigation'\n    },\n    68: {\n      key: 'd',\n      fun: scrollPage(window.innerHeight / 2),\n      des: 'scroll half a page down',\n      cat: 'Navigation'\n    },\n    71: {\n      key: 'g',\n      fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n      des: 'scroll to the top of the page',\n      cat: 'Navigation'\n    },\n    86: {\n      key: 'v',\n      fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n      des: 'scroll to the bottom of the page',\n      cat: 'Navigation'\n    },\n    75: {\n      key: 'k',\n      fun: highlightResult('up'),\n      des: 'select previous search result',\n      cat: 'Results'\n    },\n    74: {\n      key: 'j',\n      fun: highlightResult('down'),\n      des: 'select next search result',\n      cat: 'Results'\n    },\n    80: {\n      key: 'p',\n      fun: GoToPreviousPage(),\n      des: 'go to previous page',\n      cat: 'Results'\n    },\n    78: {\n      key: 'n',\n      fun: GoToNextPage(),\n      des: 'go to next page',\n      cat: 'Results'\n    },\n    79: {\n      key: 'o',\n      fun: openResult(false),\n      des: 'open search result',\n      cat: 'Results'\n    },\n    84: {\n      key: 't',\n      fun: openResult(true),\n      des: 'open the result in a new tab',\n      cat: 'Results'\n    },\n    82: {\n      key: 'r',\n      fun: reloadPage,\n      des: 'reload page from the server',\n      cat: 'Control'\n    },\n    72: {\n      key: 'h',\n      fun: toggleHelp,\n      des: 'toggle help window',\n      cat: 'Other'\n    }\n  };\n\n  if (searxng.hotkeys) {\n    searxng.on(document, \"keydown\", function (e) {\n      // check for modifiers so we don't break browser's hotkeys\n      if (Object.prototype.hasOwnProperty.call(vimKeys, e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {\n        var tagName = e.target.tagName.toLowerCase();\n        if (e.keyCode === 27) {\n          vimKeys[e.keyCode].fun(e);\n        } else {\n          if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n            e.preventDefault();\n            vimKeys[e.keyCode].fun();\n          }\n        }\n      }\n    });\n  }\n\n  function highlightResult (which) {\n    return function (noScroll) {\n      var current = document.querySelector('.result[data-vim-selected]'),\n        effectiveWhich = which;\n      if (current === null) {\n        // no selection : choose the first one\n        current = document.querySelector('.result');\n        if (current === null) {\n          // no first one : there are no results\n          return;\n        }\n        // replace up/down actions by selecting first one\n        if (which === \"down\" || which === \"up\") {\n          effectiveWhich = current;\n        }\n      }\n\n      var next, results = document.querySelectorAll('.result');\n\n      if (typeof effectiveWhich !== 'string') {\n        next = effectiveWhich;\n      } else {\n        switch (effectiveWhich) {\n        case 'visible':\n          var top = document.documentElement.scrollTop || document.body.scrollTop;\n          var bot = top + document.documentElement.clientHeight;\n\n          for (var i = 0; i < results.length; i++) {\n            next = results[i];\n            var etop = next.offsetTop;\n            var ebot = etop + next.clientHeight;\n\n            if ((ebot <= bot) && (etop > top)) {\n              break;\n            }\n          }\n          break;\n        case 'down':\n          next = current.nextElementSibling;\n          if (next === null) {\n            next = results[0];\n          }\n          break;\n        case 'up':\n          next = current.previousElementSibling;\n          if (next === null) {\n            next = results[results.length - 1];\n          }\n          break;\n        case 'bottom':\n          next = results[results.length - 1];\n          break;\n        case 'top':\n          /* falls through */\n        default:\n          next = results[0];\n        }\n      }\n\n      if (next) {\n        current.removeAttribute('data-vim-selected');\n        next.setAttribute('data-vim-selected', 'true');\n        var link = next.querySelector('h3 a') || next.querySelector('a');\n        if (link !== null) {\n          link.focus();\n        }\n        if (!noScroll) {\n          scrollPageToSelected();\n        }\n      }\n    };\n  }\n\n  function reloadPage () {\n    document.location.reload(true);\n  }\n\n  function removeFocus (e) {\n    const tagName = e.target.tagName.toLowerCase();\n    if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {\n      document.activeElement.blur();\n    } else {\n      searxng.closeDetail();\n    }\n  }\n\n  function pageButtonClick (css_selector) {\n    return function () {\n      var button = document.querySelector(css_selector);\n      if (button) {\n        button.click();\n      }\n    };\n  }\n\n  function GoToNextPage () {\n    return pageButtonClick('nav#pagination .next_page button[type=\"submit\"]');\n  }\n\n  function GoToPreviousPage () {\n    return pageButtonClick('nav#pagination .previous_page button[type=\"submit\"]');\n  }\n\n  function scrollPageToSelected () {\n    var sel = document.querySelector('.result[data-vim-selected]');\n    if (sel === null) {\n      return;\n    }\n    var wtop = document.documentElement.scrollTop || document.body.scrollTop,\n      wheight = document.documentElement.clientHeight,\n      etop = sel.offsetTop,\n      ebot = etop + sel.clientHeight,\n      offset = 120;\n    // first element ?\n    if ((sel.previousElementSibling === null) && (ebot < wheight)) {\n      // set to the top of page if the first element\n      // is fully included in the viewport\n      window.scroll(window.scrollX, 0);\n      return;\n    }\n    if (wtop > (etop - offset)) {\n      window.scroll(window.scrollX, etop - offset);\n    } else {\n      var wbot = wtop + wheight;\n      if (wbot < (ebot + offset)) {\n        window.scroll(window.scrollX, ebot - wheight + offset);\n      }\n    }\n  }\n\n  function scrollPage (amount) {\n    return function () {\n      window.scrollBy(0, amount);\n      highlightResult('visible')();\n    };\n  }\n\n  function scrollPageTo (position, nav) {\n    return function () {\n      window.scrollTo(0, position);\n      highlightResult(nav)();\n    };\n  }\n\n  function searchInputFocus () {\n    window.scrollTo(0, 0);\n    document.querySelector('#q').focus();\n  }\n\n  function openResult (newTab) {\n    return function () {\n      var link = document.querySelector('.result[data-vim-selected] h3 a');\n      if (link === null) {\n        link = document.querySelector('.result[data-vim-selected] > a');\n      }\n      if (link !== null) {\n        var url = link.getAttribute('href');\n        if (newTab) {\n          window.open(url);\n        } else {\n          window.location.href = url;\n        }\n      }\n    };\n  }\n\n  function initHelpContent (divElement) {\n    var categories = {};\n\n    for (var k in vimKeys) {\n      var key = vimKeys[k];\n      categories[key.cat] = categories[key.cat] || [];\n      categories[key.cat].push(key);\n    }\n\n    var sorted = Object.keys(categories).sort(function (a, b) {\n      return categories[b].length - categories[a].length;\n    });\n\n    if (sorted.length === 0) {\n      return;\n    }\n\n    var html = '<a href=\"#\" class=\"close\" aria-label=\"close\" title=\"close\">×</a>';\n    html += '<h3>How to navigate searx with Vim-like hotkeys</h3>';\n    html += '<table>';\n\n    for (var i = 0; i < sorted.length; i++) {\n      var cat = categories[sorted[i]];\n\n      var lastCategory = i === (sorted.length - 1);\n      var first = i % 2 === 0;\n\n      if (first) {\n        html += '<tr>';\n      }\n      html += '<td>';\n\n      html += '<h4>' + cat[0].cat + '</h4>';\n      html += '<ul class=\"list-unstyled\">';\n\n      for (var cj in cat) {\n        html += '<li><kbd>' + cat[cj].key + '</kbd> ' + cat[cj].des + '</li>';\n      }\n\n      html += '</ul>';\n      html += '</td>'; // col-sm-*\n\n      if (!first || lastCategory) {\n        html += '</tr>'; // row\n      }\n    }\n\n    html += '</table>';\n\n    divElement.innerHTML = html;\n  }\n\n  function toggleHelp () {\n    var helpPanel = document.querySelector('#vim-hotkeys-help');\n    if (helpPanel === undefined || helpPanel === null) {\n      // first call\n      helpPanel = document.createElement('div');\n      helpPanel.id = 'vim-hotkeys-help';\n      helpPanel.className = 'dialog-modal';\n      initHelpContent(helpPanel);\n      initHelpContent(helpPanel);\n      initHelpContent(helpPanel);\n      var body = document.getElementsByTagName('body')[0];\n      body.appendChild(helpPanel);\n    } else {\n      // togggle hidden\n      helpPanel.classList.toggle('invisible');\n      return;\n    }\n  }\n\n  searxng.scrollPageToSelected = scrollPageToSelected;\n  searxng.selectNext = highlightResult('down');\n  searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n  'use strict';\n\n  searxng.ready(function () {\n    searxng.on('.searxng_init_map', 'click', function (event) {\n      // no more request\n      this.classList.remove(\"searxng_init_map\");\n\n      //\n      var leaflet_target = this.dataset.leafletTarget;\n      var map_lon = parseFloat(this.dataset.mapLon);\n      var map_lat = parseFloat(this.dataset.mapLat);\n      var map_zoom = parseFloat(this.dataset.mapZoom);\n      var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n      var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n      searxng.loadStyle('css/leaflet.css');\n      searxng.loadScript('js/leaflet.js', function () {\n        var map_bounds = null;\n        if (map_boundingbox) {\n          var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n          var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n          map_bounds = L.latLngBounds(southWest, northEast);\n        }\n\n        // init map\n        var map = L.map(leaflet_target);\n        // create the tile layer with correct attribution\n        var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n        var osmMapnikAttrib = 'Map data © <a href=\"https://openstreetmap.org\">OpenStreetMap</a> contributors';\n        var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n        var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n        var osmWikimediaAttrib = 'Wikimedia maps | Maps data © <a href=\"https://openstreetmap.org\">OpenStreetMap contributors</a>';\n        var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n        // init map view\n        if (map_bounds) {\n          // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n          // Still useful ?\n          setTimeout(function () {\n            map.fitBounds(map_bounds, {\n              maxZoom: 17\n            });\n          }, 0);\n        } else if (map_lon && map_lat) {\n          if (map_zoom) {\n            map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n          } else {\n            map.setView(new L.latLng(map_lat, map_lon), 8);\n          }\n        }\n\n        map.addLayer(osmMapnik);\n\n        var baseLayers = {\n          \"OSM Mapnik\": osmMapnik,\n          \"OSM Wikimedia\": osmWikimedia,\n        };\n\n        L.control.layers(baseLayers).addTo(map);\n\n        if (map_geojson) {\n          L.geoJson(map_geojson).addTo(map);\n        } /* else if(map_bounds) {\n          L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n        } */\n      });\n\n      // this event occour only once per element\n      event.preventDefault();\n    });\n  });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n  'use strict';\n\n  if (searxng.endpoint !== 'preferences') {\n    return;\n  }\n\n  searxng.ready(function () {\n    let engine_descriptions = null;\n    function load_engine_descriptions () {\n      if (engine_descriptions == null) {\n        searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n          engine_descriptions = JSON.parse(content);\n          for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n            let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n            for (const element of elements) {\n              let source = ' (<i>' + searxng.translations['Source'] + ':&nbsp;' + description[1] + '</i>)';\n              element.innerHTML = description[0] + source;\n            }\n          }\n        });\n      }\n    }\n\n    for (const el of d.querySelectorAll('[data-engine-name]')) {\n      searxng.on(el, 'mouseenter', load_engine_descriptions);\n    }\n  });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n  'use strict';\n\n  if (searxng.endpoint !== 'results') {\n    return;\n  }\n\n  searxng.ready(function () {\n    d.querySelectorAll('#urls img.image').forEach(\n      img =>\n        img.addEventListener(\n          'error', () => {\n            img.style.display = 'none';\n            img.error = null;\n          }\n        ));\n\n    searxng.on('.btn-collapse', 'click', function () {\n      var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');\n      var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');\n      var target = this.getAttribute('data-target');\n      var targetElement = d.querySelector(target);\n      var html = this.innerHTML;\n      if (this.classList.contains('collapsed')) {\n        html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);\n      } else {\n        html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);\n      }\n      this.innerHTML = html;\n      this.classList.toggle('collapsed');\n      targetElement.classList.toggle('invisible');\n    });\n\n    searxng.on('.media-loader', 'click', function () {\n      var target = this.getAttribute('data-target');\n      var iframe_load = d.querySelector(target + ' > iframe');\n      var srctest = iframe_load.getAttribute('src');\n      if (srctest === null || srctest === undefined || srctest === false) {\n        iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));\n      }\n    });\n\n    searxng.selectImage = function (resultElement) {\n      /* eslint no-unused-vars: 0 */\n      if (resultElement) {\n        // load full size image in background\n        const imgElement = resultElement.querySelector('.result-images-source img');\n        const thumbnailElement = resultElement.querySelector('.image_thumbnail');\n        const detailElement = resultElement.querySelector('.detail');\n        if (imgElement) {\n          const imgSrc = imgElement.getAttribute('data-src');\n          if (imgSrc) {\n            const loader = d.createElement('div');\n            const imgLoader = new Image();\n\n            loader.classList.add('loader');\n            detailElement.appendChild(loader);\n\n            imgLoader.onload = e => {\n              imgElement.src = imgSrc;\n              loader.remove();\n            };\n            imgLoader.onerror = e => {\n              loader.remove();\n            };\n            imgLoader.src = imgSrc;\n            imgElement.src = thumbnailElement.src;\n            imgElement.removeAttribute('data-src');\n          }\n        }\n      }\n      d.getElementById('results').classList.add('image-detail-open');\n      searxng.scrollPageToSelected();\n    }\n\n    searxng.closeDetail = function (e) {\n      d.getElementById('results').classList.remove('image-detail-open');\n      searxng.scrollPageToSelected();\n    }\n    searxng.on('.result-detail-close', 'click', e => {\n      e.preventDefault();\n      searxng.closeDetail();\n    });\n    searxng.on('.result-detail-previous', 'click', e => searxng.selectPrevious(false));\n    searxng.on('.result-detail-next', 'click', e => searxng.selectNext(false));\n\n    w.addEventListener('scroll', function () {\n      var e = d.getElementById('backToTop'),\n        scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n        results = d.getElementById('results');\n      if (e !== null) {\n        if (scrollTop >= 100) {\n          results.classList.add('scrolling');\n        } else {\n          results.classList.remove('scrolling');\n        }\n      }\n    }, true);\n\n  });\n\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global AutoComplete */\n(function (w, d, searxng) {\n  'use strict';\n\n  var firstFocus = true, qinput_id = \"q\", qinput;\n\n  function placeCursorAtEnd (element) {\n    if (element.setSelectionRange) {\n      var len = element.value.length;\n      element.setSelectionRange(len, len);\n    }\n  }\n\n  function submitIfQuery () {\n    if (qinput.value.length  > 0) {\n      var search = document.getElementById('search');\n      setTimeout(search.submit.bind(search), 0);\n    }\n  }\n\n  function createClearButton (qinput) {\n    var cs = document.getElementById('clear_search');\n    var updateClearButton = function () {\n      if (qinput.value.length === 0) {\n        cs.classList.add(\"empty\");\n      } else {\n        cs.classList.remove(\"empty\");\n      }\n    };\n\n    // update status, event listener\n    updateClearButton();\n    cs.addEventListener('click', function (ev) {\n      qinput.value = '';\n      qinput.focus();\n      updateClearButton();\n      ev.preventDefault();\n    });\n    qinput.addEventListener('keyup', updateClearButton, false);\n  }\n\n  searxng.ready(function () {\n    qinput = d.getElementById(qinput_id);\n\n    function placeCursorAtEndOnce () {\n      if (firstFocus) {\n        placeCursorAtEnd(qinput);\n        firstFocus = false;\n      } else {\n        // e.preventDefault();\n      }\n    }\n\n    if (qinput !== null) {\n      // clear button\n      createClearButton(qinput);\n\n      // autocompleter\n      if (searxng.autocompleter) {\n        searxng.autocomplete = AutoComplete.call(w, {\n          Url: \"./autocompleter\",\n          EmptyMessage: searxng.translations.no_item_found,\n          HttpMethod: searxng.method,\n          HttpHeaders: {\n            \"Content-type\": \"application/x-www-form-urlencoded\",\n            \"X-Requested-With\": \"XMLHttpRequest\"\n          },\n          MinChars: 4,\n          Delay: 300,\n          _Position: function () {\n            this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n            this.DOMResults.style.top = (this.Input.offsetTop + this.Input.offsetHeight) + \"px\";\n            this.DOMResults.style.left = this.Input.offsetLeft + \"px\";\n            this.DOMResults.style.width = this.Input.clientWidth + \"px\";\n          },\n          _Open: function () {\n            var params = this;\n            Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n              if (li.getAttribute(\"class\") != \"locked\") {\n                li.onmousedown = function () {\n                  params._Select(li);\n                };\n              }\n            });\n          },\n        }, \"#\" + qinput_id);\n\n        // hack, see : https://github.com/autocompletejs/autocomplete.js/issues/37\n        w.addEventListener('resize', function () {\n          var event = new CustomEvent(\"position\");\n          qinput.dispatchEvent(event);\n        });\n      }\n\n      qinput.addEventListener('focus', placeCursorAtEndOnce, false);\n      qinput.focus();\n    }\n\n    // vanilla js version of search_on_category_select.js\n    if (qinput !== null && d.querySelector('.help') != null && searxng.search_on_category_select) {\n      d.querySelector('.help').className = 'invisible';\n\n      searxng.on('#categories input', 'change', function () {\n        var i, categories = d.querySelectorAll('#categories input[type=\"checkbox\"]');\n        for (i = 0; i < categories.length; i++) {\n          if (categories[i] !== this && categories[i].checked) {\n            categories[i].click();\n          }\n        }\n        if (! this.checked) {\n          this.click();\n        }\n        submitIfQuery();\n        return false;\n      });\n\n      searxng.on(d.getElementById('safesearch'), 'change', submitIfQuery);\n      searxng.on(d.getElementById('time_range'), 'change', submitIfQuery);\n      searxng.on(d.getElementById('language'), 'change', submitIfQuery);\n    }\n\n  });\n\n})(window, document, window.searxng);\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.AutoComplete = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*\n * @license MIT\n *\n * Autocomplete.js v2.7.1\n * Developed by Baptiste Donaux\n * http://autocomplete-js.com\n *\n * (c) 2017, Baptiste Donaux\n */\n\"use strict\";\nvar ConditionOperator;\n(function (ConditionOperator) {\n    ConditionOperator[ConditionOperator[\"AND\"] = 0] = \"AND\";\n    ConditionOperator[ConditionOperator[\"OR\"] = 1] = \"OR\";\n})(ConditionOperator || (ConditionOperator = {}));\nvar EventType;\n(function (EventType) {\n    EventType[EventType[\"KEYDOWN\"] = 0] = \"KEYDOWN\";\n    EventType[EventType[\"KEYUP\"] = 1] = \"KEYUP\";\n})(EventType || (EventType = {}));\n/**\n * Core\n *\n * @class\n * @author Baptiste Donaux <baptiste.donaux@gmail.com> @baptistedonaux\n */\nvar AutoComplete = /** @class */ (function () {\n    // Constructor\n    function AutoComplete(params, selector) {\n        if (params === void 0) { params = {}; }\n        if (selector === void 0) { selector = \"[data-autocomplete]\"; }\n        if (Array.isArray(selector)) {\n            selector.forEach(function (s) {\n                new AutoComplete(params, s);\n            });\n        }\n        else if (typeof selector == \"string\") {\n            var elements = document.querySelectorAll(selector);\n            Array.prototype.forEach.call(elements, function (input) {\n                new AutoComplete(params, input);\n            });\n        }\n        else {\n            var specificParams = AutoComplete.merge(AutoComplete.defaults, params, {\n                DOMResults: document.createElement(\"div\")\n            });\n            AutoComplete.prototype.create(specificParams, selector);\n            return specificParams;\n        }\n    }\n    AutoComplete.prototype.create = function (params, element) {\n        params.Input = element;\n        if (params.Input.nodeName.match(/^INPUT$/i) && (params.Input.hasAttribute(\"type\") === false || params.Input.getAttribute(\"type\").match(/^TEXT|SEARCH$/i))) {\n            params.Input.setAttribute(\"autocomplete\", \"off\");\n            params._Position(params);\n            params.Input.parentNode.appendChild(params.DOMResults);\n            params.$Listeners = {\n                blur: params._Blur.bind(params),\n                destroy: AutoComplete.prototype.destroy.bind(null, params),\n                focus: params._Focus.bind(params),\n                keyup: AutoComplete.prototype.event.bind(null, params, EventType.KEYUP),\n                keydown: AutoComplete.prototype.event.bind(null, params, EventType.KEYDOWN),\n                position: params._Position.bind(params)\n            };\n            for (var event in params.$Listeners) {\n                params.Input.addEventListener(event, params.$Listeners[event]);\n            }\n        }\n    };\n    AutoComplete.prototype.getEventsByType = function (params, type) {\n        var mappings = {};\n        for (var key in params.KeyboardMappings) {\n            var event = EventType.KEYUP;\n            if (params.KeyboardMappings[key].Event !== undefined) {\n                event = params.KeyboardMappings[key].Event;\n            }\n            if (event == type) {\n                mappings[key] = params.KeyboardMappings[key];\n            }\n        }\n        return mappings;\n    };\n    AutoComplete.prototype.event = function (params, type, event) {\n        var eventIdentifier = function (condition) {\n            if ((match === true && mapping.Operator == ConditionOperator.AND) || (match === false && mapping.Operator == ConditionOperator.OR)) {\n                condition = AutoComplete.merge({\n                    Not: false\n                }, condition);\n                if (condition.hasOwnProperty(\"Is\")) {\n                    if (condition.Is == event.keyCode) {\n                        match = !condition.Not;\n                    }\n                    else {\n                        match = condition.Not;\n                    }\n                }\n                else if (condition.hasOwnProperty(\"From\") && condition.hasOwnProperty(\"To\")) {\n                    if (event.keyCode >= condition.From && event.keyCode <= condition.To) {\n                        match = !condition.Not;\n                    }\n                    else {\n                        match = condition.Not;\n                    }\n                }\n            }\n        };\n        for (var name in AutoComplete.prototype.getEventsByType(params, type)) {\n            var mapping = AutoComplete.merge({\n                Operator: ConditionOperator.AND\n            }, params.KeyboardMappings[name]), match = ConditionOperator.AND == mapping.Operator;\n            mapping.Conditions.forEach(eventIdentifier);\n            if (match === true) {\n                mapping.Callback.call(params, event);\n            }\n        }\n    };\n    AutoComplete.prototype.makeRequest = function (params, callback, callbackErr) {\n        var propertyHttpHeaders = Object.getOwnPropertyNames(params.HttpHeaders), request = new XMLHttpRequest(), method = params._HttpMethod(), url = params._Url(), queryParams = params._Pre(), queryParamsStringify = encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(queryParams);\n        if (method.match(/^GET$/i)) {\n            if (url.indexOf(\"?\") !== -1) {\n                url += \"&\" + queryParamsStringify;\n            }\n            else {\n                url += \"?\" + queryParamsStringify;\n            }\n        }\n        request.open(method, url, true);\n        for (var i = propertyHttpHeaders.length - 1; i >= 0; i--) {\n            request.setRequestHeader(propertyHttpHeaders[i], params.HttpHeaders[propertyHttpHeaders[i]]);\n        }\n        request.onreadystatechange = function () {\n            if (request.readyState == 4 && request.status == 200) {\n                params.$Cache[queryParams] = request.response;\n                callback(request.response);\n            }\n            else if (request.status >= 400) {\n                callbackErr();\n            }\n        };\n        return request;\n    };\n    AutoComplete.prototype.ajax = function (params, request, timeout) {\n        if (timeout === void 0) { timeout = true; }\n        if (params.$AjaxTimer) {\n            window.clearTimeout(params.$AjaxTimer);\n        }\n        if (timeout === true) {\n            params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);\n        }\n        else {\n            if (params.Request) {\n                params.Request.abort();\n            }\n            params.Request = request;\n            params.Request.send(params._QueryArg() + \"=\" + params._Pre());\n        }\n    };\n    AutoComplete.prototype.cache = function (params, callback, callbackErr) {\n        var response = params._Cache(params._Pre());\n        if (response === undefined) {\n            var request = AutoComplete.prototype.makeRequest(params, callback, callbackErr);\n            AutoComplete.prototype.ajax(params, request);\n        }\n        else {\n            callback(response);\n        }\n    };\n    AutoComplete.prototype.destroy = function (params) {\n        for (var event in params.$Listeners) {\n            params.Input.removeEventListener(event, params.$Listeners[event]);\n        }\n        params.DOMResults.parentNode.removeChild(params.DOMResults);\n    };\n    AutoComplete.merge = function () {\n        var merge = {}, tmp;\n        for (var i = 0; i < arguments.length; i++) {\n            for (tmp in arguments[i]) {\n                merge[tmp] = arguments[i][tmp];\n            }\n        }\n        return merge;\n    };\n    AutoComplete.defaults = {\n        Delay: 150,\n        EmptyMessage: \"No result here\",\n        Highlight: {\n            getRegex: function (value) {\n                return new RegExp(value, \"ig\");\n            },\n            transform: function (value) {\n                return \"<strong>\" + value + \"</strong>\";\n            }\n        },\n        HttpHeaders: {\n            \"Content-type\": \"application/x-www-form-urlencoded\"\n        },\n        Limit: 0,\n        MinChars: 0,\n        HttpMethod: \"GET\",\n        QueryArg: \"q\",\n        Url: null,\n        KeyboardMappings: {\n            \"Enter\": {\n                Conditions: [{\n                        Is: 13,\n                        Not: false\n                    }],\n                Callback: function (event) {\n                    if (this.DOMResults.getAttribute(\"class\").indexOf(\"open\") != -1) {\n                        var liActive = this.DOMResults.querySelector(\"li.active\");\n                        if (liActive !== null) {\n                            event.preventDefault();\n                            this._Select(liActive);\n                            this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n                        }\n                    }\n                },\n                Operator: ConditionOperator.AND,\n                Event: EventType.KEYDOWN\n            },\n            \"KeyUpAndDown_down\": {\n                Conditions: [{\n                        Is: 38,\n                        Not: false\n                    },\n                    {\n                        Is: 40,\n                        Not: false\n                    }],\n                Callback: function (event) {\n                    event.preventDefault();\n                },\n                Operator: ConditionOperator.OR,\n                Event: EventType.KEYDOWN\n            },\n            \"KeyUpAndDown_up\": {\n                Conditions: [{\n                        Is: 38,\n                        Not: false\n                    },\n                    {\n                        Is: 40,\n                        Not: false\n                    }],\n                Callback: function (event) {\n                    event.preventDefault();\n                    var first = this.DOMResults.querySelector(\"li:first-child:not(.locked)\"), last = this.DOMResults.querySelector(\"li:last-child:not(.locked)\"), active = this.DOMResults.querySelector(\"li.active\");\n                    if (active) {\n                        var currentIndex = Array.prototype.indexOf.call(active.parentNode.children, active), position = currentIndex + (event.keyCode - 39), lisCount = this.DOMResults.getElementsByTagName(\"li\").length;\n                        if (position < 0) {\n                            position = lisCount - 1;\n                        }\n                        else if (position >= lisCount) {\n                            position = 0;\n                        }\n                        active.classList.remove(\"active\");\n                        active.parentElement.children.item(position).classList.add(\"active\");\n                    }\n                    else if (last && event.keyCode == 38) {\n                        last.classList.add(\"active\");\n                    }\n                    else if (first) {\n                        first.classList.add(\"active\");\n                    }\n                },\n                Operator: ConditionOperator.OR,\n                Event: EventType.KEYUP\n            },\n            \"AlphaNum\": {\n                Conditions: [{\n                        Is: 13,\n                        Not: true\n                    }, {\n                        From: 35,\n                        To: 40,\n                        Not: true\n                    }],\n                Callback: function () {\n                    var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\"), currentValue = this._Pre();\n                    if (currentValue !== \"\" && currentValue.length >= this._MinChars()) {\n                        if (!oldValue || currentValue != oldValue) {\n                            this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n                        }\n                        AutoComplete.prototype.cache(this, function (response) {\n                            this._Render(this._Post(response));\n                            this._Open();\n                        }.bind(this), this._Error);\n                    }\n                    else {\n                        this._Close();\n                    }\n                },\n                Operator: ConditionOperator.AND,\n                Event: EventType.KEYUP\n            }\n        },\n        DOMResults: null,\n        Request: null,\n        Input: null,\n        /**\n         * Return the message when no result returns\n         */\n        _EmptyMessage: function () {\n            var emptyMessage = \"\";\n            if (this.Input.hasAttribute(\"data-autocomplete-empty-message\")) {\n                emptyMessage = this.Input.getAttribute(\"data-autocomplete-empty-message\");\n            }\n            else if (this.EmptyMessage !== false) {\n                emptyMessage = this.EmptyMessage;\n            }\n            else {\n                emptyMessage = \"\";\n            }\n            return emptyMessage;\n        },\n        /**\n         * Returns the maximum number of results\n         */\n        _Limit: function () {\n            var limit = this.Input.getAttribute(\"data-autocomplete-limit\");\n            if (isNaN(limit) || limit === null) {\n                return this.Limit;\n            }\n            return parseInt(limit, 10);\n        },\n        /**\n         * Returns the minimum number of characters entered before firing ajax\n         */\n        _MinChars: function () {\n            var minchars = this.Input.getAttribute(\"data-autocomplete-minchars\");\n            if (isNaN(minchars) || minchars === null) {\n                return this.MinChars;\n            }\n            return parseInt(minchars, 10);\n        },\n        /**\n         * Apply transformation on labels response\n         */\n        _Highlight: function (label) {\n            return label.replace(this.Highlight.getRegex(this._Pre()), this.Highlight.transform);\n        },\n        /**\n         * Returns the HHTP method to use\n         */\n        _HttpMethod: function () {\n            if (this.Input.hasAttribute(\"data-autocomplete-method\")) {\n                return this.Input.getAttribute(\"data-autocomplete-method\");\n            }\n            return this.HttpMethod;\n        },\n        /**\n         * Returns the query param to use\n         */\n        _QueryArg: function () {\n            if (this.Input.hasAttribute(\"data-autocomplete-param-name\")) {\n                return this.Input.getAttribute(\"data-autocomplete-param-name\");\n            }\n            return this.QueryArg;\n        },\n        /**\n         * Returns the URL to use for AJAX request\n         */\n        _Url: function () {\n            if (this.Input.hasAttribute(\"data-autocomplete\")) {\n                return this.Input.getAttribute(\"data-autocomplete\");\n            }\n            return this.Url;\n        },\n        /**\n         * Manage the close\n         */\n        _Blur: function (now) {\n            if (now === void 0) { now = false; }\n            if (now) {\n                this._Close();\n            }\n            else {\n                var params = this;\n                setTimeout(function () {\n                    params._Blur(true);\n                }, 150);\n            }\n        },\n        /**\n         * Manage the cache\n         */\n        _Cache: function (value) {\n            return this.$Cache[value];\n        },\n        /**\n         * Manage the open\n         */\n        _Focus: function () {\n            var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\");\n            if ((!oldValue || this.Input.value != oldValue) && this._MinChars() <= this.Input.value.length) {\n                this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n            }\n        },\n        /**\n         * Bind all results item if one result is opened\n         */\n        _Open: function () {\n            var params = this;\n            Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n                if (li.getAttribute(\"class\") != \"locked\") {\n                    li.onclick = function () {\n                        params._Select(li);\n                    };\n                }\n            });\n        },\n        _Close: function () {\n            this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n        },\n        /**\n         * Position the results HTML element\n         */\n        _Position: function () {\n            this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n            this.DOMResults.setAttribute(\"style\", \"top:\" + (this.Input.offsetTop + this.Input.offsetHeight) + \"px;left:\" + this.Input.offsetLeft + \"px;width:\" + this.Input.clientWidth + \"px;\");\n        },\n        /**\n         * Execute the render of results DOM element\n         */\n        _Render: function (response) {\n            var ul;\n            if (typeof response == \"string\") {\n                ul = this._RenderRaw(response);\n            }\n            else {\n                ul = this._RenderResponseItems(response);\n            }\n            if (this.DOMResults.hasChildNodes()) {\n                this.DOMResults.removeChild(this.DOMResults.childNodes[0]);\n            }\n            this.DOMResults.appendChild(ul);\n        },\n        /**\n         * ResponseItems[] rendering\n         */\n        _RenderResponseItems: function (response) {\n            var ul = document.createElement(\"ul\"), li = document.createElement(\"li\"), limit = this._Limit();\n            // Order\n            if (limit < 0) {\n                response = response.reverse();\n            }\n            else if (limit === 0) {\n                limit = response.length;\n            }\n            for (var item = 0; item < Math.min(Math.abs(limit), response.length); item++) {\n                li.innerHTML = response[item].Label;\n                li.setAttribute(\"data-autocomplete-value\", response[item].Value);\n                ul.appendChild(li);\n                li = document.createElement(\"li\");\n            }\n            return ul;\n        },\n        /**\n         * string response rendering (RAW HTML)\n         */\n        _RenderRaw: function (response) {\n            var ul = document.createElement(\"ul\"), li = document.createElement(\"li\");\n            if (response.length > 0) {\n                this.DOMResults.innerHTML = response;\n            }\n            else {\n                var emptyMessage = this._EmptyMessage();\n                if (emptyMessage !== \"\") {\n                    li.innerHTML = emptyMessage;\n                    li.setAttribute(\"class\", \"locked\");\n                    ul.appendChild(li);\n                }\n            }\n            return ul;\n        },\n        /**\n         * Deal with request response\n         */\n        _Post: function (response) {\n            try {\n                var returnResponse = [];\n                //JSON return\n                var json = JSON.parse(response);\n                if (Object.keys(json).length === 0) {\n                    return \"\";\n                }\n                if (Array.isArray(json)) {\n                    for (var i = 0; i < Object.keys(json).length; i++) {\n                        returnResponse[returnResponse.length] = { \"Value\": json[i], \"Label\": this._Highlight(json[i]) };\n                    }\n                }\n                else {\n                    for (var value in json) {\n                        returnResponse.push({\n                            \"Value\": value,\n                            \"Label\": this._Highlight(json[value])\n                        });\n                    }\n                }\n                return returnResponse;\n            }\n            catch (event) {\n                //HTML return\n                return response;\n            }\n        },\n        /**\n         * Return the autocomplete value to send (before request)\n         */\n        _Pre: function () {\n            return this.Input.value;\n        },\n        /**\n         * Choice one result item\n         */\n        _Select: function (item) {\n            if (item.hasAttribute(\"data-autocomplete-value\")) {\n                this.Input.value = item.getAttribute(\"data-autocomplete-value\");\n            }\n            else {\n                this.Input.value = item.innerHTML;\n            }\n            this.Input.setAttribute(\"data-autocomplete-old-value\", this.Input.value);\n        },\n        /**\n         * Handle HTTP error on the request\n         */\n        _Error: function () {\n        },\n        $AjaxTimer: null,\n        $Cache: {},\n        $Listeners: {}\n    };\n    return AutoComplete;\n}());\nmodule.exports = AutoComplete;\n\n},{}]},{},[1])(1)\n});\n"],"names":["window","searxng","w","d","Element","ElementPrototype","matches","matchesSelector","webkitMatchesSelector","msMatchesSelector","selector","node","this","nodes","parentNode","document","querySelectorAll","i","prototype","callbackSafe","callback","el","e","call","exception","console","log","on","obj","eventType","useCapture","addEventListener","target","srcElement","found","parentElement","ready","readyState","bind","http","method","url","data","Promise","resolve","reject","req","XMLHttpRequest","open","timeout","onload","status","response","responseType","Error","statusText","onerror","onabort","ontimeout","send","ex","loadStyle","src","path","static_path","id","replace","s","getElementById","createElement","setAttribute","body","appendChild","loadScript","hasAttribute","apply","insertBefore","newNode","referenceNode","insertAfter","nextSibling","classList","add","getEndpoint","className","getElementsByTagName","values","endsWith","split","endpoint","infinite_scroll_supported","IntersectionObserverEntry","let","onlyImages","contains","newLoadSpinner","loader","replaceChildrenWith","element","children","textContent","forEach","child","loadNextPage","form","querySelector","formData","FormData","getAttribute","then","nextPageDoc","DOMParser","parseFromString","articleList","paginationElement","remove","length","articleElement","catch","err","translations","error_loading_next_page","infinite_scroll","intersectionObserveOptions","rootMargin","observedSelector","observer","IntersectionObserver","entries","paginationEntry","isIntersecting","unobserve","observe","isElementInDetail","undefined","getResultElement","isImageResult","resultElement","highlightResult","preventDefault","selectImage","vimKeys","27","key","fun","removeFocus","des","cat","73","searchInputFocus","66","scrollPage","innerHeight","70","85","68","71","scrollPageTo","scrollHeight","86","75","74","80","GoToPreviousPage","78","GoToNextPage","79","openResult","84","82","reloadPage","72","toggleHelp","hotkeys","Object","hasOwnProperty","keyCode","ctrlKey","altKey","shiftKey","metaKey","tagName","toLowerCase","which","noScroll","current","effectiveWhich","next","results","top","documentElement","scrollTop","bot","clientHeight","etop","offsetTop","ebot","nextElementSibling","previousElementSibling","removeAttribute","link","focus","scrollPageToSelected","location","reload","activeElement","blur","closeDetail","pageButtonClick","css_selector","button","click","sel","wtop","wheight","offset","scroll","scrollX","wbot","amount","scrollBy","position","nav","scrollTo","newTab","href","initHelpContent","divElement","categories","k","push","sorted","keys","sort","a","b","html","lastCategory","first","cj","innerHTML","helpPanel","toggle","selectNext","selectPrevious","event","leaflet_target","dataset","leafletTarget","map_lon","parseFloat","mapLon","map_lat","mapLat","map_zoom","mapZoom","map_boundingbox","JSON","parse","mapBoundingbox","map_geojson","mapGeojson","map_bounds","southWest","L","latLng","northEast","latLngBounds","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","TileLayer","minZoom","maxZoom","attribution","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","setTimeout","fitBounds","setView","addLayer","baseLayers","OSM Mapnik","OSM Wikimedia","control","layers","addTo","geoJson","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","img","style","display","error","btnLabelCollapsed","btnLabelNotCollapsed","targetElement","iframe_load","srctest","imgElement","thumbnailElement","detailElement","imgSrc","imgLoader","Image","firstFocus","qinput_id","qinput","placeCursorAtEnd","setSelectionRange","len","value","submitIfQuery","search","submit","createClearButton","cs","updateClearButton","ev","placeCursorAtEndOnce","autocompleter","autocomplete","AutoComplete","Url","EmptyMessage","no_item_found","HttpMethod","HttpHeaders","Content-type","X-Requested-With","MinChars","Delay","_Position","DOMResults","Input","offsetHeight","left","offsetLeft","width","clientWidth","_Open","params","Array","li","onmousedown","_Select","CustomEvent","dispatchEvent","search_on_category_select","checked","f","exports","module","define","amd","g","global","self","r","n","t","o","c","require","u","code","p","1","ConditionOperator","EventType","isArray","input","specificParams","merge","defaults","create","nodeName","match","$Listeners","_Blur","destroy","_Focus","keyup","KEYUP","keydown","KEYDOWN","getEventsByType","type","mappings","KeyboardMappings","Event","eventIdentifier","condition","mapping","Operator","AND","OR","Not","Is","From","To","name","Conditions","Callback","makeRequest","callbackErr","propertyHttpHeaders","getOwnPropertyNames","request","_HttpMethod","_Url","queryParams","_Pre","queryParamsStringify","encodeURIComponent","_QueryArg","indexOf","setRequestHeader","onreadystatechange","$Cache","ajax","$AjaxTimer","clearTimeout","Request","abort","cache","_Cache","removeEventListener","removeChild","tmp","arguments","Highlight","getRegex","RegExp","transform","Limit","QueryArg","Enter","liActive","KeyUpAndDown_down","KeyUpAndDown_up","last","active","currentIndex","lisCount","item","AlphaNum","oldValue","currentValue","_MinChars","_Render","_Post","_Error","_Close","_EmptyMessage","emptyMessage","_Limit","limit","isNaN","parseInt","minchars","_Highlight","label","now","onclick","ul","_RenderRaw","_RenderResponseItems","hasChildNodes","childNodes","reverse","Math","min","abs","Label","Value","returnResponse","json"],"mappings":"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"}
\ No newline at end of file