From d28799f234b4e75d74d982c90d22fe32c13c0460 Mon Sep 17 00:00:00 2001 From: Thomas Durieux <5577568+tdurieux@users.noreply.github.com> Date: Tue, 29 Sep 2026 23:09:51 +0000 Subject: [PATCH 01/34] fix: reconnect anonymizations to recreated source repositories --- public/asset-manifest.json | 2 +- public/partials/anonymize.htm | 6 + public/script/app.js | 30 ++++- public/script/vendor.min.js | 28 ++--- src/server/routes/repository-private.ts | 48 +++++-- test/repository-reconnect.test.js | 159 ++++++++++++++++++++++++ test/vue-ui.test.js | 41 ++++++ 7 files changed, 284 insertions(+), 30 deletions(-) create mode 100644 test/repository-reconnect.test.js diff --git a/public/asset-manifest.json b/public/asset-manifest.json index 38f88f4..aa52a20 100644 --- a/public/asset-manifest.json +++ b/public/asset-manifest.json @@ -1,6 +1,6 @@ { "core.min.js": "core.3b07189932.min.js", - "vendor.min.js": "vendor.3036803e29.min.js", + "vendor.min.js": "vendor.bc790a8831.min.js", "mermaid.min.js": "mermaid.f848a72d16.min.js", "all.min.css": "all.5fbafcda4e.min.css", "markdown.min.js": "markdown.44f2e93820.min.js", diff --git a/public/partials/anonymize.htm b/public/partials/anonymize.htm index 2b6e772..909dc92 100644 --- a/public/partials/anonymize.htm +++ b/public/partials/anonymize.htm @@ -106,6 +106,12 @@
Loading GitHub info for "+w.repoId+"..."),t.get("/api/admin/repos/"+w.repoId+"/github").then(T=>{b&&(b.document.open(),b.document.write('
'+JSON.stringify(T.data,null,2).replace(/[<>]/g,N=>N==="<"?"<":">")+""),b.document.close())},T=>{let N=T&&T.data?JSON.stringify(T.data,null,2):String(T);b&&(b.document.body.innerHTML='
'+N+"")})},e.statusCountFor=w=>{let b=(e.statusCounts||[]).find(T=>T._id===w);return b?b.count:0},e.statusStorageFor=w=>{let b=(e.statusCounts||[]).find(T=>T._id===w);return b?b.storage:0},e.isErrorsOnly=()=>e.query&&e.query.error&&!e.query.ready&&!e.query.preparing&&!e.query.expired&&!e.query.removed,e.toggleErrorsOnly=()=>{e.isErrorsOnly()?Object.assign(e.query,{ready:!1,preparing:!0,expired:!1,removed:!1,error:!0}):Object.assign(e.query,{ready:!1,preparing:!1,expired:!1,removed:!1,error:!0}),e.query.page=1},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=w=>{e.query.sort===w?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=w,e.query.direction="desc"),e.query.page=1},e.sortIcon=w=>e.query.sort===w?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let u="admin.repos.filterPrefs",m={page:1,limit:25,sort:"lastView",direction:"desc",search:"",owner:"",conference:"",dateFrom:"",dateTo:"",ready:!1,expired:!1,removed:!1,error:!0,preparing:!0},h=loadFilterPrefs(u)||{};e.query=Object.assign({},m,h,{page:1,search:""});let v=o.search();v.owner&&(e.query.owner=v.owner),v.conference&&(e.query.conference=v.conference),v.search&&(e.query.search=v.search);let k="admin.repos.presets";e.presets=JSON.parse(localStorage.getItem(k)||"[]"),e.savePreset=()=>{let w=window.prompt("Preset name:");if(!w)return;let b=Object.assign({},e.query);delete b.page,e.presets=(e.presets||[]).filter(T=>T.name!==w),e.presets.push({name:w,query:b}),localStorage.setItem(k,JSON.stringify(e.presets))},e.applyPreset=w=>{Object.assign(e.query,w.query,{page:1})},e.deletePreset=w=>{e.presets=(e.presets||[]).filter(b=>b.name!==w.name),localStorage.setItem(k,JSON.stringify(e.presets))},e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,e.repositories.forEach(w=>{e.selected[w.repoId]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedRepos=()=>e.repositories.filter(w=>e.selected[w.repoId]),e.bulkRefresh=()=>{let w=e.selectedRepos();w.length&&confirm(`Force refresh ${w.length} repositories?`)&&w.forEach(b=>e.updateRepository(b))},e.bulkRemoveCache=()=>{let w=e.selectedRepos();w.length&&confirm(`Purge cache for ${w.length} repositories?`)&&w.forEach(b=>e.removeCache(b))},e.clearSelection=()=>{e.selected={},e.allSelected=!1},e.exportCsv=()=>{let w=new URLSearchParams(Object.entries(e.query).filter(([,b])=>b!==""&&b!==!1&&b!=null));w.set("format","csv"),w.set("limit","10000"),window.open("/api/admin/repos?"+w.toString(),"_blank")},e.removeCache=w=>{confirm("Remove cached files for "+w.repoId+"?")&&t.delete("/api/admin/repos/"+w.repoId).then(()=>p(),b=>console.error(b))},e.removeRepository=w=>{confirm("Remove repository "+w.repoId+"?")&&t.delete("/api/repo/"+w.repoId+"/").then(()=>p(),b=>console.error(b))},e.updateRepository=w=>{let b=ze({title:`Refreshing ${w.repoId}...`,date:new Date,body:`The repository ${w.repoId} is going to be refreshed.`});e.toasts.push(b),t.post(`/api/repo/${w.repoId}/refresh`).then(T=>{T.data.status=="ready"?b.title=`${w.repoId} is refreshed.`:b.title=`Refreshing of ${w.repoId}.`},T=>{b.title=`Error during the refresh of ${w.repoId}.`,b.body=T.body})},e.fetchError=null;function p(){e.fetchError=null,t.get("/api/admin/repos",{params:e.query}).then(w=>{e.total=w.data.total,e.totalPage=Math.ceil(w.data.total/e.query.limit),e.repositories=w.data.results,e.statusCounts=w.data.statusCounts||[],e.totalSize=w.data.totalSize||0,e.allSelected=!1},w=>{e.fetchError=w&&w.data&&w.data.error||"Failed to load repositories",console.error(w)})}p();let g=null;e.watch("query",()=>{r.timeout.cancel(g),g=r.timeout(p,500);let{page:w,search:b,...T}=e.query;saveFilterPrefs(u,T),a()},!0),a()},Ua=function(e,t,o){let r=mt(),n=as();e.Math=Math,e.watch("user.status",()=>{e.user==null&&o.url("/")}),e.user==null&&o.url("/"),e.users=[],e.total=-1,e.totalPage=0,e.statusCounts=[],e.selected={},e.allSelected=!1;let i=p=>{if(p.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement?.tagName)){p.preventDefault();let g=document.querySelector('.admin-filter-toolbar input[type="search"]');g&&g.focus()}};n(document,"keydown",i),e.on("dispose",()=>document.removeEventListener("keydown",i)),e.clearFilter=p=>{p==="dateRange"?(e.query.dateFrom="",e.query.dateTo=""):e.query[p]="",e.query.page=1},e.chips=[];let a=()=>{let p=[];e.query.role&&p.push({key:"role",label:"Role",value:e.query.role}),e.chips=p};e.statusCountFor=p=>{let g=(e.statusCounts||[]).find(w=>w._id===p);return g?g.count:0},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=p=>{e.query.sort===p?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=p,e.query.direction="desc"),e.query.page=1},e.sortIcon=p=>e.query.sort===p?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let u="admin.users.filterPrefs",m={page:1,limit:25,sort:"username",direction:"asc",search:"",status:"",role:"",dateFrom:"",dateTo:""},h=loadFilterPrefs(u)||{};e.query=Object.assign({},m,h,{page:1,search:""}),e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,e.users.forEach(p=>{e.selected[p.username]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedUsers=()=>e.users.filter(p=>e.selected[p.username]),e.banUser=p=>{confirm(`Ban user ${p.username}?`)&&t.post(`/api/admin/users/${p.username}/ban`).then(v,g=>console.error(g))},e.activateUser=p=>{t.post(`/api/admin/users/${p.username}/activate`).then(v,g=>console.error(g))},e.bulkBan=()=>{let p=e.selectedUsers();p.length&&confirm(`Ban ${p.length} users?`)&&p.forEach(g=>e.banUser(g))},e.exportCsv=()=>{let p=new URLSearchParams(Object.entries(e.query).filter(([,g])=>g!==""&&g!==!1&&g!=null));p.set("format","csv"),p.set("limit","10000"),window.open("/api/admin/users?"+p.toString(),"_blank")},e.fetchError=null;function v(){e.fetchError=null,t.get("/api/admin/users",{params:e.query}).then(p=>{e.total=p.data.total,e.totalPage=Math.ceil(p.data.total/e.query.limit),e.users=p.data.results,e.statusCounts=p.data.statusCounts||[],e.allSelected=!1},p=>{e.fetchError=p&&p.data&&p.data.error||"Failed to load users",console.error(p)})}v();let k=null;e.watch("query",()=>{r.timeout.cancel(k),k=r.timeout(v,500);let{page:p,search:g,...w}=e.query;saveFilterPrefs(u,w),a()},!0),a()},Fa=function(e,t,o,r){let n=mt();e.watch("user.status",()=>{e.user==null&&o.url("/")}),e.user==null&&o.url("/"),e.userInfo,e.repositories=[],e.search="",e.selected={},e.allSelected=!1;let i="admin.user.filterPrefs",a={filters:{status:{ready:!0,expired:!0,removed:!0,error:!0,preparing:!0}},sort:"anonymizeDate",direction:"desc"},u=loadFilterPrefs(i)||{};e.filters={status:Object.assign({},a.filters.status,u.filters&&u.filters.status||{})},e.query={sort:u.sort||a.sort,direction:u.direction||a.direction},e.orderBy=(e.query.direction==="asc"?"":"-")+e.query.sort,e.sortBy=p=>{e.query.sort===p?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=p,e.query.direction="desc"),e.orderBy=(e.query.direction==="asc"?"":"-")+e.query.sort},e.sortIcon=p=>e.query.sort===p?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"",e.watch("query",()=>{saveFilterPrefs(i,{filters:e.filters,sort:e.query.sort,direction:e.query.direction})},!0),e.watch("filters",()=>{saveFilterPrefs(i,{filters:e.filters,sort:e.query.sort,direction:e.query.direction})},!0),e.statusCountFor=p=>(e.repositories||[]).filter(g=>g.status===p).length,e.repoFiler=p=>e.filters.status[p.status]==!1?!1:!!(e.search.trim().length==0||p.source.fullName.indexOf(e.search)>-1||p.repoId.indexOf(e.search)>-1||p.statusMessage&&p.statusMessage.indexOf(e.search)>-1||p.conference&&p.conference.indexOf(e.search)>-1),e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,(e.filteredRepositories||e.repositories).forEach(p=>{e.selected[p.repoId]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedRepos=()=>e.repositories.filter(p=>e.selected[p.repoId]),e.bulkRefresh=()=>{let p=e.selectedRepos();p.length&&confirm(`Force refresh ${p.length} repositories?`)&&p.forEach(g=>e.updateRepository(g))},e.bulkRemoveCache=()=>{let p=e.selectedRepos();p.length&&confirm(`Purge cache for ${p.length} repositories?`)&&p.forEach(g=>e.removeCache(g))},e.clearSelection=()=>{e.selected={},e.allSelected=!1},e.exportCsv=()=>{let p=e.filteredRepositories||e.repositories,w=["repoId","status","statusMessage","pageView","anonymizeDate","source.fullName","conference","size.storage"].join(","),b=p.map(R=>[R.repoId,R.status,R.statusMessage||"",R.pageView||0,R.anonymizeDate||"",R.source&&R.source.fullName||"",R.conference||"",R.size&&R.size.storage||0].map(I=>{let C=String(I??"");return/[",\n\r]/.test(C)?'"'+C.replace(/"/g,'""')+'"':C}).join(",")),T=new Blob([w+` +`),e.source=D.data.source,e.options=Object.assign({},e.options,D.data.options),e.conference=D.data.conference,e._originalConference=D.data.conference,D.data.options.expirationDate&&(e.options.expirationDate=new Date(D.data.options.expirationDate)),!await T()&&await se()},()=>{n.url("/404")}))}),t.get("/github/connections").then(D=>{e.githubConnections=D.data,!r.repoId&&!r.pullRequestId&&!r.gistId&&e.githubConnection===void 0&&D.data.appEnabled&&D.data.appConnected&&(e.githubConnection="github-app")}).catch(()=>{}),e.urlSelected=async(D=!1)=>{e.reconnectingSource=!1,e.reconnectRepositoryId=void 0,D||(e.terms=e.defaultTerms),!D&&!e.isUpdate&&(e.repoId="",e.pullRequestId="",e.gistId=""),e.details=null,e.branches=[],D||(e.source={type:"GitHubStream",branch:"",commit:""}),e.anonymize_readme="",e.readme="",e.html_readme="",e.detectedType=null,e.gistOAuthRequired=!1;let V;try{V=parseGithubUrl(e.sourceUrl)}catch{p("sourceUrl","github",!1);return}p("sourceUrl","github",!0);try{V.gistId&&!V.repo?(e.detectedType="gist",e.source={gistId:V.gistId},await se()):V.pullRequestId?(e.detectedType="pr",e.source={repositoryFullName:V.owner+"/"+V.repo,pullRequestId:V.pullRequestId},await Z()):(e.detectedType="repo",await Promise.all([N(),R()]),P())}catch{return}$('[data-toggle="tooltip"]').tooltip()},$('[data-toggle="tooltip"]').tooltip(),e.watch("source.branch",async()=>{if(e.detectedType!=="repo")return;let D=e.branches.filter(W=>W.name==e.source.branch)[0];if(!D)return;!(!e.reconnectingSource&&e.isUpdate&&e._originalBranch===e.source.branch&&!!e.source.commit)&&!(e._preservingDraft&&e.source.commit)&&(e.source.commit=D.commit),e.readme=D.readme,await R(),P()}),e.getBranches=async D=>{let V=parseGithubUrl(e.sourceUrl);try{let W=await t.get(`/api/repo/${V.owner}/${V.repo}/branches`,{params:{reconnect:e.reconnectingSource?"1":void 0,anonymizedRepoId:e.isUpdate&&r.repoId&&g(e.sourceUrl)===e._originalFullName?r.repoId:void 0,connection:e.githubConnection,force:D===!0||e.reconnectingSource?"1":"0",repositoryID:w()}});e.branches=W.data,e.sourceUnreachable=!1,e.source.branch||(e.source.branch=e.details.defaultBranch);let oe=e.branches.filter(le=>le.name==e.source.branch);oe.length>0&&(!(!e.reconnectingSource&&!D&&e.isUpdate&&!e.options.update&&e._originalBranch===e.source.branch&&e.source.commit)&&!(e._preservingDraft&&e.source.commit)&&(e.source.commit=oe[0].commit),e.readme=oe[0].readme,await R(D))}catch(W){e.branches=[],e.sourceUnreachable=W&&(W.status===404||W.data&&W.data.error==="repo_not_found");let oe=W&&W.data&&W.data.error||(W&&W.status===404?"repo_not_found":"unknown_error");i("ERRORS."+oe).then(le=>{e.toasts=e.toasts||[],e.addToast({title:"Error",date:new Date,body:le}),e.error=le},console.error),typeof p=="function"&&p("sourceUrl","missing",!1)}};async function N(){let D=parseGithubUrl(e.sourceUrl);try{Te();let V=await t.get(`/api/repo/${D.owner}/${D.repo}/`,{params:{reconnect:e.reconnectingSource?"1":void 0,anonymizedRepoId:e.isUpdate&&r.repoId&&g(e.sourceUrl)===e._originalFullName?r.repoId:void 0,connection:e.githubConnection,repositoryID:w(),force:"1"}});e.details=V.data,e.reconnectingSource&&(e.reconnectRepositoryId=e.details.externalId),e.details&&e.details.id&&(e.repositoryID=e.details.id),e.repoId||(e.repoId=e.details.repo+"-"+generateRandomId(4)),await e.getBranches(e.reconnectingSource)}catch(V){throw V.data&&(i("ERRORS."+V.data.error).then(W=>{e.addToast({title:"Error",date:new Date,body:W}),e.error=W},console.error),Se(V.data.error)),p("sourceUrl","missing",!1),V}}async function R(D){if(e.readme&&!D)return e.readme;let V=parseGithubUrl(e.sourceUrl);try{let W=await t.get(`/api/repo/${V.owner}/${V.repo}/readme`,{params:{reconnect:e.reconnectingSource?"1":void 0,anonymizedRepoId:e.isUpdate&&r.repoId&&g(e.sourceUrl)===e._originalFullName?r.repoId:void 0,connection:e.githubConnection,force:D===!0?"1":"0",branch:e.source.branch,repositoryID:w()}});e.readme=W.data}catch{e.readme=""}}function I(){let D={terms:e.terms?e.terms.split(` +`):[],image:!!e.options.image,link:!!e.options.link,repoId:e.repoId};e.source&&e.source.branch&&(D.branchName=e.source.branch);try{let V=parseGithubUrl(e.sourceUrl);D.repoName=`${V.owner}/${V.repo}`}catch{}return D}function C(D,V){let W=null,oe=0;return function(){W&&a.cancel(W),W=a(()=>{W=null;let U=++oe,te=D();te&&t.post("/api/anonymize-preview",te).then(L=>{U===oe&&V(L.data)},()=>{})},200)}}let A=C(()=>e.readme?{content:e.readme,options:I()}:null,D=>{e.anonymize_readme=D.content||"";let V="";try{let oe=parseGithubUrl(e.sourceUrl),le=e.source.branch||e.details&&e.details.defaultBranch||"main";V=`https://github.com/${oe.owner}/${oe.repo}/raw/${le}/`}catch{}let W=renderMD(e.anonymize_readme,V);e.html_readme=W,a(Prism.highlightAll,150)});function P(){!e.anonymize||!e.anonymize.terms||(e.termsRegexWarning=!!e.terms&&!!e.terms.match(/[-[\]{}()*+?.,\\^$|#]/g),A())}async function Z(){let D=parseGithubUrl(e.sourceUrl);try{Te();let V=await t.get(`/api/pr/${D.owner}/${D.repo}/${D.pullRequestId}`,{params:{connection:e.githubConnection}});e.details=V.data,e.pullRequestId||(e.pullRequestId=D.repo+"-PR"+D.pullRequestId+"-"+generateRandomId(4))}catch(V){throw V.data&&(i("ERRORS."+V.data.error).then(W=>{e.addToast({title:"Error",date:new Date,body:W}),e.error=W},console.error),Se(V.data.error)),p("sourceUrl","missing",!1),V}}let Y=ze(new Map),j=new Set;function z(){let D=new Set,V=e.details&&e.details.pullRequest;if(!V)return D;typeof V.title=="string"&&D.add(V.title),typeof V.body=="string"&&D.add(V.body),typeof V.diff=="string"&&D.add(V.diff);let W=V.comments||[];for(let oe of W)typeof oe.author=="string"&&D.add(oe.author),typeof oe.body=="string"&&D.add(oe.body);return D}let ae=C(()=>{let D=z();j=D;let V=Array.from(D);return V.length===0?null:{contents:V,options:I()}},D=>{if(!D||!Array.isArray(D.contents))return;let V=Array.from(j),W=new Map;for(let oe=0;oe
Loading GitHub info for "+w.repoId+"..."),t.get("/api/admin/repos/"+w.repoId+"/github").then(T=>{b&&(b.document.open(),b.document.write('
'+JSON.stringify(T.data,null,2).replace(/[<>]/g,N=>N==="<"?"<":">")+""),b.document.close())},T=>{let N=T&&T.data?JSON.stringify(T.data,null,2):String(T);b&&(b.document.body.innerHTML='
'+N+"")})},e.statusCountFor=w=>{let b=(e.statusCounts||[]).find(T=>T._id===w);return b?b.count:0},e.statusStorageFor=w=>{let b=(e.statusCounts||[]).find(T=>T._id===w);return b?b.storage:0},e.isErrorsOnly=()=>e.query&&e.query.error&&!e.query.ready&&!e.query.preparing&&!e.query.expired&&!e.query.removed,e.toggleErrorsOnly=()=>{e.isErrorsOnly()?Object.assign(e.query,{ready:!1,preparing:!0,expired:!1,removed:!1,error:!0}):Object.assign(e.query,{ready:!1,preparing:!1,expired:!1,removed:!1,error:!0}),e.query.page=1},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=w=>{e.query.sort===w?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=w,e.query.direction="desc"),e.query.page=1},e.sortIcon=w=>e.query.sort===w?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let u="admin.repos.filterPrefs",m={page:1,limit:25,sort:"lastView",direction:"desc",search:"",owner:"",conference:"",dateFrom:"",dateTo:"",ready:!1,expired:!1,removed:!1,error:!0,preparing:!0},h=loadFilterPrefs(u)||{};e.query=Object.assign({},m,h,{page:1,search:""});let v=o.search();v.owner&&(e.query.owner=v.owner),v.conference&&(e.query.conference=v.conference),v.search&&(e.query.search=v.search);let k="admin.repos.presets";e.presets=JSON.parse(localStorage.getItem(k)||"[]"),e.savePreset=()=>{let w=window.prompt("Preset name:");if(!w)return;let b=Object.assign({},e.query);delete b.page,e.presets=(e.presets||[]).filter(T=>T.name!==w),e.presets.push({name:w,query:b}),localStorage.setItem(k,JSON.stringify(e.presets))},e.applyPreset=w=>{Object.assign(e.query,w.query,{page:1})},e.deletePreset=w=>{e.presets=(e.presets||[]).filter(b=>b.name!==w.name),localStorage.setItem(k,JSON.stringify(e.presets))},e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,e.repositories.forEach(w=>{e.selected[w.repoId]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedRepos=()=>e.repositories.filter(w=>e.selected[w.repoId]),e.bulkRefresh=()=>{let w=e.selectedRepos();w.length&&confirm(`Force refresh ${w.length} repositories?`)&&w.forEach(b=>e.updateRepository(b))},e.bulkRemoveCache=()=>{let w=e.selectedRepos();w.length&&confirm(`Purge cache for ${w.length} repositories?`)&&w.forEach(b=>e.removeCache(b))},e.clearSelection=()=>{e.selected={},e.allSelected=!1},e.exportCsv=()=>{let w=new URLSearchParams(Object.entries(e.query).filter(([,b])=>b!==""&&b!==!1&&b!=null));w.set("format","csv"),w.set("limit","10000"),window.open("/api/admin/repos?"+w.toString(),"_blank")},e.removeCache=w=>{confirm("Remove cached files for "+w.repoId+"?")&&t.delete("/api/admin/repos/"+w.repoId).then(()=>p(),b=>console.error(b))},e.removeRepository=w=>{confirm("Remove repository "+w.repoId+"?")&&t.delete("/api/repo/"+w.repoId+"/").then(()=>p(),b=>console.error(b))},e.updateRepository=w=>{let b=ze({title:`Refreshing ${w.repoId}...`,date:new Date,body:`The repository ${w.repoId} is going to be refreshed.`});e.toasts.push(b),t.post(`/api/repo/${w.repoId}/refresh`).then(T=>{T.data.status=="ready"?b.title=`${w.repoId} is refreshed.`:b.title=`Refreshing of ${w.repoId}.`},T=>{b.title=`Error during the refresh of ${w.repoId}.`,b.body=T.body})},e.fetchError=null;function p(){e.fetchError=null,t.get("/api/admin/repos",{params:e.query}).then(w=>{e.total=w.data.total,e.totalPage=Math.ceil(w.data.total/e.query.limit),e.repositories=w.data.results,e.statusCounts=w.data.statusCounts||[],e.totalSize=w.data.totalSize||0,e.allSelected=!1},w=>{e.fetchError=w&&w.data&&w.data.error||"Failed to load repositories",console.error(w)})}p();let g=null;e.watch("query",()=>{r.timeout.cancel(g),g=r.timeout(p,500);let{page:w,search:b,...T}=e.query;saveFilterPrefs(u,T),a()},!0),a()},La=function(e,t,o){let r=mt(),n=as();e.Math=Math,e.watch("user.status",()=>{e.user==null&&o.url("/")}),e.user==null&&o.url("/"),e.users=[],e.total=-1,e.totalPage=0,e.statusCounts=[],e.selected={},e.allSelected=!1;let i=p=>{if(p.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement?.tagName)){p.preventDefault();let g=document.querySelector('.admin-filter-toolbar input[type="search"]');g&&g.focus()}};n(document,"keydown",i),e.on("dispose",()=>document.removeEventListener("keydown",i)),e.clearFilter=p=>{p==="dateRange"?(e.query.dateFrom="",e.query.dateTo=""):e.query[p]="",e.query.page=1},e.chips=[];let a=()=>{let p=[];e.query.role&&p.push({key:"role",label:"Role",value:e.query.role}),e.chips=p};e.statusCountFor=p=>{let g=(e.statusCounts||[]).find(w=>w._id===p);return g?g.count:0},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=p=>{e.query.sort===p?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=p,e.query.direction="desc"),e.query.page=1},e.sortIcon=p=>e.query.sort===p?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let u="admin.users.filterPrefs",m={page:1,limit:25,sort:"username",direction:"asc",search:"",status:"",role:"",dateFrom:"",dateTo:""},h=loadFilterPrefs(u)||{};e.query=Object.assign({},m,h,{page:1,search:""}),e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,e.users.forEach(p=>{e.selected[p.username]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedUsers=()=>e.users.filter(p=>e.selected[p.username]),e.banUser=p=>{confirm(`Ban user ${p.username}?`)&&t.post(`/api/admin/users/${p.username}/ban`).then(v,g=>console.error(g))},e.activateUser=p=>{t.post(`/api/admin/users/${p.username}/activate`).then(v,g=>console.error(g))},e.bulkBan=()=>{let p=e.selectedUsers();p.length&&confirm(`Ban ${p.length} users?`)&&p.forEach(g=>e.banUser(g))},e.exportCsv=()=>{let p=new URLSearchParams(Object.entries(e.query).filter(([,g])=>g!==""&&g!==!1&&g!=null));p.set("format","csv"),p.set("limit","10000"),window.open("/api/admin/users?"+p.toString(),"_blank")},e.fetchError=null;function v(){e.fetchError=null,t.get("/api/admin/users",{params:e.query}).then(p=>{e.total=p.data.total,e.totalPage=Math.ceil(p.data.total/e.query.limit),e.users=p.data.results,e.statusCounts=p.data.statusCounts||[],e.allSelected=!1},p=>{e.fetchError=p&&p.data&&p.data.error||"Failed to load users",console.error(p)})}v();let k=null;e.watch("query",()=>{r.timeout.cancel(k),k=r.timeout(v,500);let{page:p,search:g,...w}=e.query;saveFilterPrefs(u,w),a()},!0),a()},Fa=function(e,t,o,r){let n=mt();e.watch("user.status",()=>{e.user==null&&o.url("/")}),e.user==null&&o.url("/"),e.userInfo,e.repositories=[],e.search="",e.selected={},e.allSelected=!1;let i="admin.user.filterPrefs",a={filters:{status:{ready:!0,expired:!0,removed:!0,error:!0,preparing:!0}},sort:"anonymizeDate",direction:"desc"},u=loadFilterPrefs(i)||{};e.filters={status:Object.assign({},a.filters.status,u.filters&&u.filters.status||{})},e.query={sort:u.sort||a.sort,direction:u.direction||a.direction},e.orderBy=(e.query.direction==="asc"?"":"-")+e.query.sort,e.sortBy=p=>{e.query.sort===p?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=p,e.query.direction="desc"),e.orderBy=(e.query.direction==="asc"?"":"-")+e.query.sort},e.sortIcon=p=>e.query.sort===p?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"",e.watch("query",()=>{saveFilterPrefs(i,{filters:e.filters,sort:e.query.sort,direction:e.query.direction})},!0),e.watch("filters",()=>{saveFilterPrefs(i,{filters:e.filters,sort:e.query.sort,direction:e.query.direction})},!0),e.statusCountFor=p=>(e.repositories||[]).filter(g=>g.status===p).length,e.repoFiler=p=>e.filters.status[p.status]==!1?!1:!!(e.search.trim().length==0||p.source.fullName.indexOf(e.search)>-1||p.repoId.indexOf(e.search)>-1||p.statusMessage&&p.statusMessage.indexOf(e.search)>-1||p.conference&&p.conference.indexOf(e.search)>-1),e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,(e.filteredRepositories||e.repositories).forEach(p=>{e.selected[p.repoId]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedRepos=()=>e.repositories.filter(p=>e.selected[p.repoId]),e.bulkRefresh=()=>{let p=e.selectedRepos();p.length&&confirm(`Force refresh ${p.length} repositories?`)&&p.forEach(g=>e.updateRepository(g))},e.bulkRemoveCache=()=>{let p=e.selectedRepos();p.length&&confirm(`Purge cache for ${p.length} repositories?`)&&p.forEach(g=>e.removeCache(g))},e.clearSelection=()=>{e.selected={},e.allSelected=!1},e.exportCsv=()=>{let p=e.filteredRepositories||e.repositories,w=["repoId","status","statusMessage","pageView","anonymizeDate","source.fullName","conference","size.storage"].join(","),b=p.map(R=>[R.repoId,R.status,R.statusMessage||"",R.pageView||0,R.anonymizeDate||"",R.source&&R.source.fullName||"",R.conference||"",R.size&&R.size.storage||0].map(I=>{let C=String(I??"");return/[",\n\r]/.test(C)?'"'+C.replace(/"/g,'""')+'"':C}).join(",")),T=new Blob([w+` `+b.join(` -`)],{type:"text/csv"}),N=document.createElement("a");N.href=URL.createObjectURL(T),N.download=r.username+"-repositories.csv",N.click()},e.showStatusMessage=p=>{let g=p.statusMessage||"(no message)";window.prompt(`Status message for ${p.repoId} (${p.status}):`,g)},e.fetchGithubInfo=p=>{let g=window.open("","_blank");g&&g.document.write("
Loading GitHub info for "+p.repoId+"..."),t.get("/api/admin/repos/"+p.repoId+"/github").then(w=>{g&&(g.document.open(),g.document.write('
'+JSON.stringify(w.data,null,2).replace(/[<>]/g,b=>b==="<"?"<":">")+""),g.document.close())},w=>{let b=w&&w.data?JSON.stringify(w.data,null,2):String(w);g&&(g.document.body.innerHTML='
'+b+"")})};function m(p){t.get("/api/admin/users/"+p+"/repos",{}).then(g=>{e.repositories=g.data},g=>{console.error(g)})}function h(p){t.get("/api/admin/users/"+p,{}).then(g=>{e.userInfo=g.data},g=>{console.error(g)})}h(r.username),m(r.username),e.banUser=()=>{confirm(`Ban user ${r.username}?`)&&t.post(`/api/admin/users/${r.username}/ban`).then(()=>h(r.username),p=>console.error(p))},e.activateUser=()=>{t.post(`/api/admin/users/${r.username}/activate`).then(()=>h(r.username),p=>console.error(p))},e.promoteUser=()=>{confirm(`Promote ${r.username} to admin?`)&&t.post(`/api/admin/users/${r.username}/promote`).then(()=>h(r.username),p=>console.error(p))},e.demoteUser=()=>{confirm(`Remove admin privileges from ${r.username}?`)&&t.post(`/api/admin/users/${r.username}/demote`).then(()=>h(r.username),p=>console.error(p))},e.tokens=[],e.tokenForm={name:"",plaintext:null};function v(){t.get("/api/admin/tokens").then(p=>{e.tokens=p.data||[]},p=>{p.status!==401&&p.status!==403&&console.error(p)})}v(),e.createToken=()=>{e.tokenForm.name&&t.post("/api/admin/tokens",{name:e.tokenForm.name}).then(p=>{e.tokenForm.plaintext=p.data.token,e.tokenForm.name="",v()},p=>console.error(p))},e.revokeToken=p=>{confirm(`Revoke token "${p.name}"?`)&&t.delete("/api/admin/tokens/"+p.id).then(()=>v(),g=>console.error(g))},e.removeCache=p=>{confirm("Remove cached files for "+p.repoId+"?")&&t.delete("/api/admin/repos/"+p.repoId).then(()=>m(r.username),g=>console.error(g))},e.removeRepository=p=>{confirm("Remove repository "+p.repoId+"?")&&t.delete("/api/repo/"+p.repoId+"/").then(()=>m(r.username),g=>console.error(g))},e.updateRepository=p=>{let g=ze({title:`Refreshing ${p.repoId}...`,date:new Date,body:`The repository ${p.repoId} is going to be refreshed.`});e.toasts.push(g),t.post(`/api/repo/${p.repoId}/refresh`).then(w=>{w.data.status=="ready"?g.title=`${p.repoId} is refreshed.`:g.title=`Refreshing of ${p.repoId}.`},w=>{g.title=`Error during the refresh of ${p.repoId}.`,g.body=w.body})},e.getGitHubRepositories=p=>{t.get(`/api/user/${e.userInfo.username}/all_repositories`,{params:{force:"1"}}).then(g=>{e.userInfo.repositories=g.data})};let k=null;e.watch("query",()=>{n.timeout.cancel(k),k=n.timeout(()=>{m(r.username)},500)},!0)},za=function(e,t,o){let r=mt(),n=as();e.Math=Math,e.watch("user.status",()=>{e.user==null&&o.url("/")}),e.user==null&&o.url("/"),e.conferences=[],e.total=-1,e.totalPage=0,e.statusCounts=[];let i=w=>{if(w.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement?.tagName)){w.preventDefault();let b=document.querySelector('.admin-filter-toolbar input[type="search"]');b&&b.focus()}};n(document,"keydown",i),e.on("dispose",()=>document.removeEventListener("keydown",i)),e.clearFilter=w=>{w==="dateRange"?(e.query.dateFrom="",e.query.dateTo=""):e.query[w]="",e.query.page=1},e.chips=[];let a=()=>{let w=[];(e.query.dateFrom||e.query.dateTo)&&w.push({key:"dateRange",label:"Date",value:(e.query.dateFrom||"\u2026")+" \u2013 "+(e.query.dateTo||"\u2026")}),e.chips=w};e.statusCountFor=w=>{let b=(e.statusCounts||[]).find(T=>T._id===w);return b?b.count:0},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=w=>{e.query.sort===w?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=w,e.query.direction="desc"),e.query.page=1},e.sortIcon=w=>e.query.sort===w?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let u="admin.conferences.filterPrefs",m={page:1,limit:25,sort:"name",direction:"asc",search:"",dateFrom:"",dateTo:"",ready:!1,expired:!1,removed:!1,error:!0,preparing:!0},h=loadFilterPrefs(u)||{};e.query=Object.assign({},m,h,{page:1,search:""});let v=o.search();v.search&&(e.query.search=v.search);let k="admin.conferences.presets";e.presets=JSON.parse(localStorage.getItem(k)||"[]"),e.savePreset=()=>{let w=window.prompt("Preset name:");if(!w)return;let b=Object.assign({},e.query);delete b.page,e.presets=(e.presets||[]).filter(T=>T.name!==w),e.presets.push({name:w,query:b}),localStorage.setItem(k,JSON.stringify(e.presets))},e.applyPreset=w=>{Object.assign(e.query,w.query,{page:1})},e.deletePreset=w=>{e.presets=(e.presets||[]).filter(b=>b.name!==w.name),localStorage.setItem(k,JSON.stringify(e.presets))},e.removeConference=w=>{confirm("Remove conference "+w.conferenceID+"?")&&t.delete("/api/admin/conferences/"+w.conferenceID).then(()=>p(),b=>console.error(b))},e.exportCsv=()=>{let w=new URLSearchParams(Object.entries(e.query).filter(([,b])=>b!==""&&b!==!1&&b!=null));w.set("format","csv"),w.set("limit","10000"),window.open("/api/admin/conferences?"+w.toString(),"_blank")},e.fetchError=null;function p(){e.fetchError=null,t.get("/api/admin/conferences",{params:e.query}).then(w=>{e.total=w.data.total,e.totalPage=Math.ceil(w.data.total/e.query.limit),e.conferences=w.data.results,e.statusCounts=w.data.statusCounts||[]},w=>{e.fetchError=w&&w.data&&w.data.error||"Failed to load conferences",console.error(w)})}p();let g=null;e.watch("query",()=>{r.timeout.cancel(g),g=r.timeout(p,500);let{page:w,search:b,...T}=e.query;saveFilterPrefs(u,T),a()},!0),a()},Ha=function(e,t,o,r,n){let i=mt();e.watch("user.status",()=>{e.user==null&&o.url("/")}),e.user==null&&o.url("/"),e.queueList=[],e.jobs=[],e.selectedQueue="download",e.selectedStats=null,e.range="1h",e.allStates=["active","waiting","delayed","failed","completed"],e.stateFilter={active:!0,waiting:!0,delayed:!0,failed:!0,completed:!0},e.query={search:"",autoRefresh:!0},e.filteredJobs=()=>(e.jobs||[]).filter(b=>e.stateFilter[b._state]),e.jobProgressPct=b=>b&&b.progress&&typeof b.progress=="object"&&typeof b.progress.percent=="number"?Math.max(0,Math.min(100,Math.round(b.progress.percent))):typeof b.progress=="number"?Math.max(0,Math.min(100,Math.round(b.progress))):null,e.jobDuration=b=>{if(!b.processedOn)return"-";let N=(b.finishedOn||Date.now())-b.processedOn;return N<1e3?N+"ms":(N/1e3).toFixed(1)+"s"},e.metricsPoints=[],e.selectQueue=b=>{e.selectedQueue=b,a(),u()},e.setRange=b=>{e.range=b,u()};function a(){let b={queue:e.selectedQueue,search:e.query.search};t.get("/api/admin/queues",{params:b}).then(T=>{e.queueList=T.data.queues||[],e.jobs=T.data.jobs||[],e.selectedStats=e.queueList.find(N=>N.key===e.selectedQueue)||e.queueList[0]||null},T=>console.error(T))}function u(){t.get("/api/admin/queues/metrics",{params:{queue:e.selectedQueue,range:e.range}}).then(b=>{e.metricsPoints=b.data.points||[],n(p,0)},b=>console.error(b))}a(),u();let m=r(()=>{e.query.autoRefresh&&(a(),u())},15e3);e.on("dispose",()=>r.cancel(m)),e.refreshNow=function(){a(),u()};function h(b){let T=b&&b.data&&(b.data.message||b.data.error)||"Request failed";e.actionError=T,n(()=>{e.actionError=null},5e3),console.error(b)}e.actionError=null,e.removeJob=b=>{t.delete(`/api/admin/queue/${e.selectedQueue}/${b.id}`).then(a,h)},e.retryJob=b=>{t.post(`/api/admin/queue/${e.selectedQueue}/${b.id}`).then(a,h)},e.retryFailed=()=>{confirm(`Retry all failed jobs in ${e.selectedQueue}?`)&&t.post(`/api/admin/queue/${e.selectedQueue}/retry-failed`).then(a,b=>console.error(b))},e.drainSelected=()=>{confirm(`Drain the ${e.selectedQueue} queue?`)&&t.post(`/api/admin/queue/${e.selectedQueue}/drain`).then(a,b=>console.error(b))},e.togglePause=()=>{let b=e.selectedStats&&e.selectedStats.paused?"resume":"pause";t.post(`/api/admin/queue/${e.selectedQueue}/${b}`).then(a,T=>console.error(T))},e.emptyQueue=()=>{confirm(`Empty the ${e.selectedQueue} queue? This removes ALL jobs.`)&&t.post(`/api/admin/queue/${e.selectedQueue}/empty`).then(a,b=>console.error(b))},e.pauseAll=()=>{confirm("Pause all queues?")&&t.post("/api/admin/queues/pause-all").then(a,b=>console.error(b))};let v=null;e.watch("query.search",()=>{i.timeout.cancel(v),v=i.timeout(a,350)}),e.expanded={},e.toggleJob=b=>{e.expanded[b.id]=!e.expanded[b.id]},e.humanTime=b=>{if(!b)return"";let T=new Date(b);return T.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})+" "+T.toLocaleDateString([],{month:"short",day:"numeric"})},e.delayCountdown=b=>{if(!b)return"";var T=Math.max(0,Math.ceil((b-Date.now())/1e3));if(T<=0)return"resuming soon";var N=Math.floor(T/60),R=T%60;return"in "+(N>0?N+"m "+R+"s":R+"s")};function k(b){if(b<=0)return{ticks:[0],niceMax:1};let T=Math.pow(10,Math.floor(Math.log10(b))),N=T;b/N<2?N=T/2:b/N>5&&(N=T*2);let R=Math.ceil(b/N)*N,I=[];for(let C=0;C<=R;C+=N)I.push(C);return{ticks:I,niceMax:R}}function p(){var b=document.getElementById("q-throughput-chart");if(!b)return;var T=b.getContext("2d"),N=window.devicePixelRatio||1,R=b.parentElement.getBoundingClientRect(),I=44,C=50,A=20,P=R.width-40,Z=180,Y=P-I-C,j=Z-A;b.width=P*N,b.height=Z*N,b.style.width=P+"px",b.style.height=Z+"px",T.setTransform(N,0,0,N,0,0);var z=document.body.classList.contains("dark-mode"),ae="#8A857C",se=z?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",re=z?"#A7B2FF":"#3B4AD6",ue=z?"rgba(167,178,255,0.12)":"rgba(59,74,214,0.08)",ke=z?"#F08A82":"#B42318",he=z?"rgba(240,138,130,0.08)":"rgba(180,35,24,0.06)",me=z?"#F5C842":"#B8860B",pe=e.metricsPoints||[];if(pe.length===0){T.fillStyle=ae,T.font="12px monospace",T.textAlign="center",T.fillText("No metrics data yet",P/2,Z/2),g=null;return}var Te=pe.map(function(M){return M.completed}),Re=pe.map(function(M){return M.failed}),Se=pe.map(function(M){return M.avgMs}),D=pe.length,V=Y/(D-1||1),W=Math.max(1,Math.max.apply(null,Te),Math.max.apply(null,Re)),oe=k(W),le=Math.max.apply(null,Se),L=le>0?k(le):{ticks:[0],niceMax:1},te=function(M){return j-M/oe.niceMax*(j-10)},U=function(M){return j-M/L.niceMax*(j-10)},K=function(M){return I+M*V};T.textAlign="right",T.textBaseline="middle",T.font="10px monospace",oe.ticks.forEach(function(M){var Q=te(M);T.strokeStyle=se,T.lineWidth=1,T.beginPath(),T.moveTo(I,Q),T.lineTo(P-C,Q),T.stroke(),T.fillStyle=ae,T.fillText(M>=1e3?(M/1e3).toFixed(1)+"k":String(M),I-6,Q)}),le>0&&(T.textAlign="left",L.ticks.forEach(function(M){var Q=U(M);T.fillStyle=me,T.fillText(M>=1e3?(M/1e3).toFixed(1)+"s":M+"ms",P-C+6,Q)}));var fe=Date.now(),Ce=Math.min(6,D);T.textAlign="center",T.textBaseline="top";for(var ce=0;ce
Loading GitHub info for "+p.repoId+"..."),t.get("/api/admin/repos/"+p.repoId+"/github").then(w=>{g&&(g.document.open(),g.document.write('
'+JSON.stringify(w.data,null,2).replace(/[<>]/g,b=>b==="<"?"<":">")+""),g.document.close())},w=>{let b=w&&w.data?JSON.stringify(w.data,null,2):String(w);g&&(g.document.body.innerHTML='
'+b+"")})};function m(p){t.get("/api/admin/users/"+p+"/repos",{}).then(g=>{e.repositories=g.data},g=>{console.error(g)})}function h(p){t.get("/api/admin/users/"+p,{}).then(g=>{e.userInfo=g.data},g=>{console.error(g)})}h(r.username),m(r.username),e.banUser=()=>{confirm(`Ban user ${r.username}?`)&&t.post(`/api/admin/users/${r.username}/ban`).then(()=>h(r.username),p=>console.error(p))},e.activateUser=()=>{t.post(`/api/admin/users/${r.username}/activate`).then(()=>h(r.username),p=>console.error(p))},e.promoteUser=()=>{confirm(`Promote ${r.username} to admin?`)&&t.post(`/api/admin/users/${r.username}/promote`).then(()=>h(r.username),p=>console.error(p))},e.demoteUser=()=>{confirm(`Remove admin privileges from ${r.username}?`)&&t.post(`/api/admin/users/${r.username}/demote`).then(()=>h(r.username),p=>console.error(p))},e.tokens=[],e.tokenForm={name:"",plaintext:null};function v(){t.get("/api/admin/tokens").then(p=>{e.tokens=p.data||[]},p=>{p.status!==401&&p.status!==403&&console.error(p)})}v(),e.createToken=()=>{e.tokenForm.name&&t.post("/api/admin/tokens",{name:e.tokenForm.name}).then(p=>{e.tokenForm.plaintext=p.data.token,e.tokenForm.name="",v()},p=>console.error(p))},e.revokeToken=p=>{confirm(`Revoke token "${p.name}"?`)&&t.delete("/api/admin/tokens/"+p.id).then(()=>v(),g=>console.error(g))},e.removeCache=p=>{confirm("Remove cached files for "+p.repoId+"?")&&t.delete("/api/admin/repos/"+p.repoId).then(()=>m(r.username),g=>console.error(g))},e.removeRepository=p=>{confirm("Remove repository "+p.repoId+"?")&&t.delete("/api/repo/"+p.repoId+"/").then(()=>m(r.username),g=>console.error(g))},e.updateRepository=p=>{let g=ze({title:`Refreshing ${p.repoId}...`,date:new Date,body:`The repository ${p.repoId} is going to be refreshed.`});e.toasts.push(g),t.post(`/api/repo/${p.repoId}/refresh`).then(w=>{w.data.status=="ready"?g.title=`${p.repoId} is refreshed.`:g.title=`Refreshing of ${p.repoId}.`},w=>{g.title=`Error during the refresh of ${p.repoId}.`,g.body=w.body})},e.getGitHubRepositories=p=>{t.get(`/api/user/${e.userInfo.username}/all_repositories`,{params:{force:"1"}}).then(g=>{e.userInfo.repositories=g.data})};let k=null;e.watch("query",()=>{n.timeout.cancel(k),k=n.timeout(()=>{m(r.username)},500)},!0)},za=function(e,t,o){let r=mt(),n=as();e.Math=Math,e.watch("user.status",()=>{e.user==null&&o.url("/")}),e.user==null&&o.url("/"),e.conferences=[],e.total=-1,e.totalPage=0,e.statusCounts=[];let i=w=>{if(w.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement?.tagName)){w.preventDefault();let b=document.querySelector('.admin-filter-toolbar input[type="search"]');b&&b.focus()}};n(document,"keydown",i),e.on("dispose",()=>document.removeEventListener("keydown",i)),e.clearFilter=w=>{w==="dateRange"?(e.query.dateFrom="",e.query.dateTo=""):e.query[w]="",e.query.page=1},e.chips=[];let a=()=>{let w=[];(e.query.dateFrom||e.query.dateTo)&&w.push({key:"dateRange",label:"Date",value:(e.query.dateFrom||"\u2026")+" \u2013 "+(e.query.dateTo||"\u2026")}),e.chips=w};e.statusCountFor=w=>{let b=(e.statusCounts||[]).find(T=>T._id===w);return b?b.count:0},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=w=>{e.query.sort===w?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=w,e.query.direction="desc"),e.query.page=1},e.sortIcon=w=>e.query.sort===w?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let u="admin.conferences.filterPrefs",m={page:1,limit:25,sort:"name",direction:"asc",search:"",dateFrom:"",dateTo:"",ready:!1,expired:!1,removed:!1,error:!0,preparing:!0},h=loadFilterPrefs(u)||{};e.query=Object.assign({},m,h,{page:1,search:""});let v=o.search();v.search&&(e.query.search=v.search);let k="admin.conferences.presets";e.presets=JSON.parse(localStorage.getItem(k)||"[]"),e.savePreset=()=>{let w=window.prompt("Preset name:");if(!w)return;let b=Object.assign({},e.query);delete b.page,e.presets=(e.presets||[]).filter(T=>T.name!==w),e.presets.push({name:w,query:b}),localStorage.setItem(k,JSON.stringify(e.presets))},e.applyPreset=w=>{Object.assign(e.query,w.query,{page:1})},e.deletePreset=w=>{e.presets=(e.presets||[]).filter(b=>b.name!==w.name),localStorage.setItem(k,JSON.stringify(e.presets))},e.removeConference=w=>{confirm("Remove conference "+w.conferenceID+"?")&&t.delete("/api/admin/conferences/"+w.conferenceID).then(()=>p(),b=>console.error(b))},e.exportCsv=()=>{let w=new URLSearchParams(Object.entries(e.query).filter(([,b])=>b!==""&&b!==!1&&b!=null));w.set("format","csv"),w.set("limit","10000"),window.open("/api/admin/conferences?"+w.toString(),"_blank")},e.fetchError=null;function p(){e.fetchError=null,t.get("/api/admin/conferences",{params:e.query}).then(w=>{e.total=w.data.total,e.totalPage=Math.ceil(w.data.total/e.query.limit),e.conferences=w.data.results,e.statusCounts=w.data.statusCounts||[]},w=>{e.fetchError=w&&w.data&&w.data.error||"Failed to load conferences",console.error(w)})}p();let g=null;e.watch("query",()=>{r.timeout.cancel(g),g=r.timeout(p,500);let{page:w,search:b,...T}=e.query;saveFilterPrefs(u,T),a()},!0),a()},Ha=function(e,t,o,r,n){let i=mt();e.watch("user.status",()=>{e.user==null&&o.url("/")}),e.user==null&&o.url("/"),e.queueList=[],e.jobs=[],e.selectedQueue="download",e.selectedStats=null,e.range="1h",e.allStates=["active","waiting","delayed","failed","completed"],e.stateFilter={active:!0,waiting:!0,delayed:!0,failed:!0,completed:!0},e.query={search:"",autoRefresh:!0},e.filteredJobs=()=>(e.jobs||[]).filter(b=>e.stateFilter[b._state]),e.jobProgressPct=b=>b&&b.progress&&typeof b.progress=="object"&&typeof b.progress.percent=="number"?Math.max(0,Math.min(100,Math.round(b.progress.percent))):typeof b.progress=="number"?Math.max(0,Math.min(100,Math.round(b.progress))):null,e.jobDuration=b=>{if(!b.processedOn)return"-";let N=(b.finishedOn||Date.now())-b.processedOn;return N<1e3?N+"ms":(N/1e3).toFixed(1)+"s"},e.metricsPoints=[],e.selectQueue=b=>{e.selectedQueue=b,a(),u()},e.setRange=b=>{e.range=b,u()};function a(){let b={queue:e.selectedQueue,search:e.query.search};t.get("/api/admin/queues",{params:b}).then(T=>{e.queueList=T.data.queues||[],e.jobs=T.data.jobs||[],e.selectedStats=e.queueList.find(N=>N.key===e.selectedQueue)||e.queueList[0]||null},T=>console.error(T))}function u(){t.get("/api/admin/queues/metrics",{params:{queue:e.selectedQueue,range:e.range}}).then(b=>{e.metricsPoints=b.data.points||[],n(p,0)},b=>console.error(b))}a(),u();let m=r(()=>{e.query.autoRefresh&&(a(),u())},15e3);e.on("dispose",()=>r.cancel(m)),e.refreshNow=function(){a(),u()};function h(b){let T=b&&b.data&&(b.data.message||b.data.error)||"Request failed";e.actionError=T,n(()=>{e.actionError=null},5e3),console.error(b)}e.actionError=null,e.removeJob=b=>{t.delete(`/api/admin/queue/${e.selectedQueue}/${b.id}`).then(a,h)},e.retryJob=b=>{t.post(`/api/admin/queue/${e.selectedQueue}/${b.id}`).then(a,h)},e.retryFailed=()=>{confirm(`Retry all failed jobs in ${e.selectedQueue}?`)&&t.post(`/api/admin/queue/${e.selectedQueue}/retry-failed`).then(a,b=>console.error(b))},e.drainSelected=()=>{confirm(`Drain the ${e.selectedQueue} queue?`)&&t.post(`/api/admin/queue/${e.selectedQueue}/drain`).then(a,b=>console.error(b))},e.togglePause=()=>{let b=e.selectedStats&&e.selectedStats.paused?"resume":"pause";t.post(`/api/admin/queue/${e.selectedQueue}/${b}`).then(a,T=>console.error(T))},e.emptyQueue=()=>{confirm(`Empty the ${e.selectedQueue} queue? This removes ALL jobs.`)&&t.post(`/api/admin/queue/${e.selectedQueue}/empty`).then(a,b=>console.error(b))},e.pauseAll=()=>{confirm("Pause all queues?")&&t.post("/api/admin/queues/pause-all").then(a,b=>console.error(b))};let v=null;e.watch("query.search",()=>{i.timeout.cancel(v),v=i.timeout(a,350)}),e.expanded={},e.toggleJob=b=>{e.expanded[b.id]=!e.expanded[b.id]},e.humanTime=b=>{if(!b)return"";let T=new Date(b);return T.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})+" "+T.toLocaleDateString([],{month:"short",day:"numeric"})},e.delayCountdown=b=>{if(!b)return"";var T=Math.max(0,Math.ceil((b-Date.now())/1e3));if(T<=0)return"resuming soon";var N=Math.floor(T/60),R=T%60;return"in "+(N>0?N+"m "+R+"s":R+"s")};function k(b){if(b<=0)return{ticks:[0],niceMax:1};let T=Math.pow(10,Math.floor(Math.log10(b))),N=T;b/N<2?N=T/2:b/N>5&&(N=T*2);let R=Math.ceil(b/N)*N,I=[];for(let C=0;C<=R;C+=N)I.push(C);return{ticks:I,niceMax:R}}function p(){var b=document.getElementById("q-throughput-chart");if(!b)return;var T=b.getContext("2d"),N=window.devicePixelRatio||1,R=b.parentElement.getBoundingClientRect(),I=44,C=50,A=20,P=R.width-40,Z=180,Y=P-I-C,j=Z-A;b.width=P*N,b.height=Z*N,b.style.width=P+"px",b.style.height=Z+"px",T.setTransform(N,0,0,N,0,0);var z=document.body.classList.contains("dark-mode"),ae="#8A857C",se=z?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",re=z?"#A7B2FF":"#3B4AD6",ue=z?"rgba(167,178,255,0.12)":"rgba(59,74,214,0.08)",ke=z?"#F08A82":"#B42318",he=z?"rgba(240,138,130,0.08)":"rgba(180,35,24,0.06)",me=z?"#F5C842":"#B8860B",pe=e.metricsPoints||[];if(pe.length===0){T.fillStyle=ae,T.font="12px monospace",T.textAlign="center",T.fillText("No metrics data yet",P/2,Z/2),g=null;return}var Te=pe.map(function(M){return M.completed}),Re=pe.map(function(M){return M.failed}),Se=pe.map(function(M){return M.avgMs}),D=pe.length,V=Y/(D-1||1),W=Math.max(1,Math.max.apply(null,Te),Math.max.apply(null,Re)),oe=k(W),le=Math.max.apply(null,Se),U=le>0?k(le):{ticks:[0],niceMax:1},te=function(M){return j-M/oe.niceMax*(j-10)},L=function(M){return j-M/U.niceMax*(j-10)},K=function(M){return I+M*V};T.textAlign="right",T.textBaseline="middle",T.font="10px monospace",oe.ticks.forEach(function(M){var Q=te(M);T.strokeStyle=se,T.lineWidth=1,T.beginPath(),T.moveTo(I,Q),T.lineTo(P-C,Q),T.stroke(),T.fillStyle=ae,T.fillText(M>=1e3?(M/1e3).toFixed(1)+"k":String(M),I-6,Q)}),le>0&&(T.textAlign="left",U.ticks.forEach(function(M){var Q=L(M);T.fillStyle=me,T.fillText(M>=1e3?(M/1e3).toFixed(1)+"s":M+"ms",P-C+6,Q)}));var fe=Date.now(),Ce=Math.min(6,D);T.textAlign="center",T.textBaseline="top";for(var ce=0;ce
Manage how GitHub shares your code. Your anonymizations and URLs stay the same.
Sign in to create and manage your anonymizations.
Connect through the GitHub App with read-only repository access.
Sign in with GitHub Your existing anonymizations and connections stay with your account.',6)])])):f("v-if",!0),!e.site_options?.GITHUB_APP_ENABLED&&e.site_options?.GITHUB_OAUTH_ENABLED&&!e.accountRecovery?(l(),d("section",Sp,[...t[3]||(t[3]=[s("div",{class:"connection-title"},[s("h2",null,"Continue with GitHub")],-1),s("p",null,"Sign in to access your account. GitHub OAuth includes write access to private repositories.",-1),s("a",{class:"connection-link",target:"_self",href:"/github/login"},[y("Sign in with GitHub "),s("i",{class:"fas fa-arrow-right","aria-hidden":"true"})],-1)])])):f("v-if",!0),e.site_options&&!e.site_options.GITHUB_APP_ENABLED&&!e.site_options.GITHUB_OAUTH_ENABLED?(l(),d("p",Dp,"GitHub sign-in is currently unavailable. Please try again later.")):f("v-if",!0)])])])}var Rp={class:"paper-empty"};function Ya(e,t){return l(),d("div",Rp,[...t[0]||(t[0]=[ge('The anonymous mirror you\u2019re looking for has expired, been removed by its owner, or never existed. If you received this URL from an author, ask them to re-issue it.
Fill in the details \u2014 it only takes a minute.
Take ownership of an existing anonymized repository so it appears on your dashboard.
',3)),s("div",nS,[t[5]||(t[5]=s("p",{class:"paper-section-copy"},"Use this when an anonymization was created by a co-author or from another account. You must have access to the GitHub repository it was made from.",-1)),E((l(),d("form",{class:"form needs-validation",name:"claimForm",novalidate:"",onSubmit:t[0]||(t[0]=we(n=>e.submitForm(n,()=>{e.claim()}),["prevent"]))},[s("div",oS,[t[1]||(t[1]=s("label",{class:"paper-field-label",for:"repoUrl"},"GitHub repository URL",-1)),E(s("input",{type:"text",class:O(["form-control",{"is-invalid":e.claimForm?.repoUrl?.invalid&&(e.claimForm?.repoUrl?.touched||e.claimForm?.submitted)}]),name:"repoUrl",id:"repoUrl",required:""},null,2),[[o,{state:e.viewState,set:n=>{e.repoUrl=n},value:e.repoUrl,form:"claimForm",options:{}}]]),E(s("div",rS," No anonymization matches this repository and ID. Check both values and that you can access the repository on GitHub. ",512),[[B,e.claimForm?.repoUrl?.errors?.not_found]])]),s("div",iS,[t[2]||(t[2]=s("label",{class:"paper-field-label",for:"repoId"},"Anonymized repository ID",-1)),E(s("input",{type:"text",class:O(["form-control",{"is-invalid":e.claimForm?.repoId?.invalid&&(e.claimForm?.repoId?.touched||e.claimForm?.submitted)}]),name:"repoId",id:"repoId",required:""},null,2),[[o,{state:e.viewState,set:n=>{e.repoId=n},value:e.repoId,form:"claimForm",options:{}}]]),t[3]||(t[3]=s("small",{id:"idHelp",class:"form-text text-muted"},[y("The ID is the last part of the anonymized URL: "),s("code",null,"anonymous.4open.science/r/Group anonymizations by venue, give chairs a shared dashboard, and set one expiry for every submission.
Every repository, pull request, and gist you\u2019ve mirrored, with live status and stats.
If something's missing, write to us \u2014 report a bug on GitHub.
Manage how GitHub shares your code. Your anonymizations and URLs stay the same.
Sign in to create and manage your anonymizations.
Connect through the GitHub App with read-only repository access.
Sign in with GitHub Your existing anonymizations and connections stay with your account.',6)])])):f("v-if",!0),!e.site_options?.GITHUB_APP_ENABLED&&e.site_options?.GITHUB_OAUTH_ENABLED&&!e.accountRecovery?(l(),d("section",Sp,[...t[3]||(t[3]=[s("div",{class:"connection-title"},[s("h2",null,"Continue with GitHub")],-1),s("p",null,"Sign in to access your account. GitHub OAuth includes write access to private repositories.",-1),s("a",{class:"connection-link",target:"_self",href:"/github/login"},[y("Sign in with GitHub "),s("i",{class:"fas fa-arrow-right","aria-hidden":"true"})],-1)])])):f("v-if",!0),e.site_options&&!e.site_options.GITHUB_APP_ENABLED&&!e.site_options.GITHUB_OAUTH_ENABLED?(l(),d("p",Dp,"GitHub sign-in is currently unavailable. Please try again later.")):f("v-if",!0)])])])}var Rp={class:"paper-empty"};function Ya(e,t){return l(),d("div",Rp,[...t[0]||(t[0]=[ge('The anonymous mirror you\u2019re looking for has expired, been removed by its owner, or never existed. If you received this URL from an author, ask them to re-issue it.
Fill in the details \u2014 it only takes a minute.
Take ownership of an existing anonymized repository so it appears on your dashboard.
',3)),s("div",rS,[t[5]||(t[5]=s("p",{class:"paper-section-copy"},"Use this when an anonymization was created by a co-author or from another account. You must have access to the GitHub repository it was made from.",-1)),E((l(),d("form",{class:"form needs-validation",name:"claimForm",novalidate:"",onSubmit:t[0]||(t[0]=we(n=>e.submitForm(n,()=>{e.claim()}),["prevent"]))},[s("div",iS,[t[1]||(t[1]=s("label",{class:"paper-field-label",for:"repoUrl"},"GitHub repository URL",-1)),E(s("input",{type:"text",class:O(["form-control",{"is-invalid":e.claimForm?.repoUrl?.invalid&&(e.claimForm?.repoUrl?.touched||e.claimForm?.submitted)}]),name:"repoUrl",id:"repoUrl",required:""},null,2),[[o,{state:e.viewState,set:n=>{e.repoUrl=n},value:e.repoUrl,form:"claimForm",options:{}}]]),E(s("div",aS," No anonymization matches this repository and ID. Check both values and that you can access the repository on GitHub. ",512),[[B,e.claimForm?.repoUrl?.errors?.not_found]])]),s("div",lS,[t[2]||(t[2]=s("label",{class:"paper-field-label",for:"repoId"},"Anonymized repository ID",-1)),E(s("input",{type:"text",class:O(["form-control",{"is-invalid":e.claimForm?.repoId?.invalid&&(e.claimForm?.repoId?.touched||e.claimForm?.submitted)}]),name:"repoId",id:"repoId",required:""},null,2),[[o,{state:e.viewState,set:n=>{e.repoId=n},value:e.repoId,form:"claimForm",options:{}}]]),t[3]||(t[3]=s("small",{id:"idHelp",class:"form-text text-muted"},[y("The ID is the last part of the anonymized URL: "),s("code",null,"anonymous.4open.science/r/Group anonymizations by venue, give chairs a shared dashboard, and set one expiry for every submission.
Every repository, pull request, and gist you\u2019ve mirrored, with live status and stats.
If something's missing, write to us \u2014 report a bug on GitHub.

GitHub's OAuth scopes have no read-only option for private repositories. Anonymous GitHub only ever reads your repositories; it never pushes, modifies, or deletes anything.
Source code with syntax highlighting, Markdown, Jupyter notebooks, PDFs, images, and GitHub Pages sites. Everything passes through the same redaction filter.
You choose: the mirror is removed, or visitors are redirected to the original GitHub repository once the review is over.
Track PR mirrors you\u2019ve created and their reviewer traffic.

GitHub's OAuth scopes have no read-only option for private repositories. Anonymous GitHub only ever reads your repositories; it never pushes, modifies, or deletes anything.
Source code with syntax highlighting, Markdown, Jupyter notebooks, PDFs, images, and GitHub Pages sites. Everything passes through the same redaction filter.
You choose: the mirror is removed, or visitors are redirected to the original GitHub repository once the review is over.
Track PR mirrors you\u2019ve created and their reviewer traffic.
Defaults applied to every new anonymization, your quotas, and your account.
',3)),s("div",bP,[E((l(),d("aside",wP,[...t[2]||(t[2]=[ge('A small team keeps this running. If it helps you, please consider contributing back \u2014 in code, ideas, or coffee.
Collaborate by implementing new features and fixing bugs. Help with new file formats or deployment is welcome.
Open on GitHubTell us about bugs and missing features in Anonymous GitHub itself. Questions about an anonymized repository go to its authors.
File an issueServer costs hover around $25 a month. Any contribution helps keep the lights on.
GitHub Sponsors| '+(u.oldNo||"")+' | '+(u.newNo||"")+' | '+(u.kind==="add"?"+":u.kind==="remove"?"-":u.kind==="hunk"?"@":"")+' | '+t(u.text)+" |
Defaults applied to every new anonymization, your quotas, and your account.
',3)),s("div",kP,[E((l(),d("aside",_P,[...t[2]||(t[2]=[ge('A small team keeps this running. If it helps you, please consider contributing back \u2014 in code, ideas, or coffee.
Collaborate by implementing new features and fixing bugs. Help with new file formats or deployment is welcome.
Open on GitHubTell us about bugs and missing features in Anonymous GitHub itself. Questions about an anonymized repository go to its authors.
File an issueServer costs hover around $25 a month. Any contribution helps keep the lights on.
GitHub Sponsors| '+(u.oldNo||"")+' | '+(u.newNo||"")+' | '+(u.kind==="add"?"+":u.kind==="remove"?"-":u.kind==="hunk"?"@":"")+' | '+t(u.text)+" |
{this.resolve=e=>{this.#t=!0;t(e)};this.reject=t=>{this.#t=!0;e(t)}}))}get settled(){return this.#t}};let c=null,h=null;e.AnnotationPrefix="pdfjs_internal_id_"},(t,e,n)=>{var i=n(3),r=n(4),s=n(69),a=n(70),o="WebAssembly",l=r[o],c=7!==Error("e",{cause:7}).cause,exportGlobalErrorCauseWrapper=function(t,e){var n={};n[t]=a(t,e,c);i({global:!0,constructor:!0,arity:1,forced:c},n)},exportWebAssemblyErrorCauseWrapper=function(t,e){if(l&&l[t]){var n={};n[t]=a(o+"."+t,e,c);i({target:o,stat:!0,constructor:!0,arity:1,forced:c},n)}};exportGlobalErrorCauseWrapper("Error",(function(t){return function Error(e){return s(t,this,arguments)}}));exportGlobalErrorCauseWrapper("EvalError",(function(t){return function EvalError(e){return s(t,this,arguments)}}));exportGlobalErrorCauseWrapper("RangeError",(function(t){return function RangeError(e){return s(t,this,arguments)}}));exportGlobalErrorCauseWrapper("ReferenceError",(function(t){return function ReferenceError(e){return s(t,this,arguments)}}));exportGlobalErrorCauseWrapper("SyntaxError",(function(t){return function SyntaxError(e){return s(t,this,arguments)}}));exportGlobalErrorCauseWrapper("TypeError",(function(t){return function TypeError(e){return s(t,this,arguments)}}));exportGlobalErrorCauseWrapper("URIError",(function(t){return function URIError(e){return s(t,this,arguments)}}));exportWebAssemblyErrorCauseWrapper("CompileError",(function(t){return function CompileError(e){return s(t,this,arguments)}}));exportWebAssemblyErrorCauseWrapper("LinkError",(function(t){return function LinkError(e){return s(t,this,arguments)}}));exportWebAssemblyErrorCauseWrapper("RuntimeError",(function(t){return function RuntimeError(e){return s(t,this,arguments)}}))},(t,e,n)=>{var i=n(4),r=n(5).f,s=n(44),a=n(48),o=n(38),l=n(56),c=n(68);t.exports=function(t,e){var n,h,d,u,p,f=t.target,g=t.global,m=t.stat;if(n=g?i:m?i[f]||o(f,{}):(i[f]||{}).prototype)for(h in e){u=e[h];d=t.dontCallGetSet?(p=r(n,h))&&p.value:n[h];if(!c(g?h:f+(m?".":"#")+h,t.forced)&&void 0!==d){if(typeof u==typeof d)continue;l(u,d)}(t.sham||d&&d.sham)&&s(u,"sham",!0);a(n,h,u,t)}}},function(t){var check=function(t){return t&&t.Math===Math&&t};t.exports=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof global&&global)||function(){return this}()||this||Function("return this")()},(t,e,n)=>{var i=n(6),r=n(8),s=n(10),a=n(11),o=n(12),l=n(18),c=n(39),h=n(42),d=Object.getOwnPropertyDescriptor;e.f=i?d:function getOwnPropertyDescriptor(t,e){t=o(t);e=l(e);if(h)try{return d(t,e)}catch(t){}if(c(t,e))return a(!r(s.f,t,e),t[e])}},(t,e,n)=>{var i=n(7);t.exports=!i((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))},t=>{t.exports=function(t){try{return!!t()}catch(t){return!0}}},(t,e,n)=>{var i=n(9),r=Function.prototype.call;t.exports=i?r.bind(r):function(){return r.apply(r,arguments)}},(t,e,n)=>{var i=n(7);t.exports=!i((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},(t,e)=>{var n={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,r=i&&!n.call({1:2},1);e.f=r?function propertyIsEnumerable(t){var e=i(this,t);return!!e&&e.enumerable}:n},t=>{t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},(t,e,n)=>{var i=n(13),r=n(16);t.exports=function(t){return i(r(t))}},(t,e,n)=>{var i=n(14),r=n(7),s=n(15),a=Object,o=i("".split);t.exports=r((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"===s(t)?o(t,""):a(t)}:a},(t,e,n)=>{var i=n(9),r=Function.prototype,s=r.call,a=i&&r.bind.bind(s,s);t.exports=i?a:function(t){return function(){return s.apply(t,arguments)}}},(t,e,n)=>{var i=n(14),r=i({}.toString),s=i("".slice);t.exports=function(t){return s(r(t),8,-1)}},(t,e,n)=>{var i=n(17),r=TypeError;t.exports=function(t){if(i(t))throw r("Can't call method on "+t);return t}},t=>{t.exports=function(t){return null==t}},(t,e,n)=>{var i=n(19),r=n(23);t.exports=function(t){var e=i(t,"string");return r(e)?e:e+""}},(t,e,n)=>{var i=n(8),r=n(20),s=n(23),a=n(30),o=n(33),l=n(34),c=TypeError,h=l("toPrimitive");t.exports=function(t,e){if(!r(t)||s(t))return t;var n,l=a(t,h);if(l){void 0===e&&(e="default");n=i(l,t,e);if(!r(n)||s(n))return n;throw c("Can't convert object to primitive value")}void 0===e&&(e="number");return o(t,e)}},(t,e,n)=>{var i=n(21),r=n(22),s=r.all;t.exports=r.IS_HTMLDDA?function(t){return"object"==typeof t?null!==t:i(t)||t===s}:function(t){return"object"==typeof t?null!==t:i(t)}},(t,e,n)=>{var i=n(22),r=i.all;t.exports=i.IS_HTMLDDA?function(t){return"function"==typeof t||t===r}:function(t){return"function"==typeof t}},t=>{var e="object"==typeof document&&document.all,n=void 0===e&&void 0!==e;t.exports={all:e,IS_HTMLDDA:n}},(t,e,n)=>{var i=n(24),r=n(21),s=n(25),a=n(26),o=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=i("Symbol");return r(e)&&s(e.prototype,o(t))}},(t,e,n)=>{var i=n(4),r=n(21);t.exports=function(t,e){return arguments.length<2?(n=i[t],r(n)?n:void 0):i[t]&&i[t][e];var n}},(t,e,n)=>{var i=n(14);t.exports=i({}.isPrototypeOf)},(t,e,n)=>{var i=n(27);t.exports=i&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},(t,e,n)=>{var i=n(28),r=n(7),s=n(4).String;t.exports=!!Object.getOwnPropertySymbols&&!r((function(){var t=Symbol("symbol detection");return!s(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&i&&i<41}))},(t,e,n)=>{var i,r,s=n(4),a=n(29),o=s.process,l=s.Deno,c=o&&o.versions||l&&l.version,h=c&&c.v8;h&&(r=(i=h.split("."))[0]>0&&i[0]<4?1:+(i[0]+i[1]));!r&&a&&(!(i=a.match(/Edge\/(\d+)/))||i[1]>=74)&&(i=a.match(/Chrome\/(\d+)/))&&(r=+i[1]);t.exports=r},t=>{t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},(t,e,n)=>{var i=n(31),r=n(17);t.exports=function(t,e){var n=t[e];return r(n)?void 0:i(n)}},(t,e,n)=>{var i=n(21),r=n(32),s=TypeError;t.exports=function(t){if(i(t))return t;throw s(r(t)+" is not a function")}},t=>{var e=String;t.exports=function(t){try{return e(t)}catch(t){return"Object"}}},(t,e,n)=>{var i=n(8),r=n(21),s=n(20),a=TypeError;t.exports=function(t,e){var n,o;if("string"===e&&r(n=t.toString)&&!s(o=i(n,t)))return o;if(r(n=t.valueOf)&&!s(o=i(n,t)))return o;if("string"!==e&&r(n=t.toString)&&!s(o=i(n,t)))return o;throw a("Can't convert object to primitive value")}},(t,e,n)=>{var i=n(4),r=n(35),s=n(39),a=n(41),o=n(27),l=n(26),c=i.Symbol,h=r("wks"),d=l?c.for||c:c&&c.withoutSetter||a;t.exports=function(t){s(h,t)||(h[t]=o&&s(c,t)?c[t]:d("Symbol."+t));return h[t]}},(t,e,n)=>{var i=n(36),r=n(37);(t.exports=function(t,e){return r[t]||(r[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.32.2",mode:i?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.32.2/LICENSE",source:"https://github.com/zloirock/core-js"})},t=>{t.exports=!1},(t,e,n)=>{var i=n(4),r=n(38),s="__core-js_shared__",a=i[s]||r(s,{});t.exports=a},(t,e,n)=>{var i=n(4),r=Object.defineProperty;t.exports=function(t,e){try{r(i,t,{value:e,configurable:!0,writable:!0})}catch(n){i[t]=e}return e}},(t,e,n)=>{var i=n(14),r=n(40),s=i({}.hasOwnProperty);t.exports=Object.hasOwn||function hasOwn(t,e){return s(r(t),e)}},(t,e,n)=>{var i=n(16),r=Object;t.exports=function(t){return r(i(t))}},(t,e,n)=>{var i=n(14),r=0,s=Math.random(),a=i(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++r+s,36)}},(t,e,n)=>{var i=n(6),r=n(7),s=n(43);t.exports=!i&&!r((function(){return 7!==Object.defineProperty(s("div"),"a",{get:function(){return 7}}).a}))},(t,e,n)=>{var i=n(4),r=n(20),s=i.document,a=r(s)&&r(s.createElement);t.exports=function(t){return a?s.createElement(t):{}}},(t,e,n)=>{var i=n(6),r=n(45),s=n(11);t.exports=i?function(t,e,n){return r.f(t,e,s(1,n))}:function(t,e,n){t[e]=n;return t}},(t,e,n)=>{var i=n(6),r=n(42),s=n(46),a=n(47),o=n(18),l=TypeError,c=Object.defineProperty,h=Object.getOwnPropertyDescriptor,d="enumerable",u="configurable",p="writable";e.f=i?s?function defineProperty(t,e,n){a(t);e=o(e);a(n);if("function"==typeof t&&"prototype"===e&&"value"in n&&p in n&&!n[p]){var i=h(t,e);if(i&&i[p]){t[e]=n.value;n={configurable:u in n?n[u]:i[u],enumerable:d in n?n[d]:i[d],writable:!1}}}return c(t,e,n)}:c:function defineProperty(t,e,n){a(t);e=o(e);a(n);if(r)try{return c(t,e,n)}catch(t){}if("get"in n||"set"in n)throw l("Accessors not supported");"value"in n&&(t[e]=n.value);return t}},(t,e,n)=>{var i=n(6),r=n(7);t.exports=i&&r((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},(t,e,n)=>{var i=n(20),r=String,s=TypeError;t.exports=function(t){if(i(t))return t;throw s(r(t)+" is not an object")}},(t,e,n)=>{var i=n(21),r=n(45),s=n(49),a=n(38);t.exports=function(t,e,n,o){o||(o={});var l=o.enumerable,c=void 0!==o.name?o.name:e;i(n)&&s(n,c,o);if(o.global)l?t[e]=n:a(e,n);else{try{o.unsafe?t[e]&&(l=!0):delete t[e]}catch(t){}l?t[e]=n:r.f(t,e,{value:n,enumerable:!1,configurable:!o.nonConfigurable,writable:!o.nonWritable})}return t}},(t,e,n)=>{var i=n(14),r=n(7),s=n(21),a=n(39),o=n(6),l=n(50).CONFIGURABLE,c=n(51),h=n(52),d=h.enforce,u=h.get,p=String,f=Object.defineProperty,g=i("".slice),m=i("".replace),b=i([].join),v=o&&!r((function(){return 8!==f((function(){}),"length",{value:8}).length})),y=String(String).split("String"),_=t.exports=function(t,e,n){"Symbol("===g(p(e),0,7)&&(e="["+m(p(e),/^Symbol\(([^)]*)\)/,"$1")+"]");n&&n.getter&&(e="get "+e);n&&n.setter&&(e="set "+e);(!a(t,"name")||l&&t.name!==e)&&(o?f(t,"name",{value:e,configurable:!0}):t.name=e);v&&n&&a(n,"arity")&&t.length!==n.arity&&f(t,"length",{value:n.arity});try{n&&a(n,"constructor")&&n.constructor?o&&f(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var i=d(t);a(i,"source")||(i.source=b(y,"string"==typeof e?e:""));return t};Function.prototype.toString=_((function toString(){return s(this)&&u(this).source||c(this)}),"toString")},(t,e,n)=>{var i=n(6),r=n(39),s=Function.prototype,a=i&&Object.getOwnPropertyDescriptor,o=r(s,"name"),l=o&&"something"===function something(){}.name,c=o&&(!i||i&&a(s,"name").configurable);t.exports={EXISTS:o,PROPER:l,CONFIGURABLE:c}},(t,e,n)=>{var i=n(14),r=n(21),s=n(37),a=i(Function.toString);r(s.inspectSource)||(s.inspectSource=function(t){return a(t)});t.exports=s.inspectSource},(t,e,n)=>{var i,r,s,a=n(53),o=n(4),l=n(20),c=n(44),h=n(39),d=n(37),u=n(54),p=n(55),f="Object already initialized",g=o.TypeError,m=o.WeakMap;if(a||d.state){var b=d.state||(d.state=new m);b.get=b.get;b.has=b.has;b.set=b.set;i=function(t,e){if(b.has(t))throw g(f);e.facade=t;b.set(t,e);return e};r=function(t){return b.get(t)||{}};s=function(t){return b.has(t)}}else{var v=u("state");p[v]=!0;i=function(t,e){if(h(t,v))throw g(f);e.facade=t;c(t,v,e);return e};r=function(t){return h(t,v)?t[v]:{}};s=function(t){return h(t,v)}}t.exports={set:i,get:r,has:s,enforce:function(t){return s(t)?r(t):i(t,{})},getterFor:function(t){return function(e){var n;if(!l(e)||(n=r(e)).type!==t)throw g("Incompatible receiver, "+t+" required");return n}}}},(t,e,n)=>{var i=n(4),r=n(21),s=i.WeakMap;t.exports=r(s)&&/native code/.test(String(s))},(t,e,n)=>{var i=n(35),r=n(41),s=i("keys");t.exports=function(t){return s[t]||(s[t]=r(t))}},t=>{t.exports={}},(t,e,n)=>{var i=n(39),r=n(57),s=n(5),a=n(45);t.exports=function(t,e,n){for(var o=r(e),l=a.f,c=s.f,h=0;h{var i=n(104),r=RangeError;t.exports=function(t,e){var n=i(t);if(n%e)throw r("Wrong offset");return n}},(t,e,n)=>{var i=n(62),r=RangeError;t.exports=function(t){var e=i(t);if(e<0)throw r("The argument can't be less than 0");return e}},(t,e,n)=>{var i=n(106),r=n(94),s=r.aTypedArray,a=r.exportTypedArrayMethod,o=r.getTypedArrayConstructor;a("toReversed",(function toReversed(){return i(s(this),o(this))}))},(t,e,n)=>{var i=n(64);t.exports=function(t,e){for(var n=i(t),r=new e(n),s=0;s