1!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{};e._sentryModuleMetadata=e._sentryModuleMetadata||{},e._sentryModuleMetadata[(new e.Error).stack]=function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];if(null!=r)for(var a in r)r.hasOwnProperty(a)&&(e[a]=r[a])}return e}({},e._sentryModuleMetadata[(new e.Error).stack],{"_sentryBundlerPluginAppKey:notetube-web":!0});var t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="ab6a44e7-0df8-4aa6-9b31-e8dae03db10c",e._sentryDebugIdIdentifier="sentry-dbid-ab6a44e7-0df8-4aa6-9b31-e8dae03db10c")}catch(e){}}();"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1647],{81647:(e,t,r)=>{r.r(t),r.d(t,{default:()=>S});var a=r(54568),s=r(7620),l=r(97066),n=r(96442),c=r(6845),o=r(97013),i=r(75892),d=r(78272),u=r(61167),m=r(82078),f=r(18255),h=r(85973),x=r(92779),p=r(58597),g=r(30866),b=r(74717),w=r(31587),j=r(70783);function v(e){let{sessionId:t,currentOffset:r,onOffsetChange:n,open:i,onOpenChange:d}=e,[u,m]=(0,s.useState)(r),[f,h]=(0,s.useState)(!1),[v,N]=(0,s.useState)(null),[y,k]=(0,s.useState)(!1),C=(0,l.c)("sources"),S=(0,s.useCallback)(e=>{e&&(m(r),N(null),k(!1)),d(e)},[r,d]),T=(0,s.useCallback)(async()=>{try{h(!0),N(null),k(!1);let e=await fetch("/api/study-sessions/".concat(t),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({page_offset:u})}),r=await e.json();if(!e.ok)throw Error(r.error||"Failed to update page offset");n(u),k(!0),setTimeout(()=>{S(!1)},1500)}catch(e){console.error("Error updating page offset:",e),N(e instanceof Error?e.message:C("viewer.pageOffset.updateFailed"))}finally{h(!1)}},[t,u,n,S]),E=(0,s.useCallback)(()=>{m(0),N(null),k(!1)},[]),_=u!==r;return(0,a.jsx)(p.lG,{open:i,onOpenChange:S,children:(0,a.jsxs)(p.Cf,{className:"sm:max-w-[425px]",children:[(0,a.jsxs)(p.c7,{children:[(0,a.jsx)(p.L3,{children:C("viewer.pageOffset.title")}),(0,a.jsx)(p.rr,{children:C("viewer.pageOffset.description")})]}),(0,a.jsxs)("div",{className:"space-y-4 py-4",children:[(0,a.jsxs)(o.Fc,{children:[(0,a.jsx)(g.A,{className:"h-4 w-4"}),(0,a.jsx)(o.TN,{className:"text-sm",children:C("viewer.pageOffset.info")})]}),v&&(0,a.jsxs)(o.Fc,{variant:"destructive",children:[(0,a.jsx)(b.A,{className:"h-4 w-4"}),(0,a.jsx)(o.TN,{children:v})]}),y&&(0,a.jsx)(o.Fc,{className:"border-green-200 bg-green-50 text-green-800",children:(0,a.jsx)(o.TN,{children:C("viewer.pageOffset.success")})}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium",children:C("viewer.pageOffset.label")}),(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsx)(x.p,{type:"number",min:"0",value:u,onChange:e=>m(Math.max(0,parseInt(e.target.value)||0)),placeholder:"0",className:"w-24"}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:C("viewer.pageOffset.pagesToSkip")})]}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:C("viewer.pageOffset.autoDetected",{n:r})})]})]}),(0,a.jsxs)(p.Es,{children:[(0,a.jsxs)(c.$,{variant:"outline",onClick:E,disabled:f||0===u,className:"cursor-pointer",children:[(0,a.jsx)(w.A,{className:"h-4 w-4 mr-1"}),C("viewer.pageOffset.reset")]}),(0,a.jsxs)(c.$,{onClick:T,disabled:f||!_,className:"cursor-pointer",children:[(0,a.jsx)(j.A,{className:"h-4 w-4 mr-1"}),f?C("viewer.pageOffset.saving"):C("viewer.pageOffset.saveChanges")]})]})]})})}var N=r(13360),y=r(53916);r(17634),r(85444);let k=(0,n.default)(()=>Promise.all([r.e(1355),r.e(9919),r.e(4223),r.e(8029)]).then(r.bind(r,20292)).then(e=>{{let t=window.pdfjsConfig;if(t){let r="https://unpkg.com/pdfjs-dist@".concat(t.workerVersion,"/build/pdf.worker.min.mjs");e.pdfjs.GlobalWorkerOptions.workerSrc=r,t.globalParams&&Object.assign(e.pdfjs.GlobalWorkerOptions,t.globalParams)}else e.pdfjs.GlobalWorkerOptions.workerSrc="/pdf.worker.min.mjs";e.pdfjs.GlobalWorkerOptions.workerPort=null}return e.Document}),{loadableGenerated:{webpack:()=>[null]},ssr:!1,loading:()=>(0,a.jsxs)("div",{className:"text-center py-8",children:[(0,a.jsx)(i.A,{className:"h-8 w-8 text-muted-foreground mx-auto mb-2"}),(0,a.jsx)("p",{className:"text-muted-foreground",children:"Loading PDF viewer..."})]})}),C=(0,n.default)(()=>Promise.all([r.e(1355),r.e(9919),r.e(4223),r.e(8029)]).then(r.bind(r,20292)).then(e=>
1e.Page),{loadableGenerated:{webpack:()=>[null]},ssr:!1}),S=(0,s.memo)(function(e){let{filePath:t,fileName:r,onCollapse:n,onScrollToPageRef:x,sessionId:p,pageOffset:g=0,onPageOffsetChange:b,onTextAction:w,initialPage:j,highlightText:S}=e,T=(0,l.c)("sources"),[,E]=(0,s.useState)(null),[_,A]=(0,s.useState)(!0),[O,F]=(0,s.useState)(null),[P,M]=(0,s.useState)(0),[L,R]=(0,s.useState)(1),[,D]=(0,s.useState)(800),[I,z]=(0,s.useState)(!1),$=(0,s.useRef)(null),[G,U]=(0,s.useState)(600),[W,q]=(0,s.useState)(!0),[V,H]=(0,s.useState)(new Set),[B,J]=(0,s.useState)([]),[K,Q]=(0,s.useState)([]),[X,Y]=(0,s.useState)(850),[Z,ee]=(0,s.useState)(1),[et,er]=(0,s.useState)(!1),ea=(0,s.useRef)(""),es=(0,s.useRef)(!1),el=(0,s.useRef)(null),en=(0,s.useRef)(!1),ec=(0,s.useRef)(null),eo=(0,s.useRef)(null),ei=(0,s.useRef)(null),{selection:ed,clearSelection:eu}=(0,N.R)({containerSelector:".react-pdf__Page__textContent, .textLayer",enabled:!!w}),em=(0,s.useCallback)((e,t)=>{w&&w(e,t),eu()},[w,eu]);(0,s.useEffect)(()=>{z(!0)},[]),(0,s.useEffect)(()=>{let e,t=()=>{if(ec.current){let e=ec.current.clientWidth;D(e),U(e),W&&(R(1),q(!1))}};t();let r=()=>{clearTimeout(e),e=setTimeout(t,500)};return window.addEventListener("resize",r),()=>{clearTimeout(e),window.removeEventListener("resize",r)}},[W]);let ef=(0,s.useCallback)(()=>{if(!ei.current||0===P)return;let e=ei.current,t=e.scrollTop,r=e.clientHeight,a=t+r,s=t+r/2,l=new Set,n=1,c=0,o=0;for(let e=0;e<P;e++){let r=B[e]||X,i=o,d=i+r,u=+r;d>=t-u&&i<=a+u&&l.add(e+1);let m=Math.max(0,Math.min(d,a)-Math.max(i,t)),f=Math.abs(i+r/2-s);m>0&&(m>c||m===c&&f<Math.abs(o-r/2-s))&&(n=e+1,c=m),o+=r}H(l),ee(n)},[P,B,X,1]);(0,s.useEffect)(()=>{let e,t=ei.current;if(!t)return;ef();let r=null,a=()=>{clearTimeout(e),r&&cancelAnimationFrame(r),e=setTimeout(()=>{r=requestAnimationFrame(ef)},50)};return t.addEventListener("scroll",a,{passive:!0}),()=>{t.removeEventListener("scroll",a),clearTimeout(e),r&&cancelAnimationFrame(r)}},[ef]),(0,s.useEffect)(()=>{ef()},[ef,P,L]),(0,s.useEffect)(()=>{if(P>0&&K.length===P){let e=K.map(e=>Math.floor(G*L*e));J(e),e.length>0&&Y(e[0])}},[L,G,P,K]);let eh=(0,s.useCallback)(e=>B[e]||X,[B,X]),ex=(0,s.useMemo)(()=>0===B.length?X*P:B.reduce((e,t)=>e+t,0),[B,X,P]),ep=(0,s.useCallback)(e=>{let t=0;for(let r=0;r<e;r++)t+=B[r]||X;return t},[B,X]),eg=(0,s.useMemo)(()=>({workerSrc:"/pdf.worker.min.mjs",standardFontDataUrl:void 0}),[]),eb=(0,s.useCallback)(async()=>{if(ea.current===t||es.current)return void A(!1);try{if(es.current=!0,A(!0),F(null),!t)throw Error("No file path provided");el.current&&(URL.revokeObjectURL(el.current),el.current=null);let e="/api/files/direct?filePath=".concat(encodeURIComponent(t));eo.current=e,E(e),ea.current=t}catch(e){console.error("PDF loading error:",e),F(e instanceof Error?e.message:"Failed to load PDF")}finally{A(!1),es.current=!1}},[t]);(0,s.useEffect)(()=>{I&&t&&!en.current?(en.current=!0,eb()):t?ea.current===t&&A(!1):(A(!1),F("No file path provided"))},[t,eb,I]);let ew=(0,s.useCallback)(e=>{if(e<1||e>P||!ei.current)return void console.warn("Invalid page number: ".concat(e,". Valid range: 1-").concat(P));let t=Math.max(1,Math.min(e,P));ee(t);let r=document.querySelector('[data-page-number="'.concat(t,'"]'));if(r){let e=r.offsetTop;ei.current.scrollTo({top:e-20,behavior:"smooth"})}else{let e=ep(t-1);ei.current.scrollTo({top:e+16,behavior:"smooth"})}},[ep,P]);(0,s.useEffect)(()=>(x&&P>0&&x(ew),P>0&&(window.pdfViewer={goToPage:e=>{ew(e)}}),()=>{delete window.pdfViewer}),[x,ew,P]),(0,s.useEffect)(()=>{if(j&&P>0&&!_){let e=setTimeout(()=>{ew(j)},300);return()=>clearTimeout(e)}},[j,P,_,ew]);let ej=(0,s.useCallback)((e,t)=>{let r=e.querySelector(".react-pdf__Page__textContent");if(!r)return!1;let a=r.querySelectorAll("span"),s="",l=[];a.forEach(e=>{let t=s.length;s+=e.textContent||"",l.push({span:e,start:t,end:s.length})});let n=t.replace(/\s+/g," ").trim().toLowerCase(),c=s.replace(/\s+/g," ").toLowerCase().indexOf(n);if(-1===c)return!1;let o=c+n.length;return l.forEach(e=>{let{span:t,start:r,end:a}=e;r<o&&a>c&&(t.style.backgroundColor="rgba(198, 97, 63, 0.25)",t.style.borderRadius="2px",t.style.transition="background-color 0.3s")}),!0},[]),ev=(0,s.useCallback)(()=>{ei.current&&ei.current.querySelectorAll(".react-pdf__Page__textContent span").forEach(e
1=>{e.style.backgroundColor&&(e.style.backgroundColor="",e.style.borderRadius="")})},[]);(0,s.useEffect)(()=>{if(!S||!j||0===P||_)return;let e=setTimeout(()=>{let e=document.querySelector('[data-page-number="'.concat(j,'"]'));e&&ej(e,S);let t=setTimeout(ev,8e3);return()=>clearTimeout(t)},800);return()=>clearTimeout(e)},[S,j,P,_,ej,ev]),(0,s.useEffect)(()=>()=>{if(el.current&&(URL.revokeObjectURL(el.current),el.current=null),$.current){try{"function"==typeof $.current.destroy&&$.current.destroy(),"function"==typeof $.current.cleanup&&$.current.cleanup()}catch(e){console.warn("Error cleaning up PDF document:",e)}$.current=null}E(null),eo.current=null},[t]);let eN=(0,s.useCallback)(async e=>{$.current=e;let{numPages:t}=e;M(t);let r=[];for(let a=1;a<=t;a++)r.push(e.getPage(a));let a=(await Promise.all(r)).map(e=>{let t=e.getViewport({scale:1});return t.height/t.width});Q(a);let s=a.map(e=>Math.floor(G*L*e));J(s),s.length>0&&Y(s[0]),A(!1)},[G,L]),ey=(0,s.useCallback)(e=>{console.error("PDF document load error:",e),F("Failed to load PDF document: "+e.message),A(!1)},[]),ek=(0,s.useCallback)(e=>{e.pageNumber&&ew(e.pageNumber)},[ew]),eC=(0,s.useCallback)(()=>{if(!t)return;let e="/api/files/direct?filePath=".concat(encodeURIComponent(t)),a=document.createElement("a");a.href=e,a.download=r,a.target="_blank",document.body.appendChild(a),a.click(),document.body.removeChild(a)},[t,r]),eS=(0,s.useCallback)(()=>{R(e=>Math.min(e+.25,4))},[]),eT=(0,s.useCallback)(()=>{R(e=>Math.max(e-.25,.25))},[]),eE=(0,s.useCallback)(()=>{R(1)},[]);return I?_?(0,a.jsx)("div",{className:"h-full flex items-center justify-center bg-muted/10",children:(0,a.jsxs)("div",{className:"text-center",children:[(0,a.jsx)(i.A,{className:"h-12 w-12 text-muted-foreground mx-auto mb-4"}),(0,a.jsx)("p",{className:"text-muted-foreground",children:T("viewer.pdf.loading")})]})}):O?(0,a.jsx)("div",{className:"h-full flex items-center justify-center p-6",children:(0,a.jsx)(o.Fc,{className:"max-w-md",children:(0,a.jsx)(o.TN,{children:O})})}):eo.current?(0,a.jsxs)("div",{className:"h-full flex flex-col px-3",children:[(0,a.jsxs)("div",{className:"border-1 rounded-t-xl bg-background px-4 py-1 flex items-center justify-between",children:[(0,a.jsx)("div",{className:"flex items-center gap-2",children:(0,a.jsx)("span",{className:"text-sm text-muted-foreground",children:P>0&&T("viewer.pdf.pageIndicator",{current:Z,total:P})})}),(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)(c.$,{variant:"ghost",size:"sm",onClick:eT,className:"h-8 w-8 p-0 hover:bg-muted/50",children:(0,a.jsx)(d.A,{className:"h-4 w-4"})}),(0,a.jsx)(c.$,{variant:"ghost",size:"sm",onClick:eE,className:"h-8 px-3 hover:bg-muted/50",children:1===L?T("viewer.pdf.pageFit"):"".concat(Math.round(100*L),"%")}),(0,a.jsx)(c.$,{variant:"ghost",size:"sm",onClick:eS,className:"h-8 w-8 p-0 hover:bg-muted/50",children:(0,a.jsx)(u.A,{className:"h-4 w-4"})}),(0,a.jsx)("div",{className:"w-px h-4 bg-border mx-1"}),(0,a.jsx)(c.$,{variant:"ghost",size:"sm",onClick:eC,className:"h-8 w-8 p-0 hover:bg-muted/50",children:(0,a.jsx)(m.A,{className:"h-4 w-4"})}),p&&b&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"w-px h-4 bg-border mx-1"}),(0,a.jsx)(c.$,{variant:"ghost",size:"sm",onClick:()=>er(!0),className:"h-8 w-8 p-0 hover:bg-muted/50 cursor-pointer",title:T("viewer.pageOffset.title"),children:(0,a.jsx)(f.A,{className:"h-4 w-4"})})]}),n&&(0,a.jsx)(c.$,{variant:"ghost",size:"sm",onClick:n,className:"h-8 w-8 p-0 hover:bg-muted/50",children:(0,a.jsx)(h.A,{className:"h-4 w-4"})})]})]}),(0,a.jsx)("div",{ref:ei,className:"flex-1 bg-gray-100 border-1 rounded-b-xl dark:bg-gray-900 overflow-auto",children:(0,a.jsx)("div",{ref:ec,className:"relative flex flex-col items-center",style:{height:P>0?"".concat(ex,"px"):"auto",minHeight:"100%"},children:(0,a.jsx)(k,{file:eo.current,onLoadSuccess:eN,onLoadError:ey,onItemClick:ek,loading:(0,a.jsxs)("div",{className:"text-center py-8",children:[(0,a.jsx)(i.A,{className:"h-8 w-8 text-muted-foreground mx-auto mb-2"}),(0,a.jsx)("p",{className:"text-muted-foreground",children:T("viewer.pdf.loadingDocument")})]}),error:(0,a.jsx)("div",{className:"text-center py-8",children:(0,a.jsx)(o.Fc,{className:"max-w-md mx-auto",children:(0,a.jsx)(o.TN,{children:T("viewer.pdf.loadFailed")})})}),className:"w-full flex flex-col items-center",options:eg,children:Array.from(Array(P),(e,t)=>{let r=t+1,s=V.has(r),l=ep(t),n=eh(t);return(0,a.jsx)("div",{className:"w-full flex justify-center items-center","data-page-number":r,style:{position:"absolute",top:"".concat(l,"px"),left:0,right:0,height:"".concat(n,"px"),maxWidth:"100%",padding:"0"},children:s?(0,a.jsx)(C,{pageNumber:r,width:G,scale:L,loading:(0,a.jsx)("div",{className:"flex items-center justify-center bg-white",style:{width:"".concat(G*L,"px"),height:"".concat(n,"px")},children:(0,a.jsxs)("div",{className:"text-center",children:[(0,a.jsx)(i.A,{className:"h-8 w-8 text-muted-foreground mx-auto mb-2"}),(0,a.jsx)("p",{className:"text-muted-foreground",children:T("viewer.pdf.loadingPage",{n:r})})]})}),error:(0,a.jsx)("div",{className:"flex items-center justify-center bg-white",style:{width:"".concat(G*L,"px"),height:"".concat(n,"px")},children:(0,a.jsx)(o.Fc,{className:"max-w-md",children:(0,a.jsx)(o.TN,{children:T("viewer.pdf.pageLoadFailed",{n:r})})})}),renderTextLayer:!0,renderAnnotationLayer:!0,className:"max-w-full"},"page_".concat(r)):(0,a.jsx)("div",{className:"flex items-center justify-center bg-gray-200 dark:bg-gray-700",style:{width:"".concat(G*L,"px"),height:"".concat(n,"px"),maxWidth:"100%"},children:(0,a.jsxs)("div",{className:"text-center text-gray-500",children:[(0,a.jsx)(i.A,{className:"h-8 w-8 mx-auto mb-2"}),(0,a.jsx)("p",{className:"text-sm",children:T("viewer.pdf.pageLabel",{n:r})}),(0,a.jsx)("p",{className:"text-xs",children:T("viewer.pdf.scrollToLoad")})]})})},"page_wrapper_".concat(r))})})})}),p&&b&&(0,a.jsx)(v,{sessionId:p,currentOffset:g,onOffsetChange:b,open:et,onOpenChange:er}),ed&&w&&(0,a.jsx)(y.T,{selectedText:ed.text,position:ed.position,onAction:em,onClose:eu})]}):(0,a.jsx)("div",{className:"h-full flex items-center justify-center",children:(0,a.jsx)("p",{className:"text-muted-foreground",children:T("viewer.pdf.preparing")})}):(0,a.jsx)("div",{className:"h-full flex items-center justify-center bg-muted/10",children:(0,a.jsxs)("div",{className:"text-center",children:[(0,a.jsx)(i.A,{className:"h-12 w-12 text-muted-foreground mx-auto mb-4"}),(0,a.jsx)("p",{className:"text-muted-foreground",children:T("viewer.pdf.initializing")})]})})})}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.