1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3943],{83943:(n,e,t)=>{async function o(n){let e='\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset="utf-8">\n <title>'.concat(n.title,"</title>\n <style>\n @media print {\n @page {\n margin: 1in;\n }\n body {\n print-color-adjust: exact;\n -webkit-print-color-adjust: exact;\n }\n }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n max-width: 800px;\n margin: 0 auto;\n padding: 20px;\n line-height: 1.6;\n color: #333;\n }\n h1 {\n color: #2563eb;\n border-bottom: 2px solid #2563eb;\n padding-bottom: 10px;\n page-break-after: avoid;\n }\n .meta {\n color: #666;\n font-size: 14px;\n margin-bottom: 30px;\n page-break-after: avoid;\n }\n .message {\n margin-bottom: 30px;\n padding: 15px;\n border-left: 4px solid #e5e7eb;\n background: #f9fafb;\n page-break-inside: avoid;\n }\n .message.user {\n border-left-color: #3b82f6;\n background: #eff6ff;\n }\n .message.bot {\n border-left-color: #10b981;\n background: #f0fdf4;\n }\n .message-header {\n font-weight: 600;\n margin-bottom: 10px;\n color: #111;\n }\n .message-time {\n font-size: 12px;\n color: #666;\n margin-top: 5px;\n }\n .message-content {\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n .sources {\n margin-top: 10px;\n font-size: 12px;\n color: #666;\n }\n .sources ul {\n margin: 5px 0;\n padding-left: 20px;\n }\n code {\n background: #f3f4f6;\n padding: 2px 6px;\n border-radius: 4px;\n font-family: 'Courier New', monospace;\n }\n pre {\n background: #1f2937;\n color: #f9fafb;\n padding: 15px;\n border-radius: 8px;\n overflow-x: auto;\n page-break-inside: avoid;\n }\n pre code {\n background: transparent;\n padding: 0;\n color: inherit;\n }\n </style>\n </head>\n <body>\n <h1>").concat(s(n.title),'</h1>\n <div class="meta">\n <strong>Exported:</strong> ').concat(new Date().toLocaleString(),"<br>\n <strong>Messages:</strong> ").concat(n.messages.length,"\n </div>\n ").concat(n.messages.map(n=>{let e=new Date(n.timestamp).toLocaleString(),t="bot"===n.sender?"CourseConnect AI":s(n.name),o="bot"===n.sender?"\uD83E\uDD16":"\uD83D\uDC64",a="bot"===n.sender?"bot":"user",r=s(n.text);r=(r=(r=r.replace(/```(\w+)?\n([\s\S]*?)```/g,(n,e,t)=>"<pre><code>".concat(s(t),"</code></pre>"))).replace(/`([^`]+)`/g,"<code>$1</code>")).replace(/\n/g,"<br>");let c="";return n.sources&&n.sources.length>0&&(c='<div class="sources"><strong>Sources:</strong><ul>',n.sources.forEach(n=>{n.fileName&&(c+="<li>".concat(s(n.fileName)).concat(n.page?" (Page ".concat(n.page,")"):"","</li>"))}),c+="</ul></div>"),'\n <div class="message '.concat(a,'">\n <div class="message-header">').concat(o," ").concat(t,'</div>\n <div class="message-content">').concat(r,"</div>\n ").concat(c,'\n <div class="message-time">').concat(e,"</div>\n </div>\n ")}).join(""),"\n </body>\n </html>\n "),t=window.open("","_blank");if(!t)throw Error("Could not open print window. Please allow popups to export as PDF.");t.document.write(e),t.document.close(),t.onload=()=>{setTimeout(()=>{t.print()},250)}}async function a(n,e){let t,a,r=n.title.replace(/[^a-z0-9]/gi,"_"),c=new Date().toISOString().split("T")[0];switch(e){case"json":t=new Blob([JSON.stringify({chatName:n.title,exportDate:new Date().toISOString(),messageCount:n.messages.length,messages:n.messages.map(n=>({sender:n.sender,name:n.name,text:n.text,timestamp:new Date(n.timestamp).toLocaleStr
1ing()}))},null,2)],{type:"application/json"}),a="".concat(r,"_chat_export_").concat(c,".json");break;case"markdown":t=new Blob([function(n){let e=[];return e.push("# ".concat(n.title,"\n")),e.push("**Exported:** ".concat(new Date().toLocaleString())),e.push("**Messages:** ".concat(n.messages.length,"\n")),e.push("---\n"),n.messages.forEach(n=>{let t=new Date(n.timestamp).toLocaleString(),o="bot"===n.sender?"CourseConnect AI":n.name,a="bot"===n.sender?"\uD83E\uDD16":"\uD83D\uDC64";e.push("\n## ".concat(a," ").concat(o)),e.push("*".concat(t,"*\n"));let s=n.text,r=[];(s=s.replace(/```[\s\S]*?```/g,n=>(r.push(n),"__CODE_BLOCK_".concat(r.length-1,"__")))).split("\n").forEach(n=>{e.push(n)}),r.forEach((n,t)=>{let o="__CODE_BLOCK_".concat(t,"__"),a=e.findIndex(n=>n.includes(o));-1!==a&&(e[a]=e[a].replace(o,n))}),n.sources&&n.sources.length>0&&(e.push("\n**Sources:**"),n.sources.forEach(n=>{n.fileName&&e.push("- ".concat(n.fileName).concat(n.page?" (Page ".concat(n.page,")"):""))})),e.push("\n---")}),e.join("\n")}(n)],{type:"text/markdown"}),a="".concat(r,"_chat_export_").concat(c,".md");break;case"pdf":try{await o(n);return}catch(n){throw Error(n.message||"Could not export as PDF. Please allow popups.")}case"word":t=new Blob(["\uFEFF",'\n <!DOCTYPE html>\n <html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">\n <head>\n <meta charset="utf-8">\n <title>'.concat(n.title,"</title>\n \x3c!--[if gte mso 9]>\n <xml>\n <w:WordDocument>\n <w:View>Print</w:View>\n <w:Zoom>90</w:Zoom>\n <w:DoNotOptimizeForBrowser/>\n </w:WordDocument>\n </xml>\n <![endif]--\x3e\n <style>\n @page {\n size: 8.5in 11in;\n margin: 1in;\n }\n body {\n font-family: 'Calibri', 'Arial', sans-serif;\n font-size: 11pt;\n line-height: 1.5;\n color: #000;\n }\n h1 {\n color: #2563eb;\n font-size: 24pt;\n margin-bottom: 12pt;\n border-bottom: 2pt solid #2563eb;\n padding-bottom: 6pt;\n }\n .meta {\n color: #666;\n font-size: 10pt;\n margin-bottom: 18pt;\n }\n .message {\n margin-bottom: 18pt;\n padding: 12pt;\n border-left: 3pt solid #e5e7eb;\n background: #f9fafb;\n page-break-inside: avoid;\n }\n .message.user {\n border-left-color: #3b82f6;\n background: #eff6ff;\n }\n .message.bot {\n border-left-color: #10b981;\n background: #f0fdf4;\n }\n .message-header {\n font-weight: bold;\n font-size: 12pt;\n margin-bottom: 6pt;\n color: #000;\n }\n .message-time {\n font-size: 9pt;\n color: #666;\n margin-top: 6pt;\n }\n .message-content {\n white-space: pre-wrap;\n word-wrap: break-word;\n font-size: 11pt;\n }\n .sources {\n margin-top: 6pt;\n font-size: 9pt;\n color: #666;\n }\n code {\n background: #f3f4f6;\n padding: 2pt 4pt;\n border-radius: 2pt;\n font-family: 'Courier New', monospace;\n font-size: 10pt;\n }\n pre {\n background: #1f2937;\n color: #f9fafb;\n padding: 12pt;\n border-radius: 4pt;\n overflow-x: auto;\n font-family: 'Courier New', monospace;\n font-size: 9pt;\n }\n </style>\n </head>\n <body>\n <h1>").concat(s(n.title),'</h1>\n <div class="meta">\n <strong>Exported:</strong> ').concat(new Date().toLocaleString(),"<br>\n <strong>Messages:</strong> ").concat(n.messages.length,"\n </div>\n ").concat(n.messages.map(n=>
1{let e=new Date(n.timestamp).toLocaleString(),t="bot"===n.sender?"CourseConnect AI":s(n.name),o="bot"===n.sender?"\uD83E\uDD16":"\uD83D\uDC64",a="bot"===n.sender?"bot":"user",r=s(n.text);r=(r=(r=r.replace(/```(\w+)?\n([\s\S]*?)```/g,(n,e,t)=>"<pre><code>".concat(s(t),"</code></pre>"))).replace(/`([^`]+)`/g,"<code>$1</code>")).replace(/\n/g,"<br>");let c="";return n.sources&&n.sources.length>0&&(c='<div class="sources"><strong>Sources:</strong><ul>',n.sources.forEach(n=>{n.fileName&&(c+="<li>".concat(s(n.fileName)).concat(n.page?" (Page ".concat(n.page,")"):"","</li>"))}),c+="</ul></div>"),'\n <div class="message '.concat(a,'">\n <div class="message-header">').concat(o," ").concat(t,'</div>\n <div class="message-content">').concat(r,"</div>\n ").concat(c,'\n <div class="message-time">').concat(e,"</div>\n </div>\n ")}).join(""),"\n </body>\n </html>\n ")],{type:"application/msword"}),a="".concat(r,"_chat_export_").concat(c,".doc");break;default:throw Error("Unsupported export format: ".concat(e))}let i=URL.createObjectURL(t),d=document.createElement("a");d.href=i,d.download=a,document.body.appendChild(d),d.click(),document.body.removeChild(d),URL.revokeObjectURL(i)}function s(n){let e=document.createElement("div");return e.textContent=n,e.innerHTML}t.d(e,{exportChat:()=>a})}}]);
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.