diff --git a/lib/single-file-extension-background.js b/lib/single-file-extension-background.js index 5ec527dac..65e34f2a5 100644 --- a/lib/single-file-extension-background.js +++ b/lib/single-file-extension-background.js @@ -1 +1 @@ -!function(){"use strict";const e=["[","]","^","-","\\"],t=new Map([["~","~"],["+","+"],["?","?"],["%","%"],["*","*"],[":",":"],["|","|"],['"',"""],["<","<"],[">",">"],["\\","\"]]),n=Array.from(t.keys()).map(function(t){return 1==t.length&&e.includes(t)?"\\"+t:t}),a=n.concat(["\0-",""]),r=Array.from(t.values()),o=new RegExp("["+n.join("")+"]","g");async function i(e,n,a){let r;const s=new Promise((e,t)=>{browser.downloads.onChanged.addListener(function n(a){a.id==r&&a.state&&("complete"==a.state.current&&(browser.downloads.search({id:r}).then(t=>e({filename:t[0]&&t[0].filename})).catch(()=>e({})),browser.downloads.onChanged.removeListener(n)),"interrupted"==a.state.current&&(a.error&&"USER_CANCELED"==a.error.current?e({cancelled:!0}):t(new Error(a.state.current)),browser.downloads.onChanged.removeListener(n)))})});try{r=await browser.downloads.download(e)}catch(r){if(r.message){const s=r.message.toLowerCase(),c=s.includes("illegal characters")||s.includes("invalid filename"),l=function(e,t){return e.replace(/[\u00A0\u1680\u2000-\u200A\u202F\u205F\uFEFF]/g," ").replace(/\p{Cf}/gu,t).replace(/[\u0000-\u001F\u007F-\u009F\u2028\u2029]/g,"").split("/").map(e=>e.replace(/^[\s.\u180E]+|[\s.\u180E]+$/g,"")).join("/")}(e.filename,n);if(c&&e.filename.startsWith("."))return e.filename=n+e.filename,i(e,n,a);if(c&&e.filename.includes(","))return e.filename=e.filename.replace(/,/g,n),i(e,n,a);if(c&&l!=e.filename)return e.filename=l,i(e,n,a);if(c&&e.filename.match(o))return e.filename=e.filename.replace(o,e=>t.get(e)),i(e,n,a);if(c&&!e.filename.match(/^[\x00-\x7F]+$/))return e.filename=e.filename.replace(/[^\x00-\x7F]+/g,n),i(e,n,a);if((s.includes("'incognito'")||s.includes('"incognito"'))&&e.incognito)return delete e.incognito,i(e,n,a);if("conflictaction prompt not yet implemented"==s&&e.conflictAction){if(delete e.conflictAction,a&&!e.saveAs){const t=await a(e.filename);if(!t)return{cancelled:!0};e.filename=t}return i(e,n,a)}if(s.includes("canceled"))return{cancelled:!0};throw r}throw r}return s}let s,c,l;async function u(e,t,n){e[n]&&!e[t]&&(e[t]=e[n],delete e[n])}async function d(e){c&&delete c[e];const t=await m();if(t[e]){const n=t[e].autoSave;t[e]={autoSave:n},await h(t)}}function f(e){return c||(c={}),void 0===e||c[e]||(c[e]={}),c}async function m(e){if(!s){const e=await browser.storage.local.get();s=e.tabsData||{}}return async function(){if(!l){l=!0;const e=await browser.tabs.query({currentWindow:!0,highlighted:!0});Object.keys(s).filter(t=>{if("autoSaveAll"!=t&&"autoSaveUnpinned"!=t&&"profileName"!=t)return!e.find(e=>e.id==t)}).forEach(e=>delete s[e]),await browser.storage.local.set({tabsData:s})}}(),void 0===e||s[e]||(s[e]={}),s}async function h(e){s=e,await browser.storage.local.set({tabsData:e})}setTimeout(()=>m().then(e=>s=e),0);const w=["page","button","tab"],p=["page","selection","frame","link"],b={"save-page":{labelKey:"menuSavePage",bindable:!0},"edit-and-save-page":{labelKey:"menuEditAndSavePage",altLabelKey:"menuEditPage",bindable:!0},"save-selection":{labelKey:"menuSaveSelection",bindable:!0},"save-selected-links":{labelKey:"menuSaveSelectedLinks",contexts:["selection"]},"save-frame":{labelKey:"menuSaveFrame",contexts:["frame"],surfaces:["page"]},"save-with-profile":{labelKey:"menuSaveWithProfile",dynamic:"profiles"},"save-tabs":{labelKey:"menuSaveTabs",container:!0,preset:["save-selected-tabs","save-unpinned-tabs","save-all-tabs"]},"save-selected-tabs":{labelKey:"menuSaveSelectedTabs",bindable:!0},"save-unpinned-tabs":{labelKey:"menuSaveUnpinnedTabs",bindable:!0},"save-all-tabs":{labelKey:"menuSaveAllTabs",bindable:!0},"select-profile":{labelKey:"menuSelectProfile",dynamic:"radio-profiles"},"domain-rule":{labelKey:"menuCreateDomainRule",altLabelKey:"menuUpdateRule",dynamic:"radio-rule"},"auto-save":{labelKey:"menuAutoSave",dynamic:"radio-autosave"},"batch-save-urls":{labelKey:"menuBatchSaveUrls"},"view-pendings":{labelKey:"menuViewPendingSaves"},submenu:{labelKey:"menuSubmenu",container:!0},separator:{labelKey:"menuSeparator",separator:!0}};function g(e,t={}){const n=b[e],a=Object.assign({action:e},t);return n.container&&(a.children=t.children||(n.preset||[]).map(e=>g(e))),a}function y(e){if(!e||"object"!=typeof e)return null;const t={};return w.forEach(n=>t[n]=v(e[n])),t}function v(e){return(Array.isArray(e)?e:[]).filter(e=>e&&"object"==typeof e&&b[e.action]).map(e=>{const t=b[e.action],n={};return"string"==typeof e.label&&e.label.trim()&&(n.label=e.label.trim()),t.bindable&&"string"==typeof e.profile&&e.profile&&(n.profile=e.profile),"profiles"==t.dynamic&&e.inline&&(n.inline=!0),!Array.isArray(e.contexts)||t.dynamic||t.separator||(n.contexts=p.filter(t=>e.contexts.includes(t))),t.container&&Array.isArray(e.children)&&(n.children=v(e.children)),g(e.action,n)})}const A="-",k="__Default_Settings__",x="__Disabled_Settings__",T="regexp:",S="profile_",C="externalCaptureAllowedExtensionIds",I="externalCaptureDeniedExtensionIds",E="menuLayout",P=!/Safari/.test(navigator.userAgent)||/Chrome/.test(navigator.userAgent)||/Vivaldi/.test(navigator.userAgent)||/OPR/.test(navigator.userAgent),R=/Mobile.*Firefox/.test(navigator.userAgent),U=!(R||/Safari/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/Vivaldi/.test(navigator.userAgent)&&!/OPR/.test(navigator.userAgent)),D=!R,F=P,L=P,_=P,O=P,W=P,B=P,N=P,M=P,j=P,q=P,z=P,K=navigator.canShare&&navigator.canShare({files:[new File([new Blob([""],{type:"text/html"})],"test.html")]}),H=Boolean(browser.menus&&browser.menus.onClicked&&browser.menus.create&&browser.menus.update&&browser.menus.removeAll),V=["~","+","\\\\","?","%","*",":","|",'"',"<",">","\0-",""],$={loadDeferredImages:"loadDeferredContent",loadDeferredImagesMaxIdleTime:"loadDeferredContentMaxIdleTime",loadDeferredImagesBlockCookies:"loadDeferredContentBlockCookies",loadDeferredImagesBlockStorage:"loadDeferredContentBlockStorage",loadDeferredImagesKeepZoomLevel:"loadDeferredContentKeepZoomLevel",loadDeferredImagesBeforeFrames:"loadDeferredContentBeforeFrames",loadDeferredImagesDispatchScrollEvent:null},G={removeHiddenElements:!0,removedElementsSelector:"",removeUnusedStyles:!0,removeUnusedFonts:!0,removeFrames:!1,compressHTML:!0,loadDeferredContent:!0,loadDeferredContentMaxIdleTime:1500,loadDeferredContentBlockCookies:!1,loadDeferredContentBlockStorage:!1,loadDeferredContentKeepZoomLevel:!1,loadDeferredContentDispatchScrollEvent:!0,loadDeferredContentBeforeFrames:!1,loadDeferredContentMinZoomFactor:0,filenameTemplate:"%if-empty<{page-title}|No title> ({date-locale} {time-locale}).{filename-extension}",infobarTemplate:"",includeInfobar:!P,openInfobar:!1,animateInfobar:!0,confirmInfobarContent:!1,autoClose:!1,confirmFilename:!1,filenameConflictAction:"uniquify",filenameMaxLength:192,filenameMaxLengthUnit:"bytes",filenameReplacedCharacters:a,filenameReplacementCharacter:"_",filenameReplacementCharacters:r,replaceEmojisInFilename:!1,saveFilenameTemplateData:!1,contextMenuEnabled:!0,tabMenuEnabled:!0,browserActionMenuEnabled:!0,shadowEnabled:!0,logsEnabled:!0,progressBarEnabled:!0,maxResourceSizeEnabled:!1,maxResourceSize:10,displayInfobar:!0,displayStats:!1,backgroundSave:U,defaultEditorMode:"normal",applySystemTheme:!0,contentWidth:70,autoSaveDelay:1,autoSaveLoad:!1,autoSaveUnload:!1,autoSaveLoadOrUnload:!0,autoSaveDiscard:!1,autoSaveRemove:!1,autoSaveRepeat:!1,autoSaveRepeatDelay:10,removeAlternativeFonts:!0,removeAlternativeMedias:!0,removeAlternativeImages:!0,groupDuplicateImages:!0,maxSizeDuplicateImages:524288,saveRawPage:!1,saveToClipboard:!1,addProof:!1,saveToGDrive:!1,saveToDropbox:!1,saveWithWebDAV:!1,webDAVURL:"",webDAVUser:"",webDAVPassword:"",saveWithMCP:!1,mcpServerUrl:"",mcpAuthToken:"",saveToGitHub:!1,saveToRestFormApi:!1,saveToS3:!1,githubToken:"",githubUser:"",githubRepository:"SingleFile-Archives",githubBranch:"main",saveWithCompanion:!1,sharePage:!1,forceWebAuthFlow:!1,resolveFragmentIdentifierURLs:!1,userScriptEnabled:!1,openEditor:!1,openSavedPage:!1,autoOpenEditor:!1,saveCreatedBookmarks:!1,allowedBookmarkFolders:[],ignoredBookmarkFolders:[],replaceBookmarkURL:!0,saveFavicon:!0,includeBOM:!1,warnUnsavedPage:!0,displayInfobarInEditor:!1,compressContent:!1,createRootDirectory:!1,selfExtractingArchive:!1,disableCompression:!1,extractDataFromPage:!1,preventAppendedData:!1,maxAppendedDataLength:16361,insertEmbeddedImage:!1,insertEmbeddedScreenshotImage:!1,insertTextBody:!1,autoSaveExternalSave:!1,insertMetaNoIndex:!1,insertMetaCSP:!0,insertCanonicalLink:!0,readMaffMetadata:!1,passReferrerOnError:!1,password:"",insertSingleFileComment:!0,removeSavedDate:!1,blockMixedContent:!1,saveOriginalURLs:!1,acceptHeaders:{font:"application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8",image:"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",stylesheet:"text/css,*/*;q=0.1",script:"*/*",document:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",video:"video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5",audio:"audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5"},moveStylesInHead:!1,networkTimeout:0,woleetKey:"",blockImages:!1,blockAlternativeImages:!0,blockStylesheets:!1,blockFonts:!1,blockScripts:!0,blockVideos:!0,blockAudios:!0,delayBeforeProcessing:0,delayAfterProcessing:0,_migratedTemplateFormat:!0,_migratedDeferredContentOptions:!0,saveToRestFormApiUrl:"",saveToRestFormApiFileFieldName:"",saveToRestFormApiUrlFieldName:"",saveToRestFormApiToken:"",S3Domain:"s3.amazonaws.com",S3Region:"",S3Bucket:"",S3AccessKey:"",S3SecretKey:"",resolveLinks:!0,groupDuplicateStylesheets:!1,infobarPositionAbsolute:!1,infobarPositionTop:"16px",infobarPositionRight:"16px",infobarPositionBottom:"",infobarPositionLeft:"",removeNoScriptTags:!0,customShortcut:null,imageReductionFactor:1,imageQuality:.8},J=[{url:"file:",profile:"__Default_Settings__",autoSaveProfile:"__Disabled_Settings__"}],Z={"page-title":"No title","page-heading":"No heading","page-language":"No language","page-description":"No description","page-author":"No author","page-creator":"No creator","page-publisher":"No publisher","url-hash":"No hash","url-host":"No host","url-hostname":"No hostname","url-href":"No href","url-href-digest-sha-1":"No hash","url-href-flat":"No href","url-referrer":"No referrer","url-referrer-flat":"No referrer","url-password":"No password","url-pathname":"No pathname","url-pathname-flat":"No pathname","url-port":"No port","url-protocol":"No protocol","url-search":"No search","url-username":"No username","tab-id":"No tab id","tab-index":"No tab index","url-last-segment":"No last segment"};let X,Q=Y();async function Y(){const{sync:e}=await browser.storage.local.get();X=e?browser.storage.sync:browser.storage.local;const t=await X.get();if(t[S+k])t.profiles&&await X.remove(["profiles"]);else if(t.profiles){const e=Object.keys(t.profiles);for(const n of e)await ge(n,t.profiles[n])}else await ge(k,G);t.rules||await X.set({rules:J}),t.maxParallelWorkers||await X.set({maxParallelWorkers:navigator.hardwareConcurrency||4}),t.processInForeground||await X.set({processInForeground:!1}),Array.isArray(t[C])||await X.set({[C]:[]}),Array.isArray(t[I])||await X.set({[I]:[]});(await we()).map(async e=>{const t=await be(e);t._migratedTemplateFormat||(t.filenameTemplate=function(e){try{return Object.keys(Z).forEach(t=>{const n=Z[t];e=e.replaceAll(`{${t}}`,`%if-empty<{${t}}|${n}>`)}),e}catch(e){}}(t.filenameTemplate),t._migratedTemplateFormat=!0),t._migratedDeferredContentOptions||(Object.keys($).forEach(e=>{const n=$[e];void 0!==t[e]&&(n&&void 0===t[n]&&(t[n]=t[e]),delete t[e])}),t._migratedDeferredContentOptions=!0);for(const e of Object.keys(G))void 0===t[e]&&(t[e]=G[e]);Ie(t.filenameReplacedCharacters,V)&&Ie(t.filenameReplacementCharacters,r)&&(t.filenameReplacedCharacters=a),await ge(e,t)})}async function ee(e,t){const{rules:n}=await X.get(["rules"]),a=n.filter(e=>le(e));let r=a.sort(ce).find(t=>e&&e.match(new RegExp(t.url.split(T)[1])));if(!r){const a=n.filter(e=>!le(e));r=a.sort(ce).find(n=>!t&&"*"==n.url||e&&e.includes(n.url))}return r}async function te(){await Q;const{maxParallelWorkers:e,processInForeground:t}=await X.get(["maxParallelWorkers","processInForeground"]),n=await he(),a=await de(),r=await ne(),o={profiles:a,rules:n,maxParallelWorkers:e,processInForeground:t};return r&&(o.menuLayout=r),o}async function ne(){await Q;return y((await X.get([E]))[E])}async function ae(e){await Q;const t=y(e);t?await X.set({[E]:t}):await X.remove([E])}async function re(e,t){const n=await ne();if(n){const a=n=>n.forEach(n=>{n.profile==e&&(t?n.profile=t:delete n.profile),n.children&&a(n.children)});Object.keys(n).forEach(e=>a(n[e])),await ae(n)}}async function oe(){await Q;const{externalCaptureAllowedExtensionIds:e=[],externalCaptureDeniedExtensionIds:t=[]}=await X.get([C,I]),n=se(e),a=se(t);return{allowedExtensions:n,allowedExtensionIds:n.map(e=>e.id),deniedExtensions:a,deniedExtensionIds:a.map(e=>e.id)}}async function ie({allowedExtensions:e,deniedExtensions:t}={}){await Q;const n={};void 0!==e&&(n[C]=se(e)),void 0!==t&&(n[I]=se(t)),await X.set(n)}function se(e){const t=new Set;return(e||[]).map(e=>"string"==typeof e?{id:e.trim(),name:""}:{id:String(e.id||"").trim(),name:String(e.name||"").trim().replace(/\s+/g," ").slice(0,80)}).filter(e=>!(!e.id||t.has(e.id))&&(t.add(e.id),!0))}function ce(e,t){return t.url.length-e.url.length}function le(e){return e.url.toLowerCase().startsWith(T)}async function ue(e){if(e.method.endsWith(".get"))return await te();if(e.method.endsWith(".set")){const{config:t}=e,n=t.profiles,a=t.rules,r=t.maxParallelWorkers,o=t.processInForeground,i=await pe();await X.remove([...i,"rules","maxParallelWorkers","processInForeground",E]),await X.set({rules:a,maxParallelWorkers:r,processInForeground:o}),await ae(t.menuLayout),Object.keys(n).forEach(e=>ge(e,n[e]))}if(e.method.endsWith(".getMenuLayout"))return{menuLayout:await ne()};if(e.method.endsWith(".setMenuLayout")&&await ae(e.menuLayout),e.method.endsWith(".deleteRules")&&await async function(e){const t=await he();await X.set({rules:e?t.filter(t=>t.autoSaveProfile!=e&&t.profile!=e):[]})}(e.profileName),e.method.endsWith(".deleteRule")&&await async function(e){if(!e)throw new Error("URL is empty");const t=await he();await X.set({rules:t.filter(t=>t.url!=e)})}(e.url),e.method.endsWith(".addRule")&&await ye(e.url,e.profileName,e.autoSaveProfileName),e.method.endsWith(".createProfile")&&await async function(e,t){if((await we()).includes(e))throw new Error("Duplicate profile name");const n=await be(t),a=JSON.parse(JSON.stringify(n));a.customShortcut=null,await ge(e,a)}(e.profileName,e.fromProfileName||k),e.method.endsWith(".renameProfile")&&await async function(e,t){const n=await we(),a=await m(),r=await he();if(!n.includes(e))throw new Error("Profile not found");if(n.includes(t))throw new Error("Duplicate profile name");if(e==k)throw new Error("Default settings cannot be renamed");a.profileName==e&&(a.profileName=t,await h(a));r.forEach(n=>{n.profile==e&&(n.profile=t),n.autoSaveProfile==e&&(n.autoSaveProfile=t)});const o=await be(e);await X.remove([S+e]),await X.set({[S+t]:o,rules:r}),await re(e,t)}(e.profileName,e.newProfileName),e.method.endsWith(".deleteProfile")&&await async function(e){const t=await we(),n=await m(),a=await he();if(!t.includes(e))throw new Error("Profile not found");if(e==k)throw new Error("Default settings cannot be deleted");n.profileName==e&&(delete n.profileName,await h(n));a.forEach(t=>{t.profile==e&&(t.profile=k),t.autoSaveProfile==e&&(t.autoSaveProfile=k)}),X.remove([S+e]),await X.set({rules:a}),await re(e)}(e.profileName),e.method.endsWith(".resetProfiles")&&await async function(){await Q;const e=await m();delete e.profileName,await h(e);let t=await pe();await X.remove([...t,"rules","maxParallelWorkers","processInForeground",C,I,E]),await Y()}(),e.method.endsWith(".resetProfile")&&await async function(e){if(!(await we()).includes(e))throw new Error("Profile not found");await ge(e,G)}(e.profileName),e.method.endsWith(".importConfig")&&await async function(e){const t=await we(),n=await pe(),a=await m();t.includes(a.profileName)&&(delete a.profileName,await h(a));await X.remove([...n,"rules","maxParallelWorkers","processInForeground",E]);const r={rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground},o=y(e.menuLayout);o&&(r[E]=o);Object.keys(e.profiles).forEach(t=>r[S+t]=e.profiles[t]),await X.set(r),await Y()}(e.config),e.method.endsWith(".updateProfile")&&await async function(e,t){if(!(await we()).includes(e))throw new Error("Profile not found");const n=await be(e);Object.keys(n).forEach(e=>{t[e]=void 0===t[e]?n[e]:t[e]}),await ge(e,t)}(e.profileName,e.profile),e.method.endsWith(".updateRule")&&await ve(e.url,e.newUrl,e.profileName,e.autoSaveProfileName),e.method.endsWith(".getConstants"))return{DISABLED_PROFILE_NAME:x,DEFAULT_PROFILE_NAME:k,CURRENT_PROFILE_NAME:A,BACKGROUND_SAVE_SUPPORTED:U,AUTOCLOSE_SUPPORTED:D,BADGE_COLOR_SUPPORTED:F,AUTO_SAVE_SUPPORTED:L,SELECTABLE_TABS_SUPPORTED:_,AUTO_OPEN_EDITOR_SUPPORTED:O,INFOBAR_SUPPORTED:W,BOOKMARKS_API_SUPPORTED:B,IDENTITY_API_SUPPORTED:N,CLIPBOARD_API_SUPPORTED:M,NATIVE_API_API_SUPPORTED:j,WEB_BLOCKING_API_SUPPORTED:q,EXTERNAL_CAPTURE_SUPPORTED:z,SHARE_API_SUPPORTED:K,BROWSER_MENUS_API_SUPPORTED:H,DEFAULT_FILENAME_REPLACED_CHARACTERS:a,DEFAULT_FILENAME_REPLACEMENT_CHARACTERS:r};if(e.method.endsWith(".getRules"))return he();if(e.method.endsWith(".getProfileOptions"))return me(e.profileName);if(e.method.endsWith(".getProfiles"))return de();if(e.method.endsWith(".exportConfig"))return async function(){const e=await te(),t={profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground};e.menuLayout&&(t.menuLayout=e.menuLayout);const n=JSON.stringify(t,null,2),a=`singlefile-settings-${(new Date).toISOString().replace(/:/g,"_")}.json`;if(U){const e=URL.createObjectURL(new Blob([n],{type:"text/json"}));try{await i({url:e,filename:a,saveAs:!0},"_")}finally{URL.revokeObjectURL(e)}return{}}return{filename:a,textContent:n}}();if(e.method.endsWith(".enableSync")){await browser.storage.local.set({sync:!0});const e=await browser.storage.sync.get();if(!e||!e.rules){const e=await pe(),t=await browser.storage.local.get(["rules","maxParallelWorkers","processInForeground",C,I,E,...e]);await browser.storage.sync.set(t)}return X=browser.storage.sync,await Y(),{}}if(e.method.endsWith(".disableSync")){await browser.storage.local.set({sync:!1});const e=await browser.storage.sync.get(),t=await browser.storage.local.get();if(e&&e.rules&&(!t||!t.rules)){await browser.storage.local.set({rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground,externalCaptureAllowedExtensionIds:e.externalCaptureAllowedExtensionIds||[],externalCaptureDeniedExtensionIds:e.externalCaptureDeniedExtensionIds||[]}),e[E]&&await browser.storage.local.set({[E]:e[E]});const t={};Object.keys(e).filter(e=>e.startsWith(S)).forEach(n=>t[n]=e[n]),await browser.storage.local.set(t)}return X=browser.storage.local,await Y(),{}}return e.method.endsWith(".isSync")?{sync:(await browser.storage.local.get()).sync}:{}}async function de(){await Q;const e=await pe(),t=await X.get(e),n={};return Object.keys(t).forEach(e=>n[e.substring(8)]=t[e]),n}async function fe(e,t){await Q;const[n,a]=await Promise.all([ee(e),m()]),r=a.profileName||k;let o;if(n){const e=n[t?"autoSaveProfile":"profile"];o=e==A?r:e}else o=r;return me(o)}async function me(e){const t=Object.assign({profileName:e},await be(e));return U||(t.backgroundSave=!1),t}async function he(){return(await X.get(["rules"])).rules}async function we(){return Object.keys(await X.get()).filter(e=>e.startsWith(S)).map(e=>e.substring(8))}async function pe(){return Object.keys(await X.get()).filter(e=>e.startsWith(S))}async function be(e){const t=S+e;return(await X.get([t]))[t]}async function ge(e,t){const n=S+e;await X.set({[n]:t})}async function ye(e,t,n){if(!e)throw new Error("URL is empty");const a=await he();if(a.find(t=>t.url==e))throw new Error("URL already exists");a.push({url:e,profile:t,autoSaveProfile:n}),await X.set({rules:a})}async function ve(e,t,n,a){if(!e||!t)throw new Error("URL is empty");const r=await he(),o=r.find(t=>t.url==e);if(!o)throw new Error("URL not found");if(r.find(n=>n.url==t&&n.url!=e))throw new Error("New URL already exists");o.url=t,o.profile=n,o.autoSaveProfile=a,await X.set({rules:r})}async function Ae(){return(await X.get()).authInfo}async function ke(){return(await X.get()).dropboxAuthInfo}async function xe(e){await X.set({authInfo:e})}async function Te(e){await X.set({dropboxAuthInfo:e})}async function Se(){const e=await Ae();e&&e.revokableAccessToken?await xe({revokableAccessToken:e.revokableAccessToken}):await X.remove(["authInfo"])}async function Ce(){const e=await ke();e&&e.revokableAccessToken?await Te({revokableAccessToken:e.revokableAccessToken}):await X.remove(["dropboxAuthInfo"])}function Ie(e,t){return e.length==t.length&&e.every((e,n)=>e==t[n])}async function Ee(e){if(e){const[t,n]=await Promise.all([m(),ee(e.url)]);return Boolean(t.autoSaveAll||t.autoSaveUnpinned&&!e.pinned||t[e.id]&&t[e.id].autoSave)&&(!n||n.autoSaveProfile!=x)}}const Pe=33554432,Re="/src/ui/pages/editor.html",Ue=new Map,De=new Map,Fe=browser.runtime.getURL(Re);async function Le({tabIndex:e,content:t,filename:n,compressContent:a,selfExtractingArchive:r,disableCompression:o,extractDataFromPage:i,insertTextBody:s,insertMetaCSP:c,embeddedImage:l,url:u}){const d={active:!0,url:Re};null!=e&&(d.index=e);const f=await browser.tabs.create(d);Ue.set(f.id,{url:u,content:t,filename:n,compressContent:a,selfExtractingArchive:r,disableCompression:o,extractDataFromPage:i,insertTextBody:s,insertMetaCSP:c,embeddedImage:l})}function _e(e){return e.url==Fe}const Oe=new Map,We="x-single-file-request-id",Be=8388608;async function Ne(e,t,n){for(let a=0;a*Be<=n.array.length;a++){const r={method:"singlefile.fetchResponse",requestId:t,headers:n.headers,status:n.status,error:n.error};r.truncated=n.array.length>Be,r.truncated?(r.finished=(a+1)*Be>n.array.length,r.array=n.array.slice(a*Be,(a+1)*Be)):r.array=n.array,await browser.tabs.sendMessage(e,r)}return{}}function Me(e,t={},n){return new Promise((a,r)=>{const o=new XMLHttpRequest;if(o.withCredentials=!0,o.responseType="arraybuffer",o.onerror=e=>r(new Error(e.detail)),o.onreadystatechange=()=>{var i;o.readyState==XMLHttpRequest.DONE&&(o.status||o.response.byteLength?!t.referrer||401!=o.status&&403!=o.status&&404!=o.status||n?a({arrayBuffer:o.response,array:Array.from(new Uint8Array(o.response)),headers:(i=o.getAllResponseHeaders(),i.trim().split(/[\r\n]+/).map(e=>{const t=e.indexOf(":");return[e.substring(0,t).trim(),e.substring(t+1).trim()]}).filter(([e])=>e)),status:o.status}):Me(e,t,!0).then(a).catch(r):r(new Error("Empty response")))},o.open("GET",e,!0),t.headers)for(const e of Object.entries(t.headers))o.setRequestHeader(e[0],e[1]);if(n){const e=String(Math.random()).substring(2);!function(e,t){Oe.set(e,t)}(e,t.referrer),o.setRequestHeader(We,e)}o.send()})}browser.runtime.onMessage.addListener((e,t)=>{if(e.method&&e.method.startsWith("singlefile.fetch"))return new Promise(n=>{(async function(e,t){if("singlefile.fetch"==e.method)try{const n=await Me(e.url,{referrer:e.referrer,headers:e.headers});return Ne(t.tab.id,e.requestId,n)}catch(n){return Ne(t.tab.id,e.requestId,{error:n.message,array:[]})}else if("singlefile.fetchFrame"==e.method)return browser.tabs.sendMessage(t.tab.id,e)})(e,t).then(n).catch(e=>n({error:e&&(e.message||e.toString())}))})});let je=!1;function qe(e){return e.method.endsWith(".enableReferrerOnError")?(Ke(),{}):e.method.endsWith(".disableReferrerOnError")?(function(){try{browser.webRequest.onBeforeSendHeaders.removeListener(ze)}catch(e){}je=!1}(),{}):void 0}function ze(e){if(je){let t=e.requestHeaders.find(e=>e.name===We);if(t){e.requestHeaders=e.requestHeaders.filter(e=>e.name!==We);const n=Oe.get(t.value);if(n){Oe.delete(t.value);if(!e.requestHeaders.find(e=>"referer"===e.name.toLowerCase()))return e.requestHeaders.push({name:"Referer",value:n}),{requestHeaders:e.requestHeaders}}}}}function Ke(){if(!je){try{browser.webRequest.onBeforeSendHeaders.addListener(ze,{urls:[""]},["blocking","requestHeaders","extraHeaders"])}catch(e){browser.webRequest.onBeforeSendHeaders.addListener(ze,{urls:[""]},["blocking","requestHeaders"])}je=!0}}async function He(e){return(await browser.tabs.query(e)).sort((e,t)=>e.index-t.index)}function Ve(e,t={}){return new Promise((n,a)=>{let r;function o(o,s){if(!r&&s&&s.url&&s.url.startsWith(e)){if(void 0===t.tabId||o!=t.tabId)return;i();const e=new URLSearchParams(new URL(s.url).search),r=e.get("code");r&&e.get("state")==t.state?(browser.tabs.remove(o),n(r)):a(new Error("invalid_auth_response"))}}function i(){r||(r=!0,browser.tabs.onUpdated.removeListener(o))}browser.tabs.onUpdated.addListener(o),t.cancel=i})}async function $e(e,t={}){const n=await browser.tabs.create({url:e.url,active:!0});return t.tabId=n.id,new Promise((e,t)=>{browser.tabs.onRemoved.addListener(function e(a){a==n.id&&(browser.tabs.onRemoved.removeListener(e),t(new Error("code_required")))})})}const Ge="/src/ui/resources/icon_128.png",Je="/src/ui/resources/icon_128_wait",Ze=browser.i18n.getMessage("buttonDefaultTooltip"),Xe=browser.i18n.getMessage("buttonBlockedTooltip"),Qe=browser.i18n.getMessage("buttonInitializingBadge"),Ye=browser.i18n.getMessage("buttonInitializingTooltip"),et=browser.i18n.getMessage("buttonErrorBadge"),tt=browser.i18n.getMessage("buttonBlockedBadge"),nt=browser.i18n.getMessage("buttonOKBadge"),at=browser.i18n.getMessage("buttonSaveProgressTooltip"),rt=browser.i18n.getMessage("buttonUploadProgressTooltip"),ot=browser.i18n.getMessage("buttonAutoSaveActiveBadge"),it=browser.i18n.getMessage("buttonAutoSaveActiveTooltip"),st=[2,147,20,192],ct=[4,229,36,192],lt={default:{setBadgeBackgroundColor:{color:st},setBadgeText:{text:""},setTitle:{title:Ze},setIcon:{path:Ge}},inject:{setBadgeBackgroundColor:{color:st},setBadgeText:{text:Qe},setTitle:{title:Ye}},execute:{setBadgeBackgroundColor:{color:ct},setBadgeText:{text:Qe}},progress:{setBadgeBackgroundColor:{color:ct},setBadgeText:{text:""}},edit:{setBadgeBackgroundColor:{color:st},setBadgeText:{text:""},setTitle:{title:Ze},setIcon:{path:Ge}},end:{setBadgeBackgroundColor:{color:ct},setBadgeText:{text:nt},setTitle:{title:Ze},setIcon:{path:Ge}},error:{setBadgeBackgroundColor:{color:[229,4,12,192]},setBadgeText:{text:et},setTitle:{title:""},setIcon:{path:Ge}},forbidden:{setBadgeBackgroundColor:{color:[255,255,255,1]},setBadgeText:{text:tt},setTitle:{title:Xe},setIcon:{path:Ge}},autosave:{inject:{setBadgeBackgroundColor:{color:[64,64,64,192]},setBadgeText:{text:ot},setTitle:{title:it},setIcon:{path:Ge}},default:{setBadgeBackgroundColor:{color:[208,208,208,192]},setBadgeText:{text:ot},setTitle:{title:it},setIcon:{path:Ge}}}};let ut;function dt(e,t){if(e.method.endsWith(".processInit")){delete f(t.tab.id)[t.tab.id].button,pt(t.tab)}var n,a,r;return e.method.endsWith(".processProgress")&&e.maxIndex&&(n=t.tab.id,a=e.index,r=e.maxIndex,wt(n,a,r,at)),e.method.endsWith(".processEnd")&&mt(t.tab.id),e.method.endsWith(".processError")&&(e.error&&console.error("Initialization error",e.error),ft(t.tab.id)),e.method.endsWith(".processCancelled")&&ht(t.tab),Promise.resolve({})}function ft(e){bt(e,yt("error"))}function mt(e,t){bt(e,t?yt("default",!0):yt("end"))}function ht(e){pt(e)}function wt(e,t,n,a){const r=Math.max(Math.min(20,Math.floor(t/n*20)),0),o=Math.min(Math.floor(t/n*8),8),i=Je+o+".png",s=yt("progress");s.setTitle={title:a+5*r+"%"},s.setIcon={path:i},bt(e,s)}async function pt(e){const t=yt("default",await Ee(e));await bt(e.id,t)}async function bt(e,t){try{const n=f(e);if(t){n[e].button||(n[e].button={lastState:null});const a=n[e].button.lastState||{},r={};Object.keys(t).forEach(e=>{void 0!==t[e]&&JSON.stringify(a[e])!=JSON.stringify(t[e])&&(r[e]=t[e])}),Object.keys(r).length&&(n[e].button.lastState=t,await async function(e,t){for(const n of Object.keys(t))await gt(e,n,t[n])}(e,r))}}catch(e){}}async function gt(e,t,n){const a="setBadgeBackgroundColor"!=t||F;if(browser.browserAction[t]&&a){const a=JSON.parse(JSON.stringify(n));a.tabId=e,await browser.browserAction[t](a)}}function yt(e,t){return JSON.parse(JSON.stringify(t?lt.autosave[e]:lt[e]))}browser.browserAction.onClicked.addListener(async e=>{const t=await He({currentWindow:!0,highlighted:!0});t.length<=1?function(e){ut.isSavingTab(e)?ut.cancelTab(e.id):ut.saveTabs([e])}(e):ut.saveTabs(t)});const vt=browser.menus,At=H,kt={page:["page","image","video","audio"],selection:["selection"],frame:["frame"],link:["link"]},xt={button:["browser_action"],tab:["tab"]},Tt=["edit-and-save-page","save-selected-links","save-selection","save-frame","auto-save","domain-rule"],St=[{mode:"disabled",labelKey:"menuAutoSaveDisabled"},{mode:"tab",labelKey:"menuAutoSaveTab"},{mode:"unpinned",labelKey:"menuAutoSaveUnpinnedTabs"},{mode:"all",labelKey:"menuAutoSaveAllTabs"}],Ct=browser.i18n.getMessage("menuCreateDomainRule"),It=browser.i18n.getMessage("menuUpdateRule"),Et=browser.i18n.getMessage("profileDefaultSettings"),Pt=new Map,Rt=new Map;let Ut,Dt,Ft,Lt,_t=new Map,Ot=!0,Wt=!0;async function Bt(e){const[t,n,a]=await Promise.all([de(),m(),ne()]);let r=await fe(e&&e.url);if(At&&r){if(r.profileName==x&&(r=await fe(),r.profileName=x),r.tabMenuEnabled)try{await vt.create({id:"temporary-id",contexts:["tab"],title:"title"})}catch(e){r.tabMenuEnabled=!1}await vt.removeAll(),_t=new Map,Pt.clear(),Rt.clear();const o=a||function(){const e=()=>[g("save-page"),g("edit-and-save-page"),g("save-selected-links"),g("save-with-profile"),g("save-selection"),g("save-tabs"),g("select-profile"),g("domain-rule"),g("auto-save"),g("separator"),g("batch-save-urls"),g("view-pendings")];return{page:[g("save-page"),g("edit-and-save-page"),g("save-selected-links"),g("save-with-profile"),g("separator"),g("save-selection"),g("save-frame"),g("save-selected-tabs"),g("save-unpinned-tabs"),g("save-all-tabs"),g("separator"),g("select-profile"),g("domain-rule"),g("separator"),g("auto-save"),g("separator"),g("batch-save-urls"),g("view-pendings")],button:e(),tab:e()}}(),i={profiles:t,profileNames:Object.keys(t),allTabsData:n,rule:e&&e.url?await ee(e.url,!0):void 0};r.contextMenuEnabled&&Nt("page",o.page,i),r.browserActionMenuEnabled&&Nt("button",o.button,i),r.tabMenuEnabled&&Nt("tab",o.tab,i)}Ut=!0,Dt&&(Dt=!1,(await browser.tabs.query({})).forEach(async e=>await Jt(e)))}function Nt(e,t,n,a){t.forEach((t,r)=>function(e,t,n,a,r){const o=b[t.action];if(!Mt(e,t,a))return;const i=zt(e,t),s={id:n,contexts:i};r&&(s.parentId=r);if(o.separator)vt.create(Object.assign(s,{type:"separator"}));else if(o.dynamic)!function(e,t,n,a){const r=b[t.action],{id:o,contexts:i,parentId:s}=n,c={action:t.action,entry:t,surface:e};if("profiles"==r.dynamic){if(a.profileNames.length>1){let r=s;t.inline||(vt.create(Object.assign(n,{title:Kt(t)})),qt(o,c),r=o),a.profileNames.forEach((n,a)=>{const s=o+"-p"+a;vt.create({id:s,contexts:i,parentId:r,title:Ht(n)}),qt(s,{action:"save-page",entry:t,surface:e,profileName:n})})}}else if("radio-profiles"==r.dynamic){if(a.profileNames.length>1){vt.create(Object.assign(n,{title:Kt(t)})),qt(o,c);const r=a.allTabsData.profileName||k;a.profileNames.forEach((n,a)=>{jt(o+"-p"+a,i,o,Ht(n),r==n,{action:"select-profile",entry:t,surface:e,profileName:n})})}}else if("radio-rule"==r.dynamic){if(a.profileNames.length>1){const r=t.label||Ct;vt.create(Object.assign(n,{title:r})),qt(o,Object.assign(c,{title:r})),Rt.set(o,r);const s=a.rule;jt(o+"-current",i,o,A,!s||s.profile==A,{action:"domain-rule",entry:t,surface:e,profileName:A}),a.profileNames.forEach((n,a)=>{jt(o+"-p"+a,i,o,Ht(n),Boolean(s)&&s.profile==n,{action:"domain-rule",entry:t,surface:e,profileName:n})})}}else"radio-autosave"==r.dynamic&&(vt.create(Object.assign(n,{title:Kt(t)})),qt(o,c),St.forEach(({mode:n,labelKey:a})=>{jt(o+"-"+n,i,o,browser.i18n.getMessage(a),"disabled"==n,{action:"auto-save",entry:t,surface:e,mode:n})}))}(e,t,s,a);else{const r=t.profile&&a.profiles[t.profile]?t.profile:void 0,i=Kt(t,r);vt.create(Object.assign(s,{title:i})),qt(n,{action:t.action,entry:t,surface:e,profileName:r,title:i}),o.container&&Nt(e,t.children,a,n)}}(e,t,(a||e)+"-"+r,n,a))}function Mt(e,t,n){const a=b[t.action];return!(!a||a.surfaces&&!a.surfaces.includes(e)||(r=t.action,!("auto-save"==r?L:"save-selected-tabs"!=r||_))||!zt(e,t).length)&&(a.dynamic&&"radio-autosave"!=a.dynamic?n.profileNames.length>1:!a.container||t.children.some(t=>Mt(e,t,n)));var r}function jt(e,t,n,a,r,o){vt.create({id:e,type:"radio",contexts:t,parentId:n,title:a,checked:r}),Pt.set(e,r),qt(e,o)}function qt(e,t){_t.set(e,t)}function zt(e,t){if("page"==e){return(t.contexts||b[t.action].contexts||p).flatMap(e=>kt[e]||[])}return xt[e]||[]}function Kt(e,t){if(e.label)return e.label;const n=browser.i18n.getMessage(b[e.action].labelKey);return t?n+" ("+Ht(t)+")":n}function Ht(e){return e==k?Et:e}function Vt(e){return Array.from(_t.entries()).filter(([,t])=>t.action==e)}async function $t(){Lt=null;const[e]=await He({currentWindow:!0,active:!0});await Bt(e),e&&await Jt(e)}async function Gt(e){const t=await m(e.id);await async function(){const e=await browser.tabs.query({});return Promise.all(e.map(async e=>{const[t,n]=await Promise.all([fe(e.url,!0),Ee(e)]);try{await browser.tabs.sendMessage(e.id,{method:"content.init",autoSaveEnabled:n,options:t})}catch(e){}}))}(),await pt(e);try{await browser.runtime.sendMessage({method:"options.refresh",profileName:t.profileName})}catch(e){}}async function Jt(e){if(At&&Ut){const t=[],n=await m(e.id);if(n[e.id].editorDetected)Zt(!1);else if(Zt(!0),Vt("auto-save").forEach(([a,r])=>{"disabled"==r.mode?t.push(Qt(a,!n[e.id].autoSave)):"tab"==r.mode?t.push(Qt(a,n[e.id].autoSave)):"unpinned"==r.mode?t.push(Qt(a,Boolean(n.autoSaveUnpinned))):"all"==r.mode&&t.push(Qt(a,Boolean(n.autoSaveAll)))}),e&&e.url){const a=await fe(e.url);t.push(async function(e,t){const n=Ot;Ot=t,(void 0===n||n!=t)&&await Bt(e)}(e,a.contextMenuEnabled));const r=n[e.id].savedPageDetected;Vt("edit-and-save-page").forEach(([e,n])=>{const o=r&&!n.entry.label?browser.i18n.getMessage(b[n.action].altLabelKey):n.title;t.push(Xt(e,o)),t.push(vt.update(e,{visible:!a.openEditor||r}))}),_&&Vt("save-selection").forEach(([e])=>t.push(vt.update(e,{visible:!a.saveRawPage})));const[o,i]=await Promise.all([de(),ee(e.url)]);if(Object.keys(o).length>1){let e=k,n=Ct;i&&i.profile!=k&&o[i.profile]&&(e=i.profile,n=It),Vt("domain-rule").forEach(([a,r])=>{r.profileName?t.push(Qt(a,r.profileName==e)):t.push(Xt(a,r.entry.label||n))})}}await Promise.all(t)}}async function Zt(e){const t=Wt;if(Wt=e,void 0===t||t!=e){const t=[];try{_t.forEach((n,a)=>{Tt.includes(n.action)&&t.push(vt.update(a,{visible:e}))}),await Promise.all(t)}catch(e){}}}async function Xt(e,t){const n=Rt.get(e);try{(void 0===n||n!=t)&&await vt.update(e,{title:t}),Rt.set(e,t)}catch(e){}}async function Qt(e,t){t=Boolean(t);try{await vt.update(e,{checked:t}),Pt.set(e,t)}catch(e){}}Promise.resolve().then(async function(){At&&(Bt(),vt.onClicked.addListener(async(e,t)=>{const n=_t.get(e.menuItemId);if(!n)return;const a=await async function(e){if(e){const t=await de();if(t[e])return Object.assign({},t[e],{profileName:e})}return{}}(n.profileName);if("save-page"==n.action&&(e.linkUrl?Ft.saveUrls([e.linkUrl],a):Ft.saveTabs([t],a)),"edit-and-save-page"==n.action){if((await m(t.id))[t.id].savedPageDetected)Ft.openEditor(t);else{const n=Object.assign(a,{openEditor:!0});e.linkUrl?Ft.saveUrls([e.linkUrl],n):Ft.saveTabs([t],n)}}if("save-selected-links"==n.action&&Ft.saveSelectedLinks(t),"view-pendings"==n.action&&await browser.tabs.create({active:!0,url:"/src/ui/pages/pendings.html"}),"save-selection"==n.action&&Ft.saveTabs([t],Object.assign(a,{selected:!0})),"save-frame"==n.action&&Ft.saveTabs([t],{frameId:e.frameId}),"save-selected-tabs"==n.action){const e=await He({currentWindow:!0,highlighted:!0});Ft.saveTabs(e,a)}if("save-unpinned-tabs"==n.action){const e=await He({currentWindow:!0,pinned:!1});Ft.saveTabs(e,a)}if("save-all-tabs"==n.action){const e=await He({currentWindow:!0});Ft.saveTabs(e,a)}if("batch-save-urls"==n.action&&Ft.batchSaveUrls(),"auto-save"==n.action){const a=await m(t.id);"tab"==n.mode&&(a[t.id].autoSave=!0),"disabled"==n.mode&&(Object.keys(a).forEach(e=>{"object"==typeof a[e]&&a[e].autoSave&&(a[e].autoSave=!1)}),a.autoSaveUnpinned=a.autoSaveAll=!1),"all"==n.mode&&(a.autoSaveAll=e.checked),"unpinned"==n.mode&&(a.autoSaveUnpinned=e.checked),await h(a),Gt(t)}if("select-profile"==n.action){const e=await m();e.profileName=n.profileName,await h(e),Gt(t)}if("domain-rule"==n.action){const e=await ee(t.url,!0);e?await ve(e.url,e.url,n.profileName,n.profileName):(await Promise.all(Vt("domain-rule").map(([e,t])=>Xt(e,t.entry.label||It))),await ye(new URL(t.url).hostname,n.profileName,n.profileName))}}),Ut?Dt=!0:(await browser.tabs.query({})).forEach(async e=>await Jt(e)))}),At&&browser.storage.onChanged.addListener(async function(e,t){const n=Object.keys(e);let a="local"==t&&n.includes("sync");if(!a&&(n.includes("rules")||n.includes(E)||n.some(e=>e.startsWith(S)))){const{sync:e}=await browser.storage.local.get(["sync"]);a=t==(e?"sync":"local")}a&&(Lt&&clearTimeout(Lt),Lt=setTimeout($t,1e3))});const Yt=browser.commands;let en,tn,nn;function an(e,t){return e.method.endsWith(".refreshMenu")?function(e){if(e.method.endsWith("refreshMenu"))return Bt(),Promise.resolve({})}(e):dt(e,t)}function rn(e){!function(e){bt(e.id,yt("forbidden"))}(e)}function on(e,t,n){!function(e,t,n){let a;n?a=yt("inject",!0):(a=yt(1==t?"inject":"execute"),a.setTitle={title:Ye+" ("+t+"/2)"},a.setIcon={path:Je+"0.png"}),bt(e,a)}(e,t,n)}async function sn(e,t,n){ft(e);try{t&&await browser.tabs.sendMessage(e,{method:"content.error",error:t.toString(),link:n})}catch(e){}}function cn(e){!function(e){bt(e,yt("edit"))}(e)}function ln(e,t){mt(e,t)}function un(e,t,n){!function(e,t,n){wt(e,t,n,rt)}(e,t,n)}function dn(e){Jt(e)}Yt&&Yt.onCommand&&Yt.onCommand.addListener&&Yt.onCommand.addListener(async e=>{if("save-selected-tabs"==e){const e=await He({currentWindow:!0,highlighted:!0});en.saveTabs(e,{optionallySelected:!0})}else if("save-all-tabs"==e){const e=await He({currentWindow:!0});en.saveTabs(e)}else if(e.startsWith("custom-command-")){const t=await de();let n;if(Object.keys(t).some(a=>t[a].customShortcut==e&&(n=a,!0)),n){const e=await He({currentWindow:!0,highlighted:!0});en.saveTabs(e,t[n])}}});const fn=["lib/web-stream.js","lib/chrome-browser-polyfill.js","lib/single-file.js"],mn=["lib/chrome-browser-polyfill.js","lib/single-file-frames.js"];async function hn(e,t){let n;if(await async function(e){const t=e.extensionScriptFiles||[];tn||nn||([tn,nn]=await Promise.all([wn(fn.concat(t)),wn(mn)]))}(t),!t.removeFrames)try{await browser.tabs.executeScript(e,{code:nn,allFrames:!0,matchAboutBlank:!0,runAt:"document_start"})}catch(e){}try{await browser.tabs.executeScript(e,{code:tn,allFrames:!1,runAt:"document_idle"}),n=!0}catch(e){}return n&&t.frameId&&await browser.tabs.executeScript(e,{code:"document.documentElement.dataset.requestedFrameId = true",frameId:t.frameId,matchAboutBlank:!0,runAt:"document_start"}),n}async function wn(e){const t=e.map(async e=>{if("function"==typeof e)return"("+e.toString()+")();";{const t=await fetch(browser.runtime.getURL("../../../"+e));return(new TextDecoder).decode(await t.arrayBuffer())}});let n="";for(const e of t)n+=await e;return n}const pn="single-file-response-fetch",bn="Host fetch error (SingleFile)",gn=Boolean(window.wrappedJSObject),yn=["http:","https:"],vn=["no-referrer-when-downgrade","strict-origin","strict-origin-when-cross-origin"],An=["no-referrer","no-referrer-when-downgrade","origin","origin-when-cross-origin","same-origin","strict-origin","strict-origin-when-cross-origin","unsafe-url"],kn=window.fetch.bind(window);let xn,Tn=0,Sn=new Map;async function Cn(e,t={},n=!0){try{const a={cache:t.cache||"force-cache",headers:t.headers,referrerPolicy:En(e,t)?"no-referrer":t.referrerPolicy||"strict-origin-when-cross-origin"};let r;try{r=t.referrer&&!gn||!n?await kn(e,a):await async function(e,t){if(void 0===xn&&(xn=!1,document.addEventListener("single-file-response-fetch-supported",()=>xn=!0,!1),document.dispatchEvent(new CustomEvent("single-file-request-fetch-supported"))),xn)return new Promise((n,a)=>{document.addEventListener(pn,function t(r){r.detail?r.detail.url==e&&(document.removeEventListener(pn,t,!1),r.detail.response?n({status:r.detail.status,headers:Pn(r.detail.headers),arrayBuffer:async()=>r.detail.response}):a(new Error(r.detail.error))):(document.removeEventListener(pn,t,!1),a(new Error(bn)))},!1),document.dispatchEvent(new CustomEvent("single-file-request-fetch",{detail:JSON.stringify({url:e,options:t})}))});throw new Error(bn)}(e,a),401!=r.status&&403!=r.status&&404!=r.status||"no-referrer"==a.referrerPolicy||t.referrer||(r=await Cn(e,{...a,referrerPolicy:"no-referrer"},n))}catch(o){if(o&&o.message==bn)r=await Cn(e,{...a},!1);else{if("no-referrer"==a.referrerPolicy||t.referrer)throw o;r=await Cn(e,{...a,referrerPolicy:"no-referrer"},n)}}return r}catch(n){Tn++;const a=new Promise((e,t)=>Sn.set(Tn,{resolve:e,reject:t}));return await Rn({method:"singlefile.fetch",url:e,requestId:Tn,referrer:t.referrer,headers:t.headers}),a}}async function In(e,t){const n=await Rn({method:"singlefile.fetchFrame",url:e,frameId:t.frameId,referrer:t.referrer,headers:t.headers});return{status:n.status,headers:Pn(n.headers),arrayBuffer:async()=>new Uint8Array(n.array).buffer}}function En(e,{stylesheetURL:t,stylesheetReferrerPolicy:n}={}){if(!t)return!1;let a,r;try{a=new URL(t),r=new URL(e,t)}catch{return!1}if(!yn.includes(a.protocol)||!yn.includes(r.protocol))return!0;let o="strict-origin-when-cross-origin";String(n||"").split(",").forEach(e=>{e=e.trim().toLowerCase(),An.includes(e)&&(o=e)});const i="https:"==a.protocol&&"https:"!=r.protocol;return"no-referrer"==o||"same-origin"==o&&r.origin!=a.origin||i&&vn.includes(o)}function Pn(e){return new Headers(e?Array.from(e,e=>[e[0],e[1]]):[])}async function Rn(e){const t=await browser.runtime.sendMessage(e);if(!t||t.error)throw new Error(t&&t.error&&t.error.toString());return t}function Un(e,t){return hn(e,t)}browser.runtime.onMessage.addListener(e=>"singlefile.fetchFrame"==e.method&&window.frameId&&window.frameId==e.frameId?async function(e){try{const t=await kn(e.url,{cache:"force-cache",headers:e.headers,referrerPolicy:"strict-origin-when-cross-origin"});return{status:t.status,headers:[...t.headers],array:Array.from(new Uint8Array(await t.arrayBuffer()))}}catch(e){return{error:e&&(e.message||e.toString())}}}(e):"singlefile.fetchResponse"==e.method?async function(e){const t=Sn.get(e.requestId);t&&(e.error?(t.reject(new Error(e.error)),Sn.delete(e.requestId)):(e.truncated&&(t.array?t.array=t.array.concat(e.array):(t.array=e.array,Sn.set(e.requestId,t)),e.finished&&(e.array=t.array)),e.truncated&&!e.finished||(t.resolve({status:e.status,headers:Pn(e.headers),arrayBuffer:async()=>new Uint8Array(e.array).buffer}),Sn.delete(e.requestId))));return{}}(e):void 0);const Dn="Could not establish connection. Receiving end does not exist.",Fn="The message port closed before a response was received.",Ln="Message manager disconnected",_n="Cannot access contents of url ",On="A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received",Wn="pending",Bn="processing",Nn=["lib/single-file-extension.js"],Mn=[];let jn,qn,zn=0;var Kn;async function Hn(e){const t={extensionScriptFiles:Nn,tabId:e.id,tabIndex:e.index};let n;try{n=await Un(e.id,t)}catch(e){}if(n){const t=await browser.tabs.sendMessage(e.id,{method:"content.getSelectedLinks"});if(t.urls&&t.urls.length){const e=await Vn(),n=(a,r)=>{"complete"==r.status&&a==e.id&&(browser.tabs.onUpdated.removeListener(n),browser.tabs.sendMessage(e.id,{method:"newUrls.addURLs",urls:t.urls}))};browser.tabs.onUpdated.addListener(n)}}else rn(e)}async function Vn(){return browser.tabs.create({active:!0,url:"/src/ui/pages/batch-save-urls.html"})}async function $n(e,t={}){await Zn(),await Promise.all(e.map(async e=>{const n=await fe(e);n.profileName!=x&&(Object.keys(t).forEach(e=>n[e]=t[e]),n.autoClose=!0,n.originalUrl=e,n.extensionScriptFiles=Nn,n.passReferrerOnError&&Ke(),Jn({tab:{url:e},status:Wn,options:n,method:"content.save"}))})),Xn()}async function Gn(e,t={}){await Zn(),await Promise.all(e.map(async e=>{const n=e.id,a=await fe(e.url);if(a.profileName!=x){Object.keys(t).forEach(e=>a[e]=t[e]),a.tabId=n,a.tabIndex=e.index,a.extensionScriptFiles=Nn,a.passReferrerOnError&&Ke();const r={id:e.id,index:e.index,url:e.url,title:e.title};if(t.autoSave){if(Ee(e)){Qn(Jn({status:Bn,tab:r,options:a,method:"content.autosave"}))}}else{let t;on(n,1);try{t=await Un(n,a)}catch(e){}t||_e(e)?(on(n,2),Jn({status:Wn,tab:r,options:a,method:"content.save"})):rn(e)}}else rn(e)})),Xn()}function Jn(e){const t={id:zn,status:e.status,tab:e.tab,options:e.options,method:e.method,resolve:e.resolve,reject:e.reject,done:function(e=!0){const t=Mn.findIndex(e=>e.id==this.id);t>-1&&(Mn.splice(t,1),e&&Xn())}};return Mn.push(t),zn++,t}async function Zn(){if(!jn){const e=await te();qn=e.processInForeground,jn=qn?1:e.maxParallelWorkers}}function Xn(){const e=Mn.filter(e=>e.status==Bn).length;for(let t=0;te.status==Wn);e&&Qn(e)}}async function Qn(e){const t=e.id;if(e.status=Bn,!e.tab.id){let t;try{const n=await async function(e){const t=await browser.tabs.create(e);return new Promise((e,n)=>{function a(n,o){n==t.id&&"complete"==o.status&&(e(t),browser.tabs.onUpdated.removeListener(a),browser.tabs.onRemoved.removeListener(r))}function r(e){e==t.id&&(n(e),browser.tabs.onRemoved.removeListener(r))}browser.tabs.onUpdated.addListener(a),browser.tabs.onRemoved.addListener(r)})}({url:e.tab.url,active:!1});e.tab.id=e.options.tabId=n.id,e.tab.index=e.options.tabIndex=n.index,on(e.tab.id,1);try{t=await Un(e.tab.id,e.options)}catch(e){}}catch(t){e.tab.id=t}if(!t)return void e.done();on(e.tab.id,2)}e.options.taskId=t;try{qn&&!e.options.silent&&await browser.tabs.update(e.tab.id,{active:!0});const t=await browser.tabs.sendMessage(e.tab.id,{method:e.method,options:e.options});e.resolve&&!e.cancelled&&(e.resolve(t),e.done())}catch(t){e.reject?(e.cancelled||e.reject(t),e.done()):!t||t.message&&function(e){return e.message==Fn||e.message==Dn||e.message==Ln||e.message==On||e.message.startsWith(_n+JSON.stringify(Fe))}(t)||(console.log(t.message?t.message:t),sn(e.tab.id,t.message,t.link),e.done())}}function Yn(e){const t=Mn.find(t=>t.id==e);t&&(t.options.autoClose&&!t.cancelled&&browser.tabs.remove(t.tab.id),t.done())}function ea(e,t){const n=Mn.find(t=>t.id==e);n&&(n.cancel=t)}function ta(e,t=!0){Array.from(Mn).filter(n=>n.tab.id==e&&!n.options.autoSave&&(t||n.status!=Bn)).forEach(ra)}function na(e){const t=Mn.find(t=>t.id==e);t&&ra(t)}function aa(e){return Mn.find(t=>t.id==e)}function ra(e,t){const n=e.tab.id;e.cancelled=!0,n&&(browser.tabs.sendMessage(n,{method:"content.cancelSave",options:{loadDeferredContent:e.options.loadDeferredContent,loadDeferredContentKeepZoomLevel:e.options.loadDeferredContentKeepZoomLevel}}).catch(()=>{}),"content.autosave"==e.method&&ln(n,!0),e.options.silent||function(e){ht(e)}(e.tab)),e.cancel&&e.cancel(),e.done(t)}function oa(e){return{id:e.id,tabId:e.tab.id,index:e.tab.index,url:e.tab.url,title:e.tab.title,cancelled:e.cancelled,status:e.status}}(function(e){Ft=e})(Kn={isSavingTab:function(e){return Boolean(Mn.find(t=>t.tab.id==e.id))},saveTabs:Gn,saveUrls:$n,cancelTab:ta,openEditor:function(e){browser.tabs.sendMessage(e.id,{method:"content.openEditor"})},saveSelectedLinks:Hn,batchSaveUrls:Vn}),function(e){ut=e}(Kn),function(e){en=e}(Kn);async function ia(e){let t;try{t=await browser.runtime.sendNativeMessage("singlefile_companion",{method:"save",pageData:e})}catch(e){if(!e.message||!e.message.includes("Native host has exited")&&!e.message.includes("An unexpected error occurred"))throw e}if(t&&t.error)throw new Error(t.error+" (Companion)")}const sa=new Set;async function ca(e){return e.method.endsWith(".saveCreatedBookmarks")?(la(),{}):e.method.endsWith(".disable")?(async function(){let e;const t=await de();Object.keys(t).forEach(n=>e=e||!t[n].saveCreatedBookmarks),e&&(browser.bookmarks.onCreated.removeListener(da),browser.bookmarks.onMoved.removeListener(fa))}(),{}):void 0}async function la(){try{browser.bookmarks.onCreated.removeListener(da),browser.bookmarks.onMoved.removeListener(fa)}catch(e){}let e;const t=await de();Object.keys(t).forEach(n=>{t[n].saveCreatedBookmarks&&(e=!0)}),e&&(browser.bookmarks.onCreated.addListener(da),browser.bookmarks.onMoved.addListener(fa))}async function ua(e,t){try{await browser.bookmarks.update(e,t)}catch(e){}}async function da(e,t){sa.add(e),await ma(e,t.url,t)}async function fa(e,t){if(sa.has(e)){const n=await browser.bookmarks.get(e);n[0]&&await ma(e,n[0].url,t)}}async function ma(e,t,n){const a=await browser.tabs.query({lastFocusedWindow:!0,active:!0}),r=await fe(t);if(r.saveCreatedBookmarks){const i=await async function e(t,n=[]){if(t){const a=(await browser.bookmarks.get(t))[0];a&&a.title&&(n.unshift(a.title),await e(a.parentId,n))}return n}(n.parentId),s=r.allowedBookmarkFolders.toString(),c=i.find(e=>r.allowedBookmarkFolders.includes(e)),l=r.ignoredBookmarkFolders.toString(),u=i.find(e=>r.ignoredBookmarkFolders.includes(e));if((s&&c||!s)&&(l&&!u||!l))if(a.length&&a[0].url==t)sa.delete(e),Gn(a,{bookmarkId:e,bookmarkFolders:i});else{const n=await browser.tabs.query({});if(n.length){const a=n.find(e=>e.url==t);a?(sa.delete(e),Gn([a],{bookmarkId:e,bookmarkFolders:i})):t&&("about:blank"==t?browser.bookmarks.onChanged.addListener(function t(n,a){n==e&&a.url&&(browser.bookmarks.onChanged.removeListener(t),o(a.url))}):o(t))}}}function o(t){sa.delete(e),$n([t],{bookmarkId:e})}}Promise.resolve().then(la);async function ha(e,t){let n=t||"WOLEET_API_KEY_PLACEHOLDER";const a=await fetch("https://api.woleet.io/v1/anchor",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:"Bearer "+n},body:JSON.stringify({name:e,hash:e,public:!0})});if(401==a.status){const e=new Error("Your access token on Woleet is invalid. Go to __DOC_LINK__ to create your account.");throw e.link="https://app.woleet.io/",e}if(402==a.status){const e=new Error("You have no more credits on Woleet. Go to __DOC_LINK__ to recharge them.");throw e.link="https://app.woleet.io/",e}if(a.status>=400)throw new Error((a.statusText||"Error "+a.status)+" (Woleet)");return a.json()}const wa="https://oauth2.googleapis.com/token",pa="https://www.googleapis.com/drive/v3/files",ba="uniquify";let ga=class{constructor(e){this.file=e.file,this.onProgress=e.onProgress,this.contentType=this.file.type||"application/octet-stream",this.metadata={name:e.filename,mimeType:this.contentType,parents:e.parents||["root"]},this.token=e.token,this.offset=0,this.chunkSize=e.chunkSize||524288,this.filenameConflictAction=e.filenameConflictAction,this.prompt=e.prompt}async upload(e=1){let t,n="POST";const a=Ia(await fetch(pa+`?q=name = '${this.metadata.name}' and trashed != true and '${this.metadata.parents[0]}' in parents`,{headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"}})),r=await a.json();if(r.files.length)if("overwrite"==this.filenameConflictAction)n="PATCH",t=r.files[0].id,this.metadata.parents=null;else if(this.filenameConflictAction==ba){let t=this.metadata.name,n="";const a=this.metadata.name.lastIndexOf(".");a>-1&&(t=this.metadata.name.substring(0,a),n=this.metadata.name.substring(a+1));const r=t+" ("+e+")."+n,o=Ia(await fetch(pa+`?q=name = '${r}' and trashed != true and '${this.metadata.parents[0]}' in parents`,{headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"}}));if((await o.json()).files.length)return this.upload(e+1);this.metadata.name=r}else{if("prompt"==this.filenameConflictAction){if(this.prompt){const t=await this.prompt(this.metadata.name);return t?(this.metadata.name=t,this.upload(e)):r}return this.filenameConflictAction=ba,this.upload(e)}if("skip"==this.filenameConflictAction)return r}const o=Ia(await fetch("https://www.googleapis.com/upload/drive/v3/files"+(t?"/"+t:"")+"?uploadType=resumable",{method:n,headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json","X-Upload-Content-Length":this.file.size,"X-Upload-Content-Type":this.contentType},body:JSON.stringify(this.metadata)})).headers.get("Location");if(this.url=o,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),Sa(this)}};async function ya(e,t){const n=await fetch(wa,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+e.clientId+"&client_secret="+e.clientKey+"&grant_type=authorization_code&code="+t.code+(e.codeVerifier?"&code_verifier="+e.codeVerifier:"")+"&redirect_uri="+browser.identity.getRedirectURL()}),a=await Ca(n);return e.accessToken=a.access_token,e.refreshToken=a.refresh_token,e.expirationDate=Date.now()+1e3*a.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}function va(e){return btoa(String.fromCharCode(...e)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Aa(e={}){return Boolean(browser.identity&&browser.identity.getAuthToken)&&!e.forceWebAuthFlow}async function ka(e){const t=await browser.identity.getAuthToken(e);return"string"==typeof t?t:t&&t.token}async function xa(e,t,n=!0){const a=t.split("/");a.pop();const r=e.folderIds.get(a.join("/"));if(r)return r;let o="root";if(a.length){let r="";for(const i of a){r&&(r+="/"),r+=i;const a=e.folderIds.get(r);if(a)o=a;else try{o=await Ta(e,i,o),e.folderIds.set(r,o)}catch(a){if("path_not_found"==a.message&&n)return e.folderIds.clear(),xa(e,t,!1);throw a}}}return o}async function Ta(e,t,n){const a=await async function(e,t,n){const a=await fetch(pa+"?q=mimeType = 'application/vnd.google-apps.folder' and name = '"+t+"' and trashed != true and '"+n+"' in parents",{headers:{Authorization:"Bearer "+e.accessToken}});return Ca(a)}(e,t,n);if(a.files.length)return a.files[0].id;{const a=await async function(e,t,n){const a=await fetch(pa,{method:"POST",headers:{Authorization:"Bearer "+e.accessToken,"Content-Type":"application/json"},body:JSON.stringify({name:t,parents:[n],mimeType:"application/vnd.google-apps.folder"})});return Ca(a)}(e,t,n);return a.id}}async function Sa(e){let t=e.file,n=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(n=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,n));const a=await fetch(e.url,{method:"PUT",headers:{Authorization:"Bearer "+e.token,"Content-Type":e.contentType,"Content-Range":"bytes "+e.offset+"-"+(n-1)+"/"+e.file.size,"X-Upload-Content-Type":e.contentType},body:t});if(e.onProgress&&!e.cancelled&&e.onProgress(e.offset+e.chunkSize,e.file.size),200==a.status||201==a.status)return a.json();if(308==a.status){const t=a.headers.get("Range");if(t&&(e.offset=parseInt(t.match(/\d+/g).pop(),10)+1),e.cancelled)throw new Error("upload_cancelled");return Sa(e)}Ia(a)}async function Ca(e){e=Ia(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function Ia(e){if(200==e.status)return e;throw 404==e.status?new Error("path_not_found"):401==e.status?new Error("invalid_token"):new Error("unknown_error ("+e.status+")")}const Ea="https://api.dropboxapi.com/oauth2/token",Pa="uniquify",Ra="prompt",Ua=/[\u007f-\uffff]/g;class Da{constructor(e){this.file=e.file,this.onProgress=e.onProgress,this.contentType=this.file.type||"application/octet-stream",this.metadata={name:e.filename,mimeType:this.contentType},this.token=e.token,this.offset=0,this.chunkSize=e.chunkSize||8388608,this.filenameConflictAction=e.filenameConflictAction,this.prompt=e.prompt}async upload(){const e=Wa(await fetch("https://api.dropboxapi.com/2/files/search_v2",{method:"POST",headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"},body:Ba({query:this.metadata.name,options:{filename:!0}})})),t=await Oa(e);if(t.matches.length)if(this.filenameConflictAction==Ra)if(this.prompt){const e=await this.prompt(this.metadata.name);if(!e)return t;this.metadata.name=e}else this.filenameConflictAction=Pa;else if("skip"==this.filenameConflictAction)return t;const n=Wa(await fetch("https://content.dropboxapi.com/2/files/upload_session/start",{method:"POST",headers:{Authorization:"Bearer "+this.token,"Dropbox-API-Arg":Ba({close:!1}),"Content-Type":"application/octet-stream"}})),a=(await Oa(n)).session_id;if(this.sessionId=a,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),_a(this)}}async function Fa(e,t){const n=await fetch(Ea,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+e.clientId+"&client_secret="+e.clientKey+"&grant_type=authorization_code&code="+t.code+(e.codeVerifier?"&code_verifier="+e.codeVerifier:"")+"&redirect_uri="+browser.identity.getRedirectURL()}),a=await Oa(n);return e.accessToken=a.access_token,e.refreshToken=a.refresh_token,e.expirationDate=Date.now()+1e3*a.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}function La(e){return btoa(String.fromCharCode(...e)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function _a(e){let t=e.file,n=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(n=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,n));const a=Wa(await fetch("https://content.dropboxapi.com/2/files/upload_session/append_v2",{method:"POST",headers:{Authorization:"Bearer "+e.token,"Content-Type":"application/octet-stream","Dropbox-API-Arg":Ba({cursor:{session_id:e.sessionId,offset:e.offset},close:n==e.file.size})},body:t}));if(e.onProgress&&!e.cancelled&&e.onProgress(e.offset+e.chunkSize,e.file.size),200==a.status&&(e.offset=n,e.offset=Ga){if(a=await l(e,"DELETE"),a.status>=Ga)throw new Error(Ka+a.status);return await Za(e,t,n)}}else{let a=await l(e,"HEAD");if(200==a.status){if("uniquify"==r||r==Ma&&!o){const{filenameWithoutExtension:a,extension:r,indexFilename:o}=function(e){let t=e,n=Na;const a=e.lastIndexOf(".");a>-1&&(t=e.substring(0,a),n=e.substring(a+1));let r;return({filenameWithoutExtension:t,indexFilename:r}=function(e){const t=e.match(Ha);let n=0;if(t&&t.length>1){const a=Number(t[t.length-1]);Number.isNaN(a)||(n=a,e=e.replace(Ha,Na))}return{filenameWithoutExtension:e,indexFilename:n}}(t)),{filenameWithoutExtension:t,extension:n,indexFilename:r}}(e);return n.indexFilename=o+1,await Za(function(e,t){return e+" ("+n.indexFilename+")"+(t?za+t:Na)}(a,r),t,n)}if(r==Ma)return(e=await o(e))?Za(e,t,n):a;if("skip"==r)return a}else{if(404==a.status){if(a=await l(e,"PUT",t),a.status>=Ga&&!s){if(e.includes(qa))return await async function(){const t=e.split(qa);t.pop();let n=Na;for(const e of t)if(e){n+=e;if(404==(await l(n,Va)).status){const e=await l(n,$a);if(e.status>=Ga)throw new Error(Ka+e.status)}n+=qa}}(),n.preventRetry=!0,await Za(e,t,n);throw new Error(Ka+a.status)}return a}if(a.status>=Ga)throw new Error(Ka+a.status)}}}catch(e){if("AbortError"!=e.name)throw e}function l(e,t,n){const r={[ja]:a};return n&&(r["Content-Type"]="text/html"),fetch(c+e,{method:t,headers:r,signal:i,body:n,credentials:"omit"})}}const Xa="",Qa="skip",Ya="uniquify",er="overwrite",tr="prompt",nr=".",ar=/\s\((\d+)\)$/,rr="AbortError",or="https://github.com",ir="https://api.github.com",sr="blob",cr="repos",lr="contents";let ur;class dr{constructor(e,t,n,a){this.headers=new Map([["Authorization","Bearer "+e],["Accept","application/vnd.github+json"],["X-GitHub-Api-Version","2022-11-28"]]),this.userName=t,this.repositoryName=n,this.branch=a}async upload(e,t,n){this.controller=new AbortController,n.signal=this.controller.signal,n.headers=this.headers;const a=t instanceof Blob?await async function(e){if(globalThis.FileReader){const t=new globalThis.FileReader;t.readAsDataURL(e);return(await new Promise((e,n)=>{t.addEventListener("load",()=>e(t.result),!1),t.addEventListener("error",n,!1)})).match(/^data:[^,]*,(.*)$/)[1]}{const t=new Uint8Array(await e.arrayBuffer());let n="";for(let e=0;e-1&&(t=e.substring(0,a),n=e.substring(a+1)),({filenameWithoutExtension:t,indexFilename:r}=f(t)),{filenameWithoutExtension:t,extension:n,indexFilename:r}}function f(e){const t=e.match(ar);let n=0;if(t&&t.length>1){const a=Number(t[t.length-1]);Number.isNaN(a)||(n=a,e=e.replace(ar,Xa))}return{filenameWithoutExtension:e,indexFilename:n}}function m(e,t){return e+" ("+o.indexFilename+")"+(t?nr+t:Xa)}}(this.userName,this.repositoryName,this.branch,e,a,n)}abort(){this.controller&&this.controller.abort()}}const fr="",mr="uniquify",hr=".",wr=/\s\((\d+)\)$/;class pr{constructor(e,t,n,a,r="s3.amazonaws.com"){this.api=new Ar({domain:r,region:e,bucket:t,accessKey:n,secretKey:a}),this.headObjectSupported=!0,this.listObjectsSupported=!0}async upload(e,t,n){const{filenameConflictAction:a,prompt:r}=n;this.controller=new AbortController,n.signal=this.controller.signal;try{if("overwrite"==a)return this.api.putObject({path:e},{body:await br(t)});{let o;if(this.headObjectSupported&&(o=await this.api.headObject({path:e},n)),this.headObjectSupported&&403!=o.status||(this.headObjectSupported=!1,this.listObjectsSupported&&(o=await this.api.listObjects({path:e},n)),this.listObjectsSupported&&403!=o.status||(this.listObjectsSupported=!1,o=await this.api.getObject({path:e},n))),200!=o.status){if(404==o.status)return t=new Uint8Array(await t.arrayBuffer()),this.api.putObject({path:e},{body:await br(t)});throw new Error(o.statusText||"Error "+o.status)}if("prompt"==a)return r?(e=await r(e))?this.upload(e,t,n):o:(n.filenameConflictAction=mr,this.upload(e,t,n));if(a==mr){const{filenameWithoutExtension:a,extension:r,indexFilename:o}=function(e){let t=e,n="";const a=e.lastIndexOf(".");a>-1&&(t=e.substring(0,a),n=e.substring(a+1));let r;return({filenameWithoutExtension:t,indexFilename:r}=function(e){const t=e.match(wr);let n=0;if(t&&t.length>1){const a=Number(t[t.length-1]);Number.isNaN(a)||(n=a,e=e.replace(wr,""))}return{filenameWithoutExtension:e,indexFilename:n}}(t)),{filenameWithoutExtension:t,extension:n,indexFilename:r}}(e);return n.indexFilename=o+1,e=function(e,t,n){return e+" ("+t+")"+(n?hr+n:fr)}(a,n.indexFilename,r),this.upload(e,t,n)}}}catch(e){if("AbortError"!=e.name)throw e}}abort(){this.controller&&this.controller.abort()}}async function br(e){return new Uint8Array(await new Response(e).arrayBuffer())}const gr="AWS4",yr=gr+"-HMAC-SHA256",vr="aws4_request";class Ar{constructor({domain:e,region:t,bucket:n,accessKey:a,secretKey:r}){this.domain=e,this.region=t,this.bucket=n,this.accessKey=a,this.secretKey=r}async putObject({path:e},{headers:t={},body:n}){return kr(this,{path:e},{method:"PUT",headers:t,body:n})}async getObject({path:e},{headers:t={}}={}){return kr(this,{path:e},{method:"GET",headers:t})}async headObject({path:e},{headers:t={}}={}){return kr(this,{path:e},{method:"HEAD",headers:t})}async listObjects({path:e},{headers:t={},continuationToken:n,delimiter:a,encodingType:r,prefix:o,maxKeys:i}={}){const s=new URLSearchParams;return s.set("list-type","2"),n&&s.set("continuation-token",n),a&&s.set("delimiter",a),r&&s.set("encoding-type",r),o&&s.set("prefix",o),i&&s.set("max-keys",i),kr(this,{path:e,searchParams:s},{method:"GET",headers:t})}}async function kr({region:e,bucket:t,accessKey:n,secretKey:a,domain:r},{path:o="/",searchParams:i=new URLSearchParams},{method:s,headers:c={},body:l}){const u=function(e){const t=new Date(e);return t.toISOString().replace(/[:-]|\.\d{3}/g,"")}(new Date);o.startsWith("/")||(o="/"+o),c.host=t+"."+r,l&&(c["content-length"]=l.byteLength),c["x-amz-content-sha256"]=await Sr(l),c["x-amz-date"]=u,c.authorization=yr+" Credential="+n+"/"+Cr(u,e,"s3")+",SignedHeaders="+Tr(c)+",Signature="+await async function({region:e,secretKey:t,service:n},{path:a,searchParams:r},{method:o,headers:i,body:s,isoDate:c}){const l=await async function(e,t,n,a,r,o,i,s){const c=await async function(e,t,n,a,r=new Uint8Array(0)){return a+"\n"+function(e){return decodeURIComponent(e).replace(/[^A-Za-z0-9-._~/]/g,xr)}(e)+"\n"+function(e){if(e){let t="";e.sort();for(const[n,a]of e)t+=encodeURIComponent(n)+"="+encodeURIComponent(a)+"&";return t.slice(0,-1)}return""}(t)+"\n"+function(e){let t="";const n=Object.keys(e).sort();for(const a of n)t+=a+":"+e[a]+"\n";return t}(n)+"\n"+Tr(n)+"\n"+await Sr(r)}(e,t,n,i,a);return yr+"\n"+r+"\n"+Cr(r,o,s)+"\n"+Rr(await Ir(Pr(c)))}(a,r,i,s,c,e,o,n),u=await async function(e,t,n,a){const r=await Er(Pr(gr+e),Pr(t.substring(0,8))),o=await Er(r,Pr(n)),i=await Er(o,Pr(a));return Er(i,Pr(vr))}(t,c,e,n);return Rr(await Er(u,Pr(l)))}({region:e,secretKey:a,service:"s3"},{path:o,searchParams:i},{method:s,headers:c,body:l,isoDate:u});const d="https://"+t+"."+r+o+(i.size?"?"+i:""),f={method:s,headers:c};return l&&(f.body=l),fetch(d,f)}function xr(e){let t=encodeURIComponent(e);return t=t.startsWith("%")?t.toUpperCase():"%"+t.charCodeAt(0).toString(16).toUpperCase(),t}function Tr(e){return Object.keys(e).map(e=>e.toLowerCase()).sort().join(";")}async function Sr(e=new Uint8Array(0)){return Rr(await Ir(e))}function Cr(e,t,n){return e.substring(0,8)+"/"+t+"/"+n+"/"+vr}async function Ir(e){return crypto.subtle.digest("SHA-256",e)}async function Er(e,t){const n={name:"HMAC",hash:{name:"SHA-256"}},a=await crypto.subtle.importKey("raw",e,n,!1,["sign"]);return crypto.subtle.sign(n,a,t)}function Pr(e){return(new TextEncoder).encode(e)}function Rr(e){return Array.from(new Uint8Array(e)).map(e=>e.toString(16).padStart(2,"0")).join("")}const Ur="",Dr="uniquify",Fr=".",Lr=/\s\((\d+)\)$/,_r="Content-Type",Or=32768,Wr="write_file",Br="get_file_info";class Nr{constructor(e,t){this.serverUrl=e,this.authToken=t,this.requestId=0}async upload(e,t,n){if(this.controller=new AbortController,n.signal=this.controller.signal,n.serverUrl=this.serverUrl,n.authToken=this.authToken,n.getRequestId=()=>++this.requestId,t instanceof Blob){const e=new Uint8Array(await t.arrayBuffer());try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch(a){if(!await async function(e,t,n,a){const r=await qr(e,t,"tools/list",{},n,a),o=(r.result&&r.result.tools||[]).find(e=>e.name==Wr),i=o&&o.inputSchema&&o.inputSchema.properties;return Boolean(i&&i.encoding)}(this.serverUrl,this.authToken,n.signal,n.getRequestId))throw new Error("The MCP server does not support binary files (the write_file tool has no 'encoding' argument)",{cause:a});t=function(e){let t="";for(let n=0;n-1&&(t=e.substring(0,a),n=e.substring(a+1));let r;return({filenameWithoutExtension:t,indexFilename:r}=function(e){const t=e.match(Lr);let n=0;if(t&&t.length>1){const a=Number(t[t.length-1]);Number.isNaN(a)||(n=a,e=e.replace(Lr,""))}return{filenameWithoutExtension:e,indexFilename:n}}(t)),{filenameWithoutExtension:t,extension:n,indexFilename:r}}(e);return n.indexFilename=o+1,e=function(e,t,n){return e+" ("+n+")"+(t?Fr+t:Ur)}(a,r,n.indexFilename),await Mr(e,t,n)}if("prompt"==a)return r?(e=await r(e))?await Mr(e,t,n):{url:e,skipped:!0}:(n.filenameConflictAction=Dr,await Mr(e,t,n))}}const d=await async function(e,t,n,a,r,o,i){const s={path:n,content:a};r&&(s.encoding=r);const c=await jr(e,t,Wr,s,o,i);if(c.error)throw new Error(c.error.message);return{success:!0}}(i,s,e,t,l,o,c);if(d.success)return{url:e};throw new Error(d.error||"Failed to write file via MCP")}catch(e){if("AbortError"!=e.name)throw e}}function jr(e,t,n,a,r,o){return qr(e,t,"tools/call",{name:n,arguments:a},r,o)}async function qr(e,t,n,a,r,o){const i={[_r]:"application/json",Accept:"application/json, text/event-stream"};t&&(i.Authorization=`Bearer ${t}`);const s=await fetch(e,{method:"POST",headers:i,body:JSON.stringify({jsonrpc:"2.0",id:o(),method:n,params:a}),signal:r});if(!s.ok)throw new Error(`MCP server error: ${s.status} ${s.statusText}`);return s.json()}const zr=[0],Kr=Symbol(),Hr=new TextEncoder,Vr=new TextDecoder,$r=new Array(256);let Gr=0;function Jr(e,t,n,a){if(void 0===a){if(Gr++,!($r.length-Gr>=zr.length))throw new Error("Reached maximum number of custom types");$r[$r.length-Gr]={serialize:e,parse:t,test:n}}else $r[a]={serialize:e,parse:t,test:n}}Jr(async function(e,t){const n=e.objects.indexOf(t);await Yr(e,n)},async function(e){const t=await lo(e);return new oo(t,e)},wo,0),Jr(null,function(){return{}},bo),Jr(eo,uo,go),Jr(to,fo,function(e){return"string"==typeof e}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(8*t);return new Float64Array(n.buffer)},function(e){return"Float64Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(4*t);return new Float32Array(n.buffer)},function(e){return"Float32Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(4*t);return new Uint32Array(n.buffer)},function(e){return"Uint32Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(4*t);return new Int32Array(n.buffer)},function(e){return"Int32Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(2*t);return new Uint16Array(n.buffer)},function(e){return"Uint16Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(2*t);return new Int16Array(n.buffer)},function(e){return"Int16Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(t);return new Uint8ClampedArray(n.buffer)},function(e){return"Uint8ClampedArray"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e);return await e.consume(t)},function(e){return"Uint8Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(t);return new Int8Array(n.buffer)},function(e){return"Int8Array"==e.constructor.name}),Jr(async function(e,t){await Yr(e,t.byteLength),await e.append(new Uint8Array(t))},async function(e){const t=await lo(e);return(await e.consume(t)).buffer},function(e){return"ArrayBuffer"==e.constructor.name}),Jr(ao,mo,vo),Jr(async function(e,t){const n=new Uint8Array(new Uint32Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(4);return new Uint32Array(t.buffer)[0]},function(e){return Ao(e)&&e>=0&&e<=4294967295}),Jr(async function(e,t){const n=new Uint8Array(new Int32Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(4);return new Int32Array(t.buffer)[0]},function(e){return Ao(e)&&e>=-2147483648&&e<=2147483647}),Jr(async function(e,t){const n=new Uint8Array(new Uint16Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(2);return new Uint16Array(t.buffer)[0]},function(e){return Ao(e)&&e>=0&&e<=65535}),Jr(async function(e,t){const n=new Uint8Array(new Int16Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(2);return new Int16Array(t.buffer)[0]},function(e){return Ao(e)&&e>=-32768&&e<=32767}),Jr(async function(e,t){const n=new Uint8Array([t]);await e.append(n)},async function(e){const t=await e.consume(1);return new Uint8Array(t.buffer)[0]},function(e){return Ao(e)&&e>=0&&e<=255}),Jr(async function(e,t){const n=new Uint8Array(new Int8Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(1);return new Int8Array(t.buffer)[0]},function(e){return Ao(e)&&e>=-128&&e<=127}),Jr(null,function(){return},function(e){return void 0===e}),Jr(null,function(){return null},function(e){return null===e}),Jr(null,function(){return NaN},function(e){return Number.isNaN(e)}),Jr(ro,ho,function(e){return"boolean"==typeof e}),Jr(async function(e,t){await to(e,t.description)},async function(e){const t=await fo(e);return Symbol(t)},ko),Jr(null,function(){return Kr},yo),Jr(async function(e,t){const n=t.entries();await Yr(e,t.size);for(const[t,a]of n)await Yr(e,t),await Yr(e,a)},async function(e){const t=await lo(e),n=new Map;t&&await async function a(r=0){const o=await lo(e),i=await lo(e);e.setObject([o,i],(e,t)=>n.set(e,t)),rn.add(e)),rthis.value.length){const t=this.value.length-this.offset;await this.append(new Uint8Array(e).subarray(0,t)),await this.appendData({value:this.value}),this.offset=0,await this.append(new Uint8Array(e).subarray(t))}else this.value.set(e,this.offset),this.offset+=e.length}async flush(){this.offset&&await this.appendData({value:new Uint8Array(this.value).subarray(0,this.offset),done:!0})}}function Qr(e,{chunkSize:t=8388608}={}){let n,a,r,o,i,s;return{[Symbol.asyncIterator]:()=>({next:()=>o?{done:o}:async function(){s?s():c().catch(()=>{});i=new Promise(e=>s=e);const e=await async function(){const{value:e,done:t}=await a;o=t,t||l();return e}();return{value:e}}(),return:()=>({done:!0})})};async function c(){l(),n=new Zr(u,t),await Yr(n,e),await n.flush()}function l(){a=new Promise(e=>r=e)}async function u(e){r(e),await i}}async function Yr(e,t){const n=$r.findIndex(({test:n}={})=>n&&n(t,e));e.addObject(t),await e.append(new Uint8Array([n]));const a=$r[n].serialize;a&&await a(e,t),0!=n&&bo(t)&&(await async function(e,t){const n=Object.getOwnPropertySymbols(t),a=n.map(e=>[e,t[e]]);await eo(e,a)}(e,t),await async function(e,t){if(ArrayBuffer.isView(t))await Yr(e,0);else{let n=Object.entries(t);go(t)&&(n=n.filter(([e])=>!Ao(Number(e)))),await Yr(e,n.length);for(const[t,a]of n)await to(e,t),await Yr(e,a)}}(e,t))}async function eo(e,t){await Yr(e,t.length);const n=Object.keys(t).filter(e=>Ao(Number(e))).map(e=>Number(e));let a=0,r=n[a];for(const[o,i]of t.entries())r==o?(r=n[++a],await Yr(e,i)):await Yr(e,Kr)}async function to(e,t){const n=Hr.encode(t);await Yr(e,n.length),await e.append(n)}async function no(e,t){await Yr(e,t.length),await e.append("Uint8Array"==t.constructor.name?t:new Uint8Array(t.buffer))}async function ao(e,t){const n=new Uint8Array(new Float64Array([t]).buffer);await e.append(n)}async function ro(e,t){const n=new Uint8Array([Number(t)]);await e.append(n)}class oo{constructor(e,t){this.index=e,this.data=t}getObject(){return this.data.objects[this.index]}}class io{constructor(e){this.stream=new so(e),this.objects=[],this.setters=[]}consume(e){return this.stream.consume(e)}getObjectId(){const e=this.objects.length;return this.objects.push(void 0),e}resolveObject(e,t){xo(t)&&!po(t)&&(this.objects[e]=t)}setObject(e,t){this.setters.push({functionArguments:e,setterFunction:t})}executeSetters(){this.setters.forEach(({functionArguments:e,setterFunction:t})=>{t(...e.map(e=>po(e)?e.getObject():e))})}}class so{constructor(e){this.offset=0,this.value=new Uint8Array(0),this.consumeData=e}async consume(e){if(this.offset+e>this.value.length){const t=new Uint8Array(this.value).subarray(this.offset,this.value.length),n=await this.consumeData();return t.length+n.length!=this.value.length&&(this.value=new Uint8Array(t.length+n.length)),this.value.set(t),this.value.set(n,t.length),this.offset=0,this.consume(e)}{const t=this.value.slice(this.offset,this.offset+e);return this.offset+=t.length,t}}}function co(){let e,t,n,a,r,o;return{next:async t=>t?async function(t){r?await r:async function(){let t;a=new Promise(e=>t=e),e=new io(s),i();const n=await lo(e);e.executeSetters(),t(n)}().catch(()=>{});return function(){r=new Promise(e=>o=e)}(),n(t),{done:!1}}(t):{value:await a,done:!0},return:()=>({done:!0})};function i(){t=new Promise(e=>n=e)}async function s(){const e=await t;return i(),o&&o(),e}}async function lo(e){const t=(await e.consume(1))[0],n=$r[t].parse,a=e.getObjectId(),r=await n(e);return 0!=t&&bo(r)&&(await async function(e,t){const n=await uo(e);e.setObject([n],e=>e.forEach(([e,n])=>t[e]=n))}(e,r),await async function(e,t){const n=await lo(e);n&&await a();async function a(r=0){const o=await fo(e),i=await lo(e);e.setObject([i],e=>t[o]=e),rn[r]=e);rthis.folderIds.clear(),6e4)}async auth(e={interactive:!0}){if(Aa(e))return this.accessToken=await ka({interactive:e.interactive}),{revokableAccessToken:this.accessToken};{if(e.code)return ya(this,e);const t=Array.from(crypto.getRandomValues(new Uint8Array(16))).map(e=>e.toString(16).padStart(2,"0")).join(""),{verifier:n,challenge:a}=await async function(){const e=va(crypto.getRandomValues(new Uint8Array(32))),t=va(new Uint8Array(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(e))));return{verifier:e,challenge:t}}();return this.codeVerifier=n,this.authURL="https://accounts.google.com/o/oauth2/v2/auth?client_id="+this.clientId+"&response_type=code&access_type=offline&state="+t+"&code_challenge="+a+"&code_challenge_method=S256&redirect_uri="+browser.identity.getRedirectURL()+"&scope="+this.scopes.join(" "),async function(e,t,n){let a;const r={state:n};try{if(Boolean(browser.identity&&browser.identity.launchWebAuthFlow)&&Boolean(globalThis.chrome&&globalThis.chrome.windows||globalThis.browser&&globalThis.browser.windows)&&!t.forceWebAuthFlow){const a=await browser.identity.launchWebAuthFlow({interactive:t.interactive,url:e.authURL}),r=new URLSearchParams(new URL(a).search);if(r.get("state")!=n)throw new Error("invalid_auth_response");return t.code=r.get("code"),await ya(e,t)}if(t.launchWebAuthFlow)return t.extractAuthCode(browser.identity.getRedirectURL(),r).then(e=>a=e).catch(()=>{}),await t.launchWebAuthFlow({url:e.authURL},r);throw new Error("auth_not_supported")}catch(n){if(n.message&&("code_required"==n.message||n.message.includes("access"))){if(a)return t.code=a,await ya(e,t);throw new Error("code_required",{cause:n})}throw n}finally{r.cancel&&r.cancel()}}(this,e,t)}}setAuthInfo(e,t){Aa(t)||(e?(this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationDate=e.expirationDate):(delete this.accessToken,delete this.refreshToken,delete this.expirationDate))}async refreshAuthToken(){if(this.refreshToken){const e=await fetch(wa,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+this.clientId+"&refresh_token="+this.refreshToken+"&grant_type=refresh_token&client_secret="+this.clientKey});if(400==e.status)throw new Error("unknown_token");const t=await Ca(e);return this.accessToken=t.access_token,t.refresh_token&&(this.refreshToken=t.refresh_token),t.expires_in&&(this.expirationDate=Date.now()+1e3*t.expires_in),{accessToken:this.accessToken,refreshToken:this.refreshToken,expirationDate:this.expirationDate}}try{return browser.identity&&browser.identity.removeCachedAuthToken&&this.accessToken&&await browser.identity.removeCachedAuthToken({token:this.accessToken}),this.accessToken=await ka({interactive:!1}),{revokableAccessToken:this.accessToken}}catch(e){delete this.accessToken}}async revokeAuthToken(e){if(e){if(browser.identity&&browser.identity.removeCachedAuthToken)try{await browser.identity.removeCachedAuthToken({token:e})}catch(e){}const t=await fetch("https://accounts.google.com/o/oauth2/revoke",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"token="+e});try{await Ca(t)}catch(e){if("invalid_token"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,n,a,r=!0){const o=await xa(this,e),i=e.split("/").pop(),s=new ga({token:this.accessToken,file:t,parents:[o],filename:i,onProgress:n.onProgress,filenameConflictAction:n.filenameConflictAction,prompt:n.prompt});try{a&&a(()=>s.cancelled=!0),await s.upload()}catch(o){if("path_not_found"==o.message&&r)return this.folderIds.clear(),this.upload(e,t,n,a);throw o}}}(Po,Ro,["https://www.googleapis.com/auth/drive.file"]),Fo=new class{constructor(e,t){this.clientId=e,this.clientKey=t}async auth(e={interactive:!0}){if(e.code)return Fa(this,e);const t=Array.from(crypto.getRandomValues(new Uint8Array(16))).map(e=>e.toString(16).padStart(2,"0")).join(""),{verifier:n,challenge:a}=await async function(){const e=La(crypto.getRandomValues(new Uint8Array(32))),t=La(new Uint8Array(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(e))));return{verifier:e,challenge:t}}();return this.codeVerifier=n,this.authURL="https://www.dropbox.com/oauth2/authorize?client_id="+this.clientId+"&response_type=code&token_access_type=offline&state="+t+"&code_challenge="+a+"&code_challenge_method=S256&redirect_uri="+browser.identity.getRedirectURL(),async function(e,t,n){let a;const r={state:n};try{return t.extractAuthCode(browser.identity.getRedirectURL(),r).then(e=>a=e).catch(()=>{}),await t.launchWebAuthFlow({url:e.authURL},r)}catch(n){if(n.message&&("code_required"==n.message||n.message.includes("access"))){if(a)return t.code=a,await Fa(e,t);throw new Error("code_required",{cause:n})}throw n}finally{r.cancel&&r.cancel()}}(this,e,t)}setAuthInfo(e){e?(this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationDate=e.expirationDate):(delete this.accessToken,delete this.refreshToken,delete this.expirationDate)}async refreshAuthToken(){if(this.refreshToken){const e=await fetch(Ea,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+this.clientId+"&refresh_token="+this.refreshToken+"&grant_type=refresh_token&client_secret="+this.clientKey});if(400==e.status)throw new Error("unknown_token");const t=await Oa(e);return this.accessToken=t.access_token,t.refresh_token&&(this.refreshToken=t.refresh_token),t.expires_in&&(this.expirationDate=Date.now()+1e3*t.expires_in),{accessToken:this.accessToken,refreshToken:this.refreshToken,expirationDate:this.expirationDate}}delete this.accessToken}async revokeAuthToken(e){if(e){const t=await fetch("https://api.dropboxapi.com/2/auth/token/revoke",{method:"POST",headers:{Authorization:"Bearer "+e}});try{await t.text()}catch(e){if("invalid_token"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,n,a){const r=new Da({token:this.accessToken,file:t,filename:e,onProgress:n.onProgress,filenameConflictAction:n.filenameConflictAction,prompt:n.prompt});a&&a(()=>r.cancelled=!0),await r.upload()}}("s50p6litdvuzrtb","i1vzwllesr14fzd");async function Lo(e,t){if(e.method.endsWith(".download"))return async function(e,t){const n=t.id;let a;const r=e.blob instanceof Blob&&e.blob.size?e.blob:null;if(r||e.blobURL)try{if(e.compressContent){const n=r?await r.arrayBuffer():await(await fetch(e.blobURL)).arrayBuffer();e.pageData=await async function(e){const t=co();return await t.next(e),(await t.next()).value}(new Uint8Array(n)),await Oo(e,t)}else{const n=r||await(await fetch(e.blobURL)).blob();r||(e.url=e.blobURL),await _o(n,t,t.incognito,e)}}catch(e){return{error:!0}}else if(e.compressContent){let a=Co.get(n);if(a||(a=co(),Co.set(n,a)),e.data)await a.next(new Uint8Array(e.data));else{Co.delete(n);const e=(await a.next()).value;await Oo(e,t)}}else e.truncated?(a=So.get(n),a||(a=[],So.set(n,a)),a.push(e.content),e.finished&&So.delete(n)):e.content&&(a=[e.content]),e.truncated&&!e.finished||await _o(new Blob(a,{type:e.mimeType}),t,t.incognito,e);return{}}(e,t.tab);if(e.method.endsWith(".disableGDrive")){const e=await Ae();return Se(),await Do.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(".disableDropbox")){const e=await ke();return Ce(),await Fo.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(".end")){if(e.hash)try{await ha(e.hash,e.woleetKey)}catch(e){sn(t.tab.id,e.message,e.link)}return Yn(e.taskId),{}}return e.method.endsWith(".getInfo")?Mn.map(oa):e.method.endsWith(".cancel")?(e.taskId?na(e.taskId):ta(t.tab.id),{}):e.method.endsWith(".cancelAll")?(Array.from(Mn).forEach(e=>ra(e,!1)),{}):e.method.endsWith(".saveUrls")?($n(e.urls),{}):void 0}async function _o(e,t,n,a){const r=t.id;try{let o;if(a.backgroundSave&&!a.saveToGDrive&&!a.saveToDropbox&&!a.saveWithWebDAV&&!a.saveToGitHub&&!a.saveToRestFormApi&&!a.saveToS3){const e=await $o(a.filename,a);a.filenameConflictAction=e.filenameConflictAction,o=e.skipped}if(o)ln(r);else{const o=e=>Jo(r,e);let i;if(a.openEditor)cn(r),await Le({tabIndex:t.index+1,filename:a.filename,content:await e.text(),url:a.originalUrl});else if(a.saveToClipboard)a.content=await e.text(),function(e){const t="copy";function n(t){t.clipboardData.setData(e.mimeType,e.content),t.clipboardData.setData("text/plain",e.content),t.preventDefault()}document.addEventListener(t,n),document.execCommand(t),document.removeEventListener(t,n)}(a);else if(a.saveWithWebDAV)i=await zo(a.taskId,Bo(a.filename),e,a.webDAVURL,a.webDAVUser,a.webDAVPassword,{filenameConflictAction:a.filenameConflictAction,prompt:o});else if(a.saveWithMCP)i=await Ko(a.taskId,Bo(a.filename),e,a.mcpServerUrl,a.mcpAuthToken,{filenameConflictAction:a.filenameConflictAction,prompt:o});else if(a.saveToGDrive)await Ho(a.taskId,Bo(a.filename),e,{forceWebAuthFlow:a.forceWebAuthFlow},{onProgress:(e,t)=>un(r,e,t),filenameConflictAction:a.filenameConflictAction,prompt:o});else if(a.saveToDropbox)await Vo(a.taskId,Bo(a.filename),e,{onProgress:(e,t)=>un(r,e,t),filenameConflictAction:a.filenameConflictAction,prompt:o});else if(a.saveToGitHub)i=await jo(a.taskId,Bo(a.filename),e,a.githubToken,a.githubUser,a.githubRepository,a.githubBranch,{filenameConflictAction:a.filenameConflictAction,prompt:o}),await i.pushPromise;else if(a.saveWithCompanion)await ia({filename:a.filename,content:await e.text(),title:a.title,url:a.originalUrl,filenameConflictAction:a.filenameConflictAction});else if(a.saveToRestFormApi)i=await Qo(a.taskId,a.filename,e,a.originalUrl,a.saveToRestFormApiToken,a.saveToRestFormApiUrl,a.saveToRestFormApiFileFieldName,a.saveToRestFormApiUrlFieldName);else if(a.saveToS3)i=await qo(a.taskId,Bo(a.filename),e,a.S3Domain,a.S3Region,a.S3Bucket,a.S3AccessKey,a.S3SecretKey,{filenameConflictAction:a.filenameConflictAction,prompt:o});else if(a.url||(a.url=URL.createObjectURL(e)),i=await Xo(a,{confirmFilename:a.confirmFilename,incognito:n,filenameConflictAction:a.filenameConflictAction,filenameReplacementCharacter:a.filenameReplacementCharacter,promptConflictingFilename:e=>Zo(r,e),bookmarkId:a.bookmarkId,replaceBookmarkURL:a.replaceBookmarkURL,includeInfobar:a.includeInfobar,openInfobar:a.openInfobar,animateInfobar:a.animateInfobar,infobarPositionAbsolute:a.infobarPositionAbsolute,infobarPositionTop:a.infobarPositionTop,infobarPositionBottom:a.infobarPositionBottom,infobarPositionLeft:a.infobarPositionLeft,infobarPositionRight:a.infobarPositionRight}),!i)throw new Error("upload_cancelled");a.bookmarkId&&a.replaceBookmarkURL&&i&&i.url&&await ua(a.bookmarkId,{url:i.url}),ln(r),a.openSavedPage&&!a.openEditor&&await Wo(t,URL.createObjectURL(e))}}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),sn(r,e.message,e.link))}finally{a.url&&URL.revokeObjectURL(a.url)}}async function Oo(e,t){const n=t.id;try{let a;if(e.backgroundSave&&!e.saveToGDrive&&!e.saveToDropbox&&!e.saveWithWebDAV&&!e.saveWithMCP&&!e.saveToGitHub&&!e.saveToRestFormApi&&!e.sharePage){const t=await $o(e.filename,e);e.filenameConflictAction=t.filenameConflictAction,a=t.skipped}if(a)ln(n);else{const a=e.pageData,r=e=>Jo(n,e),o=await singlefile.processors.compression.process(a,{insertTextBody:e.insertTextBody,url:a.url||t.url,createRootDirectory:e.createRootDirectory,tabId:n,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,extractDataFromPage:e.extractDataFromPage,preventAppendedData:e.preventAppendedData,maxAppendedDataLength:e.maxAppendedDataLength,insertCanonicalLink:e.insertCanonicalLink,insertMetaNoIndex:e.insertMetaNoIndex,insertMetaCSP:e.insertMetaCSP,password:e.password,embeddedImage:e.embeddedImage});let i;if(e.openEditor)cn(n),await Le({tabIndex:t.index+1,filename:e.filename,content:Array.from(new Uint8Array(await o.arrayBuffer())),compressContent:e.compressContent,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,extractDataFromPage:e.extractDataFromPage,insertTextBody:e.insertTextBody,insertMetaCSP:e.insertMetaCSP,embeddedImage:e.embeddedImage,url:e.originalUrl});else if(e.foregroundSave||!e.backgroundSave||e.sharePage){const t=await async function(e,t,n,a,r,{foregroundSave:o,sharePage:i}={}){const s=Qr({filename:t,taskId:e,foregroundSave:o,sharePage:i,content:await n.arrayBuffer(),mimeType:a});for await(const e of s)await browser.tabs.sendMessage(r,{method:"content.download",data:Array.from(e)});return browser.tabs.sendMessage(r,{method:"content.download"})}(e.taskId,e.filename,o,a.mimeType,n,{foregroundSave:!0,sharePage:e.sharePage});if(t.error)throw new Error(t.error)}else e.saveWithWebDAV?i=await zo(e.taskId,Bo(e.filename),o,e.webDAVURL,e.webDAVUser,e.webDAVPassword,{filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveWithMCP?i=await Ko(e.taskId,Bo(e.filename),o,e.mcpServerUrl,e.mcpAuthToken,{filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveToGDrive?await Ho(e.taskId,Bo(e.filename),o,{forceWebAuthFlow:e.forceWebAuthFlow},{onProgress:(e,t)=>un(n,e,t),filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveToDropbox?await Vo(e.taskId,Bo(e.filename),o,{onProgress:(e,t)=>un(n,e,t),filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveToGitHub?(i=await jo(e.taskId,Bo(e.filename),o,e.githubToken,e.githubUser,e.githubRepository,e.githubBranch,{filenameConflictAction:e.filenameConflictAction,prompt:r}),await i.pushPromise):e.saveToRestFormApi?i=await Qo(e.taskId,e.filename,o,e.originalUrl,e.saveToRestFormApiToken,e.saveToRestFormApiUrl,e.saveToRestFormApiFileFieldName,e.saveToRestFormApiUrlFieldName):e.saveToS3?i=await qo(e.taskId,Bo(e.filename),o,e.S3Domain,e.S3Region,e.S3Bucket,e.S3AccessKey,e.S3SecretKey,{filenameConflictAction:e.filenameConflictAction,prompt:r}):(e.url=URL.createObjectURL(o),i=await Xo(e,{confirmFilename:e.confirmFilename,incognito:t.incognito,filenameConflictAction:e.filenameConflictAction,filenameReplacementCharacter:e.filenameReplacementCharacter,promptConflictingFilename:e=>Zo(n,e),bookmarkId:e.bookmarkId,replaceBookmarkURL:e.replaceBookmarkURL,includeInfobar:e.includeInfobar,openInfobar:e.openInfobar,animateInfobar:e.animateInfobar,infobarPositionAbsolute:e.infobarPositionAbsolute,infobarPositionTop:e.infobarPositionTop,infobarPositionBottom:e.infobarPositionBottom,infobarPositionLeft:e.infobarPositionLeft,infobarPositionRight:e.infobarPositionRight}));e.bookmarkId&&e.replaceBookmarkURL&&i&&i.url&&await ua(e.bookmarkId,{url:i.url}),ln(n),e.openSavedPage&&!e.openEditor&&await Wo(t,URL.createObjectURL(o),{compressed:!0})}}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),sn(n,e.message,e.link))}finally{e.url&&URL.revokeObjectURL(e.url)}}async function Wo(e,t,{compressed:n}={}){const a={active:!0,url:"/src/ui/pages/viewer.html?"+(n?"compressed&":"")+"blobURI="+t,windowId:e.windowId};null!=e.index&&(a.index=e.index+1);const r=await browser.tabs.create(a);Io.set(r.id,t)}function Bo(e){return e.replace(/#/g,"%23")}async function No(e,t){let n=await Ae();const a={interactive:!0,forceWebAuthFlow:e.forceWebAuthFlow,launchWebAuthFlow:(e,t)=>$e(e,t),extractAuthCode:(e,t)=>Ve(e,t)};return Do.setAuthInfo(n,a),n&&n.accessToken&&!t||(n=await Do.auth(a),n?await xe(n):await Se()),n}async function Mo(e){let t=await ke();const n={launchWebAuthFlow:(e,t)=>$e(e,t),extractAuthCode:(e,t)=>Ve(e,t)};return Fo.setAuthInfo(t),t&&t.accessToken&&!e||(t=await Fo.auth(n),t?await Te(t):await Ce()),t}async function jo(e,t,n,a,r,o,i,{filenameConflictAction:s,prompt:c}){try{const l=aa(e);if(!l||!l.cancelled){const l=new dr(a,r,o,i);return ea(e,()=>l.abort()),await l.upload(t,n,{filenameConflictAction:s,prompt:c})}}catch(e){throw new Error(e.message+" (GitHub)",{cause:e})}}async function qo(e,t,n,a,r,o,i,s,{filenameConflictAction:c,prompt:l}){try{const u=aa(e);if(!u||!u.cancelled){const u=new pr(r,o,i,s,a);return ea(e,()=>u.abort()),await u.upload(t,n,{filenameConflictAction:c,prompt:l})}}catch(e){throw new Error(e.message+" (S3)",{cause:e})}}async function zo(e,t,n,a,r,o,{filenameConflictAction:i,prompt:s}){try{const c=aa(e);if(!c||!c.cancelled){const c=new Ja(a,r,o);return ea(e,()=>c.abort()),await c.upload(t,n,{filenameConflictAction:i,prompt:s})}}catch(e){throw new Error(e.message+" (WebDAV)",{cause:e})}}async function Ko(e,t,n,a,r,{filenameConflictAction:o,prompt:i}){try{const s=aa(e);if(!s||!s.cancelled){const s=new Nr(a,r);return ea(e,()=>s.abort()),await s.upload(t,n,{filenameConflictAction:o,prompt:i})}}catch(e){throw new Error(e.message+" (MCP)",{cause:e})}}async function Ho(e,t,n,a,r){try{await No(a);const o=aa(e);if(!o||!o.cancelled)return await Do.upload(t,n,r,t=>ea(e,t))}catch(o){if("invalid_token"==o.message){let o;try{o=await Do.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Google Drive)",{cause:e});o=await No(a,!0)}return o?await xe(o):await Se(),await Ho(e,t,n,a,r)}throw new Error(o.message+" (Google Drive)",{cause:o})}}async function Vo(e,t,n,a){try{await Mo();const r=aa(e);if(!r||!r.cancelled)return await Fo.upload(t,n,a,t=>ea(e,t))}catch(r){if("invalid_token"==r.message){let r;try{r=await Fo.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Dropbox)",{cause:e});r=await Mo(!0)}return r?await Te(r):await Ce(),await Vo(e,t,n,a)}throw new Error(r.message+" (Dropbox)",{cause:r})}}async function $o(e,t){let n,a=t.filenameConflictAction;return"skip"==a&&(await Go(e)?n=!0:a="uniquify"),{skipped:n,filenameConflictAction:a}}async function Go(e){const t=await browser.downloads.search({filenameRegex:"(\\\\|/)"+(n=e,n.replace(Eo,"\\$1")+"$"),exists:!0});var n;return Boolean(t.length)}function Jo(e,t){return browser.tabs.sendMessage(e,{method:"content.prompt",message:"Filename conflict, please enter a new filename",value:t})}async function Zo(e,t){for(;t&&await Go(t);)t=await Jo(e,t);return t}async function Xo(e,t){const n={url:e.url,saveAs:t.confirmFilename,filename:e.filename,conflictAction:t.filenameConflictAction};t.incognito&&(n.incognito=!0);const a=await i(n,t.filenameReplacementCharacter,t.promptConflictingFilename);if(a.filename){let e=a.filename;return e.startsWith("file:")||(e.startsWith("/")&&(e=e.substring(1)),e="file:///"+Bo(e)),{url:e}}a.cancelled&&na(e.taskId)}async function Qo(e,t,n,a,r,o,i,s){try{const c=aa(e);if(!c||!c.cancelled){const c=new To(r,o,i,s);return ea(e,()=>c.abort()),await c.upload(t,n,a)}}catch(e){throw new Error(e.message+" (RestFormApi)",{cause:e})}}browser.tabs.onRemoved.addListener(e=>{const t=Io.get(e);t&&(Io.delete(e),URL.revokeObjectURL(t))});const Yo={},ei={};async function ti(e,t){if("enableAutoSave"==e.method){const n=await m(t.id);n[t.id].autoSave=e.enabled,await h(n),async function(e){Promise.all([Bt(e),pt(e)])}(t)}if("isAutoSaveEnabled"==e.method)return Ee(t)}async function ni(e,t){const n=t.id,a=await fe(t.url,!0);if(a){let r;on(n,1,!0),a.content=e.content,a.url=e.url,a.frames=e.frames,a.canvases=e.canvases,a.fonts=e.fonts,a.stylesheets=e.stylesheets,a.images=e.images,a.posters=e.posters,a.videos=e.videos,a.usedFonts=e.usedFonts,a.shadowRoots=e.shadowRoots,a.referrer=e.referrer,a.worklets=e.worklets,a.adoptedStyleSheets=e.adoptedStyleSheets,a.visitDate=new Date(e.visitDate),a.backgroundTab=!0,a.autoSave=!0,a.incognito=t.incognito,a.tabId=n,a.tabIndex=t.index;try{if(a.autoSaveExternalSave)await async function(e){let t;e.autoSaveExternalSave=!1;try{t=await browser.runtime.sendNativeMessage("singlefile_companion",{method:"externalSave",pageData:e})}catch(e){if(!e.message||!e.message.includes("Native host has exited")&&!e.message.includes("An unexpected error occurred"))throw e}if(t&&t.error)throw new Error(t.error+" (Companion)")}(a);else{let o;if(a.passReferrerOnError&&Ke(),a.tabId=n,r=await function(e,t={fetch:Cn,frameFetch:In},n,a){return globalThis.singlefile.getPageData(e,t,n,a)}(a,{fetch:ai},null,null),!(a.saveToGDrive||a.saveWithWebDAV||a.saveWithMCP||a.saveToGitHub||a.saveToDropbox||a.saveWithCompanion||a.saveToRestFormApi||a.saveToS3)){const e=await $o(r.filename,a);o=e.skipped,a.filenameConflictAction=e.filenameConflictAction}if(!o){let{content:o,mimeType:i}=r;if(a.compressContent&&(o=new Blob([new Uint8Array(o)],{type:i})),a.saveToGDrive?(o instanceof Blob||(o=new Blob([o],{type:i})),await Ho(e.taskId,Bo(r.filename),o,{forceWebAuthFlow:a.forceWebAuthFlow},{filenameConflictAction:a.filenameConflictAction})):a.saveToDropbox?(o instanceof Blob||(o=new Blob([o],{type:i})),await Vo(e.taskId,Bo(r.filename),o,{filenameConflictAction:a.filenameConflictAction})):a.saveWithWebDAV?await zo(e.taskId,Bo(r.filename),o,a.webDAVURL,a.webDAVUser,a.webDAVPassword,{filenameConflictAction:a.filenameConflictAction}):a.saveWithMCP?await Ko(e.taskId,Bo(r.filename),o,a.mcpServerUrl,a.mcpAuthToken,{filenameConflictAction:a.filenameConflictAction}):a.saveToGitHub?await(await jo(e.taskId,Bo(r.filename),o,a.githubToken,a.githubUser,a.githubRepository,a.githubBranch,{filenameConflictAction:a.filenameConflictAction})).pushPromise:a.saveWithCompanion&&!a.compressContent?await ia({filename:r.filename,content:r.content,title:r.title,url:a.url,filenameConflictAction:a.filenameConflictAction}):a.saveToRestFormApi?await Qo(e.taskId,r.filename,o,a.url,a.saveToRestFormApiToken,a.saveToRestFormApiUrl,a.saveToRestFormApiFileFieldName,a.saveToRestFormApiUrlFieldName):a.saveToS3?(o instanceof Blob||(o=new Blob([o],{type:i})),await qo(e.taskId,r.filename,o,a.S3Domain,a.S3Region,a.S3Bucket,a.S3AccessKey,a.S3SecretKey,{filenameConflictAction:a.filenameConflictAction})):(o instanceof Blob||(o=new Blob([o],{type:i})),r.url=URL.createObjectURL(o),await Xo(r,a)),a.openSavedPage){const e={active:!0,url:"/src/ui/pages/viewer.html?compressed=true&blobURI="+URL.createObjectURL(o),windowId:t.windowId},a=t.index;try{await browser.tabs.get(n),e.index=a+1}catch(t){e.index=a}browser.tabs.create(e)}r.hash&&await ha(r.hash,a.woleetKey)}}}finally{e.taskId?Yn(e.taskId):a.autoClose&&(browser.tabs.remove(ei[n]||n),delete ei[n]),r&&r.url&&URL.revokeObjectURL(r.url),ln(n,!0)}}}async function ai(e,t={}){const n=await Me(e,t);return{status:n.status,headers:{get:e=>n.headers[e]},arrayBuffer:()=>n.arrayBuffer}}async function ri(e,t){return e.method.endsWith(".init")&&(await async function(e,t){await d(e.id);const n=await m(e.id);n[e.id].savedPageDetected=t.savedPageDetected,await h(n)}(t.tab,e),Jt(t.tab),function(e){ta(e.id,!1)}(t.tab),async function(e){const[t,n]=await Promise.all([fe(e.url,!0),Ee(e)]);t&&(t.autoSaveLoad||t.autoSaveLoadOrUnload)&&n&&Gn([e],{autoSave:!0})}(t.tab)),e.method.endsWith(".getOptions")?fe(e.url):(e.method.endsWith(".activate")&&await browser.tabs.update(e.tabId,{active:!0}),e.method.endsWith(".getScreenshot")?oi(t.tab.id,e):void 0)}async function oi(e,t){const{width:n,height:a,scale:r=1}=t,o=Math.floor(n*r),i=Math.floor(a*r);let s,c,l,u=0,d=0;browser.tabs.captureTab?c=4096:(c=t.innerHeight,l=(await browser.tabs.query({active:!0,currentWindow:!0}))[0].id);const f=Math.floor(c*r);await browser.tabs.sendMessage(e,{method:"content.beginScrollTo"});try{s=new OffscreenCanvas(o,i);const t=s.getContext("2d");for(;u{s.onload=e,s.onerror=e=>t(new Error(e.detail)),s.src=r});const l=Math.min(i-d,f);t.drawImage(s,0,d,o,l),u+=c,d+=f}browser.tabs.captureTab||await browser.tabs.update(l,{active:!0})}catch(n){if(r>.1)return t.scale=.75*r,oi(e,t);throw n}finally{await browser.tabs.sendMessage(e,{method:"content.endScrollTo"})}if(s)return URL.createObjectURL(await s.convertToBlob({type:"image/png"}))}browser.tabs.onCreated.addListener(e=>function(e){!function(e){Jt(e)}(e)}(e)),browser.tabs.onActivated.addListener(e=>async function(e){const t=await browser.tabs.get(e.tabId);dn(t)}(e)),browser.tabs.onRemoved.addListener(e=>function(e){ta(e),d(e),function(e){Ue.delete(e)}(e),async function(e){const t=Yo[e];t?t.autoSaveRemove&&(delete Yo[e],await ni(t,t.tab)):Yo[e]={removed:!0}}(e)}(e)),browser.tabs.onUpdated.addListener((e,t)=>async function(e,t){if("complete"==t.status){setTimeout(async()=>{try{await browser.tabs.sendMessage(e,{method:"content.maybeInit"})}catch(e){}},1500),function(e){delete Yo[e]}(e);const t=await browser.tabs.get(e);if(_e(t)){const e=await m(t.id);e[t.id].editorDetected=!0,await h(e),dn(t)}}t.discarded&&async function(e){const t=Yo[e];t?(delete Yo[e],await ni(t,t.tab)):Yo[e]={discarded:!0}}(e)}(e,t)),browser.tabs.onReplaced.addListener((e,t)=>function(e,t){(async function(e,t){let n=await m();await u(n,e,t),h(n),await u(c,e,t)})(e,t),async function(e,t){Yo[t]&&!Yo[e]&&(Yo[e]=Yo[t],delete Yo[t],ei[t]=e)}(e,t),function(e,t){Mn.forEach(n=>{n.tab.id==t&&(n.tab.id=e)})}(e,t)}(e,t));const ii="/src/ui/pages/options.html",si=3e5,ci=new Map;let li=0;async function ui(e,t={}){const n=e&&e.id;if(!n)throw new Error("Cannot identify the extension requesting SingleFile capture");const a=await oe();if(a.allowedExtensionIds.includes(n))return!0;if(a.deniedExtensionIds.includes(n))return!1;const{request:r,created:o}=function(e,t,n={}){const a=Array.from(ci.values()).find(t=>t.extensionId==e);if(a)return{request:a,created:!1};const r=String(++li);let o;const i=new Promise(e=>o=e),s={id:r,extensionId:e,displayName:mi(n.displayName),url:t.url,origin:t.origin,resolvePermission:o,promise:i};return s.timeoutId=setTimeout(()=>fi(s,!1),si),ci.set(r,s),{request:s,created:!0}}(n,e,t);return o&&await async function(e){const t=new URLSearchParams({externalCaptureRequestId:e.id}),n=browser.runtime.getURL(`${ii}?${t.toString()}`),a=await browser.tabs.create({active:!0,url:n});e.tabId=a.id}(r),r.promise}async function di(e,t){if(!function(e){return Boolean(e)&&e.id==browser.runtime.id&&Boolean(e.url)&&e.url.startsWith(browser.runtime.getURL(ii))}(t))throw new Error("Unauthorized sender");return e.method.endsWith(".getPermissions")?oe():e.method.endsWith(".setPermissions")?(await ie(e.permissions),{}):e.method.endsWith(".getPendingRequest")?function(e){const t=ci.get(e);if(t)return{id:t.id,extensionId:t.extensionId,displayName:t.displayName,url:t.url,origin:t.origin}}(e.requestId):e.method.endsWith(".respondPendingRequest")?async function(e,t){const n=ci.get(e);if(!n)return{found:!1};const a=await oe(),r=a.allowedExtensions.filter(e=>e.id!=n.extensionId),o=a.deniedExtensions.filter(e=>e.id!=n.extensionId),i={id:n.extensionId,name:n.displayName};t?r.push(i):o.push(i);return await ie({allowedExtensions:r,deniedExtensions:o}),fi(n,t),{found:!0,approved:Boolean(t)}}(e.requestId,e.approved):void 0}function fi(e,t){ci.has(e.id)&&(ci.delete(e.id),clearTimeout(e.timeoutId),e.resolvePermission(Boolean(t)))}function mi(e){return"string"!=typeof e?"":e.trim().replace(/\s+/g," ").slice(0,80)}browser.tabs.onRemoved&&browser.tabs.onRemoved.addListener(e=>{Array.from(ci.values()).filter(t=>t.tabId==e).forEach(e=>fi(e,!1))}),browser.runtime.onMessage.addListener((e,t)=>{if("singlefile.frameTree.initResponse"==e.method||"singlefile.frameTree.ackInitRequest"==e.method)return browser.tabs.sendMessage(t.tab.id,e,{frameId:0}),Promise.resolve({})});const hi=new Map;function wi(e,t){e.delete(t)}browser.runtime.onMessage.addListener((e,t)=>{if("singlefile.lazyTimeout.setTimeout"==e.method){let n,a=hi.get(t.tab.id);if(a)if(n=a.get(t.frameId),n){const t=n.get(e.type);t&&clearTimeout(t)}else n=new Map;const r=setTimeout(async()=>{try{const n=hi.get(t.tab.id),a=n.get(t.frameId);n&&a&&wi(a,e.type),await browser.tabs.sendMessage(t.tab.id,{method:"singlefile.lazyTimeout.onTimeout",type:e.type})}catch(e){}},e.delay);return a||(a=new Map,n=new Map,a.set(t.frameId,n),hi.set(t.tab.id,a)),n.set(e.type,r),Promise.resolve({})}if("singlefile.lazyTimeout.clearTimeout"==e.method){let n=hi.get(t.tab.id);if(n){const a=n.get(t.frameId);if(a){const t=a.get(e.type);t&&clearTimeout(t),wi(a,e.type)}}return Promise.resolve({})}}),browser.tabs.onRemoved.addListener(e=>hi.delete(e));const pi=["removeHiddenElements","removedElementsSelector","removeUnusedStyles","removeUnusedFonts","removeFrames","removeNoScriptTags","removeSavedDate","removeAlternativeFonts","removeAlternativeMedias","removeAlternativeImages","compressHTML","groupDuplicateImages","maxSizeDuplicateImages","groupDuplicateStylesheets","moveStylesInHead","imageReductionFactor","imageQuality","loadDeferredContent","loadDeferredContentBlockCookies","loadDeferredContentBlockStorage","loadDeferredContentKeepZoomLevel","loadDeferredContentDispatchScrollEvent","loadDeferredContentBeforeFrames","loadDeferredContentMinZoomFactor","loadDeferredImages","loadDeferredImagesBlockCookies","loadDeferredImagesBlockStorage","loadDeferredImagesKeepZoomLevel","loadDeferredImagesDispatchScrollEvent","loadDeferredImagesBeforeFrames","blockImages","blockAlternativeImages","blockStylesheets","blockFonts","blockScripts","blockVideos","blockAudios","blockMixedContent","maxResourceSizeEnabled","maxResourceSize","saveRawPage","saveFavicon","saveOriginalURLs","resolveLinks","resolveFragmentIdentifierURLs","includeBOM","insertMetaNoIndex","insertMetaCSP","insertSingleFileComment","includeInfobar","infobarTemplate","openInfobar","animateInfobar","displayStats","filenameTemplate","selected","optionallySelected"];async function bi(e){return(await browser.tabs.query(e)).sort((e,t)=>e.index-t.index)}browser.runtime.onMessage.addListener((e,t)=>e.method.startsWith("tabs.")?ri(e,t):e.method.startsWith("downloads.")?Lo(e,t):e.method.startsWith("autosave.")?async function(e,t){if(e.method.endsWith(".save"))return e.autoSaveDiscard||e.autoSaveRemove?(t.tab?(e.tab=t.tab,Yo[t.tab.id]=e):Yo[e.tabId]&&(Yo[e.tabId].removed&&e.autoSaveRemove||Yo[e.tabId].discarded&&e.autoSaveDiscard)&&(delete Yo[e.tabId],await ni(e,{id:e.tabId,index:e.tabIndex,url:t.url})),e.autoSaveUnload&&(delete Yo[e.tabId],await ni(e,t.tab))):(delete Yo[e.tabId],await ni(e,t.tab)),{}}(e,t):e.method.startsWith("ui.")?an(e,t):e.method.startsWith("config.")?ue(e):e.method.startsWith("tabsData.")?function(e){return e.method.endsWith(".get")?m():e.method.endsWith(".set")?h(e.tabsData):void 0}(e):e.method.startsWith("editor.")?async function(e,t){if(e.method.endsWith(".getTabData")){const e=t.tab,n=Ue.get(e.id);if(n){const t=await fe(n.url),a=JSON.stringify(n);for(let r=0;r*PePe,o.truncated?(o.finished=(r+1)*Pe>a.length,o.content=a.substring(r*Pe,(r+1)*Pe),o.finished&&(o.options=t)):(o.content=a,t.embeddedImage=n.embeddedImage,o.options=t),await browser.tabs.sendMessage(e.id,o)}}return{}}if(e.method.endsWith(".open")){let n;const a=t.tab;if(e.truncated?(n=De.get(a.id),n||(n=[],De.set(a.id,n)),n.push(e.content),e.finished&&De.delete(a.id)):e.content&&(n=[e.content]),!e.truncated||e.finished){const t={url:Re};await browser.tabs.update(a.id,t);const r=e.compressContent?n.flat():n.join("");Ue.set(a.id,{url:a.url,content:r,filename:e.filename,compressContent:e.compressContent,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,extractDataFromPageTags:e.extractDataFromPageTags,insertTextBody:e.insertTextBody,insertMetaCSP:e.insertMetaCSP,embeddedImage:e.embeddedImage})}return{}}}(e,t):e.method.startsWith("bookmarks.")?ca(e):e.method.startsWith("companion.")?async function(e){if(e.method.endsWith(".state"))return{enabled:!0}}(e):e.method.startsWith("requests.")?qe(e):e.method.startsWith("externalCapture.")?di(e,t):e.method.startsWith("bootstrap.")?async function(e,t){if(e.method.endsWith(".init")){const[e,n,a]=await Promise.all([fe(t.tab.url,!0),fe(t.tab.url),Ee(t.tab)]);return{optionsAutoSave:e,options:n,autoSaveEnabled:a,tabId:t.tab.id,tabIndex:t.tab.index}}}(e,t):"ping"==e.method?Promise.resolve({}):void 0),browser.runtime.onMessageExternal&&browser.runtime.onMessageExternal.addListener(async function(e,t){if("save-page"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,await Gn(e)}else if("edit-and-save-page"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,await Gn(e,{openEditor:!0})}else if("save-selected-links"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});await Hn(e[0])}else if("save-selected-content"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});await Gn(e,{selected:!0})}else if("save-selected-tabs"==e){const e=await bi({currentWindow:!0,highlighted:!0});await Gn(e)}else if("save-unpinned-tabs"==e){const e=await bi({currentWindow:!0,pinned:!1});await Gn(e)}else if("save-all-tabs"==e){const e=await bi({currentWindow:!0});await Gn(e)}else{if(e&&"capture-page"==e.method){const n=function(e){const{config:t}=e;if(null==t)return{};if("object"!=typeof t||Array.isArray(t))throw new Error("SingleFile capture config must be an object");const n={};return pi.forEach(e=>{void 0!==t[e]&&(n[e]=t[e])}),n}(e),a=e.tabId?await browser.tabs.get(e.tabId):(await browser.tabs.query({currentWindow:!0,active:!0}))[0];if(!await ui(t,e))throw new Error("SingleFile capture was not approved for this extension");return!!a&&async function(e,t={}){const n=e.id,a=await fe(e.url);if(a.profileName==x)throw new Error("SingleFile is disabled for this URL");let r;Object.assign(a,t,{silent:!0,logsEnabled:!1,progressBarEnabled:!1,confirmFilename:!1,confirmInfobarContent:!1,openEditor:!1,autoOpenEditor:!1,openSavedPage:!1,backgroundSave:!1,saveToClipboard:!1,saveToGDrive:!1,saveToDropbox:!1,saveWithWebDAV:!1,saveWithMCP:!1,saveToGitHub:!1,saveWithCompanion:!1,saveToRestFormApi:!1,saveToS3:!1,sharePage:!1,tabId:n,tabIndex:e.index,extensionScriptFiles:Nn}),await Zn();try{r=await Un(n,a)}catch(e){}if(r||_e(e))return new Promise((t,n)=>{Jn({status:Wn,tab:{id:e.id,index:e.index,url:e.url,title:e.title},options:a,method:"content.capture",resolve:t,reject:n}).cancel=()=>n(new Error("SingleFile capture was cancelled")),Xn()});throw new Error("Cannot access the tab contents")}(a,n)}if(e&&e.method){const t=(await browser.tabs.query({currentWindow:!0,active:!0}))[0];return!!t&&ti(e,t)}}})}(); +!function(){"use strict";const e=["[","]","^","-","\\"],t=new Map([["~","~"],["+","+"],["?","?"],["%","%"],["*","*"],[":",":"],["|","|"],['"',"""],["<","<"],[">",">"],["\\","\"]]),n=Array.from(t.keys()).map(function(t){return 1==t.length&&e.includes(t)?"\\"+t:t}),a=n.concat(["\0-",""]),r=Array.from(t.values()),o=new RegExp("["+n.join("")+"]","g");async function i(e,n,a){let r;const s=new Promise((e,t)=>{browser.downloads.onChanged.addListener(function n(a){a.id==r&&a.state&&("complete"==a.state.current&&(browser.downloads.search({id:r}).then(t=>e({filename:t[0]&&t[0].filename})).catch(()=>e({})),browser.downloads.onChanged.removeListener(n)),"interrupted"==a.state.current&&(a.error&&"USER_CANCELED"==a.error.current?e({cancelled:!0}):t(new Error(a.state.current)),browser.downloads.onChanged.removeListener(n)))})});try{r=await browser.downloads.download(e)}catch(r){if(r.message){const s=r.message.toLowerCase(),c=s.includes("illegal characters")||s.includes("invalid filename"),l=function(e,t){return e.replace(/[\u00A0\u1680\u2000-\u200A\u202F\u205F\uFEFF]/g," ").replace(/\p{Cf}/gu,t).replace(/[\u0000-\u001F\u007F-\u009F\u2028\u2029]/g,"").split("/").map(e=>e.replace(/^[\s.\u180E]+|[\s.\u180E]+$/g,"")).join("/")}(e.filename,n);if(c&&e.filename.startsWith("."))return e.filename=n+e.filename,i(e,n,a);if(c&&e.filename.includes(","))return e.filename=e.filename.replace(/,/g,n),i(e,n,a);if(c&&l!=e.filename)return e.filename=l,i(e,n,a);if(c&&e.filename.match(o))return e.filename=e.filename.replace(o,e=>t.get(e)),i(e,n,a);if(c&&!e.filename.match(/^[\x00-\x7F]+$/))return e.filename=e.filename.replace(/[^\x00-\x7F]+/g,n),i(e,n,a);if((s.includes("'incognito'")||s.includes('"incognito"'))&&e.incognito)return delete e.incognito,i(e,n,a);if("conflictaction prompt not yet implemented"==s&&e.conflictAction){if(delete e.conflictAction,a&&!e.saveAs){const t=await a(e.filename);if(!t)return{cancelled:!0};e.filename=t}return i(e,n,a)}if(s.includes("canceled"))return{cancelled:!0};throw r}throw r}return s}let s,c,l;async function u(e,t,n){e[n]&&!e[t]&&(e[t]=e[n],delete e[n])}async function d(e){c&&delete c[e];const t=await m();if(t[e]){const n=t[e].autoSave;t[e]={autoSave:n},await h(t)}}function f(e){return c||(c={}),void 0===e||c[e]||(c[e]={}),c}async function m(e){if(!s){const e=await browser.storage.local.get();s=e.tabsData||{}}return async function(){if(!l){l=!0;const e=await browser.tabs.query({currentWindow:!0,highlighted:!0});Object.keys(s).filter(t=>{if("autoSaveAll"!=t&&"autoSaveUnpinned"!=t&&"profileName"!=t)return!e.find(e=>e.id==t)}).forEach(e=>delete s[e]),await browser.storage.local.set({tabsData:s})}}(),void 0===e||s[e]||(s[e]={}),s}async function h(e){s=e,await browser.storage.local.set({tabsData:e})}setTimeout(()=>m().then(e=>s=e),0);const w=["page","button","tab"],p=["page","selection","frame","link"],b={"save-page":{labelKey:"menuSavePage",bindable:!0},"edit-and-save-page":{labelKey:"menuEditAndSavePage",altLabelKey:"menuEditPage",bindable:!0},"save-selection":{labelKey:"menuSaveSelection",bindable:!0},"save-selected-links":{labelKey:"menuSaveSelectedLinks",contexts:["selection"]},"save-frame":{labelKey:"menuSaveFrame",contexts:["frame"],surfaces:["page"]},"save-with-profile":{labelKey:"menuSaveWithProfile",dynamic:"profiles"},"save-tabs":{labelKey:"menuSaveTabs",container:!0,preset:["save-selected-tabs","save-unpinned-tabs","save-all-tabs"]},"save-selected-tabs":{labelKey:"menuSaveSelectedTabs",bindable:!0},"save-unpinned-tabs":{labelKey:"menuSaveUnpinnedTabs",bindable:!0},"save-all-tabs":{labelKey:"menuSaveAllTabs",bindable:!0},"select-profile":{labelKey:"menuSelectProfile",dynamic:"radio-profiles"},"domain-rule":{labelKey:"menuCreateDomainRule",altLabelKey:"menuUpdateRule",dynamic:"radio-rule"},"auto-save":{labelKey:"menuAutoSave",dynamic:"radio-autosave"},"batch-save-urls":{labelKey:"menuBatchSaveUrls"},"view-pendings":{labelKey:"menuViewPendingSaves"},submenu:{labelKey:"menuSubmenu",container:!0},separator:{labelKey:"menuSeparator",separator:!0}};function g(e,t={}){const n=b[e],a=Object.assign({action:e},t);return n.container&&(a.children=t.children||(n.preset||[]).map(e=>g(e))),a}function y(e){if(!e||"object"!=typeof e)return null;const t={};return w.forEach(n=>t[n]=v(e[n])),t}function v(e){return(Array.isArray(e)?e:[]).filter(e=>e&&"object"==typeof e&&b[e.action]).map(e=>{const t=b[e.action],n={};return"string"==typeof e.label&&e.label.trim()&&(n.label=e.label.trim()),t.bindable&&"string"==typeof e.profile&&e.profile&&(n.profile=e.profile),"profiles"==t.dynamic&&e.inline&&(n.inline=!0),!Array.isArray(e.contexts)||t.dynamic||t.separator||(n.contexts=p.filter(t=>e.contexts.includes(t))),t.container&&Array.isArray(e.children)&&(n.children=v(e.children)),g(e.action,n)})}const A="-",k="__Default_Settings__",x="__Disabled_Settings__",T="regexp:",S="profile_",C="externalCaptureAllowedExtensionIds",I="externalCaptureDeniedExtensionIds",E="menuLayout",P=!/Safari/.test(navigator.userAgent)||/Chrome/.test(navigator.userAgent)||/Vivaldi/.test(navigator.userAgent)||/OPR/.test(navigator.userAgent),R=/Mobile.*Firefox/.test(navigator.userAgent),U=!(R||/Safari/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/Vivaldi/.test(navigator.userAgent)&&!/OPR/.test(navigator.userAgent)),D=!R,F=P,L=P,_=P,O=P,W=P,B=P,N=P,M=P,j=P,q=P,z=P,K=navigator.canShare&&navigator.canShare({files:[new File([new Blob([""],{type:"text/html"})],"test.html")]}),H=Boolean(browser.menus&&browser.menus.onClicked&&browser.menus.create&&browser.menus.update&&browser.menus.removeAll),V=["~","+","\\\\","?","%","*",":","|",'"',"<",">","\0-",""],$={loadDeferredImages:"loadDeferredContent",loadDeferredImagesMaxIdleTime:"loadDeferredContentMaxIdleTime",loadDeferredImagesBlockCookies:"loadDeferredContentBlockCookies",loadDeferredImagesBlockStorage:"loadDeferredContentBlockStorage",loadDeferredImagesKeepZoomLevel:"loadDeferredContentKeepZoomLevel",loadDeferredImagesBeforeFrames:"loadDeferredContentBeforeFrames",loadDeferredImagesDispatchScrollEvent:null},G={removeHiddenElements:!0,removedElementsSelector:"",removeUnusedStyles:!0,removeUnusedFonts:!0,removeFrames:!1,compressHTML:!0,loadDeferredContent:!0,loadDeferredContentMaxIdleTime:1500,loadDeferredContentBlockCookies:!1,loadDeferredContentBlockStorage:!1,loadDeferredContentKeepZoomLevel:!1,loadDeferredContentDispatchScrollEvent:!0,loadDeferredContentBeforeFrames:!1,loadDeferredContentMinZoomFactor:0,filenameTemplate:"%if-empty<{page-title}|No title> ({date-locale} {time-locale}).{filename-extension}",infobarTemplate:"",includeInfobar:!P,openInfobar:!1,animateInfobar:!0,confirmInfobarContent:!1,autoClose:!1,confirmFilename:!1,filenameConflictAction:"uniquify",filenameMaxLength:192,filenameMaxLengthUnit:"bytes",filenameReplacedCharacters:a,filenameReplacementCharacter:"_",filenameReplacementCharacters:r,replaceEmojisInFilename:!1,saveFilenameTemplateData:!1,contextMenuEnabled:!0,tabMenuEnabled:!0,browserActionMenuEnabled:!0,shadowEnabled:!0,logsEnabled:!0,progressBarEnabled:!0,maxResourceSizeEnabled:!1,maxResourceSize:10,displayInfobar:!0,displayStats:!1,backgroundSave:U,defaultEditorMode:"normal",applySystemTheme:!0,contentWidth:70,autoSaveDelay:1,autoSaveLoad:!1,autoSaveUnload:!1,autoSaveLoadOrUnload:!0,autoSaveDiscard:!1,autoSaveRemove:!1,autoSaveRepeat:!1,autoSaveRepeatDelay:10,removeAlternativeFonts:!0,removeAlternativeMedias:!0,removeAlternativeImages:!0,groupDuplicateImages:!0,maxSizeDuplicateImages:524288,saveRawPage:!1,saveToClipboard:!1,addProof:!1,saveToGDrive:!1,saveToDropbox:!1,saveWithWebDAV:!1,webDAVURL:"",webDAVUser:"",webDAVPassword:"",saveWithMCP:!1,mcpServerUrl:"",mcpAuthToken:"",saveToGitHub:!1,saveToRestFormApi:!1,saveToS3:!1,githubToken:"",githubUser:"",githubRepository:"SingleFile-Archives",githubBranch:"main",saveWithCompanion:!1,sharePage:!1,forceWebAuthFlow:!1,resolveFragmentIdentifierURLs:!1,userScriptEnabled:!1,openEditor:!1,openSavedPage:!1,autoOpenEditor:!1,saveCreatedBookmarks:!1,allowedBookmarkFolders:[],ignoredBookmarkFolders:[],replaceBookmarkURL:!0,saveFavicon:!0,includeBOM:!1,warnUnsavedPage:!0,displayInfobarInEditor:!1,compressContent:!1,createRootDirectory:!1,selfExtractingArchive:!1,disableCompression:!1,extractDataFromPage:!1,preventAppendedData:!1,maxAppendedDataLength:16361,insertEmbeddedImage:!1,insertEmbeddedScreenshotImage:!1,insertTextBody:!1,autoSaveExternalSave:!1,insertMetaNoIndex:!1,insertMetaCSP:!0,insertCanonicalLink:!0,readMaffMetadata:!1,passReferrerOnError:!1,password:"",insertSingleFileComment:!0,removeSavedDate:!1,blockMixedContent:!1,saveOriginalURLs:!1,acceptHeaders:{font:"application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8",image:"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",stylesheet:"text/css,*/*;q=0.1",script:"*/*",document:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",video:"video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5",audio:"audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5"},moveStylesInHead:!1,networkTimeout:0,woleetKey:"",blockImages:!1,blockAlternativeImages:!0,blockStylesheets:!1,blockFonts:!1,blockScripts:!0,blockVideos:!0,blockAudios:!0,delayBeforeProcessing:0,delayAfterProcessing:0,_migratedTemplateFormat:!0,_migratedDeferredContentOptions:!0,saveToRestFormApiUrl:"",saveToRestFormApiFileFieldName:"",saveToRestFormApiUrlFieldName:"",saveToRestFormApiToken:"",S3Domain:"s3.amazonaws.com",S3Region:"",S3Bucket:"",S3AccessKey:"",S3SecretKey:"",resolveLinks:!0,groupDuplicateStylesheets:!1,infobarPositionAbsolute:!1,infobarPositionTop:"16px",infobarPositionRight:"16px",infobarPositionBottom:"",infobarPositionLeft:"",removeNoScriptTags:!0,customShortcut:null,imageReductionFactor:1,imageQuality:.8},J=[{url:"file:",profile:"__Default_Settings__",autoSaveProfile:"__Disabled_Settings__"}],Z={"page-title":"No title","page-heading":"No heading","page-language":"No language","page-description":"No description","page-author":"No author","page-creator":"No creator","page-publisher":"No publisher","url-hash":"No hash","url-host":"No host","url-hostname":"No hostname","url-href":"No href","url-href-digest-sha-1":"No hash","url-href-flat":"No href","url-referrer":"No referrer","url-referrer-flat":"No referrer","url-password":"No password","url-pathname":"No pathname","url-pathname-flat":"No pathname","url-port":"No port","url-protocol":"No protocol","url-search":"No search","url-username":"No username","tab-id":"No tab id","tab-index":"No tab index","url-last-segment":"No last segment"};let X,Q=Y();async function Y(){const{sync:e}=await browser.storage.local.get();X=e?browser.storage.sync:browser.storage.local;const t=await X.get();if(t[S+k])t.profiles&&await X.remove(["profiles"]);else if(t.profiles){const e=Object.keys(t.profiles);for(const n of e)await ge(n,t.profiles[n])}else await ge(k,G);t.rules||await X.set({rules:J}),t.maxParallelWorkers||await X.set({maxParallelWorkers:navigator.hardwareConcurrency||4}),t.processInForeground||await X.set({processInForeground:!1}),Array.isArray(t[C])||await X.set({[C]:[]}),Array.isArray(t[I])||await X.set({[I]:[]});(await we()).map(async e=>{const t=await be(e);t._migratedTemplateFormat||(t.filenameTemplate=function(e){try{return Object.keys(Z).forEach(t=>{const n=Z[t];e=e.replaceAll(`{${t}}`,`%if-empty<{${t}}|${n}>`)}),e}catch(e){}}(t.filenameTemplate),t._migratedTemplateFormat=!0),t._migratedDeferredContentOptions||(Object.keys($).forEach(e=>{const n=$[e];void 0!==t[e]&&(n&&void 0===t[n]&&(t[n]=t[e]),delete t[e])}),t._migratedDeferredContentOptions=!0);for(const e of Object.keys(G))void 0===t[e]&&(t[e]=G[e]);Ie(t.filenameReplacedCharacters,V)&&Ie(t.filenameReplacementCharacters,r)&&(t.filenameReplacedCharacters=a),await ge(e,t)})}async function ee(e,t){const{rules:n}=await X.get(["rules"]),a=n.filter(e=>le(e));let r=a.sort(ce).find(t=>e&&e.match(new RegExp(t.url.split(T)[1])));if(!r){const a=n.filter(e=>!le(e));r=a.sort(ce).find(n=>!t&&"*"==n.url||e&&e.includes(n.url))}return r}async function te(){await Q;const{maxParallelWorkers:e,processInForeground:t}=await X.get(["maxParallelWorkers","processInForeground"]),n=await he(),a=await de(),r=await ne(),o={profiles:a,rules:n,maxParallelWorkers:e,processInForeground:t};return r&&(o.menuLayout=r),o}async function ne(){await Q;return y((await X.get([E]))[E])}async function ae(e){await Q;const t=y(e);t?await X.set({[E]:t}):await X.remove([E])}async function re(e,t){const n=await ne();if(n){const a=n=>n.forEach(n=>{n.profile==e&&(t?n.profile=t:delete n.profile),n.children&&a(n.children)});Object.keys(n).forEach(e=>a(n[e])),await ae(n)}}async function oe(){await Q;const{externalCaptureAllowedExtensionIds:e=[],externalCaptureDeniedExtensionIds:t=[]}=await X.get([C,I]),n=se(e),a=se(t);return{allowedExtensions:n,allowedExtensionIds:n.map(e=>e.id),deniedExtensions:a,deniedExtensionIds:a.map(e=>e.id)}}async function ie({allowedExtensions:e,deniedExtensions:t}={}){await Q;const n={};void 0!==e&&(n[C]=se(e)),void 0!==t&&(n[I]=se(t)),await X.set(n)}function se(e){const t=new Set;return(e||[]).map(e=>"string"==typeof e?{id:e.trim(),name:""}:{id:String(e.id||"").trim(),name:String(e.name||"").trim().replace(/\s+/g," ").slice(0,80)}).filter(e=>!(!e.id||t.has(e.id))&&(t.add(e.id),!0))}function ce(e,t){return t.url.length-e.url.length}function le(e){return e.url.toLowerCase().startsWith(T)}async function ue(e){if(e.method.endsWith(".get"))return await te();if(e.method.endsWith(".set")){const{config:t}=e,n=t.profiles,a=t.rules,r=t.maxParallelWorkers,o=t.processInForeground,i=await pe();await X.remove([...i,"rules","maxParallelWorkers","processInForeground",E]),await X.set({rules:a,maxParallelWorkers:r,processInForeground:o}),await ae(t.menuLayout),Object.keys(n).forEach(e=>ge(e,n[e]))}if(e.method.endsWith(".getMenuLayout"))return{menuLayout:await ne()};if(e.method.endsWith(".setMenuLayout")&&await ae(e.menuLayout),e.method.endsWith(".deleteRules")&&await async function(e){const t=await he();await X.set({rules:e?t.filter(t=>t.autoSaveProfile!=e&&t.profile!=e):[]})}(e.profileName),e.method.endsWith(".deleteRule")&&await async function(e){if(!e)throw new Error("URL is empty");const t=await he();await X.set({rules:t.filter(t=>t.url!=e)})}(e.url),e.method.endsWith(".addRule")&&await ye(e.url,e.profileName,e.autoSaveProfileName),e.method.endsWith(".createProfile")&&await async function(e,t){if((await we()).includes(e))throw new Error("Duplicate profile name");const n=await be(t),a=JSON.parse(JSON.stringify(n));a.customShortcut=null,await ge(e,a)}(e.profileName,e.fromProfileName||k),e.method.endsWith(".renameProfile")&&await async function(e,t){const n=await we(),a=await m(),r=await he();if(!n.includes(e))throw new Error("Profile not found");if(n.includes(t))throw new Error("Duplicate profile name");if(e==k)throw new Error("Default settings cannot be renamed");a.profileName==e&&(a.profileName=t,await h(a));r.forEach(n=>{n.profile==e&&(n.profile=t),n.autoSaveProfile==e&&(n.autoSaveProfile=t)});const o=await be(e);await X.remove([S+e]),await X.set({[S+t]:o,rules:r}),await re(e,t)}(e.profileName,e.newProfileName),e.method.endsWith(".deleteProfile")&&await async function(e){const t=await we(),n=await m(),a=await he();if(!t.includes(e))throw new Error("Profile not found");if(e==k)throw new Error("Default settings cannot be deleted");n.profileName==e&&(delete n.profileName,await h(n));a.forEach(t=>{t.profile==e&&(t.profile=k),t.autoSaveProfile==e&&(t.autoSaveProfile=k)}),X.remove([S+e]),await X.set({rules:a}),await re(e)}(e.profileName),e.method.endsWith(".resetProfiles")&&await async function(){await Q;const e=await m();delete e.profileName,await h(e);let t=await pe();await X.remove([...t,"rules","maxParallelWorkers","processInForeground",C,I,E]),await Y()}(),e.method.endsWith(".resetProfile")&&await async function(e){if(!(await we()).includes(e))throw new Error("Profile not found");await ge(e,G)}(e.profileName),e.method.endsWith(".importConfig")&&await async function(e){const t=await we(),n=await pe(),a=await m();t.includes(a.profileName)&&(delete a.profileName,await h(a));await X.remove([...n,"rules","maxParallelWorkers","processInForeground",E]);const r={rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground},o=y(e.menuLayout);o&&(r[E]=o);Object.keys(e.profiles).forEach(t=>r[S+t]=e.profiles[t]),await X.set(r),await Y()}(e.config),e.method.endsWith(".updateProfile")&&await async function(e,t){if(!(await we()).includes(e))throw new Error("Profile not found");const n=await be(e);Object.keys(n).forEach(e=>{t[e]=void 0===t[e]?n[e]:t[e]}),await ge(e,t)}(e.profileName,e.profile),e.method.endsWith(".updateRule")&&await ve(e.url,e.newUrl,e.profileName,e.autoSaveProfileName),e.method.endsWith(".getConstants"))return{DISABLED_PROFILE_NAME:x,DEFAULT_PROFILE_NAME:k,CURRENT_PROFILE_NAME:A,BACKGROUND_SAVE_SUPPORTED:U,AUTOCLOSE_SUPPORTED:D,BADGE_COLOR_SUPPORTED:F,AUTO_SAVE_SUPPORTED:L,SELECTABLE_TABS_SUPPORTED:_,AUTO_OPEN_EDITOR_SUPPORTED:O,INFOBAR_SUPPORTED:W,BOOKMARKS_API_SUPPORTED:B,IDENTITY_API_SUPPORTED:N,CLIPBOARD_API_SUPPORTED:M,NATIVE_API_API_SUPPORTED:j,WEB_BLOCKING_API_SUPPORTED:q,EXTERNAL_CAPTURE_SUPPORTED:z,SHARE_API_SUPPORTED:K,BROWSER_MENUS_API_SUPPORTED:H,DEFAULT_FILENAME_REPLACED_CHARACTERS:a,DEFAULT_FILENAME_REPLACEMENT_CHARACTERS:r};if(e.method.endsWith(".getRules"))return he();if(e.method.endsWith(".getProfileOptions"))return me(e.profileName);if(e.method.endsWith(".getProfiles"))return de();if(e.method.endsWith(".exportConfig"))return async function(){const e=await te(),t={profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground};e.menuLayout&&(t.menuLayout=e.menuLayout);const n=JSON.stringify(t,null,2),a=`singlefile-settings-${(new Date).toISOString().replace(/:/g,"_")}.json`;if(U){const e=URL.createObjectURL(new Blob([n],{type:"text/json"}));try{await i({url:e,filename:a,saveAs:!0},"_")}finally{URL.revokeObjectURL(e)}return{}}return{filename:a,textContent:n}}();if(e.method.endsWith(".enableSync")){await browser.storage.local.set({sync:!0});const e=await browser.storage.sync.get();if(!e||!e.rules){const e=await pe(),t=await browser.storage.local.get(["rules","maxParallelWorkers","processInForeground",C,I,E,...e]);await browser.storage.sync.set(t)}return X=browser.storage.sync,await Y(),{}}if(e.method.endsWith(".disableSync")){await browser.storage.local.set({sync:!1});const e=await browser.storage.sync.get(),t=await browser.storage.local.get();if(e&&e.rules&&(!t||!t.rules)){await browser.storage.local.set({rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground,externalCaptureAllowedExtensionIds:e.externalCaptureAllowedExtensionIds||[],externalCaptureDeniedExtensionIds:e.externalCaptureDeniedExtensionIds||[]}),e[E]&&await browser.storage.local.set({[E]:e[E]});const t={};Object.keys(e).filter(e=>e.startsWith(S)).forEach(n=>t[n]=e[n]),await browser.storage.local.set(t)}return X=browser.storage.local,await Y(),{}}return e.method.endsWith(".isSync")?{sync:(await browser.storage.local.get()).sync}:{}}async function de(){await Q;const e=await pe(),t=await X.get(e),n={};return Object.keys(t).forEach(e=>n[e.substring(8)]=t[e]),n}async function fe(e,t){await Q;const[n,a]=await Promise.all([ee(e),m()]),r=a.profileName||k;let o;if(n){const e=n[t?"autoSaveProfile":"profile"];o=e==A?r:e}else o=r;return me(o)}async function me(e){const t=Object.assign({profileName:e},await be(e));return U||(t.backgroundSave=!1),t}async function he(){return(await X.get(["rules"])).rules}async function we(){return Object.keys(await X.get()).filter(e=>e.startsWith(S)).map(e=>e.substring(8))}async function pe(){return Object.keys(await X.get()).filter(e=>e.startsWith(S))}async function be(e){const t=S+e;return(await X.get([t]))[t]}async function ge(e,t){const n=S+e;await X.set({[n]:t})}async function ye(e,t,n){if(!e)throw new Error("URL is empty");const a=await he();if(a.find(t=>t.url==e))throw new Error("URL already exists");a.push({url:e,profile:t,autoSaveProfile:n}),await X.set({rules:a})}async function ve(e,t,n,a){if(!e||!t)throw new Error("URL is empty");const r=await he(),o=r.find(t=>t.url==e);if(!o)throw new Error("URL not found");if(r.find(n=>n.url==t&&n.url!=e))throw new Error("New URL already exists");o.url=t,o.profile=n,o.autoSaveProfile=a,await X.set({rules:r})}async function Ae(){return(await X.get()).authInfo}async function ke(){return(await X.get()).dropboxAuthInfo}async function xe(e){await X.set({authInfo:e})}async function Te(e){await X.set({dropboxAuthInfo:e})}async function Se(){const e=await Ae();e&&e.revokableAccessToken?await xe({revokableAccessToken:e.revokableAccessToken}):await X.remove(["authInfo"])}async function Ce(){const e=await ke();e&&e.revokableAccessToken?await Te({revokableAccessToken:e.revokableAccessToken}):await X.remove(["dropboxAuthInfo"])}function Ie(e,t){return e.length==t.length&&e.every((e,n)=>e==t[n])}async function Ee(e){if(e){const[t,n]=await Promise.all([m(),ee(e.url)]);return Boolean(t.autoSaveAll||t.autoSaveUnpinned&&!e.pinned||t[e.id]&&t[e.id].autoSave)&&(!n||n.autoSaveProfile!=x)}}const Pe=33554432,Re="/src/ui/pages/editor.html",Ue=new Map,De=new Map,Fe=browser.runtime.getURL(Re);async function Le({tabIndex:e,content:t,filename:n,compressContent:a,selfExtractingArchive:r,disableCompression:o,extractDataFromPage:i,insertTextBody:s,insertMetaCSP:c,embeddedImage:l,url:u}){const d={active:!0,url:Re};null!=e&&(d.index=e);const f=await browser.tabs.create(d);Ue.set(f.id,{url:u,content:t,filename:n,compressContent:a,selfExtractingArchive:r,disableCompression:o,extractDataFromPage:i,insertTextBody:s,insertMetaCSP:c,embeddedImage:l})}function _e(e){return e.url==Fe}const Oe=new Map,We="x-single-file-request-id",Be=8388608;async function Ne(e,t,n){for(let a=0;a*Be<=n.array.length;a++){const r={method:"singlefile.fetchResponse",requestId:t,headers:n.headers,status:n.status,error:n.error};r.truncated=n.array.length>Be,r.truncated?(r.finished=(a+1)*Be>n.array.length,r.array=n.array.slice(a*Be,(a+1)*Be)):r.array=n.array,await browser.tabs.sendMessage(e,r)}return{}}function Me(e,t={},n){return new Promise((a,r)=>{const o=new XMLHttpRequest;if(o.withCredentials=!0,o.responseType="arraybuffer",o.onerror=e=>r(new Error(e.detail)),o.onreadystatechange=()=>{var i;o.readyState==XMLHttpRequest.DONE&&(o.status||o.response.byteLength?!t.referrer||401!=o.status&&403!=o.status&&404!=o.status||n?a({arrayBuffer:o.response,array:Array.from(new Uint8Array(o.response)),headers:(i=o.getAllResponseHeaders(),i.trim().split(/[\r\n]+/).map(e=>{const t=e.indexOf(":");return[e.substring(0,t).trim(),e.substring(t+1).trim()]}).filter(([e])=>e)),status:o.status}):Me(e,t,!0).then(a).catch(r):r(new Error("Empty response")))},o.open("GET",e,!0),t.headers)for(const e of Object.entries(t.headers))o.setRequestHeader(e[0],e[1]);if(n){const e=String(Math.random()).substring(2);!function(e,t){Oe.set(e,t)}(e,t.referrer),o.setRequestHeader(We,e)}o.send()})}browser.runtime.onMessage.addListener((e,t)=>{if(e.method&&e.method.startsWith("singlefile.fetch"))return new Promise(n=>{(async function(e,t){if("singlefile.fetch"==e.method)try{const n=await Me(e.url,{referrer:e.referrer,headers:e.headers});return Ne(t.tab.id,e.requestId,n)}catch(n){return Ne(t.tab.id,e.requestId,{error:n.message,array:[]})}else if("singlefile.fetchFrame"==e.method)return browser.tabs.sendMessage(t.tab.id,e)})(e,t).then(n).catch(e=>n({error:e&&(e.message||e.toString())}))})});let je=!1;function qe(e){return e.method.endsWith(".enableReferrerOnError")?(Ke(),{}):e.method.endsWith(".disableReferrerOnError")?(function(){try{browser.webRequest.onBeforeSendHeaders.removeListener(ze)}catch(e){}je=!1}(),{}):void 0}function ze(e){if(je){let t=e.requestHeaders.find(e=>e.name===We);if(t){e.requestHeaders=e.requestHeaders.filter(e=>e.name!==We);const n=Oe.get(t.value);if(n){Oe.delete(t.value);if(!e.requestHeaders.find(e=>"referer"===e.name.toLowerCase()))return e.requestHeaders.push({name:"Referer",value:n}),{requestHeaders:e.requestHeaders}}}}}function Ke(){if(!je){try{browser.webRequest.onBeforeSendHeaders.addListener(ze,{urls:[""]},["blocking","requestHeaders","extraHeaders"])}catch(e){browser.webRequest.onBeforeSendHeaders.addListener(ze,{urls:[""]},["blocking","requestHeaders"])}je=!0}}async function He(e){return(await browser.tabs.query(e)).sort((e,t)=>e.index-t.index)}function Ve(e,t={}){return new Promise((n,a)=>{let r;function o(o,s){if(!r&&s&&s.url&&s.url.startsWith(e)){if(void 0===t.tabId||o!=t.tabId)return;i();const e=new URLSearchParams(new URL(s.url).search),r=e.get("code");r&&e.get("state")==t.state?(browser.tabs.remove(o),n(r)):a(new Error("invalid_auth_response"))}}function i(){r||(r=!0,browser.tabs.onUpdated.removeListener(o))}browser.tabs.onUpdated.addListener(o),t.cancel=i})}async function $e(e,t={}){const n=await browser.tabs.create({url:e.url,active:!0});return t.tabId=n.id,new Promise((e,t)=>{browser.tabs.onRemoved.addListener(function e(a){a==n.id&&(browser.tabs.onRemoved.removeListener(e),t(new Error("code_required")))})})}const Ge="/src/ui/resources/icon_128.png",Je="/src/ui/resources/icon_128_wait",Ze=browser.i18n.getMessage("buttonDefaultTooltip"),Xe=browser.i18n.getMessage("buttonBlockedTooltip"),Qe=browser.i18n.getMessage("buttonInitializingBadge"),Ye=browser.i18n.getMessage("buttonInitializingTooltip"),et=browser.i18n.getMessage("buttonErrorBadge"),tt=browser.i18n.getMessage("buttonBlockedBadge"),nt=browser.i18n.getMessage("buttonOKBadge"),at=browser.i18n.getMessage("buttonSaveProgressTooltip"),rt=browser.i18n.getMessage("buttonUploadProgressTooltip"),ot=browser.i18n.getMessage("buttonAutoSaveActiveBadge"),it=browser.i18n.getMessage("buttonAutoSaveActiveTooltip"),st=[2,147,20,192],ct=[4,229,36,192],lt={default:{setBadgeBackgroundColor:{color:st},setBadgeText:{text:""},setTitle:{title:Ze},setIcon:{path:Ge}},inject:{setBadgeBackgroundColor:{color:st},setBadgeText:{text:Qe},setTitle:{title:Ye}},execute:{setBadgeBackgroundColor:{color:ct},setBadgeText:{text:Qe}},progress:{setBadgeBackgroundColor:{color:ct},setBadgeText:{text:""}},edit:{setBadgeBackgroundColor:{color:st},setBadgeText:{text:""},setTitle:{title:Ze},setIcon:{path:Ge}},end:{setBadgeBackgroundColor:{color:ct},setBadgeText:{text:nt},setTitle:{title:Ze},setIcon:{path:Ge}},error:{setBadgeBackgroundColor:{color:[229,4,12,192]},setBadgeText:{text:et},setTitle:{title:""},setIcon:{path:Ge}},forbidden:{setBadgeBackgroundColor:{color:[255,255,255,1]},setBadgeText:{text:tt},setTitle:{title:Xe},setIcon:{path:Ge}},autosave:{inject:{setBadgeBackgroundColor:{color:[64,64,64,192]},setBadgeText:{text:ot},setTitle:{title:it},setIcon:{path:Ge}},default:{setBadgeBackgroundColor:{color:[208,208,208,192]},setBadgeText:{text:ot},setTitle:{title:it},setIcon:{path:Ge}}}};let ut;function dt(e,t){if(e.method.endsWith(".processInit")){delete f(t.tab.id)[t.tab.id].button,pt(t.tab)}var n,a,r;return e.method.endsWith(".processProgress")&&e.maxIndex&&(n=t.tab.id,a=e.index,r=e.maxIndex,wt(n,a,r,at)),e.method.endsWith(".processEnd")&&mt(t.tab.id),e.method.endsWith(".processError")&&(e.error&&console.error("Initialization error",e.error),ft(t.tab.id)),e.method.endsWith(".processCancelled")&&ht(t.tab),Promise.resolve({})}function ft(e){bt(e,yt("error"))}function mt(e,t){bt(e,t?yt("default",!0):yt("end"))}function ht(e){pt(e)}function wt(e,t,n,a){const r=Math.max(Math.min(20,Math.floor(t/n*20)),0),o=Math.min(Math.floor(t/n*8),8),i=Je+o+".png",s=yt("progress");s.setTitle={title:a+5*r+"%"},s.setIcon={path:i},bt(e,s)}async function pt(e){const t=yt("default",await Ee(e));await bt(e.id,t)}async function bt(e,t){try{const n=f(e);if(t){n[e].button||(n[e].button={lastState:null});const a=n[e].button.lastState||{},r={};Object.keys(t).forEach(e=>{void 0!==t[e]&&JSON.stringify(a[e])!=JSON.stringify(t[e])&&(r[e]=t[e])}),Object.keys(r).length&&(n[e].button.lastState=t,await async function(e,t){for(const n of Object.keys(t))await gt(e,n,t[n])}(e,r))}}catch(e){}}async function gt(e,t,n){const a="setBadgeBackgroundColor"!=t||F;if(browser.browserAction[t]&&a){const a=JSON.parse(JSON.stringify(n));a.tabId=e,await browser.browserAction[t](a)}}function yt(e,t){return JSON.parse(JSON.stringify(t?lt.autosave[e]:lt[e]))}browser.browserAction.onClicked.addListener(async e=>{const t=await He({currentWindow:!0,highlighted:!0});t.length<=1?function(e){ut.isSavingTab(e)?ut.cancelTab(e.id):ut.saveTabs([e])}(e):ut.saveTabs(t)});const vt=browser.menus,At=H,kt={page:["page","image","video","audio"],selection:["selection"],frame:["frame"],link:["link"]},xt={button:["browser_action"],tab:["tab"]},Tt=["edit-and-save-page","save-selected-links","save-selection","save-frame","auto-save","domain-rule"],St=[{mode:"disabled",labelKey:"menuAutoSaveDisabled"},{mode:"tab",labelKey:"menuAutoSaveTab"},{mode:"unpinned",labelKey:"menuAutoSaveUnpinnedTabs"},{mode:"all",labelKey:"menuAutoSaveAllTabs"}],Ct=browser.i18n.getMessage("menuCreateDomainRule"),It=browser.i18n.getMessage("menuUpdateRule"),Et=browser.i18n.getMessage("profileDefaultSettings"),Pt=new Map,Rt=new Map;let Ut,Dt,Ft,Lt,_t=new Map,Ot=!0,Wt=!0;async function Bt(e){const[t,n,a]=await Promise.all([de(),m(),ne()]);let r=await fe(e&&e.url);if(At&&r){if(r.profileName==x&&(r=await fe(),r.profileName=x),r.tabMenuEnabled)try{await vt.create({id:"temporary-id",contexts:["tab"],title:"title"})}catch(e){r.tabMenuEnabled=!1}await vt.removeAll(),_t=new Map,Pt.clear(),Rt.clear();const o=a||function(){const e=()=>[g("save-page"),g("edit-and-save-page"),g("save-selected-links"),g("save-with-profile"),g("save-selection"),g("save-tabs"),g("select-profile"),g("domain-rule"),g("auto-save"),g("separator"),g("batch-save-urls"),g("view-pendings")];return{page:[g("save-page"),g("edit-and-save-page"),g("save-selected-links"),g("save-with-profile"),g("separator"),g("save-selection"),g("save-frame"),g("save-selected-tabs"),g("save-unpinned-tabs"),g("save-all-tabs"),g("separator"),g("select-profile"),g("domain-rule"),g("separator"),g("auto-save"),g("separator"),g("batch-save-urls"),g("view-pendings")],button:e(),tab:e()}}(),i={profiles:t,profileNames:Object.keys(t),allTabsData:n,rule:e&&e.url?await ee(e.url,!0):void 0};r.contextMenuEnabled&&Nt("page",o.page,i),r.browserActionMenuEnabled&&Nt("button",o.button,i),r.tabMenuEnabled&&Nt("tab",o.tab,i)}Ut=!0,Dt&&(Dt=!1,(await browser.tabs.query({})).forEach(async e=>await Jt(e)))}function Nt(e,t,n,a){t.forEach((t,r)=>function(e,t,n,a,r){const o=b[t.action];if(!Mt(e,t,a))return;const i=zt(e,t),s={id:n,contexts:i};r&&(s.parentId=r);if(o.separator)vt.create(Object.assign(s,{type:"separator"}));else if(o.dynamic)!function(e,t,n,a){const r=b[t.action],{id:o,contexts:i,parentId:s}=n,c={action:t.action,entry:t,surface:e};if("profiles"==r.dynamic){if(a.profileNames.length>1){let r=s;t.inline||(vt.create(Object.assign(n,{title:Kt(t)})),qt(o,c),r=o),a.profileNames.forEach((n,a)=>{const s=o+"-p"+a;vt.create({id:s,contexts:i,parentId:r,title:Ht(n)}),qt(s,{action:"save-page",entry:t,surface:e,profileName:n})})}}else if("radio-profiles"==r.dynamic){if(a.profileNames.length>1){vt.create(Object.assign(n,{title:Kt(t)})),qt(o,c);const r=a.allTabsData.profileName||k;a.profileNames.forEach((n,a)=>{jt(o+"-p"+a,i,o,Ht(n),r==n,{action:"select-profile",entry:t,surface:e,profileName:n})})}}else if("radio-rule"==r.dynamic){if(a.profileNames.length>1){const r=t.label||Ct;vt.create(Object.assign(n,{title:r})),qt(o,Object.assign(c,{title:r})),Rt.set(o,r);const s=a.rule;jt(o+"-current",i,o,A,!s||s.profile==A,{action:"domain-rule",entry:t,surface:e,profileName:A}),a.profileNames.forEach((n,a)=>{jt(o+"-p"+a,i,o,Ht(n),Boolean(s)&&s.profile==n,{action:"domain-rule",entry:t,surface:e,profileName:n})})}}else"radio-autosave"==r.dynamic&&(vt.create(Object.assign(n,{title:Kt(t)})),qt(o,c),St.forEach(({mode:n,labelKey:a})=>{jt(o+"-"+n,i,o,browser.i18n.getMessage(a),"disabled"==n,{action:"auto-save",entry:t,surface:e,mode:n})}))}(e,t,s,a);else{const r=t.profile&&a.profiles[t.profile]?t.profile:void 0,i=Kt(t,r);vt.create(Object.assign(s,{title:i})),qt(n,{action:t.action,entry:t,surface:e,profileName:r,title:i}),o.container&&Nt(e,t.children,a,n)}}(e,t,(a||e)+"-"+r,n,a))}function Mt(e,t,n){const a=b[t.action];return!(!a||a.surfaces&&!a.surfaces.includes(e)||(r=t.action,!("auto-save"==r?L:"save-selected-tabs"!=r||_))||!zt(e,t).length)&&(a.dynamic&&"radio-autosave"!=a.dynamic?n.profileNames.length>1:!a.container||t.children.some(t=>Mt(e,t,n)));var r}function jt(e,t,n,a,r,o){vt.create({id:e,type:"radio",contexts:t,parentId:n,title:a,checked:r}),Pt.set(e,r),qt(e,o)}function qt(e,t){_t.set(e,t)}function zt(e,t){if("page"==e){return(t.contexts||b[t.action].contexts||p).flatMap(e=>kt[e]||[])}return xt[e]||[]}function Kt(e,t){if(e.label)return e.label;const n=browser.i18n.getMessage(b[e.action].labelKey);return t?n+" ("+Ht(t)+")":n}function Ht(e){return e==k?Et:e}function Vt(e){return Array.from(_t.entries()).filter(([,t])=>t.action==e)}async function $t(){Lt=null;const[e]=await He({currentWindow:!0,active:!0});await Bt(e),e&&await Jt(e)}async function Gt(e){const t=await m(e.id);await async function(){const e=await browser.tabs.query({});return Promise.all(e.map(async e=>{const[t,n]=await Promise.all([fe(e.url,!0),Ee(e)]);try{await browser.tabs.sendMessage(e.id,{method:"content.init",autoSaveEnabled:n,options:t})}catch(e){}}))}(),await pt(e);try{await browser.runtime.sendMessage({method:"options.refresh",profileName:t.profileName})}catch(e){}}async function Jt(e){if(At&&Ut){const t=[],n=await m(e.id);if(n[e.id].editorDetected)Zt(!1);else if(Zt(!0),Vt("auto-save").forEach(([a,r])=>{"disabled"==r.mode?t.push(Qt(a,!n[e.id].autoSave)):"tab"==r.mode?t.push(Qt(a,n[e.id].autoSave)):"unpinned"==r.mode?t.push(Qt(a,Boolean(n.autoSaveUnpinned))):"all"==r.mode&&t.push(Qt(a,Boolean(n.autoSaveAll)))}),e&&e.url){const a=await fe(e.url);t.push(async function(e,t){const n=Ot;Ot=t,(void 0===n||n!=t)&&await Bt(e)}(e,a.contextMenuEnabled));const r=n[e.id].savedPageDetected;Vt("edit-and-save-page").forEach(([e,n])=>{const o=r&&!n.entry.label?browser.i18n.getMessage(b[n.action].altLabelKey):n.title;t.push(Xt(e,o)),t.push(vt.update(e,{visible:!a.openEditor||r}))}),_&&Vt("save-selection").forEach(([e])=>t.push(vt.update(e,{visible:!a.saveRawPage})));const[o,i]=await Promise.all([de(),ee(e.url)]);if(Object.keys(o).length>1){let e=k,n=Ct;i&&i.profile!=k&&o[i.profile]&&(e=i.profile,n=It),Vt("domain-rule").forEach(([a,r])=>{r.profileName?t.push(Qt(a,r.profileName==e)):t.push(Xt(a,r.entry.label||n))})}}await Promise.all(t)}}async function Zt(e){const t=Wt;if(Wt=e,void 0===t||t!=e){const t=[];try{_t.forEach((n,a)=>{Tt.includes(n.action)&&t.push(vt.update(a,{visible:e}))}),await Promise.all(t)}catch(e){}}}async function Xt(e,t){const n=Rt.get(e);try{(void 0===n||n!=t)&&await vt.update(e,{title:t}),Rt.set(e,t)}catch(e){}}async function Qt(e,t){t=Boolean(t);try{await vt.update(e,{checked:t}),Pt.set(e,t)}catch(e){}}Promise.resolve().then(async function(){At&&(Bt(),vt.onClicked.addListener(async(e,t)=>{const n=_t.get(e.menuItemId);if(!n)return;const a=await async function(e){if(e){const t=await de();if(t[e])return Object.assign({},t[e],{profileName:e})}return{}}(n.profileName);if("save-page"==n.action&&(e.linkUrl?Ft.saveUrls([e.linkUrl],a):Ft.saveTabs([t],a)),"edit-and-save-page"==n.action){if((await m(t.id))[t.id].savedPageDetected)Ft.openEditor(t);else{const n=Object.assign(a,{openEditor:!0});e.linkUrl?Ft.saveUrls([e.linkUrl],n):Ft.saveTabs([t],n)}}if("save-selected-links"==n.action&&Ft.saveSelectedLinks(t),"view-pendings"==n.action&&await browser.tabs.create({active:!0,url:"/src/ui/pages/pendings.html"}),"save-selection"==n.action&&Ft.saveTabs([t],Object.assign(a,{selected:!0})),"save-frame"==n.action&&Ft.saveTabs([t],{frameId:e.frameId}),"save-selected-tabs"==n.action){const e=await He({currentWindow:!0,highlighted:!0});Ft.saveTabs(e,a)}if("save-unpinned-tabs"==n.action){const e=await He({currentWindow:!0,pinned:!1});Ft.saveTabs(e,a)}if("save-all-tabs"==n.action){const e=await He({currentWindow:!0});Ft.saveTabs(e,a)}if("batch-save-urls"==n.action&&Ft.batchSaveUrls(),"auto-save"==n.action){const a=await m(t.id);"tab"==n.mode&&(a[t.id].autoSave=!0),"disabled"==n.mode&&(Object.keys(a).forEach(e=>{"object"==typeof a[e]&&a[e].autoSave&&(a[e].autoSave=!1)}),a.autoSaveUnpinned=a.autoSaveAll=!1),"all"==n.mode&&(a.autoSaveAll=e.checked),"unpinned"==n.mode&&(a.autoSaveUnpinned=e.checked),await h(a),Gt(t)}if("select-profile"==n.action){const e=await m();e.profileName=n.profileName,await h(e),Gt(t)}if("domain-rule"==n.action){const e=await ee(t.url,!0);e?await ve(e.url,e.url,n.profileName,n.profileName):(await Promise.all(Vt("domain-rule").map(([e,t])=>Xt(e,t.entry.label||It))),await ye(new URL(t.url).hostname,n.profileName,n.profileName))}}),Ut?Dt=!0:(await browser.tabs.query({})).forEach(async e=>await Jt(e)))}),At&&browser.storage.onChanged.addListener(async function(e,t){const n=Object.keys(e);let a="local"==t&&n.includes("sync");if(!a&&(n.includes("rules")||n.includes(E)||n.some(e=>e.startsWith(S)))){const{sync:e}=await browser.storage.local.get(["sync"]);a=t==(e?"sync":"local")}a&&(Lt&&clearTimeout(Lt),Lt=setTimeout($t,1e3))});const Yt=browser.commands;let en,tn,nn;function an(e,t){return e.method.endsWith(".refreshMenu")?function(e){if(e.method.endsWith("refreshMenu"))return Bt(),Promise.resolve({})}(e):dt(e,t)}function rn(e){!function(e){bt(e.id,yt("forbidden"))}(e)}function on(e,t,n){!function(e,t,n){let a;n?a=yt("inject",!0):(a=yt(1==t?"inject":"execute"),a.setTitle={title:Ye+" ("+t+"/2)"},a.setIcon={path:Je+"0.png"}),bt(e,a)}(e,t,n)}async function sn(e,t,n){ft(e);try{t&&await browser.tabs.sendMessage(e,{method:"content.error",error:t.toString(),link:n})}catch(e){}}function cn(e){!function(e){bt(e,yt("edit"))}(e)}function ln(e,t){mt(e,t)}function un(e,t,n){!function(e,t,n){wt(e,t,n,rt)}(e,t,n)}function dn(e){Jt(e)}Yt&&Yt.onCommand&&Yt.onCommand.addListener&&Yt.onCommand.addListener(async e=>{if("save-selected-tabs"==e){const e=await He({currentWindow:!0,highlighted:!0});en.saveTabs(e,{optionallySelected:!0})}else if("save-all-tabs"==e){const e=await He({currentWindow:!0});en.saveTabs(e)}else if(e.startsWith("custom-command-")){const t=await de();let n;if(Object.keys(t).some(a=>t[a].customShortcut==e&&(n=a,!0)),n){const e=await He({currentWindow:!0,highlighted:!0});en.saveTabs(e,t[n])}}});const fn=["lib/web-stream.js","lib/chrome-browser-polyfill.js","lib/single-file.js"],mn=["lib/chrome-browser-polyfill.js","lib/single-file-frames.js"];async function hn(e,t){let n;if(await async function(e){const t=e.extensionScriptFiles||[];tn||nn||([tn,nn]=await Promise.all([wn(fn.concat(t)),wn(mn)]))}(t),!t.removeFrames)try{await browser.tabs.executeScript(e,{code:nn,allFrames:!0,matchAboutBlank:!0,runAt:"document_start"})}catch(e){}try{await browser.tabs.executeScript(e,{code:tn,allFrames:!1,runAt:"document_idle"}),n=!0}catch(e){}return n&&t.frameId&&await browser.tabs.executeScript(e,{code:"document.documentElement.dataset.requestedFrameId = true",frameId:t.frameId,matchAboutBlank:!0,runAt:"document_start"}),n}async function wn(e){const t=e.map(async e=>{if("function"==typeof e)return"("+e.toString()+")();";{const t=await fetch(browser.runtime.getURL("../../../"+e));return(new TextDecoder).decode(await t.arrayBuffer())}});let n="";for(const e of t)n+=await e;return n}const pn="single-file-response-fetch",bn="Host fetch error (SingleFile)",gn=Boolean(window.wrappedJSObject),yn=["http:","https:"],vn=["no-referrer-when-downgrade","strict-origin","strict-origin-when-cross-origin"],An=["no-referrer","no-referrer-when-downgrade","origin","origin-when-cross-origin","same-origin","strict-origin","strict-origin-when-cross-origin","unsafe-url"],kn=window.fetch.bind(window);let xn,Tn=0,Sn=new Map;async function Cn(e,t={},n=!0){try{const a={cache:t.cache||"force-cache",headers:t.headers,referrerPolicy:En(e,t)?"no-referrer":t.referrerPolicy||"strict-origin-when-cross-origin"};let r;try{r=t.referrer&&!gn||!n?await kn(e,a):await async function(e,t){if(void 0===xn&&(xn=!1,document.addEventListener("single-file-response-fetch-supported",()=>xn=!0,!1),document.dispatchEvent(new CustomEvent("single-file-request-fetch-supported"))),xn)return new Promise((n,a)=>{document.addEventListener(pn,function t(r){r.detail?r.detail.url==e&&(document.removeEventListener(pn,t,!1),r.detail.response?n({status:r.detail.status,headers:Pn(r.detail.headers),arrayBuffer:async()=>r.detail.response}):a(new Error(r.detail.error))):(document.removeEventListener(pn,t,!1),a(new Error(bn)))},!1),document.dispatchEvent(new CustomEvent("single-file-request-fetch",{detail:JSON.stringify({url:e,options:t})}))});throw new Error(bn)}(e,a),401!=r.status&&403!=r.status&&404!=r.status||"no-referrer"==a.referrerPolicy||t.referrer||(r=await Cn(e,{...a,referrerPolicy:"no-referrer"},n))}catch(o){if(o&&o.message==bn)r=await Cn(e,{...a},!1);else{if("no-referrer"==a.referrerPolicy||t.referrer)throw o;r=await Cn(e,{...a,referrerPolicy:"no-referrer"},n)}}return r}catch(n){Tn++;const a=new Promise((e,t)=>Sn.set(Tn,{resolve:e,reject:t}));return await Rn({method:"singlefile.fetch",url:e,requestId:Tn,referrer:t.referrer,headers:t.headers}),a}}async function In(e,t){const n=await Rn({method:"singlefile.fetchFrame",url:e,frameId:t.frameId,referrer:t.referrer,headers:t.headers});return{status:n.status,headers:Pn(n.headers),arrayBuffer:async()=>new Uint8Array(n.array).buffer}}function En(e,{stylesheetURL:t,stylesheetReferrerPolicy:n}={}){if(!t)return!1;let a,r;try{a=new URL(t),r=new URL(e,t)}catch{return!1}if(!yn.includes(a.protocol)||!yn.includes(r.protocol))return!0;let o="strict-origin-when-cross-origin";String(n||"").split(",").forEach(e=>{e=e.trim().toLowerCase(),An.includes(e)&&(o=e)});const i="https:"==a.protocol&&"https:"!=r.protocol;return"no-referrer"==o||"same-origin"==o&&r.origin!=a.origin||i&&vn.includes(o)}function Pn(e){return new Headers(e?Array.from(e,e=>[e[0],e[1]]):[])}async function Rn(e){const t=await browser.runtime.sendMessage(e);if(!t||t.error)throw new Error(t&&t.error&&t.error.toString());return t}function Un(e,t){return hn(e,t)}browser.runtime.onMessage.addListener(e=>"singlefile.fetchFrame"==e.method&&window.frameId&&window.frameId==e.frameId?async function(e){try{const t=await kn(e.url,{cache:"force-cache",headers:e.headers,referrerPolicy:"strict-origin-when-cross-origin"});return{status:t.status,headers:[...t.headers],array:Array.from(new Uint8Array(await t.arrayBuffer()))}}catch(e){return{error:e&&(e.message||e.toString())}}}(e):"singlefile.fetchResponse"==e.method?async function(e){const t=Sn.get(e.requestId);t&&(e.error?(t.reject(new Error(e.error)),Sn.delete(e.requestId)):(e.truncated&&(t.array?t.array=t.array.concat(e.array):(t.array=e.array,Sn.set(e.requestId,t)),e.finished&&(e.array=t.array)),e.truncated&&!e.finished||(t.resolve({status:e.status,headers:Pn(e.headers),arrayBuffer:async()=>new Uint8Array(e.array).buffer}),Sn.delete(e.requestId))));return{}}(e):void 0);const Dn="Could not establish connection. Receiving end does not exist.",Fn="The message port closed before a response was received.",Ln="Message manager disconnected",_n="Cannot access contents of url ",On="A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received",Wn="pending",Bn="processing",Nn=["lib/single-file-extension.js"],Mn=[];let jn,qn,zn=0;var Kn;async function Hn(e){const t={extensionScriptFiles:Nn,tabId:e.id,tabIndex:e.index};let n;try{n=await Un(e.id,t)}catch(e){}if(n){const t=await browser.tabs.sendMessage(e.id,{method:"content.getSelectedLinks"});if(t.urls&&t.urls.length){const e=await Vn(),n=(a,r)=>{"complete"==r.status&&a==e.id&&(browser.tabs.onUpdated.removeListener(n),browser.tabs.sendMessage(e.id,{method:"newUrls.addURLs",urls:t.urls}))};browser.tabs.onUpdated.addListener(n)}}else rn(e)}async function Vn(){return browser.tabs.create({active:!0,url:"/src/ui/pages/batch-save-urls.html"})}async function $n(e,t={}){await Zn(),await Promise.all(e.map(async e=>{const n=await fe(e);n.profileName!=x&&(Object.keys(t).forEach(e=>n[e]=t[e]),n.autoClose=!0,n.originalUrl=e,n.extensionScriptFiles=Nn,n.passReferrerOnError&&Ke(),Jn({tab:{url:e},status:Wn,options:n,method:"content.save"}))})),Xn()}async function Gn(e,t={}){await Zn(),await Promise.all(e.map(async e=>{const n=e.id,a=await fe(e.url);if(a.profileName!=x){Object.keys(t).forEach(e=>a[e]=t[e]),a.tabId=n,a.tabIndex=e.index,a.extensionScriptFiles=Nn,a.passReferrerOnError&&Ke();const r={id:e.id,index:e.index,url:e.url,title:e.title};if(t.autoSave){if(Ee(e)){Qn(Jn({status:Bn,tab:r,options:a,method:"content.autosave"}))}}else{let t;on(n,1);try{t=await Un(n,a)}catch(e){}t||_e(e)?(on(n,2),Jn({status:Wn,tab:r,options:a,method:"content.save"})):rn(e)}}else rn(e)})),Xn()}function Jn(e){const t={id:zn,status:e.status,tab:e.tab,options:e.options,method:e.method,resolve:e.resolve,reject:e.reject,done:function(e=!0){const t=Mn.findIndex(e=>e.id==this.id);t>-1&&(Mn.splice(t,1),e&&Xn())}};return Mn.push(t),zn++,t}async function Zn(){if(!jn){const e=await te();qn=e.processInForeground,jn=qn?1:e.maxParallelWorkers}}function Xn(){const e=Mn.filter(e=>e.status==Bn).length;for(let t=0;te.status==Wn);e&&Qn(e)}}async function Qn(e){const t=e.id;if(e.status=Bn,!e.tab.id){let t;try{const n=await async function(e){const t=await browser.tabs.create(e);return new Promise((e,n)=>{function a(n,o){n==t.id&&"complete"==o.status&&(e(t),browser.tabs.onUpdated.removeListener(a),browser.tabs.onRemoved.removeListener(r))}function r(e){e==t.id&&(n(e),browser.tabs.onRemoved.removeListener(r))}browser.tabs.onUpdated.addListener(a),browser.tabs.onRemoved.addListener(r)})}({url:e.tab.url,active:!1});e.tab.id=e.options.tabId=n.id,e.tab.index=e.options.tabIndex=n.index,on(e.tab.id,1);try{t=await Un(e.tab.id,e.options)}catch(e){}}catch(t){e.tab.id=t}if(!t)return void e.done();on(e.tab.id,2)}e.options.taskId=t;try{qn&&!e.options.silent&&await browser.tabs.update(e.tab.id,{active:!0});const t=await browser.tabs.sendMessage(e.tab.id,{method:e.method,options:e.options});e.resolve&&!e.cancelled&&(e.resolve(t),e.done())}catch(t){e.reject?(e.cancelled||e.reject(t),e.done()):!t||t.message&&function(e){return e.message==Fn||e.message==Dn||e.message==Ln||e.message==On||e.message.startsWith(_n+JSON.stringify(Fe))}(t)||(console.log(t.message?t.message:t),sn(e.tab.id,t.message,t.link),e.done())}}function Yn(e){const t=Mn.find(t=>t.id==e);t&&(t.options.autoClose&&!t.cancelled&&browser.tabs.remove(t.tab.id),t.done())}function ea(e,t){const n=Mn.find(t=>t.id==e);n&&(n.cancel=t)}function ta(e,t=!0){Array.from(Mn).filter(n=>n.tab.id==e&&!n.options.autoSave&&(t||n.status!=Bn)).forEach(ra)}function na(e){const t=Mn.find(t=>t.id==e);t&&ra(t)}function aa(e){return Mn.find(t=>t.id==e)}function ra(e,t){const n=e.tab.id;e.cancelled=!0,n&&(browser.tabs.sendMessage(n,{method:"content.cancelSave",options:{loadDeferredContent:e.options.loadDeferredContent,loadDeferredContentKeepZoomLevel:e.options.loadDeferredContentKeepZoomLevel}}).catch(()=>{}),"content.autosave"==e.method&&ln(n,!0),e.options.silent||function(e){ht(e)}(e.tab)),e.cancel&&e.cancel(),e.done(t)}function oa(e){return{id:e.id,tabId:e.tab.id,index:e.tab.index,url:e.tab.url,title:e.tab.title,cancelled:e.cancelled,status:e.status}}(function(e){Ft=e})(Kn={isSavingTab:function(e){return Boolean(Mn.find(t=>t.tab.id==e.id))},saveTabs:Gn,saveUrls:$n,cancelTab:ta,openEditor:function(e){browser.tabs.sendMessage(e.id,{method:"content.openEditor"})},saveSelectedLinks:Hn,batchSaveUrls:Vn}),function(e){ut=e}(Kn),function(e){en=e}(Kn);async function ia(e){let t;try{t=await browser.runtime.sendNativeMessage("singlefile_companion",{method:"save",pageData:e})}catch(e){if(!e.message||!e.message.includes("Native host has exited")&&!e.message.includes("An unexpected error occurred"))throw e}if(t&&t.error)throw new Error(t.error+" (Companion)")}const sa=new Set;async function ca(e){return e.method.endsWith(".saveCreatedBookmarks")?(la(),{}):e.method.endsWith(".disable")?(async function(){let e;const t=await de();Object.keys(t).forEach(n=>e=e||!t[n].saveCreatedBookmarks),e&&(browser.bookmarks.onCreated.removeListener(da),browser.bookmarks.onMoved.removeListener(fa))}(),{}):void 0}async function la(){try{browser.bookmarks.onCreated.removeListener(da),browser.bookmarks.onMoved.removeListener(fa)}catch(e){}let e;const t=await de();Object.keys(t).forEach(n=>{t[n].saveCreatedBookmarks&&(e=!0)}),e&&(browser.bookmarks.onCreated.addListener(da),browser.bookmarks.onMoved.addListener(fa))}async function ua(e,t){try{await browser.bookmarks.update(e,t)}catch(e){}}async function da(e,t){sa.add(e),await ma(e,t.url,t)}async function fa(e,t){if(sa.has(e)){const n=await browser.bookmarks.get(e);n[0]&&await ma(e,n[0].url,t)}}async function ma(e,t,n){const a=await browser.tabs.query({lastFocusedWindow:!0,active:!0}),r=await fe(t);if(r.saveCreatedBookmarks){const i=await async function e(t,n=[]){if(t){const a=(await browser.bookmarks.get(t))[0];a&&a.title&&(n.unshift(a.title),await e(a.parentId,n))}return n}(n.parentId),s=r.allowedBookmarkFolders.toString(),c=i.find(e=>r.allowedBookmarkFolders.includes(e)),l=r.ignoredBookmarkFolders.toString(),u=i.find(e=>r.ignoredBookmarkFolders.includes(e));if((s&&c||!s)&&(l&&!u||!l))if(a.length&&a[0].url==t)sa.delete(e),Gn(a,{bookmarkId:e,bookmarkFolders:i});else{const n=await browser.tabs.query({});if(n.length){const a=n.find(e=>e.url==t);a?(sa.delete(e),Gn([a],{bookmarkId:e,bookmarkFolders:i})):t&&("about:blank"==t?browser.bookmarks.onChanged.addListener(function t(n,a){n==e&&a.url&&(browser.bookmarks.onChanged.removeListener(t),o(a.url))}):o(t))}}}function o(t){sa.delete(e),$n([t],{bookmarkId:e})}}Promise.resolve().then(la);async function ha(e,t){let n=t||"WOLEET_API_KEY_PLACEHOLDER";const a=await fetch("https://api.woleet.io/v1/anchor",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:"Bearer "+n},body:JSON.stringify({name:e,hash:e,public:!0})});if(401==a.status){const e=new Error("Your access token on Woleet is invalid. Go to __DOC_LINK__ to create your account.");throw e.link="https://app.woleet.io/",e}if(402==a.status){const e=new Error("You have no more credits on Woleet. Go to __DOC_LINK__ to recharge them.");throw e.link="https://app.woleet.io/",e}if(a.status>=400)throw new Error((a.statusText||"Error "+a.status)+" (Woleet)");return a.json()}const wa="https://oauth2.googleapis.com/token",pa="https://www.googleapis.com/drive/v3/files",ba="uniquify";let ga=class{constructor(e){this.file=e.file,this.onProgress=e.onProgress,this.contentType=this.file.type||"application/octet-stream",this.metadata={name:e.filename,mimeType:this.contentType,parents:e.parents||["root"]},this.token=e.token,this.offset=0,this.chunkSize=e.chunkSize||524288,this.filenameConflictAction=e.filenameConflictAction,this.prompt=e.prompt}async upload(e=1){let t,n="POST";const a=Ia(await fetch(pa+`?q=name = '${this.metadata.name}' and trashed != true and '${this.metadata.parents[0]}' in parents`,{headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"}})),r=await a.json();if(r.files.length)if("overwrite"==this.filenameConflictAction)n="PATCH",t=r.files[0].id,this.metadata.parents=null;else if(this.filenameConflictAction==ba){let t=this.metadata.name,n="";const a=this.metadata.name.lastIndexOf(".");a>-1&&(t=this.metadata.name.substring(0,a),n=this.metadata.name.substring(a+1));const r=t+" ("+e+")."+n,o=Ia(await fetch(pa+`?q=name = '${r}' and trashed != true and '${this.metadata.parents[0]}' in parents`,{headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"}}));if((await o.json()).files.length)return this.upload(e+1);this.metadata.name=r}else{if("prompt"==this.filenameConflictAction){if(this.prompt){const t=await this.prompt(this.metadata.name);return t?(this.metadata.name=t,this.upload(e)):r}return this.filenameConflictAction=ba,this.upload(e)}if("skip"==this.filenameConflictAction)return r}const o=Ia(await fetch("https://www.googleapis.com/upload/drive/v3/files"+(t?"/"+t:"")+"?uploadType=resumable",{method:n,headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json","X-Upload-Content-Length":this.file.size,"X-Upload-Content-Type":this.contentType},body:JSON.stringify(this.metadata)})).headers.get("Location");if(this.url=o,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),Sa(this)}};async function ya(e,t){const n=await fetch(wa,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+e.clientId+"&client_secret="+e.clientKey+"&grant_type=authorization_code&code="+t.code+(e.codeVerifier?"&code_verifier="+e.codeVerifier:"")+"&redirect_uri="+browser.identity.getRedirectURL()}),a=await Ca(n);return e.accessToken=a.access_token,e.refreshToken=a.refresh_token,e.expirationDate=Date.now()+1e3*a.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}function va(e){return btoa(String.fromCharCode(...e)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Aa(e={}){return Boolean(browser.identity&&browser.identity.getAuthToken)&&!e.forceWebAuthFlow}async function ka(e){const t=await browser.identity.getAuthToken(e);return"string"==typeof t?t:t&&t.token}async function xa(e,t,n=!0){const a=t.split("/");a.pop();const r=e.folderIds.get(a.join("/"));if(r)return r;let o="root";if(a.length){let r="";for(const i of a){r&&(r+="/"),r+=i;const a=e.folderIds.get(r);if(a)o=a;else try{o=await Ta(e,i,o),e.folderIds.set(r,o)}catch(a){if("path_not_found"==a.message&&n)return e.folderIds.clear(),xa(e,t,!1);throw a}}}return o}async function Ta(e,t,n){const a=await async function(e,t,n){const a=await fetch(pa+"?q=mimeType = 'application/vnd.google-apps.folder' and name = '"+t+"' and trashed != true and '"+n+"' in parents",{headers:{Authorization:"Bearer "+e.accessToken}});return Ca(a)}(e,t,n);if(a.files.length)return a.files[0].id;{const a=await async function(e,t,n){const a=await fetch(pa,{method:"POST",headers:{Authorization:"Bearer "+e.accessToken,"Content-Type":"application/json"},body:JSON.stringify({name:t,parents:[n],mimeType:"application/vnd.google-apps.folder"})});return Ca(a)}(e,t,n);return a.id}}async function Sa(e){let t=e.file,n=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(n=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,n));const a=await fetch(e.url,{method:"PUT",headers:{Authorization:"Bearer "+e.token,"Content-Type":e.contentType,"Content-Range":"bytes "+e.offset+"-"+(n-1)+"/"+e.file.size,"X-Upload-Content-Type":e.contentType},body:t});if(e.onProgress&&!e.cancelled&&e.onProgress(e.offset+e.chunkSize,e.file.size),200==a.status||201==a.status)return a.json();if(308==a.status){const t=a.headers.get("Range");if(t&&(e.offset=parseInt(t.match(/\d+/g).pop(),10)+1),e.cancelled)throw new Error("upload_cancelled");return Sa(e)}Ia(a)}async function Ca(e){e=Ia(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function Ia(e){if(200==e.status)return e;throw 404==e.status?new Error("path_not_found"):401==e.status?new Error("invalid_token"):new Error("unknown_error ("+e.status+")")}const Ea="https://api.dropboxapi.com/oauth2/token",Pa="uniquify",Ra="prompt",Ua=/[\u007f-\uffff]/g;class Da{constructor(e){this.file=e.file,this.onProgress=e.onProgress,this.contentType=this.file.type||"application/octet-stream",this.metadata={name:e.filename,mimeType:this.contentType},this.token=e.token,this.offset=0,this.chunkSize=e.chunkSize||8388608,this.filenameConflictAction=e.filenameConflictAction,this.prompt=e.prompt}async upload(){const e=Wa(await fetch("https://api.dropboxapi.com/2/files/search_v2",{method:"POST",headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"},body:Ba({query:this.metadata.name,options:{filename:!0}})})),t=await Oa(e);if(t.matches.length)if(this.filenameConflictAction==Ra)if(this.prompt){const e=await this.prompt(this.metadata.name);if(!e)return t;this.metadata.name=e}else this.filenameConflictAction=Pa;else if("skip"==this.filenameConflictAction)return t;const n=Wa(await fetch("https://content.dropboxapi.com/2/files/upload_session/start",{method:"POST",headers:{Authorization:"Bearer "+this.token,"Dropbox-API-Arg":Ba({close:!1}),"Content-Type":"application/octet-stream"}})),a=(await Oa(n)).session_id;if(this.sessionId=a,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),_a(this)}}async function Fa(e,t){const n=await fetch(Ea,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+e.clientId+"&client_secret="+e.clientKey+"&grant_type=authorization_code&code="+t.code+(e.codeVerifier?"&code_verifier="+e.codeVerifier:"")+"&redirect_uri="+browser.identity.getRedirectURL()}),a=await Oa(n);return e.accessToken=a.access_token,e.refreshToken=a.refresh_token,e.expirationDate=Date.now()+1e3*a.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}function La(e){return btoa(String.fromCharCode(...e)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function _a(e){let t=e.file,n=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(n=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,n));const a=Wa(await fetch("https://content.dropboxapi.com/2/files/upload_session/append_v2",{method:"POST",headers:{Authorization:"Bearer "+e.token,"Content-Type":"application/octet-stream","Dropbox-API-Arg":Ba({cursor:{session_id:e.sessionId,offset:e.offset},close:n==e.file.size})},body:t}));if(e.onProgress&&!e.cancelled&&e.onProgress(e.offset+e.chunkSize,e.file.size),200==a.status&&(e.offset=n,e.offset=Ga){if(a=await l(e,"DELETE"),a.status>=Ga)throw new Error(Ka+a.status);return await Za(e,t,n)}}else{let a=await l(e,"HEAD");if(200==a.status){if("uniquify"==r||r==Ma&&!o){const{filenameWithoutExtension:a,extension:r,indexFilename:o}=function(e){let t=e,n=Na;const a=e.lastIndexOf(".");a>-1&&(t=e.substring(0,a),n=e.substring(a+1));let r;return({filenameWithoutExtension:t,indexFilename:r}=function(e){const t=e.match(Ha);let n=0;if(t&&t.length>1){const a=Number(t[t.length-1]);Number.isNaN(a)||(n=a,e=e.replace(Ha,Na))}return{filenameWithoutExtension:e,indexFilename:n}}(t)),{filenameWithoutExtension:t,extension:n,indexFilename:r}}(e);return n.indexFilename=o+1,await Za(function(e,t){return e+" ("+n.indexFilename+")"+(t?za+t:Na)}(a,r),t,n)}if(r==Ma)return(e=await o(e))?Za(e,t,n):a;if("skip"==r)return a}else{if(404==a.status){if(a=await l(e,"PUT",t),a.status>=Ga&&!s){if(e.includes(qa))return await async function(){const t=e.split(qa);t.pop();let n=Na;for(const e of t)if(e){n+=e;if(404==(await l(n,Va)).status){const e=await l(n,$a);if(e.status>=Ga)throw new Error(Ka+e.status)}n+=qa}}(),n.preventRetry=!0,await Za(e,t,n);throw new Error(Ka+a.status)}return a}if(a.status>=Ga)throw new Error(Ka+a.status)}}}catch(e){if("AbortError"!=e.name)throw e}function l(e,t,n){const r={[ja]:a};return n&&(r["Content-Type"]="text/html"),fetch(c+e,{method:t,headers:r,signal:i,body:n,credentials:"omit"})}}const Xa="",Qa="skip",Ya="uniquify",er="overwrite",tr="prompt",nr=".",ar=/\s\((\d+)\)$/,rr="AbortError",or="https://github.com",ir="https://api.github.com",sr="blob",cr="repos",lr="contents";let ur;class dr{constructor(e,t,n,a){this.headers=new Map([["Authorization","Bearer "+e],["Accept","application/vnd.github+json"],["X-GitHub-Api-Version","2022-11-28"]]),this.userName=t,this.repositoryName=n,this.branch=a}async upload(e,t,n){this.controller=new AbortController,n.signal=this.controller.signal,n.headers=this.headers;const a=t instanceof Blob?await async function(e){if(globalThis.FileReader){const t=new globalThis.FileReader;t.readAsDataURL(e);return(await new Promise((e,n)=>{t.addEventListener("load",()=>e(t.result),!1),t.addEventListener("error",n,!1)})).match(/^data:[^,]*,(.*)$/)[1]}{const t=new Uint8Array(await e.arrayBuffer());let n="";for(let e=0;e-1&&(t=e.substring(0,a),n=e.substring(a+1)),({filenameWithoutExtension:t,indexFilename:r}=f(t)),{filenameWithoutExtension:t,extension:n,indexFilename:r}}function f(e){const t=e.match(ar);let n=0;if(t&&t.length>1){const a=Number(t[t.length-1]);Number.isNaN(a)||(n=a,e=e.replace(ar,Xa))}return{filenameWithoutExtension:e,indexFilename:n}}function m(e,t){return e+" ("+o.indexFilename+")"+(t?nr+t:Xa)}}(this.userName,this.repositoryName,this.branch,e,a,n)}abort(){this.controller&&this.controller.abort()}}const fr="",mr="uniquify",hr=".",wr=/\s\((\d+)\)$/;class pr{constructor(e,t,n,a,r="s3.amazonaws.com"){this.api=new Ar({domain:r,region:e,bucket:t,accessKey:n,secretKey:a}),this.headObjectSupported=!0,this.listObjectsSupported=!0}async upload(e,t,n){const{filenameConflictAction:a,prompt:r}=n;this.controller=new AbortController,n.signal=this.controller.signal;try{if("overwrite"==a)return this.api.putObject({path:e},{body:await br(t)});{let o;if(this.headObjectSupported&&(o=await this.api.headObject({path:e},n)),this.headObjectSupported&&403!=o.status||(this.headObjectSupported=!1,this.listObjectsSupported&&(o=await this.api.listObjects({path:e},n)),this.listObjectsSupported&&403!=o.status||(this.listObjectsSupported=!1,o=await this.api.getObject({path:e},n))),200!=o.status){if(404==o.status)return t=new Uint8Array(await t.arrayBuffer()),this.api.putObject({path:e},{body:await br(t)});throw new Error(o.statusText||"Error "+o.status)}if("prompt"==a)return r?(e=await r(e))?this.upload(e,t,n):o:(n.filenameConflictAction=mr,this.upload(e,t,n));if(a==mr){const{filenameWithoutExtension:a,extension:r,indexFilename:o}=function(e){let t=e,n="";const a=e.lastIndexOf(".");a>-1&&(t=e.substring(0,a),n=e.substring(a+1));let r;return({filenameWithoutExtension:t,indexFilename:r}=function(e){const t=e.match(wr);let n=0;if(t&&t.length>1){const a=Number(t[t.length-1]);Number.isNaN(a)||(n=a,e=e.replace(wr,""))}return{filenameWithoutExtension:e,indexFilename:n}}(t)),{filenameWithoutExtension:t,extension:n,indexFilename:r}}(e);return n.indexFilename=o+1,e=function(e,t,n){return e+" ("+t+")"+(n?hr+n:fr)}(a,n.indexFilename,r),this.upload(e,t,n)}}}catch(e){if("AbortError"!=e.name)throw e}}abort(){this.controller&&this.controller.abort()}}async function br(e){return new Uint8Array(await new Response(e).arrayBuffer())}const gr="AWS4",yr=gr+"-HMAC-SHA256",vr="aws4_request";class Ar{constructor({domain:e,region:t,bucket:n,accessKey:a,secretKey:r}){this.domain=e,this.region=t,this.bucket=n,this.accessKey=a,this.secretKey=r}async putObject({path:e},{headers:t={},body:n}){return kr(this,{path:e},{method:"PUT",headers:t,body:n})}async getObject({path:e},{headers:t={}}={}){return kr(this,{path:e},{method:"GET",headers:t})}async headObject({path:e},{headers:t={}}={}){return kr(this,{path:e},{method:"HEAD",headers:t})}async listObjects({path:e},{headers:t={},continuationToken:n,delimiter:a,encodingType:r,prefix:o,maxKeys:i}={}){const s=new URLSearchParams;return s.set("list-type","2"),n&&s.set("continuation-token",n),a&&s.set("delimiter",a),r&&s.set("encoding-type",r),o&&s.set("prefix",o),i&&s.set("max-keys",i),kr(this,{path:e,searchParams:s},{method:"GET",headers:t})}}async function kr({region:e,bucket:t,accessKey:n,secretKey:a,domain:r},{path:o="/",searchParams:i=new URLSearchParams},{method:s,headers:c={},body:l}){const u=function(e){const t=new Date(e);return t.toISOString().replace(/[:-]|\.\d{3}/g,"")}(new Date);o.startsWith("/")||(o="/"+o),c.host=t+"."+r,l&&(c["content-length"]=l.byteLength),c["x-amz-content-sha256"]=await Sr(l),c["x-amz-date"]=u,c.authorization=yr+" Credential="+n+"/"+Cr(u,e,"s3")+",SignedHeaders="+Tr(c)+",Signature="+await async function({region:e,secretKey:t,service:n},{path:a,searchParams:r},{method:o,headers:i,body:s,isoDate:c}){const l=await async function(e,t,n,a,r,o,i,s){const c=await async function(e,t,n,a,r=new Uint8Array(0)){return a+"\n"+function(e){return decodeURIComponent(e).replace(/[^A-Za-z0-9-._~/]/g,xr)}(e)+"\n"+function(e){if(e){let t="";e.sort();for(const[n,a]of e)t+=encodeURIComponent(n)+"="+encodeURIComponent(a)+"&";return t.slice(0,-1)}return""}(t)+"\n"+function(e){let t="";const n=Object.keys(e).sort();for(const a of n)t+=a+":"+e[a]+"\n";return t}(n)+"\n"+Tr(n)+"\n"+await Sr(r)}(e,t,n,i,a);return yr+"\n"+r+"\n"+Cr(r,o,s)+"\n"+Rr(await Ir(Pr(c)))}(a,r,i,s,c,e,o,n),u=await async function(e,t,n,a){const r=await Er(Pr(gr+e),Pr(t.substring(0,8))),o=await Er(r,Pr(n)),i=await Er(o,Pr(a));return Er(i,Pr(vr))}(t,c,e,n);return Rr(await Er(u,Pr(l)))}({region:e,secretKey:a,service:"s3"},{path:o,searchParams:i},{method:s,headers:c,body:l,isoDate:u});const d="https://"+t+"."+r+o+(i.size?"?"+i:""),f={method:s,headers:c};return l&&(f.body=l),fetch(d,f)}function xr(e){let t=encodeURIComponent(e);return t=t.startsWith("%")?t.toUpperCase():"%"+t.charCodeAt(0).toString(16).toUpperCase(),t}function Tr(e){return Object.keys(e).map(e=>e.toLowerCase()).sort().join(";")}async function Sr(e=new Uint8Array(0)){return Rr(await Ir(e))}function Cr(e,t,n){return e.substring(0,8)+"/"+t+"/"+n+"/"+vr}async function Ir(e){return crypto.subtle.digest("SHA-256",e)}async function Er(e,t){const n={name:"HMAC",hash:{name:"SHA-256"}},a=await crypto.subtle.importKey("raw",e,n,!1,["sign"]);return crypto.subtle.sign(n,a,t)}function Pr(e){return(new TextEncoder).encode(e)}function Rr(e){return Array.from(new Uint8Array(e)).map(e=>e.toString(16).padStart(2,"0")).join("")}const Ur="",Dr="uniquify",Fr=".",Lr=/\s\((\d+)\)$/,_r="Content-Type",Or=32768,Wr="write_file",Br="get_file_info";class Nr{constructor(e,t){this.serverUrl=e,this.authToken=t,this.requestId=0}async upload(e,t,n){if(this.controller=new AbortController,n.signal=this.controller.signal,n.serverUrl=this.serverUrl,n.authToken=this.authToken,n.getRequestId=()=>++this.requestId,t instanceof Blob){const e=new Uint8Array(await t.arrayBuffer());try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch(a){if(!await async function(e,t,n,a){const r=await qr(e,t,"tools/list",{},n,a),o=(r.result&&r.result.tools||[]).find(e=>e.name==Wr),i=o&&o.inputSchema&&o.inputSchema.properties;return Boolean(i&&i.encoding)}(this.serverUrl,this.authToken,n.signal,n.getRequestId))throw new Error("The MCP server does not support binary files (the write_file tool has no 'encoding' argument)",{cause:a});t=function(e){let t="";for(let n=0;n-1&&(t=e.substring(0,a),n=e.substring(a+1));let r;return({filenameWithoutExtension:t,indexFilename:r}=function(e){const t=e.match(Lr);let n=0;if(t&&t.length>1){const a=Number(t[t.length-1]);Number.isNaN(a)||(n=a,e=e.replace(Lr,""))}return{filenameWithoutExtension:e,indexFilename:n}}(t)),{filenameWithoutExtension:t,extension:n,indexFilename:r}}(e);return n.indexFilename=o+1,e=function(e,t,n){return e+" ("+n+")"+(t?Fr+t:Ur)}(a,r,n.indexFilename),await Mr(e,t,n)}if("prompt"==a)return r?(e=await r(e))?await Mr(e,t,n):{url:e,skipped:!0}:(n.filenameConflictAction=Dr,await Mr(e,t,n))}}const d=await async function(e,t,n,a,r,o,i){const s={path:n,content:a};r&&(s.encoding=r);const c=await jr(e,t,Wr,s,o,i);if(c.error)throw new Error(c.error.message);return{success:!0}}(i,s,e,t,l,o,c);if(d.success)return{url:e};throw new Error(d.error||"Failed to write file via MCP")}catch(e){if("AbortError"!=e.name)throw e}}function jr(e,t,n,a,r,o){return qr(e,t,"tools/call",{name:n,arguments:a},r,o)}async function qr(e,t,n,a,r,o){const i={[_r]:"application/json",Accept:"application/json, text/event-stream"};t&&(i.Authorization=`Bearer ${t}`);const s=await fetch(e,{method:"POST",headers:i,body:JSON.stringify({jsonrpc:"2.0",id:o(),method:n,params:a}),signal:r});if(!s.ok)throw new Error(`MCP server error: ${s.status} ${s.statusText}`);return s.json()}const zr=[0],Kr=Symbol(),Hr=new TextEncoder,Vr=new TextDecoder,$r=new Array(256);let Gr=0;function Jr(e,t,n,a){if(void 0===a){if(Gr++,!($r.length-Gr>=zr.length))throw new Error("Reached maximum number of custom types");$r[$r.length-Gr]={serialize:e,parse:t,test:n}}else $r[a]={serialize:e,parse:t,test:n}}Jr(async function(e,t){const n=e.objects.indexOf(t);await Yr(e,n)},async function(e){const t=await lo(e);return new oo(t,e)},wo,0),Jr(null,function(){return{}},bo),Jr(eo,uo,go),Jr(to,fo,function(e){return"string"==typeof e}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(8*t);return new Float64Array(n.buffer)},function(e){return"Float64Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(4*t);return new Float32Array(n.buffer)},function(e){return"Float32Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(4*t);return new Uint32Array(n.buffer)},function(e){return"Uint32Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(4*t);return new Int32Array(n.buffer)},function(e){return"Int32Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(2*t);return new Uint16Array(n.buffer)},function(e){return"Uint16Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(2*t);return new Int16Array(n.buffer)},function(e){return"Int16Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(t);return new Uint8ClampedArray(n.buffer)},function(e){return"Uint8ClampedArray"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e);return await e.consume(t)},function(e){return"Uint8Array"==e.constructor.name}),Jr(no,async function(e){const t=await lo(e),n=await e.consume(t);return new Int8Array(n.buffer)},function(e){return"Int8Array"==e.constructor.name}),Jr(async function(e,t){await Yr(e,t.byteLength),await e.append(new Uint8Array(t))},async function(e){const t=await lo(e);return(await e.consume(t)).buffer},function(e){return"ArrayBuffer"==e.constructor.name}),Jr(ao,mo,vo),Jr(async function(e,t){const n=new Uint8Array(new Uint32Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(4);return new Uint32Array(t.buffer)[0]},function(e){return Ao(e)&&e>=0&&e<=4294967295}),Jr(async function(e,t){const n=new Uint8Array(new Int32Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(4);return new Int32Array(t.buffer)[0]},function(e){return Ao(e)&&e>=-2147483648&&e<=2147483647}),Jr(async function(e,t){const n=new Uint8Array(new Uint16Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(2);return new Uint16Array(t.buffer)[0]},function(e){return Ao(e)&&e>=0&&e<=65535}),Jr(async function(e,t){const n=new Uint8Array(new Int16Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(2);return new Int16Array(t.buffer)[0]},function(e){return Ao(e)&&e>=-32768&&e<=32767}),Jr(async function(e,t){const n=new Uint8Array([t]);await e.append(n)},async function(e){const t=await e.consume(1);return new Uint8Array(t.buffer)[0]},function(e){return Ao(e)&&e>=0&&e<=255}),Jr(async function(e,t){const n=new Uint8Array(new Int8Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(1);return new Int8Array(t.buffer)[0]},function(e){return Ao(e)&&e>=-128&&e<=127}),Jr(null,function(){return},function(e){return void 0===e}),Jr(null,function(){return null},function(e){return null===e}),Jr(null,function(){return NaN},function(e){return Number.isNaN(e)}),Jr(ro,ho,function(e){return"boolean"==typeof e}),Jr(async function(e,t){await to(e,t.description)},async function(e){const t=await fo(e);return Symbol(t)},ko),Jr(null,function(){return Kr},yo),Jr(async function(e,t){const n=t.entries();await Yr(e,t.size);for(const[t,a]of n)await Yr(e,t),await Yr(e,a)},async function(e){const t=await lo(e),n=new Map;t&&await async function a(r=0){const o=await lo(e),i=await lo(e);e.setObject([o,i],(e,t)=>n.set(e,t)),rn.add(e)),rthis.value.length){const t=this.value.length-this.offset;await this.append(new Uint8Array(e).subarray(0,t)),await this.appendData({value:this.value}),this.offset=0,await this.append(new Uint8Array(e).subarray(t))}else this.value.set(e,this.offset),this.offset+=e.length}async flush(){this.offset&&await this.appendData({value:new Uint8Array(this.value).subarray(0,this.offset),done:!0})}}function Qr(e,{chunkSize:t=8388608}={}){let n,a,r,o,i,s;return{[Symbol.asyncIterator]:()=>({next:()=>o?{done:o}:async function(){s?s():c().catch(()=>{});i=new Promise(e=>s=e);const e=await async function(){const{value:e,done:t}=await a;o=t,t||l();return e}();return{value:e}}(),return:()=>({done:!0})})};async function c(){l(),n=new Zr(u,t),await Yr(n,e),await n.flush()}function l(){a=new Promise(e=>r=e)}async function u(e){r(e),await i}}async function Yr(e,t){const n=$r.findIndex(({test:n}={})=>n&&n(t,e));e.addObject(t),await e.append(new Uint8Array([n]));const a=$r[n].serialize;a&&await a(e,t),0!=n&&bo(t)&&(await async function(e,t){const n=Object.getOwnPropertySymbols(t),a=n.map(e=>[e,t[e]]);await eo(e,a)}(e,t),await async function(e,t){if(ArrayBuffer.isView(t))await Yr(e,0);else{let n=Object.entries(t);go(t)&&(n=n.filter(([e])=>!Ao(Number(e)))),await Yr(e,n.length);for(const[t,a]of n)await to(e,t),await Yr(e,a)}}(e,t))}async function eo(e,t){await Yr(e,t.length);const n=Object.keys(t).filter(e=>Ao(Number(e))).map(e=>Number(e));let a=0,r=n[a];for(const[o,i]of t.entries())r==o?(r=n[++a],await Yr(e,i)):await Yr(e,Kr)}async function to(e,t){const n=Hr.encode(t);await Yr(e,n.length),await e.append(n)}async function no(e,t){await Yr(e,t.length),await e.append("Uint8Array"==t.constructor.name?t:new Uint8Array(t.buffer))}async function ao(e,t){const n=new Uint8Array(new Float64Array([t]).buffer);await e.append(n)}async function ro(e,t){const n=new Uint8Array([Number(t)]);await e.append(n)}class oo{constructor(e,t){this.index=e,this.data=t}getObject(){return this.data.objects[this.index]}}class io{constructor(e){this.stream=new so(e),this.objects=[],this.setters=[]}consume(e){return this.stream.consume(e)}getObjectId(){const e=this.objects.length;return this.objects.push(void 0),e}resolveObject(e,t){xo(t)&&!po(t)&&(this.objects[e]=t)}setObject(e,t){this.setters.push({functionArguments:e,setterFunction:t})}executeSetters(){this.setters.forEach(({functionArguments:e,setterFunction:t})=>{t(...e.map(e=>po(e)?e.getObject():e))})}}class so{constructor(e){this.offset=0,this.value=new Uint8Array(0),this.consumeData=e}async consume(e){if(this.offset+e>this.value.length){const t=new Uint8Array(this.value).subarray(this.offset,this.value.length),n=await this.consumeData();return t.length+n.length!=this.value.length&&(this.value=new Uint8Array(t.length+n.length)),this.value.set(t),this.value.set(n,t.length),this.offset=0,this.consume(e)}{const t=this.value.slice(this.offset,this.offset+e);return this.offset+=t.length,t}}}function co(){let e,t,n,a,r,o;return{next:async t=>t?async function(t){r?await r:async function(){let t;a=new Promise(e=>t=e),e=new io(s),i();const n=await lo(e);e.executeSetters(),t(n)}().catch(()=>{});return function(){r=new Promise(e=>o=e)}(),n(t),{done:!1}}(t):{value:await a,done:!0},return:()=>({done:!0})};function i(){t=new Promise(e=>n=e)}async function s(){const e=await t;return i(),o&&o(),e}}async function lo(e){const t=(await e.consume(1))[0],n=$r[t].parse,a=e.getObjectId(),r=await n(e);return 0!=t&&bo(r)&&(await async function(e,t){const n=await uo(e);e.setObject([n],e=>e.forEach(([e,n])=>t[e]=n))}(e,r),await async function(e,t){const n=await lo(e);n&&await a();async function a(r=0){const o=await fo(e),i=await lo(e);e.setObject([i],e=>t[o]=e),rn[r]=e);rthis.folderIds.clear(),6e4)}async auth(e={interactive:!0}){if(Aa(e))return this.accessToken=await ka({interactive:e.interactive}),{revokableAccessToken:this.accessToken};{if(e.code)return ya(this,e);const t=Array.from(crypto.getRandomValues(new Uint8Array(16))).map(e=>e.toString(16).padStart(2,"0")).join(""),{verifier:n,challenge:a}=await async function(){const e=va(crypto.getRandomValues(new Uint8Array(32))),t=va(new Uint8Array(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(e))));return{verifier:e,challenge:t}}();return this.codeVerifier=n,this.authURL="https://accounts.google.com/o/oauth2/v2/auth?client_id="+this.clientId+"&response_type=code&access_type=offline&state="+t+"&code_challenge="+a+"&code_challenge_method=S256&redirect_uri="+browser.identity.getRedirectURL()+"&scope="+this.scopes.join(" "),async function(e,t,n){let a;const r={state:n};try{if(Boolean(browser.identity&&browser.identity.launchWebAuthFlow)&&Boolean(globalThis.chrome&&globalThis.chrome.windows||globalThis.browser&&globalThis.browser.windows)&&!t.forceWebAuthFlow){const a=await browser.identity.launchWebAuthFlow({interactive:t.interactive,url:e.authURL}),r=new URLSearchParams(new URL(a).search);if(r.get("state")!=n)throw new Error("invalid_auth_response");return t.code=r.get("code"),await ya(e,t)}if(t.launchWebAuthFlow)return t.extractAuthCode(browser.identity.getRedirectURL(),r).then(e=>a=e).catch(()=>{}),await t.launchWebAuthFlow({url:e.authURL},r);throw new Error("auth_not_supported")}catch(n){if(n.message&&("code_required"==n.message||n.message.includes("access"))){if(a)return t.code=a,await ya(e,t);throw new Error("code_required",{cause:n})}throw n}finally{r.cancel&&r.cancel()}}(this,e,t)}}setAuthInfo(e,t){Aa(t)||(e?(this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationDate=e.expirationDate):(delete this.accessToken,delete this.refreshToken,delete this.expirationDate))}async refreshAuthToken(){if(this.refreshToken){const e=await fetch(wa,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+this.clientId+"&refresh_token="+this.refreshToken+"&grant_type=refresh_token&client_secret="+this.clientKey});if(400==e.status)throw new Error("unknown_token");const t=await Ca(e);return this.accessToken=t.access_token,t.refresh_token&&(this.refreshToken=t.refresh_token),t.expires_in&&(this.expirationDate=Date.now()+1e3*t.expires_in),{accessToken:this.accessToken,refreshToken:this.refreshToken,expirationDate:this.expirationDate}}try{return browser.identity&&browser.identity.removeCachedAuthToken&&this.accessToken&&await browser.identity.removeCachedAuthToken({token:this.accessToken}),this.accessToken=await ka({interactive:!1}),{revokableAccessToken:this.accessToken}}catch(e){delete this.accessToken}}async revokeAuthToken(e){if(e){if(browser.identity&&browser.identity.removeCachedAuthToken)try{await browser.identity.removeCachedAuthToken({token:e})}catch(e){}const t=await fetch("https://accounts.google.com/o/oauth2/revoke",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"token="+e});try{await Ca(t)}catch(e){if("invalid_token"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,n,a,r=!0){const o=await xa(this,e),i=e.split("/").pop(),s=new ga({token:this.accessToken,file:t,parents:[o],filename:i,onProgress:n.onProgress,filenameConflictAction:n.filenameConflictAction,prompt:n.prompt});try{a&&a(()=>s.cancelled=!0),await s.upload()}catch(o){if("path_not_found"==o.message&&r)return this.folderIds.clear(),this.upload(e,t,n,a);throw o}}}(Po,Ro,["https://www.googleapis.com/auth/drive.file"]),Fo=new class{constructor(e,t){this.clientId=e,this.clientKey=t}async auth(e={interactive:!0}){if(e.code)return Fa(this,e);const t=Array.from(crypto.getRandomValues(new Uint8Array(16))).map(e=>e.toString(16).padStart(2,"0")).join(""),{verifier:n,challenge:a}=await async function(){const e=La(crypto.getRandomValues(new Uint8Array(32))),t=La(new Uint8Array(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(e))));return{verifier:e,challenge:t}}();return this.codeVerifier=n,this.authURL="https://www.dropbox.com/oauth2/authorize?client_id="+this.clientId+"&response_type=code&token_access_type=offline&state="+t+"&code_challenge="+a+"&code_challenge_method=S256&redirect_uri="+browser.identity.getRedirectURL(),async function(e,t,n){let a;const r={state:n};try{return t.extractAuthCode(browser.identity.getRedirectURL(),r).then(e=>a=e).catch(()=>{}),await t.launchWebAuthFlow({url:e.authURL},r)}catch(n){if(n.message&&("code_required"==n.message||n.message.includes("access"))){if(a)return t.code=a,await Fa(e,t);throw new Error("code_required",{cause:n})}throw n}finally{r.cancel&&r.cancel()}}(this,e,t)}setAuthInfo(e){e?(this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationDate=e.expirationDate):(delete this.accessToken,delete this.refreshToken,delete this.expirationDate)}async refreshAuthToken(){if(this.refreshToken){const e=await fetch(Ea,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+this.clientId+"&refresh_token="+this.refreshToken+"&grant_type=refresh_token&client_secret="+this.clientKey});if(400==e.status)throw new Error("unknown_token");const t=await Oa(e);return this.accessToken=t.access_token,t.refresh_token&&(this.refreshToken=t.refresh_token),t.expires_in&&(this.expirationDate=Date.now()+1e3*t.expires_in),{accessToken:this.accessToken,refreshToken:this.refreshToken,expirationDate:this.expirationDate}}delete this.accessToken}async revokeAuthToken(e){if(e){const t=await fetch("https://api.dropboxapi.com/2/auth/token/revoke",{method:"POST",headers:{Authorization:"Bearer "+e}});try{await t.text()}catch(e){if("invalid_token"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,n,a){const r=new Da({token:this.accessToken,file:t,filename:e,onProgress:n.onProgress,filenameConflictAction:n.filenameConflictAction,prompt:n.prompt});a&&a(()=>r.cancelled=!0),await r.upload()}}("s50p6litdvuzrtb","i1vzwllesr14fzd");async function Lo(e,t){if(e.method.endsWith(".download"))return async function(e,t){const n=t.id;let a;const r=e.blob instanceof Blob&&e.blob.size?e.blob:null;if(r||e.blobURL)try{if(e.compressContent){const n=r?await r.arrayBuffer():await(await fetch(e.blobURL)).arrayBuffer();e.pageData=await async function(e){const t=co();return await t.next(e),(await t.next()).value}(new Uint8Array(n)),await Oo(e,t)}else{const n=r||await(await fetch(e.blobURL)).blob();r||(e.url=e.blobURL),await _o(n,t,t.incognito,e)}}catch(e){return{error:!0}}else if(e.compressContent){let a=Co.get(n);if(a||(a=co(),Co.set(n,a)),e.data)await a.next(new Uint8Array(e.data));else{Co.delete(n);const e=(await a.next()).value;await Oo(e,t)}}else e.truncated?(a=So.get(n),a||(a=[],So.set(n,a)),a.push(e.content),e.finished&&So.delete(n)):e.content&&(a=[e.content]),e.truncated&&!e.finished||await _o(new Blob(a,{type:e.mimeType}),t,t.incognito,e);return{}}(e,t.tab);if(e.method.endsWith(".disableGDrive")){const e=await Ae();return Se(),await Do.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(".disableDropbox")){const e=await ke();return Ce(),await Fo.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(".end")){if(e.hash)try{await ha(e.hash,e.woleetKey)}catch(e){sn(t.tab.id,e.message,e.link)}return Yn(e.taskId),{}}return e.method.endsWith(".getInfo")?Mn.map(oa):e.method.endsWith(".cancel")?(e.taskId?na(e.taskId):ta(t.tab.id),{}):e.method.endsWith(".cancelAll")?(Array.from(Mn).forEach(e=>ra(e,!1)),{}):e.method.endsWith(".saveUrls")?($n(e.urls),{}):void 0}async function _o(e,t,n,a){const r=t.id;try{let o;if(a.backgroundSave&&!a.saveToGDrive&&!a.saveToDropbox&&!a.saveWithWebDAV&&!a.saveToGitHub&&!a.saveToRestFormApi&&!a.saveToS3){const e=await $o(a.filename,a);a.filenameConflictAction=e.filenameConflictAction,o=e.skipped}if(o)ln(r);else{const o=e=>Jo(r,e);let i;if(a.openEditor)cn(r),await Le({tabIndex:t.index+1,filename:a.filename,content:await e.text(),url:a.originalUrl});else if(a.saveToClipboard)a.content=await e.text(),function(e){const t="copy";function n(t){t.clipboardData.setData(e.mimeType,e.content),t.clipboardData.setData("text/plain",e.content),t.preventDefault()}document.addEventListener(t,n),document.execCommand(t),document.removeEventListener(t,n)}(a);else if(a.saveWithWebDAV)i=await zo(a.taskId,Bo(a.filename),e,a.webDAVURL,a.webDAVUser,a.webDAVPassword,{filenameConflictAction:a.filenameConflictAction,prompt:o});else if(a.saveWithMCP)i=await Ko(a.taskId,Bo(a.filename),e,a.mcpServerUrl,a.mcpAuthToken,{filenameConflictAction:a.filenameConflictAction,prompt:o});else if(a.saveToGDrive)await Ho(a.taskId,Bo(a.filename),e,{forceWebAuthFlow:a.forceWebAuthFlow},{onProgress:(e,t)=>un(r,e,t),filenameConflictAction:a.filenameConflictAction,prompt:o});else if(a.saveToDropbox)await Vo(a.taskId,Bo(a.filename),e,{onProgress:(e,t)=>un(r,e,t),filenameConflictAction:a.filenameConflictAction,prompt:o});else if(a.saveToGitHub)i=await jo(a.taskId,Bo(a.filename),e,a.githubToken,a.githubUser,a.githubRepository,a.githubBranch,{filenameConflictAction:a.filenameConflictAction,prompt:o}),await i.pushPromise;else if(a.saveWithCompanion)await ia({filename:a.filename,content:await e.text(),title:a.title,url:a.originalUrl,filenameConflictAction:a.filenameConflictAction});else if(a.saveToRestFormApi)i=await Qo(a.taskId,a.filename,e,a.originalUrl,a.saveToRestFormApiToken,a.saveToRestFormApiUrl,a.saveToRestFormApiFileFieldName,a.saveToRestFormApiUrlFieldName);else if(a.saveToS3)i=await qo(a.taskId,Bo(a.filename),e,a.S3Domain,a.S3Region,a.S3Bucket,a.S3AccessKey,a.S3SecretKey,{filenameConflictAction:a.filenameConflictAction,prompt:o});else if(a.url||(a.url=URL.createObjectURL(e)),i=await Xo(a,{confirmFilename:a.confirmFilename,incognito:n,filenameConflictAction:a.filenameConflictAction,filenameReplacementCharacter:a.filenameReplacementCharacter,promptConflictingFilename:e=>Zo(r,e),bookmarkId:a.bookmarkId,replaceBookmarkURL:a.replaceBookmarkURL,includeInfobar:a.includeInfobar,openInfobar:a.openInfobar,animateInfobar:a.animateInfobar,infobarPositionAbsolute:a.infobarPositionAbsolute,infobarPositionTop:a.infobarPositionTop,infobarPositionBottom:a.infobarPositionBottom,infobarPositionLeft:a.infobarPositionLeft,infobarPositionRight:a.infobarPositionRight}),!i)throw new Error("upload_cancelled");a.bookmarkId&&a.replaceBookmarkURL&&i&&i.url&&await ua(a.bookmarkId,{url:i.url}),ln(r),a.openSavedPage&&!a.openEditor&&await Wo(t,URL.createObjectURL(e))}}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),sn(r,e.message,e.link))}finally{a.url&&URL.revokeObjectURL(a.url)}}async function Oo(e,t){const n=t.id;try{let a;if(e.backgroundSave&&!e.saveToGDrive&&!e.saveToDropbox&&!e.saveWithWebDAV&&!e.saveWithMCP&&!e.saveToGitHub&&!e.saveToRestFormApi&&!e.sharePage){const t=await $o(e.filename,e);e.filenameConflictAction=t.filenameConflictAction,a=t.skipped}if(a)ln(n);else{const a=e.pageData,r=e=>Jo(n,e),o=await singlefile.processors.compression.process(a,{insertTextBody:e.insertTextBody,url:a.url||t.url,createRootDirectory:e.createRootDirectory,tabId:n,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,extractDataFromPage:e.extractDataFromPage,preventAppendedData:e.preventAppendedData,maxAppendedDataLength:e.maxAppendedDataLength,insertCanonicalLink:e.insertCanonicalLink,insertMetaNoIndex:e.insertMetaNoIndex,insertMetaCSP:e.insertMetaCSP,password:e.password,embeddedImage:e.embeddedImage});let i;if(e.openEditor)cn(n),await Le({tabIndex:t.index+1,filename:e.filename,content:Array.from(new Uint8Array(await o.arrayBuffer())),compressContent:e.compressContent,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,extractDataFromPage:e.extractDataFromPage,insertTextBody:e.insertTextBody,insertMetaCSP:e.insertMetaCSP,embeddedImage:e.embeddedImage,url:e.originalUrl});else if(e.foregroundSave||!e.backgroundSave||e.sharePage){const t=await async function(e,t,n,a,r,{foregroundSave:o,sharePage:i}={}){const s=Qr({filename:t,taskId:e,foregroundSave:o,sharePage:i,content:await n.arrayBuffer(),mimeType:a});for await(const e of s)await browser.tabs.sendMessage(r,{method:"content.download",data:Array.from(e)});return browser.tabs.sendMessage(r,{method:"content.download"})}(e.taskId,e.filename,o,a.mimeType,n,{foregroundSave:!0,sharePage:e.sharePage});if(t.error)throw new Error(t.error)}else e.saveWithWebDAV?i=await zo(e.taskId,Bo(e.filename),o,e.webDAVURL,e.webDAVUser,e.webDAVPassword,{filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveWithMCP?i=await Ko(e.taskId,Bo(e.filename),o,e.mcpServerUrl,e.mcpAuthToken,{filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveToGDrive?await Ho(e.taskId,Bo(e.filename),o,{forceWebAuthFlow:e.forceWebAuthFlow},{onProgress:(e,t)=>un(n,e,t),filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveToDropbox?await Vo(e.taskId,Bo(e.filename),o,{onProgress:(e,t)=>un(n,e,t),filenameConflictAction:e.filenameConflictAction,prompt:r}):e.saveToGitHub?(i=await jo(e.taskId,Bo(e.filename),o,e.githubToken,e.githubUser,e.githubRepository,e.githubBranch,{filenameConflictAction:e.filenameConflictAction,prompt:r}),await i.pushPromise):e.saveToRestFormApi?i=await Qo(e.taskId,e.filename,o,e.originalUrl,e.saveToRestFormApiToken,e.saveToRestFormApiUrl,e.saveToRestFormApiFileFieldName,e.saveToRestFormApiUrlFieldName):e.saveToS3?i=await qo(e.taskId,Bo(e.filename),o,e.S3Domain,e.S3Region,e.S3Bucket,e.S3AccessKey,e.S3SecretKey,{filenameConflictAction:e.filenameConflictAction,prompt:r}):(e.url=URL.createObjectURL(o),i=await Xo(e,{confirmFilename:e.confirmFilename,incognito:t.incognito,filenameConflictAction:e.filenameConflictAction,filenameReplacementCharacter:e.filenameReplacementCharacter,promptConflictingFilename:e=>Zo(n,e),bookmarkId:e.bookmarkId,replaceBookmarkURL:e.replaceBookmarkURL,includeInfobar:e.includeInfobar,openInfobar:e.openInfobar,animateInfobar:e.animateInfobar,infobarPositionAbsolute:e.infobarPositionAbsolute,infobarPositionTop:e.infobarPositionTop,infobarPositionBottom:e.infobarPositionBottom,infobarPositionLeft:e.infobarPositionLeft,infobarPositionRight:e.infobarPositionRight}));e.bookmarkId&&e.replaceBookmarkURL&&i&&i.url&&await ua(e.bookmarkId,{url:i.url}),ln(n),e.openSavedPage&&!e.openEditor&&await Wo(t,URL.createObjectURL(o),{compressed:!0})}}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),sn(n,e.message,e.link))}finally{e.url&&URL.revokeObjectURL(e.url)}}async function Wo(e,t,{compressed:n}={}){const a={active:!0,url:"/src/ui/pages/viewer.html?"+(n?"compressed&":"")+"blobURI="+t,windowId:e.windowId};null!=e.index&&(a.index=e.index+1);const r=await browser.tabs.create(a);Io.set(r.id,t)}function Bo(e){return e.replace(/#/g,"%23")}async function No(e,t){let n=await Ae();const a={interactive:!0,forceWebAuthFlow:e.forceWebAuthFlow,launchWebAuthFlow:(e,t)=>$e(e,t),extractAuthCode:(e,t)=>Ve(e,t)};return Do.setAuthInfo(n,a),n&&n.accessToken&&!t||(n=await Do.auth(a),n?await xe(n):await Se()),n}async function Mo(e){let t=await ke();const n={launchWebAuthFlow:(e,t)=>$e(e,t),extractAuthCode:(e,t)=>Ve(e,t)};return Fo.setAuthInfo(t),t&&t.accessToken&&!e||(t=await Fo.auth(n),t?await Te(t):await Ce()),t}async function jo(e,t,n,a,r,o,i,{filenameConflictAction:s,prompt:c}){try{const l=aa(e);if(!l||!l.cancelled){const l=new dr(a,r,o,i);return ea(e,()=>l.abort()),await l.upload(t,n,{filenameConflictAction:s,prompt:c})}}catch(e){throw new Error(e.message+" (GitHub)",{cause:e})}}async function qo(e,t,n,a,r,o,i,s,{filenameConflictAction:c,prompt:l}){try{const u=aa(e);if(!u||!u.cancelled){const u=new pr(r,o,i,s,a);return ea(e,()=>u.abort()),await u.upload(t,n,{filenameConflictAction:c,prompt:l})}}catch(e){throw new Error(e.message+" (S3)",{cause:e})}}async function zo(e,t,n,a,r,o,{filenameConflictAction:i,prompt:s}){try{const c=aa(e);if(!c||!c.cancelled){const c=new Ja(a,r,o);return ea(e,()=>c.abort()),await c.upload(t,n,{filenameConflictAction:i,prompt:s})}}catch(e){throw new Error(e.message+" (WebDAV)",{cause:e})}}async function Ko(e,t,n,a,r,{filenameConflictAction:o,prompt:i}){try{const s=aa(e);if(!s||!s.cancelled){const s=new Nr(a,r);return ea(e,()=>s.abort()),await s.upload(t,n,{filenameConflictAction:o,prompt:i})}}catch(e){throw new Error(e.message+" (MCP)",{cause:e})}}async function Ho(e,t,n,a,r){try{await No(a);const o=aa(e);if(!o||!o.cancelled)return await Do.upload(t,n,r,t=>ea(e,t))}catch(o){if("invalid_token"==o.message){let o;try{o=await Do.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Google Drive)",{cause:e});o=await No(a,!0)}return o?await xe(o):await Se(),await Ho(e,t,n,a,r)}throw new Error(o.message+" (Google Drive)",{cause:o})}}async function Vo(e,t,n,a){try{await Mo();const r=aa(e);if(!r||!r.cancelled)return await Fo.upload(t,n,a,t=>ea(e,t))}catch(r){if("invalid_token"==r.message){let r;try{r=await Fo.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Dropbox)",{cause:e});r=await Mo(!0)}return r?await Te(r):await Ce(),await Vo(e,t,n,a)}throw new Error(r.message+" (Dropbox)",{cause:r})}}async function $o(e,t){let n,a=t.filenameConflictAction;return"skip"==a&&(await Go(e)?n=!0:a="uniquify"),{skipped:n,filenameConflictAction:a}}async function Go(e){const t=await browser.downloads.search({filenameRegex:"(\\\\|/)"+(n=e,n.replace(Eo,"\\$1")+"$"),exists:!0});var n;return Boolean(t.length)}function Jo(e,t){return browser.tabs.sendMessage(e,{method:"content.prompt",message:"Filename conflict, please enter a new filename",value:t})}async function Zo(e,t){for(;t&&await Go(t);)t=await Jo(e,t);return t}async function Xo(e,t){const n={url:e.url,saveAs:t.confirmFilename,filename:e.filename,conflictAction:t.filenameConflictAction};t.incognito&&(n.incognito=!0);const a=await i(n,t.filenameReplacementCharacter,t.promptConflictingFilename);if(a.filename){let e=a.filename;return e.startsWith("file:")||(e.startsWith("/")&&(e=e.substring(1)),e="file:///"+Bo(e)),{url:e}}a.cancelled&&na(e.taskId)}async function Qo(e,t,n,a,r,o,i,s){try{const c=aa(e);if(!c||!c.cancelled){const c=new To(r,o,i,s);return ea(e,()=>c.abort()),await c.upload(t,n,a)}}catch(e){throw new Error(e.message+" (RestFormApi)",{cause:e})}}browser.tabs.onRemoved.addListener(e=>{const t=Io.get(e);t&&(Io.delete(e),URL.revokeObjectURL(t))});const Yo={},ei={};async function ti(e,t){if("enableAutoSave"==e.method){const n=await m(t.id);n[t.id].autoSave=e.enabled,await h(n),async function(e){Promise.all([Bt(e),pt(e)])}(t)}if("isAutoSaveEnabled"==e.method)return Ee(t)}async function ni(e,t){const n=t.id,a=await fe(t.url,!0);if(a){let r;on(n,1,!0),a.content=e.content,a.url=e.url,a.frames=e.frames,a.canvases=e.canvases,a.fonts=e.fonts,a.stylesheets=e.stylesheets,a.images=e.images,a.posters=e.posters,a.videos=e.videos,a.usedFonts=e.usedFonts,a.shadowRoots=e.shadowRoots,a.referrer=e.referrer,a.worklets=e.worklets,a.adoptedStyleSheets=e.adoptedStyleSheets,a.visitDate=new Date(e.visitDate),a.backgroundTab=!0,a.autoSave=!0,a.incognito=t.incognito,a.tabId=n,a.tabIndex=t.index;try{if(a.autoSaveExternalSave)await async function(e){let t;e.autoSaveExternalSave=!1;try{t=await browser.runtime.sendNativeMessage("singlefile_companion",{method:"externalSave",pageData:e})}catch(e){if(!e.message||!e.message.includes("Native host has exited")&&!e.message.includes("An unexpected error occurred"))throw e}if(t&&t.error)throw new Error(t.error+" (Companion)")}(a);else{let o;if(a.passReferrerOnError&&Ke(),a.tabId=n,r=await function(e,t={fetch:Cn,frameFetch:In},n,a){return globalThis.singlefile.getPageData(e,t,n,a)}(a,{fetch:ai},null,null),!(a.saveToGDrive||a.saveWithWebDAV||a.saveWithMCP||a.saveToGitHub||a.saveToDropbox||a.saveWithCompanion||a.saveToRestFormApi||a.saveToS3)){const e=await $o(r.filename,a);o=e.skipped,a.filenameConflictAction=e.filenameConflictAction}if(!o){let{content:o,mimeType:i}=r;if(a.compressContent&&(o=new Blob([new Uint8Array(o)],{type:i})),a.saveToGDrive?(o instanceof Blob||(o=new Blob([o],{type:i})),await Ho(e.taskId,Bo(r.filename),o,{forceWebAuthFlow:a.forceWebAuthFlow},{filenameConflictAction:a.filenameConflictAction})):a.saveToDropbox?(o instanceof Blob||(o=new Blob([o],{type:i})),await Vo(e.taskId,Bo(r.filename),o,{filenameConflictAction:a.filenameConflictAction})):a.saveWithWebDAV?await zo(e.taskId,Bo(r.filename),o,a.webDAVURL,a.webDAVUser,a.webDAVPassword,{filenameConflictAction:a.filenameConflictAction}):a.saveWithMCP?await Ko(e.taskId,Bo(r.filename),o,a.mcpServerUrl,a.mcpAuthToken,{filenameConflictAction:a.filenameConflictAction}):a.saveToGitHub?await(await jo(e.taskId,Bo(r.filename),o,a.githubToken,a.githubUser,a.githubRepository,a.githubBranch,{filenameConflictAction:a.filenameConflictAction})).pushPromise:a.saveWithCompanion&&!a.compressContent?await ia({filename:r.filename,content:r.content,title:r.title,url:a.url,filenameConflictAction:a.filenameConflictAction}):a.saveToRestFormApi?await Qo(e.taskId,r.filename,o,a.url,a.saveToRestFormApiToken,a.saveToRestFormApiUrl,a.saveToRestFormApiFileFieldName,a.saveToRestFormApiUrlFieldName):a.saveToS3?(o instanceof Blob||(o=new Blob([o],{type:i})),await qo(e.taskId,r.filename,o,a.S3Domain,a.S3Region,a.S3Bucket,a.S3AccessKey,a.S3SecretKey,{filenameConflictAction:a.filenameConflictAction})):(o instanceof Blob||(o=new Blob([o],{type:i})),r.url=URL.createObjectURL(o),await Xo(r,a)),a.openSavedPage){const e={active:!0,url:"/src/ui/pages/viewer.html?compressed=true&blobURI="+URL.createObjectURL(o),windowId:t.windowId},a=t.index;try{await browser.tabs.get(n),e.index=a+1}catch(t){e.index=a}browser.tabs.create(e)}r.hash&&await ha(r.hash,a.woleetKey)}}}finally{e.taskId?Yn(e.taskId):a.autoClose&&(browser.tabs.remove(ei[n]||n),delete ei[n]),r&&r.url&&URL.revokeObjectURL(r.url),ln(n,!0)}}}async function ai(e,t={}){const n=await Me(e,t);return{status:n.status,headers:{get:e=>n.headers[e]},arrayBuffer:()=>n.arrayBuffer}}async function ri(e,t){return e.method.endsWith(".init")&&(await async function(e,t){await d(e.id);const n=await m(e.id);n[e.id].savedPageDetected=t.savedPageDetected,await h(n)}(t.tab,e),Jt(t.tab),function(e){ta(e.id,!1)}(t.tab),async function(e){const[t,n]=await Promise.all([fe(e.url,!0),Ee(e)]);t&&(t.autoSaveLoad||t.autoSaveLoadOrUnload)&&n&&Gn([e],{autoSave:!0})}(t.tab)),e.method.endsWith(".getOptions")?fe(e.url):(e.method.endsWith(".activate")&&await browser.tabs.update(e.tabId,{active:!0}),e.method.endsWith(".getScreenshot")?oi(t.tab.id,e):void 0)}async function oi(e,t){const{width:n,height:a,scale:r=1}=t,o=Math.floor(n*r),i=Math.floor(a*r);let s,c,l,u=0,d=0;browser.tabs.captureTab?c=4096:(c=t.innerHeight,l=(await browser.tabs.query({active:!0,currentWindow:!0}))[0].id);const f=Math.floor(c*r);await browser.tabs.sendMessage(e,{method:"content.beginScrollTo"});try{s=new OffscreenCanvas(o,i);const t=s.getContext("2d");for(;u{s.onload=e,s.onerror=e=>t(new Error(e.detail)),s.src=r});const l=Math.min(i-d,f);t.drawImage(s,0,d,o,l),u+=c,d+=f}browser.tabs.captureTab||await browser.tabs.update(l,{active:!0})}catch(n){if(r>.1)return t.scale=.75*r,oi(e,t);throw n}finally{await browser.tabs.sendMessage(e,{method:"content.endScrollTo"})}if(s)return URL.createObjectURL(await s.convertToBlob({type:"image/png"}))}browser.tabs.onCreated.addListener(e=>function(e){!function(e){Jt(e)}(e)}(e)),browser.tabs.onActivated.addListener(e=>async function(e){const t=await browser.tabs.get(e.tabId);dn(t)}(e)),browser.tabs.onRemoved.addListener(e=>function(e){ta(e),d(e),function(e){Ue.delete(e)}(e),async function(e){const t=Yo[e];t?t.autoSaveRemove&&(delete Yo[e],await ni(t,t.tab)):Yo[e]={removed:!0}}(e)}(e)),browser.tabs.onUpdated.addListener((e,t)=>async function(e,t){if("complete"==t.status){setTimeout(async()=>{try{await browser.tabs.sendMessage(e,{method:"content.maybeInit"})}catch(e){}},1500),function(e){delete Yo[e]}(e);const t=await browser.tabs.get(e);if(_e(t)){const e=await m(t.id);e[t.id].editorDetected=!0,await h(e),dn(t)}}t.discarded&&async function(e){const t=Yo[e];t?(delete Yo[e],await ni(t,t.tab)):Yo[e]={discarded:!0}}(e)}(e,t)),browser.tabs.onReplaced.addListener((e,t)=>function(e,t){(async function(e,t){let n=await m();await u(n,e,t),h(n),await u(c,e,t)})(e,t),async function(e,t){Yo[t]&&!Yo[e]&&(Yo[e]=Yo[t],delete Yo[t],ei[t]=e)}(e,t),function(e,t){Mn.forEach(n=>{n.tab.id==t&&(n.tab.id=e)})}(e,t)}(e,t));const ii="/src/ui/pages/options.html",si=3e5,ci=new Map;let li=0;async function ui(e,t={}){const n=e&&e.id;if(!n)throw new Error("Cannot identify the extension requesting SingleFile capture");const a=await oe();if(a.allowedExtensionIds.includes(n))return!0;if(a.deniedExtensionIds.includes(n))return!1;const{request:r,created:o}=function(e,t,n={}){const a=Array.from(ci.values()).find(t=>t.extensionId==e);if(a)return{request:a,created:!1};const r=String(++li);let o;const i=new Promise(e=>o=e),s={id:r,extensionId:e,displayName:mi(n.displayName),url:t.url,origin:t.origin,resolvePermission:o,promise:i};return s.timeoutId=setTimeout(()=>fi(s,!1),si),ci.set(r,s),{request:s,created:!0}}(n,e,t);return o&&await async function(e){const t=new URLSearchParams({externalCaptureRequestId:e.id}),n=browser.runtime.getURL(`${ii}?${t.toString()}`),a=await browser.tabs.create({active:!0,url:n});e.tabId=a.id}(r),r.promise}async function di(e,t){if(!function(e){return Boolean(e)&&e.id==browser.runtime.id&&Boolean(e.url)&&e.url.startsWith(browser.runtime.getURL(ii))}(t))throw new Error("Unauthorized sender");return e.method.endsWith(".getPermissions")?oe():e.method.endsWith(".setPermissions")?(await ie(e.permissions),{}):e.method.endsWith(".getPendingRequest")?function(e){const t=ci.get(e);if(t)return{id:t.id,extensionId:t.extensionId,displayName:t.displayName,url:t.url,origin:t.origin}}(e.requestId):e.method.endsWith(".respondPendingRequest")?async function(e,t){const n=ci.get(e);if(!n)return{found:!1};const a=await oe(),r=a.allowedExtensions.filter(e=>e.id!=n.extensionId),o=a.deniedExtensions.filter(e=>e.id!=n.extensionId),i={id:n.extensionId,name:n.displayName};t?r.push(i):o.push(i);return await ie({allowedExtensions:r,deniedExtensions:o}),fi(n,t),{found:!0,approved:Boolean(t)}}(e.requestId,e.approved):void 0}function fi(e,t){ci.has(e.id)&&(ci.delete(e.id),clearTimeout(e.timeoutId),e.resolvePermission(Boolean(t)))}function mi(e){return"string"!=typeof e?"":e.trim().replace(/\s+/g," ").slice(0,80)}browser.tabs.onRemoved&&browser.tabs.onRemoved.addListener(e=>{Array.from(ci.values()).filter(t=>t.tabId==e).forEach(e=>fi(e,!1))}),browser.runtime.onMessage.addListener((e,t)=>{if("singlefile.frameTree.initResponse"==e.method||"singlefile.frameTree.ackInitRequest"==e.method)return browser.tabs.sendMessage(t.tab.id,e,{frameId:0}),Promise.resolve({})});const hi=new Map;function wi(e,t){e.delete(t)}browser.runtime.onMessage.addListener((e,t)=>{if("singlefile.lazyTimeout.setTimeout"==e.method){let n,a=hi.get(t.tab.id);if(a)if(n=a.get(t.frameId),n){const t=n.get(e.type);t&&clearTimeout(t)}else n=new Map;const r=setTimeout(async()=>{try{const n=hi.get(t.tab.id),a=n.get(t.frameId);n&&a&&wi(a,e.type),await browser.tabs.sendMessage(t.tab.id,{method:"singlefile.lazyTimeout.onTimeout",type:e.type})}catch(e){}},e.delay);return a||(a=new Map,n=new Map,a.set(t.frameId,n),hi.set(t.tab.id,a)),n.set(e.type,r),Promise.resolve({})}if("singlefile.lazyTimeout.clearTimeout"==e.method){let n=hi.get(t.tab.id);if(n){const a=n.get(t.frameId);if(a){const t=a.get(e.type);t&&clearTimeout(t),wi(a,e.type)}}return Promise.resolve({})}}),browser.tabs.onRemoved.addListener(e=>hi.delete(e));const pi=["removeHiddenElements","removedElementsSelector","removeUnusedStyles","removeUnusedFonts","removeFrames","removeNoScriptTags","removeSavedDate","removeAlternativeFonts","removeAlternativeMedias","removeAlternativeImages","compressHTML","groupDuplicateImages","maxSizeDuplicateImages","groupDuplicateStylesheets","moveStylesInHead","imageReductionFactor","imageQuality","loadDeferredContent","loadDeferredContentBlockCookies","loadDeferredContentBlockStorage","loadDeferredContentKeepZoomLevel","loadDeferredContentDispatchScrollEvent","loadDeferredContentBeforeFrames","loadDeferredContentMinZoomFactor","loadDeferredImages","loadDeferredImagesBlockCookies","loadDeferredImagesBlockStorage","loadDeferredImagesKeepZoomLevel","loadDeferredImagesDispatchScrollEvent","loadDeferredImagesBeforeFrames","blockImages","blockAlternativeImages","blockStylesheets","blockFonts","blockScripts","blockVideos","blockAudios","blockMixedContent","maxResourceSizeEnabled","maxResourceSize","saveRawPage","saveFavicon","saveOriginalURLs","resolveLinks","resolveFragmentIdentifierURLs","includeBOM","insertMetaNoIndex","insertMetaCSP","insertSingleFileComment","includeInfobar","infobarTemplate","openInfobar","animateInfobar","displayStats","filenameTemplate","selected","optionallySelected"];async function bi(e){return(await browser.tabs.query(e)).sort((e,t)=>e.index-t.index)}browser.runtime.onMessage.addListener((e,t)=>e.method.startsWith("tabs.")?ri(e,t):e.method.startsWith("downloads.")?Lo(e,t):e.method.startsWith("autosave.")?async function(e,t){if(e.method.endsWith(".save"))return e.autoSaveDiscard||e.autoSaveRemove?(t.tab?(e.tab=t.tab,Yo[t.tab.id]=e):Yo[e.tabId]&&(Yo[e.tabId].removed&&e.autoSaveRemove||Yo[e.tabId].discarded&&e.autoSaveDiscard)&&(delete Yo[e.tabId],await ni(e,{id:e.tabId,index:e.tabIndex,url:t.url})),e.autoSaveUnload&&(delete Yo[e.tabId],await ni(e,t.tab))):(delete Yo[e.tabId],await ni(e,t.tab)),{}}(e,t):e.method.startsWith("ui.")?an(e,t):e.method.startsWith("config.")?ue(e):e.method.startsWith("tabsData.")?function(e){return e.method.endsWith(".get")?m():e.method.endsWith(".set")?h(e.tabsData):void 0}(e):e.method.startsWith("editor.")?async function(e,t){if(e.method.endsWith(".getTabData")){const e=t.tab,n=Ue.get(e.id);if(n){const t=await fe(n.url),a=JSON.stringify(n);for(let r=0;r*PePe,o.truncated?(o.finished=(r+1)*Pe>=a.length,o.content=a.substring(r*Pe,(r+1)*Pe),o.finished&&(o.options=t)):(o.content=a,t.embeddedImage=n.embeddedImage,o.options=t),await browser.tabs.sendMessage(e.id,o)}}return{}}if(e.method.endsWith(".open")){let n;const a=t.tab;if(e.truncated?(n=De.get(a.id),n||(n=[],De.set(a.id,n)),n.push(e.content),e.finished&&De.delete(a.id)):e.content&&(n=[e.content]),!e.truncated||e.finished){const t={url:Re};await browser.tabs.update(a.id,t);const r=e.compressContent?n.flat():n.join("");Ue.set(a.id,{url:a.url,content:r,filename:e.filename,compressContent:e.compressContent,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,extractDataFromPageTags:e.extractDataFromPageTags,insertTextBody:e.insertTextBody,insertMetaCSP:e.insertMetaCSP,embeddedImage:e.embeddedImage})}return{}}}(e,t):e.method.startsWith("bookmarks.")?ca(e):e.method.startsWith("companion.")?async function(e){if(e.method.endsWith(".state"))return{enabled:!0}}(e):e.method.startsWith("requests.")?qe(e):e.method.startsWith("externalCapture.")?di(e,t):e.method.startsWith("bootstrap.")?async function(e,t){if(e.method.endsWith(".init")){const[e,n,a]=await Promise.all([fe(t.tab.url,!0),fe(t.tab.url),Ee(t.tab)]);return{optionsAutoSave:e,options:n,autoSaveEnabled:a,tabId:t.tab.id,tabIndex:t.tab.index}}}(e,t):"ping"==e.method?Promise.resolve({}):void 0),browser.runtime.onMessageExternal&&browser.runtime.onMessageExternal.addListener(async function(e,t){if("save-page"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,await Gn(e)}else if("edit-and-save-page"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,await Gn(e,{openEditor:!0})}else if("save-selected-links"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});await Hn(e[0])}else if("save-selected-content"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});await Gn(e,{selected:!0})}else if("save-selected-tabs"==e){const e=await bi({currentWindow:!0,highlighted:!0});await Gn(e)}else if("save-unpinned-tabs"==e){const e=await bi({currentWindow:!0,pinned:!1});await Gn(e)}else if("save-all-tabs"==e){const e=await bi({currentWindow:!0});await Gn(e)}else{if(e&&"capture-page"==e.method){const n=function(e){const{config:t}=e;if(null==t)return{};if("object"!=typeof t||Array.isArray(t))throw new Error("SingleFile capture config must be an object");const n={};return pi.forEach(e=>{void 0!==t[e]&&(n[e]=t[e])}),n}(e),a=e.tabId?await browser.tabs.get(e.tabId):(await browser.tabs.query({currentWindow:!0,active:!0}))[0];if(!await ui(t,e))throw new Error("SingleFile capture was not approved for this extension");return!!a&&async function(e,t={}){const n=e.id,a=await fe(e.url);if(a.profileName==x)throw new Error("SingleFile is disabled for this URL");let r;Object.assign(a,t,{silent:!0,logsEnabled:!1,progressBarEnabled:!1,confirmFilename:!1,confirmInfobarContent:!1,openEditor:!1,autoOpenEditor:!1,openSavedPage:!1,backgroundSave:!1,saveToClipboard:!1,saveToGDrive:!1,saveToDropbox:!1,saveWithWebDAV:!1,saveWithMCP:!1,saveToGitHub:!1,saveWithCompanion:!1,saveToRestFormApi:!1,saveToS3:!1,sharePage:!1,tabId:n,tabIndex:e.index,extensionScriptFiles:Nn}),await Zn();try{r=await Un(n,a)}catch(e){}if(r||_e(e))return new Promise((t,n)=>{Jn({status:Wn,tab:{id:e.id,index:e.index,url:e.url,title:e.title},options:a,method:"content.capture",resolve:t,reject:n}).cancel=()=>n(new Error("SingleFile capture was cancelled")),Xn()});throw new Error("Cannot access the tab contents")}(a,n)}if(e&&e.method){const t=(await browser.tabs.query({currentWindow:!0,active:!0}))[0];return!!t&&ti(e,t)}}})}(); diff --git a/lib/single-file-extension-bootstrap.js b/lib/single-file-extension-bootstrap.js index 6fba63901..35485dadb 100644 --- a/lib/single-file-extension-bootstrap.js +++ b/lib/single-file-extension-bootstrap.js @@ -1 +1 @@ -!function(){"use strict";const e=33554432,t=1048576,o=globalThis.singlefileBootstrap,n=new Map;let a,r,s,i,d,c,l,u,m,h,f,v,p,y;function E(e){"Escape"==e.key&&o.cancelSave&&(e.preventDefault(),e.stopPropagation(),"keyup"==e.type&&o.cancelSave())}async function g(){if(document.documentElement.dataset&&void 0!==document.documentElement.dataset.sfz){const e=await S();document.querySelectorAll("#sfz-error-message").forEach(e=>e.remove()),function(e){document.dispatchEvent(new CustomEvent("single-file-bootstrap",{detail:{data:e}}))}(e)}else if(document.body&&1==document.body.childNodes.length&&"PRE"==document.body.childNodes[0].tagName&&/]* data-sfz[^>]*>/i.test(document.body.childNodes[0].textContent)){const e=(new DOMParser).parseFromString(document.body.childNodes[0].textContent,"text/html");document.replaceChild(e.documentElement,document.documentElement),document.querySelectorAll("script").forEach(e=>{const t=document.createElement("script");t.textContent=e.textContent,e.parentElement.replaceChild(t,e)}),await g()}}function S(){return new Promise((e,t)=>{const o=new XMLHttpRequest;o.open("GET",location.href),o.send(),o.responseType="arraybuffer",o.onload=()=>e(new Uint8Array(o.response)),o.onerror=()=>{const o=document.getElementById("sfz-error-message");o&&o.remove();const a=n.size;n.set(a,{resolve:e,reject:t}),browser.runtime.sendMessage({method:"singlefile.fetch",requestId:a,url:location.href})}})}async function b(e){return d&&"content.autosave"==e.method?(async function(e){r=e.options,"complete"!=document.readyState&&await new Promise(e=>globalThis.addEventListener("load",e));await T(),r.autoSaveRepeat&&setTimeout(()=>{d&&!l&&(u=!1,r.autoSaveDelay=0,b(e))},1e3*r.autoSaveRepeatDelay)}(e),{}):"content.maybeInit"==e.method?(w(),{}):"content.init"==e.method?(r=e.options,d=e.autoSaveEnabled,R(),{}):"content.openEditor"==e.method?(_(document)?M(document):R(),{}):"singlefile.fetchResponse"==e.method?await async function(e){const t=n.get(e.requestId);if(t)return e.error?(t.reject(new Error(e.error)),n.delete(e.requestId)):(e.truncated&&(t.array?t.array=t.array.concat(e.array):(t.array=e.array,n.set(e.requestId,t)),e.finished&&(e.array=t.array)),e.truncated&&!e.finished||(t.resolve(e.array),n.delete(e.requestId))),{}}(e):void 0}function w(){const e=document.querySelector("singlefile-infobar");e&&e.remove(),m==location.href||o.pageInfo.processing||(u=!1,m=location.href,browser.runtime.sendMessage({method:"tabs.init",savedPageDetected:_(document)}).catch(()=>{}),browser.runtime.sendMessage({method:"ui.processInit"}).catch(()=>{}))}async function T(){const e=o.helper;if((!l||c)&&!u)if(l=!0,r.autoSaveDelay&&!c)await new Promise(e=>c=setTimeout(e,1e3*r.autoSaveDelay)),await T();else{const t=globalThis[e.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];let n,a=[];c=null,!r.removeFrames&&globalThis.frames&&globalThis.frames.length&&(a=await o.processors.frameTree.getAsync(r)),n=a&&a.sessionId,r.userScriptEnabled&&t&&await t(e.ON_BEFORE_CAPTURE_EVENT_NAME);const s=e.preProcessDoc(document,globalThis,r);I(s,a),n&&o.processors.frameTree.cleanup(n),e.postProcessDoc(document,s.markedElements,s.invalidElements),r.userScriptEnabled&&t&&await t(e.ON_AFTER_CAPTURE_EVENT_NAME),u=!0,l=!1}}function R(){d&&r&&(r.autoSaveUnload||r.autoSaveLoadOrUnload||r.autoSaveDiscard||r.autoSaveRemove)?a||(globalThis.addEventListener("unload",D),document.addEventListener("visibilitychange",A),a=!0):(globalThis.removeEventListener("unload",D),document.removeEventListener("visibilitychange",A),a=!1)}function A(){"hidden"==document.visibilityState&&r.autoSaveDiscard&&C({autoSaveDiscard:r.autoSaveDiscard})}function D(){!u&&(r.autoSaveUnload||r.autoSaveLoadOrUnload||r.autoSaveRemove)&&C({autoSaveUnload:r.autoSaveUnload,autoSaveRemove:r.autoSaveRemove})}function C({autoSaveUnload:e,autoSaveDiscard:t,autoSaveRemove:n}){const a=o.helper,s=globalThis[a.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];let i=[];!r.removeFrames&&globalThis.frames&&globalThis.frames.length&&(i=o.processors.frameTree.getSync(r)),r.userScriptEnabled&&s&&s(a.ON_BEFORE_CAPTURE_EVENT_NAME);I(a.preProcessDoc(document,globalThis,r),i,{autoSaveUnload:e,autoSaveDiscard:t,autoSaveRemove:n})}function I(e,t,{autoSaveUnload:n,autoSaveDiscard:a,autoSaveRemove:d}={}){const c=o.helper,l=o.pageInfo.visitDate.getTime();browser.runtime.sendMessage({method:"autosave.save",tabId:s,tabIndex:i,taskId:r.taskId,content:c.serialize(document),canvases:e.canvases,fonts:e.fonts,stylesheets:e.stylesheets,images:e.images,posters:e.posters,usedFonts:e.usedFonts,shadowRoots:e.shadowRoots,videos:e.videos,referrer:e.referrer,adoptedStyleSheets:e.adoptedStyleSheets,worklets:e.worklets,frames:t,url:location.href,visitDate:l,autoSaveUnload:n,autoSaveDiscard:a,autoSaveRemove:d})}async function M(n){let a;f?(a=await S(),function(e){const o=e instanceof Uint8Array?e:new Uint8Array(e),n=new TextDecoder("windows-1252"),a=n.decode(o.subarray(0,t)),r=o.length>t?n.decode(o.subarray(o.length-t)):"";v=a.includes("")||r.includes(""),p=a.includes("
"),y=a.includes("http-equiv=content-security-policy")}(a)):(o.helper.markInvalidNesting(n),N(n),a=o.helper.serialize(n));for(let t=0;t*ee,o.truncated?(o.finished=(t+1)*e>a.length,a instanceof Uint8Array?o.content=Array.from(a.subarray(t*e,(t+1)*e)):o.content=a.substring(t*e,(t+1)*e)):(o.embeddedImage=await U(a),o.content=a instanceof Uint8Array?Array.from(a):a),await browser.runtime.sendMessage(o)}}async function U(e){if(137==e[0]&&80==e[1]&&78==e[2]&&71==e[3]){let t=new Blob([new Uint8Array(e)],{type:"image/png"});const o=URL.createObjectURL(t),n=new Image;n.src=o,await new Promise((e,t)=>{n.onload=e,n.onerror=t});const a=new OffscreenCanvas(n.width,n.height);a.getContext("2d").drawImage(n,0,0),t=await a.convertToBlob({type:"image/png"});const r=await t.arrayBuffer();return Array.from(new Uint8Array(r))}}function _(e){if(void 0===h){const t=o.helper,n=e.documentElement.firstChild;f=e.documentElement.dataset&&""==e.documentElement.dataset.sfz,v=Boolean(e.querySelector("sfz-extra-data")),p=Boolean(e.querySelector("body > main[hidden]")),y=Boolean(e.querySelector("meta[http-equiv=content-security-policy]")),h=f||n.nodeType==Node.COMMENT_NODE&&(n.textContent.includes(t.COMMENT_HEADER)||n.textContent.includes(t.COMMENT_HEADER_LEGACY))}return h}function N(e){e.querySelectorAll("*").forEach(e=>{const t=o.helper.getShadowRoot(e);if(t){N(t);const o=document.createElement("template");o.setAttribute("shadowrootmode","open"),Array.from(t.childNodes).forEach(e=>o.appendChild(e)),e.appendChild(o)}})}o.pageInfo={visitDate:new Date},browser.runtime.sendMessage({method:"bootstrap.init"}).then(e=>{r=e.optionsAutoSave;const t=e.options;s=e.tabId,i=e.tabIndex,d=e.autoSaveEnabled,t&&t.autoOpenEditor&&_(document)?"loading"==document.readyState?document.addEventListener("DOMContentLoaded",()=>M(document)):M(document):"loading"==document.readyState?document.addEventListener("DOMContentLoaded",R):R()}),browser.runtime.onMessage.addListener(e=>{if(d&&"content.autosave"==e.method||"content.maybeInit"==e.method||"content.init"==e.method||"content.openEditor"==e.method||"singlefile.fetchResponse"==e.method)return b(e)}),addEventListener("keydown",E,!0),addEventListener("keyup",E,!0),document.addEventListener("DOMContentLoaded",w,!1),globalThis.window==globalThis.top&&location&&location.href&&(location.href.startsWith("file://")||location.href.startsWith("content://"))&&("loading"==document.readyState?document.addEventListener("DOMContentLoaded",g,!1):g())}(); +!function(){"use strict";const e=33554432,t=1048576,o=globalThis.singlefileBootstrap,n=new Map;let a,r,s,i,d,c,l,u,m,h,f,v,p,y;function E(e){"Escape"==e.key&&o.cancelSave&&(e.preventDefault(),e.stopPropagation(),"keyup"==e.type&&o.cancelSave())}async function g(){if(document.documentElement.dataset&&void 0!==document.documentElement.dataset.sfz){const e=await S();document.querySelectorAll("#sfz-error-message").forEach(e=>e.remove()),function(e){document.dispatchEvent(new CustomEvent("single-file-bootstrap",{detail:{data:e}}))}(e)}else if(document.body&&1==document.body.childNodes.length&&"PRE"==document.body.childNodes[0].tagName&&/]* data-sfz[^>]*>/i.test(document.body.childNodes[0].textContent)){const e=(new DOMParser).parseFromString(document.body.childNodes[0].textContent,"text/html");document.replaceChild(e.documentElement,document.documentElement),document.querySelectorAll("script").forEach(e=>{const t=document.createElement("script");t.textContent=e.textContent,e.parentElement.replaceChild(t,e)}),await g()}}function S(){return new Promise((e,t)=>{const o=new XMLHttpRequest;o.open("GET",location.href),o.send(),o.responseType="arraybuffer",o.onload=()=>e(new Uint8Array(o.response)),o.onerror=()=>{const o=document.getElementById("sfz-error-message");o&&o.remove();const a=n.size;n.set(a,{resolve:e,reject:t}),browser.runtime.sendMessage({method:"singlefile.fetch",requestId:a,url:location.href})}})}async function b(e){return d&&"content.autosave"==e.method?(async function(e){r=e.options,"complete"!=document.readyState&&await new Promise(e=>globalThis.addEventListener("load",e));await T(),r.autoSaveRepeat&&setTimeout(()=>{d&&!l&&(u=!1,r.autoSaveDelay=0,b(e))},1e3*r.autoSaveRepeatDelay)}(e),{}):"content.maybeInit"==e.method?(w(),{}):"content.init"==e.method?(r=e.options,d=e.autoSaveEnabled,R(),{}):"content.openEditor"==e.method?(_(document)?M(document):R(),{}):"singlefile.fetchResponse"==e.method?await async function(e){const t=n.get(e.requestId);if(t)return e.error?(t.reject(new Error(e.error)),n.delete(e.requestId)):(e.truncated&&(t.array?t.array=t.array.concat(e.array):(t.array=e.array,n.set(e.requestId,t)),e.finished&&(e.array=t.array)),e.truncated&&!e.finished||(t.resolve(e.array),n.delete(e.requestId))),{}}(e):void 0}function w(){const e=document.querySelector("singlefile-infobar");e&&e.remove(),m==location.href||o.pageInfo.processing||(u=!1,m=location.href,browser.runtime.sendMessage({method:"tabs.init",savedPageDetected:_(document)}).catch(()=>{}),browser.runtime.sendMessage({method:"ui.processInit"}).catch(()=>{}))}async function T(){const e=o.helper;if((!l||c)&&!u)if(l=!0,r.autoSaveDelay&&!c)await new Promise(e=>c=setTimeout(e,1e3*r.autoSaveDelay)),await T();else{const t=globalThis[e.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];let n,a=[];c=null,!r.removeFrames&&globalThis.frames&&globalThis.frames.length&&(a=await o.processors.frameTree.getAsync(r)),n=a&&a.sessionId,r.userScriptEnabled&&t&&await t(e.ON_BEFORE_CAPTURE_EVENT_NAME);const s=e.preProcessDoc(document,globalThis,r);I(s,a),n&&o.processors.frameTree.cleanup(n),e.postProcessDoc(document,s.markedElements,s.invalidElements),r.userScriptEnabled&&t&&await t(e.ON_AFTER_CAPTURE_EVENT_NAME),u=!0,l=!1}}function R(){d&&r&&(r.autoSaveUnload||r.autoSaveLoadOrUnload||r.autoSaveDiscard||r.autoSaveRemove)?a||(globalThis.addEventListener("unload",D),document.addEventListener("visibilitychange",A),a=!0):(globalThis.removeEventListener("unload",D),document.removeEventListener("visibilitychange",A),a=!1)}function A(){"hidden"==document.visibilityState&&r.autoSaveDiscard&&C({autoSaveDiscard:r.autoSaveDiscard})}function D(){!u&&(r.autoSaveUnload||r.autoSaveLoadOrUnload||r.autoSaveRemove)&&C({autoSaveUnload:r.autoSaveUnload,autoSaveRemove:r.autoSaveRemove})}function C({autoSaveUnload:e,autoSaveDiscard:t,autoSaveRemove:n}){const a=o.helper,s=globalThis[a.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];let i=[];!r.removeFrames&&globalThis.frames&&globalThis.frames.length&&(i=o.processors.frameTree.getSync(r)),r.userScriptEnabled&&s&&s(a.ON_BEFORE_CAPTURE_EVENT_NAME);I(a.preProcessDoc(document,globalThis,r),i,{autoSaveUnload:e,autoSaveDiscard:t,autoSaveRemove:n})}function I(e,t,{autoSaveUnload:n,autoSaveDiscard:a,autoSaveRemove:d}={}){const c=o.helper,l=o.pageInfo.visitDate.getTime();browser.runtime.sendMessage({method:"autosave.save",tabId:s,tabIndex:i,taskId:r.taskId,content:c.serialize(document),canvases:e.canvases,fonts:e.fonts,stylesheets:e.stylesheets,images:e.images,posters:e.posters,usedFonts:e.usedFonts,shadowRoots:e.shadowRoots,videos:e.videos,referrer:e.referrer,adoptedStyleSheets:e.adoptedStyleSheets,worklets:e.worklets,frames:t,url:location.href,visitDate:l,autoSaveUnload:n,autoSaveDiscard:a,autoSaveRemove:d})}async function M(n){let a;f?(a=await S(),function(e){const o=e instanceof Uint8Array?e:new Uint8Array(e),n=new TextDecoder("windows-1252"),a=n.decode(o.subarray(0,t)),r=o.length>t?n.decode(o.subarray(o.length-t)):"";v=a.includes("")||r.includes(""),p=a.includes("
"),y=a.includes("http-equiv=content-security-policy")}(a)):(o.helper.markInvalidNesting(n),N(n),a=o.helper.serialize(n));for(let t=0;t*ee,o.truncated?(o.finished=(t+1)*e>=a.length,a instanceof Uint8Array?o.content=Array.from(a.subarray(t*e,(t+1)*e)):o.content=a.substring(t*e,(t+1)*e)):(o.embeddedImage=await U(a),o.content=a instanceof Uint8Array?Array.from(a):a),await browser.runtime.sendMessage(o)}}async function U(e){if(137==e[0]&&80==e[1]&&78==e[2]&&71==e[3]){let t=new Blob([new Uint8Array(e)],{type:"image/png"});const o=URL.createObjectURL(t),n=new Image;n.src=o,await new Promise((e,t)=>{n.onload=e,n.onerror=t});const a=new OffscreenCanvas(n.width,n.height);a.getContext("2d").drawImage(n,0,0),t=await a.convertToBlob({type:"image/png"});const r=await t.arrayBuffer();return Array.from(new Uint8Array(r))}}function _(e){if(void 0===h){const t=o.helper,n=e.documentElement.firstChild;f=e.documentElement.dataset&&""==e.documentElement.dataset.sfz,v=Boolean(e.querySelector("sfz-extra-data")),p=Boolean(e.querySelector("body > main[hidden]")),y=Boolean(e.querySelector("meta[http-equiv=content-security-policy]")),h=f||n.nodeType==Node.COMMENT_NODE&&(n.textContent.includes(t.COMMENT_HEADER)||n.textContent.includes(t.COMMENT_HEADER_LEGACY))}return h}function N(e){e.querySelectorAll("*").forEach(e=>{const t=o.helper.getShadowRoot(e);if(t){N(t);const o=document.createElement("template");o.setAttribute("shadowrootmode","open"),Array.from(t.childNodes).forEach(e=>o.appendChild(e)),e.appendChild(o)}})}o.pageInfo={visitDate:new Date},browser.runtime.sendMessage({method:"bootstrap.init"}).then(e=>{r=e.optionsAutoSave;const t=e.options;s=e.tabId,i=e.tabIndex,d=e.autoSaveEnabled,t&&t.autoOpenEditor&&_(document)?"loading"==document.readyState?document.addEventListener("DOMContentLoaded",()=>M(document)):M(document):"loading"==document.readyState?document.addEventListener("DOMContentLoaded",R):R()}),browser.runtime.onMessage.addListener(e=>{if(d&&"content.autosave"==e.method||"content.maybeInit"==e.method||"content.init"==e.method||"content.openEditor"==e.method||"singlefile.fetchResponse"==e.method)return b(e)}),addEventListener("keydown",E,!0),addEventListener("keyup",E,!0),document.addEventListener("DOMContentLoaded",w,!1),globalThis.window==globalThis.top&&location&&location.href&&(location.href.startsWith("file://")||location.href.startsWith("content://"))&&("loading"==document.readyState?document.addEventListener("DOMContentLoaded",g,!1):g())}(); diff --git a/lib/single-file-extension.js b/lib/single-file-extension.js index a5379be96..c957db5fa 100644 --- a/lib/single-file-extension.js +++ b/lib/single-file-extension.js @@ -1 +1 @@ -!function(){"use strict";const t=[0],e=Symbol(),n=new TextEncoder,r=new TextDecoder,o=new Array(256);let a=0;function i(e,n,r,i){if(void 0===i){if(a++,!(o.length-a>=t.length))throw new Error("Reached maximum number of custom types");o[o.length-a]={serialize:e,parse:n,test:r}}else o[i]={serialize:e,parse:n,test:r}}async function s(t,e){const n=d(t,e);let r=new Uint8Array([]);for await(const t of n){const e=r;r=new Uint8Array(e.length+t.length),r.set(e,0),r.set(t,e.length)}return r}i(async function(t,e){const n=t.objects.indexOf(e);await u(t,n)},async function(t){const e=await v(t);return new y(e,t)},P,0),i(null,function(){return{}},x),i(f,E,R),i(m,S,function(t){return"string"==typeof t}),i(p,async function(t){const e=await v(t),n=await t.consume(8*e);return new Float64Array(n.buffer)},function(t){return"Float64Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(4*e);return new Float32Array(n.buffer)},function(t){return"Float32Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(4*e);return new Uint32Array(n.buffer)},function(t){return"Uint32Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(4*e);return new Int32Array(n.buffer)},function(t){return"Int32Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(2*e);return new Uint16Array(n.buffer)},function(t){return"Uint16Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(2*e);return new Int16Array(n.buffer)},function(t){return"Int16Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(e);return new Uint8ClampedArray(n.buffer)},function(t){return"Uint8ClampedArray"==t.constructor.name}),i(p,async function(t){const e=await v(t);return await t.consume(e)},function(t){return"Uint8Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(e);return new Int8Array(n.buffer)},function(t){return"Int8Array"==t.constructor.name}),i(async function(t,e){await u(t,e.byteLength),await t.append(new Uint8Array(e))},async function(t){const e=await v(t);return(await t.consume(e)).buffer},function(t){return"ArrayBuffer"==t.constructor.name}),i(h,C,U),i(async function(t,e){const n=new Uint8Array(new Uint32Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(4);return new Uint32Array(e.buffer)[0]},function(t){return k(t)&&t>=0&&t<=4294967295}),i(async function(t,e){const n=new Uint8Array(new Int32Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(4);return new Int32Array(e.buffer)[0]},function(t){return k(t)&&t>=-2147483648&&t<=2147483647}),i(async function(t,e){const n=new Uint8Array(new Uint16Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(2);return new Uint16Array(e.buffer)[0]},function(t){return k(t)&&t>=0&&t<=65535}),i(async function(t,e){const n=new Uint8Array(new Int16Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(2);return new Int16Array(e.buffer)[0]},function(t){return k(t)&&t>=-32768&&t<=32767}),i(async function(t,e){const n=new Uint8Array([e]);await t.append(n)},async function(t){const e=await t.consume(1);return new Uint8Array(e.buffer)[0]},function(t){return k(t)&&t>=0&&t<=255}),i(async function(t,e){const n=new Uint8Array(new Int8Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(1);return new Int8Array(e.buffer)[0]},function(t){return k(t)&&t>=-128&&t<=127}),i(null,function(){return},function(t){return void 0===t}),i(null,function(){return null},function(t){return null===t}),i(null,function(){return NaN},function(t){return Number.isNaN(t)}),i(g,T,function(t){return"boolean"==typeof t}),i(async function(t,e){await m(t,e.description)},async function(t){const e=await S(t);return Symbol(e)},D),i(null,function(){return e},L),i(async function(t,e){const n=e.entries();await u(t,e.size);for(const[e,r]of n)await u(t,e),await u(t,r)},async function(t){const e=await v(t),n=new Map;e&&await async function r(o=0){const a=await v(t),i=await v(t);t.setObject([a,i],(t,e)=>n.set(t,e)),on.add(t)),othis.value.length){const e=this.value.length-this.offset;await this.append(new Uint8Array(t).subarray(0,e)),await this.appendData({value:this.value}),this.offset=0,await this.append(new Uint8Array(t).subarray(e))}else this.value.set(t,this.offset),this.offset+=t.length}async flush(){this.offset&&await this.appendData({value:new Uint8Array(this.value).subarray(0,this.offset),done:!0})}}function d(t,{chunkSize:e=8388608}={}){let n,r,o,a,i,s;return{[Symbol.asyncIterator]:()=>({next:()=>a?{done:a}:async function(){s?s():l().catch(()=>{});i=new Promise(t=>s=t);const t=await async function(){const{value:t,done:e}=await r;a=e,e||d();return t}();return{value:t}}(),return:()=>({done:!0})})};async function l(){d(),n=new c(f,e),await u(n,t),await n.flush()}function d(){r=new Promise(t=>o=t)}async function f(t){o(t),await i}}async function u(t,e){const n=o.findIndex(({test:n}={})=>n&&n(e,t));t.addObject(e),await t.append(new Uint8Array([n]));const r=o[n].serialize;r&&await r(t,e),0!=n&&x(e)&&(await async function(t,e){const n=Object.getOwnPropertySymbols(e),r=n.map(t=>[t,e[t]]);await f(t,r)}(t,e),await async function(t,e){if(ArrayBuffer.isView(e))await u(t,0);else{let n=Object.entries(e);R(e)&&(n=n.filter(([t])=>!k(Number(t)))),await u(t,n.length);for(const[e,r]of n)await m(t,e),await u(t,r)}}(t,e))}async function f(t,n){await u(t,n.length);const r=Object.keys(n).filter(t=>k(Number(t))).map(t=>Number(t));let o=0,a=r[o];for(const[i,s]of n.entries())a==i?(a=r[++o],await u(t,s)):await u(t,e)}async function m(t,e){const r=n.encode(e);await u(t,r.length),await t.append(r)}async function p(t,e){await u(t,e.length),await t.append("Uint8Array"==e.constructor.name?e:new Uint8Array(e.buffer))}async function h(t,e){const n=new Uint8Array(new Float64Array([e]).buffer);await t.append(n)}async function g(t,e){const n=new Uint8Array([Number(e)]);await t.append(n)}class y{constructor(t,e){this.index=t,this.data=e}getObject(){return this.data.objects[this.index]}}class w{constructor(t){this.stream=new b(t),this.objects=[],this.setters=[]}consume(t){return this.stream.consume(t)}getObjectId(){const t=this.objects.length;return this.objects.push(void 0),t}resolveObject(t,e){B(e)&&!I(e)&&(this.objects[t]=e)}setObject(t,e){this.setters.push({functionArguments:t,setterFunction:e})}executeSetters(){this.setters.forEach(({functionArguments:t,setterFunction:e})=>{e(...t.map(t=>I(t)?t.getObject():t))})}}class b{constructor(t){this.offset=0,this.value=new Uint8Array(0),this.consumeData=t}async consume(t){if(this.offset+t>this.value.length){const e=new Uint8Array(this.value).subarray(this.offset,this.value.length),n=await this.consumeData();return e.length+n.length!=this.value.length&&(this.value=new Uint8Array(e.length+n.length)),this.value.set(e),this.value.set(n,e.length),this.offset=0,this.consume(t)}{const e=this.value.slice(this.offset,this.offset+t);return this.offset+=e.length,e}}}function A(){let t,e,n,r,o,a;return{next:async e=>e?async function(e){o?await o:async function(){let e;r=new Promise(t=>e=t),t=new w(s),i();const n=await v(t);t.executeSetters(),e(n)}().catch(()=>{});return function(){o=new Promise(t=>a=t)}(),n(e),{done:!1}}(e):{value:await r,done:!0},return:()=>({done:!0})};function i(){e=new Promise(t=>n=t)}async function s(){const t=await e;return i(),a&&a(),t}}async function v(t){const e=(await t.consume(1))[0],n=o[e].parse,r=t.getObjectId(),a=await n(t);return 0!=e&&x(a)&&(await async function(t,e){const n=await E(t);t.setObject([n],t=>t.forEach(([t,n])=>e[t]=n))}(t,a),await async function(t,e){const n=await v(t);n&&await r();async function r(o=0){const a=await S(t),i=await v(t);t.setObject([i],t=>e[a]=t),on[o]=t);o{0===t.button&&e()},t.shadowRoot.appendChild(n))}catch(t){}}(n,e)}t.silent||ut(e)}}function dt(){ut(null);const t=document.querySelector(M);t&&t.remove(),it&&it.remove(),vt()}function ut(t){const e=globalThis.singlefileBootstrap;e&&(e.cancelSave=t)}function ft(t,e,n){n.shadowEnabled&&n.progressBarEnabled&&function(t,e){try{const n=document.querySelector(M);if(n){const r=n.shadowRoot.querySelector("."+j);if(r&&e){const n=Math.floor(t/e*100)+"%";r.style.getPropertyValue("width")!=n&&(r.style.setProperty("width",n),r.offsetWidth)}}}catch(t){}}(t,e)}function mt(t){Et("insert-embedded-image",et,"…",t)}function pt(t){Et("insert-embedded-image",et,"✓",t)}function ht(){let t;const e=[],n=getSelection();for(let r=0;r{if("A"==t.tagName&&t.href){const n=new URL(t.href);n.hash="",e.push(n.href)}})}}return Array.from(new Set(e))}async function gt(t){let e=yt();return e||t?e:(e=await new Promise(t=>{let e=[];function n(t){e=[],c(),t.preventDefault()}function r(t){const e=function(t){let e,n=t.target,r=n.getBoundingClientRect();for(e=Ct("floor",n,t.clientX-r.left,St(n,"left")),e==n&&(e=Ct("ceil",n,r.left+r.width-t.clientX,St(n,"right"))),e==n&&(e=Ct("floor",n,t.clientY-r.top,St(n,"top"))),e==n&&(e=Ct("ceil",n,r.top+r.height-t.clientY,St(n,"bottom"))),n=e;n&&n.clientWidth<=8&&n.clientHeight<=8;)n=n.parentElement;return n}(t);var n;e&&(at=e,n=e,requestAnimationFrame(()=>{const t=At(),e=n.getBoundingClientRect(),r=document.scrollingElement||document.documentElement;t.style.setProperty("top",r.scrollTop+e.top-10+"px"),t.style.setProperty("left",r.scrollLeft+e.left-10+"px"),t.style.setProperty("width",e.width+20+"px"),t.style.setProperty("height",e.height+20+"px")}))}function o(t){t.preventDefault(),t.stopPropagation(),0==t.button?c(at,t.ctrlKey):s()}function a(t){"Escape"==t.key&&(t.preventDefault(),t.stopPropagation())}function i(t){"Escape"==t.key&&(t.preventDefault(),t.stopPropagation(),s())}function s(){e.length&&getSelection().removeAllRanges(),e=[],d()}function c(t,e){if(t){e||u();const n=document.createRange();n.selectNodeContents(t),l(),getSelection().addRange(n),f(),e||d()}else d()}function l(){const t=getSelection();for(let e=t.rangeCount-1;e>=0;e--){const n=t.getRangeAt(e);n.startOffset==n.endOffset&&(t.removeRange(n),e--)}}function d(){At().remove(),removeEventListener("mousemove",r,!0),removeEventListener("click",o,!0),removeEventListener("keydown",a,!0),removeEventListener("keyup",i,!0),at=null,t(Boolean(e.length)),setTimeout(()=>document.removeEventListener("contextmenu",n,!0),0)}function u(){getSelection().removeAllRanges(),e.forEach(t=>getSelection().addRange(t))}function f(){e=[];for(let t=0;t8&&r.parentElement.clientHeight>8&&(r.parentElement.clientWidth-r.clientWidth>8||r.parentElement.clientHeight-r.clientHeight>8)&&o.push(r.parentElement),r=r.parentElement)}else n=!1}while(n&&r);return o}function Ct(t,e,n,r){return Math[t](n/8)<=r.length&&(e=r[r.length-Math[t](n/8)-1]),e}function Tt(t,e){const n=document.createElement(t);return n.className=Z,e&&e.appendChild(n),Q.forEach(t=>n.style.setProperty(t,"initial","important")),n.style.setProperty("direction",$,"important"),n}vt();const Pt=globalThis.singlefile,It=Pt.helper.SINGLE_FILE_UI_ELEMENT_CLASS,xt="singlefile-open-file-bar",Rt="singlefile-share-page-bar";let Lt,Ut,kt,Dt;const Bt=new Set(Array.from(getComputedStyle(document.documentElement)));let Nt="ltr";try{Nt=browser.i18n.getMessage("@@bidi_dir")}catch(t){}function Ot(t){({EMBEDDED_IMAGE_BUTTON_MESSAGE:Lt,SHARE_PAGE_BUTTON_MESSAGE:Ut,SHARE_SELECTION_BUTTON_MESSAGE:kt,ERROR_TITLE_MESSAGE:Dt}=t)}function Mt(t,e){console.error("SingleFile",t,e),jt("singlefile-error-bar",Dt+t,{link:e})}function Ft({accept:t}={accept:"image/*"}){const e=document.createElement("input");return e.type="file",e.accept=t,e.click(),new Promise(t=>{e.addEventListener("change",async e=>{if(e.target.files.length){const n=e.target.files[0];try{if("image/png"==n.type)t(new Uint8Array(await _t(n)));else{const e=await async function(t){if(globalThis.FileReader){const e=new globalThis.FileReader;return e.readAsDataURL(t),new Promise((t,n)=>{e.addEventListener("load",()=>t(e.result),!1),e.addEventListener("error",n,!1)})}{const e=new Uint8Array(await t.arrayBuffer());let n="";for(let t=0;t{o.addEventListener("load",t,!1),o.addEventListener("error",e,!1)});const a=new OffscreenCanvas(o.width,o.height);a.getContext("2d").drawImage(r,0,0);const i=await a.convertToBlob({type:"image/png"});t(new Uint8Array(await _t(i)))}}catch{t()}}else t()}),e.addEventListener("cancel",()=>t())})}function _t(t){if(globalThis.FileReader){const e=new globalThis.FileReader;return e.readAsArrayBuffer(t),new Promise((t,n)=>{e.addEventListener("load",()=>t(e.result),!1),e.addEventListener("error",n,!1)})}return t.arrayBuffer()}function jt(t,e,{link:n,buttonLabel:r,buttonOnclick:o}={}){try{if(!document.querySelector(t)){const a=function(t){const e=document.createElement(t);return e.className=It,Bt.forEach(t=>e.style.setProperty(t,"initial","important")),e.style.setProperty("direction",Nt,"important"),e}(t),i=a.attachShadow({mode:"open"}),s=document.createElement("style");s.textContent="\n\t\t\t\t.container {\n\t\t\t\t\tbackground-color: #ff6c00;\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tposition: fixed;\n\t\t\t\t\ttop: 0px;\n\t\t\t\t\tleft: 0px;\n\t\t\t\t\tright: 0px;\n\t\t\t\t\theight: auto;\n\t\t\t\t\twidth: auto;\n\t\t\t\t\tmin-height: 24px;\n\t\t\t\t\tmin-width: 24px;\t\t\t\t\t\n\t\t\t\t\tz-index: 2147483647;\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\tpadding: 2px;\n\t\t\t\t\tfont-family: Arial;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar.container, .singlefile-share-page-bar.container {\n\t\t\t\t\tbackground-color: gainsboro;\n\t\t\t\t\tborder-block-end: gray 1px solid;\n\t\t\t\t}\n\t\t\t\t.text {\n\t\t\t\t\tflex: 1;\n\t\t\t\t\tpadding-top: 4px;\n\t\t\t\t\tpadding-bottom: 4px;\n\t\t\t\t\tpadding-left: 8px;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbutton {\n\t\t\t\t\tbackground-color: grey;\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tborder: 1px solid darkgrey;\n\t\t\t\t\tpadding: 3px;\n\t\t\t\t\tpadding-left: 8px;\n\t\t\t\t\tpadding-right: 8px;\n\t\t\t\t\tborder-radius: 4px;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t}\n\t\t\t\t.close-button {\n\t\t\t\t\topacity: .7;\n\t\t\t\t\tpadding-left: 8px;\n\t\t\t\t\tpadding-right: 8px;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t\ttransition: opacity 250ms;\n\t\t\t\t\theight: 16px;\n\t\t\t\t\tfont-size: 13px;\n\t\t\t\t\talign-self: center;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar button, .singlefile-share-page-bar button{\n\t\t\t\t\tbackground-color: dimgrey;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar .close-button, .singlefile-share-page-bar .close-button{\n\t\t\t\t\tfilter: invert(1);\n\t\t\t\t}\n\t\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\t\t.singlefile-open-file-bar.container, .singlefile-share-page-bar.container {\n\t\t\t\t\t\tbackground-color: #1c1b22;\n\t\t\t\t\t\tborder-block-end: #4a4a55 1px solid;\n\t\t\t\t\t}\n\t\t\t\t\t.singlefile-open-file-bar a, .singlefile-share-page-bar a {\n\t\t\t\t\t\tcolor: #8ab4f8;\n\t\t\t\t\t}\n\t\t\t\t\t.singlefile-open-file-bar .close-button, .singlefile-share-page-bar .close-button {\n\t\t\t\t\t\tfilter: none;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ta {\n\t\t\t\t\tcolor: #303036;\n\t\t\t\t}\n\t\t\t\t.close-button:hover {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t",i.appendChild(s);const c=document.createElement("div");c.classList.add(t),c.classList.add("container");const l=document.createElement("span");l.classList.add("text");const d=e.split("__DOC_LINK__");if(l.textContent=d[0],n&&2==d.length){const t=document.createElement("a");t.textContent=n,t.href=n,t.target="_blank",l.appendChild(t),l.appendChild(document.createTextNode(d[1]))}if(r&&o){const t=document.createElement("button");t.textContent=r,t.onclick=()=>o(),l.appendChild(t)}c.appendChild(l);const u=document.createElement("img");u.classList.add("close-button"),c.appendChild(u),i.appendChild(c),u.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSlUqHewg4hChOogFURFHqWIRLJS2QqsOJpf+CE0akhQXR8G14ODPYtXBxVlXB1dBEPwBcXNzUnSREr9LCi1ivOO4h/e+9+XuO0Col5lqdowDqmYZqXhMzOZWxMAruhGiOYohiZl6Ir2Qgef4uoeP73dRnuVd9+foVfImA3wi8SzTDYt4nXh609I57xOHWUlSiM+Jxwy6IPEj12WX3zgXHRZ4ZtjIpOaIw8RisY3lNmYlQyWeIo4oqkb5QtZlhfMWZ7VcZc178hcG89pymuu0BhHHIhJIQoSMKjZQhoUo7RopJlJ0HvPwDzj+JLlkcm2AkWMeFaiQHD/4H/zurVmYnHCTgjGg88W2P4aBwC7QqNn297FtN04A/zNwpbX8lTow80l6raVFjoDQNnBx3dLkPeByB+h/0iVDciQ/LaFQAN7P6JtyQN8t0LPq9q15jtMHIEO9WroBDg6BkSJlr3m8u6u9b//WNPv3A6mTcr3f/E/sAAAABmJLR0QAigCKAIrj2uckAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QkPDysvCdPVuwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAELSURBVHja7ZpLFsIwDAPj3v/OsGHDe1BIa8tKO7Mnlkw+dpoxAAAAAGCfx4ur6Yx/B337UUS4mp/VuWUEcjSfOgO+BXCZCWe0hSqQo/npBLglIUNLdAV2MH84Ad1JyIwdLkK6YoabIHWscBWmihHuAqvHtv+XqmdXOK9TxdKy3axUm2vZkXXGgPJksTuz1bVFeeU2Y6ijsLIpXbtKa1kDs2ews69o7+A+ihJ2lvI+/lcS1G21zUVG18XKNm4OS4BNkGOQQohSmGaIdpgLESvzyiRwKepsXjE2H0ZWMF8Zi4+jK5mviM0DiRXNZ2rhkdTK5jO0xermz2o8dCnq+FS2XNNVH0sDAAAA3JYnre9cH8BZmhEAAAAASUVORK5CYII=",u.onclick=t=>{0===t.button&&(o&&o(!0),a.remove())},document.documentElement.appendChild(a)}}catch(t){}}const Wt=16777216;let Gt,Ht,qt,zt,Vt;try{Gt=browser.i18n.getMessage("topPanelEmbeddedImageButton"),Ht=browser.i18n.getMessage("topPanelSharePageButton"),qt=browser.i18n.getMessage("topPanelShareSelectionButton"),zt=browser.i18n.getMessage("topPanelError")}catch(t){}async function Xt(t,e){e.includeBOM&&"string"==typeof t.content&&(t.content="\ufeff"+t.content);const n=e.embeddedImage,r={method:"downloads.download",taskId:e.taskId,insertTextBody:e.insertTextBody,confirmFilename:e.confirmFilename,filenameConflictAction:e.filenameConflictAction,filename:t.filename,mimeType:t.mimeType,saveToClipboard:e.saveToClipboard,saveToGDrive:e.saveToGDrive,saveToDropbox:e.saveToDropbox,saveWithWebDAV:e.saveWithWebDAV,webDAVURL:e.webDAVURL,webDAVUser:e.webDAVUser,webDAVPassword:e.webDAVPassword,saveWithMCP:e.saveWithMCP,mcpServerUrl:e.mcpServerUrl,mcpAuthToken:e.mcpAuthToken,saveToGitHub:e.saveToGitHub,githubToken:e.githubToken,githubUser:e.githubUser,githubRepository:e.githubRepository,githubBranch:e.githubBranch,saveWithCompanion:e.saveWithCompanion,forceWebAuthFlow:e.forceWebAuthFlow,filenameReplacementCharacter:e.filenameReplacementCharacter,openEditor:e.openEditor,openSavedPage:e.openSavedPage,compressHTML:e.compressHTML,backgroundSave:e.backgroundSave,bookmarkId:e.bookmarkId,replaceBookmarkURL:e.replaceBookmarkURL,applySystemTheme:e.applySystemTheme,contentWidth:e.contentWidth,defaultEditorMode:e.defaultEditorMode,includeInfobar:e.includeInfobar,openInfobar:e.openInfobar,animateInfobar:e.animateInfobar,warnUnsavedPage:e.warnUnsavedPage,createRootDirectory:e.createRootDirectory,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,embeddedImage:n?Array.from(n):null,preventAppendedData:e.preventAppendedData,maxAppendedDataLength:e.maxAppendedDataLength,extractDataFromPage:e.extractDataFromPage,insertCanonicalLink:e.insertCanonicalLink,insertMetaNoIndex:e.insertMetaNoIndex,insertMetaCSP:e.insertMetaCSP,password:e.password,compressContent:e.compressContent,foregroundSave:e.foregroundSave,sharePage:e.sharePage,saveToRestFormApi:e.saveToRestFormApi,saveToRestFormApiUrl:e.saveToRestFormApiUrl,saveToRestFormApiFileFieldName:e.saveToRestFormApiFileFieldName,saveToRestFormApiUrlFieldName:e.saveToRestFormApiUrlFieldName,saveToRestFormApiToken:e.saveToRestFormApiToken,saveToS3:e.saveToS3,S3Domain:e.S3Domain,S3Region:e.S3Region,S3Bucket:e.S3Bucket,S3AccessKey:e.S3AccessKey,S3SecretKey:e.S3SecretKey,infobarPositionAbsolute:e.infobarPositionAbsolute,infobarPositionTop:e.infobarPositionTop,infobarPositionBottom:e.infobarPositionBottom,infobarPositionLeft:e.infobarPositionLeft,infobarPositionRight:e.infobarPositionRight,originalUrl:e.url,title:t.title},o=setInterval(()=>{browser.runtime.sendMessage({method:"ping"}).then(()=>{})},15e3);if(e.compressContent)if((!e.backgroundSave||e.saveToGDrive||e.saveToGitHub||e.saveWithCompanion||e.saveWithWebDAV||e.saveWithMCP||e.saveToDropbox||e.saveToRestFormApi||e.saveToS3)&&e.confirmFilename&&!e.openEditor&&(t.filename=st("Save as",t.filename)),t.filename){const o=new Blob([await s(t)],{type:t.mimeType}),a=URL.createObjectURL(o);r.filename=t.filename,r.blobURL=a,r.blob=o;const i=await browser.runtime.sendMessage(r);if(URL.revokeObjectURL(a),i.error){r.embeddedImage=n,r.blobURL=null,r.blob=null,r.pageData=t;const e=d(r);for await(const t of e)await browser.runtime.sendMessage({method:"downloads.download",compressContent:!0,data:Array.from(t)});await browser.runtime.sendMessage({method:"downloads.download",compressContent:!0,mimeType:t.mimeType})}if(e.backgroundSave){const n=e.openEditor?null:t.hash;await browser.runtime.sendMessage({method:"downloads.end",taskId:e.taskId,hash:n,woleetKey:e.woleetKey})}}else browser.runtime.sendMessage({method:"downloads.cancel"}),browser.runtime.sendMessage({method:"ui.processCancelled"});else{if(e.backgroundSave&&!e.sharePage||e.openEditor||e.saveToGDrive||e.saveToGitHub||e.saveWithCompanion||e.saveWithWebDAV||e.saveWithMCP||e.saveToDropbox||e.saveToRestFormApi||e.saveToS3){let n=t.filename;if((e.saveToGDrive||e.saveToGitHub||e.saveWithCompanion||e.saveWithWebDAV||e.saveWithMCP||e.saveToDropbox||e.saveToRestFormApi||e.saveToS3)&&e.confirmFilename&&!e.openEditor&&(n=st("Save as",t.filename)),n){r.filename=t.filename=n;const e=new Blob([t.content],{type:t.mimeType}),o=URL.createObjectURL(e);r.blobURL=o,r.blob=e;const a=await browser.runtime.sendMessage(r);if(URL.revokeObjectURL(o),a.error){r.blobURL=null,r.blob=null;for(let e=0;e*WtWt,r.truncated?(r.finished=(e+1)*Wt>t.content.length,r.content=t.content.substring(e*Wt,(e+1)*Wt)):r.content=t.content,await browser.runtime.sendMessage(r)}}else browser.runtime.sendMessage({method:"downloads.cancel"}),browser.runtime.sendMessage({method:"ui.processCancelled"})}else e.saveToClipboard?function(t){const e="copy";function n(e){e.clipboardData.setData(t.mimeType,t.content),e.clipboardData.setData("text/plain",t.content),e.preventDefault()}document.addEventListener(e,n),document.execCommand(e),document.removeEventListener(e,n)}(t):await Kt(t,e),e.openSavedPage&&open(URL.createObjectURL(new Blob([t.content],{type:t.mimeType}))),browser.runtime.sendMessage({method:"ui.processEnd"});const n=e.openEditor?null:t.hash;await browser.runtime.sendMessage({method:"downloads.end",taskId:e.taskId,hash:n,woleetKey:e.woleetKey})}clearInterval(o)}async function Kt(t,e){if(Array.isArray(t.content)&&(t.content=new Uint8Array(t.content)),e.sharePage&&navigator.share)await Zt(t,e);else{let n=t.filename;if(e.confirmFilename&&(n=st("Save as",t.filename),n?t.filename=n:(browser.runtime.sendMessage({method:"downloads.cancel"}),browser.runtime.sendMessage({method:"ui.processCancelled"}))),n){const e=document.createElement("a");return e.download=t.filename,e.href=URL.createObjectURL(new Blob([t.content],{type:t.mimeType})),e.dispatchEvent(new MouseEvent("click")),new Promise(t=>setTimeout(()=>{URL.revokeObjectURL(e.href),t()},1e3))}}}async function Zt(t,e){Vt=function(){let t;return{display:async function(e){return new Promise(n=>{t=n,jt(Rt,"",{buttonLabel:e?kt:Ut,buttonOnclick:n})})},hide:function(){const t=document.querySelector(Rt);t&&t.remove()},cancel:function(){this.hide(),t&&t(!0)}}}();if(!await Vt.display(e.selected)){const n={files:[new File([t.content],t.filename,{type:t.mimeType})]};try{await navigator.share(n),Vt.hide()}catch(n){if(Vt.hide(),"AbortError"!==n.name)throw n;await Zt(t,e)}}}Ot({EMBEDDED_IMAGE_BUTTON_MESSAGE:Gt,SHARE_PAGE_BUTTON_MESSAGE:Ht,SHARE_SELECTION_BUTTON_MESSAGE:qt,ERROR_TITLE_MESSAGE:zt});const Qt="single-file-response-fetch",$t="Host fetch error (SingleFile)",Jt=Boolean(window.wrappedJSObject),Yt=["http:","https:"],te=["no-referrer-when-downgrade","strict-origin","strict-origin-when-cross-origin"],ee=["no-referrer","no-referrer-when-downgrade","origin","origin-when-cross-origin","same-origin","strict-origin","strict-origin-when-cross-origin","unsafe-url"],ne=window.fetch.bind(window);let re,oe=0,ae=new Map;async function ie(t,e={},n=!0){try{const r={cache:e.cache||"force-cache",headers:e.headers,referrerPolicy:se(t,e)?"no-referrer":e.referrerPolicy||"strict-origin-when-cross-origin"};let o;try{o=e.referrer&&!Jt||!n?await ne(t,r):await async function(t,e){if(void 0===re&&(re=!1,document.addEventListener("single-file-response-fetch-supported",()=>re=!0,!1),document.dispatchEvent(new CustomEvent("single-file-request-fetch-supported"))),re)return new Promise((n,r)=>{document.addEventListener(Qt,function e(o){o.detail?o.detail.url==t&&(document.removeEventListener(Qt,e,!1),o.detail.response?n({status:o.detail.status,headers:ce(o.detail.headers),arrayBuffer:async()=>o.detail.response}):r(new Error(o.detail.error))):(document.removeEventListener(Qt,e,!1),r(new Error($t)))},!1),document.dispatchEvent(new CustomEvent("single-file-request-fetch",{detail:JSON.stringify({url:t,options:e})}))});throw new Error($t)}(t,r),401!=o.status&&403!=o.status&&404!=o.status||"no-referrer"==r.referrerPolicy||e.referrer||(o=await ie(t,{...r,referrerPolicy:"no-referrer"},n))}catch(a){if(a&&a.message==$t)o=await ie(t,{...r},!1);else{if("no-referrer"==r.referrerPolicy||e.referrer)throw a;o=await ie(t,{...r,referrerPolicy:"no-referrer"},n)}}return o}catch(n){oe++;const r=new Promise((t,e)=>ae.set(oe,{resolve:t,reject:e}));return await le({method:"singlefile.fetch",url:t,requestId:oe,referrer:e.referrer,headers:e.headers}),r}}function se(t,{stylesheetURL:e,stylesheetReferrerPolicy:n}={}){if(!e)return!1;let r,o;try{r=new URL(e),o=new URL(t,e)}catch{return!1}if(!Yt.includes(r.protocol)||!Yt.includes(o.protocol))return!0;let a="strict-origin-when-cross-origin";String(n||"").split(",").forEach(t=>{t=t.trim().toLowerCase(),ee.includes(t)&&(a=t)});const i="https:"==r.protocol&&"https:"!=o.protocol;return"no-referrer"==a||"same-origin"==a&&o.origin!=r.origin||i&&te.includes(a)}function ce(t){return new Headers(t?Array.from(t,t=>[t[0],t[1]]):[])}async function le(t){const e=await browser.runtime.sendMessage(t);if(!e||e.error)throw new Error(e&&e.error&&e.error.toString());return e}browser.runtime.onMessage.addListener(t=>"singlefile.fetchFrame"==t.method&&window.frameId&&window.frameId==t.frameId?async function(t){try{const e=await ne(t.url,{cache:"force-cache",headers:t.headers,referrerPolicy:"strict-origin-when-cross-origin"});return{status:e.status,headers:[...e.headers],array:Array.from(new Uint8Array(await e.arrayBuffer()))}}catch(t){return{error:t&&(t.message||t.toString())}}}(t):"singlefile.fetchResponse"==t.method?async function(t){const e=ae.get(t.requestId);e&&(t.error?(e.reject(new Error(t.error)),ae.delete(t.requestId)):(t.truncated&&(e.array?e.array=e.array.concat(t.array):(e.array=t.array,ae.set(t.requestId,e)),t.finished&&(t.array=e.array)),t.truncated&&!t.finished||(e.resolve({status:t.status,headers:ce(t.headers),arrayBuffer:async()=>new Uint8Array(t.array).buffer}),ae.delete(t.requestId))));return{}}(t):void 0);const de=globalThis.singlefile,ue=globalThis.singlefileBootstrap,fe="moz-extension:",me=browser.i18n.getMessage("topPanelEmbeddedImageButton"),pe=browser.i18n.getMessage("topPanelSharePageButton"),he=browser.i18n.getMessage("topPanelShareSelectionButton"),ge=browser.i18n.getMessage("topPanelError");let ye,we,be,Ae,ve,Ee,Se;function Ce(){browser.runtime.sendMessage({method:"downloads.cancel"})}function Te(t){"Escape"==t.key&&globalThis.singlefileBootstrap.cancelSave&&(t.preventDefault(),t.stopPropagation(),"keyup"==t.type&&globalThis.singlefileBootstrap.cancelSave())}async function Pe(t){const e=de.processors.frameTree;let n;de.helper.initDoc(document),lt(t,Ce),ye=new de.SingleFile(t);const r=[];let o,a=0,i=0;t.onprogress=async t=>{const{options:e}=t.detail;if(!ye.cancelled){if(t.type==t.RESOURCES_INITIALIZING&&!o&&e.insertEmbeddedScreenshotImage&&e.compressContent){o=!0,ct(!1);const t=await browser.runtime.sendMessage({method:"tabs.getScreenshot",width:document.documentElement.scrollWidth,height:document.documentElement.scrollHeight,innerHeight:globalThis.innerHeight});ct(!0),mt(e),e.embeddedImage=new Uint8Array(await(await ie(t)).arrayBuffer()),URL.revokeObjectURL(t),pt(e)}t.type==t.RESOURCES_INITIALIZED&&(i=t.detail.max,e.loadDeferredContent&&de.processors.lazy.resetZoomLevel(e)),t.type==t.RESOURCES_INITIALIZED||t.type==t.RESOURCE_LOADED?(t.type==t.RESOURCE_LOADED&&a++,e.silent||await browser.runtime.sendMessage({method:"ui.processProgress",index:a,maxIndex:i}),ft(a,i,e)):t.detail.frame||t.type==t.PAGE_LOADING||t.type==t.PAGE_LOADED||(t.type==t.STAGE_STARTED?t.detail.step<3&&function(t,e){Et("step-"+t,`${nt} ${t+1} / 3`,"…",e)}(t.detail.step,e):t.type==t.STAGE_ENDED&&t.detail.step<3&&function(t,e){Et("step-"+t,`${nt} ${t+1} / 3`,"✓",e)}(t.detail.step,e))}};const s=globalThis._singleFile_waitForUserScript;t.userScriptEnabled&&s&&await s("single-file-on-init-capture",t);const c=ye.cancel.bind(ye);if(t.insertEmbeddedImage&&t.compressContent){mt(t),Ae=function(){let t;return{display:async function(){return new Promise(e=>{t=e,jt(xt,"",{buttonLabel:Lt,buttonOnclick:e})})},hide:function(){const t=document.querySelector(xt);t&&t.remove()},cancel:function(){this.hide(),t&&t(!0)}}}();await Ae.display()||(t.embeddedImage=await Ft({accept:"image/*"}),Ae.hide()),pt(t)}if(!t.saveRawPage&&!ye.cancelled){let n;if(t.loadDeferredContent&&(n=de.processors.lazy.process(t),function(t){Et("load-deferred-content",Y,"…",t)}(t),n.then(()=>{ye.cancelled||function(t){Et("load-deferred-content",Y,"✓",t)}(t)}),t.loadDeferredContentBeforeFrames&&await n),!t.removeFrames&&e&&globalThis.frames){let n;n=t.loadDeferredContent?new Promise(n=>globalThis.setTimeout(()=>n(e.getAsync(t)),t.loadDeferredContentBeforeFrames||!t.loadDeferredContent?0:t.loadDeferredContentMaxIdleTime)):e.getAsync(t),function(t){Et("load-frames",tt,"…",t)}(t),n.then(()=>{ye.cancelled||function(t){Et("load-frames",tt,"✓",t)}(t)}),t.loadDeferredContentBeforeFrames?t.frames=await new Promise(t=>{ye.cancel=function(){c(),t([])},n.then(t)}):r.push(n)}t.loadDeferredContent&&!t.loadDeferredContentBeforeFrames&&r.push(n)}t.loadDeferredContentBeforeFrames||ye.cancelled||([t.frames]=await new Promise(t=>{const e=Promise.all(r);ye.cancel=function(){c(),t([[]])},e.then(()=>t(e))})),t.delayBeforeProcessing&&await new Promise(e=>setTimeout(e,1e3*t.delayBeforeProcessing)),n=t.frames&&t.frames.sessionId;const l=t.frames&&t.frames.find(t=>t.requestedFrame);let d;return t.win=globalThis,l?(t.content=l.content,t.url=l.baseURI,t.canvases=l.canvases,t.fonts=l.fonts,t.stylesheets=l.stylesheets,t.images=l.images,t.posters=l.posters,t.videos=l.videos,t.usedFonts=l.usedFonts,t.shadowRoots=l.shadowRoots,t.adoptedStyleSheets=l.adoptedStyleSheets,t.worklets=l.worklets):t.doc=document,ye.cancelled||await ye.run(),n&&e.cleanup(n),ye.cancelled||(t.confirmInfobarContent&&(t.infobarContent=st("Infobar content",t.infobarContent)||""),d=await ye.getPageData(),(t.selected||t.optionallySelected)&&document.querySelectorAll("["+O+"]").forEach(t=>t.removeAttribute(O)),dt(),t.displayStats&&(console.log("SingleFile stats"),console.table(d.stats))),t.delayAfterProcessing&&await new Promise(e=>setTimeout(e,1e3*t.delayAfterProcessing)),d}Ot({EMBEDDED_IMAGE_BUTTON_MESSAGE:me,SHARE_PAGE_BUTTON_MESSAGE:pe,SHARE_SELECTION_BUTTON_MESSAGE:he,ERROR_TITLE_MESSAGE:ge}),ue&&ue.initializedSingleFile||(de.init({fetch:ie,frameFetch:async function(t,e){const n=await le({method:"singlefile.fetchFrame",url:t,frameId:e.frameId,referrer:e.referrer,headers:e.headers});return{status:n.status,headers:ce(n.headers),arrayBuffer:async()=>new Uint8Array(n.array).buffer}}}),browser.runtime.onMessage.addListener(t=>{if("content.save"==t.method||"content.capture"==t.method||"content.cancelSave"==t.method||"content.download"==t.method||"content.getSelectedLinks"==t.method||"content.error"==t.method||"content.prompt"==t.method||"content.beginScrollTo"==t.method||"content.scrollTo"==t.method||"content.endScrollTo"==t.method)return async function(t){if(!location.href.startsWith(fe)){if("content.save"==t.method)return await async function(t){const e=setInterval(()=>{browser.runtime.sendMessage({method:"ping"}).then(()=>{})},15e3),n=t.options;let r;(n.selected||n.optionallySelected)&&(r=await gt(n.optionallySelected));if(!(we||ue&&ue.pageInfo.processing)){if(n.visitDate=ue?ue.pageInfo.visitDate:new Date,n.optionallySelected&&r&&(n.selected=!0),!n.selected||r){ue&&(ue.pageInfo.processing=!0),we=!0;try{const t=await Pe(n);t&&await Xt(t,n)}catch(t){if(!ye.cancelled){console.error(t);const e=t&&(t.message||t.toString());browser.runtime.sendMessage({method:"ui.processError",error:e}),Mt(e)}}finally{dt()}}else browser.runtime.sendMessage({method:"ui.processCancelled"});we=!1,ue&&(ue.pageInfo.processing=!1)}clearInterval(e)}(t),{};if("content.capture"==t.method)return async function(t){const e=setInterval(()=>{browser.runtime.sendMessage({method:"ping"}).then(()=>{})},15e3),n=t.options;let r;(n.selected||n.optionallySelected)&&(r=await gt(n.optionallySelected));if(we||ue&&ue.pageInfo.processing)throw clearInterval(e),new Error("SingleFile is already processing this page");n.visitDate=ue?ue.pageInfo.visitDate:new Date,n.optionallySelected&&r&&(n.selected=!0);if(n.selected&&!r)throw clearInterval(e),new Error("No selected content found");ue&&(ue.pageInfo.processing=!0);we=!0;try{return await Pe(n)}finally{we=!1,ue&&(ue.pageInfo.processing=!1),clearInterval(e)}}(t);if("content.cancelSave"==t.method)return ye&&(ye.cancel(),dt(),Ae&&(Ae.cancel(),Ae=null),browser.runtime.sendMessage({method:"ui.processCancelled"})),t.options.loadDeferredContent&&de.processors.lazy.resetZoomLevel(t.options),{};if("content.getSelectedLinks"==t.method)return{urls:ht()};if("content.download"==t.method){be||(be=A());const e=await be.next(t.data);if(e.done){be=null;try{await Kt(e.value,{foregroundSave:e.value.foregroundSave,sharePage:e.value.sharePage})}catch(t){return{error:t&&(t.message||t.toString())}}finally{await browser.runtime.sendMessage({method:"downloads.end",taskId:e.value.taskId})}}return{}}if("content.error"==t.method)return Mt(t.error,t.link),{};if("content.prompt"==t.method)return st(t.message,t.value);if("content.beginScrollTo"==t.method)return ve=globalThis.scrollY,Ee=document.documentElement.style.getPropertyValue("transform"),Se=document.documentElement.style.getPropertyValue("overflow"),globalThis.scrollTo(0,0),document.documentElement.style.setProperty("transform","translateY(0px)"),document.documentElement.style.setProperty("overflow","hidden"),{};if("content.scrollTo"==t.method)return document.documentElement.style.setProperty("transform","translateY(-"+t.y+"px)"),await new Promise(t=>setTimeout(t,500)),{};if("content.endScrollTo"==t.method)return globalThis.scrollTo(0,ve),document.documentElement.style.setProperty("transform",Ee),document.documentElement.style.setProperty("overflow",Se),{}}}(t)}),ue?ue.initializedSingleFile=!0:(globalThis.singlefileBootstrap={initializedSingleFile:!0},addEventListener("keydown",Te,!0),addEventListener("keyup",Te,!0)))}(); +!function(){"use strict";const t=[0],e=Symbol(),n=new TextEncoder,r=new TextDecoder,o=new Array(256);let a=0;function i(e,n,r,i){if(void 0===i){if(a++,!(o.length-a>=t.length))throw new Error("Reached maximum number of custom types");o[o.length-a]={serialize:e,parse:n,test:r}}else o[i]={serialize:e,parse:n,test:r}}async function s(t,e){const n=d(t,e);let r=new Uint8Array([]);for await(const t of n){const e=r;r=new Uint8Array(e.length+t.length),r.set(e,0),r.set(t,e.length)}return r}i(async function(t,e){const n=t.objects.indexOf(e);await u(t,n)},async function(t){const e=await v(t);return new y(e,t)},P,0),i(null,function(){return{}},x),i(f,E,R),i(m,S,function(t){return"string"==typeof t}),i(p,async function(t){const e=await v(t),n=await t.consume(8*e);return new Float64Array(n.buffer)},function(t){return"Float64Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(4*e);return new Float32Array(n.buffer)},function(t){return"Float32Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(4*e);return new Uint32Array(n.buffer)},function(t){return"Uint32Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(4*e);return new Int32Array(n.buffer)},function(t){return"Int32Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(2*e);return new Uint16Array(n.buffer)},function(t){return"Uint16Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(2*e);return new Int16Array(n.buffer)},function(t){return"Int16Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(e);return new Uint8ClampedArray(n.buffer)},function(t){return"Uint8ClampedArray"==t.constructor.name}),i(p,async function(t){const e=await v(t);return await t.consume(e)},function(t){return"Uint8Array"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(e);return new Int8Array(n.buffer)},function(t){return"Int8Array"==t.constructor.name}),i(async function(t,e){await u(t,e.byteLength),await t.append(new Uint8Array(e))},async function(t){const e=await v(t);return(await t.consume(e)).buffer},function(t){return"ArrayBuffer"==t.constructor.name}),i(h,C,U),i(async function(t,e){const n=new Uint8Array(new Uint32Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(4);return new Uint32Array(e.buffer)[0]},function(t){return k(t)&&t>=0&&t<=4294967295}),i(async function(t,e){const n=new Uint8Array(new Int32Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(4);return new Int32Array(e.buffer)[0]},function(t){return k(t)&&t>=-2147483648&&t<=2147483647}),i(async function(t,e){const n=new Uint8Array(new Uint16Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(2);return new Uint16Array(e.buffer)[0]},function(t){return k(t)&&t>=0&&t<=65535}),i(async function(t,e){const n=new Uint8Array(new Int16Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(2);return new Int16Array(e.buffer)[0]},function(t){return k(t)&&t>=-32768&&t<=32767}),i(async function(t,e){const n=new Uint8Array([e]);await t.append(n)},async function(t){const e=await t.consume(1);return new Uint8Array(e.buffer)[0]},function(t){return k(t)&&t>=0&&t<=255}),i(async function(t,e){const n=new Uint8Array(new Int8Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(1);return new Int8Array(e.buffer)[0]},function(t){return k(t)&&t>=-128&&t<=127}),i(null,function(){return},function(t){return void 0===t}),i(null,function(){return null},function(t){return null===t}),i(null,function(){return NaN},function(t){return Number.isNaN(t)}),i(g,T,function(t){return"boolean"==typeof t}),i(async function(t,e){await m(t,e.description)},async function(t){const e=await S(t);return Symbol(e)},D),i(null,function(){return e},L),i(async function(t,e){const n=e.entries();await u(t,e.size);for(const[e,r]of n)await u(t,e),await u(t,r)},async function(t){const e=await v(t),n=new Map;e&&await async function r(o=0){const a=await v(t),i=await v(t);t.setObject([a,i],(t,e)=>n.set(t,e)),on.add(t)),othis.value.length){const e=this.value.length-this.offset;await this.append(new Uint8Array(t).subarray(0,e)),await this.appendData({value:this.value}),this.offset=0,await this.append(new Uint8Array(t).subarray(e))}else this.value.set(t,this.offset),this.offset+=t.length}async flush(){this.offset&&await this.appendData({value:new Uint8Array(this.value).subarray(0,this.offset),done:!0})}}function d(t,{chunkSize:e=8388608}={}){let n,r,o,a,i,s;return{[Symbol.asyncIterator]:()=>({next:()=>a?{done:a}:async function(){s?s():l().catch(()=>{});i=new Promise(t=>s=t);const t=await async function(){const{value:t,done:e}=await r;a=e,e||d();return t}();return{value:t}}(),return:()=>({done:!0})})};async function l(){d(),n=new c(f,e),await u(n,t),await n.flush()}function d(){r=new Promise(t=>o=t)}async function f(t){o(t),await i}}async function u(t,e){const n=o.findIndex(({test:n}={})=>n&&n(e,t));t.addObject(e),await t.append(new Uint8Array([n]));const r=o[n].serialize;r&&await r(t,e),0!=n&&x(e)&&(await async function(t,e){const n=Object.getOwnPropertySymbols(e),r=n.map(t=>[t,e[t]]);await f(t,r)}(t,e),await async function(t,e){if(ArrayBuffer.isView(e))await u(t,0);else{let n=Object.entries(e);R(e)&&(n=n.filter(([t])=>!k(Number(t)))),await u(t,n.length);for(const[e,r]of n)await m(t,e),await u(t,r)}}(t,e))}async function f(t,n){await u(t,n.length);const r=Object.keys(n).filter(t=>k(Number(t))).map(t=>Number(t));let o=0,a=r[o];for(const[i,s]of n.entries())a==i?(a=r[++o],await u(t,s)):await u(t,e)}async function m(t,e){const r=n.encode(e);await u(t,r.length),await t.append(r)}async function p(t,e){await u(t,e.length),await t.append("Uint8Array"==e.constructor.name?e:new Uint8Array(e.buffer))}async function h(t,e){const n=new Uint8Array(new Float64Array([e]).buffer);await t.append(n)}async function g(t,e){const n=new Uint8Array([Number(e)]);await t.append(n)}class y{constructor(t,e){this.index=t,this.data=e}getObject(){return this.data.objects[this.index]}}class w{constructor(t){this.stream=new b(t),this.objects=[],this.setters=[]}consume(t){return this.stream.consume(t)}getObjectId(){const t=this.objects.length;return this.objects.push(void 0),t}resolveObject(t,e){B(e)&&!I(e)&&(this.objects[t]=e)}setObject(t,e){this.setters.push({functionArguments:t,setterFunction:e})}executeSetters(){this.setters.forEach(({functionArguments:t,setterFunction:e})=>{e(...t.map(t=>I(t)?t.getObject():t))})}}class b{constructor(t){this.offset=0,this.value=new Uint8Array(0),this.consumeData=t}async consume(t){if(this.offset+t>this.value.length){const e=new Uint8Array(this.value).subarray(this.offset,this.value.length),n=await this.consumeData();return e.length+n.length!=this.value.length&&(this.value=new Uint8Array(e.length+n.length)),this.value.set(e),this.value.set(n,e.length),this.offset=0,this.consume(t)}{const e=this.value.slice(this.offset,this.offset+t);return this.offset+=e.length,e}}}function A(){let t,e,n,r,o,a;return{next:async e=>e?async function(e){o?await o:async function(){let e;r=new Promise(t=>e=t),t=new w(s),i();const n=await v(t);t.executeSetters(),e(n)}().catch(()=>{});return function(){o=new Promise(t=>a=t)}(),n(e),{done:!1}}(e):{value:await r,done:!0},return:()=>({done:!0})};function i(){e=new Promise(t=>n=t)}async function s(){const t=await e;return i(),a&&a(),t}}async function v(t){const e=(await t.consume(1))[0],n=o[e].parse,r=t.getObjectId(),a=await n(t);return 0!=e&&x(a)&&(await async function(t,e){const n=await E(t);t.setObject([n],t=>t.forEach(([t,n])=>e[t]=n))}(t,a),await async function(t,e){const n=await v(t);n&&await r();async function r(o=0){const a=await S(t),i=await v(t);t.setObject([i],t=>e[a]=t),on[o]=t);o{0===t.button&&e()},t.shadowRoot.appendChild(n))}catch(t){}}(n,e)}t.silent||ut(e)}}function dt(){ut(null);const t=document.querySelector(M);t&&t.remove(),it&&it.remove(),vt()}function ut(t){const e=globalThis.singlefileBootstrap;e&&(e.cancelSave=t)}function ft(t,e,n){n.shadowEnabled&&n.progressBarEnabled&&function(t,e){try{const n=document.querySelector(M);if(n){const r=n.shadowRoot.querySelector("."+j);if(r&&e){const n=Math.floor(t/e*100)+"%";r.style.getPropertyValue("width")!=n&&(r.style.setProperty("width",n),r.offsetWidth)}}}catch(t){}}(t,e)}function mt(t){Et("insert-embedded-image",et,"…",t)}function pt(t){Et("insert-embedded-image",et,"✓",t)}function ht(){let t;const e=[],n=getSelection();for(let r=0;r{if("A"==t.tagName&&t.href){const n=new URL(t.href);n.hash="",e.push(n.href)}})}}return Array.from(new Set(e))}async function gt(t){let e=yt();return e||t?e:(e=await new Promise(t=>{let e=[];function n(t){e=[],c(),t.preventDefault()}function r(t){const e=function(t){let e,n=t.target,r=n.getBoundingClientRect();for(e=Ct("floor",n,t.clientX-r.left,St(n,"left")),e==n&&(e=Ct("ceil",n,r.left+r.width-t.clientX,St(n,"right"))),e==n&&(e=Ct("floor",n,t.clientY-r.top,St(n,"top"))),e==n&&(e=Ct("ceil",n,r.top+r.height-t.clientY,St(n,"bottom"))),n=e;n&&n.clientWidth<=8&&n.clientHeight<=8;)n=n.parentElement;return n}(t);var n;e&&(at=e,n=e,requestAnimationFrame(()=>{const t=At(),e=n.getBoundingClientRect(),r=document.scrollingElement||document.documentElement;t.style.setProperty("top",r.scrollTop+e.top-10+"px"),t.style.setProperty("left",r.scrollLeft+e.left-10+"px"),t.style.setProperty("width",e.width+20+"px"),t.style.setProperty("height",e.height+20+"px")}))}function o(t){t.preventDefault(),t.stopPropagation(),0==t.button?c(at,t.ctrlKey):s()}function a(t){"Escape"==t.key&&(t.preventDefault(),t.stopPropagation())}function i(t){"Escape"==t.key&&(t.preventDefault(),t.stopPropagation(),s())}function s(){e.length&&getSelection().removeAllRanges(),e=[],d()}function c(t,e){if(t){e||u();const n=document.createRange();n.selectNodeContents(t),l(),getSelection().addRange(n),f(),e||d()}else d()}function l(){const t=getSelection();for(let e=t.rangeCount-1;e>=0;e--){const n=t.getRangeAt(e);n.startOffset==n.endOffset&&(t.removeRange(n),e--)}}function d(){At().remove(),removeEventListener("mousemove",r,!0),removeEventListener("click",o,!0),removeEventListener("keydown",a,!0),removeEventListener("keyup",i,!0),at=null,t(Boolean(e.length)),setTimeout(()=>document.removeEventListener("contextmenu",n,!0),0)}function u(){getSelection().removeAllRanges(),e.forEach(t=>getSelection().addRange(t))}function f(){e=[];for(let t=0;t8&&r.parentElement.clientHeight>8&&(r.parentElement.clientWidth-r.clientWidth>8||r.parentElement.clientHeight-r.clientHeight>8)&&o.push(r.parentElement),r=r.parentElement)}else n=!1}while(n&&r);return o}function Ct(t,e,n,r){return Math[t](n/8)<=r.length&&(e=r[r.length-Math[t](n/8)-1]),e}function Tt(t,e){const n=document.createElement(t);return n.className=Z,e&&e.appendChild(n),Q.forEach(t=>n.style.setProperty(t,"initial","important")),n.style.setProperty("direction",$,"important"),n}vt();const Pt=globalThis.singlefile,It=Pt.helper.SINGLE_FILE_UI_ELEMENT_CLASS,xt="singlefile-open-file-bar",Rt="singlefile-share-page-bar";let Lt,Ut,kt,Dt;const Bt=new Set(Array.from(getComputedStyle(document.documentElement)));let Nt="ltr";try{Nt=browser.i18n.getMessage("@@bidi_dir")}catch(t){}function Ot(t){({EMBEDDED_IMAGE_BUTTON_MESSAGE:Lt,SHARE_PAGE_BUTTON_MESSAGE:Ut,SHARE_SELECTION_BUTTON_MESSAGE:kt,ERROR_TITLE_MESSAGE:Dt}=t)}function Mt(t,e){console.error("SingleFile",t,e),jt("singlefile-error-bar",Dt+t,{link:e})}function Ft({accept:t}={accept:"image/*"}){const e=document.createElement("input");return e.type="file",e.accept=t,e.click(),new Promise(t=>{e.addEventListener("change",async e=>{if(e.target.files.length){const n=e.target.files[0];try{if("image/png"==n.type)t(new Uint8Array(await _t(n)));else{const e=await async function(t){if(globalThis.FileReader){const e=new globalThis.FileReader;return e.readAsDataURL(t),new Promise((t,n)=>{e.addEventListener("load",()=>t(e.result),!1),e.addEventListener("error",n,!1)})}{const e=new Uint8Array(await t.arrayBuffer());let n="";for(let t=0;t{o.addEventListener("load",t,!1),o.addEventListener("error",e,!1)});const a=new OffscreenCanvas(o.width,o.height);a.getContext("2d").drawImage(r,0,0);const i=await a.convertToBlob({type:"image/png"});t(new Uint8Array(await _t(i)))}}catch{t()}}else t()}),e.addEventListener("cancel",()=>t())})}function _t(t){if(globalThis.FileReader){const e=new globalThis.FileReader;return e.readAsArrayBuffer(t),new Promise((t,n)=>{e.addEventListener("load",()=>t(e.result),!1),e.addEventListener("error",n,!1)})}return t.arrayBuffer()}function jt(t,e,{link:n,buttonLabel:r,buttonOnclick:o}={}){try{if(!document.querySelector(t)){const a=function(t){const e=document.createElement(t);return e.className=It,Bt.forEach(t=>e.style.setProperty(t,"initial","important")),e.style.setProperty("direction",Nt,"important"),e}(t),i=a.attachShadow({mode:"open"}),s=document.createElement("style");s.textContent="\n\t\t\t\t.container {\n\t\t\t\t\tbackground-color: #ff6c00;\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tposition: fixed;\n\t\t\t\t\ttop: 0px;\n\t\t\t\t\tleft: 0px;\n\t\t\t\t\tright: 0px;\n\t\t\t\t\theight: auto;\n\t\t\t\t\twidth: auto;\n\t\t\t\t\tmin-height: 24px;\n\t\t\t\t\tmin-width: 24px;\t\t\t\t\t\n\t\t\t\t\tz-index: 2147483647;\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\tpadding: 2px;\n\t\t\t\t\tfont-family: Arial;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar.container, .singlefile-share-page-bar.container {\n\t\t\t\t\tbackground-color: gainsboro;\n\t\t\t\t\tborder-block-end: gray 1px solid;\n\t\t\t\t}\n\t\t\t\t.text {\n\t\t\t\t\tflex: 1;\n\t\t\t\t\tpadding-top: 4px;\n\t\t\t\t\tpadding-bottom: 4px;\n\t\t\t\t\tpadding-left: 8px;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbutton {\n\t\t\t\t\tbackground-color: grey;\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tborder: 1px solid darkgrey;\n\t\t\t\t\tpadding: 3px;\n\t\t\t\t\tpadding-left: 8px;\n\t\t\t\t\tpadding-right: 8px;\n\t\t\t\t\tborder-radius: 4px;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t}\n\t\t\t\t.close-button {\n\t\t\t\t\topacity: .7;\n\t\t\t\t\tpadding-left: 8px;\n\t\t\t\t\tpadding-right: 8px;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t\ttransition: opacity 250ms;\n\t\t\t\t\theight: 16px;\n\t\t\t\t\tfont-size: 13px;\n\t\t\t\t\talign-self: center;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar button, .singlefile-share-page-bar button{\n\t\t\t\t\tbackground-color: dimgrey;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar .close-button, .singlefile-share-page-bar .close-button{\n\t\t\t\t\tfilter: invert(1);\n\t\t\t\t}\n\t\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\t\t.singlefile-open-file-bar.container, .singlefile-share-page-bar.container {\n\t\t\t\t\t\tbackground-color: #1c1b22;\n\t\t\t\t\t\tborder-block-end: #4a4a55 1px solid;\n\t\t\t\t\t}\n\t\t\t\t\t.singlefile-open-file-bar a, .singlefile-share-page-bar a {\n\t\t\t\t\t\tcolor: #8ab4f8;\n\t\t\t\t\t}\n\t\t\t\t\t.singlefile-open-file-bar .close-button, .singlefile-share-page-bar .close-button {\n\t\t\t\t\t\tfilter: none;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ta {\n\t\t\t\t\tcolor: #303036;\n\t\t\t\t}\n\t\t\t\t.close-button:hover {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t",i.appendChild(s);const c=document.createElement("div");c.classList.add(t),c.classList.add("container");const l=document.createElement("span");l.classList.add("text");const d=e.split("__DOC_LINK__");if(l.textContent=d[0],n&&2==d.length){const t=document.createElement("a");t.textContent=n,t.href=n,t.target="_blank",l.appendChild(t),l.appendChild(document.createTextNode(d[1]))}if(r&&o){const t=document.createElement("button");t.textContent=r,t.onclick=()=>o(),l.appendChild(t)}c.appendChild(l);const u=document.createElement("img");u.classList.add("close-button"),c.appendChild(u),i.appendChild(c),u.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSlUqHewg4hChOogFURFHqWIRLJS2QqsOJpf+CE0akhQXR8G14ODPYtXBxVlXB1dBEPwBcXNzUnSREr9LCi1ivOO4h/e+9+XuO0Col5lqdowDqmYZqXhMzOZWxMAruhGiOYohiZl6Ir2Qgef4uoeP73dRnuVd9+foVfImA3wi8SzTDYt4nXh609I57xOHWUlSiM+Jxwy6IPEj12WX3zgXHRZ4ZtjIpOaIw8RisY3lNmYlQyWeIo4oqkb5QtZlhfMWZ7VcZc178hcG89pymuu0BhHHIhJIQoSMKjZQhoUo7RopJlJ0HvPwDzj+JLlkcm2AkWMeFaiQHD/4H/zurVmYnHCTgjGg88W2P4aBwC7QqNn297FtN04A/zNwpbX8lTow80l6raVFjoDQNnBx3dLkPeByB+h/0iVDciQ/LaFQAN7P6JtyQN8t0LPq9q15jtMHIEO9WroBDg6BkSJlr3m8u6u9b//WNPv3A6mTcr3f/E/sAAAABmJLR0QAigCKAIrj2uckAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QkPDysvCdPVuwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAELSURBVHja7ZpLFsIwDAPj3v/OsGHDe1BIa8tKO7Mnlkw+dpoxAAAAAGCfx4ur6Yx/B337UUS4mp/VuWUEcjSfOgO+BXCZCWe0hSqQo/npBLglIUNLdAV2MH84Ad1JyIwdLkK6YoabIHWscBWmihHuAqvHtv+XqmdXOK9TxdKy3axUm2vZkXXGgPJksTuz1bVFeeU2Y6ijsLIpXbtKa1kDs2ews69o7+A+ihJ2lvI+/lcS1G21zUVG18XKNm4OS4BNkGOQQohSmGaIdpgLESvzyiRwKepsXjE2H0ZWMF8Zi4+jK5mviM0DiRXNZ2rhkdTK5jO0xermz2o8dCnq+FS2XNNVH0sDAAAA3JYnre9cH8BZmhEAAAAASUVORK5CYII=",u.onclick=t=>{0===t.button&&(o&&o(!0),a.remove())},document.documentElement.appendChild(a)}}catch(t){}}const Wt=16777216;let Gt,Ht,qt,zt,Vt;try{Gt=browser.i18n.getMessage("topPanelEmbeddedImageButton"),Ht=browser.i18n.getMessage("topPanelSharePageButton"),qt=browser.i18n.getMessage("topPanelShareSelectionButton"),zt=browser.i18n.getMessage("topPanelError")}catch(t){}async function Xt(t,e){e.includeBOM&&"string"==typeof t.content&&(t.content="\ufeff"+t.content);const n=e.embeddedImage,r={method:"downloads.download",taskId:e.taskId,insertTextBody:e.insertTextBody,confirmFilename:e.confirmFilename,filenameConflictAction:e.filenameConflictAction,filename:t.filename,mimeType:t.mimeType,saveToClipboard:e.saveToClipboard,saveToGDrive:e.saveToGDrive,saveToDropbox:e.saveToDropbox,saveWithWebDAV:e.saveWithWebDAV,webDAVURL:e.webDAVURL,webDAVUser:e.webDAVUser,webDAVPassword:e.webDAVPassword,saveWithMCP:e.saveWithMCP,mcpServerUrl:e.mcpServerUrl,mcpAuthToken:e.mcpAuthToken,saveToGitHub:e.saveToGitHub,githubToken:e.githubToken,githubUser:e.githubUser,githubRepository:e.githubRepository,githubBranch:e.githubBranch,saveWithCompanion:e.saveWithCompanion,forceWebAuthFlow:e.forceWebAuthFlow,filenameReplacementCharacter:e.filenameReplacementCharacter,openEditor:e.openEditor,openSavedPage:e.openSavedPage,compressHTML:e.compressHTML,backgroundSave:e.backgroundSave,bookmarkId:e.bookmarkId,replaceBookmarkURL:e.replaceBookmarkURL,applySystemTheme:e.applySystemTheme,contentWidth:e.contentWidth,defaultEditorMode:e.defaultEditorMode,includeInfobar:e.includeInfobar,openInfobar:e.openInfobar,animateInfobar:e.animateInfobar,warnUnsavedPage:e.warnUnsavedPage,createRootDirectory:e.createRootDirectory,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,embeddedImage:n?Array.from(n):null,preventAppendedData:e.preventAppendedData,maxAppendedDataLength:e.maxAppendedDataLength,extractDataFromPage:e.extractDataFromPage,insertCanonicalLink:e.insertCanonicalLink,insertMetaNoIndex:e.insertMetaNoIndex,insertMetaCSP:e.insertMetaCSP,password:e.password,compressContent:e.compressContent,foregroundSave:e.foregroundSave,sharePage:e.sharePage,saveToRestFormApi:e.saveToRestFormApi,saveToRestFormApiUrl:e.saveToRestFormApiUrl,saveToRestFormApiFileFieldName:e.saveToRestFormApiFileFieldName,saveToRestFormApiUrlFieldName:e.saveToRestFormApiUrlFieldName,saveToRestFormApiToken:e.saveToRestFormApiToken,saveToS3:e.saveToS3,S3Domain:e.S3Domain,S3Region:e.S3Region,S3Bucket:e.S3Bucket,S3AccessKey:e.S3AccessKey,S3SecretKey:e.S3SecretKey,infobarPositionAbsolute:e.infobarPositionAbsolute,infobarPositionTop:e.infobarPositionTop,infobarPositionBottom:e.infobarPositionBottom,infobarPositionLeft:e.infobarPositionLeft,infobarPositionRight:e.infobarPositionRight,originalUrl:e.url,title:t.title},o=setInterval(()=>{browser.runtime.sendMessage({method:"ping"}).then(()=>{})},15e3);if(e.compressContent)if((!e.backgroundSave||e.saveToGDrive||e.saveToGitHub||e.saveWithCompanion||e.saveWithWebDAV||e.saveWithMCP||e.saveToDropbox||e.saveToRestFormApi||e.saveToS3)&&e.confirmFilename&&!e.openEditor&&(t.filename=st("Save as",t.filename)),t.filename){const o=new Blob([await s(t)],{type:t.mimeType}),a=URL.createObjectURL(o);r.filename=t.filename,r.blobURL=a,r.blob=o;const i=await browser.runtime.sendMessage(r);if(URL.revokeObjectURL(a),i.error){r.embeddedImage=n,r.blobURL=null,r.blob=null,r.pageData=t;const e=d(r);for await(const t of e)await browser.runtime.sendMessage({method:"downloads.download",compressContent:!0,data:Array.from(t)});await browser.runtime.sendMessage({method:"downloads.download",compressContent:!0,mimeType:t.mimeType})}if(e.backgroundSave){const n=e.openEditor?null:t.hash;await browser.runtime.sendMessage({method:"downloads.end",taskId:e.taskId,hash:n,woleetKey:e.woleetKey})}}else browser.runtime.sendMessage({method:"downloads.cancel"}),browser.runtime.sendMessage({method:"ui.processCancelled"});else{if(e.backgroundSave&&!e.sharePage||e.openEditor||e.saveToGDrive||e.saveToGitHub||e.saveWithCompanion||e.saveWithWebDAV||e.saveWithMCP||e.saveToDropbox||e.saveToRestFormApi||e.saveToS3){let n=t.filename;if((e.saveToGDrive||e.saveToGitHub||e.saveWithCompanion||e.saveWithWebDAV||e.saveWithMCP||e.saveToDropbox||e.saveToRestFormApi||e.saveToS3)&&e.confirmFilename&&!e.openEditor&&(n=st("Save as",t.filename)),n){r.filename=t.filename=n;const e=new Blob([t.content],{type:t.mimeType}),o=URL.createObjectURL(e);r.blobURL=o,r.blob=e;const a=await browser.runtime.sendMessage(r);if(URL.revokeObjectURL(o),a.error){r.blobURL=null,r.blob=null;for(let e=0;e*WtWt,r.truncated?(r.finished=(e+1)*Wt>=t.content.length,r.content=t.content.substring(e*Wt,(e+1)*Wt)):r.content=t.content,await browser.runtime.sendMessage(r)}}else browser.runtime.sendMessage({method:"downloads.cancel"}),browser.runtime.sendMessage({method:"ui.processCancelled"})}else e.saveToClipboard?function(t){const e="copy";function n(e){e.clipboardData.setData(t.mimeType,t.content),e.clipboardData.setData("text/plain",t.content),e.preventDefault()}document.addEventListener(e,n),document.execCommand(e),document.removeEventListener(e,n)}(t):await Kt(t,e),e.openSavedPage&&open(URL.createObjectURL(new Blob([t.content],{type:t.mimeType}))),browser.runtime.sendMessage({method:"ui.processEnd"});const n=e.openEditor?null:t.hash;await browser.runtime.sendMessage({method:"downloads.end",taskId:e.taskId,hash:n,woleetKey:e.woleetKey})}clearInterval(o)}async function Kt(t,e){if(Array.isArray(t.content)&&(t.content=new Uint8Array(t.content)),e.sharePage&&navigator.share)await Zt(t,e);else{let n=t.filename;if(e.confirmFilename&&(n=st("Save as",t.filename),n?t.filename=n:(browser.runtime.sendMessage({method:"downloads.cancel"}),browser.runtime.sendMessage({method:"ui.processCancelled"}))),n){const e=document.createElement("a");return e.download=t.filename,e.href=URL.createObjectURL(new Blob([t.content],{type:t.mimeType})),e.dispatchEvent(new MouseEvent("click")),new Promise(t=>setTimeout(()=>{URL.revokeObjectURL(e.href),t()},1e3))}}}async function Zt(t,e){Vt=function(){let t;return{display:async function(e){return new Promise(n=>{t=n,jt(Rt,"",{buttonLabel:e?kt:Ut,buttonOnclick:n})})},hide:function(){const t=document.querySelector(Rt);t&&t.remove()},cancel:function(){this.hide(),t&&t(!0)}}}();if(!await Vt.display(e.selected)){const n={files:[new File([t.content],t.filename,{type:t.mimeType})]};try{await navigator.share(n),Vt.hide()}catch(n){if(Vt.hide(),"AbortError"!==n.name)throw n;await Zt(t,e)}}}Ot({EMBEDDED_IMAGE_BUTTON_MESSAGE:Gt,SHARE_PAGE_BUTTON_MESSAGE:Ht,SHARE_SELECTION_BUTTON_MESSAGE:qt,ERROR_TITLE_MESSAGE:zt});const Qt="single-file-response-fetch",$t="Host fetch error (SingleFile)",Jt=Boolean(window.wrappedJSObject),Yt=["http:","https:"],te=["no-referrer-when-downgrade","strict-origin","strict-origin-when-cross-origin"],ee=["no-referrer","no-referrer-when-downgrade","origin","origin-when-cross-origin","same-origin","strict-origin","strict-origin-when-cross-origin","unsafe-url"],ne=window.fetch.bind(window);let re,oe=0,ae=new Map;async function ie(t,e={},n=!0){try{const r={cache:e.cache||"force-cache",headers:e.headers,referrerPolicy:se(t,e)?"no-referrer":e.referrerPolicy||"strict-origin-when-cross-origin"};let o;try{o=e.referrer&&!Jt||!n?await ne(t,r):await async function(t,e){if(void 0===re&&(re=!1,document.addEventListener("single-file-response-fetch-supported",()=>re=!0,!1),document.dispatchEvent(new CustomEvent("single-file-request-fetch-supported"))),re)return new Promise((n,r)=>{document.addEventListener(Qt,function e(o){o.detail?o.detail.url==t&&(document.removeEventListener(Qt,e,!1),o.detail.response?n({status:o.detail.status,headers:ce(o.detail.headers),arrayBuffer:async()=>o.detail.response}):r(new Error(o.detail.error))):(document.removeEventListener(Qt,e,!1),r(new Error($t)))},!1),document.dispatchEvent(new CustomEvent("single-file-request-fetch",{detail:JSON.stringify({url:t,options:e})}))});throw new Error($t)}(t,r),401!=o.status&&403!=o.status&&404!=o.status||"no-referrer"==r.referrerPolicy||e.referrer||(o=await ie(t,{...r,referrerPolicy:"no-referrer"},n))}catch(a){if(a&&a.message==$t)o=await ie(t,{...r},!1);else{if("no-referrer"==r.referrerPolicy||e.referrer)throw a;o=await ie(t,{...r,referrerPolicy:"no-referrer"},n)}}return o}catch(n){oe++;const r=new Promise((t,e)=>ae.set(oe,{resolve:t,reject:e}));return await le({method:"singlefile.fetch",url:t,requestId:oe,referrer:e.referrer,headers:e.headers}),r}}function se(t,{stylesheetURL:e,stylesheetReferrerPolicy:n}={}){if(!e)return!1;let r,o;try{r=new URL(e),o=new URL(t,e)}catch{return!1}if(!Yt.includes(r.protocol)||!Yt.includes(o.protocol))return!0;let a="strict-origin-when-cross-origin";String(n||"").split(",").forEach(t=>{t=t.trim().toLowerCase(),ee.includes(t)&&(a=t)});const i="https:"==r.protocol&&"https:"!=o.protocol;return"no-referrer"==a||"same-origin"==a&&o.origin!=r.origin||i&&te.includes(a)}function ce(t){return new Headers(t?Array.from(t,t=>[t[0],t[1]]):[])}async function le(t){const e=await browser.runtime.sendMessage(t);if(!e||e.error)throw new Error(e&&e.error&&e.error.toString());return e}browser.runtime.onMessage.addListener(t=>"singlefile.fetchFrame"==t.method&&window.frameId&&window.frameId==t.frameId?async function(t){try{const e=await ne(t.url,{cache:"force-cache",headers:t.headers,referrerPolicy:"strict-origin-when-cross-origin"});return{status:e.status,headers:[...e.headers],array:Array.from(new Uint8Array(await e.arrayBuffer()))}}catch(t){return{error:t&&(t.message||t.toString())}}}(t):"singlefile.fetchResponse"==t.method?async function(t){const e=ae.get(t.requestId);e&&(t.error?(e.reject(new Error(t.error)),ae.delete(t.requestId)):(t.truncated&&(e.array?e.array=e.array.concat(t.array):(e.array=t.array,ae.set(t.requestId,e)),t.finished&&(t.array=e.array)),t.truncated&&!t.finished||(e.resolve({status:t.status,headers:ce(t.headers),arrayBuffer:async()=>new Uint8Array(t.array).buffer}),ae.delete(t.requestId))));return{}}(t):void 0);const de=globalThis.singlefile,ue=globalThis.singlefileBootstrap,fe="moz-extension:",me=browser.i18n.getMessage("topPanelEmbeddedImageButton"),pe=browser.i18n.getMessage("topPanelSharePageButton"),he=browser.i18n.getMessage("topPanelShareSelectionButton"),ge=browser.i18n.getMessage("topPanelError");let ye,we,be,Ae,ve,Ee,Se;function Ce(){browser.runtime.sendMessage({method:"downloads.cancel"})}function Te(t){"Escape"==t.key&&globalThis.singlefileBootstrap.cancelSave&&(t.preventDefault(),t.stopPropagation(),"keyup"==t.type&&globalThis.singlefileBootstrap.cancelSave())}async function Pe(t){const e=de.processors.frameTree;let n;de.helper.initDoc(document),lt(t,Ce),ye=new de.SingleFile(t);const r=[];let o,a=0,i=0;t.onprogress=async t=>{const{options:e}=t.detail;if(!ye.cancelled){if(t.type==t.RESOURCES_INITIALIZING&&!o&&e.insertEmbeddedScreenshotImage&&e.compressContent){o=!0,ct(!1);const t=await browser.runtime.sendMessage({method:"tabs.getScreenshot",width:document.documentElement.scrollWidth,height:document.documentElement.scrollHeight,innerHeight:globalThis.innerHeight});ct(!0),mt(e),e.embeddedImage=new Uint8Array(await(await ie(t)).arrayBuffer()),URL.revokeObjectURL(t),pt(e)}t.type==t.RESOURCES_INITIALIZED&&(i=t.detail.max,e.loadDeferredContent&&de.processors.lazy.resetZoomLevel(e)),t.type==t.RESOURCES_INITIALIZED||t.type==t.RESOURCE_LOADED?(t.type==t.RESOURCE_LOADED&&a++,e.silent||await browser.runtime.sendMessage({method:"ui.processProgress",index:a,maxIndex:i}),ft(a,i,e)):t.detail.frame||t.type==t.PAGE_LOADING||t.type==t.PAGE_LOADED||(t.type==t.STAGE_STARTED?t.detail.step<3&&function(t,e){Et("step-"+t,`${nt} ${t+1} / 3`,"…",e)}(t.detail.step,e):t.type==t.STAGE_ENDED&&t.detail.step<3&&function(t,e){Et("step-"+t,`${nt} ${t+1} / 3`,"✓",e)}(t.detail.step,e))}};const s=globalThis._singleFile_waitForUserScript;t.userScriptEnabled&&s&&await s("single-file-on-init-capture",t);const c=ye.cancel.bind(ye);if(t.insertEmbeddedImage&&t.compressContent){mt(t),Ae=function(){let t;return{display:async function(){return new Promise(e=>{t=e,jt(xt,"",{buttonLabel:Lt,buttonOnclick:e})})},hide:function(){const t=document.querySelector(xt);t&&t.remove()},cancel:function(){this.hide(),t&&t(!0)}}}();await Ae.display()||(t.embeddedImage=await Ft({accept:"image/*"}),Ae.hide()),pt(t)}if(!t.saveRawPage&&!ye.cancelled){let n;if(t.loadDeferredContent&&(n=de.processors.lazy.process(t),function(t){Et("load-deferred-content",Y,"…",t)}(t),n.then(()=>{ye.cancelled||function(t){Et("load-deferred-content",Y,"✓",t)}(t)}),t.loadDeferredContentBeforeFrames&&await n),!t.removeFrames&&e&&globalThis.frames){let n;n=t.loadDeferredContent?new Promise(n=>globalThis.setTimeout(()=>n(e.getAsync(t)),t.loadDeferredContentBeforeFrames||!t.loadDeferredContent?0:t.loadDeferredContentMaxIdleTime)):e.getAsync(t),function(t){Et("load-frames",tt,"…",t)}(t),n.then(()=>{ye.cancelled||function(t){Et("load-frames",tt,"✓",t)}(t)}),t.loadDeferredContentBeforeFrames?t.frames=await new Promise(t=>{ye.cancel=function(){c(),t([])},n.then(t)}):r.push(n)}t.loadDeferredContent&&!t.loadDeferredContentBeforeFrames&&r.push(n)}t.loadDeferredContentBeforeFrames||ye.cancelled||([t.frames]=await new Promise(t=>{const e=Promise.all(r);ye.cancel=function(){c(),t([[]])},e.then(()=>t(e))})),t.delayBeforeProcessing&&await new Promise(e=>setTimeout(e,1e3*t.delayBeforeProcessing)),n=t.frames&&t.frames.sessionId;const l=t.frames&&t.frames.find(t=>t.requestedFrame);let d;return t.win=globalThis,l?(t.content=l.content,t.url=l.baseURI,t.canvases=l.canvases,t.fonts=l.fonts,t.stylesheets=l.stylesheets,t.images=l.images,t.posters=l.posters,t.videos=l.videos,t.usedFonts=l.usedFonts,t.shadowRoots=l.shadowRoots,t.adoptedStyleSheets=l.adoptedStyleSheets,t.worklets=l.worklets):t.doc=document,ye.cancelled||await ye.run(),n&&e.cleanup(n),ye.cancelled||(t.confirmInfobarContent&&(t.infobarContent=st("Infobar content",t.infobarContent)||""),d=await ye.getPageData(),(t.selected||t.optionallySelected)&&document.querySelectorAll("["+O+"]").forEach(t=>t.removeAttribute(O)),dt(),t.displayStats&&(console.log("SingleFile stats"),console.table(d.stats))),t.delayAfterProcessing&&await new Promise(e=>setTimeout(e,1e3*t.delayAfterProcessing)),d}Ot({EMBEDDED_IMAGE_BUTTON_MESSAGE:me,SHARE_PAGE_BUTTON_MESSAGE:pe,SHARE_SELECTION_BUTTON_MESSAGE:he,ERROR_TITLE_MESSAGE:ge}),ue&&ue.initializedSingleFile||(de.init({fetch:ie,frameFetch:async function(t,e){const n=await le({method:"singlefile.fetchFrame",url:t,frameId:e.frameId,referrer:e.referrer,headers:e.headers});return{status:n.status,headers:ce(n.headers),arrayBuffer:async()=>new Uint8Array(n.array).buffer}}}),browser.runtime.onMessage.addListener(t=>{if("content.save"==t.method||"content.capture"==t.method||"content.cancelSave"==t.method||"content.download"==t.method||"content.getSelectedLinks"==t.method||"content.error"==t.method||"content.prompt"==t.method||"content.beginScrollTo"==t.method||"content.scrollTo"==t.method||"content.endScrollTo"==t.method)return async function(t){if(!location.href.startsWith(fe)){if("content.save"==t.method)return await async function(t){const e=setInterval(()=>{browser.runtime.sendMessage({method:"ping"}).then(()=>{})},15e3),n=t.options;let r;(n.selected||n.optionallySelected)&&(r=await gt(n.optionallySelected));if(!(we||ue&&ue.pageInfo.processing)){if(n.visitDate=ue?ue.pageInfo.visitDate:new Date,n.optionallySelected&&r&&(n.selected=!0),!n.selected||r){ue&&(ue.pageInfo.processing=!0),we=!0;try{const t=await Pe(n);t&&await Xt(t,n)}catch(t){if(!ye.cancelled){console.error(t);const e=t&&(t.message||t.toString());browser.runtime.sendMessage({method:"ui.processError",error:e}),Mt(e)}}finally{dt()}}else browser.runtime.sendMessage({method:"ui.processCancelled"});we=!1,ue&&(ue.pageInfo.processing=!1)}clearInterval(e)}(t),{};if("content.capture"==t.method)return async function(t){const e=setInterval(()=>{browser.runtime.sendMessage({method:"ping"}).then(()=>{})},15e3),n=t.options;let r;(n.selected||n.optionallySelected)&&(r=await gt(n.optionallySelected));if(we||ue&&ue.pageInfo.processing)throw clearInterval(e),new Error("SingleFile is already processing this page");n.visitDate=ue?ue.pageInfo.visitDate:new Date,n.optionallySelected&&r&&(n.selected=!0);if(n.selected&&!r)throw clearInterval(e),new Error("No selected content found");ue&&(ue.pageInfo.processing=!0);we=!0;try{return await Pe(n)}finally{we=!1,ue&&(ue.pageInfo.processing=!1),clearInterval(e)}}(t);if("content.cancelSave"==t.method)return ye&&(ye.cancel(),dt(),Ae&&(Ae.cancel(),Ae=null),browser.runtime.sendMessage({method:"ui.processCancelled"})),t.options.loadDeferredContent&&de.processors.lazy.resetZoomLevel(t.options),{};if("content.getSelectedLinks"==t.method)return{urls:ht()};if("content.download"==t.method){be||(be=A());const e=await be.next(t.data);if(e.done){be=null;try{await Kt(e.value,{foregroundSave:e.value.foregroundSave,sharePage:e.value.sharePage})}catch(t){return{error:t&&(t.message||t.toString())}}finally{await browser.runtime.sendMessage({method:"downloads.end",taskId:e.value.taskId})}}return{}}if("content.error"==t.method)return Mt(t.error,t.link),{};if("content.prompt"==t.method)return st(t.message,t.value);if("content.beginScrollTo"==t.method)return ve=globalThis.scrollY,Ee=document.documentElement.style.getPropertyValue("transform"),Se=document.documentElement.style.getPropertyValue("overflow"),globalThis.scrollTo(0,0),document.documentElement.style.setProperty("transform","translateY(0px)"),document.documentElement.style.setProperty("overflow","hidden"),{};if("content.scrollTo"==t.method)return document.documentElement.style.setProperty("transform","translateY(-"+t.y+"px)"),await new Promise(t=>setTimeout(t,500)),{};if("content.endScrollTo"==t.method)return globalThis.scrollTo(0,ve),document.documentElement.style.setProperty("transform",Ee),document.documentElement.style.setProperty("overflow",Se),{}}}(t)}),ue?ue.initializedSingleFile=!0:(globalThis.singlefileBootstrap={initializedSingleFile:!0},addEventListener("keydown",Te,!0),addEventListener("keyup",Te,!0)))}(); diff --git a/src/core/bg/editor.js b/src/core/bg/editor.js index d0a6ea790..7b2e3654f 100644 --- a/src/core/bg/editor.js +++ b/src/core/bg/editor.js @@ -81,7 +81,7 @@ async function onMessage(message, sender) { }; message.truncated = content.length > MAX_CONTENT_SIZE; if (message.truncated) { - message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > content.length; + message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE >= content.length; message.content = content.substring(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE); if (message.finished) { message.options = options; diff --git a/src/core/common/download.js b/src/core/common/download.js index 901fd5c7c..4c6c1a7e9 100644 --- a/src/core/common/download.js +++ b/src/core/common/download.js @@ -193,7 +193,7 @@ async function downloadPage(pageData, options) { for (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE < pageData.content.length; blockIndex++) { message.truncated = pageData.content.length > MAX_CONTENT_SIZE; if (message.truncated) { - message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > pageData.content.length; + message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE >= pageData.content.length; message.content = pageData.content.substring(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE); } else { message.content = pageData.content; diff --git a/src/core/content/content-bootstrap.js b/src/core/content/content-bootstrap.js index 4362c6c82..eac38b790 100644 --- a/src/core/content/content-bootstrap.js +++ b/src/core/content/content-bootstrap.js @@ -335,7 +335,7 @@ async function openEditor(document) { }; message.truncated = content.length > MAX_CONTENT_SIZE; if (message.truncated) { - message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > content.length; + message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE >= content.length; if (content instanceof Uint8Array) { message.content = Array.from(content.subarray(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE)); } else {