!function(){"use strict";!function(e){const{Component:t,Util:s,$:a}=e,i={};t.register("Modal",e=>{e.modal=new bootstrap.Modal(e),e.addEventListener("bind",t=>{t.detail?e.modal.show():e.modal.hide()}),e.addEventListener("hide.bs.modal",()=>{var t;null==(t=document.activeElement)||t.blur(),e.dispatchEvent(new CustomEvent("change",{bubbles:!1,detail:!1}))}),s.copyFunction(e,e.modal,"show","hide")},s.makeDom('\n
\n')),t.register("Dialog",t.getSetupFunction("Modal"),s.makeDom('\n\n'));let n=0;i.showDialog=function({title:e="",message:t="",buttons:s=["{#Close#}"],type:a="body"}){const i=document.body.appendChild(document.createElement("Dialog"));return i.style.zIndex=2e3+ ++n,Promise.resolve().then(()=>{Object.assign(i.state,{message:t,title:e,type:a,buttons:s}),i.show()}),new Promise(e=>{i.addEventListener("change",t=>{n--,e(i.result||0),i.remove()})})},i.alert=function(e,t={}){return i.showDialog({message:e,...t})},i.confirm=function(e,t={}){return new Promise(s=>i.showDialog({message:e,buttons:["{#Cancel#}","{#Confirm#}"],...t}).then(e=>s(e>=2)).catch(()=>s(!1)))},t.register("Toast",e=>{e.toast=new bootstrap.Toast(e,{autohide:e.state.delay>0}),s.copyFunction(e,e.toast,"show","hide"),e.addEventListener("show.bs.toast",()=>{if(e.state.delay>0){let t;const s=()=>{e.state.left=e.state.delay/1e3,t=setInterval(()=>{(!e.isConnected||--e.state.left<=0)&&clearInterval(t)},1e3)};s(),e.addEventListener("mouseenter",()=>{clearInterval(t),e.state.left=void 0}),e.addEventListener("mouseleave",s)}})},s.makeDom('\n\n'),s.makeDom('')),i.toast=function(e,t={}){const s=t.delay??5e3,i=document.createElement("Toast");i.state={delay:s,left:s?s/1e3:void 0,type:t.type||"primary",message:e,buttons:t.buttons||[]},a(`[toast-container="${t.container||"default"}"]`).appendChild(i),Promise.resolve().then(()=>i.show())},i.toastConfirm=function(e,t={}){return new Promise(s=>i.toast(e,{buttons:["{#Confirm#}"],...t}).then(e=>s(1===e)).catch(()=>s(!1)))},e.UI=i}(globalThis),function(e){const{Component:t}=e,s={get:({url:e,...t})=>s.request({url:e,method:"GET",...t}),post:({url:e,data:t,...a})=>s.request({url:e,method:"POST",data:t,...a}),put:({url:e,data:t,...a})=>s.request({url:e,method:"PUT",data:t,...a}),delete:({url:e,...t})=>s.request({url:e,method:"DELETE",...t}),head:({url:e,...t})=>s.request({url:e,method:"HEAD",...t}),request:async({url:e,method:t="POST",data:s,headers:a={},responseType:i,timeout:n=1e4})=>{const o={method:t=t.toUpperCase(),headers:{"Content-Type":"application/json",...a}};void 0!==s&&(o.body=JSON.stringify(s));const l=new AbortController,r=setTimeout(()=>l.abort(),n);o.signal=l.signal;try{const t=await fetch(e,o);clearTimeout(r);const s="blob"===i?await t.blob():"text"===i?await t.text():await t.json();return{ok:t.ok,status:t.status,result:s}}catch(e){return clearTimeout(r),{ok:!1,status:0,error:e.message}}}};t.register("API",t=>{t.state.request||(t.state.request={url:"",method:"GET",data:{},noui:!1}),t.state.response||(t.state.response={ok:!1,status:0,result:null,loading:!1}),t.do=async a=>{var i;const n={...t.state.request,...a};t.state.response.loading=!0;const o=await s.request(n);return Object.assign(t.state.response,o,{loading:!1}),o.ok||!n.noui&&(null==(i=e.UI)?void 0:i.toast)&&e.UI.toast(o.error||"Request failed",{type:"danger"}),t.dispatchEvent(new CustomEvent("success",{bubbles:!1,detail:o.result})),o};let a=null;t.state.request.__watch(null,()=>{t.hasAttribute("auto")&&t.state.request.url&&(a||(a=Promise.resolve().then(()=>{t.do(),a=null})))})}),e.HTTP=s}(globalThis),function(e){const{Component:t,NewState:s,Util:a,$:i}=e,n={customTypes:[],register:(e,t)=>{const s=t||e;n.customTypes.includes(s)||n.customTypes.push(s)}};t.register("AutoForm",t=>{t.state.schema||(t.state.schema=[]);const a=e=>e&&"object"==typeof e&&!e.__isProxy?s(e):e;t.state.__watch("data",e=>t.data=a(e)),t.data=a(t.state.data||{}),t.addEventListener("submit",async s=>{var a,i,n,o;if(s.preventDefault(),!t.form.reportValidity())return null==(i=null==(a=e.UI)?void 0:a.toast)?void 0:i.call(a,"{#verify failed#}",{type:"danger"});t.state.formState="submitting";const l=JSON.parse(JSON.stringify(t.data)),r=new CustomEvent("submit",{bubbles:!1,cancelable:!0,detail:l});if(t.dispatchEvent(r),!r.defaultPrevented)try{if(t.state.action){const s=await e.HTTP.request({url:t.state.action,method:"POST",data:l});if(!s.ok)throw new Error(s.error)}t.state.formState="success",(null==(n=e.UI)?void 0:n.toast)&&e.UI.toast("{#submit success#}",{type:"success"})}catch(s){t.state.formState="error",(null==(o=e.UI)?void 0:o.toast)&&e.UI.toast(s.message,{type:"danger"})}})},a.makeDom('\n\n')),t.register("TagsInput",e=>{e._thisObj=e,e.state||(e.state=s({tags:[]})),e.addEventListener("bind",t=>{e.state.tags=Array.isArray(t.detail)?t.detail:[]})},a.makeDom(`\n\n \n \n \n \n
\n`),a.makeDom("")),n.register("TagsInput"),e.AutoForm=n}(globalThis),function(e){const{Component:t,Util:s}=e;t.register("FastList",e=>{const t=new Map;e.state.renderedList=[],s.newAvg();const a=()=>{const s=e.state.list||[];e.state.groups;const a=e.scrollTop,i=e.clientHeight,n=e.state.itemHeight||40;let o=0,l=-1,r=s.length;for(let e=0;ea-200&&(l=e),-1!==l&&o>a+i+200){r=e;break}o+=d}-1===l&&(l=0),e.state.renderedList=s.slice(l,r).map((e,t)=>({...e,_index:l+t}));const d=s.slice(0,l).reduce((e,s)=>e+(t.get(s.id)||n),0),c=s.slice(r).reduce((e,s)=>e+(t.get(s.id)||n),0),u=e.querySelector(".list-spacer-prev"),p=e.querySelector(".list-spacer-post");u&&(u.style.height=d+"px"),p&&(p.style.height=c+"px")};e.addEventListener("scroll",a),e.state.__watch("list",a),Promise.resolve().then(a)},s.makeDom('\n\n')),e.VirtualScroll=(e={})=>{const t={itemHeight:50,buffer:5,...e};return e=>{e.state.list||(e.state.list=[]),e.state._renderedList||(e.state._renderedList=[]);let s=!1;const a=()=>{const s=e.state.list||[],a=e.scrollTop,i=e.clientHeight,n=t.itemHeight,o=Math.max(0,Math.floor(a/n)-t.buffer),l=Math.min(s.length,Math.ceil((a+i)/n)+t.buffer),r=[];for(let e=o;e{s||(window.requestAnimationFrame(()=>{a(),s=!1}),s=!0)}),e.state.__watch("list",a),window.addEventListener("resize",a),Promise.resolve().then(a)}}}(globalThis),function(e){const{Component:t,Util:s}=e,a={bind:(e,t,s={})=>{let a,i,n,o,l=!1;const r=e=>{if(s.shouldStart&&!s.shouldStart(e))return;l=!0,a=e.clientX,i=e.clientY;const r=t.getBoundingClientRect();n=r.left,o=r.top,document.addEventListener("mousemove",d),document.addEventListener("mouseup",c),s.onStart&&s.onStart(e)},d=e=>{if(!l)return;const r=e.clientX-a,d=e.clientY-i;"y"!==s.axis&&(t.style.left=n+r+"px"),"x"!==s.axis&&(t.style.top=o+d+"px"),s.onMove&&s.onStart(e)},c=e=>{l=!1,document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",c),s.onEnd&&s.onEnd(e)};return e.addEventListener("mousedown",r),()=>e.removeEventListener("mousedown",r)}};t.register("Resizer",e=>{e.style.cursor=e.hasAttribute("vertical")?"col-resize":"row-resize",e.addEventListener("mousedown",t=>{const s=e.parentElement;if(!s)return;const a=s.getBoundingClientRect(),i=t.clientX,n=t.clientY,o=a.width,l=a.height,r=t=>{const a=t.clientX-i,r=t.clientY-n;e.hasAttribute("vertical")?s.style.width=o+a+"px":s.style.height=l+r+"px",e.dispatchEvent(new CustomEvent("resize",{bubbles:!1,detail:{width:s.offsetWidth,height:s.offsetHeight}}))},d=()=>{document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",d)};document.addEventListener("mousemove",r),document.addEventListener("mouseup",d)})},s.makeDom('')),e.MouseMover=a}(globalThis),function(e){const{Component:t,Util:s}=e,a=["alarm","archive","arrow-left","arrow-right","bag","bank","basket","bell","bookmark","box","briefcase","calendar","camera","cart","chat","check","chevron-down","chevron-left","chevron-right","chevron-up","clock","cloud","code","collection","command","cpu","credit-card","cup","dash","database","display","door-closed","download","droplet","earbuds","edit","egg","eject","envelope","eraser","eye","file","filter","flag","folder","gear","gem","gift","graph-up","grid","hammer","hand-thumbs-up","heart","house","image","inbox","info-circle","journal","key","laptop","layers","layout-text-sidebar-reverse","lightbulb","link","list","lock","map","mic","moon","mouse","music-note","newspaper","palette","paperclip","pause","pencil","person","phone","pie-chart","play","plus","printer","puzzle","question-circle","reception-4","record","reply","rss","save","search","send","server","share","shield","shop","shuffle","skip-end","skip-start","slash","sliders","smartphone","speaker","speedometer","spellcheck","square","star","stickies","stop","stopwatch","suit-heart","sun","table","tag","tags","telephone","terminal","text-paragraph","thermometer","three-dots","ticket","tools","trash","trophy","truck","tv","umbrella","unlock","upload","vector-pen","wallet","watch","wifi","window","wrench","x","zoom-in","zoom-out","activity","at","award","backspace","badge-3d","badge-4k","badge-8k","badge-ad","badge-ar","badge-cc","badge-hd","badge-tm","badge-vo","badge-vr","badge-wc","bar-chart","battery","bicycle","binoculars","blockquote-left","blockquote-right","book","bookshelf","bootstrap","border-all","border-bottom","border-center","border-inner","border-left","border-middle","border-outer","border-right","border-style","border-top","border-width","bounding-box","box-arrow-down","box-arrow-in-down","box-arrow-in-left","box-arrow-in-right","box-arrow-in-up","box-arrow-left","box-arrow-right","box-arrow-up","box-seam","brightness-alt-high","brightness-alt-low","brightness-high","brightness-low","broadcast","brush","bucket","bug","building","bullseye","calculator","calendar-check","calendar-date","calendar-day","calendar-event","calendar-minus","calendar-month","calendar-plus","calendar-range","calendar-week","calendar-x","calendar2","calendar3","calendar4","camera-reels","camera-video","capslock","card-checklist","card-heading","card-image","card-list","card-text","caret-down","caret-left","caret-right","caret-up","cart-check","cart-dash","cart-plus","cart-x","cash","cash-stack","cast","chat-dots","chat-left","chat-quote","chat-right","chat-square","chat-text","check-all","check-circle","check-square","circle","clipboard","cloud-arrow-down","cloud-arrow-up","cloud-check","cloud-download","cloud-fog","cloud-hail","cloud-lightning","cloud-minus","cloud-moon","cloud-plus","cloud-rain","cloud-slash","cloud-snow","cloud-sun","cloud-upload","clouds","cloudy","code-slash","code-square","collection-play","columns","columns-gap","compass","cone","cone-striped","controller","credit-card-2-back","credit-card-2-front","crop","cup-straw","cursor","dash-circle","dash-square","diagram-2","diagram-3","diamond","dice-1","dice-2","dice-3","dice-4","dice-5","dice-6","disc","discord","distribute-horizontal","distribute-vertical","door-open","dot","droplet-half","easel","egg-fried","emoji-angry","emoji-dizzy","emoji-expressionless","emoji-frown","emoji-heart-eyes","emoji-laughing","emoji-neutral","emoji-smile","emoji-sunglasses","emoji-wink","envelope-open","exclamation","exclamation-circle","exclamation-diamond","exclamation-octagon","exclamation-square","exclamation-triangle","eye-slash","eyedropper","facebook","file-arrow-down","file-arrow-up","file-binary","file-break","file-check","file-code","file-diff","file-earmark","file-excel","file-image","file-lock","file-medical","file-minus","file-music","file-pdf","file-person","file-play","file-plus","file-post","file-ppt","file-richtext","file-slides","file-spreadsheet","file-text","file-word","file-zip","files","film","filter-circle","filter-left","filter-right","filter-square","fingerprint","flower1","flower2","flower3","folder-check","folder-minus","folder-plus","folder-symlink","folder-x","folder2-open","fonts","forward","front","fullscreen","fullscreen-exit","funnel","gear-wide","gender-female","gender-male","gender-trans","geo","geo-alt","github","globe","google","graph-down","grid-1x2","grid-3x2","grid-3x3","grip-horizontal","grip-vertical","hand-index","hand-thumbs-down","handbag","hash","headphones","headset","heart-half","heptagon","hourglass","hourglass-bottom","hourglass-split","hourglass-top","house-door","hr","hurricane","image-alt","images","infinity","input-cursor","instagram","intersect","journal-album","journal-arrow-down","journal-arrow-up","journal-bookmark","journal-check","journal-code","journal-medical","journal-minus","journal-plus","journal-richtext","journal-text","journal-x","journals","justify","kanban","keyboard","ladder","lamp","layers-half","layout-sidebar","layout-split","layout-three-columns","life-preserver","lightbulb-off","lightning","lightning-charge","link-45deg","linkedin","list-check","list-nested","list-ol","list-stars","list-task","list-ul","mailbox","markdown","mask","mastodon","megaphone","menu-app","menu-button","messenger","mic-mute","minecart","minecart-loaded","moisture","mouse2","mouse3","music-note-beamed","music-note-list","music-player","node-minus","node-plus","nut","octagon","option","outlet","paint-bucket","patch-check","patch-exclamation","patch-minus","patch-plus","patch-question","pause-btn","pause-circle","peace","pen","pencil-square","pentagon","person-badge","person-bounding-box","person-circle","person-lines-fill","phone-landscape","phone-vibrate","pie-chart-fill","pin","pin-angle","pin-map","pip","play-btn","play-circle","plug","plus-circle","plus-square","power","question","question-diamond","question-square","rainbow","receipt","receipt-cutoff","reception-0","reception-1","reception-2","reception-3","record-btn","record-circle","record2","recycle","reddit","reply-all","router","rulers","safe","save2","sd-card","segmented-nav","shield-check","shield-exclamation","shield-lock","shield-shaded","shield-slash","shift","signpost","signpost-2","signpost-split","sim","skip-backward","skip-forward","slack","slash-circle","slash-square","smartwatch","snow","snow2","snow3","sort-alpha-down","sort-alpha-up","sort-numeric-down","sort-numeric-up","soundwave","speedometer2","square-half","stack","star-half","stars","stop-btn","stop-circle","suit-club","suit-diamond","suit-spade","sunglasses","sunrise","sunset","symmetry-horizontal","symmetry-vertical","tablet","tablet-landscape","telegram","telephone-forward","telephone-inbound","telephone-outbound","telephone-plus","telephone-x","text-center","text-indent-left","text-indent-right","text-left","text-right","thermometer-half","thermometer-high","thermometer-low","thermometer-snow","thermometer-sun","three-dots-vertical","toggle-off","toggle-on","toggle2-off","toggle2-on","tornado","translate","trash2","tree","truck-flatbed","tsunami","type","type-bold","type-h1","type-h2","type-h3","type-italic","type-strikethrough","type-underline","ui-checks","ui-checks-grid","ui-radios","ui-radios-grid","union","upc","upc-scan","view-list","view-stacked","vinyl","voicemail","volume-down","volume-mute","volume-off","volume-up","vr","wallet2","water","whatsapp","wifi-1","wifi-2","wifi-off","wind","window-dock","window-sidebar","x-circle","x-diamond","x-octagon","x-square","youtube"];t.register("Icon",e=>{e.state.name=e.getAttribute("name")},s.makeDom('')),t.register("IconSelector",e=>{e.state.icons=a,e.state.search="",e.state.selected="",e.state.__watch("search",t=>{const s=t.toLowerCase();e.state.icons=a.filter(e=>e.includes(s))}),e.select=t=>{e.state.selected=t,e.dispatchEvent(new CustomEvent("change",{bubbles:!1,detail:t}))}},s.makeDom('\n\n')),e.BOOTSTRAP_ICONS=a}(globalThis),function(e){const{Component:t,Hash:s,Util:a}=e;t.register("Nav",e=>{e.state.items=[],e.state.activeId=s.nav,e.state.__watch("activeId",e=>s.nav=e),window.addEventListener("hashchange",()=>e.state.activeId=s.nav),e.select=t=>{e.state.activeId=t,e.dispatchEvent(new CustomEvent("change",{bubbles:!1,detail:t}))}},a.makeDom('\n\n')),t.register("Breadcrumb",e=>{e.state.items=[]},a.makeDom('\n\n'))}(globalThis),"undefined"!=typeof document&&window.addEventListener("beforeunload",e=>{var t;(null==(t=globalThis.State)?void 0:t.exitBlocks)>0&&(e.preventDefault(),e.returnValue="")})}();