@nuniapp/widget 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,10 +3,10 @@
3
3
  `)}function p(e){let t=e.replace(/\s+/g,` `).trim();return t.includes("`")?`"${t}"`:`\`${t}\``}function m(e,t={}){let n=t.includeContext??!0,{anchor:i,page:a}=e,o=[];if(o.push(`Fix this piece of feedback that was left on the live site with Nuni.`,``,`## Comment`,``,...e.body?[f(e.body),``]:[],...e.suggestion?[`Suggested text change. Replace:`,``,f(e.suggestion.before),``,`With:`,``,f(e.suggestion.after),``]:[],`From ${e.authorName} on ${new Date(e.createdAt).toISOString().slice(0,10)}`+(e.status===`resolved`?e.resolution===`outdated`?` (closed as outdated)`:` (already resolved)`:``)),e.replies?.length){o.push(``,`## Replies (${e.replies.length})`,``);for(let t of e.replies)o.push(`${t.authorName}${t.isOwner?` (owner)`:``}:`,f(t.body),``);o.pop()}if(o.push(``,`## Where`,``),o.push(`- Page: ${a.title?`${a.title} `:``}(${a.path})`),o.push(`- Open it: ${r(a,e._id)}`),o.push(`- Viewport: ${e.viewport.w}×${e.viewport.h} at ${e.viewport.dpr}x`),n&&e.userAgent&&o.push(`- Browser: ${e.userAgent}`),o.push(``,`## Element`,``),e.pinLostAt&&o.push(`- Not found on the page since ${new Date(e.pinLostAt).toISOString().slice(0,10)}: it may have changed or been removed. Check whether the feedback still applies.`),o.push(`- Tag: <${i.tag}>`),i.text&&o.push(`- Text: ${p(i.text)}`),i.quote&&o.push(`- Selected text: ${p(i.quote.exact)}`),i.region){let e=e=>`${Math.round(e*100)}%`,t=i.region;o.push(`- Area: ${e(t.w)} × ${e(t.h)} of the element, from ${e(t.x)} left and ${e(t.y)} top`)}i.componentName&&o.push(`- React component: ${i.componentName}`),i.selectors.testId&&o.push(`- Test ID: ${p(i.selectors.testId)}`),i.selectors.id&&o.push(`- ID: ${p(i.selectors.id)}`),i.selectors.css&&o.push(`- CSS selector: ${p(i.selectors.css)}`),o.push(`- DOM path: ${p(i.selectors.path)}`);let s=Object.entries(i.attrs).filter(([e])=>e!==`class`&&e!==`style`).map(([e,t])=>`${e}="${t}"`);s.length&&o.push(`- Attributes: ${p(s.join(` `))}`);let c=n?e.context:void 0;c?.dom?.html&&o.push(``,d(c.dom.html,`html`));let l=Object.entries(c?.dom?.styles??{});if(l.length&&o.push(``,`Computed styles:`,``,d(l.map(([e,t])=>`${e}: ${t};`).join(`
4
4
  `),`css`)),c?.console?.length&&(o.push(``,`## Console (${c.console.length})`,``),o.push(d(c.console.map(e=>`[${e.level}] ${e.message}`).join(`
5
5
  `),`text`))),c?.network?.length){o.push(``,`## Failed requests (${c.network.length})`,``);for(let e of c.network)o.push(`- ${e.method} ${e.url} → ${e.status===0?`network error`:e.status}`)}return e.imageUrls?.length&&o.push(``,`## Images from ${e.authorName} (${e.imageUrls.length})`,``,...e.imageUrls.map(e=>`- ${e}`)),n&&e.screenshotUrl&&o.push(``,`## Screenshot`,``,e.screenshotUrl),o.push(``,`## Steps`,``,`1. Find the code that renders this element. Search for the text, the component name, the test ID or the selector.`,e.suggestion?`2. Replace the text exactly as suggested (wherever it comes from: markup, a component, a translation or content file), and keep the fix focused on it.`:`2. Make the change the comment asks for, and keep the fix focused on it.`,`3. Tell me what you changed, so the comment can be resolved in Nuni.`,` If the Nuni CLI is signed in to this project (\`npx ${u.cli}@latest login\`), resolve it with \`npx ${u.cli}@latest resolve ${e._id}\` or the \`resolve_comment\` MCP tool.`),o.join(`
6
- `)}let h=`123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz`,g=RegExp(`^nuni_[${h}]{22}$`);function _(e){let t=new Uint8Array(e);crypto.getRandomValues(t);let n=``;for(let e of t){let t=e;for(;t>=232;){let e=/* @__PURE__ */ new Uint8Array(1);crypto.getRandomValues(e),t=e[0]}n+=h[t%58]}return n}function v(e){return typeof e==`string`&&g.test(e)}function y(){return _(32)}let b={bodyMaxLength:2e3,nameMaxLength:50,unclaimedCommentCap:500,maxOriginsPerProject:20,sessionTtlMs:2592e6,cliSessionTtlMs:7776e6,transferTtlMs:6048e5,bulkMax:100,pinReportMax:200,lostCountMax:99,cliLoginTtlMs:6e5,anchorTextMaxLength:120,quoteMaxLength:500,quoteContextLength:32,pageOpenLimit:1e3,pageResolvedLimit:200,yoursLimit:100,contextEntryMax:20,contextMessageMaxLength:500,domSnippetMaxLength:4e3,screenshotMaxBytes:6e5,imagesPerComment:3,imageMaxBytes:6e5,imageMaxSide:1600,repliesPerComment:200,reactionsPerComment:2e3,screenshotUploadWindowMs:3e5},ee=[`👍`,`❤️`,`🎉`,`👀`,`✅`,`😄`],te=`data-nuni-mask`,x=`[${te}]`;function S(e){return{project:e.project,convexUrl:e.convexUrl??`https://greedy-giraffe-33.convex.cloud`,convexSiteUrl:e.convexSiteUrl??`https://greedy-giraffe-33.convex.site`,appUrl:(e.appUrl??`https://nuni.praveenjuge.com`).replace(/\/$/,``),getPageKey:e.getPageKey??oe(e.pageKey),position:ie(e.position,ne,`bottom-right`),accentColor:e.accentColor?.trim()||null,theme:ie(e.theme,re,`auto`),label:e.label?.trim()||null,hotkey:e.hotkey===!1?null:e.hotkey?.trim().slice(0,1).toLowerCase()||`c`,zIndex:typeof e.zIndex==`number`&&Number.isFinite(e.zIndex)?Math.round(e.zIndex):null,locale:e.locale?.trim()||void 0,messages:e.messages??{},images:e.images??!0,capture:{console:e.capture?.console??!0,network:e.capture?.network??!0,dom:e.capture?.dom??!0,screenshot:e.capture?.screenshot??!0}}}let ne=[`bottom-right`,`bottom-center`,`bottom-left`,`top-right`,`top-center`,`top-left`],re=[`auto`,`light`,`dark`];function ie(e,t,n){return t.includes(e)?e:n}let ae=/^(nuni|utm_.*|fbclid|gclid|msclkid|ref)$/i;function oe(t=`path`){return n=>{let r=e(n);if(t===`path+search`){let e=[...n.searchParams].filter(([e])=>!ae.test(e)).sort(([e],[t])=>e<t?-1:+(e>t));return e.length?`${r}?${new URLSearchParams(e).toString()}`:r}return t===`path+hash`&&n.hash.length>1&&!r.includes(`#`)&&!/^#!?\//.test(n.hash)?`${r}${n.hash}`:r}}let se=Symbol.for(`nuni.capture`);function ce(e){"@babel/helpers - typeof";return ce=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},ce(e)}function le(e,t){if(ce(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(ce(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function ue(e){var t=le(e,`string`);return ce(t)==`symbol`?t:t+``}function C(e,t,n){return(t=ue(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}let de=b.contextMessageMaxLength;function fe(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=e.stack?.split(`
7
- `).find(e=>e.trim().startsWith(`at `));return`${e.name}: ${e.message}${t?` (${t.trim()})`:``}`}try{let t=200;return JSON.stringify(e,(e,n)=>t-->0?n:void 0)??String(e)}catch{return String(e)}}function pe(e){return e.length>de?`${e.slice(0,de-1)}…`:e}function me(e){return pe(i(e,location.href))}var he=class{constructor(){C(this,`items`,[])}push(e){this.items.push(e),this.items.length>b.contextEntryMax&&this.items.shift()}};function ge(e,t){let n=new he,r=new he,i=[],a=(e,t)=>{n.push({level:e,message:pe(o(t.map(fe).join(` `))),at:Date.now()})},s=(e,n,i)=>{t(n)||r.push({method:e.toUpperCase(),url:me(n),status:i,at:Date.now()})};if(e.console){for(let e of[`error`,`warn`]){let t=console[e],n=(...n)=>{a(e,n),t.apply(console,n)};console[e]=n,i.push(()=>{console[e]===n&&(console[e]=t)})}let e=e=>{e.error?a(`error`,[e.error]):a(`error`,[`${e.message}${e.filename?` (${me(e.filename)}:${e.lineno})`:``}`])},t=e=>a(`error`,[`Unhandled rejection:`,e.reason]);window.addEventListener(`error`,e),window.addEventListener(`unhandledrejection`,t),i.push(()=>{window.removeEventListener(`error`,e),window.removeEventListener(`unhandledrejection`,t)})}if(e.network){let e=window.fetch;if(typeof e==`function`){let t=async(t,n)=>{if(n&&n[se])return e.call(window,t,n);let r=typeof t==`string`?t:t instanceof URL?t.href:t.url,i=n?.method??(typeof t==`object`&&`method`in t?t.method:`GET`);try{let a=await e.call(window,t,n);return!a.ok&&a.type!==`opaque`&&s(i,r,a.status),a}catch(e){throw e instanceof DOMException&&e.name===`AbortError`||s(i,r,0),e}};window.fetch=t,i.push(()=>{window.fetch===t&&(window.fetch=e)})}let t=window.XMLHttpRequest?.prototype;if(t){let e=t.open,n=t.send,r=/* @__PURE__ */ new WeakMap,a=function(t,n,...i){return r.set(this,{method:t,url:String(n)}),e.call(this,t,n,...i)};t.open=a;let o=function(e){let t=r.get(this);if(t){let e=!1,n=()=>e=!0,r=()=>{this.removeEventListener(`abort`,n),this.removeEventListener(`loadend`,r),!e&&(this.status===0||this.status>=400)&&s(t.method,t.url,this.status)};this.addEventListener(`abort`,n),this.addEventListener(`loadend`,r)}return n.call(this,e)};t.send=o,i.push(()=>{t.open===a&&(t.open=e),t.send===o&&(t.send=n)})}}return{console:()=>[...n.items],network:()=>[...r.items],stop(){for(let e of i.splice(0))e()}}}let _e=[`display`,`position`,`width`,`height`,`margin`,`padding`,`gap`,`font-family`,`font-size`,`font-weight`,`line-height`,`letter-spacing`,`text-align`,`color`,`background-color`,`border`,`border-radius`,`box-shadow`,`opacity`];function ve(e,t){e.replaceChildren(e.ownerDocument.createComment(` ${t} `))}function ye(e){let t=e.ownerDocument.createTreeWalker(e,5),n=[];for(let r=e;r;r=t.nextNode()){if(r.nodeType===3){let e=r.textContent??``;e.length>200&&(r.textContent=`${e.slice(0,200)}…`);continue}let e=r,t=e.tagName;if(t===`SCRIPT`||t===`STYLE`||t===`NOSCRIPT`){n.push(e);continue}if(e.hasAttribute(`data-nuni-mask`)){for(let t of Array.from(e.attributes))t.name!==`id`&&t.name!==`class`&&t.name!==`data-nuni-mask`&&e.removeAttribute(t.name);ve(e,`masked`);continue}if((t===`INPUT`||t===`TEXTAREA`)&&(e.removeAttribute(`value`),t===`TEXTAREA`&&(e.textContent=``)),t===`SELECT`||t===`DATALIST`){let t=e.getElementsByTagName(`option`).length;ve(e,`${t} options`)}for(let t of Array.from(e.attributes))t.value.length>200&&e.setAttribute(t.name,`${t.value.slice(0,200)}…`)}for(let e of n)e.parentNode?.removeChild(e)}function be(e,t){let n=e.cloneNode(!1);if(t>0)for(let r of Array.from(e.childNodes))n.appendChild(r.nodeType===1?be(r,t-1):r.cloneNode(!1));else e.childElementCount&&n.appendChild(e.ownerDocument.createComment(` ${e.childElementCount} more `));return n}function xe(e){let t=b.domSnippetMaxLength,n=``,r=!!e.parentElement?.closest(`[${te}]`);for(let i of r?[-1]:[1/0,3,1,0]){let r=i===1/0?e.cloneNode(!0):be(e,Math.max(0,i));if(i<0&&r.setAttribute(te,``),ye(r),n=l(r.outerHTML),n.length<=t)break}n.length>t&&(n=`${n.slice(0,t-1)}…`);let i={},a=e.ownerDocument.defaultView?.getComputedStyle(e);for(let e of _e){let t=a?.getPropertyValue(e).trim();t&&(i[e]=t)}return{html:n,styles:i}}function Se(e){let t=Object.keys(e).find(e=>e.startsWith(`__reactFiber$`)||e.startsWith(`__reactInternalInstance$`));if(!t)return;let n=e[t]??null;for(let e=0;n&&e<30;e++){let e=n.type;if(e&&typeof e!=`string`){let t=e.displayName||e.name||e.render?.name;if(t&&t.length>2&&/^[A-Z]/.test(t))return t}n=n.return??null}}function Ce(e){let t=e.getBoundingClientRect(),n=e.ownerDocument.defaultView,r=n?.scrollX??0,i=n?.scrollY??0;return{x:t.left+r,y:t.top+i,w:t.width,h:t.height}}function we(e){let t=e.defaultView;return{w:t?.innerWidth??0,h:t?.innerHeight??0,dpr:t?.devicePixelRatio??1,scrollX:t?.scrollX??0,scrollY:t?.scrollY??0}}function Te(e){let t=e.documentElement;return{w:t.scrollWidth,h:t.scrollHeight}}function Ee(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):.5}function De(e){if(!e.isConnected)return!1;let t=e.ownerDocument.defaultView,n=e.getBoundingClientRect();if(n.width===0&&n.height===0)return!1;let r=t?.getComputedStyle(e);return!r||r.visibility!==`hidden`&&r.display!==`none`}function Oe(e,t){let n=t.ignoreAttributePrefixes;return!n||!n.some(t=>e.startsWith(t))}let ke=/* @__PURE__ */ new Set([`SCRIPT`,`STYLE`,`NOSCRIPT`,`TEMPLATE`,`SVG`]);function Ae(e){return e.replace(/\s+/g,` `).trim()}function w(e,t=120){if(e.closest(x))return``;if(e.tagName===`INPUT`||e.tagName===`TEXTAREA`)return Ae(e.placeholder||e.getAttribute(`aria-label`)||``).slice(0,t);let n=``,r=e=>{if(n.length>t*2)return;if(e.nodeType===3){n+=e.nodeValue??``;return}if(e.nodeType!==1)return;let i=e.tagName.toUpperCase();if(ke.has(i)||e.hasAttribute(`data-nuni-mask`)||e.hasAttribute(`data-nuni`))return;if(i===`IMG`){n+=` `+(e.getAttribute(`alt`)??``)+` `;return}let a=e.shadowRoot;if(a){for(let e of Array.from(a.childNodes))r(e);return}if(i===`SLOT`){let t=e.assignedNodes?.({flatten:!0});if(t?.length){for(let e of t)r(e);return}}for(let t of Array.from(e.childNodes))r(t);(i===`BR`||i===`P`||i===`DIV`||i===`LI`)&&(n+=` `)};return r(e),Ae(n).slice(0,t)}function je(e){let t=e.toLowerCase(),n=/* @__PURE__ */ new Map;for(let e=0;e<t.length-1;e++){let r=t.slice(e,e+2);n.set(r,(n.get(r)??0)+1)}return n}function T(e,t){if(e===t)return 1;let n=e.toLowerCase(),r=t.toLowerCase();if(n===r)return 1;if(n.length<2||r.length<2)return 0;let i=je(n),a=je(r),o=0;for(let[e,t]of i){let n=a.get(e);n&&(o+=Math.min(t,n))}return 2*o/(n.length-1+(r.length-1))}let Me=/* @__PURE__ */ new Set([`SCRIPT`,`STYLE`,`NOSCRIPT`,`TEMPLATE`,`SVG`]),Ne=/* @__PURE__ */ new Set(/* @__PURE__ */ `ADDRESS.ARTICLE.ASIDE.BLOCKQUOTE.BR.DD.DIV.DL.DT.FIGCAPTION.FIGURE.FOOTER.FORM.H1.H2.H3.H4.H5.H6.HEADER.HR.LI.MAIN.NAV.OL.P.PRE.SECTION.TABLE.TD.TH.TR.UL`.split(`.`)),Pe=/* @__PURE__ */ new Set(/* @__PURE__ */ `A.ABBR.B.BDI.BDO.CITE.CODE.DATA.DEL.DFN.EM.I.INS.KBD.LABEL.MARK.Q.S.SAMP.SMALL.SPAN.STRONG.SUB.SUP.TIME.U.VAR`.split(`.`)),Fe=2e4,Ie=/[\p{L}\p{N}]/u;function Le(e){let t={text:``,nodes:[],node:[],offset:[]};if(e.closest(x))return t;let n=[],r=!0,i=(e,r,i)=>{n.push(e),t.node.push(r),t.offset.push(i)},a=()=>{if(r||!t.nodes.length)return;let e=t.nodes.length-1;i(` `,e,t.nodes[e].length),r=!0},o=e=>{if(n.length>=Fe)return;if(e.nodeType===3){let a=e.nodeValue??``;if(!a)return;let o=t.nodes.push(e)-1;for(let e=0;e<a.length&&n.length<Fe;e++){let t=a[e];t===` `||t===`
8
- `||t===` `||t===`\r`||t===`\f`?(r||i(` `,o,e),r=!0):(i(t,o,e),r=!1)}return}if(e.nodeType!==1)return;let s=e,c=s.tagName.toUpperCase();if(Me.has(c)||s.hasAttribute(`data-nuni-mask`)||s.hasAttribute(`data-nuni`))return;let l=Ne.has(c);l&&a();for(let e of Array.from(s.childNodes))o(e);l&&a()};for(o(e);n.length&&n[n.length-1]===` `;)n.pop(),t.node.pop(),t.offset.pop();return t.text=n.join(``),t}function Re(e,t,n){if(!e.text.length)return 0;let r=(t.ownerDocument??t).createRange();r.setStart(t,n),r.collapse(!0);let i=0,a=e.text.length;try{for(;i<a;){let t=i+a>>1,n=e.nodes[e.node[t]];r.comparePoint(n,e.offset[t])<0?i=t+1:a=t}}catch{return-1}return i}function ze(e,t,n){let r=e.nodes[e.node[t]],i=e.nodes[e.node[n-1]],a=r.ownerDocument.createRange();return a.setStart(r,e.offset[t]),a.setEnd(i,Math.min(i.length,e.offset[n-1]+1)),a}function Be(e){let t=e.commonAncestorContainer;if(t.nodeType!==1&&(t=t.parentNode),!t||t.nodeType!==1)return null;let n=t,r=n.ownerDocument.body;for(;Pe.has(n.tagName.toUpperCase())&&n.parentElement&&n.parentElement!==r;)n=n.parentElement;return n}function Ve(e,t){let n=Le(t),r=Re(n,e.startContainer,e.startOffset),i=Re(n,e.endContainer,e.endOffset);if(r<0||i<0)return null;let{text:a}=n;for(;r<i&&a[r]===` `;)r++;for(;i>r&&a[i-1]===` `;)i--;if(i<=r)return null;let o=a.slice(r,Math.min(i,r+b.quoteMaxLength)),s=r+o.length;return{exact:o,prefix:a.slice(Math.max(0,r-b.quoteContextLength),r),suffix:a.slice(s,s+b.quoteContextLength)}}function He(e,t){let n=Ge(e,t,0);if(n)return n;let r=e.parentElement,i=e.ownerDocument.body;for(let e=0;r&&r!==i&&e<2;e++){let e=Ge(r,t,.6);if(e)return e;r=r.parentElement}return null}function Ue(e,t){return t?T(e,t):e?.8:1}function We(e,t,n,r){let i=e.slice(Math.max(0,t-r.prefix.length),t),a=e.slice(n,n+r.suffix.length);return(Ue(i.trimStart(),r.prefix.trimStart())+Ue(a.trimEnd(),r.suffix.trimEnd()))/2}function Ge(e,t,n){let{exact:r}=t;if(!r)return null;let i=Le(e),{text:a}=i;if(!a)return null;let o=-1,s=-1;for(let e=a.indexOf(r);e>=0;e=a.indexOf(r,e+1)){let n=We(a,e,e+r.length,t);n>s&&(o=e,s=n)}if(o>=0&&s>=n)return{range:ze(i,o,o+r.length),exact:!0};if(r.length<8||a.length>6e3)return null;let c=Ke(a,t);if(!c)return null;let l=We(a,c.start,c.end,t);return c.score<.75||l<Math.max(n,.3)?null:{range:ze(i,c.start,c.end),exact:!1}}function Ke(e,t){let n=e=>e!==void 0&&Ie.test(e),r=[],i=[];for(let t=0;t<e.length;t++){let a=e[t];if(a===` `)continue;let o=e[t-1],s=e[t+1];(o===void 0||o===` `||n(a)&&!n(o))&&r.push(t),(s===void 0||s===` `||n(a)&&!n(s))&&i.push(t+1)}let a=t.exact.length,o=null,s=0;for(let n of r){for(;s<i.length&&i[s]<=n;)s++;for(let r=s;r<i.length;r++){let s=i[r]-n;if(s<a*.7)continue;if(s>a*1.3)break;let c=T(e.slice(n,i[r]),t.exact);(!o||c>o.score)&&(o={start:n,end:i[r],score:c})}}return o}function E(e){return!!(e&&e.nodeType===11&&`host`in e)}function qe(e){let t=e.getRootNode();return E(t)?t:e.ownerDocument}function Je(e){return E(e)?e.ownerDocument:e}function Ye(e){try{return e.defaultView?.frameElement??null}catch{return null}}function Xe(e){if(e.tagName!==`IFRAME`&&e.tagName!==`FRAME`)return null;try{return e.contentDocument}catch{return null}}function Ze(e,t){let n=[],r=e;for(let e=0;e<8;e++){let e=r.getRootNode();if(E(e)){n.unshift({kind:`shadow`,host:e.host}),r=e.host;continue}if(r.ownerDocument===t)break;let i=Ye(r.ownerDocument);if(!i)break;n.unshift({kind:`frame`,host:i}),r=i}return n}function D(e,t){let n=e.getBoundingClientRect(),r=n.left,i=n.top,a=!1,o=e.ownerDocument;for(let e=0;e<8&&o!==t;e++){let e=Ye(o);if(!e)break;let t=o.defaultView;t&&(r+n.width<0||i+n.height<0||r>t.innerWidth||i>t.innerHeight)&&(a=!0);let s=e.getBoundingClientRect();r+=s.left+e.clientLeft,i+=s.top+e.clientTop,o=e.ownerDocument}return{left:r,top:i,width:n.width,height:n.height,clipped:a}}let Qe=/^-?(m|p|mx|my|mt|mb|ml|mr|ms|me|px|py|pt|pb|pl|pr|ps|pe|w|h|min-w|max-w|min-h|max-h|size|gap|gap-x|gap-y|space-x|space-y|text|font|bg|border|border-[trblxy]|rounded|rounded-[trbl]{1,2}|shadow|flex|grid|grid-cols|grid-rows|col|col-span|row|row-span|items|justify|self|place|content|inset|inset-x|inset-y|top|left|right|bottom|start|end|z|opacity|leading|tracking|ring|ring-offset|outline|overflow|overflow-x|overflow-y|order|basis|grow|shrink|translate-x|translate-y|scale|rotate|skew|transition|duration|ease|delay|animate|cursor|select|fill|stroke|object|aspect|line-clamp|decoration|indent|align|whitespace|break|hyphens|list|columns|backdrop|blur|brightness|contrast|drop-shadow|grayscale|invert|saturate|sepia|divide|divide-x|divide-y|from|to|via|accent|caret|scroll|snap|touch|will-change|pointer-events|underline-offset|auto-cols|auto-rows|origin|mix-blend|bg-blend|box|float|clear|appearance|resize|table|sr|not-sr)(-|$)/,$e=/* @__PURE__ */ new Set(/* @__PURE__ */ `flex.grid.block.inline.inline-block.inline-flex.inline-grid.hidden.contents.table.static.fixed.absolute.relative.sticky.visible.invisible.container.truncate.underline.uppercase.lowercase.capitalize.italic.antialiased.sr-only.grow.shrink.isolate.transform.filter.group.peer.prose.dark.light`.split(`.`)),et=[/_{1,3}(?=[a-zA-Z-]*[0-9])[a-zA-Z0-9-]{5,}$/,/_{1,3}(?=[a-zA-Z0-9-]*[A-Z][a-zA-Z0-9-]*[A-Z])(?=[a-zA-Z0-9-]*[a-z])[a-zA-Z0-9-]{5,8}$/,/^_[a-zA-Z0-9]/,/^(css|sc|jsx|svelte|astro|emotion|e|tw|vanilla|chakra-[a-z]+-)[-_][a-zA-Z0-9]{4,}$/,/^[a-z]{1,3}-(?=[a-zA-Z]*[0-9])[a-zA-Z0-9]{5,}$/,/^(is|has)-(active|open|selected|focused|hover|hovered|visible|hidden|expanded|collapsed|loading|disabled|checked|current)$/,/^(active|open|selected|focus|focused|hover|current|show|showing|in|fade|collapse|collapsing)$/];function tt(e){if(e.length<5)return!1;let t=e.replace(/[^0-9]/g,``).length;return t===0?/^[a-zA-Z]{6,}$/.test(e)&&/[A-Z].*[A-Z]/.test(e)&&/[a-z]/.test(e)&&!/^[A-Z][a-z]+([A-Z][a-z]+)+$/.test(e):e.replace(/[^a-zA-Z]/g,``).length===0||!/^[a-zA-Z]+[-_]?\d{1,3}$/.test(e)&&t/e.length>.2}function nt(e){return/[[\]:/()%!#@&*,.>+~=]/.test(e)||$e.has(e)?!0:Qe.test(e)}function rt(e){return!e||e.length>40||e.startsWith(`nuni-`)||nt(e)||et.some(t=>t.test(e))?!1:!tt(e)}function O(e){let t=[];for(let n of Array.from(e.classList))if(rt(n)&&t.push(n),t.length>=4)break;return t}let it=[/^:[a-zA-Z0-9]+:$/,/^«[a-zA-Z0-9]+»$/,/^(radix|headlessui|mui|react-aria|rc|base-ui|mantine|chakra|reach|downshift|ember|ext|yui|ui-id|aria|mat|cdk|ng|v|vue|svelte|el|id|uid|field|input)[-_:]/i,/[0-9a-f]{8}-[0-9a-f]{4}-/i,/\d{3,}/];function at(e){return!e||e.length>80||it.some(t=>t.test(e))?!1:!tt(e)}let ot=[`data-nuni`,`data-testid`,`data-test-id`,`data-test`,`data-cy`,`data-qa`],st=[`aria-label`,`name`,`href`,`src`,`alt`,`placeholder`,`title`,`type`,`role`,`for`,`value`];function k(e){return typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape(e):e.replace(/([^\w-])/g,`\\$1`).replace(/^(\d)/,`\\3$1 `)}function ct(e,t){return`[${e}="${t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"]`}function lt(e,t){for(let n of ot){if(!Oe(n,t))continue;let r=e.getAttribute(n);if(r&&r.length<=100)return{attr:n,value:r}}return null}function ut(e){let t=e.getAttribute(`id`);return t&&at(t)?t:null}function dt(e){return e.tagName.toLowerCase()}function ft(e){let t=1,n=e.previousElementSibling;for(;n;)n.tagName===e.tagName&&t++,n=n.previousElementSibling;return t}function pt(e){let t=e.parentNode;if(!t)return 1;let n=0;for(let r of Array.from(t.children))r.tagName===e.tagName&&n++;return n}function mt(e,t){try{return e.querySelectorAll(t).length}catch{return 1/0}}function ht(e,t){return mt(e,`#${k(t)}`)===1}function gt(e){let t=qe(e),n=e.ownerDocument,r=[],i=e;for(;i&&i!==n.documentElement;){let n=ut(i);if(n&&i!==e&&ht(t,n))return r.unshift(`#${k(n)}`),r.join(` > `);let a=dt(i);r.unshift(pt(i)>1?`${a}:nth-of-type(${ft(i)})`:a),i=i.parentElement}return E(t)?r.join(` > `):r.length?`html > ${r.join(` > `)}`:`html`}function _t(e,t){let n;try{n=Array.from(e.querySelectorAll(t)).slice(0,50)}catch{return null}if(!E(e)||t.startsWith(`#`))return n[0]??null;let r=t.split(` > `).length;return n.find(t=>{let n=t;for(let e=1;e<r&&n;e++)n=n.parentElement;return n?.parentNode===e})??null}function vt(e,t){let n=dt(e),r=lt(e,t);if(r)return n+ct(r.attr,r.value);let i=n;for(let t of O(e).slice(0,2))i+=`.${k(t)}`;for(let r of[`name`,`type`,`role`]){let a=e.getAttribute(r);if(a&&a.length<=40&&Oe(r,t)){if(r===`type`&&n!==`input`&&n!==`button`)continue;i+=ct(r,a)}}let a=e.getAttribute(`aria-label`);return a&&a.length<=60&&!e.closest(x)&&(i+=ct(`aria-label`,a)),i}function yt(e,t={}){let n=e.ownerDocument,r=qe(e),i=ut(e);if(i&&ht(r,i))return`#${k(i)}`;let a=[],o=e;for(let e=0;o&&e<6;e++){if(o===n.documentElement||o===n.body){a.unshift(dt(o));break}let i=ut(o);if(e>0&&i&&ht(r,i)){a.unshift(`#${k(i)}`);let e=a.join(` > `);if(mt(r,e)===1)return e;break}a.unshift(vt(o,t));let s=a.join(` > `);if(mt(r,s)===1)return s;let c=o.parentElement;if(c&&mt(c,`:scope > ${a[0]}`)>1&&(a[0]=`${a[0]}:nth-of-type(${ft(o)})`,s=a.join(` > `),mt(r,s)===1))return s;o=o.parentElement}let s=a.join(` > `);return mt(r,s)===1?s:void 0}function bt(e,t){let n={};if(e.closest(x))return n;for(let r of st){if(!Oe(r,t)||r===`value`&&e.tagName!==`BUTTON`&&e.getAttribute(`type`)!==`submit`)continue;let i=e.getAttribute(r);i&&(n[r]=i.slice(0,200))}return n}function xt(e){let t=[],n=e.parentElement;for(;n&&t.length<5&&n!==n.ownerDocument.documentElement;){let e=ut(n),r={tag:n.tagName.toLowerCase(),classes:O(n).slice(0,3)};if(e&&(r.id=e),t.length<3&&n!==n.ownerDocument.body){let e=w(n,80);e&&(r.text=e)}t.push(r),n=n.parentElement}return t}function St(e,t,n={}){let r=Ct(e,t,n),i=Ze(e,n.document??(typeof document>`u`?e.ownerDocument:document));return i.length&&(r.scope=i.map(({kind:e,host:t})=>({kind:e,host:Ct(t,void 0,n)}))),r}function Ct(e,t,n){let r=e.ownerDocument,i=Ce(e),a=we(r),o=e.getBoundingClientRect(),s=t?{x:Ee(o.width?(t.x-o.left)/o.width:.5),y:Ee(o.height?(t.y-o.top)/o.height:.5)}:{x:.5,y:.5},c=ut(e),l=lt(e,n),u=yt(e,n),d=e.getAttribute(`role`)??void 0,f=e.parentNode,p=f?Array.from(f.children):[e],m={v:1,selectors:{path:gt(e),...c?{id:c}:{},...l?{testId:`${l.attr}=${l.value}`}:{},...u?{css:u}:{}},tag:e.tagName.toLowerCase(),classes:O(e),text:w(e,b.anchorTextMaxLength),attrs:bt(e,n),ancestors:xt(e),siblingIndex:p.indexOf(e),siblingCount:p.length,rect:i,offset:s,viewport:a,docSize:Te(r)};d&&(m.role=d);let h=Se(e);return h&&(m.componentName=h),m}function wt(e,t={}){let n=Be(e);if(!n)return null;let r=Ve(e,n);if(!r)return null;let i=e.getClientRects()[0]??e.getBoundingClientRect(),a=St(n,{x:i.left,y:i.top+i.height/2},t);return a.quote=r,{element:n,anchor:a}}function Tt(e,t,n=()=>!1){let r=t.left+t.width,i=t.top+t.height,a=[[t.left+1,t.top+1],[r-1,t.top+1],[t.left+1,i-1],[r-1,i-1]],o=e=>n(e)||e.closest(`[data-nuni]`)!==null,s=null;for(let[t,n]of a){let r=e.elementsFromPoint(t,n).find(e=>!o(e));r&&(s=s?Et(s,r):r)}let c=s??e.body;for(;c.parentElement&&c!==e.body;){let e=c.getBoundingClientRect();if(e.left<=t.left+1&&e.top<=t.top+1&&e.right>=r-1&&e.bottom>=i-1)break;c=c.parentElement}return c}function Et(e,t){let n=/* @__PURE__ */ new Set;for(let t=e;t;t=t.parentElement)n.add(t);for(let e=t;e;e=e.parentElement)if(n.has(e))return e;return e.ownerDocument.body}function Dt(e,t,n={}){let r=St(e,{x:t.left+t.width,y:t.top},n),i=e.getBoundingClientRect(),a=i.width?Ee((t.left-i.left)/i.width):0,o=i.height?Ee((t.top-i.top)/i.height):0;return r.region={x:a,y:o,w:i.width?Math.min(1-a,t.width/i.width):1,h:i.height?Math.min(1-o,t.height/i.height):1},r}function Ot(){return{byTag:/* @__PURE__ */ new Map,elements:/* @__PURE__ */ new Map,text:/* @__PURE__ */ new WeakMap,content:/* @__PURE__ */ new WeakMap,words:/* @__PURE__ */ new WeakMap}}function kt(e,t,n){if(!n)return w(e,t);let r=n.text.get(e);r||n.text.set(e,r=/* @__PURE__ */ new Map);let i=r.get(t);return i===void 0&&r.set(t,i=w(e,t)),i}function At(e,t){if(!t)return e.textContent??``;let n=t.content.get(e);return n===void 0&&t.content.set(e,n=e.textContent??``),n}function jt(e,t){let n=t?.words.get(e);return n===void 0&&(n=Ae(At(e,t)),t?.words.set(e,n)),n}function Mt(e,t,n){let r=()=>E(e)?e.querySelectorAll(t):e.getElementsByTagName(t);if(!n)return r();let i=n.byTag.get(e);i||n.byTag.set(e,i=/* @__PURE__ */ new Map);let a=i.get(t);return a||i.set(t,a=Array.from(r())),a}function Nt(e,t,n){let r=n?.elements.get(e);if(r)return r;let i=Je(e),a=E(e)?e:i.body??i.documentElement,o=i.createTreeWalker(a,1),s=[];for(let e=o.nextNode();e&&s.length<t;e=o.nextNode())s.push(e);return n?.elements.set(e,s),s}let Pt={exact:.9,high:.72,low:.55},Ft=3e3;function It(e,t,n=20){if(!t)return[];try{return Array.from(e.querySelectorAll(t)).slice(0,n)}catch{return[]}}function Lt(e,t){if(!t)return!1;try{return e.matches(t)}catch{return!1}}function Rt(e,t){if(!e.length&&!t.length)return 1;let n=new Set(e),r=0;for(let e of new Set(t))n.has(e)&&r++;return r/(n.size+new Set(t).size-r)}function zt(e){let t=e.indexOf(`=`);return t>0?[e.slice(0,t),e.slice(t+1)]:null}function Bt(e,t){return`[${e}="${t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"]`}function Vt(e,t){try{let n=new URL(e,t.baseURI);return n.pathname.replace(/\/$/,``)+n.search}catch{return e}}function Ht(e){let t=e.parentElement;if(!t)return 0;let n=O(e).join(` `),r=0;for(let i of Array.from(t.children))i!==e&&i.tagName===e.tagName&&O(i).join(` `)===n&&r++;return r}let Ut=/* @__PURE__ */ new Set([`href`,`name`,`aria-label`,`src`,`for`,`placeholder`,`alt`,`title`]);function Wt(e,t,n,r,i,a){let o=0,s=0,c=(e,t)=>{o+=e*t,s+=e};c(1,+(t.tagName.toLowerCase()===e.tag));let l=!1;if(e.selectors.id){let n=t.getAttribute(`id`)===e.selectors.id;l||(l=n),c(3,+!!n)}if(e.selectors.testId){let n=zt(e.selectors.testId),r=!!(n&&t.getAttribute(n[0])===n[1]);l||(l=r),c(4,+!!r)}let u=Lt(t,e.selectors.css);e.selectors.css&&c(1.5,+!!u);let d=r.pathMatch===t;c(1,+!!d),e.classes&&e.classes.length&&c(1.5,Rt(O(t),e.classes));let f=Object.keys(e.attrs).filter(e=>Oe(e,i)),p=!1;if(f.length){let r=0,i=0,a=0;for(let o of f){let s=Ut.has(o);s&&i++;let c=t.getAttribute(o);if(c==null)continue;let l=e.attrs[o];(o===`href`||o===`src`?Vt(c,n)===Vt(l,n):c===l)?(r++,s&&a++):r+=T(c,l)*.5}c(2,r/f.length),p=i>0&&a===i}e.role&&c(.5,+(t.getAttribute(`role`)===e.role)),e.componentName&&c(.5,+(Se(t)===e.componentName));let m=kt(t,120,a),h=e.text?T(m,e.text):m?.3:1;c(e.text?3:1,h);let g=e.quote?jt(t,a).includes(e.quote.exact):null;g!==null&&c(3,+!!g);let _=0,v=0,y=null,b=t.parentElement;e.ancestors.forEach((t,n)=>{let r=1-n*.15;if(v+=r,!b)return;let i=b.tagName.toLowerCase()===t.tag?.4:0,o=b.getAttribute(`id`);t.id?i+=o===t.id?.35:0:i+=.35*(o?.5:1),i+=.25*Rt(O(b),t.classes),_+=r*i,y===null&&t.text&&t.text!==e.text&&(y=T(kt(b,80,a),t.text)),b=b.parentElement}),v&&c(1.5,_/v),y!==null&&c(2,y);let ee=t.parentNode,te=ee?Array.prototype.indexOf.call(ee.children,t):0;c(.5,Math.max(0,1-Math.abs(te-e.siblingIndex)/3));let x=Math.max(0,1-Math.abs(r.viewportRatio-1)*2),S=t.getBoundingClientRect(),ne=S.width+S.height>0;if(x>0&&e.rect.w+e.rect.h>0&&ne){let t=n.defaultView,i=S.left+(t?.scrollX??0)+S.width/2,a=S.top+(t?.scrollY??0)+S.height/2,o=(e.rect.x+e.rect.w/2)*r.viewportRatio,s=e.rect.y+e.rect.h/2,l=Math.hypot(i-o,a-s);c(1.5*x,Math.exp(-l/250));let u=Math.min(S.width,e.rect.w)/Math.max(S.width,e.rect.w,1),d=Math.min(S.height,e.rect.h)/Math.max(S.height,e.rect.h,1);c(.5*x,u*d)}let re=s?o/s:0,ie=(u||!e.selectors.css)&&d&&p,ae=r.quoteOnly===t?Math.max(h,.9):h;if(e.text.length>=2&&ae<.999){let e=Ht(t)>0?.2+.8*ae*ae:.7+.3*ae;re*=l||ie?Math.max(e,.92):e}return g===!1&&(re*=.85),{el:t,score:re,text:h,context:y,strong:l||ie,rendered:ne}}function Gt(e,t,n,r){let i=Je(t),a=/* @__PURE__ */ new Set,o=e=>e===i.documentElement||(n.isIgnored?.(e)??!1),s=e=>{e&&!o(e)&&a.add(e)};if(e.selectors.id&&s(E(t)?It(t,`#${k(e.selectors.id)}`,1)[0]:t.getElementById(e.selectors.id)),e.selectors.testId){let n=zt(e.selectors.testId);n&&It(t,Bt(n[0],n[1])).forEach(s)}It(t,e.selectors.css).forEach(s);let c=_t(t,e.selectors.path);s(c);let l=e.text.slice(0,24).toLowerCase(),u=Mt(t,e.tag,r),d=u.length<=Ft;for(let e=0;e<u.length&&e<Ft*2;e++){let t=u[e];if(d){s(t);continue}let n=At(t,r).toLowerCase();l&&n.includes(l)&&s(t)}if(e.text.length>=3){let n=e.text.toLowerCase();for(let i of Nt(t,Ft*3,r)){if(i.tagName.toLowerCase()===e.tag)continue;let t=At(i,r);!t||t.length>n.length*3+20||kt(i,120,r).toLowerCase()===n&&s(i)}}return{candidates:a,pathMatch:c}}let A={lost:0,low:1,high:2,exact:3};function Kt(e,t=document,n={},r){let i=t,a=`exact`,o={element:null,confidence:`lost`,score:0};for(let t of e.scope??[]){let e=qt(t.host,i,n,r);if(!e.element)return o;let s=e.confidence;if(t.host.text){if(e.text<.9&&A[s]<A.high)return o;e.text>=.999&&e.margin>=.1&&s===`low`&&(s=`high`)}let c=t.kind===`shadow`?e.element.shadowRoot:Xe(e.element);if(!c)return o;A[s]<A[a]&&(a=s),i=c}let{text:s,margin:c,...l}=qt(e,i,n,r);if(l.element&&A[a]<A[l.confidence]&&(l.confidence=a),l.element&&e.quote){let t=He(l.element,e.quote);t&&(l.range=t.range),(!t||!t.exact)&&A[l.confidence]>A.low&&(l.confidence=`low`)}return l}function qt(e,t,n,r){let i=Je(t);if(!E(t)&&(e.tag===`body`||e.tag===`html`))return{element:i.body,confidence:`exact`,score:1,text:1,margin:1};let{candidates:a,pathMatch:o}=Gt(e,t,n,r);if(!a.size)return{element:null,confidence:`lost`,score:0,text:0,margin:0};let s=i.defaultView,c=e.viewport.w&&s?.innerWidth?s.innerWidth/e.viewport.w:1,l=null;if(e.quote){let t=e.quote.exact,n=[...a].filter(e=>jt(e,r).includes(t)),i=n.filter(e=>!n.some(t=>t!==e&&e.contains(t)));i.length===1&&(l=i[0])}let u=[];for(let t of a)u.push(Wt(e,t,i,{pathMatch:o,viewportRatio:c,quoteOnly:l},n,r));let d=e.rect.w+e.rect.h>0&&u.some(e=>e.rendered),f=e=>!d||e.rendered;if(u.filter(t=>t.text>=.999&&t.el.tagName.toLowerCase()===e.tag&&f(t)).length>1)for(let e of u)e.context===null||e.strong||(e.score*=.2+.8*e.context*e.context);u.sort((e,t)=>t.score-e.score);let p=u[0],m=u.find(e=>e.el!==p.el&&!p.el.contains(e.el)&&!e.el.contains(p.el)&&(!p.rendered||f(e)));if(p.score<Pt.low)return{element:null,confidence:`lost`,score:p.score,text:p.text,margin:0};let h=p.score>=Pt.exact&&p.text>=.999?`exact`:p.score>=Pt.high?`high`:`low`,g=m?p.score-m.score:1;return g<.03&&(h=`low`),{element:p.el,confidence:h,score:p.score,text:p.text,margin:g}}let Jt=/* @__PURE__ */ new Set([`SPAN`,`STRONG`,`EM`,`B`,`I`,`SMALL`,`MARK`,`SUB`,`SUP`,`ABBR`,`CODE`,`KBD`,`TIME`,`U`,`S`]);function Yt(e){let t=e,n=t.closest(`svg`);n&&(t=n.parentElement??n);let r=t.closest(`a[href], button, label, summary, select, textarea, input, [role=button], [role=link], [role=tab], [role=menuitem], [role=checkbox], [role=switch], [role=option]`);if(r)return r;for(;Jt.has(t.tagName)&&t.parentElement&&t.parentElement!==t.ownerDocument.body&&!t.id;)t=t.parentElement;return t}for(var j=[],M=[],Xt=Uint8Array,Zt=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`,Qt=0,$t=Zt.length;Qt<$t;++Qt)j[Qt]=Zt[Qt],M[Zt.charCodeAt(Qt)]=Qt;M[45]=62,M[95]=63;function en(e){var t=e.length;if(t%4>0)throw Error(`Invalid string. Length must be a multiple of 4`);var n=e.indexOf(`=`);n===-1&&(n=t);var r=n===t?0:4-n%4;return[n,r]}function tn(e,t,n){return(t+n)*3/4-n}function nn(e){for(var t,n=en(e),r=n[0],i=n[1],a=new Xt(tn(e,r,i)),o=0,s=i>0?r-4:r,c=0;c<s;c+=4)t=M[e.charCodeAt(c)]<<18|M[e.charCodeAt(c+1)]<<12|M[e.charCodeAt(c+2)]<<6|M[e.charCodeAt(c+3)],a[o++]=t>>16&255,a[o++]=t>>8&255,a[o++]=t&255;return i===2&&(t=M[e.charCodeAt(c)]<<2|M[e.charCodeAt(c+1)]>>4,a[o++]=t&255),i===1&&(t=M[e.charCodeAt(c)]<<10|M[e.charCodeAt(c+1)]<<4|M[e.charCodeAt(c+2)]>>2,a[o++]=t>>8&255,a[o++]=t&255),a}function rn(e){return j[e>>18&63]+j[e>>12&63]+j[e>>6&63]+j[e&63]}function an(e,t,n){for(var r,i=[],a=t;a<n;a+=3)r=(e[a]<<16&16711680)+(e[a+1]<<8&65280)+(e[a+2]&255),i.push(rn(r));return i.join(``)}function on(e){for(var t,n=e.length,r=n%3,i=[],a=16383,o=0,s=n-r;o<s;o+=a)i.push(an(e,o,o+a>s?s:o+a));return r===1?(t=e[n-1],i.push(j[t>>2]+j[t<<4&63]+`==`)):r===2&&(t=(e[n-2]<<8)+e[n-1],i.push(j[t>>10]+j[t>>4&63]+j[t<<2&63]+`=`)),i.join(``)}function N(e){if(e===void 0)return{};if(!cn(e))throw Error(`The arguments to a Convex function must be an object. Received: ${e}`);return e}function sn(e){if(e===void 0)throw Error(`Client created with undefined deployment address. If you used an environment variable, check that it's set.`);if(typeof e!=`string`)throw Error(`Invalid deployment address: found ${e}".`);if(!(e.startsWith(`http:`)||e.startsWith(`https:`)))throw Error(`Invalid deployment address: Must start with "https://" or "http://". Found "${e}".`);try{new URL(e)}catch{throw Error(`Invalid deployment address: "${e}" is not a valid URL. If you believe this URL is correct, use the \`skipConvexDeploymentUrlCheck\` option to bypass this.`)}if(e.endsWith(`.convex.site`))throw Error(`Invalid deployment address: "${e}" ends with .convex.site, which is used for HTTP Actions. Convex deployment URLs typically end with .convex.cloud? If you believe this URL is correct, use the \`skipConvexDeploymentUrlCheck\` option to bypass this.`)}function cn(e){let t=typeof e==`object`,n=Object.getPrototypeOf(e),r=n===null||n===Object.prototype||n?.constructor?.name===`Object`;return t&&r}let ln=BigInt(`-9223372036854775808`),un=BigInt(`9223372036854775807`),dn=BigInt(`0`),fn=BigInt(`8`),pn=BigInt(`256`),mn=`This commit timestamp is unresolved: its value is assigned when the mutation commits. Read the document after the mutation completes to get its value.`;var hn=class{[Symbol.toPrimitive](e){if(e===`string`)return this.toString();throw Error(mn)}valueOf(){throw Error(mn)}toJSON(){throw Error(mn)}toString(){return`[unresolved commit timestamp]`}};let gn=new hn;function _n(e){return Number.isNaN(e)||!Number.isFinite(e)||Object.is(e,-0)}function vn(e){e<dn&&(e-=ln+ln);let t=e.toString(16);t.length%2==1&&(t=`0`+t);let n=new Uint8Array(/* @__PURE__ */ new ArrayBuffer(8)),r=0;for(let i of t.match(/.{2}/g).reverse())n.set([parseInt(i,16)],r++),e>>=fn;return on(n)}function yn(e){let t=nn(e);if(t.byteLength!==8)throw Error(`Received ${t.byteLength} bytes, expected 8 for $integer`);let n=dn,r=dn;for(let e of t)n+=BigInt(e)*pn**r,r++;return n>un&&(n+=ln+ln),n}function bn(e){if(e<ln||un<e)throw Error(`BigInt ${e} does not fit into a 64-bit signed integer.`);let t=/* @__PURE__ */ new ArrayBuffer(8);return new DataView(t).setBigInt64(0,e,!0),on(new Uint8Array(t))}function xn(e){let t=nn(e);if(t.byteLength!==8)throw Error(`Received ${t.byteLength} bytes, expected 8 for $integer`);return new DataView(t.buffer).getBigInt64(0,!0)}let Sn=DataView.prototype.setBigInt64?bn:vn,Cn=DataView.prototype.getBigInt64?xn:yn,wn=1024;function Tn(e){if(e.length>wn)throw Error(`Field name ${e} exceeds maximum field name length ${wn}.`);if(e.startsWith(`$`))throw Error(`Field name ${e} starts with a '$', which is reserved.`);for(let t=0;t<e.length;t+=1){let n=e.charCodeAt(t);if(n<32||n>=127)throw Error(`Field name ${e} has invalid character '${e[t]}': Field names can only contain non-control ASCII characters`)}}function En(e){if(e===null||typeof e==`boolean`||typeof e==`number`||typeof e==`string`)return e;if(Array.isArray(e))return e.map(e=>En(e));if(typeof e!=`object`)throw Error(`Unexpected type of ${e}`);let t=Object.entries(e);if(t.length===1){let n=t[0][0];if(n===`$bytes`){if(typeof e.$bytes!=`string`)throw Error(`Malformed $bytes field on ${e}`);return nn(e.$bytes).buffer}if(n===`$integer`){if(typeof e.$integer!=`string`)throw Error(`Malformed $integer field on ${e}`);return Cn(e.$integer)}if(n===`$float`){if(typeof e.$float!=`string`)throw Error(`Malformed $float field on ${e}`);let t=nn(e.$float);if(t.byteLength!==8)throw Error(`Received ${t.byteLength} bytes, expected 8 for $float`);let n=new DataView(t.buffer).getFloat64(0,!0);if(!_n(n))throw Error(`Float ${n} should be encoded as a number`);return n}if(n===`$commitTs`){if(e.$commitTs!==null)throw Error(`Malformed $commitTs field on ${e}`);return gn}if(n===`$set`)throw Error(`Received a Set which is no longer supported as a Convex type.`);if(n===`$map`)throw Error(`Received a Map which is no longer supported as a Convex type.`)}let n={};for(let[t,r]of Object.entries(e))Tn(t),n[t]=En(r);return n}function P(e){let t=JSON.stringify(e,(e,t)=>t===void 0?`undefined`:typeof t==`bigint`?`${t.toString()}n`:t);if(t.length>16384){let e=16370,n=t.codePointAt(e-1);return n!==void 0&&n>65535&&--e,t.substring(0,e)+`[...truncated]`}return t}function Dn(e,t,n,r){if(e===void 0){let e=n&&` (present at path ${n} in original object ${P(t)})`;throw Error(`undefined is not a valid Convex value${e}. To learn about Convex's supported types, see https://docs.convex.dev/using/types.`)}if(e===null)return e;if(typeof e==`bigint`){if(e<ln||un<e)throw Error(`BigInt ${e} does not fit into a 64-bit signed integer.`);return{$integer:Sn(e)}}if(typeof e==`number`){if(_n(e)){let t=/* @__PURE__ */ new ArrayBuffer(8);return new DataView(t).setFloat64(0,e,!0),{$float:on(new Uint8Array(t))}}return e}if(typeof e==`boolean`||typeof e==`string`)return e;if(e instanceof ArrayBuffer)return{$bytes:on(new Uint8Array(e))};if(e instanceof hn)return{$commitTs:null};if(Array.isArray(e))return e.map((e,r)=>Dn(e,t,n+`[${r}]`,!1));if(e instanceof Set)throw Error(On(n,`Set`,[...e],t));if(e instanceof Map)throw Error(On(n,`Map`,[...e],t));if(!cn(e)){let r=e?.constructor?.name,i=r?`${r} `:``;throw Error(On(n,i,e,t))}let i={},a=Object.entries(e);a.sort(([e,t],[n,r])=>e===n?0:e<n?-1:1);for(let[e,o]of a)o===void 0?r&&(Tn(e),i[e]=kn(o,t,n+`.${e}`)):(Tn(e),i[e]=Dn(o,t,n+`.${e}`,!1));return i}function On(e,t,n,r){return e?`${t}${P(n)} is not a supported Convex type (present at path ${e} in original object ${P(r)}). To learn about Convex's supported types, see https://docs.convex.dev/using/types.`:`${t}${P(n)} is not a supported Convex type.`}function kn(e,t,n){if(e===void 0)return{$undefined:null};if(t===void 0)throw Error(`Programming error. Current value is ${P(e)} but original value is undefined`);return Dn(e,t,n,!1)}function F(e){return Dn(e,e,``,!1)}var An=Object.defineProperty,jn=(e,t,n)=>t in e?An(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Mn=(e,t,n)=>jn(e,typeof t==`symbol`?t:t+``,n),Nn,Pn;let Fn=Symbol.for(`ConvexError`);var In=class extends (Pn=Error,Nn=Fn,Pn){constructor(e){super(typeof e==`string`?e:P(e)),Mn(this,`name`,`ConvexError`),Mn(this,`data`),Mn(this,Nn,!0),this.data=e}};let Ln=`1.46.0`,Rn=Symbol.for(`functionName`),zn=Symbol.for(`toReferencePath`);function Bn(e){return e[zn]??null}function Vn(e){return e.startsWith(`function://`)}function Hn(e){let t;if(typeof e==`string`)t=Vn(e)?{functionHandle:e}:{name:e};else if(e[Rn])t={name:e[Rn]};else{let n=Bn(e);if(!n)throw Error(`${e} is not a functionReference`);t={reference:n}}return t}function I(e){let t=Hn(e);if(t.name===void 0)throw t.functionHandle===void 0?t.reference===void 0?Error(`Expected function reference like "api.file.func" or "internal.file.func", but received ${JSON.stringify(t)}`):Error(`Expected function reference in the current component like "api.file.func" or "internal.file.func", but received reference ${t.reference}`):Error(`Expected function reference like "api.file.func" or "internal.file.func", but received function handle ${t.functionHandle}`);if(typeof e==`string`)return e;let n=e[Rn];if(!n)throw Error(`${e} is not a functionReference`);return n}function Un(e=[]){return new Proxy({},{get(t,n){if(typeof n==`string`)return Un([...e,n]);if(n===Rn){if(e.length<2){let t=[`api`,...e].join(`.`);throw Error(`API path is expected to be of the form \`api.moduleName.functionName\`. Found: \`${t}\``)}let t=e.slice(0,-1).join(`/`),n=e[e.length-1];return n==="default"?t:t+`:`+n}if(n===Symbol.toStringTag)return`FunctionReference`}})}let Wn=Un();function Gn(e,t){return new Proxy({},{get(n,r){if(typeof r==`string`)return Gn(e,[...t,r]);if(r===zn){if(t.length<1){let n=[e,...t].join(`.`);throw Error(`API path is expected to be of the form \`${e}.childComponent.functionName\`. Found: \`${n}\``)}return`_reference/childComponent/`+t.join(`/`)}}})}let Kn=()=>Gn(`components`,[]),L=Wn;Kn();var qn=Object.defineProperty,Jn=(e,t,n)=>t in e?qn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Yn=(e,t,n)=>Jn(e,typeof t==`symbol`?t:t+``,n);function Xn(e){switch(e){case`query`:return`Q`;case`mutation`:return`M`;case`action`:return`A`;case`any`:return`?`}}var Zn=class{constructor(e){Yn(this,`_onLogLineFuncs`),Yn(this,`_verbose`),this._onLogLineFuncs={},this._verbose=e.verbose}addLogLineListener(e){let t=Math.random().toString(36).substring(2,15);for(let e=0;e<10&&this._onLogLineFuncs[t]!==void 0;e++)t=Math.random().toString(36).substring(2,15);return this._onLogLineFuncs[t]=e,()=>{delete this._onLogLineFuncs[t]}}logVerbose(...e){if(this._verbose)for(let t of Object.values(this._onLogLineFuncs))t(`debug`,`${(/* @__PURE__ */ new Date()).toISOString()}`,...e)}log(...e){for(let t of Object.values(this._onLogLineFuncs))t(`info`,...e)}warn(...e){for(let t of Object.values(this._onLogLineFuncs))t(`warn`,...e)}error(...e){for(let t of Object.values(this._onLogLineFuncs))t(`error`,...e)}};function Qn(e){let t=new Zn(e);return t.addLogLineListener((e,...t)=>{switch(e){case`debug`:console.debug(...t);break;case`info`:console.log(...t);break;case`warn`:console.warn(...t);break;case`error`:console.error(...t);break;default:console.log(...t)}}),t}function $n(e){return new Zn(e)}function er(e,t,n,r,i){let a=Xn(n);if(typeof i==`object`&&(i=`ConvexError ${JSON.stringify(i.errorData,null,2)}`),t===`info`){let t=i.match(/^\[.*?\] /);if(t===null){e.error(`[CONVEX ${a}(${r})] Could not parse console.log`);return}let n=i.slice(1,t[0].length-2),o=i.slice(t[0].length);e.log(`%c[CONVEX ${a}(${r})] [${n}]`,`color:rgb(0, 145, 255)`,o)}else e.error(`[CONVEX ${a}(${r})] ${i}`)}function tr(e,t){let n=`[CONVEX FATAL ERROR] ${t}`;return e.error(n),Error(n)}function nr(e,t,n){return`[CONVEX ${Xn(e)}(${t})] ${n.errorMessage}
9
- Called by client`}function rr(e,t){return t.data=e.errorData,t}function R(e){let t=e.split(`:`),n,r;return t.length===1?(n=t[0],r=`default`):(n=t.slice(0,t.length-1).join(`:`),r=t[t.length-1]),n.endsWith(`.js`)&&(n=n.slice(0,-3)),`${n}:${r}`}function z(e,t){return JSON.stringify({udfPath:R(e),args:F(t)})}function ir(e,t,n){let{initialNumItems:r,id:i}=n;return JSON.stringify({type:`paginated`,udfPath:R(e),args:F(t),options:F({initialNumItems:r,id:i})})}function ar(e){return JSON.parse(e).type===`paginated`}var or=Object.defineProperty,sr=(e,t,n)=>t in e?or(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,B=(e,t,n)=>sr(e,typeof t==`symbol`?t:t+``,n),cr=class{constructor(){B(this,`nextQueryId`),B(this,`querySetVersion`),B(this,`querySet`),B(this,`queryIdToToken`),B(this,`identityVersion`),B(this,`auth`),B(this,`outstandingQueriesOlderThanRestart`),B(this,`outstandingAuthOlderThanRestart`),B(this,`paused`),B(this,`pendingQuerySetModifications`),this.nextQueryId=0,this.querySetVersion=0,this.identityVersion=0,this.querySet=/* @__PURE__ */ new Map,this.queryIdToToken=/* @__PURE__ */ new Map,this.outstandingQueriesOlderThanRestart=/* @__PURE__ */ new Set,this.outstandingAuthOlderThanRestart=!1,this.paused=!1,this.pendingQuerySetModifications=/* @__PURE__ */ new Map}hasSyncedPastLastReconnect(){return this.outstandingQueriesOlderThanRestart.size===0&&!this.outstandingAuthOlderThanRestart}markAuthCompletion(){this.outstandingAuthOlderThanRestart=!1}subscribe(e,t,n,r){let i=R(e),a=z(i,t),o=this.querySet.get(a);if(o!==void 0)return o.numSubscribers+=1,{queryToken:a,modification:null,unsubscribe:()=>this.removeSubscriber(a)};{let e=this.nextQueryId++,o={id:e,canonicalizedUdfPath:i,args:t,numSubscribers:1,journal:n,componentPath:r};this.querySet.set(a,o),this.queryIdToToken.set(e,a);let s=this.querySetVersion,c=this.querySetVersion+1,l={type:`Add`,queryId:e,udfPath:i,args:[F(t)],journal:n,componentPath:r};return this.paused?this.pendingQuerySetModifications.set(e,l):this.querySetVersion=c,{queryToken:a,modification:{type:`ModifyQuerySet`,baseVersion:s,newVersion:c,modifications:[l]},unsubscribe:()=>this.removeSubscriber(a)}}}transition(e){for(let t of e.modifications)switch(t.type){case`QueryUpdated`:case`QueryFailed`:{this.outstandingQueriesOlderThanRestart.delete(t.queryId);let e=t.journal;if(e!==void 0){let n=this.queryIdToToken.get(t.queryId);n!==void 0&&(this.querySet.get(n).journal=e)}break}case`QueryRemoved`:this.outstandingQueriesOlderThanRestart.delete(t.queryId);break;default:throw Error(`Invalid modification ${t.type}`)}}queryId(e,t){let n=z(R(e),t),r=this.querySet.get(n);return r===void 0?null:r.id}isCurrentOrNewerAuthVersion(e){return e>=this.identityVersion}getAuth(){return this.auth}setAuth(e){this.auth={tokenType:`User`,value:e};let t=this.identityVersion;return this.paused||(this.identityVersion=t+1),{type:`Authenticate`,baseVersion:t,...this.auth}}setAdminAuth(e,t){let n={tokenType:`Admin`,value:e,impersonating:t};this.auth=n;let r=this.identityVersion;return this.paused||(this.identityVersion=r+1),{type:`Authenticate`,baseVersion:r,...n}}clearAuth(){this.auth=void 0,this.markAuthCompletion();let e=this.identityVersion;return this.paused||(this.identityVersion=e+1),{type:`Authenticate`,tokenType:`None`,baseVersion:e}}hasAuth(){return!!this.auth}isNewAuth(e){return this.auth?.value!==e}queryPath(e){let t=this.queryIdToToken.get(e);return t?this.querySet.get(t).canonicalizedUdfPath:null}queryArgs(e){let t=this.queryIdToToken.get(e);return t?this.querySet.get(t).args:null}queryToken(e){return this.queryIdToToken.get(e)??null}queryJournal(e){return this.querySet.get(e)?.journal}restart(){this.unpause(),this.outstandingQueriesOlderThanRestart.clear();let e=[];for(let t of this.querySet.values()){let n={type:`Add`,queryId:t.id,udfPath:t.canonicalizedUdfPath,args:[F(t.args)],journal:t.journal,componentPath:t.componentPath};e.push(n),this.outstandingQueriesOlderThanRestart.add(t.id)}this.querySetVersion=1;let t={type:`ModifyQuerySet`,baseVersion:0,newVersion:1,modifications:e};if(!this.auth)return this.identityVersion=0,[t,void 0];this.outstandingAuthOlderThanRestart=!0;let n={type:`Authenticate`,baseVersion:0,...this.auth};return this.identityVersion=1,[t,n]}pause(){this.paused=!0}resume(){let e=this.pendingQuerySetModifications.size>0?{type:`ModifyQuerySet`,baseVersion:this.querySetVersion,newVersion:++this.querySetVersion,modifications:Array.from(this.pendingQuerySetModifications.values())}:void 0,t=this.auth===void 0?void 0:{type:`Authenticate`,baseVersion:this.identityVersion++,...this.auth};return this.unpause(),[e,t]}unpause(){this.paused=!1,this.pendingQuerySetModifications.clear()}removeSubscriber(e){let t=this.querySet.get(e);if(t.numSubscribers>1)return--t.numSubscribers,null;{this.querySet.delete(e),this.queryIdToToken.delete(t.id),this.outstandingQueriesOlderThanRestart.delete(t.id);let n=this.querySetVersion,r=this.querySetVersion+1,i={type:`Remove`,queryId:t.id};return this.paused?this.pendingQuerySetModifications.has(t.id)?this.pendingQuerySetModifications.delete(t.id):this.pendingQuerySetModifications.set(t.id,i):this.querySetVersion=r,{type:`ModifyQuerySet`,baseVersion:n,newVersion:r,modifications:[i]}}}},lr=Object.defineProperty,ur=(e,t,n)=>t in e?lr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,dr=(e,t,n)=>ur(e,typeof t==`symbol`?t:t+``,n),fr=class{constructor(e,t){this.logger=e,this.markConnectionStateDirty=t,dr(this,`inflightRequests`),dr(this,`requestsOlderThanRestart`),dr(this,`inflightMutationsCount`,0),dr(this,`inflightActionsCount`,0),this.inflightRequests=/* @__PURE__ */ new Map,this.requestsOlderThanRestart=/* @__PURE__ */ new Set}request(e,t){let n=new Promise(n=>{let r=t?`Requested`:`NotSent`;this.inflightRequests.set(e.requestId,{message:e,status:{status:r,requestedAt:/* @__PURE__ */ new Date,onResult:n}}),e.type===`Mutation`?this.inflightMutationsCount++:e.type===`Action`&&this.inflightActionsCount++});return this.markConnectionStateDirty(),n}onResponse(e){let t=this.inflightRequests.get(e.requestId);if(t===void 0||t.status.status===`Completed`)return null;let n=t.message.type===`Mutation`?`mutation`:`action`,r=t.message.udfPath;for(let t of e.logLines)er(this.logger,`info`,n,r,t);let i=t.status,a,o;if(e.success)a={success:!0,logLines:e.logLines,value:En(e.result)},o=()=>i.onResult(a);else{let t=e.result,{errorData:s}=e;er(this.logger,`error`,n,r,t),a={success:!1,errorMessage:t,errorData:s===void 0?void 0:En(s),logLines:e.logLines},o=()=>i.onResult(a)}return e.type===`ActionResponse`||!e.success?(o(),this.inflightRequests.delete(e.requestId),this.requestsOlderThanRestart.delete(e.requestId),t.message.type===`Action`?this.inflightActionsCount--:t.message.type===`Mutation`&&this.inflightMutationsCount--,this.markConnectionStateDirty(),{requestId:e.requestId,result:a}):(t.status={status:`Completed`,result:a,ts:e.ts,onResolve:o},null)}removeCompleted(e){let t=/* @__PURE__ */ new Map;for(let[n,r]of this.inflightRequests.entries()){let i=r.status;i.status===`Completed`&&i.ts.lessThanOrEqual(e)&&(i.onResolve(),t.set(n,i.result),r.message.type===`Mutation`?this.inflightMutationsCount--:r.message.type===`Action`&&this.inflightActionsCount--,this.inflightRequests.delete(n),this.requestsOlderThanRestart.delete(n))}return t.size>0&&this.markConnectionStateDirty(),t}restart(){this.requestsOlderThanRestart=new Set(this.inflightRequests.keys());let e=[];for(let[t,n]of this.inflightRequests){if(n.status.status===`NotSent`){n.status.status=`Requested`,e.push(n.message);continue}if(n.message.type===`Mutation`)e.push(n.message);else if(n.message.type===`Action`){if(this.inflightRequests.delete(t),this.requestsOlderThanRestart.delete(t),this.inflightActionsCount--,n.status.status===`Completed`)throw Error(`Action should never be in 'Completed' state`);n.status.onResult({success:!1,errorMessage:`Connection lost while action was in flight`,logLines:[]})}}return this.markConnectionStateDirty(),e}resume(){let e=[];for(let[,t]of this.inflightRequests)if(t.status.status===`NotSent`){t.status.status=`Requested`,e.push(t.message);continue}return e}hasIncompleteRequests(){for(let e of this.inflightRequests.values())if(e.status.status===`Requested`)return!0;return!1}hasInflightRequests(){return this.inflightRequests.size>0}hasSyncedPastLastReconnect(){return this.requestsOlderThanRestart.size===0}timeOfOldestInflightRequest(){if(this.inflightRequests.size===0)return null;let e=Date.now();for(let t of this.inflightRequests.values())t.status.status!==`Completed`&&t.status.requestedAt.getTime()<e&&(e=t.status.requestedAt.getTime());return new Date(e)}inflightMutations(){return this.inflightMutationsCount}inflightActions(){return this.inflightActionsCount}},pr=Object.defineProperty,mr=(e,t,n)=>t in e?pr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,hr=(e,t,n)=>mr(e,typeof t==`symbol`?t:t+``,n),gr=class e{constructor(e){hr(this,`queryResults`),hr(this,`modifiedQueries`),this.queryResults=e,this.modifiedQueries=[]}getQuery(t,...n){let r=N(n[0]),i=I(t),a=this.queryResults.get(z(i,r));if(a!==void 0)return e.queryValue(a.result)}getAllQueries(t){let n=[],r=I(t);for(let t of this.queryResults.values())t.udfPath===R(r)&&n.push({args:t.args,value:e.queryValue(t.result)});return n}setQuery(e,t,n){let r=N(t),i=I(e),a=z(i,r),o;o=n===void 0?void 0:{success:!0,value:n,logLines:[]};let s={udfPath:i,args:r,result:o};this.queryResults.set(a,s),this.modifiedQueries.push(a)}static queryValue(e){if(e!==void 0&&e.success)return e.value}},_r=class{constructor(){hr(this,`queryResults`),hr(this,`optimisticUpdates`),this.queryResults=/* @__PURE__ */ new Map,this.optimisticUpdates=[]}ingestQueryResultsFromServer(e,t){this.optimisticUpdates=this.optimisticUpdates.filter(e=>!t.has(e.mutationId));let n=this.queryResults;this.queryResults=new Map(e);let r=new gr(this.queryResults);for(let e of this.optimisticUpdates)e.update(r);let i=[];for(let[e,t]of this.queryResults){let r=n.get(e);(r===void 0||r.result!==t.result)&&i.push(e)}return i}applyOptimisticUpdate(e,t){this.optimisticUpdates.push({update:e,mutationId:t});let n=new gr(this.queryResults);return e(n),n.modifiedQueries}rawQueryResult(e){let t=this.queryResults.get(e);if(t!==void 0)return t.result}queryResult(e){let t=this.queryResults.get(e);if(t===void 0)return;let n=t.result;if(n!==void 0){if(n.success)return n.value;throw n.errorData===void 0?Error(nr(`query`,t.udfPath,n)):rr(n,new In(nr(`query`,t.udfPath,n)))}}hasQueryResult(e){return this.queryResults.get(e)!==void 0}queryLogs(e){return this.queryResults.get(e)?.result?.logLines}},vr=Object.defineProperty,yr=(e,t,n)=>t in e?vr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,br=(e,t,n)=>yr(e,typeof t==`symbol`?t:t+``,n),xr=class e{constructor(e,t){br(this,`low`),br(this,`high`),br(this,`__isUnsignedLong__`),this.low=e|0,this.high=t|0,this.__isUnsignedLong__=!0}static isLong(e){return(e&&e.__isUnsignedLong__)===!0}static fromBytesLE(t){return new e(t[0]|t[1]<<8|t[2]<<16|t[3]<<24,t[4]|t[5]<<8|t[6]<<16|t[7]<<24)}toBytesLE(){let e=this.high,t=this.low;return[t&255,t>>>8&255,t>>>16&255,t>>>24,e&255,e>>>8&255,e>>>16&255,e>>>24]}static fromNumber(t){return isNaN(t)||t<0?Sr:t>=Tr?Er:new e(t%wr|0,t/wr|0)}toString(){return(BigInt(this.high)*BigInt(wr)+BigInt(this.low)).toString()}equals(t){return e.isLong(t)||(t=e.fromValue(t)),this.high>>>31==1&&t.high>>>31==1?!1:this.high===t.high&&this.low===t.low}notEquals(e){return!this.equals(e)}comp(t){return e.isLong(t)||(t=e.fromValue(t)),this.equals(t)?0:t.high>>>0>this.high>>>0||t.high===this.high&&t.low>>>0>this.low>>>0?-1:1}lessThanOrEqual(e){return this.comp(e)<=0}static fromValue(t){return typeof t==`number`?e.fromNumber(t):new e(t.low,t.high)}};let Sr=new xr(0,0),Cr=65536,wr=Cr*Cr,Tr=wr*wr,Er=new xr(-1,-1);var Dr=Object.defineProperty,Or=(e,t,n)=>t in e?Dr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,kr=(e,t,n)=>Or(e,typeof t==`symbol`?t:t+``,n),Ar=class{constructor(e,t){kr(this,`version`),kr(this,`remoteQuerySet`),kr(this,`queryPath`),kr(this,`logger`),this.version={querySet:0,ts:xr.fromNumber(0),identity:0},this.remoteQuerySet=/* @__PURE__ */ new Map,this.queryPath=e,this.logger=t}transition(e){let t=e.startVersion;if(this.version.querySet!==t.querySet||this.version.ts.notEquals(t.ts)||this.version.identity!==t.identity)throw Error(`Invalid start version: ${t.ts.toString()}:${t.querySet}:${t.identity}, transitioning from ${this.version.ts.toString()}:${this.version.querySet}:${this.version.identity}`);for(let t of e.modifications)switch(t.type){case`QueryUpdated`:{let e=this.queryPath(t.queryId);if(e)for(let n of t.logLines)er(this.logger,`info`,`query`,e,n);let n=En(t.value??null);this.remoteQuerySet.set(t.queryId,{success:!0,value:n,logLines:t.logLines});break}case`QueryFailed`:{let e=this.queryPath(t.queryId);if(e)for(let n of t.logLines)er(this.logger,`info`,`query`,e,n);let{errorData:n}=t;this.remoteQuerySet.set(t.queryId,{success:!1,errorMessage:t.errorMessage,errorData:n===void 0?void 0:En(n),logLines:t.logLines});break}case`QueryRemoved`:this.remoteQuerySet.delete(t.queryId);break;default:throw Error(`Invalid modification ${t.type}`)}this.version=e.endVersion}remoteQueryResults(){return this.remoteQuerySet}timestamp(){return this.version.ts}};function jr(e){let t=nn(e);return xr.fromBytesLE(Array.from(t))}function Mr(e){return on(new Uint8Array(e.toBytesLE()))}function Nr(e){switch(e.type){case`FatalError`:case`AuthError`:case`ActionResponse`:case`TransitionChunk`:case`Ping`:return{...e};case`MutationResponse`:return e.success?{...e,ts:jr(e.ts)}:{...e};case`Transition`:return{...e,startVersion:{...e.startVersion,ts:jr(e.startVersion.ts)},endVersion:{...e.endVersion,ts:jr(e.endVersion.ts)}}}}function Pr(e){switch(e.type){case`Authenticate`:case`ModifyQuerySet`:case`Mutation`:case`Action`:case`Event`:return{...e};case`Connect`:return e.maxObservedTimestamp===void 0?{...e,maxObservedTimestamp:void 0}:{...e,maxObservedTimestamp:Mr(e.maxObservedTimestamp)}}}var Fr=Object.defineProperty,Ir=(e,t,n)=>t in e?Fr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,V=(e,t,n)=>Ir(e,typeof t==`symbol`?t:t+``,n);let Lr;function Rr(){return Lr===void 0&&(Lr=Date.now()),typeof performance>`u`||!performance.now?Date.now():Math.round(Lr+performance.now())}function zr(){return`t=${Math.round((Rr()-Lr)/100)/10}s`}let Br={InternalServerError:{timeout:1e3},SubscriptionsWorkerFullError:{timeout:3e3},TooManyConcurrentRequests:{timeout:3e3},CommitterFullError:{timeout:3e3},AwsTooManyRequestsException:{timeout:3e3},ExecuteFullError:{timeout:3e3},SystemTimeoutError:{timeout:3e3},ExpiredInQueue:{timeout:3e3},VectorIndexesUnavailable:{timeout:1e3},SearchIndexesUnavailable:{timeout:1e3},TableSummariesUnavailable:{timeout:1e3},VectorIndexTooLarge:{timeout:3e3},SearchIndexTooLarge:{timeout:3e3},TooManyWritesInTimePeriod:{timeout:3e3}};function Vr(e){if(e===void 0)return`Unknown`;for(let t of Object.keys(Br))if(e.startsWith(t))return t;return`Unknown`}var Hr=class{constructor(e,t,n,r,i,a){this.markConnectionStateDirty=i,this.debug=a,V(this,`socket`),V(this,`connectionCount`),V(this,`_hasEverConnected`,!1),V(this,`lastCloseReason`),V(this,`transitionChunkBuffer`,null),V(this,`defaultInitialBackoff`),V(this,`maxBackoff`),V(this,`retries`),V(this,`serverInactivityThreshold`),V(this,`reconnectDueToServerInactivityTimeout`),V(this,`scheduledReconnect`,null),V(this,`networkOnlineHandler`,null),V(this,`pendingNetworkRecoveryInfo`,null),V(this,`uri`),V(this,`onOpen`),V(this,`onResume`),V(this,`onMessage`),V(this,`webSocketConstructor`),V(this,`logger`),V(this,`onServerDisconnectError`),this.webSocketConstructor=n,this.socket={state:`disconnected`},this.connectionCount=0,this.lastCloseReason=`InitialConnect`,this.defaultInitialBackoff=1e3,this.maxBackoff=16e3,this.retries=0,this.serverInactivityThreshold=6e4,this.reconnectDueToServerInactivityTimeout=null,this.uri=e,this.onOpen=t.onOpen,this.onResume=t.onResume,this.onMessage=t.onMessage,this.onServerDisconnectError=t.onServerDisconnectError,this.logger=r,this.setupNetworkListener(),this.connect()}setSocketState(e){this.socket=e,this._logVerbose(`socket state changed: ${this.socket.state}, paused: ${`paused`in this.socket?this.socket.paused:void 0}`),this.markConnectionStateDirty()}setupNetworkListener(){typeof window<`u`&&typeof window.addEventListener==`function`&&this.networkOnlineHandler===null&&(this.networkOnlineHandler=()=>{this._logVerbose(`network online event detected`),this.tryReconnectImmediately()},window.addEventListener(`online`,this.networkOnlineHandler),this._logVerbose(`network online event listener registered`))}cleanupNetworkListener(){this.networkOnlineHandler&&typeof window<`u`&&typeof window.removeEventListener==`function`&&(window.removeEventListener(`online`,this.networkOnlineHandler),this.networkOnlineHandler=null,this._logVerbose(`network online event listener removed`))}assembleTransition(e){if(e.partNumber<0||e.partNumber>=e.totalParts||e.totalParts===0||this.transitionChunkBuffer&&(this.transitionChunkBuffer.totalParts!==e.totalParts||this.transitionChunkBuffer.transitionId!==e.transitionId))throw this.transitionChunkBuffer=null,Error(`Invalid TransitionChunk`);if(this.transitionChunkBuffer===null&&(this.transitionChunkBuffer={chunks:[],totalParts:e.totalParts,transitionId:e.transitionId}),e.partNumber!==this.transitionChunkBuffer.chunks.length){let t=this.transitionChunkBuffer.chunks.length;throw this.transitionChunkBuffer=null,Error(`TransitionChunk received out of order: expected part ${t}, got ${e.partNumber}`)}if(this.transitionChunkBuffer.chunks.push(e.chunk),this.transitionChunkBuffer.chunks.length===e.totalParts){let e=this.transitionChunkBuffer.chunks.join(``);this.transitionChunkBuffer=null;let t=Nr(JSON.parse(e));if(t.type!==`Transition`)throw Error(`Expected Transition, got ${t.type} after assembling chunks`);return t}return null}connect(){if(this.socket.state===`terminated`)return;if(this.socket.state!==`disconnected`&&this.socket.state!==`stopped`)throw Error(`Didn't start connection from disconnected state: `+this.socket.state);let e=new this.webSocketConstructor(this.uri);this._logVerbose(`constructed WebSocket`),this.setSocketState({state:`connecting`,ws:e,paused:`no`}),this.resetServerInactivityTimeout(),e.onopen=()=>{if(this.logger.logVerbose(`begin ws.onopen`),this.socket.state!==`connecting`)throw Error(`onopen called with socket not in connecting state`);if(this.setSocketState({state:`ready`,ws:e,paused:this.socket.paused===`yes`?`uninitialized`:`no`}),this.resetServerInactivityTimeout(),this.socket.paused===`no`&&(this._hasEverConnected=!0,this.onOpen({connectionCount:this.connectionCount,lastCloseReason:this.lastCloseReason,clientTs:Rr()})),this.lastCloseReason!==`InitialConnect`&&(this.lastCloseReason?this.logger.log(`WebSocket reconnected at`,zr(),`after disconnect due to`,this.lastCloseReason):this.logger.log(`WebSocket reconnected at`,zr())),this.connectionCount+=1,this.lastCloseReason=null,this.pendingNetworkRecoveryInfo!==null){let{timeSavedMs:e}=this.pendingNetworkRecoveryInfo;this.pendingNetworkRecoveryInfo=null,this.sendMessage({type:`Event`,eventType:`NetworkRecoveryReconnect`,event:{timeSavedMs:e}}),this.logger.log(`Network recovery reconnect saved ~${Math.round(e/1e3)}s of waiting`)}},e.onerror=e=>{this.transitionChunkBuffer=null;let t=e.message;t&&this.logger.log(`WebSocket error message: ${t}`)},e.onmessage=e=>{this.resetServerInactivityTimeout();let t=e.data.length,n=Nr(JSON.parse(e.data));if(this._logVerbose(`received ws message with type ${n.type}`),n.type!==`Ping`){if(n.type===`TransitionChunk`){let e=this.assembleTransition(n);if(!e)return;n=e,this._logVerbose(`assembled full ws message of type ${n.type}`)}this.transitionChunkBuffer!==null&&(this.transitionChunkBuffer=null,this.logger.log(`Received unexpected ${n.type} while buffering TransitionChunks`)),n.type===`Transition`&&this.reportLargeTransition({messageLength:t,transition:n}),this.onMessage(n).hasSyncedPastLastReconnect&&(this.retries=0,this.markConnectionStateDirty())}},e.onclose=e=>{if(this._logVerbose(`begin ws.onclose`),this.transitionChunkBuffer=null,this.lastCloseReason===null&&(this.lastCloseReason=e.reason||`closed with code ${e.code}`),e.code!==1e3&&e.code!==1001&&e.code!==1005&&e.code!==4040){let t=`WebSocket closed with code ${e.code}`;e.reason&&(t+=`: ${e.reason}`),this.logger.log(t),this.onServerDisconnectError&&e.reason&&this.onServerDisconnectError(t)}let t=Vr(e.reason);this.scheduleReconnect(t)}}socketState(){return this.socket.state}sendMessage(e){let t={type:e.type,...e.type===`Authenticate`&&e.tokenType===`User`?{value:`...${e.value.slice(-7)}`}:{}};if(this.socket.state===`ready`&&this.socket.paused===`no`){let n=Pr(e),r=JSON.stringify(n),i=!1;try{this.socket.ws.send(r),i=!0}catch(e){this.logger.log(`Failed to send message on WebSocket, reconnecting: ${e}`),this.closeAndReconnect(`FailedToSendMessage`)}return this._logVerbose(`${i?`sent`:`failed to send`} message with type ${e.type}: ${JSON.stringify(t)}`),!0}return this._logVerbose(`message not sent (socket state: ${this.socket.state}, paused: ${`paused`in this.socket?this.socket.paused:void 0}): ${JSON.stringify(t)}`),!1}resetServerInactivityTimeout(){this.socket.state!==`terminated`&&(this.reconnectDueToServerInactivityTimeout!==null&&(clearTimeout(this.reconnectDueToServerInactivityTimeout),this.reconnectDueToServerInactivityTimeout=null),this.reconnectDueToServerInactivityTimeout=setTimeout(()=>{this.closeAndReconnect(`InactiveServer`)},this.serverInactivityThreshold))}scheduleReconnect(e){this.scheduledReconnect&&(clearTimeout(this.scheduledReconnect.timeout),this.scheduledReconnect=null),this.socket={state:`disconnected`};let t=this.nextBackoff(e);this.markConnectionStateDirty(),this.logger.log(`Attempting reconnect in ${Math.round(t)}ms`);let n=Rr(),r=setTimeout(()=>{this.scheduledReconnect?.timeout===r&&(this.scheduledReconnect=null,this.connect())},t);this.scheduledReconnect={timeout:r,scheduledAt:n,backoffMs:t}}closeAndReconnect(e){switch(this._logVerbose(`begin closeAndReconnect with reason ${e}`),this.socket.state){case`disconnected`:case`terminated`:case`stopped`:return;case`connecting`:case`ready`:this.lastCloseReason=e,this.close(),this.scheduleReconnect(`client`);return;default:this.socket}}close(){switch(this.transitionChunkBuffer=null,this.socket.state){case`disconnected`:case`terminated`:case`stopped`:return Promise.resolve();case`connecting`:{let e=this.socket.ws;return e.onmessage=e=>{this._logVerbose(`Ignoring message received after close`)},new Promise(t=>{e.onclose=()=>{this._logVerbose(`Closed after connecting`),t()},e.onopen=()=>{this._logVerbose(`Opened after connecting`),e.close()}})}case`ready`:{this._logVerbose(`ws.close called`);let e=this.socket.ws;e.onmessage=e=>{this._logVerbose(`Ignoring message received after close`)};let t=new Promise(t=>{e.onclose=()=>{t()}});return e.close(),t}default:return this.socket,Promise.resolve()}}terminate(){switch(this.reconnectDueToServerInactivityTimeout&&clearTimeout(this.reconnectDueToServerInactivityTimeout),this.scheduledReconnect&&(clearTimeout(this.scheduledReconnect.timeout),this.scheduledReconnect=null),this.cleanupNetworkListener(),this.socket.state){case`terminated`:case`stopped`:case`disconnected`:case`connecting`:case`ready`:{let e=this.close();return this.setSocketState({state:`terminated`}),e}default:throw this.socket,Error(`Invalid websocket state: ${this.socket.state}`)}}stop(){switch(this.socket.state){case`terminated`:return Promise.resolve();case`connecting`:case`stopped`:case`disconnected`:case`ready`:{this.cleanupNetworkListener();let e=this.close();return this.socket={state:`stopped`},e}default:return this.socket,Promise.resolve()}}tryRestart(){switch(this.socket.state){case`stopped`:break;case`terminated`:case`connecting`:case`ready`:case`disconnected`:this.logger.logVerbose(`Restart called without stopping first`);return;default:this.socket}this.setupNetworkListener(),this.connect()}pause(){switch(this.socket.state){case`disconnected`:case`stopped`:case`terminated`:return;case`connecting`:case`ready`:this.socket={...this.socket,paused:`yes`};return;default:this.socket;return}}tryReconnectImmediately(){if(this._logVerbose(`tryReconnectImmediately called`),this.socket.state!==`disconnected`){this._logVerbose(`tryReconnectImmediately called but socket state is ${this.socket.state}, no action taken`);return}let e=null;if(this.scheduledReconnect){let t=Rr()-this.scheduledReconnect.scheduledAt;e=Math.max(0,this.scheduledReconnect.backoffMs-t),this._logVerbose(`would have waited ${Math.round(e)}ms more (backoff was ${Math.round(this.scheduledReconnect.backoffMs)}ms, elapsed ${Math.round(t)}ms)`),clearTimeout(this.scheduledReconnect.timeout),this.scheduledReconnect=null,this._logVerbose(`canceled scheduled reconnect`)}this.logger.log(`Network recovery detected, reconnecting immediately`),this.pendingNetworkRecoveryInfo=e===null?null:{timeSavedMs:e},this.connect()}resume(){switch(this.socket.state){case`connecting`:this.socket={...this.socket,paused:`no`};return;case`ready`:this.socket.paused===`uninitialized`?(this.socket={...this.socket,paused:`no`},this._hasEverConnected=!0,this.onOpen({connectionCount:this.connectionCount,lastCloseReason:this.lastCloseReason,clientTs:Rr()})):this.socket.paused===`yes`&&(this.socket={...this.socket,paused:`no`},this.onResume());return;case`terminated`:case`stopped`:case`disconnected`:return;default:this.socket}this.connect()}connectionState(){return{isConnected:this.socket.state===`ready`,hasEverConnected:this._hasEverConnected,connectionCount:this.connectionCount,connectionRetries:this.retries}}_logVerbose(e){this.logger.logVerbose(e)}nextBackoff(e){let t=(e===`client`?100:e===`Unknown`?this.defaultInitialBackoff:Br[e].timeout)*2**this.retries;this.retries+=1;let n=Math.min(t,this.maxBackoff);return n+n*(Math.random()-.5)}reportLargeTransition({transition:e,messageLength:t}){if(e.clientClockSkew===void 0||e.serverTs===void 0)return;let n=Rr()-e.clientClockSkew-e.serverTs/1e6,r=`${Math.round(n)}ms`,i=`${Math.round(t/1e4)/100}MB`,a=t/(n/1e3),o=`${Math.round(a/1e4)/100}MB per second`;this._logVerbose(`received ${i} transition in ${r} at ${o}`),t>2e7?this.logger.log(`received query results totaling more that 20MB (${i}) which will take a long time to download on slower connections`):n>2e4&&this.logger.log(`received query results totaling ${i} which took more than 20s to arrive (${r})`),this.debug&&this.sendMessage({type:`Event`,eventType:`ClientReceivedTransition`,event:{transitionTransitTime:n,messageLength:t}})}};function Ur(){return Wr()}function Wr(){return`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}var Gr=class extends Error{};Gr.prototype.name=`InvalidTokenError`;function Kr(e){return decodeURIComponent(atob(e).replace(/(.)/g,(e,t)=>{let n=t.charCodeAt(0).toString(16).toUpperCase();return n.length<2&&(n=`0`+n),`%`+n}))}function qr(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`);switch(t.length%4){case 0:break;case 2:t+=`==`;break;case 3:t+=`=`;break;default:throw Error(`base64 string is not of the correct length`)}try{return Kr(t)}catch{return atob(t)}}function Jr(e,t){if(typeof e!=`string`)throw new Gr(`Invalid token specified: must be a string`);t||(t={});let n=t.header===!0?0:1,r=e.split(`.`)[n];if(typeof r!=`string`)throw new Gr(`Invalid token specified: missing part #${n+1}`);let i;try{i=qr(r)}catch(e){throw new Gr(`Invalid token specified: invalid base64 for part #${n+1} (${e.message})`)}try{return JSON.parse(i)}catch(e){throw new Gr(`Invalid token specified: invalid json for part #${n+1} (${e.message})`)}}var Yr=Object.defineProperty,Xr=(e,t,n)=>t in e?Yr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,H=(e,t,n)=>Xr(e,typeof t==`symbol`?t:t+``,n),Zr=class{constructor(e,t,n){H(this,`authState`,{state:`noAuth`}),H(this,`configVersion`,0),H(this,`syncState`),H(this,`authenticate`),H(this,`stopSocket`),H(this,`tryRestartSocket`),H(this,`pauseSocket`),H(this,`resumeSocket`),H(this,`clearAuth`),H(this,`logger`),H(this,`refreshTokenLeewaySeconds`),H(this,`initialAuthTokenReuse`),H(this,`lastRefreshChange`),H(this,`tokenConfirmationAttempts`,0),this.syncState=e,this.authenticate=t.authenticate,this.stopSocket=t.stopSocket,this.tryRestartSocket=t.tryRestartSocket,this.pauseSocket=t.pauseSocket,this.resumeSocket=t.resumeSocket,this.clearAuth=t.clearAuth,this.logger=n.logger,this.refreshTokenLeewaySeconds=n.refreshTokenLeewaySeconds,this.initialAuthTokenReuse=n.initialAuthTokenReuse,this.lastRefreshChange=!1}notifyRefreshChange(e){this.authState.state!==`noAuth`&&this.authState.state!==`initialRefetch`&&this.authState.config.onRefreshChange&&this.lastRefreshChange!==e&&(this.lastRefreshChange=e,this.authState.config.onRefreshChange(e))}async setConfig(e,t,n){this.resetAuthState(),this._logVerbose(`pausing WS for auth token fetch`),this.pauseSocket();let r=await this.fetchTokenAndGuardAgainstRace(e,{forceRefreshToken:!1});if(r.isFromOutdatedConfig)return;let i={fetchToken:e,onAuthChange:t,onRefreshChange:n};r.value?(this.setAuthState({state:`waitingForServerConfirmationOfCachedToken`,config:i,hasRetried:!1}),this.authenticate(r.value)):(this.setAuthState({state:`initialRefetch`,config:i}),await this.refetchToken()),this._logVerbose(`resuming WS after auth token fetch`),this.resumeSocket()}onTransition(e){if(this.syncState.isCurrentOrNewerAuthVersion(e.endVersion.identity)&&!(e.endVersion.identity<=e.startVersion.identity)){if(this._logVerbose(`auth state is ${this.authState.state} when handling transition`),this.syncState.markAuthCompletion(),this.authState.state===`waitingForServerConfirmationOfCachedToken`){this._logVerbose(`server confirmed auth token is valid`);let t=this.syncState.getAuth()?.value;this.initialAuthTokenReuse&&t?this.scheduleTokenRefetch(t,e.clientClockSkew):this.refetchToken(),this.authState.config.onAuthChange(!0);return}this.authState.state===`waitingForServerConfirmationOfFreshToken`&&(this._logVerbose(`server confirmed new auth token is valid`),this.notifyRefreshChange(!1),this.scheduleTokenRefetch(this.authState.token),this.tokenConfirmationAttempts=0,this.authState.hadAuth||this.authState.config.onAuthChange(!0))}}onAuthError(e){if(e.authUpdateAttempted===!1&&(this.authState.state===`waitingForServerConfirmationOfFreshToken`||this.authState.state===`waitingForServerConfirmationOfCachedToken`)){this._logVerbose(`ignoring non-auth token expired error`);return}let{baseVersion:t}=e;if(!this.syncState.isCurrentOrNewerAuthVersion(t+1)){this._logVerbose(`ignoring auth error for previous auth attempt`);return}this.tryToReauthenticate(e)}async tryToReauthenticate(e){if(this._logVerbose(`attempting to reauthenticate: ${e.error}`),this.authState.state===`noAuth`||this.authState.state===`waitingForServerConfirmationOfFreshToken`&&this.tokenConfirmationAttempts>=2){this.logger.error(`Failed to authenticate: "${e.error}", check your server auth config`),this.syncState.hasAuth()&&this.syncState.clearAuth(),this.authState.state!==`noAuth`&&this.setAndReportAuthFailed(this.authState.config.onAuthChange);return}if(this.authState.state===`waitingForServerConfirmationOfFreshToken`&&(this.tokenConfirmationAttempts++,this._logVerbose(`retrying reauthentication, ${2-this.tokenConfirmationAttempts} attempts remaining`)),this.notifyRefreshChange(!0),await this.stopSocket(),this.authState.state===`noAuth`)return;let t=await this.fetchTokenAndGuardAgainstRace(this.authState.config.fetchToken,{forceRefreshToken:!0});t.isFromOutdatedConfig||(t.value&&this.syncState.isNewAuth(t.value)?(this.authenticate(t.value),this.setAuthState({state:`waitingForServerConfirmationOfFreshToken`,config:this.authState.config,token:t.value,hadAuth:this.authState.state===`notRefetching`||this.authState.state===`waitingForScheduledRefetch`})):(this._logVerbose(`reauthentication failed, could not fetch a new token`),this.syncState.hasAuth()&&this.syncState.clearAuth(),this.setAndReportAuthFailed(this.authState.config.onAuthChange)),this.tryRestartSocket())}async refetchToken(){if(this.authState.state===`noAuth`)return;this._logVerbose(`refetching auth token`);let e=await this.fetchTokenAndGuardAgainstRace(this.authState.config.fetchToken,{forceRefreshToken:!0});e.isFromOutdatedConfig||(e.value?this.syncState.isNewAuth(e.value)?(this.setAuthState({state:`waitingForServerConfirmationOfFreshToken`,hadAuth:this.syncState.hasAuth(),token:e.value,config:this.authState.config}),this.authenticate(e.value)):this.setAuthState({state:`notRefetching`,config:this.authState.config}):(this._logVerbose(`refetching token failed`),this.syncState.hasAuth()&&this.clearAuth(),this.setAndReportAuthFailed(this.authState.config.onAuthChange)),this._logVerbose(`restarting WS after auth token fetch (if currently stopped)`),this.tryRestartSocket())}scheduleTokenRefetch(e,t){if(this.authState.state===`noAuth`)return;let n=this.decodeToken(e);if(!n){this.logger.error(`Auth token is not a valid JWT, cannot refetch the token`);return}let{iat:r,exp:i}=n;if(!r||!i){this.logger.error(`Auth token does not have required fields, cannot refetch the token`);return}let a=i-r;if(a<=2){this.logger.error(`Auth token does not live long enough, cannot refetch the token`);return}let o;t===void 0?o=a:(o=i-(Date.now()-t)/1e3,o<=0&&(o=0));let s=Math.min(1728e6,(o-this.refreshTokenLeewaySeconds)*1e3);s<=0&&(this.logger.warn(`Refetching auth token immediately, configured leeway ${this.refreshTokenLeewaySeconds}s is larger than the token's lifetime ${o}s`),s=0);let c=setTimeout(()=>{this._logVerbose(`running scheduled token refetch`),this.refetchToken()},s);this.setAuthState({state:`waitingForScheduledRefetch`,refetchTokenTimeoutId:c,config:this.authState.config}),this._logVerbose(`scheduled preemptive auth token refetching in ${s}ms`)}async fetchTokenAndGuardAgainstRace(e,t){let n=++this.configVersion;this._logVerbose(`fetching token with config version ${n}`);let r=await e(t);return this.configVersion===n?{isFromOutdatedConfig:!1,value:r}:(this._logVerbose(`stale config version, expected ${n}, got ${this.configVersion}`),{isFromOutdatedConfig:!0})}stop(){this.resetAuthState(),this.configVersion++,this._logVerbose(`config version bumped to ${this.configVersion}`)}setAndReportAuthFailed(e){e(!1),this.resetAuthState()}resetAuthState(){this.notifyRefreshChange(!1),this.setAuthState({state:`noAuth`})}setAuthState(e){let t=e.state===`waitingForServerConfirmationOfFreshToken`?{hadAuth:e.hadAuth,state:e.state,token:`...${e.token.slice(-7)}`}:{state:e.state};switch(this._logVerbose(`setting auth state to ${JSON.stringify(t)}`),e.state){case`waitingForScheduledRefetch`:case`notRefetching`:case`noAuth`:this.tokenConfirmationAttempts=0}this.authState.state===`waitingForScheduledRefetch`&&clearTimeout(this.authState.refetchTokenTimeoutId),this.authState=e}decodeToken(e){try{return Jr(e)}catch(e){return this._logVerbose(`Error decoding token: ${e instanceof Error?e.message:`Unknown error`}`),null}}_logVerbose(e){this.logger.logVerbose(`${e} [v${this.configVersion}]`)}};let Qr=[`convexClientConstructed`,`convexWebSocketOpen`,`convexFirstMessageReceived`];function $r(e,t){let n={sessionId:t};typeof performance<`u`&&performance.mark&&performance.mark(e,{detail:n})}function ei(e){let t=e.name.slice(6);return t=t.charAt(0).toLowerCase()+t.slice(1),{name:t,startTime:e.startTime}}function ti(e){if(typeof performance>`u`||!performance.getEntriesByName)return[];let t=[];for(let n of Qr){let r=performance.getEntriesByName(n).filter(e=>e.entryType===`mark`).filter(t=>t.detail.sessionId===e);t.push(...r)}return t.map(ei)}var ni=Object.defineProperty,ri=(e,t,n)=>t in e?ni(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,U=(e,t,n)=>ri(e,typeof t==`symbol`?t:t+``,n),ii=class{constructor(e,t,n){if(U(this,`address`),U(this,`state`),U(this,`requestManager`),U(this,`webSocketManager`),U(this,`authenticationManager`),U(this,`remoteQuerySet`),U(this,`optimisticQueryResults`),U(this,`_transitionHandlerCounter`,0),U(this,`_nextRequestId`),U(this,`_onTransitionFns`,/* @__PURE__ */ new Map),U(this,`_sessionId`),U(this,`firstMessageReceived`,!1),U(this,`debug`),U(this,`logger`),U(this,`maxObservedTimestamp`),U(this,`connectionStateSubscribers`,/* @__PURE__ */ new Map),U(this,`nextConnectionStateSubscriberId`,0),U(this,`_lastPublishedConnectionState`),U(this,`markConnectionStateDirty`,()=>{Promise.resolve().then(()=>{let e=this.connectionState();if(JSON.stringify(e)!==JSON.stringify(this._lastPublishedConnectionState)){this._lastPublishedConnectionState=e;for(let t of this.connectionStateSubscribers.values())t(e)}})}),U(this,`mark`,e=>{this.debug&&$r(e,this.sessionId)}),typeof e==`object`)throw Error(`Passing a ClientConfig object is no longer supported. Pass the URL of the Convex deployment as a string directly.`);n?.skipConvexDeploymentUrlCheck!==!0&&sn(e),n={...n};let r=n.authRefreshTokenLeewaySeconds??10,i=n.webSocketConstructor;if(!i&&typeof WebSocket>`u`)throw Error(`No WebSocket global variable defined! To use Convex in an environment without WebSocket try the HTTP client: https://docs.convex.dev/api/classes/browser.ConvexHttpClient`);i=i||WebSocket,this.debug=n.reportDebugInfoToConvex??!1,this.address=e,this.logger=n.logger===!1?$n({verbose:n.verbose??!1}):n.logger!==!0&&n.logger?n.logger:Qn({verbose:n.verbose??!1});let a=e.search(`://`);if(a===-1)throw Error(`Provided address was not an absolute URL.`);let o=e.substring(a+3),s=e.substring(0,a),c;if(s===`http`)c=`ws`;else if(s===`https`)c=`wss`;else throw Error(`Unknown parent protocol ${s}`);let l=`${c}://${o}/api/${Ln}/sync`;this.state=new cr,this.remoteQuerySet=new Ar(e=>this.state.queryPath(e),this.logger),this.requestManager=new fr(this.logger,this.markConnectionStateDirty);let u=()=>{this.webSocketManager.pause(),this.state.pause()};this.authenticationManager=new Zr(this.state,{authenticate:e=>{let t=this.state.setAuth(e);return this.webSocketManager.sendMessage(t),t.baseVersion},stopSocket:()=>this.webSocketManager.stop(),tryRestartSocket:()=>this.webSocketManager.tryRestart(),pauseSocket:u,resumeSocket:()=>this.webSocketManager.resume(),clearAuth:()=>{this.clearAuth()}},{logger:this.logger,refreshTokenLeewaySeconds:r,initialAuthTokenReuse:n.initialAuthTokenReuse??!1}),this.optimisticQueryResults=new _r,this.addOnTransitionHandler(e=>{t(e.queries.map(e=>e.token))}),this._nextRequestId=0,this._sessionId=Ur();let{unsavedChangesWarning:d}=n;if(typeof window>`u`||window.addEventListener===void 0){if(d===!0)throw Error(`unsavedChangesWarning requested, but window.addEventListener not found! Remove {unsavedChangesWarning: true} from Convex client options.`)}else d!==!1&&window.addEventListener(`beforeunload`,e=>{if(this.requestManager.hasIncompleteRequests()){e.preventDefault();let t=`Are you sure you want to leave? Your changes may not be saved.`;return(e||window.event).returnValue=t,t}});this.webSocketManager=new Hr(l,{onOpen:e=>{this.mark(`convexWebSocketOpen`),this.webSocketManager.sendMessage({...e,type:`Connect`,sessionId:this._sessionId,maxObservedTimestamp:this.maxObservedTimestamp}),this.remoteQuerySet=new Ar(e=>this.state.queryPath(e),this.logger);let[t,n]=this.state.restart();n&&this.webSocketManager.sendMessage(n),this.webSocketManager.sendMessage(t);for(let e of this.requestManager.restart())this.webSocketManager.sendMessage(e)},onResume:()=>{let[e,t]=this.state.resume();t&&this.webSocketManager.sendMessage(t),e&&this.webSocketManager.sendMessage(e);for(let e of this.requestManager.resume())this.webSocketManager.sendMessage(e)},onMessage:e=>{switch(this.firstMessageReceived||(this.firstMessageReceived=!0,this.mark(`convexFirstMessageReceived`),this.reportMarks()),e.type){case`Transition`:{this.observedTimestamp(e.endVersion.ts),this.authenticationManager.onTransition(e),this.remoteQuerySet.transition(e),this.state.transition(e);let t=this.requestManager.removeCompleted(this.remoteQuerySet.timestamp());this.notifyOnQueryResultChanges(t);break}case`MutationResponse`:{e.success&&this.observedTimestamp(e.ts);let t=this.requestManager.onResponse(e);t!==null&&this.notifyOnQueryResultChanges(/* @__PURE__ */ new Map([[t.requestId,t.result]]));break}case`ActionResponse`:this.requestManager.onResponse(e);break;case`AuthError`:this.authenticationManager.onAuthError(e);break;case`FatalError`:{let t=tr(this.logger,e.error);throw this.webSocketManager.terminate(),t}}return{hasSyncedPastLastReconnect:this.hasSyncedPastLastReconnect()}},onServerDisconnectError:n.onServerDisconnectError},i,this.logger,this.markConnectionStateDirty,this.debug),this.mark(`convexClientConstructed`),n.expectAuth&&u()}hasSyncedPastLastReconnect(){return this.requestManager.hasSyncedPastLastReconnect()&&this.state.hasSyncedPastLastReconnect()}observedTimestamp(e){(this.maxObservedTimestamp===void 0||this.maxObservedTimestamp.lessThanOrEqual(e))&&(this.maxObservedTimestamp=e)}getMaxObservedTimestamp(){return this.maxObservedTimestamp}notifyOnQueryResultChanges(e){let t=this.remoteQuerySet.remoteQueryResults(),n=/* @__PURE__ */ new Map;for(let[e,r]of t){let t=this.state.queryToken(e);if(t!==null){let i={result:r,udfPath:this.state.queryPath(e),args:this.state.queryArgs(e)};n.set(t,i)}}let r=this.optimisticQueryResults.ingestQueryResultsFromServer(n,new Set(e.keys()));this.handleTransition({queries:r.map(e=>({token:e,modification:{kind:`Updated`,result:this.optimisticQueryResults.rawQueryResult(e)}})),reflectedMutations:Array.from(e).map(([e,t])=>({requestId:e,result:t})),timestamp:this.remoteQuerySet.timestamp()})}handleTransition(e){for(let t of this._onTransitionFns.values())t(e)}addOnTransitionHandler(e){let t=this._transitionHandlerCounter++;return this._onTransitionFns.set(t,e),()=>this._onTransitionFns.delete(t)}getCurrentAuthClaims(){let e=this.state.getAuth(),t={};if(e&&e.tokenType===`User`)try{t=e?Jr(e.value):{}}catch{t={}}else return;return{token:e.value,decoded:t}}setAuth(e,t,n){this.authenticationManager.setConfig(e,t,n)}hasAuth(){return this.state.hasAuth()}setAdminAuth(e,t){let n=this.state.setAdminAuth(e,t);this.webSocketManager.sendMessage(n)}clearAuth(){let e=this.state.clearAuth();this.webSocketManager.sendMessage(e)}subscribe(e,t,n){let r=N(t),{modification:i,queryToken:a,unsubscribe:o}=this.state.subscribe(e,r,n?.journal,n?.componentPath);return i!==null&&this.webSocketManager.sendMessage(i),{queryToken:a,unsubscribe:()=>{let e=o();e&&this.webSocketManager.sendMessage(e)}}}localQueryResult(e,t){let n=z(e,N(t));return this.optimisticQueryResults.queryResult(n)}localQueryResultByToken(e){return this.optimisticQueryResults.queryResult(e)}hasLocalQueryResultByToken(e){return this.optimisticQueryResults.hasQueryResult(e)}localQueryLogs(e,t){let n=z(e,N(t));return this.optimisticQueryResults.queryLogs(n)}queryJournal(e,t){let n=z(e,N(t));return this.state.queryJournal(n)}connectionState(){let e=this.webSocketManager.connectionState();return{hasInflightRequests:this.requestManager.hasInflightRequests(),isWebSocketConnected:e.isConnected,hasEverConnected:e.hasEverConnected,connectionCount:e.connectionCount,connectionRetries:e.connectionRetries,timeOfOldestInflightRequest:this.requestManager.timeOfOldestInflightRequest(),inflightMutations:this.requestManager.inflightMutations(),inflightActions:this.requestManager.inflightActions()}}subscribeToConnectionState(e){let t=this.nextConnectionStateSubscriberId++;return this.connectionStateSubscribers.set(t,e),()=>{this.connectionStateSubscribers.delete(t)}}async mutation(e,t,n){let r=await this.mutationInternal(e,t,n);if(!r.success)throw r.errorData===void 0?Error(nr(`mutation`,e,r)):rr(r,new In(nr(`mutation`,e,r)));return r.value}async mutationInternal(e,t,n,r){let{mutationPromise:i}=this.enqueueMutation(e,t,n,r);return i}enqueueMutation(e,t,n,r){let i=N(t);this.tryReportLongDisconnect();let a=this.nextRequestId;if(this._nextRequestId++,n!==void 0){let e=n.optimisticUpdate;if(e!==void 0){let t=this.optimisticQueryResults.applyOptimisticUpdate(t=>{e(t,i)instanceof Promise&&this.logger.warn(`Optimistic update handler returned a Promise. Optimistic updates should be synchronous.`)},a).map(e=>{let t=this.localQueryResultByToken(e);return{token:e,modification:{kind:`Updated`,result:t===void 0?void 0:{success:!0,value:t,logLines:[]}}}});this.handleTransition({queries:t,reflectedMutations:[],timestamp:this.remoteQuerySet.timestamp()})}}let o={type:`Mutation`,requestId:a,udfPath:e,componentPath:r,args:[F(i)]},s=this.webSocketManager.sendMessage(o);return{requestId:a,mutationPromise:this.requestManager.request(o,s)}}async action(e,t){let n=await this.actionInternal(e,t);if(!n.success)throw n.errorData===void 0?Error(nr(`action`,e,n)):rr(n,new In(nr(`action`,e,n)));return n.value}async actionInternal(e,t,n){let r=N(t),i=this.nextRequestId;this._nextRequestId++,this.tryReportLongDisconnect();let a={type:`Action`,requestId:i,udfPath:e,componentPath:n,args:[F(r)]},o=this.webSocketManager.sendMessage(a);return this.requestManager.request(a,o)}async close(){return this.authenticationManager.stop(),this.webSocketManager.terminate()}get url(){return this.address}get nextRequestId(){return this._nextRequestId}get sessionId(){return this._sessionId}reportMarks(){if(this.debug){let e=ti(this.sessionId);this.webSocketManager.sendMessage({type:`Event`,eventType:`ClientConnect`,event:e})}}tryReportLongDisconnect(){if(!this.debug)return;let e=this.connectionState().timeOfOldestInflightRequest;if(e===null||Date.now()-e.getTime()<=6e4)return;let t=`${this.address}/api/debug_event`;fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,"Convex-Client":`npm-${Ln}`},body:JSON.stringify({event:`LongWebsocketDisconnect`})}).then(e=>{e.ok||this.logger.warn(`Analytics request failed with response:`,e.body)}).catch(e=>{this.logger.warn(`Analytics response failed with error:`,e)})}};function ai(e){if(typeof e!=`object`||!e||!Array.isArray(e.page)||typeof e.isDone!=`boolean`||typeof e.continueCursor!=`string`)throw Error(`Not a valid paginated query result: ${e?.toString()}`);return e}var oi=Object.defineProperty,si=(e,t,n)=>t in e?oi(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ci=(e,t,n)=>si(e,typeof t==`symbol`?t:t+``,n),li=class{constructor(e,t){this.client=e,this.onTransition=t,ci(this,`paginatedQuerySet`,/* @__PURE__ */ new Map),ci(this,`lastTransitionTs`),this.lastTransitionTs=xr.fromNumber(0),this.client.addOnTransitionHandler(e=>this.onBaseTransition(e))}subscribe(e,t,n){let r=R(e),i=ir(r,t,n),a=()=>this.removePaginatedQuerySubscriber(i),o=this.paginatedQuerySet.get(i);return o?(o.numSubscribers+=1,{paginatedQueryToken:i,unsubscribe:a}):(this.paginatedQuerySet.set(i,{token:i,canonicalizedUdfPath:r,args:t,numSubscribers:1,options:{initialNumItems:n.initialNumItems},nextPageKey:0,pageKeys:[],pageKeyToQuery:/* @__PURE__ */ new Map,ongoingSplits:/* @__PURE__ */ new Map,skip:!1,id:n.id}),this.addPageToPaginatedQuery(i,null,n.initialNumItems),{paginatedQueryToken:i,unsubscribe:a})}localQueryResult(e,t,n){let r=ir(R(e),t,n);return this.localQueryResultByToken(r)}localQueryResultByToken(e){let t=this.paginatedQuerySet.get(e);if(!t)return;let n=this.activePageQueryTokens(t);if(n.length===0)return{results:[],status:`LoadingFirstPage`,loadMore:t=>this.loadMoreOfPaginatedQuery(e,t)};let r=[],i=!1,a=!1;for(let e of n){let t=this.client.localQueryResultByToken(e);if(t===void 0){i=!0,a=!1;continue}let n=ai(t);r=r.concat(n.page),a=!!n.isDone}let o;return o=i?r.length===0?`LoadingFirstPage`:`LoadingMore`:a?`Exhausted`:`CanLoadMore`,{results:r,status:o,loadMore:t=>this.loadMoreOfPaginatedQuery(e,t)}}onBaseTransition(e){let t=e.queries.map(e=>e.token),n=this.queriesContainingTokens(t),r=[];n.length>0&&(this.processPaginatedQuerySplits(n,e=>this.client.localQueryResultByToken(e)),r=n.map(e=>({token:e,modification:{kind:`Updated`,result:this.localQueryResultByToken(e)}})));let i={...e,paginatedQueries:r};this.onTransition(i)}loadMoreOfPaginatedQuery(e,t){this.mustGetPaginatedQuery(e);let n=this.queryTokenForLastPageOfPaginatedQuery(e),r=this.client.localQueryResultByToken(n);if(!r)return!1;let i=ai(r);if(i.isDone)return!1;this.addPageToPaginatedQuery(e,i.continueCursor,t);let a={timestamp:this.lastTransitionTs,reflectedMutations:[],queries:[],paginatedQueries:[{token:e,modification:{kind:`Updated`,result:this.localQueryResultByToken(e)}}]};return this.onTransition(a),!0}queriesContainingTokens(e){if(e.length===0)return[];let t=[],n=new Set(e);for(let[e,r]of this.paginatedQuerySet)for(let i of this.allQueryTokens(r))if(n.has(i)){t.push(e);break}return t}processPaginatedQuerySplits(e,t){for(let n of e){let e=this.mustGetPaginatedQuery(n),{ongoingSplits:r,pageKeyToQuery:i,pageKeys:a}=e;for(let[n,[a,o]]of r)t(i.get(a).queryToken)!==void 0&&t(i.get(o).queryToken)!==void 0&&this.completePaginatedQuerySplit(e,n,a,o);for(let n of a){if(r.has(n))continue;let a=i.get(n);if(!a)throw Error(`No page query for active pageKey ${n}`);let o=t(a.queryToken);if(!o)continue;let s=ai(o);s.splitCursor&&(s.pageStatus===`SplitRecommended`||s.pageStatus===`SplitRequired`||s.page.length>e.options.initialNumItems*2)&&this.splitPaginatedQueryPage(e,n,a.cursor,s.splitCursor,s.continueCursor)}}}splitPaginatedQueryPage(e,t,n,r,i){let a=e.nextPageKey++,o=e.nextPageKey++,s={numItems:e.options.initialNumItems,id:e.id},c=this.client.subscribe(e.canonicalizedUdfPath,{...e.args,paginationOpts:{...s,cursor:n,endCursor:r}});e.pageKeyToQuery.set(a,{...c,cursor:n});let l=this.client.subscribe(e.canonicalizedUdfPath,{...e.args,paginationOpts:{...s,cursor:r,endCursor:i}});e.pageKeyToQuery.set(o,{...l,cursor:r}),e.ongoingSplits.set(t,[a,o])}addPageToPaginatedQuery(e,t,n){let r=this.mustGetPaginatedQuery(e),i=r.nextPageKey++,a={cursor:t,numItems:n,id:r.id},o={...r.args,paginationOpts:a},s=this.client.subscribe(r.canonicalizedUdfPath,o);return r.pageKeys.push(i),r.pageKeyToQuery.set(i,{...s,cursor:t}),s}removePaginatedQuerySubscriber(e){let t=this.paginatedQuerySet.get(e);if(t&&(--t.numSubscribers,!(t.numSubscribers>0))){for(let e of t.pageKeyToQuery.values())e.unsubscribe();this.paginatedQuerySet.delete(e)}}completePaginatedQuerySplit(e,t,n,r){let i=e.pageKeyToQuery.get(t);e.pageKeyToQuery.delete(t);let a=e.pageKeys.indexOf(t);e.pageKeys.splice(a,1,n,r),e.ongoingSplits.delete(t),i.unsubscribe()}activePageQueryTokens(e){return e.pageKeys.map(t=>e.pageKeyToQuery.get(t).queryToken)}allQueryTokens(e){return Array.from(e.pageKeyToQuery.values()).map(e=>e.queryToken)}queryTokenForLastPageOfPaginatedQuery(e){let t=this.mustGetPaginatedQuery(e),n=t.pageKeys[t.pageKeys.length-1];if(n===void 0)throw Error(`No pages for paginated query ${e}`);return t.pageKeyToQuery.get(n).queryToken}mustGetPaginatedQuery(e){let t=this.paginatedQuerySet.get(e);if(!t)throw Error(`paginated query no longer exists for token `+e);return t}},ui=Object.defineProperty,di=(e,t,n)=>t in e?ui(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,fi=(e,t,n)=>di(e,typeof t==`symbol`?t:t+``,n),pi=class{constructor(e,t={}){fi(this,`listeners`),fi(this,`_client`),fi(this,`_paginatedClient`),fi(this,`callNewListenersWithCurrentValuesTimer`),fi(this,`_closed`),fi(this,`_disabled`),t.skipConvexDeploymentUrlCheck!==!0&&sn(e);let{disabled:n,...r}=t;this._closed=!1,this._disabled=!!n,typeof window>`u`&&!(`unsavedChangesWarning`in r)&&(r.unsavedChangesWarning=!1),this.disabled||(this._client=new ii(e,()=>{},r),this._paginatedClient=new li(this._client,e=>this._transition(e))),this.listeners=/* @__PURE__ */ new Set}get closed(){return this._closed}get client(){if(this._client)return this._client;throw Error(`ConvexClient is disabled`)}get paginatedClient(){if(this._paginatedClient)return this._paginatedClient;throw Error(`ConvexClient is disabled`)}get disabled(){return this._disabled}onUpdate(e,t,n,r){if(this.disabled)return this.createDisabledUnsubscribe();let{queryToken:i,unsubscribe:a}=this.client.subscribe(I(e),t),o={queryToken:i,callback:n,onError:r,unsubscribe:a,hasEverRun:!1,query:e,args:t,paginationOptions:void 0};this.listeners.add(o),this.queryResultReady(i)&&this.callNewListenersWithCurrentValuesTimer===void 0&&(this.callNewListenersWithCurrentValuesTimer=setTimeout(()=>this.callNewListenersWithCurrentValues(),0));let s={unsubscribe:()=>{this.closed||(this.listeners.delete(o),a())},getCurrentValue:()=>this.client.localQueryResultByToken(i),getQueryLogs:()=>this.client.localQueryLogs(i)},c=s.unsubscribe;return Object.assign(c,s),c}onPaginatedUpdate_experimental(e,t,n,r,i){if(this.disabled)return this.createDisabledUnsubscribe();let a={initialNumItems:n.initialNumItems,id:-1},{paginatedQueryToken:o,unsubscribe:s}=this.paginatedClient.subscribe(I(e),t,a),c={queryToken:o,callback:r,onError:i,unsubscribe:s,hasEverRun:!1,query:e,args:t,paginationOptions:a};this.listeners.add(c),this.paginatedClient.localQueryResultByToken(o)&&this.callNewListenersWithCurrentValuesTimer===void 0&&(this.callNewListenersWithCurrentValuesTimer=setTimeout(()=>this.callNewListenersWithCurrentValues(),0));let l={unsubscribe:()=>{this.closed||(this.listeners.delete(c),s())},getCurrentValue:()=>this.paginatedClient.localQueryResult(I(e),t,a),getQueryLogs:()=>[]},u=l.unsubscribe;return Object.assign(u,l),u}callNewListenersWithCurrentValues(){this.callNewListenersWithCurrentValuesTimer=void 0,this._transition({queries:[],paginatedQueries:[]},!0)}queryResultReady(e){return this.client.hasLocalQueryResultByToken(e)}createDisabledUnsubscribe(){let e=(()=>{});return Object.assign(e,{unsubscribe:e,getCurrentValue:()=>void 0,getQueryLogs:()=>void 0}),e}async close(){if(!this.disabled)return this.listeners.clear(),this._closed=!0,this._paginatedClient&&(this._paginatedClient=void 0),this.client.close()}getAuth(){if(!this.disabled)return this.client.getCurrentAuthClaims()}setAuth(e,t){this.disabled||this.client.setAuth(e,t??(()=>{}))}setAdminAuth(e,t){if(this.closed)throw Error(`ConvexClient has already been closed.`);this.disabled||this.client.setAdminAuth(e,t)}_transition({queries:e,paginatedQueries:t},n=!1){let r=[...e.map(e=>e.token),...t.map(e=>e.token)];for(let e of this.listeners){let{callback:t,queryToken:i,onError:a,hasEverRun:o}=e,s=ar(i),c=s?!!this.paginatedClient.localQueryResultByToken(i):this.client.hasLocalQueryResultByToken(i);if(r.includes(i)||n&&!o&&c){e.hasEverRun=!0;let n;try{n=s?this.paginatedClient.localQueryResultByToken(i):this.client.localQueryResultByToken(i)}catch(e){if(!(e instanceof Error))throw e;a?a(e,`Second argument to onUpdate onError is reserved for later use`):Promise.reject(e);continue}t(n,`Second argument to onUpdate callback is reserved for later use`)}}}async mutation(e,t,n){if(this.disabled)throw Error(`ConvexClient is disabled`);return await this.client.mutation(I(e),t,n)}async action(e,t){if(this.disabled)throw Error(`ConvexClient is disabled`);return await this.client.action(I(e),t)}async query(e,t){if(this.disabled)throw Error(`ConvexClient is disabled`);let n=this.client.localQueryResult(I(e),t);return n===void 0?new Promise((n,r)=>{let{unsubscribe:i}=this.onUpdate(e,t,e=>{i(),n(e)},e=>{i(),r(e)})}):Promise.resolve(n)}connectionState(){if(this.disabled)throw Error(`ConvexClient is disabled`);return this.client.connectionState()}subscribeToConnectionState(e){return this.disabled?()=>{}:this.client.subscribeToConnectionState(e)}},W=class extends Error{constructor(e,t){super(e),this.code=t}};function mi(e){let t=e?.data;return t?.message?t.message:e instanceof Error?e.message:`Something went wrong`}var hi=class{constructor(e){this.config=e,C(this,`client`,void 0),this.client=new pi(e.convexUrl,{unsavedChangesWarning:!1,skipConvexDeploymentUrlCheck:!/\.convex\.cloud\/?$/.test(e.convexUrl)})}close(){return this.client.close()}touch(e){return this.client.mutation(L.projects.touch,{publicId:this.config.project,origin:e}).catch(()=>null)}onStatus(e){return this.client.onUpdate(L.projects.status,{publicId:this.config.project},e,()=>{})}onPage(e,t,n){return this.client.onUpdate(L.comments.listForPage,{publicId:this.config.project,path:e},e=>t(e),n)}onMine(e,t){return this.client.onUpdate(L.comments.listMine,{publicId:this.config.project,authorSecret:e},e=>t(e),()=>{})}onPages(e){return this.client.onUpdate(L.comments.pagesWithComments,{publicId:this.config.project},e,()=>{})}onSession(e,t){return this.client.onUpdate(L.sessions.validate,{publicId:this.config.project,sessionToken:e},t,()=>{})}onOwnerComment(e,t,n){return this.client.onUpdate(L.comments.getForOwner,{publicId:this.config.project,id:e,sessionToken:t},e=>n(e),()=>{})}onThread(e,t){return this.client.onUpdate(L.replies.listForComment,{publicId:this.config.project,commentId:e},e=>t(e),()=>{})}getComment(e){return this.client.query(L.comments.getById,{publicId:this.config.project,id:e}).then(e=>e).catch(()=>null)}async createComment(e){let t;try{t=await fetch(`${this.config.convexSiteUrl}/widget/comments`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({publicId:this.config.project,...e})})}catch{throw new W(`Couldn't reach Nuni. Check your connection.`,`network`)}let n=await t.json().catch(()=>({}));if(!t.ok||!n.id)throw new W(n.message??`Couldn't post the comment`,n.code??`error`);return n.id}async createReply(e){let t;try{t=await fetch(`${this.config.convexSiteUrl}/widget/replies`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({publicId:this.config.project,...e})})}catch{throw new W(`Couldn't reach Nuni. Check your connection.`,`network`)}let n=await t.json().catch(()=>({}));if(!t.ok||!n.id)throw new W(n.message??`Couldn't post the reply`,n.code??`error`);return n.id}uploadScreenshot(e,t,n){return this.upload(`screenshot`,e,t,n)}uploadImage(e,t,n){return this.upload(`image`,e,t,n)}async upload(e,t,n,r){let i=await fetch(`${this.config.convexSiteUrl}/widget/${e}`,{method:`POST`,headers:{"Content-Type":r.type,"X-Nuni-Project":this.config.project,"X-Nuni-Comment":t,"X-Nuni-Author":n},body:r});if(!i.ok){let e=await i.json().catch(()=>({}));throw new W(e.message??`Couldn't attach the image`,e.code??`error`)}}async run(e){try{return await e}catch(e){throw new W(mi(e),`error`)}}editOwn(e,t,n,r){return this.run(this.client.mutation(L.comments.editOwn,{id:e,authorSecret:t,body:n,suggestion:r}))}deleteOwn(e,t){return this.run(this.client.mutation(L.comments.deleteOwn,{id:e,authorSecret:t}))}resolve(e,t,n){return this.run(this.client.mutation(L.comments.resolve,{id:e,resolution:n,sessionToken:t}))}repin(e,t,n){return this.run(this.client.mutation(L.comments.repin,{id:e,anchor:t,sessionToken:n}))}async reportPins(e,t,n){try{await fetch(`${this.config.convexSiteUrl}/widget/pins`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({publicId:this.config.project,path:e,lost:t,found:n}),keepalive:!0})}catch{}}reopen(e,t){return this.run(this.client.mutation(L.comments.reopen,{id:e,sessionToken:t}))}editReply(e,t,n){return this.run(this.client.mutation(L.replies.editOwn,{id:e,authorSecret:t,body:n}))}deleteReply(e,t){return this.run(this.client.mutation(L.replies.deleteOwn,{id:e,authorSecret:t}))}removeReply(e,t){return this.run(this.client.mutation(L.replies.remove,{id:e,sessionToken:t}))}toggleReaction(e,t,n,r){return this.run(this.client.mutation(L.reactions.toggle,{publicId:this.config.project,commentId:e,targetId:t,emoji:n,authorSecret:r}))}remove(e,t){return this.run(this.client.mutation(L.comments.remove,{id:e,sessionToken:t}))}};let gi=[`image/png`,`image/jpeg`,`image/webp`];function _i(e,t,n){return new Promise(r=>e.toBlob(r,t,n))}async function vi(e,t){for(let[n,r]of[[`image/webp`,.82],[`image/jpeg`,.8],[`image/jpeg`,.55]]){let i=await _i(e,n,r);if(i&&i.type===n&&i.size<=t)return i}return null}async function yi(e){if(!gi.includes(e.type))return null;let t;try{t=await createImageBitmap(e)}catch{return null}let n=Math.min(1,b.imageMaxSide/Math.max(t.width,t.height)),r=document.createElement(`canvas`);r.width=Math.max(1,Math.round(t.width*n)),r.height=Math.max(1,Math.round(t.height*n));try{let e=r.getContext(`2d`);if(!e)return null;e.fillStyle=`#fff`,e.fillRect(0,0,r.width,r.height),e.drawImage(t,0,0,r.width,r.height)}finally{t.close()}return vi(r,b.imageMaxBytes)}function G(e,t={},...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t))n!=null&&n!==!1&&(e.startsWith(`on`)&&typeof n==`function`?r.addEventListener(e.slice(2).toLowerCase(),n):e===`class`?r.className=String(n):n===!0?r.setAttribute(e,``):r.setAttribute(e,String(n)));for(let e of n.flat())e!=null&&e!==!1&&r.append(typeof e==`string`?document.createTextNode(e):e);return r}function K(e){let t=document.createElement(`span`);t.className=`icon`,t.setAttribute(`aria-hidden`,`true`);let n=new DOMParser().parseFromString(e,`image/svg+xml`);return t.append(document.importNode(n.documentElement,!0)),t}function bi(e){let t=e.trim().split(/\s+/).filter(Boolean);return(t.length>1?t[0][0]+t[t.length-1][0]:(t[0]??`?`).slice(0,2)).toUpperCase()}function xi(e){let t=0;for(let n of e)t=t*31+n.charCodeAt(0)>>>0;return`oklch(0.5 0.17 ${t%360})`}async function Si(e){try{return await navigator.clipboard.writeText(e),!0}catch{}let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.cssText=`position:fixed;top:0;left:0;opacity:0`,document.body.appendChild(t),t.select();try{return document.execCommand(`copy`)}catch{return!1}finally{t.remove()}}function Ci(e){let t=document.createElement(`span`);if(t.style.color=e,!t.style.color)return null;t.style.display=`none`,document.documentElement.appendChild(t);let n=getComputedStyle(t).color;if(t.remove(),/^rgba?\(/.test(n)){let e=n.match(/[\d.]+/g)?.map(Number);if(e&&e.length>=3)return[e[0],e[1],e[2]]}try{let t=document.createElement(`canvas`);t.width=t.height=1;let n=t.getContext(`2d`);if(!n)return null;n.fillStyle=e,n.fillRect(0,0,1,1);let[r,i,a]=n.getImageData(0,0,1,1).data;return[r,i,a]}catch{return null}}function wi([e,t,n]){let r=e=>{let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4},i=.2126*r(e)+.7152*r(t)+.0722*r(n);return 1.05/(i+.05)>=(i+.05)/.05?`#ffffff`:`#111111`}let Ti={toolbar:`Nuni comments`,comment:`Comment`,addComment:`Add a comment`,addCommentKey:`Add a comment ({key})`,cancelAdding:`Cancel adding a comment`,pickElement:`Pick an element`,allComments:`All comments`,openCount:`Comments on this page: {count} open`,commentSelection:`Comment on the selected text`,commentSelectionKey:`Comment on the selected text ({key})`,pickHint:`Click anything to comment, or drag to mark an area`,pickHintMobile:`Tap anything to comment`,pickHintKeys:`Arrow keys move, Enter comments, Esc cancels`,picked:`Selected {element}`,comments:`Comments`,close:`Close`,tabOpen:`Open ({count})`,tabResolved:`Resolved ({count})`,tabYours:`Yours ({count})`,yours:`Yours`,noYours:`Comments you leave on any page of this site show here.`,thisPage:`This page`,statusOpen:`Open`,loading:`Loading…`,noOpen:`No open comments on this page.`,noOpenKey:`No open comments on this page. Press {key} to add one.`,noResolved:`Nothing resolved yet.`,notFoundHere:`Couldn't find on this page`,searchComments:`Search comments`,noMatches:`No comments match “{query}”.`,otherPages:`Other pages`,openOnPage:`{count} open`,replyCount:{one:`{count} reply`,other:`{count} replies`},edited:`edited`,ownSite:`Own this website?`,claim:`Claim Nuni`,yourName:`Your name`,leaveComment:`Leave a comment`,notYou:`Not you?`,cancel:`Cancel`,post:`Post`,posting:`Posting…`,save:`Save`,send:`{key} + Enter`,charsLeft:{one:`{count} character left`,other:`{count} characters left`},suggestEdit:`Suggest an edit`,suggestedEdit:`Suggested edit`,removeSuggestion:`Remove`,newText:`New text`,addNote:`Add a note (optional)`,addImage:`Add an image`,markUpScreenshot:`Mark up a screenshot`,preparingScreenshot:`Taking the screenshot…`,markUpTitle:`Mark up the screenshot`,markUpBox:`Box`,markUpArrow:`Arrow`,markUpPen:`Pen`,markUpUndo:`Undo`,markUpDone:`Attach`,markUpFailed:`Couldn't save the drawing as an image. Try again.`,imagesPublic:`Images are shown to everyone who can see this comment.`,imageN:`Image {n}`,removeImage:`Remove image {n}`,openImage:`Open the image`,pinLabel:`Comment by {name}: {body}`,commentBy:`Comment by {name}`,openScreenshot:`Open the screenshot`,screenshotTaken:`Screenshot taken when the comment was left`,resolved:`Resolved`,leftOn:`Left on {origin}`,approximate:`Approximate`,approximateHint:`The page changed; this pin is a best guess`,notFound:`Element not found`,originallyOn:`Originally on: {text}`,resolve:`Resolve`,reopen:`Reopen`,copyForAgent:`Copy for agent`,copyNewText:`Copy new text`,movePin:`Move pin`,movePinHint:`Click the element this comment is about`,pinMoved:`Pin moved`,closeOutdated:`Close as outdated`,closedOutdated:`Closed as outdated`,outdated:`Outdated`,lostHint:`This element isn't on the page any more. Move the pin to where it is now, or close the comment if it no longer applies.`,newTextCopied:`New text copied`,copyForAgentHint:`Copy for your coding agent`,loadingContext:`Loading page context…`,edit:`Edit`,delete:`Delete`,owner:`Owner`,addReaction:`Add a reaction`,reactions:`Reactions`,reactWith:`React with {emoji}`,reply:`Reply`,replyFirst:`Reply to start a thread`,sendReply:`Send reply`,editReply:`Edit reply`,deleteReply:`Delete reply`,confirmDeleteComment:`Delete this comment? This can't be undone.`,confirmDeleteReply:`Delete this reply?`,added:`Comment added`,saved:`Saved`,deleted:`Deleted`,replyDeleted:`Reply deleted`,reopened:`Reopened`,copied:`Copied for your coding agent`,copyFailed:`Couldn't copy`,signedIn:`You're signed in as the owner`,linkGone:`That comment was deleted or is on another page`,enterName:`Enter your name`,writeFirst:`Write a comment first`,changeTextFirst:`Change the text to suggest an edit`,tooManyImages:`Add up to {count} images`,imageUnreadable:`Attach a PNG, JPEG or WebP image`,imageFailed:`Couldn't attach an image`,noScreenshot:`Couldn't take a screenshot of this element`,suggestionTooLong:`Suggestions are limited to {count} characters`,commentTooLong:`Comments are limited to {count} characters`,replyTooLong:`Replies are limited to {count} characters`,postFailed:`Couldn't post the comment`,replyFailed:`Couldn't post the reply`,reactFailed:`Couldn't react`,failed:`Something went wrong`,justNow:`just now`};function Ei(){if(typeof navigator>`u`)return!1;let e=navigator.userAgentData?.platform??navigator.platform??``;return/mac|iphone|ipad|ipod/i.test(e||navigator.userAgent)}function Di(e,t={}){let n={...Ti,...t},r=null,i=null;try{r=new Intl.PluralRules(e),i=new Intl.RelativeTimeFormat(e,{numeric:`auto`,style:`narrow`})}catch{r=new Intl.PluralRules,i=new Intl.RelativeTimeFormat(void 0,{numeric:`auto`,style:`narrow`})}let a=(e,t={})=>{let i=n[e]??Ti[e];return(typeof i==`string`?i:i[r.select(Number(t.count??0))]??i.other).replace(/\{(\w+)\}/g,(e,n)=>n in t?String(t[n]):e)};return{locale:e,t:a,timeAgo:(t,n=Date.now())=>{let r=Math.max(0,Math.round((n-t)/1e3));if(r<45)return a(`justNow`);let o=Math.round(r/60);if(o<60)return i.format(-o,`minute`);let s=Math.round(o/60);if(s<24)return i.format(-s,`hour`);let c=Math.round(s/24);if(c<30)return i.format(-c,`day`);try{return new Date(t).toLocaleDateString(e)}catch{return new Date(t).toLocaleDateString()}},mod:Ei()?`⌘`:`Ctrl`}}let q=e=>`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${e}</svg>`,J={comment:q(`<path d="M21 12a8 8 0 0 1-11.6 7.1L4 20l1-4.6A8 8 0 1 1 21 12z"/>`),list:q(`<path d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"/>`),close:q(`<path d="M18 6 6 18M6 6l12 12"/>`),check:q(`<path d="M20 6 9 17l-5-5"/>`),undo:q(`<path d="M3 7v6h6"/><path d="M21 17a9 9 0 0 0-15-6.7L3 13"/>`),trash:q(`<path d="M3 6h18M8 6V4h8v2M19 6l-1 14H6L5 6"/>`),edit:q(`<path d="M12 20h9"/><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"/>`),send:q(`<path d="m22 2-7 20-4-9-9-4z"/><path d="M22 2 11 13"/>`),bot:q(`<path d="M12 8V4H8"/><rect width="16" height="12" x="4" y="8" rx="2"/><path d="M2 14h2M20 14h2M15 13v2M9 13v2"/>`),smile:q(`<circle cx="12" cy="12" r="9"/><path d="M8 14s1.5 2 4 2 4-2 4-2M9 9h.01M15 9h.01"/>`),user:q(`<circle cx="12" cy="8" r="4"/><path d="M4 21a8 8 0 0 1 16 0"/>`),arrowUp:q(`<path d="M12 19V5M5 12l7-7 7 7"/>`),search:q(`<circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/>`),target:q(`<circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="3"/>`),image:q(`<rect width="18" height="18" x="3" y="3" rx="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.1-3.1a2 2 0 0 0-2.8 0L6 21"/>`),pen:q(`<path d="m12 19 7-7 3 3-7 7z"/><path d="m18 13-1.5-7.5L2 2l3.5 14.5L13 18z"/><path d="m2 2 7.6 7.6"/><circle cx="11" cy="11" r="2"/>`),github:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="currentColor"><path d="M12 .5a11.5 11.5 0 0 0-3.6 22.4c.6.1.8-.3.8-.6v-2c-3.2.7-3.9-1.5-3.9-1.5-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.8 1.3 3.5 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2a11 11 0 0 1 5.8 0c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.9 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.3c0 .3.2.7.8.6A11.5 11.5 0 0 0 12 .5z"/></svg>`,link:q(`<path d="M15 3h6v6M10 14 21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>`)},Oi=`nuni:locationchange`,ki=!1;function Ai(e){if(!ki){ki=!0;for(let e of[`pushState`,`replaceState`]){let t=history[e];history[e]=function(...e){let n=t.apply(this,e);return window.dispatchEvent(new Event(Oi)),n}}}let t=location.href,n=()=>{location.href!==t&&(t=location.href,e())};window.addEventListener(Oi,n),window.addEventListener(`popstate`,n),window.addEventListener(`hashchange`,n);let r=window.navigation,i=()=>setTimeout(n,0);return r?.addEventListener(`navigatesuccess`,i),()=>{window.removeEventListener(Oi,n),window.removeEventListener(`popstate`,n),window.removeEventListener(`hashchange`,n),r?.removeEventListener(`navigatesuccess`,i)}}async function ji(e){let t=new TextEncoder().encode(e);if(typeof crypto<`u`&&crypto.subtle){let e=await crypto.subtle.digest(`SHA-256`,t);return Mi(new Uint8Array(e))}return Mi(Pi(t))}function Mi(e){return Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``)}let Ni=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function Pi(e){let t=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),n=e.length*8,r=new Uint8Array(e.length+9+63>>6<<6);r.set(e),r[e.length]=128;let i=new DataView(r.buffer);i.setUint32(r.length-4,n>>>0),i.setUint32(r.length-8,Math.floor(n/2**32));let a=/* @__PURE__ */ new Uint32Array(64),o=(e,t)=>e>>>t|e<<32-t;for(let e=0;e<r.length;e+=64){for(let t=0;t<16;t++)a[t]=i.getUint32(e+t*4);for(let e=16;e<64;e++){let t=a[e-15],n=a[e-2],r=o(t,7)^o(t,18)^t>>>3,i=o(n,17)^o(n,19)^n>>>10;a[e]=a[e-16]+r+a[e-7]+i>>>0}let[n,r,s,c,l,u,d,f]=t;for(let e=0;e<64;e++){let t=o(l,6)^o(l,11)^o(l,25),i=l&u^~l&d,p=f+t+i+Ni[e]+a[e]>>>0,m=(o(n,2)^o(n,13)^o(n,22))+(n&r^n&s^r&s)>>>0;f=d,d=u,u=l,l=c+p>>>0,c=s,s=r,r=n,n=p+m>>>0}t[0]=t[0]+n>>>0,t[1]=t[1]+r>>>0,t[2]=t[2]+s>>>0,t[3]=t[3]+c>>>0,t[4]=t[4]+l>>>0,t[5]=t[5]+u>>>0,t[6]=t[6]+d>>>0,t[7]=t[7]+f>>>0}let s=/* @__PURE__ */ new Uint8Array(32),c=new DataView(s.buffer);return t.forEach((e,t)=>c.setUint32(t*4,e)),s}function Fi(e,t){e.scrollIntoView({block:`center`,inline:`center`,behavior:`instant`});let n=e;for(;n;){let e=n.parentElement;if(e){let r=e.ownerDocument.defaultView?.getComputedStyle(e),i=r&&/auto|scroll|hidden/.test(r.overflowX),a=r&&/auto|scroll|hidden/.test(r.overflowY);if(e!==e.ownerDocument.scrollingElement&&(i||a)){let n=D(e,document),r=t();e.scrollBy({left:i?r.x-n.left-e.clientLeft-e.clientWidth/2:0,top:a?r.y-n.top-e.clientTop-e.clientHeight/2:0,behavior:`instant`})}n=e;continue}let r=n.getRootNode();if(E(r)){n=r.host;continue}let i=n.ownerDocument,a=i.defaultView,o=Ye(i);if(a){let e=t(),n=o?D(o,document):{left:0,top:0};a.scrollBy({left:e.x-n.left-(o?.clientLeft??0)-a.innerWidth/2,top:e.y-n.top-(o?.clientTop??0)-a.innerHeight/2,behavior:`instant`})}n=o}}let Ii=/* @__PURE__ */ new Map;function Li(e){try{return window.localStorage.getItem(e)}catch{return Ii.get(e)??null}}function Y(e,t){try{t===null?window.localStorage.removeItem(e):window.localStorage.setItem(e,t)}catch{t===null?Ii.delete(e):Ii.set(e,t)}}let X={name:`nuni:name`,secret:`nuni:author-secret`,session:e=>`nuni:session:${e}`,position:e=>`nuni:position:${e}`,lastViewed:e=>`nuni:last-viewed:${e}`};function Ri(e,t){if(e.quote)return e.quote.exact;if(e.region||!e.text||/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName)||e.text.length>=b.anchorTextMaxLength)return null;for(let e of t.querySelectorAll(`*`))if(w(e))return null;return e.text}function zi(e,t,n){return G(`div`,{class:`suggest`},G(`div`,{class:`suggest-label`},t,n),G(`del`,{},e.before),G(`ins`,{},e.after))}function Bi(e){return G(`div`,{class:`item-quote item-suggest`},G(`del`,{},e.before),` → `,G(`ins`,{},e.after))}let Vi=[`open`,`resolved`,`mine`],Hi=`nuni-picking`,Ui=[`pointerdown`,`mousedown`,`pointerup`,`mouseup`];function Wi(e){return Array.from(e.getClientRects()).filter(e=>e.width>0&&e.height>0)}function Gi(e,t){let n=e.region;if(!n)return null;let r=D(t,document);return{left:r.left+n.x*r.width,top:r.top+n.y*r.height,width:n.w*r.width,height:n.h*r.height}}let Ki=e=>e.replace(/\s+/g,` `).trim();function qi(e){typeof requestIdleCallback==`function`?requestIdleCallback(e,{timeout:100}):setTimeout(e,0)}function Ji(e,t=0){if(t>3)return[];let n=[];for(let r of Array.from(e.querySelectorAll(`iframe`))){let e=Xe(r);e?.documentElement&&n.push(e,...Ji(e,t+1))}return n}let Yi=`(max-width: 640px)`;function Xi(e){for(let t of e.images??[])URL.revokeObjectURL(t.url)}function Zi(e){if(!e||e.nodeType!==1)return!1;let t=e;return t.isContentEditable||t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.tagName===`SELECT`}function Qi(e){return G(`span`,{class:`avatar`,style:`background:${xi(e)}`},bi(e))}function $i(e){let t=e.tagName.toLowerCase(),n=e.id?`#${e.id}`:``,r=Array.from(e.classList).slice(0,2).map(e=>`.${e}`).join(``),i=w(e,40);return`${t}${n}${r}${i?` "${i}"`:``}`}function ea(e,t){let n=ta(e.page.path,t);if(n===null)return null;let r=new URL(n);return r.searchParams.set(`nuni`,e._id),r.toString()}function ta(e,t){let n=/[?#]/.test(e)?t.origin+e:t.origin+e+t.search;try{return new URL(n).origin===t.origin?n:null}catch{return null}}var na=class{constructor(e,t){this.config=e,this.runtime=t,C(this,`host`,void 0),C(this,`root`,void 0),C(this,`markLayer`,void 0),C(this,`pinLayer`,void 0),C(this,`overlayLayer`,void 0),C(this,`selectButton`,void 0),C(this,`uiLayer`,void 0),C(this,`modalLayer`,void 0),C(this,`markingUp`,!1),C(this,`api`,void 0),C(this,`cleanups`,[]),C(this,`pageUnsub`,null),C(this,`sessionUnsub`,null),C(this,`pageKey`,``),C(this,`comments`,[]),C(this,`loaded`,!1),C(this,`placements`,/* @__PURE__ */ new Map),C(this,`pins`,/* @__PURE__ */ new Map),C(this,`status`,null),C(this,`pages`,[]),C(this,`picking`,!1),C(this,`panelOpen`,!1),C(this,`tab`,`open`),C(this,`mine`,null),C(this,`mineUnsub`,null),C(this,`repinId`,null),C(this,`pinReported`,/* @__PURE__ */ new Map),C(this,`pinReportTimer`,0),C(this,`search`,``),C(this,`lastViewedId`,void 0),C(this,`card`,null),C(this,`activeId`,null),C(this,`hoverEl`,null),C(this,`toastTimer`,0),C(this,`toast`,null),C(this,`name`,Li(X.name)??``),C(this,`secret`,void 0),C(this,`secretHash`,``),C(this,`ownerToken`,void 0),C(this,`ownerName`,null),C(this,`deepLinkId`,null),C(this,`extraComment`,null),C(this,`ownerDetail`,null),C(this,`ownerDetailId`,null),C(this,`ownerDetailLoaded`,!1),C(this,`ownerDetailUnsub`,null),C(this,`thread`,null),C(this,`threadId`,null),C(this,`threadUnsub`,null),C(this,`resolveRun`,0),C(this,`scopeWatchers`,/* @__PURE__ */ new Map),C(this,`pickDocs`,[]),C(this,`dragStart`,null),C(this,`dragBox`,null),C(this,`dragEnded`,!1),C(this,`selection`,null),C(this,`pointerDown`,!1),C(this,`selectionFrame`,0),C(this,`returnFocus`,null),C(this,`focusNext`,null),C(this,`confirming`,null),C(this,`live`,void 0),C(this,`layoutFrame`,0),C(this,`pinPositions`,/* @__PURE__ */ new Map),C(this,`resolveTimer`,0),C(this,`shownPlacements`,``),C(this,`i18n`,void 0),C(this,`position`,void 0),C(this,`toolbarDrag`,null),C(this,`endToolbarDrag`,null),C(this,`toolbarDropped`,!1),C(this,`isIgnored`,e=>e===this.host||this.host.contains(e)),C(this,`onFrameKey`,e=>this.onKeyDown(e)),C(this,`swallow`,e=>{if(this.fromPage(e)){if(e.type===`pointerdown`&&e instanceof PointerEvent){let t=this.fromPage(e);t&&(this.hoverEl=Yt(t),this.renderHighlight()),this.dragEnded=!1,this.dragStart=e.pointerType!==`touch`&&e.button===0&&(t?.ownerDocument??null)===document?{x:e.clientX,y:e.clientY}:null}if(e.type===`pointerup`&&this.dragBox){let e=this.dragBox;this.dragStart=null,this.dragBox=null,this.dragEnded=!0,setTimeout(()=>{this.dragEnded=!1,this.picking&&this.commentOnArea(e)},0)}else e.type===`pointerup`&&(this.dragStart=null);e.preventDefault(),e.stopPropagation()}}),C(this,`onPickMove`,e=>{let t=this.dragStart;if(t){let n=e.clientX-t.x,r=e.clientY-t.y;if(this.dragBox||Math.hypot(n,r)>6){this.dragBox={left:Math.min(t.x,e.clientX),top:Math.min(t.y,e.clientY),width:Math.abs(n),height:Math.abs(r)},this.renderHighlight();return}}let n=this.fromPage(e),r=n?Yt(n):null;r!==this.hoverEl&&(this.hoverEl=r,this.renderHighlight())}),C(this,`onPickClick`,e=>{let t=this.fromPage(e);if(!t||(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),this.dragEnded))return;let n=Yt(t),r=St(n,{x:e.clientX,y:e.clientY},{ignoreAttributePrefixes:[],document});this.openComposer({anchor:r,element:n})}),this.i18n=Di(e.locale,e.messages);let n=Li(X.secret);n||(n=y(),Y(X.secret,n)),this.secret=n,this.ownerToken=Li(X.session(e.project)),this.lastViewedId=Li(X.lastViewed(e.project)),this.position=ie(Li(X.position(e.project))??void 0,ne,e.position),this.host=document.createElement(`div`),this.host.id=`nuni-root`,this.host.setAttribute(`data-nuni`,``),this.applyAppearance(),this.root=this.host.attachShadow({mode:`open`});let r=document.createElement(`style`);r.textContent=`
6
+ `)}let h=`123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz`,g=RegExp(`^nuni_[${h}]{22}$`);function ee(e){let t=new Uint8Array(e);crypto.getRandomValues(t);let n=``;for(let e of t){let t=e;for(;t>=232;){let e=/* @__PURE__ */ new Uint8Array(1);crypto.getRandomValues(e),t=e[0]}n+=h[t%58]}return n}function _(e){return typeof e==`string`&&g.test(e)}function v(){return ee(32)}let y={bodyMaxLength:2e3,nameMaxLength:50,unclaimedCommentCap:500,maxOriginsPerProject:20,sessionTtlMs:2592e6,cliSessionTtlMs:7776e6,transferTtlMs:6048e5,bulkMax:100,pinReportMax:200,lostCountMax:99,cliLoginTtlMs:6e5,anchorTextMaxLength:120,quoteMaxLength:500,quoteContextLength:32,pageOpenLimit:1e3,pageResolvedLimit:200,yoursLimit:100,contextEntryMax:20,contextMessageMaxLength:500,domSnippetMaxLength:4e3,screenshotMaxBytes:6e5,imagesPerComment:3,imageMaxBytes:6e5,imageMaxSide:1600,repliesPerComment:200,reactionsPerComment:2e3,screenshotUploadWindowMs:3e5},te=[`👍`,`❤️`,`🎉`,`👀`,`✅`,`😄`],ne=`data-nuni-mask`,b=`[${ne}]`;function x(e){return{project:e.project,convexUrl:e.convexUrl??`https://greedy-giraffe-33.convex.cloud`,convexSiteUrl:e.convexSiteUrl??`https://greedy-giraffe-33.convex.site`,appUrl:(e.appUrl??`https://nuni.praveenjuge.com`).replace(/\/$/,``),getPageKey:e.getPageKey??se(e.pageKey),position:ae(e.position,re,`bottom-right`),accentColor:e.accentColor?.trim()||null,theme:ae(e.theme,ie,`auto`),label:e.label?.trim()||null,hotkey:e.hotkey===!1?null:e.hotkey?.trim().slice(0,1).toLowerCase()||`c`,zIndex:typeof e.zIndex==`number`&&Number.isFinite(e.zIndex)?Math.round(e.zIndex):null,locale:e.locale?.trim()||void 0,messages:e.messages??{},images:e.images??!0,capture:{console:e.capture?.console??!0,network:e.capture?.network??!0,dom:e.capture?.dom??!0,screenshot:e.capture?.screenshot??!0}}}let re=[`bottom-right`,`bottom-center`,`bottom-left`,`top-right`,`top-center`,`top-left`],ie=[`auto`,`light`,`dark`];function ae(e,t,n){return t.includes(e)?e:n}let oe=/^(nuni|utm_.*|fbclid|gclid|msclkid|ref)$/i;function se(t=`path`){return n=>{let r=e(n);if(t===`path+search`){let e=[...n.searchParams].filter(([e])=>!oe.test(e)).sort(([e],[t])=>e<t?-1:+(e>t));return e.length?`${r}?${new URLSearchParams(e).toString()}`:r}return t===`path+hash`&&n.hash.length>1&&!r.includes(`#`)&&!/^#!?\//.test(n.hash)?`${r}${n.hash}`:r}}let ce=Symbol.for(`nuni.capture`);function le(e){"@babel/helpers - typeof";return le=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},le(e)}function ue(e,t){if(le(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(le(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function de(e){var t=ue(e,`string`);return le(t)==`symbol`?t:t+``}function S(e,t,n){return(t=de(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}let fe=y.contextMessageMaxLength;function pe(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=e.stack?.split(`
7
+ `).find(e=>e.trim().startsWith(`at `));return`${e.name}: ${e.message}${t?` (${t.trim()})`:``}`}try{let t=200;return JSON.stringify(e,(e,n)=>t-->0?n:void 0)??String(e)}catch{return String(e)}}function me(e){return e.length>fe?`${e.slice(0,fe-1)}…`:e}function he(e){return me(i(e,location.href))}var ge=class{constructor(){S(this,`items`,[])}push(e){this.items.push(e),this.items.length>y.contextEntryMax&&this.items.shift()}};function _e(e,t){let n=new ge,r=new ge,i=[],a=(e,t)=>{n.push({level:e,message:me(o(t.map(pe).join(` `))),at:Date.now()})},s=(e,n,i)=>{t(n)||r.push({method:e.toUpperCase(),url:he(n),status:i,at:Date.now()})};if(e.console){for(let e of[`error`,`warn`]){let t=console[e],n=(...n)=>{a(e,n),t.apply(console,n)};console[e]=n,i.push(()=>{console[e]===n&&(console[e]=t)})}let e=e=>{e.error?a(`error`,[e.error]):a(`error`,[`${e.message}${e.filename?` (${he(e.filename)}:${e.lineno})`:``}`])},t=e=>a(`error`,[`Unhandled rejection:`,e.reason]);window.addEventListener(`error`,e),window.addEventListener(`unhandledrejection`,t),i.push(()=>{window.removeEventListener(`error`,e),window.removeEventListener(`unhandledrejection`,t)})}if(e.network){let e=window.fetch;if(typeof e==`function`){let t=async(t,n)=>{if(n&&n[ce])return e.call(window,t,n);let r=typeof t==`string`?t:t instanceof URL?t.href:t.url,i=n?.method??(typeof t==`object`&&`method`in t?t.method:`GET`);try{let a=await e.call(window,t,n);return!a.ok&&a.type!==`opaque`&&s(i,r,a.status),a}catch(e){throw e instanceof DOMException&&e.name===`AbortError`||s(i,r,0),e}};window.fetch=t,i.push(()=>{window.fetch===t&&(window.fetch=e)})}let t=window.XMLHttpRequest?.prototype;if(t){let e=t.open,n=t.send,r=/* @__PURE__ */ new WeakMap,a=function(t,n,...i){return r.set(this,{method:t,url:String(n)}),e.call(this,t,n,...i)};t.open=a;let o=function(e){let t=r.get(this);if(t){let e=!1,n=()=>e=!0,r=()=>{this.removeEventListener(`abort`,n),this.removeEventListener(`loadend`,r),!e&&(this.status===0||this.status>=400)&&s(t.method,t.url,this.status)};this.addEventListener(`abort`,n),this.addEventListener(`loadend`,r)}return n.call(this,e)};t.send=o,i.push(()=>{t.open===a&&(t.open=e),t.send===o&&(t.send=n)})}}return{console:()=>[...n.items],network:()=>[...r.items],stop(){for(let e of i.splice(0))e()}}}let ve=[`display`,`position`,`width`,`height`,`margin`,`padding`,`gap`,`font-family`,`font-size`,`font-weight`,`line-height`,`letter-spacing`,`text-align`,`color`,`background-color`,`border`,`border-radius`,`box-shadow`,`opacity`];function ye(e,t){e.replaceChildren(e.ownerDocument.createComment(` ${t} `))}function be(e){let t=e.ownerDocument.createTreeWalker(e,5),n=[];for(let r=e;r;r=t.nextNode()){if(r.nodeType===3){let e=r.textContent??``;e.length>200&&(r.textContent=`${e.slice(0,200)}…`);continue}let e=r,t=e.tagName;if(t===`SCRIPT`||t===`STYLE`||t===`NOSCRIPT`){n.push(e);continue}if(e.hasAttribute(`data-nuni-mask`)){for(let t of Array.from(e.attributes))t.name!==`id`&&t.name!==`class`&&t.name!==`data-nuni-mask`&&e.removeAttribute(t.name);ye(e,`masked`);continue}if((t===`INPUT`||t===`TEXTAREA`)&&(e.removeAttribute(`value`),t===`TEXTAREA`&&(e.textContent=``)),t===`SELECT`||t===`DATALIST`){let t=e.getElementsByTagName(`option`).length;ye(e,`${t} options`)}for(let t of Array.from(e.attributes))t.value.length>200&&e.setAttribute(t.name,`${t.value.slice(0,200)}…`)}for(let e of n)e.parentNode?.removeChild(e)}function xe(e,t){let n=e.cloneNode(!1);if(t>0)for(let r of Array.from(e.childNodes))n.appendChild(r.nodeType===1?xe(r,t-1):r.cloneNode(!1));else e.childElementCount&&n.appendChild(e.ownerDocument.createComment(` ${e.childElementCount} more `));return n}function Se(e){let t=y.domSnippetMaxLength,n=``,r=!!e.parentElement?.closest(`[${ne}]`);for(let i of r?[-1]:[1/0,3,1,0]){let r=i===1/0?e.cloneNode(!0):xe(e,Math.max(0,i));if(i<0&&r.setAttribute(ne,``),be(r),n=l(r.outerHTML),n.length<=t)break}n.length>t&&(n=`${n.slice(0,t-1)}…`);let i={},a=e.ownerDocument.defaultView?.getComputedStyle(e);for(let e of ve){let t=a?.getPropertyValue(e).trim();t&&(i[e]=t)}return{html:n,styles:i}}function Ce(e){let t=Object.keys(e).find(e=>e.startsWith(`__reactFiber$`)||e.startsWith(`__reactInternalInstance$`));if(!t)return;let n=e[t]??null;for(let e=0;n&&e<30;e++){let e=n.type;if(e&&typeof e!=`string`){let t=e.displayName||e.name||e.render?.name;if(t&&t.length>2&&/^[A-Z]/.test(t))return t}n=n.return??null}}function we(e){let t=e.getBoundingClientRect(),n=e.ownerDocument.defaultView,r=n?.scrollX??0,i=n?.scrollY??0;return{x:t.left+r,y:t.top+i,w:t.width,h:t.height}}function Te(e){let t=e.defaultView;return{w:t?.innerWidth??0,h:t?.innerHeight??0,dpr:t?.devicePixelRatio??1,scrollX:t?.scrollX??0,scrollY:t?.scrollY??0}}function Ee(e){let t=e.documentElement;return{w:t.scrollWidth,h:t.scrollHeight}}function De(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):.5}function Oe(e){if(!e.isConnected)return!1;let t=e.ownerDocument.defaultView,n=e.getBoundingClientRect();if(n.width===0&&n.height===0)return!1;let r=t?.getComputedStyle(e);return!r||r.visibility!==`hidden`&&r.display!==`none`}function ke(e,t){let n=t.ignoreAttributePrefixes;return!n||!n.some(t=>e.startsWith(t))}let Ae=/* @__PURE__ */ new Set([`SCRIPT`,`STYLE`,`NOSCRIPT`,`TEMPLATE`,`SVG`]);function je(e){return e.replace(/\s+/g,` `).trim()}function C(e,t=120){if(e.closest(b))return``;if(e.tagName===`INPUT`||e.tagName===`TEXTAREA`)return je(e.placeholder||e.getAttribute(`aria-label`)||``).slice(0,t);let n=``,r=e=>{if(n.length>t*2)return;if(e.nodeType===3){n+=e.nodeValue??``;return}if(e.nodeType!==1)return;let i=e.tagName.toUpperCase();if(Ae.has(i)||e.hasAttribute(`data-nuni-mask`)||e.hasAttribute(`data-nuni`))return;if(i===`IMG`){n+=` `+(e.getAttribute(`alt`)??``)+` `;return}let a=e.shadowRoot;if(a){for(let e of Array.from(a.childNodes))r(e);return}if(i===`SLOT`){let t=e.assignedNodes?.({flatten:!0});if(t?.length){for(let e of t)r(e);return}}for(let t of Array.from(e.childNodes))r(t);(i===`BR`||i===`P`||i===`DIV`||i===`LI`)&&(n+=` `)};return r(e),je(n).slice(0,t)}function Me(e){let t=e.toLowerCase(),n=/* @__PURE__ */ new Map;for(let e=0;e<t.length-1;e++){let r=t.slice(e,e+2);n.set(r,(n.get(r)??0)+1)}return n}function w(e,t){if(e===t)return 1;let n=e.toLowerCase(),r=t.toLowerCase();if(n===r)return 1;if(n.length<2||r.length<2)return 0;let i=Me(n),a=Me(r),o=0;for(let[e,t]of i){let n=a.get(e);n&&(o+=Math.min(t,n))}return 2*o/(n.length-1+(r.length-1))}let Ne=/* @__PURE__ */ new Set([`SCRIPT`,`STYLE`,`NOSCRIPT`,`TEMPLATE`,`SVG`]),Pe=/* @__PURE__ */ new Set(/* @__PURE__ */ `ADDRESS.ARTICLE.ASIDE.BLOCKQUOTE.BR.DD.DIV.DL.DT.FIGCAPTION.FIGURE.FOOTER.FORM.H1.H2.H3.H4.H5.H6.HEADER.HR.LI.MAIN.NAV.OL.P.PRE.SECTION.TABLE.TD.TH.TR.UL`.split(`.`)),Fe=/* @__PURE__ */ new Set(/* @__PURE__ */ `A.ABBR.B.BDI.BDO.CITE.CODE.DATA.DEL.DFN.EM.I.INS.KBD.LABEL.MARK.Q.S.SAMP.SMALL.SPAN.STRONG.SUB.SUP.TIME.U.VAR`.split(`.`)),Ie=2e4,Le=/[\p{L}\p{N}]/u;function Re(e){let t={text:``,nodes:[],node:[],offset:[]};if(e.closest(b))return t;let n=[],r=!0,i=(e,r,i)=>{n.push(e),t.node.push(r),t.offset.push(i)},a=()=>{if(r||!t.nodes.length)return;let e=t.nodes.length-1;i(` `,e,t.nodes[e].length),r=!0},o=e=>{if(n.length>=Ie)return;if(e.nodeType===3){let a=e.nodeValue??``;if(!a)return;let o=t.nodes.push(e)-1;for(let e=0;e<a.length&&n.length<Ie;e++){let t=a[e];t===` `||t===`
8
+ `||t===` `||t===`\r`||t===`\f`?(r||i(` `,o,e),r=!0):(i(t,o,e),r=!1)}return}if(e.nodeType!==1)return;let s=e,c=s.tagName.toUpperCase();if(Ne.has(c)||s.hasAttribute(`data-nuni-mask`)||s.hasAttribute(`data-nuni`))return;let l=Pe.has(c);l&&a();for(let e of Array.from(s.childNodes))o(e);l&&a()};for(o(e);n.length&&n[n.length-1]===` `;)n.pop(),t.node.pop(),t.offset.pop();return t.text=n.join(``),t}function ze(e,t,n){if(!e.text.length)return 0;let r=(t.ownerDocument??t).createRange();r.setStart(t,n),r.collapse(!0);let i=0,a=e.text.length;try{for(;i<a;){let t=i+a>>1,n=e.nodes[e.node[t]];r.comparePoint(n,e.offset[t])<0?i=t+1:a=t}}catch{return-1}return i}function Be(e,t,n){let r=e.nodes[e.node[t]],i=e.nodes[e.node[n-1]],a=r.ownerDocument.createRange();return a.setStart(r,e.offset[t]),a.setEnd(i,Math.min(i.length,e.offset[n-1]+1)),a}function Ve(e){let t=e.commonAncestorContainer;if(t.nodeType!==1&&(t=t.parentNode),!t||t.nodeType!==1)return null;let n=t,r=n.ownerDocument.body;for(;Fe.has(n.tagName.toUpperCase())&&n.parentElement&&n.parentElement!==r;)n=n.parentElement;return n}function He(e,t){let n=Re(t),r=ze(n,e.startContainer,e.startOffset),i=ze(n,e.endContainer,e.endOffset);if(r<0||i<0)return null;let{text:a}=n;for(;r<i&&a[r]===` `;)r++;for(;i>r&&a[i-1]===` `;)i--;if(i<=r)return null;let o=a.slice(r,Math.min(i,r+y.quoteMaxLength)),s=r+o.length;return{exact:o,prefix:a.slice(Math.max(0,r-y.quoteContextLength),r),suffix:a.slice(s,s+y.quoteContextLength)}}function Ue(e,t){let n=Ke(e,t,0);if(n)return n;let r=e.parentElement,i=e.ownerDocument.body;for(let e=0;r&&r!==i&&e<2;e++){let e=Ke(r,t,.6);if(e)return e;r=r.parentElement}return null}function We(e,t){return t?w(e,t):e?.8:1}function Ge(e,t,n,r){let i=e.slice(Math.max(0,t-r.prefix.length),t),a=e.slice(n,n+r.suffix.length);return(We(i.trimStart(),r.prefix.trimStart())+We(a.trimEnd(),r.suffix.trimEnd()))/2}function Ke(e,t,n){let{exact:r}=t;if(!r)return null;let i=Re(e),{text:a}=i;if(!a)return null;let o=-1,s=-1;for(let e=a.indexOf(r);e>=0;e=a.indexOf(r,e+1)){let n=Ge(a,e,e+r.length,t);n>s&&(o=e,s=n)}if(o>=0&&s>=n)return{range:Be(i,o,o+r.length),exact:!0};if(r.length<8||a.length>6e3)return null;let c=qe(a,t);if(!c)return null;let l=Ge(a,c.start,c.end,t);return c.score<.75||l<Math.max(n,.3)?null:{range:Be(i,c.start,c.end),exact:!1}}function qe(e,t){let n=e=>e!==void 0&&Le.test(e),r=[],i=[];for(let t=0;t<e.length;t++){let a=e[t];if(a===` `)continue;let o=e[t-1],s=e[t+1];(o===void 0||o===` `||n(a)&&!n(o))&&r.push(t),(s===void 0||s===` `||n(a)&&!n(s))&&i.push(t+1)}let a=t.exact.length,o=null,s=0;for(let n of r){for(;s<i.length&&i[s]<=n;)s++;for(let r=s;r<i.length;r++){let s=i[r]-n;if(s<a*.7)continue;if(s>a*1.3)break;let c=w(e.slice(n,i[r]),t.exact);(!o||c>o.score)&&(o={start:n,end:i[r],score:c})}}return o}function T(e){return!!(e&&e.nodeType===11&&`host`in e)}function Je(e){let t=e.getRootNode();return T(t)?t:e.ownerDocument}function Ye(e){return T(e)?e.ownerDocument:e}function Xe(e){try{return e.defaultView?.frameElement??null}catch{return null}}function Ze(e){if(e.tagName!==`IFRAME`&&e.tagName!==`FRAME`)return null;try{return e.contentDocument}catch{return null}}function Qe(e,t){let n=[],r=e;for(let e=0;e<8;e++){let e=r.getRootNode();if(T(e)){n.unshift({kind:`shadow`,host:e.host}),r=e.host;continue}if(r.ownerDocument===t)break;let i=Xe(r.ownerDocument);if(!i)break;n.unshift({kind:`frame`,host:i}),r=i}return n}function E(e,t){let n=e.getBoundingClientRect(),r=n.left,i=n.top,a=!1,o=e.ownerDocument;for(let e=0;e<8&&o!==t;e++){let e=Xe(o);if(!e)break;let t=o.defaultView;t&&(r+n.width<0||i+n.height<0||r>t.innerWidth||i>t.innerHeight)&&(a=!0);let s=e.getBoundingClientRect();r+=s.left+e.clientLeft,i+=s.top+e.clientTop,o=e.ownerDocument}return{left:r,top:i,width:n.width,height:n.height,clipped:a}}let $e=/^-?(m|p|mx|my|mt|mb|ml|mr|ms|me|px|py|pt|pb|pl|pr|ps|pe|w|h|min-w|max-w|min-h|max-h|size|gap|gap-x|gap-y|space-x|space-y|text|font|bg|border|border-[trblxy]|rounded|rounded-[trbl]{1,2}|shadow|flex|grid|grid-cols|grid-rows|col|col-span|row|row-span|items|justify|self|place|content|inset|inset-x|inset-y|top|left|right|bottom|start|end|z|opacity|leading|tracking|ring|ring-offset|outline|overflow|overflow-x|overflow-y|order|basis|grow|shrink|translate-x|translate-y|scale|rotate|skew|transition|duration|ease|delay|animate|cursor|select|fill|stroke|object|aspect|line-clamp|decoration|indent|align|whitespace|break|hyphens|list|columns|backdrop|blur|brightness|contrast|drop-shadow|grayscale|invert|saturate|sepia|divide|divide-x|divide-y|from|to|via|accent|caret|scroll|snap|touch|will-change|pointer-events|underline-offset|auto-cols|auto-rows|origin|mix-blend|bg-blend|box|float|clear|appearance|resize|table|sr|not-sr)(-|$)/,et=/* @__PURE__ */ new Set(/* @__PURE__ */ `flex.grid.block.inline.inline-block.inline-flex.inline-grid.hidden.contents.table.static.fixed.absolute.relative.sticky.visible.invisible.container.truncate.underline.uppercase.lowercase.capitalize.italic.antialiased.sr-only.grow.shrink.isolate.transform.filter.group.peer.prose.dark.light`.split(`.`)),tt=[/_{1,3}(?=[a-zA-Z-]*[0-9])[a-zA-Z0-9-]{5,}$/,/_{1,3}(?=[a-zA-Z0-9-]*[A-Z][a-zA-Z0-9-]*[A-Z])(?=[a-zA-Z0-9-]*[a-z])[a-zA-Z0-9-]{5,8}$/,/^_[a-zA-Z0-9]/,/^(css|sc|jsx|svelte|astro|emotion|e|tw|vanilla|chakra-[a-z]+-)[-_][a-zA-Z0-9]{4,}$/,/^[a-z]{1,3}-(?=[a-zA-Z]*[0-9])[a-zA-Z0-9]{5,}$/,/^(is|has)-(active|open|selected|focused|hover|hovered|visible|hidden|expanded|collapsed|loading|disabled|checked|current)$/,/^(active|open|selected|focus|focused|hover|current|show|showing|in|fade|collapse|collapsing)$/];function nt(e){if(e.length<5)return!1;let t=e.replace(/[^0-9]/g,``).length;return t===0?/^[a-zA-Z]{6,}$/.test(e)&&/[A-Z].*[A-Z]/.test(e)&&/[a-z]/.test(e)&&!/^[A-Z][a-z]+([A-Z][a-z]+)+$/.test(e):e.replace(/[^a-zA-Z]/g,``).length===0||!/^[a-zA-Z]+[-_]?\d{1,3}$/.test(e)&&t/e.length>.2}function rt(e){return/[[\]:/()%!#@&*,.>+~=]/.test(e)||et.has(e)?!0:$e.test(e)}function it(e){return!e||e.length>40||e.startsWith(`nuni-`)||rt(e)||tt.some(t=>t.test(e))?!1:!nt(e)}function D(e){let t=[];for(let n of Array.from(e.classList))if(it(n)&&t.push(n),t.length>=4)break;return t}let at=[/^:[a-zA-Z0-9]+:$/,/^«[a-zA-Z0-9]+»$/,/^(radix|headlessui|mui|react-aria|rc|base-ui|mantine|chakra|reach|downshift|ember|ext|yui|ui-id|aria|mat|cdk|ng|v|vue|svelte|el|id|uid|field|input)[-_:]/i,/[0-9a-f]{8}-[0-9a-f]{4}-/i,/\d{3,}/];function ot(e){return!e||e.length>80||at.some(t=>t.test(e))?!1:!nt(e)}let st=[`data-nuni`,`data-testid`,`data-test-id`,`data-test`,`data-cy`,`data-qa`],ct=[`aria-label`,`name`,`href`,`src`,`alt`,`placeholder`,`title`,`type`,`role`,`for`,`value`];function O(e){return typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape(e):e.replace(/([^\w-])/g,`\\$1`).replace(/^(\d)/,`\\3$1 `)}function lt(e,t){return`[${e}="${t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"]`}function ut(e,t){for(let n of st){if(!ke(n,t))continue;let r=e.getAttribute(n);if(r&&r.length<=100)return{attr:n,value:r}}return null}function dt(e){let t=e.getAttribute(`id`);return t&&ot(t)?t:null}function ft(e){return e.tagName.toLowerCase()}function pt(e){let t=1,n=e.previousElementSibling;for(;n;)n.tagName===e.tagName&&t++,n=n.previousElementSibling;return t}function mt(e){let t=e.parentNode;if(!t)return 1;let n=0;for(let r of Array.from(t.children))r.tagName===e.tagName&&n++;return n}function k(e,t){try{return e.querySelectorAll(t).length}catch{return 1/0}}function ht(e,t){return k(e,`#${O(t)}`)===1}function gt(e){let t=Je(e),n=e.ownerDocument,r=[],i=e;for(;i&&i!==n.documentElement;){let n=dt(i);if(n&&i!==e&&ht(t,n))return r.unshift(`#${O(n)}`),r.join(` > `);let a=ft(i);r.unshift(mt(i)>1?`${a}:nth-of-type(${pt(i)})`:a),i=i.parentElement}return T(t)?r.join(` > `):r.length?`html > ${r.join(` > `)}`:`html`}function _t(e,t){let n;try{n=Array.from(e.querySelectorAll(t)).slice(0,50)}catch{return null}if(!T(e)||t.startsWith(`#`))return n[0]??null;let r=t.split(` > `).length;return n.find(t=>{let n=t;for(let e=1;e<r&&n;e++)n=n.parentElement;return n?.parentNode===e})??null}function vt(e,t){let n=ft(e),r=ut(e,t);if(r)return n+lt(r.attr,r.value);let i=n;for(let t of D(e).slice(0,2))i+=`.${O(t)}`;for(let r of[`name`,`type`,`role`]){let a=e.getAttribute(r);if(a&&a.length<=40&&ke(r,t)){if(r===`type`&&n!==`input`&&n!==`button`)continue;i+=lt(r,a)}}let a=e.getAttribute(`aria-label`);return a&&a.length<=60&&!e.closest(b)&&(i+=lt(`aria-label`,a)),i}function yt(e,t={}){let n=e.ownerDocument,r=Je(e),i=dt(e);if(i&&ht(r,i))return`#${O(i)}`;let a=[],o=e;for(let e=0;o&&e<6;e++){if(o===n.documentElement||o===n.body){a.unshift(ft(o));break}let i=dt(o);if(e>0&&i&&ht(r,i)){a.unshift(`#${O(i)}`);let e=a.join(` > `);if(k(r,e)===1)return e;break}a.unshift(vt(o,t));let s=a.join(` > `);if(k(r,s)===1)return s;let c=o.parentElement;if(c&&k(c,`:scope > ${a[0]}`)>1&&(a[0]=`${a[0]}:nth-of-type(${pt(o)})`,s=a.join(` > `),k(r,s)===1))return s;o=o.parentElement}let s=a.join(` > `);return k(r,s)===1?s:void 0}function bt(e,t){let n={};if(e.closest(b))return n;for(let r of ct){if(!ke(r,t)||r===`value`&&e.tagName!==`BUTTON`&&e.getAttribute(`type`)!==`submit`)continue;let i=e.getAttribute(r);i&&(n[r]=i.slice(0,200))}return n}function xt(e){let t=[],n=e.parentElement;for(;n&&t.length<5&&n!==n.ownerDocument.documentElement;){let e=dt(n),r={tag:n.tagName.toLowerCase(),classes:D(n).slice(0,3)};if(e&&(r.id=e),t.length<3&&n!==n.ownerDocument.body){let e=C(n,80);e&&(r.text=e)}t.push(r),n=n.parentElement}return t}function St(e,t,n={}){let r=Ct(e,t,n),i=Qe(e,n.document??(typeof document>`u`?e.ownerDocument:document));return i.length&&(r.scope=i.map(({kind:e,host:t})=>({kind:e,host:Ct(t,void 0,n)}))),r}function Ct(e,t,n){let r=e.ownerDocument,i=we(e),a=Te(r),o=e.getBoundingClientRect(),s=t?{x:De(o.width?(t.x-o.left)/o.width:.5),y:De(o.height?(t.y-o.top)/o.height:.5)}:{x:.5,y:.5},c=dt(e),l=ut(e,n),u=yt(e,n),d=e.getAttribute(`role`)??void 0,f=e.parentNode,p=f?Array.from(f.children):[e],m={v:1,selectors:{path:gt(e),...c?{id:c}:{},...l?{testId:`${l.attr}=${l.value}`}:{},...u?{css:u}:{}},tag:e.tagName.toLowerCase(),classes:D(e),text:C(e,y.anchorTextMaxLength),attrs:bt(e,n),ancestors:xt(e),siblingIndex:p.indexOf(e),siblingCount:p.length,rect:i,offset:s,viewport:a,docSize:Ee(r)};d&&(m.role=d);let h=Ce(e);return h&&(m.componentName=h),m}function wt(e,t={}){let n=Ve(e);if(!n)return null;let r=He(e,n);if(!r)return null;let i=e.getClientRects()[0]??e.getBoundingClientRect(),a=St(n,{x:i.left,y:i.top+i.height/2},t);return a.quote=r,{element:n,anchor:a}}function Tt(e,t,n=()=>!1){let r=t.left+t.width,i=t.top+t.height,a=[[t.left+1,t.top+1],[r-1,t.top+1],[t.left+1,i-1],[r-1,i-1]],o=e=>n(e)||e.closest(`[data-nuni]`)!==null,s=null;for(let[t,n]of a){let r=e.elementsFromPoint(t,n).find(e=>!o(e));r&&(s=s?Et(s,r):r)}let c=s??e.body;for(;c.parentElement&&c!==e.body;){let e=c.getBoundingClientRect();if(e.left<=t.left+1&&e.top<=t.top+1&&e.right>=r-1&&e.bottom>=i-1)break;c=c.parentElement}return c}function Et(e,t){let n=/* @__PURE__ */ new Set;for(let t=e;t;t=t.parentElement)n.add(t);for(let e=t;e;e=e.parentElement)if(n.has(e))return e;return e.ownerDocument.body}function Dt(e,t,n={}){let r=St(e,{x:t.left+t.width,y:t.top},n),i=e.getBoundingClientRect(),a=i.width?De((t.left-i.left)/i.width):0,o=i.height?De((t.top-i.top)/i.height):0;return r.region={x:a,y:o,w:i.width?Math.min(1-a,t.width/i.width):1,h:i.height?Math.min(1-o,t.height/i.height):1},r}function Ot(){return{byTag:/* @__PURE__ */ new Map,elements:/* @__PURE__ */ new Map,text:/* @__PURE__ */ new WeakMap,content:/* @__PURE__ */ new WeakMap,words:/* @__PURE__ */ new WeakMap}}function kt(e,t,n){if(!n)return C(e,t);let r=n.text.get(e);r||n.text.set(e,r=/* @__PURE__ */ new Map);let i=r.get(t);return i===void 0&&r.set(t,i=C(e,t)),i}function At(e,t){if(!t)return e.textContent??``;let n=t.content.get(e);return n===void 0&&t.content.set(e,n=e.textContent??``),n}function jt(e,t){let n=t?.words.get(e);return n===void 0&&(n=je(At(e,t)),t?.words.set(e,n)),n}function Mt(e,t,n){let r=()=>T(e)?e.querySelectorAll(t):e.getElementsByTagName(t);if(!n)return r();let i=n.byTag.get(e);i||n.byTag.set(e,i=/* @__PURE__ */ new Map);let a=i.get(t);return a||i.set(t,a=Array.from(r())),a}function Nt(e,t,n){let r=n?.elements.get(e);if(r)return r;let i=Ye(e),a=T(e)?e:i.body??i.documentElement,o=i.createTreeWalker(a,1),s=[];for(let e=o.nextNode();e&&s.length<t;e=o.nextNode())s.push(e);return n?.elements.set(e,s),s}let Pt={exact:.9,high:.72,low:.55},Ft=3e3;function It(e,t,n=20){if(!t)return[];try{return Array.from(e.querySelectorAll(t)).slice(0,n)}catch{return[]}}function Lt(e,t){if(!t)return!1;try{return e.matches(t)}catch{return!1}}function Rt(e,t){if(!e.length&&!t.length)return 1;let n=new Set(e),r=0;for(let e of new Set(t))n.has(e)&&r++;return r/(n.size+new Set(t).size-r)}function zt(e){let t=e.indexOf(`=`);return t>0?[e.slice(0,t),e.slice(t+1)]:null}function Bt(e,t){return`[${e}="${t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"]`}function Vt(e,t){try{let n=new URL(e,t.baseURI);return n.pathname.replace(/\/$/,``)+n.search}catch{return e}}function Ht(e){let t=e.parentElement;if(!t)return 0;let n=D(e).join(` `),r=0;for(let i of Array.from(t.children))i!==e&&i.tagName===e.tagName&&D(i).join(` `)===n&&r++;return r}let Ut=/* @__PURE__ */ new Set([`href`,`name`,`aria-label`,`src`,`for`,`placeholder`,`alt`,`title`]);function Wt(e,t,n,r,i,a){let o=0,s=0,c=(e,t)=>{o+=e*t,s+=e};c(1,+(t.tagName.toLowerCase()===e.tag));let l=!1;if(e.selectors.id){let n=t.getAttribute(`id`)===e.selectors.id;l||(l=n),c(3,+!!n)}if(e.selectors.testId){let n=zt(e.selectors.testId),r=!!(n&&t.getAttribute(n[0])===n[1]);l||(l=r),c(4,+!!r)}let u=Lt(t,e.selectors.css);e.selectors.css&&c(1.5,+!!u);let d=r.pathMatch===t;c(1,+!!d),e.classes&&e.classes.length&&c(1.5,Rt(D(t),e.classes));let f=Object.keys(e.attrs).filter(e=>ke(e,i)),p=!1;if(f.length){let r=0,i=0,a=0;for(let o of f){let s=Ut.has(o);s&&i++;let c=t.getAttribute(o);if(c==null)continue;let l=e.attrs[o];(o===`href`||o===`src`?Vt(c,n)===Vt(l,n):c===l)?(r++,s&&a++):r+=w(c,l)*.5}c(2,r/f.length),p=i>0&&a===i}e.role&&c(.5,+(t.getAttribute(`role`)===e.role)),e.componentName&&c(.5,+(Ce(t)===e.componentName));let m=kt(t,120,a),h=e.text?w(m,e.text):m?.3:1;c(e.text?3:1,h);let g=e.quote?jt(t,a).includes(e.quote.exact):null;g!==null&&c(3,+!!g);let ee=0,_=0,v=null,y=t.parentElement;e.ancestors.forEach((t,n)=>{let r=1-n*.15;if(_+=r,!y)return;let i=y.tagName.toLowerCase()===t.tag?.4:0,o=y.getAttribute(`id`);t.id?i+=o===t.id?.35:0:i+=.35*(o?.5:1),i+=.25*Rt(D(y),t.classes),ee+=r*i,v===null&&t.text&&t.text!==e.text&&(v=w(kt(y,80,a),t.text)),y=y.parentElement}),_&&c(1.5,ee/_),v!==null&&c(2,v);let te=t.parentNode,ne=te?Array.prototype.indexOf.call(te.children,t):0;c(.5,Math.max(0,1-Math.abs(ne-e.siblingIndex)/3));let b=Math.max(0,1-Math.abs(r.viewportRatio-1)*2),x=t.getBoundingClientRect(),re=x.width+x.height>0;if(b>0&&e.rect.w+e.rect.h>0&&re){let t=n.defaultView,i=x.left+(t?.scrollX??0)+x.width/2,a=x.top+(t?.scrollY??0)+x.height/2,o=(e.rect.x+e.rect.w/2)*r.viewportRatio,s=e.rect.y+e.rect.h/2,l=Math.hypot(i-o,a-s);c(1.5*b,Math.exp(-l/250));let u=Math.min(x.width,e.rect.w)/Math.max(x.width,e.rect.w,1),d=Math.min(x.height,e.rect.h)/Math.max(x.height,e.rect.h,1);c(.5*b,u*d)}let ie=s?o/s:0,ae=(u||!e.selectors.css)&&d&&p,oe=r.quoteOnly===t?Math.max(h,.9):h;if(e.text.length>=2&&oe<.999){let e=Ht(t)>0?.2+.8*oe*oe:.7+.3*oe;ie*=l||ae?Math.max(e,.92):e}return g===!1&&(ie*=.85),{el:t,score:ie,text:h,context:v,strong:l||ae,rendered:re}}function Gt(e,t,n,r){let i=Ye(t),a=/* @__PURE__ */ new Set,o=e=>e===i.documentElement||(n.isIgnored?.(e)??!1),s=e=>{e&&!o(e)&&a.add(e)};if(e.selectors.id&&s(T(t)?It(t,`#${O(e.selectors.id)}`,1)[0]:t.getElementById(e.selectors.id)),e.selectors.testId){let n=zt(e.selectors.testId);n&&It(t,Bt(n[0],n[1])).forEach(s)}It(t,e.selectors.css).forEach(s);let c=_t(t,e.selectors.path);s(c);let l=e.text.slice(0,24).toLowerCase(),u=Mt(t,e.tag,r),d=u.length<=Ft;for(let e=0;e<u.length&&e<Ft*2;e++){let t=u[e];if(d){s(t);continue}let n=At(t,r).toLowerCase();l&&n.includes(l)&&s(t)}if(e.text.length>=3){let n=e.text.toLowerCase();for(let i of Nt(t,Ft*3,r)){if(i.tagName.toLowerCase()===e.tag)continue;let t=At(i,r);!t||t.length>n.length*3+20||kt(i,120,r).toLowerCase()===n&&s(i)}}return{candidates:a,pathMatch:c}}let A={lost:0,low:1,high:2,exact:3};function Kt(e,t=document,n={},r){let i=t,a=`exact`,o={element:null,confidence:`lost`,score:0};for(let t of e.scope??[]){let e=qt(t.host,i,n,r);if(!e.element)return o;let s=e.confidence;if(t.host.text){if(e.text<.9&&A[s]<A.high)return o;e.text>=.999&&e.margin>=.1&&s===`low`&&(s=`high`)}let c=t.kind===`shadow`?e.element.shadowRoot:Ze(e.element);if(!c)return o;A[s]<A[a]&&(a=s),i=c}let{text:s,margin:c,...l}=qt(e,i,n,r);if(l.element&&A[a]<A[l.confidence]&&(l.confidence=a),l.element&&e.quote){let t=Ue(l.element,e.quote);t&&(l.range=t.range),(!t||!t.exact)&&A[l.confidence]>A.low&&(l.confidence=`low`)}return l}function qt(e,t,n,r){let i=Ye(t);if(!T(t)&&(e.tag===`body`||e.tag===`html`))return{element:i.body,confidence:`exact`,score:1,text:1,margin:1};let{candidates:a,pathMatch:o}=Gt(e,t,n,r);if(!a.size)return{element:null,confidence:`lost`,score:0,text:0,margin:0};let s=i.defaultView,c=e.viewport.w&&s?.innerWidth?s.innerWidth/e.viewport.w:1,l=null;if(e.quote){let t=e.quote.exact,n=[...a].filter(e=>jt(e,r).includes(t)),i=n.filter(e=>!n.some(t=>t!==e&&e.contains(t)));i.length===1&&(l=i[0])}let u=[];for(let t of a)u.push(Wt(e,t,i,{pathMatch:o,viewportRatio:c,quoteOnly:l},n,r));let d=e.rect.w+e.rect.h>0&&u.some(e=>e.rendered),f=e=>!d||e.rendered;if(u.filter(t=>t.text>=.999&&t.el.tagName.toLowerCase()===e.tag&&f(t)).length>1)for(let e of u)e.context===null||e.strong||(e.score*=.2+.8*e.context*e.context);u.sort((e,t)=>t.score-e.score);let p=u[0],m=u.find(e=>e.el!==p.el&&!p.el.contains(e.el)&&!e.el.contains(p.el)&&(!p.rendered||f(e)));if(p.score<Pt.low)return{element:null,confidence:`lost`,score:p.score,text:p.text,margin:0};let h=p.score>=Pt.exact&&p.text>=.999?`exact`:p.score>=Pt.high?`high`:`low`,g=m?p.score-m.score:1;return g<.03&&(h=`low`),{element:p.el,confidence:h,score:p.score,text:p.text,margin:g}}let Jt=/* @__PURE__ */ new Set([`SPAN`,`STRONG`,`EM`,`B`,`I`,`SMALL`,`MARK`,`SUB`,`SUP`,`ABBR`,`CODE`,`KBD`,`TIME`,`U`,`S`]);function Yt(e){let t=e,n=t.closest(`svg`);n&&(t=n.parentElement??n);let r=t.closest(`a[href], button, label, summary, select, textarea, input, [role=button], [role=link], [role=tab], [role=menuitem], [role=checkbox], [role=switch], [role=option]`);if(r)return r;for(;Jt.has(t.tagName)&&t.parentElement&&t.parentElement!==t.ownerDocument.body&&!t.id;)t=t.parentElement;return t}for(var j=[],M=[],Xt=Uint8Array,Zt=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`,Qt=0,$t=Zt.length;Qt<$t;++Qt)j[Qt]=Zt[Qt],M[Zt.charCodeAt(Qt)]=Qt;M[45]=62,M[95]=63;function en(e){var t=e.length;if(t%4>0)throw Error(`Invalid string. Length must be a multiple of 4`);var n=e.indexOf(`=`);n===-1&&(n=t);var r=n===t?0:4-n%4;return[n,r]}function tn(e,t,n){return(t+n)*3/4-n}function nn(e){for(var t,n=en(e),r=n[0],i=n[1],a=new Xt(tn(e,r,i)),o=0,s=i>0?r-4:r,c=0;c<s;c+=4)t=M[e.charCodeAt(c)]<<18|M[e.charCodeAt(c+1)]<<12|M[e.charCodeAt(c+2)]<<6|M[e.charCodeAt(c+3)],a[o++]=t>>16&255,a[o++]=t>>8&255,a[o++]=t&255;return i===2&&(t=M[e.charCodeAt(c)]<<2|M[e.charCodeAt(c+1)]>>4,a[o++]=t&255),i===1&&(t=M[e.charCodeAt(c)]<<10|M[e.charCodeAt(c+1)]<<4|M[e.charCodeAt(c+2)]>>2,a[o++]=t>>8&255,a[o++]=t&255),a}function rn(e){return j[e>>18&63]+j[e>>12&63]+j[e>>6&63]+j[e&63]}function an(e,t,n){for(var r,i=[],a=t;a<n;a+=3)r=(e[a]<<16&16711680)+(e[a+1]<<8&65280)+(e[a+2]&255),i.push(rn(r));return i.join(``)}function on(e){for(var t,n=e.length,r=n%3,i=[],a=16383,o=0,s=n-r;o<s;o+=a)i.push(an(e,o,o+a>s?s:o+a));return r===1?(t=e[n-1],i.push(j[t>>2]+j[t<<4&63]+`==`)):r===2&&(t=(e[n-2]<<8)+e[n-1],i.push(j[t>>10]+j[t>>4&63]+j[t<<2&63]+`=`)),i.join(``)}function N(e){if(e===void 0)return{};if(!cn(e))throw Error(`The arguments to a Convex function must be an object. Received: ${e}`);return e}function sn(e){if(e===void 0)throw Error(`Client created with undefined deployment address. If you used an environment variable, check that it's set.`);if(typeof e!=`string`)throw Error(`Invalid deployment address: found ${e}".`);if(!(e.startsWith(`http:`)||e.startsWith(`https:`)))throw Error(`Invalid deployment address: Must start with "https://" or "http://". Found "${e}".`);try{new URL(e)}catch{throw Error(`Invalid deployment address: "${e}" is not a valid URL. If you believe this URL is correct, use the \`skipConvexDeploymentUrlCheck\` option to bypass this.`)}if(e.endsWith(`.convex.site`))throw Error(`Invalid deployment address: "${e}" ends with .convex.site, which is used for HTTP Actions. Convex deployment URLs typically end with .convex.cloud? If you believe this URL is correct, use the \`skipConvexDeploymentUrlCheck\` option to bypass this.`)}function cn(e){let t=typeof e==`object`,n=Object.getPrototypeOf(e),r=n===null||n===Object.prototype||n?.constructor?.name===`Object`;return t&&r}let ln=BigInt(`-9223372036854775808`),un=BigInt(`9223372036854775807`),dn=BigInt(`0`),fn=BigInt(`8`),pn=BigInt(`256`),mn=`This commit timestamp is unresolved: its value is assigned when the mutation commits. Read the document after the mutation completes to get its value.`;var hn=class{[Symbol.toPrimitive](e){if(e===`string`)return this.toString();throw Error(mn)}valueOf(){throw Error(mn)}toJSON(){throw Error(mn)}toString(){return`[unresolved commit timestamp]`}};let gn=new hn;function _n(e){return Number.isNaN(e)||!Number.isFinite(e)||Object.is(e,-0)}function vn(e){e<dn&&(e-=ln+ln);let t=e.toString(16);t.length%2==1&&(t=`0`+t);let n=new Uint8Array(/* @__PURE__ */ new ArrayBuffer(8)),r=0;for(let i of t.match(/.{2}/g).reverse())n.set([parseInt(i,16)],r++),e>>=fn;return on(n)}function yn(e){let t=nn(e);if(t.byteLength!==8)throw Error(`Received ${t.byteLength} bytes, expected 8 for $integer`);let n=dn,r=dn;for(let e of t)n+=BigInt(e)*pn**r,r++;return n>un&&(n+=ln+ln),n}function bn(e){if(e<ln||un<e)throw Error(`BigInt ${e} does not fit into a 64-bit signed integer.`);let t=/* @__PURE__ */ new ArrayBuffer(8);return new DataView(t).setBigInt64(0,e,!0),on(new Uint8Array(t))}function xn(e){let t=nn(e);if(t.byteLength!==8)throw Error(`Received ${t.byteLength} bytes, expected 8 for $integer`);return new DataView(t.buffer).getBigInt64(0,!0)}let Sn=DataView.prototype.setBigInt64?bn:vn,Cn=DataView.prototype.getBigInt64?xn:yn,wn=1024;function Tn(e){if(e.length>wn)throw Error(`Field name ${e} exceeds maximum field name length ${wn}.`);if(e.startsWith(`$`))throw Error(`Field name ${e} starts with a '$', which is reserved.`);for(let t=0;t<e.length;t+=1){let n=e.charCodeAt(t);if(n<32||n>=127)throw Error(`Field name ${e} has invalid character '${e[t]}': Field names can only contain non-control ASCII characters`)}}function En(e){if(e===null||typeof e==`boolean`||typeof e==`number`||typeof e==`string`)return e;if(Array.isArray(e))return e.map(e=>En(e));if(typeof e!=`object`)throw Error(`Unexpected type of ${e}`);let t=Object.entries(e);if(t.length===1){let n=t[0][0];if(n===`$bytes`){if(typeof e.$bytes!=`string`)throw Error(`Malformed $bytes field on ${e}`);return nn(e.$bytes).buffer}if(n===`$integer`){if(typeof e.$integer!=`string`)throw Error(`Malformed $integer field on ${e}`);return Cn(e.$integer)}if(n===`$float`){if(typeof e.$float!=`string`)throw Error(`Malformed $float field on ${e}`);let t=nn(e.$float);if(t.byteLength!==8)throw Error(`Received ${t.byteLength} bytes, expected 8 for $float`);let n=new DataView(t.buffer).getFloat64(0,!0);if(!_n(n))throw Error(`Float ${n} should be encoded as a number`);return n}if(n===`$commitTs`){if(e.$commitTs!==null)throw Error(`Malformed $commitTs field on ${e}`);return gn}if(n===`$set`)throw Error(`Received a Set which is no longer supported as a Convex type.`);if(n===`$map`)throw Error(`Received a Map which is no longer supported as a Convex type.`)}let n={};for(let[t,r]of Object.entries(e))Tn(t),n[t]=En(r);return n}function P(e){let t=JSON.stringify(e,(e,t)=>t===void 0?`undefined`:typeof t==`bigint`?`${t.toString()}n`:t);if(t.length>16384){let e=16370,n=t.codePointAt(e-1);return n!==void 0&&n>65535&&--e,t.substring(0,e)+`[...truncated]`}return t}function Dn(e,t,n,r){if(e===void 0){let e=n&&` (present at path ${n} in original object ${P(t)})`;throw Error(`undefined is not a valid Convex value${e}. To learn about Convex's supported types, see https://docs.convex.dev/using/types.`)}if(e===null)return e;if(typeof e==`bigint`){if(e<ln||un<e)throw Error(`BigInt ${e} does not fit into a 64-bit signed integer.`);return{$integer:Sn(e)}}if(typeof e==`number`){if(_n(e)){let t=/* @__PURE__ */ new ArrayBuffer(8);return new DataView(t).setFloat64(0,e,!0),{$float:on(new Uint8Array(t))}}return e}if(typeof e==`boolean`||typeof e==`string`)return e;if(e instanceof ArrayBuffer)return{$bytes:on(new Uint8Array(e))};if(e instanceof hn)return{$commitTs:null};if(Array.isArray(e))return e.map((e,r)=>Dn(e,t,n+`[${r}]`,!1));if(e instanceof Set)throw Error(On(n,`Set`,[...e],t));if(e instanceof Map)throw Error(On(n,`Map`,[...e],t));if(!cn(e)){let r=e?.constructor?.name,i=r?`${r} `:``;throw Error(On(n,i,e,t))}let i={},a=Object.entries(e);a.sort(([e,t],[n,r])=>e===n?0:e<n?-1:1);for(let[e,o]of a)o===void 0?r&&(Tn(e),i[e]=kn(o,t,n+`.${e}`)):(Tn(e),i[e]=Dn(o,t,n+`.${e}`,!1));return i}function On(e,t,n,r){return e?`${t}${P(n)} is not a supported Convex type (present at path ${e} in original object ${P(r)}). To learn about Convex's supported types, see https://docs.convex.dev/using/types.`:`${t}${P(n)} is not a supported Convex type.`}function kn(e,t,n){if(e===void 0)return{$undefined:null};if(t===void 0)throw Error(`Programming error. Current value is ${P(e)} but original value is undefined`);return Dn(e,t,n,!1)}function F(e){return Dn(e,e,``,!1)}var An=Object.defineProperty,jn=(e,t,n)=>t in e?An(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Mn=(e,t,n)=>jn(e,typeof t==`symbol`?t:t+``,n),Nn,Pn;let Fn=Symbol.for(`ConvexError`);var In=class extends (Pn=Error,Nn=Fn,Pn){constructor(e){super(typeof e==`string`?e:P(e)),Mn(this,`name`,`ConvexError`),Mn(this,`data`),Mn(this,Nn,!0),this.data=e}};let Ln=`1.46.0`,Rn=Symbol.for(`functionName`),zn=Symbol.for(`toReferencePath`);function Bn(e){return e[zn]??null}function Vn(e){return e.startsWith(`function://`)}function Hn(e){let t;if(typeof e==`string`)t=Vn(e)?{functionHandle:e}:{name:e};else if(e[Rn])t={name:e[Rn]};else{let n=Bn(e);if(!n)throw Error(`${e} is not a functionReference`);t={reference:n}}return t}function I(e){let t=Hn(e);if(t.name===void 0)throw t.functionHandle===void 0?t.reference===void 0?Error(`Expected function reference like "api.file.func" or "internal.file.func", but received ${JSON.stringify(t)}`):Error(`Expected function reference in the current component like "api.file.func" or "internal.file.func", but received reference ${t.reference}`):Error(`Expected function reference like "api.file.func" or "internal.file.func", but received function handle ${t.functionHandle}`);if(typeof e==`string`)return e;let n=e[Rn];if(!n)throw Error(`${e} is not a functionReference`);return n}function Un(e=[]){return new Proxy({},{get(t,n){if(typeof n==`string`)return Un([...e,n]);if(n===Rn){if(e.length<2){let t=[`api`,...e].join(`.`);throw Error(`API path is expected to be of the form \`api.moduleName.functionName\`. Found: \`${t}\``)}let t=e.slice(0,-1).join(`/`),n=e[e.length-1];return n==="default"?t:t+`:`+n}if(n===Symbol.toStringTag)return`FunctionReference`}})}let Wn=Un();function Gn(e,t){return new Proxy({},{get(n,r){if(typeof r==`string`)return Gn(e,[...t,r]);if(r===zn){if(t.length<1){let n=[e,...t].join(`.`);throw Error(`API path is expected to be of the form \`${e}.childComponent.functionName\`. Found: \`${n}\``)}return`_reference/childComponent/`+t.join(`/`)}}})}let Kn=()=>Gn(`components`,[]),L=Wn;Kn();var qn=Object.defineProperty,Jn=(e,t,n)=>t in e?qn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Yn=(e,t,n)=>Jn(e,typeof t==`symbol`?t:t+``,n);function Xn(e){switch(e){case`query`:return`Q`;case`mutation`:return`M`;case`action`:return`A`;case`any`:return`?`}}var Zn=class{constructor(e){Yn(this,`_onLogLineFuncs`),Yn(this,`_verbose`),this._onLogLineFuncs={},this._verbose=e.verbose}addLogLineListener(e){let t=Math.random().toString(36).substring(2,15);for(let e=0;e<10&&this._onLogLineFuncs[t]!==void 0;e++)t=Math.random().toString(36).substring(2,15);return this._onLogLineFuncs[t]=e,()=>{delete this._onLogLineFuncs[t]}}logVerbose(...e){if(this._verbose)for(let t of Object.values(this._onLogLineFuncs))t(`debug`,`${(/* @__PURE__ */ new Date()).toISOString()}`,...e)}log(...e){for(let t of Object.values(this._onLogLineFuncs))t(`info`,...e)}warn(...e){for(let t of Object.values(this._onLogLineFuncs))t(`warn`,...e)}error(...e){for(let t of Object.values(this._onLogLineFuncs))t(`error`,...e)}};function Qn(e){let t=new Zn(e);return t.addLogLineListener((e,...t)=>{switch(e){case`debug`:console.debug(...t);break;case`info`:console.log(...t);break;case`warn`:console.warn(...t);break;case`error`:console.error(...t);break;default:console.log(...t)}}),t}function $n(e){return new Zn(e)}function er(e,t,n,r,i){let a=Xn(n);if(typeof i==`object`&&(i=`ConvexError ${JSON.stringify(i.errorData,null,2)}`),t===`info`){let t=i.match(/^\[.*?\] /);if(t===null){e.error(`[CONVEX ${a}(${r})] Could not parse console.log`);return}let n=i.slice(1,t[0].length-2),o=i.slice(t[0].length);e.log(`%c[CONVEX ${a}(${r})] [${n}]`,`color:rgb(0, 145, 255)`,o)}else e.error(`[CONVEX ${a}(${r})] ${i}`)}function tr(e,t){let n=`[CONVEX FATAL ERROR] ${t}`;return e.error(n),Error(n)}function nr(e,t,n){return`[CONVEX ${Xn(e)}(${t})] ${n.errorMessage}
9
+ Called by client`}function rr(e,t){return t.data=e.errorData,t}function R(e){let t=e.split(`:`),n,r;return t.length===1?(n=t[0],r=`default`):(n=t.slice(0,t.length-1).join(`:`),r=t[t.length-1]),n.endsWith(`.js`)&&(n=n.slice(0,-3)),`${n}:${r}`}function z(e,t){return JSON.stringify({udfPath:R(e),args:F(t)})}function ir(e,t,n){let{initialNumItems:r,id:i}=n;return JSON.stringify({type:`paginated`,udfPath:R(e),args:F(t),options:F({initialNumItems:r,id:i})})}function ar(e){return JSON.parse(e).type===`paginated`}var or=Object.defineProperty,sr=(e,t,n)=>t in e?or(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,B=(e,t,n)=>sr(e,typeof t==`symbol`?t:t+``,n),cr=class{constructor(){B(this,`nextQueryId`),B(this,`querySetVersion`),B(this,`querySet`),B(this,`queryIdToToken`),B(this,`identityVersion`),B(this,`auth`),B(this,`outstandingQueriesOlderThanRestart`),B(this,`outstandingAuthOlderThanRestart`),B(this,`paused`),B(this,`pendingQuerySetModifications`),this.nextQueryId=0,this.querySetVersion=0,this.identityVersion=0,this.querySet=/* @__PURE__ */ new Map,this.queryIdToToken=/* @__PURE__ */ new Map,this.outstandingQueriesOlderThanRestart=/* @__PURE__ */ new Set,this.outstandingAuthOlderThanRestart=!1,this.paused=!1,this.pendingQuerySetModifications=/* @__PURE__ */ new Map}hasSyncedPastLastReconnect(){return this.outstandingQueriesOlderThanRestart.size===0&&!this.outstandingAuthOlderThanRestart}markAuthCompletion(){this.outstandingAuthOlderThanRestart=!1}subscribe(e,t,n,r){let i=R(e),a=z(i,t),o=this.querySet.get(a);if(o!==void 0)return o.numSubscribers+=1,{queryToken:a,modification:null,unsubscribe:()=>this.removeSubscriber(a)};{let e=this.nextQueryId++,o={id:e,canonicalizedUdfPath:i,args:t,numSubscribers:1,journal:n,componentPath:r};this.querySet.set(a,o),this.queryIdToToken.set(e,a);let s=this.querySetVersion,c=this.querySetVersion+1,l={type:`Add`,queryId:e,udfPath:i,args:[F(t)],journal:n,componentPath:r};return this.paused?this.pendingQuerySetModifications.set(e,l):this.querySetVersion=c,{queryToken:a,modification:{type:`ModifyQuerySet`,baseVersion:s,newVersion:c,modifications:[l]},unsubscribe:()=>this.removeSubscriber(a)}}}transition(e){for(let t of e.modifications)switch(t.type){case`QueryUpdated`:case`QueryFailed`:{this.outstandingQueriesOlderThanRestart.delete(t.queryId);let e=t.journal;if(e!==void 0){let n=this.queryIdToToken.get(t.queryId);n!==void 0&&(this.querySet.get(n).journal=e)}break}case`QueryRemoved`:this.outstandingQueriesOlderThanRestart.delete(t.queryId);break;default:throw Error(`Invalid modification ${t.type}`)}}queryId(e,t){let n=z(R(e),t),r=this.querySet.get(n);return r===void 0?null:r.id}isCurrentOrNewerAuthVersion(e){return e>=this.identityVersion}getAuth(){return this.auth}setAuth(e){this.auth={tokenType:`User`,value:e};let t=this.identityVersion;return this.paused||(this.identityVersion=t+1),{type:`Authenticate`,baseVersion:t,...this.auth}}setAdminAuth(e,t){let n={tokenType:`Admin`,value:e,impersonating:t};this.auth=n;let r=this.identityVersion;return this.paused||(this.identityVersion=r+1),{type:`Authenticate`,baseVersion:r,...n}}clearAuth(){this.auth=void 0,this.markAuthCompletion();let e=this.identityVersion;return this.paused||(this.identityVersion=e+1),{type:`Authenticate`,tokenType:`None`,baseVersion:e}}hasAuth(){return!!this.auth}isNewAuth(e){return this.auth?.value!==e}queryPath(e){let t=this.queryIdToToken.get(e);return t?this.querySet.get(t).canonicalizedUdfPath:null}queryArgs(e){let t=this.queryIdToToken.get(e);return t?this.querySet.get(t).args:null}queryToken(e){return this.queryIdToToken.get(e)??null}queryJournal(e){return this.querySet.get(e)?.journal}restart(){this.unpause(),this.outstandingQueriesOlderThanRestart.clear();let e=[];for(let t of this.querySet.values()){let n={type:`Add`,queryId:t.id,udfPath:t.canonicalizedUdfPath,args:[F(t.args)],journal:t.journal,componentPath:t.componentPath};e.push(n),this.outstandingQueriesOlderThanRestart.add(t.id)}this.querySetVersion=1;let t={type:`ModifyQuerySet`,baseVersion:0,newVersion:1,modifications:e};if(!this.auth)return this.identityVersion=0,[t,void 0];this.outstandingAuthOlderThanRestart=!0;let n={type:`Authenticate`,baseVersion:0,...this.auth};return this.identityVersion=1,[t,n]}pause(){this.paused=!0}resume(){let e=this.pendingQuerySetModifications.size>0?{type:`ModifyQuerySet`,baseVersion:this.querySetVersion,newVersion:++this.querySetVersion,modifications:Array.from(this.pendingQuerySetModifications.values())}:void 0,t=this.auth===void 0?void 0:{type:`Authenticate`,baseVersion:this.identityVersion++,...this.auth};return this.unpause(),[e,t]}unpause(){this.paused=!1,this.pendingQuerySetModifications.clear()}removeSubscriber(e){let t=this.querySet.get(e);if(t.numSubscribers>1)return--t.numSubscribers,null;{this.querySet.delete(e),this.queryIdToToken.delete(t.id),this.outstandingQueriesOlderThanRestart.delete(t.id);let n=this.querySetVersion,r=this.querySetVersion+1,i={type:`Remove`,queryId:t.id};return this.paused?this.pendingQuerySetModifications.has(t.id)?this.pendingQuerySetModifications.delete(t.id):this.pendingQuerySetModifications.set(t.id,i):this.querySetVersion=r,{type:`ModifyQuerySet`,baseVersion:n,newVersion:r,modifications:[i]}}}},lr=Object.defineProperty,ur=(e,t,n)=>t in e?lr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,dr=(e,t,n)=>ur(e,typeof t==`symbol`?t:t+``,n),fr=class{constructor(e,t){this.logger=e,this.markConnectionStateDirty=t,dr(this,`inflightRequests`),dr(this,`requestsOlderThanRestart`),dr(this,`inflightMutationsCount`,0),dr(this,`inflightActionsCount`,0),this.inflightRequests=/* @__PURE__ */ new Map,this.requestsOlderThanRestart=/* @__PURE__ */ new Set}request(e,t){let n=new Promise(n=>{let r=t?`Requested`:`NotSent`;this.inflightRequests.set(e.requestId,{message:e,status:{status:r,requestedAt:/* @__PURE__ */ new Date,onResult:n}}),e.type===`Mutation`?this.inflightMutationsCount++:e.type===`Action`&&this.inflightActionsCount++});return this.markConnectionStateDirty(),n}onResponse(e){let t=this.inflightRequests.get(e.requestId);if(t===void 0||t.status.status===`Completed`)return null;let n=t.message.type===`Mutation`?`mutation`:`action`,r=t.message.udfPath;for(let t of e.logLines)er(this.logger,`info`,n,r,t);let i=t.status,a,o;if(e.success)a={success:!0,logLines:e.logLines,value:En(e.result)},o=()=>i.onResult(a);else{let t=e.result,{errorData:s}=e;er(this.logger,`error`,n,r,t),a={success:!1,errorMessage:t,errorData:s===void 0?void 0:En(s),logLines:e.logLines},o=()=>i.onResult(a)}return e.type===`ActionResponse`||!e.success?(o(),this.inflightRequests.delete(e.requestId),this.requestsOlderThanRestart.delete(e.requestId),t.message.type===`Action`?this.inflightActionsCount--:t.message.type===`Mutation`&&this.inflightMutationsCount--,this.markConnectionStateDirty(),{requestId:e.requestId,result:a}):(t.status={status:`Completed`,result:a,ts:e.ts,onResolve:o},null)}removeCompleted(e){let t=/* @__PURE__ */ new Map;for(let[n,r]of this.inflightRequests.entries()){let i=r.status;i.status===`Completed`&&i.ts.lessThanOrEqual(e)&&(i.onResolve(),t.set(n,i.result),r.message.type===`Mutation`?this.inflightMutationsCount--:r.message.type===`Action`&&this.inflightActionsCount--,this.inflightRequests.delete(n),this.requestsOlderThanRestart.delete(n))}return t.size>0&&this.markConnectionStateDirty(),t}restart(){this.requestsOlderThanRestart=new Set(this.inflightRequests.keys());let e=[];for(let[t,n]of this.inflightRequests){if(n.status.status===`NotSent`){n.status.status=`Requested`,e.push(n.message);continue}if(n.message.type===`Mutation`)e.push(n.message);else if(n.message.type===`Action`){if(this.inflightRequests.delete(t),this.requestsOlderThanRestart.delete(t),this.inflightActionsCount--,n.status.status===`Completed`)throw Error(`Action should never be in 'Completed' state`);n.status.onResult({success:!1,errorMessage:`Connection lost while action was in flight`,logLines:[]})}}return this.markConnectionStateDirty(),e}resume(){let e=[];for(let[,t]of this.inflightRequests)if(t.status.status===`NotSent`){t.status.status=`Requested`,e.push(t.message);continue}return e}hasIncompleteRequests(){for(let e of this.inflightRequests.values())if(e.status.status===`Requested`)return!0;return!1}hasInflightRequests(){return this.inflightRequests.size>0}hasSyncedPastLastReconnect(){return this.requestsOlderThanRestart.size===0}timeOfOldestInflightRequest(){if(this.inflightRequests.size===0)return null;let e=Date.now();for(let t of this.inflightRequests.values())t.status.status!==`Completed`&&t.status.requestedAt.getTime()<e&&(e=t.status.requestedAt.getTime());return new Date(e)}inflightMutations(){return this.inflightMutationsCount}inflightActions(){return this.inflightActionsCount}},pr=Object.defineProperty,mr=(e,t,n)=>t in e?pr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,hr=(e,t,n)=>mr(e,typeof t==`symbol`?t:t+``,n),gr=class e{constructor(e){hr(this,`queryResults`),hr(this,`modifiedQueries`),this.queryResults=e,this.modifiedQueries=[]}getQuery(t,...n){let r=N(n[0]),i=I(t),a=this.queryResults.get(z(i,r));if(a!==void 0)return e.queryValue(a.result)}getAllQueries(t){let n=[],r=I(t);for(let t of this.queryResults.values())t.udfPath===R(r)&&n.push({args:t.args,value:e.queryValue(t.result)});return n}setQuery(e,t,n){let r=N(t),i=I(e),a=z(i,r),o;o=n===void 0?void 0:{success:!0,value:n,logLines:[]};let s={udfPath:i,args:r,result:o};this.queryResults.set(a,s),this.modifiedQueries.push(a)}static queryValue(e){if(e!==void 0&&e.success)return e.value}},_r=class{constructor(){hr(this,`queryResults`),hr(this,`optimisticUpdates`),this.queryResults=/* @__PURE__ */ new Map,this.optimisticUpdates=[]}ingestQueryResultsFromServer(e,t){this.optimisticUpdates=this.optimisticUpdates.filter(e=>!t.has(e.mutationId));let n=this.queryResults;this.queryResults=new Map(e);let r=new gr(this.queryResults);for(let e of this.optimisticUpdates)e.update(r);let i=[];for(let[e,t]of this.queryResults){let r=n.get(e);(r===void 0||r.result!==t.result)&&i.push(e)}return i}applyOptimisticUpdate(e,t){this.optimisticUpdates.push({update:e,mutationId:t});let n=new gr(this.queryResults);return e(n),n.modifiedQueries}rawQueryResult(e){let t=this.queryResults.get(e);if(t!==void 0)return t.result}queryResult(e){let t=this.queryResults.get(e);if(t===void 0)return;let n=t.result;if(n!==void 0){if(n.success)return n.value;throw n.errorData===void 0?Error(nr(`query`,t.udfPath,n)):rr(n,new In(nr(`query`,t.udfPath,n)))}}hasQueryResult(e){return this.queryResults.get(e)!==void 0}queryLogs(e){return this.queryResults.get(e)?.result?.logLines}},vr=Object.defineProperty,yr=(e,t,n)=>t in e?vr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,br=(e,t,n)=>yr(e,typeof t==`symbol`?t:t+``,n),xr=class e{constructor(e,t){br(this,`low`),br(this,`high`),br(this,`__isUnsignedLong__`),this.low=e|0,this.high=t|0,this.__isUnsignedLong__=!0}static isLong(e){return(e&&e.__isUnsignedLong__)===!0}static fromBytesLE(t){return new e(t[0]|t[1]<<8|t[2]<<16|t[3]<<24,t[4]|t[5]<<8|t[6]<<16|t[7]<<24)}toBytesLE(){let e=this.high,t=this.low;return[t&255,t>>>8&255,t>>>16&255,t>>>24,e&255,e>>>8&255,e>>>16&255,e>>>24]}static fromNumber(t){return isNaN(t)||t<0?Sr:t>=Tr?Er:new e(t%wr|0,t/wr|0)}toString(){return(BigInt(this.high)*BigInt(wr)+BigInt(this.low)).toString()}equals(t){return e.isLong(t)||(t=e.fromValue(t)),this.high>>>31==1&&t.high>>>31==1?!1:this.high===t.high&&this.low===t.low}notEquals(e){return!this.equals(e)}comp(t){return e.isLong(t)||(t=e.fromValue(t)),this.equals(t)?0:t.high>>>0>this.high>>>0||t.high===this.high&&t.low>>>0>this.low>>>0?-1:1}lessThanOrEqual(e){return this.comp(e)<=0}static fromValue(t){return typeof t==`number`?e.fromNumber(t):new e(t.low,t.high)}};let Sr=new xr(0,0),Cr=65536,wr=Cr*Cr,Tr=wr*wr,Er=new xr(-1,-1);var Dr=Object.defineProperty,Or=(e,t,n)=>t in e?Dr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,kr=(e,t,n)=>Or(e,typeof t==`symbol`?t:t+``,n),Ar=class{constructor(e,t){kr(this,`version`),kr(this,`remoteQuerySet`),kr(this,`queryPath`),kr(this,`logger`),this.version={querySet:0,ts:xr.fromNumber(0),identity:0},this.remoteQuerySet=/* @__PURE__ */ new Map,this.queryPath=e,this.logger=t}transition(e){let t=e.startVersion;if(this.version.querySet!==t.querySet||this.version.ts.notEquals(t.ts)||this.version.identity!==t.identity)throw Error(`Invalid start version: ${t.ts.toString()}:${t.querySet}:${t.identity}, transitioning from ${this.version.ts.toString()}:${this.version.querySet}:${this.version.identity}`);for(let t of e.modifications)switch(t.type){case`QueryUpdated`:{let e=this.queryPath(t.queryId);if(e)for(let n of t.logLines)er(this.logger,`info`,`query`,e,n);let n=En(t.value??null);this.remoteQuerySet.set(t.queryId,{success:!0,value:n,logLines:t.logLines});break}case`QueryFailed`:{let e=this.queryPath(t.queryId);if(e)for(let n of t.logLines)er(this.logger,`info`,`query`,e,n);let{errorData:n}=t;this.remoteQuerySet.set(t.queryId,{success:!1,errorMessage:t.errorMessage,errorData:n===void 0?void 0:En(n),logLines:t.logLines});break}case`QueryRemoved`:this.remoteQuerySet.delete(t.queryId);break;default:throw Error(`Invalid modification ${t.type}`)}this.version=e.endVersion}remoteQueryResults(){return this.remoteQuerySet}timestamp(){return this.version.ts}};function jr(e){let t=nn(e);return xr.fromBytesLE(Array.from(t))}function Mr(e){return on(new Uint8Array(e.toBytesLE()))}function Nr(e){switch(e.type){case`FatalError`:case`AuthError`:case`ActionResponse`:case`TransitionChunk`:case`Ping`:return{...e};case`MutationResponse`:return e.success?{...e,ts:jr(e.ts)}:{...e};case`Transition`:return{...e,startVersion:{...e.startVersion,ts:jr(e.startVersion.ts)},endVersion:{...e.endVersion,ts:jr(e.endVersion.ts)}}}}function Pr(e){switch(e.type){case`Authenticate`:case`ModifyQuerySet`:case`Mutation`:case`Action`:case`Event`:return{...e};case`Connect`:return e.maxObservedTimestamp===void 0?{...e,maxObservedTimestamp:void 0}:{...e,maxObservedTimestamp:Mr(e.maxObservedTimestamp)}}}var Fr=Object.defineProperty,Ir=(e,t,n)=>t in e?Fr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,V=(e,t,n)=>Ir(e,typeof t==`symbol`?t:t+``,n);let Lr;function Rr(){return Lr===void 0&&(Lr=Date.now()),typeof performance>`u`||!performance.now?Date.now():Math.round(Lr+performance.now())}function zr(){return`t=${Math.round((Rr()-Lr)/100)/10}s`}let Br={InternalServerError:{timeout:1e3},SubscriptionsWorkerFullError:{timeout:3e3},TooManyConcurrentRequests:{timeout:3e3},CommitterFullError:{timeout:3e3},AwsTooManyRequestsException:{timeout:3e3},ExecuteFullError:{timeout:3e3},SystemTimeoutError:{timeout:3e3},ExpiredInQueue:{timeout:3e3},VectorIndexesUnavailable:{timeout:1e3},SearchIndexesUnavailable:{timeout:1e3},TableSummariesUnavailable:{timeout:1e3},VectorIndexTooLarge:{timeout:3e3},SearchIndexTooLarge:{timeout:3e3},TooManyWritesInTimePeriod:{timeout:3e3}};function Vr(e){if(e===void 0)return`Unknown`;for(let t of Object.keys(Br))if(e.startsWith(t))return t;return`Unknown`}var Hr=class{constructor(e,t,n,r,i,a){this.markConnectionStateDirty=i,this.debug=a,V(this,`socket`),V(this,`connectionCount`),V(this,`_hasEverConnected`,!1),V(this,`lastCloseReason`),V(this,`transitionChunkBuffer`,null),V(this,`defaultInitialBackoff`),V(this,`maxBackoff`),V(this,`retries`),V(this,`serverInactivityThreshold`),V(this,`reconnectDueToServerInactivityTimeout`),V(this,`scheduledReconnect`,null),V(this,`networkOnlineHandler`,null),V(this,`pendingNetworkRecoveryInfo`,null),V(this,`uri`),V(this,`onOpen`),V(this,`onResume`),V(this,`onMessage`),V(this,`webSocketConstructor`),V(this,`logger`),V(this,`onServerDisconnectError`),this.webSocketConstructor=n,this.socket={state:`disconnected`},this.connectionCount=0,this.lastCloseReason=`InitialConnect`,this.defaultInitialBackoff=1e3,this.maxBackoff=16e3,this.retries=0,this.serverInactivityThreshold=6e4,this.reconnectDueToServerInactivityTimeout=null,this.uri=e,this.onOpen=t.onOpen,this.onResume=t.onResume,this.onMessage=t.onMessage,this.onServerDisconnectError=t.onServerDisconnectError,this.logger=r,this.setupNetworkListener(),this.connect()}setSocketState(e){this.socket=e,this._logVerbose(`socket state changed: ${this.socket.state}, paused: ${`paused`in this.socket?this.socket.paused:void 0}`),this.markConnectionStateDirty()}setupNetworkListener(){typeof window<`u`&&typeof window.addEventListener==`function`&&this.networkOnlineHandler===null&&(this.networkOnlineHandler=()=>{this._logVerbose(`network online event detected`),this.tryReconnectImmediately()},window.addEventListener(`online`,this.networkOnlineHandler),this._logVerbose(`network online event listener registered`))}cleanupNetworkListener(){this.networkOnlineHandler&&typeof window<`u`&&typeof window.removeEventListener==`function`&&(window.removeEventListener(`online`,this.networkOnlineHandler),this.networkOnlineHandler=null,this._logVerbose(`network online event listener removed`))}assembleTransition(e){if(e.partNumber<0||e.partNumber>=e.totalParts||e.totalParts===0||this.transitionChunkBuffer&&(this.transitionChunkBuffer.totalParts!==e.totalParts||this.transitionChunkBuffer.transitionId!==e.transitionId))throw this.transitionChunkBuffer=null,Error(`Invalid TransitionChunk`);if(this.transitionChunkBuffer===null&&(this.transitionChunkBuffer={chunks:[],totalParts:e.totalParts,transitionId:e.transitionId}),e.partNumber!==this.transitionChunkBuffer.chunks.length){let t=this.transitionChunkBuffer.chunks.length;throw this.transitionChunkBuffer=null,Error(`TransitionChunk received out of order: expected part ${t}, got ${e.partNumber}`)}if(this.transitionChunkBuffer.chunks.push(e.chunk),this.transitionChunkBuffer.chunks.length===e.totalParts){let e=this.transitionChunkBuffer.chunks.join(``);this.transitionChunkBuffer=null;let t=Nr(JSON.parse(e));if(t.type!==`Transition`)throw Error(`Expected Transition, got ${t.type} after assembling chunks`);return t}return null}connect(){if(this.socket.state===`terminated`)return;if(this.socket.state!==`disconnected`&&this.socket.state!==`stopped`)throw Error(`Didn't start connection from disconnected state: `+this.socket.state);let e=new this.webSocketConstructor(this.uri);this._logVerbose(`constructed WebSocket`),this.setSocketState({state:`connecting`,ws:e,paused:`no`}),this.resetServerInactivityTimeout(),e.onopen=()=>{if(this.logger.logVerbose(`begin ws.onopen`),this.socket.state!==`connecting`)throw Error(`onopen called with socket not in connecting state`);if(this.setSocketState({state:`ready`,ws:e,paused:this.socket.paused===`yes`?`uninitialized`:`no`}),this.resetServerInactivityTimeout(),this.socket.paused===`no`&&(this._hasEverConnected=!0,this.onOpen({connectionCount:this.connectionCount,lastCloseReason:this.lastCloseReason,clientTs:Rr()})),this.lastCloseReason!==`InitialConnect`&&(this.lastCloseReason?this.logger.log(`WebSocket reconnected at`,zr(),`after disconnect due to`,this.lastCloseReason):this.logger.log(`WebSocket reconnected at`,zr())),this.connectionCount+=1,this.lastCloseReason=null,this.pendingNetworkRecoveryInfo!==null){let{timeSavedMs:e}=this.pendingNetworkRecoveryInfo;this.pendingNetworkRecoveryInfo=null,this.sendMessage({type:`Event`,eventType:`NetworkRecoveryReconnect`,event:{timeSavedMs:e}}),this.logger.log(`Network recovery reconnect saved ~${Math.round(e/1e3)}s of waiting`)}},e.onerror=e=>{this.transitionChunkBuffer=null;let t=e.message;t&&this.logger.log(`WebSocket error message: ${t}`)},e.onmessage=e=>{this.resetServerInactivityTimeout();let t=e.data.length,n=Nr(JSON.parse(e.data));if(this._logVerbose(`received ws message with type ${n.type}`),n.type!==`Ping`){if(n.type===`TransitionChunk`){let e=this.assembleTransition(n);if(!e)return;n=e,this._logVerbose(`assembled full ws message of type ${n.type}`)}this.transitionChunkBuffer!==null&&(this.transitionChunkBuffer=null,this.logger.log(`Received unexpected ${n.type} while buffering TransitionChunks`)),n.type===`Transition`&&this.reportLargeTransition({messageLength:t,transition:n}),this.onMessage(n).hasSyncedPastLastReconnect&&(this.retries=0,this.markConnectionStateDirty())}},e.onclose=e=>{if(this._logVerbose(`begin ws.onclose`),this.transitionChunkBuffer=null,this.lastCloseReason===null&&(this.lastCloseReason=e.reason||`closed with code ${e.code}`),e.code!==1e3&&e.code!==1001&&e.code!==1005&&e.code!==4040){let t=`WebSocket closed with code ${e.code}`;e.reason&&(t+=`: ${e.reason}`),this.logger.log(t),this.onServerDisconnectError&&e.reason&&this.onServerDisconnectError(t)}let t=Vr(e.reason);this.scheduleReconnect(t)}}socketState(){return this.socket.state}sendMessage(e){let t={type:e.type,...e.type===`Authenticate`&&e.tokenType===`User`?{value:`...${e.value.slice(-7)}`}:{}};if(this.socket.state===`ready`&&this.socket.paused===`no`){let n=Pr(e),r=JSON.stringify(n),i=!1;try{this.socket.ws.send(r),i=!0}catch(e){this.logger.log(`Failed to send message on WebSocket, reconnecting: ${e}`),this.closeAndReconnect(`FailedToSendMessage`)}return this._logVerbose(`${i?`sent`:`failed to send`} message with type ${e.type}: ${JSON.stringify(t)}`),!0}return this._logVerbose(`message not sent (socket state: ${this.socket.state}, paused: ${`paused`in this.socket?this.socket.paused:void 0}): ${JSON.stringify(t)}`),!1}resetServerInactivityTimeout(){this.socket.state!==`terminated`&&(this.reconnectDueToServerInactivityTimeout!==null&&(clearTimeout(this.reconnectDueToServerInactivityTimeout),this.reconnectDueToServerInactivityTimeout=null),this.reconnectDueToServerInactivityTimeout=setTimeout(()=>{this.closeAndReconnect(`InactiveServer`)},this.serverInactivityThreshold))}scheduleReconnect(e){this.scheduledReconnect&&(clearTimeout(this.scheduledReconnect.timeout),this.scheduledReconnect=null),this.socket={state:`disconnected`};let t=this.nextBackoff(e);this.markConnectionStateDirty(),this.logger.log(`Attempting reconnect in ${Math.round(t)}ms`);let n=Rr(),r=setTimeout(()=>{this.scheduledReconnect?.timeout===r&&(this.scheduledReconnect=null,this.connect())},t);this.scheduledReconnect={timeout:r,scheduledAt:n,backoffMs:t}}closeAndReconnect(e){switch(this._logVerbose(`begin closeAndReconnect with reason ${e}`),this.socket.state){case`disconnected`:case`terminated`:case`stopped`:return;case`connecting`:case`ready`:this.lastCloseReason=e,this.close(),this.scheduleReconnect(`client`);return;default:this.socket}}close(){switch(this.transitionChunkBuffer=null,this.socket.state){case`disconnected`:case`terminated`:case`stopped`:return Promise.resolve();case`connecting`:{let e=this.socket.ws;return e.onmessage=e=>{this._logVerbose(`Ignoring message received after close`)},new Promise(t=>{e.onclose=()=>{this._logVerbose(`Closed after connecting`),t()},e.onopen=()=>{this._logVerbose(`Opened after connecting`),e.close()}})}case`ready`:{this._logVerbose(`ws.close called`);let e=this.socket.ws;e.onmessage=e=>{this._logVerbose(`Ignoring message received after close`)};let t=new Promise(t=>{e.onclose=()=>{t()}});return e.close(),t}default:return this.socket,Promise.resolve()}}terminate(){switch(this.reconnectDueToServerInactivityTimeout&&clearTimeout(this.reconnectDueToServerInactivityTimeout),this.scheduledReconnect&&(clearTimeout(this.scheduledReconnect.timeout),this.scheduledReconnect=null),this.cleanupNetworkListener(),this.socket.state){case`terminated`:case`stopped`:case`disconnected`:case`connecting`:case`ready`:{let e=this.close();return this.setSocketState({state:`terminated`}),e}default:throw this.socket,Error(`Invalid websocket state: ${this.socket.state}`)}}stop(){switch(this.socket.state){case`terminated`:return Promise.resolve();case`connecting`:case`stopped`:case`disconnected`:case`ready`:{this.cleanupNetworkListener();let e=this.close();return this.socket={state:`stopped`},e}default:return this.socket,Promise.resolve()}}tryRestart(){switch(this.socket.state){case`stopped`:break;case`terminated`:case`connecting`:case`ready`:case`disconnected`:this.logger.logVerbose(`Restart called without stopping first`);return;default:this.socket}this.setupNetworkListener(),this.connect()}pause(){switch(this.socket.state){case`disconnected`:case`stopped`:case`terminated`:return;case`connecting`:case`ready`:this.socket={...this.socket,paused:`yes`};return;default:this.socket;return}}tryReconnectImmediately(){if(this._logVerbose(`tryReconnectImmediately called`),this.socket.state!==`disconnected`){this._logVerbose(`tryReconnectImmediately called but socket state is ${this.socket.state}, no action taken`);return}let e=null;if(this.scheduledReconnect){let t=Rr()-this.scheduledReconnect.scheduledAt;e=Math.max(0,this.scheduledReconnect.backoffMs-t),this._logVerbose(`would have waited ${Math.round(e)}ms more (backoff was ${Math.round(this.scheduledReconnect.backoffMs)}ms, elapsed ${Math.round(t)}ms)`),clearTimeout(this.scheduledReconnect.timeout),this.scheduledReconnect=null,this._logVerbose(`canceled scheduled reconnect`)}this.logger.log(`Network recovery detected, reconnecting immediately`),this.pendingNetworkRecoveryInfo=e===null?null:{timeSavedMs:e},this.connect()}resume(){switch(this.socket.state){case`connecting`:this.socket={...this.socket,paused:`no`};return;case`ready`:this.socket.paused===`uninitialized`?(this.socket={...this.socket,paused:`no`},this._hasEverConnected=!0,this.onOpen({connectionCount:this.connectionCount,lastCloseReason:this.lastCloseReason,clientTs:Rr()})):this.socket.paused===`yes`&&(this.socket={...this.socket,paused:`no`},this.onResume());return;case`terminated`:case`stopped`:case`disconnected`:return;default:this.socket}this.connect()}connectionState(){return{isConnected:this.socket.state===`ready`,hasEverConnected:this._hasEverConnected,connectionCount:this.connectionCount,connectionRetries:this.retries}}_logVerbose(e){this.logger.logVerbose(e)}nextBackoff(e){let t=(e===`client`?100:e===`Unknown`?this.defaultInitialBackoff:Br[e].timeout)*2**this.retries;this.retries+=1;let n=Math.min(t,this.maxBackoff);return n+n*(Math.random()-.5)}reportLargeTransition({transition:e,messageLength:t}){if(e.clientClockSkew===void 0||e.serverTs===void 0)return;let n=Rr()-e.clientClockSkew-e.serverTs/1e6,r=`${Math.round(n)}ms`,i=`${Math.round(t/1e4)/100}MB`,a=t/(n/1e3),o=`${Math.round(a/1e4)/100}MB per second`;this._logVerbose(`received ${i} transition in ${r} at ${o}`),t>2e7?this.logger.log(`received query results totaling more that 20MB (${i}) which will take a long time to download on slower connections`):n>2e4&&this.logger.log(`received query results totaling ${i} which took more than 20s to arrive (${r})`),this.debug&&this.sendMessage({type:`Event`,eventType:`ClientReceivedTransition`,event:{transitionTransitTime:n,messageLength:t}})}};function Ur(){return Wr()}function Wr(){return`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}var Gr=class extends Error{};Gr.prototype.name=`InvalidTokenError`;function Kr(e){return decodeURIComponent(atob(e).replace(/(.)/g,(e,t)=>{let n=t.charCodeAt(0).toString(16).toUpperCase();return n.length<2&&(n=`0`+n),`%`+n}))}function qr(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`);switch(t.length%4){case 0:break;case 2:t+=`==`;break;case 3:t+=`=`;break;default:throw Error(`base64 string is not of the correct length`)}try{return Kr(t)}catch{return atob(t)}}function Jr(e,t){if(typeof e!=`string`)throw new Gr(`Invalid token specified: must be a string`);t||(t={});let n=t.header===!0?0:1,r=e.split(`.`)[n];if(typeof r!=`string`)throw new Gr(`Invalid token specified: missing part #${n+1}`);let i;try{i=qr(r)}catch(e){throw new Gr(`Invalid token specified: invalid base64 for part #${n+1} (${e.message})`)}try{return JSON.parse(i)}catch(e){throw new Gr(`Invalid token specified: invalid json for part #${n+1} (${e.message})`)}}var Yr=Object.defineProperty,Xr=(e,t,n)=>t in e?Yr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,H=(e,t,n)=>Xr(e,typeof t==`symbol`?t:t+``,n),Zr=class{constructor(e,t,n){H(this,`authState`,{state:`noAuth`}),H(this,`configVersion`,0),H(this,`syncState`),H(this,`authenticate`),H(this,`stopSocket`),H(this,`tryRestartSocket`),H(this,`pauseSocket`),H(this,`resumeSocket`),H(this,`clearAuth`),H(this,`logger`),H(this,`refreshTokenLeewaySeconds`),H(this,`initialAuthTokenReuse`),H(this,`lastRefreshChange`),H(this,`tokenConfirmationAttempts`,0),this.syncState=e,this.authenticate=t.authenticate,this.stopSocket=t.stopSocket,this.tryRestartSocket=t.tryRestartSocket,this.pauseSocket=t.pauseSocket,this.resumeSocket=t.resumeSocket,this.clearAuth=t.clearAuth,this.logger=n.logger,this.refreshTokenLeewaySeconds=n.refreshTokenLeewaySeconds,this.initialAuthTokenReuse=n.initialAuthTokenReuse,this.lastRefreshChange=!1}notifyRefreshChange(e){this.authState.state!==`noAuth`&&this.authState.state!==`initialRefetch`&&this.authState.config.onRefreshChange&&this.lastRefreshChange!==e&&(this.lastRefreshChange=e,this.authState.config.onRefreshChange(e))}async setConfig(e,t,n){this.resetAuthState(),this._logVerbose(`pausing WS for auth token fetch`),this.pauseSocket();let r=await this.fetchTokenAndGuardAgainstRace(e,{forceRefreshToken:!1});if(r.isFromOutdatedConfig)return;let i={fetchToken:e,onAuthChange:t,onRefreshChange:n};r.value?(this.setAuthState({state:`waitingForServerConfirmationOfCachedToken`,config:i,hasRetried:!1}),this.authenticate(r.value)):(this.setAuthState({state:`initialRefetch`,config:i}),await this.refetchToken()),this._logVerbose(`resuming WS after auth token fetch`),this.resumeSocket()}onTransition(e){if(this.syncState.isCurrentOrNewerAuthVersion(e.endVersion.identity)&&!(e.endVersion.identity<=e.startVersion.identity)){if(this._logVerbose(`auth state is ${this.authState.state} when handling transition`),this.syncState.markAuthCompletion(),this.authState.state===`waitingForServerConfirmationOfCachedToken`){this._logVerbose(`server confirmed auth token is valid`);let t=this.syncState.getAuth()?.value;this.initialAuthTokenReuse&&t?this.scheduleTokenRefetch(t,e.clientClockSkew):this.refetchToken(),this.authState.config.onAuthChange(!0);return}this.authState.state===`waitingForServerConfirmationOfFreshToken`&&(this._logVerbose(`server confirmed new auth token is valid`),this.notifyRefreshChange(!1),this.scheduleTokenRefetch(this.authState.token),this.tokenConfirmationAttempts=0,this.authState.hadAuth||this.authState.config.onAuthChange(!0))}}onAuthError(e){if(e.authUpdateAttempted===!1&&(this.authState.state===`waitingForServerConfirmationOfFreshToken`||this.authState.state===`waitingForServerConfirmationOfCachedToken`)){this._logVerbose(`ignoring non-auth token expired error`);return}let{baseVersion:t}=e;if(!this.syncState.isCurrentOrNewerAuthVersion(t+1)){this._logVerbose(`ignoring auth error for previous auth attempt`);return}this.tryToReauthenticate(e)}async tryToReauthenticate(e){if(this._logVerbose(`attempting to reauthenticate: ${e.error}`),this.authState.state===`noAuth`||this.authState.state===`waitingForServerConfirmationOfFreshToken`&&this.tokenConfirmationAttempts>=2){this.logger.error(`Failed to authenticate: "${e.error}", check your server auth config`),this.syncState.hasAuth()&&this.syncState.clearAuth(),this.authState.state!==`noAuth`&&this.setAndReportAuthFailed(this.authState.config.onAuthChange);return}if(this.authState.state===`waitingForServerConfirmationOfFreshToken`&&(this.tokenConfirmationAttempts++,this._logVerbose(`retrying reauthentication, ${2-this.tokenConfirmationAttempts} attempts remaining`)),this.notifyRefreshChange(!0),await this.stopSocket(),this.authState.state===`noAuth`)return;let t=await this.fetchTokenAndGuardAgainstRace(this.authState.config.fetchToken,{forceRefreshToken:!0});t.isFromOutdatedConfig||(t.value&&this.syncState.isNewAuth(t.value)?(this.authenticate(t.value),this.setAuthState({state:`waitingForServerConfirmationOfFreshToken`,config:this.authState.config,token:t.value,hadAuth:this.authState.state===`notRefetching`||this.authState.state===`waitingForScheduledRefetch`})):(this._logVerbose(`reauthentication failed, could not fetch a new token`),this.syncState.hasAuth()&&this.syncState.clearAuth(),this.setAndReportAuthFailed(this.authState.config.onAuthChange)),this.tryRestartSocket())}async refetchToken(){if(this.authState.state===`noAuth`)return;this._logVerbose(`refetching auth token`);let e=await this.fetchTokenAndGuardAgainstRace(this.authState.config.fetchToken,{forceRefreshToken:!0});e.isFromOutdatedConfig||(e.value?this.syncState.isNewAuth(e.value)?(this.setAuthState({state:`waitingForServerConfirmationOfFreshToken`,hadAuth:this.syncState.hasAuth(),token:e.value,config:this.authState.config}),this.authenticate(e.value)):this.setAuthState({state:`notRefetching`,config:this.authState.config}):(this._logVerbose(`refetching token failed`),this.syncState.hasAuth()&&this.clearAuth(),this.setAndReportAuthFailed(this.authState.config.onAuthChange)),this._logVerbose(`restarting WS after auth token fetch (if currently stopped)`),this.tryRestartSocket())}scheduleTokenRefetch(e,t){if(this.authState.state===`noAuth`)return;let n=this.decodeToken(e);if(!n){this.logger.error(`Auth token is not a valid JWT, cannot refetch the token`);return}let{iat:r,exp:i}=n;if(!r||!i){this.logger.error(`Auth token does not have required fields, cannot refetch the token`);return}let a=i-r;if(a<=2){this.logger.error(`Auth token does not live long enough, cannot refetch the token`);return}let o;t===void 0?o=a:(o=i-(Date.now()-t)/1e3,o<=0&&(o=0));let s=Math.min(1728e6,(o-this.refreshTokenLeewaySeconds)*1e3);s<=0&&(this.logger.warn(`Refetching auth token immediately, configured leeway ${this.refreshTokenLeewaySeconds}s is larger than the token's lifetime ${o}s`),s=0);let c=setTimeout(()=>{this._logVerbose(`running scheduled token refetch`),this.refetchToken()},s);this.setAuthState({state:`waitingForScheduledRefetch`,refetchTokenTimeoutId:c,config:this.authState.config}),this._logVerbose(`scheduled preemptive auth token refetching in ${s}ms`)}async fetchTokenAndGuardAgainstRace(e,t){let n=++this.configVersion;this._logVerbose(`fetching token with config version ${n}`);let r=await e(t);return this.configVersion===n?{isFromOutdatedConfig:!1,value:r}:(this._logVerbose(`stale config version, expected ${n}, got ${this.configVersion}`),{isFromOutdatedConfig:!0})}stop(){this.resetAuthState(),this.configVersion++,this._logVerbose(`config version bumped to ${this.configVersion}`)}setAndReportAuthFailed(e){e(!1),this.resetAuthState()}resetAuthState(){this.notifyRefreshChange(!1),this.setAuthState({state:`noAuth`})}setAuthState(e){let t=e.state===`waitingForServerConfirmationOfFreshToken`?{hadAuth:e.hadAuth,state:e.state,token:`...${e.token.slice(-7)}`}:{state:e.state};switch(this._logVerbose(`setting auth state to ${JSON.stringify(t)}`),e.state){case`waitingForScheduledRefetch`:case`notRefetching`:case`noAuth`:this.tokenConfirmationAttempts=0}this.authState.state===`waitingForScheduledRefetch`&&clearTimeout(this.authState.refetchTokenTimeoutId),this.authState=e}decodeToken(e){try{return Jr(e)}catch(e){return this._logVerbose(`Error decoding token: ${e instanceof Error?e.message:`Unknown error`}`),null}}_logVerbose(e){this.logger.logVerbose(`${e} [v${this.configVersion}]`)}};let Qr=[`convexClientConstructed`,`convexWebSocketOpen`,`convexFirstMessageReceived`];function $r(e,t){let n={sessionId:t};typeof performance<`u`&&performance.mark&&performance.mark(e,{detail:n})}function ei(e){let t=e.name.slice(6);return t=t.charAt(0).toLowerCase()+t.slice(1),{name:t,startTime:e.startTime}}function ti(e){if(typeof performance>`u`||!performance.getEntriesByName)return[];let t=[];for(let n of Qr){let r=performance.getEntriesByName(n).filter(e=>e.entryType===`mark`).filter(t=>t.detail.sessionId===e);t.push(...r)}return t.map(ei)}var ni=Object.defineProperty,ri=(e,t,n)=>t in e?ni(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,U=(e,t,n)=>ri(e,typeof t==`symbol`?t:t+``,n),ii=class{constructor(e,t,n){if(U(this,`address`),U(this,`state`),U(this,`requestManager`),U(this,`webSocketManager`),U(this,`authenticationManager`),U(this,`remoteQuerySet`),U(this,`optimisticQueryResults`),U(this,`_transitionHandlerCounter`,0),U(this,`_nextRequestId`),U(this,`_onTransitionFns`,/* @__PURE__ */ new Map),U(this,`_sessionId`),U(this,`firstMessageReceived`,!1),U(this,`debug`),U(this,`logger`),U(this,`maxObservedTimestamp`),U(this,`connectionStateSubscribers`,/* @__PURE__ */ new Map),U(this,`nextConnectionStateSubscriberId`,0),U(this,`_lastPublishedConnectionState`),U(this,`markConnectionStateDirty`,()=>{Promise.resolve().then(()=>{let e=this.connectionState();if(JSON.stringify(e)!==JSON.stringify(this._lastPublishedConnectionState)){this._lastPublishedConnectionState=e;for(let t of this.connectionStateSubscribers.values())t(e)}})}),U(this,`mark`,e=>{this.debug&&$r(e,this.sessionId)}),typeof e==`object`)throw Error(`Passing a ClientConfig object is no longer supported. Pass the URL of the Convex deployment as a string directly.`);n?.skipConvexDeploymentUrlCheck!==!0&&sn(e),n={...n};let r=n.authRefreshTokenLeewaySeconds??10,i=n.webSocketConstructor;if(!i&&typeof WebSocket>`u`)throw Error(`No WebSocket global variable defined! To use Convex in an environment without WebSocket try the HTTP client: https://docs.convex.dev/api/classes/browser.ConvexHttpClient`);i=i||WebSocket,this.debug=n.reportDebugInfoToConvex??!1,this.address=e,this.logger=n.logger===!1?$n({verbose:n.verbose??!1}):n.logger!==!0&&n.logger?n.logger:Qn({verbose:n.verbose??!1});let a=e.search(`://`);if(a===-1)throw Error(`Provided address was not an absolute URL.`);let o=e.substring(a+3),s=e.substring(0,a),c;if(s===`http`)c=`ws`;else if(s===`https`)c=`wss`;else throw Error(`Unknown parent protocol ${s}`);let l=`${c}://${o}/api/${Ln}/sync`;this.state=new cr,this.remoteQuerySet=new Ar(e=>this.state.queryPath(e),this.logger),this.requestManager=new fr(this.logger,this.markConnectionStateDirty);let u=()=>{this.webSocketManager.pause(),this.state.pause()};this.authenticationManager=new Zr(this.state,{authenticate:e=>{let t=this.state.setAuth(e);return this.webSocketManager.sendMessage(t),t.baseVersion},stopSocket:()=>this.webSocketManager.stop(),tryRestartSocket:()=>this.webSocketManager.tryRestart(),pauseSocket:u,resumeSocket:()=>this.webSocketManager.resume(),clearAuth:()=>{this.clearAuth()}},{logger:this.logger,refreshTokenLeewaySeconds:r,initialAuthTokenReuse:n.initialAuthTokenReuse??!1}),this.optimisticQueryResults=new _r,this.addOnTransitionHandler(e=>{t(e.queries.map(e=>e.token))}),this._nextRequestId=0,this._sessionId=Ur();let{unsavedChangesWarning:d}=n;if(typeof window>`u`||window.addEventListener===void 0){if(d===!0)throw Error(`unsavedChangesWarning requested, but window.addEventListener not found! Remove {unsavedChangesWarning: true} from Convex client options.`)}else d!==!1&&window.addEventListener(`beforeunload`,e=>{if(this.requestManager.hasIncompleteRequests()){e.preventDefault();let t=`Are you sure you want to leave? Your changes may not be saved.`;return(e||window.event).returnValue=t,t}});this.webSocketManager=new Hr(l,{onOpen:e=>{this.mark(`convexWebSocketOpen`),this.webSocketManager.sendMessage({...e,type:`Connect`,sessionId:this._sessionId,maxObservedTimestamp:this.maxObservedTimestamp}),this.remoteQuerySet=new Ar(e=>this.state.queryPath(e),this.logger);let[t,n]=this.state.restart();n&&this.webSocketManager.sendMessage(n),this.webSocketManager.sendMessage(t);for(let e of this.requestManager.restart())this.webSocketManager.sendMessage(e)},onResume:()=>{let[e,t]=this.state.resume();t&&this.webSocketManager.sendMessage(t),e&&this.webSocketManager.sendMessage(e);for(let e of this.requestManager.resume())this.webSocketManager.sendMessage(e)},onMessage:e=>{switch(this.firstMessageReceived||(this.firstMessageReceived=!0,this.mark(`convexFirstMessageReceived`),this.reportMarks()),e.type){case`Transition`:{this.observedTimestamp(e.endVersion.ts),this.authenticationManager.onTransition(e),this.remoteQuerySet.transition(e),this.state.transition(e);let t=this.requestManager.removeCompleted(this.remoteQuerySet.timestamp());this.notifyOnQueryResultChanges(t);break}case`MutationResponse`:{e.success&&this.observedTimestamp(e.ts);let t=this.requestManager.onResponse(e);t!==null&&this.notifyOnQueryResultChanges(/* @__PURE__ */ new Map([[t.requestId,t.result]]));break}case`ActionResponse`:this.requestManager.onResponse(e);break;case`AuthError`:this.authenticationManager.onAuthError(e);break;case`FatalError`:{let t=tr(this.logger,e.error);throw this.webSocketManager.terminate(),t}}return{hasSyncedPastLastReconnect:this.hasSyncedPastLastReconnect()}},onServerDisconnectError:n.onServerDisconnectError},i,this.logger,this.markConnectionStateDirty,this.debug),this.mark(`convexClientConstructed`),n.expectAuth&&u()}hasSyncedPastLastReconnect(){return this.requestManager.hasSyncedPastLastReconnect()&&this.state.hasSyncedPastLastReconnect()}observedTimestamp(e){(this.maxObservedTimestamp===void 0||this.maxObservedTimestamp.lessThanOrEqual(e))&&(this.maxObservedTimestamp=e)}getMaxObservedTimestamp(){return this.maxObservedTimestamp}notifyOnQueryResultChanges(e){let t=this.remoteQuerySet.remoteQueryResults(),n=/* @__PURE__ */ new Map;for(let[e,r]of t){let t=this.state.queryToken(e);if(t!==null){let i={result:r,udfPath:this.state.queryPath(e),args:this.state.queryArgs(e)};n.set(t,i)}}let r=this.optimisticQueryResults.ingestQueryResultsFromServer(n,new Set(e.keys()));this.handleTransition({queries:r.map(e=>({token:e,modification:{kind:`Updated`,result:this.optimisticQueryResults.rawQueryResult(e)}})),reflectedMutations:Array.from(e).map(([e,t])=>({requestId:e,result:t})),timestamp:this.remoteQuerySet.timestamp()})}handleTransition(e){for(let t of this._onTransitionFns.values())t(e)}addOnTransitionHandler(e){let t=this._transitionHandlerCounter++;return this._onTransitionFns.set(t,e),()=>this._onTransitionFns.delete(t)}getCurrentAuthClaims(){let e=this.state.getAuth(),t={};if(e&&e.tokenType===`User`)try{t=e?Jr(e.value):{}}catch{t={}}else return;return{token:e.value,decoded:t}}setAuth(e,t,n){this.authenticationManager.setConfig(e,t,n)}hasAuth(){return this.state.hasAuth()}setAdminAuth(e,t){let n=this.state.setAdminAuth(e,t);this.webSocketManager.sendMessage(n)}clearAuth(){let e=this.state.clearAuth();this.webSocketManager.sendMessage(e)}subscribe(e,t,n){let r=N(t),{modification:i,queryToken:a,unsubscribe:o}=this.state.subscribe(e,r,n?.journal,n?.componentPath);return i!==null&&this.webSocketManager.sendMessage(i),{queryToken:a,unsubscribe:()=>{let e=o();e&&this.webSocketManager.sendMessage(e)}}}localQueryResult(e,t){let n=z(e,N(t));return this.optimisticQueryResults.queryResult(n)}localQueryResultByToken(e){return this.optimisticQueryResults.queryResult(e)}hasLocalQueryResultByToken(e){return this.optimisticQueryResults.hasQueryResult(e)}localQueryLogs(e,t){let n=z(e,N(t));return this.optimisticQueryResults.queryLogs(n)}queryJournal(e,t){let n=z(e,N(t));return this.state.queryJournal(n)}connectionState(){let e=this.webSocketManager.connectionState();return{hasInflightRequests:this.requestManager.hasInflightRequests(),isWebSocketConnected:e.isConnected,hasEverConnected:e.hasEverConnected,connectionCount:e.connectionCount,connectionRetries:e.connectionRetries,timeOfOldestInflightRequest:this.requestManager.timeOfOldestInflightRequest(),inflightMutations:this.requestManager.inflightMutations(),inflightActions:this.requestManager.inflightActions()}}subscribeToConnectionState(e){let t=this.nextConnectionStateSubscriberId++;return this.connectionStateSubscribers.set(t,e),()=>{this.connectionStateSubscribers.delete(t)}}async mutation(e,t,n){let r=await this.mutationInternal(e,t,n);if(!r.success)throw r.errorData===void 0?Error(nr(`mutation`,e,r)):rr(r,new In(nr(`mutation`,e,r)));return r.value}async mutationInternal(e,t,n,r){let{mutationPromise:i}=this.enqueueMutation(e,t,n,r);return i}enqueueMutation(e,t,n,r){let i=N(t);this.tryReportLongDisconnect();let a=this.nextRequestId;if(this._nextRequestId++,n!==void 0){let e=n.optimisticUpdate;if(e!==void 0){let t=this.optimisticQueryResults.applyOptimisticUpdate(t=>{e(t,i)instanceof Promise&&this.logger.warn(`Optimistic update handler returned a Promise. Optimistic updates should be synchronous.`)},a).map(e=>{let t=this.localQueryResultByToken(e);return{token:e,modification:{kind:`Updated`,result:t===void 0?void 0:{success:!0,value:t,logLines:[]}}}});this.handleTransition({queries:t,reflectedMutations:[],timestamp:this.remoteQuerySet.timestamp()})}}let o={type:`Mutation`,requestId:a,udfPath:e,componentPath:r,args:[F(i)]},s=this.webSocketManager.sendMessage(o);return{requestId:a,mutationPromise:this.requestManager.request(o,s)}}async action(e,t){let n=await this.actionInternal(e,t);if(!n.success)throw n.errorData===void 0?Error(nr(`action`,e,n)):rr(n,new In(nr(`action`,e,n)));return n.value}async actionInternal(e,t,n){let r=N(t),i=this.nextRequestId;this._nextRequestId++,this.tryReportLongDisconnect();let a={type:`Action`,requestId:i,udfPath:e,componentPath:n,args:[F(r)]},o=this.webSocketManager.sendMessage(a);return this.requestManager.request(a,o)}async close(){return this.authenticationManager.stop(),this.webSocketManager.terminate()}get url(){return this.address}get nextRequestId(){return this._nextRequestId}get sessionId(){return this._sessionId}reportMarks(){if(this.debug){let e=ti(this.sessionId);this.webSocketManager.sendMessage({type:`Event`,eventType:`ClientConnect`,event:e})}}tryReportLongDisconnect(){if(!this.debug)return;let e=this.connectionState().timeOfOldestInflightRequest;if(e===null||Date.now()-e.getTime()<=6e4)return;let t=`${this.address}/api/debug_event`;fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,"Convex-Client":`npm-${Ln}`},body:JSON.stringify({event:`LongWebsocketDisconnect`})}).then(e=>{e.ok||this.logger.warn(`Analytics request failed with response:`,e.body)}).catch(e=>{this.logger.warn(`Analytics response failed with error:`,e)})}};function ai(e){if(typeof e!=`object`||!e||!Array.isArray(e.page)||typeof e.isDone!=`boolean`||typeof e.continueCursor!=`string`)throw Error(`Not a valid paginated query result: ${e?.toString()}`);return e}var oi=Object.defineProperty,si=(e,t,n)=>t in e?oi(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ci=(e,t,n)=>si(e,typeof t==`symbol`?t:t+``,n),li=class{constructor(e,t){this.client=e,this.onTransition=t,ci(this,`paginatedQuerySet`,/* @__PURE__ */ new Map),ci(this,`lastTransitionTs`),this.lastTransitionTs=xr.fromNumber(0),this.client.addOnTransitionHandler(e=>this.onBaseTransition(e))}subscribe(e,t,n){let r=R(e),i=ir(r,t,n),a=()=>this.removePaginatedQuerySubscriber(i),o=this.paginatedQuerySet.get(i);return o?(o.numSubscribers+=1,{paginatedQueryToken:i,unsubscribe:a}):(this.paginatedQuerySet.set(i,{token:i,canonicalizedUdfPath:r,args:t,numSubscribers:1,options:{initialNumItems:n.initialNumItems},nextPageKey:0,pageKeys:[],pageKeyToQuery:/* @__PURE__ */ new Map,ongoingSplits:/* @__PURE__ */ new Map,skip:!1,id:n.id}),this.addPageToPaginatedQuery(i,null,n.initialNumItems),{paginatedQueryToken:i,unsubscribe:a})}localQueryResult(e,t,n){let r=ir(R(e),t,n);return this.localQueryResultByToken(r)}localQueryResultByToken(e){let t=this.paginatedQuerySet.get(e);if(!t)return;let n=this.activePageQueryTokens(t);if(n.length===0)return{results:[],status:`LoadingFirstPage`,loadMore:t=>this.loadMoreOfPaginatedQuery(e,t)};let r=[],i=!1,a=!1;for(let e of n){let t=this.client.localQueryResultByToken(e);if(t===void 0){i=!0,a=!1;continue}let n=ai(t);r=r.concat(n.page),a=!!n.isDone}let o;return o=i?r.length===0?`LoadingFirstPage`:`LoadingMore`:a?`Exhausted`:`CanLoadMore`,{results:r,status:o,loadMore:t=>this.loadMoreOfPaginatedQuery(e,t)}}onBaseTransition(e){let t=e.queries.map(e=>e.token),n=this.queriesContainingTokens(t),r=[];n.length>0&&(this.processPaginatedQuerySplits(n,e=>this.client.localQueryResultByToken(e)),r=n.map(e=>({token:e,modification:{kind:`Updated`,result:this.localQueryResultByToken(e)}})));let i={...e,paginatedQueries:r};this.onTransition(i)}loadMoreOfPaginatedQuery(e,t){this.mustGetPaginatedQuery(e);let n=this.queryTokenForLastPageOfPaginatedQuery(e),r=this.client.localQueryResultByToken(n);if(!r)return!1;let i=ai(r);if(i.isDone)return!1;this.addPageToPaginatedQuery(e,i.continueCursor,t);let a={timestamp:this.lastTransitionTs,reflectedMutations:[],queries:[],paginatedQueries:[{token:e,modification:{kind:`Updated`,result:this.localQueryResultByToken(e)}}]};return this.onTransition(a),!0}queriesContainingTokens(e){if(e.length===0)return[];let t=[],n=new Set(e);for(let[e,r]of this.paginatedQuerySet)for(let i of this.allQueryTokens(r))if(n.has(i)){t.push(e);break}return t}processPaginatedQuerySplits(e,t){for(let n of e){let e=this.mustGetPaginatedQuery(n),{ongoingSplits:r,pageKeyToQuery:i,pageKeys:a}=e;for(let[n,[a,o]]of r)t(i.get(a).queryToken)!==void 0&&t(i.get(o).queryToken)!==void 0&&this.completePaginatedQuerySplit(e,n,a,o);for(let n of a){if(r.has(n))continue;let a=i.get(n);if(!a)throw Error(`No page query for active pageKey ${n}`);let o=t(a.queryToken);if(!o)continue;let s=ai(o);s.splitCursor&&(s.pageStatus===`SplitRecommended`||s.pageStatus===`SplitRequired`||s.page.length>e.options.initialNumItems*2)&&this.splitPaginatedQueryPage(e,n,a.cursor,s.splitCursor,s.continueCursor)}}}splitPaginatedQueryPage(e,t,n,r,i){let a=e.nextPageKey++,o=e.nextPageKey++,s={numItems:e.options.initialNumItems,id:e.id},c=this.client.subscribe(e.canonicalizedUdfPath,{...e.args,paginationOpts:{...s,cursor:n,endCursor:r}});e.pageKeyToQuery.set(a,{...c,cursor:n});let l=this.client.subscribe(e.canonicalizedUdfPath,{...e.args,paginationOpts:{...s,cursor:r,endCursor:i}});e.pageKeyToQuery.set(o,{...l,cursor:r}),e.ongoingSplits.set(t,[a,o])}addPageToPaginatedQuery(e,t,n){let r=this.mustGetPaginatedQuery(e),i=r.nextPageKey++,a={cursor:t,numItems:n,id:r.id},o={...r.args,paginationOpts:a},s=this.client.subscribe(r.canonicalizedUdfPath,o);return r.pageKeys.push(i),r.pageKeyToQuery.set(i,{...s,cursor:t}),s}removePaginatedQuerySubscriber(e){let t=this.paginatedQuerySet.get(e);if(t&&(--t.numSubscribers,!(t.numSubscribers>0))){for(let e of t.pageKeyToQuery.values())e.unsubscribe();this.paginatedQuerySet.delete(e)}}completePaginatedQuerySplit(e,t,n,r){let i=e.pageKeyToQuery.get(t);e.pageKeyToQuery.delete(t);let a=e.pageKeys.indexOf(t);e.pageKeys.splice(a,1,n,r),e.ongoingSplits.delete(t),i.unsubscribe()}activePageQueryTokens(e){return e.pageKeys.map(t=>e.pageKeyToQuery.get(t).queryToken)}allQueryTokens(e){return Array.from(e.pageKeyToQuery.values()).map(e=>e.queryToken)}queryTokenForLastPageOfPaginatedQuery(e){let t=this.mustGetPaginatedQuery(e),n=t.pageKeys[t.pageKeys.length-1];if(n===void 0)throw Error(`No pages for paginated query ${e}`);return t.pageKeyToQuery.get(n).queryToken}mustGetPaginatedQuery(e){let t=this.paginatedQuerySet.get(e);if(!t)throw Error(`paginated query no longer exists for token `+e);return t}},ui=Object.defineProperty,di=(e,t,n)=>t in e?ui(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,fi=(e,t,n)=>di(e,typeof t==`symbol`?t:t+``,n),pi=class{constructor(e,t={}){fi(this,`listeners`),fi(this,`_client`),fi(this,`_paginatedClient`),fi(this,`callNewListenersWithCurrentValuesTimer`),fi(this,`_closed`),fi(this,`_disabled`),t.skipConvexDeploymentUrlCheck!==!0&&sn(e);let{disabled:n,...r}=t;this._closed=!1,this._disabled=!!n,typeof window>`u`&&!(`unsavedChangesWarning`in r)&&(r.unsavedChangesWarning=!1),this.disabled||(this._client=new ii(e,()=>{},r),this._paginatedClient=new li(this._client,e=>this._transition(e))),this.listeners=/* @__PURE__ */ new Set}get closed(){return this._closed}get client(){if(this._client)return this._client;throw Error(`ConvexClient is disabled`)}get paginatedClient(){if(this._paginatedClient)return this._paginatedClient;throw Error(`ConvexClient is disabled`)}get disabled(){return this._disabled}onUpdate(e,t,n,r){if(this.disabled)return this.createDisabledUnsubscribe();let{queryToken:i,unsubscribe:a}=this.client.subscribe(I(e),t),o={queryToken:i,callback:n,onError:r,unsubscribe:a,hasEverRun:!1,query:e,args:t,paginationOptions:void 0};this.listeners.add(o),this.queryResultReady(i)&&this.callNewListenersWithCurrentValuesTimer===void 0&&(this.callNewListenersWithCurrentValuesTimer=setTimeout(()=>this.callNewListenersWithCurrentValues(),0));let s={unsubscribe:()=>{this.closed||(this.listeners.delete(o),a())},getCurrentValue:()=>this.client.localQueryResultByToken(i),getQueryLogs:()=>this.client.localQueryLogs(i)},c=s.unsubscribe;return Object.assign(c,s),c}onPaginatedUpdate_experimental(e,t,n,r,i){if(this.disabled)return this.createDisabledUnsubscribe();let a={initialNumItems:n.initialNumItems,id:-1},{paginatedQueryToken:o,unsubscribe:s}=this.paginatedClient.subscribe(I(e),t,a),c={queryToken:o,callback:r,onError:i,unsubscribe:s,hasEverRun:!1,query:e,args:t,paginationOptions:a};this.listeners.add(c),this.paginatedClient.localQueryResultByToken(o)&&this.callNewListenersWithCurrentValuesTimer===void 0&&(this.callNewListenersWithCurrentValuesTimer=setTimeout(()=>this.callNewListenersWithCurrentValues(),0));let l={unsubscribe:()=>{this.closed||(this.listeners.delete(c),s())},getCurrentValue:()=>this.paginatedClient.localQueryResult(I(e),t,a),getQueryLogs:()=>[]},u=l.unsubscribe;return Object.assign(u,l),u}callNewListenersWithCurrentValues(){this.callNewListenersWithCurrentValuesTimer=void 0,this._transition({queries:[],paginatedQueries:[]},!0)}queryResultReady(e){return this.client.hasLocalQueryResultByToken(e)}createDisabledUnsubscribe(){let e=(()=>{});return Object.assign(e,{unsubscribe:e,getCurrentValue:()=>void 0,getQueryLogs:()=>void 0}),e}async close(){if(!this.disabled)return this.listeners.clear(),this._closed=!0,this._paginatedClient&&(this._paginatedClient=void 0),this.client.close()}getAuth(){if(!this.disabled)return this.client.getCurrentAuthClaims()}setAuth(e,t){this.disabled||this.client.setAuth(e,t??(()=>{}))}setAdminAuth(e,t){if(this.closed)throw Error(`ConvexClient has already been closed.`);this.disabled||this.client.setAdminAuth(e,t)}_transition({queries:e,paginatedQueries:t},n=!1){let r=[...e.map(e=>e.token),...t.map(e=>e.token)];for(let e of this.listeners){let{callback:t,queryToken:i,onError:a,hasEverRun:o}=e,s=ar(i),c=s?!!this.paginatedClient.localQueryResultByToken(i):this.client.hasLocalQueryResultByToken(i);if(r.includes(i)||n&&!o&&c){e.hasEverRun=!0;let n;try{n=s?this.paginatedClient.localQueryResultByToken(i):this.client.localQueryResultByToken(i)}catch(e){if(!(e instanceof Error))throw e;a?a(e,`Second argument to onUpdate onError is reserved for later use`):Promise.reject(e);continue}t(n,`Second argument to onUpdate callback is reserved for later use`)}}}async mutation(e,t,n){if(this.disabled)throw Error(`ConvexClient is disabled`);return await this.client.mutation(I(e),t,n)}async action(e,t){if(this.disabled)throw Error(`ConvexClient is disabled`);return await this.client.action(I(e),t)}async query(e,t){if(this.disabled)throw Error(`ConvexClient is disabled`);let n=this.client.localQueryResult(I(e),t);return n===void 0?new Promise((n,r)=>{let{unsubscribe:i}=this.onUpdate(e,t,e=>{i(),n(e)},e=>{i(),r(e)})}):Promise.resolve(n)}connectionState(){if(this.disabled)throw Error(`ConvexClient is disabled`);return this.client.connectionState()}subscribeToConnectionState(e){return this.disabled?()=>{}:this.client.subscribeToConnectionState(e)}},W=class extends Error{constructor(e,t){super(e),this.code=t}};function mi(e){let t=e?.data;return t?.message?t.message:e instanceof Error?e.message:`Something went wrong`}var hi=class{constructor(e){this.config=e,S(this,`client`,void 0),this.client=new pi(e.convexUrl,{unsavedChangesWarning:!1,skipConvexDeploymentUrlCheck:!/\.convex\.cloud\/?$/.test(e.convexUrl)})}close(){return this.client.close()}touch(e){return this.client.mutation(L.projects.touch,{publicId:this.config.project,origin:e}).catch(()=>null)}onStatus(e){return this.client.onUpdate(L.projects.status,{publicId:this.config.project},e,()=>{})}onPage(e,t,n){return this.client.onUpdate(L.comments.listForPage,{publicId:this.config.project,path:e},e=>t(e),n)}onMine(e,t){return this.client.onUpdate(L.comments.listMine,{publicId:this.config.project,...e},e=>t(e),()=>{})}onPages(e){return this.client.onUpdate(L.comments.pagesWithComments,{publicId:this.config.project},e,()=>{})}onSession(e,t){return this.client.onUpdate(L.sessions.validate,{publicId:this.config.project,sessionToken:e},t,()=>{})}onCommenter(e,t){return this.client.onUpdate(L.commenters.validate,{publicId:this.config.project,commenterToken:e},t,()=>{})}linkBrowser(e,t){return this.run(this.client.mutation(L.commenters.linkBrowser,{publicId:this.config.project,authorSecret:e,commenterToken:t}))}signOutCommenter(e){return this.client.mutation(L.commenters.signOut,{commenterToken:e}).catch(()=>null)}onOwnerComment(e,t,n){return this.client.onUpdate(L.comments.getForOwner,{publicId:this.config.project,id:e,sessionToken:t},e=>n(e),()=>{})}onThread(e,t){return this.client.onUpdate(L.replies.listForComment,{publicId:this.config.project,commentId:e},e=>t(e),()=>{})}getComment(e){return this.client.query(L.comments.getById,{publicId:this.config.project,id:e}).then(e=>e).catch(()=>null)}async createComment(e){let t;try{t=await fetch(`${this.config.convexSiteUrl}/widget/comments`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({publicId:this.config.project,...e})})}catch{throw new W(`Couldn't reach Nuni. Check your connection.`,`network`)}let n=await t.json().catch(()=>({}));if(!t.ok||!n.id)throw new W(n.message??`Couldn't post the comment`,n.code??`error`);return n.id}async createReply(e){let t;try{t=await fetch(`${this.config.convexSiteUrl}/widget/replies`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({publicId:this.config.project,...e})})}catch{throw new W(`Couldn't reach Nuni. Check your connection.`,`network`)}let n=await t.json().catch(()=>({}));if(!t.ok||!n.id)throw new W(n.message??`Couldn't post the reply`,n.code??`error`);return n.id}uploadScreenshot(e,t,n){return this.upload(`screenshot`,e,t,n)}uploadImage(e,t,n){return this.upload(`image`,e,t,n)}async upload(e,t,n,r){let i=await fetch(`${this.config.convexSiteUrl}/widget/${e}`,{method:`POST`,headers:{"Content-Type":r.type,"X-Nuni-Project":this.config.project,"X-Nuni-Comment":t,"X-Nuni-Author":n.authorSecret,...n.commenterToken?{"X-Nuni-Commenter":n.commenterToken}:{}},body:r});if(!i.ok){let e=await i.json().catch(()=>({}));throw new W(e.message??`Couldn't attach the image`,e.code??`error`)}}async run(e){try{return await e}catch(e){throw new W(mi(e),`error`)}}editOwn(e,t,n,r){return this.run(this.client.mutation(L.comments.editOwn,{id:e,...t,body:n,suggestion:r}))}deleteOwn(e,t){return this.run(this.client.mutation(L.comments.deleteOwn,{id:e,...t}))}resolve(e,t,n){return this.run(this.client.mutation(L.comments.resolve,{id:e,resolution:n,sessionToken:t}))}repin(e,t,n){return this.run(this.client.mutation(L.comments.repin,{id:e,anchor:t,sessionToken:n}))}async reportPins(e,t,n){try{await fetch(`${this.config.convexSiteUrl}/widget/pins`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({publicId:this.config.project,path:e,lost:t,found:n}),keepalive:!0})}catch{}}reopen(e,t){return this.run(this.client.mutation(L.comments.reopen,{id:e,sessionToken:t}))}editReply(e,t,n){return this.run(this.client.mutation(L.replies.editOwn,{id:e,...t,body:n}))}deleteReply(e,t){return this.run(this.client.mutation(L.replies.deleteOwn,{id:e,...t}))}removeReply(e,t){return this.run(this.client.mutation(L.replies.remove,{id:e,sessionToken:t}))}toggleReaction(e,t,n,r){return this.run(this.client.mutation(L.reactions.toggle,{publicId:this.config.project,commentId:e,targetId:t,emoji:n,...r}))}remove(e,t){return this.run(this.client.mutation(L.comments.remove,{id:e,sessionToken:t}))}};let gi=[`image/png`,`image/jpeg`,`image/webp`];function _i(e,t,n){return new Promise(r=>e.toBlob(r,t,n))}async function vi(e,t){for(let[n,r]of[[`image/webp`,.82],[`image/jpeg`,.8],[`image/jpeg`,.55]]){let i=await _i(e,n,r);if(i&&i.type===n&&i.size<=t)return i}return null}async function yi(e){if(!gi.includes(e.type))return null;let t;try{t=await createImageBitmap(e)}catch{return null}let n=Math.min(1,y.imageMaxSide/Math.max(t.width,t.height)),r=document.createElement(`canvas`);r.width=Math.max(1,Math.round(t.width*n)),r.height=Math.max(1,Math.round(t.height*n));try{let e=r.getContext(`2d`);if(!e)return null;e.fillStyle=`#fff`,e.fillRect(0,0,r.width,r.height),e.drawImage(t,0,0,r.width,r.height)}finally{t.close()}return vi(r,y.imageMaxBytes)}function G(e,t={},...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t))n!=null&&n!==!1&&(e.startsWith(`on`)&&typeof n==`function`?r.addEventListener(e.slice(2).toLowerCase(),n):e===`class`?r.className=String(n):n===!0?r.setAttribute(e,``):r.setAttribute(e,String(n)));for(let e of n.flat())e!=null&&e!==!1&&r.append(typeof e==`string`?document.createTextNode(e):e);return r}function K(e){let t=document.createElement(`span`);t.className=`icon`,t.setAttribute(`aria-hidden`,`true`);let n=new DOMParser().parseFromString(e,`image/svg+xml`);return t.append(document.importNode(n.documentElement,!0)),t}function bi(e){let t=e.trim().split(/\s+/).filter(Boolean);return(t.length>1?t[0][0]+t[t.length-1][0]:(t[0]??`?`).slice(0,2)).toUpperCase()}function xi(e){let t=0;for(let n of e)t=t*31+n.charCodeAt(0)>>>0;return`oklch(0.5 0.17 ${t%360})`}async function Si(e){try{return await navigator.clipboard.writeText(e),!0}catch{}let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.cssText=`position:fixed;top:0;left:0;opacity:0`,document.body.appendChild(t),t.select();try{return document.execCommand(`copy`)}catch{return!1}finally{t.remove()}}function Ci(e){let t=document.createElement(`span`);if(t.style.color=e,!t.style.color)return null;t.style.display=`none`,document.documentElement.appendChild(t);let n=getComputedStyle(t).color;if(t.remove(),/^rgba?\(/.test(n)){let e=n.match(/[\d.]+/g)?.map(Number);if(e&&e.length>=3)return[e[0],e[1],e[2]]}try{let t=document.createElement(`canvas`);t.width=t.height=1;let n=t.getContext(`2d`);if(!n)return null;n.fillStyle=e,n.fillRect(0,0,1,1);let[r,i,a]=n.getImageData(0,0,1,1).data;return[r,i,a]}catch{return null}}function wi([e,t,n]){let r=e=>{let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4},i=.2126*r(e)+.7152*r(t)+.0722*r(n);return 1.05/(i+.05)>=(i+.05)/.05?`#ffffff`:`#111111`}let Ti={toolbar:`Nuni comments`,comment:`Comment`,addComment:`Add a comment`,addCommentKey:`Add a comment ({key})`,cancelAdding:`Cancel adding a comment`,pickElement:`Pick an element`,allComments:`All comments`,openCount:`Comments on this page: {count} open`,commentSelection:`Comment on the selected text`,commentSelectionKey:`Comment on the selected text ({key})`,pickHint:`Click anything to comment, or drag to mark an area`,pickHintMobile:`Tap anything to comment`,pickHintKeys:`Arrow keys move, Enter comments, Esc cancels`,picked:`Selected {element}`,comments:`Comments`,close:`Close`,tabOpen:`Open ({count})`,tabResolved:`Resolved ({count})`,tabYours:`Yours ({count})`,yours:`Yours`,noYours:`Comments you leave on any page of this site show here.`,thisPage:`This page`,statusOpen:`Open`,loading:`Loading…`,noOpen:`No open comments on this page.`,noOpenKey:`No open comments on this page. Press {key} to add one.`,noResolved:`Nothing resolved yet.`,notFoundHere:`Couldn't find on this page`,searchComments:`Search comments`,noMatches:`No comments match “{query}”.`,otherPages:`Other pages`,openOnPage:`{count} open`,replyCount:{one:`{count} reply`,other:`{count} replies`},edited:`edited`,ownSite:`Own this website?`,claim:`Claim Nuni`,yourName:`Your name`,leaveComment:`Leave a comment`,notYou:`Not you?`,signIn:`Sign in`,signInGithub:`Sign in with GitHub to comment as yourself`,signOut:`Sign out`,signedInAs:`Signed in as {name}`,signedInGithub:`Signed in with GitHub`,cancel:`Cancel`,post:`Post`,posting:`Posting…`,save:`Save`,send:`{key} + Enter`,charsLeft:{one:`{count} character left`,other:`{count} characters left`},suggestEdit:`Suggest an edit`,suggestedEdit:`Suggested edit`,removeSuggestion:`Remove`,newText:`New text`,addNote:`Add a note (optional)`,addImage:`Add an image`,markUpScreenshot:`Mark up a screenshot`,preparingScreenshot:`Taking the screenshot…`,markUpTitle:`Mark up the screenshot`,markUpBox:`Box`,markUpArrow:`Arrow`,markUpPen:`Pen`,markUpUndo:`Undo`,markUpDone:`Attach`,markUpFailed:`Couldn't save the drawing as an image. Try again.`,imagesPublic:`Images are shown to everyone who can see this comment.`,imageN:`Image {n}`,removeImage:`Remove image {n}`,openImage:`Open the image`,pinLabel:`Comment by {name}: {body}`,commentBy:`Comment by {name}`,openScreenshot:`Open the screenshot`,screenshotTaken:`Screenshot taken when the comment was left`,resolved:`Resolved`,leftOn:`Left on {origin}`,approximate:`Approximate`,approximateHint:`The page changed; this pin is a best guess`,notFound:`Element not found`,originallyOn:`Originally on: {text}`,resolve:`Resolve`,reopen:`Reopen`,copyForAgent:`Copy for agent`,copyNewText:`Copy new text`,movePin:`Move pin`,movePinHint:`Click the element this comment is about`,pinMoved:`Pin moved`,closeOutdated:`Close as outdated`,closedOutdated:`Closed as outdated`,outdated:`Outdated`,lostHint:`This element isn't on the page any more. Move the pin to where it is now, or close the comment if it no longer applies.`,newTextCopied:`New text copied`,copyForAgentHint:`Copy for your coding agent`,loadingContext:`Loading page context…`,edit:`Edit`,delete:`Delete`,owner:`Owner`,addReaction:`Add a reaction`,reactions:`Reactions`,reactWith:`React with {emoji}`,reply:`Reply`,replyFirst:`Reply to start a thread`,sendReply:`Send reply`,editReply:`Edit reply`,deleteReply:`Delete reply`,confirmDeleteComment:`Delete this comment? This can't be undone.`,confirmDeleteReply:`Delete this reply?`,added:`Comment added`,saved:`Saved`,deleted:`Deleted`,replyDeleted:`Reply deleted`,reopened:`Reopened`,copied:`Copied for your coding agent`,copyFailed:`Couldn't copy`,signedIn:`You're signed in as the owner`,commenterSignedIn:`You're signed in`,signedOut:`Signed out`,linkGone:`That comment was deleted or is on another page`,enterName:`Enter your name`,writeFirst:`Write a comment first`,changeTextFirst:`Change the text to suggest an edit`,tooManyImages:`Add up to {count} images`,imageUnreadable:`Attach a PNG, JPEG or WebP image`,imageFailed:`Couldn't attach an image`,noScreenshot:`Couldn't take a screenshot of this element`,suggestionTooLong:`Suggestions are limited to {count} characters`,commentTooLong:`Comments are limited to {count} characters`,replyTooLong:`Replies are limited to {count} characters`,postFailed:`Couldn't post the comment`,replyFailed:`Couldn't post the reply`,reactFailed:`Couldn't react`,failed:`Something went wrong`,justNow:`just now`};function Ei(){if(typeof navigator>`u`)return!1;let e=navigator.userAgentData?.platform??navigator.platform??``;return/mac|iphone|ipad|ipod/i.test(e||navigator.userAgent)}function Di(e,t={}){let n={...Ti,...t},r=null,i=null;try{r=new Intl.PluralRules(e),i=new Intl.RelativeTimeFormat(e,{numeric:`auto`,style:`narrow`})}catch{r=new Intl.PluralRules,i=new Intl.RelativeTimeFormat(void 0,{numeric:`auto`,style:`narrow`})}let a=(e,t={})=>{let i=n[e]??Ti[e];return(typeof i==`string`?i:i[r.select(Number(t.count??0))]??i.other).replace(/\{(\w+)\}/g,(e,n)=>n in t?String(t[n]):e)};return{locale:e,t:a,timeAgo:(t,n=Date.now())=>{let r=Math.max(0,Math.round((n-t)/1e3));if(r<45)return a(`justNow`);let o=Math.round(r/60);if(o<60)return i.format(-o,`minute`);let s=Math.round(o/60);if(s<24)return i.format(-s,`hour`);let c=Math.round(s/24);if(c<30)return i.format(-c,`day`);try{return new Date(t).toLocaleDateString(e)}catch{return new Date(t).toLocaleDateString()}},mod:Ei()?`⌘`:`Ctrl`}}let q=e=>`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${e}</svg>`,J={comment:q(`<path d="M21 12a8 8 0 0 1-11.6 7.1L4 20l1-4.6A8 8 0 1 1 21 12z"/>`),list:q(`<path d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"/>`),close:q(`<path d="M18 6 6 18M6 6l12 12"/>`),check:q(`<path d="M20 6 9 17l-5-5"/>`),undo:q(`<path d="M3 7v6h6"/><path d="M21 17a9 9 0 0 0-15-6.7L3 13"/>`),trash:q(`<path d="M3 6h18M8 6V4h8v2M19 6l-1 14H6L5 6"/>`),edit:q(`<path d="M12 20h9"/><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"/>`),send:q(`<path d="m22 2-7 20-4-9-9-4z"/><path d="M22 2 11 13"/>`),bot:q(`<path d="M12 8V4H8"/><rect width="16" height="12" x="4" y="8" rx="2"/><path d="M2 14h2M20 14h2M15 13v2M9 13v2"/>`),smile:q(`<circle cx="12" cy="12" r="9"/><path d="M8 14s1.5 2 4 2 4-2 4-2M9 9h.01M15 9h.01"/>`),user:q(`<circle cx="12" cy="8" r="4"/><path d="M4 21a8 8 0 0 1 16 0"/>`),arrowUp:q(`<path d="M12 19V5M5 12l7-7 7 7"/>`),search:q(`<circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/>`),target:q(`<circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="3"/>`),image:q(`<rect width="18" height="18" x="3" y="3" rx="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.1-3.1a2 2 0 0 0-2.8 0L6 21"/>`),pen:q(`<path d="m12 19 7-7 3 3-7 7z"/><path d="m18 13-1.5-7.5L2 2l3.5 14.5L13 18z"/><path d="m2 2 7.6 7.6"/><circle cx="11" cy="11" r="2"/>`),github:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="currentColor"><path d="M12 .5a11.5 11.5 0 0 0-3.6 22.4c.6.1.8-.3.8-.6v-2c-3.2.7-3.9-1.5-3.9-1.5-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.8 1.3 3.5 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2a11 11 0 0 1 5.8 0c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.9 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.3c0 .3.2.7.8.6A11.5 11.5 0 0 0 12 .5z"/></svg>`,link:q(`<path d="M15 3h6v6M10 14 21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>`)},Oi=`nuni:locationchange`,ki=!1;function Ai(e){if(!ki){ki=!0;for(let e of[`pushState`,`replaceState`]){let t=history[e];history[e]=function(...e){let n=t.apply(this,e);return window.dispatchEvent(new Event(Oi)),n}}}let t=location.href,n=()=>{location.href!==t&&(t=location.href,e())};window.addEventListener(Oi,n),window.addEventListener(`popstate`,n),window.addEventListener(`hashchange`,n);let r=window.navigation,i=()=>setTimeout(n,0);return r?.addEventListener(`navigatesuccess`,i),()=>{window.removeEventListener(Oi,n),window.removeEventListener(`popstate`,n),window.removeEventListener(`hashchange`,n),r?.removeEventListener(`navigatesuccess`,i)}}async function ji(e){let t=new TextEncoder().encode(e);if(typeof crypto<`u`&&crypto.subtle){let e=await crypto.subtle.digest(`SHA-256`,t);return Mi(new Uint8Array(e))}return Mi(Pi(t))}function Mi(e){return Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``)}let Ni=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function Pi(e){let t=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),n=e.length*8,r=new Uint8Array(e.length+9+63>>6<<6);r.set(e),r[e.length]=128;let i=new DataView(r.buffer);i.setUint32(r.length-4,n>>>0),i.setUint32(r.length-8,Math.floor(n/2**32));let a=/* @__PURE__ */ new Uint32Array(64),o=(e,t)=>e>>>t|e<<32-t;for(let e=0;e<r.length;e+=64){for(let t=0;t<16;t++)a[t]=i.getUint32(e+t*4);for(let e=16;e<64;e++){let t=a[e-15],n=a[e-2],r=o(t,7)^o(t,18)^t>>>3,i=o(n,17)^o(n,19)^n>>>10;a[e]=a[e-16]+r+a[e-7]+i>>>0}let[n,r,s,c,l,u,d,f]=t;for(let e=0;e<64;e++){let t=o(l,6)^o(l,11)^o(l,25),i=l&u^~l&d,p=f+t+i+Ni[e]+a[e]>>>0,m=(o(n,2)^o(n,13)^o(n,22))+(n&r^n&s^r&s)>>>0;f=d,d=u,u=l,l=c+p>>>0,c=s,s=r,r=n,n=p+m>>>0}t[0]=t[0]+n>>>0,t[1]=t[1]+r>>>0,t[2]=t[2]+s>>>0,t[3]=t[3]+c>>>0,t[4]=t[4]+l>>>0,t[5]=t[5]+u>>>0,t[6]=t[6]+d>>>0,t[7]=t[7]+f>>>0}let s=/* @__PURE__ */ new Uint8Array(32),c=new DataView(s.buffer);return t.forEach((e,t)=>c.setUint32(t*4,e)),s}function Fi(e,t){e.scrollIntoView({block:`center`,inline:`center`,behavior:`instant`});let n=e;for(;n;){let e=n.parentElement;if(e){let r=e.ownerDocument.defaultView?.getComputedStyle(e),i=r&&/auto|scroll|hidden/.test(r.overflowX),a=r&&/auto|scroll|hidden/.test(r.overflowY);if(e!==e.ownerDocument.scrollingElement&&(i||a)){let n=E(e,document),r=t();e.scrollBy({left:i?r.x-n.left-e.clientLeft-e.clientWidth/2:0,top:a?r.y-n.top-e.clientTop-e.clientHeight/2:0,behavior:`instant`})}n=e;continue}let r=n.getRootNode();if(T(r)){n=r.host;continue}let i=n.ownerDocument,a=i.defaultView,o=Xe(i);if(a){let e=t(),n=o?E(o,document):{left:0,top:0};a.scrollBy({left:e.x-n.left-(o?.clientLeft??0)-a.innerWidth/2,top:e.y-n.top-(o?.clientTop??0)-a.innerHeight/2,behavior:`instant`})}n=o}}let Ii=/* @__PURE__ */ new Map;function Li(e){try{return window.localStorage.getItem(e)}catch{return Ii.get(e)??null}}function Y(e,t){try{t===null?window.localStorage.removeItem(e):window.localStorage.setItem(e,t)}catch{t===null?Ii.delete(e):Ii.set(e,t)}}let X={name:`nuni:name`,secret:`nuni:author-secret`,session:e=>`nuni:session:${e}`,commenter:e=>`nuni:commenter:${e}`,position:e=>`nuni:position:${e}`,lastViewed:e=>`nuni:last-viewed:${e}`};function Ri(e,t){if(e.quote)return e.quote.exact;if(e.region||!e.text||/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName)||e.text.length>=y.anchorTextMaxLength)return null;for(let e of t.querySelectorAll(`*`))if(C(e))return null;return e.text}function zi(e,t,n){return G(`div`,{class:`suggest`},G(`div`,{class:`suggest-label`},t,n),G(`del`,{},e.before),G(`ins`,{},e.after))}function Bi(e){return G(`div`,{class:`item-quote item-suggest`},G(`del`,{},e.before),` → `,G(`ins`,{},e.after))}let Vi=[`open`,`resolved`,`mine`],Hi=`nuni-picking`,Ui=[`pointerdown`,`mousedown`,`pointerup`,`mouseup`];function Wi(e){return Array.from(e.getClientRects()).filter(e=>e.width>0&&e.height>0)}function Gi(e,t){let n=e.region;if(!n)return null;let r=E(t,document);return{left:r.left+n.x*r.width,top:r.top+n.y*r.height,width:n.w*r.width,height:n.h*r.height}}let Ki=e=>e.replace(/\s+/g,` `).trim();function qi(e){typeof requestIdleCallback==`function`?requestIdleCallback(e,{timeout:100}):setTimeout(e,0)}function Ji(e,t=0){if(t>3)return[];let n=[];for(let r of Array.from(e.querySelectorAll(`iframe`))){let e=Ze(r);e?.documentElement&&n.push(e,...Ji(e,t+1))}return n}let Yi=`(max-width: 640px)`;function Xi(e){for(let t of e.images??[])URL.revokeObjectURL(t.url)}function Zi(e){if(!e||e.nodeType!==1)return!1;let t=e;return t.isContentEditable||t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.tagName===`SELECT`}function Qi(e,t){let n=G(`span`,{class:`avatar`,style:`background:${xi(e)}`},bi(e));if(t?.startsWith(`https://`)){let e=G(`img`,{src:t,alt:``,loading:`lazy`,referrerpolicy:`no-referrer`,onerror:()=>e.remove()});n.append(e)}return n}function $i(e){let t=e.tagName.toLowerCase(),n=e.id?`#${e.id}`:``,r=Array.from(e.classList).slice(0,2).map(e=>`.${e}`).join(``),i=C(e,40);return`${t}${n}${r}${i?` "${i}"`:``}`}function ea(e,t){let n=ta(e.page.path,t);if(n===null)return null;let r=new URL(n);return r.searchParams.set(`nuni`,e._id),r.toString()}function ta(e,t){let n=/[?#]/.test(e)?t.origin+e:t.origin+e+t.search;try{return new URL(n).origin===t.origin?n:null}catch{return null}}var na=class{constructor(e,t){this.config=e,this.runtime=t,S(this,`host`,void 0),S(this,`root`,void 0),S(this,`markLayer`,void 0),S(this,`pinLayer`,void 0),S(this,`overlayLayer`,void 0),S(this,`selectButton`,void 0),S(this,`uiLayer`,void 0),S(this,`modalLayer`,void 0),S(this,`markingUp`,!1),S(this,`api`,void 0),S(this,`cleanups`,[]),S(this,`pageUnsub`,null),S(this,`sessionUnsub`,null),S(this,`pageKey`,``),S(this,`comments`,[]),S(this,`loaded`,!1),S(this,`placements`,/* @__PURE__ */ new Map),S(this,`pins`,/* @__PURE__ */ new Map),S(this,`status`,null),S(this,`pages`,[]),S(this,`picking`,!1),S(this,`panelOpen`,!1),S(this,`tab`,`open`),S(this,`mine`,null),S(this,`mineUnsub`,null),S(this,`repinId`,null),S(this,`pinReported`,/* @__PURE__ */ new Map),S(this,`pinReportTimer`,0),S(this,`search`,``),S(this,`lastViewedId`,void 0),S(this,`card`,null),S(this,`activeId`,null),S(this,`hoverEl`,null),S(this,`toastTimer`,0),S(this,`toast`,null),S(this,`name`,Li(X.name)??``),S(this,`secret`,void 0),S(this,`secretHash`,``),S(this,`ownerToken`,void 0),S(this,`ownerName`,null),S(this,`commenterToken`,void 0),S(this,`commenter`,null),S(this,`commenterUnsub`,null),S(this,`mineToken`,null),S(this,`deepLinkId`,null),S(this,`extraComment`,null),S(this,`ownerDetail`,null),S(this,`ownerDetailId`,null),S(this,`ownerDetailLoaded`,!1),S(this,`ownerDetailUnsub`,null),S(this,`thread`,null),S(this,`threadId`,null),S(this,`threadUnsub`,null),S(this,`resolveRun`,0),S(this,`scopeWatchers`,/* @__PURE__ */ new Map),S(this,`pickDocs`,[]),S(this,`dragStart`,null),S(this,`dragBox`,null),S(this,`dragEnded`,!1),S(this,`selection`,null),S(this,`pointerDown`,!1),S(this,`selectionFrame`,0),S(this,`returnFocus`,null),S(this,`focusNext`,null),S(this,`confirming`,null),S(this,`live`,void 0),S(this,`layoutFrame`,0),S(this,`pinPositions`,/* @__PURE__ */ new Map),S(this,`resolveTimer`,0),S(this,`shownPlacements`,``),S(this,`i18n`,void 0),S(this,`position`,void 0),S(this,`toolbarDrag`,null),S(this,`endToolbarDrag`,null),S(this,`toolbarDropped`,!1),S(this,`isIgnored`,e=>e===this.host||this.host.contains(e)),S(this,`onFrameKey`,e=>this.onKeyDown(e)),S(this,`swallow`,e=>{if(this.fromPage(e)){if(e.type===`pointerdown`&&e instanceof PointerEvent){let t=this.fromPage(e);t&&(this.hoverEl=Yt(t),this.renderHighlight()),this.dragEnded=!1,this.dragStart=e.pointerType!==`touch`&&e.button===0&&(t?.ownerDocument??null)===document?{x:e.clientX,y:e.clientY}:null}if(e.type===`pointerup`&&this.dragBox){let e=this.dragBox;this.dragStart=null,this.dragBox=null,this.dragEnded=!0,setTimeout(()=>{this.dragEnded=!1,this.picking&&this.commentOnArea(e)},0)}else e.type===`pointerup`&&(this.dragStart=null);e.preventDefault(),e.stopPropagation()}}),S(this,`onPickMove`,e=>{let t=this.dragStart;if(t){let n=e.clientX-t.x,r=e.clientY-t.y;if(this.dragBox||Math.hypot(n,r)>6){this.dragBox={left:Math.min(t.x,e.clientX),top:Math.min(t.y,e.clientY),width:Math.abs(n),height:Math.abs(r)},this.renderHighlight();return}}let n=this.fromPage(e),r=n?Yt(n):null;r!==this.hoverEl&&(this.hoverEl=r,this.renderHighlight())}),S(this,`onPickClick`,e=>{let t=this.fromPage(e);if(!t||(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),this.dragEnded))return;let n=Yt(t),r=St(n,{x:e.clientX,y:e.clientY},{ignoreAttributePrefixes:[],document});this.openComposer({anchor:r,element:n})}),this.i18n=Di(e.locale,e.messages);let n=Li(X.secret);n||(n=v(),Y(X.secret,n)),this.secret=n,this.ownerToken=Li(X.session(e.project)),this.commenterToken=Li(X.commenter(e.project)),this.lastViewedId=Li(X.lastViewed(e.project)),this.position=ae(Li(X.position(e.project))??void 0,re,e.position),this.host=document.createElement(`div`),this.host.id=`nuni-root`,this.host.setAttribute(`data-nuni`,``),this.applyAppearance(),this.root=this.host.attachShadow({mode:`open`});let r=document.createElement(`style`);r.textContent=`
10
10
  :host {
11
11
  all: initial;
12
12
  position: fixed;
@@ -333,6 +333,10 @@ button { cursor: pointer; }
333
333
  justify-content: center;
334
334
  flex: none;
335
335
  }
336
+ .avatar { position: relative; overflow: hidden; }
337
+ .avatar img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
338
+ .signed-in { display: inline-flex; flex: none; color: var(--n-fg-muted); }
339
+ .signed-in .icon { width: 13px; height: 13px; }
336
340
  .author { font-weight: 600; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
337
341
  .meta { color: var(--n-fg-muted); font-size: 12px; white-space: nowrap; }
338
342
  .badge {
@@ -561,6 +565,10 @@ textarea.field { resize: vertical; min-height: 72px; max-height: 240px; }
561
565
  white-space: nowrap;
562
566
  }
563
567
  .cmp-link:hover { color: var(--n-fg); }
568
+ .cmp-head-guest { padding-right: 116px; }
569
+ .cmp-sign-in { position: absolute; top: 13px; right: 44px; height: 32px; display: inline-flex; align-items: center; gap: 4px; }
570
+ .cmp-sign-in .icon { width: 13px; height: 13px; }
571
+ .signed-in-as { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
564
572
  .composer .quote, .composer .suggest { margin: 6px 14px 0; }
565
573
  .suggest {
566
574
  display: grid;
@@ -796,4 +804,4 @@ a.item { color: inherit; text-decoration: none; }
796
804
  :host([data-position$="left"]) .toolbar { left: 12px; }
797
805
  :host([data-position^="top"]) .toolbar { top: 12px; }
798
806
  }
799
- `,this.markLayer=G(`div`,{class:`marks`,"aria-hidden":`true`}),this.pinLayer=G(`div`,{class:`pins`}),this.overlayLayer=G(`div`,{class:`overlay`}),this.uiLayer=G(`div`,{class:`ui`}),this.modalLayer=G(`div`,{class:`modal`}),this.selectButton=G(`button`,{class:`select-btn`,type:`button`,hidden:!0,title:this.withKey(`commentSelection`,`commentSelectionKey`),onmousedown:e=>e.preventDefault(),onpointerdown:e=>e.preventDefault(),onclick:()=>this.commentOnSelection()},K(J.comment),this.t(`comment`)),this.live=G(`div`,{class:`sr`,role:`status`,"aria-live":`polite`}),this.root.append(r,this.markLayer,this.pinLayer,this.overlayLayer,this.uiLayer,this.modalLayer,this.selectButton,this.live),this.uiLayer.addEventListener(`keydown`,e=>this.trapFocus(e)),this.root.addEventListener(`click`,e=>{this.toolbarDropped&&(e.preventDefault(),e.stopPropagation())},!0),this.api=new hi(e)}t(e,t){return this.i18n.t(e,t)}withKey(e,t){let n=this.config.hotkey;return n?this.t(t,{key:n.toUpperCase()}):this.t(e)}applyAppearance(){let{theme:e,accentColor:t,zIndex:n}=this.config;this.host.dataset.position=this.position,this.host.dataset.theme=e,n!==null&&(this.host.style.zIndex=String(n));let r=t?Ci(t):null;if(!r)return;let[i,a,o]=r;this.host.style.setProperty(`--n-accent`,`rgb(${i}, ${a}, ${o})`),this.host.style.setProperty(`--n-accent-soft`,`rgba(${i}, ${a}, ${o}, 0.14)`),this.host.style.setProperty(`--n-accent-fg`,wi(r))}start(){document.body.appendChild(this.host),ji(this.secret).then(e=>{this.secretHash=e,this.render()}),this.api.touch(location.origin),this.cleanups.push(this.api.onStatus(e=>{this.status=e,this.render()})),this.cleanups.push(this.api.onPages(e=>{this.pages=e,this.render()})),this.ownerToken&&this.watchSession(this.ownerToken),this.readDeepLink(),this.subscribePage(),this.cleanups.push(Ai(()=>{this.readDeepLink(),this.subscribePage()}));let e=e=>this.onKeyDown(e),t=()=>this.scheduleLayout(),n=e=>this.onMessage(e);window.addEventListener(`keydown`,e,!0),window.addEventListener(`scroll`,t,{capture:!0,passive:!0}),window.addEventListener(`resize`,t,{passive:!0}),window.addEventListener(`message`,n);let r=()=>this.scheduleSelection(),i=e=>{e.composedPath().includes(this.host)||(this.pointerDown=!0,this.scheduleSelection(),this.closeCardFromOutside(e))},a=()=>{this.pointerDown=!1,this.scheduleSelection()};document.addEventListener(`selectionchange`,r),document.addEventListener(`pointerdown`,i,!0),document.addEventListener(`pointerup`,a,!0),this.cleanups.push(()=>{document.removeEventListener(`selectionchange`,r),document.removeEventListener(`pointerdown`,i,!0),document.removeEventListener(`pointerup`,a,!0),cancelAnimationFrame(this.selectionFrame)}),this.cleanups.push(()=>{window.removeEventListener(`keydown`,e,!0),window.removeEventListener(`scroll`,t,!0),window.removeEventListener(`resize`,t),window.removeEventListener(`message`,n)});let o=new MutationObserver(e=>{e.every(e=>this.host.contains(e.target)||e.target===this.host)||this.scheduleResolve()});o.observe(document.body,{childList:!0,subtree:!0,characterData:!0,attributes:!0,attributeFilter:[`class`,`style`,`hidden`,`open`,`id`]});let s=new ResizeObserver(()=>this.scheduleLayout());s.observe(document.documentElement),this.cleanups.push(()=>{o.disconnect(),s.disconnect()}),this.render()}destroy(){this.setPicking(!1),this.endToolbarDrag?.(),this.pageUnsub?.(),this.sessionUnsub?.(),this.ownerDetailUnsub?.(),this.threadUnsub?.(),this.mineUnsub?.(),clearTimeout(this.pinReportTimer),this.resolveRun++;for(let e of this.scopeWatchers.values())e();this.scopeWatchers.clear();for(let e of this.cleanups)e();cancelAnimationFrame(this.layoutFrame),clearTimeout(this.resolveTimer),clearTimeout(this.toastTimer),this.host.remove(),this.api.close()}currentPageKey(){let e=new URL(location.href);return this.config.getPageKey(e)}subscribePage(){let e=this.currentPageKey();e===this.pageKey&&this.pageUnsub||(this.pageKey=e,this.pageUnsub?.(),this.comments=[],this.extraComment=null,this.loaded=!1,this.placements.clear(),this.pinReported.clear(),clearTimeout(this.pinReportTimer),this.card=null,this.activeId=null,this.pageUnsub=this.api.onPage(e,e=>{let t=this.extraComment,n=t&&!e.some(e=>e._id===t._id)?[...e,t]:e;this.comments=n.sort((e,t)=>e.createdAt-t.createdAt),this.loaded=!0,this.resolvePlacements(this.placements.size>0,this.deepLinkId??void 0),this.openDeepLink(),this.render()},()=>{}),this.render())}watchSession(e){this.sessionUnsub?.(),this.sessionUnsub=this.api.onSession(e,e=>{e.valid?this.ownerName=e.ownerName??this.t(`owner`):(this.ownerName=null,this.ownerToken=null,Y(X.session(this.config.project),null),this.sessionUnsub?.(),this.sessionUnsub=null),this.render()})}syncOwnerDetail(){let e=this.ownerToken,t=this.card?.kind===`thread`&&this.isOwner&&e?this.card.id:null;t!==this.ownerDetailId&&(this.ownerDetailUnsub?.(),this.ownerDetailUnsub=null,this.ownerDetail=null,this.ownerDetailLoaded=!1,this.ownerDetailId=t,t&&e&&(this.ownerDetailUnsub=this.api.onOwnerComment(t,e,e=>{this.ownerDetailId===t&&(this.ownerDetail=e,this.ownerDetailLoaded=!0,this.render())})))}syncThread(){let e=this.card?.kind===`thread`?this.card.id:null;e!==this.threadId&&(this.threadUnsub?.(),this.threadUnsub=null,this.thread=null,this.threadId=e,e&&(this.threadUnsub=this.api.onThread(e,t=>{this.threadId===e&&(this.thread=t,this.render())})))}get isOwner(){return!!(this.ownerToken&&this.ownerName)}isMine(e){return!!this.secretHash&&e.authorKeyHash===this.secretHash}visibleComments(){return this.comments.filter(e=>e.status===(this.panelOpen&&this.tab===`resolved`?`resolved`:`open`)||this.card?.kind===`thread`&&this.card.id===e._id)}scheduleResolve(){clearTimeout(this.resolveTimer),this.resolveTimer=window.setTimeout(()=>this.resolvePlacements(!0),200)}stillPlaced(e){let t=this.placements.get(e._id);if(!t?.element?.isConnected)return!1;let n=e.anchor.quote;if(n)return t.range!==void 0&&Ki(t.range.toString())===n.exact;let r=w(t.element),i=e.anchor.text;return!i||r===i||T(r,i)>.8}resolvePlacements(e,t){let n=++this.resolveRun,r=new Set(this.comments.map(e=>e._id));for(let e of this.placements.keys())r.has(e)||this.placements.delete(e);let i=this.comments.filter(t=>!(e&&this.stillPlaced(t))),a=t?i.findIndex(e=>e._id===t):-1;a>0&&i.unshift(...i.splice(a,1));let o=Ot(),s={isIgnored:this.isIgnored,document},c=()=>{if(n!==this.resolveRun)return;let t=performance.now();for(;i.length;){let e=i.shift(),n=Kt(e.anchor,document,s,o);if(this.placements.set(e._id,{element:n.element,confidence:n.confidence,range:n.range}),performance.now()-t>8)break}if(this.watchScopes(),this.renderPins(),this.layout(),i.length){qi(c);return}this.schedulePinReport(),(e||n>1)&&this.panelOpen&&this.placementSummary()!==this.shownPlacements&&this.render()};c()}schedulePinReport(){clearTimeout(this.pinReportTimer),this.pinReportTimer=window.setTimeout(()=>{if(!this.loaded||document.visibilityState!==`visible`)return;let e=[],t=[];for(let n of this.comments){if(n.status!==`open`||n.page.path!==this.pageKey)continue;let r=this.placements.get(n._id);if(!r)continue;let i=!r.element;if(i!==(this.pinReported.get(n._id)??!!n.pinLost)){if(e.length+t.length>=b.pinReportMax)break;this.pinReported.set(n._id,i),(i?e:t).push(n._id)}}(e.length||t.length)&&this.api.reportPins(this.pageKey,e,t)},3e3)}placementSummary(){return this.comments.map(e=>{let t=this.placements.get(e._id);return t?.element?t.confidence===`low`?`~`:`+`:`-`}).join(``)}watchScopes(){let e=/* @__PURE__ */ new Set;for(let{element:t}of this.placements.values()){let n=t;for(let t=0;n&&t<8;t++){let t=qe(n);if(t===document)break;e.add(t),n=E(t)?t.host:Ye(t)}}for(let[t,n]of this.scopeWatchers)e.has(t)||(n(),this.scopeWatchers.delete(t));for(let t of e)this.scopeWatchers.has(t)||this.scopeWatchers.set(t,this.watchScope(t))}watchScope(e){let t=new MutationObserver(()=>this.scheduleResolve()),n=E(e)?null:e;t.observe(n?n.body??n.documentElement:e,{childList:!0,subtree:!0,characterData:!0,attributes:!0,attributeFilter:[`class`,`style`,`hidden`,`open`,`id`]});let r=()=>this.scheduleLayout(),i=n?.defaultView??e;return i.addEventListener(`scroll`,r,{capture:!0,passive:!0}),n?.defaultView?.addEventListener(`resize`,r,{passive:!0}),()=>{t.disconnect(),i.removeEventListener(`scroll`,r,!0),n?.defaultView?.removeEventListener(`resize`,r)}}pinPoint(e){let t=this.placements.get(e._id),n=t?.element;return!n||!De(n)||D(n,document).clipped?null:this.anchorPoint(e.anchor,n,t.range)}anchorPoint(e,t,n){if(n&&n.startContainer.ownerDocument===document){let e=Wi(n).at(-1);if(e)return{x:e.right,y:e.top+e.height/2}}let r=D(t,document);return{x:r.left+e.offset.x*r.width,y:r.top+e.offset.y*r.height}}renderMarks(){let e=[],t=(t,n)=>{let r=G(`div`,{class:n});Object.assign(r.style,{left:`${t.left}px`,top:`${t.top}px`,width:`${t.width}px`,height:`${t.height}px`}),e.push(r)},n=(e,n,r,i)=>{if(n){if(r&&r.startContainer.ownerDocument===document)for(let e of Wi(r))t(e,i?`mark mark-active`:`mark`);if(i){let r=Gi(e,n);r&&t(r,`area`)}}};if(this.card?.kind===`composer`){let{draft:e}=this.card;n(e.anchor,e.element,e.range,!0)}for(let e of this.visibleComments()){let t=this.placements.get(e._id),r=this.activeId===e._id;(r||e.status===`open`&&e.anchor.quote)&&(this.pins.get(e._id)?.hidden||n(e.anchor,t?.element,t?.range,r))}this.markLayer.replaceChildren(...e)}scheduleLayout(){this.layoutFrame||(this.layoutFrame=requestAnimationFrame(()=>{this.layoutFrame=0,this.layout()}))}layout(){let e=window.innerWidth,t=window.innerHeight,n=[];this.pinPositions.clear();for(let r of this.visibleComments()){let i=this.pins.get(r._id);if(!i)continue;let a=this.pinPoint(r);if(i.hidden=!(a&&a.x>=-10&&a.y>=-10&&a.x<=e+10&&a.y<=t+10),!a)continue;let o=a.y,s=a.x;for(;n.some(e=>Math.abs(e.x-s)<14&&Math.abs(e.y-o)<14);)s+=18;n.push({x:s,y:o}),this.pinPositions.set(r._id,{x:s,y:o}),i.style.transform=`translate(${Math.round(s)}px, ${Math.round(o)}px)`}this.renderMarks(),this.positionCard(),this.picking&&(this.hoverEl||this.dragBox)&&this.renderHighlight(),this.placeSelectButton()}setPicking(e){if(e||(this.repinId=null),this.picking===e)return;this.picking=e;let t=document.documentElement;if(this.dragStart=null,this.dragBox=null,e){this.card=null,window.matchMedia(Yi).matches&&(this.panelOpen=!1),this.pickDocs=[document,...Ji(document)];for(let e of this.pickDocs){e.documentElement.classList.add(Hi),this.injectCursorStyle(e),e.addEventListener(`pointermove`,this.onPickMove,!0),e.addEventListener(`click`,this.onPickClick,!0);for(let t of Ui)e.addEventListener(t,this.swallow,{capture:!0,passive:!1});e!==document&&e.addEventListener(`keydown`,this.onFrameKey,!0)}}else{t.classList.remove(Hi),this.hoverEl=null;for(let e of this.pickDocs){e.documentElement?.classList.remove(Hi),e.removeEventListener(`pointermove`,this.onPickMove,!0),e.removeEventListener(`click`,this.onPickClick,!0);for(let t of Ui)e.removeEventListener(t,this.swallow,!0);e.removeEventListener(`keydown`,this.onFrameKey,!0)}this.pickDocs=[]}this.render()}injectCursorStyle(e){if(e.getElementById(`nuni-cursor-style`))return;let t=e.createElement(`style`);t.id=`nuni-cursor-style`,t.textContent=`html.${Hi}, html.${Hi} * { cursor: crosshair !important; }`,(e.head??e.documentElement).appendChild(t),this.cleanups.push(()=>t.remove())}fromPage(e){let t=e.composedPath();if(t.includes(this.host))return null;let n=t[0]??e.target;return n&&n.nodeType===1?n:null}commentOnArea(e){let t=Tt(document,e,this.isIgnored),n=Dt(t,e,{ignoreAttributePrefixes:[],document});this.openComposer({anchor:n,element:t})}pageSelection(){let e=document.getSelection();if(!e||e.isCollapsed||!e.rangeCount)return null;let t=e.getRangeAt(0),n=t.commonAncestorContainer,r=n.nodeType===1?n:n.parentElement;return!r||r===this.host||this.host.contains(r)||r.closest(`input, textarea, select, [contenteditable]`)||r.closest(`[data-nuni]`)?null:Ki(t.toString())?t:null}commentOnSelection(){let e=this.pageSelection();if(!e)return;let t=wt(e,{ignoreAttributePrefixes:[],document});if(!t)return;let n=e.cloneRange();document.getSelection()?.removeAllRanges(),this.selection=null,this.openComposer({...t,range:n})}scheduleSelection(){this.selectionFrame||(this.selectionFrame=requestAnimationFrame(()=>{this.selectionFrame=0,this.selection=this.picking||this.pointerDown?null:this.pageSelection(),this.placeSelectButton()}))}placeSelectButton(){let e=this.selectButton,t=this.selection,n=t?Wi(t).at(-1):void 0,r=window.innerWidth,i=window.innerHeight;if(!t||!n||n.bottom<0||n.top>i){e.hidden=!0;return}e.hidden=!1;let a=e.offsetWidth||96,o=e.offsetHeight||32,s=n.bottom+8;s+o>i-8&&(s=n.top-o-8);let c=Math.max(8,Math.min(n.right-a/2,r-a-8));e.style.transform=`translate(${Math.round(c)}px, ${Math.round(s)}px)`}openComposer(e){let{element:t}=e,n=this.repinId;if(this.setPicking(!1),n){this.movePin(n,e);return}if(this.config.capture.dom)try{e.dom=xe(t)}catch{}e.suggestFrom=Ri(e.anchor,t),this.card={kind:`composer`,draft:e},this.activeId=null,this.render(),this.focusComposer(),e.screenshot=this.takeScreenshot(e)}canScreenshot(e){return!!this.runtime.loadScreenshot&&e.element.ownerDocument===document}async takeScreenshot(e){let t=this.runtime.loadScreenshot;if(!t||!this.canScreenshot(e))return null;let n=getComputedStyle(this.host).getPropertyValue(`--n-accent`).trim()||`#d6246e`;try{await new Promise(e=>setTimeout(e,60));let r=await t(),{range:i,anchor:a,element:o}=e,s=i?()=>i.getBoundingClientRect():a.region?()=>{let e=Gi(a,o);return{left:e.left,top:e.top,right:e.left+e.width,bottom:e.top+e.height}}:void 0;return r?await r.capture(o,{exclude:this.host,accent:n,focus:s}):null}catch{return null}}collectContext(e){let{collectors:t}=this.runtime,n={},r=t.console(),i=t.network();return r.length&&(n.console=r),i.length&&(n.network=i),e.dom&&(n.dom=e.dom),Object.keys(n).length?n:void 0}async attachScreenshot(e,t){try{let n=await t;n&&await this.api.uploadScreenshot(e,this.secret,n)}catch{}}async attachImages(e,t){let n=t.images??[];Xi(t);try{for(let t of n)await this.api.uploadImage(e,this.secret,t.blob)}catch(e){this.showToast(e instanceof W?e.message:this.t(`imageFailed`))}}canAttach(e){return this.config.images&&!!this.status?.claimed&&(e.images?.length??0)<b.imagesPerComment}async addImages(e,t){e.error=void 0;for(let n of t){if((e.images?.length??0)>=b.imagesPerComment){e.error=this.t(`tooManyImages`,{count:b.imagesPerComment});break}let t=await yi(n);if(!t){e.error=this.t(`imageUnreadable`);continue}(e.images??(e.images=[])).push({blob:t,url:URL.createObjectURL(t)})}this.render(),this.positionCard()}async markUpScreenshot(e){let t=this.runtime.loadScreenshot;if(!t||!e.screenshot||e.preparingMarkup)return;e.preparingMarkup=!0,e.error=void 0,this.render();let[n,r]=await Promise.all([t(),e.screenshot]);if(e.preparingMarkup=!1,!n||!r){this.setDraftError(e,this.t(`noScreenshot`));return}this.markingUp=!0;try{let t=await n.markUp(r,{container:this.modalLayer,color:`#e5484d`,labels:{title:this.t(`markUpTitle`),box:this.t(`markUpBox`),arrow:this.t(`markUpArrow`),pen:this.t(`markUpPen`),undo:this.t(`markUpUndo`),cancel:this.t(`cancel`),done:this.t(`markUpDone`),failed:this.t(`markUpFailed`)}});t&&(e.images??(e.images=[])).push({blob:t,url:URL.createObjectURL(t)})}finally{this.markingUp=!1}this.render(),this.positionCard()}copyForAgent(e){let t=this.ownerDetail?._id===e._id?this.ownerDetail:null,n=this.threadId===e._id?this.thread?.replies:void 0;Si(m(t??{...e,replies:n},{includeContext:!!t})).then(e=>this.showToast(e?this.t(`copied`):this.t(`copyFailed`)))}renderHighlight(){if(this.overlayLayer.replaceChildren(),!this.picking)return;let e=window.matchMedia(Yi).matches;if(this.overlayLayer.append(G(`div`,{class:`pick-hint`},this.repinId?this.t(`movePinHint`):e?this.t(`pickHintMobile`):[G(`span`,{},this.t(`pickHint`)),G(`span`,{class:`pick-keys`},this.t(`pickHintKeys`))])),this.dragBox){let e=G(`div`,{class:`highlight drag-box`});Object.assign(e.style,{left:`${this.dragBox.left}px`,top:`${this.dragBox.top}px`,width:`${this.dragBox.width}px`,height:`${this.dragBox.height}px`}),this.overlayLayer.append(e);return}let t=this.hoverEl;if(!t||t===t.ownerDocument.documentElement)return;let n=D(t,document),r=G(`div`,{class:`highlight`},G(`span`,{class:`highlight-label`},$i(t)));Object.assign(r.style,{left:`${n.left-2}px`,top:`${n.top-2}px`,width:`${n.width+4}px`,height:`${n.height+4}px`}),this.overlayLayer.append(r)}onKeyDown(e){if(this.markingUp)return;let t=e.composedPath().includes(this.host);if(e.key===`Escape`){if(this.confirming)this.answer(!1);else if(this.picking)this.setPicking(!1);else if(this.card)this.closeCard();else if(this.panelOpen&&this.search)this.search=``,this.render();else if(this.panelOpen)this.togglePanel(!1);else return;e.stopPropagation();return}if(Zi(e.composedPath()[0]??e.target)||e.metaKey||e.ctrlKey||e.altKey||this.picking&&!t&&this.onPickKey(e)||t&&this.confirming||e.repeat)return;let n=this.config.hotkey;n&&e.key.toLowerCase()===n&&(e.preventDefault(),!this.picking&&this.pageSelection()?this.commentOnSelection():this.setPicking(!this.picking))}onPickKey(e){if(![`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`,`Enter`].includes(e.key))return!1;e.preventDefault(),e.stopPropagation();let t=this.hoverEl;if(!t||!t.isConnected)return this.movePickTo(this.keyboardStart()),!0;if(e.key===`Enter`){let e=t.getBoundingClientRect(),n=St(t,{x:e.left+e.width/2,y:e.top+e.height/2},{ignoreAttributePrefixes:[],document});return this.openComposer({anchor:n,element:t}),!0}let n=t=>{for(;t&&(t===this.host||!De(t));)t=e.key===`ArrowLeft`?t.previousElementSibling:t.nextElementSibling;return t},r=t.ownerDocument.body;return e.key===`ArrowUp`?t.parentElement&&t!==r&&(t=t.parentElement):t=e.key===`ArrowDown`?n(t.firstElementChild)??t:e.key===`ArrowLeft`?n(t.previousElementSibling)??t:n(t.nextElementSibling)??t,this.movePickTo(t),!0}keyboardStart(){let e=document.activeElement;if(e&&e!==document.body&&e!==this.host)return e;let t=document.elementsFromPoint(window.innerWidth/2,window.innerHeight/2).find(e=>!this.isIgnored(e));return t?Yt(t):document.body}movePickTo(e){this.hoverEl=e,e.scrollIntoView({block:`nearest`,inline:`nearest`}),this.live.textContent=this.t(`picked`,{element:$i(e)}),this.renderHighlight()}trapFocus(e){if(e.key!==`Tab`)return;let t=e.composedPath()[0]?.closest?.(`.confirm, [data-card], .panel`);if(!t)return;let n=Array.from(t.querySelectorAll(`button:not([disabled]), input, textarea, a[href], [tabindex="0"]`)).filter(e=>!e.closest(`[hidden]`));if(!n.length)return;let r=n[0],i=n[n.length-1],a=this.root.activeElement;e.shiftKey&&a===r?(e.preventDefault(),i.focus()):!e.shiftKey&&a===i&&(e.preventDefault(),r.focus())}keepFocus(){if(this.returnFocus)return;let e=this.root.activeElement;if(e){this.returnFocus=e.dataset.focusKey??e;return}let t=document.activeElement;this.returnFocus=t&&t!==document.body&&t!==this.host?t:null}restoreFocus(){let e=this.returnFocus;this.returnFocus=null;let t=typeof e==`string`?this.uiLayer.querySelector(`[data-focus-key="${e}"]`):e;t?.isConnected&&t.focus({preventScroll:!0})}ask(e,t){this.confirming?.done(!1);let n=this.root.activeElement?.dataset.focusKey??null;return new Promise(r=>{this.confirming={message:e,action:t,done:r,from:n},this.focusNext=`[data-focus-key="confirm-cancel"]`,this.render()})}answer(e){let t=this.confirming;t&&(this.confirming=null,!e&&t.from&&(this.focusNext=`[data-focus-key="${t.from}"]`),this.render(),t.done(e))}renderConfirm(){let e=this.confirming;return e?G(`div`,{class:`confirm-backdrop`,onclick:()=>this.answer(!1)},G(`div`,{class:`confirm`,role:`alertdialog`,"aria-modal":`true`,"aria-labelledby":`nuni-confirm-text`,onclick:e=>e.stopPropagation()},G(`p`,{id:`nuni-confirm-text`},e.message),G(`div`,{class:`row`},G(`span`,{class:`spacer`}),G(`button`,{class:`btn btn-ghost`,type:`button`,"data-focus-key":`confirm-cancel`,onclick:()=>this.answer(!1)},this.t(`cancel`)),G(`button`,{class:`btn btn-danger-solid`,type:`button`,"data-focus-key":`confirm-ok`,onclick:()=>this.answer(!0)},e.action)))):null}openClaim(){let e=new URL(`${this.config.appUrl}/dashboard/claim`);e.searchParams.set(`project`,this.config.project),e.searchParams.set(`origin`,location.origin),window.open(e.toString(),`nuni-claim`,`popup,width=480,height=680`)||(location.href=e.toString())}onMessage(e){let t;try{t=new URL(this.config.appUrl).origin}catch{return}if(e.origin!==t)return;let n=e.data;n&&n.type===`nuni:session`&&n.project===this.config.project&&typeof n.token==`string`&&n.token.startsWith(`nuni_s_`)&&(this.ownerToken=n.token,Y(X.session(this.config.project),n.token),this.watchSession(n.token),this.showToast(this.t(`signedIn`)))}readDeepLink(){let e=new URL(location.href),t=e.searchParams.get(`nuni`);t&&(this.deepLinkId=t,e.searchParams.delete(`nuni`),history.replaceState(history.state,``,e.toString()))}openDeepLink(){let e=this.deepLinkId;if(!e||!this.loaded)return;this.deepLinkId=null;let t=this.comments.find(t=>t._id===e);if(t){this.focusDeepLinked(t);return}this.api.getComment(e).then(e=>{if(!e||e.page.path!==this.pageKey){this.showToast(this.t(`linkGone`));return}this.extraComment=e,this.comments=[...this.comments.filter(t=>t._id!==e._id),e],this.resolvePlacements(!1,e._id),this.focusDeepLinked(e)})}focusDeepLinked(e){this.focusComment(e._id)}focusComment(e){let t=this.placements.get(e),n=this.comments.find(t=>t._id===e);t?.element&&n&&Fi(t.element,()=>this.anchorPoint(n.anchor,t.element,t.range)),this.openThread(e),window.matchMedia(Yi).matches&&(this.panelOpen=!1),this.render(),setTimeout(()=>this.scheduleLayout(),400)}async submitDraft(e,t,r){let i=r.trim().slice(0,b.nameMaxLength),a=t.trim();if(!i)return this.setDraftError(e,this.t(`enterName`));let o=e.suggesting?e.suggestFrom:null,s=(e.suggestion??o??``).trim();if(o!=null&&(!s||s===o))return this.setDraftError(e,this.t(`changeTextFirst`));if(s.length>b.quoteMaxLength)return this.setDraftError(e,this.t(`suggestionTooLong`,{count:b.quoteMaxLength}));let c=o==null?void 0:{before:o,after:s};if(!a&&!c)return this.setDraftError(e,this.t(`writeFirst`));if(a.length>b.bodyMaxLength)return this.setDraftError(e,this.t(`commentTooLong`,{count:b.bodyMaxLength}));this.name=i,Y(X.name,i),e.sending=!0,e.error=void 0,this.render();let l=n(location.href),u=e.screenshot;try{let t=await this.api.createComment({body:a,suggestion:c,authorName:i,authorSecret:this.secret,page:{...l,path:this.pageKey,title:document.title.slice(0,300)},anchor:e.anchor,viewport:{w:window.innerWidth,h:window.innerHeight,dpr:window.devicePixelRatio||1},context:this.collectContext(e)});u&&this.attachScreenshot(t,u),e.images?.length&&this.attachImages(t,e),this.placements.set(t,{element:e.element,confidence:`exact`,range:e.range}),this.card?.kind===`composer`&&this.card.draft===e&&(this.card=null),this.showToast(this.t(`added`))}catch(t){e.sending=!1,e.error=t instanceof W?t.message:this.t(`postFailed`)}this.render()}setDraftError(e,t){e.error=t,this.render()}async act(e,t,n){let r=this.card;r?.kind===`thread`&&(r.busy=!0,r.error=void 0,this.render());try{return await t(),n&&this.showToast(n),this.card?.kind===`thread`&&this.card.id===e&&(this.card.busy=!1,this.card.editing=!1),this.render(),!0}catch(t){return this.card?.kind===`thread`&&this.card.id===e&&(this.card.busy=!1,this.card.error=t instanceof Error?t.message:this.t(`failed`)),this.render(),!1}}resolveComment(e){let t=this.ownerToken;t&&this.act(e._id,()=>this.api.resolve(e._id,t),this.t(`resolved`)).then(t=>{t&&!(this.panelOpen&&this.tab===`resolved`)&&this.card?.kind===`thread`&&this.card.id===e._id&&this.closeCard()})}reopenComment(e){let t=this.ownerToken;t&&this.act(e._id,()=>this.api.reopen(e._id,t),this.t(`reopened`))}closeAsOutdated(e){let t=this.ownerToken;t&&this.act(e._id,()=>this.api.resolve(e._id,t,`outdated`),this.t(`closedOutdated`)).then(t=>{t&&this.card?.kind===`thread`&&this.card.id===e._id&&this.closeCard()})}startMovePin(e){this.ownerToken&&(this.setPicking(!0),this.repinId=e._id,this.render())}async movePin(e,t){let n=this.ownerToken;if(!n)return;let r=this.placements.get(e);this.placements.set(e,{element:t.element,confidence:`exact`,range:t.range}),this.pinReported.set(e,!1);try{await this.api.repin(e,t.anchor,n),this.showToast(this.t(`pinMoved`))}catch(t){r?this.placements.set(e,r):this.placements.delete(e),this.showToast(t instanceof W?t.message:this.t(`failed`))}this.focusComment(e)}async deleteComment(e){if(!await this.ask(this.t(`confirmDeleteComment`),this.t(`delete`)))return;let t=this.ownerToken,n=this.isMine(e)?()=>this.api.deleteOwn(e._id,this.secret):t?()=>this.api.remove(e._id,t):null;n&&this.act(e._id,n,this.t(`deleted`)).then(t=>{t&&(this.extraComment?._id===e._id&&(this.extraComment=null),this.comments=this.comments.filter(t=>t._id!==e._id),this.placements.delete(e._id),this.closeCard())})}isMyReply(e){return!!this.secretHash&&e.authorKeyHash===this.secretHash}async sendReply(e,t,n){let r=this.card;if(r?.kind!==`thread`||r.id!==e._id)return;let i=(this.isOwner?this.ownerName:n)?.trim().slice(0,b.nameMaxLength),a=t.trim();if(a){if(!i){r.error=this.t(`enterName`),this.render();return}if(a.length>b.bodyMaxLength){r.error=this.t(`replyTooLong`,{count:b.bodyMaxLength}),this.render();return}this.isOwner||(this.name=i,Y(X.name,i)),r.sendingReply=!0,r.error=void 0,this.render();try{await this.api.createReply({commentId:e._id,body:a,authorName:i,authorSecret:this.secret,sessionToken:this.ownerToken??void 0});let t=this.uiLayer.querySelector(`[data-focus-key="reply"]`);t&&(t.value=``)}catch(e){r.error=e instanceof W?e.message:this.t(`replyFailed`)}r.sendingReply=!1,this.render()}}toggleReaction(e,t,n){this.api.toggleReaction(e._id,t,n,this.secret).catch(t=>{this.card?.kind===`thread`&&this.card.id===e._id&&(this.card.error=t instanceof Error?t.message:this.t(`reactFailed`),this.render())})}async deleteReply(e,t){if(!await this.ask(this.t(`confirmDeleteReply`),this.t(`delete`)))return;let n=this.ownerToken,r=this.isMyReply(t)?()=>this.api.deleteReply(t._id,this.secret):n?()=>this.api.removeReply(t._id,n):null;r&&this.act(e._id,r,this.t(`replyDeleted`))}saveReplyEdit(e,t,n){this.act(e._id,()=>this.api.editReply(t._id,this.secret,n),this.t(`saved`)).then(e=>{e&&this.card?.kind===`thread`&&(this.card.replyEditing=void 0,this.render())})}saveEdit(e,t,n){this.act(e._id,()=>this.api.editOwn(e._id,this.secret,t,n),this.t(`saved`))}copyNewTextButton(e){return G(`button`,{class:`cmp-link`,type:`button`,onclick:()=>void Si(e).then(e=>this.showToast(this.t(e?`newTextCopied`:`copyFailed`)))},this.t(`copyNewText`))}showToast(e){this.toast=e,clearTimeout(this.toastTimer),this.toastTimer=window.setTimeout(()=>{this.toast=null,this.render()},2400),this.render()}togglePanel(e=!this.panelOpen){e!==this.panelOpen&&(this.panelOpen=e,e&&!this.mineUnsub&&(this.mineUnsub=this.api.onMine(this.secret,e=>{this.mine=e,this.render()})),e?(this.keepFocus(),this.focusNext=`.panel [role="tab"][aria-selected="true"]`,window.matchMedia(Yi).matches&&(this.card=null)):this.search=``,this.render(),e&&this.uiLayer.querySelector(`.panel .item[aria-current="true"]`)?.scrollIntoView({block:`nearest`}),!e&&!this.card&&this.restoreFocus())}closeCardFromOutside(e){this.card&&!this.picking&&!this.confirming&&e.isPrimary&&(this.markingUp||ia(e)||[...this.uiLayer.querySelector(`[data-card]`)?.querySelectorAll(`textarea`)??[]].some(e=>e.value.trim())||this.card.kind===`composer`&&this.card.draft.images?.length||(this.panelOpen||(this.returnFocus=null),this.closeCard()))}closeCard(){this.card?.kind===`composer`&&Xi(this.card.draft);let e=this.card!==null;this.card=null,this.activeId=null,this.render(),e&&!this.panelOpen&&this.restoreFocus()}openThread(e){this.keepFocus(),this.activeId=e,this.lastViewedId=e,Y(X.lastViewed(this.config.project),e),this.card={kind:`thread`,id:e},this.focusNext=`[data-card="thread"] .card-close`}render(){this.syncOwnerDetail(),this.syncThread(),this.renderPins(),this.renderUi(),this.renderHighlight(),this.layout()}renderPins(){let e=this.visibleComments(),t=new Set(e.map(e=>e._id));for(let[e,n]of this.pins)t.has(e)||(n.remove(),this.pins.delete(e));for(let t of e){let e=this.pins.get(t._id);if(!e){e=G(`button`,{class:`pin`,type:`button`,hidden:!0});let n=t._id;e.addEventListener(`click`,e=>{e.stopPropagation(),this.card?.kind===`thread`&&this.card.id===n?this.closeCard():(this.openThread(n),this.render())}),this.pins.set(t._id,e),this.pinLayer.append(e)}e.textContent=bi(t.authorName),e.style.background=xi(t.authorName),e.setAttribute(`aria-label`,this.t(`pinLabel`,{name:t.authorName,body:(t.body||t.suggestion?.after||``).slice(0,80)})),t.replyCount?e.dataset.replies=String(t.replyCount):delete e.dataset.replies,e.dataset.status=t.status,e.dataset.active=String(this.activeId===t._id),e.dataset.confidence=this.placements.get(t._id)?.confidence??`lost`}if(this.pinLayer.querySelector(`.pin-draft`)?.remove(),this.card?.kind===`composer`){let{draft:e}=this.card,{x:t,y:n}=this.anchorPoint(e.anchor,e.element,e.range),r=G(`div`,{class:`pin pin-draft pin-pending`,"aria-hidden":`true`},this.name?bi(this.name):`+`);r.style.background=this.name?xi(this.name):`var(--n-accent)`,r.style.transform=`translate(${Math.round(t)}px, ${Math.round(n)}px)`,this.pinLayer.append(r)}}renderUi(){this.shownPlacements=this.placementSummary();let e=[this.renderToolbar()];this.panelOpen&&e.push(this.renderPanel());let t=this.renderCard();t&&e.push(t),this.toast&&e.push(G(`div`,{class:`toast`,role:`status`},this.toast));let n=this.renderConfirm();n&&e.push(n);let r=this.root.activeElement,i=r?.dataset.focusKey,a=r instanceof HTMLTextAreaElement||r instanceof HTMLInputElement?{start:r.selectionStart,end:r.selectionEnd}:null;this.uiLayer.replaceChildren(...e);let o=this.focusNext;this.focusNext=null;let s=o?this.uiLayer.querySelector(o):null;if(s)s.focus();else if(i){let e=this.uiLayer.querySelector(`[data-focus-key="${i}"]`);e?.focus(),a&&(e instanceof HTMLTextAreaElement||e instanceof HTMLInputElement)&&e.setSelectionRange(a.start,a.end)}this.positionCard()}renderToolbar(){let e=this.comments.filter(e=>e.status===`open`).length,t=this.toolbarDrag?.moving?this.toolbarDrag:null;return G(`div`,{class:`toolbar`,role:`toolbar`,"aria-label":this.t(`toolbar`),"data-dragging":!!t,style:t&&`transform: translate(${t.dx}px, ${t.dy}px)`,onpointerdown:e=>this.startToolbarDrag(e)},G(`button`,{class:`tb-btn`,type:`button`,"aria-pressed":String(this.picking),"data-focus-key":`tb-comment`,"aria-label":this.picking?this.t(`cancelAdding`):this.t(`addComment`),title:this.withKey(`addComment`,`addCommentKey`),onclick:()=>this.setPicking(!this.picking)},K(J.comment),G(`span`,{class:`tb-label`},this.picking?this.t(`pickElement`):this.config.label??this.t(`comment`))),G(`button`,{class:`tb-btn`,type:`button`,"aria-pressed":String(this.panelOpen),"data-focus-key":`tb-panel`,"aria-label":this.t(`openCount`,{count:e}),title:this.t(`allComments`),onclick:()=>this.togglePanel()},K(J.list),G(`span`,{class:`tb-count`},String(e))))}startToolbarDrag(e){if(e.button!==0||!e.isPrimary)return;this.endToolbarDrag?.();let t={id:e.pointerId,x:e.clientX,y:e.clientY,dx:0,dy:0,moving:!1};this.toolbarDrag=t;let n=()=>this.uiLayer.querySelector(`.toolbar`),r=e=>{e.pointerId===t.id&&(t.dx=e.clientX-t.x,t.dy=e.clientY-t.y,!(!t.moving&&Math.hypot(t.dx,t.dy)<5)&&(t.moving||(t.moving=!0,this.host.dataset.dragging=``,n()?.setAttribute(`data-dragging`,``)),e.preventDefault(),n()?.style.setProperty(`transform`,`translate(${t.dx}px, ${t.dy}px)`)))},i=e=>{e.pointerId===t.id&&(this.endToolbarDrag?.(),t.moving&&this.dropToolbar(n(),!0))},a=e=>{e instanceof PointerEvent&&e.pointerId!==t.id||(this.endToolbarDrag?.(),t.moving&&this.dropToolbar(n(),!1))};window.addEventListener(`pointermove`,r,!0),window.addEventListener(`pointerup`,i,!0),window.addEventListener(`pointercancel`,a,!0),window.addEventListener(`blur`,a),this.endToolbarDrag=()=>{window.removeEventListener(`pointermove`,r,!0),window.removeEventListener(`pointerup`,i,!0),window.removeEventListener(`pointercancel`,a,!0),window.removeEventListener(`blur`,a),delete this.host.dataset.dragging,this.toolbarDrag=null,this.endToolbarDrag=null}}dropToolbar(e,t){if(this.toolbarDropped=!0,setTimeout(()=>this.toolbarDropped=!1),!e)return;let n=e.getBoundingClientRect();if(t){let e=ra(n.left+n.width/2,n.top+n.height/2);this.position=e,this.host.dataset.position=e,Y(X.position(this.config.project),e===this.config.position?null:e)}e.removeAttribute(`data-dragging`),e.style.removeProperty(`transform`);let r=e.getBoundingClientRect();matchMedia(`(prefers-reduced-motion: reduce)`).matches||e.animate([{transform:`translate(${n.left-r.left}px, ${n.top-r.top}px)`},{transform:`none`}],{duration:320,easing:`cubic-bezier(0.2, 0.9, 0.3, 1.15)`})}renderPanel(){let e=this.comments.filter(e=>e.status===`open`),t=this.comments.filter(e=>e.status===`resolved`),n=this.search.trim().toLocaleLowerCase(),r=(...e)=>!n||e.some(e=>e?.toLocaleLowerCase().includes(n)),i=this.mine??[],a=(this.tab===`open`?e:this.tab===`resolved`?t:i).filter(e=>r(e.body,e.authorName,e.anchor.quote?.exact,e.suggestion?.after,this.tab===`mine`?e.page.path:void 0)),o=a.filter(e=>this.placements.get(e._id)?.element),s=a.filter(e=>!this.placements.get(e._id)?.element),c=this.pages.filter(e=>e.path!==this.pageKey&&r(e.path)),l=e=>[e.suggestion?Bi(e.suggestion):e.anchor.quote?G(`div`,{class:`item-quote`},e.anchor.quote.exact):null,e.body?G(`div`,{class:`item-text`},e.body):null],u=e=>{let t=e.page.path===this.pageKey,n=t?null:ea(e,location),r=e.status===`resolved`;return G(t?`button`:n===null?`div`:`a`,t?{class:`item`,type:`button`,"data-focus-key":`item-${e._id}`,onclick:()=>{this.deepLinkId=e._id,this.openDeepLink()}}:{class:`item`,href:n},G(`div`,{class:`row`},G(`span`,{class:`author`},t?this.t(`thisPage`):e.page.path),G(`span`,{class:`meta`},this.i18n.timeAgo(e.createdAt)),G(`span`,{class:`spacer`}),G(`span`,{class:r?`badge badge-ok`:`badge`},r?K(J.check):null,this.t(r?e.resolution===`outdated`?`outdated`:`resolved`:`statusOpen`))),...l(e))},d=e=>G(`button`,{class:`item`,type:`button`,"aria-current":e._id===this.lastViewedId?`true`:null,"data-focus-key":`item-${e._id}`,onclick:()=>this.focusComment(e._id)},G(`div`,{class:`row`},G(`span`,{class:`avatar`,style:`background:${xi(e.authorName)}`},bi(e.authorName)),G(`span`,{class:`author`},e.authorName),G(`span`,{class:`meta`},this.i18n.timeAgo(e.createdAt)+(e.replyCount?` · ${this.t(`replyCount`,{count:e.replyCount})}`:``)),e.page.origin===location.origin?null:G(`span`,{class:`badge`,title:e.page.origin},new URL(e.page.origin).host),e.resolution===`outdated`?G(`span`,{class:`badge`},this.t(`outdated`)):null),...l(e)),f=[];if(this.tab===`mine`?this.mine?a.length?f.push(...a.map(u)):f.push(G(`div`,{class:`empty`},n?this.t(`noMatches`,{query:this.search.trim()}):this.t(`noYours`))):f.push(G(`div`,{class:`empty`},this.t(`loading`))):this.loaded?!a.length&&n?f.push(G(`div`,{class:`empty`},this.t(`noMatches`,{query:this.search.trim()}))):a.length?(f.push(...o.map(d)),s.length&&(f.push(G(`div`,{class:`section-label`},this.t(`notFoundHere`))),f.push(...s.map(d)))):f.push(G(`div`,{class:`empty`},this.tab===`open`?this.withKey(`noOpen`,`noOpenKey`):this.t(`noResolved`))):f.push(G(`div`,{class:`empty`},this.t(`loading`))),c.length&&this.tab!==`mine`){f.push(G(`div`,{class:`section-label`},this.t(`otherPages`)));for(let e of c.slice(0,20)){let t=ta(e.path,location);f.push(G(t===null?`div`:`a`,t===null?{class:`item`}:{class:`item`,href:t},G(`div`,{class:`row`},G(`span`,{class:`author`},e.path),G(`span`,{class:`spacer`}),G(`span`,{class:`badge`},this.t(`openOnPage`,{count:e.count})))))}}return G(`div`,{class:`panel`,role:`dialog`,"aria-label":this.t(`comments`)},G(`div`,{class:`panel-head`},G(`div`,{class:`panel-title`},this.t(`comments`)),G(`button`,{class:`btn btn-ghost btn-icon`,type:`button`,"aria-label":this.t(`close`),onclick:()=>this.togglePanel(!1)},K(J.close))),this.comments.length||this.mine?.length?G(`div`,{class:`panel-search`},K(J.search),G(`input`,{class:`field`,type:`search`,value:this.search,placeholder:this.t(`searchComments`),"aria-label":this.t(`searchComments`),"aria-controls":`nuni-panel-list`,"data-focus-key":`panel-search`,oninput:e=>{this.search=e.target.value,this.render()}})):null,G(`div`,{class:`tabs`,role:`tablist`,"aria-label":this.t(`comments`),onkeydown:e=>{let t=e.key;if(![`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(t))return;e.preventDefault();let n=Vi.indexOf(this.tab),r=Vi.length-1;this.tab=Vi[t===`Home`?0:t===`End`?r:t===`ArrowRight`?(n+1)%Vi.length:(n+r)%Vi.length],this.focusNext=`[data-focus-key="tab-${this.tab}"]`,this.render()}},Vi.map(n=>G(`button`,{class:`tab`,role:`tab`,type:`button`,id:`nuni-tab-${n}`,"data-focus-key":`tab-${n}`,"aria-selected":String(this.tab===n),"aria-controls":`nuni-panel-list`,tabindex:this.tab===n?0:-1,onclick:()=>{this.tab=n,this.render()}},n===`open`?this.t(`tabOpen`,{count:e.length}):n===`resolved`?this.t(`tabResolved`,{count:t.length}):this.mine?this.t(`tabYours`,{count:this.mine.length}):this.t(`yours`)))),G(`div`,{class:`panel-list`,id:`nuni-panel-list`,role:`tabpanel`,"aria-labelledby":`nuni-tab-${this.tab}`},...f),this.status&&!this.status.claimed&&!this.isOwner?this.renderPanelFooter():null)}renderPanelFooter(){return G(`div`,{class:`panel-foot`},G(`div`,{class:`row`},G(`span`,{class:`meta`},this.t(`ownSite`)),G(`span`,{class:`spacer`}),G(`button`,{class:`btn`,type:`button`,onclick:()=>this.openClaim()},K(J.github),this.t(`claim`))))}renderComposer(e,t){let n=!this.name,r=G(`span`,{class:`avatar cmp-avatar`,"aria-hidden":`true`}),i=e=>{let t=e.trim();r.classList.toggle(`avatar-empty`,!t),t?(r.textContent=bi(t),r.style.background=xi(t)):(r.replaceChildren(K(J.user)),r.style.background=``)},a=G(`input`,{class:`cmp-name`,placeholder:this.t(`yourName`),value:this.name,maxlength:b.nameMaxLength,autocomplete:`name`,"data-focus-key":`name`,"aria-label":this.t(`yourName`)}),o=e.suggestFrom??null,s=!!e.suggesting&&o!==null,c=G(`textarea`,{class:`cmp-text`,placeholder:this.t(s?`addNote`:`leaveComment`),maxlength:b.bodyMaxLength,rows:3,"data-focus-key":`body`,"aria-label":this.t(`comment`)}),l=s?G(`textarea`,{class:`cmp-suggest`,maxlength:b.quoteMaxLength,rows:1,"data-focus-key":`suggestion`,"aria-label":this.t(`newText`)}):null;l&&(l.value=e.suggestion??o??``);let u=()=>!!c.value.trim()||!!(l&&l.value.trim()&&l.value.trim()!==o),d=this.uiLayer.querySelector(`[data-focus-key="body"]`);d&&(c.value=d.value);let f=this.uiLayer.querySelector(`[data-focus-key="name"]`);f&&(a.value=f.value),i(n?a.value:this.name),a.addEventListener(`input`,()=>i(a.value));let p=G(`span`,{class:`cmp-count`,"aria-live":`polite`}),m=G(`button`,{class:`cmp-post`,type:`submit`,disabled:!!e.sending||!u()},e.sending?this.t(`posting`):this.t(`post`),K(J.arrowUp)),h=()=>{m.disabled=!!e.sending||!u();let t=b.bodyMaxLength-c.value.length;p.textContent=t<=b.bodyMaxLength*.1?this.t(`charsLeft`,{count:t}):``;for(let e of[c,l])e&&(e.style.height=`auto`,e.style.height=`${e.scrollHeight+2}px`)};c.addEventListener(`input`,()=>{h(),this.positionCard()}),l?.addEventListener(`input`,()=>{e.suggestion=l.value,h(),this.positionCard()}),requestAnimationFrame(()=>{c.isConnected&&(h(),this.positionCard())});let g=()=>void this.submitDraft(e,c.value,n?a.value:this.name);for(let e of[c,l])e?.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),g())});let _=this.canAttach(e),v=_?G(`input`,{type:`file`,accept:gi.join(`,`),multiple:!0,hidden:!0,tabindex:-1,"aria-hidden":`true`,onchange:t=>{let n=t.target,r=[...n.files??[]];n.value=``,this.addImages(e,r)}}):null;_&&c.addEventListener(`paste`,t=>{let n=[...t.clipboardData?.files??[]].filter(e=>gi.includes(e.type));n.length&&(t.preventDefault(),this.addImages(e,n))});let y=t=>{e.suggesting=t,e.error=void 0,this.render();let n=this.uiLayer.querySelector(`[data-focus-key="${t?`suggestion`:`body`}"]`);n?.focus(),t&&n?.select()};return G(`form`,{class:`${t} composer`,"data-card":`composer`,onsubmit:e=>{e.preventDefault(),g()}},G(`div`,{class:`cmp-head`},r,n?a:G(`span`,{class:`author`},this.name),G(`span`,{class:`spacer`}),n?null:G(`button`,{class:`cmp-link`,type:`button`,onclick:()=>{this.name=``,this.render(),this.focusComposer()}},this.t(`notYou`))),s?G(`div`,{class:`suggest`},G(`div`,{class:`suggest-label`},this.t(`suggestedEdit`),G(`span`,{class:`spacer`}),G(`button`,{class:`cmp-link`,type:`button`,onclick:()=>y(!1)},this.t(`removeSuggestion`))),G(`del`,{},o),l):e.anchor.quote?G(`blockquote`,{class:`quote`},e.anchor.quote.exact):null,c,e.images?.length?G(`div`,{class:`cmp-images`},G(`div`,{class:`cmp-thumbs`},...e.images.map((t,n)=>G(`div`,{class:`cmp-thumb`},G(`img`,{src:t.url,alt:this.t(`imageN`,{n:n+1})}),G(`button`,{class:`cmp-thumb-remove`,type:`button`,"aria-label":this.t(`removeImage`,{n:n+1}),title:this.t(`removeImage`,{n:n+1}),onclick:()=>{URL.revokeObjectURL(t.url),e.images?.splice(n,1),this.render(),this.positionCard()}},K(J.close))))),G(`p`,{class:`cmp-images-note`},this.t(`imagesPublic`))):null,e.error?G(`div`,{class:`error cmp-error`,role:`alert`},e.error):null,G(`div`,{class:`cmp-foot`},G(`span`,{class:`cmp-keys`,title:this.t(`send`,{key:this.i18n.mod})},G(`kbd`,{},this.i18n.mod),G(`kbd`,{},`↵`)),o!==null&&!s?G(`button`,{class:`cmp-link cmp-suggest-btn`,type:`button`,onclick:()=>y(!0)},K(J.edit),this.t(`suggestEdit`)):null,_?G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`addImage`),title:this.t(`addImage`),onclick:()=>v?.click()},K(J.image)):null,_&&this.canScreenshot(e)?G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`markUpScreenshot`),title:this.t(e.preparingMarkup?`preparingScreenshot`:`markUpScreenshot`),disabled:!!e.preparingMarkup,onclick:()=>void this.markUpScreenshot(e)},K(J.pen)):null,v,p,G(`span`,{class:`spacer`}),m),G(`button`,{class:`icon-btn cmp-close`,type:`button`,"aria-label":this.t(`cancel`),title:this.t(`cancel`),onclick:()=>this.closeCard()},K(J.close)))}renderCard(){let e=this.card;if(!e)return null;let t=`card${window.matchMedia(Yi).matches?` sheet`:``}`;if(e.kind===`composer`)return this.renderComposer(e.draft,t);let n=this.comments.find(t=>t._id===e.id);if(!n)return null;let r=this.isMine(n),i=this.isOwner,a=this.placements.get(n._id),o;if(e.editing){let t=G(`textarea`,{class:`field`,maxlength:b.bodyMaxLength,placeholder:n.suggestion?this.t(`addNote`):null,"data-focus-key":`edit`,"aria-label":this.t(`comment`)}),r=this.uiLayer.querySelector(`[data-focus-key="edit"]`);t.value=r?r.value:n.body;let i=n.suggestion?G(`textarea`,{class:`field`,rows:2,maxlength:b.quoteMaxLength,"data-focus-key":`edit-suggestion`,"aria-label":this.t(`newText`)}):null;if(i&&n.suggestion){let e=this.uiLayer.querySelector(`[data-focus-key="edit-suggestion"]`);i.value=e?e.value:n.suggestion.after}o=G(`div`,{class:`card-body`},n.suggestion&&i?G(`div`,{class:`suggest`},G(`div`,{class:`suggest-label`},this.t(`suggestedEdit`)),G(`del`,{},n.suggestion.before),i):null,t,G(`div`,{class:`row`},G(`span`,{class:`spacer`}),G(`button`,{class:`btn btn-ghost`,type:`button`,onclick:()=>{e.editing=!1,this.render()}},this.t(`cancel`)),G(`button`,{class:`btn btn-primary`,type:`button`,disabled:!!e.busy,onclick:()=>this.saveEdit(n,t.value,i?.value)},this.t(`save`))))}else{let t=[n.status===`resolved`?G(`span`,{class:`badge badge-ok`},K(J.check),this.t(n.resolution===`outdated`?`outdated`:`resolved`)):null,n.page.origin===location.origin?null:G(`span`,{class:`badge`,title:this.t(`leftOn`,{origin:n.page.origin})},new URL(n.page.origin).host),a?.confidence===`low`?G(`span`,{class:`badge`,title:this.t(`approximateHint`)},this.t(`approximate`)):null,a?.element?null:G(`span`,{class:`badge`,title:this.t(`originallyOn`,{text:n.anchor.text||n.anchor.tag})},this.t(`notFound`))].filter(e=>e!==null),s=i&&!(this.ownerDetailLoaded&&this.ownerDetailId===n._id),c=n.status===`resolved`;o=G(`div`,{class:`card-body msg`},G(`div`,{class:`card-head`},Qi(n.authorName),G(`span`,{class:`author`},n.authorName),G(`span`,{class:`meta`},this.i18n.timeAgo(n.createdAt)+(n.editedAt?` · ${this.t(`edited`)}`:``)),G(`span`,{class:`spacer`}),i?G(`button`,{class:`icon-btn${c?` is-resolved`:``}`,type:`button`,"aria-label":this.t(c?`reopen`:`resolve`),title:this.t(c?`reopen`:`resolve`),disabled:!!e.busy,onclick:()=>c?this.reopenComment(n):this.resolveComment(n)},K(J.check)):null,G(`button`,{class:`icon-btn card-close`,type:`button`,"aria-label":this.t(`close`),title:this.t(`close`),onclick:()=>this.closeCard()},K(J.close))),G(`div`,{class:`msg-main`},n.suggestion?zi(n.suggestion,this.t(`suggestedEdit`),i?this.copyNewTextButton(n.suggestion.after):null):n.anchor.quote?G(`blockquote`,{class:`quote`},n.anchor.quote.exact):null,n.body?G(`div`,{class:`comment-body`},n.body):null,this.threadId===n._id&&this.thread?.images?.length?G(`div`,{class:`images`},...this.thread.images.map((e,t)=>G(`a`,{href:e,target:`_blank`,rel:`noreferrer`,title:this.t(`openImage`)},G(`img`,{src:e,alt:this.t(`imageN`,{n:t+1}),loading:`lazy`})))):null,this.ownerDetail?._id===n._id&&this.ownerDetail.screenshotUrl?G(`a`,{class:`shot`,href:this.ownerDetail.screenshotUrl,target:`_blank`,rel:`noreferrer`,title:this.t(`openScreenshot`)},G(`img`,{src:this.ownerDetail.screenshotUrl,alt:this.t(`screenshotTaken`)})):null,t.length?G(`div`,{class:`badges`},...t):null,i&&!c&&!a?.element?G(`div`,{class:`lost`},G(`p`,{},this.t(`lostHint`)),G(`div`,{class:`row`},G(`button`,{class:`btn`,type:`button`,onclick:()=>this.startMovePin(n)},K(J.target),this.t(`movePin`)),G(`button`,{class:`btn btn-ghost`,type:`button`,disabled:!!e.busy,onclick:()=>this.closeAsOutdated(n)},this.t(`closeOutdated`)))):null,G(`div`,{class:`msg-foot`},this.renderReactions(n,n._id),G(`span`,{class:`spacer`}),G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`copyForAgent`),title:s?this.t(`loadingContext`):this.t(`copyForAgentHint`),disabled:s,onclick:()=>this.copyForAgent(n)},K(J.bot)),i&&a?.element?G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`movePin`),title:this.t(`movePin`),onclick:()=>this.startMovePin(n)},K(J.target)):null,r?G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`edit`),title:this.t(`edit`),onclick:()=>{e.editing=!0,this.render()}},K(J.edit)):null,r||i?G(`button`,{class:`icon-btn icon-btn-danger`,type:`button`,"aria-label":this.t(`delete`),title:this.t(`delete`),"data-focus-key":`delete`,disabled:!!e.busy,onclick:()=>void this.deleteComment(n)},K(J.trash)):null),e.error?G(`div`,{class:`error`,role:`alert`},e.error):null))}return G(`div`,{class:t,"data-card":`thread`,role:`dialog`,"aria-label":this.t(`commentBy`,{name:n.authorName})},o,e.editing?null:this.renderThread(n))}renderReactions(e,t,n=!0){let r=this.card;if(r?.kind!==`thread`)return null;let i=this.threadId===e._id&&this.thread?this.thread.reactions.filter(e=>e.targetId===t):[],a=r.picker===t;return!n&&!i.length&&!a?null:G(`div`,{class:`reactions`},...i.map(n=>{let r=n.authorKeyHashes.includes(this.secretHash);return G(`button`,{class:`reaction`,type:`button`,"aria-pressed":String(r),"aria-label":`${n.emoji} ${n.count}${r?`, including you`:``}`,onclick:()=>this.toggleReaction(e,t,n.emoji)},`${n.emoji} ${n.count}`)}),n?this.reactionAdd(t,`reaction reaction-add`):null,a?G(`div`,{class:`reaction-picker`,role:`group`,"aria-label":this.t(`reactions`)},...ee.map(n=>G(`button`,{class:`reaction`,type:`button`,"aria-label":this.t(`reactWith`,{emoji:n}),onclick:()=>{r.picker=null,this.toggleReaction(e,t,n),this.render()}},n))):null)}reactionAdd(e,t){let n=this.card;if(n?.kind!==`thread`)return null;let r=n.picker===e;return G(`button`,{class:t,type:`button`,"aria-label":this.t(`addReaction`),"aria-expanded":String(r),title:this.t(`addReaction`),onclick:()=>{n.picker=r?null:e,this.render()}},K(J.smile))}renderThread(e){let t=this.card;if(t?.kind!==`thread`)return null;let n=this.threadId===e._id?this.thread?.replies??[]:[],r=this.isOwner,i=n.map(n=>{let i=this.isMyReply(n);if(t.replyEditing===n._id){let r=G(`textarea`,{class:`field`,maxlength:b.bodyMaxLength,"data-focus-key":`reply-edit-${n._id}`,"aria-label":this.t(`editReply`)}),i=this.uiLayer.querySelector(`[data-focus-key="reply-edit-${n._id}"]`);return r.value=i?i.value:n.body,G(`div`,{class:`reply`},r,G(`div`,{class:`row`},G(`span`,{class:`spacer`}),G(`button`,{class:`btn btn-ghost`,type:`button`,onclick:()=>{t.replyEditing=void 0,this.render()}},this.t(`cancel`)),G(`button`,{class:`btn btn-primary`,type:`button`,disabled:!!t.busy,onclick:()=>this.saveReplyEdit(e,n,r.value)},this.t(`save`))))}return G(`div`,{class:`reply msg`,"data-reply":n._id},G(`div`,{class:`card-head`},Qi(n.authorName),G(`span`,{class:`author`},n.authorName),n.isOwner?G(`span`,{class:`badge badge-owner`},this.t(`owner`)):null,G(`span`,{class:`meta`},this.i18n.timeAgo(n.createdAt)+(n.editedAt?` · ${this.t(`edited`)}`:``)),G(`span`,{class:`spacer`}),G(`span`,{class:`msg-tools`},this.reactionAdd(n._id,`icon-btn`),i?G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`editReply`),title:this.t(`edit`),onclick:()=>{t.replyEditing=n._id,this.render()}},K(J.edit)):null,i||r?G(`button`,{class:`icon-btn icon-btn-danger`,type:`button`,"aria-label":this.t(`deleteReply`),title:this.t(`delete`),"data-focus-key":`delete-${n._id}`,disabled:!!t.busy,onclick:()=>void this.deleteReply(e,n)},K(J.trash)):null)),G(`div`,{class:`msg-main`},G(`div`,{class:`comment-body`},n.body),this.renderReactions(e,n._id,!1)))}),a=!r&&!this.name,o=G(`input`,{class:`reply-name`,placeholder:this.t(`yourName`),value:this.name,maxlength:b.nameMaxLength,autocomplete:`name`,"data-focus-key":`reply-name`,"aria-label":this.t(`yourName`)}),s=this.uiLayer.querySelector(`[data-focus-key="reply-name"]`);s&&(o.value=s.value);let c=G(`textarea`,{class:`reply-text`,placeholder:n.length?this.t(`reply`):this.t(`replyFirst`),maxlength:b.bodyMaxLength,rows:1,"data-focus-key":`reply`,"aria-label":this.t(`reply`)}),l=this.uiLayer.querySelector(`[data-focus-key="reply"]`);l&&(c.value=l.value);let u=G(`button`,{class:`reply-send`,type:`submit`,"aria-label":this.t(`sendReply`),title:this.t(`sendReply`),disabled:!!t.sendingReply||!c.value.trim()},K(J.arrowUp)),d=()=>{u.disabled=!!t.sendingReply||!c.value.trim(),c.style.height=`auto`,c.style.height=`${c.scrollHeight}px`};c.addEventListener(`input`,d),requestAnimationFrame(()=>{c.isConnected&&d()});let f=()=>void this.sendReply(e,c.value,a?o.value:this.name);return c.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),f())}),G(`div`,{class:`thread`},i.length?G(`div`,{class:`replies`,role:`list`,"aria-label":this.t(`replyCount`,{count:i.length})},...i.map(e=>(e.setAttribute(`role`,`listitem`),e))):null,G(`form`,{class:`reply-form`,onsubmit:e=>{e.preventDefault(),f()}},a?o:null,G(`div`,{class:`reply-row`},c,u)))}positionCard(){let e=this.uiLayer.querySelector(`[data-card]`);if(!e||e.classList.contains(`sheet`))return;let t=null;if(this.card?.kind===`composer`){let{draft:e}=this.card;t=this.anchorPoint(e.anchor,e.element,e.range)}else if(this.card?.kind===`thread`){let e=this.comments.find(e=>this.card?.kind===`thread`&&e._id===this.card.id);t=e?this.pinPositions.get(e._id)??this.pinPoint(e):null}let n=e.offsetWidth||320,r=e.offsetHeight||160,i=window.innerWidth,a=window.innerHeight,o,s;if(t)o=t.x+36,s=t.y-28,o+n>i-12&&(o=t.x-n-12);else{let{position:e}=this;o=e.endsWith(`left`)?16:e.endsWith(`center`)?(i-n)/2:i-n-16,s=e.startsWith(`top`)?72:a-r-72}o=Math.max(12,Math.min(o,i-n-12)),s=Math.max(12,Math.min(s,a-r-12)),e.style.left=`${Math.round(o)}px`,e.style.top=`${Math.round(s)}px`}focusComposer(){requestAnimationFrame(()=>{this.uiLayer.querySelector(this.name?`[data-focus-key="body"]`:`[data-focus-key="name"]`)?.focus()})}};function ra(e,t){let n=window.innerWidth,r=e<n/3?`left`:e>n*2/3?`right`:`center`;return`${t<window.innerHeight/2?`top`:`bottom`}-${r}`}function ia(e){let t=e.composedPath()[0];if(!(t instanceof Element))return!1;let n=document.documentElement;if(t===n)return e.clientX>=n.clientWidth||e.clientY>=n.clientHeight;if(!(t.scrollHeight>t.clientHeight||t.scrollWidth>t.clientWidth))return!1;let r=t.getBoundingClientRect();return e.clientX-r.left-t.clientLeft>=t.clientWidth||e.clientY-r.top-t.clientTop>=t.clientHeight}function aa(e){let t=[e.convexUrl,e.convexSiteUrl].flatMap(e=>{try{return[new URL(e).origin]}catch{return[]}});return e=>{try{return t.includes(new URL(e,location.href).origin)}catch{return!1}}}let Z=null;function oa(e,t){let n={destroy(){}};if(typeof window>`u`||typeof document>`u`)return n;if(!v(e.project))return console.warn(`[nuni] "${e.project}" is not a valid project ID. Run \`npx @nuniapp/cli@latest init\` to get one.`),n;if(Z?.project===e.project)return sa(Z);Z&&ca(Z);let r=S(e),i={project:e.project,widget:null,collectors:ge(r.capture,aa(r)),timer:0,handles:0};Z=i;let a=()=>{if(Z===i){if(!document.body){i.timer=window.setTimeout(a,50);return}i.widget=new na(r,{collectors:i.collectors,loadScreenshot:r.capture.screenshot?t.loadScreenshot:null}),i.widget.start()}},o=window.requestIdleCallback;return o?o(a,{timeout:1500}):i.timer=window.setTimeout(a,1),sa(i)}function sa(e){e.handles++;let t=!1;return{destroy(){t||(t=!0,e.handles--,e.handles<=0&&Z===e&&ca(e))}}}function ca(e){clearTimeout(e.timer),e.widget?.destroy(),e.widget=null,e.collectors.stop(),Z===e&&(Z=null)}let la=document.currentScript??document.querySelector(`script[data-project][src*='nuni']`),ua=null;function da(){return ua??(ua=new Promise(e=>{if(window.__nuniScreenshot)return e(window.__nuniScreenshot);let t=document.createElement(`script`);t.src=new URL(`nuni-screenshot.global.js`,la.src).href,t.async=!0,t.onload=()=>e(window.__nuniScreenshot??null),t.onerror=()=>{ua=null,e(null)},document.head.appendChild(t)})),ua}function fa(e){return oa(e,{loadScreenshot:la?.src?da:null})}window.Nuni={init:fa,version:`0.1.9`};function Q(e){if(e!==void 0)return!/^(false|0|off|no)$/i.test(e.trim())}let $=la?.dataset;$?.project&&fa({project:$.project,convexUrl:$.convexUrl,convexSiteUrl:$.convexSiteUrl,appUrl:$.appUrl,pageKey:$.pageKey,position:$.position,accentColor:$.accentColor,theme:$.theme,label:$.label,hotkey:$.hotkey===void 0?void 0:Q($.hotkey)!==!1&&$.hotkey,zIndex:$.zIndex===void 0?void 0:Number($.zIndex),locale:$.locale,images:Q($.images),capture:{console:Q($.captureConsole),network:Q($.captureNetwork),dom:Q($.captureDom),screenshot:Q($.captureScreenshot)}})})();
807
+ `,this.markLayer=G(`div`,{class:`marks`,"aria-hidden":`true`}),this.pinLayer=G(`div`,{class:`pins`}),this.overlayLayer=G(`div`,{class:`overlay`}),this.uiLayer=G(`div`,{class:`ui`}),this.modalLayer=G(`div`,{class:`modal`}),this.selectButton=G(`button`,{class:`select-btn`,type:`button`,hidden:!0,title:this.withKey(`commentSelection`,`commentSelectionKey`),onmousedown:e=>e.preventDefault(),onpointerdown:e=>e.preventDefault(),onclick:()=>this.commentOnSelection()},K(J.comment),this.t(`comment`)),this.live=G(`div`,{class:`sr`,role:`status`,"aria-live":`polite`}),this.root.append(r,this.markLayer,this.pinLayer,this.overlayLayer,this.uiLayer,this.modalLayer,this.selectButton,this.live),this.uiLayer.addEventListener(`keydown`,e=>this.trapFocus(e)),this.root.addEventListener(`click`,e=>{this.toolbarDropped&&(e.preventDefault(),e.stopPropagation())},!0),this.api=new hi(e)}t(e,t){return this.i18n.t(e,t)}withKey(e,t){let n=this.config.hotkey;return n?this.t(t,{key:n.toUpperCase()}):this.t(e)}applyAppearance(){let{theme:e,accentColor:t,zIndex:n}=this.config;this.host.dataset.position=this.position,this.host.dataset.theme=e,n!==null&&(this.host.style.zIndex=String(n));let r=t?Ci(t):null;if(!r)return;let[i,a,o]=r;this.host.style.setProperty(`--n-accent`,`rgb(${i}, ${a}, ${o})`),this.host.style.setProperty(`--n-accent-soft`,`rgba(${i}, ${a}, ${o}, 0.14)`),this.host.style.setProperty(`--n-accent-fg`,wi(r))}start(){document.body.appendChild(this.host),ji(this.secret).then(e=>{this.secretHash=e,this.render()}),this.api.touch(location.origin),this.cleanups.push(this.api.onStatus(e=>{this.status=e,this.render()})),this.cleanups.push(this.api.onPages(e=>{this.pages=e,this.render()})),this.ownerToken&&this.watchSession(this.ownerToken),this.commenterToken&&this.watchCommenter(this.commenterToken),this.readDeepLink(),this.subscribePage(),this.cleanups.push(Ai(()=>{this.readDeepLink(),this.subscribePage()}));let e=e=>this.onKeyDown(e),t=()=>this.scheduleLayout(),n=e=>this.onMessage(e);window.addEventListener(`keydown`,e,!0),window.addEventListener(`scroll`,t,{capture:!0,passive:!0}),window.addEventListener(`resize`,t,{passive:!0}),window.addEventListener(`message`,n);let r=()=>this.scheduleSelection(),i=e=>{e.composedPath().includes(this.host)||(this.pointerDown=!0,this.scheduleSelection(),this.closeCardFromOutside(e))},a=()=>{this.pointerDown=!1,this.scheduleSelection()};document.addEventListener(`selectionchange`,r),document.addEventListener(`pointerdown`,i,!0),document.addEventListener(`pointerup`,a,!0),this.cleanups.push(()=>{document.removeEventListener(`selectionchange`,r),document.removeEventListener(`pointerdown`,i,!0),document.removeEventListener(`pointerup`,a,!0),cancelAnimationFrame(this.selectionFrame)}),this.cleanups.push(()=>{window.removeEventListener(`keydown`,e,!0),window.removeEventListener(`scroll`,t,!0),window.removeEventListener(`resize`,t),window.removeEventListener(`message`,n)});let o=new MutationObserver(e=>{e.every(e=>this.host.contains(e.target)||e.target===this.host)||this.scheduleResolve()});o.observe(document.body,{childList:!0,subtree:!0,characterData:!0,attributes:!0,attributeFilter:[`class`,`style`,`hidden`,`open`,`id`]});let s=new ResizeObserver(()=>this.scheduleLayout());s.observe(document.documentElement),this.cleanups.push(()=>{o.disconnect(),s.disconnect()}),this.render()}destroy(){this.setPicking(!1),this.endToolbarDrag?.(),this.pageUnsub?.(),this.sessionUnsub?.(),this.commenterUnsub?.(),this.ownerDetailUnsub?.(),this.threadUnsub?.(),this.mineUnsub?.(),clearTimeout(this.pinReportTimer),this.resolveRun++;for(let e of this.scopeWatchers.values())e();this.scopeWatchers.clear();for(let e of this.cleanups)e();cancelAnimationFrame(this.layoutFrame),clearTimeout(this.resolveTimer),clearTimeout(this.toastTimer),this.host.remove(),this.api.close()}currentPageKey(){let e=new URL(location.href);return this.config.getPageKey(e)}subscribePage(){let e=this.currentPageKey();e===this.pageKey&&this.pageUnsub||(this.pageKey=e,this.pageUnsub?.(),this.comments=[],this.extraComment=null,this.loaded=!1,this.placements.clear(),this.pinReported.clear(),clearTimeout(this.pinReportTimer),this.card=null,this.activeId=null,this.pageUnsub=this.api.onPage(e,e=>{let t=this.extraComment,n=t&&!e.some(e=>e._id===t._id)?[...e,t]:e;this.comments=n.sort((e,t)=>e.createdAt-t.createdAt),this.loaded=!0,this.resolvePlacements(this.placements.size>0,this.deepLinkId??void 0),this.openDeepLink(),this.render()},()=>{}),this.render())}watchSession(e){this.sessionUnsub?.(),this.sessionUnsub=this.api.onSession(e,e=>{e.valid?this.ownerName=e.ownerName??this.t(`owner`):(this.ownerName=null,this.ownerToken=null,Y(X.session(this.config.project),null),this.sessionUnsub?.(),this.sessionUnsub=null),this.render()})}watchCommenter(e){this.commenterUnsub?.(),this.commenterUnsub=this.api.onCommenter(e,t=>{if(this.commenterToken===e){if(t.valid){let{name:e,avatarUrl:n,authorKey:r}=t;this.commenter={name:e,avatarUrl:n,authorKey:r}}else this.forgetCommenter();this.render()}})}forgetCommenter(){this.commenterUnsub?.(),this.commenterUnsub=null,this.commenterToken=null,this.commenter=null,Y(X.commenter(this.config.project),null),this.syncMine()}get author(){return{authorSecret:this.secret,commenterToken:this.commenterToken??void 0}}get displayName(){return this.commenter?.name??this.name}get authorKey(){return this.commenter?.authorKey??this.secretHash}ownsKey(e){return!!e&&(e===this.secretHash||e===this.commenter?.authorKey)}authorLine(e){return[Qi(e.authorName,e.signedIn?e.avatarUrl:void 0),G(`span`,{class:`author`},e.authorName),e.signedIn?G(`span`,{class:`signed-in`,role:`img`,"aria-label":this.t(`signedInGithub`),title:this.t(`signedInGithub`)},K(J.github)):null]}syncOwnerDetail(){let e=this.ownerToken,t=this.card?.kind===`thread`&&this.isOwner&&e?this.card.id:null;t!==this.ownerDetailId&&(this.ownerDetailUnsub?.(),this.ownerDetailUnsub=null,this.ownerDetail=null,this.ownerDetailLoaded=!1,this.ownerDetailId=t,t&&e&&(this.ownerDetailUnsub=this.api.onOwnerComment(t,e,e=>{this.ownerDetailId===t&&(this.ownerDetail=e,this.ownerDetailLoaded=!0,this.render())})))}syncThread(){let e=this.card?.kind===`thread`?this.card.id:null;e!==this.threadId&&(this.threadUnsub?.(),this.threadUnsub=null,this.thread=null,this.threadId=e,e&&(this.threadUnsub=this.api.onThread(e,t=>{this.threadId===e&&(this.thread=t,this.render())})))}get isOwner(){return!!(this.ownerToken&&this.ownerName)}isMine(e){return this.ownsKey(e.authorKeyHash)}visibleComments(){return this.comments.filter(e=>e.status===(this.panelOpen&&this.tab===`resolved`?`resolved`:`open`)||this.card?.kind===`thread`&&this.card.id===e._id)}scheduleResolve(){clearTimeout(this.resolveTimer),this.resolveTimer=window.setTimeout(()=>this.resolvePlacements(!0),200)}stillPlaced(e){let t=this.placements.get(e._id);if(!t?.element?.isConnected)return!1;let n=e.anchor.quote;if(n)return t.range!==void 0&&Ki(t.range.toString())===n.exact;let r=C(t.element),i=e.anchor.text;return!i||r===i||w(r,i)>.8}resolvePlacements(e,t){let n=++this.resolveRun,r=new Set(this.comments.map(e=>e._id));for(let e of this.placements.keys())r.has(e)||this.placements.delete(e);let i=this.comments.filter(t=>!(e&&this.stillPlaced(t))),a=t?i.findIndex(e=>e._id===t):-1;a>0&&i.unshift(...i.splice(a,1));let o=Ot(),s={isIgnored:this.isIgnored,document},c=()=>{if(n!==this.resolveRun)return;let t=performance.now();for(;i.length;){let e=i.shift(),n=Kt(e.anchor,document,s,o);if(this.placements.set(e._id,{element:n.element,confidence:n.confidence,range:n.range}),performance.now()-t>8)break}if(this.watchScopes(),this.renderPins(),this.layout(),i.length){qi(c);return}this.schedulePinReport(),(e||n>1)&&this.panelOpen&&this.placementSummary()!==this.shownPlacements&&this.render()};c()}schedulePinReport(){clearTimeout(this.pinReportTimer),this.pinReportTimer=window.setTimeout(()=>{if(!this.loaded||document.visibilityState!==`visible`)return;let e=[],t=[];for(let n of this.comments){if(n.status!==`open`||n.page.path!==this.pageKey)continue;let r=this.placements.get(n._id);if(!r)continue;let i=!r.element;if(i!==(this.pinReported.get(n._id)??!!n.pinLost)){if(e.length+t.length>=y.pinReportMax)break;this.pinReported.set(n._id,i),(i?e:t).push(n._id)}}(e.length||t.length)&&this.api.reportPins(this.pageKey,e,t)},3e3)}placementSummary(){return this.comments.map(e=>{let t=this.placements.get(e._id);return t?.element?t.confidence===`low`?`~`:`+`:`-`}).join(``)}watchScopes(){let e=/* @__PURE__ */ new Set;for(let{element:t}of this.placements.values()){let n=t;for(let t=0;n&&t<8;t++){let t=Je(n);if(t===document)break;e.add(t),n=T(t)?t.host:Xe(t)}}for(let[t,n]of this.scopeWatchers)e.has(t)||(n(),this.scopeWatchers.delete(t));for(let t of e)this.scopeWatchers.has(t)||this.scopeWatchers.set(t,this.watchScope(t))}watchScope(e){let t=new MutationObserver(()=>this.scheduleResolve()),n=T(e)?null:e;t.observe(n?n.body??n.documentElement:e,{childList:!0,subtree:!0,characterData:!0,attributes:!0,attributeFilter:[`class`,`style`,`hidden`,`open`,`id`]});let r=()=>this.scheduleLayout(),i=n?.defaultView??e;return i.addEventListener(`scroll`,r,{capture:!0,passive:!0}),n?.defaultView?.addEventListener(`resize`,r,{passive:!0}),()=>{t.disconnect(),i.removeEventListener(`scroll`,r,!0),n?.defaultView?.removeEventListener(`resize`,r)}}pinPoint(e){let t=this.placements.get(e._id),n=t?.element;return!n||!Oe(n)||E(n,document).clipped?null:this.anchorPoint(e.anchor,n,t.range)}anchorPoint(e,t,n){if(n&&n.startContainer.ownerDocument===document){let e=Wi(n).at(-1);if(e)return{x:e.right,y:e.top+e.height/2}}let r=E(t,document);return{x:r.left+e.offset.x*r.width,y:r.top+e.offset.y*r.height}}renderMarks(){let e=[],t=(t,n)=>{let r=G(`div`,{class:n});Object.assign(r.style,{left:`${t.left}px`,top:`${t.top}px`,width:`${t.width}px`,height:`${t.height}px`}),e.push(r)},n=(e,n,r,i)=>{if(n){if(r&&r.startContainer.ownerDocument===document)for(let e of Wi(r))t(e,i?`mark mark-active`:`mark`);if(i){let r=Gi(e,n);r&&t(r,`area`)}}};if(this.card?.kind===`composer`){let{draft:e}=this.card;n(e.anchor,e.element,e.range,!0)}for(let e of this.visibleComments()){let t=this.placements.get(e._id),r=this.activeId===e._id;(r||e.status===`open`&&e.anchor.quote)&&(this.pins.get(e._id)?.hidden||n(e.anchor,t?.element,t?.range,r))}this.markLayer.replaceChildren(...e)}scheduleLayout(){this.layoutFrame||(this.layoutFrame=requestAnimationFrame(()=>{this.layoutFrame=0,this.layout()}))}layout(){let e=window.innerWidth,t=window.innerHeight,n=[];this.pinPositions.clear();for(let r of this.visibleComments()){let i=this.pins.get(r._id);if(!i)continue;let a=this.pinPoint(r);if(i.hidden=!(a&&a.x>=-10&&a.y>=-10&&a.x<=e+10&&a.y<=t+10),!a)continue;let o=a.y,s=a.x;for(;n.some(e=>Math.abs(e.x-s)<14&&Math.abs(e.y-o)<14);)s+=18;n.push({x:s,y:o}),this.pinPositions.set(r._id,{x:s,y:o}),i.style.transform=`translate(${Math.round(s)}px, ${Math.round(o)}px)`}this.renderMarks(),this.positionCard(),this.picking&&(this.hoverEl||this.dragBox)&&this.renderHighlight(),this.placeSelectButton()}setPicking(e){if(e||(this.repinId=null),this.picking===e)return;this.picking=e;let t=document.documentElement;if(this.dragStart=null,this.dragBox=null,e){this.card=null,window.matchMedia(Yi).matches&&(this.panelOpen=!1),this.pickDocs=[document,...Ji(document)];for(let e of this.pickDocs){e.documentElement.classList.add(Hi),this.injectCursorStyle(e),e.addEventListener(`pointermove`,this.onPickMove,!0),e.addEventListener(`click`,this.onPickClick,!0);for(let t of Ui)e.addEventListener(t,this.swallow,{capture:!0,passive:!1});e!==document&&e.addEventListener(`keydown`,this.onFrameKey,!0)}}else{t.classList.remove(Hi),this.hoverEl=null;for(let e of this.pickDocs){e.documentElement?.classList.remove(Hi),e.removeEventListener(`pointermove`,this.onPickMove,!0),e.removeEventListener(`click`,this.onPickClick,!0);for(let t of Ui)e.removeEventListener(t,this.swallow,!0);e.removeEventListener(`keydown`,this.onFrameKey,!0)}this.pickDocs=[]}this.render()}injectCursorStyle(e){if(e.getElementById(`nuni-cursor-style`))return;let t=e.createElement(`style`);t.id=`nuni-cursor-style`,t.textContent=`html.${Hi}, html.${Hi} * { cursor: crosshair !important; }`,(e.head??e.documentElement).appendChild(t),this.cleanups.push(()=>t.remove())}fromPage(e){let t=e.composedPath();if(t.includes(this.host))return null;let n=t[0]??e.target;return n&&n.nodeType===1?n:null}commentOnArea(e){let t=Tt(document,e,this.isIgnored),n=Dt(t,e,{ignoreAttributePrefixes:[],document});this.openComposer({anchor:n,element:t})}pageSelection(){let e=document.getSelection();if(!e||e.isCollapsed||!e.rangeCount)return null;let t=e.getRangeAt(0),n=t.commonAncestorContainer,r=n.nodeType===1?n:n.parentElement;return!r||r===this.host||this.host.contains(r)||r.closest(`input, textarea, select, [contenteditable]`)||r.closest(`[data-nuni]`)?null:Ki(t.toString())?t:null}commentOnSelection(){let e=this.pageSelection();if(!e)return;let t=wt(e,{ignoreAttributePrefixes:[],document});if(!t)return;let n=e.cloneRange();document.getSelection()?.removeAllRanges(),this.selection=null,this.openComposer({...t,range:n})}scheduleSelection(){this.selectionFrame||(this.selectionFrame=requestAnimationFrame(()=>{this.selectionFrame=0,this.selection=this.picking||this.pointerDown?null:this.pageSelection(),this.placeSelectButton()}))}placeSelectButton(){let e=this.selectButton,t=this.selection,n=t?Wi(t).at(-1):void 0,r=window.innerWidth,i=window.innerHeight;if(!t||!n||n.bottom<0||n.top>i){e.hidden=!0;return}e.hidden=!1;let a=e.offsetWidth||96,o=e.offsetHeight||32,s=n.bottom+8;s+o>i-8&&(s=n.top-o-8);let c=Math.max(8,Math.min(n.right-a/2,r-a-8));e.style.transform=`translate(${Math.round(c)}px, ${Math.round(s)}px)`}openComposer(e){let{element:t}=e,n=this.repinId;if(this.setPicking(!1),n){this.movePin(n,e);return}if(this.config.capture.dom)try{e.dom=Se(t)}catch{}e.suggestFrom=Ri(e.anchor,t),this.card={kind:`composer`,draft:e},this.activeId=null,this.render(),this.focusComposer(),e.screenshot=this.takeScreenshot(e)}canScreenshot(e){return!!this.runtime.loadScreenshot&&e.element.ownerDocument===document}async takeScreenshot(e){let t=this.runtime.loadScreenshot;if(!t||!this.canScreenshot(e))return null;let n=getComputedStyle(this.host).getPropertyValue(`--n-accent`).trim()||`#d6246e`;try{await new Promise(e=>setTimeout(e,60));let r=await t(),{range:i,anchor:a,element:o}=e,s=i?()=>i.getBoundingClientRect():a.region?()=>{let e=Gi(a,o);return{left:e.left,top:e.top,right:e.left+e.width,bottom:e.top+e.height}}:void 0;return r?await r.capture(o,{exclude:this.host,accent:n,focus:s}):null}catch{return null}}collectContext(e){let{collectors:t}=this.runtime,n={},r=t.console(),i=t.network();return r.length&&(n.console=r),i.length&&(n.network=i),e.dom&&(n.dom=e.dom),Object.keys(n).length?n:void 0}async attachScreenshot(e,t){try{let n=await t;n&&await this.api.uploadScreenshot(e,this.author,n)}catch{}}async attachImages(e,t){let n=t.images??[];Xi(t);try{for(let t of n)await this.api.uploadImage(e,this.author,t.blob)}catch(e){this.showToast(e instanceof W?e.message:this.t(`imageFailed`))}}canAttach(e){return this.config.images&&!!this.status?.claimed&&(e.images?.length??0)<y.imagesPerComment}async addImages(e,t){e.error=void 0;for(let n of t){if((e.images?.length??0)>=y.imagesPerComment){e.error=this.t(`tooManyImages`,{count:y.imagesPerComment});break}let t=await yi(n);if(!t){e.error=this.t(`imageUnreadable`);continue}(e.images??(e.images=[])).push({blob:t,url:URL.createObjectURL(t)})}this.render(),this.positionCard()}async markUpScreenshot(e){let t=this.runtime.loadScreenshot;if(!t||!e.screenshot||e.preparingMarkup)return;e.preparingMarkup=!0,e.error=void 0,this.render();let[n,r]=await Promise.all([t(),e.screenshot]);if(e.preparingMarkup=!1,!n||!r){this.setDraftError(e,this.t(`noScreenshot`));return}this.markingUp=!0;try{let t=await n.markUp(r,{container:this.modalLayer,color:`#e5484d`,labels:{title:this.t(`markUpTitle`),box:this.t(`markUpBox`),arrow:this.t(`markUpArrow`),pen:this.t(`markUpPen`),undo:this.t(`markUpUndo`),cancel:this.t(`cancel`),done:this.t(`markUpDone`),failed:this.t(`markUpFailed`)}});t&&(e.images??(e.images=[])).push({blob:t,url:URL.createObjectURL(t)})}finally{this.markingUp=!1}this.render(),this.positionCard()}copyForAgent(e){let t=this.ownerDetail?._id===e._id?this.ownerDetail:null,n=this.threadId===e._id?this.thread?.replies:void 0;Si(m(t??{...e,replies:n},{includeContext:!!t})).then(e=>this.showToast(e?this.t(`copied`):this.t(`copyFailed`)))}renderHighlight(){if(this.overlayLayer.replaceChildren(),!this.picking)return;let e=window.matchMedia(Yi).matches;if(this.overlayLayer.append(G(`div`,{class:`pick-hint`},this.repinId?this.t(`movePinHint`):e?this.t(`pickHintMobile`):[G(`span`,{},this.t(`pickHint`)),G(`span`,{class:`pick-keys`},this.t(`pickHintKeys`))])),this.dragBox){let e=G(`div`,{class:`highlight drag-box`});Object.assign(e.style,{left:`${this.dragBox.left}px`,top:`${this.dragBox.top}px`,width:`${this.dragBox.width}px`,height:`${this.dragBox.height}px`}),this.overlayLayer.append(e);return}let t=this.hoverEl;if(!t||t===t.ownerDocument.documentElement)return;let n=E(t,document),r=G(`div`,{class:`highlight`},G(`span`,{class:`highlight-label`},$i(t)));Object.assign(r.style,{left:`${n.left-2}px`,top:`${n.top-2}px`,width:`${n.width+4}px`,height:`${n.height+4}px`}),this.overlayLayer.append(r)}onKeyDown(e){if(this.markingUp)return;let t=e.composedPath().includes(this.host);if(e.key===`Escape`){if(this.confirming)this.answer(!1);else if(this.picking)this.setPicking(!1);else if(this.card)this.closeCard();else if(this.panelOpen&&this.search)this.search=``,this.render();else if(this.panelOpen)this.togglePanel(!1);else return;e.stopPropagation();return}if(Zi(e.composedPath()[0]??e.target)||e.metaKey||e.ctrlKey||e.altKey||this.picking&&!t&&this.onPickKey(e)||t&&this.confirming||e.repeat)return;let n=this.config.hotkey;n&&e.key.toLowerCase()===n&&(e.preventDefault(),!this.picking&&this.pageSelection()?this.commentOnSelection():this.setPicking(!this.picking))}onPickKey(e){if(![`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`,`Enter`].includes(e.key))return!1;e.preventDefault(),e.stopPropagation();let t=this.hoverEl;if(!t||!t.isConnected)return this.movePickTo(this.keyboardStart()),!0;if(e.key===`Enter`){let e=t.getBoundingClientRect(),n=St(t,{x:e.left+e.width/2,y:e.top+e.height/2},{ignoreAttributePrefixes:[],document});return this.openComposer({anchor:n,element:t}),!0}let n=t=>{for(;t&&(t===this.host||!Oe(t));)t=e.key===`ArrowLeft`?t.previousElementSibling:t.nextElementSibling;return t},r=t.ownerDocument.body;return e.key===`ArrowUp`?t.parentElement&&t!==r&&(t=t.parentElement):t=e.key===`ArrowDown`?n(t.firstElementChild)??t:e.key===`ArrowLeft`?n(t.previousElementSibling)??t:n(t.nextElementSibling)??t,this.movePickTo(t),!0}keyboardStart(){let e=document.activeElement;if(e&&e!==document.body&&e!==this.host)return e;let t=document.elementsFromPoint(window.innerWidth/2,window.innerHeight/2).find(e=>!this.isIgnored(e));return t?Yt(t):document.body}movePickTo(e){this.hoverEl=e,e.scrollIntoView({block:`nearest`,inline:`nearest`}),this.live.textContent=this.t(`picked`,{element:$i(e)}),this.renderHighlight()}trapFocus(e){if(e.key!==`Tab`)return;let t=e.composedPath()[0]?.closest?.(`.confirm, [data-card], .panel`);if(!t)return;let n=Array.from(t.querySelectorAll(`button:not([disabled]), input, textarea, a[href], [tabindex="0"]`)).filter(e=>!e.closest(`[hidden]`));if(!n.length)return;let r=n[0],i=n[n.length-1],a=this.root.activeElement;e.shiftKey&&a===r?(e.preventDefault(),i.focus()):!e.shiftKey&&a===i&&(e.preventDefault(),r.focus())}keepFocus(){if(this.returnFocus)return;let e=this.root.activeElement;if(e){this.returnFocus=e.dataset.focusKey??e;return}let t=document.activeElement;this.returnFocus=t&&t!==document.body&&t!==this.host?t:null}restoreFocus(){let e=this.returnFocus;this.returnFocus=null;let t=typeof e==`string`?this.uiLayer.querySelector(`[data-focus-key="${e}"]`):e;t?.isConnected&&t.focus({preventScroll:!0})}ask(e,t){this.confirming?.done(!1);let n=this.root.activeElement?.dataset.focusKey??null;return new Promise(r=>{this.confirming={message:e,action:t,done:r,from:n},this.focusNext=`[data-focus-key="confirm-cancel"]`,this.render()})}answer(e){let t=this.confirming;t&&(this.confirming=null,!e&&t.from&&(this.focusNext=`[data-focus-key="${t.from}"]`),this.render(),t.done(e))}renderConfirm(){let e=this.confirming;return e?G(`div`,{class:`confirm-backdrop`,onclick:()=>this.answer(!1)},G(`div`,{class:`confirm`,role:`alertdialog`,"aria-modal":`true`,"aria-labelledby":`nuni-confirm-text`,onclick:e=>e.stopPropagation()},G(`p`,{id:`nuni-confirm-text`},e.message),G(`div`,{class:`row`},G(`span`,{class:`spacer`}),G(`button`,{class:`btn btn-ghost`,type:`button`,"data-focus-key":`confirm-cancel`,onclick:()=>this.answer(!1)},this.t(`cancel`)),G(`button`,{class:`btn btn-danger-solid`,type:`button`,"data-focus-key":`confirm-ok`,onclick:()=>this.answer(!0)},e.action)))):null}openClaim(){let e=new URL(`${this.config.appUrl}/dashboard/claim`);e.searchParams.set(`project`,this.config.project),e.searchParams.set(`origin`,location.origin),window.open(e.toString(),`nuni-claim`,`popup,width=480,height=680`)||(location.href=e.toString())}openCommenterSignIn(){let e=new URL(`${this.config.appUrl}/dashboard/comment-sign-in`);e.searchParams.set(`project`,this.config.project),e.searchParams.set(`origin`,location.origin),window.open(e.toString(),`nuni-comment-sign-in`,`popup,width=480,height=680`)||(location.href=e.toString())}async onCommenterSignedIn(e){this.commenterToken=e,Y(X.commenter(this.config.project),e),await this.api.linkBrowser(this.secret,e).catch(()=>null),this.commenterToken===e&&(this.watchCommenter(e),this.syncMine(),this.showToast(this.t(`commenterSignedIn`)))}signOutCommenter(){let e=this.commenterToken;e&&(this.forgetCommenter(),this.api.signOutCommenter(e),this.showToast(this.t(`signedOut`)))}onMessage(e){let t;try{t=new URL(this.config.appUrl).origin}catch{return}if(e.origin!==t)return;let n=e.data;if(n&&n.project===this.config.project){if(n.type===`nuni:commenter`&&typeof n.token==`string`&&n.token.startsWith(`nuni_c_`)){this.onCommenterSignedIn(n.token);return}n.type===`nuni:session`&&typeof n.token==`string`&&n.token.startsWith(`nuni_s_`)&&(this.ownerToken=n.token,Y(X.session(this.config.project),n.token),this.watchSession(n.token),this.showToast(this.t(`signedIn`)))}}readDeepLink(){let e=new URL(location.href),t=e.searchParams.get(`nuni`);t&&(this.deepLinkId=t,e.searchParams.delete(`nuni`),history.replaceState(history.state,``,e.toString()))}openDeepLink(){let e=this.deepLinkId;if(!e||!this.loaded)return;this.deepLinkId=null;let t=this.comments.find(t=>t._id===e);if(t){this.focusDeepLinked(t);return}this.api.getComment(e).then(e=>{if(!e||e.page.path!==this.pageKey){this.showToast(this.t(`linkGone`));return}this.extraComment=e,this.comments=[...this.comments.filter(t=>t._id!==e._id),e],this.resolvePlacements(!1,e._id),this.focusDeepLinked(e)})}focusDeepLinked(e){this.focusComment(e._id)}focusComment(e){let t=this.placements.get(e),n=this.comments.find(t=>t._id===e);t?.element&&n&&Fi(t.element,()=>this.anchorPoint(n.anchor,t.element,t.range)),this.openThread(e),window.matchMedia(Yi).matches&&(this.panelOpen=!1),this.render(),setTimeout(()=>this.scheduleLayout(),400)}async submitDraft(e,t,r){let i=!!this.commenter,a=(this.commenter?.name??r).trim().slice(0,y.nameMaxLength),o=t.trim();if(!a)return this.setDraftError(e,this.t(`enterName`));let s=e.suggesting?e.suggestFrom:null,c=(e.suggestion??s??``).trim();if(s!=null&&(!c||c===s))return this.setDraftError(e,this.t(`changeTextFirst`));if(c.length>y.quoteMaxLength)return this.setDraftError(e,this.t(`suggestionTooLong`,{count:y.quoteMaxLength}));let l=s==null?void 0:{before:s,after:c};if(!o&&!l)return this.setDraftError(e,this.t(`writeFirst`));if(o.length>y.bodyMaxLength)return this.setDraftError(e,this.t(`commentTooLong`,{count:y.bodyMaxLength}));i||(this.name=a,Y(X.name,a)),e.sending=!0,e.error=void 0,this.render();let u=n(location.href),d=e.screenshot;try{let t=await this.api.createComment({body:o,suggestion:l,authorName:a,...this.author,page:{...u,path:this.pageKey,title:document.title.slice(0,300)},anchor:e.anchor,viewport:{w:window.innerWidth,h:window.innerHeight,dpr:window.devicePixelRatio||1},context:this.collectContext(e)});d&&this.attachScreenshot(t,d),e.images?.length&&this.attachImages(t,e),this.placements.set(t,{element:e.element,confidence:`exact`,range:e.range}),this.card?.kind===`composer`&&this.card.draft===e&&(this.card=null),this.showToast(this.t(`added`))}catch(t){e.sending=!1,e.error=t instanceof W?t.message:this.t(`postFailed`)}this.render()}setDraftError(e,t){e.error=t,this.render()}async act(e,t,n){let r=this.card;r?.kind===`thread`&&(r.busy=!0,r.error=void 0,this.render());try{return await t(),n&&this.showToast(n),this.card?.kind===`thread`&&this.card.id===e&&(this.card.busy=!1,this.card.editing=!1),this.render(),!0}catch(t){return this.card?.kind===`thread`&&this.card.id===e&&(this.card.busy=!1,this.card.error=t instanceof Error?t.message:this.t(`failed`)),this.render(),!1}}resolveComment(e){let t=this.ownerToken;t&&this.act(e._id,()=>this.api.resolve(e._id,t),this.t(`resolved`)).then(t=>{t&&!(this.panelOpen&&this.tab===`resolved`)&&this.card?.kind===`thread`&&this.card.id===e._id&&this.closeCard()})}reopenComment(e){let t=this.ownerToken;t&&this.act(e._id,()=>this.api.reopen(e._id,t),this.t(`reopened`))}closeAsOutdated(e){let t=this.ownerToken;t&&this.act(e._id,()=>this.api.resolve(e._id,t,`outdated`),this.t(`closedOutdated`)).then(t=>{t&&this.card?.kind===`thread`&&this.card.id===e._id&&this.closeCard()})}startMovePin(e){this.ownerToken&&(this.setPicking(!0),this.repinId=e._id,this.render())}async movePin(e,t){let n=this.ownerToken;if(!n)return;let r=this.placements.get(e);this.placements.set(e,{element:t.element,confidence:`exact`,range:t.range}),this.pinReported.set(e,!1);try{await this.api.repin(e,t.anchor,n),this.showToast(this.t(`pinMoved`))}catch(t){r?this.placements.set(e,r):this.placements.delete(e),this.showToast(t instanceof W?t.message:this.t(`failed`))}this.focusComment(e)}async deleteComment(e){if(!await this.ask(this.t(`confirmDeleteComment`),this.t(`delete`)))return;let t=this.ownerToken,n=this.isMine(e)?()=>this.api.deleteOwn(e._id,this.author):t?()=>this.api.remove(e._id,t):null;n&&this.act(e._id,n,this.t(`deleted`)).then(t=>{t&&(this.extraComment?._id===e._id&&(this.extraComment=null),this.comments=this.comments.filter(t=>t._id!==e._id),this.placements.delete(e._id),this.closeCard())})}isMyReply(e){return this.ownsKey(e.authorKeyHash)}async sendReply(e,t,n){let r=this.card;if(r?.kind!==`thread`||r.id!==e._id)return;let i=(this.isOwner?this.ownerName:this.commenter?.name??n)?.trim().slice(0,y.nameMaxLength),a=t.trim();if(a){if(!i){r.error=this.t(`enterName`),this.render();return}if(a.length>y.bodyMaxLength){r.error=this.t(`replyTooLong`,{count:y.bodyMaxLength}),this.render();return}!this.isOwner&&!this.commenter&&(this.name=i,Y(X.name,i)),r.sendingReply=!0,r.error=void 0,this.render();try{await this.api.createReply({commentId:e._id,body:a,authorName:i,...this.author,sessionToken:this.ownerToken??void 0});let t=this.uiLayer.querySelector(`[data-focus-key="reply"]`);t&&(t.value=``)}catch(e){r.error=e instanceof W?e.message:this.t(`replyFailed`)}r.sendingReply=!1,this.render()}}toggleReaction(e,t,n){this.api.toggleReaction(e._id,t,n,this.author).catch(t=>{this.card?.kind===`thread`&&this.card.id===e._id&&(this.card.error=t instanceof Error?t.message:this.t(`reactFailed`),this.render())})}async deleteReply(e,t){if(!await this.ask(this.t(`confirmDeleteReply`),this.t(`delete`)))return;let n=this.ownerToken,r=this.isMyReply(t)?()=>this.api.deleteReply(t._id,this.author):n?()=>this.api.removeReply(t._id,n):null;r&&this.act(e._id,r,this.t(`replyDeleted`))}saveReplyEdit(e,t,n){this.act(e._id,()=>this.api.editReply(t._id,this.author,n),this.t(`saved`)).then(e=>{e&&this.card?.kind===`thread`&&(this.card.replyEditing=void 0,this.render())})}saveEdit(e,t,n){this.act(e._id,()=>this.api.editOwn(e._id,this.author,t,n),this.t(`saved`))}copyNewTextButton(e){return G(`button`,{class:`cmp-link`,type:`button`,onclick:()=>void Si(e).then(e=>this.showToast(this.t(e?`newTextCopied`:`copyFailed`)))},this.t(`copyNewText`))}showToast(e){this.toast=e,clearTimeout(this.toastTimer),this.toastTimer=window.setTimeout(()=>{this.toast=null,this.render()},2400),this.render()}syncMine(){(this.mineUnsub||this.panelOpen)&&(this.mineUnsub&&this.mineToken===this.commenterToken||(this.mineUnsub?.(),this.mine=null,this.mineToken=this.commenterToken,this.mineUnsub=this.api.onMine(this.author,e=>{this.mine=e,this.render()})))}togglePanel(e=!this.panelOpen){e!==this.panelOpen&&(this.panelOpen=e,e&&this.syncMine(),e?(this.keepFocus(),this.focusNext=`.panel [role="tab"][aria-selected="true"]`,window.matchMedia(Yi).matches&&(this.card=null)):this.search=``,this.render(),e&&this.uiLayer.querySelector(`.panel .item[aria-current="true"]`)?.scrollIntoView({block:`nearest`}),!e&&!this.card&&this.restoreFocus())}closeCardFromOutside(e){this.card&&!this.picking&&!this.confirming&&e.isPrimary&&(this.markingUp||ia(e)||[...this.uiLayer.querySelector(`[data-card]`)?.querySelectorAll(`textarea`)??[]].some(e=>e.value.trim())||this.card.kind===`composer`&&this.card.draft.images?.length||(this.panelOpen||(this.returnFocus=null),this.closeCard()))}closeCard(){this.card?.kind===`composer`&&Xi(this.card.draft);let e=this.card!==null;this.card=null,this.activeId=null,this.render(),e&&!this.panelOpen&&this.restoreFocus()}openThread(e){this.keepFocus(),this.activeId=e,this.lastViewedId=e,Y(X.lastViewed(this.config.project),e),this.card={kind:`thread`,id:e},this.focusNext=`[data-card="thread"] .card-close`}render(){this.syncOwnerDetail(),this.syncThread(),this.renderPins(),this.renderUi(),this.renderHighlight(),this.layout()}renderPins(){let e=this.visibleComments(),t=new Set(e.map(e=>e._id));for(let[e,n]of this.pins)t.has(e)||(n.remove(),this.pins.delete(e));for(let t of e){let e=this.pins.get(t._id);if(!e){e=G(`button`,{class:`pin`,type:`button`,hidden:!0});let n=t._id;e.addEventListener(`click`,e=>{e.stopPropagation(),this.card?.kind===`thread`&&this.card.id===n?this.closeCard():(this.openThread(n),this.render())}),this.pins.set(t._id,e),this.pinLayer.append(e)}e.textContent=bi(t.authorName),e.style.background=xi(t.authorName),e.setAttribute(`aria-label`,this.t(`pinLabel`,{name:t.authorName,body:(t.body||t.suggestion?.after||``).slice(0,80)})),t.replyCount?e.dataset.replies=String(t.replyCount):delete e.dataset.replies,e.dataset.status=t.status,e.dataset.active=String(this.activeId===t._id),e.dataset.confidence=this.placements.get(t._id)?.confidence??`lost`}if(this.pinLayer.querySelector(`.pin-draft`)?.remove(),this.card?.kind===`composer`){let{draft:e}=this.card,{x:t,y:n}=this.anchorPoint(e.anchor,e.element,e.range),r=G(`div`,{class:`pin pin-draft pin-pending`,"aria-hidden":`true`},this.displayName?bi(this.displayName):`+`);r.style.background=this.displayName?xi(this.displayName):`var(--n-accent)`,r.style.transform=`translate(${Math.round(t)}px, ${Math.round(n)}px)`,this.pinLayer.append(r)}}renderUi(){this.shownPlacements=this.placementSummary();let e=[this.renderToolbar()];this.panelOpen&&e.push(this.renderPanel());let t=this.renderCard();t&&e.push(t),this.toast&&e.push(G(`div`,{class:`toast`,role:`status`},this.toast));let n=this.renderConfirm();n&&e.push(n);let r=this.root.activeElement,i=r?.dataset.focusKey,a=r instanceof HTMLTextAreaElement||r instanceof HTMLInputElement?{start:r.selectionStart,end:r.selectionEnd}:null;this.uiLayer.replaceChildren(...e);let o=this.focusNext;this.focusNext=null;let s=o?this.uiLayer.querySelector(o):null;if(s)s.focus();else if(i){let e=this.uiLayer.querySelector(`[data-focus-key="${i}"]`);e?.focus(),a&&(e instanceof HTMLTextAreaElement||e instanceof HTMLInputElement)&&e.setSelectionRange(a.start,a.end)}this.positionCard()}renderToolbar(){let e=this.comments.filter(e=>e.status===`open`).length,t=this.toolbarDrag?.moving?this.toolbarDrag:null;return G(`div`,{class:`toolbar`,role:`toolbar`,"aria-label":this.t(`toolbar`),"data-dragging":!!t,style:t&&`transform: translate(${t.dx}px, ${t.dy}px)`,onpointerdown:e=>this.startToolbarDrag(e)},G(`button`,{class:`tb-btn`,type:`button`,"aria-pressed":String(this.picking),"data-focus-key":`tb-comment`,"aria-label":this.picking?this.t(`cancelAdding`):this.t(`addComment`),title:this.withKey(`addComment`,`addCommentKey`),onclick:()=>this.setPicking(!this.picking)},K(J.comment),G(`span`,{class:`tb-label`},this.picking?this.t(`pickElement`):this.config.label??this.t(`comment`))),G(`button`,{class:`tb-btn`,type:`button`,"aria-pressed":String(this.panelOpen),"data-focus-key":`tb-panel`,"aria-label":this.t(`openCount`,{count:e}),title:this.t(`allComments`),onclick:()=>this.togglePanel()},K(J.list),G(`span`,{class:`tb-count`},String(e))))}startToolbarDrag(e){if(e.button!==0||!e.isPrimary)return;this.endToolbarDrag?.();let t={id:e.pointerId,x:e.clientX,y:e.clientY,dx:0,dy:0,moving:!1};this.toolbarDrag=t;let n=()=>this.uiLayer.querySelector(`.toolbar`),r=e=>{e.pointerId===t.id&&(t.dx=e.clientX-t.x,t.dy=e.clientY-t.y,!(!t.moving&&Math.hypot(t.dx,t.dy)<5)&&(t.moving||(t.moving=!0,this.host.dataset.dragging=``,n()?.setAttribute(`data-dragging`,``)),e.preventDefault(),n()?.style.setProperty(`transform`,`translate(${t.dx}px, ${t.dy}px)`)))},i=e=>{e.pointerId===t.id&&(this.endToolbarDrag?.(),t.moving&&this.dropToolbar(n(),!0))},a=e=>{e instanceof PointerEvent&&e.pointerId!==t.id||(this.endToolbarDrag?.(),t.moving&&this.dropToolbar(n(),!1))};window.addEventListener(`pointermove`,r,!0),window.addEventListener(`pointerup`,i,!0),window.addEventListener(`pointercancel`,a,!0),window.addEventListener(`blur`,a),this.endToolbarDrag=()=>{window.removeEventListener(`pointermove`,r,!0),window.removeEventListener(`pointerup`,i,!0),window.removeEventListener(`pointercancel`,a,!0),window.removeEventListener(`blur`,a),delete this.host.dataset.dragging,this.toolbarDrag=null,this.endToolbarDrag=null}}dropToolbar(e,t){if(this.toolbarDropped=!0,setTimeout(()=>this.toolbarDropped=!1),!e)return;let n=e.getBoundingClientRect();if(t){let e=ra(n.left+n.width/2,n.top+n.height/2);this.position=e,this.host.dataset.position=e,Y(X.position(this.config.project),e===this.config.position?null:e)}e.removeAttribute(`data-dragging`),e.style.removeProperty(`transform`);let r=e.getBoundingClientRect();matchMedia(`(prefers-reduced-motion: reduce)`).matches||e.animate([{transform:`translate(${n.left-r.left}px, ${n.top-r.top}px)`},{transform:`none`}],{duration:320,easing:`cubic-bezier(0.2, 0.9, 0.3, 1.15)`})}renderPanel(){let e=this.comments.filter(e=>e.status===`open`),t=this.comments.filter(e=>e.status===`resolved`),n=this.search.trim().toLocaleLowerCase(),r=(...e)=>!n||e.some(e=>e?.toLocaleLowerCase().includes(n)),i=this.mine??[],a=(this.tab===`open`?e:this.tab===`resolved`?t:i).filter(e=>r(e.body,e.authorName,e.anchor.quote?.exact,e.suggestion?.after,this.tab===`mine`?e.page.path:void 0)),o=a.filter(e=>this.placements.get(e._id)?.element),s=a.filter(e=>!this.placements.get(e._id)?.element),c=this.pages.filter(e=>e.path!==this.pageKey&&r(e.path)),l=e=>[e.suggestion?Bi(e.suggestion):e.anchor.quote?G(`div`,{class:`item-quote`},e.anchor.quote.exact):null,e.body?G(`div`,{class:`item-text`},e.body):null],u=e=>{let t=e.page.path===this.pageKey,n=t?null:ea(e,location),r=e.status===`resolved`;return G(t?`button`:n===null?`div`:`a`,t?{class:`item`,type:`button`,"data-focus-key":`item-${e._id}`,onclick:()=>{this.deepLinkId=e._id,this.openDeepLink()}}:{class:`item`,href:n},G(`div`,{class:`row`},G(`span`,{class:`author`},t?this.t(`thisPage`):e.page.path),G(`span`,{class:`meta`},this.i18n.timeAgo(e.createdAt)),G(`span`,{class:`spacer`}),G(`span`,{class:r?`badge badge-ok`:`badge`},r?K(J.check):null,this.t(r?e.resolution===`outdated`?`outdated`:`resolved`:`statusOpen`))),...l(e))},d=e=>G(`button`,{class:`item`,type:`button`,"aria-current":e._id===this.lastViewedId?`true`:null,"data-focus-key":`item-${e._id}`,onclick:()=>this.focusComment(e._id)},G(`div`,{class:`row`},...this.authorLine(e),G(`span`,{class:`meta`},this.i18n.timeAgo(e.createdAt)+(e.replyCount?` · ${this.t(`replyCount`,{count:e.replyCount})}`:``)),e.page.origin===location.origin?null:G(`span`,{class:`badge`,title:e.page.origin},new URL(e.page.origin).host),e.resolution===`outdated`?G(`span`,{class:`badge`},this.t(`outdated`)):null),...l(e)),f=[];if(this.tab===`mine`?this.mine?a.length?f.push(...a.map(u)):f.push(G(`div`,{class:`empty`},n?this.t(`noMatches`,{query:this.search.trim()}):this.t(`noYours`))):f.push(G(`div`,{class:`empty`},this.t(`loading`))):this.loaded?!a.length&&n?f.push(G(`div`,{class:`empty`},this.t(`noMatches`,{query:this.search.trim()}))):a.length?(f.push(...o.map(d)),s.length&&(f.push(G(`div`,{class:`section-label`},this.t(`notFoundHere`))),f.push(...s.map(d)))):f.push(G(`div`,{class:`empty`},this.tab===`open`?this.withKey(`noOpen`,`noOpenKey`):this.t(`noResolved`))):f.push(G(`div`,{class:`empty`},this.t(`loading`))),c.length&&this.tab!==`mine`){f.push(G(`div`,{class:`section-label`},this.t(`otherPages`)));for(let e of c.slice(0,20)){let t=ta(e.path,location);f.push(G(t===null?`div`:`a`,t===null?{class:`item`}:{class:`item`,href:t},G(`div`,{class:`row`},G(`span`,{class:`author`},e.path),G(`span`,{class:`spacer`}),G(`span`,{class:`badge`},this.t(`openOnPage`,{count:e.count})))))}}return G(`div`,{class:`panel`,role:`dialog`,"aria-label":this.t(`comments`)},G(`div`,{class:`panel-head`},G(`div`,{class:`panel-title`},this.t(`comments`)),G(`button`,{class:`btn btn-ghost btn-icon`,type:`button`,"aria-label":this.t(`close`),onclick:()=>this.togglePanel(!1)},K(J.close))),this.comments.length||this.mine?.length?G(`div`,{class:`panel-search`},K(J.search),G(`input`,{class:`field`,type:`search`,value:this.search,placeholder:this.t(`searchComments`),"aria-label":this.t(`searchComments`),"aria-controls":`nuni-panel-list`,"data-focus-key":`panel-search`,oninput:e=>{this.search=e.target.value,this.render()}})):null,G(`div`,{class:`tabs`,role:`tablist`,"aria-label":this.t(`comments`),onkeydown:e=>{let t=e.key;if(![`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(t))return;e.preventDefault();let n=Vi.indexOf(this.tab),r=Vi.length-1;this.tab=Vi[t===`Home`?0:t===`End`?r:t===`ArrowRight`?(n+1)%Vi.length:(n+r)%Vi.length],this.focusNext=`[data-focus-key="tab-${this.tab}"]`,this.render()}},Vi.map(n=>G(`button`,{class:`tab`,role:`tab`,type:`button`,id:`nuni-tab-${n}`,"data-focus-key":`tab-${n}`,"aria-selected":String(this.tab===n),"aria-controls":`nuni-panel-list`,tabindex:this.tab===n?0:-1,onclick:()=>{this.tab=n,this.render()}},n===`open`?this.t(`tabOpen`,{count:e.length}):n===`resolved`?this.t(`tabResolved`,{count:t.length}):this.mine?this.t(`tabYours`,{count:this.mine.length}):this.t(`yours`)))),G(`div`,{class:`panel-list`,id:`nuni-panel-list`,role:`tabpanel`,"aria-labelledby":`nuni-tab-${this.tab}`},...f),this.renderPanelFooter())}renderPanelFooter(){let e=this.status&&!this.status.claimed&&!this.isOwner,t=this.commenter;return!e&&!t?null:G(`div`,{class:`panel-foot`},t?G(`div`,{class:`row`},Qi(t.name,t.avatarUrl),G(`span`,{class:`meta signed-in-as`},this.t(`signedInAs`,{name:t.name})),G(`span`,{class:`spacer`}),G(`button`,{class:`cmp-link`,type:`button`,onclick:()=>this.signOutCommenter()},this.t(`signOut`))):null,e?G(`div`,{class:`row`},G(`span`,{class:`meta`},this.t(`ownSite`)),G(`span`,{class:`spacer`}),G(`button`,{class:`btn`,type:`button`,onclick:()=>this.openClaim()},K(J.github),this.t(`claim`))):null)}renderComposer(e,t){let n=this.commenter,r=!n&&!this.name,i=G(`span`,{class:`avatar cmp-avatar`,"aria-hidden":`true`}),a=e=>{let t=e.trim();i.classList.toggle(`avatar-empty`,!t),t?(i.textContent=bi(t),i.style.background=xi(t)):(i.replaceChildren(K(J.user)),i.style.background=``)},o=G(`input`,{class:`cmp-name`,placeholder:this.t(`yourName`),value:this.name,maxlength:y.nameMaxLength,autocomplete:`name`,"data-focus-key":`name`,"aria-label":this.t(`yourName`)}),s=e.suggestFrom??null,c=!!e.suggesting&&s!==null,l=G(`textarea`,{class:`cmp-text`,placeholder:this.t(c?`addNote`:`leaveComment`),maxlength:y.bodyMaxLength,rows:3,"data-focus-key":`body`,"aria-label":this.t(`comment`)}),u=c?G(`textarea`,{class:`cmp-suggest`,maxlength:y.quoteMaxLength,rows:1,"data-focus-key":`suggestion`,"aria-label":this.t(`newText`)}):null;u&&(u.value=e.suggestion??s??``);let d=()=>!!l.value.trim()||!!(u&&u.value.trim()&&u.value.trim()!==s),f=this.uiLayer.querySelector(`[data-focus-key="body"]`);f&&(l.value=f.value);let p=this.uiLayer.querySelector(`[data-focus-key="name"]`);p&&(o.value=p.value),a(r?o.value:this.name),o.addEventListener(`input`,()=>a(o.value));let m=G(`span`,{class:`cmp-count`,"aria-live":`polite`}),h=G(`button`,{class:`cmp-post`,type:`submit`,disabled:!!e.sending||!d()},e.sending?this.t(`posting`):this.t(`post`),K(J.arrowUp)),g=()=>{h.disabled=!!e.sending||!d();let t=y.bodyMaxLength-l.value.length;m.textContent=t<=y.bodyMaxLength*.1?this.t(`charsLeft`,{count:t}):``;for(let e of[l,u])e&&(e.style.height=`auto`,e.style.height=`${e.scrollHeight+2}px`)};l.addEventListener(`input`,()=>{g(),this.positionCard()}),u?.addEventListener(`input`,()=>{e.suggestion=u.value,g(),this.positionCard()}),requestAnimationFrame(()=>{l.isConnected&&(g(),this.positionCard())});let ee=()=>void this.submitDraft(e,l.value,r?o.value:this.name);for(let e of[l,u])e?.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),ee())});let _=this.canAttach(e),v=_?G(`input`,{type:`file`,accept:gi.join(`,`),multiple:!0,hidden:!0,tabindex:-1,"aria-hidden":`true`,onchange:t=>{let n=t.target,r=[...n.files??[]];n.value=``,this.addImages(e,r)}}):null;_&&l.addEventListener(`paste`,t=>{let n=[...t.clipboardData?.files??[]].filter(e=>gi.includes(e.type));n.length&&(t.preventDefault(),this.addImages(e,n))});let te=t=>{e.suggesting=t,e.error=void 0,this.render();let n=this.uiLayer.querySelector(`[data-focus-key="${t?`suggestion`:`body`}"]`);n?.focus(),t&&n?.select()};return G(`form`,{class:`${t} composer`,"data-card":`composer`,onsubmit:e=>{e.preventDefault(),ee()}},n?G(`div`,{class:`cmp-head`},...this.authorLine({authorName:n.name,avatarUrl:n.avatarUrl,signedIn:!0}),G(`span`,{class:`spacer`}),G(`button`,{class:`cmp-link`,type:`button`,onclick:()=>this.signOutCommenter()},this.t(`signOut`))):G(`div`,{class:`cmp-head cmp-head-guest`},i,r?o:G(`span`,{class:`author`},this.name),G(`span`,{class:`spacer`}),r?null:G(`button`,{class:`cmp-link`,type:`button`,onclick:()=>{this.name=``,this.render(),this.focusComposer()}},this.t(`notYou`))),c?G(`div`,{class:`suggest`},G(`div`,{class:`suggest-label`},this.t(`suggestedEdit`),G(`span`,{class:`spacer`}),G(`button`,{class:`cmp-link`,type:`button`,onclick:()=>te(!1)},this.t(`removeSuggestion`))),G(`del`,{},s),u):e.anchor.quote?G(`blockquote`,{class:`quote`},e.anchor.quote.exact):null,l,e.images?.length?G(`div`,{class:`cmp-images`},G(`div`,{class:`cmp-thumbs`},...e.images.map((t,n)=>G(`div`,{class:`cmp-thumb`},G(`img`,{src:t.url,alt:this.t(`imageN`,{n:n+1})}),G(`button`,{class:`cmp-thumb-remove`,type:`button`,"aria-label":this.t(`removeImage`,{n:n+1}),title:this.t(`removeImage`,{n:n+1}),onclick:()=>{URL.revokeObjectURL(t.url),e.images?.splice(n,1),this.render(),this.positionCard()}},K(J.close))))),G(`p`,{class:`cmp-images-note`},this.t(`imagesPublic`))):null,e.error?G(`div`,{class:`error cmp-error`,role:`alert`},e.error):null,G(`div`,{class:`cmp-foot`},G(`span`,{class:`cmp-keys`,title:this.t(`send`,{key:this.i18n.mod})},G(`kbd`,{},this.i18n.mod),G(`kbd`,{},`↵`)),s!==null&&!c?G(`button`,{class:`cmp-link cmp-suggest-btn`,type:`button`,onclick:()=>te(!0)},K(J.edit),this.t(`suggestEdit`)):null,_?G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`addImage`),title:this.t(`addImage`),onclick:()=>v?.click()},K(J.image)):null,_&&this.canScreenshot(e)?G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`markUpScreenshot`),title:this.t(e.preparingMarkup?`preparingScreenshot`:`markUpScreenshot`),disabled:!!e.preparingMarkup,onclick:()=>void this.markUpScreenshot(e)},K(J.pen)):null,v,m,G(`span`,{class:`spacer`}),h),n?null:G(`button`,{class:`cmp-link cmp-sign-in`,type:`button`,title:this.t(`signInGithub`),onclick:()=>this.openCommenterSignIn()},K(J.github),this.t(`signIn`)),G(`button`,{class:`icon-btn cmp-close`,type:`button`,"aria-label":this.t(`cancel`),title:this.t(`cancel`),onclick:()=>this.closeCard()},K(J.close)))}renderCard(){let e=this.card;if(!e)return null;let t=`card${window.matchMedia(Yi).matches?` sheet`:``}`;if(e.kind===`composer`)return this.renderComposer(e.draft,t);let n=this.comments.find(t=>t._id===e.id);if(!n)return null;let r=this.isMine(n),i=this.isOwner,a=this.placements.get(n._id),o;if(e.editing){let t=G(`textarea`,{class:`field`,maxlength:y.bodyMaxLength,placeholder:n.suggestion?this.t(`addNote`):null,"data-focus-key":`edit`,"aria-label":this.t(`comment`)}),r=this.uiLayer.querySelector(`[data-focus-key="edit"]`);t.value=r?r.value:n.body;let i=n.suggestion?G(`textarea`,{class:`field`,rows:2,maxlength:y.quoteMaxLength,"data-focus-key":`edit-suggestion`,"aria-label":this.t(`newText`)}):null;if(i&&n.suggestion){let e=this.uiLayer.querySelector(`[data-focus-key="edit-suggestion"]`);i.value=e?e.value:n.suggestion.after}o=G(`div`,{class:`card-body`},n.suggestion&&i?G(`div`,{class:`suggest`},G(`div`,{class:`suggest-label`},this.t(`suggestedEdit`)),G(`del`,{},n.suggestion.before),i):null,t,G(`div`,{class:`row`},G(`span`,{class:`spacer`}),G(`button`,{class:`btn btn-ghost`,type:`button`,onclick:()=>{e.editing=!1,this.render()}},this.t(`cancel`)),G(`button`,{class:`btn btn-primary`,type:`button`,disabled:!!e.busy,onclick:()=>this.saveEdit(n,t.value,i?.value)},this.t(`save`))))}else{let t=[n.status===`resolved`?G(`span`,{class:`badge badge-ok`},K(J.check),this.t(n.resolution===`outdated`?`outdated`:`resolved`)):null,n.page.origin===location.origin?null:G(`span`,{class:`badge`,title:this.t(`leftOn`,{origin:n.page.origin})},new URL(n.page.origin).host),a?.confidence===`low`?G(`span`,{class:`badge`,title:this.t(`approximateHint`)},this.t(`approximate`)):null,a?.element?null:G(`span`,{class:`badge`,title:this.t(`originallyOn`,{text:n.anchor.text||n.anchor.tag})},this.t(`notFound`))].filter(e=>e!==null),s=i&&!(this.ownerDetailLoaded&&this.ownerDetailId===n._id),c=n.status===`resolved`;o=G(`div`,{class:`card-body msg`},G(`div`,{class:`card-head`},...this.authorLine(n),G(`span`,{class:`meta`},this.i18n.timeAgo(n.createdAt)+(n.editedAt?` · ${this.t(`edited`)}`:``)),G(`span`,{class:`spacer`}),i?G(`button`,{class:`icon-btn${c?` is-resolved`:``}`,type:`button`,"aria-label":this.t(c?`reopen`:`resolve`),title:this.t(c?`reopen`:`resolve`),disabled:!!e.busy,onclick:()=>c?this.reopenComment(n):this.resolveComment(n)},K(J.check)):null,G(`button`,{class:`icon-btn card-close`,type:`button`,"aria-label":this.t(`close`),title:this.t(`close`),onclick:()=>this.closeCard()},K(J.close))),G(`div`,{class:`msg-main`},n.suggestion?zi(n.suggestion,this.t(`suggestedEdit`),i?this.copyNewTextButton(n.suggestion.after):null):n.anchor.quote?G(`blockquote`,{class:`quote`},n.anchor.quote.exact):null,n.body?G(`div`,{class:`comment-body`},n.body):null,this.threadId===n._id&&this.thread?.images?.length?G(`div`,{class:`images`},...this.thread.images.map((e,t)=>G(`a`,{href:e,target:`_blank`,rel:`noreferrer`,title:this.t(`openImage`)},G(`img`,{src:e,alt:this.t(`imageN`,{n:t+1}),loading:`lazy`})))):null,this.ownerDetail?._id===n._id&&this.ownerDetail.screenshotUrl?G(`a`,{class:`shot`,href:this.ownerDetail.screenshotUrl,target:`_blank`,rel:`noreferrer`,title:this.t(`openScreenshot`)},G(`img`,{src:this.ownerDetail.screenshotUrl,alt:this.t(`screenshotTaken`)})):null,t.length?G(`div`,{class:`badges`},...t):null,i&&!c&&!a?.element?G(`div`,{class:`lost`},G(`p`,{},this.t(`lostHint`)),G(`div`,{class:`row`},G(`button`,{class:`btn`,type:`button`,onclick:()=>this.startMovePin(n)},K(J.target),this.t(`movePin`)),G(`button`,{class:`btn btn-ghost`,type:`button`,disabled:!!e.busy,onclick:()=>this.closeAsOutdated(n)},this.t(`closeOutdated`)))):null,G(`div`,{class:`msg-foot`},this.renderReactions(n,n._id),G(`span`,{class:`spacer`}),G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`copyForAgent`),title:s?this.t(`loadingContext`):this.t(`copyForAgentHint`),disabled:s,onclick:()=>this.copyForAgent(n)},K(J.bot)),i&&a?.element?G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`movePin`),title:this.t(`movePin`),onclick:()=>this.startMovePin(n)},K(J.target)):null,r?G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`edit`),title:this.t(`edit`),onclick:()=>{e.editing=!0,this.render()}},K(J.edit)):null,r||i?G(`button`,{class:`icon-btn icon-btn-danger`,type:`button`,"aria-label":this.t(`delete`),title:this.t(`delete`),"data-focus-key":`delete`,disabled:!!e.busy,onclick:()=>void this.deleteComment(n)},K(J.trash)):null),e.error?G(`div`,{class:`error`,role:`alert`},e.error):null))}return G(`div`,{class:t,"data-card":`thread`,role:`dialog`,"aria-label":this.t(`commentBy`,{name:n.authorName})},o,e.editing?null:this.renderThread(n))}renderReactions(e,t,n=!0){let r=this.card;if(r?.kind!==`thread`)return null;let i=this.threadId===e._id&&this.thread?this.thread.reactions.filter(e=>e.targetId===t):[],a=r.picker===t;return!n&&!i.length&&!a?null:G(`div`,{class:`reactions`},...i.map(n=>{let r=n.authorKeyHashes.includes(this.authorKey);return G(`button`,{class:`reaction`,type:`button`,"aria-pressed":String(r),"aria-label":`${n.emoji} ${n.count}${r?`, including you`:``}`,onclick:()=>this.toggleReaction(e,t,n.emoji)},`${n.emoji} ${n.count}`)}),n?this.reactionAdd(t,`reaction reaction-add`):null,a?G(`div`,{class:`reaction-picker`,role:`group`,"aria-label":this.t(`reactions`)},...te.map(n=>G(`button`,{class:`reaction`,type:`button`,"aria-label":this.t(`reactWith`,{emoji:n}),onclick:()=>{r.picker=null,this.toggleReaction(e,t,n),this.render()}},n))):null)}reactionAdd(e,t){let n=this.card;if(n?.kind!==`thread`)return null;let r=n.picker===e;return G(`button`,{class:t,type:`button`,"aria-label":this.t(`addReaction`),"aria-expanded":String(r),title:this.t(`addReaction`),onclick:()=>{n.picker=r?null:e,this.render()}},K(J.smile))}renderThread(e){let t=this.card;if(t?.kind!==`thread`)return null;let n=this.threadId===e._id?this.thread?.replies??[]:[],r=this.isOwner,i=n.map(n=>{let i=this.isMyReply(n);if(t.replyEditing===n._id){let r=G(`textarea`,{class:`field`,maxlength:y.bodyMaxLength,"data-focus-key":`reply-edit-${n._id}`,"aria-label":this.t(`editReply`)}),i=this.uiLayer.querySelector(`[data-focus-key="reply-edit-${n._id}"]`);return r.value=i?i.value:n.body,G(`div`,{class:`reply`},r,G(`div`,{class:`row`},G(`span`,{class:`spacer`}),G(`button`,{class:`btn btn-ghost`,type:`button`,onclick:()=>{t.replyEditing=void 0,this.render()}},this.t(`cancel`)),G(`button`,{class:`btn btn-primary`,type:`button`,disabled:!!t.busy,onclick:()=>this.saveReplyEdit(e,n,r.value)},this.t(`save`))))}return G(`div`,{class:`reply msg`,"data-reply":n._id},G(`div`,{class:`card-head`},...this.authorLine(n),n.isOwner?G(`span`,{class:`badge badge-owner`},this.t(`owner`)):null,G(`span`,{class:`meta`},this.i18n.timeAgo(n.createdAt)+(n.editedAt?` · ${this.t(`edited`)}`:``)),G(`span`,{class:`spacer`}),G(`span`,{class:`msg-tools`},this.reactionAdd(n._id,`icon-btn`),i?G(`button`,{class:`icon-btn`,type:`button`,"aria-label":this.t(`editReply`),title:this.t(`edit`),onclick:()=>{t.replyEditing=n._id,this.render()}},K(J.edit)):null,i||r?G(`button`,{class:`icon-btn icon-btn-danger`,type:`button`,"aria-label":this.t(`deleteReply`),title:this.t(`delete`),"data-focus-key":`delete-${n._id}`,disabled:!!t.busy,onclick:()=>void this.deleteReply(e,n)},K(J.trash)):null)),G(`div`,{class:`msg-main`},G(`div`,{class:`comment-body`},n.body),this.renderReactions(e,n._id,!1)))}),a=!r&&!this.displayName,o=G(`input`,{class:`reply-name`,placeholder:this.t(`yourName`),value:this.name,maxlength:y.nameMaxLength,autocomplete:`name`,"data-focus-key":`reply-name`,"aria-label":this.t(`yourName`)}),s=this.uiLayer.querySelector(`[data-focus-key="reply-name"]`);s&&(o.value=s.value);let c=G(`textarea`,{class:`reply-text`,placeholder:n.length?this.t(`reply`):this.t(`replyFirst`),maxlength:y.bodyMaxLength,rows:1,"data-focus-key":`reply`,"aria-label":this.t(`reply`)}),l=this.uiLayer.querySelector(`[data-focus-key="reply"]`);l&&(c.value=l.value);let u=G(`button`,{class:`reply-send`,type:`submit`,"aria-label":this.t(`sendReply`),title:this.t(`sendReply`),disabled:!!t.sendingReply||!c.value.trim()},K(J.arrowUp)),d=()=>{u.disabled=!!t.sendingReply||!c.value.trim(),c.style.height=`auto`,c.style.height=`${c.scrollHeight}px`};c.addEventListener(`input`,d),requestAnimationFrame(()=>{c.isConnected&&d()});let f=()=>void this.sendReply(e,c.value,a?o.value:this.name);return c.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),f())}),G(`div`,{class:`thread`},i.length?G(`div`,{class:`replies`,role:`list`,"aria-label":this.t(`replyCount`,{count:i.length})},...i.map(e=>(e.setAttribute(`role`,`listitem`),e))):null,G(`form`,{class:`reply-form`,onsubmit:e=>{e.preventDefault(),f()}},a?o:null,G(`div`,{class:`reply-row`},c,u)))}positionCard(){let e=this.uiLayer.querySelector(`[data-card]`);if(!e||e.classList.contains(`sheet`))return;let t=null;if(this.card?.kind===`composer`){let{draft:e}=this.card;t=this.anchorPoint(e.anchor,e.element,e.range)}else if(this.card?.kind===`thread`){let e=this.comments.find(e=>this.card?.kind===`thread`&&e._id===this.card.id);t=e?this.pinPositions.get(e._id)??this.pinPoint(e):null}let n=e.offsetWidth||320,r=e.offsetHeight||160,i=window.innerWidth,a=window.innerHeight,o,s;if(t)o=t.x+36,s=t.y-28,o+n>i-12&&(o=t.x-n-12);else{let{position:e}=this;o=e.endsWith(`left`)?16:e.endsWith(`center`)?(i-n)/2:i-n-16,s=e.startsWith(`top`)?72:a-r-72}o=Math.max(12,Math.min(o,i-n-12)),s=Math.max(12,Math.min(s,a-r-12)),e.style.left=`${Math.round(o)}px`,e.style.top=`${Math.round(s)}px`}focusComposer(){requestAnimationFrame(()=>{this.uiLayer.querySelector(this.displayName?`[data-focus-key="body"]`:`[data-focus-key="name"]`)?.focus()})}};function ra(e,t){let n=window.innerWidth,r=e<n/3?`left`:e>n*2/3?`right`:`center`;return`${t<window.innerHeight/2?`top`:`bottom`}-${r}`}function ia(e){let t=e.composedPath()[0];if(!(t instanceof Element))return!1;let n=document.documentElement;if(t===n)return e.clientX>=n.clientWidth||e.clientY>=n.clientHeight;if(!(t.scrollHeight>t.clientHeight||t.scrollWidth>t.clientWidth))return!1;let r=t.getBoundingClientRect();return e.clientX-r.left-t.clientLeft>=t.clientWidth||e.clientY-r.top-t.clientTop>=t.clientHeight}function aa(e){let t=[e.convexUrl,e.convexSiteUrl].flatMap(e=>{try{return[new URL(e).origin]}catch{return[]}});return e=>{try{return t.includes(new URL(e,location.href).origin)}catch{return!1}}}let Z=null;function oa(e,t){let n={destroy(){}};if(typeof window>`u`||typeof document>`u`)return n;if(!_(e.project))return console.warn(`[nuni] "${e.project}" is not a valid project ID. Run \`npx @nuniapp/cli@latest init\` to get one.`),n;if(Z?.project===e.project)return sa(Z);Z&&ca(Z);let r=x(e),i={project:e.project,widget:null,collectors:_e(r.capture,aa(r)),timer:0,handles:0};Z=i;let a=()=>{if(Z===i){if(!document.body){i.timer=window.setTimeout(a,50);return}i.widget=new na(r,{collectors:i.collectors,loadScreenshot:r.capture.screenshot?t.loadScreenshot:null}),i.widget.start()}},o=window.requestIdleCallback;return o?o(a,{timeout:1500}):i.timer=window.setTimeout(a,1),sa(i)}function sa(e){e.handles++;let t=!1;return{destroy(){t||(t=!0,e.handles--,e.handles<=0&&Z===e&&ca(e))}}}function ca(e){clearTimeout(e.timer),e.widget?.destroy(),e.widget=null,e.collectors.stop(),Z===e&&(Z=null)}let la=document.currentScript??document.querySelector(`script[data-project][src*='nuni']`),ua=null;function da(){return ua??(ua=new Promise(e=>{if(window.__nuniScreenshot)return e(window.__nuniScreenshot);let t=document.createElement(`script`);t.src=new URL(`nuni-screenshot.global.js`,la.src).href,t.async=!0,t.onload=()=>e(window.__nuniScreenshot??null),t.onerror=()=>{ua=null,e(null)},document.head.appendChild(t)})),ua}function fa(e){return oa(e,{loadScreenshot:la?.src?da:null})}window.Nuni={init:fa,version:`0.1.11`};function Q(e){if(e!==void 0)return!/^(false|0|off|no)$/i.test(e.trim())}let $=la?.dataset;$?.project&&fa({project:$.project,convexUrl:$.convexUrl,convexSiteUrl:$.convexSiteUrl,appUrl:$.appUrl,pageKey:$.pageKey,position:$.position,accentColor:$.accentColor,theme:$.theme,label:$.label,hotkey:$.hotkey===void 0?void 0:Q($.hotkey)!==!1&&$.hotkey,zIndex:$.zIndex===void 0?void 0:Number($.zIndex),locale:$.locale,images:Q($.images),capture:{console:Q($.captureConsole),network:Q($.captureNetwork),dom:Q($.captureDom),screenshot:Q($.captureScreenshot)}})})();