fgt-webui-tools

FortiGate WebUI Tools > Usage

javascript:(async function(){let ver="0.2.6";var e,t;function a(){return document.querySelector("#showP1ConfigModal .modal-content")}function r(){var e=document.getElementById("showP1ConfigModal");return e.style.display="flex",e}(e=document.createElement("style")).id="fortigate-webui",t="".concat(".modal {","display: none;","position: fixed;","z-index: 1000;","left: 0;","top: 0;","width: 100%;","height: 100%;","overflow: auto;","background-color: rgba(0, 0, 0, 0.7);","}",".modal-header { display: flex; flex-direction: row; justify-content: space-between; background-color: rgb(73, 146, 88); padding: 0 10px; align-items: baseline;}",".modal-header h2, .modal-header span { color: rgba(255, 255, 255, 0.85) }",".modal-content {","background-color: rgb(73, 146, 88);","display: flex;","flex-direction: column;","justify-content: space-around;","margin: auto;","border: 1px solid #888;","min-width: 30%;","max-width: 70%;","background-color: #fdfdfd;","box-shadow: 0px 0px 20px 10px rgba(0,0,0,0.6);","}",".modal-content pre { width: 100%; align-self: center; background-color: #fdfdfd; margin: 0 !important; }",".modal-content code { border-left-width: 0 !important; }",".modal .modal-content pre code { margin: 0 !important; }",".close {","color: #aaaaaa;","float: right;","font-size: 28px;","font-weight: bold;","margin-left: 20px;","}",".close:hover,",".close:focus {","text-decoration: none;","cursor: pointer;","}"),e.innerText="".concat("table.left-align td, table.left-align th { text-align:left !important; border:1px solid grey; padding-left: 5px; padding-right: 5px;}",t),document.head.appendChild(e),function e(){var t=document.createElement("div");t.id="showP1ConfigModal",t.className="modal";let n=e=>!!e&&!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length);var a=document.createElement("div");a.className="modal-content";var r=document.createElement("div");r.className="modal-header";var i=document.createElement("h2"),o=document.createElement("span");o.className="close",o.innerHTML="&times;",r.appendChild(i),r.appendChild(o),a.appendChild(r),t.appendChild(a),document.body.appendChild(t);var s=document.getElementById("showP1ConfigModal"),o=document.querySelector(".close");o.onclick=function(){s.style.display="none"},function e(t,a){a??=t;let r=e=>{!t.contains(e.target)&&n(a)&&(a.style.display="none")};document.addEventListener("click",r)}(a,t)}();let i=["\0"],o=[],s=!1;function l(){let e=document.createElement("div");return e.textContent="1",e.style.position="absolute",e.style.top="50%",e.style.transform="translateY(-50%)",e.style.width="20px",e.style.height="20px",e.style.borderRadius="50%",e.style.backgroundColor="red",e.style.color="white",e.style.fontSize="12px",e.style.textAlign="center",e.style.lineHeight="20px",e}function c(){let e=document.createElement("li");return e.style.listStyle="none",e.style.position="relative",e.style.color="black",e.style.backgroundColor="#FFD700",e.style.margin=0,e.style.padding="6px 0 5px 35px",e.style.cursor="pointer",e.style.fontWeight="normal",e.addEventListener("mousedown",e=>{e.preventDefault()}),e.onmouseover=function(){"active"!==this.dataset.active&&(this.style["background-color"]="#FFE86D")},e.onmouseout=function(){"active"!==this.dataset.active&&(this.style["background-color"]="#FFD700")},e}function d(e){return null==e?"":e?'<f-icon class="fa-status-up"></f-icon> Up':'<f-icon class="fa-status-down"></f-icon> Down'}function p(){let e=document.cookie.split("; ").find(e=>e.startsWith("ccsrftoken"))?.split("=")[1];return JSON.parse(e)}function g(e,t){let n=new URL(t.url);document.getElementById("api-status").innerText="".concat("API status: ",e," ",n.pathname," → ",t.status," ",t.statusText)}async function m(e,t,n,a){fetch("/api/v2/monitor/vpn/ipsec/tunnel_"+a,{method:"POST",headers:{"Content-Type":"application/json;charset=UTF-8","X-Csrftoken":p()},body:JSON.stringify({p1name:e,p2name:t,p2serial:n})}).then(e=>g("POST",e))}async function y(e){fetch("/api/v2/monitor/vpn/ipsec/tunnel_reset_stats",{method:"POST",headers:{"Content-Type":"application/json;charset=UTF-8","X-Csrftoken":p()},body:JSON.stringify({p1name:e})}).then(e=>g("POST",e))}async function b(e){fetch("/api/v2/monitor/vpn/ike/clear",{method:"POST",headers:{"Content-Type":"application/json;charset=UTF-8","X-Csrftoken":p()},body:JSON.stringify({mkey:e})}).then(e=>g("POST",e))}async function h(e){M||X(),D="show vpn ipsec phase1-interface "+e,O("show vpn ipsec phase1-interface "+e)}async function $(e){M||X(),A="send_ws_command",D=e,O(e)}function x(e){let t=e.target.closest("a");if(t)switch(t.dataset.action){case"expand_proxies":null==t.dataset.expanded?(t.dataset.expanded="expanded",t.innerText="- Less",t.nextElementSibling.style.display="block"):(delete t.dataset.expanded,t.innerText="+ More",t.nextElementSibling.style.display="none");break;case"tunnel_up":m(t.dataset.p1name,t.dataset.p2name,+t.dataset.p2serial,"up");break;case"tunnel_down":m(t.dataset.p1name,t.dataset.p2name,+t.dataset.p2serial,"down");break;case"expand_debug":null==t.dataset.expanded?(t.dataset.expanded="expanded",t.innerHTML='&nbsp;<f-icon class="fa-minus-circle"></f-icon>&nbsp;',t.nextElementSibling.style.display="block"):(delete t.dataset.expanded,t.innerHTML='&nbsp;<f-icon class="fa-plus-circle"></f-icon>&nbsp;',t.nextElementSibling.style.display="none");break;case"reset_stats":y(t.dataset.p1name);break;case"clear_ike":b(t.dataset.p1name);break;case"show_p1_config":A="showp1config",h(t.dataset.p1name);break;case"send_ws_command":$(t.dataset.command)}}window.addEventListener("fpCliResponse",e=>{let t=RegExp("^(.*?)\\u0000(.*?)(?="+e.data.stoppingToken+"|$)(.*)?","s"),n;if(null!==(n=t.exec(e.data.message))){n[1];let i=n[2];n[3],function e(t,n){let i=["sys_cmd","arp_cmd1","arp_cmd2","ipsec_tunnel"].includes(n),o=i?document.querySelector('table[data-command="'+D+'"]'):document.querySelector('code[data-command="'+D+'"]'),s;if(!o){i||((s=document.createElement("pre")).classList.add("language-bash"),s.dataset.active="active"),(o=i?document.createElement("table"):document.createElement("code")).dataset.command=D,o.dataset.active="active",o.classList.add("language-bash"),o.style.margin="1rem",o.style.display="block";let l=document.querySelector('li[data-command="'+D+'"]');i?l&&H(o,l):(s.appendChild(o),l&&H(s,l))}if(t.toLowerCase().includes("unknown action")){o.innerHTML="<span>Command is not accessible</span>";return}switch(n){case"sys_cmd":B=["Key","Value"],o.innerHTML=z(t,B,void 0,void 0,": "),o.classList.add("left-align");break;case"arp_cmd1":B=["IP Address","Age(min)","MAC Address","Interface"],o.innerHTML=z(t,B),o.classList.add("left-align");break;case"arp_cmd2":B=["Index","Interface","IP Address","MAC Address","Status","Use","Confirm","Update","Ref"],invisibleHeaders=["Index"],o.innerHTML=z(t,B,invisibleHeaders,e=>e.substring(e.indexOf("=")+1)),o.classList.add("left-align");break;case"ntp_info":o.innerHTML=function e(t){line=Array.isArray(t)?t.map(e=>e.trim()).join(" "):t.split("\n").map(e=>e.trim()).join(" ");let n=[],a=line.split(/\s+/).filter(e=>""!=e),r=0;for(let i=0;i<a.length;i+=3){let o=a.slice(i,i+3).join(" ");if(o.indexOf("set")>=0&&!o.trim().startsWith("set")){let s=o.indexOf("set"),l=o.substring(0,s).trim(),c=o.substring(s).trim();o=c+" "+l}r=o.startsWith("set")?1:0,n.push("    ".repeat(r)+o)}return n.join("\r\n").replace(E,"").trim()}(t);break;case"ipsec_tunnel":B=["Index","Device","Encryption (encrypted / decrypted)","Integrity (generated / validated)"],subheaders=[{parent:"Encryption (encrypted / decrypted)",headers:["null","des","3des","aes-cbc","aes-gcm","aria","seed","chacha20poly1305"]},{parent:"Integrity (generated / validated)",headers:["null","md5","sha1","sha256","sha386","sha512"]}],invisibleHeaders=["Index"],t=t.replace("IPsec crypto devices in use:","");let c=e=>{let t=e.split(/\n\s*\n/).map(e=>{let t=e.trim().split(/\r\n/),n=t[0].replace(":",""),a=j(t,"Encryption"),r=j(t,"Integrity"),i=t.slice(a+1,r);i=i.map((e,t)=>{let n=e.split(":")[1].split(" ").filter(e=>e).map((e,t)=>" "+e+" ").join("/\r\n").replace(" 0 /\r\n 0 "," - ");return n});let o=t.slice(r+1);return o=o.map((e,t)=>{let n=e.split(":")[1].split(" ").filter(e=>e).map((e,t)=>" "+e+" ").join("/\r\n").replace(" 0 /\r\n 0 "," - ");return n}),'<td style="border:1px solid grey;text-align:center"><div style="white-space: pre-wrap;">'+n+"</div></td>\r\n"+i.map((e,t)=>'<td style="'+F(e,t)+'border:1px solid grey;text-align:center"><div style="white-space: pre-wrap;">'+e+"</div></td>")+"\r\n"+o.map((e,t)=>'<td style="'+F(e,t)+'border:1px solid grey;text-align:center"><div style="white-space: pre-wrap;">'+e+"</div></td>")}).map(e=>"<tr>"+e+"</tr>");return t.join("\r\n")};for(o.innerHTML=z(t,B,invisibleHeaders,void 0,void 0,c,subheaders);o.innerHTML.endsWith(",");)o.innerHTML=o.innerHTML.substring(0,o.innerHTML.length-2);break;case"showp1config":let d=a();if(r(),o.innerHTML=t,d.children.length<2)d.appendChild(s);else{let p=document.querySelector("#showP1ConfigModal pre");if(p){let g=document.querySelector("#showP1ConfigModal code");p.replaceChild(o,g)}}let m=document.querySelector(".modal .modal-header h2");m&&(m.innerText=D);break;case"send_ws_command":{let y=a();if(r(),o.innerHTML=t,y.children.length<2)y.appendChild(s);else{let b=document.querySelector("#showP1ConfigModal pre");if(b){let h=document.querySelector("#showP1ConfigModal code");b.replaceChild(o,h)}}let $=document.querySelector(".modal .modal-header h2");$&&($.innerText=D);break}default:o.innerHTML+=t}Prism.highlightAll()}(i.trim(),e.data.it)}}),fetch("https://api.github.com/repos/fwsec/fgt-webui-tools/contents").then(e=>{if(!e.ok)throw Error("Network response was not ok");return e.json()}).then(e=>{let t=/fgt_webui_tools_v([0-9]+\.[0-9]+\.[0-9]+)\.js/,a=e.find(e=>t.test(e.name));if(!a)return;let r=a.name.match(t),i=r[1];if(i!==ver){let o=c();o.innerText="Update available!";let s=l();s.style.left="8px",o.onclick=function(){let e=Z.querySelectorAll("li");e.forEach(e=>{e.dataset.active="",e.style.backgroundColor="#FFD700"}),this.dataset.active="active",this.style.backgroundColor="#FFE86D",Q({script:async function(e){let t=document.createElement("table");t.innerHTML='<tbody><tr><td colspan="2"><span style="font-weight:bold">FortiGate WebUI Tools</span></td></tr><tr><td>Current Version:</td><td>'+ver+"</td></tr><tr><td>Recommended Version:</td><td>"+i+"</td></tr></tbody>",t.style.borderSpacing="8px",t.style.paddingBottom="10px";let a=document.createElement("a");a.href="https://fwsec.github.io/fgt-webui-tools/",a.innerText="View recommended version on GitHub",a.target="_blank",a.style.marginLeft="8px",e.innerHTML="",e.style.overflow="auto",e.style.padding="1.5rem",e.appendChild(t),e.appendChild(a)}})};let d=!0;o||(d=!1);let p=document.getElementById("custom-menu");p||(d=!1);let g=document.getElementById("menu-toggle");if(g||(d=!1),d){o.appendChild(s),p.appendChild(o);let m=l();m.style.right="28px",g.appendChild(m)}else setTimeout(()=>{let e=document.getElementById("custom-menu"),t=document.getElementById("menu-toggle");o.appendChild(s),e.appendChild(o);let n=l();n.style.right="28px",t.appendChild(n)},500)}}).catch(e=>{}),document.contains(document.getElementById("tools"))&&document.getElementById("tools").remove();let E="";async function k(){let e=await fetch("/api/v2/monitor/system/status"),t=await e.json();E=t.results.hostname,o.push(E+" [#$]")}!function e(){let t=document.createElement("style");t.innerHTML="code[class*=language-],pre[class*=language-]{color:#000;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{position:relative;margin:.5em 0;overflow:visible;padding:1px}pre[class*=language-]>code{position:relative;z-index:1;border-left:9px solid #499258;box-shadow:-1px 0 0 0 #358ccb,0 0 0 1px #dfdfdf;background-color:#fdfdfd;background-image:linear-gradient(transparent 50%,rgba(69,142,209,.04) 50%);background-size:3em 3em;background-origin:content-box;background-attachment:local}code[class*=language-]{max-height:inherit;height:inherit;padding:0 1em;display:block;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:#fdfdfd;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-bottom:1em}:not(pre)>code[class*=language-]{position:relative;padding:.2em;border-radius:.3em;color:#c92c2c;border:1px solid rgba(0,0,0,.1);display:inline;white-space:normal}pre[class*=language-]:before,pre[class*=language-]:after {display:none}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#7d8b99}.token.punctuation{color:#5f6364}.token.boolean,.token.constant,.token.deleted,.token.function-name,.token.number,.token.property,.token.symbol,.token.tag{color:#c92c2c}.token.attr-name,.token.builtin,.token.char,.token.function,.token.inserted,.token.selector,.token.string{color:#2f9c0a}.token.entity,.token.operator,.token.url,.token.variable{color:#a67f59;background:rgba(255,255,255,.5)}.token.atrule,.token.attr-value,.token.class-name,.token.keyword{color:#1990b8}.token.important,.token.regex{color:#e90}.language-css .token.string,.style .token.string{color:#a67f59;background:rgba(255,255,255,.5)}.token.important{font-weight:400}.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.namespace{opacity:.7}@media screen and (max-width:767px){pre[class*=language-]:after,pre[class*=language-]:before{bottom:14px;box-shadow:none}}pre[class*=language-].line-numbers.line-numbers{padding-left:0}pre[class*=language-].line-numbers.line-numbers code{padding-left:3.8em}pre[class*=language-].line-numbers.line-numbers .line-numbers-rows{left:0}pre[class*=language-][data-line]{padding-top:0;padding-bottom:0;padding-left:0}pre[data-line] code{position:relative;padding-left:4em}pre .line-highlight{margin-top:0}#custom-ng1-app{height:calc(100% - (41px))}",document.head.appendChild(t);let n=document.createElement("script");n.innerHTML='var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\\s)lang(?:uage)?-([\\w-]+)(?=\\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(n,t){var r,i;switch(t=t||{},a.util.type(n)){case"Object":if(i=a.util.objId(n),t[i])return t[i];for(var l in r={},t[i]=r,n)n.hasOwnProperty(l)&&(r[l]=e(n[l],t));return r;case"Array":return i=a.util.objId(n),t[i]?t[i]:(r=[],t[i]=r,n.forEach((function(n,a){r[a]=e(n,t)})),r);default:return n}},getLanguage:function(e){for(;e;){var t=n.exec(e.className);if(t)return t[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,t){e.className=e.className.replace(RegExp(n,"gi"),""),e.classList.add("language-"+t)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(r){var e=(/at [^(\\r\\n]*\\((.*):[^:]+:[^:]+\\)$/i.exec(r.stack)||[])[1];if(e){var n=document.getElementsByTagName("script");for(var t in n)if(n[t].src==e)return n[t]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:r,plaintext:r,text:r,txt:r,extend:function(e,n){var t=a.util.clone(a.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(e,n,t,r){var i=(r=r||a.languages)[e],l={};for(var o in i)if(i.hasOwnProperty(o)){if(o==n)for(var s in t)t.hasOwnProperty(s)&&(l[s]=t[s]);t.hasOwnProperty(o)||(l[o]=i[o])}var u=r[e];return r[e]=l,a.languages.DFS(a.languages,(function(n,t){t===u&&n!=e&&(this[n]=l)})),l},DFS:function e(n,t,r,i){i=i||{};var l=a.util.objId;for(var o in n)if(n.hasOwnProperty(o)){t.call(n,o,n[o],r||o);var s=n[o],u=a.util.type(s);"Object"!==u||i[l(s)]?"Array"!==u||i[l(s)]||(i[l(s)]=!0,e(s,t,o,i)):(i[l(s)]=!0,e(s,t,null,i))}}},plugins:{},highlightAll:function(e,n){a.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:\'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code\'};a.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),a.hooks.run("before-all-elements-highlight",r);for(var i,l=0;i=r.elements[l++];)a.highlightElement(i,!0===n,r.callback)},highlightElement:function(n,t,r){var i=a.util.getLanguage(n),l=a.languages[i];a.util.setLanguage(n,i);var o=n.parentElement;o&&"pre"===o.nodeName.toLowerCase()&&a.util.setLanguage(o,i);var s={element:n,language:i,grammar:l,code:n.textContent};function u(e){s.highlightedCode=e,a.hooks.run("before-insert",s),s.element.innerHTML=s.highlightedCode,a.hooks.run("after-highlight",s),a.hooks.run("complete",s),r&&r.call(s.element)}if(a.hooks.run("before-sanity-check",s),(o=s.element.parentElement)&&"pre"===o.nodeName.toLowerCase()&&!o.hasAttribute("tabindex")&&o.setAttribute("tabindex","0"),!s.code)return a.hooks.run("complete",s),void(r&&r.call(s.element));if(a.hooks.run("before-highlight",s),s.grammar)if(t&&e.Worker){var c=new Worker(a.filename);c.onmessage=function(e){u(e.data)},c.postMessage(JSON.stringify({language:s.language,code:s.code,immediateClose:!0}))}else u(a.highlight(s.code,s.grammar,s.language));else u(a.util.encode(s.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};if(a.hooks.run("before-tokenize",r),!r.grammar)throw new Error(\'The language "\'+r.language+\'" has no grammar.\');return r.tokens=a.tokenize(r.code,r.grammar),a.hooks.run("after-tokenize",r),i.stringify(a.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new s;return u(a,a.head,e),o(e,a,n,a.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=a.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=a.hooks.all[e];if(t&&t.length)for(var r,i=0;r=t[i++];)r(n)}},Token:i};function i(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function l(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function o(e,n,t,r,s,g){for(var f in t)if(t.hasOwnProperty(f)&&t[f]){var h=t[f];h=Array.isArray(h)?h:[h];for(var d=0;d<h.length;++d){if(g&&g.cause==f+","+d)return;var v=h[d],p=v.inside,m=!!v.lookbehind,y=!!v.greedy,k=v.alias;if(y&&!v.pattern.global){var x=v.pattern.toString().match(/[imsuy]*$/)[0];v.pattern=RegExp(v.pattern.source,x+"g")}for(var b=v.pattern||v,w=r.next,A=s;w!==n.tail&&!(g&&A>=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(j<O||"string"==typeof C.value);C=C.next)L++,j+=C.value.length;L--,E=e.slice(A,j),P.index-=A}else if(!(P=l(b,0,E,m)))continue;S=P.index;var N=P[0],_=E.slice(0,S),M=E.slice(S+N.length),W=A+E.length;g&&W>g.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;n.next=r,r.prev=n,e.length-=a}if(e.Prism=a,i.stringify=function e(n,t){if("string"==typeof n)return n;if(Array.isArray(n)){var r="";return n.forEach((function(n){r+=e(n,t)})),r}var i={type:n.type,content:e(n.content,t),tag:"span",classes:["token",n.type],attributes:{},language:t},l=n.alias;l&&(Array.isArray(l)?Array.prototype.push.apply(i.classes,l):i.classes.push(l)),a.hooks.run("wrap",i);var o="";for(var s in i.attributes)o+=" "+s+\'="\'+(i.attributes[s]||"").replace(/"/g,"&quot;")+\'"\';return"<"+i.tag+\' class="\'+i.classes.join(" ")+\'"\'+o+">"+i.content+"</"+i.tag+">"},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);',document.head.appendChild(n);let a=document.createElement("script");a.innerHTML='!function(e){var t="\\\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\\\b",a={pattern:/(^(["\']?)\\w+\\2)[ \\t]+\\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\\\$"+t),alias:"constant"},variable:[{pattern:/\\$?\\(\\([\\s\\S]+?\\)\\)/,greedy:!0,inside:{variable:[{pattern:/(^\\$\\(\\([\\s\\S]+)\\)\\)/,lookbehind:!0},/^\\$\\(\\(/],number:/\\b0x[\\dA-Fa-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee]-?\\d+)?/,operator:/--|\\+\\+|\\*\\*=?|<<=?|>>=?|&&|\\|\\||[=!+\\-*/%<>^&|]=?|[?~:]/,punctuation:/\\(\\(?|\\)\\)?|,|;/}},{pattern:/\\$\\((?:\\([^)]+\\)|[^()])+\\)|`[^`]+`/,greedy:!0,inside:{variable:/^\\$\\(|^`|\\)$|`$/}},{pattern:/\\$\\{[^}]+\\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\\/]|##?|%%?|\\^\\^?|,,?/,punctuation:/[\\[\\]]/,environment:{pattern:RegExp("(\\\\{)"+t),lookbehind:!0,alias:"constant"}}},/\\$(?:\\w+|[#?*!@$])/],entity:/\\\\(?:[abceEfnrtv\\\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\\s*\\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\\bfunction\\s+)[\\w-]+(?=(?:\\s*\\(?:\\s*\\))?\\s*\\{)/,lookbehind:!0,alias:"function"},{pattern:/\\b[\\w-]+(?=\\s*\\(\\s*\\)\\s*\\{)/,alias:"function"}],"for-or-select":{pattern:/(\\b(?:for|select)\\s+)\\w+(?=\\s+in\\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\\s;|&]|[<>]\\()\\w+(?:\\.\\w+)*(?=\\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\\\s;|&]|[<>]\\\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\\s)-{1,2}(?:\\w+:[+-]?)?\\w+(?:\\.\\w+)*(?=[=\\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\\s*)(\\w+)\\s[\\s\\S]*?(?:\\r?\\n|\\r)\\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\\s*)(["\'])(\\w+)\\2\\s[\\s\\S]*?(?:\\r?\\n|\\r)\\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\\\](?:\\\\\\\\)*)"(?:\\\\[\\s\\S]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\\\])\'[^\']*\'/,lookbehind:!0,greedy:!0},{pattern:/\\$\'(?:[^\'\\\\]|\\\\[\\s\\S])*\'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\\s;|&]|[<>]\\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\\s;|&]|[<>]\\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\\s;|&]|[<>]\\()(?:\\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\\s;|&]|[<>]\\()(?:false|true)(?=$|[)\\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\\B&\\d\\b/,alias:"important"},operator:{pattern:/\\d?<>|>\\||\\+=|=[=~]?|!=?|<<[<-]?|[&\\d]?>>|\\d[<>]&?|[<>][&=]?|&[>&]?|\\|[&|]?/,inside:{"file-descriptor":{pattern:/^\\d/,alias:"important"}}},punctuation:/\\$?\\(\\(?|\\)\\)?|\\.\\.|[{}[\\];\\\\]/,number:{pattern:/(^|\\s)(?:[1-9]\\d*|0)(?:[.,]\\d+)?\\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i<s.length;i++)o[s[i]]=e.languages.bash[s[i]];e.languages.sh=e.languages.bash,e.languages.shell=e.languages.bash}(Prism);',document.head.appendChild(a)}(),await k(),Prism.languages.bash={...Prism.languages.bash,keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while|set)(?=$|[)\s;|&])/,lookbehind:!0}};let _=function e(){let t=document.querySelectorAll("script[src]"),n=Array.from(t).find(e=>/\/([a-f0-9]{32}|static)\/runtime\.js/.test(e.src)),a=n.src.match(/\/([a-f0-9]{32}|static)\/runtime\.js/)[1];return a}();!function e(t){let n=document.createElement("link");n.rel="stylesheet",n.href=t,n.type="text/css",document.head.appendChild(n)}("/"+_+"/css/legacy-main.css");let S="_cliWS",A="",T=["get system status","get system global","get system settings"],L=["get system arp","diag ip arp list"],P=["show system ntp","diag sys ntp status","diag sys dayst-info"],C=["get vpn ipsec stats crypto"],I='<svg viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg" style="width: 18px; height: 18px;"><path d="m12.01 9.531-4.25 4.25a.747.747 0 0 1-1.06 0l-.706-.706a.747.747 0 0 1 0-1.06l3.012-3.012-3.012-3.012a.747.747 0 0 1 0-1.06l.703-.712a.747.747 0 0 1 1.06 0l4.25 4.25a.748.748 0 0 1 .002 1.062z"></path></svg></nu-icon>',N='<nu-icon class="icon" style="margin-left:auto;width:18px;height:14px;transform:rotate(0deg)">'+I,M=window[S],D;function O(e){1==M.readyState&&M.send(e+" \n")}function H(e,t){t.parentNode.insertBefore(e,t.nextSibling)}let R=[];function z(e,t,n,a,r=" ",i,o){var s,l,c,d;let p=t??[];R=[];let g=function e(t,n){if(t&&t.length>0){n&&n.length>0&&(t=t.filter((e,t)=>!n.includes(e)||(R.push(t),!1)));let a=o?"<tr>"+o.flatMap(e=>e.headers).map(e=>'<td style="border:1px solid grey;text-align:center;">'+e+"</td>").join("")+"</tr>":"";return"<tr>"+t.map((e,t)=>{let n="";if(o){let a=o.find(t=>{let n=e.indexOf(t.parent);return n>=0});a?n='colspan="'+a.headers.length+'"':o&&(n='rowspan="2"')}return'<th style="border:1px solid grey;text-align:center;"'+n+">"+e+"</th>"}).join("")+"</tr>".concat(a)}}(p,n),m=i?i(e):(s=e,l=p,c=a,d=r,s.split("\n").filter(e=>""!=e.trim()).map((e,t)=>{var n,a;let r=e.split(d).map(e=>e.trim()).filter(e=>""!=e);return(R.length>0&&(r=r.filter((e,t)=>!R.includes(t))),0===r.length||r.length!=l.length-R.length)?"":"<tr>"+(r=(n=r,a=c,n.map(e=>(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=e.replace("00000000",'<span title="Pseudo state used while an ARP entry is initially created or just before it is removed"><f-icon class="fa-connected"></f-icon>&nbsp;NONE<span>')).replace("00000001",'<span title="First ARP request sent"><f-icon class="fa-connected"></f-icon>&nbsp;INCOMPLETE</span>')).replace("00000002",'<span title="ARP response is received"><f-icon class="fa-connected"></f-icon>&nbsp;REACHABLE</span>')).replace("00000004",'<span title="ARP response is not received within expected time"><f-icon class="fa-custom-action"></f-icon>&nbsp;STALE</span>')).replace("00000008",'<span title="Schedule ARP request"><f-icon class="fa-clock-plus"></f-icon>&nbsp;DELAY</span>')).replace("00000010",'<span title="Actively sending ARP requests to try and resolve the address"><f-icon class="fa-clock-plus"></f-icon>&nbsp;PROBE</span>')).replace("00000020",'<span title="Not managed to resolve ARP within max configured number of probes"><f-icon class="fa-cancel"></f-icon>&nbsp;FAILED</span>')).replace("00000040",'<span title="Device does not support ARP e.g. IPsec Interface"><f-icon class="fa-dismiss"></f-icon>&nbsp;NOARP</span>')).replace("00000080",'<span title="Statically configured ARP entry">PERMANENT</span>')).replace(/[dD]isable/g,'<f-icon class="fa-disabled"></f-icon>&nbsp;<span style="color:silver">Disabled</span>')).replace(/[nN]ot [aV]vailable/g,'<f-icon class="fa-disabled"></f-icon>&nbsp;<span style="color:silver">Not available</span>')).replace(/[eE]nable/g,'<f-icon class="fa-enabled"></f-icon>&nbsp;<span>Enabled</span>')).replace(/[cC]ertified/g,'<f-icon class="fa-enabled"></f-icon>&nbsp;<span>Certified</span>'),a)?a(e):e))).map(e=>"<td>"+e+"</td>").join("")+"</tr>"}).filter(e=>""!=e).join("\n"));return g+"\r\n"+m}function j(e,t){for(let n=0;n<e.length;n++)if(e[n].includes(t))return n;return -1}let B=[];function F(e,t){var n,a;return"background-color:"+(n=e,a=t,"-"==n.trim()?"":[0,1,2,8,9,10].includes(a)?"pink":"lightgreen")+";"}let G="",U=!1,q=!1;async function W(e){if(0!=M.bufferedAmount)return;let t;if(e.data instanceof ArrayBuffer){var n,a;t=(n=new Uint8Array(e.data),decodeURIComponent(escape(String.fromCharCode.apply(null,n))))}else t=await e.data.text();let r=i.find(e=>t.includes(e)),s=o.find(e=>{let n=RegExp(e);return n.test(t)});if(r&&(G="",U=!0,q=!1),G+=t,U&&!q&&s){let l=new Event("fpCliResponse");l.data={message:G,it:A,stoppingToken:s},window.dispatchEvent(l),G="",q=!0,U=!1}}function X(){let e="https:"===location.protocol?"wss:":"ws:",t=e+"//"+location.hostname+":"+location.port+"/ws/cli/open?cols=500&rows=500";window[S]=M=new WebSocket(t),M.binaryType="arraybuffer",M.addEventListener("message",W),M.addEventListener("close",()=>window[S]=null),M.addEventListener("open",()=>{s=!0}),M.addEventListener("close",()=>{s=!1})}let K=[{label:"System info",content:"",script:function(e){M||X();let t=document.createElement("ul");t.id="system-info-command-list",T.forEach(e=>{let n=document.createElement("li");n.style.marginBottom="1rem",n.style.color="green",n.style.cursor="pointer",n.style.userSelect="none",n.dataset.command=e,n.innerHTML="&nbsp;"+e+N,n.onclick=function(){if(A="sys_cmd",M){let e=this.nextSibling&&"TABLE"===this.nextSibling.nodeName?this.nextSibling:null,t=this.querySelector(".icon");if(e)"active"===e.dataset.active?(e.dataset.active="",e.style.display="none",t.style.transform="rotate(0deg)"):(e.dataset.active="active",e.style.display="block",t.style.transform="rotate(90deg)");else{ready=!0;let a=n.dataset.command;O(a),D=a,t.style.transform="rotate(90deg)"}}else X()},t.appendChild(n)}),e.innerHTML="",e.style.overflow="auto",e.style.padding="1.5rem",e.appendChild(t)}},{label:"ARP info",content:"",script:function(e){M||X();let t=document.createElement("ul");t.id="system-arp-command-list",L.forEach(e=>{let n=document.createElement("li");n.style.marginBottom="1rem",n.style.color="green",n.style.cursor="pointer",n.style.userSelect="none",n.dataset.command=e,n.innerHTML="&nbsp;"+e+N,n.onclick=function(){if(A="arp_cmd1","diag"==this.innerHTML.substr(6,4)&&(A="arp_cmd2"),M){let e=this.nextSibling&&"TABLE"===this.nextSibling.nodeName?this.nextSibling:null,t=this.querySelector(".icon");if(e)"active"===e.dataset.active?(e.dataset.active="",e.style.display="none",t.style.transform="rotate(0deg)"):(e.dataset.active="active",e.style.display="block",t.style.transform="rotate(90deg)");else{ready=!0;let a=n.dataset.command;O(a),D=a,t.style.transform="rotate(90deg)"}}else X()},t.appendChild(n)}),e.innerHTML="",e.style.overflow="auto",e.style.padding="1.5rem",e.appendChild(t)}},{label:"Local-in policy",content:"",script:async function(e){var t,n;let a=await fetch("/api/v2/cmdb/firewall/local-in-policy"),r=await a.json(),i=await fetch("/api/v2/cmdb/firewall/local-in-policy6"),o=await i.json(),s=await fetch("/api/v2/monitor/firewall/local-in"),l=await s.json(),c=await fetch("/api/v2/monitor/system/available-interfaces?start=0&view_type=limited"),d=await c.json(),p=document.createElement("div");function g(e){for(let n of e.results){for(let a in src_="",n.srcaddr)0!=a&&(src_+="<br>"),"enable"==n["srcaddr-negate"]&&(src_+='<f-icon class="fa-negate" title="Negated" style="cursor:pointer"></f-icon>&nbsp;'),src_+=n.srcaddr[a].name;for(let r in dst_="",n.dstaddr)0!=r&&(dst_+="<br>"),"enable"==n["dstaddr-negate"]&&(dst_+='<f-icon class="fa-negate" title="Negated" style="cursor:pointer"></f-icon>&nbsp;'),dst_+=n.dstaddr[r].name.replace("all",'<f-icon class="ftnt-device-fortinet" title="This FortiGate" style="cursor:pointer"></f-icon>&nbsp;FortiGate (all)');for(let i in svc_="",n.service)0!=i&&(svc_+="<br>"),"enable"==n["service-negate"]&&(svc_+='<f-icon class="fa-negate" title="Negated" style="cursor:pointer"></f-icon>&nbsp;'),svc_+=n.service[i].name;t+='<tr style="height:32px;text-align:center"><td style="border:1px solid #E2E2E2">'+n.policyid+'</td><td style="border:1px solid #E2E2E2">'+n.status.replace("enable",'<f-icon class="fa-enabled" title="Enabled" style="cursor:pointer"></f-icon>&nbsp;Enabled').replace("disable",'<f-icon class="fa-disabled" title="Disabled" style="cursor:pointer"></f-icon>&nbsp;<span style="color:silver">Disabled</span>')+n["ha-mgmt-intf-only"].replace("enable","<br>HA&nbsp;management&nbsp;interface&nbsp;only").replace("disable","")+'</td><td style="border:1px solid #E2E2E2">'+n.intf.replace("any",'<f-icon class="fa-square-o" title="Any interface" style="cursor:pointer"></f-icon>&nbsp;any')+'</td><td style="border:1px solid #E2E2E2">'+src_+'</td><td style="border:1px solid #E2E2E2">'+dst_+'</td><td style="border:1px solid #E2E2E2">'+svc_+'</td><td style="border:1px solid #E2E2E2">'+n.action.replace("deny",'<f-icon class="fa-denied" title="Deny" style="cursor:pointer"></f-icon>&nbsp;Deny').replace("accept",'<f-icon class="fa-accepted" title="Accept" style="cursor:pointer"></f-icon>&nbsp;Accept')+'</td><td style="border:1px solid #E2E2E2">'+n.schedule+'</td><td style="border:1px solid #E2E2E2">'+n.comments+"</td></tr>"}}p.setAttribute("id","clip"),t=n="<table style='width:100%;padding:0;border-spacing:0;border-collapse:collapse'><tr>",0===r.size&&0===o.size?t+="<td style='text-align:center;color:#aaa'>No custom Local-in policy configured.</td></tr>":(u="<td style='height:37px;text-align:center;background-color:gainsboro;border:1px solid #B9B9B9' colspan='9'>Custom Local-In ",v="Policy<span style='color:#aaa'> &rarr; configured via CLI / API</span></td></tr>",w="<tr style='height:32px;text-align:center;color:#fff;background-color:#5A5A5A;border:1px solid #B9B9B9'><td>&nbsp;#&nbsp;</td><td>Status</td><td>Interface</td><td>Source</td><td>Destination</td><td>Service</td><td>Action</td><td>Schedule</td><td>Comments</td></tr>"),0!=r.size&&(0===o.size?t+=u+v+w:t+=u+"<span style='color:green'>IPv4</span> "+v+w,g(r)),0!=o.size&&(n+=u+"<span style='color:darkviolet'>IPv6</span> "+v+w,g(o)),f="</table><br><table style='width:100%;padding:0;border-spacing:0;border-collapse:collapse'><tr><td style='height:37px;text-align:center;background-color:gainsboro;border:1px solid #B9B9B9;border-bottom:0' colspan='7'>Auto Local-In Policy<span style='color:#aaa'> &rarr; managed by FortiGate</span></td></tr>";let m=e=>{switch(e){case"icmp":return 1;case"udp":return 2;case"tcp":return 3;default:return 100}};f+='<tr style="height:32px;text-align:center;color:#fff;background-color:#5A5A5A;border:1px solid #B9B9B9"><td>#</td><td>Status</td><td>Source Interface/Zone</td><td>Source</td><td>Destination</td><td>Service</td><td>Action</td></tr>',f+=Object.entries(l.results).map(e=>{let[t,n]=e,a=n.reduce((e,t)=>{let n=e.find(e=>JSON.stringify(e.from_zone)==JSON.stringify(t.from_zone)&&JSON.stringify(e.source)==JSON.stringify(t.source)&&e.action==t.action);return n&&n.services.push(...t.services),n?e:[...e,t]},[]),r=a.reduce((e,t)=>{let n=e.find(e=>JSON.stringify(e.source)==JSON.stringify(t.source)&&JSON.stringify(e.services)==JSON.stringify(t.services)&&e.action==t.action);return n&&n.from_zone.push(...t.from_zone),n?e:[...e,t]},[]),i=r.reduce((e,t)=>{let n=e.find(e=>JSON.stringify(e.from_zone)==JSON.stringify(t.from_zone)&&JSON.stringify(e.services)==JSON.stringify(t.services)&&e.action==t.action);return n&&n.source.push(...t.source),n?e:[...e,t]},[]);for(let o of i)o.services=o.services.reduce((e,t)=>{let n=e.find(e=>e.proto_name==t.proto_name&&e.dst_port_start==t.dst_port_end+1);n&&(n.dst_port_start=t.dst_port_start);let a=e.find(e=>e.proto_name==t.proto_name&&e.dst_port_end==t.dst_port_start-1);return a&&(a.dst_port_end=t.dst_port_end),n||a?e:[...e,t]},[]),o.services.sort((e,t)=>{let n=m(e.proto_name)-m(t.proto_name);return 0!=n?n:e.dst_port_start-t.dst_port_start});return"".concat('<tr style="height:32px;text-align:center;background-color:gainsboro;border:1px solid #E2E2E2">','<td colspan="7">',t.charAt(0).toUpperCase(),t.slice(1),"</td>","</tr>",r.map((e,t)=>"".concat('<tr style="height:32px;text-align:center">','<td style="border:1px solid #E2E2E2">',t+1,"</td>",'<td style="border:1px solid #E2E2E2"><f-icon class="fa-enabled" title="Enabled" style="cursor:pointer"></f-icon>&nbsp;Enabled</td>','<td style="border:1px solid #E2E2E2; padding: 10px;">',e.from_zone.map(e=>{if("any"==e)return'<f-icon class="fa-square-o" title="Any interface" style="cursor:pointer"></f-icon>&nbsp;any';let t=d.results.find(t=>t.name==e);return t?.alias&&t.alias!=e?"".concat("<f-icon style='padding-right: 3px;' class='"+t.icon+"'></f-icon>",t.alias," (",e,")"):"".concat("<f-icon style='padding-right: 3px;' class='"+t.icon+"'></f-icon>",e)}).join("<br>"),"</td>",'<td style="border:1px solid #E2E2E2">',e.source.map(e=>"0.0.0.0"==e.start&&"255.255.255.255"==e.end?"all":"".concat(e.start," - ",e.end)).join("<br>"),"</td>",'<td style="border:1px solid #E2E2E2"><f-icon class="ftnt-device-fortinet" title="This FortiGate" style="cursor:pointer"></f-icon>&nbsp;FortiGate</td>','<td style="border:1px solid #E2E2E2">',e.services.map(e=>["ospf","igmp","pim"].includes(e.proto_name)?e.proto_name:e.dst_port_start==e.dst_port_end?e.dst_port_start?"".concat(e.dst_port_start,"/",e.proto_name??"Any"):e.proto_name??"Any":"".concat(e.dst_port_start,"-",e.dst_port_end,"/",e.proto_name??"Any")).join("<br>").replace("ospf","OSPF").replace("pim","PIM").replace("igmp","IGMP").replace("8/icmp","Ping").replace("13/icmp","Timestamp").replace("53/udp","DNS (53/udp)").replace("67/udp","DHCP (67/udp)").replace("68/udp","DHCP (68/udp)").replace("123/udp","NTP (123/udp)").replace("161/udp","SNMP").replace("500/udp","IKE (ISAKMP)").replace("520/udp","RIP").replace("2048/udp","WCCP").replace("4500/udp","IPsec NAT-T").replace("22/tcp","SSH").replace("53/tcp","DNS (53/tcp)").replace("80/tcp","HTTP").replace("123/tcp","NTP (123/tcp)").replace("179/tcp","BGP").replace("443/tcp","HTTPS").replace("541/tcp","FortiManager").replace("1000/tcp","Authd (1000/tcp)").replace("1003/tcp","Authd (1003/tcp)"),"</td>",'<td style="border:1px solid #E2E2E2">',e.action.replace("drop",'<f-icon class="fa-disable" title="Drop" style="cursor:pointer"></f-icon>&nbsp;Drop').replace("accept",'<f-icon class="fa-accepted" title="Accept" style="cursor:pointer"></f-icon>&nbsp;Accept'),"</td>","</tr>")).join(""))}).join(""),f+="</table><br>&nbsp;",0===o.size?p.innerHTML=t+f:0===r.size?p.innerHTML=n+f:p.innerHTML=t+"</table><br>"+n+f,e.innerHTML="",e.style.overflow="auto",e.style.padding="1.5rem",e.appendChild(p)}},{label:"NTP info",content:"",script:async function(e){let t=await fetch("/api/v2/monitor/system/time"),n=await t.json(),a=await fetch("/api/v2/monitor/system/ntp/status"),r=await a.json(),i=await fetch("/api/v2/cmdb/system/ntp"),o=await i.json();var s=new Date(1e3*n.results.time);let l=document.createElement("div");l.setAttribute("id","pntp");let c="<table style='padding:0;border-spacing:0;border-collapse:collapse;display:block'><tr><td style='border:1px solid #ddd;background:#ddd;padding:2px 5px 2px 5px'>NTP Server</td><td style='border:1px solid #ddd;background:#ddd;padding:2px 5px 2px 5px'>IP Address</td><td style='border:1px solid #ddd;background:#ddd;padding:2px 5px 2px 5px;text-align:center'>Version</td><td style='border:1px solid #ddd;background:#ddd;padding:2px 5px 2px 5px;text-align:center'>Reachable</td></tr>";for(let d of r.results)c+="<tr><td style='border:1px solid #ddd;padding:2px 5px 2px 5px'>"+d.server+"</td><td style='border:1px solid #ddd;padding:2px 5px 2px 5px'>"+d.ip+"</td><td style='border:1px solid #ddd;padding:2px 5px 2px 5px;text-align:center'>"+d.version+"</td><td style='border:1px solid #ddd;padding:2px 5px 2px 5px;text-align:center'>"+d.reachable+"</td></tr>";c=(c=(c=c.replace(/true/g,'<f-icon class="fa-accepted" title="Reachable" style="cursor:pointer"></f-icon>')).replace(/false/g,'<f-icon class="fa-denied" title="Unreachable" style="cursor:pointer"></f-icon>')).replace(/undefined/g,"-"),l.innerHTML="<span style='color:green'>Current system time:</span><br>"+s+"<br>&nbsp;<br>"+c+'</table><p style="white-space:nowrap">NTP server mode:&nbsp;'+o.results["server-mode"].replace(/[eE]nable/g,'<span style="color:green">Enabled</span>').replace(/[dD]isable/g,'<span style="color:pink">Disabled</span>'),M||X();let p=document.createElement("ul");p.id="ntp-sync-command-list",P.forEach(e=>{let t=document.createElement("li");t.style.marginBottom="1rem",t.style.color="green",t.style.cursor="pointer",t.style.userSelect="none",t.dataset.command=e,t.innerHTML="&nbsp;"+e+N,t.onclick=function(){A="ntp_info","diag"==this.innerHTML.substr(6,4)&&(A="default"),M||X();let e=this.nextSibling&&"PRE"===this.nextSibling.nodeName?this.nextSibling:null,n=this.querySelector(".icon");if(e)"active"===e.dataset.active?(e.dataset.active="",e.style.display="none",n.style.transform="rotate(0deg)"):(e.dataset.active="active",e.style.display="block",n.style.transform="rotate(90deg)");else{ready=!0;let a=t.dataset.command;O(a),D=a,n.style.transform="rotate(90deg)"}},p.appendChild(t)}),e.innerHTML="",e.style.overflow="auto",e.style.padding="1.5rem",e.appendChild(l).appendChild(p)}},{label:"Firewall policy",content:"",script:async function(e){let t=await fetch("/api/v2/cmdb/firewall/policy?datasource=1"),n=await t.json(),a=await fetch("/api/v2/monitor/system/available-interfaces?&vdom=root&view_type=limited"),r=await a.json(),i=new Set(["status","name","srcintf","dstintf","srcaddr","dstaddr","service","nat","schedule","action","logtraffic","comments"]),o=new Set;for(let s of n.results){let l=Object.entries(s);for(let c of l)null!=c[1]&&!1!=c[1]&&o.add(c[0])}let d=new Set(i),p=()=>{let t="".concat('<div id="firewall-policy-customizer" style="display:none;padding:5px;position:absolute;top:75px;left:0;right:0;margin:30px 124px 30px 50px;background-color:white;border:1px solid #000;z-index:1">','<div style="display:flex;flex-wrap:wrap;gap:5px">','<button id="firewall-policy-customizer-ok">OK</button>',"</div>",'<div style="display:flex;flex-wrap:wrap;gap:5px">',[...o].map(e=>"".concat("<label>",d.has(e)?'<input type="checkbox" name="firewall-policy-columns" value="'+e+'" checked>':'<input type="checkbox" name="firewall-policy-columns" value="'+e+'">',e,"</label>")).join(""),"</div>","</div>"),a=document.createElement("style");a.innerHTML=".sticky-table td { border: 1px solid white; } .sticky-table .header td { border-bottom: 0px; }",document.head.appendChild(a);let s="".concat('<button id="firewall-policy-customizer-trigger">Select&nbsp;&rsaquo;</button>','<button id="firewall-policy-customizer-default" '+(d.size==i.size&&[...d].every(e=>i.has(e))?"disabled":"")+">Default</button>",'<button id="firewall-policy-customizer-all" '+(d.size==o.size?"disabled":"")+">All</button>",'<div style="width:100%;height:calc(100vh - 95px);overflow:auto">','<table class="sticky-table" style="margin-bottom:10px;border-spacing: 0;">','<tr class="sticky-table header" style="position:sticky;top:0;text-align:center;color:#fff;background-color:#5A5A5A;border-spacing:0;border-collapse:collapse;z-index:1">',"<td>","#","</td>",[...d].map(e=>"".concat('<td style="padding:5px 10px;text-wrap:nowrap">',e,"</td>")).join(""),"</tr>",n.results.map((e,t)=>"".concat('<tr style="text-align:center;background-color:'+(t%2?"rgba(0, 0, 0, .1)":"rgba(0, 0, 0, .3)")+'">','<td style="padding: 0 5px">',t+1,"</td>",[...d].map(t=>{let n;return("srcintf"==t||"dstintf"==t)&&(n=e[t].map(e=>{let t=r.results.find(t=>t.name==e.name),n=t.icon;return"<div style='display: flex;'><f-icon class='"+n+"'></f-icon><span>"+e.name+"</span></div>"}).join("</br>")),"".concat('<td style="padding: 5px">',["srcintf","dstintf","srcaddr","dstaddr","poolname","service"].includes(t)?n||e[t].map(e=>e["css-class"]?"<div style='display: flex;'><f-icon class='"+e["css-class"]+"'></f-icon><span>"+e.name+"</span></div>":e.name).join("<br>"):"object"==typeof e[t]?"schedule"==t?e[t].name:JSON.stringify(e[t]):e[t],"</td>").replace(/[eE]nable/g,'<f-icon class="fa-enabled"></f-icon>&nbsp;Enabled').replace(/[dD]isable/g,'<f-icon class="fa-disabled"></f-icon>&nbsp;Disabled').replace(/[aA]ccept/g,'<f-icon class="fa-accepted"></f-icon>&nbsp;Accept')}).join(""),"</tr>")).join(""),"<tr>",'<td colspan="'+(d.size+1)+'" style="text-align:center;color:lightgray">',"Implicit deny of all connections which are not allowed by the rules above.","</td>","</tr>","</table>","</div>"),l=document.createElement("div");l.setAttribute("id","fwpol"),l.innerHTML="".concat(t,s),e.innerHTML="",e.style.overflow="auto",e.style.padding="1.5rem",e.appendChild(l),document.getElementById("firewall-policy-customizer-trigger").addEventListener("click",()=>{document.getElementById("firewall-policy-customizer").style.display="block"}),document.getElementById("firewall-policy-customizer-ok").addEventListener("click",()=>{let e=document.getElementsByName("firewall-policy-columns");for(let t of(d.clear(),e))t.checked&&d.add(t.value);p()}),document.getElementById("firewall-policy-customizer-default").addEventListener("click",()=>{for(let e of(d.clear(),i))d.add(e);p()}),document.getElementById("firewall-policy-customizer-all").addEventListener("click",()=>{for(let e of(d.clear(),o))d.add(e);p()})};p()}},{label:"IPsec tunnels",content:"",script:async function(e){M||X();let t={name:"Name",parent:"Parent",rport:"Remote Port",rgwy:"Remote Gateway",username:"Peer ID",creation_time:"Phase 1",proxyid:"Phase 2 Selectors",incoming_bytes:"Incoming Data",outgoing_bytes:"Outgoing Data",comments:"Comments",tun_id:"Local Gateway",tun_id6:"Local Gateway (IPv6)",type:"Type","wizard-type":"Wizard Type",dialup_index:"Dialup Index",connection_count:"Connection Count"},n=new Set(["rgwy","username","incoming_bytes","outgoing_bytes","creation_time","proxyid"]),a=new Set(["name","parent","type","tun_id","tun_id6","rgwy","username","incoming_bytes","outgoing_bytes","creation_time","proxyid","wizard-type","connection_count","comments"]),r=async()=>{let i=fetch("/api/v2/monitor/vpn/ipsec"),o=await i,s=await o.json();s.results.sort((e,t)=>(e.name??"").localeCompare(t.name??""));let l=new Set;for(let c of s.results){let p=Object.entries(c);for(let m of p)null!=m[1]&&!1!==m[1]&&l.add(m[0])}let y=new Set(n),b=()=>{let o="".concat('<div id="ipsec-customizer" style="display:none;padding:5px;position:absolute;top:75px;left:0;right:0;margin:30px 124px 30px 50px;background-color:white;border:1px solid #000;z-index:1">','<div style="display:flex;flex-wrap:wrap;gap:5px">','<button id="ipsec-customizer-ok">OK</button>',"</div>",'<div style="display:flex;flex-wrap:wrap;gap:5px">',[...l].map(e=>"".concat("<label>",y.has(e)?'<input type="checkbox" name="ipsec-columns" value="'+e+'" checked>':'<input type="checkbox" name="ipsec-columns" value="'+e+'">',t[e]??e,"</label>")).join(""),"</div>","</div>"),c=document.createElement("style");c.innerHTML=".sticky-table td { border: 1px solid white; } .sticky-table .header td { border-bottom: 0px; }",document.head.appendChild(c);let p="".concat('<button id="ipsec-customizer-trigger">Select&nbsp;&rsaquo;</button>','<button id="ipsec-customizer-default" '+(y.size==n.size&&[...y].every(e=>n.has(e))?"disabled":"")+">Default</button>",'<button id="ipsec-customizer-all" '+(y.size==l.size?"disabled":"")+">All</button>",'<button id="ipsec-customizer-refresh"><f-icon class="fa-refresh"></f-icon></button>','&nbsp;&nbsp;&nbsp;&nbsp;<span id="api-status" style="color: gray;"></span>','<div style="width:100%;overflow:auto">','<table class="sticky-table" style="margin-bottom:10px;border-spacing: 0;">','<tr class="sticky-table header" style="position:sticky;top:0;text-align:left;vertical-align:top;white-space:nowrap;color:#fff;background-color:#5A5A5A;border-spacing:0;border-collapse:collapse;z-index:1">','<td style="padding: 5px; text-align: center;">',"#","</td>",'<td style="padding: 5px;">Tunnel</td>',[...y].map(e=>"".concat('<td style="padding: 5px;">',t[e]??e,"</td>")).join(""),'<td style="padding: 5px;">Logs</td>','<td style="padding: 5px; text-align: center;">Debugs</td>',"</tr>",s.results.filter(e=>null!=e.proxyid&&null!=e.connection_count).map((e,t)=>{var n,a,r,i,o,l;return"".concat('<tr style="text-align: left; vertical-align: top; white-space: nowrap; background-color: '+(t%2?"rgba(0, 0, 0, .1)":"rgba(0, 0, 0, .3)")+'">','<td style="padding: 5px; text-align: center;">',t+1,"</td>",'<td style="padding: 5px;">',(n=e.name,a=e.parent,r=e.proxyid,"".concat(null==(i=-1!=r.findIndex(e=>"up"==e.status))?"":i?'<f-icon class="fa-status-up"></f-icon>':'<f-icon class="fa-status-down"></f-icon>'," ",a??n)),"</td>",[...y].map(t=>{var n,a,r,i,o,s,l,c;return"".concat('<td style="padding: 5px">',null==e[t]?"":"username"==t?(n=e[t])?"".concat('<f-icon class="fa-user-authenticated"></f-icon> ',n):"":"incoming_bytes"==t||"outgoing_bytes"==t?(a=e[t])>=1e12?"".concat(Math.round(a/1e12)," TB"):a>=1e9?"".concat(Math.round(a/1e9)," GB"):a>=1e6?"".concat(Math.round(a/1e6)," MB"):a>=1e3?"".concat(Math.round(a/1e3)," KB"):"".concat(a??0," B"):"creation_time"==t?"".concat(d(e.connection_count>0),e.connection_count>0?"".concat(" (",(r=e[t])>=86400?"".concat(Math.round(r/86400)," days"):r>=3600?"".concat(Math.round(r/3600)," hours"):r>=60?"".concat(Math.round(r/60)," minutes"):"".concat(r??0," seconds"),")"):""):"proxyid"==t?(i=e.name,o=e[t],"".concat((s=o).every(e=>"up"==e.status)?'<f-icon class="fa-status-up"></f-icon> Up':s.every(e=>"down"==e.status)?'<f-icon class="fa-status-down"></f-icon> Down':"".concat('<f-icon class="fa-status-up"></f-icon>'," ",s.filter(e=>"up"==e.status).length," ","Up"," ",'<f-icon class="fa-status-down"></f-icon>'," ",s.filter(e=>"down"==e.status).length," ","Down")," ",'<a href="javascript:" data-action="expand_proxies">+ More</a>','<div style="display: none;">',"<hr>",(l=i,(c=o).map(e=>"".concat(c.length>1?"".concat("<b>",e.p2name," - ",e.p2serial,"</b>","<br><br>"):"","<b>From (local):</b>","<br>",e.proxy_src.map(e=>"".concat("subnet: ",e.subnet,e.port?"".concat(" ","port: ",e.port):"",e.protocol_name?"".concat(" ","(",e.protocol_name,")"):"")).join("<br>"),"<br><br>","<b>To (remote):</b>","<br>",e.proxy_dst.map(e=>"".concat("subnet: ",e.subnet,e.port?"".concat(" ","port: ",e.port):"",e.protocol_name?"".concat(" ","(",e.protocol_name,")"):"")).join("<br>"),"<br><br>","<b>Status</b>: ",d("up"==e.status)," → ","up"==e.status?'<a href="javascript:" data-action="tunnel_down" data-p1name="'+l+'" data-p2name="'+e.p2name+'" data-p2serial="'+e.p2serial+'">Bring Down</a>':'<a href="javascript:" data-action="tunnel_up" data-p1name="'+l+'" data-p2name="'+e.p2name+'" data-p2serial="'+e.p2serial+'">Bring Up</a>')).join("<hr>")),"</div>")):"object"==typeof e[t]?JSON.stringify(e[t]):e[t],"</td>")}).join(""),'<td style="padding: 5px;">',function e(t,n,a){let r=a.startsWith("v7.0")?'/ng/log/view/event/vpn?filter=vpntunnel=*"'+t+'"':'/log/event-log?tab=logs&type=vpn&vdom=root&filter={"vpntunnel":"= '+t+'"}',i=a.startsWith("v7.0")?'/ng/log/view/event/vpn?filter=vpntunnel=*"'+n+'"':'/log/event-log?tab=logs&type=vpn&vdom=root&filter={"vpntunnel":"= '+n+'"}';return"".concat('<a href="'+encodeURI(r)+'" title="Show logs" target="_blank">Show</a>',n?"".concat("<br>",'<a href="'+encodeURI(i)+'" title="Show parent logs" target="_blank">&gt; Parent</a>'):"")}(e.name,e.parent,s.version),"</td>",'<td style="padding: 5px; text-align: center;">',(o=e.name,l=e.parent,"".concat('<a href="javascript:" data-action="expand_debug" title="Debug options">&nbsp;<f-icon class="fa-plus-circle"></f-icon>&nbsp;</a>','<div style="display:none;text-align:left">','Config:&nbsp;<a href="javascript:" data-action="send_ws_command" data-command="show vpn ipsec phase1-interface '+(l??o)+'" title="show vpn ipsec phase1-interface '+(l??o)+'">Phase&nbsp;1</a>,&nbsp;<a href="javascript:" data-action="send_ws_command" data-command="show vpn ipsec phase2-interface '+(l??o)+'" title="show vpn ipsec phase2-interface '+(l??o)+'">Phase&nbsp;2</a><br>','Status:&nbsp;<a href="javascript:" data-action="send_ws_command" data-command="get vpn ike gateway '+(l??o)+'" title="get vpn ike gateway '+(l??o)+'">Phase&nbsp;1</a>,&nbsp;<a href="javascript:" data-action="send_ws_command" data-command="get vpn ipsec tunnel name '+(l??o)+'" title="get vpn ipsec tunnel name '+(l??o)+'">Phase&nbsp;2</a><br>','Diag:&nbsp;<a href="https://community.fortinet.com/t5/Support-Forum/FortiGate-WebUI-Tools-gt-IPsec-VPN-debug/m-p/282214" title="Recommend diag commands in Fortinet Community" target="_blank">Recommend</a><br>','<span style="color:DarkViolet">Reset:</span>&nbsp;<a href="javascript:" data-action="reset_stats" data-p1name="'+o+'">Stats</a>,&nbsp;<a href="javascript:" data-action="clear_ike" data-p1name="'+o+'">Tunnel</a>',"</div>")),"</td>","</tr>")}).join(""),"</table>","</div>"),m=document.createElement("div");m.setAttribute("id","ipsec"),m.innerHTML="".concat(o,p),e.innerHTML="",e.style.overflow="auto",e.style.padding="1.5rem",e.appendChild(m),m.addEventListener("click",x),document.getElementById("ipsec-customizer-trigger").addEventListener("click",()=>{document.getElementById("ipsec-customizer").style.display="block"}),document.getElementById("ipsec-customizer-ok").addEventListener("click",()=>{let e=document.getElementsByName("ipsec-columns");for(let t of(y.clear(),e))t.checked&&y.add(t.value);b()}),document.getElementById("ipsec-customizer-default").addEventListener("click",()=>{for(let e of(y.clear(),n))y.add(e);b()}),document.getElementById("ipsec-customizer-all").addEventListener("click",()=>{for(let e of(y.clear(),a))y.add(e);for(let t of l)y.add(t);b()}),document.getElementById("ipsec-customizer-refresh").addEventListener("click",()=>{r()});let h=document.createElement("ul");h.id="ipsec-tunnel-command-list",C.forEach(e=>{let t=document.createElement("li");t.style.marginBottom="1rem",t.style.color="green",t.style.cursor="pointer",t.style.userSelect="none",t.dataset.command=e,t.innerHTML="&nbsp;"+e+N;let n=!1;t.onclick=function(){A="ipsec_tunnel",M||X();let e=this.nextSibling&&"PRE"===this.nextSibling.nodeName?this.nextSibling:null,a=this.querySelector(".icon");if(e)"active"===e.dataset.active?(e.dataset.active="",e.style.display="none",a.style.transform="rotate(0deg)"):(e.dataset.active="active",e.style.display="block",a.style.transform="rotate(90deg)");else{ready=!0,n=!n;let r=t.dataset.command;O(r),D=r,a.style.transform=n?"rotate(90deg)":"rotate(0deg)"}let i=this.nextSibling&&"TABLE"===this.nextSibling.nodeName?this.nextSibling:null;if(i){var o,s;o=i,(s=n)?o.style.display="block":o.style.display="none"}},h.appendChild(t)}),e.style.overflow="auto",e.style.padding="1.5rem",e.appendChild(h),i.then(e=>g("GET",e))};b()};await r()}}],V=document.querySelector("nu-nav-entry"),Y=document.createElement("li");Y.style.listStyle="none",Y.style.cursor="pointer",Y.id="tools",Y.innerHTML='<div id="menu-toggle" style="position:relative;color:#000;background-color:goldenrod;margin:0;padding:4px 4px 1px 5px;border-left:3px solid #ffd700;display:flex;"><f-icon class="ftnt-webhook icon-lg"></f-icon>&nbsp;Tools<nu-icon class="icon" style="margin-left:auto;width:18px;height:18px;transform:rotate(90deg)">'+I+"</div>",Y.addEventListener("mousedown",e=>{e.preventDefault()}),V.before(Y),document.addEventListener("click",function(e){let t=e.target.closest("a.menu-label");if(t){let n=document.getElementById("custom-menu"),a=n.getElementsByTagName("li");for(let r=0;r<a.length;r++){let i=a[r];i.dataset.active="",i.style.backgroundColor="#FFD700"}let o=document.getElementById("ng1-app").parentElement,s=o.children;for(let l=0;l<s.length;l++){let c=s[l];"custom-ng1-app"!==c.id&&c.setAttribute("style","")}let d=document.getElementById("custom-ng1-app");d&&d.parentNode.removeChild(d)}});let J=!0,Z=document.createElement("ul");async function Q(e){let t=document.querySelector("nu-nav-entry.active");t&&t.classList.remove("active");let n,a=document.getElementById("ng1-app"),r=document.getElementById("custom-ng1-app");r||((r=document.createElement("div")).id="custom-ng1-app",r.className="ng1 ng-tns-c49-0 ng-scope"),a.parentElement.insertBefore(r,a),n=e.content,r.style.width="calc(100% - 3rem)",r.innerHTML="".concat('<div style="position:relative;overflow-y:auto"><pre style="padding:1em;margin:0;display:flex"><code style="width:100%; display:flex; justify-content:center">',n||'<span style="padding-top:42vh"><f-icon class="fa-loading icon-xxl"></f-icon></span>',"</code></pre></div>");let i=a.parentElement,o=i.children;for(let s=0;s<o.length;s++){let l=o[s];"custom-ng1-app"!==l.id&&(l.style.display="none")}e.script?.(r)}Z.id="custom-menu",Z.style.margin=0,Z.style.padding=0,K.forEach((e,t)=>{let n=c();n.innerText=e.label,n.onclick=async function(){let t=Z.querySelectorAll("li");t.forEach(e=>{e.dataset.active="",e.style.backgroundColor="#FFD700"}),this.dataset.active="active",await Q(e),this.style.backgroundColor="#FFE86D"},Z.appendChild(n)});let ee=document.querySelector("#tools #menu-toggle"),et=ee.querySelector(".icon");ee.after(Z),ee.onclick=()=>{J?(Z.style.display="none",et.style.transform="rotate(0deg)",J=!1):(Z.style.display="block",et.style.transform="rotate(90deg)",J=!0)}})();

🎯 Result: FGT WebUI