diff --git a/web/public_html/transmission-app.js b/web/public_html/transmission-app.js index 8ef1ed802..1821017bb 100644 --- a/web/public_html/transmission-app.js +++ b/web/public_html/transmission-app.js @@ -1,4 +1,4 @@ (()=>{var ke=Object.create;var fe=Object.defineProperty;var We=Object.getOwnPropertyDescriptor;var Ue=Object.getOwnPropertyNames;var _e=Object.getPrototypeOf,Oe=Object.prototype.hasOwnProperty;var Be=(c,e)=>()=>(e||c((e={exports:{}}).exports,e),e.exports);var Te=(c,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ue(e))!Oe.call(c,r)&&r!==t&&fe(c,r,{get:()=>e[r],enumerable:!(o=We(e,r))||o.enumerable});return c};var xe=(c,e,t)=>(t=c!=null?ke(_e(c)):{},Te(e||!c||!c.__esModule?fe(t,"default",{value:c,enumerable:!0}):t,c));var Ge=Be((qe,ve)=>{"use strict";ve.exports=function c(e,t){if(e===t)return!0;if(e&&t&&typeof e=="object"&&typeof t=="object"){if(e.constructor!==t.constructor)return!1;var o,r,s;if(Array.isArray(e)){if(o=e.length,o!=t.length)return!1;for(r=o;r--!==0;)if(!c(e[r],t[r]))return!1;return!0}if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(r of e.entries())if(!t.has(r[0]))return!1;for(r of e.entries())if(!c(r[1],t.get(r[0])))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(r of e.entries())if(!t.has(r[0]))return!1;return!0}if(ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(o=e.length,o!=t.length)return!1;for(r=o;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();if(s=Object.keys(e),o=s.length,o!==Object.keys(t).length)return!1;for(r=o;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,s[r]))return!1;for(r=o;r--!==0;){var n=s[r];if(!c(e[n],t[n]))return!1}return!0}return e!==e&&t!==t}});var Le=Be((no,Ce)=>{(function(c,e){typeof Ce<"u"?Ce.exports=e():typeof define=="function"&&typeof define.amd=="object"?define(e):this[c]=e()})("Clusterize",function(){"use strict";var c=(function(){for(var a=3,i=document.createElement("b"),l=i.all||[];i.innerHTML="",l[0];);return a>4?a:document.documentMode})(),e=navigator.platform.toLowerCase().indexOf("mac")+1,t=function(a){if(!(this instanceof t))return new t(a);var i=this,l={rows_in_block:50,blocks_in_cluster:4,tag:null,show_no_data_row:!0,no_data_class:"clusterize-no-data",no_data_text:"No data",keep_parity:!0,callbacks:{}};i.options={};for(var p=["rows_in_block","blocks_in_cluster","show_no_data_row","no_data_class","no_data_text","keep_parity","tag","callbacks"],d=0,g;g=p[d];d++)i.options[g]=typeof a[g]<"u"&&a[g]!=null?a[g]:l[g];for(var u=["scroll","content"],d=0,b;b=u[d];d++)if(i[b+"_elem"]=a[b+"Id"]?document.getElementById(a[b+"Id"]):a[b+"Elem"],!i[b+"_elem"])throw new Error("Error! Could not find "+b+" element");i.content_elem.hasAttribute("tabindex")||i.content_elem.setAttribute("tabindex",0);var C=s(a.rows)?a.rows:i.fetchMarkup(),f={},y=i.scroll_elem.scrollTop;i.insertToDOM(C,f),i.scroll_elem.scrollTop=y;var I=!1,A=0,v=!1,F=function(){e&&(v||(i.content_elem.style.pointerEvents="none"),v=!0,clearTimeout(A),A=setTimeout(function(){i.content_elem.style.pointerEvents="auto",v=!1},50)),I!=(I=i.getClusterNum(C))&&i.insertToDOM(C,f),i.options.callbacks.scrollingProgress&&i.options.callbacks.scrollingProgress(i.getScrollProgress())},U=0,M=function(){clearTimeout(U),U=setTimeout(i.refresh,100)};o("scroll",i.scroll_elem,F),o("resize",window,M),i.destroy=function(Q){r("scroll",i.scroll_elem,F),r("resize",window,M),i.html((Q?i.generateEmptyRow():C).join(""))},i.refresh=function(Q){(i.getRowsHeight(C)||Q)&&i.update(C)},i.update=function(Q){C=s(Q)?Q:[];var N=i.scroll_elem.scrollTop;C.length*i.options.item_height\s/]*)/)[1].toLowerCase()),this.content_elem.children.length<=1&&(i.data=this.html(a[0]+a[0]+a[0])),l.tag||(l.tag=this.content_elem.children[0].tagName.toLowerCase()),this.getRowsHeight(a))},getRowsHeight:function(a){var i=this.options,l=i.item_height;if(i.cluster_height=0,!!a.length){var p=this.content_elem.children;if(p.length){var d=p[Math.floor(p.length/2)];if(i.item_height=d.offsetHeight,i.tag=="tr"&&n("borderCollapse",this.content_elem)!="collapse"&&(i.item_height+=parseInt(n("borderSpacing",this.content_elem),10)||0),i.tag!="tr"){var g=parseInt(n("marginTop",d),10)||0,u=parseInt(n("marginBottom",d),10)||0;i.item_height+=Math.max(g,u)}return i.block_height=i.item_height*i.rows_in_block,i.rows_in_cluster=i.blocks_in_cluster*i.rows_in_block,i.cluster_height=i.blocks_in_cluster*i.block_height,l!=i.item_height}}},getClusterNum:function(a){var i=this.options;i.scroll_top=this.scroll_elem.scrollTop;var l=i.cluster_height-i.block_height,p=Math.floor(i.scroll_top/l),d=Math.floor(a.length*i.item_height/l);return Math.min(p,d)},generateEmptyRow:function(){var a=this.options;if(!a.tag||!a.show_no_data_row)return[];var i=document.createElement(a.tag),l=document.createTextNode(a.no_data_text),p;return i.className=a.no_data_class,a.tag=="tr"&&(p=document.createElement("td"),p.colSpan=100,p.appendChild(l)),i.appendChild(p||l),[i.outerHTML]},generate:function(a){var i=this.options,l=a.length;if(l"+a+"";p=i.lastChild;)i.removeChild(p);for(var d=this.getChildNodes(l.firstChild.firstChild);d.length;)i.appendChild(d.shift())}else i.innerHTML=a},getChildNodes:function(a){for(var i=a.children,l=[],p=0,d=i.length;pe.shortcut).map(([e,t])=>[t.shortcut,e]))}isEnabled(e){return this._getAction(e).enabled}text(e){return this._getAction(e).text}keyshortcuts(e){return this._getAction(e).shortcut}update(e){let t=c._recount(e.selected,e.nonselected);this._updateStates(t)}_getAction(e){let t=this.actions[e];if(!t)throw new Error(`no such action: ${e}`);return t}static _recount(e,t){let o=e.length+t.length,r=e.filter(d=>d.isStopped()).length,s=e.length-r,n=t.filter(d=>d.isStopped()).length,a=t.length-n,i=r+n,l=s+a,p=e.filter(d=>d.isQueued()).length;return{active:l,nonselected_active:a,nonselected_paused:n,paused:i,selected:e.length,selected_active:s,selected_paused:r,selected_queued:p,total:o}}_updateStates(e){let t=(o,r)=>{for(let s of r)this._updateActionState(s,o)};t(e.selected_paused>0,["resume-selected-torrents"]),t(e.paused>0,["start-all-torrents"]),t(e.active>0,["pause-all-torrents"]),t(e.selected_paused>0||e.selected_queued>0,["resume-selected-torrents-now"]),t(e.selected_active>0,["pause-selected-torrents","reannounce-selected-torrents"]),t(e.selected>0,["deselect-all","move-bottom","move-down","move-top","move-up","remove-selected-torrents","show-inspector","show-labels-dialog","show-move-dialog","trash-selected-torrents","verify-selected-torrents"]),t(e.selected===1,["show-rename-dialog"]),t(e.selectedRe(r,d,n,l,t))}return a[0].classList.add("selected"),n.children[0].classList.remove("hidden"),{buttons:a,dismiss:s,root:o}}function X(c){let e=document.createElement("dialog");e.classList.add("dialog-container","popup",c),e.open=!0,e.setAttribute("role","dialog");let t=document.createElement("div");t.classList.add("dialog-window"),e.append(t);let o=document.createElement("div");o.classList.add("dialog-logo"),t.append(o);let r=document.createElement("div");r.classList.add("dialog-heading"),t.append(r);let s=document.createElement("div");s.classList.add("dialog-message"),t.append(s);let n=document.createElement("div");n.classList.add("dialog-workarea"),t.append(n);let a=document.createElement("div");a.classList.add("dialog-buttons"),t.append(a);let i=document.createElement("span");i.className="flexible-space",a.append(i);let l=document.createElement("button");l.classList.add("dialog-dismiss-button"),l.textContent="Cancel",a.append(l);let p=document.createElement("button");return p.textContent="OK",a.append(p),t.addEventListener("keyup",({key:d})=>{d==="Enter"&&p.click()}),{confirm:p,dismiss:l,heading:r,message:s,root:e,workarea:n}}function Z(){return typeof crypto.randomUUID=="function"?crypto.randomUUID():("10000000-1000-4000-8000"+-1e11).replaceAll(/[018]/g,c=>(c^crypto.getRandomValues(new Uint8Array(1))[0]&15>>c/4).toString(16))}function V(c,e,t){let o=t.map(r=>new Option(...r));if(e){let r=document.createElement("OPTGROUP");r.label=e,r.append(...o),c.append(r)}else c.append(...o)}var $=Object.freeze({delete:()=>O(["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2L21 6L3 6"}],["line",{x1:10,x2:10,y1:11,y2:17}],["line",{x1:14,x2:14,y1:11,y2:17}]),inspector:()=>{let c=T("svg",{fill:"none","fill-opacity":1,height:26,stroke:"currentColor",viewBox:"-1 -1 26 26",width:26}),e=T("g",{});return e.append(T("circle",{cx:12,cy:12,r:11,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":2}),T("path",{d:"M 11.88208 4.883789 C 12.326418 4.883789 12.702391 5.039305 13.01001 5.350342 C 13.317628 5.6613785 13.471436 6.035642 13.471436 6.4731445 C 13.471436 6.910647 13.31592 7.283202 13.004883 7.59082 C 12.693846 7.898439 12.319582 8.052246 11.88208 8.052246 C 11.444578 8.052246 11.072023 7.898439 10.764404 7.59082 C 10.456786 7.283202 10.302979 6.910647 10.302979 6.4731445 C 10.302979 6.035642 10.456786 5.6613785 10.764404 5.350342 C 11.072023 5.039305 11.444578 4.883789 11.88208 4.883789 Z M 13.317627 9.528809 L 13.317627 17.126953 C 13.317627 17.803714 13.39624 18.236083 13.553467 18.424072 C 13.710694 18.612061 14.018308 18.719726 14.476318 18.74707 L 14.476318 19.11621 L 9.298096 19.11621 L 9.298096 18.74707 C 9.721926 18.733398 10.036376 18.610353 10.241455 18.37793 C 10.378175 18.220702 10.446533 17.803714 10.446533 17.126953 L 10.446533 11.52832 C 10.446533 10.851559 10.367921 10.41919 10.210693 10.231201 C 10.053466 10.043212 9.74927 9.935547 9.298096 9.908203 L 9.298096 9.528809 Z",fill:"currentColor"})),c.append(e),c},open:()=>O(["path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"}],["line",{x1:12,x2:12,y1:11,y2:17}],["line",{x1:9,x2:15,y1:14,y2:14}]),overflow:()=>O(["line",{x1:3,x2:21,y1:12,y2:12}],["line",{x1:3,x2:21,y1:6,y2:6}],["line",{x1:3,x2:21,y1:18,y2:18}]),pause:()=>O(["rect",{height:16,width:4,x:6,y:4}],["rect",{height:16,width:4,x:14,y:4}]),speedDown:()=>O(["polyline",{points:"6 9 12 15 18 9"}]),speedUp:()=>O(["polyline",{points:"18 15 12 9 6 15"}]),start:()=>O(["polyline",{points:"5 3 19 12 5 21 5 3"}])});function Ye(c){let e=document.createElement("fieldset");e.classList.add("section");let t=document.createElement("legend");t.classList.add("title"),t.textContent=c,e.append(t);let o=document.createElement("div");return o.classList.add("content"),e.append(o),{content:o,root:e}}function be(c,e){let t=[],{root:o,content:r}=Ye(c);for(let s of e){let n=document.createElement("label");n.textContent=s,r.append(n);let a=document.createElement("div");a.id=Z(),r.append(a),n.setAttribute("for",a.id),t.push(a)}return{children:t,root:o}}function R(c,e=100){let t=null;return(...o)=>{t||(t=setTimeout(()=>{t=null,c(...o)},e))}}function q(c,e){return(0,ye.default)(c,e)}function Ne(c,e,t){t?c.setAttribute(e,!0):c.removeAttribute(e)}function L(c,e){Ne(c,"disabled",!e)}function ee(c,e){c.classList.toggle("checked",e)}var _=class extends EventTarget{constructor(e){super(),this.listener=t=>{e.contains(t.target)||(this.dispatchEvent(new MouseEvent(t.type,t)),t.preventDefault())},Object.seal(this),this.start()}start(){setTimeout(()=>document.addEventListener("click",this.listener),0)}stop(){document.removeEventListener("click",this.listener)}};function h(c,e){c.textContent!==e&&(c.textContent=e)}var te=class{constructor(e){this._prefs=e,this._elements={toggle:document.querySelector("#toggle-notifications")}}_setEnabled(e){this.prefs.notifications_enabled=e,h(this._toggle,`${e?"Disable":"Enable"} Notifications`)}_requestPermission(){Notification.requestPermission().then(e=>this._setEnabled(e==="granted"))}toggle(){this._enabled?this._setEnabled(!1):Notification.permission==="granted"?this._setEnabled(!0):Notification.permission!=="denied"&&this._requestPermission()}};var m=class c extends EventTarget{constructor(){super(),this._cache={},this.dispatchPrefsChange=R((e,t,o)=>{let r=new Event("change");Object.assign(r,{key:e,old_value:t,value:o}),this.dispatchEvent(r)});for(let[e,t]of Object.entries(c._Defaults))this._set(e,c._getCookie(e,t)),Object.defineProperty(this,e.replaceAll("-","_"),{get:()=>this._get(e),set:o=>{this._set(e,o)}});Object.seal(this)}entries(){return Object.entries(this._cache)}keys(){return Object.keys(this._cache)}_get(e){let{_cache:t}=this;if(!Object.prototype.hasOwnProperty.call(t,e))throw new Error(e);return t[e]}_set(e,t){let{_cache:o}=this,r=o[e];r!==t&&(o[e]=t,c._setCookie(e,t),this.dispatchPrefsChange(e,r,t))}static _setCookie(e,t){let o=new Date;o.setFullYear(o.getFullYear()+1),document.cookie=`${e}=${t}; SameSite=Strict; expires=${o.toGMTString()}`}static _getCookie(e,t){let o=c._readCookie(e);if(o===null)return t;let r=typeof t;if(r==="boolean")return o==="true"?!0:o==="false"?!1:t;if(r==="number"){let s=Number.parseFloat(o);return Number.isNaN(s)?t:s}return o}static _readCookie(e){let o=`; ${document.cookie}`.split(`; ${e}=`);return o.length===2?o.pop().split(";").shift():null}};m.AltSpeedEnabled="alt-speed-enabled";m.DisplayCompact="compact";m.DisplayFull="full";m.DisplayMode="display-mode";m.ContrastLess="less";m.ContrastMore="more";m.ContrastMode="contrast-mode";m.FilterActive="active";m.FilterAll="all";m.FilterDownloading="downloading";m.FilterError="error";m.FilterFinished="finished";m.FilterMode="filter-mode";m.FilterPaused="paused";m.FilterPrivate="private";m.FilterPublic="public";m.FilterSeeding="seeding";m.HighlightColor="highlight-color";m.NotificationsEnabled="notifications-enabled";m.RefreshRate="refresh-rate-sec";m.SortAscending="ascending";m.SortByActivity="activity";m.SortByAge="age";m.SortByName="name";m.SortByProgress="progress";m.SortByQueue="queue";m.SortByRatio="ratio";m.SortBySize="size";m.SortByState="state";m.SortDescending="descending";m.SortDirection="sort-direction";m.SortMode="sort-mode";m._Defaults={[m.AltSpeedEnabled]:!1,[m.DisplayMode]:m.DisplayFull,[m.ContrastMode]:globalThis.matchMedia("(prefers-contrast: more)").matches?m.ContrastMore:m.ContrastLess,[m.FilterMode]:m.FilterAll,[m.HighlightColor]:"AccentColor",[m.NotificationsEnabled]:!1,[m.RefreshRate]:5,[m.SortDirection]:m.SortAscending,[m.SortMode]:m.SortByName};var oe=class c extends EventTarget{constructor(e){super(),this.elements=c._create(e),this.elements.dismiss.addEventListener("click",()=>this.close()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}static _create(e){let t=X("about-dialog");t.root.setAttribute("aria-label","About transmission"),t.heading.textContent="Transmission",t.dismiss.textContent="Close";let o=document.createElement("div");return o.classList.add("about-dialog-version-number"),o.textContent=e.version,t.heading.append(o),o=document.createElement("div"),o.classList.add("about-dialog-version-checksum"),o.textContent=e.checksum,t.heading.append(o),o=document.createElement("div"),o.textContent="A fast and easy bitTorrent client",t.workarea.append(o),o=document.createElement("div"),o.textContent="Copyright \xA9 The Transmission Project",t.workarea.append(o),o=document.createElement("a"),o.href="https://transmissionbt.com/",o.target="_blank",o.textContent="https://transmissionbt.com/",t.workarea.append(o),t.confirm.remove(),delete t.confirm,t}};var D=class extends EventTarget{constructor(e,t){super(),this.action_manager=t,this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=e,this.prefs.addEventListener("change",this.prefs_listener),this.elements=this._create(),this.elements.dismiss.addEventListener("click",()=>this.close()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onPrefsChange(e){switch(e.key){case m.SortDirection:case m.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value;break;default:break}}_create(){let e=X("dis-appearance"),{dismiss:t,heading:o,message:r}=e;o.textContent="Appearance",t.textContent="Close";let s=document.createElement("h4");r.append(s),s.textContent="Theme";let n=document.createElement("div");n.classList.add("table-row"),r.append(n);let a=(p,d)=>{let g=document.createElement("input");g.id=Z(),g.type="checkbox";let u=document.createElement("label");u.htmlFor=g.id,u.textContent=p,n.append(g,u),d(g)},i=(p,d,g,u,b)=>{let C=document.createElement("input");C.id=Z(),C.name=p,C.type="radio",C.value=u;let f=document.createElement("label");f.htmlFor=C.id,f.textContent=d,n.append(C,f,document.createElement("BR")),b(C,g)},l=p=>{p.checked=this.prefs.contrast_mode===m.ContrastMore,p.addEventListener("change",d=>{let{checked:g}=d.target;this.prefs.contrast_mode=g?m.ContrastMore:m.ContrastLess})};return a(this.action_manager.text("toggle-contrast"),l),s=document.createElement("h4"),r.append(s),s.textContent="Highlight color",n=document.createElement("div"),n.classList.add("table-row"),r.append(n),l=(p,d)=>{p.checked=!d||document.body.classList.contains(d),p.addEventListener("change",g=>{let{value:u}=g.target;this.prefs.highlight_color=u})},i("highlight-color","Accent color from system",null,"AccentColor",l),i("highlight-color","Highlight color from system","highlight-system","Highlight",l),i("highlight-color","Legacy","highlight-legacy",null,l),e.confirm.remove(),delete e.confirm,e}};var re=class extends EventTarget{constructor(e,t){super(),this.action_listener=this._update.bind(this),this.controller=e,this.action_manager=e.action_manager,this.action_manager.addEventListener("change",this.action_listener),this.handler=e.handler,this.menu_items=t,Object.assign(this,this._create()),this.outside=new _(this.root),this.outside.addEventListener("click",()=>{this.handler&&this.handler.classList.remove("selected"),this.close()}),this.show()}show(){for(let[e,t]of Object.entries(this.actions))L(t,this.action_manager.isEnabled(e));document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.action_manager.removeEventListener("change",this.action_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_update(e){let t=this.actions[e.action];t&&L(t,e.enabled)}_create(){let e=document.createElement("div");e.role="menu",e.classList.add("context-menu","popup"),e.addEventListener("contextmenu",n=>{n.preventDefault()}),e.style.pointerEvents="none";let t={},o=(n,a=!1)=>{let i=document.createElement("div"),l=this.action_manager.text(n);i.role="menuitem",a?i.classList.add("context-menuitem","warning"):i.classList.add("context-menuitem"),i.dataset.action=n,i.textContent=l;let p=this.action_manager.keyshortcuts(n);return p&&i.setAttribute("aria-keyshortcuts",p),i.addEventListener("click",()=>{this.action_manager.click(n),this.close()}),t[n]=i,i},r=()=>{let n=document.createElement("div");return n.classList.add("context-menu-separator"),n},s=(n,...a)=>{let i=document.createElement("div");i.className="context-menuitem",i.textContent=n;let l=document.createElement("div");l.className="arrow",i.append(l);let p=document.createElement("div");p.className="submenu",l.append(p);let d=document.createElement("div");return d.className="open right",p.append(d),d.append(...a.map(g=>o(g))),i.addEventListener("click",g=>{let u=i.lastChild.lastChild;if(!g.target.classList.contains("right")&&!g.target.parentNode.classList.contains("right")&&!g.target.classList.contains("left")&&!g.target.parentNode.classList.contains("left")&&u.style.display==="block"){u.style.display="none";return}for(let I of e.querySelectorAll(".submenu"))I.style.display="none";u.style.display="block";let b=i.getBoundingClientRect(),C=u.lastChild.getBoundingClientRect(),f=Math.min(0,document.documentElement.clientHeight-window.visualViewport.offsetTop-b.top-u.clientHeight+3),y=Math.min(0,document.documentElement.clientWidth-window.visualViewport.offsetLeft-b.right-u.clientWidth);u.style.top=`${f}px`,y?(u.lastChild.className="open left",u.style.left=`${-b.width-C.width}px`):(u.lastChild.className="open right",u.style.left=`${y}px`)}),i};if(this.menu_items)for(let n of this.menu_items)e.append(n?o(n):r());else e.append(o("resume-selected-torrents"),o("resume-selected-torrents-now"),o("pause-selected-torrents"),r(),s("Move in the queue","move-top","move-up","move-down","move-bottom"),r(),o("remove-selected-torrents",!0),o("trash-selected-torrents",!0),r(),o("verify-selected-torrents"),o("show-move-dialog"),o("show-rename-dialog"),o("show-labels-dialog"),r(),o("reannounce-selected-torrents"),r(),s("Select operation","select-all","deselect-all"));return{actions:t,root:e}}};var Ze=new Intl.PluralRules,k=Ze.resolvedOptions().locale,Se=new Intl.NumberFormat(k),he=1e3,De=[new Intl.NumberFormat(k,{maximumFractionDigits:0,style:"unit",unit:"byte"}),new Intl.NumberFormat(k,{maximumFractionDigits:0,style:"unit",unit:"kilobyte"}),new Intl.NumberFormat(k,{maximumFractionDigits:0,style:"unit",unit:"megabyte"}),new Intl.NumberFormat(k,{maximumFractionDigits:2,style:"unit",unit:"gigabyte"}),new Intl.NumberFormat(k,{maximumFractionDigits:2,style:"unit",unit:"terabyte"}),new Intl.NumberFormat(k,{maximumFractionDigits:2,style:"unit",unit:"petabyte"})],Ee=new Intl.NumberFormat(k,{maximumFractionDigits:2,style:"unit",unit:"kilobyte-per-second"}),He=new Intl.NumberFormat(k,{maximumFractionDigits:2,style:"unit",unit:"megabyte-per-second"}),Je=new Intl.NumberFormat(k,{maximumFractionDigits:2,style:"unit",unit:"gigabyte-per-second"}),G={_toTruncFixed(c,e){return(Math.floor(c*10**e)/10**e).toFixed(e)},countString(c,e,t){return`${this.number(t)} ${this.ngettext(c,e,t)}`},mem(c){if(c<0)return"Unknown";if(c===0)return"None";let e=c;for(let t of De){if(ec.includes(e))?"\u2026":c},timeInterval(c,e=3){let t=Math.floor(c/86400),o=[];t&&o.push(this.countString("day","days",t));let r=Math.floor(c%86400/3600);(t||r)&&o.push(this.countString("hour","hours",r));let s=Math.floor(c%3600/60);return t||r||s?(o.push(this.countString("minute","minutes",s)),o=o.slice(0,e),o.length>1?`${o.slice(0,-1).join(", ")} and ${o.slice(-1)}`:o[0]):this.countString("second","seconds",Math.floor(c%60))},timestamp(c){if(!c)return"N/A";let e=new Date(c*1e3),t=new Date,o="",r="",s=t.getFullYear()===e.getFullYear(),n=t.getMonth()===e.getMonth(),a=t.getDate()-e.getDate();s&&n&&Math.abs(a)<=1?a===0?o="Today":a===1?o="Yesterday":o="Tomorrow":o=e.toDateString();let i=e.getHours(),l="AM";i>12&&(i=i-12,l="PM"),i===0&&(i=12),i<10&&(i=`0${i}`);let p=e.getMinutes();return p<10&&(p=`0${p}`),c=e.getSeconds(),c<10&&(c=`0${c}`),r=[i,p,c].join(":"),[o,r,l].join(" ")},toKBps(c){return Math.floor(c/he)}};var se=class extends EventTarget{isDone(){return this.fields.have>=this.fields.size}isEditable(){return this.fields.torrent.getFileCount()>1&&!this.isDone()}refreshWantedHTML(){let e=this.elements.root;e.classList.toggle("skip",!this.fields.isWanted),e.classList.toggle("complete",this.isDone()),L(e.checkbox,this.isEditable()),e.checkbox.checked=this.fields.isWanted}refreshProgressHTML(){let{size:e,have:t}=this.fields,o=100*(e?t/e:1),r=G,s=`${r.size(t)} of ${r.size(e)} (${r.percentString(o,1)}%)`;h(this.elements.progress,s)}refresh(){let e=0,t=!1,o=!1,r=!1,s=0,n=!1,a=this.fields.torrent.getFiles();for(let i of this.fields.indices){let l=a[i];switch(e+=l.bytes_completed,s+=l.length,n|=l.wanted,l.priority.toString()){case"-1":o=!0;break;case"1":t=!0;break;default:r=!0;break}}ee(this.elements.priority_low_button,o),ee(this.elements.priority_normal_button,r),ee(this.elements.priority_high_button,t),(this.fields.have!==e||this.fields.size!==s)&&(this.fields.have=e,this.fields.size=s,this.refreshProgressHTML()),this.fields.isWanted!==n&&(this.fields.isWanted=n,this.refreshWantedHTML())}fireWantedChanged(e){let t=new Event("wantedToggled");t.indices=[...this.fields.indices],t.wanted=e,this.dispatchEvent(t)}firePriorityChanged(e){let t=new Event("priorityToggled");t.indices=[...this.fields.indices],t.priority=e,this.dispatchEvent(t)}createRow(e,t){let o=document.createElement("li");o.classList.add("inspector-torrent-file-list-entry"),o.subtree=t,this.elements.root=o;let r=l=>{this.controller.handler&&this.controller.handler.classList.remove("selected"),setTimeout(()=>{o.classList.add("selected")},0);let p=t.name,d=t.parent;for(;d.name;){o.subdir=!0,p=`${d.name}/${p}`;let{parent:u}=d;d=u}o.file_path=p,this.controller.handler=o;let g=["show-rename-dialog",null,"copy-name"];this.controller.context_menu("#inspector",g),l.preventDefault()};this.controller.pointer_event(o,r);let s=document.createElement("input"),n=Z();s.type="checkbox",s.className="file-wanted-control",s.title="Download file",s.id=n,s.addEventListener("change",l=>this.fireWantedChanged(l.target.checked)),o.checkbox=s,o.append(s),s=document.createElement("label"),s.className="inspector-torrent-file-list-entry-name",s.setAttribute("for",n),h(s,t.name),o.append(s),o.name_container=s,s=document.createElement("div"),s.className="inspector-torrent-file-list-entry-progress",o.append(s),this.elements.progress=s,s=document.createElement("div"),s.className="file-priority-radiobox";let a=s,i=l=>this.firePriorityChanged(l.target.value);s=document.createElement("input"),s.type="radio",s.value="-1",s.className="low",s.title="Low Priority",s.addEventListener("click",i),this.elements.priority_low_button=s,a.append(s),s=document.createElement("input"),s.type="radio",s.value="0",s.className="normal",s.title="Normal Priority",s.addEventListener("click",i),this.elements.priority_normal_button=s,a.append(s),s=document.createElement("input"),s.type="radio",s.value="1",s.title="High Priority",s.className="high",s.addEventListener("click",i),this.elements.priority_high_button=s,a.append(s),o.append(a),o.style.paddingLeft=`${t.depth*20}px`,this.refresh()}getElement(){return this.elements.root}constructor(e,t,o){super(),this.controller=e,this.fields={have:0,indices:o.file_indices,isWanted:!0,size:0,torrent:t},this.elements={priority_high_button:null,priority_low_button:null,priority_normal_button:null,progress:null,root:null},this.createRow(t,o)}};var B=class c extends EventTarget{constructor(e){super(),this.fieldObservers={},this.fields={},this.refresh(e),this.setLazyCollatedField("name","collatedName"),this.setLazyCollatedField("trackers","collatedTrackers")}setLazyCollatedField(e,t){this.notifyOnFieldChange(e,()=>delete this.fields[t])}notifyOnFieldChange(e,t){(this.fieldObservers[e]??=[]).push(t)}setField(e,t,o){let r=e[t];if(q(r,o))return!1;let s=this.fieldObservers[t];if(e===this.fields&&s&&s.length>0)for(let n of s)n.call(this,o,r,t);return e[t]=o,!0}updateFiles(e){let t=!1,o=this.fields.files||[],r=["length","name","bytes_completed","wanted","priority"];for(let[s,n]of e.entries()){let a=o[s]||{};for(let i of r)i in n&&(t|=this.setField(a,i,n[i]));o[s]=a}return this.fields.files=o,t}static collateTrackers(e){return e.map(t=>t.announce.toLowerCase()).join(" ")}refreshFields(e){let t=!1;for(let[o,r]of Object.entries(e))switch(o){case"files":case"file_stats":t|=this.updateFiles(r);break;case"tracker_stats":t|=this.setField(this.fields,"trackers",r);break;case"trackers":o in this.fields||(t|=this.setField(this.fields,o,r));break;default:t|=this.setField(this.fields,o,r)}return t}refresh(e){this.refreshFields(e)&&this.dispatchEvent(new Event("dataChanged"))}getIndividualFile(e){return this.fields.files.find(t=>t.name===e)}getComment(){return this.fields.comment}getCreator(){return this.fields.creator}getDateAdded(){return this.fields.added_date}getDateCreated(){return this.fields.date_created}getDesiredAvailable(){return this.fields.desired_available}getDownloadDir(){return this.fields.download_dir}getDownloadSpeed(){return this.fields.rate_download}getDownloadedEver(){return this.fields.downloaded_ever}getError(){return this.fields.error}getErrorString(){return this.fields.error_string}getETA(){return this.fields.eta}getFailedEver(){return this.fields.corrupt_ever}getFiles(){return this.fields.files||[]}getFile(e){return this.fields.files[e]}getFileCount(){return this.fields.file_count}getHashString(){return this.fields.hash_string}getHave(){return this.getHaveValid()+this.getHaveUnchecked()}getHaveUnchecked(){return this.fields.have_unchecked}getHaveValid(){return this.fields.have_valid}getId(){return this.fields.id}getLabels(){return this.fields.labels.toSorted()}getLastActivity(){return this.fields.activity_date}getLeftUntilDone(){return this.fields.left_until_done}getMagnetLink(){return this.fields.magnet_link}getMetadataPercentComplete(){return this.fields.metadata_percent_complete}getName(){return this.fields.name||"Unknown"}getPeers(){return this.fields.peers||[]}getWebseedsEx(){return this.fields.webseeds_ex||[]}getPeersConnected(){return this.fields.peers_connected}getPeersGettingFromUs(){return this.fields.peers_getting_from_us}getPeersSendingToUs(){return this.fields.peers_sending_to_us}getPieceCount(){return this.fields.piece_count}getPieceSize(){return this.fields.piece_size}getPrimaryMimeType(){return this.fields.primary_mime_type||"application/octet-stream"}getPrivateFlag(){return this.fields.is_private}getQueuePosition(){return this.fields.queue_position}getRecheckProgress(){return this.fields.recheck_progress}getSeedRatioLimit(){return this.fields.seed_ratio_limit}getSeedRatioMode(){return this.fields.seed_ratio_mode}getSizeWhenDone(){return this.fields.size_when_done}getStartDate(){return this.fields.start_date}getStatus(){return this.fields.status}getTotalSize(){return this.fields.total_size}getTrackers(){return this.fields.trackers||[]}getUploadSpeed(){return this.fields.rate_upload}getUploadRatio(){return this.fields.upload_ratio}getUploadedEver(){return this.fields.uploaded_ever}getWebseedsSendingToUs(){return this.fields.webseeds_sending_to_us}isFinished(){return this.fields.is_finished}hasExtraInfo(){return"hash_string"in this.fields}isSeeding(){return this.getStatus()===c._StatusSeed}isStopped(){return this.getStatus()===c._StatusStopped}isChecking(){return this.getStatus()===c._StatusCheck}isDownloading(){return this.getStatus()===c._StatusDownload}isQueued(){return this.getStatus()===c._StatusDownloadWait||this.getStatus()===c._StatusSeedWait}isDone(){return this.getLeftUntilDone()<1}needsMetaData(){return this.getMetadataPercentComplete()<1}getActivity(){return this.getDownloadSpeed()+this.getUploadSpeed()}getPercentDoneStr(){return G.percentString(100*this.getPercentDone(),1)}getPercentDone(){return this.fields.percent_done}getStateString(){switch(this.getStatus()){case c._StatusStopped:return this.isFinished()?"Seeding complete":"Paused";case c._StatusCheckWait:return"Queued for verification";case c._StatusCheck:return"Verifying local data";case c._StatusDownloadWait:return"Queued for download";case c._StatusDownload:return"Downloading";case c._StatusSeedWait:return"Queued for seeding";case c._StatusSeed:return"Seeding";case null:return"Unknown";default:return"Error"}}seedRatioLimit(e){switch(this.getSeedRatioMode()){case c._RatioUseGlobal:return e.seedRatioLimit();case c._RatioUseLocal:return this.getSeedRatioLimit();default:return-1}}getErrorMessage(){let e=this.getErrorString();switch(this.getError()){case c._ErrTrackerWarning:return`Tracker returned a warning: ${e}`;case c._ErrTrackerError:return`Tracker returned an error: ${e}`;case c._ErrLocalError:return`Error: ${e}`;default:return null}}getCollatedName(){let e=this.fields;return!e.collatedName&&e.name&&(e.collatedName=e.name.toLowerCase()),e.collatedName||""}getCollatedTrackers(){let e=this.fields;return!e.collatedTrackers&&e.trackers&&(e.collatedTrackers=c.collateTrackers(e.trackers)),e.collatedTrackers||""}testState(e){let t=this.getStatus();switch(e){case m.FilterError:return this.getError();case m.FilterPrivate:return this.getPrivateFlag();case m.FilterPublic:return!this.getPrivateFlag();case m.FilterActive:return this.getPeersGettingFromUs()>0||this.getPeersSendingToUs()>0||this.getWebseedsSendingToUs()>0||this.isChecking();case m.FilterSeeding:return t===c._StatusSeed||t===c._StatusSeedWait;case m.FilterDownloading:return t===c._StatusDownload||t===c._StatusDownloadWait;case m.FilterPaused:return this.isStopped();case m.FilterFinished:return this.isFinished();default:return!0}}test(e,t,o,r){let s=this.testState(e);if(s&&o&&(s=this.getCollatedName().includes(o.toLowerCase())),s){let n=this.getLabels();r.length>0&&(s=r.some(a=>n.includes(a)))}return s&&t&&t.length>0&&(s=this.getCollatedTrackers().includes(t)),s}static compareById(e,t){return e.getId()-t.getId()}static compareByName(e,t){return e.getCollatedName().localeCompare(t.getCollatedName())||c.compareById(e,t)}static compareByQueue(e,t){return e.getQueuePosition()-t.getQueuePosition()}static compareByAge(e,t){let o=e.getDateAdded();return t.getDateAdded()-o||c.compareByQueue(e,t)}static compareByState(e,t){let o=e.getStatus();return t.getStatus()-o||c.compareByQueue(e,t)}static compareByActivity(e,t){let o=e.getActivity();return t.getActivity()-o||c.compareByState(e,t)}static compareByRatio(e,t){let o=e.getUploadRatio(),r=t.getUploadRatio();return or?-1:c.compareByState(e,t)}static compareByProgress(e,t){let o=e.getPercentDone(),r=t.getPercentDone();return o-r||c.compareByRatio(e,t)}static compareBySize(e,t){let o=e.getTotalSize(),r=t.getTotalSize();return o-r||c.compareByName(e,t)}static compareTorrents(e,t,o,r){let s=0;switch(o){case m.SortByActivity:s=c.compareByActivity(e,t);break;case m.SortByAge:s=c.compareByAge(e,t);break;case m.SortByQueue:s=c.compareByQueue(e,t);break;case m.SortByProgress:s=c.compareByProgress(e,t);break;case m.SortBySize:s=c.compareBySize(e,t);break;case m.SortByState:s=c.compareByState(e,t);break;case m.SortByRatio:s=c.compareByRatio(e,t);break;case m.SortByName:s=c.compareByName(e,t);break;default:console.log(`Unrecognized sort mode: ${o}`),s=c.compareByName(e,t);break}return r===m.SortDescending&&(s=-s),s}static sortTorrents(e,t,o){switch(t){case m.SortByActivity:e.sort(this.compareByActivity);break;case m.SortByAge:e.sort(this.compareByAge);break;case m.SortByName:e.sort(this.compareByName);break;case m.SortByProgress:e.sort(this.compareByProgress);break;case m.SortByQueue:e.sort(this.compareByQueue);break;case m.SortByRatio:e.sort(this.compareByRatio);break;case m.SortBySize:e.sort(this.compareBySize);break;case m.SortByState:e.sort(this.compareByState);break;default:console.log(`Unrecognized sort mode: ${t}`),e.sort(this.compareByName);break}return o===m.SortDescending&&e.reverse(),e}};B._StatusStopped=0;B._StatusCheckWait=1;B._StatusCheck=2;B._StatusDownloadWait=3;B._StatusDownload=4;B._StatusSeedWait=5;B._StatusSeed=6;B._RatioUseGlobal=0;B._RatioUseLocal=1;B._RatioUnlimited=2;B._ErrNone=0;B._ErrTrackerWarning=1;B._ErrTrackerError=2;B._ErrLocalError=3;B._TrackerInactive=0;B._TrackerWaiting=1;B._TrackerQueued=2;B._TrackerActive=3;B.Fields={};B.Fields.Metadata=["added_date","file_count","name","primary_mime_type","total_size"];B.Fields.Stats=["error","error_string","eta","is_finished","is_stalled","labels","left_until_done","metadata_percent_complete","peers_connected","peers_getting_from_us","peers_sending_to_us","percent_done","queue_position","rate_download","rate_upload","recheck_progress","seed_ratio_mode","seed_ratio_limit","size_when_done","status","trackers","download_dir","uploaded_ever","upload_ratio","webseeds_sending_to_us"];B.Fields.InfoExtra=["comment","creator","date_created","files","hash_string","is_private","magnet_link","piece_count","piece_size"];B.Fields.StatsExtra=["activity_date","corrupt_ever","desired_available","downloaded_ever","file_stats","have_unchecked","have_valid","peers","start_date","tracker_stats","webseeds_ex"];var Xe=["encryption","speed-up","speed-down","percent-done","status","peer-address","peer-app-name"],Fe=["url","speed-down"],E=class c extends EventTarget{constructor(e){super(),this.closed=!1,this.controller=e,this.elements=this._create(),this.current_page=this.elements.info.root,this.interval=setInterval(this._refreshTorrents.bind(this),3e3),this.name="inspector",this.selection_listener=t=>this._setTorrents(t.selected,!0),this.torrent_listener=()=>this._updateCurrentPage(),this.torrents=[],this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null,this.elements.dismiss.addEventListener("click",()=>this.close()),Object.seal(this),e.addEventListener("torrent-selection-changed",this.selection_listener),this._setTorrents(this.controller.getSelectedTorrents(),!0),document.querySelector("#mainwin-workarea").append(this.elements.root)}close(){if(!this.closed){clearInterval(this.interval),this._setTorrents([]),this.elements.root.remove(),this.controller.removeEventListener("torrent-selection-changed",this.selection_listener),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}static _createInfoPage(){let e=document.createElement("div");e.classList.add("inspector-info-page");let t={root:e},o=n=>{let a=document.createElement("div");a.textContent=n,a.classList.add("section-label"),e.append(a)},r=n=>{let a=document.createElement("label");h(a,n),e.append(a);let i=document.createElement("span");return e.append(i),i};o("Activity");let s=[["have","Have:"],["availability","Availability:"],["uploaded","Uploaded:"],["downloaded","Downloaded:"],["state","State:"],["running_time","Running time:"],["remaining_time","Remaining:"],["last_activity","Last activity:"],["error","Error:"]];for(let[n,a]of s)t[n]=r(a);o("Details"),s=[["name","Name:"],["size","Size:"],["location","Location:"],["hash","Hash:"],["privacy","Privacy:"],["origin","Origin:"],["date_added","Date added:"],["magnet_link","Magnet:"],["comment","Comment:"],["labels","Labels:"]];for(let[n,a]of s)t[n]=r(a);return t}static _createListPage(e,t){let o=document.createElement("div"),r=document.createElement(e);return r.id=t,o.append(r),{list:r,root:o}}static _createTiersPage(){return c._createListPage("div","inspector-tiers-list")}static _createFilesPage(){return c._createListPage("ul","inspector-file-list")}static _createPeersPage(){let e=document.createElement("div"),t=document.createElement("table");t.classList.add("peer-list");let o=document.createElement("thead"),r=document.createElement("tr"),s=["Web Seeds","Down"];for(let[g,u]of s.entries()){let b=document.createElement("th");b.classList.add(Fe[g]),h(b,u),r.append(b)}let n=document.createElement("tbody");o.append(r),t.append(o),t.append(n);let a=document.createElement("table");a.classList.add("peer-list");let i=document.createElement("thead"),l=document.createElement("tr"),p=["","Up","Down","Done","Status","Address","Client"];for(let[g,u]of p.entries()){let b=document.createElement("th"),C=Xe[g];C==="encryption"&&(b.dataset.encrypted=!0),b.classList.add(C),h(b,u),l.append(b)}let d=document.createElement("tbody");return i.append(l),a.append(i),a.append(d),e.append(t),e.append(a),{peersTable:a,root:e,tbody:d,webseedsTable:t,webseedsTbody:n}}_create(){let e={files:c._createFilesPage(),info:c._createInfoPage(),peers:c._createPeersPage(),tiers:c._createTiersPage()},t=r=>{this.current_page=r,this._updateCurrentPage()};return{...K("inspector",[["inspector-tab-info",e.info.root,"Info"],["inspector-tab-peers",e.peers.root,"Peers"],["inspector-tab-tiers",e.tiers.root,"Tiers"],["inspector-tab-files",e.files.root,"Files"]],t.bind(this)),...e}}_setTorrents(e,t=!1){let o="dataChanged",r=this.torrent_listener;for(let s of this.torrents)s.removeEventListener(o,r);this.torrents=[...e];for(let s of this.torrents)s.addEventListener(o,r);t&&this._refreshTorrents(),this._updateCurrentPage()}static _needsExtraInfo(e){return e.some(t=>!t.hasExtraInfo())}_refreshTorrents(){let{controller:e,torrents:t}=this,o=t.map(r=>r.getId());if(o&&o.length>0){let r=["id",...B.Fields.StatsExtra];c._needsExtraInfo(t)&&r.push(...B.Fields.InfoExtra),e.updateTorrents(o,r)}}_updateCurrentPage(){let{current_page:e,elements:t}=this;switch(e){case t.files.root:this._updateFiles();break;case t.info.root:this._updateInfo();break;case t.peers.root:this._updatePeers();break;case t.tiers.root:this._updateTiers();break;default:console.warn("unexpected page"),console.log(e)}}_updateInfo(){let e="None",t="Mixed",o="Unknown",r=G,s=Date.now(),{elements:n,torrents:a}=this,i=a.reduce((d,g)=>d+g.getSizeWhenDone(),0),l=null;if(a.length===0)l=e;else if(a.every(d=>d.isFinished()))l="Finished";else if(a.every(d=>d.isStopped()))l="Paused";else{let d=u=>u.getStateString(),g=d(a[0]);l=a.every(u=>d(u)===g)?g:t}h(n.info.state,l);let p=l;if(a.length===0)l=e;else{let d=a.reduce((C,f)=>C+f.getHaveValid(),0),g=a.reduce((C,f)=>C+f.getHaveUnchecked(),0),u=a.reduce((C,f)=>C+f.getLeftUntilDone(),0),b=100*(i?(i-u)/i:1);l=r.percentString(b,1),g?l=`${r.size(d)} of ${r.size(i)} (${l}%), ${r.size(g)} Unverified`:u?l=`${r.size(d)} of ${r.size(i)} (${l}%)`:l=`${r.size(d)} (100%)`}if(h(n.info.have,r.stringSanitizer(l)),a.length===0)l=e;else if(i===0)l=e;else{let d=a.reduce((g,u)=>u.getHave()+u.getDesiredAvailable(),0);l=`${r.percentString(100*d/i,1)}%`}if(h(n.info.availability,r.stringSanitizer(l)),a.length===0)l=e;else{let d=a.reduce((u,b)=>u+b.getDownloadedEver(),0),g=a.reduce((u,b)=>u+b.getFailedEver(),0);l=g?`${r.size(d)} (+${r.size(g)} discarded after failed checksum)`:r.size(d)}if(h(n.info.downloaded,r.stringSanitizer(l)),a.length===0)l=e;else{let d=a.reduce((u,b)=>u+b.getUploadedEver(),0),g=a.reduce((u,b)=>u+b.getSizeWhenDone(),0)||a.reduce((u,b)=>u+b.getHaveValid(),0);l=`${r.size(d)} (Ratio: ${r.ratioString(S.ratio(d,g))})`}if(h(n.info.uploaded,l),a.length===0)l=e;else if(a.every(d=>d.isStopped()))l=p;else{let d=u=>u.getStartDate(),g=d(a[0]);l=a.every(u=>d(u)===g)?r.timeInterval(s/1e3-g):t}if(h(n.info.running_time,l),a.length===0)l=e;else{let d=u=>u.getETA(),g=d(a[0]);a.every(u=>d(u)===g)?g<0?l=o:l=r.timeInterval(g):l=t}if(h(n.info.remaining_time,l),a.length===0)l=e;else{let d=a.reduce((u,b)=>Math.max(u,b.getLastActivity()),-1),g=Math.floor(s/1e3);if(0u.getErrorString(),g=d(a[0]);l=a.every(u=>d(u)===g)?g:t}if(h(n.info.error,l||e),a.length===1?l=a[0].getName():l=a.length>0?t:e,h(n.info.name,l),a.length===0)l=e;else{let d=a.reduce((g,u)=>g+u.getTotalSize(),0);if(d){let g=f=>f.getPieceSize(),u=a.reduce((f,y)=>f+y.getPieceCount(),0),b=r.number(u),C=g(a[0]);l=a.every(f=>g(f)===C)?`${r.size(d)} (${b} pieces @ ${r.mem(C)})`:`${r.size(d)} (${b} pieces)`}else l="None"}if(h(n.info.size,r.stringSanitizer(l)),a.length===0)l=e;else{let d=u=>u.getHashString(),g=d(a[0]);l=a.every(u=>d(u)===g)?g:t}if(h(n.info.hash,l),a.length===0)l=e;else{let d=u=>u.getPrivateFlag(),g=d(a[0]);a.every(u=>d(u)===g)?g?l="Private to this tracker -- DHT and PEX disabled":l="Public torrent":l=t}if(h(n.info.privacy,l),a.length===0)l=e;else{let d=u=>u.getComment(),g=d(a[0]);l=a.every(u=>d(u)===g)?g:t}if(l=l||e,l.startsWith("https://")||l.startsWith("http://")?(l=encodeURI(l),n.info.comment.innerHTML=`${l}`):h(n.info.comment,l),l=a.length===0?e:a[0].getLabels().join(", "),h(n.info.labels,l),a.length===0)l=e;else{let d=I=>I.getCreator(),g=d(a[0]),u=!a.every(I=>d(I)===g);d=I=>I.getDateCreated();let b=d(a[0]),C=!a.every(I=>d(I)===b),f=!g||g.length===0,y=!b;u||C?l=t:f&&y?l=o:y&&!f?l=`Created by ${g}`:f&&!y?l=`Created on ${new Date(b*1e3).toDateString()}`:l=`Created by ${g} on ${new Date(b*1e3).toDateString()}`}if(h(n.info.origin,l),a.length===0)l=e;else{let d=u=>u.getDownloadDir(),g=d(a[0]);l=a.every(u=>d(u)===g)?g:t}if(h(n.info.location,l),a.length===0)l=e;else{let d=u=>u.getDateAdded(),g=d(a[0]);l=a.every(u=>d(u)===g)?new Date(g*1e3).toLocaleString(navigator.language,{day:"2-digit",hour:"2-digit",hour12:!1,minute:"2-digit",month:"short",second:"2-digit",timeZoneName:"short",weekday:"short",year:"numeric"}):t}if(h(n.info.date_added,l),a.length===0)h(n.info.magnet_link,e);else if(a.length>1)h(n.info.magnet_link,t);else{let d=a[0].getMagnetLink();n.info.magnet_link.innerHTML=``}}static _peerStatusTitle(e){let t=Object.seal({"?":"We unchoked this peer, but they're not interested",D:"Downloading from this peer",E:"Encrypted Connection",H:"Peer was discovered through Distributed Hash Table (DHT)",I:"Peer is an incoming connection",K:"Peer has unchoked us, but we're not interested",O:"Optimistic unchoke",T:"Peer is connected via uTP",U:"Uploading to peer",X:"Peer was discovered through Peer Exchange (PEX)",d:"We would download from this peer if they'd let us",u:"We would upload to this peer if they'd ask"});return[...e].filter(o=>t[o]).map(o=>`${o}: ${t[o]}`).join(` -`)}_updatePeers(){let e=G,{elements:t,torrents:o}=this,{tbody:r,webseedsTbody:s,webseedsTable:n}=t.peers,a=[(g,u)=>{u.dataset.encrypted=g.is_encrypted},(g,u)=>h(u,g.rate_to_peer?e.speedBps(g.rate_to_peer):""),(g,u)=>h(u,g.rate_to_client?e.speedBps(g.rate_to_client):""),(g,u)=>h(u,`${Math.floor(g.progress*100)}%`),(g,u)=>{h(u,g.flag_str),u.setAttribute("title",c._peerStatusTitle(g.flag_str))},(g,u)=>{h(u,g.address),u.setAttribute("title",g.address)},(g,u)=>{h(u,g.client_name),u.setAttribute("title",g.client_name)}],i=[(g,u)=>{h(u,g.url),u.setAttribute("title",g.url)},(g,u)=>{h(u,g.download_bytes_per_second?e.speedBps(g.download_bytes_per_second):"")}],l=[],p=[],d=!1;for(let g of o){let u=document.createElement("tr");u.classList.add("torrent-row");let b=document.createElement("td");h(b,g.getName()),u.append(b);let C=g.getWebseedsEx();if(C.length>0){d=!0;let y=u.cloneNode(!0);y.firstChild.setAttribute("colspan",i.length),l.push(y);for(let I of C){let A=document.createElement("tr");A.classList.add("webseed-row");for(let[v,F]of i.entries()){let U=document.createElement("td");U.classList.add(Fe[v]),F(I,U),A.append(U)}l.push(A)}}let f=u.cloneNode(!0);f.firstChild.setAttribute("colspan",a.length),p.push(f);for(let y of g.getPeers()){let I=document.createElement("tr");for(let[A,v]of a.entries()){let F=document.createElement("td");F.classList.add(Xe[A]),v(y,F),I.append(F)}p.push(I)}}for(n.style.display=d?"":"none";s.firstChild;)s.firstChild.remove();for(d&&s.append(...l);r.firstChild;)r.firstChild.remove();r.append(...p)}static getAnnounceState(e){switch(e.announce_state){case B._TrackerActive:return"Announce in progress";case B._TrackerWaiting:{let t=Math.max(0,e.next_announce_time-Date.now()/1e3);return`Next announce in ${G.timeInterval(t)}`}case B._TrackerQueued:return"Announce is queued";case B._TrackerInactive:return e.is_backup?"Tracker will be used as a backup":"Announce not scheduled";default:return`unknown announce state: ${e.announce_state}`}}static lastAnnounceStatus(e){let t="Last Announce",o=["N/A"];if(e.has_announced){let r=G.timestamp(e.last_announce_time);e.last_announce_succeeded?o=[r," (got ",G.countString("peer","peers",e.last_announce_peer_count),")"]:(t="Announce error",o=[e.last_announce_result?`${e.last_announce_result} - `:"",r])}return{label:t,value:o.join("")}}static lastScrapeStatus(e){let t="Last Scrape",o="N/A";if(e.has_scraped){let r=G.timestamp(e.last_scrape_time);e.last_scrape_succeeded?o=r:(t="Scrape error",o=(e.last_scrape_result?`${e.last_scrape_result} - `:"")+r)}return{label:t,value:o}}static _getOrigin(e){try{let t="udp://";if(e.announce.startsWith(t)){let r="http://",s=e.announce.replace(t,r);return new URL(s).origin.replace(r,t)}return new URL(e.announce).origin}catch{return[e.sitename||e.host||e.announce]}}_updateTiers(){let{list:t}=this.elements.tiers,{torrents:o}=this,r=[];for(let s of o){if(o.length>1){let n=document.createElement("div");n.classList.add("tier-list-torrent"),h(n,s.getName()),r.push(n)}for(let n of s.getTrackers()){let a=c.getAnnounceState(n),i=c.lastAnnounceStatus(n),l=c.lastScrapeStatus(n),p=document.createElement("div");p.classList.add("tier-list-row");let d=document.createElement("div"),g=c._getOrigin(n);d.classList.add("tier-list-tracker"),h(d,`${g} - tier ${n.tier+1}`),d.setAttribute("title",n.announce),p.append(d),d=document.createElement("div"),d.classList.add("tier-announce"),h(d,`${i.label}: ${i.value}`),p.append(d),d=document.createElement("div"),d.classList.add("tier-seeders"),h(d,`Seeders: ${n.seeder_count>-1?n.seeder_count:"N/A"}`),p.append(d),d=document.createElement("div"),d.classList.add("tier-state"),h(d,a),p.append(d),d=document.createElement("div"),d.classList.add("tier-leechers"),h(d,`Leechers: ${n.leecher_count>-1?n.leecher_count:"N/A"}`),p.append(d),d=document.createElement("div"),d.classList.add("tier-scrape"),h(d,`${l.label}: ${l.value}`),p.append(d),d=document.createElement("div"),d.classList.add("tier-downloads"),h(d,`Downloads: ${n.download_count>-1?n.download_count:"N/A"}`),p.append(d),r.push(p)}}for(;t.firstChild;)t.firstChild.remove();t.append(...r)}_changeFileCommand(e,t){let{controller:o,file_torrent:r}=this,s=r.getId();o.changeFileCommand(s,e,t)}_onFileWantedToggled(e){let{indices:t,wanted:o}=e;this._changeFileCommand(t,o?"files_wanted":"files_unwanted")}_onFilePriorityToggled(e){let{indices:t,priority:o}=e,r=null;switch(o.toString()){case"-1":r="priority_low";break;case"1":r="priority_high";break;default:r="priority_normal"}this._changeFileCommand(t,r)}_clearFileList(){let{list:e}=this.elements.files;for(;e.firstChild;)e.firstChild.remove();this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null}static createFileTreeModel(e){let t=[],o={children:{},file_indices:[]};for(let[r,s]of e.getFiles().entries()){let{name:n}=s,a=n.split("/"),i=o;for(let[l,p]of a.entries()){let d=i.children[p];d||(i.children[p]=d={children:{},depth:l,file_indices:[],name:p,parent:i}),i=d}i.file_index=r,delete i.children,t.push(i)}for(let r of t){let{file_index:s}=r,n=r;do n.file_indices.push(s),n=n.parent;while(n)}return o}addNodeToView(e,t,o){let r=new se(this.controller,e,o);r.addEventListener("wantedToggled",this._onFileWantedToggled.bind(this)),r.addEventListener("priorityToggled",this._onFilePriorityToggled.bind(this)),this.file_rows.push(r),t.append(r.getElement())}addSubtreeToView(e,t,o){if(o.parent&&this.addNodeToView(e,t,o),o.children)for(let r of Object.values(o.children))this.addSubtreeToView(e,t,r)}_updateFiles(){let{list:e}=this.elements.files,{file_rows:t,file_torrent:o,file_torrent_n:r,torrents:s}=this;if(s.length!==1){this._clearFileList();return}let[n]=s,a=n.getFiles().length;if(n!==o||a!==r){this._clearFileList(),this.file_torrent=n,this.file_torrent_n=a,this.file_rows=[];let i=document.createDocumentFragment(),l=c.createFileTreeModel(n);this.addSubtreeToView(n,i,l),e.append(i)}else for(let i of t)i.refresh()}};var ie=class c extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();e.length!==0&&(this.torrents=e,this.elements=c._create(),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.entry.value=e[0].getDownloadDir(),document.body.append(this.elements.root),this.elements.entry.focus())}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let e=this.torrents.map(o=>o.getId()),t=this.elements.entry.value.trim();this.remote.moveTorrents(e,t),this.close()}static _create(){let e=X("move-dialog");e.root.setAttribute("aria-label","Move Torrent"),e.heading.textContent="Set Torrent Location",confirm.textContent="Apply";let t=document.createElement("label");t.setAttribute("for","torrent-path"),t.textContent="Location:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-path",e.entry=o,e.workarea.append(o),e}};var W=class c extends EventTarget{constructor(e){super(),this.elements=c._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.options=e,document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}static _create(e){let{heading:t,message:o}=e,r=X("confirm-dialog");return r.confirm.remove(),delete r.confirm,r.heading.textContent=t,r.workarea.textContent=o,r}};var x={_DaemonVersion:"version",_DownSpeedLimit:"speed_limit_down",_DownSpeedLimited:"speed_limit_down_enabled",_JsonRpcVersion:"2.0",_QueueMoveBottom:"queue_move_bottom",_QueueMoveDown:"queue_move_down",_QueueMoveTop:"queue_move_top",_QueueMoveUp:"queue_move_up",_Root:"../rpc",_TurtleDownSpeedLimit:"alt_speed_down",_TurtleState:"alt_speed_enabled",_TurtleUpSpeedLimit:"alt_speed_up",_UpSpeedLimit:"speed_limit_up",_UpSpeedLimited:"speed_limit_up_enabled"};function we(c){return c.result??c.error.data.result}var H=class c{_connection_alert=null;_session_id="";constructor(e){this._controller=e}sendRequest(e,t,o){let r=new Headers;r.append("cache-control","no-cache"),r.append("content-type","application/json"),r.append("pragma","no-cache"),this._session_id&&r.append(c._SessionHeader,this._session_id);let s=null;fetch(x._Root,{body:JSON.stringify(e),headers:r,method:"POST"}).then(n=>{switch(s=n,n.status){case 409:{let a=new Error(c._SessionHeader);throw a.header=n.headers.get(c._SessionHeader),a}case 204:return null;default:return n.json()}}).then(n=>{t&&t.call(o,n,s),this._connection_alert&&(this._connection_alert.close(),this._connection_alert=null)}).catch(n=>{if(n.message===c._SessionHeader){this._session_id=n.header,this.sendRequest(e,t,o);return}console.trace(n),this._controller.togglePeriodicSessionRefresh(!1),this._connection_alert=new W({heading:"Connection failed",message:"Could not connect to the server. You may need to reload the page to reconnect."}),this._controller.setCurrentPopup(this._connection_alert)})}loadDaemonPrefs(e,t){let o={id:"webui",jsonrpc:x._JsonRpcVersion,method:"session_get"};this.sendRequest(o,e,t)}checkPort(e,t,o){let r={id:"webui",jsonrpc:x._JsonRpcVersion,method:"port_test",params:{ip_protocol:e}};this.sendRequest(r,t,o)}renameTorrent(e,t,o,r,s){let n={id:"webui",jsonrpc:x._JsonRpcVersion,method:"torrent_rename_path",params:{ids:e,name:o,path:t}};this.sendRequest(n,r,s)}setLabels(e,t,o){let r={ids:e,labels:t};this.sendRequest({id:"webui",jsonrpc:x._JsonRpcVersion,method:"torrent_set",params:r},o)}loadDaemonStats(e,t){let o={id:"webui",jsonrpc:x._JsonRpcVersion,method:"session_stats"};this.sendRequest(o,e,t)}updateTorrents(e,t,o,r){let s={id:"webui",jsonrpc:x._JsonRpcVersion,method:"torrent_get",params:{fields:t,format:"table"}};e&&(s.params.ids=e),this.sendRequest(s,n=>{let a=we(n);o.call(r,a.torrents,a.removed)})}getFreeSpace(e,t,o){let r={id:"webui",jsonrpc:x._JsonRpcVersion,method:"free_space",params:{path:e}};this.sendRequest(r,s=>{let n=we(s);t.call(o,n.path,n.size_bytes)})}changeFileCommand(e,t,o){let r={[o]:t,ids:[e]};this.sendRequest({jsonrpc:x._JsonRpcVersion,method:"torrent_set",params:r},()=>{this._controller.refreshTorrents([e])})}sendTorrentSetRequests(e,t,o,r,s){o||={},o.ids=t;let n={id:"webui",jsonrpc:x._JsonRpcVersion,method:e,params:o};this.sendRequest(n,r,s)}sendTorrentActionRequests(e,t,o,r){this.sendTorrentSetRequests(e,t,null,o,r)}startTorrents(e,t,o,r){let s=t?"torrent_start_now":"torrent_start";this.sendTorrentActionRequests(s,e,o,r)}stopTorrents(e,t,o){this.sendTorrentActionRequests("torrent_stop",e,t,o)}moveTorrents(e,t,o,r){this.sendTorrentSetRequests("torrent_set_location",e,{location:t,move:!0},o,r)}removeTorrents(e,t){let o={jsonrpc:x._JsonRpcVersion,method:"torrent_remove",params:{delete_local_data:t,ids:[]}};if(e)for(let r=0,s=e.length;r{this._controller.refreshTorrents()})}verifyTorrents(e,t,o){this.sendTorrentActionRequests("torrent_verify",e,t,o)}reannounceTorrents(e,t,o){this.sendTorrentActionRequests("torrent_reannounce",e,t,o)}addTorrentByUrl(e,t){/^[\da-f]{40}$/i.test(e)&&(e=`magnet:?xt=urn:btih:${e}`);let o={jsonrpc:x._JsonRpcVersion,method:"torrent_add",params:{filename:e,paused:t.paused}};this.sendRequest(o,()=>{this._controller.refreshTorrents()})}savePrefs(e){let t={jsonrpc:x._JsonRpcVersion,method:"session_set",params:e};this.sendRequest(t,()=>{this._controller.loadDaemonPrefs()})}updateBlocklist(){let e={jsonrpc:x._JsonRpcVersion,method:"blocklist_update"};this.sendRequest(e,()=>{this._controller.loadDaemonPrefs()})}moveTorrentsToTop(e,t,o){this.sendTorrentActionRequests(x._QueueMoveTop,e,t,o)}moveTorrentsToBottom(e,t,o){this.sendTorrentActionRequests(x._QueueMoveBottom,e,t,o)}moveTorrentsUp(e,t,o){this.sendTorrentActionRequests(x._QueueMoveUp,e,t,o)}moveTorrentsDown(e,t,o){this.sendTorrentActionRequests(x._QueueMoveDown,e,t,o)}};H._SessionHeader="X-Transmission-Session-Id";var ze=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!globalThis.MSStream,je=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),Me=!(ze&&je),Y=class extends EventTarget{constructor(e,t,o="",r=null){super(),this.controller=e,this.remote=t,this.elements=this._create(o),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),r&&(this.elements.file_input.files=r),this._updateFreeSpaceInAddDialog(),this.elements.url_input.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_updateFreeSpaceInAddDialog(){let e=this.elements.folder_input.value;this.remote.getFreeSpace(e,(t,o)=>{this.closed||(this.elements.freespace.textContent=o>0?`${G.size(o)} Free`:"")})}_onConfirm(){let{controller:e,elements:t,remote:o}=this,{file_input:r,folder_input:s,start_input:n,url_input:a}=t,i=!n.checked,l=s.value.trim();for(let d of r.files){let g=new FileReader;g.addEventListener("load",u=>{let b=u.target.result,C="base64,",f=b.indexOf(C);if(f===-1)return;let y={id:"webui",jsonrpc:x._JsonRpcVersion,method:"torrent_add",params:{download_dir:l,metainfo:b.slice(Math.max(0,f+C.length)),paused:i}};o.sendRequest(y,I=>{if("error"in I){let A=I.error.data?.errorString??I.error.message;alert(`Error adding "${d.name}": ${A}`),e.setCurrentPopup(new W({heading:`Error adding "${d.name}"`,message:A}))}})}),g.readAsDataURL(d)}let p=a.value.trim();if(p.length>0){/^[\da-f]{40}$/i.test(p)&&(p=`magnet:?xt=urn:btih:${p}`);let d={id:"webui",jsonrpc:x._JsonRpcVersion,method:"torrent_add",params:{download_dir:l,filename:p,paused:i}};o.sendRequest(d,g=>{"error"in g&&e.setCurrentPopup(new W({heading:`Error adding "${p}"`,message:g.error.data?.errorString??g.error.message}))})}this._onDismiss()}_create(e){let t=X(),{confirm:o,root:r,heading:s,workarea:n}=t;r.classList.add("open-torrent"),s.textContent="Add Torrents",o.textContent="Add";let a=Z(),i=document.createElement("label");i.setAttribute("for",a),i.textContent="Please select torrent files to add:",n.append(i);let l=document.createElement("input");l.type="file",l.name="torrent-files[]",l.id=a,l.multiple=!0,Me&&(l.accept=".torrent,application/x-bittorrent"),n.append(l),t.file_input=l,a=Z(),i=document.createElement("label"),i.setAttribute("for",a),i.textContent="Or enter a URL:",n.append(i),l=document.createElement("input"),l.type="url",l.id=a,l.value=e,n.append(l),t.url_input=l,a=Z(),i=document.createElement("label"),i.id="add-dialog-folder-label",i.for=a,i.textContent="Destination folder: ",n.append(i);let p=document.createElement("span");p.id="free-space-text",i.append(p),n.append(i),t.freespace=p,l=document.createElement("input"),l.type="text",l.id="add-dialog-folder-input",l.addEventListener("change",()=>this._updateFreeSpaceInAddDialog()),l.value=this.controller.session_properties.download_dir,n.append(l),t.folder_input=l;let d=document.createElement("div");n.append(d);let g=document.createElement("input");return g.type="checkbox",g.id="auto-start-check",g.checked=this.controller.shouldAddedTorrentsStart(),d.append(g),t.start_input=g,i=document.createElement("label"),i.id="auto-start-label",i.setAttribute("for",g.id),i.textContent="Start when added",d.append(i),t}};function ne(c,e){let t=document.createElement("fieldset");t.classList.add("section",c);let o=document.createElement("legend");return o.classList.add("title"),o.textContent=e,t.append(o),t}function Ie(c,e,t,o){let r=document.createElement("button");return r.textContent=e,r.addEventListener("click",o),c.append(r),r.dataset.action=t,r}var J=class extends EventTarget{constructor(e,t,o,r){super(),this.action_listener=this._onActionChange.bind(this),this.action_manager=r,this.action_manager.addEventListener("change",this.action_listener),this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=t,this.prefs.addEventListener("change",this.prefs_listener),this.closed=!1,this.remote=o,this.name="overflow-menu",this.session_listener=this._onSessionChange.bind(this),this.session_manager=e,this.session_manager.addEventListener("session-change",this.session_listener);let{session_properties:s}=e;Object.assign(this,this._create(s)),this.outside=new _(this.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this),this.show()}show(){document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.session_listener),this.action_manager.removeEventListener("change",this.action_listener),this.prefs.removeEventListener("change",this.prefs_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}_onSessionChange(e){let{alt_speed_check:t}=this.elements,{session_properties:o}=e;t.checked=o[x._TurtleState]}_onPrefsChange(e){switch(e.key){case m.SortDirection:case m.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value;break;default:break}}_onActionChange(e){let t=this.actions[e.action];t&&this._updateElement(t)}_updateElement(e){if(e.dataset.action){let{action:t}=e.dataset,o=this.action_manager.keyshortcuts(t);o&&e.setAttribute("aria-keyshortcuts",o),L(e,this.action_manager.isEnabled(t))}}_onClick(e){let{action:t,pref:o}=e.target.dataset;if(t){this.action_manager.click(t);return}if(o){this.prefs[o]=e.target.value;return}console.log("unhandled"),console.log(e),console.trace()}_create(e){let t={},o={},r=this._onClick.bind(this),s=document.createElement("div");s.classList.add("overflow-menu","popup");let n=document.createElement("div"),a=(I,A)=>{let v=document.createElement("input");v.id=Z(),v.type="checkbox";let F=document.createElement("label");F.htmlFor=v.id,F.textContent=I,n.append(v,F),A(v)},i=ne("display","Display");s.append(i);let l=document.createElement("div");l.id="display-options",i.append(l),n.classList.add("table-row"),l.append(n);let p=document.createElement("label");p.id="display-sort-mode-label",p.textContent="Sort by",n.append(p);let d=document.createElement("select");d.id="display-sort-mode-select",d.dataset.pref=m.SortMode,n.append(d);let g=[[m.SortByActivity,"Activity"],[m.SortByAge,"Age"],[m.SortByName,"Name"],[m.SortByProgress,"Progress"],[m.SortByQueue,"Queue order"],[m.SortByRatio,"Ratio"],[m.SortBySize,"Size"],[m.SortByState,"State"]];for(let[I,A]of g){let v=document.createElement("option");v.value=I,v.textContent=A,d.append(v)}p.htmlFor=d.id,d.value=this.prefs.sort_mode,d.addEventListener("change",I=>{this.prefs.sort_mode=I.target.value}),n=document.createElement("div"),n.classList.add("table-row"),l.append(n);let u=I=>{I.dataset.pref=m.SortDirection,I.checked=this.prefs.sort_direction!==m.SortAscending,I.addEventListener("input",A=>{this.prefs.sort_direction=A.target.checked?m.SortDescending:m.SortAscending})};a("Reverse sort",u),n=document.createElement("div"),n.classList.add("table-row"),l.append(n),u=I=>{I.checked=this.prefs.display_mode===m.DisplayCompact,I.addEventListener("change",A=>{let{checked:v}=A.target;this.prefs.display_mode=v?m.DisplayCompact:m.DisplayFull})},a(this.action_manager.text("toggle-compact-rows"),u),n=document.createElement("div"),n.classList.add("table-row","display-fullscreen-row"),l.append(n),u=I=>{let A=()=>document.fullscreenElement!==null;I.checked=A(),document.addEventListener("fullscreenchange",()=>{I.checked=A()}),I.addEventListener("change",()=>{A()?document.exitFullscreen():document.body.requestFullscreen()})},a("Fullscreen",u);let b=this.action_manager.text("open-appearance-settings");n=Ie(i,b,"open-appearance-settings",r),l.append(n),i=ne("speed","Speed Limit"),s.append(i),l=document.createElement("div"),l.id="speed-options",i.append(l),n=document.createElement("div"),n.classList.add("speed-up"),l.append(n),p=document.createElement("label"),p.id="speed-up-label",p.textContent="Upload:",n.append(p);let C="Unlimited";d=document.createElement("select"),d.id="speed-up-select",n.append(d);let f=["50","100","250","500","1000","2500","5000","10000",C];for(let I of[...new Set(f).add(`${e[x._UpSpeedLimit]}`).values()].toSorted((A,v)=>A-v)){let A=document.createElement("option");A.value=I,A.textContent=I===C?C:G.speed(I),d.append(A)}p.htmlFor=d.id,d.value=e[x._UpSpeedLimited]?`${e[x._UpSpeedLimit]}`:C,d.addEventListener("change",I=>{let{value:A}=I.target;console.log(I),A===C?this.remote.savePrefs({[x._UpSpeedLimited]:!1}):this.remote.savePrefs({[x._UpSpeedLimited]:!0,[x._UpSpeedLimit]:Number.parseInt(A,10)})}),n=document.createElement("div"),n.classList.add("speed-down"),l.append(n),p=document.createElement("label"),p.id="speed-down-label",p.textContent="Download:",n.append(p),d=document.createElement("select"),d.id="speed-down-select",n.append(d);for(let I of[...new Set(f).add(`${e[x._DownSpeedLimit]}`).values()].toSorted((A,v)=>A-v)){let A=document.createElement("option");A.value=I,A.textContent=I===C?C:G.speed(I),d.append(A)}p.htmlFor=d.id,d.value=e[x._DownSpeedLimited]?`${e[x._DownSpeedLimit]}`:C,d.addEventListener("change",I=>{let{value:A}=I.target;console.log(I),A===C?this.remote.savePrefs({[x._DownSpeedLimited]:!1}):this.remote.savePrefs({[x._DownSpeedLimited]:!0,[x._DownSpeedLimit]:Number.parseInt(A,10)})}),n=document.createElement("div"),n.classList.add("alt-speed"),l.append(n),u=I=>{I.checked=e[x._TurtleState],o.alt_speed_check=I,I.addEventListener("change",M=>{this.remote.savePrefs({[x._TurtleState]:M.target.checked})});let A=document.createElement("label");A.htmlFor=I.id,A.id="alt-speed-image";let v=document.createElement("label");v.htmlFor=I.id;let F=G.speed(e[x._TurtleUpSpeedLimit]),U=G.speed(e[x._TurtleDownSpeedLimit]);v.textContent=`(${F} up, ${U} down)`,n.append(A,v)},a("Use Temp limits",u),i=ne("actions","Actions"),s.append(i);for(let I of["show-preferences-dialog","show-shortcuts-dialog","pause-all-torrents","start-all-torrents"]){let A=this.action_manager.text(I);t[I]=Ie(i,A,I,r)}i=ne("help","Help"),s.append(i),l=document.createElement("div"),i.append(l);for(let I of["show-statistics-dialog","show-about-dialog"]){let A=this.action_manager.text(I);t[I]=Ie(l,A,I,r)}let y=document.createElement("a");return y.href="https://transmissionbt.com/donate.html",y.target="_blank",y.textContent="Donate",l.append(y),this._updateElement=this._updateElement.bind(this),{actions:t,elements:o,root:s}}};var ae=class c extends EventTarget{static _initTimeDropDown(e){for(let t=0;t<96;++t){let o=t/4|0,r=t%4*15,s=t*15,n=`${o}:${r||"00"}`;e.options[t]=new Option(n,s)}}static _initDayDropDown(e){let t=[["Everyday","127"],["Weekdays","62"],["Weekends","65"],["Sunday","1"],["Monday","2"],["Tuesday","4"],["Wednesday","8"],["Thursday","16"],["Friday","32"],["Saturday","64"]];for(let o=0;t[o];++o){let[r,s]=t[o];e.options[o]=new Option(r,s)}}_checkPort(){for(let[e,t]of Object.entries(this.elements.network.port_status_label))delete t.dataset.open,h(t,"Checking..."),this.remote.checkPort(e,o=>this._onPortChecked(e,o),this)}_onPortChecked(e,t){if(this.closed)return;let o=t.result??t.error?.data??{},r=this.elements.network.port_status_label[e],s=o.port_is_open??!1;r.dataset.open=s,"port_is_open"in o?h(r,s?"Open":"Closed"):h(r,"Error")}_setBlocklistButtonEnabled(e){let t=this.elements.peers.blocklist_update_button;L(t,e),t.value=e?"Update":"Updating..."}static _getValue(e){if(e.tagName==="TEXTAREA")return e.value;switch(e.type){case"checkbox":case"radio":return e.checked;case"number":case"select-one":case"text":case"url":{let t=e.value;return Number.parseInt(t,10).toString()===t?Number.parseInt(t,10):Number.parseFloat(t).toString()===t?Number.parseFloat(t):t}default:return null}}_onMaybePortChanged(e){(e==="peer_port"||e==="port_forwarding_enabled")&&this._checkPort()}_onControlChanged(e){let{key:t}=e.target.dataset;this.remote.savePrefs({[t]:c._getValue(e.target)}),this._onMaybePortChanged(t)}_onDialogClosed(){this.dispatchEvent(new Event("closed"))}_update(){this._setBlocklistButtonEnabled(!0);for(let[e,t]of Object.entries(this.session_manager.session_properties))for(let o of this.elements.root.querySelectorAll(`[data-key="${e}"]`)){if(e==="blocklist_size"){let r=G.number(t);o.innerHTML=`Blocklist has ${r} rules`,h(this.elements.peers.blocklist_update_button,"Update")}else switch(o.type){case"checkbox":case"radio":o.checked=t;break;case"text":case"textarea":case"url":case"email":case"number":case"search":o!==document.activeElement&&(o.value!=t&&this._onMaybePortChanged(e),o.value=t);break;case"select-one":o.value=t;break;default:console.log(o.type);break}o.dispatchEvent(new Event("session-change"))}}static _createCheckAndLabel(e,t){let o=document.createElement("div");o.id=e;let r=document.createElement("input");r.id=Z(),r.type="checkbox",o.append(r);let s=document.createElement("label");return s.textContent=t,s.setAttribute("for",r.id),o.append(s),{check:r,label:s,root:o}}static _enableIfChecked(e,t){let o=()=>{e.tagName==="INPUT"?L(e,t.checked):e.classList.toggle("disabled",!t.checked)};t.addEventListener("session-change",o),o()}static _getProtocolHandlerRegistered(){return localStorage.getItem("protocol-handler-registered")==="true"}static _updateProtocolHandlerButton(e){e.removeAttribute("disabled"),e.removeAttribute("title"),c._getProtocolHandlerRegistered()?(e.textContent="Remove Browser Handler","unregisterProtocolHandler"in navigator||e.setAttribute("title","Your browser does not support removing protocol handlers. This button only allows you to re-register a handler.")):(e.textContent="Add Browser Handler",e.removeAttribute("title"),"registerProtocolHandler"in navigator||(e.setAttribute("disabled",!0),e.setAttribute("title","Your browser does not support protocol handlers")))}static _toggleProtocolHandler(e){let t=new URL(globalThis.location.href);t.search="addtorrent=%s",this._getProtocolHandlerRegistered()?(navigator.unregisterProtocolHandler?.("magnet",t.toString()),localStorage.removeItem("protocol-handler-registered"),c._updateProtocolHandlerButton(e)):(navigator.registerProtocolHandler("magnet",t.toString(),"Transmission Web"),localStorage.setItem("protocol-handler-registered","true"),c._updateProtocolHandlerButton(e))}static _createTorrentsPage(){let e=document.createElement("div");e.classList.add("prefs-torrents-page");let t=document.createElement("div");t.textContent="Downloading",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Download to:",e.append(t);let o=document.createElement("input");o.type="text",o.id=Z(),o.dataset.key="download_dir",t.setAttribute("for",o.id),e.append(o);let r=o,s=c._createCheckAndLabel("incomplete-dir-div","Use temporary folder:");s.check.title="Separate folder to temporarily store downloads until they are complete.",s.check.dataset.key="incomplete_dir_enabled",s.label.title=s.check.title,e.append(s.root);let n=s.check;o=document.createElement("input"),o.type="text",o.dataset.key="incomplete_dir",e.append(o),c._enableIfChecked(o,s.check);let a=o;s=c._createCheckAndLabel("autostart-div","Start when added"),s.check.dataset.key="start_added_torrents",e.append(s.root);let i=s.check;s=c._createCheckAndLabel("suffix-div",`Append "part" to incomplete files' names`),s.check.dataset.key="rename_partial_files",e.append(s.root);let l=s.check;s=c._createCheckAndLabel("download-queue-div","Download queue size:"),s.check.dataset.key="download_queue_enabled",e.append(s.root);let p=s.check;o=document.createElement("input"),o.type="number",o.dataset.key="download_queue_size",e.append(o),c._enableIfChecked(o,s.check);let d=o;t=document.createElement("div"),t.textContent="Seeding",t.classList.add("section-label"),e.append(t),s=c._createCheckAndLabel("stop-ratio-div","Stop seeding at ratio:"),s.check.dataset.key="seed_ratio_limited",e.append(s.root);let g=s.check;o=document.createElement("input"),o.type="number",o.min="0.1",o.step="any",o.dataset.key="seed_ratio_limit",e.append(o),c._enableIfChecked(o,s.check);let u=o;s=c._createCheckAndLabel("stop-idle-div","Stop seeding if idle for N mins:"),s.check.dataset.key="idle_seeding_limit_enabled",e.append(s.root);let b=s.check;o=document.createElement("input"),o.type="number",o.min="0.1",o.step="any",o.dataset.key="idle_seeding_limit",e.append(o),c._enableIfChecked(o,s.check);let C=o;t=document.createElement("div"),t.textContent="Magnet Protocol Handler",t.classList.add("section-label"),e.append(t);let f=document.createElement("button");return f.classList.add("register-handler-button"),c._updateProtocolHandlerButton(f),e.append(f),{autostart_check:i,download_dir:r,download_queue_check:p,download_queue_input:d,incomplete_dir_check:n,incomplete_dir_input:a,register_handler_button:f,root:e,stop_idle_check:b,stop_idle_input:C,stop_ratio_check:g,stop_ratio_input:u,suffix_check:l}}static _createSpeedPage(){let e=document.createElement("div");e.classList.add("prefs-speed-page");let t=document.createElement("div");t.textContent="Speed Limits",t.classList.add("section-label"),e.append(t);let o=c._createCheckAndLabel("upload-speed-div","Upload (kB/s):");o.check.dataset.key="speed_limit_up_enabled",e.append(o.root);let r=o.check,s=document.createElement("input");s.type="number",s.dataset.key="speed_limit_up",e.append(s),c._enableIfChecked(s,o.check);let n=s;o=c._createCheckAndLabel("download-speed-div","Download (kB/s):"),o.check.dataset.key="speed_limit_down_enabled",e.append(o.root);let a=o.check;s=document.createElement("input"),s.type="number",s.dataset.key="speed_limit_down",e.append(s),c._enableIfChecked(s,o.check);let i=s;t=document.createElement("div"),t.textContent="Alternative Speed Limits",t.classList.add("section-label","alt-speed-section-label"),e.append(t),t=document.createElement("div"),t.textContent="Override normal speed limits manually or at scheduled times",t.classList.add("alt-speed-label"),e.append(t),t=document.createElement("label"),t.textContent="Upload (kB/s):",e.append(t),s=document.createElement("input"),s.type="number",s.dataset.key="alt_speed_up",s.id=Z(),t.setAttribute("for",s.id),e.append(s);let l=s;t=document.createElement("label"),t.textContent="Download (kB/s):",e.append(t),s=document.createElement("input"),s.type="number",s.dataset.key="alt_speed_down",s.id=Z(),t.setAttribute("for",s.id),e.append(s);let p=s;o=c._createCheckAndLabel("alt-times-div","Scheduled times"),o.check.dataset.key="alt_speed_time_enabled",e.append(o.root);let d=o.check;t=document.createElement("label"),t.textContent="From:",c._enableIfChecked(t,o.check),e.append(t);let g=document.createElement("select");g.id=Z(),g.dataset.key="alt_speed_time_begin",c._initTimeDropDown(g),t.setAttribute("for",g.id),e.append(g),c._enableIfChecked(g,o.check);let u=g;t=document.createElement("label"),t.textContent="To:",c._enableIfChecked(t,o.check),e.append(t),g=document.createElement("select"),g.id=Z(),g.dataset.key="alt_speed_time_end",c._initTimeDropDown(g),t.setAttribute("for",g.id),e.append(g),c._enableIfChecked(g,o.check);let b=g;return t=document.createElement("label"),t.textContent="On days:",c._enableIfChecked(t,o.check),e.append(t),g=document.createElement("select"),g.id=Z(),g.dataset.key="alt_speed_time_day",c._initDayDropDown(g),t.setAttribute("for",g.id),e.append(g),c._enableIfChecked(g,o.check),{alt_days_select:g,alt_download_speed_input:p,alt_from_select:u,alt_times_check:d,alt_to_select:b,alt_upload_speed_input:l,download_speed_check:a,download_speed_input:i,root:e,upload_speed_check:r,upload_speed_input:n}}static _createPeersPage(){let e=document.createElement("div");e.classList.add("prefs-peers-page");let t=document.createElement("div");t.textContent="Connections",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Max peers per torrent:",e.append(t);let o=document.createElement("input");o.type="number",o.dataset.key="peer_limit_per_torrent",o.id=Z(),t.setAttribute("for",o.id),e.append(o);let r=o;t=document.createElement("label"),t.textContent="Max peers overall:",e.append(t),o=document.createElement("input"),o.type="number",o.dataset.key="peer_limit_global",o.id=Z(),t.setAttribute("for",o.id),e.append(o);let s=o;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Encryption mode:",e.append(t);let n=document.createElement("select");n.id=Z(),n.dataset.key="encryption",n.options[0]=new Option("Prefer encryption","preferred"),n.options[1]=new Option("Allow encryption","tolerated"),n.options[2]=new Option("Require encryption","required"),e.append(n);let a=n,i=c._createCheckAndLabel("use-pex-div","Use PEX to find more peers");i.check.title="PEX is a tool for exchanging peer lists with the peers you're connected to.",i.check.dataset.key="pex_enabled",i.label.title=i.check.title,e.append(i.root);let l=i.check;i=c._createCheckAndLabel("use-dht-div","Use DHT to find more peers"),i.check.title="DHT is a tool for finding peers without a tracker.",i.check.dataset.key="dht_enabled",i.label.title=i.check.title,e.append(i.root);let p=i.check;i=c._createCheckAndLabel("use-lpd-div","Use LPD to find more peers"),i.check.title="LPD is a tool for finding peers on your local network.",i.check.dataset.key="lpd_enabled",i.label.title=i.check.title,e.append(i.root);let d=i.check;t=document.createElement("div"),t.textContent="Blocklist",t.classList.add("section-label"),e.append(t),i=c._createCheckAndLabel("blocklist-enabled-div","Enable blocklist:"),i.check.dataset.key="blocklist_enabled",e.append(i.root);let g=i.check;o=document.createElement("input"),o.type="url",o.value="http://www.example.com/blocklist",o.dataset.key="blocklist_url",e.append(o),c._enableIfChecked(o,i.check);let u=o;t=document.createElement("label"),t.textContent="Blocklist has {n} rules",t.dataset.key="blocklist_size",t.classList.add("blocklist-size-label"),c._enableIfChecked(t,i.check),e.append(t);let b=document.createElement("button");return b.classList.add("blocklist-update-button"),b.textContent="Update",e.append(b),c._enableIfChecked(b,i.check),{blocklist_enabled_check:g,blocklist_update_button:b,blocklist_url_input:u,dht_check:p,encryption_select:a,lpd_check:d,max_peers_overall_input:s,max_peers_per_torrent_input:r,pex_check:l,root:e}}static _createNetworkPage(){let e=document.createElement("div");e.classList.add("prefs-network-page");let t=document.createElement("div");t.textContent="Listening Port",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Peer listening port:",e.append(t);let o=document.createElement("input");o.type="number",o.dataset.key="peer_port",o.id=Z(),t.setAttribute("for",o.id),e.append(o);let r=o,s=document.createElement("div");s.classList.add("port-status"),t=document.createElement("label"),t.textContent="IPv4 port is",s.append(t);let n=document.createElement("label");n.textContent="?",n.classList.add("port-status-label"),s.append(n),s.append(document.createElement("br")),t=document.createElement("label"),t.textContent="IPv6 port is",s.append(t);let a=document.createElement("label");a.textContent="?",a.classList.add("port-status-label"),s.append(a),e.append(s);let i=c._createCheckAndLabel("randomize-port","Randomize port on launch");i.check.dataset.key="peer_port_random_on_start",e.append(i.root);let l=i.check;i=c._createCheckAndLabel("port-forwarding","Use port forwarding from my router"),i.check.dataset.key="port_forwarding_enabled",e.append(i.root);let p=i.check;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),i=c._createCheckAndLabel("utp-enabled","Enable uTP for peer communication"),i.check.dataset.key="utp_enabled",e.append(i.root);let d=i.check;t=document.createElement("div"),t.textContent="Default Public Trackers",t.classList.add("section-label"),e.append(t);let g=["Trackers to use on all public torrents.","To add a backup URL, add it on the next line after a primary URL.","To add a new primary URL, add it after a blank line."];for(let C of g)t=document.createElement("label"),t.classList.add("default-trackers-label"),t.textContent=C,t.setAttribute("for","default-trackers"),e.append(t);let u=document.createElement("textarea");return u.dataset.key="default_trackers",u.id="default-trackers",e.append(u),{default_trackers_textarea:u,port_forwarding_check:p,port_input:r,port_status_label:{ipv4:n,ipv6:a},random_port_check:l,root:e,utp_check:d}}static _create(){let e={network:c._createNetworkPage(),peers:c._createPeersPage(),speed:c._createSpeedPage(),torrents:c._createTorrentsPage()};return{...K("prefs-dialog",[["prefs-tab-torrent",e.torrents.root,"Torrents"],["prefs-tab-speed",e.speed.root,"Speed"],["prefs-tab-peers",e.peers.root,"Peers"],["prefs-tab-network",e.network.root,"Network"]]),...e}}constructor(e,t){super(),this.closed=!1,this.session_manager=e,this.remote=t,this.update_from_session=()=>this._update(),this.elements=c._create(),this.elements.peers.blocklist_update_button.addEventListener("click",s=>{h(s.target,"Updating blocklist..."),this.remote.updateBlocklist(),this._setBlocklistButtonEnabled(!1)}),this.elements.torrents.register_handler_button.addEventListener("click",s=>{c._toggleProtocolHandler(s.currentTarget)}),this.elements.dismiss.addEventListener("click",()=>this.close()),this.outside=new _(this.elements.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this);let o=this._onControlChanged.bind(this),r=s=>{for(let n of Object.values(s))if(n.tagName==="INPUT")switch(n.type){case"checkbox":case"radio":case"number":case"text":case"url":n.addEventListener("change",o);break;default:console.trace(`unhandled input: ${n.type}`);break}else(n.tagName==="TEXTAREA"||n.tagName==="SELECT")&&n.addEventListener("change",o)};r(this.elements.network),r(this.elements.peers),r(this.elements.speed),r(this.elements.torrents),this.session_manager.addEventListener("session-change",this.update_from_session),this.update_from_session(),document.body.append(this.elements.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.update_from_session),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}};var ce=class c extends EventTarget{constructor(e){super(),this.options=e,this.elements=c._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_onConfirm(){let{remote:e,torrents:t,trash:o}=this.options;t.length>0&&e.removeTorrents(t,o),this.close()}static _create(e){let{trash:t}=e,{heading:o,message:r}=c._createMessage(e),s=X("remove-dialog");return s.heading.textContent=o,s.message.textContent=r,s.confirm.textContent=t?"Trash":"Remove",s}static _createMessage(e){let t=null,o=null,{torrents:r,trash:s}=e,[n]=r;return s&&r.length===1?(t=`Remove ${n.getName()} and delete data?`,o="All data downloaded for this torrent will be deleted. Are you sure you want to remove it?"):s?(t=`Remove ${r.length} transfers and delete data?`,o="All data downloaded for these torrents will be deleted. Are you sure you want to remove them?"):r.length===1?(t=`Remove ${n.getName()}?`,o="Once removed, continuing the transfer will require the torrent file. Are you sure you want to remove it?"):(t=`Remove ${r.length} transfers?`,o="Once removed, continuing the transfers will require the torrent files. Are you sure you want to remove them?"),{heading:t,message:o}}};var le=class c extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length!==1){console.trace();return}let{handler:t}=this.controller;this.torrents=e,this.elements=c._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=t===null?e[0].getName():t.subtree.name,document.body.append(this.elements.root),this.elements.entry.focus()}close(){let{handler:e}=this.controller;e&&e.classList.remove("selected"),this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let{handler:e}=this.controller,[t]=this.torrents,o=e?e.file_path:t.getName(),r=this.elements.entry.value;this.remote.renameTorrent([t.getId()],o,r,s=>{if("result"in s){let n=s.result;if(e)if(e.subtree.name=n.name,h(e.name_container,n.name),e.subdir){let a=t.getIndividualFile(o);if(a){let i=a.name.slice(0,Math.max(0,a.name.lastIndexOf("/")+1));a.name=`${i}${n.name}`}}else t.refresh(n);else t.refresh(n)}else{let n=s.error,a=n.data?.errorString??n.message??"",i=new W({heading:`Error renaming "${o}"`,message:`${a} (${n.code}`});this.controller.setCurrentPopup(i)}delete this.controller}),this.close()}static _create(){let e=X("rename-dialog");e.root.setAttribute("aria-label","Rename Torrent"),e.heading.textContent="Enter new name:",e.confirm.textContent="Rename";let t=document.createElement("label");t.setAttribute("for","torrent-rename-name"),t.textContent="Enter new name:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-rename-name",e.entry=o,e.workarea.append(o),e}};var de=class c extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length===0){console.error("At least one selected torrent expected.");return}let[t]=e;this.torrents=e,this.elements=c._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=t.getLabels().join(", "),document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let{torrents:e}=this,{remote:t}=this,o=e.map(i=>i.getId()),{elements:r}=this,{entry:s}=r,{value:n}=s,a=n.split(",").map(i=>i.trim()).filter(i=>i.length>0);t.setLabels(o,a,i=>{if(i.result==="success")for(let l of e)l.refresh({labels:a})}),this.close()}static _create(){let e=X("labels-dialog");e.root.setAttribute("aria-label","Edit Labels"),e.heading.textContent="Edit Labels:",e.confirm.textContent="Save";let t=document.createElement("label");t.setAttribute("for","torrent-labels"),t.textContent="Labels:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-labels",e.entry=o,e.workarea.append(o),e}};var ge=class c extends EventTarget{constructor(e){super(),this.elements=c._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onDismiss(){this.close()}static _create(e){let t=X("shortcuts-dialog");t.root.setAttribute("aria-label","Keyboard Shortcuts");let o=document.createElement("table"),r=document.createElement("thead");o.append(r);let s=document.createElement("tr");r.append(s);let n=document.createElement("th");n.textContent="Key",s.append(n),n=document.createElement("th"),n.textContent="Action",s.append(n);let a=document.createElement("tbody");o.append(a);let i={};for(let[l,p]of e.allShortcuts().entries()){let d=l.split("+"),g=[d.pop(),...d].join("+");i[g]={name:p,shortcut:l}}for(let[,l]of Object.entries(i).toSorted()){let{name:p,shortcut:d}=l;s=document.createElement("tr"),a.append(s);let g=document.createElement("td");g.textContent=d.replaceAll("+"," + "),s.append(g),g=document.createElement("td"),g.textContent=e.text(p),s.append(g)}return t.heading.textContent="Transmission",t.dismiss.textContent="Close",t.heading.textContent="Keyboard shortcuts",t.message.append(o),t.confirm.remove(),delete t.confirm,t}};var pe=class c extends EventTarget{constructor(e){super(),this.remote=e;let t=()=>this.remote.loadDaemonStats(r=>this._update(r.result)),o=5e3;this.interval=setInterval(t,o),t(),this.elements=c._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_update(e){console.log(e);let t=G,o=e.current_stats,r=S.ratio(o.uploaded_bytes,o.downloaded_bytes);h(this.elements.session.up,t.size(o.uploaded_bytes)),h(this.elements.session.down,t.size(o.downloaded_bytes)),this.elements.session.ratio.innerHTML=t.ratioString(r),h(this.elements.session.time,t.timeInterval(o.seconds_active)),o=e.cumulative_stats,r=S.ratio(o.uploaded_bytes,o.downloaded_bytes),h(this.elements.total.up,t.size(o.uploaded_bytes)),h(this.elements.total.down,t.size(o.downloaded_bytes)),this.elements.total.ratio.innerHTML=t.ratioString(r),h(this.elements.total.time,t.timeInterval(o.seconds_active))}static _create(){let e=X("statistics-dialog"),{confirm:t,dismiss:o,heading:r,root:s,workarea:n}=e;t.remove(),o.textContent="Close",delete e.confirm;let a="Statistics";s.setAttribute("aria-label",a),r.textContent=a;let i=["Uploaded:","Downloaded:","Ratio:","Running time:"],l=be("Current session",i),[p,d,g,u]=l.children,b=e.session={};b.up=p,b.down=d,b.ratio=g,b.time=u,n.append(l.root),l=be("Total",i);let[C,f,y,I]=l.children,A=e.total={};return A.up=C,A.down=f,A.ratio=y,A.time=I,n.append(l.root),e}};var w={formatETA:c=>{let e=c.getETA();return e<0||e>=999*60*60?"":`ETA: ${G.timeInterval(e,1)}`},formatLabels:(c,e)=>{let t=c.getLabels();e.innerHTML="";for(let o of t){let r=document.createElement("span");r.classList.add("torrent-label"),r.textContent=o,e.append(r)}},getProgressInfo:(c,e)=>{let t=e.getStatus(),o=["torrent-progress-bar"],r=100,s=null;if(t===B._StatusStopped&&o.push("paused"),e.needsMetaData())o.push("magnet"),r=e.getMetadataPercentComplete()*100;else if(t===B._StatusCheck)o.push("verify"),r=e.getRecheckProgress()*100;else if(e.getLeftUntilDone()>0)o.push("leech"),r=e.getPercentDone()*100;else if(o.push("seed"),t!==B._StatusStopped){let n=e.seedRatioLimit(c);s=n>0?e.getUploadRatio()*100/n:100}return e.isQueued()&&o.push("queued"),{classList:o,percent:r,ratio:s}},renderProgressbar:(c,e,t)=>{let o=w.getProgressInfo(c,e),r=Math.min(o.ratio||o.percent,100),s=`${G.percentString(r,2)}%`;t.className=o.classList.join(" "),t.style.setProperty("--progress",s),t.dataset.progress=o.ratio?"100%":s},symbol:{down:"\u25BC",up:"\u25B2"},updateIcon:(c,e)=>{c.dataset.iconMimeType=e.getPrimaryMimeType().split("/",1).pop(),c.dataset.iconMultifile=e.getFileCount()>1?"true":"false"}},z=class c{static renderPeerDetails(e,t){let o=G,r=e.getError()!==B._ErrNone;t.classList.toggle("error",r);let s=e.getErrorMessage();if(s)h(t,s);else if(e.isDownloading()){let n=e.getPeersConnected(),a=e.getWebseedsSendingToUs(),i=["Downloading from"];n&&(i.push(e.getPeersSendingToUs(),"of",o.countString("peer","peers",n)),a&&i.push("and")),a&&i.push(o.countString("web seed","web seeds",a)),i.push("-",w.symbol.down,o.speedBps(e.getDownloadSpeed()),w.symbol.up,o.speedBps(e.getUploadSpeed())),h(t,i.join(" "))}else if(e.isSeeding()){let n=["Seeding to",e.getPeersGettingFromUs(),"of",o.countString("peer","peers",e.getPeersConnected()),"-",w.symbol.up,o.speedBps(e.getUploadSpeed())].join(" ");h(t,n)}else if(e.isChecking()){let n=["Verifying local data (",o.percentString(100*e.getRecheckProgress(),1),"% tested)"].join("");h(t,n)}else h(t,e.getStateString())}static renderProgressDetails(e,t,o){let r=G;if(t.needsMetaData()){let l="retrieving";t.isStopped()&&(l="needs");let p=100*t.getMetadataPercentComplete(),d=["Magnetized transfer - ",l," metadata (",r.percentString(p,1),"%)"].join("");h(o,d);return}let s=t.getSizeWhenDone(),n=t.getTotalSize(),a=t.isDone()||t.isSeeding(),i=[];if(a?(n===s?i.push(r.size(n)):i.push(r.size(s)," of ",r.size(t.getTotalSize())," (",t.getPercentDoneStr(),"%)"),i.push(", uploaded ",r.size(t.getUploadedEver())," (Ratio: ",r.ratioString(t.getUploadRatio()),")")):i.push(r.size(s-t.getLeftUntilDone())," of ",r.size(s)," (",t.getPercentDoneStr(),"%)"),!t.isStopped()&&(!a||t.seedRatioLimit(e)>0)){i.push(" - ");let l=t.getETA();l<0||l>=999*60*60?i.push("remaining time unknown"):i.push(r.timeInterval(t.getETA(),1)," remaining")}h(o,i.join(""))}render(e,t,o){let r=t.isStopped();o.classList.toggle("paused",r);let{labels:s,name:n,peer_details:a,progressbar:i,progress_details:l}=o;h(n,t.getName()),w.formatLabels(t,s),c.renderProgressDetails(e,t,l),w.renderProgressbar(e,t,i),c.renderPeerDetails(t,a)}createRow(e){let t=document.createElement("li");t.className="torrent";let o=[["icon","icon"],["name","torrent-name"],["labels","torrent-labels"],["progress_details","torrent-progress-details"],["progressbar","torrent-progress-bar"],["peer_details","torrent-peer-details"]];for(let[r,s]of o){let n=document.createElement("div");n.className=s,t.append(n),t[r]=n}return w.updateIcon(t.icon,e),t}},j=class c{static renderPeerDetails(e,t){let o=G,r=e.getError()!==B._ErrNone;t.classList.toggle("error",r);let s=e.getErrorMessage();if(s)h(t,s);else if(e.isDownloading()){let n=e.getDownloadSpeed()>0,a=e.getUploadSpeed()>0;if(!a&&!n)h(t,"Idle");else{let i=[w.formatETA(e)];n&&i.push(w.symbol.down,o.speedBps(e.getDownloadSpeed())),a&&i.push(w.symbol.up,o.speedBps(e.getUploadSpeed())),h(t,i.join(" "))}}else if(e.isSeeding()){let n=["Ratio:",o.ratioString(e.getUploadRatio()),"-",w.symbol.up,o.speedBps(e.getUploadSpeed())].join(" ");h(t,n)}else h(t,e.getStateString())}render(e,t,o){o.classList.toggle("paused",t.isStopped());let{labels:r,name:s,peer_details:n,progressbar:a}=o;h(s,t.getName()),w.formatLabels(t,r),c.renderPeerDetails(t,n),w.renderProgressbar(e,t,a),a.classList.add("compact")}createRow(e){let t=document.createElement("li");t.className="torrent compact";let o=[["icon","icon"],["name","torrent-name compact"],["labels","torrent-labels compact"],["peer_details","torrent-peer-details compact"],["progressbar","torrent-progress-bar compact"]];for(let[r,s]of o){let n=document.createElement("div");n.className=s,t.append(n),t[r]=n}return w.updateIcon(t.icon,e),t}};var Qe=xe(Le(),1);var ue=class c extends EventTarget{constructor(e,t,o){super(),this.action_manager=e,this.handler=null,this.notifications=t,this.prefs=o,this.remote=new H(this),this.speed={down:document.querySelector("#speed-down"),up:document.querySelector("#speed-up")};for(let[a,i]of[["#toolbar-open","open"],["#toolbar-delete","delete"],["#toolbar-start","start"],["#toolbar-pause","pause"],["#toolbar-inspector","inspector"],["#toolbar-overflow","overflow"]])document.querySelector(a).prepend($[i](),document.createElement("BR"));document.querySelector(".speed-container").append($.speedDown()),document.querySelector(".speed-container + .speed-container").append($.speedUp()),this.addEventListener("torrent-selection-changed",a=>this.action_manager.update(a)),this.filterText="",this._torrents={},this._selectedTorrentIds=new Set,this._torrentOrder=[],this._clusterize=null,this.oldTrackers=[],this.changeStatus=!1,this.refilterAllSoon=R(()=>this._refilter()),this.pointer_device=Object.seal({is_touch_device:"ontouchstart"in globalThis,long_press_callback:null,x:0,y:0}),this.popup=Array.from({length:c.max_popups}).fill(null),this.busytyping=!1;for(let a of document.querySelectorAll("button[data-action]")){let{action:i}=a.dataset;L(a,this.action_manager.isEnabled(i)),a.addEventListener("click",()=>{this.action_manager.click(i)})}document.querySelector("#filter-tracker").addEventListener("change",a=>{this.setFilterTracker(a.target.value)}),this.action_manager.addEventListener("change",a=>{for(let i of document.querySelectorAll(`[data-action="${a.action}"]`))L(i,a.enabled)}),this.action_manager.addEventListener("click",a=>{switch(a.action){case"copy-name":navigator.clipboard?navigator.clipboard.writeText(this.handler.subtree.name):prompt("Select all then copy",this.handler.subtree.name),this.handler.classList.remove("selected");break;case"deselect-all":this._deselectAll();break;case"move-bottom":this._moveBottom();break;case"move-down":this._moveDown();break;case"move-top":this._moveTop();break;case"move-up":this._moveUp();break;case"open-appearance-settings":this.popup[c.default_popup_level]instanceof D?this.popup[c.default_popup_level].close():this.setCurrentPopup(new D(this.prefs,this.action_manager));break;case"open-torrent":this.setCurrentPopup(new Y(this,this.remote));break;case"pause-all-torrents":this._stopTorrents(this._getAllTorrents());break;case"pause-selected-torrents":this._stopTorrents(this.getSelectedTorrents());break;case"reannounce-selected-torrents":this._reannounceTorrents(this.getSelectedTorrents());break;case"remove-selected-torrents":this._removeSelectedTorrents(!1);break;case"resume-selected-torrents":this._startSelectedTorrents(!1);break;case"resume-selected-torrents-now":this._startSelectedTorrents(!0);break;case"select-all":this._selectAll();break;case"show-about-dialog":this.setCurrentPopup(new oe(this.version_info));break;case"show-inspector":this.popup[0]instanceof E?this.popup[0].close():this.setCurrentPopup(new E(this),0);break;case"show-move-dialog":this.setCurrentPopup(new ie(this,this.remote));break;case"show-overflow-menu":this.popup[c.default_popup_level]instanceof J?this.popup[c.default_popup_level].close():this.setCurrentPopup(new J(this,this.prefs,this.remote,this.action_manager));break;case"show-preferences-dialog":this.setCurrentPopup(new ae(this,this.remote),0);break;case"show-shortcuts-dialog":this.setCurrentPopup(new ge(this.action_manager));break;case"show-statistics-dialog":this.setCurrentPopup(new pe(this.remote));break;case"show-rename-dialog":this.setCurrentPopup(new le(this,this.remote));break;case"show-labels-dialog":this.setCurrentPopup(new de(this,this.remote));break;case"start-all-torrents":this._startTorrents(this._getAllTorrents());break;case"toggle-compact-rows":this.prefs.display_mode=this.prefs.display_mode===m.DisplayCompact?m.DisplayFull:m.DisplayCompact;break;case"trash-selected-torrents":this._removeSelectedTorrents(!0);break;case"verify-selected-torrents":this._verifyTorrents(this.getSelectedTorrents());break;default:console.warn(`unhandled action: ${a.action}`)}});let r=document.querySelector("#filter-mode");V(r,null,[["All",m.FilterAll]]),V(r,"status",[["Active",m.FilterActive],["Downloading",m.FilterDownloading],["Seeding",m.FilterSeeding],["Paused",m.FilterPaused],["Finished",m.FilterFinished],["Error",m.FilterError]]),V(r,"list",[["Private torrents",m.FilterPrivate],["Public torrents",m.FilterPublic]]),r.value=this.prefs.filter_mode,r.addEventListener("change",a=>{this.prefs.filter_mode=a.target.value,this.refilterAllSoon()}),r=document.querySelector("#filter-tracker"),V(r,null,[["All",m.FilterAll]]);let s=document.querySelector("#torrent-search");r=document.querySelector("#reset"),r.addEventListener("click",()=>{s.value="",this._setFilterText(s.value),this.refilterAllSoon()}),s.value.trim()&&(this.filterText=s.value,r.style.display="block",this.refilterAllSoon()),r=document.querySelector("#turtle"),r.addEventListener("click",a=>{this.remote.savePrefs({[x._TurtleState]:!a.target.classList.contains("alt-speed-enabled")})}),document.addEventListener("keydown",this._keyDown.bind(this)),document.addEventListener("keyup",this._keyUp.bind(this)),r=document.querySelector("#torrent-container"),r.addEventListener("click",a=>{this.popup[c.default_popup_level]&&this.setCurrentPopup(null),a.target===a.currentTarget&&this._deselectAll()}),r.addEventListener("dblclick",()=>{(!this.popup[0]||this.popup[0].name!=="inspector")&&this.action_manager.click("show-inspector")}),r.addEventListener("dragenter",c._dragenter),r.addEventListener("dragover",c._dragenter),r.addEventListener("drop",this._drop.bind(this)),this._setupSearchBox(),this.elements={torrent_container:document.querySelector("#torrent-container"),torrent_list:document.querySelector("#torrent-list")},this._initializeClusterize();let n=a=>{let i=a.target;for(;i&&!i.classList.contains("torrent");)i=i.parentNode;let l=i?.dataset?.torrentId;if(l){let p=Number.parseInt(l,10);this._selectedTorrentIds.has(p)||(this._setSelectedTorrent(p),this._last_torrent_clicked=p)}this.handler&&(this.handler.classList.remove("selected"),this.handler=null),this.context_menu("#torrent-container"),a.preventDefault()};this.pointer_event(this.elements.torrent_list,n),this.elements.torrent_list.addEventListener("click",this._onRowClicked.bind(this)),this.loadDaemonPrefs(),this._initializeTorrents(),this.refreshTorrents(),this.togglePeriodicSessionRefresh(!0),this.prefs.addEventListener("change",({key:a,value:i})=>this._onPrefChanged(a,i));for(let[a,i]of this.prefs.entries())this._onPrefChanged(a,i)}_initializeClusterize(){this._clusterize=new Qe.default({blocks_in_cluster:4,callbacks:{clusterChanged:()=>{this._updateVisibleSelections()}},contentId:"torrent-list",no_data_class:"",no_data_text:"",rows:["
  • "],rows_in_block:25,scrollId:"torrent-container",show_no_data_row:!0,tag:"li"})}_generateTorrentRowHTML(e){let o=this.prefs.display_mode===m.DisplayCompact?new j:new z,r=o.createRow(e);return r.dataset.torrentId=e.getId(),this._selectedTorrentIds.has(e.getId())&&r.classList.add("selected"),o.render(this,e,r),r.outerHTML}_openTorrentFromUrl(){setTimeout(()=>{let e=new URLSearchParams(globalThis.location.search).get("addtorrent");if(e){this.setCurrentPopup(new Y(this,this.remote,e));let t=new URL(globalThis.location);t.search="",globalThis.history.pushState("","",t.toString())}},0)}loadDaemonPrefs(){this.remote.loadDaemonPrefs(e=>{this.session_properties=e.result,this._openTorrentFromUrl()})}get session_properties(){return this._session_properties}set session_properties(e){if(q(this._session_properties,e))return;this._session_properties=Object.seal(e);let t=new Event("session-change");t.session_properties=e,this.dispatchEvent(t),this._updateGuiFromSession(e)}_setupSearchBox(){let e=document.querySelector("#torrent-search"),t="blur";e.classList.add(t),e.addEventListener("blur",()=>e.classList.add(t)),e.addEventListener("focus",()=>e.classList.remove(t)),e.addEventListener("input",()=>{e.value.trim()!==this.filterText&&this._setFilterText(e.value)})}_onPrefChanged(e,t){switch(e){case m.DisplayMode:{this.torrentRenderer=t==="compact"?new j:new z,this.refilterAllSoon();break}case m.ContrastMode:{document.body.classList.remove("contrast-more","contrast-less"),document.body.classList.add(`contrast-${t}`);break}case m.FilterMode:case m.SortDirection:case m.SortMode:this.refilterAllSoon();break;case m.HighlightColor:{document.body.classList.remove("highlight-legacy","highlight-system"),t?t==="Highlight"&&document.body.classList.add("highlight-system"):document.body.classList.add("highlight-legacy");break}case m.RefreshRate:{clearInterval(this.refreshTorrentsInterval);let o=this.refreshTorrents.bind(this),r=this.prefs.refresh_rate_sec,s=r>0?r*1e3:1e3;this.refreshTorrentsInterval=setInterval(o,s);break}default:break}}context_menu(e,t){let o=new re(this,t);this.setCurrentPopup(o);let r=document.querySelector(e).getBoundingClientRect(),s=Math.min(this.pointer_device.x,r.right+globalThis.scrollX-o.root.clientWidth),n=Math.min(this.pointer_device.y,r.bottom+globalThis.scrollY-o.root.clientHeight);o.root.style.left=`${Math.max(s,0)}px`,o.root.style.top=`${Math.max(n,0)}px`}pointer_event(e,t){if(this.pointer_device.is_touch_device){let o=this.pointer_device;e.addEventListener("touchstart",r=>{o.x=r.touches[0].pageX,o.y=r.touches[0].pageY,o.long_press_callback?(clearTimeout(o.long_press_callback),o.long_press_callback=null):o.long_press_callback=setTimeout(()=>{r.touches.length===1&&t(r)},500)}),e.addEventListener("touchend",()=>{clearTimeout(o.long_press_callback),o.long_press_callback=null,setTimeout(()=>{let r=this.popup[c.default_popup_level];r&&(r.root.style.pointerEvents="auto")},1)}),e.addEventListener("touchmove",r=>{o.x=r.touches[0].pageX,o.y=r.touches[0].pageY,clearTimeout(o.long_press_callback),o.long_press_callback=null}),e.addEventListener("contextmenu",r=>{r.preventDefault()})}else e.addEventListener("mousemove",o=>{this.pointer_device.x=o.pageX,this.pointer_device.y=o.pageY}),e.addEventListener("contextmenu",o=>{t(o);let r=this.popup[c.default_popup_level];r&&(r.root.style.pointerEvents="auto")})}static get max_popups(){return 2}static get default_popup_level(){return c.max_popups-1}_getAllTorrents(){return Object.values(this._torrents)}static _getTorrentIds(e){return e.map(t=>t.getId())}seedRatioLimit(){let e=this.session_properties;return e&&e.seed_ratio_limited?e.seed_ratio_limit:-1}getSelectedTorrents(){return[...this._selectedTorrentIds].map(e=>this._torrents[e]).filter(Boolean)}_getSelectedTorrentIds(){return[...this._selectedTorrentIds]}_setSelectedTorrent(e){this._selectedTorrentIds.clear(),e&&this._selectedTorrentIds.add(e),this._updateVisibleSelections(),this._dispatchSelectionChanged()}_selectTorrent(e){this._selectedTorrentIds.add(e),this._updateVisibleSelections(),this._dispatchSelectionChanged()}_deselectTorrent(e){this._selectedTorrentIds.delete(e),this._updateVisibleSelections(),this._dispatchSelectionChanged()}_selectAll(){for(let e of this._torrentOrder)this._selectedTorrentIds.add(e.getId());this._updateVisibleSelections(),this._dispatchSelectionChanged()}_deselectAll(){this._selectedTorrentIds.clear(),this._updateVisibleSelections(),this._dispatchSelectionChanged(),delete this._last_torrent_clicked}_updateVisibleSelections(){if(this.elements.torrent_list)for(let e of this.elements.torrent_list.children){let t=Number.parseInt(e.dataset.torrentId,10);t&&e.classList.toggle("selected",this._selectedTorrentIds.has(t))}}_indexOfLastTorrent(){return this._last_torrent_clicked?this._torrentOrder.findIndex(e=>e.getId()===this._last_torrent_clicked):-1}_selectRange(e){e&&e.getTorrent&&this._selectRangeToTorrent(e.getTorrent().getId())}_selectRangeToTorrent(e){if(!this._last_torrent_clicked){this._selectTorrent(e);return}let t=this._torrentOrder.findIndex(n=>n.getId()===e),o=this._torrentOrder.findIndex(n=>n.getId()===this._last_torrent_clicked);if(t===-1||o===-1){this._selectTorrent(e);return}let r=Math.min(o,t),s=Math.max(o,t);for(let n=r;n<=s;++n)this._selectTorrent(this._torrentOrder[n].getId())}_dispatchSelectionChanged(){let e=[],t=[];for(let r of Object.values(this._torrents))this._selectedTorrentIds.has(r.getId())?t.push(r):e.push(r);let o=new Event("torrent-selection-changed");o.nonselected=e,o.selected=t,this.dispatchEvent(o)}static _createKeyShortcutFromKeyboardEvent(e){let t=[];return e.ctrlKey&&t.push("Control"),e.altKey&&t.push("Alt"),e.metaKey&&t.push("Meta"),e.shiftKey&&t.push("Shift"),t.push(e.key.length===1?e.key.toUpperCase():e.key),t.join("+")}_keyDown(e){let{ctrlKey:t,keyCode:o,metaKey:r,shiftKey:s,target:n}=e,a=["INPUT","TEXTAREA"].includes(n.tagName);if(!a){let d=c._createKeyShortcutFromKeyboardEvent(e),g=this.action_manager.getActionForShortcut(d);if(g){e.preventDefault(),this.action_manager.click(g);return}}if(o===27&&this.popup.some(Boolean)){this.setCurrentPopup(null,0),e.preventDefault();return}let l=document.querySelector(".popup:not(.hidden)"),p=this._torrentOrder;if(!a&&!l&&!r&&!t){let d=o===16,g=o===38,u=o===40;if((g||u)&&p.length>0){let b=this._indexOfLastTorrent(),C=this._shift_index,f=0,y=p.length-1,I=b;u&&I+1<=y?++I:g&&I-1>=f&&--I;let A=p[I];if(C>=0?C<=b&&b=b&&b>I?this._selectTorrent(A.getId()):(C>=b&&I>b||C<=b&&b>I)&&this._deselectTorrent(p[b].getId()):s?this._selectRangeToTorrent(A.getId()):this._setSelectedTorrent(A.getId()),A){e.preventDefault(),this._last_torrent_clicked=A.getId();let v=[...this.elements.torrent_list.children].find(F=>Number.parseInt(F.dataset.torrentId,10)===A.getId());v&&v.scrollIntoView({block:"nearest",inline:"nearest"})}}else d&&(this._shift_index=this._indexOfLastTorrent())}}_keyUp(e){e.keyCode===16&&delete this._shift_index}static _dragenter(e){if(e.dataTransfer&&e.dataTransfer.types){let t=new Set(["text/uri-list","text/plain"]);if(e.dataTransfer.types.some(o=>t.has(o))||e.dataTransfer.types.includes("Files"))return e.stopPropagation(),e.preventDefault(),e.dataTransfer.dropEffect="copy",!1}else e.dataTransfer&&(e.dataTransfer.dropEffect="none");return!0}static _isValidURL(e){try{return!!new URL(e)}catch{return!1}}shouldAddedTorrentsStart(){return this.session_properties.start_added_torrents}_drop(e){let t=!this.shouldAddedTorrentsStart();if(!e.dataTransfer||!e.dataTransfer.types)return!0;let o=e.dataTransfer.types.findLast(s=>["text/uri-list","text/plain"].includes(s));for(let s of e.dataTransfer.getData(o).split(` +`)}_updatePeers(){let e=G,{elements:t,torrents:o}=this,{tbody:r,webseedsTbody:s,webseedsTable:n}=t.peers,a=[(g,u)=>{u.dataset.encrypted=g.is_encrypted},(g,u)=>h(u,g.rate_to_peer?e.speedBps(g.rate_to_peer):""),(g,u)=>h(u,g.rate_to_client?e.speedBps(g.rate_to_client):""),(g,u)=>h(u,`${Math.floor(g.progress*100)}%`),(g,u)=>{h(u,g.flag_str),u.setAttribute("title",c._peerStatusTitle(g.flag_str))},(g,u)=>{h(u,g.address),u.setAttribute("title",g.address)},(g,u)=>{h(u,g.client_name),u.setAttribute("title",g.client_name)}],i=[(g,u)=>{h(u,g.url),u.setAttribute("title",g.url)},(g,u)=>{h(u,g.download_bytes_per_second?e.speedBps(g.download_bytes_per_second):"")}],l=[],p=[],d=!1;for(let g of o){let u=document.createElement("tr");u.classList.add("torrent-row");let b=document.createElement("td");h(b,g.getName()),u.append(b);let C=g.getWebseedsEx();if(C.length>0){d=!0;let y=u.cloneNode(!0);y.firstChild.setAttribute("colspan",i.length),l.push(y);for(let I of C){let A=document.createElement("tr");A.classList.add("webseed-row");for(let[v,F]of i.entries()){let U=document.createElement("td");U.classList.add(Fe[v]),F(I,U),A.append(U)}l.push(A)}}let f=u.cloneNode(!0);f.firstChild.setAttribute("colspan",a.length),p.push(f);for(let y of g.getPeers()){let I=document.createElement("tr");for(let[A,v]of a.entries()){let F=document.createElement("td");F.classList.add(Xe[A]),v(y,F),I.append(F)}p.push(I)}}for(n.style.display=d?"":"none";s.firstChild;)s.firstChild.remove();for(d&&s.append(...l);r.firstChild;)r.firstChild.remove();r.append(...p)}static getAnnounceState(e){switch(e.announce_state){case B._TrackerActive:return"Announce in progress";case B._TrackerWaiting:{let t=Math.max(0,e.next_announce_time-Date.now()/1e3);return`Next announce in ${G.timeInterval(t)}`}case B._TrackerQueued:return"Announce is queued";case B._TrackerInactive:return e.is_backup?"Tracker will be used as a backup":"Announce not scheduled";default:return`unknown announce state: ${e.announce_state}`}}static lastAnnounceStatus(e){let t="Last Announce",o=["N/A"];if(e.has_announced){let r=G.timestamp(e.last_announce_time);e.last_announce_succeeded?o=[r," (got ",G.countString("peer","peers",e.last_announce_peer_count),")"]:(t="Announce error",o=[e.last_announce_result?`${e.last_announce_result} - `:"",r])}return{label:t,value:o.join("")}}static lastScrapeStatus(e){let t="Last Scrape",o="N/A";if(e.has_scraped){let r=G.timestamp(e.last_scrape_time);e.last_scrape_succeeded?o=r:(t="Scrape error",o=(e.last_scrape_result?`${e.last_scrape_result} - `:"")+r)}return{label:t,value:o}}static _getOrigin(e){try{let t="udp://";if(e.announce.startsWith(t)){let r="http://",s=e.announce.replace(t,r);return new URL(s).origin.replace(r,t)}return new URL(e.announce).origin}catch{return[e.sitename||e.host||e.announce]}}_updateTiers(){let{list:t}=this.elements.tiers,{torrents:o}=this,r=[];for(let s of o){if(o.length>1){let n=document.createElement("div");n.classList.add("tier-list-torrent"),h(n,s.getName()),r.push(n)}for(let n of s.getTrackers()){let a=c.getAnnounceState(n),i=c.lastAnnounceStatus(n),l=c.lastScrapeStatus(n),p=document.createElement("div");p.classList.add("tier-list-row");let d=document.createElement("div"),g=c._getOrigin(n);d.classList.add("tier-list-tracker"),h(d,`${g} - tier ${n.tier+1}`),d.setAttribute("title",n.announce),p.append(d),d=document.createElement("div"),d.classList.add("tier-announce"),h(d,`${i.label}: ${i.value}`),p.append(d),d=document.createElement("div"),d.classList.add("tier-seeders"),h(d,`Seeders: ${n.seeder_count>-1?n.seeder_count:"N/A"}`),p.append(d),d=document.createElement("div"),d.classList.add("tier-state"),h(d,a),p.append(d),d=document.createElement("div"),d.classList.add("tier-leechers"),h(d,`Leechers: ${n.leecher_count>-1?n.leecher_count:"N/A"}`),p.append(d),d=document.createElement("div"),d.classList.add("tier-scrape"),h(d,`${l.label}: ${l.value}`),p.append(d),d=document.createElement("div"),d.classList.add("tier-downloads"),h(d,`Downloads: ${n.download_count>-1?n.download_count:"N/A"}`),p.append(d),r.push(p)}}for(;t.firstChild;)t.firstChild.remove();t.append(...r)}_changeFileCommand(e,t){let{controller:o,file_torrent:r}=this,s=r.getId();o.changeFileCommand(s,e,t)}_onFileWantedToggled(e){let{indices:t,wanted:o}=e;this._changeFileCommand(t,o?"files_wanted":"files_unwanted")}_onFilePriorityToggled(e){let{indices:t,priority:o}=e,r=null;switch(o.toString()){case"-1":r="priority_low";break;case"1":r="priority_high";break;default:r="priority_normal"}this._changeFileCommand(t,r)}_clearFileList(){let{list:e}=this.elements.files;for(;e.firstChild;)e.firstChild.remove();this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null}static createFileTreeModel(e){let t=[],o={children:{},file_indices:[]};for(let[r,s]of e.getFiles().entries()){let{name:n}=s,a=n.split("/"),i=o;for(let[l,p]of a.entries()){let d=i.children[p];d||(i.children[p]=d={children:{},depth:l,file_indices:[],name:p,parent:i}),i=d}i.file_index=r,delete i.children,t.push(i)}for(let r of t){let{file_index:s}=r,n=r;do n.file_indices.push(s),n=n.parent;while(n)}return o}addNodeToView(e,t,o){let r=new se(this.controller,e,o);r.addEventListener("wantedToggled",this._onFileWantedToggled.bind(this)),r.addEventListener("priorityToggled",this._onFilePriorityToggled.bind(this)),this.file_rows.push(r),t.append(r.getElement())}addSubtreeToView(e,t,o){if(o.parent&&this.addNodeToView(e,t,o),o.children)for(let r of Object.values(o.children))this.addSubtreeToView(e,t,r)}_updateFiles(){let{list:e}=this.elements.files,{file_rows:t,file_torrent:o,file_torrent_n:r,torrents:s}=this;if(s.length!==1){this._clearFileList();return}let[n]=s,a=n.getFiles().length;if(n!==o||a!==r){this._clearFileList(),this.file_torrent=n,this.file_torrent_n=a,this.file_rows=[];let i=document.createDocumentFragment(),l=c.createFileTreeModel(n);this.addSubtreeToView(n,i,l),e.append(i)}else for(let i of t)i.refresh()}};var ie=class c extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();e.length!==0&&(this.torrents=e,this.elements=c._create(),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.entry.value=e[0].getDownloadDir(),document.body.append(this.elements.root),this.elements.entry.focus())}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let e=this.torrents.map(o=>o.getId()),t=this.elements.entry.value.trim();this.remote.moveTorrents(e,t),this.close()}static _create(){let e=X("move-dialog");e.root.setAttribute("aria-label","Move Torrent"),e.heading.textContent="Set Torrent Location",confirm.textContent="Apply";let t=document.createElement("label");t.setAttribute("for","torrent-path"),t.textContent="Location:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-path",e.entry=o,e.workarea.append(o),e}};var W=class c extends EventTarget{constructor(e){super(),this.elements=c._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.options=e,document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}static _create(e){let{heading:t,message:o}=e,r=X("confirm-dialog");return r.confirm.remove(),delete r.confirm,r.heading.textContent=t,r.workarea.textContent=o,r}};var x={_DaemonVersion:"version",_DownSpeedLimit:"speed_limit_down",_DownSpeedLimited:"speed_limit_down_enabled",_JsonRpcVersion:"2.0",_QueueMoveBottom:"queue_move_bottom",_QueueMoveDown:"queue_move_down",_QueueMoveTop:"queue_move_top",_QueueMoveUp:"queue_move_up",_Root:"../rpc",_TurtleDownSpeedLimit:"alt_speed_down",_TurtleState:"alt_speed_enabled",_TurtleUpSpeedLimit:"alt_speed_up",_UpSpeedLimit:"speed_limit_up",_UpSpeedLimited:"speed_limit_up_enabled"};function we(c){return c.result??c.error.data.result}var H=class c{_connection_alert=null;_session_id="";constructor(e){this._controller=e}sendRequest(e,t,o){let r=new Headers;r.append("cache-control","no-cache"),r.append("content-type","application/json"),r.append("pragma","no-cache"),this._session_id&&r.append(c._SessionHeader,this._session_id);let s=null;fetch(x._Root,{body:JSON.stringify(e),headers:r,method:"POST"}).then(n=>{switch(s=n,n.status){case 409:{let a=new Error(c._SessionHeader);throw a.header=n.headers.get(c._SessionHeader),a}case 204:return null;default:return n.json()}}).then(n=>{t&&t.call(o,n,s),this._connection_alert&&(this._connection_alert.close(),this._connection_alert=null)}).catch(n=>{if(n.message===c._SessionHeader){this._session_id=n.header,this.sendRequest(e,t,o);return}console.trace(n),this._controller.togglePeriodicSessionRefresh(!1),this._connection_alert=new W({heading:"Connection failed",message:"Could not connect to the server. You may need to reload the page to reconnect."}),this._controller.setCurrentPopup(this._connection_alert)})}loadDaemonPrefs(e,t){let o={id:"webui",jsonrpc:x._JsonRpcVersion,method:"session_get"};this.sendRequest(o,e,t)}checkPort(e,t,o){let r={id:"webui",jsonrpc:x._JsonRpcVersion,method:"port_test",params:{ip_protocol:e}};this.sendRequest(r,t,o)}renameTorrent(e,t,o,r,s){let n={id:"webui",jsonrpc:x._JsonRpcVersion,method:"torrent_rename_path",params:{ids:e,name:o,path:t}};this.sendRequest(n,r,s)}setLabels(e,t,o){let r={ids:e,labels:t};this.sendRequest({id:"webui",jsonrpc:x._JsonRpcVersion,method:"torrent_set",params:r},o)}loadDaemonStats(e,t){let o={id:"webui",jsonrpc:x._JsonRpcVersion,method:"session_stats"};this.sendRequest(o,e,t)}updateTorrents(e,t,o,r){let s={id:"webui",jsonrpc:x._JsonRpcVersion,method:"torrent_get",params:{fields:t,format:"table"}};e&&(s.params.ids=e),this.sendRequest(s,n=>{let a=we(n);o.call(r,a.torrents,a.removed)})}getFreeSpace(e,t,o){let r={id:"webui",jsonrpc:x._JsonRpcVersion,method:"free_space",params:{path:e}};this.sendRequest(r,s=>{let n=we(s);t.call(o,n.path,n.size_bytes)})}changeFileCommand(e,t,o){let r={[o]:t,ids:[e]};this.sendRequest({jsonrpc:x._JsonRpcVersion,method:"torrent_set",params:r},()=>{this._controller.refreshTorrents([e])})}sendTorrentSetRequests(e,t,o,r,s){o||={},o.ids=t;let n={id:"webui",jsonrpc:x._JsonRpcVersion,method:e,params:o};this.sendRequest(n,r,s)}sendTorrentActionRequests(e,t,o,r){this.sendTorrentSetRequests(e,t,null,o,r)}startTorrents(e,t,o,r){let s=t?"torrent_start_now":"torrent_start";this.sendTorrentActionRequests(s,e,o,r)}stopTorrents(e,t,o){this.sendTorrentActionRequests("torrent_stop",e,t,o)}moveTorrents(e,t,o,r){this.sendTorrentSetRequests("torrent_set_location",e,{location:t,move:!0},o,r)}removeTorrents(e,t){let o={jsonrpc:x._JsonRpcVersion,method:"torrent_remove",params:{delete_local_data:t,ids:[]}};if(e)for(let r=0,s=e.length;r{this._controller.refreshTorrents()})}verifyTorrents(e,t,o){this.sendTorrentActionRequests("torrent_verify",e,t,o)}reannounceTorrents(e,t,o){this.sendTorrentActionRequests("torrent_reannounce",e,t,o)}addTorrentByUrl(e,t){/^[\da-f]{40}$/i.test(e)&&(e=`magnet:?xt=urn:btih:${e}`);let o={jsonrpc:x._JsonRpcVersion,method:"torrent_add",params:{filename:e,paused:t.paused}};this.sendRequest(o,()=>{this._controller.refreshTorrents()})}savePrefs(e){let t={jsonrpc:x._JsonRpcVersion,method:"session_set",params:e};this.sendRequest(t,()=>{this._controller.loadDaemonPrefs()})}updateBlocklist(){let e={jsonrpc:x._JsonRpcVersion,method:"blocklist_update"};this.sendRequest(e,()=>{this._controller.loadDaemonPrefs()})}moveTorrentsToTop(e,t,o){this.sendTorrentActionRequests(x._QueueMoveTop,e,t,o)}moveTorrentsToBottom(e,t,o){this.sendTorrentActionRequests(x._QueueMoveBottom,e,t,o)}moveTorrentsUp(e,t,o){this.sendTorrentActionRequests(x._QueueMoveUp,e,t,o)}moveTorrentsDown(e,t,o){this.sendTorrentActionRequests(x._QueueMoveDown,e,t,o)}};H._SessionHeader="X-Transmission-Session-Id";var ze=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!globalThis.MSStream,je=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),Me=!(ze&&je),Y=class extends EventTarget{constructor(e,t,o="",r=null){super(),this.controller=e,this.remote=t,this.elements=this._create(o),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),r&&(this.elements.file_input.files=r),this._updateFreeSpaceInAddDialog(),this.elements.url_input.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_updateFreeSpaceInAddDialog(){let e=this.elements.folder_input.value;this.remote.getFreeSpace(e,(t,o)=>{this.closed||(this.elements.freespace.textContent=o>0?`${G.size(o)} Free`:"")})}_onConfirm(){let{controller:e,elements:t,remote:o}=this,{file_input:r,folder_input:s,start_input:n,url_input:a}=t,i=!n.checked,l=s.value.trim();for(let d of r.files){let g=new FileReader;g.addEventListener("load",u=>{let b=u.target.result,C="base64,",f=b.indexOf(C);if(f===-1)return;let y={id:"webui",jsonrpc:x._JsonRpcVersion,method:"torrent_add",params:{download_dir:l,metainfo:b.slice(Math.max(0,f+C.length)),paused:i}};o.sendRequest(y,I=>{if("error"in I){let A=I.error.data?.errorString??I.error.message;alert(`Error adding "${d.name}": ${A}`),e.setCurrentPopup(new W({heading:`Error adding "${d.name}"`,message:A}))}})}),g.readAsDataURL(d)}let p=a.value.trim();if(p.length>0){/^[\da-f]{40}$/i.test(p)&&(p=`magnet:?xt=urn:btih:${p}`);let d={id:"webui",jsonrpc:x._JsonRpcVersion,method:"torrent_add",params:{download_dir:l,filename:p,paused:i}};o.sendRequest(d,g=>{"error"in g&&e.setCurrentPopup(new W({heading:`Error adding "${p}"`,message:g.error.data?.errorString??g.error.message}))})}this._onDismiss()}_create(e){let t=X(),{confirm:o,root:r,heading:s,workarea:n}=t;r.classList.add("open-torrent"),s.textContent="Add Torrents",o.textContent="Add";let a=Z(),i=document.createElement("label");i.setAttribute("for",a),i.textContent="Please select torrent files to add:",n.append(i);let l=document.createElement("input");l.type="file",l.name="torrent-files[]",l.id=a,l.multiple=!0,Me&&(l.accept=".torrent,application/x-bittorrent"),n.append(l),t.file_input=l,a=Z(),i=document.createElement("label"),i.setAttribute("for",a),i.textContent="Or enter a URL:",n.append(i),l=document.createElement("input"),l.type="url",l.id=a,l.value=e,n.append(l),t.url_input=l,a=Z(),i=document.createElement("label"),i.id="add-dialog-folder-label",i.for=a,i.textContent="Destination folder: ",n.append(i);let p=document.createElement("span");p.id="free-space-text",i.append(p),n.append(i),t.freespace=p,l=document.createElement("input"),l.type="text",l.id="add-dialog-folder-input",l.addEventListener("change",()=>this._updateFreeSpaceInAddDialog()),l.value=this.controller.session_properties.download_dir,n.append(l),t.folder_input=l;let d=document.createElement("div");n.append(d);let g=document.createElement("input");return g.type="checkbox",g.id="auto-start-check",g.checked=this.controller.shouldAddedTorrentsStart(),d.append(g),t.start_input=g,i=document.createElement("label"),i.id="auto-start-label",i.setAttribute("for",g.id),i.textContent="Start when added",d.append(i),t}};function ne(c,e){let t=document.createElement("fieldset");t.classList.add("section",c);let o=document.createElement("legend");return o.classList.add("title"),o.textContent=e,t.append(o),t}function Ie(c,e,t,o){let r=document.createElement("button");return r.textContent=e,r.addEventListener("click",o),c.append(r),r.dataset.action=t,r}var J=class extends EventTarget{constructor(e,t,o,r){super(),this.action_listener=this._onActionChange.bind(this),this.action_manager=r,this.action_manager.addEventListener("change",this.action_listener),this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=t,this.prefs.addEventListener("change",this.prefs_listener),this.closed=!1,this.remote=o,this.name="overflow-menu",this.session_listener=this._onSessionChange.bind(this),this.session_manager=e,this.session_manager.addEventListener("session-change",this.session_listener);let{session_properties:s}=e;Object.assign(this,this._create(s)),this.outside=new _(this.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this),this.show()}show(){document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.session_listener),this.action_manager.removeEventListener("change",this.action_listener),this.prefs.removeEventListener("change",this.prefs_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}_onSessionChange(e){let{alt_speed_check:t}=this.elements,{session_properties:o}=e;t.checked=o[x._TurtleState]}_onPrefsChange(e){switch(e.key){case m.SortDirection:case m.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value;break;default:break}}_onActionChange(e){let t=this.actions[e.action];t&&this._updateElement(t)}_updateElement(e){if(e.dataset.action){let{action:t}=e.dataset,o=this.action_manager.keyshortcuts(t);o&&e.setAttribute("aria-keyshortcuts",o),L(e,this.action_manager.isEnabled(t))}}_onClick(e){let{action:t,pref:o}=e.target.dataset;if(t){this.action_manager.click(t);return}if(o){this.prefs[o]=e.target.value;return}console.log("unhandled"),console.log(e),console.trace()}_create(e){let t={},o={},r=this._onClick.bind(this),s=document.createElement("div");s.classList.add("overflow-menu","popup");let n=document.createElement("div"),a=(I,A)=>{let v=document.createElement("input");v.id=Z(),v.type="checkbox";let F=document.createElement("label");F.htmlFor=v.id,F.textContent=I,n.append(v,F),A(v)},i=ne("display","Display");s.append(i);let l=document.createElement("div");l.id="display-options",i.append(l),n.classList.add("table-row"),l.append(n);let p=document.createElement("label");p.id="display-sort-mode-label",p.textContent="Sort by",n.append(p);let d=document.createElement("select");d.id="display-sort-mode-select",d.dataset.pref=m.SortMode,n.append(d);let g=[[m.SortByActivity,"Activity"],[m.SortByAge,"Age"],[m.SortByName,"Name"],[m.SortByProgress,"Progress"],[m.SortByQueue,"Queue order"],[m.SortByRatio,"Ratio"],[m.SortBySize,"Size"],[m.SortByState,"State"]];for(let[I,A]of g){let v=document.createElement("option");v.value=I,v.textContent=A,d.append(v)}p.htmlFor=d.id,d.value=this.prefs.sort_mode,d.addEventListener("change",I=>{this.prefs.sort_mode=I.target.value}),n=document.createElement("div"),n.classList.add("table-row"),l.append(n);let u=I=>{I.dataset.pref=m.SortDirection,I.checked=this.prefs.sort_direction!==m.SortAscending,I.addEventListener("input",A=>{this.prefs.sort_direction=A.target.checked?m.SortDescending:m.SortAscending})};a("Reverse sort",u),n=document.createElement("div"),n.classList.add("table-row"),l.append(n),u=I=>{I.checked=this.prefs.display_mode===m.DisplayCompact,I.addEventListener("change",A=>{let{checked:v}=A.target;this.prefs.display_mode=v?m.DisplayCompact:m.DisplayFull})},a(this.action_manager.text("toggle-compact-rows"),u),n=document.createElement("div"),n.classList.add("table-row","display-fullscreen-row"),l.append(n),u=I=>{let A=()=>document.fullscreenElement!==null;I.checked=A(),document.addEventListener("fullscreenchange",()=>{I.checked=A()}),I.addEventListener("change",()=>{A()?document.exitFullscreen():document.body.requestFullscreen()})},a("Fullscreen",u);let b=this.action_manager.text("open-appearance-settings");n=Ie(i,b,"open-appearance-settings",r),l.append(n),i=ne("speed","Speed Limit"),s.append(i),l=document.createElement("div"),l.id="speed-options",i.append(l),n=document.createElement("div"),n.classList.add("speed-up"),l.append(n),p=document.createElement("label"),p.id="speed-up-label",p.textContent="Upload:",n.append(p);let C="Unlimited";d=document.createElement("select"),d.id="speed-up-select",n.append(d);let f=["50","100","250","500","1000","2500","5000","10000",C];for(let I of[...new Set(f).add(`${e[x._UpSpeedLimit]}`).values()].toSorted((A,v)=>A-v)){let A=document.createElement("option");A.value=I,A.textContent=I===C?C:G.speed(I),d.append(A)}p.htmlFor=d.id,d.value=e[x._UpSpeedLimited]?`${e[x._UpSpeedLimit]}`:C,d.addEventListener("change",I=>{let{value:A}=I.target;console.log(I),A===C?this.remote.savePrefs({[x._UpSpeedLimited]:!1}):this.remote.savePrefs({[x._UpSpeedLimited]:!0,[x._UpSpeedLimit]:Number.parseInt(A,10)})}),n=document.createElement("div"),n.classList.add("speed-down"),l.append(n),p=document.createElement("label"),p.id="speed-down-label",p.textContent="Download:",n.append(p),d=document.createElement("select"),d.id="speed-down-select",n.append(d);for(let I of[...new Set(f).add(`${e[x._DownSpeedLimit]}`).values()].toSorted((A,v)=>A-v)){let A=document.createElement("option");A.value=I,A.textContent=I===C?C:G.speed(I),d.append(A)}p.htmlFor=d.id,d.value=e[x._DownSpeedLimited]?`${e[x._DownSpeedLimit]}`:C,d.addEventListener("change",I=>{let{value:A}=I.target;console.log(I),A===C?this.remote.savePrefs({[x._DownSpeedLimited]:!1}):this.remote.savePrefs({[x._DownSpeedLimited]:!0,[x._DownSpeedLimit]:Number.parseInt(A,10)})}),n=document.createElement("div"),n.classList.add("alt-speed"),l.append(n),u=I=>{I.checked=e[x._TurtleState],o.alt_speed_check=I,I.addEventListener("change",M=>{this.remote.savePrefs({[x._TurtleState]:M.target.checked})});let A=document.createElement("label");A.htmlFor=I.id,A.id="alt-speed-image";let v=document.createElement("label");v.htmlFor=I.id;let F=G.speed(e[x._TurtleUpSpeedLimit]),U=G.speed(e[x._TurtleDownSpeedLimit]);v.textContent=`(${F} up, ${U} down)`,n.append(A,v)},a("Use Temp limits",u),i=ne("actions","Actions"),s.append(i);for(let I of["show-preferences-dialog","show-shortcuts-dialog","pause-all-torrents","start-all-torrents"]){let A=this.action_manager.text(I);t[I]=Ie(i,A,I,r)}i=ne("help","Help"),s.append(i),l=document.createElement("div"),i.append(l);for(let I of["show-statistics-dialog","show-about-dialog"]){let A=this.action_manager.text(I);t[I]=Ie(l,A,I,r)}let y=document.createElement("a");return y.href="https://transmissionbt.com/donate.html",y.target="_blank",y.textContent="Donate",l.append(y),this._updateElement=this._updateElement.bind(this),{actions:t,elements:o,root:s}}};var ae=class c extends EventTarget{static _initTimeDropDown(e){for(let t=0;t<96;++t){let o=Math.trunc(t/4),r=t%4*15,s=t*15,n=`${o}:${r||"00"}`;e.options[t]=new Option(n,s)}}static _initDayDropDown(e){let t=[["Everyday","127"],["Weekdays","62"],["Weekends","65"],["Sunday","1"],["Monday","2"],["Tuesday","4"],["Wednesday","8"],["Thursday","16"],["Friday","32"],["Saturday","64"]];for(let o=0;t[o];++o){let[r,s]=t[o];e.options[o]=new Option(r,s)}}_checkPort(){for(let[e,t]of Object.entries(this.elements.network.port_status_label))delete t.dataset.open,h(t,"Checking..."),this.remote.checkPort(e,o=>this._onPortChecked(e,o),this)}_onPortChecked(e,t){if(this.closed)return;let o=t.result??t.error?.data??{},r=this.elements.network.port_status_label[e],s=o.port_is_open??!1;r.dataset.open=s,"port_is_open"in o?h(r,s?"Open":"Closed"):h(r,"Error")}_setBlocklistButtonEnabled(e){let t=this.elements.peers.blocklist_update_button;L(t,e),t.value=e?"Update":"Updating..."}static _getValue(e){if(e.tagName==="TEXTAREA")return e.value;switch(e.type){case"checkbox":case"radio":return e.checked;case"number":case"select-one":case"text":case"url":{let t=e.value;return Number.parseInt(t,10).toString()===t?Number.parseInt(t,10):Number.parseFloat(t).toString()===t?Number.parseFloat(t):t}default:return null}}_onMaybePortChanged(e){(e==="peer_port"||e==="port_forwarding_enabled")&&this._checkPort()}_onControlChanged(e){let{key:t}=e.target.dataset;this.remote.savePrefs({[t]:c._getValue(e.target)}),this._onMaybePortChanged(t)}_onDialogClosed(){this.dispatchEvent(new Event("closed"))}_update(){this._setBlocklistButtonEnabled(!0);for(let[e,t]of Object.entries(this.session_manager.session_properties))for(let o of this.elements.root.querySelectorAll(`[data-key="${e}"]`)){if(e==="blocklist_size"){let r=G.number(t);o.innerHTML=`Blocklist has ${r} rules`,h(this.elements.peers.blocklist_update_button,"Update")}else switch(o.type){case"checkbox":case"radio":o.checked=t;break;case"text":case"textarea":case"url":case"email":case"number":case"search":o!==document.activeElement&&(o.value!=t&&this._onMaybePortChanged(e),o.value=t);break;case"select-one":o.value=t;break;default:console.log(o.type);break}o.dispatchEvent(new Event("session-change"))}}static _createCheckAndLabel(e,t){let o=document.createElement("div");o.id=e;let r=document.createElement("input");r.id=Z(),r.type="checkbox",o.append(r);let s=document.createElement("label");return s.textContent=t,s.setAttribute("for",r.id),o.append(s),{check:r,label:s,root:o}}static _enableIfChecked(e,t){let o=()=>{e.tagName==="INPUT"?L(e,t.checked):e.classList.toggle("disabled",!t.checked)};t.addEventListener("session-change",o),o()}static _getProtocolHandlerRegistered(){return localStorage.getItem("protocol-handler-registered")==="true"}static _updateProtocolHandlerButton(e){e.removeAttribute("disabled"),e.removeAttribute("title"),c._getProtocolHandlerRegistered()?(e.textContent="Remove Browser Handler","unregisterProtocolHandler"in navigator||e.setAttribute("title","Your browser does not support removing protocol handlers. This button only allows you to re-register a handler.")):(e.textContent="Add Browser Handler",e.removeAttribute("title"),"registerProtocolHandler"in navigator||(e.setAttribute("disabled",!0),e.setAttribute("title","Your browser does not support protocol handlers")))}static _toggleProtocolHandler(e){let t=new URL(globalThis.location.href);t.search="addtorrent=%s",this._getProtocolHandlerRegistered()?(navigator.unregisterProtocolHandler?.("magnet",t.toString()),localStorage.removeItem("protocol-handler-registered"),c._updateProtocolHandlerButton(e)):(navigator.registerProtocolHandler("magnet",t.toString(),"Transmission Web"),localStorage.setItem("protocol-handler-registered","true"),c._updateProtocolHandlerButton(e))}static _createTorrentsPage(){let e=document.createElement("div");e.classList.add("prefs-torrents-page");let t=document.createElement("div");t.textContent="Downloading",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Download to:",e.append(t);let o=document.createElement("input");o.type="text",o.id=Z(),o.dataset.key="download_dir",t.setAttribute("for",o.id),e.append(o);let r=o,s=c._createCheckAndLabel("incomplete-dir-div","Use temporary folder:");s.check.title="Separate folder to temporarily store downloads until they are complete.",s.check.dataset.key="incomplete_dir_enabled",s.label.title=s.check.title,e.append(s.root);let n=s.check;o=document.createElement("input"),o.type="text",o.dataset.key="incomplete_dir",e.append(o),c._enableIfChecked(o,s.check);let a=o;s=c._createCheckAndLabel("autostart-div","Start when added"),s.check.dataset.key="start_added_torrents",e.append(s.root);let i=s.check;s=c._createCheckAndLabel("suffix-div",`Append "part" to incomplete files' names`),s.check.dataset.key="rename_partial_files",e.append(s.root);let l=s.check;s=c._createCheckAndLabel("download-queue-div","Download queue size:"),s.check.dataset.key="download_queue_enabled",e.append(s.root);let p=s.check;o=document.createElement("input"),o.type="number",o.dataset.key="download_queue_size",e.append(o),c._enableIfChecked(o,s.check);let d=o;t=document.createElement("div"),t.textContent="Seeding",t.classList.add("section-label"),e.append(t),s=c._createCheckAndLabel("stop-ratio-div","Stop seeding at ratio:"),s.check.dataset.key="seed_ratio_limited",e.append(s.root);let g=s.check;o=document.createElement("input"),o.type="number",o.min="0.1",o.step="any",o.dataset.key="seed_ratio_limit",e.append(o),c._enableIfChecked(o,s.check);let u=o;s=c._createCheckAndLabel("stop-idle-div","Stop seeding if idle for N mins:"),s.check.dataset.key="idle_seeding_limit_enabled",e.append(s.root);let b=s.check;o=document.createElement("input"),o.type="number",o.min="0.1",o.step="any",o.dataset.key="idle_seeding_limit",e.append(o),c._enableIfChecked(o,s.check);let C=o;t=document.createElement("div"),t.textContent="Magnet Protocol Handler",t.classList.add("section-label"),e.append(t);let f=document.createElement("button");return f.classList.add("register-handler-button"),c._updateProtocolHandlerButton(f),e.append(f),{autostart_check:i,download_dir:r,download_queue_check:p,download_queue_input:d,incomplete_dir_check:n,incomplete_dir_input:a,register_handler_button:f,root:e,stop_idle_check:b,stop_idle_input:C,stop_ratio_check:g,stop_ratio_input:u,suffix_check:l}}static _createSpeedPage(){let e=document.createElement("div");e.classList.add("prefs-speed-page");let t=document.createElement("div");t.textContent="Speed Limits",t.classList.add("section-label"),e.append(t);let o=c._createCheckAndLabel("upload-speed-div","Upload (kB/s):");o.check.dataset.key="speed_limit_up_enabled",e.append(o.root);let r=o.check,s=document.createElement("input");s.type="number",s.dataset.key="speed_limit_up",e.append(s),c._enableIfChecked(s,o.check);let n=s;o=c._createCheckAndLabel("download-speed-div","Download (kB/s):"),o.check.dataset.key="speed_limit_down_enabled",e.append(o.root);let a=o.check;s=document.createElement("input"),s.type="number",s.dataset.key="speed_limit_down",e.append(s),c._enableIfChecked(s,o.check);let i=s;t=document.createElement("div"),t.textContent="Alternative Speed Limits",t.classList.add("section-label","alt-speed-section-label"),e.append(t),t=document.createElement("div"),t.textContent="Override normal speed limits manually or at scheduled times",t.classList.add("alt-speed-label"),e.append(t),t=document.createElement("label"),t.textContent="Upload (kB/s):",e.append(t),s=document.createElement("input"),s.type="number",s.dataset.key="alt_speed_up",s.id=Z(),t.setAttribute("for",s.id),e.append(s);let l=s;t=document.createElement("label"),t.textContent="Download (kB/s):",e.append(t),s=document.createElement("input"),s.type="number",s.dataset.key="alt_speed_down",s.id=Z(),t.setAttribute("for",s.id),e.append(s);let p=s;o=c._createCheckAndLabel("alt-times-div","Scheduled times"),o.check.dataset.key="alt_speed_time_enabled",e.append(o.root);let d=o.check;t=document.createElement("label"),t.textContent="From:",c._enableIfChecked(t,o.check),e.append(t);let g=document.createElement("select");g.id=Z(),g.dataset.key="alt_speed_time_begin",c._initTimeDropDown(g),t.setAttribute("for",g.id),e.append(g),c._enableIfChecked(g,o.check);let u=g;t=document.createElement("label"),t.textContent="To:",c._enableIfChecked(t,o.check),e.append(t),g=document.createElement("select"),g.id=Z(),g.dataset.key="alt_speed_time_end",c._initTimeDropDown(g),t.setAttribute("for",g.id),e.append(g),c._enableIfChecked(g,o.check);let b=g;return t=document.createElement("label"),t.textContent="On days:",c._enableIfChecked(t,o.check),e.append(t),g=document.createElement("select"),g.id=Z(),g.dataset.key="alt_speed_time_day",c._initDayDropDown(g),t.setAttribute("for",g.id),e.append(g),c._enableIfChecked(g,o.check),{alt_days_select:g,alt_download_speed_input:p,alt_from_select:u,alt_times_check:d,alt_to_select:b,alt_upload_speed_input:l,download_speed_check:a,download_speed_input:i,root:e,upload_speed_check:r,upload_speed_input:n}}static _createPeersPage(){let e=document.createElement("div");e.classList.add("prefs-peers-page");let t=document.createElement("div");t.textContent="Connections",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Max peers per torrent:",e.append(t);let o=document.createElement("input");o.type="number",o.dataset.key="peer_limit_per_torrent",o.id=Z(),t.setAttribute("for",o.id),e.append(o);let r=o;t=document.createElement("label"),t.textContent="Max peers overall:",e.append(t),o=document.createElement("input"),o.type="number",o.dataset.key="peer_limit_global",o.id=Z(),t.setAttribute("for",o.id),e.append(o);let s=o;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Encryption mode:",e.append(t);let n=document.createElement("select");n.id=Z(),n.dataset.key="encryption",n.options[0]=new Option("Prefer encryption","preferred"),n.options[1]=new Option("Allow encryption","tolerated"),n.options[2]=new Option("Require encryption","required"),e.append(n);let a=n,i=c._createCheckAndLabel("use-pex-div","Use PEX to find more peers");i.check.title="PEX is a tool for exchanging peer lists with the peers you're connected to.",i.check.dataset.key="pex_enabled",i.label.title=i.check.title,e.append(i.root);let l=i.check;i=c._createCheckAndLabel("use-dht-div","Use DHT to find more peers"),i.check.title="DHT is a tool for finding peers without a tracker.",i.check.dataset.key="dht_enabled",i.label.title=i.check.title,e.append(i.root);let p=i.check;i=c._createCheckAndLabel("use-lpd-div","Use LPD to find more peers"),i.check.title="LPD is a tool for finding peers on your local network.",i.check.dataset.key="lpd_enabled",i.label.title=i.check.title,e.append(i.root);let d=i.check;t=document.createElement("div"),t.textContent="Blocklist",t.classList.add("section-label"),e.append(t),i=c._createCheckAndLabel("blocklist-enabled-div","Enable blocklist:"),i.check.dataset.key="blocklist_enabled",e.append(i.root);let g=i.check;o=document.createElement("input"),o.type="url",o.value="http://www.example.com/blocklist",o.dataset.key="blocklist_url",e.append(o),c._enableIfChecked(o,i.check);let u=o;t=document.createElement("label"),t.textContent="Blocklist has {n} rules",t.dataset.key="blocklist_size",t.classList.add("blocklist-size-label"),c._enableIfChecked(t,i.check),e.append(t);let b=document.createElement("button");return b.classList.add("blocklist-update-button"),b.textContent="Update",e.append(b),c._enableIfChecked(b,i.check),{blocklist_enabled_check:g,blocklist_update_button:b,blocklist_url_input:u,dht_check:p,encryption_select:a,lpd_check:d,max_peers_overall_input:s,max_peers_per_torrent_input:r,pex_check:l,root:e}}static _createNetworkPage(){let e=document.createElement("div");e.classList.add("prefs-network-page");let t=document.createElement("div");t.textContent="Listening Port",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Peer listening port:",e.append(t);let o=document.createElement("input");o.type="number",o.dataset.key="peer_port",o.id=Z(),t.setAttribute("for",o.id),e.append(o);let r=o,s=document.createElement("div");s.classList.add("port-status"),t=document.createElement("label"),t.textContent="IPv4 port is",s.append(t);let n=document.createElement("label");n.textContent="?",n.classList.add("port-status-label"),s.append(n),s.append(document.createElement("br")),t=document.createElement("label"),t.textContent="IPv6 port is",s.append(t);let a=document.createElement("label");a.textContent="?",a.classList.add("port-status-label"),s.append(a),e.append(s);let i=c._createCheckAndLabel("randomize-port","Randomize port on launch");i.check.dataset.key="peer_port_random_on_start",e.append(i.root);let l=i.check;i=c._createCheckAndLabel("port-forwarding","Use port forwarding from my router"),i.check.dataset.key="port_forwarding_enabled",e.append(i.root);let p=i.check;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),i=c._createCheckAndLabel("utp-enabled","Enable uTP for peer communication"),i.check.dataset.key="utp_enabled",e.append(i.root);let d=i.check;t=document.createElement("div"),t.textContent="Default Public Trackers",t.classList.add("section-label"),e.append(t);let g=["Trackers to use on all public torrents.","To add a backup URL, add it on the next line after a primary URL.","To add a new primary URL, add it after a blank line."];for(let C of g)t=document.createElement("label"),t.classList.add("default-trackers-label"),t.textContent=C,t.setAttribute("for","default-trackers"),e.append(t);let u=document.createElement("textarea");return u.dataset.key="default_trackers",u.id="default-trackers",e.append(u),{default_trackers_textarea:u,port_forwarding_check:p,port_input:r,port_status_label:{ipv4:n,ipv6:a},random_port_check:l,root:e,utp_check:d}}static _create(){let e={network:c._createNetworkPage(),peers:c._createPeersPage(),speed:c._createSpeedPage(),torrents:c._createTorrentsPage()};return{...K("prefs-dialog",[["prefs-tab-torrent",e.torrents.root,"Torrents"],["prefs-tab-speed",e.speed.root,"Speed"],["prefs-tab-peers",e.peers.root,"Peers"],["prefs-tab-network",e.network.root,"Network"]]),...e}}constructor(e,t){super(),this.closed=!1,this.session_manager=e,this.remote=t,this.update_from_session=()=>this._update(),this.elements=c._create(),this.elements.peers.blocklist_update_button.addEventListener("click",s=>{h(s.target,"Updating blocklist..."),this.remote.updateBlocklist(),this._setBlocklistButtonEnabled(!1)}),this.elements.torrents.register_handler_button.addEventListener("click",s=>{c._toggleProtocolHandler(s.currentTarget)}),this.elements.dismiss.addEventListener("click",()=>this.close()),this.outside=new _(this.elements.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this);let o=this._onControlChanged.bind(this),r=s=>{for(let n of Object.values(s))if(n.tagName==="INPUT")switch(n.type){case"checkbox":case"radio":case"number":case"text":case"url":n.addEventListener("change",o);break;default:console.trace(`unhandled input: ${n.type}`);break}else(n.tagName==="TEXTAREA"||n.tagName==="SELECT")&&n.addEventListener("change",o)};r(this.elements.network),r(this.elements.peers),r(this.elements.speed),r(this.elements.torrents),this.session_manager.addEventListener("session-change",this.update_from_session),this.update_from_session(),document.body.append(this.elements.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.update_from_session),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}};var ce=class c extends EventTarget{constructor(e){super(),this.options=e,this.elements=c._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_onConfirm(){let{remote:e,torrents:t,trash:o}=this.options;t.length>0&&e.removeTorrents(t,o),this.close()}static _create(e){let{trash:t}=e,{heading:o,message:r}=c._createMessage(e),s=X("remove-dialog");return s.heading.textContent=o,s.message.textContent=r,s.confirm.textContent=t?"Trash":"Remove",s}static _createMessage(e){let t=null,o=null,{torrents:r,trash:s}=e,[n]=r;return s&&r.length===1?(t=`Remove ${n.getName()} and delete data?`,o="All data downloaded for this torrent will be deleted. Are you sure you want to remove it?"):s?(t=`Remove ${r.length} transfers and delete data?`,o="All data downloaded for these torrents will be deleted. Are you sure you want to remove them?"):r.length===1?(t=`Remove ${n.getName()}?`,o="Once removed, continuing the transfer will require the torrent file. Are you sure you want to remove it?"):(t=`Remove ${r.length} transfers?`,o="Once removed, continuing the transfers will require the torrent files. Are you sure you want to remove them?"),{heading:t,message:o}}};var le=class c extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length!==1){console.trace();return}let{handler:t}=this.controller;this.torrents=e,this.elements=c._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=t===null?e[0].getName():t.subtree.name,document.body.append(this.elements.root),this.elements.entry.focus()}close(){let{handler:e}=this.controller;e&&e.classList.remove("selected"),this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let{handler:e}=this.controller,[t]=this.torrents,o=e?e.file_path:t.getName(),r=this.elements.entry.value;this.remote.renameTorrent([t.getId()],o,r,s=>{if("result"in s){let n=s.result;if(e)if(e.subtree.name=n.name,h(e.name_container,n.name),e.subdir){let a=t.getIndividualFile(o);if(a){let i=a.name.slice(0,Math.max(0,a.name.lastIndexOf("/")+1));a.name=`${i}${n.name}`}}else t.refresh(n);else t.refresh(n)}else{let n=s.error,a=n.data?.errorString??n.message??"",i=new W({heading:`Error renaming "${o}"`,message:`${a} (${n.code}`});this.controller.setCurrentPopup(i)}delete this.controller}),this.close()}static _create(){let e=X("rename-dialog");e.root.setAttribute("aria-label","Rename Torrent"),e.heading.textContent="Enter new name:",e.confirm.textContent="Rename";let t=document.createElement("label");t.setAttribute("for","torrent-rename-name"),t.textContent="Enter new name:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-rename-name",e.entry=o,e.workarea.append(o),e}};var de=class c extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length===0){console.error("At least one selected torrent expected.");return}let[t]=e;this.torrents=e,this.elements=c._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=t.getLabels().join(", "),document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let{torrents:e}=this,{remote:t}=this,o=e.map(i=>i.getId()),{elements:r}=this,{entry:s}=r,{value:n}=s,a=n.split(",").map(i=>i.trim()).filter(i=>i.length>0);t.setLabels(o,a,i=>{if(i.result==="success")for(let l of e)l.refresh({labels:a})}),this.close()}static _create(){let e=X("labels-dialog");e.root.setAttribute("aria-label","Edit Labels"),e.heading.textContent="Edit Labels:",e.confirm.textContent="Save";let t=document.createElement("label");t.setAttribute("for","torrent-labels"),t.textContent="Labels:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-labels",e.entry=o,e.workarea.append(o),e}};var ge=class c extends EventTarget{constructor(e){super(),this.elements=c._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onDismiss(){this.close()}static _create(e){let t=X("shortcuts-dialog");t.root.setAttribute("aria-label","Keyboard Shortcuts");let o=document.createElement("table"),r=document.createElement("thead");o.append(r);let s=document.createElement("tr");r.append(s);let n=document.createElement("th");n.textContent="Key",s.append(n),n=document.createElement("th"),n.textContent="Action",s.append(n);let a=document.createElement("tbody");o.append(a);let i={};for(let[l,p]of e.allShortcuts().entries()){let d=l.split("+"),g=[d.pop(),...d].join("+");i[g]={name:p,shortcut:l}}for(let[,l]of Object.entries(i).toSorted()){let{name:p,shortcut:d}=l;s=document.createElement("tr"),a.append(s);let g=document.createElement("td");g.textContent=d.replaceAll("+"," + "),s.append(g),g=document.createElement("td"),g.textContent=e.text(p),s.append(g)}return t.heading.textContent="Transmission",t.dismiss.textContent="Close",t.heading.textContent="Keyboard shortcuts",t.message.append(o),t.confirm.remove(),delete t.confirm,t}};var pe=class c extends EventTarget{constructor(e){super(),this.remote=e;let t=()=>this.remote.loadDaemonStats(r=>this._update(r.result)),o=5e3;this.interval=setInterval(t,o),t(),this.elements=c._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_update(e){console.log(e);let t=G,o=e.current_stats,r=S.ratio(o.uploaded_bytes,o.downloaded_bytes);h(this.elements.session.up,t.size(o.uploaded_bytes)),h(this.elements.session.down,t.size(o.downloaded_bytes)),this.elements.session.ratio.innerHTML=t.ratioString(r),h(this.elements.session.time,t.timeInterval(o.seconds_active)),o=e.cumulative_stats,r=S.ratio(o.uploaded_bytes,o.downloaded_bytes),h(this.elements.total.up,t.size(o.uploaded_bytes)),h(this.elements.total.down,t.size(o.downloaded_bytes)),this.elements.total.ratio.innerHTML=t.ratioString(r),h(this.elements.total.time,t.timeInterval(o.seconds_active))}static _create(){let e=X("statistics-dialog"),{confirm:t,dismiss:o,heading:r,root:s,workarea:n}=e;t.remove(),o.textContent="Close",delete e.confirm;let a="Statistics";s.setAttribute("aria-label",a),r.textContent=a;let i=["Uploaded:","Downloaded:","Ratio:","Running time:"],l=be("Current session",i),[p,d,g,u]=l.children,b=e.session={};b.up=p,b.down=d,b.ratio=g,b.time=u,n.append(l.root),l=be("Total",i);let[C,f,y,I]=l.children,A=e.total={};return A.up=C,A.down=f,A.ratio=y,A.time=I,n.append(l.root),e}};var w={formatETA:c=>{let e=c.getETA();return e<0||e>=999*60*60?"":`ETA: ${G.timeInterval(e,1)}`},formatLabels:(c,e)=>{let t=c.getLabels();e.innerHTML="";for(let o of t){let r=document.createElement("span");r.classList.add("torrent-label"),r.textContent=o,e.append(r)}},getProgressInfo:(c,e)=>{let t=e.getStatus(),o=["torrent-progress-bar"],r=100,s=null;if(t===B._StatusStopped&&o.push("paused"),e.needsMetaData())o.push("magnet"),r=e.getMetadataPercentComplete()*100;else if(t===B._StatusCheck)o.push("verify"),r=e.getRecheckProgress()*100;else if(e.getLeftUntilDone()>0)o.push("leech"),r=e.getPercentDone()*100;else if(o.push("seed"),t!==B._StatusStopped){let n=e.seedRatioLimit(c);s=n>0?e.getUploadRatio()*100/n:100}return e.isQueued()&&o.push("queued"),{classList:o,percent:r,ratio:s}},renderProgressbar:(c,e,t)=>{let o=w.getProgressInfo(c,e),r=Math.min(o.ratio||o.percent,100),s=`${G.percentString(r,2)}%`;t.className=o.classList.join(" "),t.style.setProperty("--progress",s),t.dataset.progress=o.ratio?"100%":s},symbol:{down:"\u25BC",up:"\u25B2"},updateIcon:(c,e)=>{c.dataset.iconMimeType=e.getPrimaryMimeType().split("/",1).pop(),c.dataset.iconMultifile=e.getFileCount()>1?"true":"false"}},z=class c{static renderPeerDetails(e,t){let o=G,r=e.getError()!==B._ErrNone;t.classList.toggle("error",r);let s=e.getErrorMessage();if(s)h(t,s);else if(e.isDownloading()){let n=e.getPeersConnected(),a=e.getWebseedsSendingToUs(),i=["Downloading from"];n&&(i.push(e.getPeersSendingToUs(),"of",o.countString("peer","peers",n)),a&&i.push("and")),a&&i.push(o.countString("web seed","web seeds",a)),i.push("-",w.symbol.down,o.speedBps(e.getDownloadSpeed()),w.symbol.up,o.speedBps(e.getUploadSpeed())),h(t,i.join(" "))}else if(e.isSeeding()){let n=["Seeding to",e.getPeersGettingFromUs(),"of",o.countString("peer","peers",e.getPeersConnected()),"-",w.symbol.up,o.speedBps(e.getUploadSpeed())].join(" ");h(t,n)}else if(e.isChecking()){let n=["Verifying local data (",o.percentString(100*e.getRecheckProgress(),1),"% tested)"].join("");h(t,n)}else h(t,e.getStateString())}static renderProgressDetails(e,t,o){let r=G;if(t.needsMetaData()){let l="retrieving";t.isStopped()&&(l="needs");let p=100*t.getMetadataPercentComplete(),d=["Magnetized transfer - ",l," metadata (",r.percentString(p,1),"%)"].join("");h(o,d);return}let s=t.getSizeWhenDone(),n=t.getTotalSize(),a=t.isDone()||t.isSeeding(),i=[];if(a?(n===s?i.push(r.size(n)):i.push(r.size(s)," of ",r.size(t.getTotalSize())," (",t.getPercentDoneStr(),"%)"),i.push(", uploaded ",r.size(t.getUploadedEver())," (Ratio: ",r.ratioString(t.getUploadRatio()),")")):i.push(r.size(s-t.getLeftUntilDone())," of ",r.size(s)," (",t.getPercentDoneStr(),"%)"),!t.isStopped()&&(!a||t.seedRatioLimit(e)>0)){i.push(" - ");let l=t.getETA();l<0||l>=999*60*60?i.push("remaining time unknown"):i.push(r.timeInterval(t.getETA(),1)," remaining")}h(o,i.join(""))}render(e,t,o){let r=t.isStopped();o.classList.toggle("paused",r);let{labels:s,name:n,peer_details:a,progressbar:i,progress_details:l}=o;h(n,t.getName()),w.formatLabels(t,s),c.renderProgressDetails(e,t,l),w.renderProgressbar(e,t,i),c.renderPeerDetails(t,a)}createRow(e){let t=document.createElement("li");t.className="torrent";let o=[["icon","icon"],["name","torrent-name"],["labels","torrent-labels"],["progress_details","torrent-progress-details"],["progressbar","torrent-progress-bar"],["peer_details","torrent-peer-details"]];for(let[r,s]of o){let n=document.createElement("div");n.className=s,t.append(n),t[r]=n}return w.updateIcon(t.icon,e),t}},j=class c{static renderPeerDetails(e,t){let o=G,r=e.getError()!==B._ErrNone;t.classList.toggle("error",r);let s=e.getErrorMessage();if(s)h(t,s);else if(e.isDownloading()){let n=e.getDownloadSpeed()>0,a=e.getUploadSpeed()>0;if(!a&&!n)h(t,"Idle");else{let i=[w.formatETA(e)];n&&i.push(w.symbol.down,o.speedBps(e.getDownloadSpeed())),a&&i.push(w.symbol.up,o.speedBps(e.getUploadSpeed())),h(t,i.join(" "))}}else if(e.isSeeding()){let n=["Ratio:",o.ratioString(e.getUploadRatio()),"-",w.symbol.up,o.speedBps(e.getUploadSpeed())].join(" ");h(t,n)}else h(t,e.getStateString())}render(e,t,o){o.classList.toggle("paused",t.isStopped());let{labels:r,name:s,peer_details:n,progressbar:a}=o;h(s,t.getName()),w.formatLabels(t,r),c.renderPeerDetails(t,n),w.renderProgressbar(e,t,a),a.classList.add("compact")}createRow(e){let t=document.createElement("li");t.className="torrent compact";let o=[["icon","icon"],["name","torrent-name compact"],["labels","torrent-labels compact"],["peer_details","torrent-peer-details compact"],["progressbar","torrent-progress-bar compact"]];for(let[r,s]of o){let n=document.createElement("div");n.className=s,t.append(n),t[r]=n}return w.updateIcon(t.icon,e),t}};var Qe=xe(Le(),1);var ue=class c extends EventTarget{constructor(e,t,o){super(),this.action_manager=e,this.handler=null,this.notifications=t,this.prefs=o,this.remote=new H(this),this.speed={down:document.querySelector("#speed-down"),up:document.querySelector("#speed-up")};for(let[a,i]of[["#toolbar-open","open"],["#toolbar-delete","delete"],["#toolbar-start","start"],["#toolbar-pause","pause"],["#toolbar-inspector","inspector"],["#toolbar-overflow","overflow"]])document.querySelector(a).prepend($[i](),document.createElement("BR"));document.querySelector(".speed-container").append($.speedDown()),document.querySelector(".speed-container + .speed-container").append($.speedUp()),this.addEventListener("torrent-selection-changed",a=>this.action_manager.update(a)),this.filterText="",this._torrents={},this._selectedTorrentIds=new Set,this._torrentOrder=[],this._clusterize=null,this.oldTrackers=[],this.changeStatus=!1,this.refilterAllSoon=R(()=>this._refilter()),this.pointer_device=Object.seal({is_touch_device:"ontouchstart"in globalThis,long_press_callback:null,x:0,y:0}),this.popup=Array.from({length:c.max_popups}).fill(null),this.busytyping=!1;for(let a of document.querySelectorAll("button[data-action]")){let{action:i}=a.dataset;L(a,this.action_manager.isEnabled(i)),a.addEventListener("click",()=>{this.action_manager.click(i)})}document.querySelector("#filter-tracker").addEventListener("change",a=>{this.setFilterTracker(a.target.value)}),this.action_manager.addEventListener("change",a=>{for(let i of document.querySelectorAll(`[data-action="${a.action}"]`))L(i,a.enabled)}),this.action_manager.addEventListener("click",a=>{switch(a.action){case"copy-name":navigator.clipboard?navigator.clipboard.writeText(this.handler.subtree.name):prompt("Select all then copy",this.handler.subtree.name),this.handler.classList.remove("selected");break;case"deselect-all":this._deselectAll();break;case"move-bottom":this._moveBottom();break;case"move-down":this._moveDown();break;case"move-top":this._moveTop();break;case"move-up":this._moveUp();break;case"open-appearance-settings":this.popup[c.default_popup_level]instanceof D?this.popup[c.default_popup_level].close():this.setCurrentPopup(new D(this.prefs,this.action_manager));break;case"open-torrent":this.setCurrentPopup(new Y(this,this.remote));break;case"pause-all-torrents":this._stopTorrents(this._getAllTorrents());break;case"pause-selected-torrents":this._stopTorrents(this.getSelectedTorrents());break;case"reannounce-selected-torrents":this._reannounceTorrents(this.getSelectedTorrents());break;case"remove-selected-torrents":this._removeSelectedTorrents(!1);break;case"resume-selected-torrents":this._startSelectedTorrents(!1);break;case"resume-selected-torrents-now":this._startSelectedTorrents(!0);break;case"select-all":this._selectAll();break;case"show-about-dialog":this.setCurrentPopup(new oe(this.version_info));break;case"show-inspector":this.popup[0]instanceof E?this.popup[0].close():this.setCurrentPopup(new E(this),0);break;case"show-move-dialog":this.setCurrentPopup(new ie(this,this.remote));break;case"show-overflow-menu":this.popup[c.default_popup_level]instanceof J?this.popup[c.default_popup_level].close():this.setCurrentPopup(new J(this,this.prefs,this.remote,this.action_manager));break;case"show-preferences-dialog":this.setCurrentPopup(new ae(this,this.remote),0);break;case"show-shortcuts-dialog":this.setCurrentPopup(new ge(this.action_manager));break;case"show-statistics-dialog":this.setCurrentPopup(new pe(this.remote));break;case"show-rename-dialog":this.setCurrentPopup(new le(this,this.remote));break;case"show-labels-dialog":this.setCurrentPopup(new de(this,this.remote));break;case"start-all-torrents":this._startTorrents(this._getAllTorrents());break;case"toggle-compact-rows":this.prefs.display_mode=this.prefs.display_mode===m.DisplayCompact?m.DisplayFull:m.DisplayCompact;break;case"trash-selected-torrents":this._removeSelectedTorrents(!0);break;case"verify-selected-torrents":this._verifyTorrents(this.getSelectedTorrents());break;default:console.warn(`unhandled action: ${a.action}`)}});let r=document.querySelector("#filter-mode");V(r,null,[["All",m.FilterAll]]),V(r,"status",[["Active",m.FilterActive],["Downloading",m.FilterDownloading],["Seeding",m.FilterSeeding],["Paused",m.FilterPaused],["Finished",m.FilterFinished],["Error",m.FilterError]]),V(r,"list",[["Private torrents",m.FilterPrivate],["Public torrents",m.FilterPublic]]),r.value=this.prefs.filter_mode,r.addEventListener("change",a=>{this.prefs.filter_mode=a.target.value,this.refilterAllSoon()}),r=document.querySelector("#filter-tracker"),V(r,null,[["All",m.FilterAll]]);let s=document.querySelector("#torrent-search");r=document.querySelector("#reset"),r.addEventListener("click",()=>{s.value="",this._setFilterText(s.value),this.refilterAllSoon()}),s.value.trim()&&(this.filterText=s.value,r.style.display="block",this.refilterAllSoon()),r=document.querySelector("#turtle"),r.addEventListener("click",a=>{this.remote.savePrefs({[x._TurtleState]:!a.target.classList.contains("alt-speed-enabled")})}),document.addEventListener("keydown",this._keyDown.bind(this)),document.addEventListener("keyup",this._keyUp.bind(this)),r=document.querySelector("#torrent-container"),r.addEventListener("click",a=>{this.popup[c.default_popup_level]&&this.setCurrentPopup(null),a.target===a.currentTarget&&this._deselectAll()}),r.addEventListener("dblclick",()=>{(!this.popup[0]||this.popup[0].name!=="inspector")&&this.action_manager.click("show-inspector")}),r.addEventListener("dragenter",c._dragenter),r.addEventListener("dragover",c._dragenter),r.addEventListener("drop",this._drop.bind(this)),this._setupSearchBox(),this.elements={torrent_container:document.querySelector("#torrent-container"),torrent_list:document.querySelector("#torrent-list")},this._initializeClusterize();let n=a=>{let i=a.target;for(;i&&!i.classList.contains("torrent");)i=i.parentNode;let l=i?.dataset?.torrentId;if(l){let p=Number.parseInt(l,10);this._selectedTorrentIds.has(p)||(this._setSelectedTorrent(p),this._last_torrent_clicked=p)}this.handler&&(this.handler.classList.remove("selected"),this.handler=null),this.context_menu("#torrent-container"),a.preventDefault()};this.pointer_event(this.elements.torrent_list,n),this.elements.torrent_list.addEventListener("click",this._onRowClicked.bind(this)),this.loadDaemonPrefs(),this._initializeTorrents(),this.refreshTorrents(),this.togglePeriodicSessionRefresh(!0),this.prefs.addEventListener("change",({key:a,value:i})=>this._onPrefChanged(a,i));for(let[a,i]of this.prefs.entries())this._onPrefChanged(a,i)}_initializeClusterize(){this._clusterize=new Qe.default({blocks_in_cluster:4,callbacks:{clusterChanged:()=>{this._updateVisibleSelections()}},contentId:"torrent-list",no_data_class:"",no_data_text:"",rows:["
  • "],rows_in_block:25,scrollId:"torrent-container",show_no_data_row:!0,tag:"li"})}_generateTorrentRowHTML(e){let o=this.prefs.display_mode===m.DisplayCompact?new j:new z,r=o.createRow(e);return r.dataset.torrentId=e.getId(),this._selectedTorrentIds.has(e.getId())&&r.classList.add("selected"),o.render(this,e,r),r.outerHTML}_openTorrentFromUrl(){setTimeout(()=>{let e=new URLSearchParams(globalThis.location.search).get("addtorrent");if(e){this.setCurrentPopup(new Y(this,this.remote,e));let t=new URL(globalThis.location);t.search="",globalThis.history.pushState("","",t.toString())}},0)}loadDaemonPrefs(){this.remote.loadDaemonPrefs(e=>{this.session_properties=e.result,this._openTorrentFromUrl()})}get session_properties(){return this._session_properties}set session_properties(e){if(q(this._session_properties,e))return;this._session_properties=Object.seal(e);let t=new Event("session-change");t.session_properties=e,this.dispatchEvent(t),this._updateGuiFromSession(e)}_setupSearchBox(){let e=document.querySelector("#torrent-search"),t="blur";e.classList.add(t),e.addEventListener("blur",()=>e.classList.add(t)),e.addEventListener("focus",()=>e.classList.remove(t)),e.addEventListener("input",()=>{e.value.trim()!==this.filterText&&this._setFilterText(e.value)})}_onPrefChanged(e,t){switch(e){case m.DisplayMode:{this.torrentRenderer=t==="compact"?new j:new z,this.refilterAllSoon();break}case m.ContrastMode:{document.body.classList.remove("contrast-more","contrast-less"),document.body.classList.add(`contrast-${t}`);break}case m.FilterMode:case m.SortDirection:case m.SortMode:this.refilterAllSoon();break;case m.HighlightColor:{document.body.classList.remove("highlight-legacy","highlight-system"),t?t==="Highlight"&&document.body.classList.add("highlight-system"):document.body.classList.add("highlight-legacy");break}case m.RefreshRate:{clearInterval(this.refreshTorrentsInterval);let o=this.refreshTorrents.bind(this),r=this.prefs.refresh_rate_sec,s=r>0?r*1e3:1e3;this.refreshTorrentsInterval=setInterval(o,s);break}default:break}}context_menu(e,t){let o=new re(this,t);this.setCurrentPopup(o);let r=document.querySelector(e).getBoundingClientRect(),s=Math.min(this.pointer_device.x,r.right+globalThis.scrollX-o.root.clientWidth),n=Math.min(this.pointer_device.y,r.bottom+globalThis.scrollY-o.root.clientHeight);o.root.style.left=`${Math.max(s,0)}px`,o.root.style.top=`${Math.max(n,0)}px`}pointer_event(e,t){if(this.pointer_device.is_touch_device){let o=this.pointer_device;e.addEventListener("touchstart",r=>{o.x=r.touches[0].pageX,o.y=r.touches[0].pageY,o.long_press_callback?(clearTimeout(o.long_press_callback),o.long_press_callback=null):o.long_press_callback=setTimeout(()=>{r.touches.length===1&&t(r)},500)}),e.addEventListener("touchend",()=>{clearTimeout(o.long_press_callback),o.long_press_callback=null,setTimeout(()=>{let r=this.popup[c.default_popup_level];r&&(r.root.style.pointerEvents="auto")},1)}),e.addEventListener("touchmove",r=>{o.x=r.touches[0].pageX,o.y=r.touches[0].pageY,clearTimeout(o.long_press_callback),o.long_press_callback=null}),e.addEventListener("contextmenu",r=>{r.preventDefault()})}else e.addEventListener("mousemove",o=>{this.pointer_device.x=o.pageX,this.pointer_device.y=o.pageY}),e.addEventListener("contextmenu",o=>{t(o);let r=this.popup[c.default_popup_level];r&&(r.root.style.pointerEvents="auto")})}static get max_popups(){return 2}static get default_popup_level(){return c.max_popups-1}_getAllTorrents(){return Object.values(this._torrents)}static _getTorrentIds(e){return e.map(t=>t.getId())}seedRatioLimit(){let e=this.session_properties;return e&&e.seed_ratio_limited?e.seed_ratio_limit:-1}getSelectedTorrents(){return[...this._selectedTorrentIds].map(e=>this._torrents[e]).filter(Boolean)}_getSelectedTorrentIds(){return[...this._selectedTorrentIds]}_setSelectedTorrent(e){this._selectedTorrentIds.clear(),e&&this._selectedTorrentIds.add(e),this._updateVisibleSelections(),this._dispatchSelectionChanged()}_selectTorrent(e){this._selectedTorrentIds.add(e),this._updateVisibleSelections(),this._dispatchSelectionChanged()}_deselectTorrent(e){this._selectedTorrentIds.delete(e),this._updateVisibleSelections(),this._dispatchSelectionChanged()}_selectAll(){for(let e of this._torrentOrder)this._selectedTorrentIds.add(e.getId());this._updateVisibleSelections(),this._dispatchSelectionChanged()}_deselectAll(){this._selectedTorrentIds.clear(),this._updateVisibleSelections(),this._dispatchSelectionChanged(),delete this._last_torrent_clicked}_updateVisibleSelections(){if(this.elements.torrent_list)for(let e of this.elements.torrent_list.children){let t=Number.parseInt(e.dataset.torrentId,10);t&&e.classList.toggle("selected",this._selectedTorrentIds.has(t))}}_indexOfLastTorrent(){return this._last_torrent_clicked?this._torrentOrder.findIndex(e=>e.getId()===this._last_torrent_clicked):-1}_selectRange(e){e&&e.getTorrent&&this._selectRangeToTorrent(e.getTorrent().getId())}_selectRangeToTorrent(e){if(!this._last_torrent_clicked){this._selectTorrent(e);return}let t=this._torrentOrder.findIndex(n=>n.getId()===e),o=this._torrentOrder.findIndex(n=>n.getId()===this._last_torrent_clicked);if(t===-1||o===-1){this._selectTorrent(e);return}let r=Math.min(o,t),s=Math.max(o,t);for(let n=r;n<=s;++n)this._selectTorrent(this._torrentOrder[n].getId())}_dispatchSelectionChanged(){let e=[],t=[];for(let r of Object.values(this._torrents))this._selectedTorrentIds.has(r.getId())?t.push(r):e.push(r);let o=new Event("torrent-selection-changed");o.nonselected=e,o.selected=t,this.dispatchEvent(o)}static _createKeyShortcutFromKeyboardEvent(e){let t=[];return e.ctrlKey&&t.push("Control"),e.altKey&&t.push("Alt"),e.metaKey&&t.push("Meta"),e.shiftKey&&t.push("Shift"),t.push(e.key.length===1?e.key.toUpperCase():e.key),t.join("+")}_keyDown(e){let{ctrlKey:t,keyCode:o,metaKey:r,shiftKey:s,target:n}=e,a=["INPUT","TEXTAREA"].includes(n.tagName);if(!a){let d=c._createKeyShortcutFromKeyboardEvent(e),g=this.action_manager.getActionForShortcut(d);if(g){e.preventDefault(),this.action_manager.click(g);return}}if(o===27&&this.popup.some(Boolean)){this.setCurrentPopup(null,0),e.preventDefault();return}let l=document.querySelector(".popup:not(.hidden)"),p=this._torrentOrder;if(!a&&!l&&!r&&!t){let d=o===16,g=o===38,u=o===40;if((g||u)&&p.length>0){let b=this._indexOfLastTorrent(),C=this._shift_index,f=0,y=p.length-1,I=b;u&&I+1<=y?++I:g&&I-1>=f&&--I;let A=p[I];if(C>=0?C<=b&&b=b&&b>I?this._selectTorrent(A.getId()):(C>=b&&I>b||C<=b&&b>I)&&this._deselectTorrent(p[b].getId()):s?this._selectRangeToTorrent(A.getId()):this._setSelectedTorrent(A.getId()),A){e.preventDefault(),this._last_torrent_clicked=A.getId();let v=[...this.elements.torrent_list.children].find(F=>Number.parseInt(F.dataset.torrentId,10)===A.getId());v&&v.scrollIntoView({block:"nearest",inline:"nearest"})}}else d&&(this._shift_index=this._indexOfLastTorrent())}}_keyUp(e){e.keyCode===16&&delete this._shift_index}static _dragenter(e){if(e.dataTransfer&&e.dataTransfer.types){let t=new Set(["text/uri-list","text/plain"]);if(e.dataTransfer.types.some(o=>t.has(o))||e.dataTransfer.types.includes("Files"))return e.stopPropagation(),e.preventDefault(),e.dataTransfer.dropEffect="copy",!1}else e.dataTransfer&&(e.dataTransfer.dropEffect="none");return!0}static _isValidURL(e){try{return!!new URL(e)}catch{return!1}}shouldAddedTorrentsStart(){return this.session_properties.start_added_torrents}_drop(e){let t=!this.shouldAddedTorrentsStart();if(!e.dataTransfer||!e.dataTransfer.types)return!0;let o=e.dataTransfer.types.findLast(s=>["text/uri-list","text/plain"].includes(s));for(let s of e.dataTransfer.getData(o).split(` `).map(n=>n.trim()).filter(n=>c._isValidURL(n)))this.remote.addTorrentByUrl(s,t);let{files:r}=e.dataTransfer;return r.length>0&&this.setCurrentPopup(new Y(this,this.remote,"",r)),e.preventDefault(),!1}togglePeriodicSessionRefresh(e){!e&&this.sessionInterval&&(clearInterval(this.sessionInterval),delete this.sessionInterval),e&&(this.loadDaemonPrefs(),this.sessionInterval||(this.sessionInterval=setInterval(this.loadDaemonPrefs.bind(this),8e3)))}_setFilterText(e){clearTimeout(this.busytyping),this.busytyping=setTimeout(()=>{this.busytyping=!1,this.filterText=e.trim(),this.refilterAllSoon()},e?250:0)}_onTorrentChanged(){this.changeStatus&&(this._dispatchSelectionChanged(),this.changeStatus=!1),this.refilterAllSoon()}updateTorrents(e,t){this.remote.updateTorrents(e,t,(o,r)=>{let s=[],n=o.shift(),a={};for(let i of o){for(let[d,g]of n.entries())a[g]=i[d];let{id:l}=a,p=this._torrents[l];if(p){let d=p.needsMetaData();p.refresh(a),d&&!p.needsMetaData()&&s.push(l)}else p=this._torrents[l]=new B(a),p.addEventListener("dataChanged",this._onTorrentChanged.bind(this)),(!("name"in p.fields)||!("status"in p.fields))&&s.push(l)}if(s.length>0){let i=["id",...B.Fields.Metadata,...B.Fields.Stats];this.updateTorrents(s,i),this.refilterAllSoon()}r&&(this._deleteTorrents(r),this.refilterAllSoon())})}refreshTorrents(){let e=["id",...B.Fields.Stats];this.updateTorrents("recently_active",e)}_initializeTorrents(){let e=["id",...B.Fields.Metadata,...B.Fields.Stats];this.updateTorrents(null,e)}_onRowClicked(e){let t=e.target;for(;t&&!t.classList.contains("torrent");)t=t.parentNode;if(!t||!t.dataset.torrentId)return;let o=Number.parseInt(t.dataset.torrentId,10);if(!this._torrents[o])return;let s=e.metaKey||e.ctrlKey,n=this._selectedTorrentIds.has(o);this.popup[c.default_popup_level]&&this.setCurrentPopup(null),e.stopPropagation(),e.shiftKey?(this._selectRangeToTorrent(o),globalThis.focus()):!n&&s?this._selectTorrent(o):n?n&&s?this._deselectTorrent(o):n&&this._setSelectedTorrent(o):this._setSelectedTorrent(o),this._last_torrent_clicked=o}_deleteTorrents(e){if(e&&e.length>0){for(let t of e)delete this._torrents[t];this.refilterAllSoon()}}_removeSelectedTorrents(e){let t=this.getSelectedTorrents();t.length>0&&this.setCurrentPopup(new ce({remote:this.remote,torrents:t,trash:e}))}_startSelectedTorrents(e){this._startTorrents(this.getSelectedTorrents(),e)}_startTorrents(e,t){this.changeStatus=!0,this.remote.startTorrents(c._getTorrentIds(e),t,this.refreshTorrents,this)}_verifyTorrents(e){this.remote.verifyTorrents(c._getTorrentIds(e),this.refreshTorrents,this)}_reannounceTorrents(e){this.remote.reannounceTorrents(c._getTorrentIds(e),this.refreshTorrents,this)}_stopTorrents(e){this.changeStatus=!0,this.remote.stopTorrents(c._getTorrentIds(e),()=>{setTimeout(()=>{this.refreshTorrents()},500)},this)}changeFileCommand(e,t,o){this.remote.changeFileCommand(e,t,o)}_moveTop(){this.remote.moveTorrentsToTop(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveUp(){this.remote.moveTorrentsUp(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveDown(){this.remote.moveTorrentsDown(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveBottom(){this.remote.moveTorrentsToBottom(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_updateGuiFromSession(e){let[,t,o]=e.version.match(/^(.*)\s\(([\da-f]+)\)/);this.version_info={checksum:o,version:t},document.querySelector("#turtle").classList.toggle("alt-speed-enabled",e[x._TurtleState])}_updateStatusbar(){let e=G,t=this._getAllTorrents(),o=t.reduce((n,a)=>n+a.getUploadSpeed(),0),r=t.reduce((n,a)=>n+a.getDownloadSpeed(),0),s=e.countString("Transfer","Transfers",this._torrentOrder.length);h(this.speed.down,e.speedBps(r)),h(this.speed.up,e.speedBps(o)),h(document.querySelector("#filter-count"),s)}static _displayName(e){let t=e;return t.length>0&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}_updateFilterSelect(){let e=this._getTrackerCounts(),t=Object.keys(e).toSorted();if(t.length!==this.oldTrackers.length||t.some((o,r)=>o!==this.oldTrackers[r])){this.oldTrackers=t;let o=[["All",m.FilterAll,!this.filterTracker],...t.map(s=>[c._displayName(s),s,s===this.filterTracker])],r=document.querySelector("#filter-tracker");for(;r.firstChild;)r.lastChild.remove();V(r,null,o)}}sortRows(e){let t=e.map(r=>r.getTorrent()),o=e.reduce((r,s)=>(r[s.getTorrent().getId()]=s,r),{});B.sortTorrents(t,this.prefs.sort_mode,this.prefs.sort_direction);for(let[r,s]of t.entries())e[r]=o[s.getId()]}_refilter(){let{sort_mode:e,sort_direction:t,filter_mode:o}=this.prefs,r=this.filterTracker,s=null,n=null,a=/^labels:([\w,-\s]*)(.*)$/.exec(this.filterText);a?(s=a[2].trim(),n=a[1].split(",")):(s=this.filterText,n=[]),this._updateFilterSelect();let i=[];for(let p of Object.values(this._torrents))p.test(o,r,s,n)&&i.push(p);i.sort((p,d)=>B.compareTorrents(p,d,e,t)),this._torrentOrder=i;let l=i.map(p=>this._generateTorrentRowHTML(p));l.length===0?this._clusterize.update(["
  • "]):this._clusterize.update(l),l.length>100&&setTimeout(()=>{this._clusterize.refresh(!0)},50),this._updateStatusbar(),setTimeout(()=>{this._updateVisibleSelections()},0)}setFilterTracker(e){let t=document.querySelector("#filter-tracker");t.value=e,this.filterTracker=e===m.FilterAll?"":e,this.refilterAllSoon()}_getTrackerCounts(){let e={};for(let t of this._getAllTorrents())for(let o of t.getTrackers()){let{sitename:r}=o;e[r]=(e[r]||0)+1}return e}setCurrentPopup(e,t=c.default_popup_level){for(let o=t;o{this.popup[t]&&(this.popup[t].removeEventListener("close",o),this.popup[t]=null)};this.popup[t].addEventListener("close",o)}else this.handler&&this.handler.classList.remove("selected")}};function Pe(){let c=new P,e=new m,t=new te(e),o=new ue(c,t,e),r=R(()=>o.elements.torrent_list.scrollTo(0,1));globalThis.addEventListener("load",r),globalThis.addEventListener("orientationchange",r)}document.addEventListener("DOMContentLoaded",Pe);})(); //# sourceMappingURL=transmission-app.js.map