vendor: 6,218 bytes, lines 1-2
1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/terms-Cf03A8c-.js","assets/LegalPage--pmpv-NK.js","assets/site-chrome-DGGN-HEA.js","assets/smartlead-alternative-CK08AxxN.js","assets/comparison-page-lLDrnamo.js","assets/saleshandy-alternative-Clgxu6rh.js","assets/refund-BQfDm_zQ.js","assets/reachinbox-alternative-CqEKFTYI.js","assets/privacy-Dsljx1WO.js","assets/pricing-Cd_vO5e_.js","assets/phone-CXAF-A0u.js","assets/shield-check-Bf80vLR2.js","assets/minus-C_pEtvic.js","assets/mcp-BMkiH5TE.js","assets/message-square-Ct0AtLAw.js","assets/code-xml-CDpA8RKI.js","assets/globe-Bh6k37kv.js","assets/zap-DmY2mY6w.js","assets/users-BSGjvkHD.js","assets/chart-column-B1HeovTq.js","assets/instantly-alternative-CDlgvT4U.js","assets/heyreach-alternative-C3BdozXc.js","assets/fair-usage-BGPajRyv.js","assets/cancellation-CBnckLsp.js","assets/apollo-alternative-BBcQpy13.js","assets/aimfox-alternative-DJYi5qJn.js","assets/affiliate-_JhfV9y0.js","assets/sparkles-DuCWloPp.js","assets/index-BPdCsc2q.js","assets/database-zap-C1BhN9V_.js","assets/layers-C_RSLsiE.js","assets/activity-BTY1aJr_.js","assets/git-branch-iuSG4NsH.js","assets/tools.index-DPYR4sjb.js","assets/mail-check-D7JAdT-K.js","assets/help.index-BEMeYB5z.js","assets/KbLayout-Bk6FUbeW.js","assets/blog.index-LxvC8PDL.js","assets/format-date-wgJgNfnT.js","assets/useBaseQuery-C3OIK63l.js","assets/tools.spf-CLDy-mxH.js","assets/dns.functions-ZKmzH_Ck.js","assets/tools.mx-CWy-oDoy.js","assets/tools.email-verifier-B9KicVe3.js","assets/tools.dmarc-Dey5bkcV.js","assets/tools.dkim-l9s6oNk0.js","assets/tools.blacklist-C_OIpoEF.js","assets/features.unified-inbox-DUpbQQ08.js","assets/ProductFaq-CwEuWLTh.js","assets/features.multichannel-outreach-CHFKDsqx.js","assets/features.mailbox-infrastructure-zAfSddWw.js","assets/features.data-and-enrichment-CGrvnpqW.js","assets/blog._slug-V9Ugt42c.js","assets/blog._slug-DEoemIyW.js","assets/useQuery-BgJ0pvkj.js","assets/MarkdownContent-Bj1rPE0j.js","assets/index-D9Kh4BGV.js","assets/help._categorySlug.index-WdPVQt5O.js","assets/HelpVideo-DD9SS7k_.js","assets/help._categorySlug._articleSlug-CrNsa8bB.js","assets/admin.waitlist-DJnjhIDg.js","assets/admin.topics-Ct-cUwk1.js","assets/topics.functions-CFz1LKnX.js","assets/AdminHeader-BhKW5nNM.js","assets/admin.seo-jrNZuauY.js","assets/internal-links.functions-zt6KfS-0.js","assets/admin.redirects-DLRogIIY.js","assets/admin.authors-C32wgaOt.js","assets/admin.posts.index-CxMA4aqq.js","assets/admin.posts.new-D-1rHUWD.js","assets/PostEditor-BD8Erh-b.js","assets/admin.posts._id-Cic_PGYd.js"])))=>i.map(i=>d[i]); 2function rA(t,e){for(var n=0;n<e.length;n++){const i=e[n];if(typeof i!="string"&&!Array.isArray(i)){for(const s in i)if(s!=="default"&&!(s in t)){const l=Object.getOwnPropertyDescriptor(i,s);l&&Object.defineProperty(t,s,l.get?l:{enumerable:!0,get:()=>i[s]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}function Ux(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var lf={exports:{}},Cr={};var rv;function lA(){if(rv)return Cr;rv=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(i,s,l){var d=null;if(l!==void 0&&(d=""+l),s.key!==void 0&&(d=""+s.key),"key"in s){l={};for(var u in s)u!=="key"&&(l[u]=s[u])}else l=s;return s=l.ref,{$$typeof:t,type:i,key:d,ref:s!==void 0?s:null,props:l}}return Cr.Fragment=e,Cr.jsx=n,Cr.jsxs=n,Cr}var lv;function cA(){return lv||(lv=1,lf.exports=lA()),lf.exports}var M=cA(),cf={exports:{}},xe={};var cv;function dA(){if(cv)return xe;cv=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),l=Symbol.for("react.consumer"),d=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),p=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),g=Symbol.for("react.activity"),v=Symbol.iterator;function w(O){return O===null||typeof O!="object"?null:(O=v&&O[v]||O["@@iterator"],typeof O=="function"?O:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},k=Object.assign,S={};function C(O,V,Q){this.props=O,this.context=V,this.refs=S,this.updater=Q||x}C.prototype.isReactComponent={},C.prototype.setState=function(O,V){if(typeof O!="object"&&typeof O!="function"&&O!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,O,V,"setState")},C.prototype.forceUpdate=function(O){this.updater.enqueueForceUpdate(this,O,"forceUpdate")};function E(){}E.prototype=C.prototype;function R(O,V,Q){this.props=O,this.context=V,this.refs=S,this.updater=Q||x}var D=R.prototype=new E;D.constructor=R,k(D,C.prototype),D.isPureReactComponent=!0;var G=Array.isArray;function z(){}var N={H:null,A:null,T:null,S:null},P=Object.prototype.hasOwnProperty;function W(O,V,Q){var ee=Q.ref;return{$$typeof:t,type:O,key:V,ref:ee!==void 0?ee:null,props:Q}}function oe(O,V){return W(O.type,V,O.props)}function ne(O){return typeof O=="object"&&O!==null&&O.$$typeof===t}function we(O){var V={"=":"=0",":":"=2"};return"$"+O.replace(/[=:]/g,function(Q){return V[Q]})}var Fe=/\/+/g;function tt(O,V){return typeof O=="object"&&O!==null&&O.key!=null?we(""+O.key):V.toString(36)}function qe(O){switch(O.status){case"fulfilled":return O.value;case"rejected":throw O.reason;default:switch(typeof O.status=="string"?O.then(z,z):(O.status="pending",O.then(function(V){O.status==="pending"&&(O.status="fulfilled",O.value=V)},function(V){O.status==="pending"&&(O.status="rejected",O.reason=V)})),O.status){case"fulfilled":return O.value;case"rejected":throw O.reason}}throw O}function q(O,V,Q,ee,te){var fe=typeof O;(fe==="undefined"||fe==="boolean")&&(O=null);var Re=!1;if(O===null)Re=!0;else switch(fe){case"bigint":case"string":case"number":Re=!0;break;case"object":switch(O.$$typeof){case t:case e:Re=!0;break;case y:return Re=O._init,q(Re(O._payload),V,Q,ee,te)}}if(Re)return te=te(O),Re=ee===""?"."+tt(O,0):ee,G(te)?(Q="",Re!=null&&(Q=Re.replace(Fe,"$&/")+"/"),q(te,V,Q,"",function(yn){return yn}
vendor: 5,221 bytes, line 2
2)):te!=null&&(ne(te)&&(te=oe(te,Q+(te.key==null||O&&O.key===te.key?"":(""+te.key).replace(Fe,"$&/")+"/")+Re)),V.push(te)),1;Re=0;var ot=ee===""?".":ee+":";if(G(O))for(var ve=0;ve<O.length;ve++)ee=O[ve],fe=ot+tt(ee,ve),Re+=q(ee,V,Q,fe,te);else if(ve=w(O),typeof ve=="function")for(O=ve.call(O),ve=0;!(ee=O.next()).done;)ee=ee.value,fe=ot+tt(ee,ve++),Re+=q(ee,V,Q,fe,te);else if(fe==="object"){if(typeof O.then=="function")return q(qe(O),V,Q,ee,te);throw V=String(O),Error("Objects are not valid as a React child (found: "+(V==="[object Object]"?"object with keys {"+Object.keys(O).join(", ")+"}":V)+"). If you meant to render a collection of children, use an array instead.")}return Re}function K(O,V,Q){if(O==null)return O;var ee=[],te=0;return q(O,ee,"","",function(fe){return V.call(Q,fe,te++)}),ee}function he(O){if(O._status===-1){var V=O._result;V=V(),V.then(function(Q){(O._status===0||O._status===-1)&&(O._status=1,O._result=Q)},function(Q){(O._status===0||O._status===-1)&&(O._status=2,O._result=Q)}),O._status===-1&&(O._status=0,O._result=V)}if(O._status===1)return O._result.default;throw O._result}var Le=typeof reportError=="function"?reportError:function(O){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var V=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof O=="object"&&O!==null&&typeof O.message=="string"?String(O.message):String(O),error:O});if(!window.dispatchEvent(V))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",O);return}console.error(O)},X={map:K,forEach:function(O,V,Q){K(O,function(){V.apply(this,arguments)},Q)},count:function(O){var V=0;return K(O,function(){V++}),V},toArray:function(O){return K(O,function(V){return V})||[]},only:function(O){if(!ne(O))throw Error("React.Children.only expected to receive a single React element child.");return O}};return xe.Activity=g,xe.Children=X,xe.Component=C,xe.Fragment=n,xe.Profiler=s,xe.PureComponent=R,xe.StrictMode=i,xe.Suspense=f,xe.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=N,xe.__COMPILER_RUNTIME={__proto__:null,c:function(O){return N.H.useMemoCache(O)}},xe.cache=function(O){return function(){return O.apply(null,arguments)}},xe.cacheSignal=function(){return null},xe.cloneElement=function(O,V,Q){if(O==null)throw Error("The argument must be a React element, but you passed "+O+".");var ee=k({},O.props),te=O.key;if(V!=null)for(fe in V.key!==void 0&&(te=""+V.key),V)!P.call(V,fe)||fe==="key"||fe==="__self"||fe==="__source"||fe==="ref"&&V.ref===void 0||(ee[fe]=V[fe]);var fe=arguments.length-2;if(fe===1)ee.children=Q;else if(1<fe){for(var Re=Array(fe),ot=0;ot<fe;ot++)Re[ot]=arguments[ot+2];ee.children=Re}return W(O.type,te,ee)},xe.createContext=function(O){return O={$$typeof:d,_currentValue:O,_currentValue2:O,_threadCount:0,Provider:null,Consumer:null},O.Provider=O,O.Consumer={$$typeof:l,_context:O},O},xe.createElement=function(O,V,Q){var ee,te={},fe=null;if(V!=null)for(ee in V.key!==void 0&&(fe=""+V.key),V)P.call(V,ee)&&ee!=="key"&&ee!=="__self"&&ee!=="__source"&&(te[ee]=V[ee]);var Re=arguments.length-2;if(Re===1)te.children=Q;else if(1<Re){for(var ot=Array(Re),ve=0;ve<Re;ve++)ot[ve]=arguments[ve+2];te.children=ot}if(O&&O.defaultProps)for(ee in Re=O.defaultProps,Re)te[ee]===void 0&&(te[ee]=Re[ee]);return W(O,fe,te)},xe.createRef=function(){return{current:null}},xe.forwardRef=function(O){return{$$typeof:u,render:O}},xe.isValidElement=ne,xe.lazy=function(O){return{$$typeof:y,_payload:{_status:-1,_result:O},_init:he}},xe.memo=function(O,V){return{$$typeof:p,type:O,compare:V===void 0?null:V}},xe.startTransition=function(O){var V=N.T,Q={};N.T=Q;try{var ee=O(),te=N.S;te!==null&&te(Q,ee),typeof ee=="object"&&ee!==null&&typeof ee.then=="function"&&ee.then(z,Le)}catch(fe){Le(fe)}finally{V!==null&&Q.types!==null&&(V.types=Q.types),N.T=V}},xe.unstable_useCacheRefresh=function(){return N.H.useCacheRefresh()},xe.use=function(O){return N.H.use(O)},xe.useActionState=function(O,V,Q){return N.H.useActionState(O,V,Q)},xe.useCallback=function(O,V){return N.H.useCallback(O,V)},xe.useContext=function(O){return N.H.useContext(O)},xe.useDebugValue=function(){},xe.useDeferredValue=function(O,V){return N.H.useDeferredValue(O,V)},xe.useEffect=function(O,V){return N.H.useEffect(O,V)},xe.useEffectEvent=function(O){return N.H.useEffectEvent(O)},xe.useId=function(){return N.H.useId()},xe.useImperativeHandle=function(O,V,Q){return N.H.useImperativeHandle(O,V,Q)},xe.useInsertionEffect=function(O,V){return N.H.useInsertionEffect(O,V)},xe.useLayoutEffect=function(O,V){return N.H.useLayoutEffect(O,V)},xe.useMemo=function(O,V){return N.H.useMemo(O,V)},xe.useOptimistic=function(O,V){return N.H.useOptimistic(O,V)},xe.useReducer=function(O,V,Q){return N.H.useReducer(O,V,Q)},xe.useRef=function(O){return N.H.useRef(O)},xe.useState=function(O){return N.H.useState(O)},xe.useSyncExternalStore=function(O,V,Q){return N.H.useSyncExternalStore(O,V,Q)},xe.useTransition=function(){return N.H.useTransition()},xe.version="19.2.5",xe}var dv;function cl(){return dv||(dv=1,cf.exports=dA()),cf.exports}var A=cl();const bt=Ux(A),Mp=rA({__proto__:null,default:bt},[A]);var df={exports:{}},Ar={},uf={exports:{}},hf={};var uv;
vendor: 12,259 bytes, lines 2-4
2function uA(){return uv||(uv=1,(function(t){function e(q,K){var he=q.length;q.push(K);e:for(;0<he;){var Le=he-1>>>1,X=q[Le];if(0<s(X,K))q[Le]=K,q[he]=X,he=Le;else break e}}function n(q){return q.length===0?null:q[0]}function i(q){if(q.length===0)return null;var K=q[0],he=q.pop();if(he!==K){q[0]=he;e:for(var Le=0,X=q.length,O=X>>>1;Le<O;){var V=2*(Le+1)-1,Q=q[V],ee=V+1,te=q[ee];if(0>s(Q,he))ee<X&&0>s(te,Q)?(q[Le]=te,q[ee]=he,Le=ee):(q[Le]=Q,q[V]=he,Le=V);else if(ee<X&&0>s(te,he))q[Le]=te,q[ee]=he,Le=ee;else break e}}return K}function s(q,K){var he=q.sortIndex-K.sortIndex;return he!==0?he:q.id-K.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var l=performance;t.unstable_now=function(){return l.now()}}else{var d=Date,u=d.now();t.unstable_now=function(){return d.now()-u}}var f=[],p=[],y=1,g=null,v=3,w=!1,x=!1,k=!1,S=!1,C=typeof setTimeout=="function"?setTimeout:null,E=typeof clearTimeout=="function"?clearTimeout:null,R=typeof setImmediate<"u"?setImmediate:null;function D(q){for(var K=n(p);K!==null;){if(K.callback===null)i(p);else if(K.startTime<=q)i(p),K.sortIndex=K.expirationTime,e(f,K);else break;K=n(p)}}function G(q){if(k=!1,D(q),!x)if(n(f)!==null)x=!0,z||(z=!0,we());else{var K=n(p);K!==null&&qe(G,K.startTime-q)}}var z=!1,N=-1,P=5,W=-1;function oe(){return S?!0:!(t.unstable_now()-W<P)}function ne(){if(S=!1,z){var q=t.unstable_now();W=q;var K=!0;try{e:{x=!1,k&&(k=!1,E(N),N=-1),w=!0;var he=v;try{t:{for(D(q),g=n(f);g!==null&&!(g.expirationTime>q&&oe());){var Le=g.callback;if(typeof Le=="function"){g.callback=null,v=g.priorityLevel;var X=Le(g.expirationTime<=q);if(q=t.unstable_now(),typeof X=="function"){g.callback=X,D(q),K=!0;break t}g===n(f)&&i(f),D(q)}else i(f);g=n(f)}if(g!==null)K=!0;else{var O=n(p);O!==null&&qe(G,O.startTime-q),K=!1}}break e}finally{g=null,v=he,w=!1}K=void 0}}finally{K?we():z=!1}}}var we;if(typeof R=="function")we=function(){R(ne)};else if(typeof MessageChannel<"u"){var Fe=new MessageChannel,tt=Fe.port2;Fe.port1.onmessage=ne,we=function(){tt.postMessage(null)}}else we=function(){C(ne,0)};function qe(q,K){N=C(function(){q(t.unstable_now())},K)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(q){q.callback=null},t.unstable_forceFrameRate=function(q){0>q||125<q?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):P=0<q?Math.floor(1e3/q):5},t.unstable_getCurrentPriorityLevel=function(){return v},t.unstable_next=function(q){switch(v){case 1:case 2:case 3:var K=3;break;default:K=v}var he=v;v=K;try{return q()}finally{v=he}},t.unstable_requestPaint=function(){S=!0},t.unstable_runWithPriority=function(q,K){switch(q){case 1:case 2:case 3:case 4:case 5:break;default:q=3}var he=v;v=q;try{return K()}finally{v=he}},t.unstable_scheduleCallback=function(q,K,he){var Le=t.unstable_now();switch(typeof he=="object"&&he!==null?(he=he.delay,he=typeof he=="number"&&0<he?Le+he:Le):he=Le,q){case 1:var X=-1;break;case 2:X=250;break;case 5:X=1073741823;break;case 4:X=1e4;break;default:X=5e3}return X=he+X,q={id:y++,callback:K,priorityLevel:q,startTime:he,expirationTime:X,sortIndex:-1},he>Le?(q.sortIndex=he,e(p,q),n(f)===null&&q===n(p)&&(k?(E(N),N=-1):k=!0,qe(G,he-Le))):(q.sortIndex=X,e(f,q),x||w||(x=!0,z||(z=!0,we()))),q},t.unstable_shouldYield=oe,t.unstable_wrapCallback=function(q){var K=v;return function(){var he=v;v=K;try{return q.apply(this,arguments)}finally{v=he}}}})(hf)),hf}var hv;function hA(){return hv||(hv=1,uf.exports=uA()),uf.exports}var ff={exports:{}},qt={};var fv;function fA(){if(fv)return qt;fv=1;var t=cl();function e(f){var p="https://react.dev/errors/"+f;if(1<arguments.length){p+="?args[]="+encodeURIComponent(arguments[1]);for(var y=2;y<arguments.length;y++)p+="&args[]="+encodeURIComponent(arguments[y])}return"Minified React error #"+f+"; visit "+p+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function n(){}var i={d:{f:n,r:function(){throw Error(e(522))},D:n,C:n,L:n,m:n,X:n,S:n,M:n},p:0,findDOMNode:null},s=Symbol.for("react.portal");function l(f,p,y){var g=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:s,key:g==null?null:""+g,children:f,containerInfo:p,implementation:y}}var d=t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function u(f,p){if(f==="font")return"";if(typeof p=="string")return p==="use-credentials"?p:""}return qt.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=i,qt.createPortal=function(f,p){var y=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!p||p.nodeType!==1&&p.nodeType!==9&&p.nodeType!==11)throw Error(e(299));return l(f,p,null,y)},qt.flushSync=function(f){var p=d.T,y=i.p;try{if(d.T=null,i.p=2,f)return f()}finally{d.T=p,i.p=y,i.d.f()}},qt.preconnect=function(f,p){typeof f=="string"&&(p?(p=p.crossOrigin,p=typeof p=="string"?p==="use-credentials"?p:"":void 0):p=null,i.d.C(f,p))},qt.prefetchDNS=function(f){typeof f=="string"&&i.d.D(f)},qt.preinit=function(f,p){if(typeof f=="string"&&p&&typeof p.as=="string"){var y=p.as,g=u(y,p.crossOrigin),v=typeof p.integrity=="string"?p.integrity:void 0,w=typeof p.fetchPriority=="string"?p.fetchPriority:void 0;y==="style"?i.d.S(f,typeof p.precedence=="string"?p.precedence:void 0,{crossOrigin:g,integrity:v,fetchPriority:w}):y==="script"&&i.d.X(f,{crossOrigin:g,integrity:v,fetchPriority:w,nonce:typeof p.nonce=="string"?p.nonce:void 0})}},qt.preinitModule=function(f,p){if(typeof f=="string")if(typeof p=="object"&&p!==null){if(p.as==null||p.as==="script"){var y=u(p.as,p.crossOrigin);i.d.M(f,{crossOrigin:y,integrity:typeof p.integrity=="string"?p.integrity:void 0,nonce:typeof p.nonce=="string"?p.nonce:void 0})}}else p==null&&i.d.M(f)},qt.preload=function(f,p){if(typeof f=="string"&&typeof p=="object"&&p!==null&&typeof p.as=="string"){var y=p.as,g=u(y,p.crossOrigin);i.d.L(f,y,{crossOrigin:g,integrity:typeof p.integrity=="string"?p.integrity:void 0,nonce:typeof p.nonce=="string"?p.nonce:void 0,type:typeof p.type=="string"?p.type:void 0,fetchPriority:typeof p.fetchPriority=="string"?p.fetchPriority:void 0,referrerPolicy:typeof p.referrerPolicy=="string"?p.referrerPolicy:void 0,imageSrcSet:typeof p.imageSrcSet=="string"?p.imageSrcSet:void 0,imageSizes:typeof p.imageSizes=="string"?p.imageSizes:void 0,media:typeof p.media=="string"?p.media:void 0})}},qt.preloadModule=function(f,p){if(typeof f=="string")if(p){var y=u(p.as,p.crossOrigin);i.d.m(f,{as:typeof p.as=="string"&&p.as!=="script"?p.as:void 0,crossOrigin:y,integrity:typeof p.integrity=="string"?p.integrity:void 0})}else i.d.m(f)},qt.requestFormReset=function(f){i.d.r(f)},qt.unstable_batchedUpdates=function(f,p){return f(p)},qt.useFormState=function(f,p,y){return d.H.useFormState(f,p,y)},qt.useFormStatus=function(){return d.H.useHostTransitionStatus()},qt.version="19.2.5",qt}var pv;function jx(){if(pv)return ff.exports;pv=1;function t(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),ff.exports=fA(),ff.exports}var mv;function pA(){if(mv)return Ar;mv=1;var t=hA(),e=cl(),n=jx();function i(a){var o="https://react.dev/errors/"+a;if(1<arguments.length){o+="?args[]="+encodeURIComponent(arguments[1]);for(var r=2;r<arguments.length;r++)o+="&args[]="+encodeURIComponent(arguments[r])}return"Minified React error #"+a+"; visit "+o+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function s(a){return!(!a||a.nodeType!==1&&a.nodeType!==9&&a.nodeType!==11)}function l(a){var o=a,r=a;if(a.alternate)for(;o.return;)o=o.return;else{a=o;do o=a,(o.flags&4098)!==0&&(r=o.return),a=o.return;while(a)}return o.tag===3?r:null}function d(a){if(a.tag===13){var o=a.memoizedState;if(o===null&&(a=a.alternate,a!==null&&(o=a.memoizedState)),o!==null)return o.dehydrated}return null}function u(a){if(a.tag===31){var o=a.memoizedState;if(o===null&&(a=a.alternate,a!==null&&(o=a.memoizedState)),o!==null)return o.dehydrated}return null}function f(a){if(l(a)!==a)throw Error(i(188))}function p(a){var o=a.alternate;if(!o){if(o=l(a),o===null)throw Error(i(188));return o!==a?null:a}for(var r=a,c=o;;){var h=r.return;if(h===null)break;var m=h.alternate;if(m===null){if(c=h.return,c!==null){r=c;continue}break}if(h.child===m.child){for(m=h.child;m;){if(m===r)return f(h),a;if(m===c)return f(h),o;m=m.sibling}throw Error(i(188))}if(r.return!==c.return)r=h,c=m;else{for(var b=!1,_=h.child;_;){if(_===r){b=!0,r=h,c=m;break}if(_===c){b=!0,c=h,r=m;break}_=_.sibling}if(!b){for(_=m.child;_;){if(_===r){b=!0,r=m,c=h;break}if(_===c){b=!0,c=m,r=h;break}_=_.sibling}if(!b)throw Error(i(189))}}if(r.alternate!==c)throw Error(i(190))}if(r.tag!==3)throw Error(i(188));return r.stateNode.current===r?a:o}function y(a){var o=a.tag;if(o===5||o===26||o===27||o===6)return a;for(a=a.child;a!==null;){if(o=y(a),o!==null)return o;a=a.sibling}return null}var g=Object.assign,v=Symbol.for("react.element"),w=Symbol.for("react.transitional.element"),x=Symbol.for("react.portal"),k=Symbol.for("react.fragment"),S=Symbol.for("react.strict_mode"),C=Symbol.for("react.profiler"),E=Symbol.for("react.consumer"),R=Symbol.for("react.context"),D=Symbol.for("react.forward_ref"),G=Symbol.for("react.suspense"),z=Symbol.for("react.suspense_list"),N=Symbol.for("react.memo"),P=Symbol.for("react.lazy"),W=Symbol.for("react.activity"),oe=Symbol.for("react.memo_cache_sentinel"),ne=Symbol.iterator;function we(a){return a===null||typeof a!="object"?null:(a=ne&&a[ne]||a["@@iterator"],typeof a=="function"?a:null)}var Fe=Symbol.for("react.client.reference");function tt(a){if(a==null)return null;if(typeof a=="function")return a.$$typeof===Fe?null:a.displayName||a.name||null;if(typeof a=="string")return a;switch(a){case k:return"Fragment";case C:return"Profiler";case S:return"StrictMode";case G:return"Suspense";case z:return"SuspenseList";case W:return"Activity"}if(typeof a=="object")switch(a.$$typeof){case x:return"Portal";case R:return a.displayName||"Context";case E:return(a._context.displayName||"Context")+".Consumer";case D:var o=a.render;return a=a.displayName,a||(a=o.displayName||o.name||"",a=a!==""?"ForwardRef("+a+")":"ForwardRef"),a;case N:return o=a.displayName||null,o!==null?o:tt(a.type)||"Memo";case P:o=a._payload,a=a._init;try{return tt(a(o))}catch{}}return null}var qe=Array.isArray,q=e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,K=n.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,he={pending:!1,data:null,method:null,action:null},Le=[],X=-1;function O(a){return{current:a}}function V(a){0>X||(a.current=Le[X],Le[X]=null,X--)}function Q(a,o){X++,Le[X]=a.current,a.current=o}var ee=O(null),te=O(null),fe=O(null),Re=O(null);function ot(a,o){switch(Q(fe,o),Q(te,a),Q(ee,null),o.nodeType){case 9:case 11:a=(a=o.documentElement)&&(a=a.namespaceURI)?Ob(a):0;break;default:if(a=o.tagName,o=o.namespaceURI)o=Ob(o),a=Ib(o,a);else switch(a){case"svg":a=1;break;case"math":a=2;break;default:a=0}}V(ee),Q(ee,a)}function ve(){V(ee),V(te),V(fe)}function yn(a){a.memoizedState!==null&&Q(Re,a);var o=ee.current,r=Ib(o,a.type);o!==r&&(Q(te,a),Q(ee,r))}function Vt(a){te.current===a&&(V(ee),V(te)),Re.current===a&&(V(Re),xr._currentValue=he)}var on,Jn;function Gt(a){if(on===void 0)try{throw Error()}catch(r){var o=r.stack.trim().match(/\n( *(at )?)/);on=o&&o[1]||"",Jn=-1<r.stack.indexOf(` 3 at`)?" (<anonymous>)":-1<r.stack.indexOf("@")?"@unknown:0:0":""}return` 4`+on+a+Jn}var Is=!1;function pi(a,o){if(!a||Is)return"";Is=!0;var r=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var c={DetermineComponentFrameRoot:function(){try{if(o){var Y=function(){throw Error()};if(Object.defineProperty(Y.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Y,[])}catch(B){var F=B}Reflect.construct(a,[],Y)}else{try{Y.call()}catch(B){F=B}a.call(Y.prototype)}}else{try{throw Error()}catch(B){F=B}(Y=a())&&typeof Y.catch=="function"&&Y.catch(function(){})}}
vendor: 10,407 bytes, lines 4-9
4catch(B){if(B&&F&&typeof B.stack=="string")return[B.stack,F.stack]}return[null,null]}};c.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var h=Object.getOwnPropertyDescriptor(c.DetermineComponentFrameRoot,"name");h&&h.configurable&&Object.defineProperty(c.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var m=c.DetermineComponentFrameRoot(),b=m[0],_=m[1];if(b&&_){var T=b.split(` 5`),j=_.split(` 6`);for(h=c=0;c<T.length&&!T[c].includes("DetermineComponentFrameRoot");)c++;for(;h<j.length&&!j[h].includes("DetermineComponentFrameRoot");)h++;if(c===T.length||h===j.length)for(c=T.length-1,h=j.length-1;1<=c&&0<=h&&T[c]!==j[h];)h--;for(;1<=c&&0<=h;c--,h--)if(T[c]!==j[h]){if(c!==1||h!==1)do if(c--,h--,0>h||T[c]!==j[h]){var H=` 7`+T[c].replace(" at new "," at ");return a.displayName&&H.includes("<anonymous>")&&(H=H.replace("<anonymous>",a.displayName)),H}while(1<=c&&0<=h);break}}}finally{Is=!1,Error.prepareStackTrace=r}return(r=a?a.displayName||a.name:"")?Gt(r):""}function hl(a,o){switch(a.tag){case 26:case 27:case 5:return Gt(a.type);case 16:return Gt("Lazy");case 13:return a.child!==o&&o!==null?Gt("Suspense Fallback"):Gt("Suspense");case 19:return Gt("SuspenseList");case 0:case 15:return pi(a.type,!1);case 11:return pi(a.type.render,!1);case 1:return pi(a.type,!0);case 31:return Gt("Activity");default:return""}}function ea(a){try{var o="",r=null;do o+=hl(a,r),r=a,a=a.return;while(a);return o}catch(c){return` 8Error generating stack: `+c.message+` 9`+c.stack}}var Ro=Object.prototype.hasOwnProperty,On=t.unstable_scheduleCallback,Ms=t.unstable_cancelCallback,fl=t.unstable_shouldYield,Yd=t.unstable_requestPaint,Ft=t.unstable_now,Xe=t.unstable_getCurrentPriorityLevel,Mt=t.unstable_ImmediatePriority,Fn=t.unstable_UserBlockingPriority,mi=t.unstable_NormalPriority,z0=t.unstable_LowPriority,dm=t.unstable_IdlePriority,H0=t.log,G0=t.unstable_setDisableYieldValue,Ps=null,sn=null;function Ia(a){if(typeof H0=="function"&&G0(a),sn&&typeof sn.setStrictMode=="function")try{sn.setStrictMode(Ps,a)}catch{}}var rn=Math.clz32?Math.clz32:V0,W0=Math.log,$0=Math.LN2;function V0(a){return a>>>=0,a===0?32:31-(W0(a)/$0|0)|0}var pl=256,ml=262144,gl=4194304;function Eo(a){var o=a&42;if(o!==0)return o;switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return a&261888;case 262144:case 524288:case 1048576:case 2097152:return a&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return a&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return a}}function yl(a,o,r){var c=a.pendingLanes;if(c===0)return 0;var h=0,m=a.suspendedLanes,b=a.pingedLanes;a=a.warmLanes;var _=c&134217727;return _!==0?(c=_&~m,c!==0?h=Eo(c):(b&=_,b!==0?h=Eo(b):r||(r=_&~a,r!==0&&(h=Eo(r))))):(_=c&~m,_!==0?h=Eo(_):b!==0?h=Eo(b):r||(r=c&~a,r!==0&&(h=Eo(r)))),h===0?0:o!==0&&o!==h&&(o&m)===0&&(m=h&-h,r=o&-o,m>=r||m===32&&(r&4194048)!==0)?o:h}function Ds(a,o){return(a.pendingLanes&~(a.suspendedLanes&~a.pingedLanes)&o)===0}function Y0(a,o){switch(a){case 1:case 2:case 4:case 8:case 64:return o+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return o+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function um(){var a=gl;return gl<<=1,(gl&62914560)===0&&(gl=4194304),a}function Kd(a){for(var o=[],r=0;31>r;r++)o.push(a);return o}function Ls(a,o){a.pendingLanes|=o,o!==268435456&&(a.suspendedLanes=0,a.pingedLanes=0,a.warmLanes=0)}function K0(a,o,r,c,h,m){var b=a.pendingLanes;a.pendingLanes=r,a.suspendedLanes=0,a.pingedLanes=0,a.warmLanes=0,a.expiredLanes&=r,a.entangledLanes&=r,a.errorRecoveryDisabledLanes&=r,a.shellSuspendCounter=0;var _=a.entanglements,T=a.expirationTimes,j=a.hiddenUpdates;for(r=b&~r;0<r;){var H=31-rn(r),Y=1<<H;_[H]=0,T[H]=-1;var F=j[H];if(F!==null)for(j[H]=null,H=0;H<F.length;H++){var B=F[H];B!==null&&(B.lane&=-536870913)}r&=~Y}c!==0&&hm(a,c,0),m!==0&&h===0&&a.tag!==0&&(a.suspendedLanes|=m&~(b&~o))}function hm(a,o,r){a.pendingLanes|=o,a.suspendedLanes&=~o;var c=31-rn(o);a.entangledLanes|=o,a.entanglements[c]=a.entanglements[c]|1073741824|r&261930}function fm(a,o){var r=a.entangledLanes|=o;for(a=a.entanglements;r;){var c=31-rn(r),h=1<<c;h&o|a[c]&o&&(a[c]|=o),r&=~h}}function pm(a,o){var r=o&-o;return r=(r&42)!==0?1:Zd(r),(r&(a.suspendedLanes|o))!==0?0:r}function Zd(a){switch(a){case 2:a=1;break;case 8:a=4;break;case 32:a=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:a=128;break;case 268435456:a=134217728;break;default:a=0}return a}function Qd(a){return a&=-a,2<a?8<a?(a&134217727)!==0?32:268435456:8:2}function mm(){var a=K.p;return a!==0?a:(a=window.event,a===void 0?32:ev(a.type))}function gm(a,o){var r=K.p;try{return K.p=a,o()}finally{K.p=r}}var Ma=Math.random().toString(36).slice(2),Pt="__reactFiber$"+Ma,Yt="__reactProps$"+Ma,gi="__reactContainer$"+Ma,Xd="__reactEvents$"+Ma,Z0="__reactListeners$"+Ma,Q0="__reactHandles$"+Ma,ym="__reactResources$"+Ma,Ns="__reactMarker$"+Ma;function Jd(a){delete a[Pt],delete a[Yt],delete a[Xd],delete a[Z0],delete a[Q0]}function yi(a){var o=a[Pt];if(o)return o;for(var r=a.parentNode;r;){if(o=r[gi]||r[Pt]){if(r=o.alternate,o.child!==null||r!==null&&r.child!==null)for(a=jb(a);a!==null;){if(r=a[Pt])return r;a=jb(a)}return o}a=r,r=a.parentNode}return null}function bi(a){if(a=a[Pt]||a[gi]){var o=a.tag;if(o===5||o===6||o===13||o===31||o===26||o===27||o===3)return a}return null}function Us(a){var o=a.tag;if(o===5||o===26||o===27||o===6)return a.stateNode;throw Error(i(33))}function vi(a){var o=a[ym];return o||(o=a[ym]={hoistableStyles:new Map,hoistableScripts:new Map}),o}function Tt(a){a[Ns]=!0}var bm=new Set,vm={};function Oo(a,o){wi(a,o),wi(a+"Capture",o)}function wi(a,o){for(vm[a]=o,a=0;a<o.length;a++)bm.add(o[a])}var X0=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),wm={},xm={};function J0(a){return Ro.call(xm,a)?!0:Ro.call(wm,a)?!1:X0.test(a)?xm[a]=!0:(wm[a]=!0,!1)}function bl(a,o,r){if(J0(o))if(r===null)a.removeAttribute(o);else{switch(typeof r){case"undefined":case"function":case"symbol":a.removeAttribute(o);return;case"boolean":var c=o.toLowerCase().slice(0,5);if(c!=="data-"&&c!=="aria-"){a.removeAttribute(o);return}}a.setAttribute(o,""+r)}}function vl(a,o,r){if(r===null)a.removeAttribute(o);else{switch(typeof r){case"undefined":case"function":case"symbol":case"boolean":a.removeAttribute(o);return}a.setAttribute(o,""+r)}}function ta(a,o,r,c){if(c===null)a.removeAttribute(r);else{switch(typeof c){case"undefined":case"function":case"symbol":case"boolean":a.removeAttribute(r);return}a.setAttributeNS(o,r,""+c)}}function bn(a){switch(typeof a){case"bigint":case"boolean":case"number":case"string":case"undefined":return a;case"object":return a;default:return""}}function km(a){var o=a.type;return(a=a.nodeName)&&a.toLowerCase()==="input"&&(o==="checkbox"||o==="radio")}function e_(a,o,r){var c=Object.getOwnPropertyDescriptor(a.constructor.prototype,o);if(!a.hasOwnProperty(o)&&typeof c<"u"&&typeof c.get=="function"&&typeof c.set=="function"){var h=c.get,m=c.set;return Object.defineProperty(a,o,{configurable:!0,get:function(){return h.call(this)},set:function(b){r=""+b,m.call(this,b)}}),Object.defineProperty(a,o,{enumerable:c.enumerable}),{getValue:function(){return r},setValue:function(b){r=""+b},stopTracking:function(){a._valueTracker=null,delete a[o]}}}}function eu(a){if(!a._valueTracker){var o=km(a)?"checked":"value";a._valueTracker=e_(a,o,""+a[o])}}function Sm(a){if(!a)return!1;var o=a._valueTracker;if(!o)return!0;var r=o.getValue(),c="";return a&&(c=km(a)?a.checked?"true":"false":a.value),a=c,a!==r?(o.setValue(a),!0):!1}function wl(a){if(a=a||(typeof document<"u"?document:void 0),typeof a>"u")return null;try{return a.activeElement||a.body}catch{return a.body}}var t_=/[\n"\\]/g;function vn(a){return a.replace(t_,function(o){return"\\"+o.charCodeAt(0).toString(16)+" "})}function tu(a,o,r,c,h,m,b,_){a.name="",b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"?a.type=b:a.removeAttribute("type"),o!=null?b==="number"?(o===0&&a.value===""||a.value!=o)&&(a.value=""+bn(o)):a.value!==""+bn(o)&&(a.value=""+bn(o)):b!=="submit"&&b!=="reset"||a.removeAttribute("value"),o!=null?nu(a,b,bn(o)):r!=null?nu(a,b,bn(r)):c!=null&&a.removeAttribute("value"),h==null&&m!=null&&(a.defaultChecked=!!m),h!=null&&(a.checked=h&&typeof h!="function"&&typeof h!="symbol"),_!=null&&typeof _!="function"&&typeof _!="symbol"&&typeof _!="boolean"?a.name=""+bn(_):a.removeAttribute("name")}function _m(a,o,r,c,h,m,b,_){if(m!=null&&typeof m!="function"&&typeof m!="symbol"&&typeof m!="boolean"&&(a.type=m),o!=null||r!=null){if(!(m!=="submit"&&m!=="reset"||o!=null)){eu(a);return}r=r!=null?""+bn(r):"",o=o!=null?""+bn(o):r,_||o===a.value||(a.value=o),a.defaultValue=o}c=c??h,c=typeof c!="function"&&typeof c!="symbol"&&!!c,a.checked=_?a.checked:!!c,a.defaultChecked=!!c,b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"&&(a.name=b),eu(a)}function nu(a,o,r){o==="number"&&wl(a.ownerDocument)===a||a.defaultValue===""+r||(a.defaultValue=""+r)}function xi(a,o,r,c){if(a=a.options,o){o={};for(var h=0;h<r.length;h++)o["$"+r[h]]=!0;for(r=0;r<a.length;r++)h=o.hasOwnProperty("$"+a[r].value),a[r].selected!==h&&(a[r].selected=h),h&&c&&(a[r].defaultSelected=!0)}else{for(r=""+bn(r),o=null,h=0;h<a.length;h++){if(a[h].value===r){a[h].selected=!0,c&&(a[h].defaultSelected=!0);return}o!==null||a[h].disabled||(o=a[h])}o!==null&&(o.selected=!0)}}
vendor: 4,574 bytes, line 9
9function Cm(a,o,r){if(o!=null&&(o=""+bn(o),o!==a.value&&(a.value=o),r==null)){a.defaultValue!==o&&(a.defaultValue=o);return}a.defaultValue=r!=null?""+bn(r):""}function Am(a,o,r,c){if(o==null){if(c!=null){if(r!=null)throw Error(i(92));if(qe(c)){if(1<c.length)throw Error(i(93));c=c[0]}r=c}r==null&&(r=""),o=r}r=bn(o),a.defaultValue=r,c=a.textContent,c===r&&c!==""&&c!==null&&(a.value=c),eu(a)}function ki(a,o){if(o){var r=a.firstChild;if(r&&r===a.lastChild&&r.nodeType===3){r.nodeValue=o;return}}a.textContent=o}var n_=new Set("animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(" "));function Tm(a,o,r){var c=o.indexOf("--")===0;r==null||typeof r=="boolean"||r===""?c?a.setProperty(o,""):o==="float"?a.cssFloat="":a[o]="":c?a.setProperty(o,r):typeof r!="number"||r===0||n_.has(o)?o==="float"?a.cssFloat=r:a[o]=(""+r).trim():a[o]=r+"px"}function Rm(a,o,r){if(o!=null&&typeof o!="object")throw Error(i(62));if(a=a.style,r!=null){for(var c in r)!r.hasOwnProperty(c)||o!=null&&o.hasOwnProperty(c)||(c.indexOf("--")===0?a.setProperty(c,""):c==="float"?a.cssFloat="":a[c]="");for(var h in o)c=o[h],o.hasOwnProperty(h)&&r[h]!==c&&Tm(a,h,c)}else for(var m in o)o.hasOwnProperty(m)&&Tm(a,m,o[m])}function au(a){if(a.indexOf("-")===-1)return!1;switch(a){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var a_=new Map([["acceptCharset","accept-charset"],["htmlFor","for"],["httpEquiv","http-equiv"],["crossOrigin","crossorigin"],["accentHeight","accent-height"],["alignmentBaseline","alignment-baseline"],["arabicForm","arabic-form"],["baselineShift","baseline-shift"],["capHeight","cap-height"],["clipPath","clip-path"],["clipRule","clip-rule"],["colorInterpolation","color-interpolation"],["colorInterpolationFilters","color-interpolation-filters"],["colorProfile","color-profile"],["colorRendering","color-rendering"],["dominantBaseline","dominant-baseline"],["enableBackground","enable-background"],["fillOpacity","fill-opacity"],["fillRule","fill-rule"],["floodColor","flood-color"],["floodOpacity","flood-opacity"],["fontFamily","font-family"],["fontSize","font-size"],["fontSizeAdjust","font-size-adjust"],["fontStretch","font-stretch"],["fontStyle","font-style"],["fontVariant","font-variant"],["fontWeight","font-weight"],["glyphName","glyph-name"],["glyphOrientationHorizontal","glyph-orientation-horizontal"],["glyphOrientationVertical","glyph-orientation-vertical"],["horizAdvX","horiz-adv-x"],["horizOriginX","horiz-origin-x"],["imageRendering","image-rendering"],["letterSpacing","letter-spacing"],["lightingColor","lighting-color"],["markerEnd","marker-end"],["markerMid","marker-mid"],["markerStart","marker-start"],["overlinePosition","overline-position"],["overlineThickness","overline-thickness"],["paintOrder","paint-order"],["panose-1","panose-1"],["pointerEvents","pointer-events"],["renderingIntent","rendering-intent"],["shapeRendering","shape-rendering"],["stopColor","stop-color"],["stopOpacity","stop-opacity"],["strikethroughPosition","strikethrough-position"],["strikethroughThickness","strikethrough-thickness"],["strokeDasharray","stroke-dasharray"],["strokeDashoffset","stroke-dashoffset"],["strokeLinecap","stroke-linecap"],["strokeLinejoin","stroke-linejoin"],["strokeMiterlimit","stroke-miterlimit"],["strokeOpacity","stroke-opacity"],["strokeWidth","stroke-width"],["textAnchor","text-anchor"],["textDecoration","text-decoration"],["textRendering","text-rendering"],["transformOrigin","transform-origin"],["underlinePosition","underline-position"],["underlineThickness","underline-thickness"],["unicodeBidi","unicode
9-bidi"],["unicodeRange","unicode-range"],["unitsPerEm","units-per-em"],["vAlphabetic","v-alphabetic"],["vHanging","v-hanging"],["vIdeographic","v-ideographic"],["vMathematical","v-mathematical"],["vectorEffect","vector-effect"],["vertAdvY","vert-adv-y"],["vertOriginX","vert-origin-x"],["vertOriginY","vert-origin-y"],["wordSpacing","word-spacing"],["writingMode","writing-mode"],["xmlnsXlink","xmlns:xlink"],["xHeight","x-height"]]),o_=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i;function xl(a){return o_.test(""+a)?"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')":a}function na(){}var ou=null;function iu(a){return a=a.target||a.srcElement||window,a.correspondingUseElement&&(a=a.correspondingUseElement),a.nodeType===3?a.parentNode:a}var Si=null,_i=null;function Em(a){var o=bi(a);if(o&&(a=o.stateNode)){var r=a[Yt]||null;e:switch(a=o.stateNode,o.type){case"input":if(tu(a,r.value,r.defaultValue,r.defaultValue,r.checked,r.defaultChecked,r.type,r.name),o=r.name,r.type==="radio"&&o!=null){for(r=a;r.parentNode;)r=r.parentNode;for(r=r.querySelectorAll('input[name="'+vn(""+o)+'"][type="radio"]'),o=0;o<r.length;o++){var c=r[o];if(c!==a&&c.form===a.form){var h=c[Yt]||null;if(!h)throw Error(i(90));tu(c,h.value,h.defaultValue,h.defaultValue,h.checked,h.defaultChecked,h.type,h.name)}}for(o=0;o<r.length;o++)c=r[o],c.form===a.form&&Sm(c)}break e;case"textarea":Cm(a,r.value,r.defaultValue);break e;case"select":o=r.value,o!=null&&xi(a,!!r.multiple,o,!1)}}}var su=!1;function Om(a,o,r){if(su)return a(o,r);su=!0;try{var c=a(o);return c}finally{if(su=!1,(Si!==null||_i!==null)&&(lc(),Si&&(o=Si,a=_i,_i=Si=null,Em(o),a)))for(o=0;o<a.length;o++)Em(a[o])}}function js(a,o){var r=a.stateNode;if(r===null)return null;var c=r[Yt]||null;if(c===null)return null;r=c[o];e:switch(o){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(c=!c.disabled)||(a=a.type,c=!(a==="button"||a==="input"||a==="select"||a==="textarea")),a=!c;break e;default:a=!1}if(a)return null;if(r&&typeof r!="function")throw Error(i(231,o,typeof r));return r}var aa=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ru=!1;if(aa)try{var Fs={};Object.defineProperty(Fs,"passive",{get:function(){ru=!0}}),window.addEventListener("test",Fs,Fs),window.removeEventListener("test",Fs,Fs)}catch{ru=!1}var Pa=null,lu=null,kl=null;function Im(){if(kl)return kl;var a,o=lu,r=o.length,c,h="value"in Pa?Pa.value:Pa.textContent,m=h.length;for(a=0;a<r&&o[a]===h[a];a++);var b=r-a;for(c=1;c<=b&&o[r-c]===h[m-c];c++);return kl=h.slice(a,1<c?1-c:void 0)}function Sl(a){var o=a.keyCode;return"charCode"in a?(a=a.charCode,a===0&&o===13&&(a=13)):a=o,a===10&&(a=13),32<=a||a===13?a:0}function _l(){return!0}function Mm(){return!1}function Kt(a){function o(r,c,h,m,b){this._reactName=r,this._targetInst=h,this.type=c,this.nativeEvent=m,this.target=b,this.currentTarget=null;for(var _ in a)a.hasOwnProperty(_)&&(r=a[_],this[_]=r?r(m):m[_]);return this.isDefaultPrevented=(m.defaultPrevented!=null?m.defaultPrevented:m.returnValue===!1)?_l:Mm,this.isPropagationStopped=Mm,this}return g(o.prototype,{preventDefault:function(){this.defaultPrevented=!0;var r=this.nativeEvent;r&&(r.preventDefault?r.preventDefault():typeof r.returnValue!="unknown"&&(r.returnValue=!1),this.isDefaultPrevented=_l)},stopPropagation:function(){var r=this.nativeEvent;r&&(r.stopPropagation?r.stopPropagation():typeof r.cancelBubble!="unknown"&&(r.cancelBubble=!0),this.isPropagationStopped=_l)},persist:function(){},isPersistent:_l}),o}var Io={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Cl=Kt(Io),qs=g({},Io,{view:0,detail:0}),i_=Kt(qs),cu,du,Bs,Al=g({},qs,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:hu,button:0,buttons:0,relatedTarget:function(a){return a.relatedTarget===void 0?a.fromElement===a.srcElement?a.toElement:a.fromElement:a.relatedTarget},movementX:function(a){return"movementX"in a?a.movementX:(a!==Bs&&(Bs&&a.type==="mousemove"?(cu=a.screenX-Bs.screenX,du=a.screenY-Bs.screenY):du=cu=0,Bs=a),cu)},movementY:function(a){return"movementY"in a?a.movementY:du}}),Pm=Kt(Al),s_=g({},Al,{dataTransfer:0}),r_=Kt(s_),l_=g({},qs,{relatedTarget:0}),uu=Kt(l_),c_=g({},Io,{animationName:0,elapsedTime:0,pseudoElement:0}),d_=Kt(c_),u_=g({},Io,{clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),h_=Kt(u_),f_=g({},Io,{data:0}),Dm=Kt(f_),p_={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},m_={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},g_={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function y_(a){var o=this.nativeEvent;return o.getModifierState?o.getModifierState(a):(a=g_[a])?!!o[a]:!1}function hu(){return y_}var b_=g({}
vendor: 5,271 bytes, line 9
9,qs,{key:function(a){if(a.key){var o=p_[a.key]||a.key;if(o!=="Unidentified")return o}return a.type==="keypress"?(a=Sl(a),a===13?"Enter":String.fromCharCode(a)):a.type==="keydown"||a.type==="keyup"?m_[a.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:hu,charCode:function(a){return a.type==="keypress"?Sl(a):0},keyCode:function(a){return a.type==="keydown"||a.type==="keyup"?a.keyCode:0},which:function(a){return a.type==="keypress"?Sl(a):a.type==="keydown"||a.type==="keyup"?a.keyCode:0}}),v_=Kt(b_),w_=g({},Al,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Lm=Kt(w_),x_=g({},qs,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:hu}),k_=Kt(x_),S_=g({},Io,{propertyName:0,elapsedTime:0,pseudoElement:0}),__=Kt(S_),C_=g({},Al,{deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in a?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?-a.wheelDelta:0},deltaZ:0,deltaMode:0}),A_=Kt(C_),T_=g({},Io,{newState:0,oldState:0}),R_=Kt(T_),E_=[9,13,27,32],fu=aa&&"CompositionEvent"in window,zs=null;aa&&"documentMode"in document&&(zs=document.documentMode);var O_=aa&&"TextEvent"in window&&!zs,Nm=aa&&(!fu||zs&&8<zs&&11>=zs),Um=" ",jm=!1;function Fm(a,o){switch(a){case"keyup":return E_.indexOf(o.keyCode)!==-1;case"keydown":return o.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function qm(a){return a=a.detail,typeof a=="object"&&"data"in a?a.data:null}var Ci=!1;function I_(a,o){switch(a){case"compositionend":return qm(o);case"keypress":return o.which!==32?null:(jm=!0,Um);case"textInput":return a=o.data,a===Um&&jm?null:a;default:return null}}function M_(a,o){if(Ci)return a==="compositionend"||!fu&&Fm(a,o)?(a=Im(),kl=lu=Pa=null,Ci=!1,a):null;switch(a){case"paste":return null;case"keypress":if(!(o.ctrlKey||o.altKey||o.metaKey)||o.ctrlKey&&o.altKey){if(o.char&&1<o.char.length)return o.char;if(o.which)return String.fromCharCode(o.which)}return null;case"compositionend":return Nm&&o.locale!=="ko"?null:o.data;default:return null}}var P_={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Bm(a){var o=a&&a.nodeName&&a.nodeName.toLowerCase();return o==="input"?!!P_[a.type]:o==="textarea"}function zm(a,o,r,c){Si?_i?_i.push(c):_i=[c]:Si=c,o=mc(o,"onChange"),0<o.length&&(r=new Cl("onChange","change",null,r,c),a.push({event:r,listeners:o}))}var Hs=null,Gs=null;function D_(a){_b(a,0)}function Tl(a){var o=Us(a);if(Sm(o))return a}function Hm(a,o){if(a==="change")return o}var Gm=!1;if(aa){var pu;if(aa){var mu="oninput"in document;if(!mu){var Wm=document.createElement("div");Wm.setAttribute("oninput","return;"),mu=typeof Wm.oninput=="function"}pu=mu}else pu=!1;Gm=pu&&(!document.documentMode||9<document.documentMode)}function $m(){Hs&&(Hs.detachEvent("onpropertychange",Vm),Gs=Hs=null)}function Vm(a){if(a.propertyName==="value"&&Tl(Gs)){var o=[];zm(o,Gs,a,iu(a)),Om(D_,o)}}function L_(a,o,r){a==="focusin"?($m(),Hs=o,Gs=r,Hs.attachEvent("onpropertychange",Vm)):a==="focusout"&&$m()}function N_(a){if(a==="selectionchange"||a==="keyup"||a==="keydown")return Tl(Gs)}function U_(a,o){if(a==="click")return Tl(o)}function j_(a,o){if(a==="input"||a==="change")return Tl(o)}function F_(a,o){return a===o&&(a!==0||1/a===1/o)||a!==a&&o!==o}var ln=typeof Object.is=="function"?Object.is:F_;function Ws(a,o){if(ln(a,o))return!0;if(typeof a!="object"||a===null||typeof o!="object"||o===null)return!1;var r=Object.keys(a),c=Object.keys(o);if(r.length!==c.length)return!1;for(c=0;c<r.length;c++){var h=r[c];if(!Ro.call(o,h)||!ln(a[h],o[h]))return!1}return!0}function Ym(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function Km(a,o){var r=Ym(a);a=0;for(var c;r;){if(r.nodeType===3){if(c=a+r.textContent.length,a<=o&&c>=o)return{node:r,offset:o-a};a=c}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Ym(r)}}function Zm(a,o){return a&&o?a===o?!0:a&&a.nodeType===3?!1:o&&o.nodeType===3?Zm(a,o.parentNode):"contains"in a?a.contains(o):a.compareDocumentPosition?!!(a.compareDocumentPosition(o)&16):!1:!1}function Qm(a){a=a!=null&&a.ownerDocument!=null&&a.ownerDocument.defaultView!=null?a.ownerDocument.defaultView:window;for(var o=wl(a.document);o instanceof a.HTMLIFrameElement;){try{var r=typeof o.contentWindow.location.href=="string"}catch{r=!1}if(r)a=o.contentWindow;else break;o=wl(a.document)}return o}function gu(a){var o=a&&a.nodeName&&a.nodeName.toLowerCase();return o&&(o==="input"&&(a.type==="text"||a.type==="search"||a.type==="tel"||a.type==="url"||a.type==="password")||o==="textarea"||a.contentEditable==="true")}var q_=aa&&"documentMode"in document&&11>=document.documentMode,Ai=null,yu=null,$s=null,bu=!1;function Xm(a,o,r){var c=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;bu||Ai==null||Ai!==wl(c)||(c=Ai,"selectionStart"in c&&gu(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focu
vendor: 18,103 bytes, line 9
9sNode:c.focusNode,focusOffset:c.focusOffset}),$s&&Ws($s,c)||($s=c,c=mc(yu,"onSelect"),0<c.length&&(o=new Cl("onSelect","select",null,o,r),a.push({event:o,listeners:c}),o.target=Ai)))}function Mo(a,o){var r={};return r[a.toLowerCase()]=o.toLowerCase(),r["Webkit"+a]="webkit"+o,r["Moz"+a]="moz"+o,r}var Ti={animationend:Mo("Animation","AnimationEnd"),animationiteration:Mo("Animation","AnimationIteration"),animationstart:Mo("Animation","AnimationStart"),transitionrun:Mo("Transition","TransitionRun"),transitionstart:Mo("Transition","TransitionStart"),transitioncancel:Mo("Transition","TransitionCancel"),transitionend:Mo("Transition","TransitionEnd")},vu={},Jm={};aa&&(Jm=document.createElement("div").style,"AnimationEvent"in window||(delete Ti.animationend.animation,delete Ti.animationiteration.animation,delete Ti.animationstart.animation),"TransitionEvent"in window||delete Ti.transitionend.transition);function Po(a){if(vu[a])return vu[a];if(!Ti[a])return a;var o=Ti[a],r;for(r in o)if(o.hasOwnProperty(r)&&r in Jm)return vu[a]=o[r];return a}var eg=Po("animationend"),tg=Po("animationiteration"),ng=Po("animationstart"),B_=Po("transitionrun"),z_=Po("transitionstart"),H_=Po("transitioncancel"),ag=Po("transitionend"),og=new Map,wu="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");wu.push("scrollEnd");function In(a,o){og.set(a,o),Oo(o,[a])}var Rl=typeof reportError=="function"?reportError:function(a){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var o=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof a=="object"&&a!==null&&typeof a.message=="string"?String(a.message):String(a),error:a});if(!window.dispatchEvent(o))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",a);return}console.error(a)},wn=[],Ri=0,xu=0;function El(){for(var a=Ri,o=xu=Ri=0;o<a;){var r=wn[o];wn[o++]=null;var c=wn[o];wn[o++]=null;var h=wn[o];wn[o++]=null;var m=wn[o];if(wn[o++]=null,c!==null&&h!==null){var b=c.pending;b===null?h.next=h:(h.next=b.next,b.next=h),c.pending=h}m!==0&&ig(r,h,m)}}function Ol(a,o,r,c){wn[Ri++]=a,wn[Ri++]=o,wn[Ri++]=r,wn[Ri++]=c,xu|=c,a.lanes|=c,a=a.alternate,a!==null&&(a.lanes|=c)}function ku(a,o,r,c){return Ol(a,o,r,c),Il(a)}function Do(a,o){return Ol(a,null,null,o),Il(a)}function ig(a,o,r){a.lanes|=r;var c=a.alternate;c!==null&&(c.lanes|=r);for(var h=!1,m=a.return;m!==null;)m.childLanes|=r,c=m.alternate,c!==null&&(c.childLanes|=r),m.tag===22&&(a=m.stateNode,a===null||a._visibility&1||(h=!0)),a=m,m=m.return;return a.tag===3?(m=a.stateNode,h&&o!==null&&(h=31-rn(r),a=m.hiddenUpdates,c=a[h],c===null?a[h]=[o]:c.push(o),o.lane=r|536870912),m):null}function Il(a){if(50<pr)throw pr=0,Ih=null,Error(i(185));for(var o=a.return;o!==null;)a=o,o=a.return;return a.tag===3?a.stateNode:null}var Ei={};function G_(a,o,r,c){this.tag=a,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.refCleanup=this.ref=null,this.pendingProps=o,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=c,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function cn(a,o,r,c){return new G_(a,o,r,c)}function Su(a){return a=a.prototype,!(!a||!a.isReactComponent)}function oa(a,o){var r=a.alternate;return r===null?(r=cn(a.tag,o,a.key,a.mode),r.elementType=a.elementType,r.type=a.type,r.stateNode=a.stateNode,r.alternate=a,a.alternate=r):(r.pendingProps=o,r.type=a.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=a.flags&65011712,r.childLanes=a.childLanes,r.lanes=a.lanes,r.child=a.child,r.memoizedProps=a.memoizedProps,r.memoizedState=a.memoizedState,r.updateQueue=a.updateQueue,o=a.dependencies,r.dependencies=o===null?null:{lanes:o.lanes,firstContext:o.firstContext},r.sibling=a.sibling,r.index=a.index,r.ref=a.ref,r.refCleanup=a.refCleanup,r}function sg(a,o){a.flags&=65011714;var r=a.alternate;return r===null?(a.childLanes=0,a.lanes=o,a.child=null,a.subtreeFlags=0,a.memoizedProps=null,a.memoizedState=null,a.updateQueue=null,a.dependencies=null,a.stateNode=null):(a.childLanes=r.childLanes,a.lanes=r.lanes,a.child=r.child,a.subtreeFlags=0,a.deletions=null,a.memoizedProps=r.memoizedProps,a.memoizedState=r.memoizedState,a.updateQueue=r.updateQueue,a.type=r.type,o=r.dependencies,a.dependencies=o===null?null:{lanes:o.lanes,firstContext:o.firstContext}),a}function Ml(a,o,r,c,h,m){var b=0;if(c=a,typeof a=="function")Su(a)&&(b=1);else if(typeof a=="string")b=KC(a,r,ee.current)?26:a==="html"||a==="head"||a==="body"?27:5;else e:switch(a){case W:return a=cn(31,r,o,h),a.elementType=W,a.lanes=m,a;case k:return Lo(r.children,h,m,o);case S:b=8,h|=24;break;case C:return a=cn(12,r,o,h|2),a.elementType=C,a.lanes=m,a;case G:return a=cn(13,r,o,h),a.elementType=G,a.lanes=m,a;case z:return a=cn(19,r,o,h),a.elementType=z,a.lanes=m,a;default:if(typeof a=="object"&&a!==null)switch(a.$$typeof){case R:b=10;break e;case E:b=9;break e;case D:b=11;break e;case N:b=14;break e;case P:b=16,c=null;break e}b=29,r=Error(i(130,a===null?"null":typeof a,"")),c=null}return o=cn(b,r,o,h),o.elementType=a,o.type=c,o.lanes=m,o}function Lo(a,o,r,c){return a=cn(7,a,c,o),a.lanes=r,a}function _u(a,o,r){return a=cn(6,a,null,o),a.lanes=r,a}function rg(a){var o=cn(18,null,null,0);return o.stateNode=a,o}function Cu(a,o,r){return o=cn(4,a.children!==null?a.children:[],a.key,o),o.lanes=r,o.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation},o}var lg=new WeakMap;function xn(a,o){if(typeof a=="object"&&a!==null){var r=lg.get(a);return r!==void 0?r:(o={value:a,source:o,stack:ea(o)},lg.set(a,o),o)}return{value:a,source:o,stack:ea(o)}}var Oi=[],Ii=0,Pl=null,Vs=0,kn=[],Sn=0,Da=null,qn=1,Bn="";function ia(a,o){Oi[Ii++]=Vs,Oi[Ii++]=Pl,Pl=a,Vs=o}function cg(a,o,r){kn[Sn++]=qn,kn[Sn++]=Bn,kn[Sn++]=Da,Da=a;var c=qn;a=Bn;var h=32-rn(c)-1;c&=~(1<<h),r+=1;var m=32-rn(o)+h;if(30<m){var b=h-h%5;m=(c&(1<<b)-1).toString(32),c>>=b,h-=b,qn=1<<32-rn(o)+h|r<<h|c,Bn=m+a}else qn=1<<m|r<<h|c,Bn=a}function Au(a){a.return!==null&&(ia(a,1),cg(a,1,0))}function Tu(a){for(;a===Pl;)Pl=Oi[--Ii],Oi[Ii]=null,Vs=Oi[--Ii],Oi[Ii]=null;for(;a===Da;)Da=kn[--Sn],kn[Sn]=null,Bn=kn[--Sn],kn[Sn]=null,qn=kn[--Sn],kn[Sn]=null}function dg(a,o){kn[Sn++]=qn,kn[Sn++]=Bn,kn[Sn++]=Da,qn=o.id,Bn=o.overflow,Da=a}var Dt=null,nt=null,Ne=!1,La=null,_n=!1,Ru=Error(i(519));function Na(a){var o=Error(i(418,1<arguments.length&&arguments[1]!==void 0&&arguments[1]?"text":"HTML",""));throw Ys(xn(o,a)),Ru}function ug(a){var o=a.stateNode,r=a.type,c=a.memoizedProps;switch(o[Pt]=a,o[Yt]=c,r){case"dialog":Ie("cancel",o),Ie("close",o);break;case"iframe":case"object":case"embed":Ie("load",o);break;case"video":case"audio":for(r=0;r<gr.length;r++)Ie(gr[r],o);break;case"source":Ie("error",o);break;case"img":case"image":case"link":Ie("error",o),Ie("load",o);break;case"details":Ie("toggle",o);break;case"input":Ie("invalid",o),_m(o,c.value,c.defaultValue,c.checked,c.defaultChecked,c.type,c.name,!0);break;case"select":Ie("invalid",o);break;case"textarea":Ie("invalid",o),Am(o,c.value,c.defaultValue,c.children)}r=c.children,typeof r!="string"&&typeof r!="number"&&typeof r!="bigint"||o.textContent===""+r||c.suppressHydrationWarning===!0||Rb(o.textContent,r)?(c.popover!=null&&(Ie("beforetoggle",o),Ie("toggle",o)),c.onScroll!=null&&Ie("scroll",o),c.onScrollEnd!=null&&Ie("scrollend",o),c.onClick!=null&&(o.onclick=na),o=!0):o=!1,o||Na(a,!0)}function hg(a){for(Dt=a.return;Dt;)switch(Dt.tag){case 5:case 31:case 13:_n=!1;return;case 27:case 3:_n=!0;return;default:Dt=Dt.return}}function Mi(a){if(a!==Dt)return!1;if(!Ne)return hg(a),Ne=!0,!1;var o=a.tag,r;if((r=o!==3&&o!==27)&&((r=o===5)&&(r=a.type,r=!(r!=="form"&&r!=="button")||$h(a.type,a.memoizedProps)),r=!r),r&&nt&&Na(a),hg(a),o===13){if(a=a.memoizedState,a=a!==null?a.dehydrated:null,!a)throw Error(i(317));nt=Ub(a)}else if(o===31){if(a=a.memoizedState,a=a!==null?a.dehydrated:null,!a)throw Error(i(317));nt=Ub(a)}else o===27?(o=nt,Za(a.type)?(a=Qh,Qh=null,nt=a):nt=o):nt=Dt?An(a.stateNode.nextSibling):null;return!0}function No(){nt=Dt=null,Ne=!1}function Eu(){var a=La;return a!==null&&(Jt===null?Jt=a:Jt.push.apply(Jt,a),La=null),a}function Ys(a){La===null?La=[a]:La.push(a)}var Ou=O(null),Uo=null,sa=null;function Ua(a,o,r){Q(Ou,o._currentValue),o._currentValue=r}function ra(a){a._currentValue=Ou.current,V(Ou)}function Iu(a,o,r){for(;a!==null;){var c=a.alternate;if((a.childLanes&o)!==o?(a.childLanes|=o,c!==null&&(c.childLanes|=o)):c!==null&&(c.childLanes&o)!==o&&(c.childLanes|=o),a===r)break;a=a.return}}function Mu(a,o,r,c){var h=a.child;for(h!==null&&(h.return=a);h!==null;){var m=h.dependencies;if(m!==null){var b=h.child;m=m.firstContext;e:for(;m!==null;){var _=m;m=h;for(var T=0;T<o.length;T++)if(_.context===o[T]){m.lanes|=r,_=m.alternate,_!==null&&(_.lanes|=r),Iu(m.return,r,a),c||(b=null);break e}m=_.next}}else if(h.tag===18){if(b=h.return,b===null)throw Error(i(341));b.lanes|=r,m=b.alternate,m!==null&&(m.lanes|=r),Iu(b,r,a),b=null}else b=h.child;if(b!==null)b.return=h;else for(b=h;b!==null;){if(b===a){b=null;break}if(h=b.sibling,h!==null){h.return=b.return,b=h;break}b=b.return}h=b}}function Pi(a,o,r,c){a=null;for(var h=o,m=!1;h!==null;){if(!m){if((h.flags&524288)!==0)m=!0;else if((h.flags&262144)!==0)break}if(h.tag===10){var b=h.alternate;if(b===null)throw Error(i(387));if(b=b.memoizedProps,b!==null){var _=h.type;ln(h.pendingProps.value,b.value)||(a!==null?a.push(_):a=[_])}}else if(h===Re.current){if(b=h.alternate,b===null)throw Error(i(387));b.memoizedState.memoizedState!==h.memoizedState.memoizedState&&(a!==null?a.push(xr):a=[xr])}h=h.return}a!==null&&Mu(o,a,r,c),o.flags|=262144}function Dl(a){for(a=a.firstContext;a!==null;){if(!ln(a.context._currentValue,a.memoizedValue))return!0;a=a.next}return!1}function jo(a){Uo=a,sa=null,a=a.dependencies,a!==null&&(a.firstContext=null)}function Lt(a){return fg(Uo,a)}function Ll(a,o){return Uo===null&&jo(a),fg(a,o)}function fg(a,o){var r=o._currentValue;if(o={context:o,memoizedValue:r,next:null},sa===null){if(a===null)throw Error(i(308));sa=o,a.dependencies={lanes:0,firstContext:o},a.flags|=524288}else sa=sa.next=o;return r}var W_=typeof AbortController<"u"?AbortController:function(){var a=[],o=this.signal={aborted:!1,addEventListener:function(r,c){a.push(c)}};this.abort=function(){o.aborted=!0,a.forEach(function(r){return r()})}},$_=t.unstable_scheduleCallback,V_=t.unstable_NormalPriority,ft={$$typeof:R,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function Pu(){return{controller:new W_,data:new Map,refCount:0}}function Ks(a){a.refCount--,a.refCount===0&&$_(V_,function(){a.controller.abort()})}var Zs=null,Du=0,Di=0,Li=null;function Y_(a,o){if(Zs===null){var r=Zs=[];Du=0,Di=Uh(),Li={status:"pending",value:void 0,then:function(c){r.push(c)}}}return Du++,o.then(pg,pg),o}function pg(){if(--Du===0&&Zs!==null){Li!==null&&(Li.status="fulfilled");var a=Zs;Zs=null,Di=0,Li=null;for(var o=0;o<a.length;o++)(0,a[o])()}}function K_(a,o){var r=[],c={status:"pending",value:null,reason:null,then:function(h){r.push(h)}};return a.then(function(){c.status="fulfilled",c.value=o;for(var h=0;h<r.length;h++)(0,r[h])(o)},function(h){for(c.status="rejected",c.reason=h,h=0;h<r.length;h++)(0,r[h])(void 0)}),c}var mg=q.S;q.S=function(a,o){Xy=Ft(),typeof o=="object"&&o!==null&&typeof o.then=="function"&&Y_(a,o),mg!==null&&mg(a,o)};var Fo=O(null);function Lu(){var a=Fo.current;return a!==null?a:Ze.pooledCache}function Nl(a,o){o===null?Q(Fo,Fo.current):Q(Fo,o.pool)}function gg(){var a=Lu();return a===null?null:{parent:ft._currentValue,pool:a}}var Ni=Error(i(460)),Nu=Error(i(474)),Ul=Error(i(542)),jl={then:function(){}};function yg(a){return a=a.status,a==="fulfilled"||a==="rejected"}function bg(a,o,r){switch(r=a[r],r===void 0?a.push(o):r!==o&&(o.then(na,na),o=r),o.status){case"fulfilled":return o.value;case"rejected":throw a=o.reason,wg(a),a;default:if(typeof o.status=="string")o.then(na,na);else{if(a=Ze,a!==null&&100<a.shellSuspendCounter)throw Error(i(482));a=o,a.status="pending",a.then(function(c){if(o.status==="pending"){var h=o;h.status="fulfilled",h.value=c}},function(c){if(o.status==="pending"){var h=o;h.status="rejected",h.reason=c}})}switch(o.status){case"fulfilled":return o.value;case"rejected":throw a=o.reason,wg(a),a}throw Bo=o,Ni}}function qo(a){try{var o=a._init;return o(a._payload)}catch(r){throw r!==null&&typeof r=="object"&&typeof r.then=="function"?(Bo=r,Ni):r}}var Bo=null;function vg(){if(Bo===null)throw Error(i(459));var a=Bo;return Bo=null,a}function wg(a){if(a===Ni||a===Ul)throw Error(i(483))}var Ui=null,Qs=0;function Fl(a){var o=Qs;return Qs+=1,Ui===null&&(Ui=[]),bg(Ui,a,o)}function Xs(a,o){o=o.props.ref,a.ref=o!==void 0?o:null}function ql(a,o){throw o.$$typeof===v?Error(i(525)):(a=Object.prototype.toString.call(o),Error(i(31,a==="[object Object]"?"object with keys {"+Object.keys(o).join(", ")+"}":a)))}function xg(a){function o(L,I){if(a){var U=L.deletions;U===null?(L.deletions=[I],L.flags|=16):U.push(I)}}function r(L,I){if(!a)return null;for(;I!==null;)o(L,I),I=I.sibling;return null}function c(L){for(var I=new Map;L!==null;)L.key!==null?I.set(L.key,L):I.set(L.index,L),L=L.sibling;return I}function h(L,I){return L=oa(L,I),L.index=0,L.sibling=null,L}function m(L,I,U){return L.index=U,a?(U=L.alternate,U!==null?(U=U.index,U<I?(L.flags|=67108866,I):U):(L.flags|=67108866,I)):(L.flags|=1048576,I)}function b(L){return a&&L.alternate===null&&(L.flags|=67108866),L}function _(L,I,U,$){return I===null||I.tag!==6?(I=_u(U,L.mode,$),I.return=L,I):(I=h(I,U),I.return=L,I)}function T(L,I,U,$){var pe=U.type;return pe===k?H(L,I,U.props.children,$,U.key):I!==null&&(I.elementType===pe||typeof pe=="object"&&pe!==null&&pe.$$typeof===P&&qo(pe)===I.type)?(I=h(I,U.props),Xs(I,U),I.return=L,I):(I=Ml(U.type,U.key,U.props,null,L.mode,$),Xs(I,U),I.return=L,I)}function j(L,I,U,$){return I===null||I.tag!==4||I.stateNode.containerInfo!==U.containerInfo||I.stateNode.implementation!==U.implementation?(I=Cu(U,L.mode,$),I.return=L,I):(I=h(I,U.children||[]),I.return=L,I)}function H(L,I,U,$,pe){return I===null||I.tag!==7?(I=Lo(U,L.mode,$,pe),I.return=L,I):(I=h(I,U),I.return=L,I)}function Y(L,I,U){if(typeof I=="string"&&I!==""||typeof I=="number"||typeof I=="bigint")return I=_u(""+I,L.mode,U),I.return=L,I;if(typeof I=="object"&&I!==null){switch(I.$$typeof){case w:return U=Ml(I.type,I.key,I.props,null,L.mode,U),Xs(U,I),U.return=L,U;case x:return I=Cu(I,L.mode,U),I.return=L,I;case P:return I=qo(I),Y(L,I,U)}if(qe(I)||we(I))return I=Lo(I,L.mode,U,null),I.return=L,I;if(typeof I.then=="function")return Y(L,Fl(I),U);if(I.$$typeof===R)return Y(L,Ll(L,I),U);ql(L,I)}return null}function F(L,I,U,$){var pe=I!==null?I.key:null;if(typeof U=="string"&&U!==""||typeof U=="number"||typeof U=="bigint")return pe!==null?null:_(L,I,""+U,$);if(typeof U=="object"&&U!==null){switch(U.$$typeof){case w:return U.key===pe?T(L,I,U,$):null;case x:return U.key===pe?j(L,I,U,$):null;case P:return U=qo(U),F(L,I,U,$)}if(qe(U)||we(U))return pe!==null?null:H(L,I,U,$,null);if(typeof U.then=="function")return F(L,I,Fl(U),$);if(U.$$typeof===R)return F(L,I,Ll(L,U),$);ql(L,U)}return null}function B(L,I,U,$,pe){if(typeof $=="string"&&$!==""||typeof $=="number"||typeof $=="bigint")return L=L.get(U)||null,_(I,L,""+$,pe);if(typeof $=="object"&&$!==null){switch($.$$typeof){case w:return L=L.get($.key===null?U:$.key)||null,T(I,L,$,pe);case x:return L=L.get($.key===null?U:$.key)||null,j(I,L,$,pe);case P:return $=qo($),B(L,I,U,$,pe)}if(qe($)||we($))return L=L.get(U)||null,H(I,L,$,pe,null);if(typeof $.then=="function")return B(L,I,U,Fl($),pe);if($.$$typeof===R)return B(L,I,U,Ll(I,$),pe);ql(I,$)}return null}function ie(L,I,U,$){for(var pe=null,Be=null,de=I,Ae=I=0,De=null;de!==null&&Ae<U.length;Ae++){de.index>Ae?(De=de,de=null):De=de.sibling;var ze=F(L,de,U[Ae],$);if(ze===null){de===null&&(de=De);break}a&&de&&ze.alternate===null&&o(L,de),I=m(ze,I,Ae),Be===null?pe=ze:Be.sibling=ze,Be=ze,de=De}if(Ae===U.length)return r(L,de),Ne&&ia(L,Ae),pe;if(de===null){for(;Ae<U.length;Ae++)de=Y(L,U[Ae],$),de!==null&&(I=m(de,I,Ae),Be===null?pe=de:Be.sibling=de,Be=de);return Ne&&ia(L,Ae),pe}for(de=c(de);Ae<U.length;Ae++)De=B(de,L,Ae,U[Ae],$),De!==null&&(a&&De.alternate!==null&&de.delete(De.key===null?Ae:De.key),I=m(De,I,Ae),Be===null?pe=De:Be.sibling=De,Be=De);return a&&de.forEach(function(to){return o(L,to)}),Ne&&ia(L,Ae),pe}function me(L,I,U,$){if(U==null)throw Error(i(151));for(var pe=null,Be=null,de=I,Ae=I=0,De=null,ze=U.next();de!==null&&!ze.done;Ae++,ze=U.next()){de.index>Ae?(De=de,de=null):De=de.sibling;var to=F(L,de,ze.value,$);if(to===null){de===null&&(de=De);break}a&&de&&to.alternate===null&&o(L,de),I=m(to,I,Ae),Be===null?pe=to:Be.sibling=to,Be=to,de=De}if(ze.done)return r(L,de),Ne&&ia(L,Ae),pe;if(de===null){for(;!ze.done;Ae++,ze=U.next())ze=Y(L,ze.value,$),ze!==null&&(I=m(ze,I,Ae),Be===null?pe=ze:Be.sibling=ze,Be=ze);return Ne&&ia(L,Ae),pe}for(de=c(de);!ze.done;Ae++,ze=U.next())ze=B(de,L,Ae,ze.value,$),ze!==null&&(a&&ze.alternate!==null&&de.delete(ze.key===null?Ae:ze.key),I=m(ze,I,Ae),Be===null?pe=ze:Be.sibling=ze,Be=ze);return a&&de.forEach(function(sA){return o(L,sA)}),Ne&&ia(L,Ae),pe}function Ke(L,I,U,$){if(typeof U=="object"&&U!==null&&U.type===k&&U.key===null&&(U=U.props.children),typeof U=="object"&&U!==null){switch(U.$$typeof){case w:e:{for(var pe=U.key;I!==null;){if(I.key===pe){if(pe=U.type,pe===k){if(I.tag===7){r(L,I.sibling),$=h(I,U.props.children),$.return=L,L=$;break e}}
vendor: 5,880 bytes, line 9
9else if(I.elementType===pe||typeof pe=="object"&&pe!==null&&pe.$$typeof===P&&qo(pe)===I.type){r(L,I.sibling),$=h(I,U.props),Xs($,U),$.return=L,L=$;break e}r(L,I);break}else o(L,I);I=I.sibling}U.type===k?($=Lo(U.props.children,L.mode,$,U.key),$.return=L,L=$):($=Ml(U.type,U.key,U.props,null,L.mode,$),Xs($,U),$.return=L,L=$)}return b(L);case x:e:{for(pe=U.key;I!==null;){if(I.key===pe)if(I.tag===4&&I.stateNode.containerInfo===U.containerInfo&&I.stateNode.implementation===U.implementation){r(L,I.sibling),$=h(I,U.children||[]),$.return=L,L=$;break e}else{r(L,I);break}else o(L,I);I=I.sibling}$=Cu(U,L.mode,$),$.return=L,L=$}return b(L);case P:return U=qo(U),Ke(L,I,U,$)}if(qe(U))return ie(L,I,U,$);if(we(U)){if(pe=we(U),typeof pe!="function")throw Error(i(150));return U=pe.call(U),me(L,I,U,$)}if(typeof U.then=="function")return Ke(L,I,Fl(U),$);if(U.$$typeof===R)return Ke(L,I,Ll(L,U),$);ql(L,U)}return typeof U=="string"&&U!==""||typeof U=="number"||typeof U=="bigint"?(U=""+U,I!==null&&I.tag===6?(r(L,I.sibling),$=h(I,U),$.return=L,L=$):(r(L,I),$=_u(U,L.mode,$),$.return=L,L=$),b(L)):r(L,I)}return function(L,I,U,$){try{Qs=0;var pe=Ke(L,I,U,$);return Ui=null,pe}catch(de){if(de===Ni||de===Ul)throw de;var Be=cn(29,de,null,L.mode);return Be.lanes=$,Be.return=L,Be}}}var zo=xg(!0),kg=xg(!1),ja=!1;function Uu(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function ju(a,o){a=a.updateQueue,o.updateQueue===a&&(o.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,callbacks:null})}function Fa(a){return{lane:a,tag:0,payload:null,callback:null,next:null}}function qa(a,o,r){var c=a.updateQueue;if(c===null)return null;if(c=c.shared,(Ge&2)!==0){var h=c.pending;return h===null?o.next=o:(o.next=h.next,h.next=o),c.pending=o,o=Il(a),ig(a,null,r),o}return Ol(a,c,o,r),Il(a)}function Js(a,o,r){if(o=o.updateQueue,o!==null&&(o=o.shared,(r&4194048)!==0)){var c=o.lanes;c&=a.pendingLanes,r|=c,o.lanes=r,fm(a,r)}}function Fu(a,o){var r=a.updateQueue,c=a.alternate;if(c!==null&&(c=c.updateQueue,r===c)){var h=null,m=null;if(r=r.firstBaseUpdate,r!==null){do{var b={lane:r.lane,tag:r.tag,payload:r.payload,callback:null,next:null};m===null?h=m=b:m=m.next=b,r=r.next}while(r!==null);m===null?h=m=o:m=m.next=o}else h=m=o;r={baseState:c.baseState,firstBaseUpdate:h,lastBaseUpdate:m,shared:c.shared,callbacks:c.callbacks},a.updateQueue=r;return}a=r.lastBaseUpdate,a===null?r.firstBaseUpdate=o:a.next=o,r.lastBaseUpdate=o}var qu=!1;function er(){if(qu){var a=Li;if(a!==null)throw a}}function tr(a,o,r,c){qu=!1;var h=a.updateQueue;ja=!1;var m=h.firstBaseUpdate,b=h.lastBaseUpdate,_=h.shared.pending;if(_!==null){h.shared.pending=null;var T=_,j=T.next;T.next=null,b===null?m=j:b.next=j,b=T;var H=a.alternate;H!==null&&(H=H.updateQueue,_=H.lastBaseUpdate,_!==b&&(_===null?H.firstBaseUpdate=j:_.next=j,H.lastBaseUpdate=T))}if(m!==null){var Y=h.baseState;b=0,H=j=T=null,_=m;do{var F=_.lane&-536870913,B=F!==_.lane;if(B?(Pe&F)===F:(c&F)===F){F!==0&&F===Di&&(qu=!0),H!==null&&(H=H.next={lane:0,tag:_.tag,payload:_.payload,callback:null,next:null});e:{var ie=a,me=_;F=o;var Ke=r;switch(me.tag){case 1:if(ie=me.payload,typeof ie=="function"){Y=ie.call(Ke,Y,F);break e}Y=ie;break e;case 3:ie.flags=ie.flags&-65537|128;case 0:if(ie=me.payload,F=typeof ie=="function"?ie.call(Ke,Y,F):ie,F==null)break e;Y=g({},Y,F);break e;case 2:ja=!0}}F=_.callback,F!==null&&(a.flags|=64,B&&(a.flags|=8192),B=h.callbacks,B===null?h.callbacks=[F]:B.push(F))}else B={lane:F,tag:_.tag,payload:_.payload,callback:_.callback,next:null},H===null?(j=H=B,T=Y):H=H.next=B,b|=F;if(_=_.next,_===null){if(_=h.shared.pending,_===null)break;B=_,_=B.next,B.next=null,h.lastBaseUpdate=B,h.shared.pending=null}}while(!0);H===null&&(T=Y),h.baseState=T,h.firstBaseUpdate=j,h.lastBaseUpdate=H,m===null&&(h.shared.lanes=0),Wa|=b,a.lanes=b,a.memoizedState=Y}}function Sg(a,o){if(typeof a!="function")throw Error(i(191,a));a.call(o)}function _g(a,o){var r=a.callbacks;if(r!==null)for(a.callbacks=null,a=0;a<r.length;a++)Sg(r[a],o)}var ji=O(null),Bl=O(0);function Cg(a,o){a=ga,Q(Bl,a),Q(ji,o),ga=a|o.baseLanes}function Bu(){Q(Bl,ga),Q(ji,ji.current)}function zu(){ga=Bl.current,V(ji),V(Bl)}var dn=O(null),Cn=null;function Ba(a){var o=a.alternate;Q(dt,dt.current&1),Q(dn,a),Cn===null&&(o===null||ji.current!==null||o.memoizedState!==null)&&(Cn=a)}function Hu(a){Q(dt,dt.current),Q(dn,a),Cn===null&&(Cn=a)}function Ag(a){a.tag===22?(Q(dt,dt.current),Q(dn,a),Cn===null&&(Cn=a)):za()}function za(){Q(dt,dt.current),Q(dn,dn.current)}function un(a){V(dn),Cn===a&&(Cn=null),V(dt)}var dt=O(0);function zl(a){for(var o=a;o!==null;){if(o.tag===13){var r=o.memoizedState;if(r!==null&&(r=r.dehydrated,r===null||Kh(r)||Zh(r)))return o}else if(o.tag===19&&(o.memoizedProps.revealOrder==="forwards"||o.memoizedProps.revealOrder==="backwards"||o.memoizedProps.revealOrder==="unstable_legacy-backwards"||o.memoizedProps.revealOrder==="together")){if((o.flags&128)!==0)return o}else if(o.child!==null){o.child.return=o,o=o.child;continue}if(o===a)break;for(;o.sibling===null;){if(o.return===null||o.return===a)return null;o=o.return}o.sibling.return=o.return,o=o.sibling}return null}var la=0,Ce=null,Ve=null,pt=null,Hl=!1,Fi=!1,Ho=!1,Gl=0,nr=0,qi=null,Z_=0;function rt(){throw Error(i(321))}function Gu(a,o){if(o===null)return!1;for(var r=0;r<o.length&&r<a.length;r++)if(!ln(a[r],o[r]))return!1;return!0}function Wu(a,o,r,c,h,m){return la=m,Ce=o,o.memoizedState=null,o.updateQueue=null,o.lanes=0,q.H=a===null||a.memoizedState===null?cy:sh,Ho=!1,m=r(c,h),Ho=!1,Fi&&(m=Rg(o,r,c,h)),Tg(a),m}function Tg(a){q.H=ir;var o=Ve!==null&&Ve.next!==null;if(la=0,pt=Ve=Ce=null,Hl=!1,nr=0,qi=null,o)throw Error(i(300));a===null||mt||(a=a.dependencies,a!==null&&Dl(a)&&(mt=!0))}function Rg(a,o,r,c){Ce=a;var h=0;
vendor: 10,895 bytes, line 9
9do{if(Fi&&(qi=null),nr=0,Fi=!1,25<=h)throw Error(i(301));if(h+=1,pt=Ve=null,a.updateQueue!=null){var m=a.updateQueue;m.lastEffect=null,m.events=null,m.stores=null,m.memoCache!=null&&(m.memoCache.index=0)}q.H=dy,m=o(r,c)}while(Fi);return m}function Q_(){var a=q.H,o=a.useState()[0];return o=typeof o.then=="function"?ar(o):o,a=a.useState()[0],(Ve!==null?Ve.memoizedState:null)!==a&&(Ce.flags|=1024),o}function $u(){var a=Gl!==0;return Gl=0,a}function Vu(a,o,r){o.updateQueue=a.updateQueue,o.flags&=-2053,a.lanes&=~r}function Yu(a){if(Hl){for(a=a.memoizedState;a!==null;){var o=a.queue;o!==null&&(o.pending=null),a=a.next}Hl=!1}la=0,pt=Ve=Ce=null,Fi=!1,nr=Gl=0,qi=null}function Wt(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return pt===null?Ce.memoizedState=pt=a:pt=pt.next=a,pt}function ut(){if(Ve===null){var a=Ce.alternate;a=a!==null?a.memoizedState:null}else a=Ve.next;var o=pt===null?Ce.memoizedState:pt.next;if(o!==null)pt=o,Ve=a;else{if(a===null)throw Ce.alternate===null?Error(i(467)):Error(i(310));Ve=a,a={memoizedState:Ve.memoizedState,baseState:Ve.baseState,baseQueue:Ve.baseQueue,queue:Ve.queue,next:null},pt===null?Ce.memoizedState=pt=a:pt=pt.next=a}return pt}function Wl(){return{lastEffect:null,events:null,stores:null,memoCache:null}}function ar(a){var o=nr;return nr+=1,qi===null&&(qi=[]),a=bg(qi,a,o),o=Ce,(pt===null?o.memoizedState:pt.next)===null&&(o=o.alternate,q.H=o===null||o.memoizedState===null?cy:sh),a}function $l(a){if(a!==null&&typeof a=="object"){if(typeof a.then=="function")return ar(a);if(a.$$typeof===R)return Lt(a)}throw Error(i(438,String(a)))}function Ku(a){var o=null,r=Ce.updateQueue;if(r!==null&&(o=r.memoCache),o==null){var c=Ce.alternate;c!==null&&(c=c.updateQueue,c!==null&&(c=c.memoCache,c!=null&&(o={data:c.data.map(function(h){return h.slice()}),index:0})))}if(o==null&&(o={data:[],index:0}),r===null&&(r=Wl(),Ce.updateQueue=r),r.memoCache=o,r=o.data[o.index],r===void 0)for(r=o.data[o.index]=Array(a),c=0;c<a;c++)r[c]=oe;return o.index++,r}function ca(a,o){return typeof o=="function"?o(a):o}function Vl(a){var o=ut();return Zu(o,Ve,a)}function Zu(a,o,r){var c=a.queue;if(c===null)throw Error(i(311));c.lastRenderedReducer=r;var h=a.baseQueue,m=c.pending;if(m!==null){if(h!==null){var b=h.next;h.next=m.next,m.next=b}o.baseQueue=h=m,c.pending=null}if(m=a.baseState,h===null)a.memoizedState=m;else{o=h.next;var _=b=null,T=null,j=o,H=!1;do{var Y=j.lane&-536870913;if(Y!==j.lane?(Pe&Y)===Y:(la&Y)===Y){var F=j.revertLane;if(F===0)T!==null&&(T=T.next={lane:0,revertLane:0,gesture:null,action:j.action,hasEagerState:j.hasEagerState,eagerState:j.eagerState,next:null}),Y===Di&&(H=!0);else if((la&F)===F){j=j.next,F===Di&&(H=!0);continue}else Y={lane:0,revertLane:j.revertLane,gesture:null,action:j.action,hasEagerState:j.hasEagerState,eagerState:j.eagerState,next:null},T===null?(_=T=Y,b=m):T=T.next=Y,Ce.lanes|=F,Wa|=F;Y=j.action,Ho&&r(m,Y),m=j.hasEagerState?j.eagerState:r(m,Y)}else F={lane:Y,revertLane:j.revertLane,gesture:j.gesture,action:j.action,hasEagerState:j.hasEagerState,eagerState:j.eagerState,next:null},T===null?(_=T=F,b=m):T=T.next=F,Ce.lanes|=Y,Wa|=Y;j=j.next}while(j!==null&&j!==o);if(T===null?b=m:T.next=_,!ln(m,a.memoizedState)&&(mt=!0,H&&(r=Li,r!==null)))throw r;a.memoizedState=m,a.baseState=b,a.baseQueue=T,c.lastRenderedState=m}return h===null&&(c.lanes=0),[a.memoizedState,c.dispatch]}function Qu(a){var o=ut(),r=o.queue;if(r===null)throw Error(i(311));r.lastRenderedReducer=a;var c=r.dispatch,h=r.pending,m=o.memoizedState;if(h!==null){r.pending=null;var b=h=h.next;do m=a(m,b.action),b=b.next;while(b!==h);ln(m,o.memoizedState)||(mt=!0),o.memoizedState=m,o.baseQueue===null&&(o.baseState=m),r.lastRenderedState=m}return[m,c]}function Eg(a,o,r){var c=Ce,h=ut(),m=Ne;if(m){if(r===void 0)throw Error(i(407));r=r()}else r=o();var b=!ln((Ve||h).memoizedState,r);if(b&&(h.memoizedState=r,mt=!0),h=h.queue,eh(Mg.bind(null,c,h,a),[a]),h.getSnapshot!==o||b||pt!==null&&pt.memoizedState.tag&1){if(c.flags|=2048,Bi(9,{destroy:void 0},Ig.bind(null,c,h,r,o),null),Ze===null)throw Error(i(349));m||(la&127)!==0||Og(c,o,r)}return r}function Og(a,o,r){a.flags|=16384,a={getSnapshot:o,value:r},o=Ce.updateQueue,o===null?(o=Wl(),Ce.updateQueue=o,o.stores=[a]):(r=o.stores,r===null?o.stores=[a]:r.push(a))}function Ig(a,o,r,c){o.value=r,o.getSnapshot=c,Pg(o)&&Dg(a)}function Mg(a,o,r){return r(function(){Pg(o)&&Dg(a)})}function Pg(a){var o=a.getSnapshot;a=a.value;try{var r=o();return!ln(a,r)}catch{return!0}}function Dg(a){var o=Do(a,2);o!==null&&en(o,a,2)}function Xu(a){var o=Wt();if(typeof a=="function"){var r=a;if(a=r(),Ho){Ia(!0);try{r()}finally{Ia(!1)}}}return o.memoizedState=o.baseState=a,o.queue={pending:null,lanes:0,dispatch:null,lastRenderedReducer:ca,lastRenderedState:a},o}function Lg(a,o,r,c){return a.baseState=r,Zu(a,Ve,typeof c=="function"?c:ca)}function X_(a,o,r,c,h){if(Zl(a))throw Error(i(485));if(a=o.action,a!==null){var m={payload:h,action:a,next:null,isTransition:!0,status:"pending",value:null,reason:null,listeners:[],then:function(b){m.listeners.push(b)}};q.T!==null?r(!0):m.isTransition=!1,c(m),r=o.pending,r===null?(m.next=o.pending=m,Ng(o,m)):(m.next=r.next,o.pending=r.next=m)}}function Ng(a,o){var r=o.action,c=o.payload,h=a.state;if(o.isTransition){var m=q.T,b={};q.T=b;try{var _=r(h,c),T=q.S;T!==null&&T(b,_),Ug(a,o,_)}catch(j){Ju(a,o,j)}finally{m!==null&&b.types!==null&&(m.types=b.types),q.T=m}}else try{m=r(h,c),Ug(a,o,m)}catch(j){Ju(a,o,j)}}function Ug(a,o,r){r!==null&&typeof r=="object"&&typeof r.then=="function"?r.then(function(c){jg(a,o,c)},function(c){return Ju(a,o,c)}):jg(a,o,r)}function jg(a,o,r){o.status="fulfilled",o.value=r,Fg(o),a.state=r,o=a.pending,o!==null&&(r=o.next,r===o?a.pending=null:(r=r.next,o.next=r,Ng(a,r)))}function Ju(a,o,r){var c=a.pending;if(a.pending=null,c!==null){c=c.next;do o.status="rejected",o.reason=r,Fg(o),o=o.next;while(o!==c)}a.action=null}function Fg(a){a=a.listeners;for(var o=0;o<a.length;o++)(0,a[o])()}function qg(a,o){return o}function Bg(a,o){if(Ne){var r=Ze.formState;if(r!==null){e:{var c=Ce;if(Ne){if(nt){t:{for(var h=nt,m=_n;h.nodeType!==8;){if(!m){h=null;break t}if(h=An(h.nextSibling),h===null){h=null;break t}}m=h.data,h=m==="F!"||m==="F"?h:null}if(h){nt=An(h.nextSibling),c=h.data==="F!";break e}}Na(c)}c=!1}c&&(o=r[0])}}return r=Wt(),r.memoizedState=r.baseState=o,c={pending:null,lanes:0,dispatch:null,lastRenderedReducer:qg,lastRenderedState:o},r.queue=c,r=sy.bind(null,Ce,c),c.dispatch=r,c=Xu(!1),m=ih.bind(null,Ce,!1,c.queue),c=Wt(),h={state:o,dispatch:null,action:a,pending:null},c.queue=h,r=X_.bind(null,Ce,h,m,r),h.dispatch=r,c.memoizedState=a,[o,r,!1]}function zg(a){var o=ut();return Hg(o,Ve,a)}function Hg(a,o,r){if(o=Zu(a,o,qg)[0],a=Vl(ca)[0],typeof o=="object"&&o!==null&&typeof o.then=="function")try{var c=ar(o)}catch(b){throw b===Ni?Ul:b}else c=o;o=ut();var h=o.queue,m=h.dispatch;return r!==o.memoizedState&&(Ce.flags|=2048,Bi(9,{destroy:void 0},J_.bind(null,h,r),null)),[c,m,a]}function J_(a,o){a.action=o}function Gg(a){var o=ut(),r=Ve;if(r!==null)return Hg(o,r,a);ut(),o=o.memoizedState,r=ut();var c=r.queue.dispatch;return r.memoizedState=a,[o,c,!1]}function Bi(a,o,r,c){return a={tag:a,create:r,deps:c,inst:o,next:null},o=Ce.updateQueue,o===null&&(o=Wl(),Ce.updateQueue=o),r=o.lastEffect,r===null?o.lastEffect=a.next=a:(c=r.next,r.next=a,a.next=c,o.lastEffect=a),a}function Wg(){return ut().memoizedState}function Yl(a,o,r,c){var h=Wt();Ce.flags|=a,h.memoizedState=Bi(1|o,{destroy:void 0},r,c===void 0?null:c)}function Kl(a,o,r,c){var h=ut();c=c===void 0?null:c;var m=h.memoizedState.inst;Ve!==null&&c!==null&&Gu(c,Ve.memoizedState.deps)?h.memoizedState=Bi(o,m,r,c):(Ce.flags|=a,h.memoizedState=Bi(1|o,m,r,c))}function $g(a,o){Yl(8390656,8,a,o)}function eh(a,o){Kl(2048,8,a,o)}function eC(a){Ce.flags|=4;var o=Ce.updateQueue;if(o===null)o=Wl(),Ce.updateQueue=o,o.events=[a];else{var r=o.events;r===null?o.events=[a]:r.push(a)}}function Vg(a){var o=ut().memoizedState;return eC({ref:o,nextImpl:a}),function(){if((Ge&2)!==0)throw Error(i(440));return o.impl.apply(void 0,arguments)}}function Yg(a,o){return Kl(4,2,a,o)}function Kg(a,o){return Kl(4,4,a,o)}function Zg(a,o){if(typeof o=="function"){a=a();var r=o(a);return function(){typeof r=="function"?r():o(null)}}if(o!=null)return a=a(),o.current=a,function(){o.current=null}}function Qg(a,o,r){r=r!=null?r.concat([a]):null,Kl(4,4,Zg.bind(null,o,a),r)}function th(){}function Xg(a,o){var r=ut();o=o===void 0?null:o;var c=r.memoizedState;return o!==null&&Gu(o,c[1])?c[0]:(r.memoizedState=[a,o],a)}function Jg(a,o){var r=ut();o=o===void 0?null:o;var c=r.memoizedState;if(o!==null&&Gu(o,c[1]))return c[0];if(c=a(),Ho){Ia(!0);try{a()}finally{Ia(!1)}}return r.memoizedState=[c,o],c}function nh(a,o,r){return r===void 0||(la&1073741824)!==0&&(Pe&261930)===0?a.memoizedState=o:(a.memoizedState=r,a=eb(),Ce.lanes|=a,Wa|=a,r)}function ey(a,o,r,c){return ln(r,o)?r:ji.current!==null?(a=nh(a,r,c),ln(a,o)||(mt=!0),a):(la&42)===0||(la&1073741824)!==0&&(Pe&261930)===0?(mt=!0,a.memoizedState=r):(a=eb(),Ce.lanes|=a,Wa|=a,o)}function ty(a,o,r,c,h){var m=K.p;K.p=m!==0&&8>m?m:8;var b=q.T,_={};q.T=_,ih(a,!1,o,r);try{var T=h(),j=q.S;if(j!==null&&j(_,T),T!==null&&typeof T=="object"&&typeof T.then=="function"){var H=K_(T,c);or(a,o,H,pn(a))}else or(a,o,c,pn(a))}catch(Y){or(a,o,{then:function(){},status:"rejected",reason:Y},pn())}finally{K.p=m,b!==null&&_.types!==null&&(b.types=_.types),q.T=b}}function tC(){}function ah(a,o,r,c){if(a.tag!==5)throw Error(i(476));var h=ny(a).queue;ty(a,h,o,he,r===null?tC:function(){return ay(a),r(c)})}function ny(a){var o=a.memoizedState;if(o!==null)return o;o={memoizedState:he,baseState:he,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ca,lastRenderedState:he},next:null};var r={};return o.next={memoizedState:r,baseState:r,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ca,lastRenderedState:r},next:null},a.memoizedState=o,a=a.alternate,a!==null&&(a.memoizedState=o),o}function ay(a){var o=ny(a);o.next===null&&(o=a.alternate.memoizedState),or(a,o.next.queue,{},pn())}function oh(){return Lt(xr)}function oy(){return ut().memoizedState}function iy(){return ut().memoizedState}function nC(a){for(var o=a.return;o!==null;){switch(o.tag){case 24:case 3:var r=pn();a=Fa(r);var c=qa(o,a,r);c!==null&&(en(c,o,r),Js(c,o,r)),o={cache:Pu()},a.payload=o;return}o=o.return}}function aC(a,o,r){var c=pn();r={lane:c,revertLane:0,gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Zl(a)?ry(o,r):(r=ku(a,o,r,c),r!==null&&(en(r,a,c),ly(r,o,c)))}function sy(a,o,r){var c=pn();or(a,o,r,c)}function or(a,o,r,c){var h={lane:c,revertLane:0,gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null};if(Zl(a))ry(o,h);else{var m=a.alternate;if(a.lanes===0&&(m===null||m.lanes===0)&&(m=o.lastRenderedReducer,m!==null))try{var b=o.lastRenderedState,_=m(b,r);
vendor: 1,766 bytes, line 9
9if(h.hasEagerState=!0,h.eagerState=_,ln(_,b))return Ol(a,o,h,0),Ze===null&&El(),!1}catch{}if(r=ku(a,o,h,c),r!==null)return en(r,a,c),ly(r,o,c),!0}return!1}function ih(a,o,r,c){if(c={lane:2,revertLane:Uh(),gesture:null,action:c,hasEagerState:!1,eagerState:null,next:null},Zl(a)){if(o)throw Error(i(479))}else o=ku(a,r,c,2),o!==null&&en(o,a,2)}function Zl(a){var o=a.alternate;return a===Ce||o!==null&&o===Ce}function ry(a,o){Fi=Hl=!0;var r=a.pending;r===null?o.next=o:(o.next=r.next,r.next=o),a.pending=o}function ly(a,o,r){if((r&4194048)!==0){var c=o.lanes;c&=a.pendingLanes,r|=c,o.lanes=r,fm(a,r)}}var ir={readContext:Lt,use:$l,useCallback:rt,useContext:rt,useEffect:rt,useImperativeHandle:rt,useLayoutEffect:rt,useInsertionEffect:rt,useMemo:rt,useReducer:rt,useRef:rt,useState:rt,useDebugValue:rt,useDeferredValue:rt,useTransition:rt,useSyncExternalStore:rt,useId:rt,useHostTransitionStatus:rt,useFormState:rt,useActionState:rt,useOptimistic:rt,useMemoCache:rt,useCacheRefresh:rt};ir.useEffectEvent=rt;var cy={readContext:Lt,use:$l,useCallback:function(a,o){return Wt().memoizedState=[a,o===void 0?null:o],a},useContext:Lt,useEffect:$g,useImperativeHandle:function(a,o,r){r=r!=null?r.concat([a]):null,Yl(4194308,4,Zg.bind(null,o,a),r)},useLayoutEffect:function(a,o){return Yl(4194308,4,a,o)},useInsertionEffect:function(a,o){Yl(4,2,a,o)},useMemo:function(a,o){var r=Wt();o=o===void 0?null:o;var c=a();if(Ho){Ia(!0);try{a()}finally{Ia(!1)}}return r.memoizedState=[c,o],c},useReducer:function(a,o,r){var c=Wt();if(r!==void 0){var h=r(o);if(Ho){Ia(!0);try{r(o)}finally{Ia(!1)}}}else h=o;return c.memoizedState=c.baseState=h,a={pending:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:h},c.queue=a,a=a.dispatch=aC.bind(null,Ce,a),[c.memoizedState,a]}
vendor: 4,876 bytes, line 9
9,useRef:function(a){var o=Wt();return a={current:a},o.memoizedState=a},useState:function(a){a=Xu(a);var o=a.queue,r=sy.bind(null,Ce,o);return o.dispatch=r,[a.memoizedState,r]},useDebugValue:th,useDeferredValue:function(a,o){var r=Wt();return nh(r,a,o)},useTransition:function(){var a=Xu(!1);return a=ty.bind(null,Ce,a.queue,!0,!1),Wt().memoizedState=a,[!1,a]},useSyncExternalStore:function(a,o,r){var c=Ce,h=Wt();if(Ne){if(r===void 0)throw Error(i(407));r=r()}else{if(r=o(),Ze===null)throw Error(i(349));(Pe&127)!==0||Og(c,o,r)}h.memoizedState=r;var m={value:r,getSnapshot:o};return h.queue=m,$g(Mg.bind(null,c,m,a),[a]),c.flags|=2048,Bi(9,{destroy:void 0},Ig.bind(null,c,m,r,o),null),r},useId:function(){var a=Wt(),o=Ze.identifierPrefix;if(Ne){var r=Bn,c=qn;r=(c&~(1<<32-rn(c)-1)).toString(32)+r,o="_"+o+"R_"+r,r=Gl++,0<r&&(o+="H"+r.toString(32)),o+="_"}else r=Z_++,o="_"+o+"r_"+r.toString(32)+"_";return a.memoizedState=o},useHostTransitionStatus:oh,useFormState:Bg,useActionState:Bg,useOptimistic:function(a){var o=Wt();o.memoizedState=o.baseState=a;var r={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return o.queue=r,o=ih.bind(null,Ce,!0,r),r.dispatch=o,[a,o]},useMemoCache:Ku,useCacheRefresh:function(){return Wt().memoizedState=nC.bind(null,Ce)},useEffectEvent:function(a){var o=Wt(),r={impl:a};return o.memoizedState=r,function(){if((Ge&2)!==0)throw Error(i(440));return r.impl.apply(void 0,arguments)}}},sh={readContext:Lt,use:$l,useCallback:Xg,useContext:Lt,useEffect:eh,useImperativeHandle:Qg,useInsertionEffect:Yg,useLayoutEffect:Kg,useMemo:Jg,useReducer:Vl,useRef:Wg,useState:function(){return Vl(ca)},useDebugValue:th,useDeferredValue:function(a,o){var r=ut();return ey(r,Ve.memoizedState,a,o)},useTransition:function(){var a=Vl(ca)[0],o=ut().memoizedState;return[typeof a=="boolean"?a:ar(a),o]},useSyncExternalStore:Eg,useId:oy,useHostTransitionStatus:oh,useFormState:zg,useActionState:zg,useOptimistic:function(a,o){var r=ut();return Lg(r,Ve,a,o)},useMemoCache:Ku,useCacheRefresh:iy};sh.useEffectEvent=Vg;var dy={readContext:Lt,use:$l,useCallback:Xg,useContext:Lt,useEffect:eh,useImperativeHandle:Qg,useInsertionEffect:Yg,useLayoutEffect:Kg,useMemo:Jg,useReducer:Qu,useRef:Wg,useState:function(){return Qu(ca)},useDebugValue:th,useDeferredValue:function(a,o){var r=ut();return Ve===null?nh(r,a,o):ey(r,Ve.memoizedState,a,o)},useTransition:function(){var a=Qu(ca)[0],o=ut().memoizedState;return[typeof a=="boolean"?a:ar(a),o]},useSyncExternalStore:Eg,useId:oy,useHostTransitionStatus:oh,useFormState:Gg,useActionState:Gg,useOptimistic:function(a,o){var r=ut();return Ve!==null?Lg(r,Ve,a,o):(r.baseState=a,[a,r.queue.dispatch])},useMemoCache:Ku,useCacheRefresh:iy};dy.useEffectEvent=Vg;function rh(a,o,r,c){o=a.memoizedState,r=r(c,o),r=r==null?o:g({},o,r),a.memoizedState=r,a.lanes===0&&(a.updateQueue.baseState=r)}var lh={enqueueSetState:function(a,o,r){a=a._reactInternals;var c=pn(),h=Fa(c);h.payload=o,r!=null&&(h.callback=r),o=qa(a,h,c),o!==null&&(en(o,a,c),Js(o,a,c))},enqueueReplaceState:function(a,o,r){a=a._reactInternals;var c=pn(),h=Fa(c);h.tag=1,h.payload=o,r!=null&&(h.callback=r),o=qa(a,h,c),o!==null&&(en(o,a,c),Js(o,a,c))},enqueueForceUpdate:function(a,o){a=a._reactInternals;var r=pn(),c=Fa(r);c.tag=2,o!=null&&(c.callback=o),o=qa(a,c,r),o!==null&&(en(o,a,r),Js(o,a,r))}};function uy(a,o,r,c,h,m,b){return a=a.stateNode,typeof a.shouldComponentUpdate=="function"?a.shouldComponentUpdate(c,m,b):o.prototype&&o.prototype.isPureReactComponent?!Ws(r,c)||!Ws(h,m):!0}function hy(a,o,r,c){a=o.state,typeof o.componentWillReceiveProps=="function"&&o.componentWillReceiveProps(r,c),typeof o.UNSAFE_componentWillReceiveProps=="function"&&o.UNSAFE_componentWillReceiveProps(r,c),o.state!==a&&lh.enqueueReplaceState(o,o.state,null)}function Go(a,o){var r=o;if("ref"in o){r={};for(var c in o)c!=="ref"&&(r[c]=o[c])}if(a=a.defaultProps){r===o&&(r=g({},r));for(var h in a)r[h]===void 0&&(r[h]=a[h])}return r}function fy(a){Rl(a)}function py(a){console.error(a)}function my(a){Rl(a)}function Ql(a,o){try{var r=a.onUncaughtError;r(o.value,{componentStack:o.stack})}catch(c){setTimeout(function(){throw c})}}function gy(a,o,r){try{var c=a.onCaughtError;c(r.value,{componentStack:r.stack,errorBoundary:o.tag===1?o.stateNode:null})}catch(h){setTimeout(function(){throw h})}}function ch(a,o,r){return r=Fa(r),r.tag=3,r.payload={element:null},r.callback=function(){Ql(a,o)},r}function yy(a){return a=Fa(a),a.tag=3,a}function by(a,o,r,c){var h=r.type.getDerivedStateFromError;if(typeof h=="function"){var m=c.value;a.payload=function(){return h(m)},a.callback=function(){gy(o,r,c)}}var b=r.stateNode;b!==null&&typeof b.componentDidCatch=="function"&&(a.callback=function(){gy(o,r,c),typeof h!="function"&&($a===null?$a=new Set([this]):$a.add(this));var _=c.stack;this.componentDidCatch(c.value,{componentStack:_!==null?_:""})})}
vendor: 4,401 bytes, line 9
9function oC(a,o,r,c,h){if(r.flags|=32768,c!==null&&typeof c=="object"&&typeof c.then=="function"){if(o=r.alternate,o!==null&&Pi(o,r,h,!0),r=dn.current,r!==null){switch(r.tag){case 31:case 13:return Cn===null?cc():r.alternate===null&<===0&&(lt=3),r.flags&=-257,r.flags|=65536,r.lanes=h,c===jl?r.flags|=16384:(o=r.updateQueue,o===null?r.updateQueue=new Set([c]):o.add(c),Dh(a,c,h)),!1;case 22:return r.flags|=65536,c===jl?r.flags|=16384:(o=r.updateQueue,o===null?(o={transitions:null,markerInstances:null,retryQueue:new Set([c])},r.updateQueue=o):(r=o.retryQueue,r===null?o.retryQueue=new Set([c]):r.add(c)),Dh(a,c,h)),!1}throw Error(i(435,r.tag))}return Dh(a,c,h),cc(),!1}if(Ne)return o=dn.current,o!==null?((o.flags&65536)===0&&(o.flags|=256),o.flags|=65536,o.lanes=h,c!==Ru&&(a=Error(i(422),{cause:c}),Ys(xn(a,r)))):(c!==Ru&&(o=Error(i(423),{cause:c}),Ys(xn(o,r))),a=a.current.alternate,a.flags|=65536,h&=-h,a.lanes|=h,c=xn(c,r),h=ch(a.stateNode,c,h),Fu(a,h),lt!==4&&(lt=2)),!1;var m=Error(i(520),{cause:c});if(m=xn(m,r),fr===null?fr=[m]:fr.push(m),lt!==4&&(lt=2),o===null)return!0;c=xn(c,r),r=o;do{switch(r.tag){case 3:return r.flags|=65536,a=h&-h,r.lanes|=a,a=ch(r.stateNode,c,a),Fu(r,a),!1;case 1:if(o=r.type,m=r.stateNode,(r.flags&128)===0&&(typeof o.getDerivedStateFromError=="function"||m!==null&&typeof m.componentDidCatch=="function"&&($a===null||!$a.has(m))))return r.flags|=65536,h&=-h,r.lanes|=h,h=yy(h),by(h,a,r,c),Fu(r,h),!1}r=r.return}while(r!==null);return!1}var dh=Error(i(461)),mt=!1;function Nt(a,o,r,c){o.child=a===null?kg(o,null,r,c):zo(o,a.child,r,c)}function vy(a,o,r,c,h){r=r.render;var m=o.ref;if("ref"in c){var b={};for(var _ in c)_!=="ref"&&(b[_]=c[_])}else b=c;return jo(o),c=Wu(a,o,r,b,m,h),_=$u(),a!==null&&!mt?(Vu(a,o,h),da(a,o,h)):(Ne&&_&&Au(o),o.flags|=1,Nt(a,o,c,h),o.child)}function wy(a,o,r,c,h){if(a===null){var m=r.type;return typeof m=="function"&&!Su(m)&&m.defaultProps===void 0&&r.compare===null?(o.tag=15,o.type=m,xy(a,o,m,c,h)):(a=Ml(r.type,null,c,o,o.mode,h),a.ref=o.ref,a.return=o,o.child=a)}if(m=a.child,!bh(a,h)){var b=m.memoizedProps;if(r=r.compare,r=r!==null?r:Ws,r(b,c)&&a.ref===o.ref)return da(a,o,h)}return o.flags|=1,a=oa(m,c),a.ref=o.ref,a.return=o,o.child=a}function xy(a,o,r,c,h){if(a!==null){var m=a.memoizedProps;if(Ws(m,c)&&a.ref===o.ref)if(mt=!1,o.pendingProps=c=m,bh(a,h))(a.flags&131072)!==0&&(mt=!0);else return o.lanes=a.lanes,da(a,o,h)}return uh(a,o,r,c,h)}function ky(a,o,r,c){var h=c.children,m=a!==null?a.memoizedState:null;if(a===null&&o.stateNode===null&&(o.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),c.mode==="hidden"){if((o.flags&128)!==0){if(m=m!==null?m.baseLanes|r:r,a!==null){for(c=o.child=a.child,h=0;c!==null;)h=h|c.lanes|c.childLanes,c=c.sibling;c=h&~m}else c=0,o.child=null;return Sy(a,o,m,r,c)}if((r&536870912)!==0)o.memoizedState={baseLanes:0,cachePool:null},a!==null&&Nl(o,m!==null?m.cachePool:null),m!==null?Cg(o,m):Bu(),Ag(o);else return c=o.lanes=536870912,Sy(a,o,m!==null?m.baseLanes|r:r,r,c)}else m!==null?(Nl(o,m.cachePool),Cg(o,m),za(),o.memoizedState=null):(a!==null&&Nl(o,null),Bu(),za());return Nt(a,o,h,r),o.child}function sr(a,o){return a!==null&&a.tag===22||o.stateNode!==null||(o.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),o.sibling}function Sy(a,o,r,c,h){var m=Lu();return m=m===null?null:{parent:ft._currentValue,pool:m},o.memoizedState={baseLanes:r,cachePool:m},a!==null&&Nl(o,null),Bu(),Ag(o),a!==null&&Pi(a,o,c,!0),o.childLanes=h,null}function Xl(a,o){return o=ec({mode:o.mode,children:o.children},a.mode),o.ref=a.ref,a.child=o,o.return=a,o}function _y(a,o,r){return zo(o,a.child,null,r),a=Xl(o,o.pendingProps),a.flags|=2,un(o),o.memoizedState=null,a}function iC(a,o,r){var c=o.pendingProps,h=(o.flags&128)!==0;if(o.flags&=-129,a===null){if(Ne){if(c.mode==="hidden")return a=Xl(o,c),o.lanes=536870912,sr(null,a);if(Hu(o),(a=nt)?(a=Nb(a,_n),a=a!==null&&a.data==="&"?a:null,a!==null&&(o.memoizedState={dehydrated:a,treeContext:Da!==null?{id:qn,overflow:Bn}:null,retryLane:536870912,hydrationErrors:null},r=rg(a),r.return=o,o.child=r,Dt=o,nt=null)):a=null,a===null)throw Na(o);return o.lanes=536870912,null}return Xl(o,c)}var m=a.memoizedState;if(m!==null){var b=m.dehydrated;if(Hu(o),h)if(o.flags&256)o.flags&=-257,o=_y(a,o,r);else if(o.memoizedState!==null)o.child=a.child,o.flags|=128,o=null;else throw Error(i(558));
vendor: 1,276 bytes, line 9
9else if(mt||Pi(a,o,r,!1),h=(r&a.childLanes)!==0,mt||h){if(c=Ze,c!==null&&(b=pm(c,r),b!==0&&b!==m.retryLane))throw m.retryLane=b,Do(a,b),en(c,a,b),dh;cc(),o=_y(a,o,r)}else a=m.treeContext,nt=An(b.nextSibling),Dt=o,Ne=!0,La=null,_n=!1,a!==null&&dg(o,a),o=Xl(o,c),o.flags|=4096;return o}return a=oa(a.child,{mode:c.mode,children:c.children}),a.ref=o.ref,o.child=a,a.return=o,a}function Jl(a,o){var r=o.ref;if(r===null)a!==null&&a.ref!==null&&(o.flags|=4194816);else{if(typeof r!="function"&&typeof r!="object")throw Error(i(284));(a===null||a.ref!==r)&&(o.flags|=4194816)}}function uh(a,o,r,c,h){return jo(o),r=Wu(a,o,r,c,void 0,h),c=$u(),a!==null&&!mt?(Vu(a,o,h),da(a,o,h)):(Ne&&c&&Au(o),o.flags|=1,Nt(a,o,r,h),o.child)}function Cy(a,o,r,c,h,m){return jo(o),o.updateQueue=null,r=Rg(o,c,r,h),Tg(a),c=$u(),a!==null&&!mt?(Vu(a,o,m),da(a,o,m)):(Ne&&c&&Au(o),o.flags|=1,Nt(a,o,r,m),o.child)}function Ay(a,o,r,c,h){if(jo(o),o.stateNode===null){var m=Ei,b=r.contextType;typeof b=="object"&&b!==null&&(m=Lt(b)),m=new r(c,m),o.memoizedState=m.state!==null&&m.state!==void 0?m.state:null,m.updater=lh,o.stateNode=m,m._reactInternals=o,m=o.stateNode,m.props=c,m.state=o.memoizedState,m.refs={},Uu(o),b=r.contextType,m.context=typeof b=="object"&&b!==null?Lt(b):Ei,m.state=o.memoizedState,b
vendor: 5,741 bytes, line 9
9=r.getDerivedStateFromProps,typeof b=="function"&&(rh(o,r,b,c),m.state=o.memoizedState),typeof r.getDerivedStateFromProps=="function"||typeof m.getSnapshotBeforeUpdate=="function"||typeof m.UNSAFE_componentWillMount!="function"&&typeof m.componentWillMount!="function"||(b=m.state,typeof m.componentWillMount=="function"&&m.componentWillMount(),typeof m.UNSAFE_componentWillMount=="function"&&m.UNSAFE_componentWillMount(),b!==m.state&&lh.enqueueReplaceState(m,m.state,null),tr(o,c,m,h),er(),m.state=o.memoizedState),typeof m.componentDidMount=="function"&&(o.flags|=4194308),c=!0}else if(a===null){m=o.stateNode;var _=o.memoizedProps,T=Go(r,_);m.props=T;var j=m.context,H=r.contextType;b=Ei,typeof H=="object"&&H!==null&&(b=Lt(H));var Y=r.getDerivedStateFromProps;H=typeof Y=="function"||typeof m.getSnapshotBeforeUpdate=="function",_=o.pendingProps!==_,H||typeof m.UNSAFE_componentWillReceiveProps!="function"&&typeof m.componentWillReceiveProps!="function"||(_||j!==b)&&hy(o,m,c,b),ja=!1;var F=o.memoizedState;m.state=F,tr(o,c,m,h),er(),j=o.memoizedState,_||F!==j||ja?(typeof Y=="function"&&(rh(o,r,Y,c),j=o.memoizedState),(T=ja||uy(o,r,T,c,F,j,b))?(H||typeof m.UNSAFE_componentWillMount!="function"&&typeof m.componentWillMount!="function"||(typeof m.componentWillMount=="function"&&m.componentWillMount(),typeof m.UNSAFE_componentWillMount=="function"&&m.UNSAFE_componentWillMount()),typeof m.componentDidMount=="function"&&(o.flags|=4194308)):(typeof m.componentDidMount=="function"&&(o.flags|=4194308),o.memoizedProps=c,o.memoizedState=j),m.props=c,m.state=j,m.context=b,c=T):(typeof m.componentDidMount=="function"&&(o.flags|=4194308),c=!1)}else{m=o.stateNode,ju(a,o),b=o.memoizedProps,H=Go(r,b),m.props=H,Y=o.pendingProps,F=m.context,j=r.contextType,T=Ei,typeof j=="object"&&j!==null&&(T=Lt(j)),_=r.getDerivedStateFromProps,(j=typeof _=="function"||typeof m.getSnapshotBeforeUpdate=="function")||typeof m.UNSAFE_componentWillReceiveProps!="function"&&typeof m.componentWillReceiveProps!="function"||(b!==Y||F!==T)&&hy(o,m,c,T),ja=!1,F=o.memoizedState,m.state=F,tr(o,c,m,h),er();var B=o.memoizedState;b!==Y||F!==B||ja||a!==null&&a.dependencies!==null&&Dl(a.dependencies)?(typeof _=="function"&&(rh(o,r,_,c),B=o.memoizedState),(H=ja||uy(o,r,H,c,F,B,T)||a!==null&&a.dependencies!==null&&Dl(a.dependencies))?(j||typeof m.UNSAFE_componentWillUpdate!="function"&&typeof m.componentWillUpdate!="function"||(typeof m.componentWillUpdate=="function"&&m.componentWillUpdate(c,B,T),typeof m.UNSAFE_componentWillUpdate=="function"&&m.UNSAFE_componentWillUpdate(c,B,T)),typeof m.componentDidUpdate=="function"&&(o.flags|=4),typeof m.getSnapshotBeforeUpdate=="function"&&(o.flags|=1024)):(typeof m.componentDidUpdate!="function"||b===a.memoizedProps&&F===a.memoizedState||(o.flags|=4),typeof m.getSnapshotBeforeUpdate!="function"||b===a.memoizedProps&&F===a.memoizedState||(o.flags|=1024),o.memoizedProps=c,o.memoizedState=B),m.props=c,m.state=B,m.context=T,c=H):(typeof m.componentDidUpdate!="function"||b===a.memoizedProps&&F===a.memoizedState||(o.flags|=4),typeof m.getSnapshotBeforeUpdate!="function"||b===a.memoizedProps&&F===a.memoizedState||(o.flags|=1024),c=!1)}return m=c,Jl(a,o),c=(o.flags&128)!==0,m||c?(m=o.stateNode,r=c&&typeof r.getDerivedStateFromError!="function"?null:m.render(),o.flags|=1,a!==null&&c?(o.child=zo(o,a.child,null,h),o.child=zo(o,null,r,h)):Nt(a,o,r,h),o.memoizedState=m.state,a=o.child):a=da(a,o,h),a}function Ty(a,o,r,c){return No(),o.flags|=256,Nt(a,o,r,c),o.child}var hh={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function fh(a){return{baseLanes:a,cachePool:gg()}}function ph(a,o,r){return a=a!==null?a.childLanes&~r:0,o&&(a|=fn),a}function Ry(a,o,r){var c=o.pendingProps,h=!1,m=(o.flags&128)!==0,b;if((b=m)||(b=a!==null&&a.memoizedState===null?!1:(dt.current&2)!==0),b&&(h=!0,o.flags&=-129),b=(o.flags&32)!==0,o.flags&=-33,a===null){if(Ne){if(h?Ba(o):za(),(a=nt)?(a=Nb(a,_n),a=a!==null&&a.data!=="&"?a:null,a!==null&&(o.memoizedState={dehydrated:a,treeContext:Da!==null?{id:qn,overflow:Bn}:null,retryLane:536870912,hydrationErrors:null},r=rg(a),r.return=o,o.child=r,Dt=o,nt=null)):a=null,a===null)throw Na(o);return Zh(a)?o.lanes=32:o.lanes=536870912,null}var _=c.children;return c=c.fallback,h?(za(),h=o.mode,_=ec({mode:"hidden",children:_},h),c=Lo(c,h,r,null),_.return=o,c.return=o,_.sibling=c,o.child=_,c=o.child,c.memoizedState=fh(r),c.childLanes=ph(a,b,r),o.memoizedState=hh,sr(null,c)):(Ba(o),mh(o,_))}var T=a.memoizedState;if(T!==null&&(_=T.dehydrated,_!==null)){if(m)o.flags&256?(Ba(o),o.flags&=-257,o=gh(a,o,r)):o.memoizedState!==null?(za(),o.child=a.child,o.flags|=128,o=null):(za(),_=c.fallback,h=o.mode,c=ec({mode:"visible",children:c.children},h),_=Lo(_,h,r,null),_.flags|=2,c.return=o,_.return=o,c.sibling=_,o.child=c,zo(o,a.child,null,r),c=o.child,c.memoizedState=fh(r),c.childLanes=ph(a,b,r),o.memoizedState=hh,o=sr(null,c));else if(Ba(o),Zh(_)){if(b=_.nextSibling&&_.nextSibling.dataset,b)var j=b.dgst;b=j,c=Error(i(419)),c.stack="",c.digest=b,Ys({value:c,source:null,stack:null}),o=gh(a,o,r)}else if(mt||Pi(a,o,r,!1),b=(r&a.childLanes)!==0,mt||b){if(b=Ze,b!==null&&(c=pm(b,r),c!==0&&c!==T.retryLane))throw T.retryLane=c,Do(a,c),en(b,a,c),dh;Kh(_)||cc(),o=gh(a,o,r)}else Kh(_)?(o.flags|=192,o.child=a.child,o=null):(a=T.treeContext,nt=An(_.nextSibling),Dt=o,Ne=!0,La=null,_n=!1,a!==null&&dg(o,a),o=mh(o,c.children),o.flags|=4096);return o}return h?(za(),_=c.fallback,h=o.mode,T=a.child,j=T.sibling,c=oa(T,{mode:"hidden",children:c.children}),c.subtreeFlags=T.subtreeFlags&65011712,j!==null?_=oa(j,_):(_=Lo(_,h,r,null),_.flags|=2),_.return=o,c.return=o,c.sibling=_,o.child=c,sr(null,c),c=o.child,_=a.child.memoizedState,_===null?_=fh(r):(h=_.cachePool,h!==null?(T=ft._
vendor: 4,859 bytes, line 9
9currentValue,h=h.parent!==T?{parent:T,pool:T}:h):h=gg(),_={baseLanes:_.baseLanes|r,cachePool:h}),c.memoizedState=_,c.childLanes=ph(a,b,r),o.memoizedState=hh,sr(a.child,c)):(Ba(o),r=a.child,a=r.sibling,r=oa(r,{mode:"visible",children:c.children}),r.return=o,r.sibling=null,a!==null&&(b=o.deletions,b===null?(o.deletions=[a],o.flags|=16):b.push(a)),o.child=r,o.memoizedState=null,r)}function mh(a,o){return o=ec({mode:"visible",children:o},a.mode),o.return=a,a.child=o}function ec(a,o){return a=cn(22,a,null,o),a.lanes=0,a}function gh(a,o,r){return zo(o,a.child,null,r),a=mh(o,o.pendingProps.children),a.flags|=2,o.memoizedState=null,a}function Ey(a,o,r){a.lanes|=o;var c=a.alternate;c!==null&&(c.lanes|=o),Iu(a.return,o,r)}function yh(a,o,r,c,h,m){var b=a.memoizedState;b===null?a.memoizedState={isBackwards:o,rendering:null,renderingStartTime:0,last:c,tail:r,tailMode:h,treeForkCount:m}:(b.isBackwards=o,b.rendering=null,b.renderingStartTime=0,b.last=c,b.tail=r,b.tailMode=h,b.treeForkCount=m)}function Oy(a,o,r){var c=o.pendingProps,h=c.revealOrder,m=c.tail;c=c.children;var b=dt.current,_=(b&2)!==0;if(_?(b=b&1|2,o.flags|=128):b&=1,Q(dt,b),Nt(a,o,c,r),c=Ne?Vs:0,!_&&a!==null&&(a.flags&128)!==0)e:for(a=o.child;a!==null;){if(a.tag===13)a.memoizedState!==null&&Ey(a,r,o);else if(a.tag===19)Ey(a,r,o);else if(a.child!==null){a.child.return=a,a=a.child;continue}if(a===o)break e;for(;a.sibling===null;){if(a.return===null||a.return===o)break e;a=a.return}a.sibling.return=a.return,a=a.sibling}switch(h){case"forwards":for(r=o.child,h=null;r!==null;)a=r.alternate,a!==null&&zl(a)===null&&(h=r),r=r.sibling;r=h,r===null?(h=o.child,o.child=null):(h=r.sibling,r.sibling=null),yh(o,!1,h,r,m,c);break;case"backwards":case"unstable_legacy-backwards":for(r=null,h=o.child,o.child=null;h!==null;){if(a=h.alternate,a!==null&&zl(a)===null){o.child=h;break}a=h.sibling,h.sibling=r,r=h,h=a}yh(o,!0,r,null,m,c);break;case"together":yh(o,!1,null,null,void 0,c);break;default:o.memoizedState=null}return o.child}function da(a,o,r){if(a!==null&&(o.dependencies=a.dependencies),Wa|=o.lanes,(r&o.childLanes)===0)if(a!==null){if(Pi(a,o,r,!1),(r&o.childLanes)===0)return null}else return null;if(a!==null&&o.child!==a.child)throw Error(i(153));if(o.child!==null){for(a=o.child,r=oa(a,a.pendingProps),o.child=r,r.return=o;a.sibling!==null;)a=a.sibling,r=r.sibling=oa(a,a.pendingProps),r.return=o;r.sibling=null}return o.child}function bh(a,o){return(a.lanes&o)!==0?!0:(a=a.dependencies,!!(a!==null&&Dl(a)))}function sC(a,o,r){switch(o.tag){case 3:ot(o,o.stateNode.containerInfo),Ua(o,ft,a.memoizedState.cache),No();break;case 27:case 5:yn(o);break;case 4:ot(o,o.stateNode.containerInfo);break;case 10:Ua(o,o.type,o.memoizedProps.value);break;case 31:if(o.memoizedState!==null)return o.flags|=128,Hu(o),null;break;case 13:var c=o.memoizedState;if(c!==null)return c.dehydrated!==null?(Ba(o),o.flags|=128,null):(r&o.child.childLanes)!==0?Ry(a,o,r):(Ba(o),a=da(a,o,r),a!==null?a.sibling:null);Ba(o);break;case 19:var h=(a.flags&128)!==0;if(c=(r&o.childLanes)!==0,c||(Pi(a,o,r,!1),c=(r&o.childLanes)!==0),h){if(c)return Oy(a,o,r);o.flags|=128}if(h=o.memoizedState,h!==null&&(h.rendering=null,h.tail=null,h.lastEffect=null),Q(dt,dt.current),c)break;return null;case 22:return o.lanes=0,ky(a,o,r,o.pendingProps);case 24:Ua(o,ft,a.memoizedState.cache)}return da(a,o,r)}function Iy(a,o,r){if(a!==null)if(a.memoizedProps!==o.pendingProps)mt=!0;else{if(!bh(a,r)&&(o.flags&128)===0)return mt=!1,sC(a,o,r);mt=(a.flags&131072)!==0}else mt=!1,Ne&&(o.flags&1048576)!==0&&cg(o,Vs,o.index);switch(o.lanes=0,o.tag){case 16:e:{var c=o.pendingProps;if(a=qo(o.elementType),o.type=a,typeof a=="function")Su(a)?(c=Go(a,c),o.tag=1,o=Ay(null,o,a,c,r)):(o.tag=0,o=uh(null,o,a,c,r));else{if(a!=null){var h=a.$$typeof;if(h===D){o.tag=11,o=vy(null,o,a,c,r);break e}else if(h===N){o.tag=14,o=wy(null,o,a,c,r);break e}}throw o=tt(a)||a,Error(i(306,o,""))}}return o;case 0:return uh(a,o,o.type,o.pendingProps,r);case 1:return c=o.type,h=Go(c,o.pendingProps),Ay(a,o,c,h,r);case 3:e:{if(ot(o,o.stateNode.containerInfo),a===null)throw Error(i(387));c=o.pendingProps;var m=o.memoizedState;h=m.element,ju(a,o),tr(o,c,null,r);var b=o.memoizedState;if(c=b.cache,Ua(o,ft,c),c!==m.cache&&Mu(o,[ft],r,!0),er(),c=b.element,m.isDehydrated)if(m={element:c,isDehydrated:!1,cache:b.cache},o.updateQueue.baseState=m,o.memoizedState=m,o.flags&256){o=Ty(a,o,c,r);break e}else if(c!==h){h=xn(Error(i(424)),o),Ys(h),o=Ty(a,o,c,r);break e}else for(a=o.stateNode.containerInfo,a.nodeType===9?a=a.body:a=a.nodeName==="HTML"?a.ownerDocument.body:a,nt=An(a.firstChild),Dt=o,Ne=!0,La=null,_n=!0,r=kg(o,null,c,r),o.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(No(),c===h){o=da(a,o,r);break e}Nt(a,o,c,r)}o=o.child}return o;case 26:return Jl(a,o),a===null?(r=zb(o.type,null,o.pendingProps,null))?o.memoizedState=r:Ne||(r=o.type,a=o.pe
vendor: 4,257 bytes, line 9
9ndingProps,c=gc(fe.current).createElement(r),c[Pt]=o,c[Yt]=a,Ut(c,r,a),Tt(c),o.stateNode=c):o.memoizedState=zb(o.type,a.memoizedProps,o.pendingProps,a.memoizedState),null;case 27:return yn(o),a===null&&Ne&&(c=o.stateNode=Fb(o.type,o.pendingProps,fe.current),Dt=o,_n=!0,h=nt,Za(o.type)?(Qh=h,nt=An(c.firstChild)):nt=h),Nt(a,o,o.pendingProps.children,r),Jl(a,o),a===null&&(o.flags|=4194304),o.child;case 5:return a===null&&Ne&&((h=c=nt)&&(c=NC(c,o.type,o.pendingProps,_n),c!==null?(o.stateNode=c,Dt=o,nt=An(c.firstChild),_n=!1,h=!0):h=!1),h||Na(o)),yn(o),h=o.type,m=o.pendingProps,b=a!==null?a.memoizedProps:null,c=m.children,$h(h,m)?c=null:b!==null&&$h(h,b)&&(o.flags|=32),o.memoizedState!==null&&(h=Wu(a,o,Q_,null,null,r),xr._currentValue=h),Jl(a,o),Nt(a,o,c,r),o.child;case 6:return a===null&&Ne&&((a=r=nt)&&(r=UC(r,o.pendingProps,_n),r!==null?(o.stateNode=r,Dt=o,nt=null,a=!0):a=!1),a||Na(o)),null;case 13:return Ry(a,o,r);case 4:return ot(o,o.stateNode.containerInfo),c=o.pendingProps,a===null?o.child=zo(o,null,c,r):Nt(a,o,c,r),o.child;case 11:return vy(a,o,o.type,o.pendingProps,r);case 7:return Nt(a,o,o.pendingProps,r),o.child;case 8:return Nt(a,o,o.pendingProps.children,r),o.child;case 12:return Nt(a,o,o.pendingProps.children,r),o.child;case 10:return c=o.pendingProps,Ua(o,o.type,c.value),Nt(a,o,c.children,r),o.child;case 9:return h=o.type._context,c=o.pendingProps.children,jo(o),h=Lt(h),c=c(h),o.flags|=1,Nt(a,o,c,r),o.child;case 14:return wy(a,o,o.type,o.pendingProps,r);case 15:return xy(a,o,o.type,o.pendingProps,r);case 19:return Oy(a,o,r);case 31:return iC(a,o,r);case 22:return ky(a,o,r,o.pendingProps);case 24:return jo(o),c=Lt(ft),a===null?(h=Lu(),h===null&&(h=Ze,m=Pu(),h.pooledCache=m,m.refCount++,m!==null&&(h.pooledCacheLanes|=r),h=m),o.memoizedState={parent:c,cache:h},Uu(o),Ua(o,ft,h)):((a.lanes&r)!==0&&(ju(a,o),tr(o,null,null,r),er()),h=a.memoizedState,m=o.memoizedState,h.parent!==c?(h={parent:c,cache:c},o.memoizedState=h,o.lanes===0&&(o.memoizedState=o.updateQueue.baseState=h),Ua(o,ft,c)):(c=m.cache,Ua(o,ft,c),c!==h.cache&&Mu(o,[ft],r,!0))),Nt(a,o,o.pendingProps.children,r),o.child;case 29:throw o.pendingProps}throw Error(i(156,o.tag))}function ua(a){a.flags|=4}function vh(a,o,r,c,h){if((o=(a.mode&32)!==0)&&(o=!1),o){if(a.flags|=16777216,(h&335544128)===h)if(a.stateNode.complete)a.flags|=8192;else if(ob())a.flags|=8192;else throw Bo=jl,Nu}else a.flags&=-16777217}function My(a,o){if(o.type!=="stylesheet"||(o.state.loading&4)!==0)a.flags&=-16777217;else if(a.flags|=16777216,!Vb(o))if(ob())a.flags|=8192;else throw Bo=jl,Nu}function tc(a,o){o!==null&&(a.flags|=4),a.flags&16384&&(o=a.tag!==22?um():536870912,a.lanes|=o,Wi|=o)}function rr(a,o){if(!Ne)switch(a.tailMode){case"hidden":o=a.tail;for(var r=null;o!==null;)o.alternate!==null&&(r=o),o=o.sibling;r===null?a.tail=null:r.sibling=null;break;case"collapsed":r=a.tail;for(var c=null;r!==null;)r.alternate!==null&&(c=r),r=r.sibling;c===null?o||a.tail===null?a.tail=null:a.tail.sibling=null:c.sibling=null}}function at(a){var o=a.alternate!==null&&a.alternate.child===a.child,r=0,c=0;if(o)for(var h=a.child;h!==null;)r|=h.lanes|h.childLanes,c|=h.subtreeFlags&65011712,c|=h.flags&65011712,h.return=a,h=h.sibling;else for(h=a.child;h!==null;)r|=h.lanes|h.childLanes,c|=h.subtreeFlags,c|=h.flags,h.return=a,h=h.sibling;return a.subtreeFlags|=c,a.childLanes=r,o}function rC(a,o,r){var c=o.pendingProps;switch(Tu(o),o.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return at(o),null;case 1:return at(o),null;case 3:return r=o.stateNode,c=null,a!==null&&(c=a.memoizedState.cache),o.memoizedState.cache!==c&&(o.flags|=2048),ra(ft),ve(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(a===null||a.child===null)&&(Mi(o)?ua(o):a===null||a.memoizedState.isDehydrated&&(o.flags&256)===0||(o.flags|=1024,Eu())),at(o),null;case 26:var h=o.type,m=o.memoizedState;return a===null?(ua(o),m!==null?(at(o),My(o,m)):(at(o),vh(o,h,null,c,r))):m?m!==a.memoizedState?(ua(o),at(o),My(o,m)):(at(o),o.flags&=-16777217):(a=a.memoizedProps,a!==c&&ua(o),at(o),vh(o,h,a,c,r)),null;case 27:if(Vt(o),r=fe.current,h=o.type,a!==null&&o.stateNode!=null)a.memoizedProps!==c&&ua(o);else{if(!c){if(o.stateNode===null)throw Error(i(166));return at(o),null}
vendor: 6,389 bytes, line 9
9a=ee.current,Mi(o)?ug(o):(a=Fb(h,c,r),o.stateNode=a,ua(o))}return at(o),null;case 5:if(Vt(o),h=o.type,a!==null&&o.stateNode!=null)a.memoizedProps!==c&&ua(o);else{if(!c){if(o.stateNode===null)throw Error(i(166));return at(o),null}if(m=ee.current,Mi(o))ug(o);else{var b=gc(fe.current);switch(m){case 1:m=b.createElementNS("http://www.w3.org/2000/svg",h);break;case 2:m=b.createElementNS("http://www.w3.org/1998/Math/MathML",h);break;default:switch(h){case"svg":m=b.createElementNS("http://www.w3.org/2000/svg",h);break;case"math":m=b.createElementNS("http://www.w3.org/1998/Math/MathML",h);break;case"script":m=b.createElement("div"),m.innerHTML="<script><\/script>",m=m.removeChild(m.firstChild);break;case"select":m=typeof c.is=="string"?b.createElement("select",{is:c.is}):b.createElement("select"),c.multiple?m.multiple=!0:c.size&&(m.size=c.size);break;default:m=typeof c.is=="string"?b.createElement(h,{is:c.is}):b.createElement(h)}}m[Pt]=o,m[Yt]=c;e:for(b=o.child;b!==null;){if(b.tag===5||b.tag===6)m.appendChild(b.stateNode);else if(b.tag!==4&&b.tag!==27&&b.child!==null){b.child.return=b,b=b.child;continue}if(b===o)break e;for(;b.sibling===null;){if(b.return===null||b.return===o)break e;b=b.return}b.sibling.return=b.return,b=b.sibling}o.stateNode=m;e:switch(Ut(m,h,c),h){case"button":case"input":case"select":case"textarea":c=!!c.autoFocus;break e;case"img":c=!0;break e;default:c=!1}c&&ua(o)}}return at(o),vh(o,o.type,a===null?null:a.memoizedProps,o.pendingProps,r),null;case 6:if(a&&o.stateNode!=null)a.memoizedProps!==c&&ua(o);else{if(typeof c!="string"&&o.stateNode===null)throw Error(i(166));if(a=fe.current,Mi(o)){if(a=o.stateNode,r=o.memoizedProps,c=null,h=Dt,h!==null)switch(h.tag){case 27:case 5:c=h.memoizedProps}a[Pt]=o,a=!!(a.nodeValue===r||c!==null&&c.suppressHydrationWarning===!0||Rb(a.nodeValue,r)),a||Na(o,!0)}else a=gc(a).createTextNode(c),a[Pt]=o,o.stateNode=a}return at(o),null;case 31:if(r=o.memoizedState,a===null||a.memoizedState!==null){if(c=Mi(o),r!==null){if(a===null){if(!c)throw Error(i(318));if(a=o.memoizedState,a=a!==null?a.dehydrated:null,!a)throw Error(i(557));a[Pt]=o}else No(),(o.flags&128)===0&&(o.memoizedState=null),o.flags|=4;at(o),a=!1}else r=Eu(),a!==null&&a.memoizedState!==null&&(a.memoizedState.hydrationErrors=r),a=!0;if(!a)return o.flags&256?(un(o),o):(un(o),null);if((o.flags&128)!==0)throw Error(i(558))}return at(o),null;case 13:if(c=o.memoizedState,a===null||a.memoizedState!==null&&a.memoizedState.dehydrated!==null){if(h=Mi(o),c!==null&&c.dehydrated!==null){if(a===null){if(!h)throw Error(i(318));if(h=o.memoizedState,h=h!==null?h.dehydrated:null,!h)throw Error(i(317));h[Pt]=o}else No(),(o.flags&128)===0&&(o.memoizedState=null),o.flags|=4;at(o),h=!1}else h=Eu(),a!==null&&a.memoizedState!==null&&(a.memoizedState.hydrationErrors=h),h=!0;if(!h)return o.flags&256?(un(o),o):(un(o),null)}return un(o),(o.flags&128)!==0?(o.lanes=r,o):(r=c!==null,a=a!==null&&a.memoizedState!==null,r&&(c=o.child,h=null,c.alternate!==null&&c.alternate.memoizedState!==null&&c.alternate.memoizedState.cachePool!==null&&(h=c.alternate.memoizedState.cachePool.pool),m=null,c.memoizedState!==null&&c.memoizedState.cachePool!==null&&(m=c.memoizedState.cachePool.pool),m!==h&&(c.flags|=2048)),r!==a&&r&&(o.child.flags|=8192),tc(o,o.updateQueue),at(o),null);case 4:return ve(),a===null&&Bh(o.stateNode.containerInfo),at(o),null;case 10:return ra(o.type),at(o),null;case 19:if(V(dt),c=o.memoizedState,c===null)return at(o),null;if(h=(o.flags&128)!==0,m=c.rendering,m===null)if(h)rr(c,!1);else{if(lt!==0||a!==null&&(a.flags&128)!==0)for(a=o.child;a!==null;){if(m=zl(a),m!==null){for(o.flags|=128,rr(c,!1),a=m.updateQueue,o.updateQueue=a,tc(o,a),o.subtreeFlags=0,a=r,r=o.child;r!==null;)sg(r,a),r=r.sibling;return Q(dt,dt.current&1|2),Ne&&ia(o,c.treeForkCount),o.child}a=a.sibling}c.tail!==null&&Ft()>sc&&(o.flags|=128,h=!0,rr(c,!1),o.lanes=4194304)}else{if(!h)if(a=zl(m),a!==null){if(o.flags|=128,h=!0,a=a.updateQueue,o.updateQueue=a,tc(o,a),rr(c,!0),c.tail===null&&c.tailMode==="hidden"&&!m.alternate&&!Ne)return at(o),null}else 2*Ft()-c.renderingStartTime>sc&&r!==536870912&&(o.flags|=128,h=!0,rr(c,!1),o.lanes=4194304);c.isBackwards?(m.sibling=o.child,o.child=m):(a=c.last,a!==null?a.sibling=m:o.child=m,c.last=m)}return c.tail!==null?(a=c.tail,c.rendering=a,c.tail=a.sibling,c.renderingStartTime=Ft(),a.sibling=null,r=dt.current,Q(dt,h?r&1|2:r&1),Ne&&ia(o,c.treeForkCount),a):(at(o),null);case 22:case 23:return un(o),zu(),c=o.memoizedState!==null,a!==null?a.memoizedState!==null!==c&&(o.flags|=8192):c&&(o.flags|=8192),c?(r&536870912)!==0&&(o.flags&128)===0&&(at(o),o.subtreeFlags&6&&(o.flags|=8192)):at(o),r=o.updateQueue,r!==null&&tc(o,r.retryQueue),r=null,a!==null&&a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(r=a.memoizedState.cachePool.pool),c=null,o.memoizedState!==null&&o.memoizedState.cachePool!==null&&(c=o.memoizedState.cachePool.pool),c!==r&&(o.flags|=2048),a!==null&&V(Fo),null;case 24:return r=null,a!==null&&(r=a.memoizedState.cache),o.memoizedState.cache!==r&&(o.flags|=2048),ra(ft),at(o),null;case 25:return null;case 30:return null}throw Error(i(156,o.tag))}function lC(a,o){switch(Tu(o),o.tag){case 1:return a=o.flags,a&65536?(o.flags=a&-65537|128,o):null;case 3:return ra(ft),ve(),a=o.flags,(a&65536)!==0&&(a&128)===0?(o.flags=a&-65537|128,o):null;case 26:case 27:case 5:return Vt(o),null;case 31:if(o.memoizedState!==null){if(un(o),o.alternate===null)throw Error(i(340));No()}return a=o.flags,a&65536?(o.flags=a&-65537|128,o):null;case 13:if(un(o),a=o.memoizedState,a!==null&&a.dehydrated!==null){if(o.alternate===null)throw Error(i(340));No()}return a=o.flags,a&65536?(o.flags=a&-65537|128,o):null;case 19:return V(dt),null;case 4:return ve(),null;case 10:return ra(o.type),null;case 22:case 23:return un(o),zu(),a!==null&&V(Fo),a=o.flags,a&65536?(o.flags=a&-65537|128,o):null;case 24:return ra(ft),null;case 25:return null;default:return null}}function Py(a,o){switch(Tu(o),o.tag){case 3:ra(ft),ve();break;case 26:case 27:case 5:Vt(o);break;case 4:ve();break;case 31:o.memoizedState!==null&&un(o);break;case 13:un(o);break;case 19:V(dt);break;case 10:ra(o.type);break;case 22:case 23:un(o),zu(),a!==null&&V(Fo);break;case 24:ra(ft)}}function lr(a,o){try{var r=o.updateQueue,c=r!==null?r.lastEffect:null;if(c!==null){var h=c.next;r=h;do{if((r.tag&a)===a){c=void 0;var m=r.create,b=r.inst;c=m(),b.destroy=c}r=r.next}
vendor: 21,125 bytes, line 9
9while(r!==h)}}catch(_){$e(o,o.return,_)}}function Ha(a,o,r){try{var c=o.updateQueue,h=c!==null?c.lastEffect:null;if(h!==null){var m=h.next;c=m;do{if((c.tag&a)===a){var b=c.inst,_=b.destroy;if(_!==void 0){b.destroy=void 0,h=o;var T=r,j=_;try{j()}catch(H){$e(h,T,H)}}}c=c.next}while(c!==m)}}catch(H){$e(o,o.return,H)}}function Dy(a){var o=a.updateQueue;if(o!==null){var r=a.stateNode;try{_g(o,r)}catch(c){$e(a,a.return,c)}}}function Ly(a,o,r){r.props=Go(a.type,a.memoizedProps),r.state=a.memoizedState;try{r.componentWillUnmount()}catch(c){$e(a,o,c)}}function cr(a,o){try{var r=a.ref;if(r!==null){switch(a.tag){case 26:case 27:case 5:var c=a.stateNode;break;case 30:c=a.stateNode;break;default:c=a.stateNode}typeof r=="function"?a.refCleanup=r(c):r.current=c}}catch(h){$e(a,o,h)}}function zn(a,o){var r=a.ref,c=a.refCleanup;if(r!==null)if(typeof c=="function")try{c()}catch(h){$e(a,o,h)}finally{a.refCleanup=null,a=a.alternate,a!=null&&(a.refCleanup=null)}else if(typeof r=="function")try{r(null)}catch(h){$e(a,o,h)}else r.current=null}function Ny(a){var o=a.type,r=a.memoizedProps,c=a.stateNode;try{e:switch(o){case"button":case"input":case"select":case"textarea":r.autoFocus&&c.focus();break e;case"img":r.src?c.src=r.src:r.srcSet&&(c.srcset=r.srcSet)}}catch(h){$e(a,a.return,h)}}function wh(a,o,r){try{var c=a.stateNode;OC(c,a.type,r,o),c[Yt]=o}catch(h){$e(a,a.return,h)}}function Uy(a){return a.tag===5||a.tag===3||a.tag===26||a.tag===27&&Za(a.type)||a.tag===4}function xh(a){e:for(;;){for(;a.sibling===null;){if(a.return===null||Uy(a.return))return null;a=a.return}for(a.sibling.return=a.return,a=a.sibling;a.tag!==5&&a.tag!==6&&a.tag!==18;){if(a.tag===27&&Za(a.type)||a.flags&2||a.child===null||a.tag===4)continue e;a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}function kh(a,o,r){var c=a.tag;if(c===5||c===6)a=a.stateNode,o?(r.nodeType===9?r.body:r.nodeName==="HTML"?r.ownerDocument.body:r).insertBefore(a,o):(o=r.nodeType===9?r.body:r.nodeName==="HTML"?r.ownerDocument.body:r,o.appendChild(a),r=r._reactRootContainer,r!=null||o.onclick!==null||(o.onclick=na));else if(c!==4&&(c===27&&Za(a.type)&&(r=a.stateNode,o=null),a=a.child,a!==null))for(kh(a,o,r),a=a.sibling;a!==null;)kh(a,o,r),a=a.sibling}function nc(a,o,r){var c=a.tag;if(c===5||c===6)a=a.stateNode,o?r.insertBefore(a,o):r.appendChild(a);else if(c!==4&&(c===27&&Za(a.type)&&(r=a.stateNode),a=a.child,a!==null))for(nc(a,o,r),a=a.sibling;a!==null;)nc(a,o,r),a=a.sibling}function jy(a){var o=a.stateNode,r=a.memoizedProps;try{for(var c=a.type,h=o.attributes;h.length;)o.removeAttributeNode(h[0]);Ut(o,c,r),o[Pt]=a,o[Yt]=r}catch(m){$e(a,a.return,m)}}var ha=!1,gt=!1,Sh=!1,Fy=typeof WeakSet=="function"?WeakSet:Set,Rt=null;function cC(a,o){if(a=a.containerInfo,Gh=Sc,a=Qm(a),gu(a)){if("selectionStart"in a)var r={start:a.selectionStart,end:a.selectionEnd};else e:{r=(r=a.ownerDocument)&&r.defaultView||window;var c=r.getSelection&&r.getSelection();if(c&&c.rangeCount!==0){r=c.anchorNode;var h=c.anchorOffset,m=c.focusNode;c=c.focusOffset;try{r.nodeType,m.nodeType}catch{r=null;break e}var b=0,_=-1,T=-1,j=0,H=0,Y=a,F=null;t:for(;;){for(var B;Y!==r||h!==0&&Y.nodeType!==3||(_=b+h),Y!==m||c!==0&&Y.nodeType!==3||(T=b+c),Y.nodeType===3&&(b+=Y.nodeValue.length),(B=Y.firstChild)!==null;)F=Y,Y=B;for(;;){if(Y===a)break t;if(F===r&&++j===h&&(_=b),F===m&&++H===c&&(T=b),(B=Y.nextSibling)!==null)break;Y=F,F=Y.parentNode}Y=B}r=_===-1||T===-1?null:{start:_,end:T}}else r=null}r=r||{start:0,end:0}}else r=null;for(Wh={focusedElem:a,selectionRange:r},Sc=!1,Rt=o;Rt!==null;)if(o=Rt,a=o.child,(o.subtreeFlags&1028)!==0&&a!==null)a.return=o,Rt=a;else for(;Rt!==null;){switch(o=Rt,m=o.alternate,a=o.flags,o.tag){case 0:if((a&4)!==0&&(a=o.updateQueue,a=a!==null?a.events:null,a!==null))for(r=0;r<a.length;r++)h=a[r],h.ref.impl=h.nextImpl;break;case 11:case 15:break;case 1:if((a&1024)!==0&&m!==null){a=void 0,r=o,h=m.memoizedProps,m=m.memoizedState,c=r.stateNode;try{var ie=Go(r.type,h);a=c.getSnapshotBeforeUpdate(ie,m),c.__reactInternalSnapshotBeforeUpdate=a}catch(me){$e(r,r.return,me)}}break;case 3:if((a&1024)!==0){if(a=o.stateNode.containerInfo,r=a.nodeType,r===9)Yh(a);else if(r===1)switch(a.nodeName){case"HEAD":case"HTML":case"BODY":Yh(a);break;default:a.textContent=""}}break;case 5:case 26:case 27:case 6:case 4:case 17:break;default:if((a&1024)!==0)throw Error(i(163))}if(a=o.sibling,a!==null){a.return=o.return,Rt=a;break}Rt=o.return}}function qy(a,o,r){var c=r.flags;switch(r.tag){case 0:case 11:case 15:pa(a,r),c&4&&lr(5,r);break;case 1:if(pa(a,r),c&4)if(a=r.stateNode,o===null)try{a.componentDidMount()}catch(b){$e(r,r.return,b)}else{var h=Go(r.type,o.memoizedProps);o=o.memoizedState;try{a.componentDidUpdate(h,o,a.__reactInternalSnapshotBeforeUpdate)}catch(b){$e(r,r.return,b)}}c&64&&Dy(r),c&512&&cr(r,r.return);break;case 3:if(pa(a,r),c&64&&(a=r.updateQueue,a!==null)){if(o=null,r.child!==null)switch(r.child.tag){case 27:case 5:o=r.child.stateNode;break;case 1:o=r.child.stateNode}try{_g(a,o)}catch(b){$e(r,r.return,b)}}break;case 27:o===null&&c&4&&jy(r);case 26:case 5:pa(a,r),o===null&&c&4&&Ny(r),c&512&&cr(r,r.return);break;case 12:pa(a,r);break;case 31:pa(a,r),c&4&&Hy(a,r);break;case 13:pa(a,r),c&4&&Gy(a,r),c&64&&(a=r.memoizedState,a!==null&&(a=a.dehydrated,a!==null&&(r=bC.bind(null,r),jC(a,r))));break;case 22:if(c=r.memoizedState!==null||ha,!c){o=o!==null&&o.memoizedState!==null||gt,h=ha;var m=gt;ha=c,(gt=o)&&!m?ma(a,r,(r.subtreeFlags&8772)!==0):pa(a,r),ha=h,gt=m}break;case 30:break;default:pa(a,r)}}function By(a){var o=a.alternate;o!==null&&(a.alternate=null,By(o)),a.child=null,a.deletions=null,a.sibling=null,a.tag===5&&(o=a.stateNode,o!==null&&Jd(o)),a.stateNode=null,a.return=null,a.dependencies=null,a.memoizedProps=null,a.memoizedState=null,a.pendingProps=null,a.stateNode=null,a.updateQueue=null}var it=null,Zt=!1;function fa(a,o,r){for(r=r.child;r!==null;)zy(a,o,r),r=r.sibling}function zy(a,o,r){if(sn&&typeof sn.onCommitFiberUnmount=="function")try{sn.onCommitFiberUnmount(Ps,r)}catch{}switch(r.tag){case 26:gt||zn(r,o),fa(a,o,r),r.memoizedState?r.memoizedState.count--:r.stateNode&&(r=r.stateNode,r.parentNode.removeChild(r));break;case 27:gt||zn(r,o);var c=it,h=Zt;Za(r.type)&&(it=r.stateNode,Zt=!1),fa(a,o,r),br(r.stateNode),it=c,Zt=h;break;case 5:gt||zn(r,o);case 6:if(c=it,h=Zt,it=null,fa(a,o,r),it=c,Zt=h,it!==null)if(Zt)try{(it.nodeType===9?it.body:it.nodeName==="HTML"?it.ownerDocument.body:it).removeChild(r.stateNode)}catch(m){$e(r,o,m)}else try{it.removeChild(r.stateNode)}catch(m){$e(r,o,m)}break;case 18:it!==null&&(Zt?(a=it,Db(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,r.stateNode),Ji(a)):Db(it,r.stateNode));break;case 4:c=it,h=Zt,it=r.stateNode.containerInfo,Zt=!0,fa(a,o,r),it=c,Zt=h;break;case 0:case 11:case 14:case 15:Ha(2,r,o),gt||Ha(4,r,o),fa(a,o,r);break;case 1:gt||(zn(r,o),c=r.stateNode,typeof c.componentWillUnmount=="function"&&Ly(r,o,c)),fa(a,o,r);break;case 21:fa(a,o,r);break;case 22:gt=(c=gt)||r.memoizedState!==null,fa(a,o,r),gt=c;break;default:fa(a,o,r)}}function Hy(a,o){if(o.memoizedState===null&&(a=o.alternate,a!==null&&(a=a.memoizedState,a!==null))){a=a.dehydrated;try{Ji(a)}catch(r){$e(o,o.return,r)}}}function Gy(a,o){if(o.memoizedState===null&&(a=o.alternate,a!==null&&(a=a.memoizedState,a!==null&&(a=a.dehydrated,a!==null))))try{Ji(a)}catch(r){$e(o,o.return,r)}}function dC(a){switch(a.tag){case 31:case 13:case 19:var o=a.stateNode;return o===null&&(o=a.stateNode=new Fy),o;case 22:return a=a.stateNode,o=a._retryCache,o===null&&(o=a._retryCache=new Fy),o;default:throw Error(i(435,a.tag))}}function ac(a,o){var r=dC(a);o.forEach(function(c){if(!r.has(c)){r.add(c);var h=vC.bind(null,a,c);c.then(h,h)}})}function Qt(a,o){var r=o.deletions;if(r!==null)for(var c=0;c<r.length;c++){var h=r[c],m=a,b=o,_=b;e:for(;_!==null;){switch(_.tag){case 27:if(Za(_.type)){it=_.stateNode,Zt=!1;break e}break;case 5:it=_.stateNode,Zt=!1;break e;case 3:case 4:it=_.stateNode.containerInfo,Zt=!0;break e}_=_.return}if(it===null)throw Error(i(160));zy(m,b,h),it=null,Zt=!1,m=h.alternate,m!==null&&(m.return=null),h.return=null}if(o.subtreeFlags&13886)for(o=o.child;o!==null;)Wy(o,a),o=o.sibling}var Mn=null;function Wy(a,o){var r=a.alternate,c=a.flags;switch(a.tag){case 0:case 11:case 14:case 15:Qt(o,a),Xt(a),c&4&&(Ha(3,a,a.return),lr(3,a),Ha(5,a,a.return));break;case 1:Qt(o,a),Xt(a),c&512&&(gt||r===null||zn(r,r.return)),c&64&&ha&&(a=a.updateQueue,a!==null&&(c=a.callbacks,c!==null&&(r=a.shared.hiddenCallbacks,a.shared.hiddenCallbacks=r===null?c:r.concat(c))));break;case 26:var h=Mn;if(Qt(o,a),Xt(a),c&512&&(gt||r===null||zn(r,r.return)),c&4){var m=r!==null?r.memoizedState:null;if(c=a.memoizedState,r===null)if(c===null)if(a.stateNode===null){e:{c=a.type,r=a.memoizedProps,h=h.ownerDocument||h;t:switch(c){case"title":m=h.getElementsByTagName("title")[0],(!m||m[Ns]||m[Pt]||m.namespaceURI==="http://www.w3.org/2000/svg"||m.hasAttribute("itemprop"))&&(m=h.createElement(c),h.head.insertBefore(m,h.querySelector("head > title"))),Ut(m,c,r),m[Pt]=a,Tt(m),c=m;break e;case"link":var b=Wb("link","href",h).get(c+(r.href||""));if(b){for(var _=0;_<b.length;_++)if(m=b[_],m.getAttribute("href")===(r.href==null||r.href===""?null:r.href)&&m.getAttribute("rel")===(r.rel==null?null:r.rel)&&m.getAttribute("title")===(r.title==null?null:r.title)&&m.getAttribute("crossorigin")===(r.crossOrigin==null?null:r.crossOrigin)){b.splice(_,1);break t}}m=h.createElement(c),Ut(m,c,r),h.head.appendChild(m);break;case"meta":if(b=Wb("meta","content",h).get(c+(r.content||""))){for(_=0;_<b.length;_++)if(m=b[_],m.getAttribute("content")===(r.content==null?null:""+r.content)&&m.getAttribute("name")===(r.name==null?null:r.name)&&m.getAttribute("property")===(r.property==null?null:r.property)&&m.getAttribute("http-equiv")===(r.httpEquiv==null?null:r.httpEquiv)&&m.getAttribute("charset")===(r.charSet==null?null:r.charSet)){b.splice(_,1);break t}}m=h.createElement(c),Ut(m,c,r),h.head.appendChild(m);break;default:throw Error(i(468,c))}m[Pt]=a,Tt(m),c=m}a.stateNode=c}else $b(h,a.type,a.stateNode);else a.stateNode=Gb(h,c,a.memoizedProps);else m!==c?(m===null?r.stateNode!==null&&(r=r.stateNode,r.parentNode.removeChild(r)):m.count--,c===null?$b(h,a.type,a.stateNode):Gb(h,c,a.memoizedProps)):c===null&&a.stateNode!==null&&wh(a,a.memoizedProps,r.memoizedProps)}break;case 27:Qt(o,a),Xt(a),c&512&&(gt||r===null||zn(r,r.return)),r!==null&&c&4&&wh(a,a.memoizedProps,r.memoizedProps);break;case 5:if(Qt(o,a),Xt(a),c&512&&(gt||r===null||zn(r,r.return)),a.flags&32){h=a.stateNode;try{ki(h,"")}catch(ie){$e(a,a.return,ie)}}c&4&&a.stateNode!=null&&(h=a.memoizedProps,wh(a,h,r!==null?r.memoizedProps:h)),c&1024&&(Sh=!0);break;case 6:if(Qt(o,a),Xt(a),c&4){if(a.stateNode===null)throw Error(i(162));c=a.memoizedProps,r=a.stateNode;try{r.nodeValue=c}catch(ie){$e(a,a.return,ie)}}break;case 3:if(vc=null,h=Mn,Mn=yc(o.containerInfo),Qt(o,a),Mn=h,Xt(a),c&4&&r!==null&&r.memoizedState.isDehydrated)try{Ji(o.containerInfo)}catch(ie){$e(a,a.return,ie)}Sh&&(Sh=!1,$y(a));break;case 4:c=Mn,Mn=yc(a.stateNode.containerInfo),Qt(o,a),Xt(a),Mn=c;break;case 12:Qt(o,a),Xt(a);break;case 31:Qt(o,a),Xt(a),c&4&&(c=a.updateQueue,c!==null&&(a.updateQueue=null,ac(a,c)));break;case 13:Qt(o,a),Xt(a),a.child.flags&8192&&a.memoizedState!==null!=(r!==null&&r.memoizedState!==null)&&(ic=Ft()),c&4&&(c=a.updateQueue,c!==null&&(a.updateQueue=null,ac(a,c)));break;case 22:h=a.memoizedState!==null;var T=r!==null&&r.memoizedState!==null,j=ha,H=gt;if(ha=j||h,gt=H||T,Qt(o,a),gt=H,ha=j,Xt(a),c&8192)e:for(o=a.stateNode,o._visibility=h?o._visibility&-2:o._visibility|1,h&&(r===null||T||ha||gt||Wo(a)),r=null,o=a;;){if(o.tag===5||o.tag===26){if(r===null){T=r=o;try{if(m=T.stateNode,h)b=m.style,typeof b.setProperty=="function"?b.setProperty("display","none","important"):b.display="none";else{_=T.stateNode;var Y=T.memoizedProps.style,F=Y!=null&&Y.hasOwnProperty("display")?Y.display:null;_.style.display=F==null||typeof F=="boolean"?"":(""+F).trim()}}catch(ie){$e(T,T.return,ie)}}}else if(o.tag===6){if(r===null){T=o;try{T.stateNode.nodeValue=h?"":T.memoizedProps}catch(ie){$e(T,T.return,ie)}}}else if(o.tag===18){if(r===null){T=o;try{var B=T.stateNode;h?Lb(B,!0):Lb(T.stateNode,!1)}catch(ie){$e(T,T.return,ie)}}}else if((o.tag!==22&&o.tag!==23||o.memoizedState===null||o===a)&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===a)break e;for(;o.sibling===null;){if(o.return===null||o.return===a)break e;r===o&&(r=null),o=o.return}r===o&&(r=null),o.sibling.return=o.return,o=o.sibling}c&4&&(c=a.updateQueue,c!==null&&(r=c.retryQueue,r!==null&&(c.retryQueue=null,ac(a,r))));break;case 19:Qt(o,a),Xt(a),c&4&&(c=a.updateQueue,c!==null&&(a.updateQueue=null,ac(a,c)));break;case 30:break;case 21:break;default:Qt(o,a),Xt(a)}}function Xt(a){var o=a.flags;if(o&2){try{for(var r,c=a.return;c!==null;){if(Uy(c)){r=c;break}c=c.return}if(r==null)throw Error(i(160));switch(r.tag){case 27:var h=r.stateNode,m=xh(a);nc(a,m,h);break;case 5:var b=r.stateNode;r.flags&32&&(ki(b,""),r.flags&=-33);var _=xh(a);nc(a,_,b);break;case 3:case 4:var T=r.stateNode.containerInfo,j=xh(a);kh(a,j,T);break;default:throw Error(i(161))}}catch(H){$e(a,a.return,H)}a.flags&=-3}o&4096&&(a.flags&=-4097)}function $y(a){if(a.subtreeFlags&1024)for(a=a.child;a!==null;){var o=a;$y(o),o.tag===5&&o.flags&1024&&o.stateNode.reset(),a=a.sibling}}function pa(a,o){if(o.subtreeFlags&8772)for(o=o.child;o!==null;)qy(a,o.alternate,o),o=o.sibling}function Wo(a){for(a=a.child;a!==null;){var o=a;switch(o.tag){case 0:case 11:case 14:case 15:Ha(4,o,o.return),Wo(o);break;case 1:zn(o,o.return);var r=o.stateNode;typeof r.componentWillUnmount=="function"&&Ly(o,o.return,r),Wo(o);break;case 27:br(o.stateNode);case 26:case 5:zn(o,o.return),Wo(o);break;case 22:o.memoizedState===null&&Wo(o);break;case 30:Wo(o);break;default:Wo(o)}a=a.sibling}}function ma(a,o,r){for(r=r&&(o.subtreeFlags&8772)!==0,o=o.child;o!==null;){var c=o.alternate,h=a,m=o,b=m.flags;switch(m.tag){case 0:case 11:case 15:ma(h,m,r),lr(4,m);break;case 1:if(ma(h,m,r),c=m,h=c.stateNode,typeof h.componentDidMount=="function")try{h.componentDidMount()}catch(j){$e(c,c.return,j)}if(c=m,h=c.updateQueue,h!==null){var _=c.stateNode;try{var T=h.shared.hiddenCallbacks;if(T!==null)for(h.shared.hiddenCallbacks=null,h=0;h<T.length;h++)Sg(T[h],_)}catch(j){$e(c,c.return,j)}}r&&b&64&&Dy(m),cr(m,m.return);break;case 27:jy(m);case 26:case 5:ma(h,m,r),r&&c===null&&b&4&&Ny(m),cr(m,m.return);break;case 12:ma(h,m,r);break;case 31:ma(h,m,r),r&&b&4&&Hy(h,m);break;case 13:ma(h,m,r),r&&b&4&&Gy(h,m);break;case 22:m.memoizedState===null&&ma(h,m,r),cr(m,m.return);break;case 30:break;default:ma(h,m,r)}o=o.sibling}}function _h(a,o){var r=null;a!==null&&a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(r=a.memoizedState.cachePool.pool),a=null,o.memoizedState!==null&&o.memoizedState.cachePool!==null&&(a=o.memoizedState.cachePool.pool),a!==r&&(a!=null&&a.refCount++,r!=null&&Ks(r))}function Ch(a,o){a=null,o.alternate!==null&&(a=o.alternate.memoizedState.cache),o=o.memoizedState.cache,o!==a&&(o.refCount++,a!=null&&Ks(a))}function Pn(a,o,r,c){if(o.subtreeFlags&10256)for(o=o.child;o!==null;)Vy(a,o,r,c),o=o.sibling}function Vy(a,o,r,c){var h=o.flags;switch(o.tag){case 0:case 11:case 15:Pn(a,o,r,c),h&2048&&lr(9,o);break;case 1:Pn(a,o,r,c);break;case 3:Pn(a,o,r,c),h&2048&&(a=null,o.alternate!==null&&(a=o.alternate.memoizedState.cache),o=o.memoizedState.cache,o!==a&&(o.refCount++,a!=null&&Ks(a)));break;case 12:if(h&2048){Pn(a,o,r,c),a=o.stateNode;try{var m=o.memoizedProps,b=m.id,_=m.onPostCommit;typeof _=="function"&&_(b,o.alternate===null?"mount":"update",a.passiveEffectDuration,-0)}catch(T){$e(o,o.return,T)}}else Pn(a,o,r,c);break;case 31:Pn(a,o,r,c);break;case 13:Pn(a,o,r,c);break;case 23:break;case 22:m=o.stateNode,b=o.alternate,o.memoizedState!==null?m._visibility&2?Pn(a,o,r,c):dr(a,o):m._visibility&2?Pn(a,o,r,c):(m._visibility|=2,zi(a,o,r,c,(o.subtreeFlags&10256)!==0||!1)),h&2048&&_h(b,o);break;case 24:Pn(a,o,r,c),h&2048&&Ch(o.alternate,o);break;default:Pn(a,o,r,c)}}function zi(a,o,r,c,h){for(h=h&&((o.subtreeFlags&10256)!==0||!1),o=o.child;o!==null;){var m=a,b=o,_=r,T=c,j=b.flags;switch(b.tag){case 0:case 11:case 15:zi(m,b,_,T,h),lr(8,b);break;case 23:break;case 22:var H=b.stateNode;b.memoizedState!==null?H._visibility&2?zi(m,b,_,T,h):dr(m,b):(H._visibility|=2,zi(m,b,_,T,h)),h&&j&2048&&_h(b.alternate,b);break;case 24:zi(m,b,_,T,h),h&&j&2048&&Ch(b.alternate,b);break;default:zi(m,b,_,T,h)}o=o.sibling}}function dr(a,o){if(o.subtreeFlags&10256)for(o=o.child;o!==null;){var r=a,c=o,h=c.flags;switch(c.tag){case 22:dr(r,c),h&2048&&_h(c.alternate,c);break;case 24:dr(r,c),h&2048&&Ch(c.alternate,c);break;default:dr(r,c)}o=o.sibling}}var ur=8192;function Hi(a,o,r){if(a.subtreeFlags&ur)for(a=a.child;a!==null;)Yy(a,o,r),a=a.sibling}function Yy(a,o,r){switch(a.tag){case 26:Hi(a,o,r),a.flags&ur&&a.memoizedState!==null&&ZC(r,Mn,a.memoizedState,a.memoizedProps);break;case 5:Hi(a,o,r);break;case 3:case 4:var c=Mn;Mn=yc(a.stateNode.containerInfo),Hi(a,o,r),Mn=c;break;case 22:a.memoizedState===null&&(c=a.alternate,c!==null&&c.memoizedState!==null?(c=ur,ur=16777216,Hi(a,o,r),ur=c):Hi(a,o,r));break;default:Hi(a,o,r)}}function Ky(a){var o=a.alternate;if(o!==null&&(a=o.child,a!==null)){o.child=null;do o=a.sibling,a.sibling=null,a=o;while(a!==null)}}function hr(a){var o=a.deletions;if((a.flags&16)!==0){if(o!==null)for(var r=0;r<o.length;r++){var c=o[r];Rt=c,Qy(c,a)}Ky(a)}if(a.subtreeFlags&10256)for(a=a.child;a!==null;)Zy(a),a=a.sibling}function Zy(a){switch(a.tag){case 0:case 11:case 15:hr(a),a.flags&2048&&Ha(9,a,a.return);break;case 3:hr(a);break;case 12:hr(a);break;case 22:var o=a.stateNode;a.memoizedState!==null&&o._visibility&2&&(a.return===null||a.return.tag!==13)?(o._visibility&=-3,oc(a)):hr(a);break;default:hr(a)}}function oc(a){var o=a.deletions;if((a.flags&16)!==0){if(o!==null)for(var r=0;r<o.length;r++){var c=o[r];Rt=c,Qy(c,a)}Ky(a)}for(a=a.child;a!==null;){switch(o=a,o.tag){case 0:case 11:case 15:Ha(8,o,o.return),oc(o);break;case 22:r=o.stateNode,r._visibility&2&&(r._visibility&=-3,oc(o));break;default:oc(o)}a=a.sibling}}function Qy(a,o){for(;Rt!==null;){var r=Rt;switch(r.tag){case 0:case 11:case 15:Ha(8,r,o);break;case 23:case 22:if(r.memoizedState!==null&&r.memoizedState.cachePool!==null){var c=r.memoizedState.cachePool.pool;c!=null&&c.refCount++}break;case 24:Ks(r.memoizedState.cache)}if(c=r.child,c!==null)c.return=r,Rt=c;else e:for(r=a;Rt!==null;){c=Rt;var h=c.sibling,m=c.return;if(By(c),c===r){Rt=null;break e}if(h!==null){h.return=m,Rt=h;break e}Rt=m}}}var uC={getCacheForType:function(a){var o=Lt(ft),r=o.data.get(a);return r===void 0&&(r=a(),o.data.set(a,r)),r},cacheSignal:function(){return Lt(ft).controller.signal}},hC=typeof WeakMap=="function"?WeakMap:Map,Ge=0,Ze=null,Oe=null,Pe=0,We=0,hn=null,Ga=!1,Gi=!1,Ah=!1,ga=0,lt=0,Wa=0,$o=0,Th=0,fn=0,Wi=0,fr=null,Jt=null,Rh=!1,ic=0,Xy=0,sc=1/0,rc=null,$a=null,kt=0,Va=null,$i=null,ya=0,Eh=0,Oh=null,Jy=null,pr=0,Ih=null;function pn(){return(Ge&2)!==0&&Pe!==0?Pe&-Pe:q.T!==null?Uh():mm()}function eb(){if(fn===0)if((Pe&536870912)===0||Ne){var a=ml;ml<<=1,(ml&3932160)===0&&(ml=262144),fn=a}else fn=536870912;return a=dn.current,a!==null&&(a.flags|=32),fn}function en(a,o,r){(a===Ze&&(We===2||We===9)||a.cancelPendingCommit!==null)&&(Vi(a,0),Ya(a,Pe,fn,!1)),Ls(a,r),((Ge&2)===0||a!==Ze)&&(a===Ze&&((Ge&2)===0&&($o|=r),lt===4&&Ya(a,Pe,fn,!1)),Hn(a))}function tb(a,o,r){if((Ge&6)!==0)throw Error(i(327));var c=!r&&(o&127)===0&&(o&a.expiredLanes)===0||Ds(a,o),h=c?mC(a,o):Ph(a,o,!0),m=c;do{if(h===0){Gi&&!c&&Ya(a,o,0,!1);break}else{if(r=a.current.alternate,m&&!fC(r)){h=Ph(a,o,!1),m=!1;continue}if(h===2){if(m=o,a.errorRecoveryDisabledLanes&m)var b=0;else b=a.pendingLanes&-536870913,b=b!==0?b:b&536870912?536870912:0;if(b!==0){o=b;e:{var _=a;h=fr;var T=_.current.memoizedState.isDehydrated;if(T&&(Vi(_,b).flags|=256),b=Ph(_,b,!1),b!==2){if(Ah&&!T){_.errorRecoveryDisabledLanes|=m,$o|=m,h=4;break e}m=Jt,Jt=h,m!==null&&(Jt===null?Jt=m:Jt.push.apply(Jt,m))}h=b}if(m=!1,h!==2)continue}}if(h===1){Vi(a,0),Ya(a,o,0,!0);break}e:{switch(c=a,m=h,m){case 0:case 1:throw Error(i(345));case 4:if((o&4194048)!==o)break;case 6:Ya(c,o,fn,!Ga);break e;case 2:Jt=null;break;case 3:case 5:break;default:throw Error(i(329))}if((o&62914560)===o&&(h=ic+300-Ft(),10<h)){if(Ya(c,o,fn,!Ga),yl(c,0,!0)!==0)break e;ya=o,c.timeoutHandle=Mb(nb.bind(null,c,r,Jt,rc,Rh,o,fn,$o,Wi,Ga,m,"Throttled",-0,0),h);break e}nb(c,r,Jt,rc,Rh,o,fn,$o,Wi,Ga,m,null,-0,0)}}break}while(!0);Hn(a)}function nb(a,o,r,c,h,m,b,_,T,j,H,Y,F,B){if(a.timeoutHandle=-1,Y=o.subtreeFlags,Y&8192||(Y&16785408)===16785408){Y={stylesheets:null,count:0,imgCount:0,imgBytes:0,suspenseyImages:[],waitingForImages:!0,waitingForViewTransition:!1,unsuspend:na},Yy(o,m,Y);var ie=(m&62914560)===m?ic-Ft():(m&4194048)===m?Xy-Ft():0;if(ie=QC(Y,ie),ie!==null){ya=m,a.cancelPendingCommit=ie(db.bind(null,a,o,m,r,c,h,b,_,T,H,Y,null,F,B)),Ya(a,m,b,!j);return}}db(a,o,m,r,c,h,b,_,T)}function fC(a){for(var o=a;;){var r=o.tag;if((r===0||r===11||r===15)&&o.flags&16384&&(r=o.updateQueue,r!==null&&(r=r.stores,r!==null)))for(var c=0;c<r.length;c++){var h=r[c],m=h.getSnapshot;h=h.value;
vendor: 19,414 bytes, line 9
9try{if(!ln(m(),h))return!1}catch{return!1}}if(r=o.child,o.subtreeFlags&16384&&r!==null)r.return=o,o=r;else{if(o===a)break;for(;o.sibling===null;){if(o.return===null||o.return===a)return!0;o=o.return}o.sibling.return=o.return,o=o.sibling}}return!0}function Ya(a,o,r,c){o&=~Th,o&=~$o,a.suspendedLanes|=o,a.pingedLanes&=~o,c&&(a.warmLanes|=o),c=a.expirationTimes;for(var h=o;0<h;){var m=31-rn(h),b=1<<m;c[m]=-1,h&=~b}r!==0&&hm(a,r,o)}function lc(){return(Ge&6)===0?(mr(0),!1):!0}function Mh(){if(Oe!==null){if(We===0)var a=Oe.return;else a=Oe,sa=Uo=null,Yu(a),Ui=null,Qs=0,a=Oe;for(;a!==null;)Py(a.alternate,a),a=a.return;Oe=null}}function Vi(a,o){var r=a.timeoutHandle;r!==-1&&(a.timeoutHandle=-1,PC(r)),r=a.cancelPendingCommit,r!==null&&(a.cancelPendingCommit=null,r()),ya=0,Mh(),Ze=a,Oe=r=oa(a.current,null),Pe=o,We=0,hn=null,Ga=!1,Gi=Ds(a,o),Ah=!1,Wi=fn=Th=$o=Wa=lt=0,Jt=fr=null,Rh=!1,(o&8)!==0&&(o|=o&32);var c=a.entangledLanes;if(c!==0)for(a=a.entanglements,c&=o;0<c;){var h=31-rn(c),m=1<<h;o|=a[h],c&=~m}return ga=o,El(),r}function ab(a,o){Ce=null,q.H=ir,o===Ni||o===Ul?(o=vg(),We=3):o===Nu?(o=vg(),We=4):We=o===dh?8:o!==null&&typeof o=="object"&&typeof o.then=="function"?6:1,hn=o,Oe===null&&(lt=1,Ql(a,xn(o,a.current)))}function ob(){var a=dn.current;return a===null?!0:(Pe&4194048)===Pe?Cn===null:(Pe&62914560)===Pe||(Pe&536870912)!==0?a===Cn:!1}function ib(){var a=q.H;return q.H=ir,a===null?ir:a}function sb(){var a=q.A;return q.A=uC,a}function cc(){lt=4,Ga||(Pe&4194048)!==Pe&&dn.current!==null||(Gi=!0),(Wa&134217727)===0&&($o&134217727)===0||Ze===null||Ya(Ze,Pe,fn,!1)}function Ph(a,o,r){var c=Ge;Ge|=2;var h=ib(),m=sb();(Ze!==a||Pe!==o)&&(rc=null,Vi(a,o)),o=!1;var b=lt;e:do try{if(We!==0&&Oe!==null){var _=Oe,T=hn;switch(We){case 8:Mh(),b=6;break e;case 3:case 2:case 9:case 6:dn.current===null&&(o=!0);var j=We;if(We=0,hn=null,Yi(a,_,T,j),r&&Gi){b=0;break e}break;default:j=We,We=0,hn=null,Yi(a,_,T,j)}}pC(),b=lt;break}catch(H){ab(a,H)}while(!0);return o&&a.shellSuspendCounter++,sa=Uo=null,Ge=c,q.H=h,q.A=m,Oe===null&&(Ze=null,Pe=0,El()),b}function pC(){for(;Oe!==null;)rb(Oe)}function mC(a,o){var r=Ge;Ge|=2;var c=ib(),h=sb();Ze!==a||Pe!==o?(rc=null,sc=Ft()+500,Vi(a,o)):Gi=Ds(a,o);e:do try{if(We!==0&&Oe!==null){o=Oe;var m=hn;t:switch(We){case 1:We=0,hn=null,Yi(a,o,m,1);break;case 2:case 9:if(yg(m)){We=0,hn=null,lb(o);break}o=function(){We!==2&&We!==9||Ze!==a||(We=7),Hn(a)},m.then(o,o);break e;case 3:We=7;break e;case 4:We=5;break e;case 7:yg(m)?(We=0,hn=null,lb(o)):(We=0,hn=null,Yi(a,o,m,7));break;case 5:var b=null;switch(Oe.tag){case 26:b=Oe.memoizedState;case 5:case 27:var _=Oe;if(b?Vb(b):_.stateNode.complete){We=0,hn=null;var T=_.sibling;if(T!==null)Oe=T;else{var j=_.return;j!==null?(Oe=j,dc(j)):Oe=null}break t}}We=0,hn=null,Yi(a,o,m,5);break;case 6:We=0,hn=null,Yi(a,o,m,6);break;case 8:Mh(),lt=6;break e;default:throw Error(i(462))}}gC();break}catch(H){ab(a,H)}while(!0);return sa=Uo=null,q.H=c,q.A=h,Ge=r,Oe!==null?0:(Ze=null,Pe=0,El(),lt)}function gC(){for(;Oe!==null&&!fl();)rb(Oe)}function rb(a){var o=Iy(a.alternate,a,ga);a.memoizedProps=a.pendingProps,o===null?dc(a):Oe=o}function lb(a){var o=a,r=o.alternate;switch(o.tag){case 15:case 0:o=Cy(r,o,o.pendingProps,o.type,void 0,Pe);break;case 11:o=Cy(r,o,o.pendingProps,o.type.render,o.ref,Pe);break;case 5:Yu(o);default:Py(r,o),o=Oe=sg(o,ga),o=Iy(r,o,ga)}a.memoizedProps=a.pendingProps,o===null?dc(a):Oe=o}function Yi(a,o,r,c){sa=Uo=null,Yu(o),Ui=null,Qs=0;var h=o.return;try{if(oC(a,h,o,r,Pe)){lt=1,Ql(a,xn(r,a.current)),Oe=null;return}}catch(m){if(h!==null)throw Oe=h,m;lt=1,Ql(a,xn(r,a.current)),Oe=null;return}o.flags&32768?(Ne||c===1?a=!0:Gi||(Pe&536870912)!==0?a=!1:(Ga=a=!0,(c===2||c===9||c===3||c===6)&&(c=dn.current,c!==null&&c.tag===13&&(c.flags|=16384))),cb(o,a)):dc(o)}function dc(a){var o=a;do{if((o.flags&32768)!==0){cb(o,Ga);return}a=o.return;var r=rC(o.alternate,o,ga);if(r!==null){Oe=r;return}if(o=o.sibling,o!==null){Oe=o;return}Oe=o=a}while(o!==null);lt===0&&(lt=5)}function cb(a,o){do{var r=lC(a.alternate,a);if(r!==null){r.flags&=32767,Oe=r;return}if(r=a.return,r!==null&&(r.flags|=32768,r.subtreeFlags=0,r.deletions=null),!o&&(a=a.sibling,a!==null)){Oe=a;return}Oe=a=r}while(a!==null);lt=6,Oe=null}function db(a,o,r,c,h,m,b,_,T){a.cancelPendingCommit=null;do uc();while(kt!==0);if((Ge&6)!==0)throw Error(i(327));if(o!==null){if(o===a.current)throw Error(i(177));if(m=o.lanes|o.childLanes,m|=xu,K0(a,r,m,b,_,T),a===Ze&&(Oe=Ze=null,Pe=0),$i=o,Va=a,ya=r,Eh=m,Oh=h,Jy=c,(o.subtreeFlags&10256)!==0||(o.flags&10256)!==0?(a.callbackNode=null,a.callbackPriority=0,wC(mi,function(){return mb(),null})):(a.callbackNode=null,a.callbackPriority=0),c=(o.flags&13878)!==0,(o.subtreeFlags&13878)!==0||c){c=q.T,q.T=null,h=K.p,K.p=2,b=Ge,Ge|=4;try{cC(a,o,r)}finally{Ge=b,K.p=h,q.T=c}}kt=1,ub(),hb(),fb()}}function ub(){if(kt===1){kt=0;var a=Va,o=$i,r=(o.flags&13878)!==0;if((o.subtreeFlags&13878)!==0||r){r=q.T,q.T=null;var c=K.p;K.p=2;var h=Ge;Ge|=4;try{Wy(o,a);var m=Wh,b=Qm(a.containerInfo),_=m.focusedElem,T=m.selectionRange;if(b!==_&&_&&_.ownerDocument&&Zm(_.ownerDocument.documentElement,_)){if(T!==null&&gu(_)){var j=T.start,H=T.end;if(H===void 0&&(H=j),"selectionStart"in _)_.selectionStart=j,_.selectionEnd=Math.min(H,_.value.length);else{var Y=_.ownerDocument||document,F=Y&&Y.defaultView||window;if(F.getSelection){var B=F.getSelection(),ie=_.textContent.length,me=Math.min(T.start,ie),Ke=T.end===void 0?me:Math.min(T.end,ie);!B.extend&&me>Ke&&(b=Ke,Ke=me,me=b);var L=Km(_,me),I=Km(_,Ke);if(L&&I&&(B.rangeCount!==1||B.anchorNode!==L.node||B.anchorOffset!==L.offset||B.focusNode!==I.node||B.focusOffset!==I.offset)){var U=Y.createRange();U.setStart(L.node,L.offset),B.removeAllRanges(),me>Ke?(B.addRange(U),B.extend(I.node,I.offset)):(U.setEnd(I.node,I.offset),B.addRange(U))}}}}for(Y=[],B=_;B=B.parentNode;)B.nodeType===1&&Y.push({element:B,left:B.scrollLeft,top:B.scrollTop});for(typeof _.focus=="function"&&_.focus(),_=0;_<Y.length;_++){var $=Y[_];$.element.scrollLeft=$.left,$.element.scrollTop=$.top}}Sc=!!Gh,Wh=Gh=null}finally{Ge=h,K.p=c,q.T=r}}a.current=o,kt=2}}function hb(){if(kt===2){kt=0;var a=Va,o=$i,r=(o.flags&8772)!==0;if((o.subtreeFlags&8772)!==0||r){r=q.T,q.T=null;var c=K.p;K.p=2;var h=Ge;Ge|=4;try{qy(a,o.alternate,o)}finally{Ge=h,K.p=c,q.T=r}}kt=3}}function fb(){if(kt===4||kt===3){kt=0,Yd();var a=Va,o=$i,r=ya,c=Jy;(o.subtreeFlags&10256)!==0||(o.flags&10256)!==0?kt=5:(kt=0,$i=Va=null,pb(a,a.pendingLanes));var h=a.pendingLanes;if(h===0&&($a=null),Qd(r),o=o.stateNode,sn&&typeof sn.onCommitFiberRoot=="function")try{sn.onCommitFiberRoot(Ps,o,void 0,(o.current.flags&128)===128)}catch{}if(c!==null){o=q.T,h=K.p,K.p=2,q.T=null;try{for(var m=a.onRecoverableError,b=0;b<c.length;b++){var _=c[b];m(_.value,{componentStack:_.stack})}}finally{q.T=o,K.p=h}}(ya&3)!==0&&uc(),Hn(a),h=a.pendingLanes,(r&261930)!==0&&(h&42)!==0?a===Ih?pr++:(pr=0,Ih=a):pr=0,mr(0)}}function pb(a,o){(a.pooledCacheLanes&=o)===0&&(o=a.pooledCache,o!=null&&(a.pooledCache=null,Ks(o)))}function uc(){return ub(),hb(),fb(),mb()}function mb(){if(kt!==5)return!1;var a=Va,o=Eh;Eh=0;var r=Qd(ya),c=q.T,h=K.p;try{K.p=32>r?32:r,q.T=null,r=Oh,Oh=null;var m=Va,b=ya;if(kt=0,$i=Va=null,ya=0,(Ge&6)!==0)throw Error(i(331));var _=Ge;if(Ge|=4,Zy(m.current),Vy(m,m.current,b,r),Ge=_,mr(0,!1),sn&&typeof sn.onPostCommitFiberRoot=="function")try{sn.onPostCommitFiberRoot(Ps,m)}catch{}return!0}finally{K.p=h,q.T=c,pb(a,o)}}function gb(a,o,r){o=xn(r,o),o=ch(a.stateNode,o,2),a=qa(a,o,2),a!==null&&(Ls(a,2),Hn(a))}function $e(a,o,r){if(a.tag===3)gb(a,a,r);else for(;o!==null;){if(o.tag===3){gb(o,a,r);break}else if(o.tag===1){var c=o.stateNode;if(typeof o.type.getDerivedStateFromError=="function"||typeof c.componentDidCatch=="function"&&($a===null||!$a.has(c))){a=xn(r,a),r=yy(2),c=qa(o,r,2),c!==null&&(by(r,c,o,a),Ls(c,2),Hn(c));break}}o=o.return}}function Dh(a,o,r){var c=a.pingCache;if(c===null){c=a.pingCache=new hC;var h=new Set;c.set(o,h)}else h=c.get(o),h===void 0&&(h=new Set,c.set(o,h));h.has(r)||(Ah=!0,h.add(r),a=yC.bind(null,a,o,r),o.then(a,a))}function yC(a,o,r){var c=a.pingCache;c!==null&&c.delete(o),a.pingedLanes|=a.suspendedLanes&r,a.warmLanes&=~r,Ze===a&&(Pe&r)===r&&(lt===4||lt===3&&(Pe&62914560)===Pe&&300>Ft()-ic?(Ge&2)===0&&Vi(a,0):Th|=r,Wi===Pe&&(Wi=0)),Hn(a)}function yb(a,o){o===0&&(o=um()),a=Do(a,o),a!==null&&(Ls(a,o),Hn(a))}function bC(a){var o=a.memoizedState,r=0;o!==null&&(r=o.retryLane),yb(a,r)}function vC(a,o){var r=0;switch(a.tag){case 31:case 13:var c=a.stateNode,h=a.memoizedState;h!==null&&(r=h.retryLane);break;case 19:c=a.stateNode;break;case 22:c=a.stateNode._retryCache;break;default:throw Error(i(314))}c!==null&&c.delete(o),yb(a,r)}function wC(a,o){return On(a,o)}var hc=null,Ki=null,Lh=!1,fc=!1,Nh=!1,Ka=0;function Hn(a){a!==Ki&&a.next===null&&(Ki===null?hc=Ki=a:Ki=Ki.next=a),fc=!0,Lh||(Lh=!0,kC())}function mr(a,o){if(!Nh&&fc){Nh=!0;do for(var r=!1,c=hc;c!==null;){if(a!==0){var h=c.pendingLanes;if(h===0)var m=0;else{var b=c.suspendedLanes,_=c.pingedLanes;m=(1<<31-rn(42|a)+1)-1,m&=h&~(b&~_),m=m&201326741?m&201326741|1:m?m|2:0}m!==0&&(r=!0,xb(c,m))}else m=Pe,m=yl(c,c===Ze?m:0,c.cancelPendingCommit!==null||c.timeoutHandle!==-1),(m&3)===0||Ds(c,m)||(r=!0,xb(c,m));c=c.next}while(r);Nh=!1}}function xC(){bb()}function bb(){fc=Lh=!1;var a=0;Ka!==0&&MC()&&(a=Ka);for(var o=Ft(),r=null,c=hc;c!==null;){var h=c.next,m=vb(c,o);m===0?(c.next=null,r===null?hc=h:r.next=h,h===null&&(Ki=r)):(r=c,(a!==0||(m&3)!==0)&&(fc=!0)),c=h}kt!==0&&kt!==5||mr(a),Ka!==0&&(Ka=0)}function vb(a,o){for(var r=a.suspendedLanes,c=a.pingedLanes,h=a.expirationTimes,m=a.pendingLanes&-62914561;0<m;){var b=31-rn(m),_=1<<b,T=h[b];T===-1?((_&r)===0||(_&c)!==0)&&(h[b]=Y0(_,o)):T<=o&&(a.expiredLanes|=_),m&=~_}if(o=Ze,r=Pe,r=yl(a,a===o?r:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),c=a.callbackNode,r===0||a===o&&(We===2||We===9)||a.cancelPendingCommit!==null)return c!==null&&c!==null&&Ms(c),a.callbackNode=null,a.callbackPriority=0;if((r&3)===0||Ds(a,r)){if(o=r&-r,o===a.callbackPriority)return o;switch(c!==null&&Ms(c),Qd(r)){case 2:case 8:r=Fn;break;case 32:r=mi;break;case 268435456:r=dm;break;default:r=mi}return c=wb.bind(null,a),r=On(r,c),a.callbackPriority=o,a.callbackNode=r,o}return c!==null&&c!==null&&Ms(c),a.callbackPriority=2,a.callbackNode=null,2}function wb(a,o){if(kt!==0&&kt!==5)return a.callbackNode=null,a.callbackPriority=0,null;var r=a.callbackNode;if(uc()&&a.callbackNode!==r)return null;var c=Pe;return c=yl(a,a===Ze?c:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),c===0?null:(tb(a,c,o),vb(a,Ft()),a.callbackNode!=null&&a.callbackNode===r?wb.bind(null,a):null)}function xb(a,o){if(uc())return null;tb(a,o,!0)}function kC(){DC(function(){(Ge&6)!==0?On(Mt,xC):bb()})}function Uh(){if(Ka===0){var a=Di;a===0&&(a=pl,pl<<=1,(pl&261888)===0&&(pl=256)),Ka=a}return Ka}function kb(a){return a==null||typeof a=="symbol"||typeof a=="boolean"?null:typeof a=="function"?a:xl(""+a)}function Sb(a,o){var r=o.ownerDocument.createElement("input");return r.name=o.name,r.value=o.value,a.id&&r.setAttribute("form",a.id),o.parentNode.insertBefore(r,o),a=new FormData(a),r.parentNode.removeChild(r),a}function SC(a,o,r,c,h){if(o==="submit"&&r&&r.stateNode===h){var m=kb((h[Yt]||null).action),b=c.submitter;b&&(o=(o=b[Yt]||null)?kb(o.formAction):b.getAttribute("formAction"),o!==null&&(m=o,b=null));var _=new Cl("action","action",null,c,h);a.push({event:_,listeners:[{instance:null,listener:function(){if(c.defaultPrevented){if(Ka!==0){var T=b?Sb(h,b):new FormData(h);ah(r,{pending:!0,data:T,method:h.method,action:m},null,T)}}else typeof m=="function"&&(_.preventDefault(),T=b?Sb(h,b):new FormData(h),ah(r,{pending:!0,data:T,method:h.method,action:m},m,T))},currentTarget:h}]})}}for(var jh=0;jh<wu.length;jh++){var Fh=wu[jh],_C=Fh.toLowerCase(),CC=Fh[0].toUpperCase()+Fh.slice(1);In(_C,"on"+CC)}In(eg,"onAnimationEnd"),In(tg,"onAnimationIteration"),In(ng,"onAnimationStart"),In("dblclick","onDoubleClick"),In("focusin","onFocus"),In("focusout","onBlur"),In(B_,"onTransitionRun"),In(z_,"onTransitionStart"),In(H_,"onTransitionCancel"),In(ag,"onTransitionEnd"),wi("onMouseEnter",["mouseout","mouseover"]),wi("onMouseLeave",["mouseout","mouseover"]),wi("onPointerEnter",["pointerout","pointerover"]),wi("onPointerLeave",["pointerout","pointerover"]),Oo("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),Oo("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),Oo("onBeforeInput",["compositionend","keypress","textInput","paste"]),Oo("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),Oo("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),Oo("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var gr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),AC=new Set("beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(gr));function _b(a,o){o=(o&4)!==0;for(var r=0;r<a.length;r++){var c=a[r],h=c.event;c=c.listeners;e:{var m=void 0;if(o)for(var b=c.length-1;0<=b;b--){var _=c[b],T=_.instance,j=_.currentTarget;if(_=_.listener,T!==m&&h.isPropagationStopped())break e;m=_,h.currentTarget=j;try{m(h)}catch(H){Rl(H)}h.currentTarget=null,m=T}else for(b=0;b<c.length;b++){if(_=c[b],T=_.instance,j=_.currentTarget,_=_.listener,T!==m&&h.isPropagationStopped())break e;m=_,h.currentTarget=j;try{m(h)}catch(H){Rl(H)}h.currentTarget=null,m=T}}}}function Ie(a,o){var r=o[Xd];r===void 0&&(r=o[Xd]=new Set);var c=a+"__bubble";r.has(c)||(Cb(o,a,2,!1),r.add(c))}function qh(a,o,r){var c=0;o&&(c|=4),Cb(r,a,c,o)}var pc="_reactListening"+Math.random().toString(36).slice(2);function Bh(a){if(!a[pc]){a[pc]=!0,bm.forEach(function(r){r!=="selectionchange"&&(AC.has(r)||qh(r,!1,a),qh(r,!0,a))});var o=a.nodeType===9?a:a.ownerDocument;o===null||o[pc]||(o[pc]=!0,qh("selectionchange",!1,o))}}function Cb(a,o,r,c){switch(ev(o)){case 2:var h=eA;break;case 8:h=tA;break;default:h=nf}r=h.bind(null,o,r,a),h=void 0,!ru||o!=="touchstart"&&o!=="touchmove"&&o!=="wheel"||(h=!0),c?h!==void 0?a.addEventListener(o,r,{capture:!0,passive:h}):a.addEventListener(o,r,!0):h!==void 0?a.addEventListener(o,r,{passive:h}):a.addEventListener(o,r,!1)}function zh(a,o,r,c,h){var m=c;if((o&1)===0&&(o&2)===0&&c!==null)e:for(;;){if(c===null)return;var b=c.tag;if(b===3||b===4){var _=c.stateNode.containerInfo;if(_===h)break;if(b===4)for(b=c.return;b!==null;){var T=b.tag;if((T===3||T===4)&&b.stateNode.containerInfo===h)return;b=b.return}for(;_!==null;){if(b=yi(_),b===null)return;if(T=b.tag,T===5||T===6||T===26||T===27){c=m=b;continue e}_=_.parentNode}}c=c.return}Om(function(){var j=m,H=iu(r),Y=[];e:{var F=og.get(a);if(F!==void 0){var B=Cl,ie=a;switch(a){case"keypress":if(Sl(r)===0)break e;case"keydown":case"keyup":B=v_;break;case"focusin":ie="focus",B=uu;break;case"focusout":ie="blur",B=uu;break;case"beforeblur":case"afterblur":B=uu;break;case"click":if(r.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":B=Pm;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":B=r_;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":B=k_;break;case eg:case tg:case ng:B=d_;break;case ag:B=__;break;case"scroll":case"scrollend":B=i_;break;case"wheel":B=A_;break;case"copy":case"cut":case"paste":B=h_;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":B=Lm;break;case"toggle":case"beforetoggle":B=R_}var me=(o&4)!==0,Ke=!me&&(a==="scroll"||a==="scrollend"),L=me?F!==null?F+"Capture":null:F;me=[];for(var I=j,U;I!==null;){var $=I;if(U=$.stateNode,$=$.tag,$!==5&&$!==26&&$!==27||U===null||L===null||($=js(I,L),$!=null&&me.push(yr(I,$,U))),Ke)break;I=I.return}0<me.length&&(F=new B(F,ie,null,r,H),Y.push({event:F,listeners:me}))}}if((o&7)===0){e:{if(F=a==="mouseover"||a==="pointerover",B=a==="mouseout"||a==="pointerout",F&&r!==ou&&(ie=r.relatedTarget||r.fromElement)&&(yi(ie)||ie[gi]))break e;if((B||F)&&(F=H.window===H?H:(F=H.ownerDocument)?F.defaultView||F.parentWindow:window,B?(ie=r.relatedTarget||r.toElement,B=j,ie=ie?yi(ie):null,ie!==null&&(Ke=l(ie),me=ie.tag,ie!==Ke||me!==5&&me!==27&&me!==6)&&(ie=null)):(B=null,ie=j),B!==ie)){if(me=Pm,$="onMouseLeave",L="onMouseEnter",I="mouse",(a==="pointerout"||a==="pointerover")&&(me=Lm,$="onPointerLeave",L="onPointerEnter",I="pointer"),Ke=B==null?F:Us(B),U=ie==null?F:Us(ie),F=new me($,I+"leave",B,r,H),F.target=Ke,F.relatedTarget=U,$=null,yi(H)===j&&(me=new me(L,I+"enter",ie,r,H),me.target=U,me.relatedTarget=Ke,$=me),Ke=$,B&&ie)t:{for(me=TC,L=B,I=ie,U=0,$=L;$;$=me($))U++;$=0;for(var pe=I;pe;pe=me(pe))$++;for(;0<U-$;)L=me(L),U--;for(;0<$-U;)I=me(I),$--;for(;U--;){if(L===I||I!==null&&L===I.alternate){me=L;break t}L=me(L),I=me(I)}me=null}else me=null;B!==null&&Ab(Y,F,B,me,!1),ie!==null&&Ke!==null&&Ab(Y,Ke,ie,me,!0)}}e:{if(F=j?Us(j):window,B=F.nodeName&&F.nodeName.toLowerCase(),B==="select"||B==="input"&&F.type==="file")var Be=Hm;else if(Bm(F))if(Gm)Be=j_;else{Be=N_;var de=L_}else B=F.nodeName,!B||B.toLowerCase()!=="input"||F.type!=="checkbox"&&F.type!=="radio"?j&&au(j.elementType)&&(Be=Hm):Be=U_;if(Be&&(Be=Be(a,j))){zm(Y,Be,r,H);break e}de&&de(a,F,j),a==="focusout"&&j&&F.type==="number"&&j.memoizedProps.value!=null&&nu(F,"number",F.value)}switch(de=j?Us(j):window,a){case"focusin":(Bm(de)||de.contentEditable==="true")&&(Ai=de,yu=j,$s=null);break;case"focusout":$s=yu=Ai=null;break;case"mousedown":bu=!0;break;case"contextmenu":case"mouseup":case"dragend":bu=!1,Xm(Y,r,H);break;case"selectionchange":if(q_)break;case"keydown":case"keyup":Xm(Y,r,H)}var Ae;if(fu)e:{switch(a){case"compositionstart":var De="onCompositionStart";break e;case"compositionend":De="onCompositionEnd";break e;case"compositionupdate":De="onCompositionUpdate";break e}De=void 0}else Ci?Fm(a,r)&&(De="onCompositionEnd"):a==="keydown"&&r.keyCode===229&&(De="onCompositionStart");De&&(Nm&&r.locale!=="ko"&&(Ci||De!=="onCompositionStart"?De==="onCompositionEnd"&&Ci&&(Ae=Im()):(Pa=H,lu="value"in Pa?Pa.value:Pa.textContent,Ci=!0)),de=mc(j,De),0<de.length&&(De=new Dm(De,a,null,r,H),Y.push({event:De,listeners:de}),Ae?De.data=Ae:(Ae=qm(r),Ae!==null&&(De.data=Ae)))),(Ae=O_?I_(a,r):M_(a,r))&&(De=mc(j,"onBeforeInput"),0<De.length&&(de=new Dm("onBeforeInput","beforeinput",null,r,H),Y.push({event:de,listeners:De}),de.data=Ae)),SC(Y,a,j,r,H)}_b(Y,o)})}function yr(a,o,r){return{instance:a,listener:o,currentTarget:r}}function mc(a,o){for(var r=o+"Capture",c=[];a!==null;){var h=a,m=h.stateNode;if(h=h.tag,h!==5&&h!==26&&h!==27||m===null||(h=js(a,r),h!=null&&c.unshift(yr(a,h,m)),h=js(a,o),h!=null&&c.push(yr(a,h,m))),a.tag===3)return c;a=a.return}return[]}function TC(a){if(a===null)return null;do a=a.return;while(a&&a.tag!==5&&a.tag!==27);return a||null}function Ab(a,o,r,c,h){for(var m=o._reactName,b=[];r!==null&&r!==c;){var _=r,T=_.alternate,j=_.stateNode;if(_=_.tag,T!==null&&T===c)break;_!==5&&_!==26&&_!==27||j===null||(T=j,h?(j=js(r,m),j!=null&&b.unshift(yr(r,j,T))):h||(j=js(r,m),j!=null&&b.pu
vendor: 5,231 bytes, lines 9-10
9sh(yr(r,j,T)))),r=r.return}b.length!==0&&a.push({event:o,listeners:b})}var RC=/\r\n?/g,EC=/\u0000|\uFFFD/g;function Tb(a){return(typeof a=="string"?a:""+a).replace(RC,` 10`).replace(EC,"")}function Rb(a,o){return o=Tb(o),Tb(a)===o}function Ye(a,o,r,c,h,m){switch(r){case"children":typeof c=="string"?o==="body"||o==="textarea"&&c===""||ki(a,c):(typeof c=="number"||typeof c=="bigint")&&o!=="body"&&ki(a,""+c);break;case"className":vl(a,"class",c);break;case"tabIndex":vl(a,"tabindex",c);break;case"dir":case"role":case"viewBox":case"width":case"height":vl(a,r,c);break;case"style":Rm(a,c,m);break;case"data":if(o!=="object"){vl(a,"data",c);break}case"src":case"href":if(c===""&&(o!=="a"||r!=="href")){a.removeAttribute(r);break}if(c==null||typeof c=="function"||typeof c=="symbol"||typeof c=="boolean"){a.removeAttribute(r);break}c=xl(""+c),a.setAttribute(r,c);break;case"action":case"formAction":if(typeof c=="function"){a.setAttribute(r,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof m=="function"&&(r==="formAction"?(o!=="input"&&Ye(a,o,"name",h.name,h,null),Ye(a,o,"formEncType",h.formEncType,h,null),Ye(a,o,"formMethod",h.formMethod,h,null),Ye(a,o,"formTarget",h.formTarget,h,null)):(Ye(a,o,"encType",h.encType,h,null),Ye(a,o,"method",h.method,h,null),Ye(a,o,"target",h.target,h,null)));if(c==null||typeof c=="symbol"||typeof c=="boolean"){a.removeAttribute(r);break}c=xl(""+c),a.setAttribute(r,c);break;case"onClick":c!=null&&(a.onclick=na);break;case"onScroll":c!=null&&Ie("scroll",a);break;case"onScrollEnd":c!=null&&Ie("scrollend",a);break;case"dangerouslySetInnerHTML":if(c!=null){if(typeof c!="object"||!("__html"in c))throw Error(i(61));if(r=c.__html,r!=null){if(h.children!=null)throw Error(i(60));a.innerHTML=r}}break;case"multiple":a.multiple=c&&typeof c!="function"&&typeof c!="symbol";break;case"muted":a.muted=c&&typeof c!="function"&&typeof c!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(c==null||typeof c=="function"||typeof c=="boolean"||typeof c=="symbol"){a.removeAttribute("xlink:href");break}r=xl(""+c),a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":c!=null&&typeof c!="function"&&typeof c!="symbol"?a.setAttribute(r,""+c):a.removeAttribute(r);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":c&&typeof c!="function"&&typeof c!="symbol"?a.setAttribute(r,""):a.removeAttribute(r);break;case"capture":case"download":c===!0?a.setAttribute(r,""):c!==!1&&c!=null&&typeof c!="function"&&typeof c!="symbol"?a.setAttribute(r,c):a.removeAttribute(r);break;case"cols":case"rows":case"size":case"span":c!=null&&typeof c!="function"&&typeof c!="symbol"&&!isNaN(c)&&1<=c?a.setAttribute(r,c):a.removeAttribute(r);break;case"rowSpan":case"start":c==null||typeof c=="function"||typeof c=="symbol"||isNaN(c)?a.removeAttribute(r):a.setAttribute(r,c);break;case"popover":Ie("beforetoggle",a),Ie("toggle",a),bl(a,"popover",c);break;case"xlinkActuate":ta(a,"http://www.w3.org/1999/xlink","xlink:actuate",c);break;case"xlinkArcrole":ta(a,"http://www.w3.org/1999/xlink","xlink:arcrole",c);break;case"xlinkRole":ta(a,"http://www.w3.org/1999/xlink","xlink:role",c);break;case"xlinkShow":ta(a,"http://www.w3.org/1999/xlink","xlink:show",c);break;case"xlinkTitle":ta(a,"http://www.w3.org/1999/xlink","xlink:title",c);break;case"xlinkType":ta(a,"http://www.w3.org/1999/xlink","xlink:type",c);break;case"xmlBase":ta(a,"http://www.w3.org/XML/1998/namespace","xml:base",c);break;case"xmlLang":ta(a,"http://www.w3.org/XML/1998/namespace","xml:lang",c);break;case"xmlSpace":ta(a,"http://www.w3.org/XML/1998/namespace","xml:space",c);break;case"is":bl(a,"is",c);break;case"innerText":case"textContent":break;default:(!(2<r.length)||r[0]!=="o"&&r[0]!=="O"||r[1]!=="n"&&r[1]!=="N")&&(r=a_.get(r)||r,bl(a,r,c))}}function Hh(a,o,r,c,h,m){switch(r){case"style":Rm(a,c,m);break;case"dangerouslySetInnerHTML":if(c!=null){if(typeof c!="object"||!("__html"in c))throw Error(i(61));if(r=c.__html,r!=null){if(h.children!=null)throw Error(i(60));a.innerHTML=r}}break;case"children":typeof c=="string"?ki(a,c):(typeof c=="number"||typeof c=="bigint")&&ki(a,""+c);break;case"onScroll":c!=null&&Ie("scroll",a);break;case"onScrollEnd":c!=null&&Ie("scrollend",a);break;case"onClick":c!=null&&(a.onclick=na);break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"innerHTML":case"ref":break;case"innerText":case"textContent":break;
vendor: 9,678 bytes, line 10
10default:if(!vm.hasOwnProperty(r))e:{if(r[0]==="o"&&r[1]==="n"&&(h=r.endsWith("Capture"),o=r.slice(2,h?r.length-7:void 0),m=a[Yt]||null,m=m!=null?m[r]:null,typeof m=="function"&&a.removeEventListener(o,m,h),typeof c=="function")){typeof m!="function"&&m!==null&&(r in a?a[r]=null:a.hasAttribute(r)&&a.removeAttribute(r)),a.addEventListener(o,c,h);break e}r in a?a[r]=c:c===!0?a.setAttribute(r,""):bl(a,r,c)}}}function Ut(a,o,r){switch(o){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"img":Ie("error",a),Ie("load",a);var c=!1,h=!1,m;for(m in r)if(r.hasOwnProperty(m)){var b=r[m];if(b!=null)switch(m){case"src":c=!0;break;case"srcSet":h=!0;break;case"children":case"dangerouslySetInnerHTML":throw Error(i(137,o));default:Ye(a,o,m,b,r,null)}}h&&Ye(a,o,"srcSet",r.srcSet,r,null),c&&Ye(a,o,"src",r.src,r,null);return;case"input":Ie("invalid",a);var _=m=b=h=null,T=null,j=null;for(c in r)if(r.hasOwnProperty(c)){var H=r[c];if(H!=null)switch(c){case"name":h=H;break;case"type":b=H;break;case"checked":T=H;break;case"defaultChecked":j=H;break;case"value":m=H;break;case"defaultValue":_=H;break;case"children":case"dangerouslySetInnerHTML":if(H!=null)throw Error(i(137,o));break;default:Ye(a,o,c,H,r,null)}}_m(a,m,_,T,j,b,h,!1);return;case"select":Ie("invalid",a),c=b=m=null;for(h in r)if(r.hasOwnProperty(h)&&(_=r[h],_!=null))switch(h){case"value":m=_;break;case"defaultValue":b=_;break;case"multiple":c=_;default:Ye(a,o,h,_,r,null)}o=m,r=b,a.multiple=!!c,o!=null?xi(a,!!c,o,!1):r!=null&&xi(a,!!c,r,!0);return;case"textarea":Ie("invalid",a),m=h=c=null;for(b in r)if(r.hasOwnProperty(b)&&(_=r[b],_!=null))switch(b){case"value":c=_;break;case"defaultValue":h=_;break;case"children":m=_;break;case"dangerouslySetInnerHTML":if(_!=null)throw Error(i(91));break;default:Ye(a,o,b,_,r,null)}Am(a,c,h,m);return;case"option":for(T in r)r.hasOwnProperty(T)&&(c=r[T],c!=null)&&(T==="selected"?a.selected=c&&typeof c!="function"&&typeof c!="symbol":Ye(a,o,T,c,r,null));return;case"dialog":Ie("beforetoggle",a),Ie("toggle",a),Ie("cancel",a),Ie("close",a);break;case"iframe":case"object":Ie("load",a);break;case"video":case"audio":for(c=0;c<gr.length;c++)Ie(gr[c],a);break;case"image":Ie("error",a),Ie("load",a);break;case"details":Ie("toggle",a);break;case"embed":case"source":case"link":Ie("error",a),Ie("load",a);case"area":case"base":case"br":case"col":case"hr":case"keygen":case"meta":case"param":case"track":case"wbr":case"menuitem":for(j in r)if(r.hasOwnProperty(j)&&(c=r[j],c!=null))switch(j){case"children":case"dangerouslySetInnerHTML":throw Error(i(137,o));default:Ye(a,o,j,c,r,null)}return;default:if(au(o)){for(H in r)r.hasOwnProperty(H)&&(c=r[H],c!==void 0&&Hh(a,o,H,c,r,void 0));return}}for(_ in r)r.hasOwnProperty(_)&&(c=r[_],c!=null&&Ye(a,o,_,c,r,null))}function OC(a,o,r,c){switch(o){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var h=null,m=null,b=null,_=null,T=null,j=null,H=null;for(B in r){var Y=r[B];if(r.hasOwnProperty(B)&&Y!=null)switch(B){case"checked":break;case"value":break;case"defaultValue":T=Y;default:c.hasOwnProperty(B)||Ye(a,o,B,null,c,Y)}}for(var F in c){var B=c[F];if(Y=r[F],c.hasOwnProperty(F)&&(B!=null||Y!=null))switch(F){case"type":m=B;break;case"name":h=B;break;case"checked":j=B;break;case"defaultChecked":H=B;break;case"value":b=B;break;case"defaultValue":_=B;break;case"children":case"dangerouslySetInnerHTML":if(B!=null)throw Error(i(137,o));break;default:B!==Y&&Ye(a,o,F,B,c,Y)}}tu(a,b,_,T,j,H,m,h);return;case"select":B=b=_=F=null;for(m in r)if(T=r[m],r.hasOwnProperty(m)&&T!=null)switch(m){case"value":break;case"multiple":B=T;default:c.hasOwnProperty(m)||Ye(a,o,m,null,c,T)}for(h in c)if(m=c[h],T=r[h],c.hasOwnProperty(h)&&(m!=null||T!=null))switch(h){case"value":F=m;break;case"defaultValue":_=m;break;case"multiple":b=m;default:m!==T&&Ye(a,o,h,m,c,T)}o=_,r=b,c=B,F!=null?xi(a,!!r,F,!1):!!c!=!!r&&(o!=null?xi(a,!!r,o,!0):xi(a,!!r,r?[]:"",!1));return;case"textarea":B=F=null;for(_ in r)if(h=r[_],r.hasOwnProperty(_)&&h!=null&&!c.hasOwnProperty(_))switch(_){case"value":break;case"children":break;default:Ye(a,o,_,null,c,h)}for(b in c)if(h=c[b],m=r[b],c.hasOwnProperty(b)&&(h!=null||m!=null))switch(b){case"value":F=h;break;case"defaultValue":B=h;break;case"children":break;case"dangerouslySetInnerHTML":if(h!=null)throw Error(i(91));break;default:h!==m&&Ye(a,o,b,h,c,m)}Cm(a,F,B);return;case"option":for(var ie in r)F=r[ie],r.hasOwnProperty(ie)&&F!=null&&!c.hasOwnProperty(ie)&&(ie==="selected"?a.selected=!1:Ye(a,o,ie,null,c,F));for(T in c)F=c[T],B=r[T],c.hasOwnProperty(T)&&F!==B&&(F!=null||B!=null)&&(T==="selected"?a.selected=F&&typeof F!="function"&&typeof F!="symbol":Ye(a,o,T,F,c,B));return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var me in r)F=r[me],r.hasOwnProperty(me)&&F!=null&&!c.hasOwnProperty(me)&&Ye(a,o,me,null,c,F);for(j in c)if(F=c[j],B=r[j],c.hasOwnProperty(j)&&F!==B&&(F!=null||B!=null))switch(j){case"children":case"dangerouslySetInnerHTML":if(F!=null)throw Error(i(137,o));break;default:Ye(a,o,j,F,c,B)}return;default:if(au(o)){for(var Ke in r)F=r[Ke],r.hasOwnProperty(Ke)&&F!==void 0&&!c.hasOwnProperty(Ke)&&Hh(a,o,Ke,void 0,c,F);for(H in c)F=c[H],B=r[H],!c.hasOwnProperty(H)||F===B||F===void 0&&B===void 0||Hh(a,o,H,F,c,B);return}}for(var L in r)F=r[L],r.hasOwnProperty(L)&&F!=null&&!c.hasOwnProperty(L)&&Ye(a,o,L,null,c,F);for(Y in c)F=c[Y],B=r[Y],!c.hasOwnProperty(Y)||F===B||F==null&&B==null||Ye(a,o,Y,F,c,B)}function Eb(a){switch(a){case"css":case"script":case"font":case"img":case"image":case"input":case"link":return!0;default:return!1}}function IC(){if(typeof performance.getEntriesByType=="function"){for(var a=0,o=0,r=performance.getEntriesByType("resource"),c=0;c<r.length;c++){var h=r[c],m=h.transferSize,b=h.initiatorType,_=h.duration;if(m&&_&&Eb(b)){for(b=0,_=h.responseEnd,c+=1;c<r.length;c++){var T=r[c],j=T.startTime;if(j>_)break;var H=T.transferSize,Y=T.initiatorType;H&&Eb(Y)&&(T=T.responseEnd,b+=H*(T<_?1:(_-j)/(T-j)))}if(--c,o+=8*(m+b)/(h.duration/1e3),a++,10<a)break}}if(0<a)return o/a/1e6}return navigator.connection&&(a=navigator.connection.downlink,typeof a=="number")?a:5}var Gh=null,Wh=null;function gc(a){return a.nodeType===9?a:a.ownerDocument}function Ob(a){switch(a){case"http://www.w3.org/2000/svg":return 1;case"http://www.w3.org/1998/Math/MathML":return 2;default:return 0}}function Ib(a,o){if(a===0)switch(o){case"svg":return 1;case"math":return 2;default:return 0}return a===1&&o==="foreignObject"?0:a}function $h(a,o){return a==="textarea"||a==="noscript"||typeof o.children=="string"||typeof o.children=="number"||typeof o.children=="bigint"||typeof o.dangerouslySetInnerHTML=="object"&&o.dangerouslySetInnerHTML!==null&&o.dangerouslySetInnerHTML.__html!=null}var Vh=null;function MC(){var a=window.event;return a&&a.type==="popstate"?a===Vh?!1:(Vh=a,!0):(Vh=null,!1)}var Mb=typeof setTimeout=="function"?setTimeout:void 0,PC=typeof clearTimeout=="function"?clearTimeout:void 0,Pb=typeof Promise=="function"?Promise:void 0,DC=typeof queueMicrotask=="function"?queueMicrotask:typeof Pb<"u"?function(a){return Pb.resolve(null).then(a).catch(LC)}:Mb;function LC(a){setTimeout(function(){throw a})}function Za(a){return a==="head"}function Db(a,o){var r=o,c=0;do{var h=r.nextSibling;if(a.removeChild(r),h&&h.nodeType===8)if(r=h.data,r==="/$"||r==="/&"){if(c===0){a.removeChild(h),Ji(o);return}c--}else if(r==="$"||r==="$?"||r==="$~"||r==="$!"||r==="&")c++;else if(r==="html")br(a.ownerDocument.documentElement);else if(r==="head"){r=a.ownerDocument.head,br(r);for(var m=r.firstChild;m;){var b=m.nextSibling,_=m.nodeName;m[Ns]||_==="SCRIPT"||_==="STYLE"||_==="LINK"&&m.rel.toLowerCase()==="stylesheet"||r.removeChild(m),m=b}}else r==="body"&&br(a.ownerDocument.body);r=h}while(r);Ji(o)}function Lb(a,o){var r=a;a=0;do{var c=r.nextSibling;if(r.nodeType===1?o?(r._stashedDisplay=r.style.display,r.style.display="none"):(r.style.display=r._stashedDisplay||"",r.getAttribute("style")===""&&r.removeAttribute("style")):r.nodeType===3&&(o?(r._stashedText=r.nodeValue,r.nodeValue=""):r.nodeValue=r._stashedText||""),c&&c.nodeType===8)if(r=c.data,r==="/$"){if(a===0)break;a--}else r!=="$"&&r!=="$?"&&r!=="$~"&&r!=="$!"||a++;r=c}while(r)}function Yh(a){var o=a.firstChild;for(o&&o.nodeType===10&&(o=o.nextSibling);o;){var r=o;switch(o=o.nextSibling,r.nodeName){case"HTML":case"HEAD":case"BODY":Yh(r),Jd(r);continue;case"SCRIPT":case"STYLE":continue;case"LINK":if(r.rel.toLowerCase()==="stylesheet")continue}a.removeChild(r)}}function NC(a,o,r,c){for(;a.nodeType===1;){var h=r;if(a.nodeName.toLowerCase()!==o.toLowerCase()){if(!c&&(a.nodeName!=="INPUT"||a.type!=="hidden"))break}else if(c){if(!a[Ns])switch(o){case"meta":if(!a.hasAttribute("itemprop"))break;return a;case"link":if(m=a.getAttribute("rel"),m==="stylesheet"&&a.hasAttribute("data-precedence"))break;if(m!==h.rel||a.getAttribute("href")!==(h.href==null||h.href===""?null:h.href)||a.getAttribute("crossorigin")!==(h.crossOrigin==null?null:h.crossOrigin)||a.getAttribute("title")!==(h.title==null?null:h.title))break;return a;case"style":if(a.hasAttribute("data-precedence"))break;return a;case"script":if(m=a.getAttribute("src"),(m!==(h.src==null?null:h.src)||a.getAttribute("type")!==(h.type==null?null:h.type)||a.getAttribute("crossorigin")!==(h.crossOrigin==null?null:h.crossOrigin))&&m&&a.hasAttribute("async")&&!a.hasAttribute("itemprop"))break;return a;default:return a}}else if(o==="input"&&a.type==="hidden"){var m=h.name==null?null:""+h.name;if(h.type==="hidden"&&a.getAttribute("name")===m)return a}else return a;
vendor: 4,774 bytes, line 10
10if(a=An(a.nextSibling),a===null)break}return null}function UC(a,o,r){if(o==="")return null;for(;a.nodeType!==3;)if((a.nodeType!==1||a.nodeName!=="INPUT"||a.type!=="hidden")&&!r||(a=An(a.nextSibling),a===null))return null;return a}function Nb(a,o){for(;a.nodeType!==8;)if((a.nodeType!==1||a.nodeName!=="INPUT"||a.type!=="hidden")&&!o||(a=An(a.nextSibling),a===null))return null;return a}function Kh(a){return a.data==="$?"||a.data==="$~"}function Zh(a){return a.data==="$!"||a.data==="$?"&&a.ownerDocument.readyState!=="loading"}function jC(a,o){var r=a.ownerDocument;if(a.data==="$~")a._reactRetry=o;else if(a.data!=="$?"||r.readyState!=="loading")o();else{var c=function(){o(),r.removeEventListener("DOMContentLoaded",c)};r.addEventListener("DOMContentLoaded",c),a._reactRetry=c}}function An(a){for(;a!=null;a=a.nextSibling){var o=a.nodeType;if(o===1||o===3)break;if(o===8){if(o=a.data,o==="$"||o==="$!"||o==="$?"||o==="$~"||o==="&"||o==="F!"||o==="F")break;if(o==="/$"||o==="/&")return null}}return a}var Qh=null;function Ub(a){a=a.nextSibling;for(var o=0;a;){if(a.nodeType===8){var r=a.data;if(r==="/$"||r==="/&"){if(o===0)return An(a.nextSibling);o--}else r!=="$"&&r!=="$!"&&r!=="$?"&&r!=="$~"&&r!=="&"||o++}a=a.nextSibling}return null}function jb(a){a=a.previousSibling;for(var o=0;a;){if(a.nodeType===8){var r=a.data;if(r==="$"||r==="$!"||r==="$?"||r==="$~"||r==="&"){if(o===0)return a;o--}else r!=="/$"&&r!=="/&"||o++}a=a.previousSibling}return null}function Fb(a,o,r){switch(o=gc(r),a){case"html":if(a=o.documentElement,!a)throw Error(i(452));return a;case"head":if(a=o.head,!a)throw Error(i(453));return a;case"body":if(a=o.body,!a)throw Error(i(454));return a;default:throw Error(i(451))}}function br(a){for(var o=a.attributes;o.length;)a.removeAttributeNode(o[0]);Jd(a)}var Tn=new Map,qb=new Set;function yc(a){return typeof a.getRootNode=="function"?a.getRootNode():a.nodeType===9?a:a.ownerDocument}var ba=K.d;K.d={f:FC,r:qC,D:BC,C:zC,L:HC,m:GC,X:$C,S:WC,M:VC};function FC(){var a=ba.f(),o=lc();return a||o}function qC(a){var o=bi(a);o!==null&&o.tag===5&&o.type==="form"?ay(o):ba.r(a)}var Zi=typeof document>"u"?null:document;function Bb(a,o,r){var c=Zi;if(c&&typeof o=="string"&&o){var h=vn(o);h='link[rel="'+a+'"][href="'+h+'"]',typeof r=="string"&&(h+='[crossorigin="'+r+'"]'),qb.has(h)||(qb.add(h),a={rel:a,crossOrigin:r,href:o},c.querySelector(h)===null&&(o=c.createElement("link"),Ut(o,"link",a),Tt(o),c.head.appendChild(o)))}}function BC(a){ba.D(a),Bb("dns-prefetch",a,null)}function zC(a,o){ba.C(a,o),Bb("preconnect",a,o)}function HC(a,o,r){ba.L(a,o,r);var c=Zi;if(c&&a&&o){var h='link[rel="preload"][as="'+vn(o)+'"]';o==="image"&&r&&r.imageSrcSet?(h+='[imagesrcset="'+vn(r.imageSrcSet)+'"]',typeof r.imageSizes=="string"&&(h+='[imagesizes="'+vn(r.imageSizes)+'"]')):h+='[href="'+vn(a)+'"]';var m=h;switch(o){case"style":m=Qi(a);break;case"script":m=Xi(a)}Tn.has(m)||(a=g({rel:"preload",href:o==="image"&&r&&r.imageSrcSet?void 0:a,as:o},r),Tn.set(m,a),c.querySelector(h)!==null||o==="style"&&c.querySelector(vr(m))||o==="script"&&c.querySelector(wr(m))||(o=c.createElement("link"),Ut(o,"link",a),Tt(o),c.head.appendChild(o)))}}function GC(a,o){ba.m(a,o);var r=Zi;if(r&&a){var c=o&&typeof o.as=="string"?o.as:"script",h='link[rel="modulepreload"][as="'+vn(c)+'"][href="'+vn(a)+'"]',m=h;switch(c){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":m=Xi(a)}if(!Tn.has(m)&&(a=g({rel:"modulepreload",href:a},o),Tn.set(m,a),r.querySelector(h)===null)){switch(c){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(r.querySelector(wr(m)))return}c=r.createElement("link"),Ut(c,"link",a),Tt(c),r.head.appendChild(c)}}}function WC(a,o,r){ba.S(a,o,r);var c=Zi;if(c&&a){var h=vi(c).hoistableStyles,m=Qi(a);o=o||"default";var b=h.get(m);if(!b){var _={loading:0,preload:null};if(b=c.querySelector(vr(m)))_.loading=5;else{a=g({rel:"stylesheet",href:a,"data-precedence":o},r),(r=Tn.get(m))&&Xh(a,r);var T=b=c.createElement("link");Tt(T),Ut(T,"link",a),T._p=new Promise(function(j,H){T.onload=j,T.onerror=H}),T.addEventListener("load",function(){_.loading|=1}),T.addEventListener("error",function(){_.loading|=2}),_.loading|=4,bc(b,o,c)}b={type:"stylesheet",instance:b,count:1,state:_},h.set(m,b)}}}function $C(a,o){ba.X(a,o);var r=Zi;if(r&&a){var c=vi(r).hoistableScripts,h=Xi(a),m=c.get(h);m||(m=r.querySelector(wr(h)),m||(a=g({src:a,async:!0},o),(o=Tn.get(h))&&Jh(a,o),m=r.createElement("script"),Tt(m),Ut(m,"link",a),r.head.appendChild(m)),m={type:"script",instance:m,count:1,state:null},c.set(h,m))}}function VC(a,o){ba.M(a,o);var r=Zi;if(r&&a){var c=vi(r).hoistableScripts,h=Xi(a),m=c.get(h);m||(m=r.querySelector(wr(h)),m||(a=g({src:a,async:!0,type:"module"}
vendor: 4,913 bytes, line 10
10,o),(o=Tn.get(h))&&Jh(a,o),m=r.createElement("script"),Tt(m),Ut(m,"link",a),r.head.appendChild(m)),m={type:"script",instance:m,count:1,state:null},c.set(h,m))}}function zb(a,o,r,c){var h=(h=fe.current)?yc(h):null;if(!h)throw Error(i(446));switch(a){case"meta":case"title":return null;case"style":return typeof r.precedence=="string"&&typeof r.href=="string"?(o=Qi(r.href),r=vi(h).hoistableStyles,c=r.get(o),c||(c={type:"style",instance:null,count:0,state:null},r.set(o,c)),c):{type:"void",instance:null,count:0,state:null};case"link":if(r.rel==="stylesheet"&&typeof r.href=="string"&&typeof r.precedence=="string"){a=Qi(r.href);var m=vi(h).hoistableStyles,b=m.get(a);if(b||(h=h.ownerDocument||h,b={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},m.set(a,b),(m=h.querySelector(vr(a)))&&!m._p&&(b.instance=m,b.state.loading=5),Tn.has(a)||(r={rel:"preload",as:"style",href:r.href,crossOrigin:r.crossOrigin,integrity:r.integrity,media:r.media,hrefLang:r.hrefLang,referrerPolicy:r.referrerPolicy},Tn.set(a,r),m||YC(h,a,r,b.state))),o&&c===null)throw Error(i(528,""));return b}if(o&&c!==null)throw Error(i(529,""));return null;case"script":return o=r.async,r=r.src,typeof r=="string"&&o&&typeof o!="function"&&typeof o!="symbol"?(o=Xi(r),r=vi(h).hoistableScripts,c=r.get(o),c||(c={type:"script",instance:null,count:0,state:null},r.set(o,c)),c):{type:"void",instance:null,count:0,state:null};default:throw Error(i(444,a))}}function Qi(a){return'href="'+vn(a)+'"'}function vr(a){return'link[rel="stylesheet"]['+a+"]"}function Hb(a){return g({},a,{"data-precedence":a.precedence,precedence:null})}function YC(a,o,r,c){a.querySelector('link[rel="preload"][as="style"]['+o+"]")?c.loading=1:(o=a.createElement("link"),c.preload=o,o.addEventListener("load",function(){return c.loading|=1}),o.addEventListener("error",function(){return c.loading|=2}),Ut(o,"link",r),Tt(o),a.head.appendChild(o))}function Xi(a){return'[src="'+vn(a)+'"]'}function wr(a){return"script[async]"+a}function Gb(a,o,r){if(o.count++,o.instance===null)switch(o.type){case"style":var c=a.querySelector('style[data-href~="'+vn(r.href)+'"]');if(c)return o.instance=c,Tt(c),c;var h=g({},r,{"data-href":r.href,"data-precedence":r.precedence,href:null,precedence:null});return c=(a.ownerDocument||a).createElement("style"),Tt(c),Ut(c,"style",h),bc(c,r.precedence,a),o.instance=c;case"stylesheet":h=Qi(r.href);var m=a.querySelector(vr(h));if(m)return o.state.loading|=4,o.instance=m,Tt(m),m;c=Hb(r),(h=Tn.get(h))&&Xh(c,h),m=(a.ownerDocument||a).createElement("link"),Tt(m);var b=m;return b._p=new Promise(function(_,T){b.onload=_,b.onerror=T}),Ut(m,"link",c),o.state.loading|=4,bc(m,r.precedence,a),o.instance=m;case"script":return m=Xi(r.src),(h=a.querySelector(wr(m)))?(o.instance=h,Tt(h),h):(c=r,(h=Tn.get(m))&&(c=g({},r),Jh(c,h)),a=a.ownerDocument||a,h=a.createElement("script"),Tt(h),Ut(h,"link",c),a.head.appendChild(h),o.instance=h);case"void":return null;default:throw Error(i(443,o.type))}else o.type==="stylesheet"&&(o.state.loading&4)===0&&(c=o.instance,o.state.loading|=4,bc(c,r.precedence,a));return o.instance}function bc(a,o,r){for(var c=r.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),h=c.length?c[c.length-1]:null,m=h,b=0;b<c.length;b++){var _=c[b];if(_.dataset.precedence===o)m=_;else if(m!==h)break}m?m.parentNode.insertBefore(a,m.nextSibling):(o=r.nodeType===9?r.head:r,o.insertBefore(a,o.firstChild))}function Xh(a,o){a.crossOrigin==null&&(a.crossOrigin=o.crossOrigin),a.referrerPolicy==null&&(a.referrerPolicy=o.referrerPolicy),a.title==null&&(a.title=o.title)}function Jh(a,o){a.crossOrigin==null&&(a.crossOrigin=o.crossOrigin),a.referrerPolicy==null&&(a.referrerPolicy=o.referrerPolicy),a.integrity==null&&(a.integrity=o.integrity)}var vc=null;function Wb(a,o,r){if(vc===null){var c=new Map,h=vc=new Map;h.set(r,c)}else h=vc,c=h.get(r),c||(c=new Map,h.set(r,c));if(c.has(a))return c;for(c.set(a,null),r=r.getElementsByTagName(a),h=0;h<r.length;h++){var m=r[h];if(!(m[Ns]||m[Pt]||a==="link"&&m.getAttribute("rel")==="stylesheet")&&m.namespaceURI!=="http://www.w3.org/2000/svg"){var b=m.getAttribute(o)||"";b=a+b;var _=c.get(b);_?_.push(m):c.set(b,[m])}}return c}function $b(a,o,r){a=a.ownerDocument||a,a.head.insertBefore(r,o==="title"?a.querySelector("head > title"):null)}function KC(a,o,r){if(r===1||o.itemProp!=null)return!1;switch(a){case"meta":case"title":return!0;case"style":if(typeof o.precedence!="string"||typeof o.href!="string"||o.href==="")break;return!0;case"link":if(typeof o.rel!="string"||typeof o.href!="string"||o.href===""||o.onLoad||o.onError)break;return o.rel==="stylesheet"?(a=o.disabled,typeof o.precedence=="string"&&a==null):!0;case"script":if(o.async&&typeof o.async!="function"&&typeof o.async!="symbol"&&!o.onLoad&&!o.onError&&o.src&&typeof o.src=="string")return!0}return!1}function Vb(a){return!(a.type==="stylesheet"&&(a.state.loading&3)===0)}
vendor: 4,094 bytes, line 10
10function ZC(a,o,r,c){if(r.type==="stylesheet"&&(typeof c.media!="string"||matchMedia(c.media).matches!==!1)&&(r.state.loading&4)===0){if(r.instance===null){var h=Qi(c.href),m=o.querySelector(vr(h));if(m){o=m._p,o!==null&&typeof o=="object"&&typeof o.then=="function"&&(a.count++,a=wc.bind(a),o.then(a,a)),r.state.loading|=4,r.instance=m,Tt(m);return}m=o.ownerDocument||o,c=Hb(c),(h=Tn.get(h))&&Xh(c,h),m=m.createElement("link"),Tt(m);var b=m;b._p=new Promise(function(_,T){b.onload=_,b.onerror=T}),Ut(m,"link",c),r.instance=m}a.stylesheets===null&&(a.stylesheets=new Map),a.stylesheets.set(r,o),(o=r.state.preload)&&(r.state.loading&3)===0&&(a.count++,r=wc.bind(a),o.addEventListener("load",r),o.addEventListener("error",r))}}var ef=0;function QC(a,o){return a.stylesheets&&a.count===0&&kc(a,a.stylesheets),0<a.count||0<a.imgCount?function(r){var c=setTimeout(function(){if(a.stylesheets&&kc(a,a.stylesheets),a.unsuspend){var m=a.unsuspend;a.unsuspend=null,m()}},6e4+o);0<a.imgBytes&&ef===0&&(ef=62500*IC());var h=setTimeout(function(){if(a.waitingForImages=!1,a.count===0&&(a.stylesheets&&kc(a,a.stylesheets),a.unsuspend)){var m=a.unsuspend;a.unsuspend=null,m()}},(a.imgBytes>ef?50:800)+o);return a.unsuspend=r,function(){a.unsuspend=null,clearTimeout(c),clearTimeout(h)}}:null}function wc(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)kc(this,this.stylesheets);else if(this.unsuspend){var a=this.unsuspend;this.unsuspend=null,a()}}}var xc=null;function kc(a,o){a.stylesheets=null,a.unsuspend!==null&&(a.count++,xc=new Map,o.forEach(XC,a),xc=null,wc.call(a))}function XC(a,o){if(!(o.state.loading&4)){var r=xc.get(a);if(r)var c=r.get(null);else{r=new Map,xc.set(a,r);for(var h=a.querySelectorAll("link[data-precedence],style[data-precedence]"),m=0;m<h.length;m++){var b=h[m];(b.nodeName==="LINK"||b.getAttribute("media")!=="not all")&&(r.set(b.dataset.precedence,b),c=b)}c&&r.set(null,c)}h=o.instance,b=h.getAttribute("data-precedence"),m=r.get(b)||c,m===c&&r.set(null,h),r.set(b,h),this.count++,c=wc.bind(this),h.addEventListener("load",c),h.addEventListener("error",c),m?m.parentNode.insertBefore(h,m.nextSibling):(a=a.nodeType===9?a.head:a,a.insertBefore(h,a.firstChild)),o.state.loading|=4}}var xr={$$typeof:R,Provider:null,Consumer:null,_currentValue:he,_currentValue2:he,_threadCount:0};function JC(a,o,r,c,h,m,b,_,T){this.tag=1,this.containerInfo=a,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=Kd(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Kd(0),this.hiddenUpdates=Kd(null),this.identifierPrefix=c,this.onUncaughtError=h,this.onCaughtError=m,this.onRecoverableError=b,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=T,this.incompleteTransitions=new Map}function Yb(a,o,r,c,h,m,b,_,T,j,H,Y){return a=new JC(a,o,r,b,T,j,H,Y,_),o=1,m===!0&&(o|=24),m=cn(3,null,null,o),a.current=m,m.stateNode=a,o=Pu(),o.refCount++,a.pooledCache=o,o.refCount++,m.memoizedState={element:c,isDehydrated:r,cache:o},Uu(m),a}function Kb(a){return a?(a=Ei,a):Ei}function Zb(a,o,r,c,h,m){h=Kb(h),c.context===null?c.context=h:c.pendingContext=h,c=Fa(o),c.payload={element:r},m=m===void 0?null:m,m!==null&&(c.callback=m),r=qa(a,c,o),r!==null&&(en(r,a,o),Js(r,a,o))}function Qb(a,o){if(a=a.memoizedState,a!==null&&a.dehydrated!==null){var r=a.retryLane;a.retryLane=r!==0&&r<o?r:o}}function tf(a,o){Qb(a,o),(a=a.alternate)&&Qb(a,o)}function Xb(a){if(a.tag===13||a.tag===31){var o=Do(a,67108864);o!==null&&en(o,a,67108864),tf(a,67108864)}}function Jb(a){if(a.tag===13||a.tag===31){var o=pn();o=Zd(o);var r=Do(a,o);r!==null&&en(r,a,o),tf(a,o)}}var Sc=!0;function eA(a,o,r,c){var h=q.T;q.T=null;var m=K.p;try{K.p=2,nf(a,o,r,c)}finally{K.p=m,q.T=h}}function tA(a,o,r,c){var h=q.T;q.T=null;var m=K.p;try{K.p=8,nf(a,o,r,c)}finally{K.p=m,q.T=h}}
vendor: 6,496 bytes, line 10
10function nf(a,o,r,c){if(Sc){var h=af(c);if(h===null)zh(a,o,c,_c,r),tv(a,c);else if(aA(h,a,o,r,c))c.stopPropagation();else if(tv(a,c),o&4&&-1<nA.indexOf(a)){for(;h!==null;){var m=bi(h);if(m!==null)switch(m.tag){case 3:if(m=m.stateNode,m.current.memoizedState.isDehydrated){var b=Eo(m.pendingLanes);if(b!==0){var _=m;for(_.pendingLanes|=2,_.entangledLanes|=2;b;){var T=1<<31-rn(b);_.entanglements[1]|=T,b&=~T}Hn(m),(Ge&6)===0&&(sc=Ft()+500,mr(0))}}break;case 31:case 13:_=Do(m,2),_!==null&&en(_,m,2),lc(),tf(m,2)}if(m=af(c),m===null&&zh(a,o,c,_c,r),m===h)break;h=m}h!==null&&c.stopPropagation()}else zh(a,o,c,null,r)}}function af(a){return a=iu(a),of(a)}var _c=null;function of(a){if(_c=null,a=yi(a),a!==null){var o=l(a);if(o===null)a=null;else{var r=o.tag;if(r===13){if(a=d(o),a!==null)return a;a=null}else if(r===31){if(a=u(o),a!==null)return a;a=null}else if(r===3){if(o.stateNode.current.memoizedState.isDehydrated)return o.tag===3?o.stateNode.containerInfo:null;a=null}else o!==a&&(a=null)}}return _c=a,null}function ev(a){switch(a){case"beforetoggle":case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"toggle":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 2;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 8;case"message":switch(Xe()){case Mt:return 2;case Fn:return 8;case mi:case z0:return 32;case dm:return 268435456;default:return 32}default:return 32}}var sf=!1,Qa=null,Xa=null,Ja=null,kr=new Map,Sr=new Map,eo=[],nA="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(" ");function tv(a,o){switch(a){case"focusin":case"focusout":Qa=null;break;case"dragenter":case"dragleave":Xa=null;break;case"mouseover":case"mouseout":Ja=null;break;case"pointerover":case"pointerout":kr.delete(o.pointerId);break;case"gotpointercapture":case"lostpointercapture":Sr.delete(o.pointerId)}}function _r(a,o,r,c,h,m){return a===null||a.nativeEvent!==m?(a={blockedOn:o,domEventName:r,eventSystemFlags:c,nativeEvent:m,targetContainers:[h]},o!==null&&(o=bi(o),o!==null&&Xb(o)),a):(a.eventSystemFlags|=c,o=a.targetContainers,h!==null&&o.indexOf(h)===-1&&o.push(h),a)}function aA(a,o,r,c,h){switch(o){case"focusin":return Qa=_r(Qa,a,o,r,c,h),!0;case"dragenter":return Xa=_r(Xa,a,o,r,c,h),!0;case"mouseover":return Ja=_r(Ja,a,o,r,c,h),!0;case"pointerover":var m=h.pointerId;return kr.set(m,_r(kr.get(m)||null,a,o,r,c,h)),!0;case"gotpointercapture":return m=h.pointerId,Sr.set(m,_r(Sr.get(m)||null,a,o,r,c,h)),!0}return!1}function nv(a){var o=yi(a.target);if(o!==null){var r=l(o);if(r!==null){if(o=r.tag,o===13){if(o=d(r),o!==null){a.blockedOn=o,gm(a.priority,function(){Jb(r)});return}}else if(o===31){if(o=u(r),o!==null){a.blockedOn=o,gm(a.priority,function(){Jb(r)});return}}else if(o===3&&r.stateNode.current.memoizedState.isDehydrated){a.blockedOn=r.tag===3?r.stateNode.containerInfo:null;return}}}a.blockedOn=null}function Cc(a){if(a.blockedOn!==null)return!1;for(var o=a.targetContainers;0<o.length;){var r=af(a.nativeEvent);if(r===null){r=a.nativeEvent;var c=new r.constructor(r.type,r);ou=c,r.target.dispatchEvent(c),ou=null}else return o=bi(r),o!==null&&Xb(o),a.blockedOn=r,!1;o.shift()}return!0}function av(a,o,r){Cc(a)&&r.delete(o)}function oA(){sf=!1,Qa!==null&&Cc(Qa)&&(Qa=null),Xa!==null&&Cc(Xa)&&(Xa=null),Ja!==null&&Cc(Ja)&&(Ja=null),kr.forEach(av),Sr.forEach(av)}function Ac(a,o){a.blockedOn===o&&(a.blockedOn=null,sf||(sf=!0,t.unstable_scheduleCallback(t.unstable_NormalPriority,oA)))}var Tc=null;function ov(a){Tc!==a&&(Tc=a,t.unstable_scheduleCallback(t.unstable_NormalPriority,function(){Tc===a&&(Tc=null);for(var o=0;o<a.length;o+=3){var r=a[o],c=a[o+1],h=a[o+2];if(typeof c!="function"){if(of(c||r)===null)continue;break}var m=bi(r);m!==null&&(a.splice(o,3),o-=3,ah(m,{pending:!0,data:h,method:r.method,action:c},c,h))}}))}function Ji(a){function o(T){return Ac(T,a)}Qa!==null&&Ac(Qa,a),Xa!==null&&Ac(Xa,a),Ja!==null&&Ac(Ja,a),kr.forEach(o),Sr.forEach(o);for(var r=0;r<eo.length;r++){var c=eo[r];c.blockedOn===a&&(c.blockedOn=null)}for(;0<eo.length&&(r=eo[0],r.blockedOn===null);)nv(r),r.blockedOn===null&&eo.shift();if(r=(a.ownerDocument||a).$$reactFormReplay,r!=null)for(c=0;c<r.length;c+=3){var h=r[c],m=r[c+1],b=h[Yt]||null;if(typeof m=="function")b||ov(r);else if(b){var _=null;if(m&&m.hasAttribute("formAction")){if(h=m,b=m[Yt]||null)_=b.formAction;else if(of(h)!==null)continue}else _=b.action;typeof _=="function"?r[c+1]=_:(r.splice(c,3),c-=3),ov(r)}}}function iv(){function a(m){m.canIntercept&&m.info==="react-transition"&&m.intercept({handler:function(){return new Promise(function(b){return h=b})},focusReset:"manual",scroll:"manual"})}function o(){h!==null&&(h(),h=null),c||setTimeout(r,20)}function r(){if(!c&&!navigation.transition){var m=navigation.currentEntry;m&&m.url!=null&&navigation.navigate(m.url,{state:m.getState(),info:"react-transition",history:"replace"})}}if(typeof navigation=="object"){var c=!1,h=null;return navigation.addEventListener("navigate",a),navigation.addEventListener("navigatesuccess",o),navigation.addEventListener("navigateerror",o),setTimeout(r,100),function(){c=!0,navigation.removeEventListener("navigate",a),navigation.removeEventListener("navigatesuccess",o),navigation.removeEventListener("navigateerror",o),h!==null&&(h(),h=null)}}}function rf(a){this._internalRoot=a}Rc.prototype.render=rf.prototype.render=function(a){var o=this._internalRoot;if(o===null)throw Error(i(409));var r=o.current,c=pn();
10Zb(r,c,a,o,null,null)},Rc.prototype.unmount=rf.prototype.unmount=function(){var a=this._internalRoot;if(a!==null){this._internalRoot=null;var o=a.containerInfo;Zb(a.current,2,null,a,null,null),lc(),o[gi]=null}};function Rc(a){this._internalRoot=a}Rc.prototype.unstable_scheduleHydration=function(a){if(a){var o=mm();a={blockedOn:null,target:a,priority:o};for(var r=0;r<eo.length&&o!==0&&o<eo[r].priority;r++);eo.splice(r,0,a),r===0&&nv(a)}};var sv=e.version;if(sv!=="19.2.5")throw Error(i(527,sv,"19.2.5"));K.findDOMNode=function(a){var o=a._reactInternals;if(o===void 0)throw typeof a.render=="function"?Error(i(188)):(a=Object.keys(a).join(","),Error(i(268,a)));return a=p(o),a=a!==null?y(a):null,a=a===null?null:a.stateNode,a};var iA={bundleType:0,version:"19.2.5",rendererPackageName:"react-dom",currentDispatcherRef:q,reconcilerVersion:"19.2.5"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var Ec=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!Ec.isDisabled&&Ec.supportsFiber)try{Ps=Ec.inject(iA),sn=Ec}catch{}}return Ar.createRoot=function(a,o){if(!s(a))throw Error(i(299));var r=!1,c="",h=fy,m=py,b=my;return o!=null&&(o.unstable_strictMode===!0&&(r=!0),o.identifierPrefix!==void 0&&(c=o.identifierPrefix),o.onUncaughtError!==void 0&&(h=o.onUncaughtError),o.onCaughtError!==void 0&&(m=o.onCaughtError),o.onRecoverableError!==void 0&&(b=o.onRecoverableError)),o=Yb(a,1,!1,null,null,r,c,null,h,m,b,iv),a[gi]=o.current,Bh(a),new rf(o)},Ar.hydrateRoot=function(a,o,r){if(!s(a))throw Error(i(299));var c=!1,h="",m=fy,b=py,_=my,T=null;return r!=null&&(r.unstable_strictMode===!0&&(c=!0),r.identifierPrefix!==void 0&&(h=r.identifierPrefix),r.onUncaughtError!==void 0&&(m=r.onUncaughtError),r.onCaughtError!==void 0&&(b=r.onCaughtError),r.onRecoverableError!==void 0&&(_=r.onRecoverableError),r.formState!==void 0&&(T=r.formState)),o=Yb(a,1,!0,o,r??null,c,h,T,m,b,_,iv),o.context=Kb(null),r=o.current,c=pn(),c=Zd(c),h=Fa(c),h.callback=null,qa(r,h,c),r=c,o.current.lanes=r,Ls(o,r),Hn(o),a[gi]=o.current,Bh(a),new Rc(o)},Ar.version="19.2.5",Ar}var gv;function mA(){if(gv)return df.exports;gv=1;function t(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),df.exports=pA(),df.exports}var gA=mA(),yA="__TSS_CONTEXT",ep=Symbol.for("TSS_SERVER_FUNCTION"),yv=Symbol.for("TSS_SERVER_FUNCTION_FACTORY"),bA="application/x-tss-framed",va={JSON:0,CHUNK:1,END:2,ERROR:3},vA=/;\s*v=(\d+)/;function wA(t){const e=t.match(vA);return e?parseInt(e[1],10):void 0}function xA(t){const e=wA(t);if(e!==void 0&&e!==1)throw new Error(`Incompatible framed protocol version: server=${e}, client=1. Please ensure client and server are using compatible versions.`)}var Pp=()=>window.__TSS_START_OPTIONS__,Fx=!1;function Gr(t){return t[t.length-1]}function kA(t){return typeof t=="function"}function fo(t,e){return kA(t)?t(e):t}var SA=Object.prototype.hasOwnProperty,bv=Object.prototype.propertyIsEnumerable,_A=()=>Object.create(null),Vo=(t,e)=>po(t,e,_A);function po(t,e,n=()=>({}),i=0){if(t===e)return t;if(i>500)return e;const s=e,l=xv(t)&&xv(s);if(!l&&!(ks(t)&&ks(s)))return s;const d=l?t:vv(t);if(!d)return s;const u=l?s:vv(s);if(!u)return s;const f=d.length,p=u.length,y=l?new Array(p):n();let g=0;for(let v=0;v<p;v++){const w=l?v:u[v],x=t[w],k=s[w];if(x===k){y[w]=x,(l?v<f:SA.call(t,w))&&g++;continue}if(x===null||k===null||typeof x!="object"||typeof k!="object"){y[w]=k;continue}const S=po(x,k,n,i+1);y[w]=S,S===x&&g++}return f===p&&g===f?t:y}function vv(t){const e=Object.getOwnPropertyNames(t);for(const s of e)if(!bv.call(t,s))return!1;const n=Object.getOwnPropertySymbols(t);if(n.length===0)return e;const i=e;for(const s of n){if(!bv.call(t,s))return!1;i.push(s)}return i}function ks(t){if(!wv(t))return!1;const e=t.constructor;if(typeof e>"u")return!0;const n=e.prototype;return!(!wv(n)||!n.hasOwnProperty("isPrototypeOf"))}function wv(t){return Object.prototype.toString.call(t)==="[object Object]"}function xv(t){return Array.isArray(t)&&t.length===Object.keys(t).length}function nn(t,e,n){if(t===e)return!0;
10if(typeof t!=typeof e)return!1;if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return!1;for(let i=0,s=t.length;i<s;i++)if(!nn(t[i],e[i],n))return!1;return!0}if(ks(t)&&ks(e)){const i=n?.ignoreUndefined??!0;if(n?.partial){for(const d in e)if((!i||e[d]!==void 0)&&!nn(t[d],e[d],n))return!1;return!0}let s=0;if(!i)s=Object.keys(t).length;else for(const d in t)t[d]!==void 0&&s++;let l=0;for(const d in e)if((!i||e[d]!==void 0)&&(l++,l>s||!nn(t[d],e[d],n)))return!1;return s===l}return!1}function ai(t){let e,n;const i=new Promise((s,l)=>{e=s,n=l});return i.status="pending",i.resolve=s=>{i.status="resolved",i.value=s,e(s),t?.(s)},i.reject=s=>{i.status="rejected",n(s)},i}function CA(t){return typeof t?.message!="string"?!1:t.message.startsWith("Failed to fetch dynamically imported module")||t.message.startsWith("error loading dynamically imported module")||t.message.startsWith("Importing a module script failed")}function Wr(t){return!!(t&&typeof t=="object"&&typeof t.then=="function")}function AA(t){return t.replace(/[\x00-\x1f\x7f]/g,"")}function kv(t){let e;try{e=decodeURI(t)}catch{e=t.replaceAll(/%[0-9A-F]{2}/gi,n=>{try{return decodeURI(n)}catch{return n}})}return AA(e)}var TA=["http:","https:","mailto:","tel:"];function rd(t,e){if(!t)return!1;try{const n=new URL(t);return!e.has(n.protocol)}catch{return!1}}var RA={"&":"\\u0026",">":"\\u003e","<":"\\u003c","\u2028":"\\u2028","\u2029":"\\u2029"},EA=/[&><\u2028\u2029]/g;function OA(t){return t.replace(EA,e=>RA[e])}function Tr(t){if(!t)return{path:t,handledProtocolRelativeURL:!1};if(!/[%\\\x00-\x1f\x7f]/.test(t)&&!t.startsWith("//"))return{path:t,handledProtocolRelativeURL:!1};const e=/%25|%5C/gi;let n=0,i="",s;for(;(s=e.exec(t))!==null;)i+=kv(t.slice(n,s.index))+s[0],n=e.lastIndex;i=i+kv(n?t.slice(n):t);let l=!1;return i.startsWith("//")&&(l=!0,i="/"+i.replace(/^\/+/,"")),{path:i,handledProtocolRelativeURL:l}}function IA(t){return/\s|[^\u0000-\u007F]/.test(t)?t.replace(/\s|[^\u0000-\u007F]/gu,encodeURIComponent):t}function MA(t,e){if(t===e)return!0;if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}function an(){throw new Error("Invariant failed")}function $r(t){const e=new Map;let n,i;const s=l=>{l.next&&(l.prev?(l.prev.next=l.next,l.next.prev=l.prev,l.next=void 0,i&&(i.next=l,l.prev=i)):(l.next.prev=void 0,n=l.next,l.next=void 0,i&&(l.prev=i,i.next=l)),i=l)};return{get(l){const d=e.get(l);if(d)return s(d),d.value},set(l,d){if(e.size>=t&&n){const f=n;e.delete(f.key),f.next&&(n=f.next,f.next.prev=void 0),f===i&&(i=void 0)}const u=e.get(l);if(u)u.value=d,s(u);else{const f={key:l,value:d,prev:i};i&&(i.next=f),i=f,n||(n=f),e.set(l,f)}},clear(){e.clear(),n=void 0,i=void 0}}}var mo=4,qx=5;function PA(t){const e=t.indexOf("{");if(e===-1)return null;const n=t.indexOf("}",e);return n===-1||e+1>=t.length?null:[e,n]}function Dp(t,e,n=new Uint16Array(6)){const i=t.indexOf("/",e),s=i===-1?t.length:i,l=t.substring(e,s);if(!l||!l.includes("$"))return n[0]=0,n[1]=e,n[2]=e,n[3]=s,n[4]=s,n[5]=s,n;if(l==="$"){const u=t.length;return n[0]=2,n[1]=e,n[2]=e,n[3]=u,n[4]=u,n[5]=u,n}if(l.charCodeAt(0)===36)return n[0]=1,n[1]=e,n[2]=e+1,n[3]=s,n[4]=s,n[5]=s,n;const d=PA(l);if(d){const[u,f]=d,p=l.charCodeAt(u+1);if(p===45){if(u+2<l.length&&l.charCodeAt(u+2)===36){const y=u+3,g=f;if(y<g)return n[0]=3,n[1]=e+u,n[2]=e+y,n[3]=e+g,n[4]=e+f+1,n[5]=s,n}}else if(p===36){const y=u+1,g=u+2;return g===f?(n[0]=2,n[1]=e+u,n[2]=e+y,n[3]=e+g,n[4]=e+f+1,n[5]=t.length,n):(n[0]=1,n[1]=e+u,n[2]=e+g,n[3]=e+f,n[4]=e+f+1,n[5]=s,n)}}return n[0]=0,n[1]=e,n[2]=e,n[3]=s,n[4]=s,n[5]=s,n}function Pd(t,e,n,i,s,l,d){d?.(n);let u=i;{const f=n.fullPath??n.from,p=f.length,y=n.options?.caseSensitive??t,g=!!(n.options?.params?.parse&&n.options?.skipRouteOnParseError?.params);for(;u<p;){const w=Dp(f,u,e);let x;const k=u,S=w[5];switch(u=S+1,l++,w[0]){case 0:{const C=f.substring(w[2],w[3]);if(y){const E=s.static?.get(C);if(E)x=E;else{s.static??=new Map;const R=Qo(n.fullPath??n.from);R.parent=s,R.depth=l,x=R,s.static.set(C,R)}}else{const E=C.toLowerCase(),R=s.staticInsensitive?.get(E);if(R)x=R;else{s.staticInsensitive??=new Map;const D=Qo(n.fullPath??n.from);D.parent=s,D.depth=l,x=D,s.staticInsensitive.set(E,D)}}break}case 1:{const C=f.substring(k,w[1]),E=f.substring(w[4],S),R=y&&!!(C||E),D=C?R?C:C.toLowerCase():void 0,G=E?R?E:E.toLowerCase():void 0,z=!g&&s.dynamic?.find(N=>!N.skipOnParamError&&N.caseSensitive===R&&N.prefix===D&&N.suffix===G);if(z)x=z;else{const N=mf(1,n.fullPath??n.from,R,D,G);x=N,N.depth=l,N.parent=s,s.dynamic??=[],s.dynamic.push(N)}break}case 3:{const C=f.substring(k,w[1]),E=f.substring(w[4],S),R=y&&!!(C||E),D=C?R?C:C.toLowerCase():void 0,G=E?R?E:E.toLowerCase():void 0,z=!g&&s.optional?.find(N=>!N.skipOnParamError&&N.caseSensitive===R&&N.prefix===D&&N.suffix===G);if(z)x=z;else{const N=mf(3,n.fullPath??n.from,R,D,G);
10x=N,N.parent=s,N.depth=l,s.optional??=[],s.optional.push(N)}break}case 2:{const C=f.substring(k,w[1]),E=f.substring(w[4],S),R=y&&!!(C||E),D=C?R?C:C.toLowerCase():void 0,G=E?R?E:E.toLowerCase():void 0,z=mf(2,n.fullPath??n.from,R,D,G);x=z,z.parent=s,z.depth=l,s.wildcard??=[],s.wildcard.push(z)}}s=x}if(g&&n.children&&!n.isRoot&&n.id&&n.id.charCodeAt(n.id.lastIndexOf("/")+1)===95){const w=Qo(n.fullPath??n.from);w.kind=qx,w.parent=s,l++,w.depth=l,s.pathless??=[],s.pathless.push(w),s=w}const v=(n.path||!n.children)&&!n.isRoot;if(v&&f.endsWith("/")){const w=Qo(n.fullPath??n.from);w.kind=mo,w.parent=s,l++,w.depth=l,s.index=w,s=w}s.parse=n.options?.params?.parse??null,s.skipOnParamError=g,s.parsingPriority=n.options?.skipRouteOnParseError?.priority??0,v&&!s.route&&(s.route=n,s.fullPath=n.fullPath??n.from)}if(n.children)for(const f of n.children)Pd(t,e,f,u,s,l,d)}function pf(t,e){if(t.skipOnParamError&&!e.skipOnParamError)return-1;if(!t.skipOnParamError&&e.skipOnParamError)return 1;if(t.skipOnParamError&&e.skipOnParamError&&(t.parsingPriority||e.parsingPriority))return e.parsingPriority-t.parsingPriority;if(t.prefix&&e.prefix&&t.prefix!==e.prefix){if(t.prefix.startsWith(e.prefix))return-1;if(e.prefix.startsWith(t.prefix))return 1}if(t.suffix&&e.suffix&&t.suffix!==e.suffix){if(t.suffix.endsWith(e.suffix))return-1;if(e.suffix.endsWith(t.suffix))return 1}return t.prefix&&!e.prefix?-1:!t.prefix&&e.prefix?1:t.suffix&&!e.suffix?-1:!t.suffix&&e.suffix?1:t.caseSensitive&&!e.caseSensitive?-1:!t.caseSensitive&&e.caseSensitive?1:0}function ro(t){if(t.pathless)for(const e of t.pathless)ro(e);if(t.static)for(const e of t.static.values())ro(e);if(t.staticInsensitive)for(const e of t.staticInsensitive.values())ro(e);if(t.dynamic?.length){t.dynamic.sort(pf);for(const e of t.dynamic)ro(e)}if(t.optional?.length){t.optional.sort(pf);for(const e of t.optional)ro(e)}if(t.wildcard?.length){t.wildcard.sort(pf);for(const e of t.wildcard)ro(e)}}function Qo(t){return{kind:0,depth:0,pathless:null,index:null,static:null,staticInsensitive:null,dynamic:null,optional:null,wildcard:null,route:null,fullPath:t,parent:null,parse:null,skipOnParamError:!1,parsingPriority:0}}function mf(t,e,n,i,s){return{kind:t,depth:0,pathless:null,index:null,static:null,staticInsensitive:null,dynamic:null,optional:null,wildcard:null,route:null,fullPath:e,parent:null,parse:null,skipOnParamError:!1,parsingPriority:0,caseSensitive:n,prefix:i,suffix:s}}function DA(t,e){const n=Qo("/"),i=new Uint16Array(6);for(const s of t)Pd(!1,i,s,1,n,0);ro(n),e.masksTree=n,e.flatCache=$r(1e3)}function LA(t,e){t||="/";const n=e.flatCache.get(t);if(n)return n;const i=Lp(t,e.masksTree);return e.flatCache.set(t,i),i}function NA(t,e,n,i,s){t||="/",i||="/";const l=e?`case\0${t}`:t;let d=s.singleCache.get(l);return d||(d=Qo("/"),Pd(e,new Uint16Array(6),{from:t},1,d,0),s.singleCache.set(l,d)),Lp(i,d,n)}function UA(t,e,n=!1){const i=n?t:`nofuzz\0${t}`,s=e.matchCache.get(i);if(s!==void 0)return s;t||="/";let l;try{l=Lp(t,e.segmentTree,n)}catch(d){if(d instanceof URIError)l=null;else throw d}return l&&(l.branch=qA(l.route)),e.matchCache.set(i,l),l}function jA(t){return t==="/"?t:t.replace(/\/{1,}$/,"")}function FA(t,e=!1,n){const i=Qo(t.fullPath),s=new Uint16Array(6),l={},d={};let u=0;return Pd(e,s,t,1,i,0,f=>{if(n?.(f,u),f.id in l&&an(),l[f.id]=f,u!==0&&f.path){const p=jA(f.fullPath);(!d[p]||f.fullPath.endsWith("/"))&&(d[p]=f)}u++}),ro(i),{processedTree:{segmentTree:i,singleCache:$r(1e3),matchCache:$r(1e3),flatCache:null,masksTree:null},routesById:l,routesByPath:d}}function Lp(t,e,n=!1){const i=t.split("/"),s=zA(t,i,e,n);if(!s)return null;const[l]=Bx(t,i,s);return{route:s.node.route,rawParams:l,parsedParams:s.parsedParams}}function Bx(t,e,n){const i=BA(n.node);let s=null;const l=Object.create(null);let d=n.extract?.part??0,u=n.extract?.node??0,f=n.extract?.path??0,p=n.extract?.segment??0;for(;u<i.length;d++,u++,f++,p++){const y=i[u];if(y.kind===mo)break;if(y.kind===qx){p--,d--,f--;continue}const g=e[d],v=f;if(g&&(f+=g.length),y.kind===1){s??=n.node.fullPath.split("/");const w=s[p],x=y.prefix?.length??0;if(w.charCodeAt(x)===123){const k=y.suffix?.length??0,S=w.substring(x+2,w.length-k-1),C=g.substring(x,g.length-k);l[S]=decodeURIComponent(C)}
10else{const k=w.substring(1);l[k]=decodeURIComponent(g)}}else if(y.kind===3){if(n.skipped&1<<u){d--,f=v-1;continue}s??=n.node.fullPath.split("/");const w=s[p],x=y.prefix?.length??0,k=y.suffix?.length??0,S=w.substring(x+3,w.length-k-1),C=y.suffix||y.prefix?g.substring(x,g.length-k):g;C&&(l[S]=decodeURIComponent(C))}else if(y.kind===2){const w=y,x=t.substring(v+(w.prefix?.length??0),t.length-(w.suffix?.length??0)),k=decodeURIComponent(x);l["*"]=k,l._splat=k;break}}return n.rawParams&&Object.assign(l,n.rawParams),[l,{part:d,node:u,path:f,segment:p}]}function qA(t){const e=[t];for(;t.parentRoute;)t=t.parentRoute,e.push(t);return e.reverse(),e}function BA(t){const e=Array(t.depth+1);do e[t.depth]=t,t=t.parent;while(t);return e}function zA(t,e,n,i){if(t==="/"&&n.index)return{node:n.index,skipped:0};const s=!Gr(e),l=s&&t!=="/",d=e.length-(s?1:0),u=[{node:n,index:1,skipped:0,depth:1,statics:0,dynamics:0,optionals:0}];let f=null,p=null;for(;u.length;){const y=u.pop(),{node:g,index:v,skipped:w,depth:x,statics:k,dynamics:S,optionals:C}=y;let{extract:E,rawParams:R,parsedParams:D}=y;if(g.kind===2&&g.route&&!Ic(p,y))continue;if(g.skipOnParamError){if(!Sv(t,e,y))continue;R=y.rawParams,E=y.extract,D=y.parsedParams}i&&g.route&&g.kind!==mo&&Ic(f,y)&&(f=y);const G=v===d;if(G&&(g.route&&(!l||g.kind===mo||g.kind===2)&&Ic(p,y)&&(p=y),!g.optional&&!g.wildcard&&!g.index&&!g.pathless))continue;const z=G?void 0:e[v];let N;if(G&&g.index){const P={node:g.index,index:v,skipped:w,depth:x+1,statics:k,dynamics:S,optionals:C,extract:E,rawParams:R,parsedParams:D};let W=!0;if(g.index.skipOnParamError&&(Sv(t,e,P)||(W=!1)),W){if(!S&&!C&&!w&&HA(k,d))return P;Ic(p,P)&&(p=P)}}if(g.wildcard)for(let P=g.wildcard.length-1;P>=0;P--){const W=g.wildcard[P],{prefix:oe,suffix:ne}=W;if(!(oe&&(G||!(W.caseSensitive?z:N??=z.toLowerCase()).startsWith(oe)))){if(ne){if(G)continue;const we=e.slice(v).join("/").slice(-ne.length);if((W.caseSensitive?we:we.toLowerCase())!==ne)continue}u.push({node:W,index:d,skipped:w,depth:x+1,statics:k,dynamics:S,optionals:C,extract:E,rawParams:R,parsedParams:D})}}if(g.optional){const P=w|1<<x,W=x+1;for(let oe=g.optional.length-1;oe>=0;oe--){const ne=g.optional[oe];u.push({node:ne,index:v,skipped:P,depth:W,statics:k,dynamics:S,optionals:C,extract:E,rawParams:R,parsedParams:D})}if(!G)for(let oe=g.optional.length-1;oe>=0;oe--){const ne=g.optional[oe],{prefix:we,suffix:Fe}=ne;if(we||Fe){const tt=ne.caseSensitive?z:N??=z.toLowerCase();if(we&&!tt.startsWith(we)||Fe&&!tt.endsWith(Fe))continue}u.push({node:ne,index:v+1,skipped:w,depth:W,statics:k,dynamics:S,optionals:C+Oc(d,v),extract:E,rawParams:R,parsedParams:D})}}if(!G&&g.dynamic&&z)for(let P=g.dynamic.length-1;P>=0;P--){const W=g.dynamic[P],{prefix:oe,suffix:ne}=W;if(oe||ne){const we=W.caseSensitive?z:N??=z.toLowerCase();if(oe&&!we.startsWith(oe)||ne&&!we.endsWith(ne))continue}u.push({node:W,index:v+1,skipped:w,depth:x+1,statics:k,dynamics:S+Oc(d,v),optionals:C,extract:E,rawParams:R,parsedParams:D})}if(!G&&g.staticInsensitive){const P=g.staticInsensitive.get(N??=z.toLowerCase());P&&u.push({node:P,index:v+1,skipped:w,depth:x+1,statics:k+Oc(d,v),dynamics:S,optionals:C,extract:E,rawParams:R,parsedParams:D})}if(!G&&g.static){const P=g.static.get(z);P&&u.push({node:P,index:v+1,skipped:w,depth:x+1,statics:k+Oc(d,v),dynamics:S,optionals:C,extract:E,rawParams:R,parsedParams:D})}if(g.pathless){const P=x+1;for(let W=g.pathless.length-1;W>=0;W--){const oe=g.pathless[W];u.push({node:oe,index:v,skipped:w,depth:P,statics:k,dynamics:S,optionals:C,extract:E,rawParams:R,parsedParams:D})}}}if(p)return p;if(i&&f){let y=f.index;for(let v=0;v<f.index;v++)y+=e[v].length;const g=y===t.length?"/":t.slice(y);return f.rawParams??=Object.create(null),f.rawParams["**"]=decodeURIComponent(g),f}return null}function Oc(t,e){return 2**(t-e-1)}function HA(t,e){return t===2**(e-1)-1}function Sv(t,e,n){try{const[i,s]=Bx(t,e,n);n.rawParams=i,n.extract=s;const l=n.node.parse(i);return n.parsedParams=Object.assign(Object.create(null),n.parsedParams,l),!0}catch{return null}}function Ic(t,e){return t?e.statics>t.statics||e.statics===t.statics&&(e.dynamics>t.dynamics||e.dynamics===t.dynamics&&(e.optionals>t.optionals||e.optionals===t.optionals&&((e.node.kind===mo)>(t.node.kind===mo)||e.node.kind===mo==(t.node.kind===mo)&&e.depth>t.depth))):!0}function Xc(t){return Np(t.filter(e=>e!==void 0).join("/"))}function Np(t){return t.replace(/\/{2,}/g,"/")}function zx(t){return t==="/"?t:t.replace(/^\/{1,}/,"")}function vo(t){const e=t.length;return e>1&&t[e-1]==="/"?t.replace(/\/{1,}$/,""):t}function Hx(t){return vo(zx(t))}function ld(t,e){return t?.endsWith("/")&&t!=="/"&&t!==`${e}/`?t.slice(0,-1):t}function GA(t,e,n){return ld(t,n)===ld(e,n)}function WA({base:t,to:e,trailingSlash:n="never",cache:i}){const s=e.startsWith("/"),l=!s&&e===".";let d;if(i){d=s?e:l?t:t+"\0"+e;const g=i.get(d);if(g)return g}let u;if(l)u=t.split("/");else if(s)u=e.split("/");else{for(u=t.split("/");u.length>1&&Gr(u)==="";)u.pop();const g=e.split("/");for(let v=0,w=g.length;v<w;v++){const x=g[v];x===""?v?v===w-1&&u.push(x):u=[x]:x===".."?u.pop():x==="."||u.push(x)}}u.length>1&&(Gr(u)===""?n==="never"&&u.pop():n==="always"&&u.push(""));let f,p="";for(let g=0;g<u.length;g++){g>0&&(p+="/");const v=u[g];if(!v)continue;f=Dp(v,0,f);const w=f[0];if(w===0){p+=v;continue}const x=f[5],k=v.substring(0,f[1]),S=v.substring(f[4],x),C=v.substring(f[2],f[3]);w===1?p+=k||S?`${k}{$${C}}${S}`:`$${C}`:w===2?p+=k||S?`${k}{$}${S}`:"$":p+=`${k}{-$${C}}${S}`}p=Np(p);const y=p||"/";return d&&i&&i.set(d,y),y}function $A(t){const e=new Map(t.map(s=>[encodeURIComponent(s),s])),n=Array.from(e.keys()).map(s=>s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),i=new RegExp(n,"g");return s=>s.replace(i,l=>e.get(l)??l)}function gf(t,e,n){const i=e[t];
10return typeof i!="string"?i:t==="_splat"?/^[a-zA-Z0-9\-._~!/]*$/.test(i)?i:i.split("/").map(s=>Cv(s,n)).join("/"):Cv(i,n)}function _v({path:t,params:e,decoder:n,...i}){let s=!1;const l=Object.create(null);if(!t||t==="/")return{interpolatedPath:"/",usedParams:l,isMissingParams:s};if(!t.includes("$"))return{interpolatedPath:t,usedParams:l,isMissingParams:s};const d=t.length;let u=0,f,p="";for(;u<d;){const y=u;f=Dp(t,y,f);const g=f[5];if(u=g+1,y===g)continue;const v=f[0];if(v===0){p+="/"+t.substring(y,g);continue}if(v===2){const w=e._splat;l._splat=w,l["*"]=w;const x=t.substring(y,f[1]),k=t.substring(f[4],g);if(!w){s=!0,(x||k)&&(p+="/"+x+k);continue}const S=gf("_splat",e,n);p+="/"+x+S+k;continue}if(v===1){const w=t.substring(f[2],f[3]);!s&&!(w in e)&&(s=!0),l[w]=e[w];const x=t.substring(y,f[1]),k=t.substring(f[4],g),S=gf(w,e,n)??"undefined";p+="/"+x+S+k;continue}if(v===3){const w=t.substring(f[2],f[3]),x=e[w];if(x==null)continue;l[w]=x;const k=t.substring(y,f[1]),S=t.substring(f[4],g),C=gf(w,e,n)??"";p+="/"+k+C+S;continue}}return t.endsWith("/")&&(p+="/"),{usedParams:l,interpolatedPath:p||"/",isMissingParams:s}}function Cv(t,e){const n=encodeURIComponent(t);return e?.(n)??n}function Up(t={}){if(t.isNotFound=!0,t.throw)throw t;return t}function Ot(t){return t?.isNotFound===!0}function VA(){try{return typeof window<"u"&&typeof window.sessionStorage=="object"?window.sessionStorage:void 0}catch{return}}var YA="tsr-scroll-restoration-v1_3";function KA(){const t=VA();if(!t)return null;let e={};try{const i=JSON.parse(t.getItem("tsr-scroll-restoration-v1_3")||"{}");ks(i)&&(e=i)}catch{}return{get state(){return e},set:i=>{e=fo(i,e)||e},persist:()=>{try{t.setItem(YA,JSON.stringify(e))}catch{}}}}var Av=KA(),ZA=t=>t.state.__TSR_key||t.href;function QA(t){const e=[];let n;for(;n=t.parentNode;)e.push(`${t.tagName}:nth-child(${Array.prototype.indexOf.call(n.children,t)+1})`),t=n;return`${e.reverse().join(" > ")}`.toLowerCase()}var Mc=!1,Rr="window",Tv="data-scroll-restoration-id";function XA(t,e){if(!Av)return;const n=Av;if((t.options.scrollRestoration??!1)&&(t.isScrollRestoring=!0),t.isScrollRestorationSetup||!n)return;t.isScrollRestorationSetup=!0,Mc=!1;const i=t.options.getScrollRestorationKey||ZA,s=new Map;window.history.scrollRestoration="manual";const l=u=>{if(!(Mc||!t.isScrollRestoring))if(u.target===document||u.target===window)s.set(Rr,{scrollX:window.scrollX||0,scrollY:window.scrollY||0});else{const f=u.target;s.set(f,{scrollX:f.scrollLeft||0,scrollY:f.scrollTop||0})}},d=u=>{if(!t.isScrollRestoring||!u||s.size===0||!n)return;const f=n.state[u]||={};for(const[p,y]of s){let g;if(p===Rr)g=Rr;else if(p.isConnected){const v=p.getAttribute(Tv);g=v?`[${Tv}="${v}"]`:QA(p)}g&&(f[g]=y)}};document.addEventListener("scroll",l,!0),t.subscribe("onBeforeLoad",u=>{d(u.fromLocation?i(u.fromLocation):void 0),s.clear()}),window.addEventListener("pagehide",()=>{d(i(t.stores.resolvedLocation.get()??t.stores.location.get())),n.persist()}),t.subscribe("onRendered",u=>{const f=i(u.toLocation),p=t.options.scrollRestorationBehavior,y=t.options.scrollToTopSelectors;if(s.clear(),!t.resetNextScroll){t.resetNextScroll=!0;return}if(!(typeof t.options.scrollRestoration=="function"&&!t.options.scrollRestoration({location:t.latestLocation}))){Mc=!0;try{const g=t.isScrollRestoring?n.state[f]:void 0;let v=!1;if(g)for(const w in g){const x=g[w];if(!ks(x))continue;const{scrollX:k,scrollY:S}=x;if(!(!Number.isFinite(k)||!Number.isFinite(S))){if(w===Rr)window.scrollTo({top:S,left:k,behavior:p}),v=!0;else if(w){let C;try{C=document.querySelector(w)}catch{continue}C&&(C.scrollLeft=k,C.scrollTop=S,v=!0)}}}if(!v){const w=t.history.location.hash.slice(1);if(w){const x=window.history.state?.__hashScrollIntoViewOptions??!0;if(x){const k=document.getElementById(w);k&&k.scrollIntoView(x)}}else{const x={top:0,left:0,behavior:p};if(window.scrollTo(x),y)for(const k of y){if(k===Rr)continue;const S=typeof k=="function"?k():document.querySelector(k);S&&S.scrollTo(x)}}}}finally{Mc=!1}t.isScrollRestoring&&n.set(g=>(g[f]||={},g))}})}function Gx(t,e=String){const n=new URLSearchParams;for(const i in t){const s=t[i];s!==void 0&&n.set(i,e(s))}return n.toString()}function yf(t){return t?t==="false"?!1:t==="true"?!0:+t*0===0&&+t+""===t?+t:t:""}function JA(t){const e=new URLSearchParams(t),n=Object.create(null);for(const[i,s]of e.entries()){const l=n[i];l==null?n[i]=yf(s):Array.isArray(l)?l.push(yf(s)):n[i]=[l,yf(s)]}return n}var eT=nT(JSON.parse),tT=aT(JSON.stringify,JSON.parse);function nT(t){return e=>{e[0]==="?"&&(e=e.substring(1));const n=JA(e);for(const i in n){const s=n[i];if(typeof s=="string")try{n[i]=t(s)}catch{}}return n}}function aT(t,e){const n=typeof e=="function";
10function i(s){if(typeof s=="object"&&s!==null)try{return t(s)}catch{}else if(n&&typeof s=="string")try{return e(s),t(s)}catch{}return s}return s=>{const l=Gx(s,i);return l?`?${l}`:""}}var ei="__root__";function Vr(t){if(t.statusCode=t.statusCode||t.code||307,!t._builtLocation&&!t.reloadDocument&&typeof t.href=="string")try{new URL(t.href),t.reloadDocument=!0}catch{}const e=new Headers(t.headers);t.href&&e.get("Location")===null&&e.set("Location",t.href);const n=new Response(null,{status:t.statusCode,headers:e});if(n.options=t,t.throw)throw n;return n}function jt(t){return t instanceof Response&&!!t.options}function Wx(t){if(t!==null&&typeof t=="object"&&t.isSerializedRedirect)return Vr(t)}function oT(t){return{input:({url:e})=>{for(const n of t)e=tp(n,e);return e},output:({url:e})=>{for(let n=t.length-1;n>=0;n--)e=$x(t[n],e);return e}}}function iT(t){const e=Hx(t.basepath),n=`/${e}`,i=`${n}/`,s=t.caseSensitive?n:n.toLowerCase(),l=t.caseSensitive?i:i.toLowerCase();return{input:({url:d})=>{const u=t.caseSensitive?d.pathname:d.pathname.toLowerCase();return u===s?d.pathname="/":u.startsWith(l)&&(d.pathname=d.pathname.slice(n.length)),d},output:({url:d})=>(d.pathname=Xc(["/",e,d.pathname]),d)}}function tp(t,e){const n=t?.input?.({url:e});if(n){if(typeof n=="string")return new URL(n);if(n instanceof URL)return n}return e}function $x(t,e){const n=t?.output?.({url:e});if(n){if(typeof n=="string")return new URL(n);if(n instanceof URL)return n}return e}function sT(t,e){const{createMutableStore:n,createReadonlyStore:i,batch:s,init:l}=e,d=new Map,u=new Map,f=new Map,p=n(t.status),y=n(t.loadedAt),g=n(t.isLoading),v=n(t.isTransitioning),w=n(t.location),x=n(t.resolvedLocation),k=n(t.statusCode),S=n(t.redirect),C=n([]),E=n([]),R=n([]),D=i(()=>bf(d,C.get())),G=i(()=>bf(u,E.get())),z=i(()=>bf(f,R.get())),N=i(()=>C.get()[0]),P=i(()=>C.get().some(K=>d.get(K)?.get().status==="pending")),W=i(()=>({locationHref:w.get().href,resolvedLocationHref:x.get()?.href,status:p.get()})),oe=i(()=>({status:p.get(),loadedAt:y.get(),isLoading:g.get(),isTransitioning:v.get(),matches:D.get(),location:w.get(),resolvedLocation:x.get(),statusCode:k.get(),redirect:S.get()})),ne=$r(64);function we(K){let he=ne.get(K);return he||(he=i(()=>{const Le=C.get();for(const X of Le){const O=d.get(X);if(O&&O.routeId===K)return O.get()}}),ne.set(K,he)),he}const Fe={status:p,loadedAt:y,isLoading:g,isTransitioning:v,location:w,resolvedLocation:x,statusCode:k,redirect:S,matchesId:C,pendingIds:E,cachedIds:R,matches:D,pendingMatches:G,cachedMatches:z,firstId:N,hasPending:P,matchRouteDeps:W,matchStores:d,pendingMatchStores:u,cachedMatchStores:f,__store:oe,getRouteMatchStore:we,setMatches:tt,setPending:qe,setCached:q};tt(t.matches),l?.(Fe);function tt(K){vf(K,d,C,n,s)}function qe(K){vf(K,u,E,n,s)}function q(K){vf(K,f,R,n,s)}return Fe}function bf(t,e){const n=[];for(const i of e){const s=t.get(i);s&&n.push(s.get())}return n}function vf(t,e,n,i,s){const l=t.map(u=>u.id),d=new Set(l);s(()=>{for(const u of e.keys())d.has(u)||e.delete(u);for(const u of t){const f=e.get(u.id);if(!f){const p=i(u);p.routeId=u.routeId,e.set(u.id,p);continue}f.routeId=u.routeId,f.get()!==u&&f.set(u)}MA(n.get(),l)||n.set(l)})}var np=t=>{if(!t.rendered)return t.rendered=!0,t.onReady?.()},rT=t=>t.stores.matchesId.get().some(e=>t.stores.matchStores.get(e)?.get()._forcePending),Dd=(t,e)=>!!(t.preload&&!t.router.stores.matchStores.has(e)),ti=(t,e,n=!0)=>{const i={...t.router.options.context??{}},s=n?e:e-1;for(let l=0;l<=s;l++){const d=t.matches[l];if(!d)continue;const u=t.router.getMatch(d.id);u&&Object.assign(i,u.__routeContext,u.__beforeLoadContext)}return i},Rv=(t,e)=>{if(!t.matches.length)return;const n=e.routeId,i=t.matches.findIndex(d=>d.routeId===t.router.routeTree.id),s=i>=0?i:0;let l=n?t.matches.findIndex(d=>d.routeId===n):t.firstBadMatchIndex??t.matches.length-1;l<0&&(l=s);for(let d=l;d>=0;d--){const u=t.matches[d];if(t.router.looseRoutesById[u.routeId].options.notFoundComponent)return d}return n?l:s},go=(t,e,n)=>{if(!(!jt(n)&&!Ot(n)))throw jt(n)&&n.redirectHandled&&!n.options.reloadDocument||(e&&(e._nonReactive.beforeLoadPromise?.resolve(),e._nonReactive.loaderPromise?.resolve(),e._nonReactive.beforeLoadPromise=void 0,e._nonReactive.loaderPromise=void 0,e._nonReactive.error=n,t.updateMatch(e.id,i=>({...i,status:jt(n)?"redirected":Ot(n)?"notFound":i.status==="pending"?"success":i.status,context:ti(t,e.index),isFetching:!1,error:n})),Ot(n)&&!n.routeId&&(n.routeId=e.routeId),e._nonReactive.loadPromise?.resolve()),jt(n)&&(t.rendered=!0,n.options._fromLocation=t.location,n.redirectHandled=!0,n=t.router.resolveRedirect(n))),n},Vx=(t,e)=>{const n=t.router.getMatch(e);return!!(!n||n._nonReactive.dehydrated)},Ev=(t,e,n)=>{const i=ti(t,n);t.updateMatch(e,s=>({...s,context:i}))},Er=(t,e,n,i)=>{const{id:s,routeId:l}=t.matches[e],d=t.router.looseRoutesById[l];if(n instanceof Promise)throw n;n.routerCode=i,t.firstBadMatchIndex??=e,go(t,t.router.getMatch(s),n);try{d.options.onError?.(n)}catch(u){n=u,go(t,t.router.getMatch(s),n)}t.updateMatch(s,u=>(u._nonReactive.beforeLoadPromise?.resolve(),u._nonReactive.beforeLoadPromise=void 0,u._nonReactive.loadPromise?.resolve(),{...u,error:n,status:"error",isFetching:!1,updatedAt:Date.now(),abortController:new AbortController})),!t.preload&&!jt(n)&&!Ot(n)&&(t.serialError??=n)},Yx=(t,e,n,i)=>
10{if(i._nonReactive.pendingTimeout!==void 0)return;const s=n.options.pendingMs??t.router.options.defaultPendingMs;if(t.onReady&&!Dd(t,e)&&(n.options.loader||n.options.beforeLoad||Zx(n))&&typeof s=="number"&&s!==1/0&&(n.options.pendingComponent??t.router.options?.defaultPendingComponent)){const l=setTimeout(()=>{np(t)},s);i._nonReactive.pendingTimeout=l}},lT=(t,e,n)=>{const i=t.router.getMatch(e);if(!i._nonReactive.beforeLoadPromise&&!i._nonReactive.loaderPromise)return;Yx(t,e,n,i);const s=()=>{const l=t.router.getMatch(e);l.preload&&(l.status==="redirected"||l.status==="notFound")&&go(t,l,l.error)};return i._nonReactive.beforeLoadPromise?i._nonReactive.beforeLoadPromise.then(s):s()},cT=(t,e,n,i)=>{const s=t.router.getMatch(e);let l=s._nonReactive.loadPromise;s._nonReactive.loadPromise=ai(()=>{l?.resolve(),l=void 0});const{paramsError:d,searchError:u}=s;d&&Er(t,n,d,"PARSE_PARAMS"),u&&Er(t,n,u,"VALIDATE_SEARCH"),Yx(t,e,i,s);const f=new AbortController;let p=!1;const y=()=>{p||(p=!0,t.updateMatch(e,D=>({...D,isFetching:"beforeLoad",fetchCount:D.fetchCount+1,abortController:f})))},g=()=>{s._nonReactive.beforeLoadPromise?.resolve(),s._nonReactive.beforeLoadPromise=void 0,t.updateMatch(e,D=>({...D,isFetching:!1}))};if(!i.options.beforeLoad){t.router.batch(()=>{y(),g()});return}s._nonReactive.beforeLoadPromise=ai();const v={...ti(t,n,!1),...s.__routeContext},{search:w,params:x,cause:k}=s,S=Dd(t,e),C={search:w,abortController:f,params:x,preload:S,context:v,location:t.location,navigate:D=>t.router.navigate({...D,_fromLocation:t.location}),buildLocation:t.router.buildLocation,cause:S?"preload":k,matches:t.matches,routeId:i.id,...t.router.options.additionalContext},E=D=>{if(D===void 0){t.router.batch(()=>{y(),g()});return}(jt(D)||Ot(D))&&(y(),Er(t,n,D,"BEFORE_LOAD")),t.router.batch(()=>{y(),t.updateMatch(e,G=>({...G,__beforeLoadContext:D})),g()})};let R;try{if(R=i.options.beforeLoad(C),Wr(R))return y(),R.catch(D=>{Er(t,n,D,"BEFORE_LOAD")}).then(E)}catch(D){y(),Er(t,n,D,"BEFORE_LOAD")}E(R)},dT=(t,e)=>{const{id:n,routeId:i}=t.matches[e],s=t.router.looseRoutesById[i],l=()=>u(),d=()=>cT(t,n,e,s),u=()=>{if(Vx(t,n))return;const f=lT(t,n,s);return Wr(f)?f.then(d):d()};return l()},uT=(t,e,n)=>{const i=t.router.getMatch(e);if(!i||!n.options.head&&!n.options.scripts&&!n.options.headers)return;const s={ssr:t.router.options.ssr,matches:t.matches,match:i,params:i.params,loaderData:i.loaderData};return Promise.all([n.options.head?.(s),n.options.scripts?.(s),n.options.headers?.(s)]).then(([l,d,u])=>({meta:l?.meta,links:l?.links,headScripts:l?.scripts,headers:u,scripts:d,styles:l?.styles}))},Kx=(t,e,n,i,s)=>{const l=e[i-1],{params:d,loaderDeps:u,abortController:f,cause:p}=t.router.getMatch(n),y=ti(t,i),g=Dd(t,n);return{params:d,deps:u,preload:!!g,parentMatchPromise:l,abortController:f,context:y,location:t.location,navigate:v=>t.router.navigate({...v,_fromLocation:t.location}),cause:g?"preload":p,route:s,...t.router.options.additionalContext}},Ov=async(t,e,n,i,s)=>{try{const l=t.router.getMatch(n);try{(!(Fx??t.router.isServer)||l.ssr===!0)&&Yr(s);const d=s.options.loader,u=typeof d=="function"?d:d?.handler,f=u?.(Kx(t,e,n,i,s)),p=!!u&&Wr(f);if((p||s._lazyPromise||s._componentsPromise||s.options.head||s.options.scripts||s.options.headers||l._nonReactive.minPendingPromise)&&t.updateMatch(n,g=>({...g,isFetching:"loader"})),u){const g=p?await f:f;go(t,t.router.getMatch(n),g),g!==void 0&&t.updateMatch(n,v=>({...v,loaderData:g}))}s._lazyPromise&&await s._lazyPromise;const y=l._nonReactive.minPendingPromise;y&&await y,s._componentsPromise&&await s._componentsPromise,t.updateMatch(n,g=>({...g,error:void 0,context:ti(t,i),status:"success",isFetching:!1,updatedAt:Date.now()}))}catch(d){let u=d;if(u?.name==="AbortError"){if(l.abortController.signal.aborted){l._nonReactive.loaderPromise?.resolve(),l._nonReactive.loaderPromise=void 0;return}t.updateMatch(n,p=>({...p,status:p.status==="pending"?"success":p.status,isFetching:!1,context:ti(t,i)}));return}const f=l._nonReactive.minPendingPromise;f&&await f,Ot(d)&&await s.options.notFoundComponent?.preload?.(),go(t,t.router.getMatch(n),d);try{s.options.onError?.(d)}catch(p){u=p,go(t,t.router.getMatch(n),p)}!jt(u)&&!Ot(u)&&await Yr(s,["errorComponent"]),t.updateMatch(n,p=>({...p,error:u,context:ti(t,i),status:"error",isFetching:!1}))}}catch(l){const d=t.router.getMatch(n);d&&(d._nonReactive.loaderPromise=void 0),go(t,d,l)}},hT=async(t,e,n)=>{async function i(w,x,k,S,C){const E=Date.now()-x.updatedAt,R=w?C.options.preloadStaleTime??t.router.options.defaultPreloadStaleTime??3e4:C.options.staleTime??t.router.options.defaultStaleTime??0,D=C.options.shouldReload,G=typeof D=="function"?D(Kx(t,e,s,n,C)):D,{status:z,invali
10d:N}=S,P=E>=R&&(!!t.forceStaleReload||S.cause==="enter"||k!==void 0&&k!==S.id);d=z==="success"&&(N||(G??P)),w&&C.options.preload===!1||(d&&!t.sync&&y?(u=!0,(async()=>{try{await Ov(t,e,s,n,C);const W=t.router.getMatch(s);W._nonReactive.loaderPromise?.resolve(),W._nonReactive.loadPromise?.resolve(),W._nonReactive.loaderPromise=void 0,W._nonReactive.loadPromise=void 0}catch(W){jt(W)&&await t.router.navigate(W.options)}})()):z!=="success"||d?await Ov(t,e,s,n,C):Ev(t,s,n))}const{id:s,routeId:l}=t.matches[n];let d=!1,u=!1;const f=t.router.looseRoutesById[l],p=f.options.loader,y=((typeof p=="function"?void 0:p?.staleReloadMode)??t.router.options.defaultStaleReloadMode)!=="blocking";if(Vx(t,s)){if(!t.router.getMatch(s))return t.matches[n];Ev(t,s,n)}else{const w=t.router.getMatch(s),x=t.router.stores.matchesId.get()[n],k=(x&&t.router.stores.matchStores.get(x)||null)?.routeId===l?x:t.router.stores.matches.get().find(C=>C.routeId===l)?.id,S=Dd(t,s);if(w._nonReactive.loaderPromise){if(w.status==="success"&&!t.sync&&!w.preload&&y)return w;await w._nonReactive.loaderPromise;const C=t.router.getMatch(s),E=C._nonReactive.error||C.error;E&&go(t,C,E),C.status==="pending"&&await i(S,w,k,C,f)}else{const C=S&&!t.router.stores.matchStores.has(s),E=t.router.getMatch(s);E._nonReactive.loaderPromise=ai(),C!==E.preload&&t.updateMatch(s,R=>({...R,preload:C})),await i(S,w,k,E,f)}}const g=t.router.getMatch(s);u||(g._nonReactive.loaderPromise?.resolve(),g._nonReactive.loadPromise?.resolve(),g._nonReactive.loadPromise=void 0),clearTimeout(g._nonReactive.pendingTimeout),g._nonReactive.pendingTimeout=void 0,u||(g._nonReactive.loaderPromise=void 0),g._nonReactive.dehydrated=void 0;const v=u?g.isFetching:!1;return v!==g.isFetching||g.invalid!==!1?(t.updateMatch(s,w=>({...w,isFetching:v,invalid:!1})),t.router.getMatch(s)):g};async function Iv(t){const e=t,n=[];rT(e.router)&&np(e);let i;for(let v=0;v<e.matches.length;v++){try{const w=dT(e,v);Wr(w)&&await w}catch(w){if(jt(w))throw w;if(Ot(w))i=w;else if(!e.preload)throw w;break}if(e.serialError||e.firstBadMatchIndex!=null)break}const s=e.firstBadMatchIndex??e.matches.length,l=i&&!e.preload?Rv(e,i):void 0,d=i&&e.preload?0:l!==void 0?Math.min(l+1,s):s;let u,f;for(let v=0;v<d;v++)n.push(hT(e,n,v));try{await Promise.all(n)}catch{const v=await Promise.allSettled(n);for(const w of v){if(w.status!=="rejected")continue;const x=w.reason;if(jt(x))throw x;Ot(x)?u??=x:f??=x}if(f!==void 0)throw f}const p=u??(i&&!e.preload?i:void 0);let y=e.firstBadMatchIndex!==void 0?e.firstBadMatchIndex:e.matches.length-1;if(!p&&i&&e.preload)return e.matches;if(p){const v=Rv(e,p);v===void 0&&an();const w=e.matches[v],x=e.router.looseRoutesById[w.routeId],k=e.router.options?.defaultNotFoundComponent;!x.options.notFoundComponent&&k&&(x.options.notFoundComponent=k),p.routeId=w.routeId;const S=w.routeId===e.router.routeTree.id;e.updateMatch(w.id,C=>({...C,...S?{status:"success",globalNotFound:!0,error:void 0}:{status:"notFound",error:p},isFetching:!1})),y=v,await Yr(x,["notFoundComponent"])}else if(!e.preload){const v=e.matches[0];v.globalNotFound||e.router.getMatch(v.id)?.globalNotFound&&e.updateMatch(v.id,w=>({...w,globalNotFound:!1,error:void 0}))}if(e.serialError&&e.firstBadMatchIndex!==void 0){const v=e.router.looseRoutesById[e.matches[e.firstBadMatchIndex].routeId];await Yr(v,["errorComponent"])}for(let v=0;v<=y;v++){const{id:w,routeId:x}=e.matches[v],k=e.router.looseRoutesById[x];try{const S=uT(e,w,k);if(S){const C=await S;e.updateMatch(w,E=>({...E,...C}))}}catch(S){console.error(`Error executing head for route ${x}:`,S)}}const g=np(e);if(Wr(g)&&await g,p)throw p;if(e.serialError&&!e.preload&&!e.onReady)throw e.serialError;return e.matches}function Mv(t,e){const n=e.map(i=>t.options[i]?.preload?.()).filter(Boolean);if(n.length!==0)return Promise.all(n)}function Yr(t,e=Jc){!t._lazyLoaded&&t._lazyPromise===void 0&&(t.lazyFn?t._lazyPromise=t.lazyFn().then(i=>{const{id:s,...l}=i.options;Object.assign(t.options,l),t._lazyLoaded=!0,t._lazyPromise=void 0}):t._lazyLoaded=!0);const n=()=>t._componentsLoaded?void 0:e===Jc?(()=>{if(t._componentsPromise===void 0){const i=Mv(t,Jc);i?t._componentsPromise=i.then(()=>{t._componentsLoaded=!0,t._componentsPromise=void 0}):t._componentsLoaded=!0}return t._componentsPromise})():Mv(t,e);return t._lazyPromise?t._lazyPromise.then(n):n()}function Zx(t){for(const e of Jc)if(t.options[e]?.preload)return!0;return!1}var Jc=["component","errorComponent","pendingComponent","notFoundComponent"],wo="__TSR_index",Pv="popstate",Dv
10="beforeunload";function fT(t){let e=t.getLocation();const n=new Set,i=d=>{e=t.getLocation(),n.forEach(u=>u({location:e,action:d}))},s=d=>{t.notifyOnIndexChange??!0?i(d):e=t.getLocation()},l=async({task:d,navigateOpts:u,...f})=>{if(u?.ignoreBlocker??!1){d();return}const p=t.getBlockers?.()??[],y=f.type==="PUSH"||f.type==="REPLACE";if(typeof document<"u"&&p.length&&y)for(const g of p){const v=cd(f.path,f.state);if(await g.blockerFn({currentLocation:e,nextLocation:v,action:f.type})){t.onBlocked?.();return}}d()};return{get location(){return e},get length(){return t.getLength()},subscribers:n,subscribe:d=>(n.add(d),()=>{n.delete(d)}),push:(d,u,f)=>{const p=e.state[wo];u=Lv(p+1,u),l({task:()=>{t.pushState(d,u),i({type:"PUSH"})},navigateOpts:f,type:"PUSH",path:d,state:u})},replace:(d,u,f)=>{const p=e.state[wo];u=Lv(p,u),l({task:()=>{t.replaceState(d,u),i({type:"REPLACE"})},navigateOpts:f,type:"REPLACE",path:d,state:u})},go:(d,u)=>{l({task:()=>{t.go(d),s({type:"GO",index:d})},navigateOpts:u,type:"GO"})},back:d=>{l({task:()=>{t.back(d?.ignoreBlocker??!1),s({type:"BACK"})},navigateOpts:d,type:"BACK"})},forward:d=>{l({task:()=>{t.forward(d?.ignoreBlocker??!1),s({type:"FORWARD"})},navigateOpts:d,type:"FORWARD"})},canGoBack:()=>e.state[wo]!==0,createHref:d=>t.createHref(d),block:d=>{if(!t.setBlockers)return()=>{};const u=t.getBlockers?.()??[];return t.setBlockers([...u,d]),()=>{const f=t.getBlockers?.()??[];t.setBlockers?.(f.filter(p=>p!==d))}},flush:()=>t.flush?.(),destroy:()=>t.destroy?.(),notify:i}}function Lv(t,e){e||(e={});const n=jp();return{...e,key:n,__TSR_key:n,[wo]:t}}function pT(t){const e=typeof document<"u"?window:void 0,n=e.history.pushState,i=e.history.replaceState;let s=[];const l=()=>s,d=P=>s=P,u=(P=>P),f=(()=>cd(`${e.location.pathname}${e.location.search}${e.location.hash}`,e.history.state));if(!e.history.state?.__TSR_key&&!e.history.state?.key){const P=jp();e.history.replaceState({[wo]:0,key:P,__TSR_key:P},"")}let p=f(),y,g=!1,v=!1,w=!1,x=!1;const k=()=>p;let S,C;const E=()=>{S&&(N._ignoreSubscribers=!0,(S.isPush?e.history.pushState:e.history.replaceState)(S.state,"",S.href),N._ignoreSubscribers=!1,S=void 0,C=void 0,y=void 0)},R=(P,W,oe)=>{const ne=u(W);C||(y=p),p=cd(W,oe),S={href:ne,state:oe,isPush:S?.isPush||P==="push"},C||(C=Promise.resolve().then(()=>E()))},D=P=>{p=f(),N.notify({type:P})},G=async()=>{if(v){v=!1;return}const P=f(),W=P.state[wo]-p.state[wo],oe=W===1,ne=W===-1,we=!oe&&!ne||g;g=!1;const Fe=we?"GO":ne?"BACK":"FORWARD",tt=we?{type:"GO",index:W}:{type:ne?"BACK":"FORWARD"};if(w)w=!1;else{const qe=l();if(typeof document<"u"&&qe.length){for(const q of qe)if(await q.blockerFn({currentLocation:p,nextLocation:P,action:Fe})){v=!0,e.history.go(1),N.notify(tt);return}}}p=f(),N.notify(tt)},z=P=>{if(x){x=!1;return}let W=!1;const oe=l();if(typeof document<"u"&&oe.length)for(const ne of oe){const we=ne.enableBeforeUnload??!0;if(we===!0){W=!0;break}if(typeof we=="function"&&we()===!0){W=!0;break}}if(W)return P.preventDefault(),P.returnValue=""},N=fT({getLocation:k,getLength:()=>e.history.length,pushState:(P,W)=>R("push",P,W),replaceState:(P,W)=>R("replace",P,W),back:P=>(P&&(w=!0),x=!0,e.history.back()),forward:P=>{P&&(w=!0),x=!0,e.history.forward()},go:P=>{g=!0,e.history.go(P)},createHref:P=>u(P),flush:E,destroy:()=>{e.history.pushState=n,e.history.replaceState=i,e.removeEventListener(Dv,z,{capture:!0}),e.removeEventListener(Pv,G)},onBlocked:()=>{y&&p!==y&&(p=y)},getBlockers:l,setBlockers:d,notifyOnIndexChange:!1});return e.addEventListener(Dv,z,{capture:!0}),e.addEventListener(Pv,G),e.history.pushState=function(...P){const W=n.apply(e.history,P);return N._ignoreSubscribers||D("PUSH"),W},e.history.replaceState=function(...P){const W=i.apply(e.history,P);return N._ignoreSubscribers||D("REPLACE"),W},N}function mT(t){let e=t.replace(/[\x00-\x1f\x7f]/g,"");return e.startsWith("//")&&(e="/"+e.replace(/^\/+/,"")),e}function cd(t,e){const n=mT(t),i=n.indexOf("#"),s=n.indexOf("?"),l=jp();return{href:n,pathname:n.substring(0,i>0?s>0?Math.min(i,s):i:s>0?s:n.length),hash:i>-1?n.substring(i):"",search:s>-1?n.slice(s,i===-1?void 0:i):"",state:e||{[wo]:0,key:l,__TSR_key:l}}}function jp(){return(Math.random()+1).toString(36).substring(7)}function gT(t){return t instanceof Error?{name:t.name,message:t.message}:{data:t}}function ys(t,e){const n=e,i=t;return{fromLocation:n,toLocation:i,pathChanged:n?.pathname!==i.pathname,hrefChanged:n?.href!==i.href,hashChanged:n?.hash!==i.hash}}var yT=class{constructor(t,e){this.tempLocationKey=`${Math.round(Math.random()*1e7)}`,this.resetNextScroll=!0,this.shouldViewTransition=void 0,this.isViewTransitionTypesSupported=void 0,this.subscribers=new Set,this.isScrollRestoring=!1,this.isScrollRestorationSetup=!1,this.startTransition=n=>
10n(),this.update=n=>{const i=this.options,s=this.basepath??i?.basepath??"/",l=this.basepath===void 0,d=i?.rewrite;if(this.options={...i,...n},this.isServer=this.options.isServer??typeof document>"u",this.protocolAllowlist=new Set(this.options.protocolAllowlist),this.options.pathParamsAllowedCharacters&&(this.pathParamsDecoder=$A(this.options.pathParamsAllowedCharacters)),(!this.history||this.options.history&&this.options.history!==this.history)&&(this.options.history?this.history=this.options.history:this.history=pT()),this.origin=this.options.origin,this.origin||(window?.origin&&window.origin!=="null"?this.origin=window.origin:this.origin="http://localhost"),this.history&&this.updateLatestLocation(),this.options.routeTree!==this.routeTree){this.routeTree=this.options.routeTree;let y;this.resolvePathCache=$r(1e3),y=this.buildRouteTree(),this.setRoutes(y)}if(!this.stores&&this.latestLocation){const y=this.getStoreConfig(this);this.batch=y.batch,this.stores=sT(vT(this.latestLocation),y),XA(this)}let u=!1;const f=this.options.basepath??"/",p=this.options.rewrite;if(l||s!==f||d!==p){this.basepath=f;const y=[],g=Hx(f);g&&g!=="/"&&y.push(iT({basepath:f})),p&&y.push(p),this.rewrite=y.length===0?void 0:y.length===1?y[0]:oT(y),this.history&&this.updateLatestLocation(),u=!0}u&&this.stores&&this.stores.location.set(this.latestLocation),typeof window<"u"&&"CSS"in window&&typeof window.CSS?.supports=="function"&&(this.isViewTransitionTypesSupported=window.CSS.supports("selector(:active-view-transition-type(a)"))},this.updateLatestLocation=()=>{this.latestLocation=this.parseLocation(this.history.location,this.latestLocation)},this.buildRouteTree=()=>{const n=FA(this.routeTree,this.options.caseSensitive,(i,s)=>{i.init({originalIndex:s})});return this.options.routeMasks&&DA(this.options.routeMasks,n.processedTree),n},this.subscribe=(n,i)=>{const s={eventType:n,fn:i};return this.subscribers.add(s),()=>{this.subscribers.delete(s)}},this.emit=n=>{this.subscribers.forEach(i=>{i.eventType===n.type&&i.fn(n)})},this.parseLocation=(n,i)=>{const s=({pathname:f,search:p,hash:y,href:g,state:v})=>
10{if(!this.rewrite&&!/[ \x00-\x1f\x7f\u0080-\uffff]/.test(f)){const C=this.options.parseSearch(p),E=this.options.stringifySearch(C);return{href:f+E+y,publicHref:f+E+y,pathname:Tr(f).path,external:!1,searchStr:E,search:Vo(i?.search,C),hash:Tr(y.slice(1)).path,state:po(i?.state,v)}}const w=new URL(g,this.origin),x=tp(this.rewrite,w),k=this.options.parseSearch(x.search),S=this.options.stringifySearch(k);return x.search=S,{href:x.href.replace(x.origin,""),publicHref:g,pathname:Tr(x.pathname).path,external:!!this.rewrite&&x.origin!==this.origin,searchStr:S,search:Vo(i?.search,k),hash:Tr(x.hash.slice(1)).path,state:po(i?.state,v)}},l=s(n),{__tempLocation:d,__tempKey:u}=l.state;if(d&&(!u||u===this.tempLocationKey)){const f=s(d);return f.state.key=l.state.key,f.state.__TSR_key=l.state.__TSR_key,delete f.state.__tempLocation,{...f,maskedLocation:l}}return l},this.resolvePathWithBase=(n,i)=>WA({base:n,to:Np(i),trailingSlash:this.options.trailingSlash,cache:this.resolvePathCache}),this.matchRoutes=(n,i,s)=>typeof n=="string"?this.matchRoutesInternal({pathname:n,search:i},s):this.matchRoutesInternal(n,i),this.getMatchedRoutes=n=>wT({pathname:n,routesById:this.routesById,processedTree:this.processedTree}),this.cancelMatch=n=>{const i=this.getMatch(n);i&&(i.abortController.abort(),clearTimeout(i._nonReactive.pendingTimeout),i._nonReactive.pendingTimeout=void 0)},this.cancelMatches=()=>{this.stores.pendingIds.get().forEach(n=>{this.cancelMatch(n)}),this.stores.matchesId.get().forEach(n=>{if(this.stores.pendingMatchStores.has(n))return;const i=this.stores.matchStores.get(n)?.get();i&&(i.status==="pending"||i.isFetching==="loader")&&this.cancelMatch(n)})},this.buildLocation=n=>{const i=(l={})=>{const d=l._fromLocation||this.pendingBuiltLocation||this.latestLocation,u=this.matchRoutesLightweight(d);l.from;const f=l.unsafeRelative==="path"?d.pathname:l.from??u.fullPath,p=this.resolvePathWithBase(f,"."),y=u.search,g=Object.assign(Object.create(null),u.params),v=l.to?this.resolvePathWithBase(p,`${l.to}`):this.resolvePathWithBase(p,"."),w=l.params===!1||l.params===null?Object.create(null):(l.params??!0)===!0?g:Object.assign(g,fo(l.params,g)),x=this.getMatchedRoutes(v);let k=x.matchedRoutes;if((!x.foundRoute||x.foundRoute.path!=="/"&&x.routeParams["**"])&&this.options.notFoundRoute&&(k=[...k,this.options.notFoundRoute]),Object.keys(w).length>0)for(const oe of k){const ne=oe.options.params?.stringify??oe.options.stringifyParams;if(ne)try{Object.assign(w,ne(w))}catch{}}const S=n.leaveParams?v:Tr(_v({path:v,params:w,decoder:this.pathParamsDecoder,server:this.isServer}).interpolatedPath).path;let C=y;if(n._includeValidateSearch&&this.options.search?.strict){const oe={};k.forEach(ne=>{if(ne.options.validateSearch)try{Object.assign(oe,ed(ne.options.validateSearch,{...oe,...C}))}catch{}}),C=oe}C=xT({search:C,dest:l,destRoutes:k,_includeValidateSearch:n._includeValidateSearch}),C=Vo(y,C);const E=this.options.stringifySearch(C),R=l.hash===!0?d.hash:l.hash?fo(l.hash,d.hash):void 0,D=R?`#${R}`:"";let G=l.state===!0?d.state:l.state?fo(l.state,d.state):{};G=po(d.state,G);const z=`${S}${E}${D}`;let N,P,W=!1;if(this.rewrite){const oe=new URL(z,this.origin),ne=$x(this.rewrite,oe);N=oe.href.replace(oe.origin,""),ne.origin!==this.origin?(P=ne.href,W=!0):P=ne.pathname+ne.search+ne.hash}else N=IA(z),P=N;return{publicHref:P,href:N,pathname:S,search:C,searchStr:E,state:G,hash:R??"",external:W,unmaskOnReload:l.unmaskOnReload}},s=(l={},d)=>{const u=i(l);let f=d?i(d):void 0;if(!f){const p=Object.create(null);if(this.options.routeMasks){const y=LA(u.pathname,this.processedTree);if(y){Object.assign(p,y.rawParams);const{from:g,params:v,...w}=y.route,x=v===!1||v===null?Object.create(null):(v??!0)===!0?p:Object.assign(p,fo(v,p));d={from:n.from,...w,params:x},f=i(d)}}}return f&&(u.maskedLocation=f),u};return n.mask?s(n,{from:n.from,...n.mask}):s(n)},this.commitLocation=async({viewTransition:n,ignoreBlocker:i,...s})=>{const l=()=>{const f=["key","__TSR_key","__TSR_index","__hashScrollIntoViewOptions"];f.forEach(y=>{s.state[y]=this.latestLocation.state[y]});const p=nn(s.state,this.latestLocation.state);return f.forEach(y=>{delete s.state[y]}),p},d=vo(this.latestLocation.href)===vo(s.href);let u=this.commitLocationPromise;if(this.commitLocationPromise=ai(()=>{u?.resolve(),u=void 0}),d&&l())this.load();else{let{maskedLocation:f,hashScrollIntoView:p,...y}=s;f&&(y={...f,state:{...f.state,__tempKey:void 0,__tempLocation:{...y,search:y.searchStr,state:{...y.state,__tempKey:void 0,__tempLocation:void 0,__TSR_key:void 0,key:void 0}}}},(y.unmaskOnReload??this.options.unmaskOnReload??!1)&&(y.state.__tempKey=this.tempLocationKey)),y.state.__hashScrollIntoViewOptions=p??this.options.defaultHashScrollIntoView??!0,this.shouldViewTransition=n,this.history[s.replace?"replace":"push"](y.publicHref,y.state,{ignoreBlocker:i})}return this.resetNextScroll=s.resetScroll??!0,this.history.subscribers.size||this.load(),this.commitLocationPromise},this.buildAndCommitLocation=({replace:n,resetScroll:i,hashScrollIntoView:s,viewTransition:l,ignoreBlocker:d,href:u,...f}={})=>
10{if(u){const g=this.history.location.state.__TSR_index,v=cd(u,{__TSR_index:n?g:g+1}),w=new URL(v.pathname,this.origin);f.to=tp(this.rewrite,w).pathname,f.search=this.options.parseSearch(v.search),f.hash=v.hash.slice(1)}const p=this.buildLocation({...f,_includeValidateSearch:!0});this.pendingBuiltLocation=p;const y=this.commitLocation({...p,viewTransition:l,replace:n,resetScroll:i,hashScrollIntoView:s,ignoreBlocker:d});return Promise.resolve().then(()=>{this.pendingBuiltLocation===p&&(this.pendingBuiltLocation=void 0)}),y},this.navigate=async({to:n,reloadDocument:i,href:s,publicHref:l,...d})=>{let u=!1;if(s)try{new URL(`${s}`),u=!0}catch{}if(u&&!i&&(i=!0),i){if(n!==void 0||!s){const p=this.buildLocation({to:n,...d});s=s??p.publicHref,l=l??p.publicHref}const f=!u&&l?l:s;if(rd(f,this.protocolAllowlist))return Promise.resolve();if(!d.ignoreBlocker){const p=this.history.getBlockers?.()??[];for(const y of p)if(y?.blockerFn&&await y.blockerFn({currentLocation:this.latestLocation,nextLocation:this.latestLocation,action:"PUSH"}))return Promise.resolve()}return d.replace?window.location.replace(f):window.location.href=f,Promise.resolve()}return this.buildAndCommitLocation({...d,href:s,to:n,_isNavigate:!0})},this.beforeLoad=()=>{this.cancelMatches(),this.updateLatestLocation();const n=this.matchRoutes(this.latestLocation),i=this.stores.cachedMatches.get().filter(s=>!n.some(l=>l.id===s.id));this.batch(()=>{this.stores.status.set("pending"),this.stores.statusCode.set(200),this.stores.isLoading.set(!0),this.stores.location.set(this.latestLocation),this.stores.setPending(n),this.stores.setCached(i)})},this.load=async n=>{let i,s,l;const d=this.stores.resolvedLocation.get()??this.stores.location.get();for(l=new Promise(f=>{this.startTransition(async()=>{try{this.beforeLoad();const p=this.latestLocation,y=ys(p,this.stores.resolvedLocation.get());this.stores.redirect.get()||this.emit({type:"onBeforeNavigate",...y}),this.emit({type:"onBeforeLoad",...y}),await Iv({router:this,sync:n?.sync,forceStaleReload:d.href===p.href,matches:this.stores.pendingMatches.get(),location:p,updateMatch:this.updateMatch,onReady:async()=>{this.startTransition(()=>{this.startViewTransition(async()=>{let g=null,v=null,w=null,x=null;this.batch(()=>{const k=this.stores.pendingMatches.get(),S=k.length,C=this.stores.matches.get();g=S?C.filter(D=>!this.stores.pendingMatchStores.has(D.id)):null;const E=new Set;for(const D of this.stores.pendingMatchStores.values())D.routeId&&E.add(D.routeId);const R=new Set;for(const D of this.stores.matchStores.values())D.routeId&&R.add(D.routeId);v=S?C.filter(D=>!E.has(D.routeId)):null,w=S?k.filter(D=>!R.has(D.routeId)):null,x=S?k.filter(D=>R.has(D.routeId)):C,this.stores.isLoading.set(!1),this.stores.loadedAt.set(Date.now()),S&&(this.stores.setMatches(k),this.stores.setPending([]),this.stores.setCached([...this.stores.cachedMatches.get(),...g.filter(D=>D.status!=="error"&&D.status!=="notFound"&&D.status!=="redirected")]),this.clearExpiredCache())});for(const[k,S]of[[v,"onLeave"],[w,"onEnter"],[x,"onStay"]])if(k)for(const C of k)this.looseRoutesById[C.routeId].options[S]?.(C)})})}})}catch(p){jt(p)?(i=p,this.navigate({...i.options,replace:!0,ignoreBlocker:!0})):Ot(p)&&(s=p);const y=i?i.status:s?404:this.stores.matches.get().some(g=>g.status==="error")?500:200;this.batch(()=>{this.stores.statusCode.set(y),this.stores.redirect.set(i)})}this.latestLoadPromise===l&&(this.commitLocationPromise?.resolve(),this.latestLoadPromise=void 0,this.commitLocationPromise=void 0),f()})}),this.latestLoadPromise=l,await l;this.latestLoadPromise&&l!==this.latestLoadPromise;)await this.latestLoadPromise;let u;this.hasNotFoundMatch()?u=404:this.stores.matches.get().some(f=>f.status==="error")&&(u=500),u!==void 0&&this.stores.statusCode.set(u)},this.startViewTransition=n=>
10{const i=this.shouldViewTransition??this.options.defaultViewTransition;if(this.shouldViewTransition=void 0,i&&typeof document<"u"&&"startViewTransition"in document&&typeof document.startViewTransition=="function"){let s;if(typeof i=="object"&&this.isViewTransitionTypesSupported){const l=this.latestLocation,d=this.stores.resolvedLocation.get(),u=typeof i.types=="function"?i.types(ys(l,d)):i.types;if(u===!1){n();return}s={update:n,types:u}}else s=n;document.startViewTransition(s)}else n()},this.updateMatch=(n,i)=>{this.startTransition(()=>{const s=this.stores.pendingMatchStores.get(n);if(s){s.set(i);return}const l=this.stores.matchStores.get(n);if(l){l.set(i);return}const d=this.stores.cachedMatchStores.get(n);if(d){const u=i(d.get());u.status==="redirected"?this.stores.cachedMatchStores.delete(n)&&this.stores.cachedIds.set(f=>f.filter(p=>p!==n)):d.set(u)}})},this.getMatch=n=>this.stores.cachedMatchStores.get(n)?.get()??this.stores.pendingMatchStores.get(n)?.get()??this.stores.matchStores.get(n)?.get(),this.invalidate=n=>{const i=s=>n?.filter?.(s)??!0?{...s,invalid:!0,...n?.forcePending||s.status==="error"||s.status==="notFound"?{status:"pending",error:void 0}:void 0}:s;return this.batch(()=>{this.stores.setMatches(this.stores.matches.get().map(i)),this.stores.setCached(this.stores.cachedMatches.get().map(i)),this.stores.setPending(this.stores.pendingMatches.get().map(i))}),this.shouldViewTransition=!1,this.load({sync:n?.sync})},this.getParsedLocationHref=n=>n.publicHref||"/",this.resolveRedirect=n=>{const i=n.headers.get("Location");if(!n.options.href||n.options._builtLocation){const s=n.options._builtLocation??this.buildLocation(n.options),l=this.getParsedLocationHref(s);n.options.href=l,n.headers.set("Location",l)}else if(i)try{const s=new URL(i);if(this.origin&&s.origin===this.origin){const l=s.pathname+s.search+s.hash;n.options.href=l,n.headers.set("Location",l)}}catch{}if(n.options.href&&!n.options._builtLocation&&rd(n.options.href,this.protocolAllowlist))throw new Error("Redirect blocked: unsafe protocol");return n.headers.get("Location")||n.headers.set("Location",n.options.href),n},this.clearCache=n=>{const i=n?.filter;i!==void 0?this.stores.setCached(this.stores.cachedMatches.get().filter(s=>!i(s))):this.stores.setCached([])},this.clearExpiredCache=()=>{const n=Date.now(),i=s=>{const l=this.looseRoutesById[s.routeId];if(!l.options.loader)return!0;const d=(s.preload?l.options.preloadGcTime??this.options.defaultPreloadGcTime:l.options.gcTime??this.options.defaultGcTime)??300*1e3;return s.status==="error"?!0:n-s.updatedAt>=d};this.clearCache({filter:i})},this.loadRouteChunk=Yr,this.preloadRoute=async n=>{const i=n._builtLocation??this.buildLocation(n);let s=this.matchRoutes(i,{throwOnError:!0,preload:!0,dest:n});const l=new Set([...this.stores.matchesId.get(),...this.stores.pendingIds.get()]),d=new Set([...l,...this.stores.cachedIds.get()]),u=s.filter(f=>!d.has(f.id));if(u.length){const f=this.stores.cachedMatches.get();this.stores.setCached([...f,...u])}try{return s=await Iv({router:this,matches:s,location:i,preload:!0,updateMatch:(f,p)=>{l.has(f)?s=s.map(y=>y.id===f?p(y):y):this.updateMatch(f,p)}}),s}catch(f){if(jt(f))return f.options.reloadDocument?void 0:await this.preloadRoute({...f.options,_fromLocation:i});Ot(f)||console.error(f);return}},this.matchRoute=(n,i)=>{const s={...n,to:n.to?this.resolvePathWithBase(n.from||"",n.to):void 0,params:n.params||{},leaveParams:!0},l=this.buildLocation(s);if(i?.pending&&this.stores.status.get()!=="pending")return!1;const d=(i?.pending===void 0?!this.stores.isLoading.get():i.pending)?this.latestLocation:this.stores.resolvedLocation.get()||this.stores.location.get(),u=NA(l.pathname,i?.caseSensitive??!1,i?.fuzzy??!1,d.pathname,this.processedTree);return!u||n.params&&!nn(u.rawParams,n.params,{partial:!0})?!1:i?.includeSearch??!0?nn(d.search,l.search,{partial:!0})?u.rawParams:!1:u.rawParams},this.hasNotFoundMatch=()=>this.stores.matches.get().some(n=>n.status==="notFound"||n.globalNotFound),this.getStoreConfig=e,this.update({defaultPreloadDelay:50,defaultPendingMs:1e3,defaultPendingMinMs:500,context:void 0,...t,caseSensitive:t.caseSensitive??!1,notFoundMode:t.notFoundMode??"fuzzy",stringifySearch:t.stringifySearch??tT,parseSearch:t.parseSearch??eT,protocolAllowlist:t.protocolAllowlist??TA}),typeof document<"u"&&(self.__TSR_ROUTER__=this)}
10isShell(){return!!this.options.isShell}isPrerendering(){return!!this.options.isPrerendering}get state(){return this.stores.__store.get()}setRoutes({routesById:t,routesByPath:e,processedTree:n}){this.routesById=t,this.routesByPath=e,this.processedTree=n;const i=this.options.notFoundRoute;i&&(i.init({originalIndex:99999999999}),this.routesById[i.id]=i)}get looseRoutesById(){return this.routesById}getParentContext(t){return t?.id?t.context??this.options.context??void 0:this.options.context??void 0}matchRoutesInternal(t,e){const n=this.getMatchedRoutes(t.pathname),{foundRoute:i,routeParams:s,parsedParams:l}=n;let{matchedRoutes:d}=n,u=!1;(i?i.path!=="/"&&s["**"]:vo(t.pathname))&&(this.options.notFoundRoute?d=[...d,this.options.notFoundRoute]:u=!0);const f=u?ST(this.options.notFoundMode,d):void 0,p=new Array(d.length),y=new Map;for(const g of this.stores.matchStores.values())g.routeId&&y.set(g.routeId,g.get());for(let g=0;g<d.length;g++){const v=d[g],w=p[g-1];let x,k,S;{const Fe=w?.search??t.search,tt=w?._strictSearch??void 0;try{const qe=ed(v.options.validateSearch,{...Fe})??void 0;x={...Fe,...qe},k={...tt,...qe},S=void 0}catch(qe){let q=qe;if(qe instanceof dd||(q=new dd(qe.message,{cause:qe})),e?.throwOnError)throw q;x=Fe,k={},S=q}}const C=v.options.loaderDeps?.({search:x})??"",E=C?JSON.stringify(C):"",{interpolatedPath:R,usedParams:D}=_v({path:v.fullPath,params:s,decoder:this.pathParamsDecoder,server:this.isServer}),G=v.id+R+E,z=this.getMatch(G),N=y.get(v.id),P=z?._strictParams??D;let W;if(!z)try{Nv(v,D,l,P)}catch(Fe){if(Ot(Fe)||jt(Fe)?W=Fe:W=new bT(Fe.message,{cause:Fe}),e?.throwOnError)throw W}Object.assign(s,P);const oe=N?"stay":"enter";let ne;if(z)ne={...z,cause:oe,params:N?.params??s,_strictParams:P,search:Vo(N?N.search:z.search,x),_strictSearch:k};else{const Fe=v.options.loader||v.options.beforeLoad||v.lazyFn||Zx(v)?"pending":"success";ne={id:G,ssr:v.options.ssr,index:g,routeId:v.id,params:N?.params??s,_strictParams:P,pathname:R,updatedAt:Date.now(),search:N?Vo(N.search,x):x,_strictSearch:k,searchError:void 0,status:Fe,isFetching:!1,error:void 0,paramsError:W,__routeContext:void 0,_nonReactive:{loadPromise:ai()},__beforeLoadContext:void 0,context:{},abortController:new AbortController,fetchCount:0,cause:oe,loaderDeps:N?po(N.loaderDeps,C):C,invalid:!1,preload:!1,links:void 0,scripts:void 0,headScripts:void 0,meta:void 0,staticData:v.options.staticData||{},fullPath:v.fullPath}}e?.preload||(ne.globalNotFound=f===v.id),ne.searchError=S;const we=this.getParentContext(w);ne.context={...we,...ne.__routeContext,...ne.__beforeLoadContext},p[g]=ne}for(let g=0;g<p.length;g++){const v=p[g],w=this.looseRoutesById[v.routeId],x=this.getMatch(v.id),k=y.get(v.routeId);if(v.params=k?Vo(k.params,s):s,!x){const S=p[g-1],C=this.getParentContext(S);if(w.options.context){const E={deps:v.loaderDeps,params:v.params,context:C??{},location:t,navigate:R=>this.navigate({...R,_fromLocation:t}),buildLocation:this.buildLocation,cause:v.cause,abortController:v.abortController,preload:!!v.preload,matches:p,routeId:w.id};v.__routeContext=w.options.context(E)??void 0}v.context={...C,...v.__routeContext,...v.__beforeLoadContext}}}return p}matchRoutesLightweight(t){const{matchedRoutes:e,routeParams:n,parsedParams:i}=this.getMatchedRoutes(t.pathname),s=Gr(e),l={...t.search};for(const y of e)try{Object.assign(l,ed(y.options.validateSearch,l))}catch{}const d=Gr(this.stores.matchesId.get()),u=d&&this.stores.matchStores.get(d)?.get(),f=u&&u.routeId===s.id&&u.pathname===t.pathname;let p;if(f)p=u.params;else{const y=Object.assign(Object.create(null),n);for(const g of e)try{Nv(g,n,i??{},y)}catch{}p=y}return{matchedRoutes:e,fullPath:s.fullPath,search:l,params:p}}},dd=class extends Error{},bT=class extends Error{};function vT(t){return{loadedAt:0,isLoading:!1,isTransitioning:!1,status:"idle",resolvedLocation:void 0,location:t,matches:[],statusCode:200}}function ed(t,e){if(t==null)return{};if("~standard"in t){const n=t["~standard"].validate(e);if(n instanceof Promise)throw new dd("Async validation not supported");if(n.issues)throw new dd(JSON.stringify(n.issues,void 0,2),{cause:n});return n.value}return"parse"in t?t.parse(e):typeof t=="function"?t(e):{}}function wT({pathname:t,routesById:e,processedTree:n}){const i=Object.create(null),s=vo(t);let l,d;const u=UA(s,n,!0);return u&&(l=u.route,Object.assign(i,u.rawParams),d=Object.assign(Object.create(null),u.parsedParams)),{matchedRoutes:u?.branch||[e.__root__],routeParam
10s:i,foundRoute:l,parsedParams:d}}function xT({search:t,dest:e,destRoutes:n,_includeValidateSearch:i}){return kT(n)(t,e,i??!1)}function kT(t){const e={dest:null,_includeValidateSearch:!1,middlewares:[]};for(const s of t){if("search"in s.options)s.options.search?.middlewares&&e.middlewares.push(...s.options.search.middlewares);else if(s.options.preSearchFilters||s.options.postSearchFilters){const l=({search:d,next:u})=>{let f=d;"preSearchFilters"in s.options&&s.options.preSearchFilters&&(f=s.options.preSearchFilters.reduce((y,g)=>g(y),d));const p=u(f);return"postSearchFilters"in s.options&&s.options.postSearchFilters?s.options.postSearchFilters.reduce((y,g)=>g(y),p):p};e.middlewares.push(l)}if(s.options.validateSearch){const l=({search:d,next:u})=>{const f=u(d);if(!e._includeValidateSearch)return f;try{return{...f,...ed(s.options.validateSearch,f)??void 0}}catch{return f}};e.middlewares.push(l)}}const n=({search:s})=>{const l=e.dest;return l.search?l.search===!0?s:fo(l.search,s):{}};e.middlewares.push(n);const i=(s,l,d)=>{if(s>=d.length)return l;const u=d[s];return u({search:l,next:p=>i(s+1,p,d)})};return function(l,d,u){return e.dest=d,e._includeValidateSearch=u,i(0,l,e.middlewares)}}function ST(t,e){if(t!=="root")for(let n=e.length-1;n>=0;n--){const i=e[n];if(i.children)return i.id}return ei}function Nv(t,e,n,i){const s=t.options.params?.parse??t.options.parseParams;if(s)if(t.options.skipRouteOnParseError)for(const l in e)l in n&&(i[l]=n[l]);else{const l=s(i);Object.assign(i,l)}}var $n=Symbol.for("TSR_DEFERRED_PROMISE");function _T(t,e){const n=t;return n[$n]||(n[$n]={status:"pending"},n.then(i=>{n[$n].status="success",n[$n].data=i}).catch(i=>{n[$n].status="error",n[$n].error={data:gT(i),__isServerError:!0}})),n}var CT="Error preloading route! âï¸";function Uv(t,e){if(t)return typeof t=="string"?t:t[e]}function AT(t){return typeof t=="string"?{href:t,crossOrigin:void 0}:t}function TT(t){if(t.tag!=="link")return;const e=t.attrs?.rel,n=t.attrs?.href;if(typeof n=="string"&&(typeof e=="string"?e.split(/\s+/):[]).includes("stylesheet"))return n}function RT(t,e){const n=TT(e);return!!n&&t?.inlineCss?.styles[n]!==void 0}var Qx=class{get to(){return this._to}get id(){return this._id}get path(){return this._path}get fullPath(){return this._fullPath}constructor(t){if(this.init=e=>{this.originalIndex=e.originalIndex;const n=this.options,i=!n?.path&&!n?.id;this.parentRoute=this.options.getParentRoute?.(),i?this._path=ei:this.parentRoute||an();let s=i?ei:n?.path;s&&s!=="/"&&(s=zx(s));const l=n?.id||s;let d=i?ei:Xc([this.parentRoute.id==="__root__"?"":this.parentRoute.id,l]);s==="__root__"&&(s="/"),d!=="__root__"&&(d=Xc(["/",d]));const u=d==="__root__"?"/":Xc([this.parentRoute.fullPath,s]);this._path=s,this._id=d,this._fullPath=u,this._to=vo(u)},this.addChildren=e=>this._addFileChildren(e),this._addFileChildren=e=>(Array.isArray(e)&&(this.children=e),typeof e=="object"&&e!==null&&(this.children=Object.values(e)),this),this._addFileTypes=()=>this,this.updateLoader=e=>(Object.assign(this.options,e),this),this.update=e=>(Object.assign(this.options,e),this),this.lazy=e=>(this.lazyFn=e,this),this.redirect=e=>Vr({from:this.fullPath,...e}),this.options=t||{},this.isRoot=!t?.getParentRoute,t?.id&&t?.path)throw new Error("Route cannot have both an 'id' and a 'path' option.")}},ET=class extends Qx{constructor(t){super(t)}};function OT(t){if(typeof document<"u"&&document.querySelector){const e=t.stores.location.get(),n=e.state.__hashScrollIntoViewOptions??!0;if(n&&e.hash!==""){const i=document.getElementById(e.hash);i&&i.scrollIntoView(n)}}}const Ca=Symbol.asyncIterator,Xx=Symbol.hasInstance,bs=Symbol.isConcatSpreadable,Aa=Symbol.iterator,Jx=Symbol.match,ek=Symbol.matchAll,tk=Symbol.replace,nk=Symbol.search,ak=Symbol.species,ok=Symbol.split,ik=Symbol.toPrimitive,vs=Symbol.toStringTag,sk=Symbol.unscopables,rk={[Ca]:0,[Xx]:1,[bs]:2,[Aa]:3,[Jx]:4,[ek]:5,[tk]:6,[nk]:7,[ak]:8,[ok]:9,[ik]:10,[vs]:11,[sk]:12},IT={0:Ca,1:Xx,2:bs,3:Aa,4:Jx,5:ek,6:tk,7:nk,8:ak,9:ok,10:ik,11:vs,12:sk},MT={2:!0,3:!1,1:void 0,0:null,4:-0,5:Number.POSITIVE_INFINITY,6:Number.NEGATIVE_INFINITY,7:NaN},PT={0:"Error",1:"EvalError",2:"RangeError",3:"ReferenceError",4:"SyntaxError",5:"TypeError",6:"URIError"},DT={0:Error,1:EvalError,2:RangeError,3:ReferenceError,4:SyntaxError,5:TypeError,6:URIError};function Ue(t,e,n,i,s,l,d,u,f,p,y,g){return{t,i:e,s:n,c:i,m:s,p:l,e:d,a:u,f,b:p,o:y,l:g}}function Co(t){return Ue(2,void 0,t,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}const lk=Co(2),ck=Co(3),LT=Co(1),NT=Co(0),UT=Co(4),jT=Co(5),FT=Co(6),qT=Co(7),BT=64,zT=/[\x00-\x07\x0b\x0e-\x1f<\u2028\u2029\ud800-\udfff]/;function HT(t){switch(t){case'"':return'\\"';case"\\":return"\\\\";case` 11`:return"\\n";case"\r":return"\\r";case"\b":return"\\b";case" ":return"\\t";case"\f":return"\\f";case"<":return"\\x3C";case"\u2028":return"\\u2028";case"\u2029":return"\\u2029";default:return}}function si(t){if(t.length>=BT&&!zT.test(t))return JSON.stringify(t).slice(1,-1);let e="",n=0,i;for(let s=0,l=t.length;s<l;s++)i=HT(t[s]),i&&(e+=t.slice(n,s)+i,n=s+1);return n===0?e=t:e+=t.slice(n),e}function GT(t){switch(t){case"\\\\":return"\\";case'\\"':return'"';case"\\n":return` 12`;case"\\r":return"\r";case"\\b":return"\b";case"\\t":return" ";case"\\f":return"\f";case"\\x3C":return"<";case"\\u2028":return"\u2028";case"\\u2029":return"\u2029";default:return t}}function Ao(t){return typeof t=="string"&&!t.includes("\\")?t:t.replace(/(\\\\|\\"|\\n|\\r|\\b|\\t|\\f|\\u2028|\\u2029|\\x3C)/g,GT)}
12const WT={parsing:1,serialization:2,deserialization:3};function $T(t){return`Seroval Error (step: ${WT[t]})`}const VT=(t,e)=>$T(t);var dk=class extends Error{constructor(t,e){super(VT(t)),this.cause=e}},jv=class extends dk{constructor(t){super("parsing",t)}},YT=class extends dk{constructor(t){super("deserialization",t)}};function Ra(t){return`Seroval Error (specific: ${t})`}var ri=class extends Error{constructor(t){super(Ra(1)),this.value=t}},Fp=class extends Error{constructor(t){super(Ra(2))}},KT=class extends Error{constructor(t){super(Ra(3))}},Ld=class extends Error{constructor(t){super(Ra(4))}},ZT=class extends Error{constructor(t){super(Ra(5)),this.value=t}},QT=class extends Error{constructor(t){super(Ra(6))}},XT=class extends Error{constructor(t){super(Ra(7))}},Ht=class extends Error{constructor(t){super(Ra(8))}},uk=class extends Error{constructor(t){super(Ra(9))}};const Pc="__SEROVAL_REFS__",hk=new Map,ms=new Map;function fk(t){return hk.has(t)}function JT(t){return ms.has(t)}function e1(t){if(fk(t))return hk.get(t);throw new ZT(t)}function t1(t){if(JT(t))return ms.get(t);throw new QT(t)}typeof globalThis<"u"?Object.defineProperty(globalThis,Pc,{value:ms,configurable:!0,writable:!1,enumerable:!1}):typeof window<"u"?Object.defineProperty(window,Pc,{value:ms,configurable:!0,writable:!1,enumerable:!1}):typeof self<"u"?Object.defineProperty(self,Pc,{value:ms,configurable:!0,writable:!1,enumerable:!1}):typeof global<"u"&&Object.defineProperty(global,Pc,{value:ms,configurable:!0,writable:!1,enumerable:!1});function qp(t){return t instanceof EvalError?1:t instanceof RangeError?2:t instanceof ReferenceError?3:t instanceof SyntaxError?4:t instanceof TypeError?5:t instanceof URIError?6:0}function n1(t){const e=PT[qp(t)];return t.name!==e?{name:t.name}:t.constructor.name!==e?{name:t.constructor.name}:{}}function pk(t,e){let n=n1(t);const i=Object.getOwnPropertyNames(t);for(let s=0,l=i.length,d;s<l;s++)d=i[s],d!=="name"&&d!=="message"&&(d==="stack"?e&4&&(n=n||{},n[d]=t[d]):(n=n||{},n[d]=t[d]));return n}function mk(t){return Object.isFrozen(t)?3:Object.isSealed(t)?2:Object.isExtensible(t)?0:1}function a1(t){switch(t){case Number.POSITIVE_INFINITY:return jT;case Number.NEGATIVE_INFINITY:return FT}return t!==t?qT:Object.is(t,-0)?UT:Ue(0,void 0,t,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function gk(t){return Ue(1,void 0,si(t),void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function o1(t){return Ue(3,void 0,""+t,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function i1(t){return Ue(4,t,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function s1(t,e){const n=e.valueOf();return Ue(5,t,n!==n?"":e.toISOString(),void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function no(t,e,n){return Ue(36,t,n.toString(),e,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function r1(t,e){return Ue(6,t,void 0,si(e.source),e.flags,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function l1(t,e){return Ue(17,t,rk[e],void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function c1(t,e){return Ue(18,t,si(e1(e)),void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function d1(t,e,n){return Ue(25,t,n,si(e),void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function u1(t,e,n){return Ue(9,t,void 0,void 0,void 0,void 0,void 0,n,void 0,void 0,mk(e),void 0)}function h1(t,e){return Ue(21,t,void 0,void 0,void 0,void 0,void 0,void 0,e,void 0,void 0,void 0)}const Bp=1e6;function f1(t,e,n){if(e.length>Bp)throw new ri(e);return Ue(15,t,void 0,e.constructor.name,void 0,void 0,void 0,void 0,n,e.byteOffset,void 0,e.length)}function p1(t,e,n){if(e.length>Bp)throw new ri(e);return Ue(16,t,void 0,e.constructor.name,void 0,void 0,void 0,void 0,n,e.byteOffset,void 0,e.length)}function m1(t,e,n){if(e.byteLength>Bp)throw new ri(e);return Ue(20,t,void 0,void 0,void 0,void 0,void 0,void 0,n,e.byteOffset,void 0,e.byteLength)}function g1(t,e,n){return Ue(13,t,qp(e),void 0,si(e.message),n,void 0,void 0,void 0,void 0,void 0,void 0)}function y1(t,e,n){return Ue(14,t,qp(e),void 0,si(e.message),n,void 0,void 0,void 0,void 0,void 0,void 0)}function b1(t,e){return Ue(7,t,void 0,void 0,void 0,void 0,void 0,e,void 0,void 0,void 0,void 0)}function v1(t,e){return Ue(28,void 0,void 0,void 0,void 0,void 0,void 0,[t,e],void 0,void 0,void 0,void 0)}function w1(t,e){return Ue(30,void 0,void 0,void 0,void 0,void 0,void 0,[t,e],void 0,void 0,void 0,void 0)}function x1(t,e,n){return Ue(31,t,void 0,void 0,void 0,void 0,void 0,n,e,void 0,void 0,void 0)}function k1(t,e){return Ue(32,t,void 0,void 0,void 0,void 0,void 0,void 0,e,void 0,void 0,void 0)}function S1(t,e){return Ue(33,t,void 0,void 0,void 0,void 0,void 0,void 0,e,void 0,void 0,void 0)}function _1(t,e){return Ue(34,t,void 0,void 0,void 0,void 0,void 0,void 0,e,void 0,void 0,void 0)}function C1(t,e,n,i){return Ue(35,t,n,void 0,void 0,void 0,void 0,e,void 0,void 0,void 0,i)}var A1=class{constructor(t,e){this.value=t,this.replacement=e}};const zp=()=>{const t={p:0,s:0,f:0};
12return t.p=new Promise((e,n)=>{t.s=e,t.f=n}),t},T1=()=>{const t=[],e=[];let n=!0,i=!1,s=0;const l={flush(d,u,f){for(f=0;f<s;f++){const p=e[f];p&&p[u](d)}},up(d,u,f,p){for(u=0,f=t.length;u<f;u++)p=t[u],!n&&u===f-1?d[i?"return":"throw"](p):d.next(p)},on(d,u=0){let f=n;if(n){for(u=0;u<s&&e[u];u++);u===s&&s++,e[u]=d}return l.up(d),()=>{if(n&&f){for(f=!1,e[u]=void 0;s>0&&!e[s-1];)s--;e.length=s}}}};return{__SEROVAL_STREAM__:!0,on(d){return l.on(d)},next(d){n&&(t.push(d),l.flush(d,"next"))},throw(d){n&&(t.push(d),l.flush(d,"throw"),n=!1,i=!1,e.length=0)},return(d){n&&(t.push(d),l.flush(d,"return"),n=!1,i=!0,e.length=0)}}},R1=t=>e=>()=>{let n=0;const i={[t](){return i},next(){if(n>e.d)return{done:!0,value:void 0};const s=n++,l=e.v[s];if(s===e.t)throw l;return{done:s===e.d,value:l}}};return i},E1=(t,e)=>n=>()=>{let i=0,s=-1,l=!1;const d=[],u=[],f={finalize(y=0,g=u.length){for(;y<g;y++)u[y].s({done:!0,value:void 0})}};n.on({next(y){const g=u.shift();g&&g.s({done:!1,value:y}),d.push(y)},throw(y){const g=u.shift();g&&g.f(y),f.finalize(),s=d.length,l=!0,d.push(y)},return(y){const g=u.shift();g&&g.s({done:!0,value:y}),f.finalize(),s=d.length,d.push(y)}});const p={[t](){return p},next(){if(s===-1){const v=i++;if(v>=d.length){const w=e();return u.push(w),w.p}return{done:!1,value:d[v]}}if(i>s)return{done:!0,value:void 0};const y=i++,g=d[y];if(y!==s)return{done:!1,value:g};if(l)throw g;return{done:!0,value:g}}};return p},O1=t=>{const e=atob(t),n=e.length,i=new Uint8Array(n);for(let s=0;s<n;s++)i[s]=e.charCodeAt(s);return i.buffer};function I1(t){return"__SEROVAL_SEQUENCE__"in t}function yk(t,e,n){return{__SEROVAL_SEQUENCE__:!0,v:t,t:e,d:n}}function M1(t){const e=[];let n=-1,i=-1;const s=t[Aa]();for(;;)try{const l=s.next();if(e.push(l.value),l.done){i=e.length-1;break}}catch(l){n=e.length,e.push(l)}return yk(e,n,i)}const P1=R1(Aa);function D1(t){return P1(t)}const L1={},N1={},U1={0:{},1:{},2:{},3:{},4:{},5:{}};function j1(t){return"__SEROVAL_STREAM__"in t}function li(){return T1()}function F1(t,e){const n=li(),i=t[Ca]();let s=!1,l=!1;async function d(){try{for(;!s;){const u=await i.next();if(u.done){l=!0,n.return(u.value);break}n.next(u.value)}}catch(u){l=!0,n.throw(u)}}return d().catch(()=>{}),n}const q1=E1(Ca,zp);function B1(t){return q1(t)}async function z1(t){try{return[1,await t]}catch(e){return[0,e]}}function H1(t,e){var n;return{plugins:e.plugins,mode:t,marked:new Set,features:127^(e.disabledFeatures||0),refs:e.refs||new Map,depthLimit:e.depthLimit||1e3,compactArrayBufferViews:(n=e.compactArrayBufferViews)!==null&&n!==void 0?n:!1}}function td(t,e){t.marked.add(e)}function G1(t,e){const n=t.refs.size;return t.refs.set(e,n),n}function Nd(t,e){const n=t.refs.get(e);return n!=null?(td(t,n),{type:1,value:i1(n)}):{type:0,value:G1(t,e)}}function Hp(t,e){const n=Nd(t,e);return n.type===1?n:fk(e)?{type:2,value:c1(n.value,e)}:n}function Xo(t,e){const n=Hp(t,e);if(n.type!==0)return n.value;if(e in rk)return l1(n.value,e);throw new ri(e)}function Ud(t,e){const n=Nd(t,U1[e]);return n.type===1?n.value:Ue(26,n.value,e,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0)}function W1(t){const e=Nd(t,L1);return e.type===1?e.value:Ue(27,e.value,void 0,void 0,void 0,void 0,void 0,void 0,Xo(t,Aa),void 0,void 0,void 0)}function $1(t){const e=Nd(t,N1);return e.type===1?e.value:Ue(29,e.value,void 0,void 0,void 0,void 0,void 0,[Ud(t,1),Xo(t,Ca)],void 0,void 0,void 0,void 0)}function V1(t,e,n,i){return Ue(n?11:10,t,void 0,void 0,void 0,i,void 0,void 0,void 0,void 0,mk(e),void 0)}function Y1(t,e,n,i){return Ue(8,e,void 0,void 0,void 0,void 0,{k:n,v:i},void 0,Ud(t,0),void 0,void 0,void 0)}function Gp(t,e){if(!t.compactArrayBufferViews)return e;const n=new Uint8Array(e.buffer,e.byteOffset,e.byteLength).slice().buffer,i=e.constructor;return new i(n)}function K1(t){if(typeof Buffer<"u")return Buffer.from(t).toString("base64");const e=new Uint8Array(t);if(typeof e.toBase64=="function")return e.toBase64();let n="";for(let i=0,s=e.length;i<s;i++)n+=String.fromCharCode(e[i]);return btoa(n)}function Z1(t,e,n){return Ue(19,e,K1(n),void 0,void 0,void 0,void 0,void 0,Ud(t,5),void 0,void 0,void 0)}function Q1(t,e){return{base:H1(t,e),child:void 0}}var X1=class{constructor(t,e){this._p=t,this.depth=e}parse(t){return Ct(this._p,this.depth,t)}};async function J1(t,e,n){const i=[];for(let s=0,l=n.length;s<l;s++)s in n?i[s]=await Ct(t,e,n[s]):i[s]=0;return i}async function eR(t,e,n,i){return u1(n,i,await J1(t,e,i))}async function Wp(t,e,n){const i=Object.entries(n),s=[],l=[];for(let d=0,u=i.length;d<u;d++)s.push(si(i[d][0])),l.push(await Ct(t,e,i[d][1]));return Aa in n&&(s.push(Xo(t.base,Aa)),l.push(v1(W1(t.base),await Ct(t,e,M1(n))))),Ca in n&&(s.push(Xo(t.base,Ca)),l.push(w1($1(t.base),await Ct(t,e,F1(n))))),vs in n&&(s.push(Xo(t.base,vs)),l.push(gk(n[vs]))),bs in n&&(s.push(Xo(t.base,bs)),l.push(n[bs]?lk:ck)),{k:s,v:l}}async function wf(t,e,n,i,s){return V1(n,i,s,await Wp(t,e,i))}async function tR(t,e,n,i){return h1(n,await Ct(t,e,i.valueOf()))}async function nR(t,e,n,i){return i=Gp(t.base,i),f1(n,i,await Ct(t,e,i.buffer))}async function aR(t,e,n,i){return i=Gp(t.base,i),p1(n,i,await Ct(t,e,i.buffer))}async function oR(t,e,n,i){return i=Gp(t.base,i),m1(n,i,await Ct(t,e,i.buffer))}async function Fv(t,e,n,i){const s=pk(i,t.base.features);return g1(n,i,s?await Wp(t,e,s):void 0)}async function iR(t,e,n,i){const s=pk(i,t.base.features);return y1(n,i,s?await Wp(t,e,s):void 0)}async function sR(t,e,n,i){const s=[],l=[];for(const[d,u]of i.entries())s.push(await Ct(t,e,d)),l.push(await Ct(t,e,u));return Y1(t.base,n,s,l)}async function rR(t,e,n,i){const s=[];for(const l of i.keys())s.push(await Ct(t,e,l));return b1(n,s)}async function bk(t,e,n,i){const s=t.base.plugins;if(s)for(let l=0,d=s.length;l<d;l++){const u=s[l];if(u.parse.async&&u.test(i))return d1(n,u.tag,await u.parse.async(i,new X1(t,e),{id:n}))}}async function lR(t,e,n,i){const[s,l]=await z1(i);return Ue(12,n,s,void 0,void 0,void 0,void 0,void 0,await Ct(t,e,l),void 0,void 0,void 0)}function cR(t,e,n,i,s){const l=[],d=n.on({next:u=>{td(this.base,e),Ct(this,t,u).then(f=>{l.push(k1(e,f))},f=>{s(f),d()})},throw:u=>{td(this.base,e),Ct(this,t,u).then(f=>{l.push(S1(e,f)),i(l),d()},f=>{s(f),d()})},return:u=>{td(this.base,e),Ct(this,t,u).then(f=>{l.push(_1(e,f)),i(l),d()},f=>{s(f),d()})}})}async function dR(t,e,n,i){return x1(n,Ud(t.base,4),await new Promise(cR.bind(t,e,n,i)))}async function uR(t,e,n,i){const s=[];for(let l=0,d=i.v.length;l<d;l++)s[l]=await Ct(t,e,i.v[l]);return C1(n,s,i.t,i.d)}async function hR(t,e,n,i){if(Array.isArray(i))return eR(t,e,n,i);if(j1(i))return dR(t,e,n,i);if(I1(i))return uR(t,e,n,i);let s=i.constructor;if(s!==void 0&&typeof s!="function"){const u=Object.getPrototypeOf(i);s=u===null?void 0:u.constructor}if(s===A1)return Ct(t,e,i.replacement);const l=await bk(t,e,n,i);if(l)return l;switch(s){case Object:return wf(t,e,n,i,!1);case void 0:return wf(t,e,n,i,!0);case Date:return s1(n,i);case Error:case EvalError:case RangeError:case ReferenceError:case SyntaxError:case TypeError:case URIError:return Fv(t,e,n,i);case Number:case Boolean:case String:case BigInt:return tR(t,e,n,i);case ArrayBuffer:return Z1(t.base,n,i);case Int8Array:case Int16Array:case Int32Array:case Uint8Array:case Uint16Array:case Uint32Array:case Uint8ClampedArray:case Float32Array:case Float64Array:return nR(t,e,n,i);case DataView:return oR(t,e,n,i);case Map:return sR(t,e,n,i);case Set:return rR(t,e,n,i)}if(s===Promise||i instanceof Promise)return lR(t,e,n,i);const d=t.base.features;if(d&32&&s===RegExp)return r1(n,i);if(d&16)switch(s){case BigInt64Array:case BigUint64Array:return aR(t,e,n,i)}if(d&1&&typeof AggregateError<"u"&&(s===AggregateError||i instanceof AggregateError))return iR(t,e,n,i);if(d&64&&typeof Temporal<"u")switch(s){case Temporal.Instant:return no(n,0,i);case Temporal.Duration:return no(n,1,i);case Temporal.PlainDate:return no(n,2,i);case Temporal.PlainDateTime:return no(n,3,i);case Temporal.PlainMonthDay:return no(n,4,i);case Temporal.PlainTime:return no(n,5,i);case Temporal.PlainYearMonth:return no(n,6,i);case Temporal.ZonedDateTime:return no(n,7,i)}if(i instanceof Error)return Fv(t,e,n,i);if(Aa in i||Ca in i)return wf(t,e,n,i,!!s);throw new ri(i)}async function fR(t,e,n){const i=Hp(t.base,n);if(i.type!==0)return i.value;const s=await bk(t,e,i.value,n);if(s)return s;throw new ri(n)}async function Ct(t,e,n){if(e>=t.base.depthLimit)throw new uk(t.base.depthLimit);switch(typeof n){case"boolean":return n?lk:ck;case"undefined":return LT;case"string":return gk(n);case"number":return a1(n);case"bigint":return o1(n);case"object":if(n){const i=Hp(t.base,n);return i.type===0?await hR(t,e+1,i.value,n):i.value}return NT;case"symbol":return Xo(t.base,n);case"function":return fR(t,e,n);default:throw new ri(n)}}async function pR(t,e){try{return await Ct(t,0,e)}catch(n){throw n instanceof jv?n:new jv(n)}}function vk(t,e){for(let n=0,i=e.length;n<i;n++){const s=e[n];
12t.has(s)||(t.add(s),s.extends&&vk(t,s.extends))}}function wk(t){if(t){const e=new Set;return vk(e,t),[...e]}}function mR(t){switch(t){case"Int8Array":return Int8Array;case"Int16Array":return Int16Array;case"Int32Array":return Int32Array;case"Uint8Array":return Uint8Array;case"Uint16Array":return Uint16Array;case"Uint32Array":return Uint32Array;case"Uint8ClampedArray":return Uint8ClampedArray;case"Float32Array":return Float32Array;case"Float64Array":return Float64Array;case"BigInt64Array":return BigInt64Array;case"BigUint64Array":return BigUint64Array;default:throw new XT(t)}}function gR(t){switch(t){case"constructor":case"__proto__":case"prototype":case"__defineGetter__":case"__defineSetter__":case"__lookupGetter__":case"__lookupSetter__":return!1;default:return!0}}function yR(t){switch(t){case Ca:case bs:case vs:case Aa:return!0;default:return!1}}const bR=1e6,vR=512,wR=1e4,xR=2e4;function xk(t,e){switch(e){case 3:return Object.freeze(t);case 1:return Object.preventExtensions(t);case 2:return Object.seal(t);default:return t}}const kR=1e3;function SR(t,e){var n,i;const s=(n=e.maxBase64Length)!==null&&n!==void 0?n:bR;if(!Number.isSafeInteger(s)||s<0)throw new RangeError("maxBase64Length must be a non-negative safe integer");const l=e.refs||new Map;return"types"in l||Object.assign(l,{types:new Map}),{mode:t,plugins:e.plugins,refs:l,features:(i=e.features)!==null&&i!==void 0?i:127^(e.disabledFeatures||0),depthLimit:e.depthLimit||kR,maxBase64Length:s}}function _R(t){return{mode:2,base:SR(2,t),child:void 0}}var CR=class{constructor(t,e){this._p=t,this.depth=e}deserialize(t){return et(this._p,this.depth,t)}};function kk(t,e){if(e<0||!Number.isFinite(e)||!Number.isInteger(e))throw new Ht({t:4,i:e});if(t.refs.has(e))throw new Error("Conflicted ref id: "+e)}function Sk(t){return!!t&&typeof t=="object"&&"then"in t&&typeof t.then=="function"}function AR(t,e,n){return kk(t.base,e),t.state.marked.has(e)&&t.base.refs.set(e,n),n}function TR(t,e,n){return kk(t.base,e),t.base.refs.set(e,n),n}function xt(t,e,n){return t.mode===1?AR(t,e,n):TR(t,e,n)}function ap(t,e,n){if(Object.hasOwn(e,n))return e[n];throw new Ht(t)}function RR(t,e){return xt(t,e.i,t1(Ao(e.s)))}function ER(t,e,n){const i=n.a,s=i.length,l=xt(t,n.i,new Array(s));for(let d=0,u;d<s;d++)u=i[d],u&&(l[d]=et(t,e,u));return xk(l,n.o),l}function qv(t,e,n){gR(e)?t[e]=n:Object.defineProperty(t,e,{value:n,configurable:!0,enumerable:!0,writable:!0})}function OR(t,e,n,i,s){if(typeof i=="string")qv(n,Ao(i),et(t,e,s));else{const l=et(t,e,i);switch(typeof l){case"string":qv(n,l,et(t,e,s));break;case"symbol":yR(l)&&(n[l]=et(t,e,s));break;default:throw new Ht(i)}}}function $p(t,e,n){t.base.refs.types.set(e,n)}function Rs(t,e,n,i){if(t.base.refs.types.get(n)!==i)throw new Ht(e)}function _k(t,e,n,i){const s=n.k;if(s.length>0)for(let l=0,d=n.v,u=s.length;l<u;l++)OR(t,e,i,s[l],d[l]);return i}function IR(t,e,n){const i=xt(t,n.i,n.t===10?{}:Object.create(null));return _k(t,e,n.p,i),xk(i,n.o),i}function MR(t,e){return xt(t,e.i,new Date(e.s))}function PR(t,e){if(!(t.base.features&64))throw new Fp(e);let n;switch(e.c){case 0:n=Temporal.Instant.from(e.s);break;case 1:n=Temporal.Duration.from(e.s);break;case 2:n=Temporal.PlainDate.from(e.s);break;case 3:n=Temporal.PlainDateTime.from(e.s);break;case 4:n=Temporal.PlainMonthDay.from(e.s);break;case 5:n=Temporal.PlainTime.from(e.s);break;case 6:n=Temporal.PlainYearMonth.from(e.s);break;case 7:n=Temporal.ZonedDateTime.from(e.s);break;default:throw new Ht(e)}return xt(t,e.i,n)}function DR(t,e){if(t.base.features&32){const n=Ao(e.c);if(n.length>xR)throw new Ht(e);return xt(t,e.i,new RegExp(n,e.m))}throw new Fp(e)}function LR(t,e,n){const i=xt(t,n.i,new Set);for(let s=0,l=n.a,d=l.length;s<d;s++)i.add(et(t,e,l[s]));return i}function NR(t,e,n){const i=xt(t,n.i,new Map);for(let s=0,l=n.e.k,d=n.e.v,u=l.length;s<u;s++)i.set(et(t,e,l[s]),et(t,e,d[s]));return i}function UR(t,e){if(typeof e.s!="string")throw new Ht(e);if(e.s.length>t.base.maxBase64Length)throw new RangeError("ArrayBuffer exceeds maxBase64Length ("+t.base.maxBase64Length+")");const n=Ao(e.s);let i;
12if(n.length<vR||typeof Buffer>"u")i=O1(n);else{const s=atob(n);i=new ArrayBuffer(s.length),Buffer.from(i).write(s,"latin1")}return xt(t,e.i,i)}function jR(t,e,n){var i;const s=mR(n.c),l=et(t,e,n.f);if(!(l instanceof ArrayBuffer))throw new Ht(n);const d=(i=n.b)!==null&&i!==void 0?i:0;if(d<0||d>l.byteLength)throw new Ht(n);return xt(t,n.i,new s(l,d,n.l))}function FR(t,e,n){var i;const s=et(t,e,n.f);if(!(s instanceof ArrayBuffer))throw new Ht(n);const l=(i=n.b)!==null&&i!==void 0?i:0;if(l<0||l>s.byteLength)throw new Ht(n);return xt(t,n.i,new DataView(s,l,n.l))}function Ck(t,e,n,i){if(n.p){const s=_k(t,e,n.p,{});Object.defineProperties(i,Object.getOwnPropertyDescriptors(s))}return i}function qR(t,e,n){return Ck(t,e,n,xt(t,n.i,new AggregateError([],Ao(n.m))))}function BR(t,e,n){const i=ap(n,DT,n.s);return Ck(t,e,n,xt(t,n.i,new i(Ao(n.m))))}function zR(t,e,n){const i=zp(),s=xt(t,n.i,i.p),l=et(t,e,n.f);if(Sk(l))throw new Ht(n.f);return n.s?i.s(l):i.f(l),s}function HR(t,e,n){return xt(t,n.i,Object(et(t,e,n.f)))}function GR(t,e,n){const i=t.base.plugins;if(i){const s=Ao(n.c);for(let l=0,d=i.length;l<d;l++){const u=i[l];if(u.tag===s)return xt(t,n.i,u.deserialize(n.s,new CR(t,e),{id:n.i}))}}throw new KT(n.c)}function WR(t,e){const n=xt(t,e.i,xt(t,e.s,zp()).p);return $p(t,e.s,22),n}function $R(t,e,n){const i=t.base.refs.get(n.i);if(i){Rs(t,n,n.i,22);const s=et(t,e,n.a[1]);if(Sk(s))throw new Ht(n.a[1]);n.t===23?i.s(s):i.f(s);return}throw new Ld("Promise")}function VR(t,e,n){et(t,e,n.a[0]);const i=et(t,e,n.a[1]);if(Rs(t,n,n.a[1].i,35),!i)throw new Ht(n.a[1]);return D1(i)}function YR(t,e,n){et(t,e,n.a[0]);const i=et(t,e,n.a[1]);if(Rs(t,n,n.a[1].i,31),!i)throw new Ht(n.a[1]);return B1(i)}function KR(t,e,n){const i=xt(t,n.i,li());$p(t,n.i,31);const s=n.a,l=s.length;if(l)for(let d=0;d<l;d++)et(t,e,s[d]);return i}function ZR(t,e,n){const i=t.base.refs.get(n.i);if(i){Rs(t,n,n.i,31),i.next(et(t,e,n.f));return}throw new Ld("Stream")}function QR(t,e,n){const i=t.base.refs.get(n.i);if(i){Rs(t,n,n.i,31),i.throw(et(t,e,n.f));return}throw new Ld("Stream")}function XR(t,e,n){const i=t.base.refs.get(n.i);if(i){Rs(t,n,n.i,31),i.return(et(t,e,n.f));return}throw new Ld("Stream")}function JR(t,e,n){et(t,e,n.f)}function eE(t,e,n){et(t,e,n.a[1])}function tE(t,e,n){const i=xt(t,n.i,yk([],n.s,n.l));$p(t,n.i,35);for(let s=0,l=n.a.length;s<l;s++)i.v[s]=et(t,e,n.a[s]);return i}function et(t,e,n){if(e>t.base.depthLimit)throw new uk(t.base.depthLimit);switch(e+=1,n.t){case 2:return ap(n,MT,n.s);case 0:return Number(n.s);case 1:return Ao(String(n.s));case 3:if(String(n.s).length>wR)throw new Ht(n);return BigInt(n.s);case 4:return t.base.refs.get(n.i);case 18:return RR(t,n);case 9:return ER(t,e,n);case 10:case 11:return IR(t,e,n);case 5:return MR(t,n);case 6:return DR(t,n);case 7:return LR(t,e,n);case 8:return NR(t,e,n);case 19:return UR(t,n);case 16:case 15:return jR(t,e,n);case 20:return FR(t,e,n);case 14:return qR(t,e,n);case 13:return BR(t,e,n);case 12:return zR(t,e,n);case 17:return ap(n,IT,n.s);case 21:return HR(t,e,n);case 25:return GR(t,e,n);case 22:return WR(t,n);case 23:case 24:return $R(t,e,n);case 28:return VR(t,e,n);case 30:return YR(t,e,n);case 31:return KR(t,e,n);case 32:return ZR(t,e,n);case 33:return QR(t,e,n);case 34:return XR(t,e,n);case 27:return JR(t,e,n);case 29:return eE(t,e,n);case 35:return tE(t,e,n);case 36:return PR(t,n);default:throw new Fp(n)}}function nE(t,e){try{return et(t,0,e)}catch(n){throw new YT(n)}}function Bv(t,e){const n=wk(e.plugins);return nE(_R({maxBase64Length:e.maxBase64Length,plugins:n,refs:e.refs,features:e.features,disabledFeatures:e.disabledFeatures,depthLimit:e.depthLimit}),t)}async function aE(t,e={}){const n=wk(e.plugins),i=Q1(1,{compactArrayBufferViews:e.compactArrayBufferViews,plugins:n,disabledFeatures:e.disabledFeatures});return{t:await pR(i,t),f:i.base.features,m:Array.from(i.base.marked)}}function oE(t){return{tag:"$TSR/t/"+t.key,test:t.test,parse:{sync(e,n,i){return{v:n.parse(t.toSerializable(e))}},async async(e,n,i){return{v:await n.parse(t.toSerializable(e))}},stream(e,n,i){return{v:n.parse(t.toSerializable(e))}}},serialize:void 0,deserialize(e,n,i){return t.fromSerializable(n.deserialize(e.v))}}}var iE=class{constructor(t,e){this.stream=t,this.hint=e?.hint??"binary"}},ud=globalThis.Buffer,Ak=!!ud&&typeof ud.from=="function";function Tk(t){if(t.length===0)return"";if(Ak)return ud.from(t).toString("base64");const e=32768,n=[];for(let i=0;i<t.length;i+=e){const s=t.subarray(i,i+e);n.push(String.fromCharCode.apply(null,s))}return btoa(n.join(""))}function Rk(t){if(t.length===0)return new Uint8Array(0);if(Ak){const i=ud.from(t,"base64");return new Uint8Array(i.buffer,i.byteOffset,i.byteLength)}const e=atob(t),n=new Uint8Array(e.length);for(let i=0;i<e.length;i++)n[i]=e.charCodeAt(i);return n}var Or=Object.create(null),Ir=Object.create(null),sE=t=>new ReadableStream({start(e){t.on({next(n){try{e.enqueue(Rk(n))}catch{}},throw(n){e.error(n)},return(){try{e.close()}catch{}}})}}),rE=new TextEncoder,lE=t=>new ReadableStream({start(e){t.on({next(n){try{typeof n=="string"?e.enqueue(rE.encode(n)):e.enqueue(Rk(n.$b64))}catch{}},throw(n){e.error(n)},return(){try{e.close()}catch{}}})}}),cE="(s=>new ReadableStream({start(c){s.on({next(b){try{const d=atob(b),a=new Uint8Array(d.length);for(let i=0;i<d.length;
12i++)a[i]=d.charCodeAt(i);c.enqueue(a)}catch(_){}},throw(e){c.error(e)},return(){try{c.close()}catch(_){}}})}}))",dE="(s=>{const e=new TextEncoder();return new ReadableStream({start(c){s.on({next(v){try{if(typeof v==='string'){c.enqueue(e.encode(v))}else{const d=atob(v.$b64),a=new Uint8Array(d.length);for(let i=0;i<d.length;i++)a[i]=d.charCodeAt(i);c.enqueue(a)}}catch(_){}},throw(x){c.error(x)},return(){try{c.close()}catch(_){}}})}})})";function zv(t){const e=li(),n=t.getReader();return(async()=>{try{for(;;){const{done:i,value:s}=await n.read();if(i){e.return(void 0);break}e.next(Tk(s))}}catch(i){e.throw(i)}finally{n.releaseLock()}})(),e}function Hv(t){const e=li(),n=t.getReader(),i=new TextDecoder("utf-8",{fatal:!0});return(async()=>{try{for(;;){const{done:s,value:l}=await n.read();if(s){try{const d=i.decode();d.length>0&&e.next(d)}catch{}e.return(void 0);break}try{const d=i.decode(l,{stream:!0});d.length>0&&e.next(d)}catch{e.next({$b64:Tk(l)})}}}catch(s){e.throw(s)}finally{n.releaseLock()}})(),e}var uE={tag:"tss/RawStream",extends:[{tag:"tss/RawStreamFactory",test(t){return t===Or},parse:{sync(t,e,n){return{}},async async(t,e,n){return{}},stream(t,e,n){return{}}},serialize(t,e,n){return cE},deserialize(t,e,n){return Or}},{tag:"tss/RawStreamFactoryText",test(t){return t===Ir},parse:{sync(t,e,n){return{}},async async(t,e,n){return{}},stream(t,e,n){return{}}},serialize(t,e,n){return dE},deserialize(t,e,n){return Ir}}],test(t){return t instanceof iE},parse:{sync(t,e,n){const i=t.hint==="text"?Ir:Or;return{hint:e.parse(t.hint),factory:e.parse(i),stream:e.parse(li())}},async async(t,e,n){const i=t.hint==="text"?Ir:Or,s=t.hint==="text"?Hv(t.stream):zv(t.stream);return{hint:await e.parse(t.hint),factory:await e.parse(i),stream:await e.parse(s)}},stream(t,e,n){const i=t.hint==="text"?Ir:Or,s=t.hint==="text"?Hv(t.stream):zv(t.stream);return{hint:e.parse(t.hint),factory:e.parse(i),stream:e.parse(s)}}},serialize(t,e,n){return"("+e.serialize(t.factory)+")("+e.serialize(t.stream)+")"},deserialize(t,e,n){const i=e.deserialize(t.stream);return e.deserialize(t.hint)==="text"?lE(i):sE(i)}};function hE(t){return{tag:"tss/RawStream",test:()=>!1,parse:{},serialize(){throw new Error("RawStreamDeserializePlugin.serialize should not be called. Client only deserializes.")},deserialize(e,n,i){return t(typeof n?.deserialize=="function"?n.deserialize(e.streamId):e.streamId)}}}var fE={tag:"$TSR/Error",test(t){return t instanceof Error},parse:{sync(t,e){return{message:e.parse(t.message)}},async async(t,e){return{message:await e.parse(t.message)}},stream(t,e){return{message:e.parse(t.message)}}},serialize(t,e){return"new Error("+e.serialize(t.message)+")"},deserialize(t,e){return new Error(e.deserialize(t.message))}},co={},Ek=t=>new ReadableStream({start:e=>{t.on({next:n=>{try{e.enqueue(n)}catch{}},throw:n=>{e.error(n)},return:()=>{try{e.close()}catch{}}})}}),pE={tag:"seroval-plugins/web/ReadableStreamFactory",test(t){return t===co},parse:{sync(){return co},async async(){return await Promise.resolve(co)},stream(){return co}},serialize(){return Ek.toString()},deserialize(){return co}};function Gv(t){let e=li(),n=t.getReader();async function i(){try{let s=await n.read();s.done?e.return(s.value):(e.next(s.value),await i())}catch(s){e.throw(s)}}return i().catch(()=>{}),e}var mE={tag:"seroval/plugins/web/ReadableStream",extends:[pE],test(t){return typeof ReadableStream>"u"?!1:t instanceof ReadableStream},parse:{sync(t,e){return{factory:e.parse(co),stream:e.parse(li())}},async async(t,e){return{factory:await e.parse(co),stream:await e.parse(Gv(t))}},stream(t,e){return{factory:e.parse(co),stream:e.parse(Gv(t))}}},serialize(t,e){return"("+e.serialize(t.factory)+")("+e.serialize(t.stream)+")"},deserialize(t,e){let n=e.deserialize(t.stream);return Ek(n)}},gE=mE,yE=[fE,uE,gE];function bE(){return[...Pp()?.serializationAdapters?.map(oE)??[],...yE]}var Wv=new TextDecoder,vE=new Uint8Array(0),$v=16*1024*1024,Vv=32*1024*1024,Yv=1024,Kv=1e5;function wE(t){const e=new Map,n=new Map,i=new Set;let s=!1,l=null,d=0,u;const f=new ReadableStream({start(g){u=g},cancel(){s=!0;try{l?.cancel()}catch{}e.forEach(g=>{try{g.error(new Error("Framed response cancelled"))}catch{}}),e.clear(),n.clear(),i.clear()}});function p(g){const v=n.get(g);if(v)return v;
12if(i.has(g))return new ReadableStream({start(x){x.close()}});if(n.size>=Yv)throw new Error(`Too many raw streams in framed response (max ${Yv})`);const w=new ReadableStream({start(x){e.set(g,x)},cancel(){i.add(g),e.delete(g),n.delete(g)}});return n.set(g,w),w}function y(g){return p(g),e.get(g)}return(async()=>{const g=t.getReader();l=g;const v=[];let w=0;function x(){if(w<9)return null;const S=v[0];if(S.length>=9)return{type:S[0],streamId:(S[1]<<24|S[2]<<16|S[3]<<8|S[4])>>>0,length:(S[5]<<24|S[6]<<16|S[7]<<8|S[8])>>>0};const C=new Uint8Array(9);let E=0,R=9;for(let D=0;D<v.length&&R>0;D++){const G=v[D],z=Math.min(G.length,R);C.set(G.subarray(0,z),E),E+=z,R-=z}return{type:C[0],streamId:(C[1]<<24|C[2]<<16|C[3]<<8|C[4])>>>0,length:(C[5]<<24|C[6]<<16|C[7]<<8|C[8])>>>0}}function k(S){if(S===0)return vE;const C=new Uint8Array(S);let E=0,R=S;for(;R>0&&v.length>0;){const D=v[0];if(!D)break;const G=Math.min(D.length,R);C.set(D.subarray(0,G),E),E+=G,R-=G,G===D.length?v.shift():v[0]=D.subarray(G)}return w-=S,C}try{for(;;){const{done:S,value:C}=await g.read();if(s||S)break;if(C){if(w+C.length>Vv)throw new Error(`Framed response buffer exceeded ${Vv} bytes`);for(v.push(C),w+=C.length;;){const E=x();if(!E)break;const{type:R,streamId:D,length:G}=E;if(R!==va.JSON&&R!==va.CHUNK&&R!==va.END&&R!==va.ERROR)throw new Error(`Unknown frame type: ${R}`);
12if(R===va.JSON){if(D!==0)throw new Error("Invalid JSON frame streamId (expected 0)")}else if(D===0)throw new Error("Invalid raw frame streamId (expected non-zero)");if(G>$v)throw new Error(`Frame payload too large: ${G} bytes (max ${$v})`);const z=9+G;if(w<z)break;if(++d>Kv)throw new Error(`Too many frames in framed response (max ${Kv})`);k(9);const N=k(G);switch(R){case va.JSON:try{u.enqueue(Wv.decode(N))}catch{}break;case va.CHUNK:{const P=y(D);P&&P.enqueue(N);break}case va.END:{const P=y(D);if(i.add(D),P){try{P.close()}catch{}e.delete(D)}break}case va.ERROR:{const P=y(D);if(i.add(D),P){const W=Wv.decode(N);P.error(new Error(W)),e.delete(D)}break}}}}}if(w!==0)throw new Error("Incomplete frame at end of framed response");try{u.close()}catch{}e.forEach(S=>{try{S.close()}catch{}}),e.clear()}catch(S){try{u.error(S)}catch{}e.forEach(C=>{try{C.error(S)}catch{}}),e.clear()}finally{try{g.releaseLock()}catch{}l=null}})(),{getOrCreateStream:p,jsonChunks:f}}var Kr=null;async function op(t){t.length>0&&await Promise.allSettled(t)}var xE=Object.prototype.hasOwnProperty;function Ok(t){for(const e in t)if(xE.call(t,e))return!0;return!1}async function kE(t,e,n){Kr||(Kr=bE());const i=e[0],s=i.fetch??n,l=i.data instanceof FormData?"formData":"payload",d=i.headers?new Headers(i.headers):new Headers;if(d.set("x-tsr-serverFn","true"),l==="payload"&&d.set("accept",`${bA}, application/x-ndjson, application/json`),i.method==="GET"){if(l==="formData")throw new Error("FormData is not supported with GET requests");const f=await Ik(i);if(f!==void 0){const p=Gx({payload:f});t.includes("?")?t+=`&${p}`:t+=`?${p}`}}let u;if(i.method==="POST"){const f=await SE(i);f?.contentType&&d.set("content-type",f.contentType),u=f?.body}return await _E(async()=>s(t,{method:i.method,headers:d,signal:i.signal,body:u}))}async function Ik(t){let e=!1;const n={};if(t.data!==void 0&&(e=!0,n.data=t.data),t.context&&Ok(t.context)&&(e=!0,n.context=t.context),e)return Mk(n)}async function Mk(t){return JSON.stringify(await Promise.resolve(aE(t,{plugins:Kr})))}async function SE(t){if(t.data instanceof FormData){let n;return t.context&&Ok(t.context)&&(n=await Mk(t.context)),n!==void 0&&t.data.set(yA,n),{body:t.data}}const e=await Ik(t);if(e)return{body:e,contentType:"application/json"}}async function _E(t){let e;try{e=await t()}catch(i){if(i instanceof Response)e=i;else throw console.log(i),i}if(e.headers.get("x-tss-raw")==="true")return e;const n=e.headers.get("content-type");if(n||an(),e.headers.get("x-tss-serialized")){let i;if(n.includes("application/x-tss-framed")){if(xA(n),!e.body)throw new Error("No response body for framed response");const{getOrCreateStream:s,jsonChunks:l}=wE(e.body),d=[hE(s),...Kr||[]],u=new Map;i=await CE({jsonStream:l,onMessage:f=>Bv(f,{refs:u,plugins:d}),onError(f,p){console.error(f,p)}})}else if(n.includes("application/json")){const s=await e.json(),l=[];i=Bv(s,{plugins:Kr}),await op(l)}if(i||an(),i instanceof Error)throw i;return i}if(n.includes("application/json")){const i=await e.json(),s=Wx(i);if(s)throw s;if(Ot(i))throw i;return i}if(!e.ok)throw new Error(await e.text());return e}async function CE({jsonStream:t,onMessage:e,onError:n}){const i=t.getReader(),{value:s,done:l}=await i.read();if(l||!s)throw new Error("Stream ended before first object");const d=JSON.parse(s);let u=!1;const f=(async()=>{try{for(;;){const{value:g,done:v}=await i.read();if(v)break;if(g)try{const w=[];try{e(JSON.parse(g))}finally{}await op(w)}catch(w){n?.(`Invalid JSON: ${g}`,w)}}}catch(g){u||n?.("Stream processing error:",g)}})();let p;const y=[];try{p=e(d)}catch(g){throw u=!0,i.cancel().catch(()=>{}),g}return await op(y),Promise.resolve(p).catch(()=>{u=!0,i.cancel().catch(()=>{})}),f.finally(()=>{try{i.releaseLock()}catch{}}),p}function It(t){const e="/_serverFn/"+t;return Object.assign((...s)=>{const l=Pp()?.serverFns?.fetch;return kE(e,s,l??fetch)},{url:e,serverFnMeta:{id:t},[ep]:!0})}var AE={key:"$TSS/serverfn",test:t=>typeof t!="function"||!(ep in t)?!1:!!t[ep],toSerializable:({serverFnMeta:t})=>({functionId:t.id}),fromSerializable:({functionId:t})=>It(t)};function Pk(t){if(Array.isArray(t))return t.flatMap(y=>Pk(y));if(typeof t!="string")return[];const e=[];let n=0,i,s,l,d,u;const f=()=>{for(;n<t.length&&/\s/.test(t.charAt(n));)n+=1;return n<t.length},p=()=>(s=t.charAt(n),s!=="="&&s!==";"&&s!==",");for(;n<t.length;){for(i=n,u=!1;f();)if(s=t.charAt(n),s===","){for(l=n,n+=1,f(),d=n;n<t.length&&p();)n+=1;n<t.length&&t.charAt(n)==="="?(u=!0,n=d,e.push(t.slice(i,l)),i=n):n=l+1}else n+=1;(!u||n>=t.length)&&e.push(t.slice(i))}return e}function TE(t){return t instanceof Headers?t:Array.isArray(t)?new Headers(t):typeof t=="object"?new Headers(t):null}function RE(...t){return t.reduce((e,n)=>{const i=TE(n);if(!i)return e;for(const[s,l]of i.entries())s==="set-cookie"?Pk(l).forEach(d=>e.append("set-cookie",d)):e.set(s,l);return e},new Headers)}function Zv(t){return t.replaceAll("\0","/").replaceAll("�","/")}function EE(t,e){t.id=e.i,t.__beforeLoadContext=e.b,t.loaderData=e.l,t.status=e.s,t.ssr=e.ssr,t.updatedAt=e.u,t.error=e.e,e.g!==void 0&&(t.globalNotFound=e.g)}async function OE(t){window.$_TSR||an();const e=t.options.serializationAdapters;if(e?.length){const S=new Map;e.forEach(C=>{S.set(C.key,C.fromSerializable)}),window.$_TSR.t=S,window.$_TSR.buffer.forEach(C=>C())}window.$_TSR.initialized=!0,window.$_TSR.router||an();const n=window.$_TSR.router;
12n.matches.forEach(S=>{S.i=Zv(S.i)}),n.lastMatchId&&(n.lastMatchId=Zv(n.lastMatchId));const{manifest:i,dehydratedData:s,lastMatchId:l}=n;t.ssr={manifest:i};const d=document.querySelector('meta[property="csp-nonce"]')?.content;t.options.ssr={nonce:d};const u=t.matchRoutes(t.stores.location.get()),f=Promise.all(u.map(S=>t.loadRouteChunk(t.looseRoutesById[S.routeId])));function p(S){const C=t.looseRoutesById[S.routeId].options.pendingMinMs??t.options.defaultPendingMinMs;if(C){const E=ai();S._nonReactive.minPendingPromise=E,S._forcePending=!0,setTimeout(()=>{E.resolve(),t.updateMatch(S.id,R=>(R._nonReactive.minPendingPromise=void 0,{...R,_forcePending:void 0}))},C)}}function y(S){const C=t.looseRoutesById[S.routeId];C&&(C.options.ssr=S.ssr)}let g;u.forEach(S=>{const C=n.matches.find(E=>E.i===S.id);if(!C){S._nonReactive.dehydrated=!1,S.ssr=!1,y(S);return}EE(S,C),y(S),S._nonReactive.dehydrated=S.ssr!==!1,(S.ssr==="data-only"||S.ssr===!1)&&g===void 0&&(g=S.index,p(S))}),t.stores.setMatches(u),await t.options.hydrate?.(s);const v=t.stores.matches.get(),w=t.stores.location.get();await Promise.all(v.map(async S=>{try{const C=t.looseRoutesById[S.routeId],E=v[S.index-1]?.context??t.options.context;if(C.options.context){const z={deps:S.loaderDeps,params:S.params,context:E??{},location:w,navigate:N=>t.navigate({...N,_fromLocation:w}),buildLocation:t.buildLocation,cause:S.cause,abortController:S.abortController,preload:!1,matches:u,routeId:C.id};
12S.__routeContext=C.options.context(z)??void 0}S.context={...E,...S.__routeContext,...S.__beforeLoadContext};const R={ssr:t.options.ssr,matches:v,match:S,params:S.params,loaderData:S.loaderData},D=await C.options.head?.(R),G=await C.options.scripts?.(R);S.meta=D?.meta,S.links=D?.links,S.headScripts=D?.scripts,S.styles=D?.styles,S.scripts=G}catch(C){if(Ot(C))S.error={isNotFound:!0},console.error(`NotFound error during hydration for routeId: ${S.routeId}`,C);else throw S.error=C,console.error(`Error during hydration for route ${S.routeId}:`,C),C}}));const x=u[u.length-1].id!==l;if(!u.some(S=>S.ssr===!1)&&!x)return u.forEach(S=>{S._nonReactive.dehydrated=void 0}),t.stores.resolvedLocation.set(t.stores.location.get()),f;const k=Promise.resolve().then(()=>t.load()).catch(S=>{console.error("Error during router hydration:",S)});if(x){const S=u[1];S||an(),p(S),S._displayPending=!0,S._nonReactive.displayPendingPromise=k,k.then(()=>{t.batch(()=>{t.stores.status.get()==="pending"&&(t.stores.status.set("idle"),t.stores.resolvedLocation.set(t.stores.location.get())),t.updateMatch(S.id,C=>({...C,_displayPending:void 0,displayPendingPromise:void 0}))})})}return f}var hd=A.use,Nr=typeof window<"u"?A.useLayoutEffect:A.useEffect;function xf(t){const e=A.useRef({value:t,prev:null}),n=e.current.value;return t!==n&&(e.current={value:t,prev:n}),e.current.prev}function IE(t,e,n={},i={}){A.useEffect(()=>{if(!t.current||i.disabled||typeof IntersectionObserver!="function")return;const s=new IntersectionObserver(([l])=>{e(l)},n);return s.observe(t.current),()=>{s.disconnect()}},[e,n,i.disabled,t])}function ME(t){const e=A.useRef(null);return A.useImperativeHandle(t,()=>e.current,[]),e}function PE({promise:t}){if(hd)return hd(t);const e=_T(t);if(e[$n].status==="pending")throw e;if(e[$n].status==="error")throw e[$n].error;return e[$n].data}function DE(t){const e=M.jsx(LE,{...t});return t.fallback?M.jsx(A.Suspense,{fallback:t.fallback,children:e}):e}function LE(t){const e=PE(t);return t.children(e)}function Vp(t){const e=t.errorComponent??Yp;return M.jsx(NE,{getResetKey:t.getResetKey,onCatch:t.onCatch,children:({error:n,reset:i})=>n?A.createElement(e,{error:n,reset:i}):t.children})}var NE=class extends A.Component{constructor(...t){super(...t),this.state={error:null}}static getDerivedStateFromProps(t,e){const n=t.getResetKey();return e.error&&e.resetKey!==n?{resetKey:n,error:null}:{resetKey:n}}static getDerivedStateFromError(t){return{error:t}}reset(){this.setState({error:null})}componentDidCatch(t,e){this.props.onCatch&&this.props.onCatch(t,e)}render(){return this.props.children({error:this.state.error,reset:()=>{this.reset()}})}};function Yp({error:t}){const[e,n]=A.useState(!1);return M.jsxs("div",{style:{padding:".5rem",maxWidth:"100%"},children:[M.jsxs("div",{style:{display:"flex",alignItems:"center",gap:".5rem"},children:[M.jsx("strong",{style:{fontSize:"1rem"},children:"Something went wrong!"}),M.jsx("button",{style:{appearance:"none",fontSize:".6em",border:"1px solid currentColor",padding:".1rem .2rem",fontWeight:"bold",borderRadius:".25rem"},onClick:()=>n(i=>!i),children:e?"Hide Error":"Show Error"})]}),M.jsx("div",{style:{height:".25rem"}}),e?M.jsx("div",{children:M.jsx("pre",{style:{fontSize:".7em",border:"1px solid red",borderRadius:".25rem",padding:".3rem",color:"red",overflow:"auto"},children:t.message?M.jsx("code",{children:t.message}):null})}):null]})}function UE({children:t,fallback:e=null}){return Kp()?M.jsx(bt.Fragment,{children:t}):M.jsx(bt.Fragment,{children:e})}function Kp(){return bt.useSyncExternalStore(jE,()=>!0,()=>!1)}function jE(){return()=>{}}var Dk=A.createContext(null);function At(t){return A.useContext(Dk)}var jd=A.createContext(void 0),FE=A.createContext(void 0),st=(t=>(t[t.None=0]="None",t[t.Mutable=1]="Mutable",t[t.Watching=2]="Watching",t[t.RecursedCheck=4]="RecursedCheck",t[t.Recursed=8]="Recursed",t[t.Dirty=16]="Dirty",t[t.Pending=32]="Pending",t))(st||{});function qE({update:t,notify:e,unwatched:n}){return{link:i,unlink:s,propagate:l,checkDirty:d,shallowPropagate:u};function i(p,y,g){const v=y.depsTail;if(v!==void 0&&v.dep===p)return;const w=v!==void 0?v.nextDep:y.deps;if(w!==void 0&&w.dep===p){w.version=g,y.depsTail=w;return}const x=p.subsTail;if(x!==void 0&&x.version===g&&x.sub===y)return;const k=y.depsTail=p.subsTail={version:g,dep:p,sub:y,prevDep:v,nextDep:w,prevSub:x,nextSub:void 0};w!==void 0&&(w.prevDep=k),v!==void 0?v.nextDep=k:y.deps=k,x!==void 0?x.nextSub=k:p.subs=k}function s(p,y=p.sub){const g=p.dep,v=p.prevDep,w=p.nextDep,x=p.nextSub,k=p.prevSub;return w!==void 0?w.prevDep=v:y.depsTail=v,v!==void 0?v.nextDep=w:y.deps=w,x!==void 0?x.prevSub=k:g.subsTail=k,k!==void 0?k.nextSub=x:(g.subs=x)===void 0&&n(g),w}function l(p){let y=p.nextSub,g;e:do{const v=p.sub;let w=v.flags;if(w&60?w&12?w&4?!(w&48)&&f(p,v)?(v.flags=w|40,w&=1):w=0:v.flags=w&-9|32:w=0:v.flags=w|32,w&2&&e(v),w&1){const x=v.subs;if(x!==void 0){const k=(p=x).nextSub;k!==void 0&&(g={value:y,prev:g},y=k);continue}}if((p=y)!==void 0){y=p.nextSub;continue}for(;g!==void 0;)if(p=g.value,g=g.prev,p!==void 0){y=p.nextSub;continue e}break}while(!0)}function d(p,y){let g,v=0,w=!1;e:do{const x=p.dep,k=x.flags;if(y.flags&16)w=!0;else if((k&17)===17){if(t(x)){const S=x.subs;S.nextSub!==void 0&&u(S),w=!0}}else if((k&33)===33){(p.nextSub!==void 0||p.prevSub!==void 0)&&(g={value:p,prev:g}),p=x.deps,y=x,++v;continue}if(!w){const S=p.nextDep;if(S!==void 0){p=S;continue}}for(;v--;){const S=y.subs,C=S.nextSub!==void 0;
12if(C?(p=g.value,g=g.prev):p=S,w){if(t(y)){C&&u(S),y=p.sub;continue}w=!1}else y.flags&=-33;y=p.sub;const E=p.nextDep;if(E!==void 0){p=E;continue e}}return w}while(!0)}function u(p){do{const y=p.sub,g=y.flags;(g&48)===32&&(y.flags=g|16,(g&6)===2&&e(y))}while((p=p.nextSub)!==void 0)}function f(p,y){let g=y.depsTail;for(;g!==void 0;){if(g===p)return!0;g=g.prevDep}return!1}}function BE(t,e,n){const i=typeof t=="object",s=i?t:void 0;return{next:(i?t.next:t)?.bind(s),error:(i?t.error:e)?.bind(s),complete:(i?t.complete:n)?.bind(s)}}const ip=[];let nd=0;const{link:Qv,unlink:zE,propagate:HE,checkDirty:Lk,shallowPropagate:Xv}=qE({update(t){return t._update()},notify(t){ip[sp++]=t,t.flags&=~st.Watching},unwatched(t){t.depsTail!==void 0&&(t.depsTail=void 0,t.flags=st.Mutable|st.Dirty,fd(t))}});let Dc=0,sp=0,Gn,rp=0;function Nk(t){try{++rp,t()}finally{--rp||Uk()}}function fd(t){const e=t.depsTail;let n=e!==void 0?e.nextDep:t.deps;for(;n!==void 0;)n=zE(n,t)}function Uk(){if(!(rp>0)){for(;Dc<sp;){const t=ip[Dc];ip[Dc++]=void 0,t.notify()}Dc=0,sp=0}}function Jv(t,e){const n=typeof t=="function",i=t,s={_snapshot:n?void 0:t,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:n?st.None:st.Mutable,get(){return Gn!==void 0&&Qv(s,Gn,nd),s._snapshot},subscribe(l){const d=BE(l),u={current:!1},f=GE(()=>{s.get(),u.current?d.next?.(s._snapshot):u.current=!0});return{unsubscribe:()=>{f.stop()}}},_update(l){const d=Gn,u=e?.compare??Object.is;if(n)Gn=s,++nd,s.depsTail=void 0;else if(l===void 0)return!1;n&&(s.flags=st.Mutable|st.RecursedCheck);try{const f=s._snapshot,p=typeof l=="function"?l(f):l===void 0&&n?i(f):l;return f===void 0||!u(f,p)?(s._snapshot=p,!0):!1}finally{Gn=d,n&&(s.flags&=~st.RecursedCheck),fd(s)}}};return n?(s.flags=st.Mutable|st.Dirty,s.get=function(){const l=s.flags;if(l&st.Dirty||l&st.Pending&&Lk(s.deps,s)){if(s._update()){const d=s.subs;d!==void 0&&Xv(d)}}else l&st.Pending&&(s.flags=l&~st.Pending);return Gn!==void 0&&Qv(s,Gn,nd),s._snapshot}):s.set=function(l){if(s._update(l)){const d=s.subs;d!==void 0&&(HE(d),Xv(d),Uk())}},s}function GE(t){const e=()=>{const i=Gn;Gn=n,++nd,n.depsTail=void 0,n.flags=st.Watching|st.RecursedCheck;try{return t()}finally{Gn=i,n.flags&=~st.RecursedCheck,fd(n)}},n={deps:void 0,depsTail:void 0,subs:void 0,subsTail:void 0,flags:st.Watching|st.RecursedCheck,notify(){const i=this.flags;i&st.Dirty||i&st.Pending&&Lk(this.deps,this)?e():this.flags=st.Watching},stop(){this.flags=st.None,this.depsTail=void 0,fd(this)}};return e(),n}var kf={exports:{}},Sf={},_f={exports:{}},Cf={};var ew;function WE(){if(ew)return Cf;ew=1;var t=cl();function e(g,v){return g===v&&(g!==0||1/g===1/v)||g!==g&&v!==v}var n=typeof Object.is=="function"?Object.is:e,i=t.useState,s=t.useEffect,l=t.useLayoutEffect,d=t.useDebugValue;function u(g,v){var w=v(),x=i({inst:{value:w,getSnapshot:v}}),k=x[0].inst,S=x[1];return l(function(){k.value=w,k.getSnapshot=v,f(k)&&S({inst:k})},[g,w,v]),s(function(){return f(k)&&S({inst:k}),g(function(){f(k)&&S({inst:k})})},[g]),d(w),w}function f(g){var v=g.getSnapshot;g=g.value;try{var w=v();return!n(g,w)}catch{return!0}}function p(g,v){return v()}var y=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?p:u;return Cf.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:y,Cf}var tw;function $E(){return tw||(tw=1,_f.exports=WE()),_f.exports}var nw;function VE(){if(nw)return Sf;nw=1;var t=cl(),e=$E();function n(p,y){return p===y&&(p!==0||1/p===1/y)||p!==p&&y!==y}var i=typeof Object.is=="function"?Object.is:n,s=e.useSyncExternalStore,l=t.useRef,d=t.useEffect,u=t.useMemo,f=t.useDebugValue;return Sf.useSyncExternalStoreWithSelector=function(p,y,g,v,w){var x=l(null);if(x.current===null){var k={hasValue:!1,value:null};x.current=k}else k=x.current;x=u(function(){function C(z){if(!E){if(E=!0,R=z,z=v(z),w!==void 0&&k.hasValue){var N=k.value;if(w(N,z))return D=N}return D=z}if(N=D,i(R,z))return N;var P=v(z);return w!==void 0&&w(N,P)?(R=z,N):(R=z,D=P)}var E=!1,R,D,G=g===void 0?null:g;return[function(){return C(y())},G===null?void 0:function(){return C(G())}]},[y,g,v,w]);var S=s(p,x[0],x[1]);return d(function(){k.hasValue=!0,k.value=S},[S]),f(S),S},Sf}var aw;function YE(){return aw||(aw=1,kf.exports=VE()),kf.exports}var KE=YE();function ZE(t,e){return t===e}function ht(t,e,n=ZE){const i=A.useCallback(d=>
12{if(!t)return()=>{};const{unsubscribe:u}=t.subscribe(d);return u},[t]),s=A.useCallback(()=>t?.get(),[t]);return KE.useSyncExternalStoreWithSelector(i,s,s,e,n)}var QE={get:()=>{},subscribe:()=>({unsubscribe:()=>{}})};function ci(t){const e=At(),n=A.useContext(t.from?FE:jd),i=t.from??n,s=i?t.from?e.stores.getRouteMatchStore(i):e.stores.matchStores.get(i):void 0,l=A.useRef(void 0);return ht(s??QE,d=>{if((t.shouldThrow??!0)&&!d&&an(),d===void 0)return;const u=t.select?t.select(d):d;if(t.structuralSharing??e.options.defaultStructuralSharing){const f=po(l.current,u);return l.current=f,f}return u})}function jk(t){return ci({from:t.from,strict:t.strict,structuralSharing:t.structuralSharing,select:e=>t.select?t.select(e.loaderData):e.loaderData})}function Fk(t){const{select:e,...n}=t;return ci({...n,select:i=>e?e(i.loaderDeps):i.loaderDeps})}function qk(t){return ci({from:t.from,shouldThrow:t.shouldThrow,structuralSharing:t.structuralSharing,strict:t.strict,select:e=>{const n=t.strict===!1?e.params:e._strictParams;return t.select?t.select(n):n}})}function Bk(t){return ci({from:t.from,strict:t.strict,shouldThrow:t.shouldThrow,structuralSharing:t.structuralSharing,select:e=>t.select?t.select(e.search):e.search})}function zk(t){const e=At();return A.useCallback(n=>e.navigate({...n,from:n.from??t?.from}),[t?.from,e])}function Hk(t){return ci({...t,select:e=>t.select?t.select(e.context):e.context})}var Zp=jx();const XE=Ux(Zp);function JE(t,e){const n=At(),i=ME(e),{activeProps:s,inactiveProps:l,activeOptions:d,to:u,preload:f,preloadDelay:p,preloadIntentProximity:y,hashScrollIntoView:g,replace:v,startTransition:w,resetScroll:x,viewTransition:k,children:S,target:C,disabled:E,style:R,className:D,onClick:G,onBlur:z,onFocus:N,onMouseEnter:P,onMouseLeave:W,onTouchStart:oe,ignoreBlocker:ne,params:we,search:Fe,hash:tt,state:qe,mask:q,reloadDocument:K,unsafeRelative:he,from:Le,_fromLocation:X,...O}=t,V=Kp(),Q=A.useMemo(()=>t,[n,t.from,t._fromLocation,t.hash,t.to,t.search,t.params,t.state,t.mask,t.unsafeRelative]),ee=ht(n.stores.location,Xe=>Xe,(Xe,Mt)=>Xe.href===Mt.href),te=A.useMemo(()=>{const Xe={_fromLocation:ee,...Q};return n.buildLocation(Xe)},[n,ee,Q]),fe=te.maskedLocation?te.maskedLocation.publicHref:te.publicHref,Re=te.maskedLocation?te.maskedLocation.external:te.external,ot=A.useMemo(()=>iO(fe,Re,n.history,E),[E,Re,fe,n.history]),ve=A.useMemo(()=>{if(ot?.external)return rd(ot.href,n.protocolAllowlist)?void 0:ot.href;if(!sO(u)&&!(typeof u!="string"||u.indexOf(":")===-1))try{return new URL(u),rd(u,n.protocolAllowlist)?void 0:u}catch{}},[u,ot,n.protocolAllowlist]),yn=A.useMemo(()=>{if(ve)return!1;if(d?.exact){if(!GA(ee.pathname,te.pathname,n.basepath))return!1}else{const Xe=ld(ee.pathname,n.basepath),Mt=ld(te.pathname,n.basepath);if(!(Xe.startsWith(Mt)&&(Xe.length===Mt.length||Xe[Mt.length]==="/")))return!1}return(d?.includeSearch??!0)&&!nn(ee.search,te.search,{partial:!d?.exact,ignoreUndefined:!d?.explicitUndefined})?!1:d?.includeHash?V&&ee.hash===te.hash:!0},[d?.exact,d?.explicitUndefined,d?.includeHash,d?.includeSearch,ee,ve,V,te.hash,te.pathname,te.search,n.basepath]),Vt=yn?fo(s,{})??eO:Af,on=yn?Af:fo(l,{})??Af,Jn=[D,Vt.className,on.className].filter(Boolean).join(" "),Gt=(R||Vt.style||on.style)&&{...R,...Vt.style,...on.style},[Is,pi]=A.useState(!1),hl=A.useRef(!1),ea=t.reloadDocument||ve?!1:f??n.options.defaultPreload,Ro=p??n.options.defaultPreloadDelay??0,On=A.useCallback(()=>{n.preloadRoute({...Q,_builtLocation:te}).catch(Xe=>{console.warn(Xe),console.warn(CT)})},[n,Q,te]);IE(i,A.useCallback(Xe=>{Xe?.isIntersecting&&On()},[On]),oO,{disabled:!!E||ea!=="viewport"}),A.useEffect(()=>{hl.current||!E&&ea==="render"&&(On(),hl.current=!0)},[E,On,ea]);const Ms=Xe=>{const Mt=Xe.currentTarget.getAttribute("target"),Fn=C!==void 0?C:Mt;if(!E&&!rO(Xe)&&!Xe.defaultPrevented&&(!Fn||Fn==="_self")&&Xe.button===0){Xe.preventDefault(),Zp.flushSync(()=>{pi(!0)});const mi=n.subscribe("onResolved",()=>{mi(),pi(!1)});n.navigate({...Q,replace:v,resetScroll:x,hashScrollIntoView:g,startTransition:w,viewTransition:k,ignoreBlocker:ne})}};if(ve)return{...O,ref:i,href:ve,...S&&{children:S},...C&&{target:C},...E&&{disabled:E},...R&&{style:R},...D&&{className:D},...G&&{onClick:G},...z&&{onBlur:z},...N&&{onFocus:N},...P&&{onMouseEnter:P},...W&&{onMouseLeave:W},...oe&&{onTouchStart:oe}};const fl=Xe=>{if(E||ea!=="intent")return;if(!Ro){On();return}const Mt=Xe.currentTarget;if(Mr.has(Mt))return;const Fn=setTimeout(()=>{Mr.delete(Mt),On()},Ro);Mr.set(Mt,Fn)},Yd=Xe=>{E||ea!=="intent"||On()},Ft=Xe=>{if(E||!ea||!Ro)return;const Mt=Xe.currentTarget,Fn=Mr.get(Mt);Fn&&(clearTimeout(Fn),Mr.delete(Mt))};return{...O,...Vt,...on,href:ot?.href,ref:i,onClick:es([G,Ms]),onBlur:es([z,Ft]),onFocus:es([N,fl]),onMouseEnter:es([P,fl]),onMouseLeave:es([W,Ft]),onTouchStart:es([oe,Yd]),disabled:!!E,target:C,...Gt&&{style:Gt},...Jn&&{className:Jn},...E&&tO,...yn&&nO,...V&&Is&&aO}}var Af={},eO={className:"active"},tO={role:"link","aria-disabled":!0},nO={"data-status":"active","aria-current":"page"},aO={"data-transitioning":"transitioning"},Mr=new WeakMap,oO={rootMargin:"100px"},es=t=>e=>{for(const n of t)if(n){if(e.defaultPrevented)return;n(e)}};function iO(t,e,n,i){if(!i)return e?{href:t,external:!0}:{href:n.createHref(t)||"/",external:!1}}function sO(t){if(typeof t!="string")return!1;const e=t.charCodeAt(0);return e===47?t.charCodeAt(1)!==47:e===46}var Qp=A.forwardRef((t,e)=>{const{_asChild:n,...i}=t,{type:s,...l}=JE(i,e),d=typeof i.children=="function"?i.children({isActive:l["data-status"]==="active"}):i.children;if(!n){const{disabled:u,...f}=l;return A.createElement("a",f,d)}return A.createElement(n,l,d)});function rO(t){return!!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)}var lO=class extends Qx{constructor(e){super(e),this.useMatch=n=>ci({select:n?.select,from:this.id,structuralSharing:n?.structuralSharing}),this.useRouteContext=n=>Hk({...n,from:this.id}),this.useSearch=n=>Bk({select:n?.select,structuralSharing:n?.structuralSharing,from:this.id}),this.useParams=n=>qk({select:n?.select,structuralSharing:n?.structuralSharing,from:this.id}),this.useLoaderDeps=n=>Fk({...n,from:this.id}),this.useLoaderData=n=>jk({...n,from:this.id}),this.useNavigate=()=>zk({from:this.fullPath}),this.Link=bt.forwardRef((n,i)=>M.jsx(Qp,{ref:i,from:this.fullPath,...n}))}};function cO(t){return new lO(t)}function dO(){return t=>hO(t)}
12var uO=class extends ET{constructor(t){super(t),this.useMatch=e=>ci({select:e?.select,from:this.id,structuralSharing:e?.structuralSharing}),this.useRouteContext=e=>Hk({...e,from:this.id}),this.useSearch=e=>Bk({select:e?.select,structuralSharing:e?.structuralSharing,from:this.id}),this.useParams=e=>qk({select:e?.select,structuralSharing:e?.structuralSharing,from:this.id}),this.useLoaderDeps=e=>Fk({...e,from:this.id}),this.useLoaderData=e=>jk({...e,from:this.id}),this.useNavigate=()=>zk({from:this.fullPath}),this.Link=bt.forwardRef((e,n)=>M.jsx(Qp,{ref:n,from:this.fullPath,...e}))}};function hO(t){return new uO(t)}function _e(t){return new fO(t,{silent:!0}).createRoute}var fO=class{constructor(t,e){this.path=t,this.createRoute=n=>{const i=cO(n);return i.isRoot=!1,i},this.silent=e?.silent}};function be(t,e){let n,i,s,l;const d=()=>(n||(n=t().then(f=>{n=void 0,i=f[e??"default"]}).catch(f=>{if(s=f,CA(s)&&s instanceof Error&&typeof window<"u"&&typeof sessionStorage<"u"){const p=`tanstack_router_reload:${s.message}`;sessionStorage.getItem(p)||(sessionStorage.setItem(p,"1"),l=!0)}})),n),u=function(p){if(l)throw window.location.reload(),new Promise(()=>{});if(s)throw s;if(!i)if(hd)hd(d());else throw d();return A.createElement(i,p)};return u.preload=d,u}function pO(t){const e=At(),n=`not-found-${ht(e.stores.location,i=>i.pathname)}-${ht(e.stores.status,i=>i)}`;return M.jsx(Vp,{getResetKey:()=>n,onCatch:(i,s)=>{if(Ot(i))t.onCatch?.(i,s);else throw i},errorComponent:({error:i})=>{if(Ot(i))return t.fallback?.(i);throw i},children:t.children})}function mO(){return M.jsx("p",{children:"Not Found"})}function cs(t){return M.jsx(M.Fragment,{children:t.children})}function Gk(t,e,n){return e.options.notFoundComponent?M.jsx(e.options.notFoundComponent,{...n}):t.options.defaultNotFoundComponent?M.jsx(t.options.defaultNotFoundComponent,{...n}):M.jsx(mO,{})}function gO(t){return null}function yO(){return gO(At()),null}var Wk=A.memo(function({matchId:e}){const n=At(),i=n.stores.matchStores.get(e);i||an();const s=ht(n.stores.loadedAt,d=>d),l=ht(i,d=>d);return M.jsx(bO,{router:n,matchId:e,resetKey:s,matchState:A.useMemo(()=>{const d=l.routeId,u=n.routesById[d].parentRoute?.id;return{routeId:d,ssr:l.ssr,_displayPending:l._displayPending,parentRouteId:u}},[l._displayPending,l.routeId,l.ssr,n.routesById])})});function bO({router:t,matchId:e,resetKey:n,matchState:i}){const s=t.routesById[i.routeId],l=s.options.pendingComponent??t.options.defaultPendingComponent,d=l?M.jsx(l,{}):null,u=s.options.errorComponent??t.options.defaultErrorComponent,f=s.options.onCatch??t.options.defaultOnCatch,p=s.isRoot?s.options.notFoundComponent??t.options.notFoundRoute?.options.component:s.options.notFoundComponent,y=i.ssr===!1||i.ssr==="data-only",g=(!s.isRoot||s.options.wrapInSuspense||y)&&(s.options.wrapInSuspense??l??(s.options.errorComponent?.preload||y))?A.Suspense:cs,v=u?Vp:cs,w=p?pO:cs;return M.jsxs(s.isRoot?s.options.shellComponent??cs:cs,{children:[M.jsx(jd.Provider,{value:e,children:M.jsx(g,{fallback:d,children:M.jsx(v,{getResetKey:()=>n,errorComponent:u||Yp,onCatch:(x,k)=>{if(Ot(x))throw x.routeId??=i.routeId,x;f?.(x,k)},children:M.jsx(w,{fallback:x=>{if(x.routeId??=i.routeId,!p||x.routeId&&x.routeId!==i.routeId||!x.routeId&&!s.isRoot)throw x;return A.createElement(p,x)},children:y||i._displayPending?M.jsx(UE,{fallback:d,children:M.jsx(ow,{matchId:e})}):M.jsx(ow,{matchId:e})})})})}),i.parentRouteId===ei?M.jsxs(M.Fragment,{children:[M.jsx(vO,{resetKey:n}),t.options.scrollRestoration&&Fx?M.jsx(yO,{}):null]}):null]})}function vO({resetKey:t}){const e=At(),n=A.useRef(void 0);return Nr(()=>{const i=e.latestLocation.href;(n.current===void 0||n.current!==i)&&(e.emit({type:"onRendered",...ys(e.stores.location.get(),e.stores.resolvedLocation.get())}),n.current=i)},[e.latestLocation.state.__TSR_key,t,e]),null}var ow=A.memo(function({matchId:e}){const n=At(),i=(y,g)=>n.getMatch(y.id)?._nonReactive[g]??y._nonReactive[g],s=n.stores.matchStores.get(e);s||an();const l=ht(s,y=>y),d=l.routeId,u=n.routesById[d],f=A.useMemo(()=>{const y=(n.routesById[d].options.remountDeps??n.options.defaultRemountDeps)?.({routeId:d,loaderDeps:l.loaderDeps,params:l._strictParams,search:l._strictSearch});return y?JSON.stringify(y):void 0},[d,l.loaderDeps,l._strictParams,l._strictSearch,n.options.defaultRemountDeps,n.routesById]),p=A.useMemo(()=>{const y=u.options.component??n.options.defaultComponent;return y?M.jsx(y,{},f):M.jsx($k,{})},[f,u.options.component,n.options.defaultComponent]);if(l._displayPending)throw i(l,"displayPendingPromise");if(l._forcePending)throw i(l,"minPendingPromise");if(l.status==="pending"){const y=u.options.pendingMinMs??n.options.defaultPendingMinMs;if(y){const g=n.getMatch(l.id);if(g&&!g._nonReactive.minPendingPromise){const v=ai();g._nonReactive.minPendingPromise=v,setTimeout(()=>{v.resolve(),g._nonReactive.minPendingPromise=void 0},y)}}throw i(l,"loadPromise")}if(l.status==="notFound")return Ot(l.error)||an(),Gk(n,u,l.error);if(l.status==="redirected")throw jt(l.error)||an(),i(l,"loadPromise");if(l.status==="error")throw l.error;return p}),$k=A.memo(function(){const e=At(),n=A.useContext(jd);let i,s=!1,l;{const p=n?e.stores.matchStores.get(n):void 0;[i,s]=ht(p,y=>[y?.routeId,y?.globalNotFound??!1]),l=ht(e.stores.matchesId,y=>y[y.findIndex(g=>
12g===n)+1])}const d=i?e.routesById[i]:void 0,u=e.options.defaultPendingComponent?M.jsx(e.options.defaultPendingComponent,{}):null;if(s)return d||an(),Gk(e,d,void 0);if(!l)return null;const f=M.jsx(Wk,{matchId:l});return i===ei?M.jsx(A.Suspense,{fallback:u,children:f}):f});function wO(){const t=At(),e=A.useRef({router:t,mounted:!1}),[n,i]=A.useState(!1),s=ht(t.stores.isLoading,g=>g),l=ht(t.stores.hasPending,g=>g),d=xf(s),u=s||n||l,f=xf(u),p=s||l,y=xf(p);return t.startTransition=g=>{i(!0),A.startTransition(()=>{g(),i(!1)})},A.useEffect(()=>{const g=t.history.subscribe(t.load),v=t.buildLocation({to:t.latestLocation.pathname,search:!0,params:!0,hash:!0,state:!0,_includeValidateSearch:!0});return vo(t.latestLocation.publicHref)!==vo(v.publicHref)&&t.commitLocation({...v,replace:!0}),()=>{g()}},[t,t.history]),Nr(()=>{if(typeof window<"u"&&t.ssr||e.current.router===t&&e.current.mounted)return;e.current={router:t,mounted:!0},(async()=>{try{await t.load()}catch(v){console.error(v)}})()},[t]),Nr(()=>{d&&!s&&t.emit({type:"onLoad",...ys(t.stores.location.get(),t.stores.resolvedLocation.get())})},[d,t,s]),Nr(()=>{y&&!p&&t.emit({type:"onBeforeRouteMount",...ys(t.stores.location.get(),t.stores.resolvedLocation.get())})},[p,y,t]),Nr(()=>{if(f&&!u){const g=ys(t.stores.location.get(),t.stores.resolvedLocation.get());t.emit({type:"onResolved",...g}),Nk(()=>{t.stores.status.set("idle"),t.stores.resolvedLocation.set(t.stores.location.get())}),g.hrefChanged&&OT(t)}},[u,f,t]),null}function xO(){const t=At(),e=t.routesById[ei].options.pendingComponent??t.options.defaultPendingComponent,n=e?M.jsx(e,{}):null,i=M.jsxs(typeof document<"u"&&t.ssr?cs:A.Suspense,{fallback:n,children:[M.jsx(wO,{}),M.jsx(kO,{})]});return t.options.InnerWrap?M.jsx(t.options.InnerWrap,{children:i}):i}function kO(){const t=At(),e=ht(t.stores.firstId,s=>s),n=ht(t.stores.loadedAt,s=>s),i=e?M.jsx(Wk,{matchId:e}):null;return M.jsx(jd.Provider,{value:e,children:t.options.disableGlobalCatchBoundary?i:M.jsx(Vp,{getResetKey:()=>n,errorComponent:Yp,onCatch:void 0,children:i})})}var SO=t=>({createMutableStore:Jv,createReadonlyStore:Jv,batch:Nk}),_O=t=>new CO(t),CO=class extends yT{constructor(t){super(t,SO)}};function AO({router:t,children:e,...n}){Object.keys(n).length>
120&&t.update({...t.options,...n,context:{...t.options.context,...n.context}});const i=M.jsx(Dk.Provider,{value:t,children:e});return t.options.Wrap?M.jsx(t.options.Wrap,{children:i}):i}function TO({router:t,...e}){return M.jsx(AO,{router:t,...e,children:M.jsx(xO,{})})}function RO(t){const e=At({warn:t?.router===void 0}),n=t?.router||e,i=A.useRef(void 0);return ht(n.stores.__store,s=>{if(t?.select){if(t.structuralSharing??n.options.defaultStructuralSharing){const l=po(i.current,t.select(s));return i.current=l,l}return t.select(s)}return s})}function Vk(t){const{attrs:e,children:n,nonce:i}=t;switch(t.tag){case"title":return M.jsx("title",{...e,suppressHydrationWarning:!0,children:n});case"meta":return M.jsx("meta",{...e,suppressHydrationWarning:!0});case"link":return M.jsx("link",{...e,precedence:e?.precedence??(e?.rel==="stylesheet"?"default":void 0),nonce:i,suppressHydrationWarning:!0});case"style":return t.inlineCss,M.jsx("style",{...e,dangerouslySetInnerHTML:{__html:n},nonce:i});case"script":return M.jsx(EO,{attrs:e,children:n});default:return null}}function EO({attrs:t,children:e}){At();const n=Kp(),i=typeof t?.type=="string"&&t.type!==""&&t.type!=="text/javascript"&&t.type!=="module";if(A.useEffect(()=>{if(!i){if(t?.src){const s=(()=>{try{const d=document.baseURI||window.location.href;return new URL(t.src,d).href}catch{return t.src}})();if(Array.from(document.querySelectorAll("script[src]")).find(d=>d.src===s))return;const l=document.createElement("script");for(const[d,u]of Object.entries(t))d!=="suppressHydrationWarning"&&u!==void 0&&u!==!1&&l.setAttribute(d,typeof u=="boolean"?"":String(u));return document.head.appendChild(l),()=>{l.parentNode&&l.parentNode.removeChild(l)}}if(typeof e=="string"){const s=typeof t?.type=="string"?t.type:"text/javascript",l=typeof t?.nonce=="string"?t.nonce:void 0;if(Array.from(document.querySelectorAll("script:not([src])")).find(u=>{if(!(u instanceof HTMLScriptElement))return!1;const f=u.getAttribute("type")??"text/javascript",p=u.getAttribute("nonce")??void 0;return u.textContent===e&&f===s&&p===l}))return;const d=document.createElement("script");if(d.textContent=e,t)for(const[u,f]of Object.entries(t))u!=="suppressHydrationWarning"&&f!==void 0&&f!==!1&&d.setAttribute(u,typeof f=="boolean"?"":String(f));return document.head.appendChild(d),()=>{d.parentNode&&d.parentNode.removeChild(d)}}}},[t,e,i]),i&&typeof e=="string")return M.jsx("script",{...t,suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:e}});if(!n){if(t?.src)return M.jsx("script",{...t,suppressHydrationWarning:!0});if(typeof e=="string")return M.jsx("script",{...t,dangerouslySetInnerHTML:{__html:e},suppressHydrationWarning:!0})}return null}var OO=t=>{const e=At(),n=e.options.ssr?.nonce,i=ht(e.stores.matches,p=>p.map(y=>y.meta).filter(Boolean),nn),s=A.useMemo(()=>{const p=[],y={};let g;for(let v=i.length-1;v>=0;v--){const w=i[v];for(let x=w.length-1;x>=0;x--){const k=w[x];if(k)if(k.title)g||(g={tag:"title",children:k.title});else if("script:ld+json"in k)try{const S=JSON.stringify(k["script:ld+json"]);p.push({tag:"script",attrs:{type:"application/ld+json"},children:OA(S)})}catch{}else{const S=k.name??k.property;if(S){if(y[S])continue;y[S]=!0}p.push({tag:"meta",attrs:{...k,nonce:n}})}}}return g&&p.push(g),n&&p.push({tag:"meta",attrs:{property:"csp-nonce",content:n}}),p.reverse(),p},[i,n]),l=ht(e.stores.matches,p=>{const y=p.map(w=>w.links).filter(Boolean).flat(1).map(w=>({tag:"link",attrs:{...w,nonce:n}})),g=e.ssr?.manifest,v=p.map(w=>g?.routes[w.routeId]?.assets??[]).filter(Boolean).flat(1).flatMap(w=>w.tag==="link"?RT(g,w)?[]:[{tag:"link",attrs:{...w.attrs,crossOrigin:Uv(t,"stylesheet")??w.attrs?.crossOrigin,suppressHydrationWarning:!0,nonce:n}}]:w.tag==="style"?[{tag:"style",attrs:{...w.attrs,nonce:n},children:w.children,...w.inlineCss?{inlineCss:!0}:{}}]:[]);return[...y,...v]},nn),d=ht(e.stores.matches,p=>{const y=[];return p.map(g=>e.looseRoutesById[g.routeId]).forEach(g=>e.ssr?.manifest?.routes[g.id]?.preloads?.filter(Boolean).forEach(v=>{const w=AT(v);y.push({tag:"link",attrs:{rel:"modulepreload",href:w.href,crossOrigin:Uv(t,"modulepreload")??w.crossOrigin,nonce:n}})})),y},nn),u=ht(e.stores.matches,p=>p.map(y=>
12y.styles).flat(1).filter(Boolean).map(({children:y,...g})=>({tag:"style",attrs:{...g,nonce:n},children:y})),nn),f=ht(e.stores.matches,p=>p.map(y=>y.headScripts).flat(1).filter(Boolean).map(({children:y,...g})=>({tag:"script",attrs:{...g,nonce:n},children:y})),nn);return IO([...s,...d,...l,...u,...f],p=>JSON.stringify(p))};function IO(t,e){const n=new Set;return t.filter(i=>{const s=e(i);return n.has(s)?!1:(n.add(s),!0)})}function MO(t){const e=OO(t.assetCrossOrigin),n=At().options.ssr?.nonce;return M.jsx(M.Fragment,{children:e.map(i=>A.createElement(Vk,{...i,key:`tsr-meta-${JSON.stringify(i)}`,nonce:n}))})}var PO=()=>{const t=At(),e=t.options.ssr?.nonce,n=l=>{const d=[],u=t.ssr?.manifest;return u?(l.map(f=>t.looseRoutesById[f.routeId]).forEach(f=>u.routes[f.id]?.assets?.filter(p=>p.tag==="script").forEach(p=>{d.push({tag:"script",attrs:{...p.attrs,nonce:e},children:p.children})})),d):[]},i=l=>l.map(d=>d.scripts).flat(1).filter(Boolean).map(({children:d,...u})=>({tag:"script",attrs:{...u,suppressHydrationWarning:!0,nonce:e},children:d})),s=ht(t.stores.matches,n,nn);return DO(t,ht(t.stores.matches,i,nn),s)};function DO(t,e,n){let i;t.serverSsr&&(i=t.serverSsr.takeBufferedScripts());const s=[...e,...n];return i&&s.unshift(i),M.jsx(M.Fragment,{children:s.map((l,d)=>A.createElement(Vk,{...l,key:`tsr-scripts-${l.tag}-${d}`}))})}function LO(t){const e=At();return A.useCallback(async(...n)=>{try{const i=await t(...n);if(jt(i))throw i;return i}catch(i){if(jt(i))return i.options._fromLocation=e.stores.location.get(),e.navigate(e.resolveRedirect(i).options);throw i}},[e,t])}function iw(t){return t!=="__proto__"&&t!=="constructor"&&t!=="prototype"}function lp(t,e){const n=Object.create(null);if(t)for(const i of Object.keys(t))iw(i)&&(n[i]=t[i]);if(e&&typeof e=="object")for(const i of Object.keys(e))iw(i)&&(n[i]=e[i]);return n}function Yk(t){return Object.create(null)}var Kk=()=>{throw new Error("createServerOnlyFn() functions can only be called on the server!")},wt=(t,e)=>{const n=e||t||{};return typeof n.method>"u"&&(n.method="GET"),Object.assign(l=>wt(void 0,{...n,...l}),{options:n,middleware:l=>{const d=[...n.middleware||[]];l.map(f=>{yv in f?f.options.middleware&&d.push(...f.options.middleware):d.push(f)});const u=wt(void 0,{...n,middleware:d});return u[yv]=!0,u},inputValidator:l=>wt(void 0,{...n,inputValidator:l}),handler:(...l)=>{const[d,u]=l,f={...n,extractedFn:d,serverFn:u},p=[...f.middleware||[],jO(f)];return d.method=n.method,Object.assign(async y=>{const g=await sw(p,"client",{...d,...f,data:y?.data,headers:y?.headers,signal:y?.signal,fetch:y?.fetch,context:Yk()}),v=Wx(g.error);if(v)throw v;if(g.error)throw g.error;return g.result},{...d,method:n.method,__executeServer:async y=>{const g=Kk(),v=g.contextAfterGlobalMiddlewares;return await sw(p,"server",{...d,...y,serverFnMeta:d.serverFnMeta,context:lp(y.context,v),request:g.request}).then(w=>({result:w.result,error:w.error,context:w.sendContext}))}})}})};async function sw(t,e,n){let i=NO([...Pp()?.functionMiddleware||[],...t]);if(e==="server"){const l=Kk();l?.executedRequestMiddlewares&&(i=i.filter(d=>!l.executedRequestMiddlewares.has(d)))}const s=async l=>{const d=i.shift();if(!d)return l;try{"inputValidator"in d.options&&d.options.inputValidator&&e==="server"&&(l.data=await UO(d.options.inputValidator,l.data));let u;if(e==="client"?"client"in d.options&&(u=d.options.client):"server"in d.options&&(u=d.options.server),u){const p=await u({...l,next:async(y={})=>{const g=await s({...l,...y,context:lp(l.context,y.context),sendContext:lp(l.sendContext,y.sendContext),headers:RE(l.headers,y.headers),_callSiteFetch:l._callSiteFetch,fetch:l._callSiteFetch??y.fetch??l.fetch,result:y.result!==void 0?y.result:y instanceof Response?y:l.result,error:y.error??l.error});if(g.error)throw g.error;return g}});if(jt(p))return{...l,error:p};if(p instanceof Response)return{...l,result:p};if(!p)throw new Error("User middleware returned undefined. You must call next() or return a result in your middlewares.");return p}return s(l)}catch(u){return{...l,error:u}}};return s({...n,headers:n.headers||{},sendContext:n.sendContext||{},context:n.context||Yk(),_callSiteFetch:n.fetch})}function NO(t,e=100){const n=new Set,i=[],s=(l,d)=>{if(d>e)throw new Error(`Middleware nesting depth exceeded maximum of ${e}. Check for circular references.`);l.forEach(u=>{u.options.middleware&&s(u.options.middleware,d+1),n.has(u)||(n.add(u),i.push(u))})};return s(t,0),i}async function UO(t,e){if(t==null)return{};if("~standard"in t){const n=await t["~standard"].validate(e);if(n.issues)throw new Error(JSON.stringify(n.issues,void 0,2));return n.value}if("parse"in t)return t.parse(e);if(typeof t=="function")return t(e);throw new Error("Invalid validator type!")}function jO(t){return{"~types":void 0,options:{inputValidator:t.inputValidator,client:async({next:e,sendContext:n,fetch:i,...s})=>{const l={...s,context:n,fetch:i};return e(await t.extractedFn?.(l))},server:async({next:e,...n})=>{const i=await t.serverFn?.(n);return e({...n,result:i})}}}}var yo=(t,e)=>{const n={type:"request",...e||t};return{options:n,middleware:i=>yo({},Object.assign(n,{middleware:i})),inputValidator:i=>yo({},Object.assign(n,{inputValidator:i})),client:i=>yo({},Object.assign(n,{client:i})),server:i=>yo({},Object.assign(n,{server:i}))}};function Zk(t,e){for(let n=0,i=e.length;n<i;n++){const s=e[n];t.has(s)||(t.add(s),s.extends&&Zk(t,s.extends))}}var FO=t=>({getOptions:async()=>{const e=await t();if(e.serializationAdapters){const n=new Set;Zk(n,e.serializationAdapters),e.serializationAdapters=Array.from(n)}return e},createMiddleware:yo}),Yn=function(){return Yn=Object.assign||function(e){for(var n,i=1,s=arguments.length;i<s;i++){n=arguments[i];for(var l in n)Object.prototype.hasOwnProperty.call(n,l)&&(e[l]=n[l])}return e},Yn.apply(this,arguments)};function Es(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,i=Object.getOwnPropertySymbols(t);s<i.length;s++)e.indexOf(i[s])<0&&Object.prototype.propertyIsEnumerable.call(t,i[s])&&(n[i[s]]=t[i[s]]);return n}function qO(t,e,n,i){function s(l){return l instanceof n?l:new n(function(d){d(l)})}
12return new(n||(n=Promise))(function(l,d){function u(y){try{p(i.next(y))}catch(g){d(g)}}function f(y){try{p(i.throw(y))}catch(g){d(g)}}function p(y){y.done?l(y.value):s(y.value).then(u,f)}p((i=i.apply(t,e||[])).next())})}function BO(t,e,n){if(n||arguments.length===2)for(var i=0,s=e.length,l;i<s;i++)(l||!(i in e))&&(l||(l=Array.prototype.slice.call(e,0,i)),l[i]=e[i]);return t.concat(l||Array.prototype.slice.call(e))}const zO=t=>t?(...e)=>t(...e):(...e)=>fetch(...e);class Xp extends Error{constructor(e,n="FunctionsError",i){super(e),this.name=n,this.context=i}toJSON(){return{name:this.name,message:this.message,context:this.context}}}class HO extends Xp{constructor(e){super("Failed to send a request to the Edge Function","FunctionsFetchError",e)}}class rw extends Xp{constructor(e){super("Relay Error invoking the Edge Function","FunctionsRelayError",e)}}class lw extends Xp{constructor(e){super("Edge Function returned a non-2xx status code","FunctionsHttpError",e)}}var cp;(function(t){t.Any="any",t.ApNortheast1="ap-northeast-1",t.ApNortheast2="ap-northeast-2",t.ApSouth1="ap-south-1",t.ApSoutheast1="ap-southeast-1",t.ApSoutheast2="ap-southeast-2",t.CaCentral1="ca-central-1",t.EuCentral1="eu-central-1",t.EuWest1="eu-west-1",t.EuWest2="eu-west-2",t.EuWest3="eu-west-3",t.SaEast1="sa-east-1",t.UsEast1="us-east-1",t.UsWest1="us-west-1",t.UsWest2="us-west-2"})(cp||(cp={}));class GO{constructor(e,{headers:n={},customFetch:i,region:s=cp.Any}={}){this.url=e,this.headers=n,this.region=s,this.fetch=zO(i)}setAuth(e){this.headers.Authorization=`Bearer ${e}`}invoke(e){return qO(this,arguments,void 0,function*(n,i={}){var s;let l,d;try{const{headers:u,method:f,body:p,signal:y,timeout:g}=i;let v={},{region:w}=i;w||(w=this.region);const x=new URL(`${this.url}/${n}`);w&&w!=="any"&&(v["x-region"]=w,x.searchParams.set("forceFunctionRegion",w));let k;p&&(u&&!Object.prototype.hasOwnProperty.call(u,"Content-Type")||!u)?typeof Blob<"u"&&p instanceof Blob||p instanceof ArrayBuffer?(v["Content-Type"]="application/octet-stream",k=p):typeof p=="string"?(v["Content-Type"]="text/plain",k=p):typeof FormData<"u"&&p instanceof FormData?k=p:(v["Content-Type"]="application/json",k=JSON.stringify(p)):p&&typeof p!="string"&&!(typeof Blob<"u"&&p instanceof Blob)&&!(p instanceof ArrayBuffer)&&!(typeof FormData<"u"&&p instanceof FormData)?k=JSON.stringify(p):k=p;let S=y;g&&(d=new AbortController,l=setTimeout(()=>d.abort(),g),y?(S=d.signal,y.addEventListener("abort",()=>d.abort())):S=d.signal);const C=yield this.fetch(x.toString(),{method:f||"POST",headers:Object.assign(Object.assign(Object.assign({},v),this.headers),u),body:k,signal:S}).catch(G=>{throw new HO(G)}),E=C.headers.get("x-relay-error");if(E&&E==="true")throw new rw(C);if(!C.ok)throw new lw(C);let R=((s=C.headers.get("Content-Type"))!==null&&s!==void 0?s:"text/plain").split(";")[0].trim(),D;return R==="application/json"?D=yield C.json():R==="application/octet-stream"||R==="application/pdf"?D=yield C.blob():R==="text/event-stream"?D=C:R==="multipart/form-data"?D=yield C.formData():D=yield C.text(),{data:D,error:null,response:C}}catch(u){return{data:null,error:u,response:u instanceof lw||u instanceof rw?u.context:void 0}}finally{l&&clearTimeout(l)}})}}const Qk=3,cw=t=>Math.min(1e3*2**t,3e4),WO=[520,503],Xk=["GET","HEAD","OPTIONS"];var dw=class extends Error{constructor(t){super(t.message),this.name="PostgrestError",this.details=t.details,this.hint=t.hint,this.co
12de=t.code}toJSON(){return{name:this.name,message:this.message,details:this.details,hint:this.hint,code:this.code}}};function uw(t,e){return new Promise(n=>{if(e?.aborted){n();return}const i=setTimeout(()=>{e?.removeEventListener("abort",s),n()},t);function s(){clearTimeout(i),n()}e?.addEventListener("abort",s)})}function $O(t,e,n,i){return!(!i||n>=Qk||!Xk.includes(t)||!WO.includes(e))}var VO=class{constructor(t){var e,n,i,s,l;this.shouldThrowOnError=!1,this.retryEnabled=!0,this.method=t.method,this.url=t.url,this.headers=new Headers(t.headers),this.schema=t.schema,this.body=t.body,this.shouldThrowOnError=(e=t.shouldThrowOnError)!==null&&e!==void 0?e:!1,this.signal=t.signal,this.isMaybeSingle=(n=t.isMaybeSingle)!==null&&n!==void 0?n:!1,this.shouldStripNulls=(i=t.shouldStripNulls)!==null&&i!==void 0?i:!1,this.urlLengthLimit=(s=t.urlLengthLimit)!==null&&s!==void 0?s:8e3,this.retryEnabled=(l=t.retry)!==null&&l!==void 0?l:!0,t.fetch?this.fetch=t.fetch:this.fetch=fetch}throwOnError(){return this.shouldThrowOnError=!0,this}stripNulls(){if(this.headers.get("Accept")==="text/csv")throw new Error("stripNulls() cannot be used with csv()");return this.shouldStripNulls=!0,this}setHeader(t,e){return this.headers=new Headers(this.headers),this.headers.set(t,e),this}retry(t){return this.retryEnabled=t,this}then(t,e){var n=this;if(this.schema===void 0||(["GET","HEAD"].includes(this.method)?this.headers.set("Accept-Profile",this.schema):this.headers.set("Content-Profile",this.schema)),this.method!=="GET"&&this.method!=="HEAD"&&this.headers.set("Content-Type","application/json"),this.shouldStripNulls){const d=this.headers.get("Accept");d==="application/vnd.pgrst.object+json"?this.headers.set("Accept","application/vnd.pgrst.object+json;nulls=stripped"):(!d||d==="application/json")&&this.headers.set("Accept","application/vnd.pgrst.array+json;nulls=stripped")}const i=this.fetch;let l=(async()=>{let d=0;for(;;){const p=new Headers(n.headers);d>0&&p.set("X-Retry-Count",String(d));let y;try{y=await i(n.url.toString(),{method:n.method,headers:p,body:JSON.stringify(n.body,(g,v)=>typeof v=="bigint"?v.toString():v),signal:n.signal})}catch(g){if(g?.name==="AbortError"||g?.code==="ABORT_ERR"||!Xk.includes(n.method))throw g;if(n.retryEnabled&&d<Qk){const v=cw(d);d++,await uw(v,n.signal);continue}throw g}if($O(n.method,y.status,d,n.retryEnabled)){var u,f;const g=(u=(f=y.headers)===null||f===void 0?void 0:f.get("Retry-After"))!==null&&u!==void 0?u:null,v=g!==null?Math.max(0,parseInt(g,10)||0)*1e3:cw(d);await y.text(),d++,await uw(v,n.signal);continue}return await n.processResponse(y)}})();return this.shouldThrowOnError||(l=l.catch(d=>{var u;let f="",p="",y="";const g=d?.cause;if(g){var v,w,x,k;const E=(v=g?.message)!==null&&v!==void 0?v:"",R=(w=g?.code)!==null&&w!==void 0?w:"";f=`${(x=d?.name)!==null&&x!==void 0?x:"FetchError"}: ${d?.message}`,f+=` 13 14Caused by: ${(k=g?.name)!==null&&k!==void 0?k:"Error"}: ${E}`,R&&(f+=` (${R})`),g?.stack&&(f+=` 15${g.stack}`)}else{var S;f=(S=d?.stack)!==null&&S!==void 0?S:""}const C=this.url.toString().length;return d?.name==="AbortError"||d?.code==="ABORT_ERR"?(y="",p="Request was aborted (timeout or manual cancellation)",C>this.urlLengthLimit&&(p+=`. Note: Your request URL is ${C} characters, which may exceed server limits. If selecting many fields, consider using views. If filtering with large arrays (e.g., .in('id', [many IDs])), consider using an RPC function to pass values server-side.`)):(g?.name==="HeadersOverflowError"||g?.code==="UND_ERR_HEADERS_OVERFLOW")&&(y="",p="HTTP headers exceeded server limits (typically 16KB)",C>this.urlLengthLimit&&(p+=`. Your request URL is ${C} characters. If selecting many fields, consider using views. If filtering with large arrays (e.g., .in('id', [200+ IDs])), consider using an RPC function instead.`)),{success:!1,error:{message:`${(u=d?.name)!==null&&u!==void 0?u:"FetchError"}: ${d?.message}`,details:f,hint:p,code:y},data:null,count:null,status:0,statusText:""}})),l.then(t,e)}async processResponse(t){var e=this;let n=null,i=null,s=null,l=t.status,d=t.statusText;if(t.ok){var u,f;if(e.method!=="HEAD"){var p;const v=await t.text();if(v!=="")if(e.headers.get("Accept")==="text/csv")i=v;else if(e.headers.get("Accept")&&(!((p=e.headers.get("Accept"))===null||p===void 0)&&p.includes("application/vnd.pgrst.plan+text")))i=v;else try{i=JSON.parse(v)}catch{if(n={message:v},i=null,e.shouldThrowOnError)throw new dw({message:v,details:"",hint:"",code:""})}}const y=(u=e.headers.get("Prefer"))===null||u===void 0?void 0:u.match(/count=(exact|planned|estimated)/),g=(f=t.headers.get("content-range"))===null||f===void 0?void 0:f.split("/");y&&g&&g.length>
151&&(s=parseInt(g[1])),e.isMaybeSingle&&Array.isArray(i)&&(i.length>1?(n={code:"PGRST116",details:`Results contain ${i.length} rows, application/vnd.pgrst.object+json requires 1 row`,hint:null,message:"JSON object requested, multiple (or no) rows returned"},i=null,s=null,l=406,d="Not Acceptable"):i.length===1?i=i[0]:i=null)}else{const y=await t.text();try{n=JSON.parse(y),Array.isArray(n)&&t.status===404&&(i=[],n=null,l=200,d="OK")}catch{t.status===404&&y===""?(l=204,d="No Content"):n={message:y}}if(n&&e.shouldThrowOnError)throw new dw(n)}return{success:n===null,error:n,data:i,count:s,status:l,statusText:d}}returns(){return this}overrideTypes(){return this}},YO=class extends VO{select(t){let e=!1;const n=(t??"*").split("").map(i=>/\s/.test(i)&&!e?"":(i==='"'&&(e=!e),i)).join("");return this.url.searchParams.set("select",n),this.headers.append("Prefer","return=representation"),this}order(t,{ascending:e=!0,nullsFirst:n,foreignTable:i,referencedTable:s=i}={}){const l=s?`${s}.order`:"order",d=this.url.searchParams.get(l);return this.url.searchParams.set(l,`${d?`${d},`:""}${t}.${e?"asc":"desc"}${n===void 0?"":n?".nullsfirst":".nullslast"}`),this}limit(t,{foreignTable:e,referencedTable:n=e}={}){const i=typeof n>"u"?"limit":`${n}.limit`;return this.url.searchParams.set(i,`${t}`),this}range(t,e,{foreignTable:n,referencedTable:i=n}={}){const s=typeof i>"u"?"offset":`${i}.offset`,l=typeof i>"u"?"limit":`${i}.limit`;return this.url.searchParams.set(s,`${t}`),this.url.searchParams.set(l,`${e-t+1}`),this}abortSignal(t){return this.signal=t,this}single(){return this.headers.set("Accept","application/vnd.pgrst.object+json"),this}maybeSingle(){return this.isMaybeSingle=!0,this}csv(){return this.headers.set("Accept","text/csv"),this}geojson(){return this.headers.set("Accept","application/geo+json"),this}explain({analyze:t=!1,verbose:e=!1,settings:n=!1,buffers:i=!1,wal:s=!1,format:l="text"}={}){var d;
15const u=[t?"analyze":null,e?"verbose":null,n?"settings":null,i?"buffers":null,s?"wal":null].filter(Boolean).join("|"),f=(d=this.headers.get("Accept"))!==null&&d!==void 0?d:"application/json";return this.headers.set("Accept",`application/vnd.pgrst.plan+${l}; for="${f}"; options=${u};`),l==="json"?this:this}rollback(){return this.headers.append("Prefer","tx=rollback"),this}returns(){return this}maxAffected(t){return this.headers.append("Prefer","handling=strict"),this.headers.append("Prefer",`max-affected=${t}`),this}};const hw=new RegExp("[,()]");var ds=class extends YO{eq(t,e){return this.url.searchParams.append(t,`eq.${e}`),this}neq(t,e){return this.url.searchParams.append(t,`neq.${e}`),this}gt(t,e){return this.url.searchParams.append(t,`gt.${e}`),this}gte(t,e){return this.url.searchParams.append(t,`gte.${e}`),this}lt(t,e){return this.url.searchParams.append(t,`lt.${e}`),this}lte(t,e){return this.url.searchParams.append(t,`lte.${e}`),this}like(t,e){return this.url.searchParams.append(t,`like.${e}`),this}likeAllOf(t,e){return this.url.searchParams.append(t,`like(all).{${e.join(",")}}`),this}likeAnyOf(t,e){return this.url.searchParams.append(t,`like(any).{${e.join(",")}}`),this}ilike(t,e){return this.url.searchParams.append(t,`ilike.${e}`),this}ilikeAllOf(t,e){return this.url.searchParams.append(t,`ilike(all).{${e.join(",")}}`),this}ilikeAnyOf(t,e){return this.url.searchParams.append(t,`ilike(any).{${e.join(",")}}`),this}regexMatch(t,e){return this.url.searchParams.append(t,`match.${e}`),this}regexIMatch(t,e){return this.url.searchParams.append(t,`imatch.${e}`),this}is(t,e){return this.url.searchParams.append(t,`is.${e}`),this}isDistinct(t,e){return this.url.searchParams.append(t,`isdistinct.${e}`),this}in(t,e){const n=Array.from(new Set(e)).map(i=>typeof i=="string"&&hw.test(i)?`"${i}"`:`${i}`).join(",");return this.url.searchParams.append(t,`in.(${n})`),this}notIn(t,e){const n=Array.from(new Set(e)).map(i=>typeof i=="string"&&hw.test(i)?`"${i}"`:`${i}`).join(",");return this.url.searchParams.append(t,`not.in.(${n})`),this}contains(t,e){return typeof e=="string"?this.url.searchParams.append(t,`cs.${e}`):Array.isArray(e)?this.url.searchParams.append(t,`cs.{${e.join(",")}}`):this.url.searchParams.append(t,`cs.${JSON.stringify(e)}`),this}containedBy(t,e){return typeof e=="string"?this.url.searchParams.append(t,`cd.${e}`):Array.isArray(e)?this.url.searchParams.append(t,`cd.{${e.join(",")}}`):this.url.searchParams.append(t,`cd.${JSON.stringify(e)}`),this}rangeGt(t,e){return this.url.searchParams.append(t,`sr.${e}`),this}rangeGte(t,e){return this.url.searchParams.append(t,`nxl.${e}`),this}rangeLt(t,e){return this.url.searchParams.append(t,`sl.${e}`),this}rangeLte(t,e){return this.url.searchParams.append(t,`nxr.${e}`),this}rangeAdjacent(t,e){return this.url.searchParams.append(t,`adj.${e}`),this}overlaps(t,e){return typeof e=="string"?this.url.searchParams.append(t,`ov.${e}`):this.url.searchParams.append(t,`ov.{${e.join(",")}}`),this}textSearch(t,e,{config:n,type:i}={}){let s="";i==="plain"?s="pl":i==="phrase"?s="ph":i==="websearch"&&(s="w");const l=n===void 0?"":`(${n})`;return this.url.searchParams.append(t,`${s}fts${l}.${e}`),this}match(t){return Object.entries(t).filter(([e,n])=>n!==void 0).forEach(([e,n])=>{this.url.searchParams.append(e,`eq.${n}`)}),this}not(t,e,n){return this.url.searchParams.append(t,`not.${e}.${n}`),this}or(t,{foreignTable:e,referencedTable:n=e}={}){const i=n?`${n}.or`:"or";return this.url.searchParams.append(i,`(${t})`),this}filter(t,e,n){return this.url.searchParams.append(t,`${e}.${n}`),this}},KO=class{constructor(t,{headers:e={},schema:n,fetch:i,urlLengthLimit:s=8e3,retry:l}){this.url=t,this.headers=new Headers(e),this.schema=n,this.fetch=i,this.urlLengthLimit=s,this.retry=l}cloneRequestState(){return{url:new URL(this.url.toString()),headers:new Headers(this.headers)}}select(t,e){const{head:n=!1,count:i}=e??{},s=n?"HEAD":"GET";let l=!1;const d=(t??"*").split("").map(p=>/\s/.test(p)&&!l?"":(p==='"'&&(l=!l),p)).join(""),{url:u,headers:f}=this.cloneRequestState();return u.searchParams.set("select",d),i&&f.append("Prefer",`count=${i}
15`),new ds({method:s,url:u,headers:f,schema:this.schema,fetch:this.fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}insert(t,{count:e,defaultToNull:n=!0}={}){var i;const s="POST",{url:l,headers:d}=this.cloneRequestState();if(e&&d.append("Prefer",`count=${e}`),n||d.append("Prefer","missing=default"),Array.isArray(t)){const u=t.reduce((f,p)=>f.concat(Object.keys(p)),[]);if(u.length>0){const f=[...new Set(u)].map(p=>`"${p}"`);l.searchParams.set("columns",f.join(","))}}return new ds({method:s,url:l,headers:d,schema:this.schema,body:t,fetch:(i=this.fetch)!==null&&i!==void 0?i:fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}upsert(t,{onConflict:e,ignoreDuplicates:n=!1,count:i,defaultToNull:s=!0}={}){var l;const d="POST",{url:u,headers:f}=this.cloneRequestState();if(f.append("Prefer",`resolution=${n?"ignore":"merge"}-duplicates`),e!==void 0&&u.searchParams.set("on_conflict",e),i&&f.append("Prefer",`count=${i}`),s||f.append("Prefer","missing=default"),Array.isArray(t)){const p=t.reduce((y,g)=>y.concat(Object.keys(g)),[]);if(p.length>0){const y=[...new Set(p)].map(g=>`"${g}"`);u.searchParams.set("columns",y.join(","))}}return new ds({method:d,url:u,headers:f,schema:this.schema,body:t,fetch:(l=this.fetch)!==null&&l!==void 0?l:fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}update(t,{count:e}={}){var n;const i="PATCH",{url:s,headers:l}=this.cloneRequestState();return e&&l.append("Prefer",`count=${e}`),new ds({method:i,url:s,headers:l,schema:this.schema,body:t,fetch:(n=this.fetch)!==null&&n!==void 0?n:fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}delete({count:t}={}){var e;const n="DELETE",{url:i,headers:s}=this.cloneRequestState();return t&&s.append("Prefer",`count=${t}`),new ds({method:n,url:i,headers:s,schema:this.schema,fetch:(e=this.fetch)!==null&&e!==void 0?e:fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}};function Zr(t){"@babel/helpers - typeof";return Zr=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},Zr(t)}function ZO(t,e){if(Zr(t)!="object"||!t)return t;var n=t[Symbol.toPrimitive];if(n!==void 0){var i=n.call(t,e);if(Zr(i)!="object")return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(t)}function QO(t){var e=ZO(t,"string");return Zr(e)=="symbol"?e:e+""}function XO(t,e,n){return(e=QO(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function fw(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(s){return Object.getOwnPropertyDescriptor(t,s).enumerable})),n.push.apply(n,i)}return n}function Lc(t){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?fw(Object(n),!0).forEach(function(i){XO(t,i,n[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):fw(Object(n)).forEach(function(i){Object.defineProperty(t,i,Object.getOwnPropertyDescriptor(n,i))})}return t}var JO=class Jk{constructor(e,{headers:n={},schema:i,fetch:s,timeout:l,urlLengthLimit:d=8e3,retry:u}={}){this.url=e,this.headers=new Headers(n),this.schemaName=i,this.urlLengthLimit=d;const f=s??globalThis.fetch;l!==void 0&&l>0?this.fetch=(p,y)=>{const g=new AbortController,v=setTimeout(()=>g.abort(),l),w=y?.signal;if(w){if(w.aborted)return clearTimeout(v),f(p,y);const x=()=>{clearTimeout(v),g.abort()};return w.addEventListener("abort",x,{once:!0}),f(p,Lc(Lc({},y),{},{signal:g.signal})).finally(()=>{clearTimeout(v),w.removeEventListener("abort",x)})}return f(p,Lc(Lc({},y),{},{signal:g.signal})).finally(()=>clearTimeout(v))}:this.fetch=f,this.retry=u}from(e){if(!e||typeof e!="string"||e.trim()==="")throw new Error("Invalid relation name: relation must be a non-empty string.");return new KO(new URL(`${this.url}/${e}`),{headers:new Headers(this.headers),schema:this.schemaName,fetch:this.fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}schema(e){return new Jk(this.url,{headers:this.headers,schema:e,fetch:this.fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}rpc(e,n={},{head:i=!1,get:s=!1,count:l}={}){var d;let u;const f=new URL(`${this.url}/rpc/${e}`);let p;const y=w=>w!==null&&typeof w=="object"&&(!Array.isArray(w)||w.some(y)),g=i&&Object.values(n).some(y);g?(u="POST",p=n):i||s?(u=i?"HEAD":"GET",Object.entries(n).filter(([w,x])=>x!==void 0).map(([w,x])=>[w,Array.isArray(x)?`{${x.join(",")}}`:`${x}
15`]).forEach(([w,x])=>{f.searchParams.append(w,x)})):(u="POST",p=n);const v=new Headers(this.headers);return g?v.set("Prefer",l?`count=${l},return=minimal`:"return=minimal"):l&&v.set("Prefer",`count=${l}`),new ds({method:u,url:f,headers:v,schema:this.schemaName,body:p,fetch:(d=this.fetch)!==null&&d!==void 0?d:fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}};class eI{constructor(){}static detectEnvironment(){var e;if(typeof WebSocket<"u")return{type:"native",wsConstructor:WebSocket};const n=globalThis;if(typeof globalThis<"u"&&typeof n.WebSocket<"u")return{type:"native",wsConstructor:n.WebSocket};const i=typeof global<"u"?global:void 0;if(i&&typeof i.WebSocket<"u")return{type:"native",wsConstructor:i.WebSocket};if(typeof globalThis<"u"&&typeof n.WebSocketPair<"u"&&typeof globalThis.WebSocket>"u")return{type:"cloudflare",error:"Cloudflare Workers detected. WebSocket clients are not supported in Cloudflare Workers.",workaround:"Use Cloudflare Workers WebSocket API for server-side WebSocket handling, or deploy to a different runtime."};if(typeof globalThis<"u"&&n.EdgeRuntime||typeof navigator<"u"&&(!((e=navigator.userAgent)===null||e===void 0)&&e.includes("Vercel-Edge")))return{type:"unsupported",error:"Edge runtime detected (Vercel Edge/Netlify Edge). WebSockets are not supported in edge functions.",workaround:"Use serverless functions or a different deployment target for WebSocket functionality."};const s=globalThis.process;if(s){const l=s.versions;if(l&&l.node){const d=l.node,u=parseInt(d.replace(/^v/,"").split(".")[0]);return u>=22?typeof globalThis.WebSocket<"u"?{type:"native",wsConstructor:globalThis.WebSocket}:{type:"unsupported",error:`Node.js ${u} detected but native WebSocket not found.`,workaround:"Provide a WebSocket implementation via the transport option."}:{type:"unsupported",error:`Node.js ${u} detected without native WebSocket support.`,workaround:`For Node.js < 22, install "ws" package and provide it via the transport option: 16import ws from "ws" 17new RealtimeClient(url, { transport: ws })`}}}return{type:"unsupported",error:"Unknown JavaScript runtime without WebSocket support.",workaround:"Ensure you're running in a supported environment (browser, Node.js, Deno) or provide a custom WebSocket implementation."}}static getWebSocketConstructor(){const e=this.detectEnvironment();if(e.wsConstructor)return e.wsConstructor;let n=e.error||"WebSocket not supported in this environment.";throw e.workaround&&(n+=` 18 19Suggested solution: ${e.workaround}`),new Error(n)}static isWebSocketSupported(){try{const e=this.detectEnvironment();return e.type==="native"||e.type==="ws"}catch{return!1}}}const tI="2.107.0",nI=`realtime-js/${tI}`,aI="1.0.0",eS="2.0.0",oI=eS,iI=1e4,sI=100,uo={closed:"closed",errored:"errored",joined:"joined",joining:"joining",leaving:"leaving"},tS={close:"phx_close",error:"phx_error",join:"phx_join",leave:"phx_leave",access_token:"access_token"},dp={connecting:"connecting",closing:"closing",closed:"closed"};class rI{constructor(e){this.HEADER_LENGTH=1,this.USER_BROADCAST_PUSH_META_LENGTH=6,this.KINDS={userBroadcastPush:3,userBroadcast:4},this.BINARY_ENCODING=0,this.JSON_ENCODING=1,this.BROADCAST_EVENT="broadcast",this.allowedMetadataKeys=[],this.allowedMetadataKeys=e??[]}encode(e,n){if(e.event===this.BROADCAST_EVENT&&!(e.payload instanceof ArrayBuffer)&&typeof e.payload.event=="string")return n(this._binaryEncodeUserBroadcastPush(e));let i=[e.join_ref,e.ref,e.topic,e.event,e.payload];return n(JSON.stringify(i))}_binaryEncodeUserBroadcastPush(e){var n;return this._isArrayBuffer((n=e.payload)===null||n===void 0?void 0:n.payload)?this._encodeBinaryUserBroadcastPush(e):this._encodeJsonUserBroadcastPush(e)}_encodeBinaryUserBroadcastPush(e){var n,i;const s=(i=(n=e.payload)===null||n===void 0?void 0:n.payload)!==null&&i!==void 0?i:new ArrayBuffer(0);return this._encodeUserBroadcastPush(e,this.BINARY_ENCODING,s)}_encodeJsonUserBroadcastPush(e){var n,i;const s=(i=(n=e.payload)===null||n===void 0?void 0:n.payload)!==null&&i!==void 0?i:{},d=new TextEncoder().encode(JSON.stringify(s)).buffer;return this._encodeUserBroadcastPush(e,this.JSON_ENCODING,d)}_encodeUserBroadcastPush(e,n,i){var s,l;const d=e.topic,u=(s=e.ref)!==null&&s!==void 0?s:"",f=(l=e.join_ref)!==null&&l!==void 0?l:"",p=e.payload.event,y=this.allowedMetadataKeys?this._pick(e.payload,this.allowedMetadataKeys):{},g=Object.keys(y).length===0?"":JSON.stringify(y);if(f.length>255)throw new Error(`joinRef length ${f.length} exceeds maximum of 255`);if(u.length>255)throw new Error(`ref length ${u.length} exceeds maximum of 255`);if(d.length>255)throw new Error(`topic length ${d.length} exceeds maximum of 255`);if(p.length>255)throw new Error(`userEvent length ${p.length} exceeds maximum of 255`);if(g.length>255)throw new Error(`metadata length ${g.length} exceeds maximum of 255`);const v=this.USER_BROADCAST_PUSH_META_LENGTH+f.length+u.length+d.length+p.length+g.length,w=new ArrayBuffer(this.HEADER_LENGTH+v);let x=new DataView(w),k=0;x.setUint8(k++,this.KINDS.userBroadcastPush),x.setUint8(k++,f.length),x.setUint8(k++,u.length),x.setUint8(k++,d.length),x.setUint8(k++,p.length),x.setUint8(k++,g.length),x.setUint8(k++,n),Array.from(f,C=>
19x.setUint8(k++,C.charCodeAt(0))),Array.from(u,C=>x.setUint8(k++,C.charCodeAt(0))),Array.from(d,C=>x.setUint8(k++,C.charCodeAt(0))),Array.from(p,C=>x.setUint8(k++,C.charCodeAt(0))),Array.from(g,C=>x.setUint8(k++,C.charCodeAt(0)));var S=new Uint8Array(w.byteLength+i.byteLength);return S.set(new Uint8Array(w),0),S.set(new Uint8Array(i),w.byteLength),S.buffer}decode(e,n){if(this._isArrayBuffer(e)){let i=this._binaryDecode(e);return n(i)}if(typeof e=="string"){const i=JSON.parse(e),[s,l,d,u,f]=i;return n({join_ref:s,ref:l,topic:d,event:u,payload:f})}return n({})}_binaryDecode(e){const n=new DataView(e),i=n.getUint8(0),s=new TextDecoder;if(i===this.KINDS.userBroadcast)return this._decodeUserBroadcast(e,n,s)}_decodeUserBroadcast(e,n,i){const s=n.getUint8(1),l=n.getUint8(2),d=n.getUint8(3),u=n.getUint8(4);let f=this.HEADER_LENGTH+4;const p=i.decode(e.slice(f,f+s));f=f+s;const y=i.decode(e.slice(f,f+l));f=f+l;const g=i.decode(e.slice(f,f+d));f=f+d;const v=e.slice(f,e.byteLength),w=u===this.JSON_ENCODING?JSON.parse(i.decode(v)):v,x={type:this.BROADCAST_EVENT,event:y,payload:w};return d>0&&(x.meta=JSON.parse(g)),{join_ref:null,ref:null,topic:p,event:this.BROADCAST_EVENT,payload:x}}_isArrayBuffer(e){var n;return e instanceof ArrayBuffer||((n=e?.constructor)===null||n===void 0?void 0:n.name)==="ArrayBuffer"}_pick(e,n){return!e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).filter(([i])=>n.includes(i)))}}var Je;(function(t){t.abstime="abstime",t.bool="bool",t.date="date",t.daterange="daterange",t.float4="float4",t.float8="float8",t.int2="int2",t.int4="int4",t.int4range="int4range",t.int8="int8",t.int8range="int8range",t.json="json",t.jsonb="jsonb",t.money="money",t.numeric="numeric",t.oid="oid",t.reltime="reltime",t.text="text",t.time="time",t.timestamp="timestamp",t.timestamptz="timestamptz",t.timetz="timetz",t.tsrange="tsrange",t.tstzrange="tstzrange"})(Je||(Je={}));const pw=(t,e,n={})=>{var i;const s=(i=n.skipTypes)!==null&&i!==void 0?i:[];return e?Object.keys(e).reduce((l,d)=>(l[d]=lI(d,t,e,s),l),{}):{}},lI=(t,e,n,i)=>{const s=e.find(u=>u.name===t),l=s?.type,d=n[t];return l&&!i.includes(l)?nS(l,d):up(d)},nS=(t,e)=>{if(t.charAt(0)==="_"){const n=t.slice(1,t.length);return hI(e,n)}switch(t){case Je.bool:return cI(e);case Je.float4:case Je.float8:case Je.int2:case Je.int4:case Je.int8:case Je.numeric:case Je.oid:return dI(e);case Je.json:case Je.jsonb:return uI(e);case Je.timestamp:return fI(e);case Je.abstime:case Je.date:case Je.daterange:case Je.int4range:case Je.int8range:case Je.money:case Je.reltime:case Je.text:case Je.time:case Je.timestamptz:case Je.timetz:case Je.tsrange:case Je.tstzrange:return up(e);default:return up(e)}},up=t=>t,cI=t=>{switch(t){case"t":return!0;case"f":return!1;default:return t}},dI=t=>{if(typeof t=="string"){const e=parseFloat(t);if(!Number.isNaN(e))return e}return t},uI=t=>{if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t},hI=(t,e)=>{if(typeof t!="string")return t;const n=t.length-1,i=t[n];if(t[0]==="{"&&i==="}"){let l;const d=t.slice(1,n);try{l=JSON.parse("["+d+"]")}catch{l=d?d.split(","):[]}return l.map(u=>nS(e,u))}return t},fI=t=>typeof t=="string"?t.replace(" ","T"):t,aS=t=>{const e=new URL(t);return e.protocol=e.protocol.replace(/^ws/i,"http"),e.pathname=e.pathname.replace(/\/+$/,"").replace(/\/socket\/websocket$/i,"").replace(/\/socket$/i,"").replace(/\/websocket$/i,""),e.pathname===""||e.pathname==="/"?e.pathname="/api/broadcast":e.pathname=e.pathname+"/api/broadcast",e.href};var Br=t=>typeof t=="function"?t:function(){return t},pI=typeof self<"u"?self:null,us=typeof window<"u"?window:null,Wn=pI||us||globalThis,mI="2.0.0",gI=1e4,yI=1e3,Vn={connecting:0,open:1,closing:2,closed:3},tn={closed:"closed",errored:"errored",joined:"joined",joining:"joining",leaving:"leaving"},Sa={close:"phx_close",error:"phx_error",join:"phx_join",reply:"phx_reply",leave:"phx_leave"},hp={longpoll:"longpoll",websocket:"websocket"},bI={complete:4},fp="base64url.bearer.phx.",Nc=class{constructor(t,e,n,i){this.channel=t,this.event=e,this.payload=n||function(){return{}},this.receivedResp=null,this.timeout=i,this.timeoutTimer=null,this.recHo
vendor: 5,205 bytes, line 19
19oks=[],this.sent=!1,this.ref=void 0}resend(t){this.timeout=t,this.reset(),this.send()}send(){this.hasReceived("timeout")||(this.startTimeout(),this.sent=!0,this.channel.socket.push({topic:this.channel.topic,event:this.event,payload:this.payload(),ref:this.ref,join_ref:this.channel.joinRef()}))}receive(t,e){return this.hasReceived(t)&&e(this.receivedResp.response),this.recHooks.push({status:t,callback:e}),this}reset(){this.cancelRefEvent(),this.ref=null,this.refEvent=null,this.receivedResp=null,this.sent=!1}destroy(){this.cancelRefEvent(),this.cancelTimeout()}matchReceive({status:t,response:e,_ref:n}){this.recHooks.filter(i=>i.status===t).forEach(i=>i.callback(e))}cancelRefEvent(){this.refEvent&&this.channel.off(this.refEvent)}cancelTimeout(){clearTimeout(this.timeoutTimer),this.timeoutTimer=null}startTimeout(){this.timeoutTimer&&this.cancelTimeout(),this.ref=this.channel.socket.makeRef(),this.refEvent=this.channel.replyEventName(this.ref),this.channel.on(this.refEvent,t=>{this.cancelRefEvent(),this.cancelTimeout(),this.receivedResp=t,this.matchReceive(t)}),this.timeoutTimer=setTimeout(()=>{this.trigger("timeout",{})},this.timeout)}hasReceived(t){return this.receivedResp&&this.receivedResp.status===t}trigger(t,e){this.channel.trigger(this.refEvent,{status:t,response:e})}},oS=class{constructor(t,e){this.callback=t,this.timerCalc=e,this.timer=void 0,this.tries=0}reset(){this.tries=0,clearTimeout(this.timer)}scheduleTimeout(){clearTimeout(this.timer),this.timer=setTimeout(()=>{this.tries=this.tries+1,this.callback()},this.timerCalc(this.tries+1))}},vI=class{constructor(t,e,n){this.state=tn.closed,this.topic=t,this.params=Br(e||{}),this.socket=n,this.bindings=[],this.bindingRef=0,this.timeout=this.socket.timeout,this.joinedOnce=!1,this.joinPush=new Nc(this,Sa.join,this.params,this.timeout),this.pushBuffer=[],this.stateChangeRefs=[],this.rejoinTimer=new oS(()=>{this.socket.isConnected()&&this.rejoin()},this.socket.rejoinAfterMs),this.stateChangeRefs.push(this.socket.onError(()=>this.rejoinTimer.reset())),this.stateChangeRefs.push(this.socket.onOpen(()=>{this.rejoinTimer.reset(),this.isErrored()&&this.rejoin()})),this.joinPush.receive("ok",()=>{this.state=tn.joined,this.rejoinTimer.reset(),this.pushBuffer.forEach(i=>i.send()),this.pushBuffer=[]}),this.joinPush.receive("error",i=>{this.state=tn.errored,this.socket.hasLogger()&&this.socket.log("channel",`error ${this.topic}`,i),this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.onClose(()=>{this.rejoinTimer.reset(),this.socket.hasLogger()&&this.socket.log("channel",`close ${this.topic}`),this.state=tn.closed,this.socket.remove(this)}),this.onError(i=>{this.socket.hasLogger()&&this.socket.log("channel",`error ${this.topic}`,i),this.isJoining()&&this.joinPush.reset(),this.state=tn.errored,this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.joinPush.receive("timeout",()=>{this.socket.hasLogger()&&this.socket.log("channel",`timeout ${this.topic}`,this.joinPush.timeout),new Nc(this,Sa.leave,Br({}),this.timeout).send(),this.state=tn.errored,this.joinPush.reset(),this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.on(Sa.reply,(i,s)=>{this.trigger(this.replyEventName(s),i)})}join(t=this.timeout){if(this.joinedOnce)throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance");return this.timeout=t,this.joinedOnce=!0,this.rejoin(),this.joinPush}teardown(){this.pushBuffer.forEach(t=>t.destroy()),this.pushBuffer=[],this.rejoinTimer.reset(),this.joinPush.destroy(),this.state=tn.closed,this.bindings=[]}onClose(t){this.on(Sa.close,t)}onError(t){return this.on(Sa.error,e=>t(e))}on(t,e){let n=this.bindingRef++;return this.bindings.push({event:t,ref:n,callback:e}),n}off(t,e){this.bindings=this.bindings.filter(n=>!(n.event===t&&(typeof e>"u"||e===n.ref)))}canPush(){return this.socket.isConnected()&&this.isJoined()}push(t,e,n=this.timeout){if(e=e||{},!this.joinedOnce)throw new Error(`tried to push '${t}' to '${this.topic}' before joining. Use channel.join() before pushing events`);let i=new Nc(this,t,function(){return e},n);return this.canPush()?i.send():(i.startTimeout(),this.pushBuffer.push(i)),i}leave(t=this.timeout){this.rejoinTimer.reset(),this.joinPush.cancelTimeout(),this.state=tn.leaving;let e=()=>{this.socket.hasLogger()&&this.socket.log("channel",`leave ${this.topic}`),this.trigger(Sa.close,"leave")},n=new Nc(this,Sa.leave,Br({}),t);return n.receive("ok",()=>e()).receive("timeout",()=>e()),n.send(),this.canPush()||n.trigger("ok",{}),n}onMessage(t,e,n){return e}filterBindings(t,e,n){return!0}isMember(t,e,n,i){return this.topic!==t?!1:i&&i!==this.joinRef()?(this.socket.hasLogger()&&this.socket.log("channel","dropping outdated message",{topic:t,event:e,payload:n,joinRef:i}),!1):!0}joinRef(){return this.joinPush.ref}rejoin(t=this.timeout){this.isLeaving()||(this.socket.leaveOpenTopic(this.topic),this.state=tn.joining,this.joinPush.resend(t))}trigger(t,e,n,i){let s=this.onMessage(t,e,n,i);if(e&&!s)throw new Error("channel onMessage callbacks must return the payload, modified or unmodified");let l=this.bindings.filter(d=>d.event===t&&this.filterBindings(d,e,n));for(let d=0;d<l.length;
19d++)l[d].callback(s,n,i||this.joinRef())}replyEventName(t){return`chan_reply_${t}`}isClosed(){return this.state===tn.closed}isErrored(){return this.state===tn.errored}isJoined(){return this.state===tn.joined}isJoining(){return this.state===tn.joining}isLeaving(){return this.state===tn.leaving}},pd=class{static request(t,e,n,i,s,l,d){if(Wn.XDomainRequest){let u=new Wn.XDomainRequest;return this.xdomainRequest(u,t,e,i,s,l,d)}else if(Wn.XMLHttpRequest){let u=new Wn.XMLHttpRequest;return this.xhrRequest(u,t,e,n,i,s,l,d)}else{if(Wn.fetch&&Wn.AbortController)return this.fetchRequest(t,e,n,i,s,l,d);throw new Error("No suitable XMLHttpRequest implementation found")}}static fetchRequest(t,e,n,i,s,l,d){let u={method:t,headers:n,body:i},f=null;return s&&(f=new AbortController,setTimeout(()=>f.abort(),s),u.signal=f.signal),Wn.fetch(e,u).then(p=>p.text()).then(p=>this.parseJSON(p)).then(p=>d&&d(p)).catch(p=>{p.name==="AbortError"&&l?l():d&&d(null)}),f}static xdomainRequest(t,e,n,i,s,l,d){return t.timeout=s,t.open(e,n),t.onload=()=>{let u=this.parseJSON(t.responseText);d&&d(u)},l&&(t.ontimeout=l),t.onprogress=()=>{},t.send(i),t}static xhrRequest(t,e,n,i,s,l,d,u){t.open(e,n,!0),t.timeout=l;for(let[f,p]of Object.entries(i))t.setRequestHeader(f,p);return t.onerror=()=>u&&u(null),t.onreadystatechange=()=>{if(t.readyState===bI.complete&&u){let f=this.parseJSON(t.responseText);u(f)}},d&&(t.ontimeout=d),t.send(s),t}static parseJSON(t){if(!t||t==="")return null;try{return JSON.parse(t)}catch{return console&&console.log("failed to parse JSON response",t),null}}static serialize(t,e){let n=[];for(var i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;let s=e?`${e}[${i}]`:i,l=t[i];typeof l=="object"?n.push(this.serialize(l,s)):n.push(encodeURIComponent(s)+"="+encodeURIComponent(l))}return n.join("&")}static appendParams(t,e){if(Object.keys(e).length===0)return t;let n=t.match(/\?/)?"&":"?";return`${t}${n}${this.serialize(e)}`}},wI=t=>{let e="",n=new Uint8Array(t),i=n.byteLength;for(let s=0;s<i;s++)e+=String.fromCharCode(n[s]);return btoa(e)},ts=class{constructor(t,e){e&&e.length===2&&e[1].startsWith(fp)&&(this.authToken=atob(e[1].slice(fp.length))),this.endPoint=null,this.token=null,this.skipHeartbeat=!0,this.reqs=new Set,this.awaitingBatchAck=!1,this.currentBatch=null,this.currentBatchTimer=null,this.batchBuffer=[],this.onopen=function(){},this.onerror=function(){},this.onmessage=function(){},this.onclose=function(){},this.pollEndpoint=this.normalizeEndpoint(t),this.readyState=Vn.connecting,setTimeout(()=>this.poll(),0)}normalizeEndpoint(t){return t.replace("ws://","http://").replace("wss://","https://").replace(new RegExp("(.*)/"+hp.websocket),"$1/"+hp.longpoll)}endpointURL(){return pd.appendParams(this.pollEndpoint,{token:this.token})}closeAndRetry(t,e,n){this.close(t,e,n),this.readyState=Vn.connecting}ontimeout(){this.onerror("timeout"),this.closeAndRetry(1005,"timeout",!1)}isActive(){return this.readyState===Vn.open||this.readyState===Vn.connecting}poll(){const t={Accept:"application/json"};this.authToken&&(t["X-Phoenix-AuthToken"]=this.authToken),this.ajax("GET",t,null,()=>this.ontimeout(),e=>{if(e){var{status:n,token:i,messages:s}=e;if(n===410&&this.token!==null){this.onerror(410),this.closeAndRetry(3410,"session_gone",!1);return}this.token=i}else n=0;switch(n){case 200:s.forEach(l=>{setTimeout(()=>this.onmessage({data:l}),0)}),this.poll();break;case 204:this.poll();break;case 410:this.readyState=Vn.open,this.onopen({}),this.poll();break;
19case 403:this.onerror(403),this.close(1008,"forbidden",!1);break;case 0:case 500:this.onerror(500),this.closeAndRetry(1011,"internal server error",500);break;default:throw new Error(`unhandled poll status ${n}`)}})}send(t){typeof t!="string"&&(t=wI(t)),this.currentBatch?this.currentBatch.push(t):this.awaitingBatchAck?this.batchBuffer.push(t):(this.currentBatch=[t],this.currentBatchTimer=setTimeout(()=>{this.batchSend(this.currentBatch),this.currentBatch=null},0))}batchSend(t){this.awaitingBatchAck=!0,this.ajax("POST",{"Content-Type":"application/x-ndjson"},t.join(` 20`),()=>this.onerror("timeout"),e=>{this.awaitingBatchAck=!1,!e||e.status!==200?(this.onerror(e&&e.status),this.closeAndRetry(1011,"internal server error",!1)):this.batchBuffer.length>0&&(this.batchSend(this.batchBuffer),this.batchBuffer=[])})}close(t,e,n){for(let s of this.reqs)s.abort();this.readyState=Vn.closed;let i=Object.assign({code:1e3,reason:void 0,wasClean:!0},{code:t,reason:e,wasClean:n});this.batchBuffer=[],clearTimeout(this.currentBatchTimer),this.currentBatchTimer=null,typeof CloseEvent<"u"?this.onclose(new CloseEvent("close",i)):this.onclose(i)}ajax(t,e,n,i,s){let l,d=()=>{this.reqs.delete(l),i()};l=pd.request(t,this.endpointURL(),e,n,this.timeout,d,u=>{this.reqs.delete(l),this.isActive()&&s(u)}),this.reqs.add(l)}},xI=class Ur{constructor(e,n={}){let i=n.events||{state:"presence_state",diff:"presence_diff"};this.state={},this.pendingDiffs=[],this.channel=e,this.joinRef=null,this.caller={onJoin:function(){},onLeave:function(){},onSync:function(){}},this.channel.on(i.state,s=>{let{onJoin:l,onLeave:d,onSync:u}=this.caller;this.joinRef=this.channel.joinRef(),this.state=Ur.syncState(this.state,s,l,d),this.pendingDiffs.forEach(f=>{this.state=Ur.syncDiff(this.state,f,l,d)}),this.pendingDiffs=[],u()}),this.channel.on(i.diff,s=>{let{onJoin:l,onLeave:d,onSync:u}=this.caller;this.inPendingSyncState()?this.pendingDiffs.push(s):(this.state=Ur.syncDiff(this.state,s,l,d),u())})}onJoin(e){this.caller.onJoin=e}onLeave(e){this.caller.onLeave=e}onSync(e){this.caller.onSync=e}list(e){return Ur.list(this.state,e)}inPendingSyncState(){return!this.joinRef||this.joinRef!==this.channel.joinRef()}static syncState(e,n,i,s){let l=this.clone(e),d={},u={};return this.map(l,(f,p)=>{n[f]||(u[f]=p)}),this.map(n,(f,p)=>{let y=l[f];if(y){let g=p.metas.map(k=>k.phx_ref),v=y.metas.map(k=>k.phx_ref),w=p.metas.filter(k=>v.indexOf(k.phx_ref)<0),x=y.metas.filter(k=>g.indexOf(k.phx_ref)<0);w.length>0&&(d[f]=p,d[f].metas=w),x.length>0&&(u[f]=this.clone(y),u[f].metas=x)}else d[f]=p}),this.syncDiff(l,{joins:d,leaves:u},i,s)}static syncDiff(e,n,i,s){let{joins:l,leaves:d}=this.clone(n);return i||(i=function(){}),s||(s=function(){}),this.map(l,(u,f)=>{let p=e[u];if(e[u]=this.clone(f),p){let y=e[u].metas.map(v=>v.phx_ref),g=p.metas.filter(v=>y.indexOf(v.phx_ref)<0);e[u].metas.unshift(...g)}i(u,p,f)}),this.map(d,(u,f)=>{let p=e[u];if(!p)return;let y=f.metas.map(g=>g.phx_ref);p.metas=p.metas.filter(g=>y.indexOf(g.phx_ref)<0),s(u,p,f),p.metas.length===0&&delete e[u]}),e}static list(e,n){return n||(n=function(i,s){return s}),this.map(e,(i,s)=>n(i,s))}static map(e,n){return Object.getOwnPropertyNames(e).map(i=>n(i,e[i]))}static clone(e){return JSON.parse(JSON.stringify(e))}},Uc={HEADER_LENGTH:1,META_LENGTH:4,KINDS:{push:0,reply:1,broadcast:2},encode(t,e){if(t.payload.constructor===ArrayBuffer)return e(this.binaryEncode(t));{let n=[t.join_ref,t.ref,t.topic,t.event,t.payload];return e(JSON.stringify(n))}},decode(t,e){if(t.constructor===ArrayBuffer)return e(this.binaryDecode(t));{let[n,i,s,l,d]=JSON.parse(t);return e({join_ref:n,ref:i,topic:s,event:l,payload:d})}},binaryEncode(t){let{join_ref:e,ref:n,event:i,topic:s,payload:l}=t,d=this.META_LENGTH+e.length+n.length+s.length+i.length,u=new ArrayBuffer(this.HEADER_LENGTH+d),f=new DataView(u),p=0;f.setUint8(p++,this.KINDS.push),f.setUint8(p++,e.length),f.setUint8(p++,n.length),f.setUint8(p++,s.length),f.setUint8(p++,i.length),Array.from(e,g=>f.setUint8(p++,g.charCodeAt(0))),Array.from(n,g=>f.setUint8(p++,g.charCodeAt(0))),Array.from(s,g=>f.setUint8(p++,g.charCodeAt(0))),Array.from(i,g=>f.setUint8(p++,g.charCodeAt(0)));var y=new Uint8Array(u.byteLength+l.byteLength);return y.set(new Uint8Array(u),0),y.set(new Uint8Array(l),u.byteLength),y.buffer},binaryDecode(t){let e=new DataView(t),n=e.getUint8(0),i=new TextDecoder;switch(n){case this.KINDS.push:return this.decodePush(t,e,i);case this.KINDS.reply:return this.decodeReply(t,e,i);case this.KINDS.broadcast:return this.decodeBroadcast(t,e,i)}},decodePush(t,e,n){let i=e.getUint8(1),s=e.getUint8(2),l=e.getUint8(3),d=this.HEADER_LENGTH+this.META_LENGTH-1,u=n.decode(t.slice(d,d+i));d=d+i;let f=n.decode(t.slice(d,d+s));d=d+s;let p=n.decode(t.slice(d,d+l));d=d+l;let y=t.slice(d,t.byteLength);return{join_ref:u,ref:null,topic:f,event:p,payload:y}},decodeReply(t,e,n){let i=e.getUint8(1),s=e.getUint8(2),l=e.getUint8(3),d=e.getUint8(4),u=this.HEADER_LENGTH+this.META_LENGTH,f=n.decode(t.slice(u,u+i));u=u+i;let p=n.decode(t.slice(u,u+s));u=u+s;let y=n.decode(t.slice(u,u+l));u=u+l;let g=n.decode(t.slice(u,u+d));u=u+d;let v=t.slice(u,t.byteLength),w={status:g,response:v};return{join_ref:f,ref:p,topic:y,event:Sa.reply,payload:w}},decodeBroadcast(t,e,n){let i=e.getUint8(1),s=e.getUint8(2),l=this.HEADER_LENGTH+2,d=n.decode(t.slice(l,l+i));l=l+i;let u=n.decode(t.slice(l,l+s));l=l+s;let f=t.slice(l,t.byteLength);return{join_ref:null,ref:null,topic:d,event:u,payload:f}}},kI=class{constructor(t,e={}){this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.channels=[],this.sendBuffer=[],this.ref=0,this.fallbackRef=null,this.timeout=e.timeout||gI,this.transport=e.transport||Wn.WebSocket||ts,this.conn=void 0,this.primaryPassedHealthCheck=!1,this.longPollFallbackMs=e.longPollFallbackMs,this.fallbackTimer=null;let n=null;try{n=Wn&&Wn.sessionStorage}catch{}this.sessionStore=e.sessionStorage||n,this.establishedConnections=0,this.defaultEncoder=Uc.encode.bind(Uc),this.defaultDecoder=Uc.decode.bind(Uc),this.closeWasClean=!0,this.disconnecting=!1,this.binaryType=e.binaryType||"arraybuffer",this.connectClock=1,this.pageHidden=!1,this.encode=void 0,this.decode=void 0,this.transport!==ts?(this.encode=e.encode||this.defaultEncoder,this.decode=e.decode||this.defaultDecoder):(this.encode=this.defaultEncoder,this.decode=this.defaultDecoder);let i=null;us&&us.addEventListener&&(us.addEventListener("pagehide",s=>{this.conn&&(this.disconnect(),i=this.connectClock)}),us.addEventListener("pageshow",s=>{i===this.connectClock&&(i=null,this.connect())}),us.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?this.pageHidden=!0:(this.pageHidden=!1,!this.isConnected()&&!this.closeWasClean&&this.teardown(()=>this.connect()))})),this.heartbeatIntervalMs=e.heartbeatIntervalMs||3e4,this.autoSendHeartbeat=e.autoSendHeartbeat??!0,this.heartbeatCallback=e.heartbeatCallback??(()=>{}),this.rejoinAfterMs=s=>e.rejoinAfterMs?e.rejoinAfterMs(s):[1e3,2e3,5e3][s-1]||1e4,this.reconnectAfterMs=s=>e.reconnectAfterMs?e.reconnectAfterMs(s):[10,50,100,150,200,250,500,1e3,2e3][s-1]||5e3,this.logger=e.logger||null,!this.logger&&e.debug&&(this.logger=(s,l,d)=>{console.log(`${s}: ${l}`,d)}),this.longpollerTimeout=e.longpollerTimeout||2e4,this.params=Br(e.params||{}),this.endPoint=`${t}/${hp.websocket}`,this.vsn=e.vsn||mI,this.heartbeatTimeoutTimer=null,this.heartbeatTimer=null,this.heartbeatSentAt=null,this.pendingHeartbeatRef=null,this.reconnectTimer=new oS(()=>
20{if(this.pageHidden){this.log("Not reconnecting as page is hidden!"),this.teardown();return}this.teardown(async()=>{e.beforeReconnect&&await e.beforeReconnect(),this.connect()})},this.reconnectAfterMs),this.authToken=e.authToken}getLongPollTransport(){return ts}replaceTransport(t){this.connectClock++,this.closeWasClean=!0,clearTimeout(this.fallbackTimer),this.reconnectTimer.reset(),this.conn&&(this.conn.close(),this.conn=null),this.transport=t}protocol(){return location.protocol.match(/^https/)?"wss":"ws"}endPointURL(){let t=pd.appendParams(pd.appendParams(this.endPoint,this.params()),{vsn:this.vsn});return t.charAt(0)!=="/"?t:t.charAt(1)==="/"?`${this.protocol()}:${t}`:`${this.protocol()}://${location.host}${t}`}disconnect(t,e,n){this.connectClock++,this.disconnecting=!0,this.closeWasClean=!0,clearTimeout(this.fallbackTimer),this.reconnectTimer.reset(),this.teardown(()=>{this.disconnecting=!1,t&&t()},e,n)}connect(t){t&&(console&&console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor"),this.params=Br(t)),!(this.conn&&!this.disconnecting)&&(this.longPollFallbackMs&&this.transport!==ts?this.connectWithF
vendor: 4,353 bytes, line 20
20allback(ts,this.longPollFallbackMs):this.transportConnect())}log(t,e,n){this.logger&&this.logger(t,e,n)}hasLogger(){return this.logger!==null}onOpen(t){let e=this.makeRef();return this.stateChangeCallbacks.open.push([e,t]),e}onClose(t){let e=this.makeRef();return this.stateChangeCallbacks.close.push([e,t]),e}onError(t){let e=this.makeRef();return this.stateChangeCallbacks.error.push([e,t]),e}onMessage(t){let e=this.makeRef();return this.stateChangeCallbacks.message.push([e,t]),e}onHeartbeat(t){this.heartbeatCallback=t}ping(t){if(!this.isConnected())return!1;let e=this.makeRef(),n=Date.now();this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:e});let i=this.onMessage(s=>{s.ref===e&&(this.off([i]),t(Date.now()-n))});return!0}transportName(t){return t===ts?"LongPoll":t.name}transportConnect(){this.connectClock++,this.closeWasClean=!1;let t;this.authToken&&(t=["phoenix",`${fp}${btoa(this.authToken).replace(/=/g,"")}`]),this.conn=new this.transport(this.endPointURL(),t),this.conn.binaryType=this.binaryType,this.conn.timeout=this.longpollerTimeout,this.conn.onopen=()=>this.onConnOpen(),this.conn.onerror=e=>this.onConnError(e),this.conn.onmessage=e=>this.onConnMessage(e),this.conn.onclose=e=>this.onConnClose(e)}getSession(t){return this.sessionStore&&this.sessionStore.getItem(t)}storeSession(t,e){this.sessionStore&&this.sessionStore.setItem(t,e)}connectWithFallback(t,e=2500){clearTimeout(this.fallbackTimer);let n=!1,i=!0,s,l,d=this.transportName(t),u=f=>{this.log("transport",`falling back to ${d}...`,f),this.off([s,l]),i=!1,this.replaceTransport(t),this.transportConnect()};if(this.getSession(`phx:fallback:${d}`))return u("memorized");this.fallbackTimer=setTimeout(u,e),l=this.onError(f=>{this.log("transport","error",f),i&&!n&&(clearTimeout(this.fallbackTimer),u(f))}),this.fallbackRef&&this.off([this.fallbackRef]),this.fallbackRef=this.onOpen(()=>{if(n=!0,!i){let f=this.transportName(t);return this.primaryPassedHealthCheck||this.storeSession(`phx:fallback:${f}`,"true"),this.log("transport",`established ${f} fallback`)}clearTimeout(this.fallbackTimer),this.fallbackTimer=setTimeout(u,e),this.ping(f=>{this.log("transport","connected to primary after",f),this.primaryPassedHealthCheck=!0,clearTimeout(this.fallbackTimer)})}),this.transportConnect()}clearHeartbeats(){clearTimeout(this.heartbeatTimer),clearTimeout(this.heartbeatTimeoutTimer)}onConnOpen(){this.hasLogger()&&this.log("transport",`connected to ${this.endPointURL()}`),this.closeWasClean=!1,this.disconnecting=!1,this.establishedConnections++,this.flushSendBuffer(),this.reconnectTimer.reset(),this.autoSendHeartbeat&&this.resetHeartbeat(),this.triggerStateCallbacks("open")}heartbeatTimeout(){if(this.pendingHeartbeatRef){this.pendingHeartbeatRef=null,this.heartbeatSentAt=null,this.hasLogger()&&this.log("transport","heartbeat timeout. Attempting to re-establish connection");try{this.heartbeatCallback("timeout")}catch(t){this.log("error","error in heartbeat callback",t)}this.triggerChanError(new Error("heartbeat timeout")),this.closeWasClean=!1,this.teardown(()=>this.reconnectTimer.scheduleTimeout(),yI,"heartbeat timeout")}}resetHeartbeat(){this.conn&&this.conn.skipHeartbeat||(this.pendingHeartbeatRef=null,this.clearHeartbeats(),this.heartbeatTimer=setTimeout(()=>this.sendHeartbeat(),this.heartbeatIntervalMs))}teardown(t,e,n){if(!this.conn)return t&&t();const i=this.conn;this.waitForBufferDone(i,()=>{e?i.close(e,n||""):i.close(),this.waitForSocketClosed(i,()=>{this.conn===i&&(this.conn.onopen=function(){},this.conn.onerror=function(){},this.conn.onmessage=function(){},this.conn.onclose=function(){},this.conn=null),t&&t()})})}waitForBufferDone(t,e,n=1){if(n===5||!t.bufferedAmount){e();return}setTimeout(()=>{this.waitForBufferDone(t,e,n+1)},150*n)}waitForSocketClosed(t,e,n=1){if(n===5||t.readyState===Vn.closed){e();return}setTimeout(()=>{this.waitForSocketClosed(t,e,n+1)},150*n)}onConnClose(t){this.conn&&(this.conn.onclose=()=>{}),this.hasLogger()&&this.log("transport","close",t),this.triggerChanError(t),this.clearHeartbeats(),this.closeWasClean||this.reconnectTimer.scheduleTimeout(),this.triggerStateCallbacks("close",t)}onConnError(t){this.hasLogger()&&this.log("transport","error",t);let e=this.transport,n=this.establishedConnections;this.triggerStateCallbacks("error",t,e,n),(e===this.transport||n>0)&&this.triggerChanError(t)}
20triggerChanError(t){this.channels.forEach(e=>{e.isErrored()||e.isLeaving()||e.isClosed()||e.trigger(Sa.error,t)})}connectionState(){switch(this.conn&&this.conn.readyState){case Vn.connecting:return"connecting";case Vn.open:return"open";case Vn.closing:return"closing";default:return"closed"}}isConnected(){return this.connectionState()==="open"}remove(t){this.off(t.stateChangeRefs),this.channels=this.channels.filter(e=>e!==t)}off(t){for(let e in this.stateChangeCallbacks)this.stateChangeCallbacks[e]=this.stateChangeCallbacks[e].filter(([n])=>t.indexOf(n)===-1)}channel(t,e={}){let n=new vI(t,e,this);return this.channels.push(n),n}push(t){if(this.hasLogger()){let{topic:e,event:n,payload:i,ref:s,join_ref:l}=t;this.log("push",`${e} ${n} (${l}, ${s})`,i)}this.isConnected()?this.encode(t,e=>this.conn.send(e)):this.sendBuffer.push(()=>this.encode(t,e=>this.conn.send(e)))}makeRef(){let t=this.ref+1;return t===this.ref?this.ref=0:this.ref=t,this.ref.toString()}sendHeartbeat(){if(!this.isConnected()){try{this.heartbeatCallback("disconnected")}catch(t){this.log("error","error in heartbeat callback",t)}return}if(this.pendingHeartbeatRef){this.heartbeatTimeout();return}this.pendingHeartbeatRef=this.makeRef(),this.heartbeatSentAt=Date.now(),this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:this.pendingHeartbeatRef});try{this.heartbeatCallback("sent")}catch(t){this.log("error","error in heartbeat callback",t)}this.heartbeatTimeoutTimer=setTimeout(()=>this.heartbeatTimeout(),this.heartbeatIntervalMs)}flushSendBuffer(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(t=>t()),this.sendBuffer=[])}onConnMessage(t){this.decode(t.data,e=>{let{topic:n,event:i,payload:s,ref:l,join_ref:d}=e;if(l&&l===this.pendingHeartbeatRef){const u=this.heartbeatSentAt?Date.now()-this.heartbeatSentAt:void 0;this.clearHeartbeats();try{this.heartbeatCallback(s.status==="ok"?"ok":"error",u)}catch(f){this.log("error","error in heartbeat callback",f)}this.pendingHeartbeatRef=null,this.heartbeatSentAt=null,this.autoSendHeartbeat&&(this.heartbeatTimer=setTimeout(()=>this.sendHeartbeat(),this.heartbeatIntervalMs))}this.hasLogger()&&this.log("receive",`${s.status||""} ${n} ${i} ${l&&"("+l+")"||""}`.trim(),s);for(let u=0;u<this.channels.length;u++){const f=this.channels[u];f.isMember(n,i,s,d)&&f.trigger(i,s,l,d)}this.triggerStateCallbacks("message",e)})}triggerStateCallbacks(t,...e){try{this.stateChangeCallbacks[t].forEach(([n,i])=>{try{i(...e)}catch(s){this.log("error",`error in ${t} callback`,s)}})}catch(n){this.log("error",`error triggering ${t} callbacks`,n)}}leaveOpenTopic(t){let e=this.channels.find(n=>n.topic===t&&(n.isJoined()||n.isJoining()));e&&(this.hasLogger()&&this.log("transport",`leaving duplicate topic "${t}"`),e.leave())}};class zr{constructor(e,n){const i=_I(n);this.presence=new xI(e.getChannel(),i),this.presence.onJoin((s,l,d)=>{const u=zr.onJoinPayload(s,l,d);e.getChannel().trigger("presence",u)}),this.presence.onLeave((s,l,d)=>{const u=zr.onLeavePayload(s,l,d);e.getChannel().trigger("presence",u)}),this.presence.onSync(()=>{e.getChannel().trigger("presence",{event:"sync"})})}get state(){return zr.transformState(this.presence.state)}static transformState(e){return e=SI(e),Object.getOwnPropertyNames(e).reduce((n,i)=>{const s=e[i];return n[i]=ad(s),n},{})}static onJoinPayload(e,n,i){const s=mw(n),l=ad(i);return{event:"join",key:e,currentPresences:s,newPresences:l}}static onLeavePayload(e,n,i){const s=mw(n),l=ad(i);return{event:"leave",key:e,currentPresences:s,leftPresences:l}}}function ad(t){return t.metas.map(e=>(e.presence_ref=e.phx_ref,delete e.phx_ref,delete e.phx_ref_prev,e))}function SI(t){return JSON.parse(JSON.stringify(t))}function _I(t){return t?.events&&{events:t.events}}function mw(t){return t?.metas?ad(t):[]}var gw;(function(t){t.SYNC="sync",t.JOIN="join",t.LEAVE="leave"})(gw||(gw={}));class CI{get state(){return this.presenceAdapter.state}constructor(e,n){this.channel=e,this.presenceAdapter=new zr(this.channel.channelAdapter,n)}}function AI(t){if(t instanceof Error)return t;if(typeof t=="string")return new Error(t);if(t&&typeof t=="object"){const e=t;
20if(typeof e.code=="number"){const n=typeof e.reason=="string"&&e.reason?` (${e.reason})`:"";return new Error(`socket closed: ${e.code}${n}`,{cause:t})}return new Error("channel error: transport failure",{cause:t})}return new Error("channel error: connection lost")}class TI{constructor(e,n,i){const s=RI(i);this.channel=e.getSocket().channel(n,s),this.socket=e}get state(){return this.channel.state}set state(e){this.channel.state=e}get joinedOnce(){return this.channel.joinedOnce}get joinPush(){return this.channel.joinPush}get rejoinTimer(){return this.channel.rejoinTimer}on(e,n){return this.channel.on(e,n)}off(e,n){this.channel.off(e,n)}subscribe(e){return this.channel.join(e)}unsubscribe(e){return this.channel.leave(e)}teardown(){this.channel.teardown()}onClose(e){this.channel.onClose(e)}onError(e){return this.channel.onError(e)}push(e,n,i){let s;try{s=this.channel.push(e,n,i)}catch{throw new Error(`tried to push '${e}' to '${this.channel.topic}' before joining. Use channel.subscribe() before pushing events`)}if(this.channel.pushBuffer.length>sI){const l=this.channel.pushBuffer.shift();l.cancelTimeout(),this.socket.log("channel",`discarded push due to buffer overflow: ${l.event}`,l.payload())}return s}updateJoinPayload(e){const n=this.channel.joinPush.payload();this.channel.joinPush.payload=()=>Object.assign(Object.assign({},n),e)}canPush(){return this.socket.isConnected()&&this.state===uo.joined}isJoined(){return this.state===uo.joined}isJoining(){return this.state===uo.joining}isClosed(){return this.state===uo.closed}isLeaving(){return this.state===uo.leaving}updateFilterBindings(e){this.channel.filterBindings=e}updatePayloadTransform(e){this.channel.onMessage=e}getChannel(){return this.channel}}function RI(t){return{config:Object.assign({broadcast:{ack:!1,self:!1},presence:{key:"",enabled:!1},private:!1},t.config)}}var yw;(function(t){t.ALL="*",t.INSERT="INSERT",t.UPDATE="UPDATE",t.DELETE="DELETE"})(yw||(yw={}));var gs;(function(t){t.BROADCAST="broadcast",t.PRESENCE="presence",t.POSTGRES_CHANGES="postgres_changes",t.SYSTEM="system"})(gs||(gs={}));var _a;(function(t){t.SUBSCRIBED="SUBSCRIBED",t.TIMED_OUT="TIMED_OUT",t.CLOSED="CLOSED",t.CHANNEL_ERROR="CHANNEL_ERROR"})(_a||(_a={}));class Hr{get state(){return this.channelAdapter.state}set state(e){this.channelAdapter.state=e}get joinedOnce(){return this.channelAdapter.joinedOnce}get timeout(){return this.socket.timeout}get joinPush(){return this.channelAdapter.joinPush}get rejoinTimer(){return this.channelAdapter.rejoinTimer}constructor(e,n={config:{}},i){var s,l;if(this.topic=e,this.params=n,this.socket=i,this.bindings={},this.subTopic=e.replace(/^realtime:/i,""),this.params.config=Object.assign({broadcast:{ack:!1,self:!1},presence:{key:"",enabled:!1},private:!1},n.config),this.channelAdapter=new TI(this.socket.socketAdapter,e,this.params),this.presence=new CI(this),this._onClose(()=>{this.socket._remove(this)}),this._updateFilterTransform(),this.broadcastEndpointURL=aS(this.socket.socketAdapter.endPointURL()),this.private=this.params.config.private||!1,!this.private&&(!((l=(s=this.params.config)===null||s===void 0?void 0:s.broadcast)===null||l===void 0)&&l.replay))throw new Error(`tried to use replay on public channel '${this.topic}'. It must be a private channel.`)}subscribe(e,n=this.timeout){var i,s,l;if(this.socket.isConnected()||this.socket.connect(),this.channelAdapter.isClosed()){const{config:{broadcast:d,presence:u,private:f}}=this.params,p=(s=(i=this.bindings.postgres_changes)===null||i===void 0?void 0:i.map(w=>w.filter))!==null&&s!==void 0?s:[],y=!!this.bindings[gs.PRESENCE]&&this.bindings[gs.PRESENCE].length>0||((l=this.params.config.presence)===null||l===void 0?void 0:l.enabled)===!0,g={},v={broadcast:d,presence:Object.assign(Object.assign({},u),{enabled:y}),postgres_changes:p,private:f};this.socket.accessTokenValue&&(g.access_token=this.socket.accessTokenValue),this._onError(w=>{e?.(_a.CHANNEL_ERROR,AI(w))}),this._onClose(()=>e?.(_a.CLOSED)),this.updateJoinPayload(Object.assign({config:v},g)),this._updateFilterMessage(),this.channelAdapter.subscribe(n).receive("ok",async({postgres_changes:w})=>{if(this.socket._isManualToken()||this.socket.setAuth(),w===void 0){e?.(_a.SUBSCRIBED);return}this._updatePostgresBindings(w,e)}).receive("error",w=>{this.state=uo.errored;const x=Object.values(w).join(", ")||"error";e?.(_a.CHANNEL_ERROR,new Error(x,{cause:w}))}).receive("timeout",()=>{e?.(_a.TIMED_OUT)})}return this}_updatePostgresBindings(e,n){var i;const s=this.bindings.postgres_changes,l=(i=s?.length)!==null&&i!==void 0?i:0,d=[];for(let u=0;u<l;u++){const f=s[u],{filter:{event:p,schema:y,table:g,filter:v}}=f,w=e&&e[u];
20if(w&&w.event===p&&Hr.isFilterValueEqual(w.schema,y)&&Hr.isFilterValueEqual(w.table,g)&&Hr.isFilterValueEqual(w.filter,v))d.push(Object.assign(Object.assign({},f),{id:w.id}));else{this.unsubscribe(),this.state=uo.errored,n?.(_a.CHANNEL_ERROR,new Error("mismatch between server and client bindings for postgres changes"));return}}this.bindings.postgres_changes=d,this.state!=uo.errored&&n&&n(_a.SUBSCRIBED)}presenceState(){return this.presence.state}async track(e,n={}){return await this.send({type:"presence",event:"track",payload:e},n.timeout||this.timeout)}async untrack(e={}){return await this.send({type:"presence",event:"untrack"},e)}on(e,n,i){const s=this.channelAdapter.isJoined()||this.channelAdapter.isJoining(),l=e===gs.PRESENCE||e===gs.POSTGRES_CHANGES;if(s&&l)throw this.socket.log("channel",`cannot add \`${e}\` callbacks for ${this.topic} after \`subscribe()\`.`),new Error(`cannot add \`${e}\` callbacks for ${this.topic} after \`subscribe()\`.`);return this._on(e,n,i)}async httpSend(e,n,i={}){var s;if(n==null)return Promise.reject(new Error("Payload is required for httpSend()"));const l=n instanceof ArrayBuffer||ArrayBuffer.isView(n),d={apikey:this.socket.apiKey?this.socket.apiKey:"","Content-Type":l?"application/octet-stream":"application/json"};this.socket.accessTokenValue&&(d.Authorization=`Bearer ${this.socket.accessTokenValue}`);const u=new URL(this.broadcastEndpointURL);u.pathname+=`/${encodeURIComponent(this.subTopic)}/events/${encodeURIComponent(e)}`,this.private&&u.searchParams.set("private","true");const f={method:"POST",headers:d,body:l?n:JSON.stringify(n)},p=await this._fetchWithTimeout(u.toString(),f,(s=i.timeout)!==null&&s!==void 0?s:this.timeout);if(p.status===202)return{success:!0};let y=p.statusText;try{const g=await p.json();y=g.error||g.message||y}catch{}return Promise.reject(new Error(y))}async send(e,n={}){var i,s;if(!this.channelAdapter.canPush()&&e.type==="broadcast"){console.warn("Realtime send() is automatically falling back to REST API. This behavior will be deprecated
20in the future. Please use httpSend() explicitly for REST delivery.");const{event:l,payload:d}=e,u={apikey:this.socket.apiKey?this.socket.apiKey:"","Content-Type":"application/json"};this.socket.accessTokenValue&&(u.Authorization=`Bearer ${this.socket.accessTokenValue}`);const f={method:"POST",headers:u,body:JSON.stringify({messages:[{topic:this.subTopic,event:l,payload:d,private:this.private}]})};try{const p=await this._fetchWithTimeout(this.broadcastEndpointURL,f,(i=n.timeout)!==null&&i!==void 0?i:this.timeout);return await((s=p.body)===null||s===void 0?void 0:s.cancel()),p.ok?"ok":"error"}catch(p){return p instanceof Error&&p.name==="AbortError"?"timed out":"error"}}else return new Promise(l=>{var d,u,f;const p=this.channelAdapter.push(e.type,e,n.timeout||this.timeout);e.type==="broadcast"&&!(!((f=(u=(d=this.params)===null||d===void 0?void 0:d.config)===null||u===void 0?void 0:u.broadcast)===null||f===void 0)&&f.ack)&&l("ok"),p.receive("ok",()=>l("ok")),p.receive("error",()=>l("error")),p.receive("timeout",()=>l("timed out"))})}updateJoinPayload(e){this.channelAdapter.updateJoinPayload(e)}async unsubscribe(e=this.timeout){return new Promise(n=>{this.channelAdapter.unsubscribe(e).receive("ok",()=>n("ok")).receive("timeout",()=>n("timed out")).receive("error",()=>n("error"))})}teardown(){this.channelAdapter.teardown()}async _fetchWithTimeout(e,n,i){const s=new AbortController,l=setTimeout(()=>s.abort(),i),d=await this.socket.fetch(e,Object.assign(Object.assign({},n),{signal:s.signal}));return clearTimeout(l),d}_on(e,n,i){const s=e.toLocaleLowerCase(),l=this.channelAdapter.on(e,i),d={type:s,filter:n,callback:i,ref:l};return this.bindings[s]?this.bindings[s].push(d):this.bindings[s]=[d],this._updateFilterMessage(),this}_onClose(e){this.channelAdapter.onClose(e)}_onError(e){this.channelAdapter.onError(e)}_updateFilterMessage(){this.channelAdapter.updateFilterBindings((e,n,i)=>{var s,l,d,u,f,p,y;const g=e.event.toLocaleLowerCase();if(this._notThisChannelEvent(g,i))return!1;const v=(s=this.bindings[g])===null||s===void 0?void 0:s.find(w=>w.ref===e.ref);if(!v)return!0;if(["broadcast","presence","postgres_changes"].includes(g))if("id"in v){const w=v.id,x=(l=v.filter)===null||l===void 0?void 0:l.event;return w&&((d=n.ids)===null||d===void 0?void 0:d.includes(w))&&(x==="*"||x?.toLocaleLowerCase()===((u=n.data)===null||u===void 0?void 0:u.type.toLocaleLowerCase()))}else{const w=(p=(f=v?.filter)===null||f===void 0?void 0:f.event)===null||p===void 0?void 0:p.toLocaleLowerCase();return w==="*"||w===((y=n?.event)===null||y===void 0?void 0:y.toLocaleLowerCase())}else return v.type.toLocaleLowerCase()===g})}_notThisChannelEvent(e,n){const{close:i,error:s,leave:l,join:d}=tS;return n&&[i,s,l,d].includes(e)&&n!==this.joinPush.ref}_updateFilterTransform(){this.channelAdapter.updatePayloadTransform((e,n,i)=>{if(typeof n=="object"&&"ids"in n){const s=n.data,{schema:l,table:d,commit_timestamp:u,type:f,errors:p}=s;return Object.assign(Object.assign({},{schema:l,table:d,commit_timestamp:u,eventType:f,new:{},old:{},errors:p}),this._getPayloadRecords(s))}return n})}copyBindings(e){if(this.joinedOnce)throw new Error("cannot copy bindings into joined channel");for(const n in e.bindings)for(const i of e.bindings[n])this._on(i.type,i.filter,i.callback)}static isFilterValueEqual(e,n){return(e??void 0)===(n??void 0)}_getPayloadRecords(e){const n={new:{},old:{}};return(e.type==="INSERT"||e.type==="UPDATE")&&(n.new=pw(e.columns,e.record)),(e.type==="UPDATE"||e.type==="DELETE")&&(n.old=pw(e.columns,e.old_record)),n}}class EI{constructor(e,n){this.socket=new kI(e,n)}get timeout(){return this.socket.timeout}get endPoint(){return this.socket.endPoint}get transport(){return this.socket.transport}get heartbeatIntervalMs(){return this.socket.heartbeatIntervalMs}get heartbeatCallback(){return this.socket.heartbeatCallback}set heartbeatCallback(e){this.socket.heartbeatCallback=e}get heartbeatTimer(){return this.socket.heartbeatTimer}get pendingHeartbeatRef(){return this.socket.pendingHeartbeatRef}get reconnectTimer(){return this.socket.reconnectTimer}get vsn(){return this.socket.vsn}get encode(){return this.socket.encode}get decode(){return this.socket.decode}get reconnectAfterMs(){return this.socket.reconnectAfterMs}get sendBuffer(){return this.socket.sendBuffer}get stateChangeCallbacks(){return this.socket.stateChangeCallbacks}connect(){this.socket.connect()}disconnect(e,n,i,s=1e4){return new Promise(l=>{setTimeout(()=>l("timeout"),s),this.socket.disconnect(()=>{e(),l("ok")},n,i)})}push(e){this.socket.push(e)}log(e,n,i){this.socket.log(e,n,i)}makeRef(){return this.socket.makeRef()}onOpen(e){this.socket.onOpen(e)}onClose(e){this.socket.onClose(e)}onError(e){this.socket.onError(e)}onMessage(e){this.socket.onMessage(e)}isConnected(){return this.socket.isConnected()}isConnecting(){return this.socket.connectionState()==dp.connecting}isDisconnecting(){return this.socket.connectionState()==dp.closing}connectionState(){return this.socket.connectionState()}endPointURL(){return this.socket.endPointURL()}sendHeartbeat(){this.socket.sendHeartbeat()}getSocket(){return this.socket}}const bw={HEARTBEAT_INTERVAL:25e3},OI=[1e3,2e3,5e3,1e4],II=1e4;function MI(){const t=new Map;return{get length(){return t.size},clear(){t.clear()},getItem(e){return t.has(e)?t.get(e):null},key(e){var n;return(n=Array.from(t.keys())[e])!==null&&n!==void 0?n:null},removeItem(e){t.delete(e)},setItem(e,n){t.set(e,String(n))}}}function PI(){try{if(typeof globalThis<"u"&&globalThis.sessionStorage)return globalThis.sessionStorage}catch{}return MI()}const DI=` 21 addEventListener("message", (e) => { 22 if (e.data.event === "start") { 23 setInterval(() => postMessage({ event: "keepAlive" }), e.data.interval); 24 } 25 });`;class LI{get endPoint(){return this.socketAdapter.endPoint}get timeout(){return this.socketAdapter.timeout}get transport(){return this.socketAdapter.transport}get heartbeatCallback(){return this.socketAdapter.heartbeatCallback}get heartbeatIntervalMs(){return this.socketAdapter.heartbeatIntervalMs}get heartbeatTimer(){return this.worker?this._workerHeartbeatTimer:this.socketAdapter.heartbeatTimer}get pendingHeartbeatRef(){return this.worker?this._pendingWorkerHeartbeatRef:this.socketAdapter.pendingHeartbeatRef}get reconnectTimer(){return this.socketAdapter.reconnectTimer}get vsn(){return this.socketAdapter.vsn}get encode(){return this.socketAdapter.encode}get decode(){return this.socketAdapter.decode}get reconnectAfterMs(){return this.socketAdapter.reconnectAfterMs}get sendBuffer(){return this.socketAdapter.sendBuffer}get stateChangeCallbacks(){return this.socketAdapter.stateChangeCallbacks}constructor(e,n){var i;if(this.channels=new Array,this.accessTokenValue=null,this.accessToken=null,this.apiKey=null,this.httpEndpoint="",this.headers={},this.params={}
25,this.ref=0,this.serializer=new rI,this._manuallySetToken=!1,this._authPromise=null,this._workerHeartbeatTimer=void 0,this._pendingWorkerHeartbeatRef=null,this._pendingDisconnectTimer=null,this._disconnectOnEmptyChannelsAfterMs=0,this._resolveFetch=l=>l?(...d)=>l(...d):(...d)=>fetch(...d),!(!((i=n?.params)===null||i===void 0)&&i.apikey))throw new Error("API key is required to connect to Realtime");this.apiKey=n.params.apikey;const s=this._initializeOptions(n);this.socketAdapter=new EI(e,s),this.httpEndpoint=aS(e),this.fetch=this._resolveFetch(n?.fetch)}connect(){if(!(this.isConnecting()||this.isDisconnecting()||this.isConnected())){this.accessToken&&!this._authPromise&&this._setAuthSafely("connect"),this._setupConnectionHandlers();try{this.socketAdapter.connect()}catch(e){const n=e.message;throw n.includes("Node.js")?new Error(`${n} 26 27To use Realtime in Node.js, you need to provide a WebSocket implementation: 28 29Option 1: Use Node.js 22+ which has native WebSocket support 30Option 2: Install and provide the "ws" package: 31 32 npm install ws 33 34 import ws from "ws" 35 const client = new RealtimeClient(url, { 36 ...options, 37 transport: ws 38 })`):new Error(`WebSocket not available: ${n}`)}this._handleNodeJsRaceCondition()}}endpointURL(){return this.socketAdapter.endPointURL()}async disconnect(e,n){return this._cancelPendingDisconnect(),this.isDisconnecting()?"ok":await this.socketAdapter.disconnect(()=>{clearInterval(this._workerHeartbeatTimer),this._terminateWorker()},e,n)}getChannels(){return this.channels}async removeChannel(e){const n=await e.unsubscribe();return n==="ok"&&e.teardown(),n}async removeAllChannels(){const e=this.channels.map(async i=>{const s=await i.unsubscribe();return i.teardown(),s}),n=await Promise.all(e);return await this.disconnect(),n}log(e,n,i){this.socketAdapter.log(e,n,i)}connectionState(){return this.socketAdapter.connectionState()||dp.closed}isConnected(){return this.socketAdapter.isConnected()}isConnecting(){return this.socketAdapter.isConnecting()}isDisconnecting(){return this.socketAdapter.isDisconnecting()}channel(e,n={config:{}}){const i=`realtime:${e}`,s=this.getChannels().find(l=>l.topic===i);if(s)return s;{const l=new Hr(`realtime:${e}`,n,this);return this._cancelPendingDisconnect(),this.channels.push(l),l}}push(e){this.socketAdapter.push(e)}async setAuth(e=null){this._authPromise=this._performAuth(e);try{await this._authPromise}finally{this._authPromise=null}}_isManualToken(){return this._manuallySetToken}async sendHeartbeat(){this.socketAdapter.sendHeartbeat()}onHeartbeat(e){this.socketAdapter.heartbeatCallback=this._wrapHeartbeatCallback(e)}_makeRef(){return this.socketAdapter.makeRef()}_remove(e){this.channels=this.channels.filter(n=>n.topic!==e.topic),this.channels.length===0&&(this.log("transport","no channels remaining, scheduling disconnect"),this._schedulePendingDisconnect())}_schedulePendingDisconnect(){if(this._cancelPendingDisconnect(),this._disconnectOnEmptyChannelsAfterMs===0){this.log("transport","disconnecting immediately - no channels"),this.disconnect();return}
38this._pendingDisconnectTimer=setTimeout(()=>{this._pendingDisconnectTimer=null,this.channels.length===0&&(this.log("transport","deferred disconnect fired - no channels, disconnecting"),this.disconnect())},this._disconnectOnEmptyChannelsAfterMs),this.log("transport",`deferred disconnect scheduled in ${this._disconnectOnEmptyChannelsAfterMs}ms`)}_cancelPendingDisconnect(){this._pendingDisconnectTimer!==null&&(this.log("transport","pending disconnect cancelled - channel activity detected"),clearTimeout(this._pendingDisconnectTimer),this._pendingDisconnectTimer=null)}async _performAuth(e=null){let n,i=!1;if(e)n=e,i=!0;else if(this.accessToken)try{n=await this.accessToken()}catch(s){this.log("error","Error fetching access token from callback",s),n=this.accessTokenValue}else n=this.accessTokenValue;i?this._manuallySetToken=!0:this.accessToken&&(this._manuallySetToken=!1),this.accessTokenValue!=n&&(this.accessTokenValue=n,this.channels.forEach(s=>{const l={access_token:n,version:nI};n&&s.updateJoinPayload(l),s.joinedOnce&&s.channelAdapter.isJoined()&&s.channelAdapter.push(tS.access_token,{access_token:n})}))}async _waitForAuthIfNeeded(){this._authPromise&&await this._authPromise}_setAuthSafely(e="general"){this._isManualToken()||this.setAuth().catch(n=>{this.log("error",`Error setting auth in ${e}`,n)})}_setupConnectionHandlers(){this.socketAdapter.onOpen(()=>{(this._authPromise||(this.accessToken&&!this.accessTokenValue?this.setAuth():Promise.resolve())).catch(n=>{this.log("error","error waiting for auth on connect",n)}),this.worker&&!this.workerRef&&this._startWorkerHeartbeat()}),this.socketAdapter.onClose(()=>{this.worker&&this.workerRef&&this._terminateWorker()}),this.socketAdapter.onMessage(e=>{e.ref&&e.ref===this._pendingWorkerHeartbeatRef&&(this._pendingWorkerHeartbeatRef=null)})}_handleNodeJsRaceCondition(){this.socketAdapter.isConnected()&&this.socketAdapter.getSocket().onConnOpen()}_wrapHeartbeatCallback(e){return(n,i)=>{n=="sent"&&this._setAuthSafely(),e&&e(n,i)}}_startWorkerHeartbeat(){this.workerUrl?this.log("worker",`starting worker for from ${this.workerUrl}`):this.log("worker","starting default worker");const e=this._workerObjectUrl(this.workerUrl);this.workerRef=new Worker(e),this.workerRef.onerror=n=>{this.log("worker","worker error",n.message),this._terminateWorker(),this.disconnect()},this.workerRef.onmessage=n=>{n.data.event==="keepAlive"&&this.sendHeartbeat()},this.workerRef.postMessage({event:"start",interval:this.heartbeatIntervalMs})}_terminateWorker(){this.workerRef&&(this.log("worker","terminating worker"),this.workerRef.terminate(),this.workerRef=void 0)}_workerObjectUrl(e){let n;if(e)n=e;else{const i=new Blob([DI],{type:"application/javascript"});n=URL.createObjectURL(i)}return n}_initializeOptions(e){var n,i,s,l,d,u,f,p,y,g,v,w;this.worker=(n=e?.worker)!==null&&n!==void 0?n:!1,this.accessToken=(i=e?.accessToken)!==null&&i!==void 0?i:null;const x={};x.timeout=(s=e?.timeout)!==null&&s!==void 0?s:iI,x.heartbeatIntervalMs=(l=e?.heartbeatIntervalMs)!==null&&l!==void 0?l:bw.HEARTBEAT_INTERVAL,this._disconnectOnEmptyChannelsAfterMs=(d=e?.disconnectOnEmptyChannelsAfterMs)!==null&&d!==void 0?d:2*((u=e?.heartbeatIntervalMs)!==null&&u!==void 0?u:bw.HEARTBEAT_INTERVAL),x.transport=(f=e?.transport)!==null&&f!==void 0?f:eI.getWebSocketConstructor(),x.params=e?.params,x.logger=e?.logger,x.heartbeatCallback=this._wrapHeartbeatCallback(e?.heartbeatCallback),x.sessionStorage=(p=e?.sessionStorage)!==null&&p!==void 0?p:PI(),x.reconnectAfterMs=(y=e?.reconnectAfterMs)!==null&&y!==void 0?y:(E=>OI[E-1]||II);let k,S;const C=(g=e?.vsn)!==null&&g!==void 0?g:oI;switch(C){case aI:k=(E,R)=>R(JSON.stringify(E)),S=(E,R)=>R(JSON.parse(E));break;case eS:k=this.serializer.encode.bind(this.serializer),S=this.serializer.decode.bind(this.serializer);break;default:throw new Error(`Unsupported serializer version: ${x.vsn}`)}if(x.vsn=C,x.encode=(v=e?.encode)!==null&&v!==void 0?v:k,x.decode=(w=e?.decode)!==null&&w!==void 0?w:S,x.beforeReconnect=this._reconnectAuth.bind(this),(e?.logLevel||e?.log_level)&&(this.logLevel=e.logLevel||e.log_level,x.params=Object.assign(Object.assign({},x.params),{log_level:this.logLevel})),this.worker){if(typeof window<"u"&&!window.Worker)throw new Error("Web Worker is not supported");this.workerUrl=e?.workerUrl,x.autoSendHeartbeat=!this.worker}return x}async _reconnectAuth(){await this._waitForAuthIfNeeded(),this.isConnected()||this.connect()}}
38var Qr=class extends Error{constructor(t,e){super(t),this.name="IcebergError",this.status=e.status,this.icebergType=e.icebergType,this.icebergCode=e.icebergCode,this.details=e.details,this.isCommitStateUnknown=e.icebergType==="CommitStateUnknownException"||[500,502,504].includes(e.status)&&e.icebergType?.includes("CommitState")===!0}isNotFound(){return this.status===404}isConflict(){return this.status===409}isAuthenticationTimeout(){return this.status===419}};function NI(t,e,n){const i=new URL(e,t);if(n)for(const[s,l]of Object.entries(n))l!==void 0&&i.searchParams.set(s,l);return i.toString()}async function UI(t){return!t||t.type==="none"?{}:t.type==="bearer"?{Authorization:`Bearer ${t.token}`}:t.type==="header"?{[t.name]:t.value}:t.type==="custom"?await t.getHeaders():{}}function jI(t){const e=t.fetchImpl??globalThis.fetch;return{async request({method:n,path:i,query:s,body:l,headers:d}){const u=NI(t.baseUrl,i,s),f=await UI(t.auth),p=await e(u,{method:n,headers:{...l?{"Content-Type":"application/json"}:{},...f,...d},body:l?JSON.stringify(l):void 0}),y=await p.text(),g=(p.headers.get("content-type")||"").includes("application/json"),v=g&&y?JSON.parse(y):y;if(!p.ok){const w=g?v:void 0,x=w?.error;throw new Qr(x?.message??`Request failed with status ${p.status}`,{status:p.status,icebergType:x?.type,icebergCode:x?.code,details:w})}return{status:p.status,headers:p.headers,data:v}}}}function jc(t){return t.join("�")}var FI=class{constructor(t,e=""){this.client=t,this.prefix=e}async listNamespaces(t){const e=t?{parent:jc(t.namespace)}:void 0;return(await this.client.request({method:"GET",path:`${this.prefix}/namespaces`,query:e})).data.namespaces.map(i=>({namespace:i}))}async createNamespace(t,e){const n={namespace:t.namespace,properties:e?.properties};return(await this.client.request({method:"POST",path:`${this.prefix}/namespaces`,body:n})).data}async dropNamespace(t){await this.client.request({method:"DELETE",path:`${this.prefix}/namespaces/${jc(t.namespace)}`})}async loadNamespaceMetadata(t){return{properties:(await this.client.request({method:"GET",path:`${this.prefix}/namespaces/${jc(t.namespace)}`})).data.properties}}async namespaceExists(t){try{return await this.client.request({method:"HEAD",path:`${this.prefix}/namespaces/${jc(t.namespace)}`}),!0}catch(e){if(e instanceof Qr&&e.status===404)return!1;throw e}}async createNamespaceIfNotExists(t,e){try{return await this.createNamespace(t,e)}catch(n){if(n instanceof Qr&&n.status===409)return;throw n}}};function ns(t){return t.join("�")}var qI=class{constructor(t,e="",n){this.client=t,this.prefix=e,this.accessDelegation=n}async listTables(t){return(await this.client.request({method:"GET",path:`${this.prefix}/namespaces/${ns(t.namespace)}/tables`})).data.identifiers}async createTable(t,e){const n={};return this.accessDelegation&&(n["X-Iceberg-Access-Delegation"]=this.accessDelegation),(await this.client.request({method:"POST",path:`${this.prefix}/namespaces/${ns(t.namespace)}/tables`,body:e,headers:n})).data.metadata}async updateTable(t,e){const n=await this.client.request({method:"POST",path:`${this.prefix}/namespaces/${ns(t.namespace)}/tables/${t.name}`,body:e});return{"metadata-location":n.data["metadata-location"],metadata:n.data.metadata}}async dropTable(t,e){await this.client.request({method:"DELETE",path:`${this.prefix}/namespaces/${ns(t.namespace)}/tables/${t.name}`,query:{purgeRequested:String(e?.purge??!1)}})}async loadTable(t){const e={};return this.accessDelegation&&(e["X-Iceberg-Access-Delegation"]=this.accessDelegation),(await this.client.request({method:"GET",path:`${this.prefix}/namespaces/${ns(t.namespace)}/tables/${t.name}`,headers:e})).data.metadata}async tableExists(t){const e={};this.accessDelegation&&(e["X-Iceberg-Access-Delegation"]=this.accessDelegation);try{return await this.client.request({method:"HEAD",path:`${this.prefix}/namespaces/${ns(t.namespace)}/tables/${t.name}`,headers:e}),!0}catch(n){if(n instanceof Qr&&n.status===404)return!1;throw n}}async createTableIfNotExists(t,e){try{return await this.createTable(t,e)}catch(n){if(n instanceof Qr&&n.status===409)return await this.loadTable({namespace:t.namespace,name:e.name});throw n}}},BI=class{constructor(t){let e="v1";t.catalogName&&(e+=`/${t.catalogName}`);const n=t.baseUrl.endsWith("/")?t.baseUrl:`${t.baseUrl}/`;this.client=jI({baseUrl:n,auth:t.auth,fetchImpl:t.fetch}),this.accessDelegation=t.accessDelegation?.join(","),this.namespaceOps=new FI(this.client,e),this.tableOps=new qI(this.client,e,this.accessDelegation)}async listNamespaces(t){return this.namespaceOps.listNamespaces(t)}async createNamespace(t,e){return this.namespaceOps.createNamespace(t,e)}async dropNamespace(t){await this.namespaceOps.dropNamespace(t)}async loadNamespaceMetadata(t){return this.namespaceOps.loadNamespaceMetadata(t)}async listTables(t){return this.tableOps.listTables(t)}
38async createTable(t,e){return this.tableOps.createTable(t,e)}async updateTable(t,e){return this.tableOps.updateTable(t,e)}async dropTable(t,e){await this.tableOps.dropTable(t,e)}async loadTable(t){return this.tableOps.loadTable(t)}async namespaceExists(t){return this.namespaceOps.namespaceExists(t)}async tableExists(t){return this.tableOps.tableExists(t)}async createNamespaceIfNotExists(t,e){return this.namespaceOps.createNamespaceIfNotExists(t,e)}async createTableIfNotExists(t,e){return this.tableOps.createTableIfNotExists(t,e)}};function Xr(t){"@babel/helpers - typeof";return Xr=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},Xr(t)}function zI(t,e){if(Xr(t)!="object"||!t)return t;var n=t[Symbol.toPrimitive];if(n!==void 0){var i=n.call(t,e);if(Xr(i)!="object")return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(t)}function HI(t){var e=zI(t,"string");return Xr(e)=="symbol"?e:e+""}function GI(t,e,n){return(e=HI(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function vw(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(s){return Object.getOwnPropertyDescriptor(t,s).enumerable})),n.push.apply(n,i)}return n}function ge(t){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?vw(Object(n),!0).forEach(function(i){GI(t,i,n[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):vw(Object(n)).forEach(function(i){Object.defineProperty(t,i,Object.getOwnPropertyDescriptor(n,i))})}return t}var Fd=class extends Error{constructor(t,e="storage",n,i){super(t),this.__isStorageError=!0,this.namespace=e,this.name=e==="vectors"?"StorageVectorsError":"StorageError",this.status=n,this.statusCode=i}toJSON(){return{name:this.name,message:this.message,status:this.status,statusCode:this.statusCode}}};function qd(t){return typeof t=="object"&&t!==null&&"__isStorageError"in t}var pp=class extends Fd{constructor(t,e,n,i="storage"){super(t,i,e,n),this.name=i==="vectors"?"StorageVectorsApiError":"StorageApiError",this.status=e,this.statusCode=n}toJSON(){return ge({},super.toJSON())}},iS=class extends Fd{constructor(t,e,n="storage"){super(t,n),this.name=n==="vectors"?"StorageVectorsUnknownError":"StorageUnknownError",this.originalError=e}};function md(t,e,n){const i=ge({},t),s=e.toLowerCase();for(const l of Object.keys(i))l.toLowerCase()===s&&delete i[l];return i[s]=n,i}function WI(t){const e={};for(const[n,i]of Object.entries(t))e[n.toLowerCase()]=i;return e}const $I=t=>t?(...e)=>t(...e):(...e)=>fetch(...e),VI=t=>{if(typeof t!="object"||t===null)return!1;const e=Object.getPrototypeOf(t);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(Symbol.toStringTag in t)&&!(Symbol.iterator in t)},mp=t=>{if(Array.isArray(t))return t.map(n=>mp(n));if(typeof t=="function"||t!==Object(t))return t;const e={};return Object.entries(t).forEach(([n,i])=>{const s=n.replace(/([-_][a-z])/gi,l=>l.toUpperCase().replace(/[-_]/g,""));e[s]=mp(i)}),e},YI=t=>!t||typeof t!="string"||t.length===0||t.length>100||t.trim()!==t||t.includes("/")||t.includes("\\")?!1:/^[\w!.\*'() &$@=;:+,?-]+$/.test(t),ww=t=>{if(typeof t=="object"&&t!==null){const e=t;if(typeof e.msg=="string")return e.msg;if(typeof e.message=="string")return e.message;if(typeof e.error_description=="string")return e.error_description;if(typeof e.error=="string")return e.error;if(typeof e.error=="object"&&e.error!==null){const n=e.error;if(typeof n.message=="string")return n.message}}return JSON.stringify(t)},KI=async(t,e,n,i)=>{if(t!==null&&typeof t=="object"&&"json"in t&&typeof t.json=="function"){const s=t;let l=parseInt(String(s.status),10);Number.isFinite(l)||(l=500),s.json().then(d=>{const u=d?.statusCode||d?.code||l+"";e(new pp(ww(d),l,u,i))}).catch(()=>{const d=l+"";e(new pp(s.statusText||`HTTP ${l} error`,l,d,i))})}
38else e(new iS(ww(t),t,i))},ZI=(t,e,n,i)=>{const s={method:t,headers:e?.headers||{}};if(t==="GET"||t==="HEAD"||!i)return ge(ge({},s),n);if(VI(i)){var l;const d=e?.headers||{};let u;for(const[f,p]of Object.entries(d))f.toLowerCase()==="content-type"&&(u=p);s.headers=md(d,"Content-Type",(l=u)!==null&&l!==void 0?l:"application/json"),s.body=JSON.stringify(i)}else s.body=i;return e?.duplex&&(s.duplex=e.duplex),ge(ge({},s),n)};async function Pr(t,e,n,i,s,l,d){return new Promise((u,f)=>{t(n,ZI(e,i,s,l)).then(p=>{if(!p.ok)throw p;if(i?.noResolveJson)return p;if(d==="vectors"){const y=p.headers.get("content-type");if(p.headers.get("content-length")==="0"||p.status===204)return{};if(!y||!y.includes("application/json"))return{}}return p.json()}).then(p=>u(p)).catch(p=>KI(p,f,i,d))})}function sS(t="storage"){return{get:async(e,n,i,s)=>Pr(e,"GET",n,i,s,void 0,t),post:async(e,n,i,s,l)=>Pr(e,"POST",n,s,l,i,t),put:async(e,n,i,s,l)=>Pr(e,"PUT",n,s,l,i,t),head:async(e,n,i,s)=>Pr(e,"HEAD",n,ge(ge({},i),{},{noResolveJson:!0}),s,void 0,t),remove:async(e,n,i,s,l)=>Pr(e,"DELETE",n,s,l,i,t)}}const QI=sS("storage"),{get:Jr,post:Ln,put:gp,head:XI,remove:Jp}=QI,mn=sS("vectors");var Os=class{constructor(t,e={},n,i="storage"){this.shouldThrowOnError=!1,this.url=t,this.headers=WI(e),this.fetch=$I(n),this.namespace=i}throwOnError(){return this.shouldThrowOnError=!0,this}setHeader(t,e){return this.headers=md(this.headers,t,e),this}async handleOperation(t){var e=this;try{return{data:await t(),error:null}}catch(n){if(e.shouldThrowOnError)throw n;if(qd(n))return{data:null,error:n};throw n}}};let rS;rS=Symbol.toStringTag;var JI=class{constructor(t,e){this.downloadFn=t,this.shouldThrowOnError=e,this[rS]="StreamDownloadBuilder",this.promise=null}then(t,e){return this.getPromise().then(t,e)}catch(t){return this.getPromise().catch(t)}finally(t){return this.getPromise().finally(t)}getPromise(){return this.promise||(this.promise=this.execute()),this.promise}async execute(){var t=this;try{return{data:(await t.downloadFn()).body,error:null}}catch(e){if(t.shouldThrowOnError)throw e;if(qd(e))return{data:null,error:e};throw e}}};let lS;lS=Symbol.toStringTag;var eM=class{constructor(t,e){this.downloadFn=t,this.shouldThrowOnError=e,this[lS]="BlobDownloadBuilder",this.promise=null}asStream(){return new JI(this.downloadFn,this.shouldThrowOnError)}then(t,e){return this.getPromise().then(t,e)}catch(t){return this.getPromise().catch(t)}finally(t){return this.getPromise().finally(t)}getPromise(){return this.promise||(this.promise=this.execute()),this.promise}async execute(){var t=this;try{return{data:await(await t.downloadFn()).blob(),error:null}}catch(e){if(t.shouldThrowOnError)throw e;if(qd(e))return{data:null,error:e};throw e}}};const tM={limit:100,offset:0,sortBy:{column:"name",order:"asc"}},xw={cacheControl:"3600",contentType:"text/plain;charset=UTF-8",upsert:!1};var nM=class extends Os{constructor(t,e={},n,i){super(t,e,i,"storage"),this.bucketId=n}async uploadOrUpdate(t,e,n,i){var s=this;return s.handleOperation(async()=>{let l;const d=ge(ge({},xw),i);let u=ge(ge({},s.headers),t==="POST"&&{"x-upsert":String(d.upsert)});const f=d.metadata;if(typeof Blob<"u"&&n instanceof Blob?(l=new FormData,l.append("cacheControl",d.cacheControl),f&&l.append("metadata",s.encodeMetadata(f)),l.append("",n)):typeof FormData<"u"&&n instanceof FormData?(l=n,l.has("cacheControl")||l.append("cacheControl",d.cacheControl),f&&!l.has("metadata")&&l.append("metadata",s.encodeMetadata(f))):(l=n,u["cache-control"]=`max-age=${d.cacheControl}`,u["content-type"]=d.contentType,f&&(u["x-metadata"]=s.toBase64(s.encodeMetadata(f))),(typeof ReadableStream<"u"&&l instanceof ReadableStream||l&&typeof l=="object"&&"pipe"in l&&typeof l.pipe=="function")&&!d.duplex&&(d.duplex="half")),i?.headers)for(const[v,w]of Object.entries(i.headers))u=md(u,v,w);const p=s._removeEmptyFolders(e),y=s._getFinalPath(p),g=await(t=="PUT"?gp:Ln)(s.fetch,`${s.url}/object/${y}`,l,ge({headers:u},d?.duplex?{duplex:d.duplex}:{}));return{path:p,id:g.Id,fullPath:g.Key}})}async upload(t,e,n){return this.uploadOrUpdate("POST",t,e,n)}async uploadToSignedUrl(t,e,n,i){var s=this;const l=s._removeEmptyFolders(t),d=s._getFinalPath(l),u=new URL(s.url+`/object/upload/sign/${d}`);return u.searchParams.set("token",e),s.handleOperation(async()=>{let f;const p=ge(ge({},xw),i);let y=ge(ge({},s.headers),{"x-upsert":String(p.upsert)});const g=p.metadata;if(typeof Blob<"u"&&n instanceof Blob?(f=new FormData,f.append("cacheControl",p.cacheControl),g&&f.append("metadata",s.encodeMetadata(g)),f.append("",n)):typeof FormData<"u"&&n instanceof FormData?(f=n,f.has("cacheControl")||f.append("cacheControl",p.cacheControl),g&&!f.has("metadata")&&f.append("metadata",s.encodeMetadata(g))):(f=n,y["cac
38he-control"]=`max-age=${p.cacheControl}`,y["content-type"]=p.contentType,g&&(y["x-metadata"]=s.toBase64(s.encodeMetadata(g))),(typeof ReadableStream<"u"&&f instanceof ReadableStream||f&&typeof f=="object"&&"pipe"in f&&typeof f.pipe=="function")&&!p.duplex&&(p.duplex="half")),i?.headers)for(const[v,w]of Object.entries(i.headers))y=md(y,v,w);return{path:l,fullPath:(await gp(s.fetch,u.toString(),f,ge({headers:y},p?.duplex?{duplex:p.duplex}:{}))).Key}})}async createSignedUploadUrl(t,e){var n=this;return n.handleOperation(async()=>{let i=n._getFinalPath(t);const s=ge({},n.headers);e?.upsert&&(s["x-upsert"]="true");const l=await Ln(n.fetch,`${n.url}/object/upload/sign/${i}`,{},{headers:s}),d=new URL(n.url+l.url),u=d.searchParams.get("token");if(!u)throw new Fd("No token returned by API");return{signedUrl:d.toString(),path:t,token:u}})}async update(t,e,n){return this.uploadOrUpdate("PUT",t,e,n)}async move(t,e,n){var i=this;return i.handleOperation(async()=>await Ln(i.fetch,`${i.url}/object/move`,{bucketId:i.bucketId,sourceKey:t,destinationKey:e,destinationBucket:n?.destinationBucket},{headers:i.headers}))}async copy(t,e,n){var i=this;return i.handleOperation(async()=>({path:(await Ln(i.fetch,`${i.url}/object/copy`,{bucketId:i.bucketId,sourceKey:t,destinationKey:e,destinationBucket:n?.destinationBucket},{headers:i.headers})).Key}))}async createSignedUrl(t,e,n){var i=this;return i.handleOperation(async()=>{let s=i._getFinalPath(t);const l=typeof n?.transform=="object"&&n.transform!==null&&Object.keys(n.transform).length>0;let d=await Ln(i.fetch,`${i.url}/object/sign/${s}`,ge({expiresIn:e},l?{transform:n.transform}:{}),{headers:i.headers});const u=new URLSearchParams;n?.download&&u.set("download",n.download===!0?"":n.download),n?.cacheNonce!=null&&u.set("cacheNonce",String(n.cacheNonce));const f=u.toString();return{signedUrl:encodeURI(`${i.url}${d.signedURL}${f?`&${f}`:""}`)}})}async createSignedUrls(t,e,n){var i=this;return i.handleOperation(async()=>{const s=await Ln(i.fetch,`${i.url}/object/sign/${i.bucketId}`,{expiresIn:e,paths:t},{headers:i.headers}),l=new URLSearchParams;n?.download&&l.set("download",n.download===!0?"":n.download),n?.cacheNonce!=null&&l.set("cacheNonce",String(n.cacheNonce));const d=l.toString();return s.map(u=>ge(ge({},u),{},{signedUrl:u.signedURL?encodeURI(`${i.url}${u.signedURL}${d?`&${d}`:""}`):null}))})}download(t,e,n){const i=typeof e?.transform=="object"&&e.transform!==null&&Object.keys(e.transform).length>0?"render/image/authenticated":"object",s=new URLSearchParams;e?.transform&&this.applyTransformOptsToQuery(s,e.transform),e?.cacheNonce!=null&&s.set("cacheNonce",String(e.cacheNonce));const l=s.toString(),d=this._getFinalPath(t),u=()=>Jr(this.fetch,`${this.url}/${i}/${d}${l?`?${l}`:""}`,{headers:this.headers,noResolveJson:!0},n);return new eM(u,this.shouldThrowOnError)}async info(t){var e=this;const n=e._getFinalPath(t);return e.handleOperation(async()=>mp(await Jr(e.fetch,`${e.url}/object/info/${n}`,{headers:e.headers})))}async exists(t){var e=this;const n=e._getFinalPath(t);try{return await XI(e.fetch,`${e.url}/object/${n}`,{headers:e.headers}),{data:!0,error:null}}catch(s){if(e.shouldThrowOnError)throw s;if(qd(s)){var i;const l=s instanceof pp?s.status:s instanceof iS?(i=s.originalError)===null||i===void 0?void 0:i.status:void 0;if(l!==void 0&&[400,404].includes(l))return{data:!1,error:s}}throw s}}getPublicUrl(t,e){const n=this._getFinalPath(t),i=new URLSearchParams;e?.download&&i.set("download",e.download===!0?"":e.download),e?.transform&&this.applyTransformOptsToQuery(i,e.transform),e?.cacheNonce!=null&&i.set("cacheNonce",String(e.cacheNonce));const s=i.toString(),l=typeof e?.transform=="object"&&e.transform!==null&&Object.keys(e.transform).length>0?"render/image":"object";return{data:{publicUrl:encodeURI(`${this.url}/${l}/public/${n}`)+(s?`?${s}`:"")}}}async remove(t){var e=this;return e.handleOperation(async()=>await Jp(e.fetch,`${e.url}/object/${e.bucketId}`,{prefixes:t},{headers:e.headers}))}async list(t,e,n){var i=this;return i.handleOperation(async()=>{const s=ge(ge(ge({},tM),e),{},{prefix:t||""});return await Ln(i.fetch,`${i.url}/object/list/${i.bucketId}`,s,{headers:i.headers},n)})}async listV2(t,e){var n=this;return n.handleOperation(async()=>{const i=ge({},t);return await Ln(n.fetch,`${n.url}/object/list-v2/${n.bucketId}`,i,{headers:n.headers},e)})}encodeMetadata(t){return JSON.stringify(t)}toBase64(t){return typeof Buffer<"u"?Buffer.from(t).toString("base64"):btoa(t)}_getFinalPath(t){return`${this.bucketId}/${t.replace(/^\/+/,"")}`}_removeEmptyFolders(t){return t.replace(/^\/|\/$/g,"").replace(/\/+/g,"/")}applyTransformOptsToQuery(t,e){return e.width&&t.set("width",e.width.toString()),e.height&&t.set("height",e.height.toString()),e.resize&&t.set("resize",e.resize),e.format&&t.set("format",e.format),e.quality&&t.set("qual
38ity",e.quality.toString()),t}};const aM="2.107.0",dl={"X-Client-Info":`storage-js/${aM}`};var oM=class extends Os{constructor(t,e={},n,i){const s=new URL(t);i?.useNewHostname&&/supabase\.(co|in|red)$/.test(s.hostname)&&!s.hostname.includes("storage.supabase.")&&(s.hostname=s.hostname.replace("supabase.","storage.supabase."));const l=s.href.replace(/\/$/,""),d=ge(ge({},dl),e);super(l,d,n,"storage")}async listBuckets(t){var e=this;return e.handleOperation(async()=>{const n=e.listBucketOptionsToQueryString(t);return await Jr(e.fetch,`${e.url}/bucket${n}`,{headers:e.headers})})}async getBucket(t){var e=this;return e.handleOperation(async()=>await Jr(e.fetch,`${e.url}/bucket/${t}`,{headers:e.headers}))}async createBucket(t,e={public:!1}){var n=this;return n.handleOperation(async()=>await Ln(n.fetch,`${n.url}/bucket`,{id:t,name:t,type:e.type,public:e.public,file_size_limit:e.fileSizeLimit,allowed_mime_types:e.allowedMimeTypes},{headers:n.headers}))}async updateBucket(t,e){var n=this;return n.handleOperation(async()=>await gp(n.fetch,`${n.url}/bucket/${t}`,{id:t,name:t,public:e.public,file_size_limit:e.fileSizeLimit,allowed_mime_types:e.allowedMimeTypes},{headers:n.headers}))}async emptyBucket(t){var e=this;return e.handleOperation(async()=>await Ln(e.fetch,`${e.url}/bucket/${t}/empty`,{},{headers:e.headers}))}async deleteBucket(t){var e=this;return e.handleOperation(async()=>await Jp(e.fetch,`${e.url}/bucket/${t}`,{},{headers:e.headers}))}listBucketOptionsToQueryString(t){const e={};return t&&("limit"in t&&(e.limit=String(t.limit)),"offset"in t&&(e.offset=String(t.offset)),t.search&&(e.search=t.search),t.sortColumn&&(e.sortColumn=t.sortColumn),t.sortOrder&&(e.sortOrder=t.sortOrder)),Object.keys(e).length>0?"?"+new URLSearchParams(e).toString():""}},iM=class extends Os{constructor(t,e={},n){const i=t.replace(/\/$/,""),s=ge(ge({},dl),e);super(i,s,n,"storage")}async createBucket(t){var e=this;return e.handleOperation(async()=>await Ln(e.fetch,`${e.url}/bucket`,{name:t},{headers:e.headers}))}async listBuckets(t){var e=this;return e.handleOperation(async()=>{const n=new URLSearchParams;t?.limit!==void 0&&n.set("limit",t.limit.toString()),t?.offset!==void 0&&n.set("offset",t.offset.toString()),t?.sortColumn&&n.set("sortColumn",t.sortColumn),t?.sortOrder&&n.set("sortOrder",t.sortOrder),t?.search&&n.set("search",t.search);const i=n.toString(),s=i?`${e.url}/bucket?${i}`:`${e.url}/bucket`;return await Jr(e.fetch,s,{headers:e.headers})})}async deleteBucket(t){var e=this;return e.handleOperation(async()=>await Jp(e.fetch,`${e.url}/bucket/${t}`,{},{headers:e.headers}))}from(t){var e=this;if(!YI(t))throw new Fd("Invalid bucket name: File, folder, and bucket names must follow AWS object key naming guidelines and should avoid the use of any other characters.");const n=new BI({baseUrl:this.url,catalogName:t,auth:{type:"custom",getHeaders:async()=>e.headers},fetch:this.fetch}),i=this.shouldThrowOnError;return new Proxy(n,{get(s,l){const d=s[l];return typeof d!="function"?d:async(...u)=>{try{return{data:await d.apply(s,u),error:null}}catch(f){if(i)throw f;return{data:null,error:f}}}}})}},sM=class extends Os{constructor(t,e={},n){const i=t.replace(/\/$/,""),s=ge(ge({},dl),{},{"Content-Type":"application/json"},e);super(i,s,n,"vectors")}async createIndex(t){var e=this;return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/CreateIndex`,t,{headers:e.headers})||{})}async getIndex(t,e){var n=this;return n.handleOperation(async()=>await mn.post(n.fetch,`${n.url}/GetIndex`,{vectorBucketName:t,indexName:e},{headers:n.headers}))}async listIndexes(t){var e=this;return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/ListIndexes`,t,{headers:e.headers}))}async deleteIndex(t,e){var n=this;return n.handleOperation(async()=>await mn.post(n.fetch,`${n.url}/DeleteIndex`,{vectorBucketName:t,indexName:e},{headers:n.headers})||{})}},rM=class extends Os{constructor(t,e={},n){const i=t.replace(/\/$/,""),s=ge(ge({},dl),{},{"Content-Type":"application/json"},e);super(i,s,n,"vectors")}async putVectors(t){var e=this;if(t.vectors.length<1||t.vectors.length>500)throw new Error("Vector batch size must be between 1 and 500 items");return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/PutVectors`,t,{headers:e.headers})||{})}async getVectors(t){var e=this;return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/GetVectors`,t,{headers:e.headers}))}async listVectors(t){var e=this;if(t.segmentCount!==void 0){if(t.segmentCount<1||t.segmentCount>16)throw new Error("segmentCount must be between 1 and 16");
38if(t.segmentIndex!==void 0&&(t.segmentIndex<0||t.segmentIndex>=t.segmentCount))throw new Error(`segmentIndex must be between 0 and ${t.segmentCount-1}`)}return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/ListVectors`,t,{headers:e.headers}))}async queryVectors(t){var e=this;return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/QueryVectors`,t,{headers:e.headers}))}async deleteVectors(t){var e=this;if(t.keys.length<1||t.keys.length>500)throw new Error("Keys batch size must be between 1 and 500 items");return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/DeleteVectors`,t,{headers:e.headers})||{})}},lM=class extends Os{constructor(t,e={},n){const i=t.replace(/\/$/,""),s=ge(ge({},dl),{},{"Content-Type":"application/json"},e);super(i,s,n,"vectors")}async createBucket(t){var e=this;return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/CreateVectorBucket`,{vectorBucketName:t},{headers:e.headers})||{})}async getBucket(t){var e=this;return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/GetVectorBucket`,{vectorBucketName:t},{headers:e.headers}))}async listBuckets(t={}){var e=this;return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/ListVectorBuckets`,t,{headers:e.headers}))}async deleteBucket(t){var e=this;return e.handleOperation(async()=>await mn.post(e.fetch,`${e.url}/DeleteVectorBucket`,{vectorBucketName:t},{headers:e.headers})||{})}},cM=class extends lM{constructor(t,e={}){super(t,e.headers||{},e.fetch)}from(t){return new dM(this.url,this.headers,t,this.fetch)}async createBucket(t){var e=()=>super.createBucket,n=this;return e().call(n,t)}async getBucket(t){var e=()=>super.getBucket,n=this;return e().call(n,t)}async listBuckets(t={}){var e=()=>super.listBuckets,n=this;return e().call(n,t)}async deleteBucket(t){var e=()=>super.deleteBucket,n=this;return e().call(n,t)}},dM=class extends sM{constructor(t,e,n,i){super(t,e,i),this.vectorBucketName=n}async createIndex(t){var e=()=>super.createIndex,n=this;return e().call(n,ge(ge({},t),{},{vectorBucketName:n.vectorBucketName}))}async listIndexes(t={}){var e=()=>super.listIndexes,n=this;return e().call(n,ge(ge({},t),{},{vectorBucketName:n.vectorBucketName}))}async getIndex(t){var e=()=>super.getIndex,n=this;return e().call(n,n.vectorBucketName,t)}async deleteIndex(t){var e=()=>super.deleteIndex,n=this;return e().call(n,n.vectorBucketName,t)}index(t){return new uM(this.url,this.headers,this.vectorBucketName,t,this.fetch)}},uM=class extends rM{constructor(t,e,n,i,s){super(t,e,s),this.vectorBucketName=n,this.indexName=i}async putVectors(t){var e=()=>super.putVectors,n=this;return e().call(n,ge(ge({},t),{},{vectorBucketName:n.vectorBucketName,indexName:n.indexName}))}async getVectors(t){var e=()=>super.getVectors,n=this;return e().call(n,ge(ge({},t),{},{vectorBucketName:n.vectorBucketName,indexName:n.indexName}))}async listVectors(t={}){var e=()=>super.listVectors,n=this;return e().call(n,ge(ge({},t),{},{vectorBucketName:n.vectorBucketName,indexName:n.indexName}))}async queryVectors(t){var e=()=>super.queryVectors,n=this;return e().call(n,ge(ge({},t),{},{vectorBucketName:n.vectorBucketName,indexName:n.indexName}))}async deleteVectors(t){var e=()=>super.deleteVectors,n=this;return e().call(n,ge(ge({},t),{},{vectorBucketName:n.vectorBucketName,indexName:n.indexName}))}},hM=class extends oM{constructor(t,e={},n,i){super(t,e,n,i)}from(t){return new nM(this.url,this.headers,t,this.fetch)}get vectors(){return new cM(this.url+"/vector",{headers:this.headers,fetch:this.fetch})}get analytics(){return new iM(this.url+"/iceberg",this.headers,this.fetch)}};const cS="2.107.0",io=30*1e3,jr=3,Tf=jr*io,fM="http://localhost:9999",pM="supabase.auth.token",mM={"X-Client-Info":`gotrue-js/${cS}`},yp="X-Supabase-Api-Version",dS={"2024-01-01":{timestamp:Date.parse("2024-01-01T00:00:00.0Z"),name:"2024-01-01"}},gM=/^([a-z0-9_-]{4})*($|[a-z0-9_-]{3}$|[a-z0-9_-]{2}$)$/i,yM=600*1e3;class el extends Error{constructor(e,n,i){super(e),this.__isAuthError=!0,this.name="AuthError",this.status=n,this.code=i}toJSON(){return{name:this.name,message:this.message,status:this.status,code:this.code}}}function J(t){return typeof t=="object"&&t!==null&&"__isAuthError"in t}class bM extends el{constructor(e,n,i){super(e,n,i),this.name="AuthApiError",this.status=n,this.code=i}
38}function vM(t){return J(t)&&t.name==="AuthApiError"}class Un extends el{constructor(e,n){super(e),this.name="AuthUnknownError",this.originalError=n}}class Qn extends el{constructor(e,n,i,s){super(e,i,s),this.name=n,this.status=i}}class Et extends Qn{constructor(){super("Auth session missing!","AuthSessionMissingError",400,void 0)}}function Fc(t){return J(t)&&t.name==="AuthSessionMissingError"}class as extends Qn{constructor(){super("Auth session or user missing","AuthInvalidTokenResponseError",500,void 0)}}class qc extends Qn{constructor(e){super(e,"AuthInvalidCredentialsError",400,void 0)}}class Bc extends Qn{constructor(e,n=null){super(e,"AuthImplicitGrantRedirectError",500,void 0),this.details=null,this.details=n}toJSON(){return Object.assign(Object.assign({},super.toJSON()),{details:this.details})}}function wM(t){return J(t)&&t.name==="AuthImplicitGrantRedirectError"}class kw extends Qn{constructor(e,n=null){super(e,"AuthPKCEGrantCodeExchangeError",500,void 0),this.details=null,this.details=n}toJSON(){return Object.assign(Object.assign({},super.toJSON()),{details:this.details})}}class xM extends Qn{constructor(){super("PKCE code verifier not found in storage. This can happen if the auth flow was initiated in a different browser or device, or if the storage was cleared. For SSR frameworks (Next.js, SvelteKit, etc.), use @supabase/ssr on both the server and client to store the code verifier in cookies.","AuthPKCECodeVerifierMissingError",400,"pkce_code_verifier_not_found")}}class bp extends Qn{constructor(e,n){super(e,"AuthRetryableFetchError",n,void 0)}}function Rf(t){return J(t)&&t.name==="AuthRetryableFetchError"}class Sw extends Qn{constructor(e="Refresh result discarded: session state changed mid-flight (e.g., concurrent signOut)"){super(e,"AuthRefreshDiscardedError",409,void 0)}}function kM(t){return J(t)&&t.name==="AuthRefreshDiscardedError"}class _w extends Qn{constructor(e,n,i){super(e,"AuthWeakPasswordError",n,"weak_password"),this.reasons=i}toJSON(){return Object.assign(Object.assign({},super.toJSON()),{reasons:this.reasons})}}class gd extends Qn{constructor(e){super(e,"AuthInvalidJwtError",400,"invalid_jwt")}}const yd="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".split(""),Cw=` 39\r=`.split(""),SM=(()=>{const t=new Array(128);for(let e=0;e<t.length;e+=1)t[e]=-1;for(let e=0;e<Cw.length;e+=1)t[Cw[e].charCodeAt(0)]=-2;for(let e=0;e<yd.length;e+=1)t[yd[e].charCodeAt(0)]=e;return t})();function Aw(t,e,n){if(t!==null)for(e.queue=e.queue<<8|t,e.queuedBits+=8;e.queuedBits>=6;){const i=e.queue>>e.queuedBits-6&63;n(yd[i]),e.queuedBits-=6}else if(e.queuedBits>0)for(e.queue=e.queue<<6-e.queuedBits,e.queuedBits=6;e.queuedBits>=6;){const i=e.queue>>e.queuedBits-6&63;n(yd[i]),e.queuedBits-=6}}function uS(t,e,n){const i=SM[t];if(i>-1)for(e.queue=e.queue<<6|i,e.queuedBits+=6;e.queuedBits>=8;)n(e.queue>>e.queuedBits-8&255),e.queuedBits-=8;else{if(i===-2)return;throw new Error(`Invalid Base64-URL character "${String.fromCharCode(t)}"`)}}function Tw(t){const e=[],n=d=>{e.push(String.fromCodePoint(d))},i={utf8seq:0,codepoint:0},s={queue:0,queuedBits:0},l=d=>{AM(d,i,n)};for(let d=0;d<t.length;d+=1)uS(t.charCodeAt(d),s,l);return e.join("")}function _M(t,e){if(t<=127){e(t);return}else if(t<=2047){e(192|t>>6),e(128|t&63);return}else if(t<=65535){e(224|t>>12),e(128|t>>6&63),e(128|t&63);return}else if(t<=1114111){e(240|t>>18),e(128|t>>12&63),e(128|t>>6&63),e(128|t&63);return}throw new Error(`Unrecognized Unicode codepoint: ${t.toString(16)}`)}function CM(t,e){for(let n=0;n<t.length;n+=1){let i=t.charCodeAt(n);if(i>55295&&i<=56319){const s=(i-55296)*1024&65535;i=(t.charCodeAt(n+1)-56320&65535|s)+65536,n+=1}_M(i,e)}}function AM(t,e,n){if(e.utf8seq===0){if(t<=127){n(t);return}for(let i=1;i<6;i+=1)if((t>>7-i&1)===0){e.utf8seq=i;break}if(e.utf8seq===2)e.codepoint=t&31;else if(e.utf8seq===3)e.codepoint=t&15;else if(e.utf8seq===4)e.codepoint=t&7;else throw new Error("Invalid UTF-8 sequence");e.utf8seq-=1}else if(e.utf8seq>0){if(t<=127)throw new Error("Invalid UTF-8 sequence");e.codepoint=e.codepoint<<6|t&63,e.utf8seq-=1,e.utf8seq===0&&n(e.codepoint)}}function ws(t){const e=[],n={queue:0,queuedBits:0},i=s=>{e.push(s)};for(let s=0;s<t.length;s+=1)uS(t.charCodeAt(s),n,i);return new Uint8Array(e)}function TM(t){const e=[];return CM(t,n=>e.push(n)),new Uint8Array(e)}function Jo(t){const e=[],n={queue:0,queuedBits:0},i=s=>{e.push(s)};return t.forEach(s=>Aw(s,n,i)),Aw(null,n,i),e.join("")}function RM(t){return Math.round(Date.now()/1e3)+t}function EM(){return Symbol("auth-callback")}const zt=()=>typeof window<"u"&&typeof document<"u",Yo={tested:!1,writable:!1},hS=()=>
39{if(!zt())return!1;try{if(typeof globalThis.localStorage!="object")return!1}catch{return!1}if(Yo.tested)return Yo.writable;const t=`lswt-${Math.random()}${Math.random()}`;try{globalThis.localStorage.setItem(t,t),globalThis.localStorage.removeItem(t),Yo.tested=!0,Yo.writable=!0}catch{Yo.tested=!0,Yo.writable=!1}return Yo.writable};function OM(t){const e={},n=new URL(t);if(n.hash&&n.hash[0]==="#")try{new URLSearchParams(n.hash.substring(1)).forEach((s,l)=>{e[l]=s})}catch{}return n.searchParams.forEach((i,s)=>{e[s]=i}),e}const fS=t=>t?(...e)=>t(...e):(...e)=>fetch(...e),IM=t=>typeof t=="object"&&t!==null&&"status"in t&&"ok"in t&&"json"in t&&typeof t.json=="function",hs=async(t,e,n)=>{await t.setItem(e,JSON.stringify(n))},wa=async(t,e)=>{const n=await t.getItem(e);if(!n)return null;try{return JSON.parse(n)}catch{return null}},St=async(t,e)=>{await t.removeItem(e)};class Bd{constructor(){this.promise=new Bd.promiseConstructor((e,n)=>{this.resolve=e,this.reject=n})}}Bd.promiseConstructor=Promise;function zc(t){const e=t.split(".");if(e.length!==3)throw new gd("Invalid JWT structure");for(let i=0;i<e.length;i++)if(!gM.test(e[i]))throw new gd("JWT not in base64url format");return{header:JSON.parse(Tw(e[0])),payload:JSON.parse(Tw(e[1])),signature:ws(e[2]),raw:{header:e[0],payload:e[1]}}}async function MM(t){return await new Promise(e=>{setTimeout(()=>e(null),t)})}function PM(t,e){return new Promise((i,s)=>{(async()=>{for(let l=0;l<1/0;l++)try{const d=await t(l);if(!e(l,null,d)){i(d);return}}catch(d){if(!e(l,d)){s(d);return}}})()})}function DM(t){return("0"+t.toString(16)).substr(-2)}function LM(){const e=new Uint32Array(56);if(typeof crypto>"u"){const n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~",i=n.length;let s="";for(let l=0;l<56;l++)s+=n.charAt(Math.floor(Math.random()*i));return s}return crypto.getRandomValues(e),Array.from(e,DM).join("")}async function NM(t){const n=new TextEncoder().encode(t),i=await crypto.subtle.digest("SHA-256",n),s=new Uint8Array(i);return Array.from(s).map(l=>String.fromCharCode(l)).join("")}async function UM(t){if(!(typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof TextEncoder<"u"))return console.warn("WebCrypto API is not supported. Code challenge method will default to use plain instead of sha256."),t;const n=await NM(t);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function os(t,e,n=!1){const i=LM();let s=i;n&&(s+="/recovery"),await hs(t,`${e}-code-verifier`,s);const l=await UM(i);return[l,i===l?"plain":"s256"]}const jM=/^2[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$/i;function FM(t){const e=t.headers.get(yp);if(!e||!e.match(jM))return null;try{return new Date(`${e}T00:00:00.0Z`)}catch{return null}}function qM(t){if(!t)throw new Error("Missing exp claim");const e=Math.floor(Date.now()/1e3);if(t<=e)throw new Error("JWT has expired")}function BM(t){switch(t){case"RS256":return{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}};case"ES256":return{name:"ECDSA",namedCurve:"P-256",hash:{name:"SHA-256"}};default:throw new Error("Invalid alg claim")}}const zM=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;function xa(t){if(!zM.test(t))throw new Error("@supabase/auth-js: Expected parameter to be UUID but is not")}function Dn(t){if(!t.passkey)throw new Error("@supabase/auth-js: the passkey API is experimental and disabled by default. Enable it by passing `auth: { experimental: { passkey: true } }` to createClient (or to the GoTrueClient constructor).")}function Ef(){const t={};return new Proxy(t,{get:(e,n)=>{if(n==="__isUserNotAvailableProxy")return!0;if(typeof n=="symbol"){const i=n.toString();if(i==="Symbol(Symbol.toPrimitive)"||i==="Symbol(Symbol.toStringTag)"||i==="Symbol(util.inspect.custom)")return}throw new Error(`@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Accessing the "${n}" property of the session object is not supported. Please use getUser() instead.`)},set:(e,n)=>{throw new Error(`@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Setting the "${n}" property of the session object is not supported. Please use getUser() to fetch a user object you can manipulate.`)},deleteProperty:(e,n)=>{throw new Error(`@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Deleting the "${n}" property of the session object is not supported. Please use getUser() to fetch a user object you can manipulate.`)}})}function HM(t,e){return new Proxy(t,{get:(n,i,s)=>{if(i==="__isInsecureUserWarningProxy")return!0;
39if(typeof i=="symbol"){const l=i.toString();if(l==="Symbol(Symbol.toPrimitive)"||l==="Symbol(Symbol.toStringTag)"||l==="Symbol(util.inspect.custom)"||l==="Symbol(nodejs.util.inspect.custom)")return Reflect.get(n,i,s)}return!e.value&&typeof i=="string"&&(console.warn("Using the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server."),e.value=!0),Reflect.get(n,i,s)}})}function Rw(t){return JSON.parse(JSON.stringify(t))}const Zo=t=>{if(typeof t=="object"&&t!==null){const e=t;if(typeof e.msg=="string")return e.msg;if(typeof e.message=="string")return e.message;if(typeof e.error_description=="string")return e.error_description;if(typeof e.error=="string")return e.error}return JSON.stringify(t)},GM=[502,503,504,520,521,522,523,524,530];async function Ew(t){var e;if(!IM(t))throw new bp(Zo(t),0);if(GM.includes(t.status))throw new bp(Zo(t),t.status);let n;try{n=await t.json()}catch(l){throw new Un(Zo(l),l)}let i;const s=FM(t);if(s&&s.getTime()>=dS["2024-01-01"].timestamp&&typeof n=="object"&&n&&typeof n.code=="string"?i=n.code:typeof n=="object"&&n&&typeof n.error_code=="string"&&(i=n.error_code),i){if(i==="weak_password")throw new _w(Zo(n),t.status,((e=n.weak_password)===null||e===void 0?void 0:e.reasons)||[]);if(i==="session_not_found")throw new Et}else if(typeof n=="object"&&n&&typeof n.weak_password=="object"&&n.weak_password&&Array.isArray(n.weak_password.reasons)&&n.weak_password.reasons.length&&n.weak_password.reasons.reduce((l,d)=>l&&typeof d=="string",!0))throw new _w(Zo(n),t.status,n.weak_password.reasons);throw new bM(Zo(n),t.status||500,i)}const WM=(t,e,n,i)=>{const s={method:t,headers:e?.headers||{}};return t==="GET"?s:(s.headers=Object.assign({"Content-Type":"application/json;charset=UTF-8"},e?.headers),s.body=JSON.stringify(i),Object.assign(Object.assign({},s),n))};async function re(t,e,n,i){var s;const l=Object.assign({},i?.headers);l[yp]||(l[yp]=dS["2024-01-01"].name),i?.jwt&&(l.Authorization=`Bearer ${i.jwt}`);const d=(s=i?.query)!==null&&s!==void 0?s:{};i?.redirectTo&&(d.redirect_to=i.redirectTo);const u=Object.keys(d).length?"?"+new URLSearchParams(d).toString():"",f=await $M(t,e,n+u,{headers:l,noResolveJson:i?.noResolveJson},{},i?.body);return i?.xform?i?.xform(f):{data:Object.assign({},f),error:null}}async function $M(t,e,n,i,s,l){const d=WM(e,i,s,l);let u;try{u=await t(n,Object.assign({},d))}catch(f){throw console.error(f),new bp(Zo(f),0)}if(u.ok||await Ew(u),i?.noResolveJson)return u;try{return await u.json()}catch(f){await Ew(f)}}function Rn(t){var e;let n=null;KM(t)&&(n=Object.assign({},t),t.expires_at||(n.expires_at=RM(t.expires_in)));const i=(e=t.user)!==null&&e!==void 0?e:typeof t?.id=="string"?t:null;return{data:{session:n,user:i},error:null}}function Ow(t){const e=Rn(t);return!e.error&&t.weak_password&&typeof t.weak_password=="object"&&Array.isArray(t.weak_password.reasons)&&t.weak_password.reasons.length&&t.weak_password.message&&typeof t.weak_password.message=="string"&&t.weak_password.reasons.reduce((n,i)=>n&&typeof i=="string",!0)&&(e.data.weak_password=t.weak_password),e}function ho(t){var e;return{data:{user:(e=t.user)!==null&&e!==void 0?e:t},error:null}}function VM(t){return{data:t,error:null}}function YM(t){const{action_link:e,email_otp:n,hashed_token:i,redirect_to:s,verification_type:l}=t,d=Es(t,["action_link","email_otp","hashed_token","redirect_to","verification_type"]),u={action_link:e,email_otp:n,hashed_token:i,redirect_to:s,verification_type:l},f=Object.assign({},d);return{data:{properties:u,user:f},error:null}}function Iw(t){return t}function KM(t){return!!t.access_token&&!!t.refresh_token&&!!t.expires_in}const Of=["global","local","others"];class ZM{constructor({url:e="",headers:n={},fetch:i,experimental:s}){this.url=e,this.headers=n,this.fetch=fS(i),this.experimental=s??{},this.mfa={listFactors:this._listFactors.bind(this),deleteFactor:this._deleteFactor.bind(this)},this.oauth={listClients:this._listOAuthClients.bind(this),createClient:this._createOAuthClient.bind(this),getClient:this._getOAuthClient.bind(this),updateClient:this._updateOAuthClient.bind(this),deleteClient:this._deleteOAuthClient.bind(this),regenerateClientSecret:this._regenerateOAuthClientSecret.bind(this)},this.customProviders={listProviders:this._listCustomProviders.bind(this),createProvider:this._createCustomProvider.bind(this),getProvider:this._getCustomProvider.bind(this),updateProvider:this._updateCustomProvider.bind(this),deleteProvider:this._deleteCustomProvider.bind(this)},this.passkey={listPasskeys:this._adminListPasskeys.bind(this),deletePasskey:this._adminDeletePasskey.bind(this)}}async signOut(e,n=Of[0]){if(Of.indexOf(n)<0)throw new Error(`@supabase/auth-js: Parameter scope must be one of ${Of.join(", ")}`);try{return await re(this.fetch,"POST",`${this.url}/logout?scope=${n}`,{headers:this.headers,jwt:e,noResolveJson:!0}),{data:null,error:null}}catch(i){if(J(i))return{data:null,error:i};throw i}}async inviteUserByEmail(e,n={}){try{return await re(this.fetch,"POST",`${this.url}/invite`,{body:{email:e,data:n.data},headers:this.headers,redirectTo:n.redirectTo,xform:ho})}catch(i){if(J(i))return{data:{user:null},error:i};throw i}}async generateLink(e){try{const{options:n}=e,i=Es(e,["options"]),s=Object.assign(Object.assign({},i),n);return"newEmail"in i&&(s.new_email=i?.newEmail,delete s.newEmail),await re(this.fetch,"POST",`${this.url}/admin/generate_link`,{body:s,headers:this.headers,xform:YM,redirectTo:n?.redirectTo})}catch(n){if(J(n))return{data:{properties:null,user:null},error:n};throw n}}async createUser(e){try{return await re(this.fetch,"POST",`${this.url}/admin/users`,{body:e,headers:this.headers,xform:ho})}catch(n){if(J(n))return{data:{user:null},error:n};throw n}}async listUsers(e){var n,i,s,l,d,u,f;try{const p={nextPage:null,lastPage:0,total:0},y=await re(this.fetch,"GET",`${this.url}/admin/users`,{headers:this.headers,noResolveJson:!0,query:{page:(i=(n=e?.page)===null||n===void 0?void 0:n.toString())!==null&&i!==void 0?i:"",per_page:(l=(s=e?.perPage)===null||s===void 0?void 0:s.toString())!==null&&l!==void 0?l:""},xform:Iw});if(y.error)throw y.error;const g=await y.json(),v=(d=y.headers.get("x-total-count"))!==null&&d!==void 0?d:0,w=(f=(u=y.headers.get("link"))===null||u===void 0?void 0:u.split(","))!==null&&f!==void 0?f:[];return w.length>0&&(w.forEach(x=>{const k=parseInt(x.split(";")[0].split("=")[1].substring(0,1)),S=JSON.parse(x.split(";")[1].split("=")[1]);p[`${S}Page`]=k}),p.total=parseInt(v)),{data:Object.assign(Object.assign({},g),p),error:null}}catch(p){if(J(p))return{data:{users:[]},error:p};throw p}}async getUserById(e){xa(e);try{return await re(this.fetch,"GET",`${this.url}/admin/users/${e}`,{headers:this.headers,xform:ho})}catch(n){if(J(n))return{data:{user:null},error:n};throw n}}async updateUserById(e,n){xa(e);try{return await re(this.fetch,"PUT",`${this.url}/admin/users/${e}`,{body:n,headers:this.headers,xform:ho})}catch(i){if(J(i))return{data:{user:null},error:i};throw i}}async deleteUser(e,n=!1){xa(e);
39try{return await re(this.fetch,"DELETE",`${this.url}/admin/users/${e}`,{headers:this.headers,body:{should_soft_delete:n},xform:ho})}catch(i){if(J(i))return{data:{user:null},error:i};throw i}}async _listFactors(e){xa(e.userId);try{const{data:n,error:i}=await re(this.fetch,"GET",`${this.url}/admin/users/${e.userId}/factors`,{headers:this.headers,xform:s=>({data:{factors:s},error:null})});return{data:n,error:i}}catch(n){if(J(n))return{data:null,error:n};throw n}}async _deleteFactor(e){xa(e.userId),xa(e.id);try{return{data:await re(this.fetch,"DELETE",`${this.url}/admin/users/${e.userId}/factors/${e.id}`,{headers:this.headers}),error:null}}catch(n){if(J(n))return{data:null,error:n};throw n}}async _listOAuthClients(e){var n,i,s,l,d,u,f;try{const p={nextPage:null,lastPage:0,total:0},y=await re(this.fetch,"GET",`${this.url}/admin/oauth/clients`,{headers:this.headers,noResolveJson:!0,query:{page:(i=(n=e?.page)===null||n===void 0?void 0:n.toString())!==null&&i!==void 0?i:"",per_page:(l=(s=e?.perPage)===null||s===void 0?void 0:s.toString())!==null&&l!==void 0?l:""},xform:Iw});if(y.error)throw y.error;const g=await y.json(),v=(d=y.headers.get("x-total-count"))!==null&&d!==void 0?d:0,w=(f=(u=y.headers.get("link"))===null||u===void 0?void 0:u.split(","))!==null&&f!==void 0?f:[];return w.length>0&&(w.forEach(x=>{const k=parseInt(x.split(";")[0].split("=")[1].substring(0,1)),S=JSON.parse(x.split(";")[1].split("=")[1]);p[`${S}Page`]=k}),p.total=parseInt(v)),{data:Object.assign(Object.assign({},g),p),error:null}}catch(p){if(J(p))return{data:{clients:[]},error:p};throw p}}async _createOAuthClient(e){try{return await re(this.fetch,"POST",`${this.url}/admin/oauth/clients`,{body:e,headers:this.headers,xform:n=>({data:n,error:null})})}catch(n){if(J(n))return{data:null,error:n};throw n}}async _getOAuthClient(e){try{return await re(this.fetch,"GET",`${this.url}/admin/oauth/clients/${e}`,{headers:this.headers,xform:n=>({data:n,error:null})})}catch(n){if(J(n))return{data:null,error:n};throw n}}async _updateOAuthClient(e,n){try{return await re(this.fetch,"PUT",`${this.url}/admin/oauth/clients/${e}`,{body:n,headers:this.headers,xform:i=>({data:i,error:null})})}catch(i){if(J(i))return{data:null,error:i};throw i}}async _deleteOAuthClient(e){try{return await re(this.fetch,"DELETE",`${this.url}/admin/oauth/clients/${e}`,{headers:this.headers,noResolveJson:!0}),{data:null,error:null}}catch(n){if(J(n))return{data:null,error:n};throw n}}async _regenerateOAuthClientSecret(e){try{return await re(this.fetch,"POST",`${this.url}/admin/oauth/clients/${e}/regenerate_secret`,{headers:this.headers,xform:n=>({data:n,error:null})})}catch(n){if(J(n))return{data:null,error:n};throw n}}async _listCustomProviders(e){try{const n={};return e?.type&&(n.type=e.type),await re(this.fetch,"GET",`${this.url}/admin/custom-providers`,{headers:this.headers,query:n,xform:i=>{var s;return{data:{providers:(s=i?.providers)!==null&&s!==void 0?s:[]},error:null}}})}catch(n){if(J(n))return{data:{providers:[]},error:n};throw n}}async _createCustomProvider(e){try{return await re(this.fetch,"POST",`${this.url}/admin/custom-providers`,{body:e,headers:this.headers,xform:n=>({data:n,error:null})})}catch(n){if(J(n))return{data:null,error:n};throw n}}async _getCustomProvider(e){try{return await re(this.fetch,"GET",`${this.url}/admin/custom-providers/${e}`,{headers:this.headers,xform:n=>({data:n,error:null})})}catch(n){if(J(n))return{data:null,error:n};throw n}}async _updateCustomProvider(e,n){try{return await re(this.fetch,"PUT",`${this.url}/admin/custom-providers/${e}`,{body:n,headers:this.headers,xform:i=>({data:i,error:null})})}catch(i){if(J(i))return{data:null,error:i};throw i}}async _deleteCustomProvider(e){try{return await re(this.fetch,"DELETE",`${this.url}/admin/custom-providers/${e}`,{headers:this.headers,noResolveJson:!0}),{data:null,error:null}}catch(n){if(J(n))return{data:null,error:n};throw n}}async _adminListPasskeys(e){Dn(this.experimental),xa(e.userId);try{return await re(this.fetch,"GET",`${this.url}/admin/users/${e.userId}/passkeys`,{headers:this.headers,xform:n=>({data:n,error:null})})}catch(n){if(J(n))return{data:null,error:n};throw n}}async _adminDeletePasskey(e){Dn(this.experimental),xa(e.userId),xa(e.passkeyId);
39try{return await re(this.fetch,"DELETE",`${this.url}/admin/users/${e.userId}/passkeys/${e.passkeyId}`,{headers:this.headers,noResolveJson:!0}),{data:null,error:null}}catch(n){if(J(n))return{data:null,error:n};throw n}}}function Mw(t={}){return{getItem:e=>t[e]||null,setItem:(e,n)=>{t[e]=n},removeItem:e=>{delete t[e]}}}globalThis&&hS()&&globalThis.localStorage&&globalThis.localStorage.getItem("supabase.gotrue-js.locks.debug");class QM extends Error{constructor(e){super(e),this.isAcquireTimeout=!0}}function XM(){if(typeof globalThis!="object")try{Object.defineProperty(Object.prototype,"__magic__",{get:function(){return this},configurable:!0}),__magic__.globalThis=__magic__,delete Object.prototype.__magic__}catch{typeof self<"u"&&(self.globalThis=self)}}function pS(t){if(!/^0x[a-fA-F0-9]{40}$/.test(t))throw new Error(`@supabase/auth-js: Address "${t}" is invalid.`);return t.toLowerCase()}function JM(t){return parseInt(t,16)}function e4(t){const e=new TextEncoder().encode(t);return"0x"+Array.from(e,i=>i.toString(16).padStart(2,"0")).join("")}function t4(t){var e;const{chainId:n,domain:i,expirationTime:s,issuedAt:l=new Date,nonce:d,notBefore:u,requestId:f,resources:p,scheme:y,uri:g,version:v}=t;{if(!Number.isInteger(n))throw new Error(`@supabase/auth-js: Invalid SIWE message field "chainId". Chain ID must be a EIP-155 chain ID. Provided value: ${n}`);if(!i)throw new Error('@supabase/auth-js: Invalid SIWE message field "domain". Domain must be provided.');if(d&&d.length<8)throw new Error(`@supabase/auth-js: Invalid SIWE message field "nonce". Nonce must be at least 8 characters. Provided value: ${d}`);if(!g)throw new Error('@supabase/auth-js: Invalid SIWE message field "uri". URI must be provided.');if(v!=="1")throw new Error(`@supabase/auth-js: Invalid SIWE message field "version". Version must be '1'. Provided value: ${v}`);if(!((e=t.statement)===null||e===void 0)&&e.includes(` 40`))throw new Error(`@supabase/auth-js: Invalid SIWE message field "statement". Statement must not include '\\n'. Provided value: ${t.statement}`)}const w=pS(t.address),x=y?`${y}://${i}`:i,k=t.statement?`${t.statement} 41`:"",S=`${x} wants you to sign in with your Ethereum account: 42${w} 43 44${k}`;let C=`URI: ${g} 45Version: ${v} 46Chain ID: ${n}${d?` 47Nonce: ${d}`:""} 48Issued At: ${l.toISOString()}`;if(s&&(C+=` 49Expiration Time: ${s.toISOString()}`),u&&(C+=` 50Not Before: ${u.toISOString()}`),f&&(C+=` 51Request ID: ${f}`),p){let E=` 52Resources:`;for(const R of p){if(!R||typeof R!="string")throw new Error(`@supabase/auth-js: Invalid SIWE message field "resources". Every resource must be a valid string. Provided value: ${R}`);E+=` 53- ${R}`}C+=E}return`${S} 54${C}`}class yt extends Error{constructor({message:e,code:n,cause:i,name:s}){var l;super(e,{cause:i}),this.__isWebAuthnError=!0,this.name=(l=s??(i instanceof Error?i.name:void 0))!==null&&l!==void 0?l:"Unknown Error",this.code=n}toJSON(){return{name:this.name,message:this.message,code:this.code}}}class bd extends yt{constructor(e,n){super({code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:n,message:e}),this.name="WebAuthnUnknownError",this.originalError=n}}function n4({error:t,options:e}){var n,i,s;const{publicKey:l}=e;if(!l)throw Error("options was missing required publicKey property");if(t.name==="AbortError"){if(e.signal instanceof AbortSignal)return new yt({message:"Registration ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:t})}else if(t.name==="ConstraintError"){if(((n=l.authenticatorSelection)===null||n===void 0?void 0:n.requireResidentKey)===!0)return new yt({message:"Discoverable credentials were required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT",cause:t});if(e.mediation==="conditional"&&((i=l.authenticatorSelection)===null||i===void 0?void 0:i.userVerification)==="required")return new yt({message:"User verification was required during automatic registration but it could not be performed",code:"ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE",cause:t});if(((s=l.authenticatorSelection)===null||s===void 0?void 0:s.userVerification)==="required")return new yt({message:"User verification was required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT",cause:t})}else{if(t.name==="InvalidStateError")return new yt({message:"The authenticator was previously registered",code:"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED",cause:t});if(t.name==="NotAllowedError")return new yt({message:t.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:t});if(t.name==="NotSupportedError")return l.pubKeyCredParams.filter(u=>u.type==="public-key").length===0?new yt({message:'No entry in pubKeyCredParams was of type "public-key"',code:"ERROR_MALFORMED_PUBKEYCREDPARAMS",cause:t}):new yt({message:"No available authenticator supported any of the specified pubKeyCredParams algorithms",code:"ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG",cause:t});if(t.name==="SecurityError"){const d=window.location.hostname;if(mS(d)){if(l.rp.id!==d)return new yt({message:`The RP ID "${l.rp.id}
54" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:t})}else return new yt({message:`${window.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:t})}else if(t.name==="TypeError"){if(l.user.id.byteLength<1||l.user.id.byteLength>64)return new yt({message:"User ID was not between 1 and 64 characters",code:"ERROR_INVALID_USER_ID_LENGTH",cause:t})}else if(t.name==="UnknownError")return new yt({message:"The authenticator was unable to process the specified options, or could not create a new credential",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:t})}return new yt({message:"a Non-Webauthn related error has occurred",code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:t})}function a4({error:t,options:e}){const{publicKey:n}=e;if(!n)throw Error("options was missing required publicKey property");if(t.name==="AbortError"){if(e.signal instanceof AbortSignal)return new yt({message:"Authentication ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:t})}else{if(t.name==="NotAllowedError")return new yt({message:t.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:t});if(t.name==="SecurityError"){const i=window.location.hostname;if(mS(i)){if(n.rpId!==i)return new yt({message:`The RP ID "${n.rpId}" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:t})}else return new yt({message:`${window.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:t})}else if(t.name==="UnknownError")return new yt({message:"The authenticator was unable to process the specified options, or could not create a new assertion signature",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:t})}return new yt({message:"a Non-Webauthn related error has occurred",code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:t})}class o4{createNewAbortSignal(){if(this.controller){const n=new Error("Cancelling existing WebAuthn API call for new one");n.name="AbortError",this.controller.abort(n)}const e=new AbortController;return this.controller=e,e.signal}cancelCeremony(){if(this.controller){const e=new Error("Manually cancelling existing WebAuthn API call");e.name="AbortError",this.controller.abort(e),this.controller=void 0}}}const vp=new o4;function Pw(t){if(!t)throw new Error("Credential creation options are required");if(typeof PublicKeyCredential<"u"&&"parseCreationOptionsFromJSON"in PublicKeyCredential&&typeof PublicKeyCredential.parseCreationOptionsFromJSON=="function")return PublicKeyCredential.parseCreationOptionsFromJSON(t);const{challenge:e,user:n,excludeCredentials:i}=t,s=Es(t,["challenge","user","excludeCredentials"]),l=ws(e).buffer,d=Object.assign(Object.assign({},n),{id:ws(n.id).buffer}),u=Object.assign(Object.assign({},s),{challenge:l,user:d});if(i&&i.length>0){u.excludeCredentials=new Array(i.length);for(let f=0;f<i.length;f++){const p=i[f];u.excludeCredentials[f]=Object.assign(Object.assign({},p),{id:ws(p.id).buffer,type:p.type||"public-key",transports:p.transports})}}return u}function Dw(t){if(!t)throw new Error("Credential request options are required");if(typeof PublicKeyCredential<"u"&&"parseRequestOptionsFromJSON"in PublicKeyCredential&&typeof PublicKeyCredential.parseRequestOptionsFromJSON=="function")return PublicKeyCredential.parseRequestOptionsFromJSON(t);const{challenge:e,allowCredentials:n}=t,i=Es(t,["challenge","allowCredentials"]),s=ws(e).buffer,l=Object.assign(Object.assign({},i),{challenge:s});if(n&&n.length>0){l.allowCredentials=new Array(n.length);for(let d=0;d<n.length;d++){const u=n[d];l.allowCredentials[d]=Object.assign(Object.assign({},u),{id:ws(u.id).buffer,type:u.type||"public-key",transports:u.transports})}}return l}function Lw(t){var e;if("toJSON"in t&&typeof t.toJSON=="function")return t.toJSON();const n=t;return{id:t.id,rawId:t.id,response:{attestationObject:Jo(new Uint8Array(t.response.attestationObject)),clientDataJSON:Jo(new Uint8Array(t.response.clientDataJSON))},type:"public-key",clientExtensionResults:t.getClientExtensionResults(),authenticatorAttachment:(e=n.authenticatorAttachment)!==null&&e!==void 0?e:void 0}}function Nw(t){var e;if("toJSON"in t&&typeof t.toJSON=="function")return t.toJSON();const n=t,i=t.getClientExtensionResults(),s=t.response;return{id:t.id,rawId:t.id,response:{authenticatorData:Jo(new Uint8Array(s.authenticatorData)),clientDataJSON:Jo(new Uint8Array(s.clientDataJSON)),signature:Jo(new Uint8Array(s.signature)),userHandle:s.userHandle?Jo(new Uint8Array(s.userHandle)):void 0},type:"public-key",clientExtensionResults:i,authenticatorAttachment:(e=n.authenticatorAttachment)!==null&&e!==void 0?e:void 0}}function mS(t){return t==="localhost"||/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i.test(t)}function vd(){var t,e;return!!(zt()&&"PublicKeyCredential"in window&&window.PublicKeyCredential&&"credentials"in navigator&&typeof((t=navigator?.credentials)===null||t===void 0?void 0:t.create)=="function"&&typeof((e=navigator?.credentials)===null||e===void 0?void 0:e.get)=="function")}async function gS(t){try{const e=await navigator.credentials.create(t);return e?e instanceof PublicKeyCredential?{data:e,error:null}:{data:null,error:new bd("Browser returned unexpected credential type",e)}:{data:null,error:new bd("Empty credential response",e)}}catch(e){return{data:null,error:n4({error:e,options:t})}}}async function yS(t){try{const e=await navigator.credentials.get(t);return e?e instanceof PublicKeyCredential?{data:e,error:null}:{data:null,error:new bd("Browser returned unexpected credential type",e)}:{data:null,error:new bd("Empty credential response",e)}}catch(e){return{data:null,error:a4({error:e,options:t})}}}const i4={hints:["security-key"],authenticatorSelection:{authenticatorAttachment:"cross-platform",requireResidentKey:!1,userVerification:"preferred",residentKey:"discouraged"},attestation:"direct"},s4={userVerification:"preferred",hints:["security-key"],attestation:"direct"};function wd(...t){const e=s=>s!==null&&typeof s=="object"&&!Array.isArray(s),n=s=>s instanceof ArrayBuffer||ArrayBuffer.isView(s),i={};for(const s of t)if(s)for(const l in s){const d=s[l];if(d!==void 0)if(Array.isArray(d))i[l]=d;else if(n(d))i[l]=d;
54else if(e(d)){const u=i[l];e(u)?i[l]=wd(u,d):i[l]=wd(d)}else i[l]=d}return i}function r4(t,e){return wd(i4,t,e||{})}function l4(t,e){return wd(s4,t,e||{})}class c4{constructor(e){this.client=e,this.enroll=this._enroll.bind(this),this.challenge=this._challenge.bind(this),this.verify=this._verify.bind(this),this.authenticate=this._authenticate.bind(this),this.register=this._register.bind(this)}async _enroll(e){return this.client.mfa.enroll(Object.assign(Object.assign({},e),{factorType:"webauthn"}))}async _challenge({factorId:e,webauthn:n,friendlyName:i,signal:s},l){var d;try{const{data:u,error:f}=await this.client.mfa.challenge({factorId:e,webauthn:n});if(!u)return{data:null,error:f};const p=s??vp.createNewAbortSignal();if(u.webauthn.type==="create"){const{user:y}=u.webauthn.credential_options.publicKey;if(!y.name){const g=i;if(g)y.name=`${y.id}:${g}`;else{const w=(await this.client.getUser()).data.user,x=((d=w?.user_metadata)===null||d===void 0?void 0:d.name)||w?.email||w?.id||"User";y.name=`${y.id}:${x}`}}y.displayName||(y.displayName=y.name)}switch(u.webauthn.type){case"create":{const y=r4(u.webauthn.credential_options.publicKey,l?.create),{data:g,error:v}=await gS({publicKey:y,signal:p});return g?{data:{factorId:e,challengeId:u.id,webauthn:{type:u.webauthn.type,credential_response:g}},error:null}:{data:null,error:v}}case"request":{const y=l4(u.webauthn.credential_options.publicKey,l?.request),{data:g,error:v}=await yS(Object.assign(Object.assign({},u.webauthn.credential_options),{publicKey:y,signal:p}));return g?{data:{factorId:e,challengeId:u.id,webauthn:{type:u.webauthn.type,credential_response:g}},error:null}:{data:null,error:v}}}}catch(u){return J(u)?{data:null,error:u}:{data:null,error:new Un("Unexpected error in challenge",u)}}}async _verify({challengeId:e,factorId:n,webauthn:i}){return this.client.mfa.verify({factorId:n,challengeId:e,webauthn:i})}async _authenticate({factorId:e,webauthn:{rpId:n=typeof window<"u"?window.location.hostname:void 0,rpOrigins:i=typeof window<"u"?[window.location.origin]:void 0,signal:s}={}},l){if(!n)return{data:null,error:new el("rpId is required for WebAuthn authentication")};try{if(!vd())return{data:null,error:new Un("Browser does not support WebAuthn",null)};const{data:d,error:u}=await this.challenge({factorId:e,webauthn:{rpId:n,rpOrigins:i},signal:s},{request:l});if(!d)return{data:null,error:u};const{webauthn:f}=d;return this._verify({factorId:e,challengeId:d.challengeId,webauthn:{type:f.type,rpId:n,rpOrigins:i,credential_response:f.credential_response}})}catch(d){return J(d)?{data:null,error:d}:{data:null,error:new Un("Unexpected error in authenticate",d)}}}async _register({friendlyName:e,webauthn:{rpId:n=typeof window<"u"?window.location.hostname:void 0,rpOrigins:i=typeof window<"u"?[window.location.origin]:void 0,signal:s}={}},l){if(!n)return{data:null,error:new el("rpId is required for WebAuthn registration")};try{if(!vd())return{data:null,error:new Un("Browser does not support WebAuthn",null)};const{data:d,error:u}=await this._enroll({friendlyName:e});if(!d)return await this.client.mfa.listFactors().then(y=>{var g;return(g=y.data)===null||g===void 0?void 0:g.all.find(v=>v.factor_type==="webauthn"&&v.friendly_name===e&&v.status!=="unverified")}).then(y=>y?this.client.mfa.unenroll({factorId:y?.id}):void 0),{data:null,error:u};const{data:f,error:p}=await this._challenge({factorId:d.id,friendlyName:d.friendly_name,webauthn:{rpId:n,rpOrigins:i},signal:s},{create:l});return f?this._verify({factorId:d.id,challengeId:f.challengeId,webauthn:{rpId:n,rpOrigins:i,type:f.webauthn.type,credential_response:f.webauthn.credential_response}}):{data:null,error:p}}catch(d){return J(d)?{data:null,error:d}:{data:null,error:new Un("Unexpected error in register",d)}}}}XM();const d4={url:fM,storageKey:pM,autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,headers:mM,flowType:"implicit",debug:!1,hasCustomAuthorizationHeader:!1,throwOnError:!1,lockAcquireTimeout:5e3,skipAutoInitialize:!1,experimental:{}},is={};class tl{get jwks(){var e,n;return(n=(e=is[this.storageKey])===null||e===void 0?void 0:e.jwks)!==null&&n!==void 0?n:{keys:[]}}set jwks(e){is[this.storageKey]=Object.assign(Object.assign({},is[this.storageKey]),{jwks:e})}get jwks_cached_at(){var e,n;return(n=(e=is[this.storageKey])===null||e===void 0?void 0:e.cachedAt)!==null&&n!==void 0?n:Number.MIN_SAFE_INTEGER}set jwks_cached_at(e){is[this.storageKey]=Object.assign(Object.assign({},is[this.storageKey]),{cachedAt:e})}constructor(e){var n,i,s;this.userStorage=null,this.memoryStorage=null,this.stateChangeEmitters=new Map,this.autoRefreshTicker=null,this.autoRefreshTickTimeout=null,this.visibilityChangedCallback=null,this.refreshingDeferred=null,this._sessionRemovalEpoch=0,this.initializePromise=null,this.detectSessionInUrl=!0,this.hasCustomAuthorizationHeader=!1,this.suppressGetSessionWarning=!1,this.lock=null,this.lockAcquired=!1,this.pendingInLock=[],this.broadcastChannel=null,this.logger=console.log;const l=Object.assign(Object.assign({},d4),e);if(this.storageKey=l.storageKey,this.instanceID=(n=tl.nextInstanceID[this.storageKey])!==null&&n!==void 0?n:0,tl.nextInstanceID[this.storageKey]=this.instanceID+1,this.logDebugMessages=!!l.debug,typeof l.debug=="function"&&(this.logger=l.debug),this.instanceID>
540&&zt()){const d=`${this._logPrefix()} Multiple GoTrueClient instances detected in the same browser context. It is not an error, but this should be avoided as it may produce undefined behavior when used concurrently under the same storage key.`;console.warn(d),this.logDebugMessages&&console.trace(d)}if(this.persistSession=l.persistSession,this.autoRefreshToken=l.autoRefreshToken,this.experimental=(i=l.experimental)!==null&&i!==void 0?i:{},this.admin=new ZM({url:l.url,headers:l.headers,fetch:l.fetch,experimental:this.experimental}),this.url=l.url,this.headers=l.headers,this.fetch=fS(l.fetch),this.detectSessionInUrl=l.detectSessionInUrl,this.flowType=l.flowType,this.hasCustomAuthorizationHeader=l.hasCustomAuthorizationHeader,this.throwOnError=l.throwOnError,this.lockAcquireTimeout=l.lockAcquireTimeout,l.lock!=null&&(this.lock=l.lock),this.jwks||(this.jwks={keys:[]},this.jwks_cached_at=Number.MIN_SAFE_INTEGER),this.mfa={verify:this._verify.bind(this),enroll:this._enroll.bind(this),unenroll:this._unenroll.bind(this),challenge:this._challenge.bind(this),listFactors:this._listFactors.bind(this),challengeAndVerify:this._challengeAndVerify.bind(this),getAuthenticatorAssuranceLevel:this._getAuthenticatorAssuranceLevel.bind(this),webauthn:new c4(this)},this.oauth={getAuthorizationDetails:this._getAuthorizationDetails.bind(this),approveAuthorization:this._approveAuthorization.bind(this),denyAuthorization:this._denyAuthorization.bind(this),listGrants:this._listOAuthGrants.bind(this),revokeGrant:this._revokeOAuthGrant.bind(this)},this.passkey={startRegistration:this._startPasskeyRegistration.bind(this),verifyRegistration:this._verifyPasskeyRegistration.bind(this),startAuthentication:this._startPasskeyAuthentication.bind(this),verifyAuthentication:this._verifyPasskeyAuthentication.bind(this),list:this._listPasskeys.bind(this),update:this._updatePasskey.bind(this),delete:this._deletePasskey.bind(this)},this.persistSession?(l.storage?this.storage=l.storage:hS()?this.storage=globalThis.localStorage:(this.memoryStorage={},this.storage=Mw(this.memoryStorage)),l.userStorage&&(this.userStorage=l.userStorage)):(this.memoryStorage={},this.storage=Mw(this.memoryStorage)),zt()&&globalThis.BroadcastChannel&&this.persistSession&&this.storageKey){try{this.broadcastChannel=new globalThis.BroadcastChannel(this.storageKey)}catch(d){console.error("Failed to create a new BroadcastChannel, multi-tab state changes will not be available",d)}(s=this.broadcastChannel)===null||s===void 0||s.addEventListener("message",async d=>{this._debug("received broadcast notification from other tab or client",d);try{await this._notifyAllSubscribers(d.data.event,d.data.session,!1)}catch(u){this._debug("#broadcastChannel","error",u)}})}l.skipAutoInitialize||this.initialize().catch(d=>{this._debug("#initialize()","error",d)})}isThrowOnErrorEnabled(){return this.throwOnError}_returnResult(e){if(this.throwOnError&&e&&e.error)throw e.error;return e}_logPrefix(){return`GoTrueClient@${this.storageKey}:${this.instanceID} (${cS}) ${new Date().toISOString()}`}_debug(...e){return this.logDebugMessages&&this.logger(this._logPrefix(),...e),this}async initialize(){return this.initializePromise?await this.initializePromise:(this.initializePromise=(async()=>this.lock!=null?await this._acquireLock(this.lockAcquireTimeout,async()=>await this._initialize()):await this._initialize())(),await this.initializePromise)}async _initialize(){var e;try{let n={},i="none";if(zt()&&(n=OM(window.location.href),this._isImplicitGrantCallback(n)?i="implicit":await this._isPKCECallback(n)&&(i="pkce")),zt()&&this.detectSessionInUrl&&i!=="none"){const{data:s,error:l}=await this._getSessionFromURL(n,i);if(l){if(this._debug("#_initialize()","error detecting session from URL",l),wM(l)){const f=(e=l.details)===null||e===void 0?void 0:e.code;if(f==="identity_already_exists"||f==="identity_not_found"||f==="single_identity_not_deletable")return{error:l}}return{error:l}}const{session:d,redirectType:u}=s;return this._debug("#_initialize()","detected session in URL",d,"redirect type",u),await this._saveSession(d),setTimeout(async()=>{u==="recovery"?await this._notifyAllSubscribers("PASSWORD_RECOVERY",d):await this._notifyAllSubscribers("SIGNED_IN",d)},0),{error:null}}return await this._recoverAndRefresh(),{error:null}}catch(n){return J(n)?this._returnResult({error:n}):this._returnResult({error:new Un("Unexpected error during initialization",n)})}finally{await this._handleVisibilityChange(),this._debug("#_initialize()","end")}}async signInAnonymously(e){var n,i,s;try{const l=await re(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,body:{data:(i=(n=e?.options)===null||n===void 0?void 0:n.data)!==null&&i!==void 0?i:{},gotrue_meta_security:{captcha_token:(s=e?.options)===null||s===void 0?void 0:s.captchaToken}},xform:Rn}),{data:d,error:u}=l;if(u||!d)return this._returnResult({data:{user:null,session:null},error:u});const f=d.session,p=d.user;return d.session&&(await this._saveSession(d.session),await this._notifyAllSubscribers("SIGNED_IN",f)),this._returnResult({data:{user:p,session:f},error:null})}catch(l){if(J(l))return this._returnResult({data:{user:null,session:null},error:l});throw l}}async signUp(e){var n,i,s;try{let l;if("email"in e){const{email:y,password:g,options:v}=e;let w=null,x=null;this.flowType==="pkce"&&([w,x]=await os(this.storage,this.storageKey)),l=await re(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,redirectTo:v?.emailRedirectTo,body:{email:y,password:g,data:(n=v?.data)!==null&&n!==void 0?n:{},gotrue_meta_security:{captcha_token:v?.captchaToken},code_challenge:w,code_challenge_method:x},xform:Rn})}else if("phone"in e){const{phone:y,password:g,options:v}=e;l=await re(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,body:{phone:y,password:g,data:(i=v?.data)!==null&&i!==void 0?i:{},channel:(s=v?.channel)!==null&&s!==void 0?s:"sms",gotrue_meta_security:{captcha_token:v?.captchaToken}},xform:Rn})}else throw new qc("You must provide either an email or phone number and a password");const{data:d,error:u}=l;if(u||!d)return await St(this.storage,`${this.storageKey}-code-verifier`),this._returnResult({data:{user:null,session:null},error:u});const f=d.session,p=d.user;return d.session&&(await this._saveSession(d.session),await this._notifyAllSubscribers("SIGNED_IN",f)),this._returnResult({data:{user:p,session:f},error:null})}catch(l){if(await St(this.storage,`${this.storageKey}-code-verifier`),J(l))return this._returnResult({data:{user:null,session:null},error:l});throw l}}async signInWithPassword(e){try{let n;if("email"in e){const{email:l,password:d,options:u}=e;n=await re(this.fetch,"POST",`${this.url}/token?grant_type=password`,{headers:this.headers,body:{email:l,password:d,gotrue_meta_security:{captcha_token:u?.captchaToken}},xform:Ow})}else if("phone"in e){const{phone:l,password:d,options:u}=e;n=await re(this.fetch,"POST",`${this.url}/token?grant_type=password`,{headers:this.headers,body:{phone:l,password:d,gotrue_meta_security:{captcha_token:u?.captchaToken}},xform:Ow})}else throw new qc("You must provide either an email or phone number and a password");const{data:i,error:s}=n;if(s)return this._returnResult({data:{user:null,session:null},error:s});if(!i||!i.session||!i.user){const l=new as;return this._returnResult({data:{user:null,session:null},error:l})}return i.session&&(await this._saveSession(i.session),await this._notifyAllSubscribers("SIGNED_IN",i.session)),this._returnResult({data:Object.assign({user:i.user,session:i.session},i.weak_password?{weakPassword:i.weak_password}:null),error:s})}catch(n){if(J(n))return this._returnResult({data:{user:null,session:null},error:n});throw n}}async signInWithOAuth(e){var n,i,s,l;return await this._handleProviderSignIn(e.provider,{redirectTo:(n=e.options)===null||n===void 0?void 0:n.redirectTo,scopes:(i=e.options)===null||i===void 0?void 0:i.scopes,queryParams:(s=e.options)===null||s===void 0?void 0:s.queryParams,skipBrowserRedirect:(l=e.options)===null||l===void 0?void 0:l.skipBrowserRedirect})}async exchangeCodeForSession(e){return await this.initializePromise,this.lock!=null?this._acquireLock(this.lockAcquireTimeout,async()=>this._exchangeCodeForSession(e)):this._exchangeCodeForSession(e)}async signInWithWeb3(e){const{chain:n}=e;switch(n){case"ethereum":return await this.signInWithEthereum(e);case"solana":return await this.signInWithSolana(e);default:throw new Error(`@supabase/auth-js: Unsupported chain "${n}"`)}}async signInWithEthereum(e){var n,i,s,l,d,u,f,p,y,g,v;let w,x;if("message"in e)w=e.message,x=e.signature;else{const{chain:k,wallet:S,statement:C,options:E}=e;let R;if(zt())if(typeof S=="object")R=S;else{const W=window;if("ethereum"in W&&typeof W.ethereum=="object"&&"request"in W.ethereum&&typeof W.ethereum.request=="function")R=W.ethereum;else throw new Error("@supabase/auth-js: No compatible Ethereum wallet interface on the window object (window.ethereum) detected. Make sure the user already has a wallet installed and connected for this app. Prefer passing the wallet interface object directly to signInWithWeb3({ chain: 'ethereum', wallet: resolvedUserWallet }) instead.")}else{if(typeof S!="object"||!E?.url)throw new Error("@supabase/auth-js: Both wallet and url must be specified in non-browser environments.");R=S}const D=new URL((n=E?.url)!==null&&n!==void 0?n:window.location.href),G=await R.request({method:"eth_requestAccounts"}).then(W=>W).catch(()=>{throw new Error("@supabase/auth-js: Wallet method eth_requestAccounts is missing or invalid")});if(!G||G.length===0)throw new Error("@supabase/auth-js: No accounts available. Please ensure the wallet is connected.");const z=pS(G[0]);let N=(i=E?.signInWithEthereum)===null||i===void 0?void 0:i.chainId;if(!N){const W=await R.request({method:"eth_chainId"});N=JM(W)}const P={domain:D.host,address:z,statement:C,uri:D.href,version:"1",chainId:N,nonce:(s=E?.signInWithEthereum)===null||s===void 0?void 0:s.nonce,issuedAt:(d=(l=E?.signInWithEthereum)===null||l===void 0?void 0:l.issuedAt)!==null&&d!==void 0?d:new Date,expirationTime:(u=E?.signInWithEthereum)===null||u===void 0?void 0:u.expirationTime,notBefore:(f=E?.signInWithEthereum)===null||f===void 0?void 0:f.notBefore,requestId:(p=E?.signInWithEthereum)===null||p===void 0?void 0:p.requestId,resources:(y=E?.signInWithEthereum)===null||y===void 0?void 0:y.resources};w=t4(P),x=await R.request({method:"personal_sign",params:[e4(w),z]})}try{const{data:k,error:S}=await re(this.fetch,"POST",`${this.url}/token?grant_type=web3`,{headers:this.headers,body:Object.assign({chain:"ethereum",message:w,signature:x},!((g=e.options)===null||g===void 0)&&g.captchaToken?{gotrue_meta_security:{captcha_token:(v=e.options)===null||v===void 0?void 0:v.captchaToken}}:null),xform:Rn});if(S)throw S;if(!k||!k.session||!k.user){const C=new as;return this._returnResult({data:{user:null,session:null},error:C})}return k.session&&(await this._saveSession(k.session),await this._notifyAllSubscribers("SIGNED_IN",k.session)),this._returnResult({data:Object.assign({},k),error:S})}catch(k){if(J(k))return this._returnResult({data:{user:null,session:null},error:k});throw k}}async signInWithSolana(e){var n,i,s,l,d,u,f,p,y,g,v,w;let x,k;if("message"in e)x=e.message,k=e.signature;else{const{chain:S,wallet:C,statement:E,options:R}=e;let D;if(zt())if(typeof C=="object")D=C;else{const z=window;if("solana"in z&&typeof z.solana=="object"&&("signIn"in z.solana&&typeof z.solana.signIn=="function"||"signMessage"in z.solana&&typeof z.solana.signMessage=="function"))D=z.solana;else throw new Error("@supabase/auth-js: No compatible Solana wallet interface on the window object (window.solana) detected. Make sure the user already has a wallet installed and connected for this app. Prefer passing the wallet interface object directly to signInWithWeb3({ chain: 'solana', wallet: resolvedUserWallet }) instead.")}else{if(typeof C!="object"||!R?.url)throw new Error("@supabase/auth-js: Both wallet and url must be specified in non-browser environments.");D=C}const G=new URL((n=R?.url)!==null&&n!==void 0?n:window.location.href);if("signIn"in D&&D.signIn){const z=await D.signIn(Object.assign(Object.assign(Object.assign({issuedAt:new Date().toISOString()},R?.signInWithSolana),{version:"1",domain:G.host,uri:G.href}),E?{statement:E}:null));let N;if(Array.isArray(z)&&z[0]&&typeof z[0]=="object")N=z[0];else if(z&&typeof z=="object"&&"signedMessage"in z&&"signature"in z)N=z;else throw new Error("@supabase/auth-js: Wallet method signIn() returned unrecognized value");if("signedMessage"in N&&"signature"in N&&(typeof N.signedMessage=="string"||N.signedMessage instanceof Uint8Array)&&N.signature instanceof Uint8Array)x=typeof N.signedMessage=="string"?N.signedMessage:new TextDecoder().decode(N.signedMessage),k=N.signature;else throw new Error("@supabase/auth-js: Wallet method signIn() API returned object without signedMessage and signature fields")}else{if(!("signMessage"in D)||typeof D.signMessage!="function"||!("publicKey"in D)||typeof D!="object"||!D.publicKey||!("toBase58"in D.publicKey)||typeof D.publicKey.toBase58!="function")throw new Error("@supabase/auth-js: Wallet does not have a compatible signMessage() and publicKey.toBase58() API");x=[`${G.host} wants you to sign in with your Solana account:`,D.publicKey.toBase58(),...E?["",E,""]:[""],"Version: 1",`URI: ${G.href}`,`Issued At: ${(s=(i=R?.signInWithSolana)===null||i===void 0?void 0:i.issuedAt)!==null&&s!==void 0?s:new Date().toISOString()}`,...!((l=R?.signInWithSolana)===null||l===void 0)&&l.notBefore?[`Not Before: ${R.signInWithSolana.notBefore}`]:[],...!((d=R?.signInWithSolana)===null||d===void 0)&&d.expirationTime?[`Expiration Time: ${R.signInWithSolana.expirationTime}`]:[],...!((u=R?.signInWithSolana)===null||u===void 0)&&u.chainId?[`Chain ID: ${R.signInWithSolana.chainId}`]:[],...!((f=R?.signInWithSolana)===null||f===void 0)&&f.nonce?[`Nonce: ${R.signInWithSolana.nonce}`]:[],...!((p=R?.signInWithSolana)===null||p===void 0)&&p.requestId?[`Request ID: ${R.signInWithSolana.requestId}`]:[],...!((g=(y=R?.signInWithSolana)===null||y===void 0?void 0:y.resources)===null||g===void 0)&&g.length?["Resources",...R.signInWithSolana.resources.map(N=>`- ${N}`)]:[]].join(` 55`);const z=await D.signMessage(new TextEncoder().encode(x),"utf8");if(!z||!(z instanceof Uint8Array))throw new Error("@supabase/auth-js: Wallet signMessage() API returned an recognized value");k=z}}try{const{data:S,error:C}=await re(this.fetch,"POST",`${this.url}/token?grant_type=web3`,{headers:this.headers,body:Object.assign({chain:"solana",message:x,signature:Jo(k)},!((v=e.options)===null||v===void 0)&&v.captchaToken?{gotrue_meta_security:{captcha_token:(w=e.options)===null||w===void 0?void 0:w.captchaToken}}:null),xform:Rn});if(C)throw C;if(!S||!S.session||!S.user){const E=new as;return this._returnResult({data:{user:null,session:null},error:E})}return S.session&&(await this._saveSession(S.session),await this._notifyAllSubscribers("SIGNED_IN",S.session)),this._returnResult({data:Object.assign({},S),error:C})}catch(S){if(J(S))return this._returnResult({data:{user:null,session:null},error:S});throw S}}async _exchangeCodeForSession(e){const n=await wa(this.storage,`${this.storageKey}-code-verifier`),[i,s]=(n??"").split("/");try{if(!i&&this.flowType==="pkce")throw new xM;const{data:l,error:d}=await re(this.fetch,"POST",`${this.url}/token?grant_type=pkce`,{headers:this.headers,body:{auth_code:e,code_verifier:i},xform:Rn});if(await St(this.storage,`${this.storageKey}-code-verifier`),d)throw d;if(!l||!l.session||!l.user){const u=new as;return this._returnResult({data:{user:null,session:null,redirectType:null},error:u})}return l.session&&(await this._saveSession(l.session),await this._notifyAllSubscribers(s==="recovery"?"PASSWORD_RECOVERY":"SIGNED_IN",l.session)),this._returnResult({data:Object.assign(Object.assign({},l),{redirectType:s??null}),error:d})}catch(l){if(await St(this.storage,`${this.storageKey}-code-verifier`),J(l))return this._returnResult({data:{user:null,session:null,redirectType:null},error:l});throw l}}async signInWithIdToken(e){try{const{options:n,provider:i,token:s,access_token:l,nonce:d}=e,u=await re(this.fetch,"POST",`${this.url}/token?grant_type=id_token`,{headers:this.headers,body:{provider:i,id_token:s,access_token:l,nonce:d,gotrue_meta_security:{captcha_token:n?.captchaToken}},xform:Rn}),{data:f,error:p}=u
55;if(p)return this._returnResult({data:{user:null,session:null},error:p});if(!f||!f.session||!f.user){const y=new as;return this._returnResult({data:{user:null,session:null},error:y})}return f.session&&(await this._saveSession(f.session),await this._notifyAllSubscribers("SIGNED_IN",f.session)),this._returnResult({data:f,error:p})}catch(n){if(J(n))return this._returnResult({data:{user:null,session:null},error:n});throw n}}async signInWithOtp(e){var n,i,s,l,d;try{if("email"in e){const{email:u,options:f}=e;let p=null,y=null;this.flowType==="pkce"&&([p,y]=await os(this.storage,this.storageKey));const{error:g}=await re(this.fetch,"POST",`${this.url}/otp`,{headers:this.headers,body:{email:u,data:(n=f?.data)!==null&&n!==void 0?n:{},create_user:(i=f?.shouldCreateUser)!==null&&i!==void 0?i:!0,gotrue_meta_security:{captcha_token:f?.captchaToken},code_challenge:p,code_challenge_method:y},redirectTo:f?.emailRedirectTo});return this._returnResult({data:{user:null,session:null},error:g})}if("phone"in e){const{phone:u,options:f}=e,{data:p,error:y}=await re(this.fetch,"POST",`${this.url}/otp`,{headers:this.headers,body:{phone:u,data:(s=f?.data)!==null&&s!==void 0?s:{},create_user:(l=f?.shouldCreateUser)!==null&&l!==void 0?l:!0,gotrue_meta_security:{captcha_token:f?.captchaToken},channel:(d=f?.channel)!==null&&d!==void 0?d:"sms"}});return this._returnResult({data:{user:null,session:null,messageId:p?.message_id},error:y})}throw new qc("You must provide either an email or phone number.")}catch(u){if(await St(this.storage,`${this.storageKey}-code-verifier`),J(u))return this._returnResult({data:{user:null,session:null},error:u});throw u}}async verifyOtp(e){var n,i;try{let s,l;"options"in e&&(s=(n=e.options)===null||n===void 0?void 0:n.redirectTo,l=(i=e.options)===null||i===void 0?void 0:i.captchaToken);const{data:d,error:u}=await re(this.fetch,"POST",`${this.url}/verify`,{headers:this.headers,body:Object.assign(Object.assign({},e),{gotrue_meta_security:{captcha_token:l}}),redirectTo:s,xform:Rn});if(u)throw u;if(!d)throw new Error("An error occurred on token verification.");const f=d.session,p=d.user;return f?.access_token&&(await this._saveSession(f),await this._notifyAllSubscribers(e.type=="recovery"?"PASSWORD_RECOVERY":"SIGNED_IN",f)),this._returnResult({data:{user:p,session:f},error:null})}catch(s){if(J(s))return this._returnResult({data:{user:null,session:null},error:s});throw s}}async signInWithSSO(e){var n,i,s,l,d;try{let u=null,f=null;this.flowType==="pkce"&&([u,f]=await os(this.storage,this.storageKey));const p=await re(this.fetch,"POST",`${this.url}/sso`,{body:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},"providerId"in e?{provider_id:e.providerId}:null),"domain"in e?{domain:e.domain}:null),{redirect_to:(i=(n=e.options)===null||n===void 0?void 0:n.redirectTo)!==null&&i!==void 0?i:void 0}),!((s=e?.options)===null||s===void 0)&&s.captchaToken?{gotrue_meta_security:{captcha_token:e.options.captchaToken}}:null),{skip_http_redirect:!0,code_challenge:u,code_challenge_method:f}),headers:this.headers,xform:VM});return!((l=p.data)===null||l===void 0)&&l.url&&zt()&&!(!((d=e.options)===null||d===void 0)&&d.skipBrowserRedirect)&&window.location.assign(p.data.url),this._returnResult(p)}catch(u){if(await St(this.storage,`${this.storageKey}-code-verifier`),J(u))return this._returnResult({data:null,error:u});throw u}}async reauthenticate(){return await this.initializePromise,this.lock!=null?await this._acquireLock(this.lockAcquireTimeout,async()=>await this._reauthenticate()):await this._reauthenticate()}async _reauthenticate(){try{return await this._useSession(async e=>{const{data:{session:n},error:i}=e;if(i)throw i;if(!n)throw new Et;const{error:s}=await re(this.fetch,"GET",`${this.url}/reauthenticate`,{headers:this.headers,jwt:n.access_token});return this._returnResult({data:{user:null,session:null},error:s})})}catch(e){if(J(e))return this._returnResult({data:{user:null,session:null},error:e});throw e}}async resend(e){try{const n=`${this.url}/resend`;if("email"in e){const{email:i,type:s,options:l}=e,{error:d}=await re(this.fetch,"POST",n,{headers:this.headers,body:{email:i,type:s,gotrue_meta_security:{captcha_token:l?.captchaToken}},redirectTo:l?.emailRedirectTo});return this._returnResult({data:{user:null,session:null},error:d})}else if("phone"in e){const{phone:i,type:s,options:l}=e,{data:d,error:u}=await re(this.fetch,"POST",n,{headers:this.headers,body:{phone:i,type:s,gotrue_meta_security:{captcha_token:l?.captchaToken}}});return this._returnResult({data:{user:null,session:null,messageId:d?.message_id},error:u})}throw new qc("You must provide either an email or phone number and a type")}catch(n){if(J(n))return this._returnResult({data:{user:null,session:null},error:n});throw n}}async getSession(){return await this.initializePromise,this.lock!=null?await this._acquireLock(this.lockAcquireTimeout,async()=>this._useSession(async e=>e)):await this._useSession(async e=>e)}async _acquireLock(e,n){this._debug("#_acquireLock","begin",e);try{if(this.lockAcquired){const i=this.pendingInLock.length?this.pendingInLock[this.pendingInLock.length-1]:Promise.resolve(),s=(async()=>(await i,await n()))();return this.pendingInLock.push((async()=>{try{await s}catch{}})()),s}return await this.lock(`lock:${this.storageKey}`,e,async()=>{this._debug("#_acquireLock","lock acquired for storage key",this.storageKey);try{this.lockAcquired=!0;const i=n();for(this.pendingInLock.push((async()=>{try{await i}catch{}})()),await i;this.pendingInLock.length;){const s=[...this.pendingInLock];await Promise.all(s),this.pendingInLock.splice(0,s.length)}return await i}finally{this._debug("#_acquireLock","lock released for storage key",this.storageKey),this.lockAcquired=!1}})}finally{this._debug("#_acquireLock","end")}}async _useSession(e){this._debug("#_useSession","begin");try{const n=await this.__loadSession();return await e(n)}finally{this._debug("#_useSession","end")}}async __loadSession(){this._debug("#__loadSession()","begin"),this.lock!=null&&!this.lockAcquired&&this._debug("#__loadSession()","used outside of an acquired lock!",new Error().stack);try{let e=null;const n=await wa(this.storage,this.storageKey);if(this._debug("#getSession()","session from storage",n),n!==null&&(this._isValidSession(n)?e=n:(this._debug("#getSession()","session from storage is not val
55id"),await this._removeSession())),!e)return{data:{session:null},error:null};const i=e.expires_at?e.expires_at*1e3-Date.now()<Tf:!1;if(this._debug("#__loadSession()",`session has${i?"":" not"} expired`,"expires_at",e.expires_at),!i){if(this.userStorage){const d=await wa(this.userStorage,this.storageKey+"-user");d?.user?e.user=d.user:e.user=Ef()}if(this.storage.isServer&&e.user&&!e.user.__isUserNotAvailableProxy){const d={value:this.suppressGetSessionWarning};e.user=HM(e.user,d),d.value&&(this.suppressGetSessionWarning=!0)}return{data:{session:e},error:null}}const{data:s,error:l}=await this._callRefreshToken(e.refresh_token);return l?this._returnResult({data:{session:null},error:l}):this._returnResult({data:{session:s},error:null})}finally{this._debug("#__loadSession()","end")}}async getUser(e){if(e)return await this._getUser(e);await this.initializePromise;let n;return this.lock!=null?n=await this._acquireLock(this.lockAcquireTimeout,async()=>await this._getUser()):n=await this._getUser(),n.data.user&&(this.suppressGetSessionWarning=!0),n}async _getUser(e){try{return e?await re(this.fetch,"GET",`${this.url}/user`,{headers:this.headers,jwt:e,xform:ho}):await this._useSession(async n=>{var i,s,l;const{data:d,error:u}=n;if(u)throw u;return!(!((i=d.session)===null||i===void 0)&&i.access_token)&&!this.hasCustomAuthorizationHeader?{data:{user:null},error:new Et}:await re(this.fetch,"GET",`${this.url}/user`,{headers:this.headers,jwt:(l=(s=d.session)===null||s===void 0?void 0:s.access_token)!==null&&l!==void 0?l:void 0,xform:ho})})}catch(n){if(J(n))return Fc(n)&&(await this._removeSession(),await St(this.storage,`${this.storageKey}-code-verifier`)),this._returnResult({data:{user:null},error:n});throw n}}async updateUser(e,n={}){return await this.initializePromise,this.lock!=null?await this._acquireLock(this.lockAcquireTimeout,async()=>await this._updateUser(e,n)):await this._updateUser(e,n)}async _updateUser(e,n={}){try{return await this._useSession(async i=>{const{data:s,error:l}=i;if(l)throw l;if(!s.session)throw new Et;const d=s.session;let u=null,f=null;this.flowType==="pkce"&&e.email!=null&&([u,f]=await os(this.storage,this.storageKey));const{data:p,error:y}=await re(this.fetch,"PUT",`${this.url}/user`,{headers:this.headers,redirectTo:n?.emailRedirectTo,body:Object.assign(Object.assign({},e),{code_challenge:u,code_challenge_method:f}),jwt:d.access_token,xform:ho});if(y)throw y;return d.user=p.user,await this._saveSession(d),await this._notifyAllSubscribers("USER_UPDATED",d),this._returnResult({data:{user:d.user},error:null})})}catch(i){if(await St(this.storage,`${this.storageKey}-code-verifier`),J(i))return this._returnResult({data:{user:null},error:i});throw i}}async setSession(e){return await this.initializePromise,this.lock!=null?await this._acquireLock(this.lockAcquireTimeout,async()=>await this._setSession(e)):await this._setSession(e)}async _setSession(e){try{if(!e.access_token||!e.refresh_token)throw new Et;const n=Date.now()/1e3;let i=n,s=!0,l=null;const{payload:d}=zc(e.access_token);if(d.exp&&(i=d.exp,s=i<=n),s){const{data:u,error:f}=await this._callRefreshToken(e.refresh_token);if(f)return this._returnResult({data:{user:null,session:null},error:f});if(!u)return{data:{user:null,session:null},error:null};l=u}else{const{data:u,error:f}=await this._getUser(e.access_token);if(f)return this._returnResult({data:{user:null,session:null},error:f});l={access_token:e.access_token,refresh_token:e.refresh_token,user:u.user,token_type:"bearer",expires_in:i-n,expires_at:i},await this._saveSession(l),await this._notifyAllSubscribers("SIGNED_IN",l)}return this._returnResult({data:{user:l.user,session:l},error:null})}catch(n){if(J(n))return this._returnResult({data:{session:null,user:null},error:n});throw n}}async refreshSession(e){return await this.initializePromise,this.lock!=null?await this._acquireLock(this.lockAcquireTimeout,async()=>await this._refreshSession(e)):await this._refreshSession(e)}async _refreshSession(e){try{return await this._useSession(async n=>{var i;if(!e){const{data:d,error:u}=n;if(u)throw u;e=(i=d.session)!==null&&i!==void 0?i:void 0}if(!e?.refresh_token)throw new Et;const{data:s,error:l}=await this._callRefreshToken(e.refresh_token);return l?this._returnResult({data:{user:null,session:null},error:l}):s?this._returnResult({data:{user:s.user,session:s},error:null}):this._returnResult({data:{user:null,session:null},error:null})})}catch(n){if(J(n))return this._returnResult({data:{user:null,session:null},error:n});throw n}}async _getSessionFromURL(e,n){var i;try{if(!zt())throw new Bc("No browser detected.");
55if(e.error||e.error_description||e.error_code)throw new Bc(e.error_description||"Error in URL with unspecified error_description",{error:e.error||"unspecified_error",code:e.error_code||"unspecified_code"});switch(n){case"implicit":if(this.flowType==="pkce")throw new kw("Not a valid PKCE flow url.");break;case"pkce":if(this.flowType==="implicit")throw new Bc("Not a valid implicit grant flow url.");break;default:}if(n==="pkce"){if(this._debug("#_initialize()","begin","is PKCE flow",!0),!e.code)throw new kw("No code detected.");const{data:R,error:D}=await this._exchangeCodeForSession(e.code);if(D)throw D;const G=new URL(window.location.href);return G.searchParams.delete("code"),window.history.replaceState(window.history.state,"",G.toString()),{data:{session:R.session,redirectType:(i=R.redirectType)!==null&&i!==void 0?i:null},error:null}}const{provider_token:s,provider_refresh_token:l,access_token:d,refresh_token:u,expires_in:f,expires_at:p,token_type:y}=e;if(!d||!f||!u||!y)throw new Bc("No session defined in URL");const g=Math.round(Date.now()/1e3),v=parseInt(f);let w=g+v;p&&(w=parseInt(p));const x=w-g;x*1e3<=io&&console.warn(`@supabase/gotrue-js: Session as retrieved from URL expires in ${x}s, should have been closer to ${v}s`);const k=w-v;g-k>=120?console.warn("@supabase/gotrue-js: Session as retrieved from URL was issued over 120s ago, URL could be stale",k,w,g):g-k<0&&console.warn("@supabase/gotrue-js: Session as retrieved from URL was issued in the future? Check the device clock for skew",k,w,g);const{data:S,error:C}=await this._getUser(d);if(C)throw C;const E={provider_token:s,provider_refresh_token:l,access_token:d,expires_in:v,expires_at:w,refresh_token:u,token_type:y,user:S.user};return window.location.hash="",this._debug("#_getSessionFromURL()","clearing window.location.hash"),this._returnResult({data:{session:E,redirectType:e.type},error:null})}catch(s){if(J(s))return this._returnResult({data:{session:null,redirectType:null},error:s});throw s}}_isImplicitGrantCallback(e){return typeof this.detectSessionInUrl=="function"?this.detectSessionInUrl(new URL(window.location.href),e):!!(e.access_token||e.error||e.error_description||e.error_code)}async _isPKCECallback(e){const n=await wa(this.storage,`${this.storageKey}-code-verifier`);return!!(e.code&&n)}async signOut(e={scope:"global"}){return await this.initializePromise,this.lock!=null?await this._acquireLock(this.lockAcquireTimeout,async()=>await this._signOut(e)):await this._signOut(e)}async _signOut({scope:e}={scope:"global"}){return await this._useSession(async n=>{var i;const{data:s,error:l}=n;if(l&&!Fc(l))return this._returnResult({error:l});const d=(i=s.session)===null||i===void 0?void 0:i.access_token;if(d){const{error:u}=await this.admin.signOut(d,e);if(u&&!(vM(u)&&(u.status===404||u.status===401||u.status===403)||Fc(u)))return this._returnResult({error:u})}return e!=="others"&&(await this._removeSession(),await St(this.storage,`${this.storageKey}-code-verifier`)),this._returnResult({error:null})})}onAuthStateChange(e){const n=EM(),i={id:n,callback:e,unsubscribe:()=>{this._debug("#unsubscribe()","state change callback with id removed",n),this.stateChangeEmitters.delete(n)}};return this._debug("#onAuthStateChange()","registered callback with id",n),this.stateChangeEmitters.set(n,i),(async()=>(await this.initializePromise,this.lock!=null?await this._acquireLock(this.lockAcquireTimeout,async()=>{this._emitInitialSession(n)}):await this._emitInitialSession(n)))(),{data:{subscription:i}}}async _emitInitialSession(e){return await this._useSession(async n=>{var i,s;try{const{data:{session:l},error:d}=n;if(d)throw d;await((i=this.stateChangeEmitters.get(e))===null||i===void 0?void 0:i.callback("INITIAL_SESSION",l)),this._debug("INITIAL_SESSION","callback id",e,"session",l)}catch(l){await((s=this.stateChangeEmitters.get(e))===null||s===void 0?void 0:s.callback("INITIAL_SESSION",null)),this._debug("INITIAL_SESSION","callback id",e,"error",l),Fc(l)?console.warn(l):console.error(l)}})}async resetPasswordForEmail(e,n={}){let i=null,s=null;this.flowType==="pkce"&&([i,s]=await os(this.storage,this.storageKey,!0));try{return await re(this.fetch,"POST",`${this.url}/recover`,{body:{email:e,code_challenge:i,code_challenge_method:s,gotrue_meta_security:{captcha_token:n.captchaToken}},headers:this.headers,redirectTo:n.redirectTo})}catch(l){if(await St(this.storage,`${this.storageKey}-code-verifier`),J(l))return this._returnResult({data:null,error:l});throw l}}async getUserIdentities(){var e;try{const{data:n,error:i}=await this.getUser();if(i)throw i;return this._returnResult({data:{identities:(e=n.user.identities)!==null&&e!==void 0?e:[]},error:null})}catch(n){if(J(n))return this._returnResult({data:null,error:n});throw n}}async linkIdentity(e){return"token"in e?this.linkIdentityIdToken(e):this.linkIdentityOAuth(e)}async linkIdentityOAuth(e){var n;try{const{data:i,error:s}=await this._useSession(async l=>{var d,u,f,p,y;const{data:g,error:v}=l;if(v)throw v;const w=await this._getUrlForProvider(`${this.url}/user/identities/authorize`,e.provider,{redirectTo:(d=e.options)===null||d===void 0?void 0:d.redirectTo,scopes:(u=e.options)===null||u===void 0?void 0:u.scopes,queryParams:(f=e.options)===null||f===void 0?void 0:f.queryParams,skipBrowserRedirect:!0});return await re(this.fetch,"GET",w,{headers:this.headers,jwt:(y=(p=g.session)===null||p===void 0?void 0:p.access_token)!==null&&y!==void 0?y:void 0})});if(s)throw s;return zt()&&!(!((n=e.options)===null||n===void 0)&&n.skipBrowserRedirect)&&window.location.assign(i?.url),this._returnResult({data:{provider:e.provider,url:i?.url},error:null})}catch(i){if(J(i))return this._returnResult({data:{provider:e.provider,url:null},error:i});throw i}}async linkIdentityIdToken(e){return await this._useSession(async n=>{var i;try{const{error:s,data:{session:l}}=n;if(s)throw s;const{options:d,provider:u,token:f,access_token:p,nonce:y}=e,g=await re(this.fetch,"POST",`${this.url}/token?grant_type=id_token`,{headers:this.headers,jwt:(i=l?.access_token)!==null&&i!==void 0?i:void 0,body:{provider:u,id_token:f,access_token:p,nonce:y,link_identity:!0,gotrue_meta_security:{captcha_token:d?.captchaToken}},xform:Rn}),{data:v,error:w}=g;return w?this._returnResult({data:{user:null,session:null},error:w}):!v||!v.session||!v.user?this._returnResult({data:{user:null,session:null},error:new as}):(v.session&&(await this._saveSession(v.session),await this._notifyAllSubscribers("USER_UPDATED",v.session)),this._returnResult({data:v,error:w}))}catch(s){if(await St(this.storage,`${this.storageKey}-code-verifier`),J(s))return this._returnResult({data:{user:null,session:null},error:s});throw s}})}async unlinkIdentity(e){try{return await this._useSession(async n=>{var i,s;const{data:l,error:d}=n;
55if(d)throw d;return await re(this.fetch,"DELETE",`${this.url}/user/identities/${e.identity_id}`,{headers:this.headers,jwt:(s=(i=l.session)===null||i===void 0?void 0:i.access_token)!==null&&s!==void 0?s:void 0})})}catch(n){if(J(n))return this._returnResult({data:null,error:n});throw n}}async _refreshAccessToken(e){const n="#_refreshAccessToken()";this._debug(n,"begin");try{const i=Date.now();return await PM(async s=>(s>0&&await MM(200*Math.pow(2,s-1)),this._debug(n,"refreshing attempt",s),await re(this.fetch,"POST",`${this.url}/token?grant_type=refresh_token`,{body:{refresh_token:e},headers:this.headers,xform:Rn})),(s,l)=>{const d=200*Math.pow(2,s);return l&&Rf(l)&&Date.now()+d-i<io})}catch(i){if(this._debug(n,"error",i),J(i))return this._returnResult({data:{session:null,user:null},error:i});throw i}finally{this._debug(n,"end")}}_isValidSession(e){return typeof e=="object"&&e!==null&&"access_token"in e&&"refresh_token"in e&&"expires_at"in e}async _handleProviderSignIn(e,n){const i=await this._getUrlForProvider(`${this.url}/authorize`,e,{redirectTo:n.redirectTo,scopes:n.scopes,queryParams:n.queryParams});return this._debug("#_handleProviderSignIn()","provider",e,"options",n,"url",i),zt()&&!n.skipBrowserRedirect&&window.location.assign(i),{data:{provider:e,url:i},error:null}}async _recoverAndRefresh(){var e,n;const i="#_recoverAndRefresh()";this._debug(i,"begin");try{const s=await wa(this.storage,this.storageKey);if(s&&this.userStorage){let d=await wa(this.userStorage,this.storageKey+"-user");!this.storage.isServer&&Object.is(this.storage,this.userStorage)&&!d&&(d={user:s.user},await hs(this.userStorage,this.storageKey+"-user",d)),s.user=(e=d?.user)!==null&&e!==void 0?e:Ef()}else if(s&&!s.user&&!s.user){const d=await wa(this.storage,this.storageKey+"-user");d&&d?.user?(s.user=d.user,await St(this.storage,this.storageKey+"-user"),await hs(this.storage,this.storageKey,s)):s.user=Ef()}if(this._debug(i,"session from storage",s),!this._isValidSession(s)){this._debug(i,"session is not valid"),s!==null&&await this._removeSession();return}const l=((n=s.expires_at)!==null&&n!==void 0?n:1/0)*1e3-Date.now()<Tf;if(this._debug(i,`session has${l?"":" not"} expired with margin of ${Tf}s`),l){if(this.autoRefreshToken&&s.refresh_token){const{error:d}=await this._callRefreshToken(s.refresh_token);d&&(kM(d)?this._debug(i,"refresh discarded by commit guard",d):(console.error(d),Rf(d)||(this._debug(i,"refresh failed with a non-retryable error, removing the session",d),await this._removeSession())))}}else if(s.user&&s.user.__isUserNotAvailableProxy===!0)try{const{data:d,error:u}=await this._getUser(s.access_token);!u&&d?.user?(s.user=d.user,await this._saveSession(s),await this._notifyAllSubscribers("SIGNED_IN",s)):this._debug(i,"could not get user data, skipping SIGNED_IN notification")}catch(d){console.error("Error getting user data:",d),this._debug(i,"error getting user data, skipping SIGNED_IN notification",d)}else await this._notifyAllSubscribers("SIGNED_IN",s)}catch(s){this._debug(i,"error",s),console.error(s);return}finally{this._debug(i,"end")}}async _callRefreshToken(e){var n,i;if(!e)throw new Et;if(this.refreshingDeferred)return this.refreshingDeferred.promise;const s="#_callRefreshToken()";this._debug(s,"begin");try{this.refreshingDeferred=new Bd;const l=await wa(this.storage,this.storageKey),{data:d,error:u}=await this._refreshAccessToken(e);if(u)throw u;if(!d.session)throw new Et;const f=await wa(this.storage,this.storageKey);if(l!==null&&(f===null||f.refresh_token!==l.refresh_token)){this._debug(s,"commit guard: storage changed since refresh started, discarding rotated tokens",{startedWith:"present",nowHolds:f?"replaced":"cleared"});const v={data:null,error:new Sw};return this.refreshingDeferred.resolve(v),v}const y=this._sessionRemovalEpoch;if(await this._saveSession(d.session),this._sessionRemovalEpoch!==y){this._debug(s,"commit guard (post-save): _removeSession ran during _saveSession, undoing write"),await St(this.storage,this.storageKey),this.userStorage&&await St(this.userStorage,this.storageKey+"-user");const v={data:null,error:new Sw};return this.refreshingDeferred.resolve(v),v}await this._notifyAllSubscribers("TOKEN_REFRESHED",d.session);const g={data:d.session,error:null};return this.refreshingDeferred.resolve(g),g}catch(l){if(this._debug(s,"error",l),J(l)){const d={data:null,error:l};return Rf(l)||await this._removeSession(),(n=this.refreshingDeferred)===null||n===void 0||n.resolve(d),d}throw(i=this.refreshingDeferred)===null||i===void 0||i.reject(l),l}finally{this.refreshingDeferred=null,this._debug(s,"end")}}async _notifyAllSubscribers(e,n,i=!0){const s=`#_notifyAllSubscribers(${e})`;this._debug(s,"begin",n,`broadcast = ${i}`);try{this.broadcastChannel&&i&&this.broadcastChannel.postMessage({event:e,session:n});const l=[],d=Array.from(this.stateChangeEmitters.values()).map(async u=>{try{await u.callback(e,n)}catch(f){l.push(f)}});if(await Promise.all(d),l.length>0){for(let u=0;u<l.length;u+=1)console.error(l[u]);throw l[0]}}finally{this._debug(s,"end")}}async _saveSession(e){this._debug("#_saveSession()",e),this.suppressGetSessionWarning=!0,await St(this.storage,`${this.storageKey}-code-verifier`);const n=Object.assign({},e),i=n.user&&n.user.__isUserNotAvailableProxy===!0;if(this.userStorage){!i&&n.user&&await hs(this.userStorage,this.storageKey+"-user",{user:n.user});const s=Object.assign({},n);delete s.user;const l=Rw(s);await hs(this.storage,this.storageKey,l)}else{const s=Rw(n);await hs(this.storage,this.storageKey,s)}}async _removeSession(){this._sessionRemovalEpoch+=1,this._debug("#_removeSession()"),this.suppressGetSessionWarning=!1,await St(this.storage,this.storageKey),await St(this.storage,this.storageKey+"-code-verifier"),await St(this.storage,this.storageKey+"-user"),this.userStorage&&await St(this.userStorage,this.storageKey+"-user"),await this._notifyAllSubscribers("SIGNED_OUT",null)}_removeVisibilityChangedCallback(){this._debug("#_removeVisibilityChangedCallback()");const e=this.visibilityChangedCallback;this.visibilityChangedCallback=null;try{e&&zt()&&window?.removeEventListener&&window.removeEventListener("visibilitychange",e)}
55catch(n){console.error("removing visibilitychange callback failed",n)}}async _startAutoRefresh(){await this._stopAutoRefresh(),this._debug("#_startAutoRefresh()");const e=setInterval(()=>this._autoRefreshTokenTick(),io);this.autoRefreshTicker=e,e&&typeof e=="object"&&typeof e.unref=="function"?e.unref():typeof Deno<"u"&&typeof Deno.unrefTimer=="function"&&Deno.unrefTimer(e);const n=setTimeout(async()=>{await this.initializePromise,await this._autoRefreshTokenTick()},0);this.autoRefreshTickTimeout=n,n&&typeof n=="object"&&typeof n.unref=="function"?n.unref():typeof Deno<"u"&&typeof Deno.unrefTimer=="function"&&Deno.unrefTimer(n)}async _stopAutoRefresh(){this._debug("#_stopAutoRefresh()");const e=this.autoRefreshTicker;this.autoRefreshTicker=null,e&&clearInterval(e);const n=this.autoRefreshTickTimeout;this.autoRefreshTickTimeout=null,n&&clearTimeout(n)}async startAutoRefresh(){this._removeVisibilityChangedCallback(),await this._startAutoRefresh()}async stopAutoRefresh(){this._removeVisibilityChangedCallback(),await this._stopAutoRefresh()}async dispose(){var e;this._removeVisibilityChangedCallback(),await this._stopAutoRefresh(),(e=this.broadcastChannel)===null||e===void 0||e.close(),this.broadcastChannel=null,this.stateChangeEmitters.clear()}async _autoRefreshTokenTick(){if(this._debug("#_autoRefreshTokenTick()","begin"),this.lock!=null){try{await this._acquireLock(0,async()=>{try{const e=Date.now();try{return await this._useSession(async n=>{const{data:{session:i}}=n;if(!i||!i.refresh_token||!i.expires_at){this._debug("#_autoRefreshTokenTick()","no session");return}const s=Math.floor((i.expires_at*1e3-e)/io);this._debug("#_autoRefreshTokenTick()",`access token expires in ${s} ticks, a tick lasts ${io}ms, refresh threshold is ${jr} ticks`),s<=jr&&await this._callRefreshToken(i.refresh_token)})}catch(n){console.error("Auto refresh tick failed with error. This is likely a transient error.",n)}}finally{this._debug("#_autoRefreshTokenTick()","end")}})}catch(e){if(e instanceof QM)this._debug("auto refresh token tick lock not available");else throw e}return}if(this.refreshingDeferred!==null){this._debug("#_autoRefreshTokenTick()","refresh already in flight, skipping");return}try{const e=Date.now();try{await this._useSession(async n=>{const{data:{session:i}}=n;if(!i||!i.refresh_token||!i.expires_at){this._debug("#_autoRefreshTokenTick()","no session");return}const s=Math.floor((i.expires_at*1e3-e)/io);this._debug("#_autoRefreshTokenTick()",`access token expires in ${s} ticks, a tick lasts ${io}ms, refresh threshold is ${jr} ticks`),s<=jr&&await this._callRefreshToken(i.refresh_token)})}catch(n){console.error("Auto refresh tick failed with error. This is likely a transient error.",n)}}finally{this._debug("#_autoRefreshTokenTick()","end")}}async _handleVisibilityChange(){if(this._debug("#_handleVisibilityChange()"),!zt()||!window?.addEventListener)return this.autoRefreshToken&&this.startAutoRefresh(),!1;try{this.visibilityChangedCallback=async()=>{try{await this._onVisibilityChanged(!1)}catch(e){this._debug("#visibilityChangedCallback","error",e)}},window?.addEventListener("visibilitychange",this.visibilityChangedCallback),await this._onVisibilityChanged(!0)}catch(e){console.error("_handleVisibilityChange",e)}}async _onVisibilityChanged(e){const n=`#_onVisibilityChanged(${e})`;if(this._debug(n,"visibilityState",document.visibilityState),document.visibilityState==="visible"){if(this.autoRefreshToken&&this._startAutoRefresh(),!e)if(await this.initializePromise,this.lock!=null)await this._acquireLock(this.lockAcquireTimeout,async()=>{if(document.visibilityState!=="visible"){this._debug(n,"acquired the lock to recover the session, but the browser visibilityState is no longer visible, aborting");return}await this._recoverAndRefresh()});else{if(document.visibilityState!=="visible"){this._debug(n,"visibilityState is no longer visible, skipping recovery");return}await this._recoverAndRefresh()}}else document.visibilityState==="hidden"&&this.autoRefreshToken&&this._stopAutoRefresh()}async _getUrlForProvider(e,n,i){const s=[`provider=${encodeURIComponent(n)}`];if(i?.redirectTo&&s.push(`redirect_to=${encodeURIComponent(i.redirectTo)}`),i?.scopes&&s.push(`scopes=${encodeURIComponent(i.scopes)}`),this.flowType==="pkce"){const[l,d]=await os(this.storage,this.storageKey),u=new URLSearchParams({code_challenge:`${encodeURIComponent(l)}`,code_challenge_method:`${encodeURIComponent(d)}`});s.push(u.toString())}if(i?.queryParams){const l=new URLSearchParams(i.queryParams);s.push(l.toString())}return i?.skipBrowserRedirect&&s.push(`skip_http_redirect=${i.skipBrowserRedirect}`),`${e}?${s.join("&")}`}async _unenroll(e){try{return await this._useSession(async n=>{var i;const{data:s,error:l}=n;return l?this._returnResult({data:null,error:l}
55):await re(this.fetch,"DELETE",`${this.url}/factors/${e.factorId}`,{headers:this.headers,jwt:(i=s?.session)===null||i===void 0?void 0:i.access_token})})}catch(n){if(J(n))return this._returnResult({data:null,error:n});throw n}}async _enroll(e){try{return await this._useSession(async n=>{var i,s;const{data:l,error:d}=n;if(d)return this._returnResult({data:null,error:d});const u=Object.assign({friendly_name:e.friendlyName,factor_type:e.factorType},e.factorType==="phone"?{phone:e.phone}:e.factorType==="totp"?{issuer:e.issuer}:{}),{data:f,error:p}=await re(this.fetch,"POST",`${this.url}/factors`,{body:u,headers:this.headers,jwt:(i=l?.session)===null||i===void 0?void 0:i.access_token});return p?this._returnResult({data:null,error:p}):(e.factorType==="totp"&&f.type==="totp"&&(!((s=f?.totp)===null||s===void 0)&&s.qr_code)&&(f.totp.qr_code=`data:image/svg+xml;utf-8,${f.totp.qr_code}`),this._returnResult({data:f,error:null}))})}catch(n){if(J(n))return this._returnResult({data:null,error:n});throw n}}async _verify(e){const n=async()=>{try{return await this._useSession(async i=>{var s;const{data:l,error:d}=i;if(d)return this._returnResult({data:null,error:d});const u=Object.assign({challenge_id:e.challengeId},"webauthn"in e?{webauthn:Object.assign(Object.assign({},e.webauthn),{credential_response:e.webauthn.type==="create"?Lw(e.webauthn.credential_response):Nw(e.webauthn.credential_response)})}:{code:e.code}),{data:f,error:p}=await re(this.fetch,"POST",`${this.url}/factors/${e.factorId}/verify`,{body:u,headers:this.headers,jwt:(s=l?.session)===null||s===void 0?void 0:s.access_token});return p?this._returnResult({data:null,error:p}):(await this._saveSession(Object.assign({expires_at:Math.round(Date.now()/1e3)+f.expires_in},f)),await this._notifyAllSubscribers("MFA_CHALLENGE_VERIFIED",f),this._returnResult({data:f,error:p}))})}catch(i){if(J(i))return this._returnResult({data:null,error:i});throw i}};return this.lock!=null?this._acquireLock(this.lockAcquireTimeout,n):n()}async _challenge(e){const n=async()=>{try{return await this._useSession(async i=>{var s;const{data:l,error:d}=i;if(d)return this._returnResult({data:null,error:d});const u=await re(this.fetch,"POST",`${this.url}/factors/${e.factorId}/challenge`,{body:e,headers:this.headers,jwt:(s=l?.session)===null||s===void 0?void 0:s.access_token});if(u.error)return u;const{data:f}=u;if(f.type!=="webauthn")return{data:f,error:null};switch(f.webauthn.type){case"create":return{data:Object.assign(Object.assign({},f),{webauthn:Object.assign(Object.assign({},f.webauthn),{credential_options:Object.assign(Object.assign({},f.webauthn.credential_options),{publicKey:Pw(f.webauthn.credential_options.publicKey)})})}),error:null};case"request":return{data:Object.assign(Object.assign({},f),{webauthn:Object.assign(Object.assign({},f.webauthn),{credential_options:Object.assign(Object.assign({},f.webauthn.credential_options),{publicKey:Dw(f.webauthn.credential_options.publicKey)})})}),error:null}}})}catch(i){if(J(i))return this._returnResult({data:null,error:i});throw i}};return this.lock!=null?this._acquireLock(this.lockAcquireTimeout,n):n()}async _challengeAndVerify(e){const{data:n,error:i}=await this._challenge({factorId:e.factorId});return i?this._returnResult({data:null,error:i}):await this._verify({factorId:e.factorId,challengeId:n.id,code:e.code})}async _listFactors(){var e;const{data:{user:n},error:i}=await this.getUser();if(i)return{data:null,error:i};const s={all:[],phone:[],totp:[],webauthn:[]};for(const l of(e=n?.factors)!==null&&e!==void 0?e:[])s.all.push(l),l.status==="verified"&&s[l.factor_type].push(l);return{data:s,error:null}}async _getAuthenticatorAssuranceLevel(e){var n,i,s,l;if(e)try{const{payload:w}=zc(e);let x=null;w.aal&&(x=w.aal);let k=x;const{data:{user:S},error:C}=await this.getUser(e);if(C)return this._returnResult({data:null,error:C});((i=(n=S?.factors)===null||n===void 0?void 0:n.filter(D=>D.status==="verified"))!==null&&i!==void 0?i:[]).length>0&&(k="aal2");const R=w.amr||[];return{data:{currentLevel:x,nextLevel:k,currentAuthenticationMethods:R},error:null}}catch(w){if(J(w))return this._returnResult({data:null,error:w});throw w}const{data:{session:d},error:u}
55=await this.getSession();if(u)return this._returnResult({data:null,error:u});if(!d)return{data:{currentLevel:null,nextLevel:null,currentAuthenticationMethods:[]},error:null};const{payload:f}=zc(d.access_token);let p=null;f.aal&&(p=f.aal);let y=p;((l=(s=d.user.factors)===null||s===void 0?void 0:s.filter(w=>w.status==="verified"))!==null&&l!==void 0?l:[]).length>0&&(y="aal2");const v=f.amr||[];return{data:{currentLevel:p,nextLevel:y,currentAuthenticationMethods:v},error:null}}async _getAuthorizationDetails(e){try{return await this._useSession(async n=>{const{data:{session:i},error:s}=n;return s?this._returnResult({data:null,error:s}):i?await re(this.fetch,"GET",`${this.url}/oauth/authorizations/${e}`,{headers:this.headers,jwt:i.access_token,xform:l=>({data:l,error:null})}):this._returnResult({data:null,error:new Et})})}catch(n){if(J(n))return this._returnResult({data:null,error:n});throw n}}async _approveAuthorization(e,n){try{return await this._useSession(async i=>{const{data:{session:s},error:l}=i;if(l)return this._returnResult({data:null,error:l});if(!s)return this._returnResult({data:null,error:new Et});const d=await re(this.fetch,"POST",`${this.url}/oauth/authorizations/${e}/consent`,{headers:this.headers,jwt:s.access_token,body:{action:"approve"},xform:u=>({data:u,error:null})});return d.data&&d.data.redirect_url&&zt()&&!n?.skipBrowserRedirect&&window.location.assign(d.data.redirect_url),d})}catch(i){if(J(i))return this._returnResult({data:null,error:i});throw i}}async _denyAuthorization(e,n){try{return await this._useSession(async i=>{const{data:{session:s},error:l}=i;if(l)return this._returnResult({data:null,error:l});if(!s)return this._returnResult({data:null,error:new Et});const d=await re(this.fetch,"POST",`${this.url}/oauth/authorizations/${e}/consent`,{headers:this.headers,jwt:s.access_token,body:{action:"deny"},xform:u=>({data:u,error:null})});return d.data&&d.data.redirect_url&&zt()&&!n?.skipBrowserRedirect&&window.location.assign(d.data.redirect_url),d})}catch(i){if(J(i))return this._returnResult({data:null,error:i});throw i}}async _listOAuthGrants(){try{return await this._useSession(async e=>{const{data:{session:n},error:i}=e;return i?this._returnResult({data:null,error:i}):n?await re(this.fetch,"GET",`${this.url}/user/oauth/grants`,{headers:this.headers,jwt:n.access_token,xform:s=>({data:s,error:null})}):this._returnResult({data:null,error:new Et})})}catch(e){if(J(e))return this._returnResult({data:null,error:e});throw e}}async _revokeOAuthGrant(e){try{return await this._useSession(async n=>{const{data:{session:i},error:s}=n;return s?this._returnResult({data:null,error:s}):i?(await re(this.fetch,"DELETE",`${this.url}/user/oauth/grants`,{headers:this.headers,jwt:i.access_token,query:{client_id:e.clientId},noResolveJson:!0}),{data:{},error:null}):this._returnResult({data:null,error:new Et})})}catch(n){if(J(n))return this._returnResult({data:null,error:n});throw n}}async fetchJwk(e,n={keys:[]}){let i=n.keys.find(u=>u.kid===e);if(i)return i;const s=Date.now();if(i=this.jwks.keys.find(u=>u.kid===e),i&&this.jwks_cached_at+yM>s)return i;const{data:l,error:d}=await re(this.fetch,"GET",`${this.url}/.well-known/jwks.json`,{headers:this.headers});if(d)throw d;return!l.keys||l.keys.length===0||(this.jwks=l,this.jwks_cached_at=s,i=l.keys.find(u=>u.kid===e),!i)?null:i}async getClaims(e,n={}){try{let i=e;if(!i){const{data:w,error:x}
55=await this.getSession();if(x||!w.session)return this._returnResult({data:null,error:x});i=w.session.access_token}const{header:s,payload:l,signature:d,raw:{header:u,payload:f}}=zc(i);if(!n?.allowExpired)try{qM(l.exp)}catch(w){throw new gd(w instanceof Error?w.message:"JWT validation failed")}const p=!s.alg||s.alg.startsWith("HS")||!s.kid||!("crypto"in globalThis&&"subtle"in globalThis.crypto)?null:await this.fetchJwk(s.kid,n?.keys?{keys:n.keys}:n?.jwks);if(!p){const{error:w}=await this.getUser(i);if(w)throw w;return{data:{claims:l,header:s,signature:d},error:null}}const y=BM(s.alg),g=await crypto.subtle.importKey("jwk",p,y,!0,["verify"]);if(!await crypto.subtle.verify(y,g,d,TM(`${u}.${f}`)))throw new gd("Invalid JWT signature");return{data:{claims:l,header:s,signature:d},error:null}}catch(i){if(J(i))return this._returnResult({data:null,error:i});throw i}}async signInWithPasskey(e){var n,i,s;Dn(this.experimental);try{if(!vd())return this._returnResult({data:null,error:new Un("Browser does not support WebAuthn",null)});const{data:l,error:d}=await this._startPasskeyAuthentication({options:{captchaToken:(n=e?.options)===null||n===void 0?void 0:n.captchaToken}});if(d||!l)return this._returnResult({data:null,error:d});const u=Dw(l.options),f=(s=(i=e?.options)===null||i===void 0?void 0:i.signal)!==null&&s!==void 0?s:vp.createNewAbortSignal(),{data:p,error:y}=await yS({publicKey:u,signal:f});if(y||!p)return this._returnResult({data:null,error:y??new Un("WebAuthn ceremony failed",null)});const g=Nw(p);return this._verifyPasskeyAuthentication({challengeId:l.challenge_id,credential:g})}catch(l){if(J(l))return this._returnResult({data:null,error:l});throw l}}async registerPasskey(e){var n,i;Dn(this.experimental);try{if(!vd())return this._returnResult({data:null,error:new Un("Browser does not support WebAuthn",null)});const{data:s,error:l}=await this._startPasskeyRegistration();if(l||!s)return this._returnResult({data:null,error:l});const d=Pw(s.options),u=(i=(n=e?.options)===null||n===void 0?void 0:n.signal)!==null&&i!==void 0?i:vp.createNewAbortSignal(),{data:f,error:p}=await gS({publicKey:d,signal:u});if(p||!f)return this._returnResult({data:null,error:p??new Un("WebAuthn ceremony failed",null)});const y=Lw(f);return this._verifyPasskeyRegistration({challengeId:s.challenge_id,credential:y})}catch(s){if(J(s))return this._returnResult({data:null,error:s});throw s}}async _startPasskeyRegistration(){Dn(this.experimental);try{return await this._useSession(async e=>{const{data:{session:n},error:i}=e;if(i)return this._returnResult({data:null,error:i});if(!n)return this._returnResult({data:null,error:new Et});const{data:s,error:l}=await re(this.fetch,"POST",`${this.url}/passkeys/registration/options`,{headers:this.headers,jwt:n.access_token,body:{}});return l?this._returnResult({data:null,error:l}):this._returnResult({data:s,error:null})})}catch(e){if(J(e))return this._returnResult({data:null,error:e});throw e}}async _verifyPasskeyRegistration(e){Dn(this.experimental);try{return await this._useSession(async n=>{const{data:{session:i},error:s}=n;if(s)return this._returnResult({data:null,error:s});if(!i)return this._returnResult({data:null,error:new Et});const{data:l,error:d}=await re(this.fetch,"POST",`${this.url}/passkeys/registration/verify`,{headers:this.headers,jwt:i.access_token,body:{challenge_id:e.challengeId,credential:e.credential}});return d?this._returnResult({data:null,error:d}):this._returnResult({data:l,error:null})})}catch(n){if(J(n))return this._returnResult({data:null,error:n});throw n}}async _startPasskeyAuthentication(e){var n;Dn(this.experimental);try{const{data:i,error:s}=await re(this.fetch,"POST",`${this.url}/passkeys/authentication/options`,{headers:this.headers,body:{gotrue_meta_security:{captcha_token:(n=e?.options)===null||n===void 0?void 0:n.captchaToken}}});return s?this._returnResult({data:null,error:s}):this._returnResult({data:i,error:null})}catch(i){if(J(i))return this._returnResult({data:null,error:i});throw i}}async _verifyPasskeyAuthentication(e){Dn(this.experimental);try{const{data:n,error:i}=await re(this.fetch,"POST",`${this.url}/passkeys/authentication/verify`,{headers:this.headers,body:{challenge_id:e.challengeId,credential:e.credential},xform:Rn});return i?this._returnResult({data:null,error:i}):(n.session&&(await this._saveSession(n.session),await this._notifyAllSubscribers("SIGNED_IN",n.session)),this._returnResult({data:n,error:null}))}catch(n){if(J(n))return this._returnResult({data:null,error:n});throw n}}async _listPasskeys(){Dn(this.experimental);try{return await this._useSession(async e=>{const{data:{session:n},error:i}=e;if(i)return this._returnResult({data:null,error:i});if(!n)return this._returnResult({data:null,error:new Et});const{data:s,error:l}=await re(this.fetch,"GET",`${this.url}/passkeys`,{headers:this.headers,jwt:n.access_token,xform:d=>({data:d,error:null})});return l?this._returnResult({data:null,error:l}):this._returnResult({data:s,error:null})})}catch(e){if(J(e))return this._returnResult({data:null,error:e});throw e}}async _updatePasskey(e){Dn(this.experimental);try{return await this._useSession(async n=>{const{data:{session:i},error:s}=n;if(s)return this._returnResult({data:null,error:s});if(!i)return this._returnResult({data:null,error:new Et});const{data:l,error:d}=await re(this.fetch,"PATCH",`${this.url}/passkeys/${e.passkeyId}`,{headers:this.headers,jwt:i.access_token,body:{friendly_name:e.friendlyName}});return d?this._returnResult({data:null,error:d}):this._returnResult({data:l,error:null})})}catch(n){if(J(n))return this._returnResult({data:null,error:n});throw n}}async _deletePasskey(e){Dn(this.experimental);try{return await this._useSession(async n=>{const{data:{session:i},error:s}=n;if(s)return this._returnResult({data:null,error:s});if(!i)return this._returnResult({data:null,error:new Et});const{error:l}
55=await re(this.fetch,"DELETE",`${this.url}/passkeys/${e.passkeyId}`,{headers:this.headers,jwt:i.access_token,noResolveJson:!0});return l?this._returnResult({data:null,error:l}):this._returnResult({data:null,error:null})})}catch(n){if(J(n))return this._returnResult({data:null,error:n});throw n}}}tl.nextInstanceID={};const u4=tl,h4="2.107.0";let Fr="",xd;if(typeof Deno<"u"){var If;Fr="deno",xd=(If=Deno.version)===null||If===void 0?void 0:If.deno}else if(typeof document<"u")Fr="web";else if(typeof navigator<"u"&&navigator.product==="ReactNative")Fr="react-native";else{var Mf;Fr="node",xd=typeof process<"u"?(Mf=process.version)===null||Mf===void 0?void 0:Mf.replace(/^v/,""):void 0}const bS=[`runtime=${Fr}`];xd&&bS.push(`runtime-version=${xd}`);const f4={"X-Client-Info":`supabase-js/${h4}; ${bS.join("; ")}`},p4={headers:f4},m4={schema:"public"},g4={autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,flowType:"implicit"},y4={},b4={enabled:!1,respectSamplingDecision:!0};function v4(t,e,n,i){function s(l){return l instanceof n?l:new n(function(d){d(l)})}return new(n||(n=Promise))(function(l,d){function u(y){try{p(i.next(y))}catch(g){d(g)}}function f(y){try{p(i.throw(y))}catch(g){d(g)}}function p(y){y.done?l(y.value):s(y.value).then(u,f)}p((i=i.apply(t,[])).next())})}let Pf=null;const w4="@opentelemetry/api";function x4(){return Pf===null&&(Pf=import(w4).catch(()=>null)),Pf}function k4(){return v4(this,void 0,void 0,function*(){try{const t=yield x4();if(!t||!t.propagation||!t.context)return null;const e={};t.propagation.inject(t.context.active(),e);const n=e.traceparent;return n?{traceparent:n,tracestate:e.tracestate,baggage:e.baggage}:null}catch{return null}})}function S4(t){if(!t||typeof t!="string")return null;const e=t.split("-");if(e.length!==4)return null;const[n,i,s,l]=e;if(n.length!==2||i.length!==32||s.length!==16||l.length!==2)return null;const d=/^[0-9a-f]+$/i;return!d.test(n)||!d.test(i)||!d.test(s)||!d.test(l)||i==="00000000000000000000000000000000"||s==="0000000000000000"?null:{version:n,traceId:i,parentId:s,traceFlags:l,isSampled:(parseInt(l,16)&1)===1}}function _4(t,e){if(!t||!e||e.length===0)return!1;let n;if(t instanceof URL)n=t;else try{n=new URL(t)}catch{return!1}for(const i of e)try{if(typeof i=="string"){if(C4(n.hostname,i))return!0}else if(i instanceof RegExp){if(i.test(n.hostname))return!0}else if(typeof i=="function"&&i(n))return!0}catch{continue}return!1}function C4(t,e){if(e===t)return!0;if(e.startsWith("*.")){const n=e.slice(2);if(t.endsWith(n)&&(t===n||t.endsWith("."+n)))return!0}return!1}function A4(t){const e=[];try{const n=new URL(t);e.push(n.hostname)}catch{}return e.push("*.supabase.co","*.supabase.in"),e.push("localhost","127.0.0.1","[::1]"),e}function nl(t){"@babel/helpers - typeof";return nl=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},nl(t)}function T4(t,e){if(nl(t)!="object"||!t)return t;var n=t[Symbol.toPrimitive];if(n!==void 0){var i=n.call(t,e);if(nl(i)!="object")return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(t)}function R4(t){var e=T4(t,"string");return nl(e)=="symbol"?e:e+""}function E4(t,e,n){return(e=R4(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function Uw(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(s){return Object.getOwnPropertyDescriptor(t,s).enumerable})),n.push.apply(n,i)}return n}function ct(t){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?Uw(Object(n),!0).forEach(function(i){E4(t,i,n[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):Uw(Object(n)).forEach(function(i){Object.defineProperty(t,i,Object.getOwnPropertyDescriptor(n,i))})}return t}const O4=t=>t?(...e)=>t(...e):(...e)=>fetch(...e),I4=()=>Headers,M4=(t,e,n,i,s)=>{const l=O4(i),d=I4(),u=s?.enabled===!0,f=s?.respectSamplingDecision!==!1,p=u?A4(e):null;return async(y,g)=>{var v;const w=(v=await n())!==null&&v!==void 0?v:t;let x=new d(g?.headers);if(x.has("apikey")||x.set("apikey",t),x.has("Authorization")||x.set("Authorization",`Bearer ${w}`),p){const k=await P4(y,p,f);k&&(k.traceparent&&!x.has("traceparent")&&x.set("traceparent",k.traceparent),k.tracestate&&!x.has("tracestate")&&x.set("tracestate",k.tracestate),k.baggage&&!x.has("baggage")&&x.set("baggage",k.baggage))}return l(y,ct(ct({},g),{},{headers:x}))}};async function P4(t,e,n){if(!_4(typeof t=="string"||t instanceof URL?t:t.url,e))return null;const i=await k4();if(!i||!i.traceparent)return null;if(n){const s=S4(i.traceparent);if(s&&!s.isSampled)return null}return i}function jw(t){return typeof t=="boolean"?{enabled:t}:t}function D4(t){return t.endsWith("/")?t:t+"/"}function L4(t,e){var n,i,s,l,d,u;const{db:f,auth:p,realtime:y,global:g}=t,{db:v,auth:w,realtime:x,global:k}=e,S=jw(t.tracePropagation),C=jw(e.tracePropagation),E={db:ct(ct({},v),f),auth:ct(ct({},w),p),realtime:ct(ct({},x),y),storage:{},global:ct(ct(ct({},k),g),{},{headers:ct(ct({},(n=k?.headers)!==null&&n!==void 0?n:{}),(i=g?.headers)!==null&&i!==void 0?i:{})}),tracePropagation:{enabled:(s=(l=S?.enabled)!==null&&l!==void 0?l:C?.enabled)!==null&&s!==void 0?s:!1,respectSamplingDecision:(d=(u=S?.respectSamplingDecision)!==null&&u!==void 0?u:C?.respectSamplingDecision)!==null&&d!==void 0?d:!0},accessToken:async()=>""};return t.accessToken?E.accessToken=t.accessToken:delete E.accessToken,E}function N4(t){const e=t?.trim();if(!e)throw new Error("supabaseUrl is required.");
55if(!e.match(/^https?:\/\//i))throw new Error("Invalid supabaseUrl: Must be a valid HTTP or HTTPS URL.");try{return new URL(D4(e))}catch{throw Error("Invalid supabaseUrl: Provided URL is malformed.")}}var U4=class extends u4{constructor(t){super(t)}},j4=class{constructor(t,e,n){var i,s;this.supabaseUrl=t,this.supabaseKey=e;const l=N4(t);if(!e)throw new Error("supabaseKey is required.");this.realtimeUrl=new URL("realtime/v1",l),this.realtimeUrl.protocol=this.realtimeUrl.protocol.replace("http","ws"),this.authUrl=new URL("auth/v1",l),this.storageUrl=new URL("storage/v1",l),this.functionsUrl=new URL("functions/v1",l);const d=`sb-${l.hostname.split(".")[0]}-auth-token`,u={db:m4,realtime:y4,auth:ct(ct({},g4),{},{storageKey:d}),global:p4,tracePropagation:b4},f=L4(n??{},u);if(this.settings=f,this.storageKey=(i=f.auth.storageKey)!==null&&i!==void 0?i:"",this.headers=(s=f.global.headers)!==null&&s!==void 0?s:{},f.accessToken)this.accessToken=f.accessToken,this.auth=new Proxy({},{get:(y,g)=>{throw new Error(`@supabase/supabase-js: Supabase Client is configured with the accessToken option, accessing supabase.auth.${String(g)} is not possible`)}});else{var p;this.auth=this._initSupabaseAuthClient((p=f.auth)!==null&&p!==void 0?p:{},this.headers,f.global.fetch)}this.fetch=M4(e,t,this._getAccessToken.bind(this),f.global.fetch,f.tracePropagation),this.realtime=this._initRealtimeClient(ct({headers:this.headers,accessToken:this._getAccessToken.bind(this),fetch:this.fetch},f.realtime)),this.accessToken&&Promise.resolve(this.accessToken()).then(y=>this.realtime.setAuth(y)).catch(y=>console.warn("Failed to set initial Realtime auth token:",y)),this.rest=new JO(new URL("rest/v1",l).href,{headers:this.headers,schema:f.db.schema,fetch:this.fetch,timeout:f.db.timeout,urlLengthLimit:f.db.urlLengthLimit}),this.storage=new hM(this.storageUrl.href,this.headers,this.fetch,n?.storage),f.accessToken||this._listenForAuthEvents()}get functions(){return new GO(this.functionsUrl.href,{headers:this.headers,customFetch:this.fetch})}from(t){return this.rest.from(t)}schema(t){return this.rest.schema(t)}rpc(t,e={},n={head:!1,get:!1,count:void 0}){return this.rest.rpc(t,e,n)}channel(t,e={config:{}}){return this.realtime.channel(t,e)}getChannels(){return this.realtime.getChannels()}removeChannel(t){return this.realtime.removeChannel(t)}removeAllChannels(){return this.realtime.removeAllChannels()}async _getAccessToken(){var t=this,e,n;if(t.accessToken)return await t.accessToken();const{data:i}=await t.auth.getSession();return(e=(n=i.session)===null||n===void 0?void 0:n.access_token)!==null&&e!==void 0?e:t.supabaseKey}_initSupabaseAuthClient({autoRefreshToken:t,persistSession:e,detectSessionInUrl:n,storage:i,userStorage:s,storageKey:l,flowType:d,lock:u,debug:f,throwOnError:p,experimental:y,lockAcquireTimeout:g,skipAutoInitialize:v},w,x){const k={Authorization:`Bearer ${this.supabaseKey}`,apikey:`${this.supabaseKey}`};return new U4({url:this.authUrl.href,headers:ct(ct({},k),w),storageKey:l,autoRefreshToken:t,persistSession:e,detectSessionInUrl:n,storage:i,userStorage:s,flowType:d,lock:u,debug:f,throwOnError:p,experimental:y,fetch:x,lockAcquireTimeout:g,skipAutoInitialize:v,hasCustomAuthorizationHeader:Object.keys(this.headers).some(S=>S.toLowerCase()==="authorization")})}_initRealtimeClient(t){return new LI(this.realtimeUrl.href,ct(ct({},t),{},{params:ct(ct({},{apikey:this.supabaseKey}),t?.params)}))}_listenForAuthEvents(){return this.auth.onAuthStateChange((t,e)=>{this._handleTokenChanged(t,"CLIENT",e?.access_token)})}_handleTokenChanged(t,e,n){(t==="TOKEN_REFRESHED"||t==="SIGNED_IN")&&this.changedAccessToken!==n?(this.changedAccessToken=n,this.realtime.setAuth(n)):t==="SIGNED_OUT"&&(this.realtime.setAuth(),e=="STORAGE"&&this.auth.signOut(),this.changedAccessToken=void 0)}};const F4=(t,e,n)=>new j4(t,e,n);function q4(){if(typeof window<"u")return!1;const t=globalThis.process;if(!t)return!1;const e=t.version;if(e==null)return!1;const n=e.match(/^v(\d+)\./);return n?parseInt(n[1],10)<=18:!1}q4()&&console.warn("â ï¸ Node.js 18 and below are deprecated and will no longer be supported in future versions of @supabase/supabase-js. Please upgrade to N
55ode.js 20 or later. For more information, visit: https://github.com/orgs/supabase/discussions/37217");function B4(){if(typeof window>"u")return;const t=location.hostname,n=["lovableproject.com","lovableproject-dev.com","lovable.app","gpt-eng.com","gptengineer.run"].some(S=>t===S||t.endsWith("."+S)),i="[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}",s=n?t.match(new RegExp("^(?:id-preview(?:-[a-z0-9]+)?|project)--("+i+")(?:-dev)?(?=\\.|$)","i"))?.[1]??t.match(new RegExp("^("+i+")(?=[.-])","i"))?.[1]:void 0,l=window.parent&&window.parent!==window;if(!s||!l)return localStorage;const d=t.endsWith(".lovableproject-dev.com")||t.endsWith(".gpt-eng.com"),u=d?/^https:\/\/([a-z0-9-]+\.)*(lovable\.dev|gptengineer\.app)$|^http:\/\/localhost:3000$/:/^https:\/\/([a-z0-9-]+\.)*(lovable\.dev|gptengineer\.app)$/,f=location.ancestorOrigins&&location.ancestorOrigins[0]||(document.referrer?new URL(document.referrer).origin:""),p=f&&u.test(f)?[f]:d?["https://lovable.dev","http://localhost:3000"]:["https://lovable.dev"],y="lovable-preview-auth:result",g=2e3,v=()=>Math.random().toString(36).slice(2)+Date.now().toString(36),w=(S,C,E)=>new Promise(R=>{const D=v();let G=!1,z;const N=oe=>{G||(G=!0,clearTimeout(z),window.removeEventListener("message",P),R(oe))},P=oe=>{if(p.indexOf(oe.origin)<0)return;const ne=oe.data;ne&&ne.type===y&&ne.requestId===D&&N(ne)};window.addEventListener("message",P);const W={type:S,requestId:D,projectId:s,key:C};E!==void 0&&(W.value=E);for(const oe of p)window.parent.postMessage(W,oe);z=setTimeout(()=>N(null),g)});let x=!0;const k=250;return{getItem:async S=>{let C=await w("lovable-preview-auth:get",S);return!C&&x&&(await new Promise(E=>setTimeout(E,k)),C=await w("lovable-preview-auth:get",S)),x=!1,C&&C.ok&&typeof C.value=="string"?C.value===""?(localStorage.removeItem(S),null):C.value:localStorage.getItem(S)},setItem:(S,C)=>(localStorage.setItem(S,C),w("lovable-preview-auth:set",S,C).then(()=>{})),removeItem:S=>(localStorage.removeItem(S),w("lovable-preview-auth:remove",S).then(()=>{}))}}function z4(){return F4("https://nnrqdwqlqblubxbcukdp.supabase.co","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im5ucnFkd3FscWJsdWJ4YmN1a2RwIiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODA1MDQ3MTIsImV4cCI6MjA5NjA4MDcxMn0.D_5Wm82xCZZxxfO17g-d1lM_Rha1WX1VPTOJZ8IC8W0",{auth:{storage:B4(),persistSession:!0,autoRefreshToken:!0}})}let Df;const vS=new Proxy({},{get(t,e,n){return Df||(Df=z4()),Reflect.get(Df,e,n)}}),H4=yo({type:"function"}).client(async({next:t})=>{const{data:e}=await vS.auth.getSession(),n=e.session?.access_token;return t({headers:n?{Authorization:`Bearer ${n}`}:{}})}),G4=yo(),Fw=FO(()=>({functionMiddleware:[H4],requestMiddleware:[G4]}));var zd=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(t){return this.listeners.add(t),this.onSubscribe(),()=>{this.listeners.delete(t),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},W4=class extends zd{#e;#n;#t;constructor(){super(),this.#t=t=>{if(typeof window<"u"&&window.addEventListener){const e=()=>t();return window.addEventListener("visibilitychange",e,!1),()=>{window.removeEventListener("visibilitychange",e)}}}}onSubscribe(){this.#n||this.setEventListener(this.#t)}onUnsubscribe(){this.hasListeners()||(this.#n?.(),this.#n=void 0)}setEventListener(t){this.#t=t,this.#n?.(),this.#n=t(e=>{typeof e=="boolean"?this.setFocused(e):this.onFocus()})}setFocused(t){this.#e!==t&&(this.#e=t,this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(e=>{e(t)})}isFocused(){return typeof this.#e=="boolean"?this.#e:globalThis.document?.visibilityState!=="hidden"}},wS=new W4,$4={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t),setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)},V4=class{#e=$4;#n=!1;setTimeoutProvider(t){this.#e=t}setTimeout(t,e){return this.#e.setTimeout(t,e)}clearTimeout(t){this.#e.clearTimeout(t)}setInterval(t,e){return this.#e.setInterval(t,e)}clearInterval(t){this.#e.clearInterval(t)}},wp=new V4;function Y4(t){setTimeout(t,0)}var K4=typeof window>"u"||"Deno"in globalThis;function Nn(){}function Z4(t,e){return typeof t=="function"?t(e):t}function Q4(t){return typeof t=="number"&&t>=0&&t!==1/0}function X4(t,e){return Math.max(t+(e||0)-Date.now(),0)}function xp(t,e){return typeof t=="function"?t(e):t}function J4(t,e){return typeof t=="function"?t(e):t}function qw(t,e){const{type:n="all",exact:i,fetchStatus:s,predicate:l,queryKey:d,stale:u}=t;if(d){if(i){if(e.queryHash!==em(d,e.options))return!1}else if(!ol(e.queryKey,d))return!1}if(n!=="all"){const f=e.isActive();if(n==="active"&&!f||n==="inactive"&&f)return!1}return!(typeof u=="boolean"&&e.isStale()!==u||s&&s!==e.state.fetchStatus||l&&!l(e))}function Bw(t,e){const{exact:n,status:i,predicate:s,mutationKey:l}=t;if(l){if(!e.options.mutationKey)return!1;if(n){if(al(e.options.mutationKey)!==al(l))return!1}else if(!ol(e.options.mutationKey,l))return!1}return!(i&&e.state.status!==i||s&&!s(e))}function em(t,e){return(e?.queryKeyHashFn||al)(t)}function al(t){return JSON.stringify(t,(e,n)=>kp(n)?Object.keys(n).sort().reduce((i,s)=>(i[s]=n[s],i),{}):n)}function ol(t,e){return t===e?!0:typeof t!=typeof e?!1:t&&e&&typeof t=="object"&&typeof e=="object"?Object.keys(e).every(n=>ol(t[n],e[n])):!1}var e2=Object.prototype.hasOwnProperty;function xS(t,e,n=0){if(t===e)return t;if(n>500)return e;const i=zw(t)&&zw(e);if(!i&&!(kp(t)&&kp(e)))return e;const l=(i?t:Object.keys(t)).length,d=i?e:Object.keys(e),u=d.length,f=i?new Array(u):{};let p=0;for(let y=0;y<u;y++){const g=i?y:d[y],v=t[g],w=e[g];if(v===w){f[g]=v,(i?y<l:e2.call(t,g))&&p++;continue}if(v===null||w===null||typeof v!="object"||typeof w!="object"){f[g]=w;continue}const x=xS(v,w,n+1);f[g]=x,x===v&&p++}return l===u&&p===l?t:f}function T6(t,e){if(!e||Object.keys(t).length!==Object.keys(e).length)return!1;for(const n in t)if(t[n]!==e[n])return!1;return!0}function zw(t){return Array.isArray(t)&&t.length===Object.keys(t).length}function kp(t){if(!Hw(t))return!1;const e=t.constructor;if(e===void 0)return!0;const n=e.prototype;return!(!Hw(n)||!n.hasOwnProperty("isPrototypeOf")||Object.getPrototypeOf(t)!==Object.prototype)}function Hw(t){return Object.prototype.toString.call(t)==="[object Object]"}function t2(t){return new Promise(e=>{wp.setTimeout(e,t)})}function n2(t,e,n){return typeof n.structuralSharing=="function"?n.structuralSharing(t,e):n.structuralSharing!==!1?xS(t,e):e}function a2(t,e,n=0){const i=[...t,e];return n&&i.length>n?i.slice(1):i}function o2(t,e,n=0){const i=[e,...t];return n&&i.length>n?i.slice(0,-1):i}var tm=Symbol();function kS(t,e){return!t.queryFn&&e?.initialPromise?()=>e.initialPromise:!t.queryFn||t.queryFn===tm?()=>Promise.reject(new Error(`Missing queryFn: '${t.queryHash}'`)):t.queryFn}function R6(t,e){return typeof t=="function"?t(...e):!!t}function i2(t,e,n){let i=!1,s;return Object.defineProperty(t,"signal",{enumerable:!0,get:()=>(s??=e(),i||(i=!0,s.aborted?n():s.addEventListener("abort",n,{once:!0})),s)}),t}var SS=(()=>{let t=()=>K4;return{isServer(){return t()},setIsServer(e){t=e}}})();function s2(){let t,e;const n=new Promise((s,l)=>{t=s,e=l});n.status="pending",n.catch(()=>{});function i(s){Object.assign(n,s),delete n.resolve,delete n.reject}return n.resolve=s=>{i({status:"fulfilled",value:s}),t(s)},n.reject=s=>{i({status:"rejected",reason:s}),e(s)},n}var r2=Y4;function l2(){let t=[],e=0,n=u=>{u()},i=u=>{u()},s=r2;const l=u=>{e?t.push(u):s(()=>{n(u)})},d=()=>{const u=t;t=[],u.length&&s(()=>{i(()=>{u.forEach(f=>{n(f)})})})};return{batch:u=>{let f;e++;try{f=u()}finally{e--,e||d()}return f},batchCalls:u=>(...f)=>{l(()=>{u(...f)})},schedule:l,setNotifyFunction:u=>{n=u},setBatchNotifyFunction:u=>{i=u},setScheduler:u=>{s=u}}}var $t=l2(),c2=class extends zd{#e=!0;#n;#t;constructor(){super(),this.#t=t=>{if(typeof window<"u"&&window.addEventListener){const e=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",e,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",e),window.removeEventListener("offline",n
vendor: 19,224 bytes, line 55
55)}}}}onSubscribe(){this.#n||this.setEventListener(this.#t)}onUnsubscribe(){this.hasListeners()||(this.#n?.(),this.#n=void 0)}setEventListener(t){this.#t=t,this.#n?.(),this.#n=t(this.setOnline.bind(this))}setOnline(t){this.#e!==t&&(this.#e=t,this.listeners.forEach(n=>{n(t)}))}isOnline(){return this.#e}},kd=new c2;function d2(t){return Math.min(1e3*2**t,3e4)}function _S(t){return(t??"online")==="online"?kd.isOnline():!0}var Sp=class extends Error{constructor(t){super("CancelledError"),this.revert=t?.revert,this.silent=t?.silent}};function CS(t){let e=!1,n=0,i;const s=s2(),l=()=>s.status!=="pending",d=k=>{if(!l()){const S=new Sp(k);v(S),t.onCancel?.(S)}},u=()=>{e=!0},f=()=>{e=!1},p=()=>wS.isFocused()&&(t.networkMode==="always"||kd.isOnline())&&t.canRun(),y=()=>_S(t.networkMode)&&t.canRun(),g=k=>{l()||(i?.(),s.resolve(k))},v=k=>{l()||(i?.(),s.reject(k))},w=()=>new Promise(k=>{i=S=>{(l()||p())&&k(S)},t.onPause?.()}).then(()=>{i=void 0,l()||t.onContinue?.()}),x=()=>{if(l())return;let k;const S=n===0?t.initialPromise:void 0;try{k=S??t.fn()}catch(C){k=Promise.reject(C)}Promise.resolve(k).then(g).catch(C=>{if(l())return;const E=t.retry??(SS.isServer()?0:3),R=t.retryDelay??d2,D=typeof R=="function"?R(n,C):R,G=E===!0||typeof E=="number"&&n<E||typeof E=="function"&&E(n,C);if(e||!G){v(C);return}n++,t.onFail?.(n,C),t2(D).then(()=>p()?void 0:w()).then(()=>{e?v(C):x()})})};return{promise:s,status:()=>s.status,cancel:d,continue:()=>(i?.(),s),cancelRetry:u,continueRetry:f,canStart:y,start:()=>(y()?x():w().then(x),s)}}var AS=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Q4(this.gcTime)&&(this.#e=wp.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(t){this.gcTime=Math.max(this.gcTime||0,t??(SS.isServer()?1/0:300*1e3))}clearGcTimeout(){this.#e!==void 0&&(wp.clearTimeout(this.#e),this.#e=void 0)}},u2=class extends AS{#e;#n;#t;#o;#a;#i;#s;constructor(t){super(),this.#s=!1,this.#i=t.defaultOptions,this.setOptions(t.options),this.observers=[],this.#o=t.client,this.#t=this.#o.getQueryCache(),this.queryKey=t.queryKey,this.queryHash=t.queryHash,this.#e=Ww(this.options),this.state=t.state??this.#e,this.scheduleGc()}get meta(){return this.options.meta}get promise(){return this.#a?.promise}setOptions(t){if(this.options={...this.#i,...t},this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const e=Ww(this.options);e.data!==void 0&&(this.setState(Gw(e.data,e.dataUpdatedAt)),this.#e=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&this.#t.remove(this)}setData(t,e){const n=n2(this.state.data,t,this.options);return this.#r({data:n,type:"success",dataUpdatedAt:e?.updatedAt,manual:e?.manual}),n}setState(t,e){this.#r({type:"setState",state:t,setStateOptions:e})}cancel(t){const e=this.#a?.promise;return this.#a?.cancel(t),e?e.then(Nn).catch(Nn):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#e}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>J4(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===tm||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>xp(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!X4(this.state.dataUpdatedAt,t)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),this.#t.notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(e=>e!==t),this.observers.length||(this.#a&&(this.#s||this.#l()?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#t.notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}#l(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"}invalidate(){this.state.isInvalidated||this.#r({type:"invalidate"})}async fetch(t,e){if(this.state.fetchStatus!=="idle"&&this.#a?.status()!=="rejected"){if(this.state.data!==void 0&&e?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(t&&this.setOptions(t),!this.options.queryFn){const u=this.observers.find(f=>f.options.queryFn);u&&this.setOptions(u.options)}const n=new AbortController,i=u=>{Object.defineProperty(u,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},s=()=>{const u=kS(this.options,e),p=(()=>{const y={client:this.#o,queryKey:this.queryKey,meta:this.meta};return i(y),y})();return this.#s=!1,this.options.persister?this.options.persister(u,p,this):u(p)},d=(()=>{const u={fetchOptions:e,options:this.options,queryKey:this.queryKey,client:this.#o,state:this.state,fetchFn:s};return i(u),u})();this.options.behavior?.onFetch(d,this),this.#n=this.state,(this.state.fetchStatus==="idle"||this.state.fetchMeta!==d.fetchOptions?.meta)&&this.#r({type:"fetch",meta:d.fetchOptions?.meta}),this.#a=CS({initialPromise:e?.initialPromise,fn:d.fetchFn,onCancel:u=>{u instanceof Sp&&u.revert&&this.setState({...this.#n,fetchStatus:"idle"}),n.abort()},onFail:(u,f)=>{this.#r({type:"failed",failureCount:u,error:f})},onPause:()=>{this.#r({type:"pause"})},onContinue:()=>{this.#r({type:"continue"})},retry:d.options.retry,retryDelay:d.options.retryDelay,networkMode:d.options.networkMode,canRun:()=>!0});try{const u=await this.#a.start();if(u===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(u),this.#t.config.onSuccess?.(u,this),this.#t.config.onSettled?.(u,this.state.error,this),u}catch(u){if(u instanceof Sp){if(u.silent)return this.#a.promise;if(u.revert){if(this.state.data===void 0)throw u;return this.state.data}}throw this.#r({type:"error",error:u}),this.#t.config.onError?.(u,this),this.#t.config.onSettled?.(this.state.data,u,this),u}finally{this.scheduleGc()}}#r(t){const e=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...h2(n.data,this.options),fetchMeta:t.meta??null};case"success":const i={...n,...Gw(t.data,t.dataUpdatedAt),dataUpdateCount:n.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return this.#n=t.manual?i:void 0,i;case"error":const s=t.error;return{...n,error:s,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:s,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=e(this.state),$t.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),this.#t.notify({query:this,type:"updated",action:t})})}};function h2(t,e){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:_S(e.networkMode)?"fetching":"paused",...t===void 0&&{error:null,status:"pending"}}}function Gw(t,e){return{data:t,dataUpdatedAt:e??Date.now(),error:null,isInvalidated:!1,status:"success"}}function Ww(t){const e=typeof t.initialData=="function"?t.initialData():t.initialData,n=e!==void 0,i=n?typeof t.initialDataUpdatedAt=="function"?t.initialDataUpdatedAt():t.initialDataUpdatedAt:0;return{data:e,dataUpdateCount:0,dataUpdatedAt:n?i??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}function $w(t){return{onFetch:(e,n)=>{const i=e.options,s=e.fetchOptions?.meta?.fetchMore?.direction,l=e.state.data?.pages||[],d=e.state.data?.pageParams||[];let u={pages:[],pageParams:[]},f=0;const p=async()=>{let y=!1;const g=x=>{i2(x,()=>e.signal,()=>y=!0)},v=kS(e.options,e.fetchOptions),w=async(x,k,S)=>{if(y)return Promise.reject();if(k==null&&x.pages.length)return Promise.resolve(x);const E=(()=>{const z={client:e.client,queryKey:e.queryKey,pageParam:k,direction:S?"backward":"forward",meta:e.options.meta};return g(z),z})(),R=await v(E),{maxPages:D}=e.options,G=S?o2:a2;return{pages:G(x.pages,R,D),pageParams:G(x.pageParams,k,D)}};if(s&&l.length){const x=s==="backward",k=x?f2:Vw,S={pages:l,pageParams:d},C=k(i,S);u=await w(S,C,x)}else{const x=t??l.length;do{const k=f===0?d[0]??i.initialPageParam:Vw(i,u);if(f>0&&k==null)break;u=await w(u,k),f++}while(f<x)}return u};e.options.persister?e.fetchFn=()=>e.options.persister?.(p,{client:e.client,queryKey:e.queryKey,meta:e.options.meta,signal:e.signal},n):e.fetchFn=p}}}function Vw(t,{pages:e,pageParams:n}){const i=e.length-1;return e.length>0?t.getNextPageParam(e[i],e,n[i],n):void 0}function f2(t,{pages:e,pageParams:n}){return e.length>0?t.getPreviousPageParam?.(e[0],e,n[0],n):void 0}var p2=class extends AS{#e;#n;#t;#o;constructor(t){super(),this.#e=t.client,this.mutationId=t.mutationId,this.#t=t.mutationCache,this.#n=[],this.state=t.state||m2(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){this.#n.includes(t)||(this.#n.push(t),this.clearGcTimeout(),this.#t.notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){this.#n=this.#n.filter(e=>e!==t),this.scheduleGc(),this.#t.notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){this.#n.length||(this.state.status==="pending"?this.scheduleGc():this.#t.remove(this))}continue(){return this.#o?.continue()??this.execute(this.state.variables)}async execute(t){const e=()=>{this.#a({type:"continue"})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#o=CS({fn:()=>this.options.mutationFn?this.options.mutationFn(t,n):Promise.reject(new Error("No mutationFn found")),onFail:(l,d)=>{this.#a({type:"failed",failureCount:l,error:d})},onPause:()=>{this.#a({type:"pause"})},onContinue:e,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#t.canRun(this)});const i=this.state.status==="pending",s=!this.#o.canStart();try{if(i)e();else{this.#a({type:"pending",variables:t,isPaused:s}),this.#t.config.onMutate&&await this.#t.config.onMutate(t,this,n);const d=await this.options.onMutate?.(t,n);d!==this.state.context&&this.#a({type:"pending",context:d,variables:t,isPaused:s})}const l=await this.#o.start();return await this.#t.config.onSuccess?.(l,t,this.state.context,this,n),await this.options.onSuccess?.(l,t,this.state.context,n),await this.#t.config.onSettled?.(l,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(l,null,t,this.state.context,n),this.#a({type:"success",data:l}),l}catch(l){try{await this.#t.config.onError?.(l,t,this.state.context,this,n)}catch(d){Promise.reject(d)}try{await this.options.onError?.(l,t,this.state.context,n)}catch(d){Promise.reject(d)}try{await this.#t.config.onSettled?.(void 0,l,this.state.variables,this.state.context,this,n)}catch(d){Promise.reject(d)}try{await this.options.onSettled?.(void 0,l,t,this.state.context,n)}catch(d){Promise.reject(d)}throw this.#a({type:"error",error:l}),l}finally{this.#t.runNext(this)}}#a(t){const e=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=e(this.state),$t.batch(()=>{this.#n.forEach(n=>{n.onMutationUpdate(t)}),this.#t.notify({mutation:this,type:"updated",action:t})})}};function m2(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var g2=class extends zd{constructor(t={}){super(),this.config=t,this.#e=new Set,this.#n=new Map,this.#t=0}#e;#n;#t;build(t,e,n){const i=new p2({client:t,mutationCache:this,mutationId:++this.#t,options:t.defaultMutationOptions(e),state:n});return this.add(i),i}add(t){this.#e.add(t);const e=Hc(t);if(typeof e=="string"){const n=this.#n.get(e);n?n.push(t):this.#n.set(e,[t])}this.notify({type:"added",mutation:t})}remove(t){if(this.#e.delete(t)){const e=Hc(t);if(typeof e=="string"){const n=this.#n.get(e);if(n)if(n.length>1){const i=n.indexOf(t);i!==-1&&n.splice(i,1)}else n[0]===t&&this.#n.delete(e)}}this.notify({type:"removed",mutation:t})}canRun(t){const e=Hc(t);if(typeof e=="string"){const i=this.#n.get(e)?.find(s=>s.state.status==="pending");return!i||i===t}else return!0}runNext(t){const e=Hc(t);return typeof e=="string"?this.#n.get(e)?.find(i=>i!==t&&i.state.isPaused)?.continue()??Promise.resolve():Promise.resolve()}clear(){$t.batch(()=>{this.#e.forEach(t=>{this.notify({type:"removed",mutation:t})}),this.#e.clear(),this.#n.clear()})}getAll(){return Array.from(this.#e)}find(t){const e={exact:!0,...t};return this.getAll().find(n=>Bw(e,n))}findAll(t={}){return this.getAll().filter(e=>Bw(t,e))}notify(t){$t.batch(()=>{this.listeners.forEach(e=>{e(t)})})}resumePausedMutations(){const t=this.getAll().filter(e=>e.state.isPaused);return $t.batch(()=>Promise.all(t.map(e=>e.continue().catch(Nn))))}};function Hc(t){return t.options.scope?.id}var y2=class extends zd{constructor(t={}){super(),this.config=t,this.#e=new Map}#e;build(t,e,n){const i=e.queryKey,s=e.queryHash??em(i,e);let l=this.get(s);return l||(l=new u2({client:t,queryKey:i,queryHash:s,options:t.defaultQueryOptions(e),state:n,defaultOptions:t.getQueryDefaults(i)}),this.add(l)),l}add(t){this.#e.has(t.queryHash)||(this.#e.set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const e=this.#e.get(t.queryHash);e&&(t.destroy(),e===t&&this.#e.delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){$t.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return this.#e.get(t)}getAll(){return[...this.#e.values()]}find(t){const e={exact:!0,...t};return this.getAll().find(n=>qw(e,n))}findAll(t={}){const e=this.getAll();return Object.keys(t).length>0?e.filter(n=>qw(t,n)):e}notify(t){$t.batch(()=>{this.listeners.forEach(e=>{e(t)})})}onFocus(){$t.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){$t.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},b2=class{#e;#n;#t;#o;#a;#i;#s;#l;constructor(t={}){this.#e=t.queryCache||new y2,this.#n=t.mutationCache||new g2,this.#t=t.defaultOptions||{},this.#o=new Map,this.#a=new Map,this.#i=0}mount(){this.#i++,this.#i===1&&(this.#s=wS.subscribe(async t=>{t&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#l=kd.subscribe(async t=>{t&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#i--,this.#i===0&&(this.#s?.(),this.#s=void 0,this.#l?.(),this.#l=void 0)}isFetching(t){return this.#e.findAll({...t,fetchStatus:"fetching"}).length}isMutating(t){return this.#n.findAll({...t,status:"pending"}).length}getQueryData(t){const e=this.defaultQueryOptions({queryKey:t});return this.#e.get(e.queryHash)?.state.data}ensureQueryData(t){const e=this.defaultQueryOptions(t),n=this.#e.build(this,e),i=n.state.data;return i===void 0?this.fetchQuery(t):(t.revalidateIfStale&&n.isStaleByTime(xp(e.staleTime,n))&&this.prefetchQuery(e),Promise.resolve(i))}getQueriesData(t){return this.#e.findAll(t).map(({queryKey:e,state:n})=>{const i=n.data;return[e,i]})}setQueryData(t,e,n){const i=this.defaultQueryOptions({queryKey:t}),l=this.#e.get(i.queryHash)?.state.data,d=Z4(e,l);if(d!==void 0)return this.#e.build(this,i).setData(d,{...n,manual:!0})}setQueriesData(t,e,n){return $t.batch(()=>this.#e.findAll(t).map(({queryKey:i})=>[i,this.setQueryData(i,e,n)]))}getQueryState(t){const e=this.defaultQueryOptions({queryKey:t});return this.#e.get(e.queryHash)?.state}removeQueries(t){const e=this.#e;$t.batch(()=>{e.findAll(t).forEach(n=>{e.remove(n)})})}resetQueries(t,e){const n=this.#e;return $t.batch(()=>(n.findAll(t).forEach(i=>{i.reset()}),this.refetchQueries({type:"active",...t},e)))}cancelQueries(t,e={}){const n={revert:!0,...e},i=$t.batch(()=>this.#e.findAll(t).map(s=>s.cancel(n)));return Promise.all(i).then(Nn).catch(Nn)}invalidateQueries(t,e={}){return $t.batch(()=>(this.#e.findAll(t).forEach(n=>{n.invalidate()}),t?.refetchType==="none"?Promise.resolve():this.refetchQueries({...t,type:t?.refetchType??t?.type??"active"},e)))}refetchQueries(t,e={}){const n={...e,cancelRefetch:e.cancelRefetch??!0},i=$t.batch(()=>this.#e.findAll(t).filter(s=>!s.isDisabled()&&!s.isStatic()).map(s=>{let l=s.fetch(void 0,n);return n.throwOnError||(l=l.catch(Nn)),s.state.fetchStatus==="paused"?Promise.resolve():l}));return Promise.all(i).then(Nn)}fetchQuery(t){const e=this.defaultQueryOptions(t);e.retry===void 0&&(e.retry=!1);const n=this.#e.build(this,e);return n.isStaleByTime(xp(e.staleTime,n))?n.fetch(e):Promise.resolve(n.state.data)}prefetchQuery(t){return this.fetchQuery(t).then(Nn).catch(Nn)}fetchInfiniteQuery(t){return t.behavior=$w(t.pages),this.fetchQuery(t)}prefetchInfiniteQuery(t){return this.fetchInfiniteQuery(t).then(Nn).catch(Nn)}ensureInfiniteQueryData(t){return t.behavior=$w(t.pages),this.ensureQueryData(t)}resumePausedMutations(){return kd.isOnline()?this.#n.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#n}getDefaultOptions(){return this.#t}setDefaultOptions(t){this.#t=t}setQueryDefaults(t,e){this.#o.set(al(t),{queryKey:t,defaultOptions:e})}getQueryDefaults(t){const e=[...this.#o.values()],n={};return e.forEach(i=>{ol(t,i.queryKey)&&Object.assign(n,i.defaultOptions)}),n}setMutationDefaults(t,e){this.#a.set(al(t),{mutationKey:t,defaultOptions:e})}getMutationDefaults(t){const e=[...this.#a.values()],n={};return e.forEach(i=>{ol(t,i.mutationKey)&&Object.assign(n,i.defaultOptions)}),n}defaultQueryOptions(t){if(t._defaulted)return t;const e={...this.#t.queries,...this.getQueryDefaults(t.queryKey),...t,_defaulted:!0};return e.queryHash||(e.queryHash=em(e.queryKey,e)),e.refetchOnReconnect===void 0&&(e.refetchOnReconnect=e.networkMode!=="always"),e.throwOnError===void 0&&(e.throwOnError=!!e.suspense),!e.networkMode&&e.persister&&(e.networkMode="offlineFirst"),e.queryFn===tm&&(e.enabled=!1),e}defaultMutationOptions(t){return t?._defaulted?t:{...this.#t.mutations,...t?.mutationKey&&this.getMutationDefaults(t.mutationKey),...t,_defaulted:!0}}clear(){this.#e.clear(),this.#n.clear()}},TS=A.createContext(void 0),E6=t=>
55{const e=A.useContext(TS);if(!e)throw new Error("No QueryClient set, use QueryClientProvider to set one");return e},v2=({client:t,children:e})=>(A.useEffect(()=>(t.mount(),()=>{t.unmount()}),[t]),M.jsx(TS.Provider,{value:t,children:e}));const w2="modulepreload",x2=function(t){return"/"+t},Yw={},ye=function(e,n,i){let s=Promise.resolve();if(n&&n.length>0){let f=function(p){return Promise.all(p.map(y=>Promise.resolve(y).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const d=document.querySelector("meta[property=csp-nonce]"),u=d?.nonce||d?.getAttribute("nonce");s=f(n.map(p=>{if(p=x2(p),p in Yw)return;Yw[p]=!0;const y=p.endsWith(".css"),g=y?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${p}"]${g}`))return;const v=document.createElement("link");if(v.rel=y?"stylesheet":w2,y||(v.as="script"),v.crossOrigin="",v.href=p,u&&v.setAttribute("nonce",u),document.head.appendChild(v),y)return new Promise((w,x)=>{v.addEventListener("load",w),v.addEventListener("error",()=>x(new Error(`Unable to preload CSS for ${p}`)))})}))}function l(d){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=d,window.dispatchEvent(u),!u.defaultPrevented)throw d}return s.then(d=>{for(const u of d||[])u.status==="rejected"&&l(u.reason);return e().catch(l)})},k2="/assets/styles-BneX7Ri1.css";function S2(t,e={}){typeof window>"u"||window.__lovableEvents?.captureException?.(t,{source:"react_error_boundary",route:window.location.pathname,...e},{mechanism:"react_error_boundary",handled:!1,severity:"error"})}const RS=(...t)=>t.filter((e,n,i)=>!!e&&e.trim()!==""&&i.indexOf(e)===n).join(" ").trim();const _2=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();const C2=t=>t.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,n,i)=>i?i.toUpperCase():n.toLowerCase());const Kw=t=>{const e=C2(t);return e.charAt(0).toUpperCase()+e.slice(1)};var A2={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const T2=t=>{for(const e in t)if(e.startsWith("aria-")||e==="role"||e==="title")return!0;return!1};const R2=A.forwardRef(({color:t="currentColor",size:e=24,strokeWidth:n=2,absoluteStrokeWidth:i,className:s="",children:l,iconNode:d,...u},f)=>A.createElement("svg",{ref:f,...A2,width:e,height:e,stroke:t,strokeWidth:i?Number(n)*24/Number(e):n,className:RS("lucide",s),...!l&&!T2(u)&&{"aria-hidden":"true"},...u},[...d.map(([p,y])=>A.createElement(p,y)),...Array.isArray(l)?l:[l]]));const Hd=(t,e)=>{const n=A.forwardRef(({className:i,...s},l)=>A.createElement(R2,{ref:l,iconNode:e,className:RS(`lucide-${_2(Kw(t))}`,`lucide-${t}`,i),...s}));return n.displayName=Kw(t),n};const E2=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Zw=Hd("check",E2);const O2=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],I2=Hd("chevron-down",O2);const M2=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],P2=Hd("loader-circle",M2);const D2=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],ES=Hd("x",D2),Xn=yo({type:"function"}),L2=wt({method:"POST"}).handler(It("e07f722dfcaf25e7ffdb38e34bb5175cf7f46326b6d1f52838490581ea7635c2")),O6=wt({method:"GET"}).middleware([Xn]).handler(It("7d5afdd16b0aa5a3afe738e226b841d83557a53cad4e861b9eeaf239d4630992"));function xo(t,e,{checkForDefaultPrevented:n=!0}={}){return function(s){if(t?.(s),n===!1||!s.defaultPrevented)return e?.(s)}}function Qw(t,e){if(typeof t=="function")return t(e);t!=null&&(t.current=e)}function Gd(...t){return e=>{let n=!1;const i=t.map(s=>{const l=Qw(s,e);return!n&&typeof l=="function"&&(n=!0),l});if(n)return()=>{for(let s=0;s<i.length;s++){const l=i[s];typeof l=="function"?l():Qw(t[s],null)}}}}function di(...t){return A.useCallback(Gd(...t),t)}function N2(t,e){const n=A.createContext(e),i=l=>{const{children:d,...u}=l,f=A.useMemo(()=>u,Object.values(u));return M.jsx(n.Provider,{value:f,children:d})};i.displayName=t+"Provider";function s(l){const d=A.useContext(n);if(d)return d;if(e!==void 0)return e;throw new Error(`\`${l}\` must be used within \`${t}\``)}return[i,s]}function U2(t,e=[]){let n=[];function i(l,d){const u=A.createContext(d),f=n.length;n=[...n,d];const p=g=>{const{scope:v,children:w,...x}=g,k=v?.[t]?.[f]||u,S=A.useMemo(()=>x,Object.values(x));return M.jsx(k.Provider,{value:S,children:w})};p.displayName=l+"Provider";function y(g,v){const w=v?.[t]?.[f]||u,x=A.useContext(w);if(x)return x;if(d!==void 0)return d;throw new Error(`\`${g}\` must be used within \`${l}\``)}return[p,y]}const s=()=>{const l=n.map(d=>A.createContext(d));return function(u){const f=u?.[t]||l;return A.useMemo(()=>({[`__scope${t}`]:{...u,[t]:f}}
vendor: 5,479 bytes, line 55
55),[u,f])}};return s.scopeName=t,[i,j2(s,...e)]}function j2(...t){const e=t[0];if(t.length===1)return e;const n=()=>{const i=t.map(s=>({useScope:s(),scopeName:s.scopeName}));return function(l){const d=i.reduce((u,{useScope:f,scopeName:p})=>{const g=f(l)[`__scope${p}`];return{...u,...g}},{});return A.useMemo(()=>({[`__scope${e.scopeName}`]:d}),[d])}};return n.scopeName=e.scopeName,n}var il=globalThis?.document?A.useLayoutEffect:()=>{},F2=Mp[" useId ".trim().toString()]||(()=>{}),q2=0;function Lf(t){const[e,n]=A.useState(F2());return il(()=>{n(i=>i??String(q2++))},[t]),t||(e?`radix-${e}`:"")}var B2=Mp[" useInsertionEffect ".trim().toString()]||il;function z2({prop:t,defaultProp:e,onChange:n=()=>{},caller:i}){const[s,l,d]=H2({defaultProp:e,onChange:n}),u=t!==void 0,f=u?t:s;{const y=A.useRef(t!==void 0);A.useEffect(()=>{const g=y.current;g!==u&&console.warn(`${i} is changing from ${g?"controlled":"uncontrolled"} to ${u?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),y.current=u},[u,i])}const p=A.useCallback(y=>{if(u){const g=G2(y)?y(t):y;g!==t&&d.current?.(g)}else l(y)},[u,t,l,d]);return[f,p]}function H2({defaultProp:t,onChange:e}){const[n,i]=A.useState(t),s=A.useRef(n),l=A.useRef(e);return B2(()=>{l.current=e},[e]),A.useEffect(()=>{s.current!==n&&(l.current?.(n),s.current=n)},[n,s]),[n,i,l]}function G2(t){return typeof t=="function"}function W2(t){const e=$2(t),n=A.forwardRef((i,s)=>{const{children:l,...d}=i,u=A.Children.toArray(l),f=u.find(Y2);if(f){const p=f.props.children,y=u.map(g=>g===f?A.Children.count(p)>1?A.Children.only(null):A.isValidElement(p)?p.props.children:null:g);return M.jsx(e,{...d,ref:s,children:A.isValidElement(p)?A.cloneElement(p,void 0,y):null})}return M.jsx(e,{...d,ref:s,children:l})});return n.displayName=`${t}.Slot`,n}function $2(t){const e=A.forwardRef((n,i)=>{const{children:s,...l}=n;if(A.isValidElement(s)){const d=Z2(s),u=K2(l,s.props);return s.type!==A.Fragment&&(u.ref=i?Gd(i,d):d),A.cloneElement(s,u)}return A.Children.count(s)>1?A.Children.only(null):null});return e.displayName=`${t}.SlotClone`,e}var V2=Symbol("radix.slottable");function Y2(t){return A.isValidElement(t)&&typeof t.type=="function"&&"__radixId"in t.type&&t.type.__radixId===V2}function K2(t,e){const n={...e};for(const i in e){const s=t[i],l=e[i];/^on[A-Z]/.test(i)?s&&l?n[i]=(...u)=>{const f=l(...u);return s(...u),f}:s&&(n[i]=s):i==="style"?n[i]={...s,...l}:i==="className"&&(n[i]=[s,l].filter(Boolean).join(" "))}return{...t,...n}}function Z2(t){let e=Object.getOwnPropertyDescriptor(t.props,"ref")?.get,n=e&&"isReactWarning"in e&&e.isReactWarning;return n?t.ref:(e=Object.getOwnPropertyDescriptor(t,"ref")?.get,n=e&&"isReactWarning"in e&&e.isReactWarning,n?t.props.ref:t.props.ref||t.ref)}var Q2=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Ea=Q2.reduce((t,e)=>{const n=W2(`Primitive.${e}`),i=A.forwardRef((s,l)=>{const{asChild:d,...u}=s,f=d?n:e;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),M.jsx(f,{...u,ref:l})});return i.displayName=`Primitive.${e}`,{...t,[e]:i}},{});function X2(t,e){t&&Zp.flushSync(()=>t.dispatchEvent(e))}function sl(t){const e=A.useRef(t);return A.useEffect(()=>{e.current=t}),A.useMemo(()=>(...n)=>e.current?.(...n),[])}function J2(t,e=globalThis?.document){const n=sl(t);A.useEffect(()=>{const i=s=>{s.key==="Escape"&&n(s)};return e.addEventListener("keydown",i,{capture:!0}),()=>e.removeEventListener("keydown",i,{capture:!0})},[n,e])}var e3="DismissableLayer",_p="dismissableLayer.update",t3="dismissableLayer.pointerDownOutside",n3="dismissableLayer.focusOutside",Xw,OS=A.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),IS=A.forwardRef((t,e)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:i,onPointerDownOutside:s,onFocusOutside:l,onInteractOutside:d,onDismiss:u,...f}=t,p=A.useContext(OS),[y,g]=A.useState(null),v=y?.ownerDocument??globalThis?.document,[,w]=A.useState({}),x=di(e,N=>g(N)),k=Array.from(p.layers),[S]=[...p.layersWithOutsidePointerEventsDisabled].slice(-1),C=k.indexOf(S),E=y?k.indexOf(y):-1,R=p.layersWithOutsidePointerEventsDisabled.size>0,D=E>=C,G=i3(N=>{const P=N.target,W=[...p.branches].some(oe=>oe.contains(P));!D||W||(s?.(N),d?.(N),N.defaultPrevented||u?.())},v),z=s3(N=>{const P=N.target;[...p.branches].some(oe=>oe.contains(P))||(l?.(N),d?.(N),N.defaultPrevented||u?.())},v);return J2(N=>{E===p.layers.size-1&&(i?.(N),!N.defaultPrevented&&u&&(N.preventDefault(),u()))},v),A.useEffect(()=>{if(y)return n&&(p.layersWithOutsidePointerEventsDisabled.size===0&&(Xw=v.body.style.pointerEvents,v.body.style.pointerEvents="none"),p.layersWithOutsidePointerEventsDisabled.add(y)),p.layers.add(y),Jw(),()=>{n&&p.layersWithOutsidePointerEventsDisabled.size===1&&(v.body.style.pointerEvents=Xw)}},[y,v,n,p]),A.useEffect(()=>()=>{y&&(p.layers.delete(y),p.layersWithOutsidePointerEventsDisabled.delete(y),Jw())},[y,p]),A.useEffect(()=>{const N=()=>w({});return document.addEventListener(_p,N),()=>document.removeEventListener(_p,N)},[]),M.jsx(Ea.div,{...f,ref:x,style:{pointerEvents:R?D?"auto":"none":void 0,...t.style},onFocusCapture:xo(t.onFocusCapture,z.onFocusCapture),onBlurCapture:xo(t.onBlurCapture,z.onBlurCapture),onPointerDownCapture:xo(t.onPointerDownCapture,G.onPointerDownCapture)})});IS.displayName=e3;
vendor: 6,685 bytes, line 55
55var a3="DismissableLayerBranch",o3=A.forwardRef((t,e)=>{const n=A.useContext(OS),i=A.useRef(null),s=di(e,i);return A.useEffect(()=>{const l=i.current;if(l)return n.branches.add(l),()=>{n.branches.delete(l)}},[n.branches]),M.jsx(Ea.div,{...t,ref:s})});o3.displayName=a3;function i3(t,e=globalThis?.document){const n=sl(t),i=A.useRef(!1),s=A.useRef(()=>{});return A.useEffect(()=>{const l=u=>{if(u.target&&!i.current){let f=function(){MS(t3,n,p,{discrete:!0})};const p={originalEvent:u};u.pointerType==="touch"?(e.removeEventListener("click",s.current),s.current=f,e.addEventListener("click",s.current,{once:!0})):f()}else e.removeEventListener("click",s.current);i.current=!1},d=window.setTimeout(()=>{e.addEventListener("pointerdown",l)},0);return()=>{window.clearTimeout(d),e.removeEventListener("pointerdown",l),e.removeEventListener("click",s.current)}},[e,n]),{onPointerDownCapture:()=>i.current=!0}}function s3(t,e=globalThis?.document){const n=sl(t),i=A.useRef(!1);return A.useEffect(()=>{const s=l=>{l.target&&!i.current&&MS(n3,n,{originalEvent:l},{discrete:!1})};return e.addEventListener("focusin",s),()=>e.removeEventListener("focusin",s)},[e,n]),{onFocusCapture:()=>i.current=!0,onBlurCapture:()=>i.current=!1}}function Jw(){const t=new CustomEvent(_p);document.dispatchEvent(t)}function MS(t,e,n,{discrete:i}){const s=n.originalEvent.target,l=new CustomEvent(t,{bubbles:!1,cancelable:!0,detail:n});e&&s.addEventListener(t,e,{once:!0}),i?X2(s,l):s.dispatchEvent(l)}var Nf="focusScope.autoFocusOnMount",Uf="focusScope.autoFocusOnUnmount",ex={bubbles:!1,cancelable:!0},r3="FocusScope",PS=A.forwardRef((t,e)=>{const{loop:n=!1,trapped:i=!1,onMountAutoFocus:s,onUnmountAutoFocus:l,...d}=t,[u,f]=A.useState(null),p=sl(s),y=sl(l),g=A.useRef(null),v=di(e,k=>f(k)),w=A.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;A.useEffect(()=>{if(i){let k=function(R){if(w.paused||!u)return;const D=R.target;u.contains(D)?g.current=D:so(g.current,{select:!0})},S=function(R){if(w.paused||!u)return;const D=R.relatedTarget;D!==null&&(u.contains(D)||so(g.current,{select:!0}))},C=function(R){if(document.activeElement===document.body)for(const G of R)G.removedNodes.length>0&&so(u)};document.addEventListener("focusin",k),document.addEventListener("focusout",S);const E=new MutationObserver(C);return u&&E.observe(u,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",k),document.removeEventListener("focusout",S),E.disconnect()}}},[i,u,w.paused]),A.useEffect(()=>{if(u){nx.add(w);const k=document.activeElement;if(!u.contains(k)){const C=new CustomEvent(Nf,ex);u.addEventListener(Nf,p),u.dispatchEvent(C),C.defaultPrevented||(l3(f3(DS(u)),{select:!0}),document.activeElement===k&&so(u))}return()=>{u.removeEventListener(Nf,p),setTimeout(()=>{const C=new CustomEvent(Uf,ex);u.addEventListener(Uf,y),u.dispatchEvent(C),C.defaultPrevented||so(k??document.body,{select:!0}),u.removeEventListener(Uf,y),nx.remove(w)},0)}}},[u,p,y,w]);const x=A.useCallback(k=>{if(!n&&!i||w.paused)return;const S=k.key==="Tab"&&!k.altKey&&!k.ctrlKey&&!k.metaKey,C=document.activeElement;if(S&&C){const E=k.currentTarget,[R,D]=c3(E);R&&D?!k.shiftKey&&C===D?(k.preventDefault(),n&&so(R,{select:!0})):k.shiftKey&&C===R&&(k.preventDefault(),n&&so(D,{select:!0})):C===E&&k.preventDefault()}},[n,i,w.paused]);return M.jsx(Ea.div,{tabIndex:-1,...d,ref:v,onKeyDown:x})});PS.displayName=r3;function l3(t,{select:e=!1}={}){const n=document.activeElement;for(const i of t)if(so(i,{select:e}),document.activeElement!==n)return}function c3(t){const e=DS(t),n=tx(e,t),i=tx(e.reverse(),t);return[n,i]}function DS(t){const e=[],n=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT,{acceptNode:i=>{const s=i.tagName==="INPUT"&&i.type==="hidden";return i.disabled||i.hidden||s?NodeFilter.FILTER_SKIP:i.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)e.push(n.currentNode);return e}function tx(t,e){for(const n of t)if(!d3(n,{upTo:e}))return n}function d3(t,{upTo:e}){if(getComputedStyle(t).visibility==="hidden")return!0;for(;t;){if(e!==void 0&&t===e)return!1;if(getComputedStyle(t).display==="none")return!0;t=t.parentElement}return!1}function u3(t){return t instanceof HTMLInputElement&&"select"in t}function so(t,{select:e=!1}={}){if(t&&t.focus){const n=document.activeElement;t.focus({preventScroll:!0}),t!==n&&u3(t)&&e&&t.select()}}var nx=h3();function h3(){let t=[];return{add(e){const n=t[0];e!==n&&n?.pause(),t=ax(t,e),t.unshift(e)},remove(e){t=ax(t,e),t[0]?.resume()}}}function ax(t,e){const n=[...t],i=n.indexOf(e);return i!==-1&&n.splice(i,1),n}function f3(t){return t.filter(e=>e.tagName!=="A")}var p3="Portal",LS=A.forwardRef((t,e)=>{const{container:n,...i}=t,[s,l]=A.useState(!1);il(()=>l(!0),[]);const d=n||s&&globalThis?.document?.body;return d?XE.createPortal(M.jsx(Ea.div,{...i,ref:e}),d):null});LS.displayName=p3;function m3(t,e){return A.useReducer((n,i)=>e[n][i]??n,t)}var Wd=t=>{const{present:e,children:n}=t,i=g3(e),s=typeof n=="function"?n({present:i.isPresent}):A.Children.only(n),l=di(i.ref,y3(s));return typeof n=="function"||i.isPresent?A.cloneElement(s,{ref:l}):null};Wd.displayName="Presence";function g3(t){const[e,n]=A.useState(),i=A.useRef(null),s=A.useRef(t),l=A.useRef("none"),d=t?"mounted":"unmounted",[u,f]=m3(d,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return A.useEffect(()=>{const p=Gc(i.current);l.current=u==="mounted"?p:"none"},[u]),il(()=>{const p=i.current,y=s.current;if(y!==t){const v=l.current,w=Gc(p);t?f("MOUNT"):w==="none"||p?.display==="none"?f("UNMOUNT"):f(y&&v!==w?"ANIMATION_OUT":"UNMOUNT"),s.current=t}},[t,f]),il(()=>{if(e){let p;const y=e.ownerDocument.defaultView??window,g=w=>{const k=Gc(i.current).includes(CSS.escape(w.animationName));if(w.target===e&&k&&(f("ANIMATION_END"),!s.current)){const S=e.style.animationFillMode;e.style.animationFillMode="forwards",p=y.setTimeout(()=>{e.style.animationFillMode==="forwards"&&(e.style.animationFillMode=S)})}},v=w=>{w.target===e&&(l.current=Gc(i.current))};return e.addEventListener("animationstart",v),e.addEventListener("animationcancel",g),e.addEventListener("animationend",g),()=>{y.clearTimeout(p),e.removeEventListener("animationstart",v),e.removeEventListener("animationcancel",g),e.removeEventListener("animationend",g)}}else f("ANIMATION_END")},[e,f]),{isPresent:["mounted","unmountSuspended"].includes(u),ref:A.useCallback(p=>{i.current=p?getComputedStyle(p):null,n(p)},[])}}function Gc(t){return t?.animationName||"none"}function y3(t){let e=Object.getOwnPropertyDescriptor(t.props,"ref")?.get,n=e&&"isReactWarning"in e&&e.
vendor: 5,559 bytes, lines 55-70
55isReactWarning;return n?t.ref:(e=Object.getOwnPropertyDescriptor(t,"ref")?.get,n=e&&"isReactWarning"in e&&e.isReactWarning,n?t.props.ref:t.props.ref||t.ref)}var jf=0;function b3(){A.useEffect(()=>{const t=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",t[0]??ox()),document.body.insertAdjacentElement("beforeend",t[1]??ox()),jf++,()=>{jf===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(e=>e.remove()),jf--}},[])}function ox(){const t=document.createElement("span");return t.setAttribute("data-radix-focus-guard",""),t.tabIndex=0,t.style.outline="none",t.style.opacity="0",t.style.position="fixed",t.style.pointerEvents="none",t}var od="right-scroll-bar-position",id="width-before-scroll-bar",v3="with-scroll-bars-hidden",w3="--removed-body-scroll-bar-size";function Ff(t,e){return typeof t=="function"?t(e):t&&(t.current=e),t}function x3(t,e){var n=A.useState(function(){return{value:t,callback:e,facade:{get current(){return n.value},set current(i){var s=n.value;s!==i&&(n.value=i,n.callback(i,s))}}}})[0];return n.callback=e,n.facade}var k3=typeof window<"u"?A.useLayoutEffect:A.useEffect,ix=new WeakMap;function S3(t,e){var n=x3(null,function(i){return t.forEach(function(s){return Ff(s,i)})});return k3(function(){var i=ix.get(n);if(i){var s=new Set(i),l=new Set(t),d=n.current;s.forEach(function(u){l.has(u)||Ff(u,null)}),l.forEach(function(u){s.has(u)||Ff(u,d)})}ix.set(n,t)},[t]),n}function _3(t){return t}function C3(t,e){e===void 0&&(e=_3);var n=[],i=!1,s={read:function(){if(i)throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return n.length?n[n.length-1]:t},useMedium:function(l){var d=e(l,i);return n.push(d),function(){n=n.filter(function(u){return u!==d})}},assignSyncMedium:function(l){for(i=!0;n.length;){var d=n;n=[],d.forEach(l)}n={push:function(u){return l(u)},filter:function(){return n}}},assignMedium:function(l){i=!0;var d=[];if(n.length){var u=n;n=[],u.forEach(l),d=n}var f=function(){var y=d;d=[],y.forEach(l)},p=function(){return Promise.resolve().then(f)};p(),n={push:function(y){d.push(y),p()},filter:function(y){return d=d.filter(y),n}}}};return s}function A3(t){t===void 0&&(t={});var e=C3(null);return e.options=Yn({async:!0,ssr:!1},t),e}var NS=function(t){var e=t.sideCar,n=Es(t,["sideCar"]);if(!e)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var i=e.read();if(!i)throw new Error("Sidecar medium not found");return A.createElement(i,Yn({},n))};NS.isSideCarExport=!0;function T3(t,e){return t.useMedium(e),NS}var US=A3(),qf=function(){},$d=A.forwardRef(function(t,e){var n=A.useRef(null),i=A.useState({onScrollCapture:qf,onWheelCapture:qf,onTouchMoveCapture:qf}),s=i[0],l=i[1],d=t.forwardProps,u=t.children,f=t.className,p=t.removeScrollBar,y=t.enabled,g=t.shards,v=t.sideCar,w=t.noRelative,x=t.noIsolation,k=t.inert,S=t.allowPinchZoom,C=t.as,E=C===void 0?"div":C,R=t.gapMode,D=Es(t,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),G=v,z=S3([n,e]),N=Yn(Yn({},D),s);return A.createElement(A.Fragment,null,y&&A.createElement(G,{sideCar:US,removeScrollBar:p,shards:g,noRelative:w,noIsolation:x,inert:k,setCallbacks:l,allowPinchZoom:!!S,lockRef:n,gapMode:R}),d?A.cloneElement(A.Children.only(u),Yn(Yn({},N),{ref:z})):A.createElement(E,Yn({},N,{className:f,ref:z}),u))});$d.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};$d.classNames={fullWidth:id,zeroRight:od};var R3=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function E3(){if(!document)return null;var t=document.createElement("style");t.type="text/css";var e=R3();return e&&t.setAttribute("nonce",e),t}function O3(t,e){t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e))}function I3(t){var e=document.head||document.getElementsByTagName("head")[0];e.appendChild(t)}var M3=function(){var t=0,e=null;return{add:function(n){t==0&&(e=E3())&&(O3(e,n),I3(e)),t++},remove:function(){t--,!t&&e&&(e.parentNode&&e.parentNode.removeChild(e),e=null)}}},P3=function(){var t=M3();return function(e,n){A.useEffect(function(){return t.add(e),function(){t.remove()}},[e&&n])}},jS=function(){var t=P3(),e=function(n){var i=n.styles,s=n.dynamic;return t(i,s),null};return e},D3={left:0,top:0,right:0,gap:0},Bf=function(t){return parseInt(t||"",10)||0},L3=function(t){var e=window.getComputedStyle(document.body),n=e[t==="padding"?"paddingLeft":"marginLeft"],i=e[t==="padding"?"paddingTop":"marginTop"],s=e[t==="padding"?"paddingRight":"marginRight"];return[Bf(n),Bf(i),Bf(s)]},N3=function(t){if(t===void 0&&(t="margin"),typeof window>"u")return D3;var e=L3(t),n=document.documentElement.clientWidth,i=window.innerWidth;return{left:e[0],top:e[1],right:e[2],gap:Math.max(0,i-n+e[2]-e[0])}},U3=jS(),xs="data-scroll-locked",j3=function(t,e,n,i){var s=t.left,l=t.top,d=t.right,u=t.gap;return n===void 0&&(n="margin"),` 56 .`.concat(v3,` { 57 overflow: hidden `).concat(i,`; 58 padding-right: `).concat(u,"px ").concat(i,`; 59 } 60 body[`).concat(xs,`] { 61 overflow: hidden `).concat(i,`; 62 overscroll-behavior: contain; 63 `).concat([e&&"position: relative ".concat(i,";"),n==="margin"&&` 64 padding-left: `.concat(s,`px; 65 padding-top: `).concat(l,`px; 66 padding-right: `).concat(d,`px; 67 margin-left:0; 68 margin-top:0; 69 margin-right: `).concat(u,"px ").concat(i,`; 70 `),n==="padding"&&"padding-right: ".concat(u,"px ").concat(i,";
70")].filter(Boolean).join(""),` 71 } 72 73 .`).concat(od,` { 74 right: `).concat(u,"px ").concat(i,`; 75 } 76 77 .`).concat(id,` { 78 margin-right: `).concat(u,"px ").concat(i,`; 79 } 80 81 .`).concat(od," .").concat(od,` { 82 right: 0 `).concat(i,`; 83 } 84 85 .`).concat(id," .").concat(id,` { 86 margin-right: 0 `).concat(i,`; 87 } 88 89 body[`).concat(xs,`] { 90 `).concat(w3,": ").concat(u,`px; 91 } 92`)},sx=function(){var t=parseInt(document.body.getAttribute(xs)||"0",10);return isFinite(t)?t:0},F3=function(){A.useEffect(function(){return document.body.setAttribute(xs,(sx()+1).toString()),function(){var t=sx()-1;t<=0?document.body.removeAttribute(xs):document.body.setAttribute(xs,t.toString())}},[])},q3=function(t){var e=t.noRelative,n=t.noImportant,i=t.gapMode,s=i===void 0?"margin":i;F3();var l=A.useMemo(function(){return N3(s)},[s]);return A.createElement(U3,{styles:j3(l,!e,s,n?"":"!important")})},Cp=!1;if(typeof window<"u")try{var Wc=Object.defineProperty({},"passive",{get:function(){return Cp=!0,!0}});window.addEventListener("test",Wc,Wc),window.removeEventListener("test",Wc,Wc)}catch{Cp=!1}var ss=Cp?{passive:!1}:!1,B3=function(t){return t.tagName==="TEXTAREA"},FS=function(t,e){if(!(t instanceof Element))return!1;var n=window.getComputedStyle(t);return n[e]!=="hidden"&&!(n.overflowY===n.overflowX&&!B3(t)&&n[e]==="visible")},z3=function(t){return FS(t,"overflowY")},H3=function(t){return FS(t,"overflowX")},rx=function(t,e){var n=e.ownerDocument,i=e;do{typeof ShadowRoot<"u"&&i instanceof ShadowRoot&&(i=i.host);var s=qS(t,i);if(s){var l=BS(t,i),d=l[1],u=l[2];if(d>u)return!0}i=i.parentNode}while(i&&i!==n.body);return!1},G3=function(t){var e=t.scrollTop,n=t.scrollHeight,i=t.clientHeight;return[e,n,i]},W3=function(t){var e=t.scrollLeft,n=t.scrollWidth,i=t.clientWidth;return[e,n,i]},qS=function(t,e){return t==="v"?z3(e):H3(e)},BS=function(t,e){return t==="v"?G3(e):W3(e)},$3=function(t,e){return t==="h"&&e==="rtl"?-1:1},V3=function(t,e,n,i,s){var l=$3(t,window.getComputedStyle(e).direction),d=l*i,u=n.target,f=e.contains(u),p=!1,y=d>0,g=0,v=0;do{if(!u)break;var w=BS(t,u),x=w[0],k=w[1],S=w[2],C=k-S-l*x;(x||C)&&qS(t,u)&&(g+=C,v+=x);var E=u.parentNode;u=E&&E.nodeType===Node.DOCUMENT_FRAGMENT_NODE?E.host:E}while(!f&&u!==document.body||f&&(e.contains(u)||e===u));return(y&&Math.abs(g)<1||!y&&Math.abs(v)<1)&&(p=!0),p},$c=function(t){return"changedTouches"in t?[t.changedTouches[0].clientX,t.changedTouches[0].clientY]:[0,0]},lx=function(t){return[t.deltaX,t.deltaY]},cx=function(t){return t&&"current"in t?t.current:t},Y3=function(t,e){return t[0]===e[0]&&t[1]===e[1]},K3=function(t){return` 93 .block-interactivity-`.concat(t,` {pointer-events: none;} 94 .allow-interactivity-`).concat(t,` {pointer-events: all;} 95`)},Z3=0,rs=[];function Q3(t){var e=A.useRef([]),n=A.useRef([0,0]),i=A.useRef(),s=A.useState(Z3++)[0],l=A.useState(jS)[0],d=A.useRef(t);A.useEffect(function(){d.current=t},[t]),A.useEffect(function(){if(t.inert){document.body.classList.add("block-interactivity-".concat(s));var k=BO([t.lockRef.current],(t.shards||[]).map(cx),!0).filter(Boolean);return k.forEach(function(S){return S.classList.add("allow-interactivity-".concat(s))}),function(){document.body.classList.remove("block-interactivity-".concat(s)),k.forEach(function(S){return S.classList.remove("allow-interactivity-".concat(s))})}}},[t.inert,t.lockRef.current,t.shards]);var u=A.useCallback(function(k,S){if("touches"in k&&k.touches.length===2||k.type==="wheel"&&k.ctrlKey)return!d.current.allowPinchZoom;var C=$c(k),E=n.current,R="deltaX"in k?k.deltaX:E[0]-C[0],D="deltaY"in k?k.deltaY:E[1]-C[1],G,z=k.target,N=Math.abs(R)>Math.abs(D)?"h":"v";if("touches"in k&&N==="h"&&z.type==="range")return!1;var P=window.getSelection(),W=P&&P.anchorNode,oe=W?W===z||W.contains(z):!1;if(oe)return!1;var ne=rx(N,z);if(!ne)return!0;if(ne?G=N:(G=N==="v"?"h":"v",ne=rx(N,z)),!ne)return!1;if(!i.current&&"changedTouches"in k&&(R||D)&&(i.current=G),!G)return!0;var we=i.current||G;return V3(we,S,k,we==="h"?R:D)},[]),f=A.useCallback(function(k){var S=k;if(!(!rs.length||rs[rs.length-1]!==l)){var C="deltaY"in S?lx(S):$c(S),E=e.current.filter(function(G){return G.name===S.type&&(G.target===S.target||S.target===G.shadowParent)&&Y3(G.delta,C)})[0];if(E&&E.should){S.cancelable&&S.preventDefault();return}
vendor: 17,308 bytes, lines 95-99
95if(!E){var R=(d.current.shards||[]).map(cx).filter(Boolean).filter(function(G){return G.contains(S.target)}),D=R.length>0?u(S,R[0]):!d.current.noIsolation;D&&S.cancelable&&S.preventDefault()}}},[]),p=A.useCallback(function(k,S,C,E){var R={name:k,delta:S,target:C,should:E,shadowParent:X3(C)};e.current.push(R),setTimeout(function(){e.current=e.current.filter(function(D){return D!==R})},1)},[]),y=A.useCallback(function(k){n.current=$c(k),i.current=void 0},[]),g=A.useCallback(function(k){p(k.type,lx(k),k.target,u(k,t.lockRef.current))},[]),v=A.useCallback(function(k){p(k.type,$c(k),k.target,u(k,t.lockRef.current))},[]);A.useEffect(function(){return rs.push(l),t.setCallbacks({onScrollCapture:g,onWheelCapture:g,onTouchMoveCapture:v}),document.addEventListener("wheel",f,ss),document.addEventListener("touchmove",f,ss),document.addEventListener("touchstart",y,ss),function(){rs=rs.filter(function(k){return k!==l}),document.removeEventListener("wheel",f,ss),document.removeEventListener("touchmove",f,ss),document.removeEventListener("touchstart",y,ss)}},[]);var w=t.removeScrollBar,x=t.inert;return A.createElement(A.Fragment,null,x?A.createElement(l,{styles:K3(s)}):null,w?A.createElement(q3,{noRelative:t.noRelative,gapMode:t.gapMode}):null)}function X3(t){for(var e=null;t!==null;)t instanceof ShadowRoot&&(e=t.host,t=t.host),t=t.parentNode;return e}const J3=T3(US,Q3);var zS=A.forwardRef(function(t,e){return A.createElement($d,Yn({},t,{ref:e,sideCar:J3}))});zS.classNames=$d.classNames;var eP=function(t){if(typeof document>"u")return null;var e=Array.isArray(t)?t[0]:t;return e.ownerDocument.body},ls=new WeakMap,Vc=new WeakMap,Yc={},zf=0,HS=function(t){return t&&(t.host||HS(t.parentNode))},tP=function(t,e){return e.map(function(n){if(t.contains(n))return n;var i=HS(n);return i&&t.contains(i)?i:(console.error("aria-hidden",n,"in not contained inside",t,". Doing nothing"),null)}).filter(function(n){return!!n})},nP=function(t,e,n,i){var s=tP(e,Array.isArray(t)?t:[t]);Yc[n]||(Yc[n]=new WeakMap);var l=Yc[n],d=[],u=new Set,f=new Set(s),p=function(g){!g||u.has(g)||(u.add(g),p(g.parentNode))};s.forEach(p);var y=function(g){!g||f.has(g)||Array.prototype.forEach.call(g.children,function(v){if(u.has(v))y(v);else try{var w=v.getAttribute(i),x=w!==null&&w!=="false",k=(ls.get(v)||0)+1,S=(l.get(v)||0)+1;ls.set(v,k),l.set(v,S),d.push(v),k===1&&x&&Vc.set(v,!0),S===1&&v.setAttribute(n,"true"),x||v.setAttribute(i,"true")}catch(C){console.error("aria-hidden: cannot operate on ",v,C)}})};return y(e),u.clear(),zf++,function(){d.forEach(function(g){var v=ls.get(g)-1,w=l.get(g)-1;ls.set(g,v),l.set(g,w),v||(Vc.has(g)||g.removeAttribute(i),Vc.delete(g)),w||g.removeAttribute(n)}),zf--,zf||(ls=new WeakMap,ls=new WeakMap,Vc=new WeakMap,Yc={})}},aP=function(t,e,n){n===void 0&&(n="data-aria-hidden");var i=Array.from(Array.isArray(t)?t:[t]),s=eP(t);return s?(i.push.apply(i,Array.from(s.querySelectorAll("[aria-live], script"))),nP(i,s,n,"aria-hidden")):function(){return null}};function oP(t){const e=iP(t),n=A.forwardRef((i,s)=>{const{children:l,...d}=i,u=A.Children.toArray(l),f=u.find(rP);if(f){const p=f.props.children,y=u.map(g=>g===f?A.Children.count(p)>1?A.Children.only(null):A.isValidElement(p)?p.props.children:null:g);return M.jsx(e,{...d,ref:s,children:A.isValidElement(p)?A.cloneElement(p,void 0,y):null})}return M.jsx(e,{...d,ref:s,children:l})});return n.displayName=`${t}.Slot`,n}function iP(t){const e=A.forwardRef((n,i)=>{const{children:s,...l}=n;if(A.isValidElement(s)){const d=cP(s),u=lP(l,s.props);return s.type!==A.Fragment&&(u.ref=i?Gd(i,d):d),A.cloneElement(s,u)}return A.Children.count(s)>1?A.Children.only(null):null});return e.displayName=`${t}.SlotClone`,e}var sP=Symbol("radix.slottable");function rP(t){return A.isValidElement(t)&&typeof t.type=="function"&&"__radixId"in t.type&&t.type.__radixId===sP}function lP(t,e){const n={...e};for(const i in e){const s=t[i],l=e[i];/^on[A-Z]/.test(i)?s&&l?n[i]=(...u)=>{const f=l(...u);return s(...u),f}:s&&(n[i]=s):i==="style"?n[i]={...s,...l}:i==="className"&&(n[i]=[s,l].filter(Boolean).join(" "))}return{...t,...n}}function cP(t){let e=Object.getOwnPropertyDescriptor(t.props,"ref")?.get,n=e&&"isReactWarning"in e&&e.isReactWarning;return n?t.ref:(e=Object.getOwnPropertyDescriptor(t,"ref")?.get,n=e&&"isReactWarning"in e&&e.isReactWarning,n?t.props.ref:t.props.ref||t.ref)}var Vd="Dialog",[GS]=U2(Vd),[dP,jn]=GS(Vd),WS=t=>{const{__scopeDialog:e,children:n,open:i,defaultOpen:s,onOpenChange:l,modal:d=!0}=t,u=A.useRef(null),f=A.useRef(null),[p,y]=z2({prop:i,defaultProp:s??!1,onChange:l,caller:Vd});return M.jsx(dP,{scope:e,triggerRef:u,contentRef:f,contentId:Lf(),titleId:Lf(),descriptionId:Lf(),open:p,onOpenChange:y,onOpenToggle:A.useCallback(()=>y(g=>!g),[y]),modal:d,children:n})};WS.displayName=Vd;var $S="DialogTrigger",uP=A.forwardRef((t,e)=>{const{__scopeDialog:n,...i}=t,s=jn($S,n),l=di(e,s.triggerRef);return M.jsx(Ea.button,{type:"button","aria-haspopup":"dialog","aria-expanded":s.open,"aria-controls":s.contentId,"data-state":om(s.open),...i,ref:l,onClick:xo(t.onClick,s.onOpenToggle)})});uP.displayName=$S;var nm="DialogPortal",[hP,VS]=GS(nm,{forceMount:void 0}),YS=t=>{const{__scopeDialog:e,forceMount:n,children:i,container:s}=t,l=jn(nm,e);return M.jsx(hP,{scope:e,forceMount:n,children:A.Children.map(i,d=>M.jsx(Wd,{present:n||l.open,children:M.jsx(LS,{asChild:!0,container:s,children:d})}))})};YS.displayName=nm;var Sd="DialogOverlay",KS=A.forwardRef((t,e)=>{const n=VS(Sd,t.__scopeDialog),{forceMount:i=n.forceMount,...s}=t,l=jn(Sd,t.__scopeDialog);return l.modal?M.jsx(Wd,{present:i||l.open,children:M.jsx(pP,{...s,ref:e})}):null});KS.displayName=Sd;var fP=oP("DialogOverlay.RemoveScroll"),pP=A.forwardRef((t,e)=>{const{__scopeDialog:n,...i}=t,s=jn(Sd,n);return M.jsx(zS,{as:fP,allowPinchZoom:!0,shards:[s.contentRef],children:M.jsx(Ea.div,{"data-state":om(s.open),...i,ref:e,style:{pointerEvents:"auto",...i.style}})})}),oi="DialogContent",ZS=A.forwardRef((t,e)=>{const n=VS(oi,t.__scopeDialog),{forceMount:i=n.forceMount,...s}=t,l=jn(oi,t.__scopeDialog);return M.jsx(Wd,{present:i||l.open,children:l.modal?M.jsx(mP,{...s,ref:e}):M.jsx(gP,{...s,ref:e})})});ZS.displayName=oi;var mP=A.forwardRef((t,e)=>{const n=jn(oi,t.__scopeDialog),i=A.useRef(null),s=di(e,n.contentRef,i);return A.useEffect(()=>{const l=i.current;if(l)return aP(l)},[]),M.jsx(QS,{...t,ref:s,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:xo(t.onCloseAutoFocus,l=>{l.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:xo(t.onPointerDownOutside,l=>{const d=l.detail.originalEvent,u=d.button===0&&d.ctrlKey===!0;(d.button===2||u)&&l.preventDefault()}),onFocusOutside:xo(t.onFocusOutside,l=>l.preventDefault())})}),gP=A.forwardRef((t,e)=>{const n=jn(oi,t.__scopeDialog),i=A.useRef(!1),s=A.useRef(!1);return M.jsx(QS,{...t,ref:e,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:l=>{t.onCloseAutoFocus?.(l),l.defaultPrevented||(i.current||n.triggerRef.current?.focus(),l.preventDefault()),i.current=!1,s.current=!1},onInteractOutside:l=>{t.onInteractOutside?.(l),l.defaultPrevented||(i.current=!0,l.detail.originalEvent.type==="pointerdown"&&(s.current=!0));const d=l.target;n.triggerRef.current?.contains(d)&&l.preventDefault(),l.detail.originalEvent.type==="focusin"&&s.current&&l.preventDefault()}})}),QS=A.forwardRef((t,e)=>{const{__scopeDialog:n,trapFocus:i,onOpenAutoFocus:s,onCloseAutoFocus:l,...d}=t,u=jn(oi,n),f=A.useRef(null),p=di(e,f);return b3(),M.jsxs(M.Fragment,{children:[M.jsx(PS,{asChild:!0,loop:!0,trapped:i,onMountAutoFocus:s,onUnmountAutoFocus:l,children:M.jsx(IS,{role:"dialog",id:u.contentId,"aria-describedby":u.descriptionId,"aria-labelledby":u.titleId,"data-state":om(u.open),...d,ref:p,onDismiss:()=>u.onOpenChange(!1)})}),M.jsxs(M.Fragment,{children:[M.jsx(yP,{titleId:u.titleId}),M.jsx(vP,{contentRef:f,descriptionId:u.descriptionId})]})]})}),am="DialogTitle",XS=A.forwardRef((t,e)=>{const{__scopeDialog:n,...i}=t,s=jn(am,n);return M.jsx(Ea.h2,{id:s.titleId,...i,ref:e})});XS.displayName=am;var JS="DialogDescription",e0=A.forwardRef((t,e)=>{const{__scopeDialog:n,...i}=t,s=jn(JS,n);return M.jsx(Ea.p,{id:s.descriptionId,...i,ref:e})});e0.displayName=JS;var t0="DialogClose",n0=A.forwardRef((t,e)=>{const{__scopeDialog:n,...i}=t,s=jn(t0,n);return M.jsx(Ea.button,{type:"button",...i,ref:e,onClick:xo(t.onClick,()=>s.onOpenChange(!1))})});n0.displayName=t0;function om(t){return t?"open":"closed"}var a0="DialogTitleWarning",[I6,o0]=N2(a0,{contentName:oi,titleName:am,docsSlug:"dialog"}),yP=({titleId:t})=>{const e=o0(a0),n=`\`${e.contentName}\` requires a \`${e.titleName}\` for the component to be accessible for screen reader users. 96 97If you want to hide the \`${e.titleName}\`, you can wrap it with our VisuallyHidden component. 98 99For more information, see https://radix-ui.com/primitives/docs/components/${e.docsSlug}`;return A.useEffect(()=>{t&&(document.getElementById(t)||console.error(n))},[n,t]),null},bP="DialogDescriptionWarning",vP=({contentRef:t,descriptionId:e})=>{const i=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${o0(bP).contentName}}.`;return A.useEffect(()=>{const s=t.current?.getAttribute("aria-describedby");e&&s&&(document.getElementById(e)||console.warn(i))},[i,t,e]),null},wP=WS,xP=YS,i0=KS,s0=ZS,r0=XS,l0=e0,kP=n0;function c0(t){var e,n,i="";if(typeof t=="string"||typeof t=="number")i+=t;else if(typeof t=="object")if(Array.isArray(t)){var s=t.length;for(e=0;e<s;e++)t[e]&&(n=c0(t[e]))&&(i&&(i+=" "),i+=n)}else for(n in t)t[n]&&(i&&(i+=" "),i+=n);return i}function d0(){for(var t,e,n=0,i="",s=arguments.length;n<s;n++)(t=arguments[n])&&(e=c0(t))&&(i&&(i+=" "),i+=e);return i}const SP=(t,e)=>{const n=new Array(t.length+e.length);for(let i=0;i<t.length;i++)n[i]=t[i];for(let i=0;i<e.length;i++)n[t.length+i]=e[i];return n},_P=(t,e)=>({classGroupId:t,validator:e}),u0=(t=new Map,e=null,n)=>({nextPart:t,validators:e,classGroupId:n}),_d="-",dx=[],CP="arbitrary..",AP=t=>{const e=RP(t),{conflictingClassGroups:n,conflictingClassGroupModifiers:i}=t;return{getClassGroupId:d=>{if(d.startsWith("[")&&d.endsWith("]"))return TP(d);const u=d.split(_d),f=u[0]===""&&u.length>1?1:0;return h0(u,f,e)},getConflictingClassGroupIds:(d,u)=>{if(u){const f=i[d],p=n[d];return f?p?SP(p,f):f:p||dx}return n[d]||dx}}},h0=(t,e,n)=>{if(t.length-e===0)return n.classGroupId;const s=t[e],l=n.nextPart.get(s);if(l){const p=h0(t,e+1,l);if(p)return p}const d=n.validators;if(d===null)return;const u=e===0?t.join(_d):t.slice(e).join(_d),f=d.length;for(let p=0;p<f;p++){const y=d[p];if(y.validator(u))return y.classGroupId}},TP=t=>t.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const e=t.slice(1,-1),n=e.indexOf(":"),i=e.slice(0,n);return i?CP+i:void 0})(),RP=t=>{const{theme:e,classGroups:n}=t;return EP(n,e)},EP=(t,e)=>{const n=u0();for(const i in t){const s=t[i];im(s,n,i,e)}return n},im=(t,e,n,i)=>{const s=t.length;for(let l=0;l<s;l++){const d=t[l];OP(d,e,n,i)}},OP=(t,e,n,i)=>{if(typeof t=="string"){IP(t,e,n);return}if(typeof t=="function"){MP(t,e,n,i);return}PP(t,e,n,i)},IP=(t,e,n)=>{const i=t===""?e:f0(e,t);i.classGroupId=n},MP=(t,e,n,i)=>{if(DP(t)){im(t(i),e,n,i);return}e.validators===null&&(e.validators=[]),e.validators.push(_P(n,t))},PP=(t,e,n,i)=>{const s=Object.entries(t),l=s.length;for(let d=0;d<l;d++){const[u,f]=s[d];im(f,f0(e,u),n,i)}},f0=(t,e)=>{let n=t;const i=e.split(_d),s=i.length;for(let l=0;l<s;l++){const d=i[l];let u=n.nextPart.get(d);u||(u=u0(),n.nextPart.set(d,u)),n=u}return n},DP=t=>"isThemeGetter"in t&&t.isThemeGetter===!0,LP=t=>{if(t<1)return{get:()=>{},set:()=>{}};let e=0,n=Object.create(null),i=Object.create(null);const s=(l,d)=>{n[l]=d,e++,e>t&&(e=0,i=n,n=Object.create(null))};return{get(l){let d=n[l];if(d!==void 0)return d;if((d=i[l])!==void 0)return s(l,d),d},set(l,d){l in n?n[l]=d:s(l,d)}}},Ap="!",ux=":",NP=[],hx=(t,e,n,i,s)=>({modifiers:t,hasImportantModifier:e,baseClassName:n,maybePostfixModifierPosition:i,isExternal:s}),UP=t=>{const{prefix:e,experimentalParseClassName:n}=t;let i=s=>{const l=[];let d=0,u=0,f=0,p;const y=s.length;for(let k=0;k<y;k++){const S=s[k];if(d===0&&u===0){if(S===ux){l.push(s.slice(f,k)),f=k+1;continue}if(S==="/"){p=k;continue}}S==="["?d++:S==="]"?d--:S==="("?u++:S===")"&&u--}const g=l.length===0?s:s.slice(f);let v=g,w=!1;g.endsWith(Ap)?(v=g.slice(0,-1),w=!0):g.startsWith(Ap)&&(v=g.slice(1),w=!0);const x=p&&p>f?p-f:void 0;return hx(l,w,v,x)};if(e){const s=e+ux,l=i;i=d=>d.startsWith(s)?l(d.slice(s.length)):hx(NP,!1,d,void 0,!0)}if(n){const s=i;i=l=>n({className:l,parseClassName:s})}return i},jP=t=>{const e=new Map;return t.orderSensitiveModifiers.forEach((n,i)=>{e.set(n,1e6+i)}),n=>{const i=[];let s=[];for(let l=0;l<n.length;l++){const d=n[l],u=d[0]==="[",f=e.has(d);u||f?(s.length>0&&(s.sort(),i.push(...s),s=[]),i.push(d)):s.push(d)}return s.length>0&&(s.sort(),i.push(...s)),i}},FP=t=>({cache:LP(t.cacheSize),parseClassName:UP(t),sortModifiers:jP(t),...AP(t)}),qP=/\s+/,BP=(t,e)=>{const{parseClassName:n,getClassGroupId:i,getConflictingClassGroupIds:s,sortModifiers:l}=e,d=[],u=t.trim().split(qP);let f="";for(let p=u.length-1;p>=0;p-=1){const y=u[p],{isExternal:g,modifiers:v,hasImportantModifier:w,baseClassName:x,maybePostfixModifierPosition:k}=n(y);if(g){f=y+(f.length>0?" "+f:f);continue}let S=!!k,C=i(S?x.substring(0,k):x);if(!C){if(!S){f=y+(f.length>0?" "+f:f);continue}if(C=i(x),!C){f=y+(f.length>0?" "+f:f);continue}S=!1}const E=v.length===0?"":v.length===1?v[0]:l(v).join(":"),R=w?E+Ap:E,D=R+C;if(d.indexOf(D)>-1)continue;d.push(D);const G=s(C,S);for(let z=0;z<G.length;++z){const N=G[z];d.push(R+N)}f=y+(f.length>0?" "+f:f)}return f},zP=(...t)=>{let e=0,n,i,s="";for(;e<t.length;)(n=t[e++])&&(i=p0(n))&&(s&&(s+=" "),s+=i);return s},p0=t=>{if(typeof t=="string")return t;let e,n="";for(let i=0;i<t.length;i++)t[i]&&(e=p0(t[i]))&&(n&&(n+=" "),n+=e);return n},HP=(t,...e)=>{let n,i,s,l;const d=f=>{const p=e.reduce((y,g)=>g(y),t());return n=FP(p),i=n.cache.get,s=n.cache.set,l=u,u(f)},u=f=>{const p=i(f);if(p)return p;const y=BP(f,n);return s(f,y),y};return l=d,(...f)=>l(zP(...f))},GP=[],_t=t=>{const e=n=>n[t]||GP;return e.isThemeGetter=!0,e},m0=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,g0=/^\((?:(\w[\w-]*):)?(.+)\)$/i,WP=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,$P=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,VP=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,YP=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,KP=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,ZP=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ao=t=>WP.test(t),Te=t=>!!t&&!Number.isNaN(Number(t)),oo=t=>!!t&&Number.isInteger(Number(t)),Hf=t=>t.endsWith("%")&&Te(t.slice(0,-1)),ka=t=>$P.test(t),y0=()=>!0,QP=t=>VP.test(t)&&!YP.test(t),sm=()=>!1,XP=t=>KP.test(t),JP=t=>ZP.test(t),eD=t=>!se(t)&&!le(t),tD=t=>To(t,w0,sm),se=t=>m0.test(t),Ko=t=>To(t,x0,QP),fx=t=>To(t,cD,Te),nD=t=>To(t,S0,y0),aD=t=>To(t,k0,sm),px=t=>To(t,b0,sm),oD=t=>To(t,v0,JP),Kc=t=>To(t,_0,XP),le=t=>g0.test(t),Dr=t=>ui(t,x0),iD=t=>ui(t,k0),mx=t=>ui(t,b0),sD=t=>ui(t,w0),rD=t=>ui(t,v0),Zc=t=>ui(t,_0,!0),lD=t=>ui(t,S0,!0),To=(t,e,n)=>{const i=m0.exec(t);return i?i[1]?e(i[1]):n(i[2]):!1},ui=(t,e,n=!1)=>{const i=g0.exec(t);return i?i[1]?e(i[1]):n:!1},b0=t=>t==="position"||t==="percentage",v0=t=>t==="image"||t==="url",w0=t=>t==="length"||t==="size"||t==="bg-size",x0=t=>t==="length",cD=t=>t==="number",k0=t=>t==="family-name",S0=t=>t==="number"||t==="weight",_0=t=>t==="shadow",dD=()=>{const t=_t("color"),e=_t("font"),n=_t("text"),i=_t("font-weight"),s=_t("tracking"),l=_t("leading"),d=_t("breakpoint"),u=_t("container"),f=_t("spacing"),p=_t("radius"),y=_t("shadow"),g=_t("inset-shadow"),v=_t("text-shadow"),w=_t("drop-shadow"),x=_t("blur"),k=_t("perspective"),S=_t("aspect"),C=_t("ease"),E=_t("animate"),R=()=>["auto","avoid","all","avoid-page","page","left","right","column"],D=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],G=()=>[...D(),le,se],z=()=>["auto","hidden","clip","visible","scroll"],N=()=>["auto","contain","none"],P=()=>[le,se,f],W=()=>[ao,"full","auto",...P()],oe=()=>[oo,"none","subgrid",le,se],ne=()=>["auto",{span:["full",oo,le,se]},oo,le,se],we=()=>[oo,"auto",le,se],Fe=()=>["auto","min","max","fr",le,se],tt=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],qe=()=>["start","end","center","stretch","center-safe","end-safe"],q=()=>["auto",...P()],K=()=>[ao,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...P()],he=()=>[ao,"screen","full","dvw","lvw","svw","min","max","fit",...P()],Le=()=>[ao,"screen","full","lh","dvh","lvh","svh","min","max","fit",...P()],X=()=>[t,le,se],O=()=>[...D(),mx,px,{position:[le,se]}],V=()=>["no-repeat",{repeat:["","x","y","space","round"]}],Q=()=>["auto","cover","contain",sD,tD,{size:[le,se]}],ee=()=>[Hf,Dr,Ko],te=()=>["","none","full",p,le,se],fe=()=>["",Te,Dr,Ko],Re=()=>["solid","dashed","dotted","double"],ot=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],ve=()=>[Te,Hf,mx,px],yn=()=>["","none",x,le,se],Vt=()=>
vendor: 4,188 bytes, line 99
99["none",Te,le,se],on=()=>["none",Te,le,se],Jn=()=>[Te,le,se],Gt=()=>[ao,"full",...P()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[ka],breakpoint:[ka],color:[y0],container:[ka],"drop-shadow":[ka],ease:["in","out","in-out"],font:[eD],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[ka],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[ka],shadow:[ka],spacing:["px",Te],text:[ka],"text-shadow":[ka],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",ao,se,le,S]}],container:["container"],columns:[{columns:[Te,se,le,u]}],"break-after":[{"break-after":R()}],"break-before":[{"break-before":R()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:G()}],overflow:[{overflow:z()}],"overflow-x":[{"overflow-x":z()}],"overflow-y":[{"overflow-y":z()}],overscroll:[{overscroll:N()}],"overscroll-x":[{"overscroll-x":N()}],"overscroll-y":[{"overscroll-y":N()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:W()}],"inset-x":[{"inset-x":W()}],"inset-y":[{"inset-y":W()}],start:[{"inset-s":W(),start:W()}],end:[{"inset-e":W(),end:W()}],"inset-bs":[{"inset-bs":W()}],"inset-be":[{"inset-be":W()}],top:[{top:W()}],right:[{right:W()}],bottom:[{bottom:W()}],left:[{left:W()}],visibility:["visible","invisible","collapse"],z:[{z:[oo,"auto",le,se]}],basis:[{basis:[ao,"full","auto",u,...P()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[Te,ao,"auto","initial","none",se]}],grow:[{grow:["",Te,le,se]}],shrink:[{shrink:["",Te,le,se]}],order:[{order:[oo,"first","last","none",le,se]}],"grid-cols":[{"grid-cols":oe()}],"col-start-end":[{col:ne()}],"col-start":[{"col-start":we()}],"col-end":[{"col-end":we()}],"grid-rows":[{"grid-rows":oe()}],"row-start-end":[{row:ne()}],"row-start":[{"row-start":we()}],"row-end":[{"row-end":we()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":Fe()}],"auto-rows":[{"auto-rows":Fe()}],gap:[{gap:P()}],"gap-x":[{"gap-x":P()}],"gap-y":[{"gap-y":P()}],"justify-content":[{justify:[...tt(),"normal"]}],"justify-items":[{"justify-items":[...qe(),"normal"]}],"justify-self":[{"justify-self":["auto",...qe()]}],"align-content":[{content:["normal",...tt()]}],"align-items":[{items:[...qe(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...qe(),{baseline:["","last"]}]}],"place-content":[{"place-content":tt()}],"place-items":[{"place-items":[...qe(),"baseline"]}],"place-self":[{"place-self":["auto",...qe()]}],p:[{p:P()}],px:[{px:P()}],py:[{py:P()}],ps:[{ps:P()}],pe:[{pe:P()}],pbs:[{pbs:P()}],pbe:[{pbe:P()}],pt:[{pt:P()}],pr:[{pr:P()}],pb:[{pb:P()}],pl:[{pl:P()}],m:[{m:q()}],mx:[{mx:q()}],my:[{my:q()}],ms:[{ms:q()}],me:[{me:q()}],mbs:[{mbs:q()}],mbe:[{mbe:q()}],mt:[{mt:q()}],mr:[{mr:q()}],mb:[{mb:q()}],ml:[{ml:q()}],"space-x":[{"space-x":P()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":P()}],"space-y-reverse":["space-y-reverse"],size:[{size:K()}],"inline-size":[{inline:["auto",...he()]}],"min-inline-size":[{"min-inline":["auto",...he()]}],"max-inline-size":[{"max-inline":["none",...he()]}],"block-size":[{block:["auto",...Le()]}],"min-block-size":[{"min-block":["auto",...Le()]}],"max-block-size":[{"max-block":["none",...Le()]}
vendor: 4,297 bytes, line 99
99],w:[{w:[u,"screen",...K()]}],"min-w":[{"min-w":[u,"screen","none",...K()]}],"max-w":[{"max-w":[u,"screen","none","prose",{screen:[d]},...K()]}],h:[{h:["screen","lh",...K()]}],"min-h":[{"min-h":["screen","lh","none",...K()]}],"max-h":[{"max-h":["screen","lh",...K()]}],"font-size":[{text:["base",n,Dr,Ko]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[i,lD,nD]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",Hf,se]}],"font-family":[{font:[iD,aD,e]}],"font-features":[{"font-features":[se]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[s,le,se]}],"line-clamp":[{"line-clamp":[Te,"none",le,fx]}],leading:[{leading:[l,...P()]}],"list-image":[{"list-image":["none",le,se]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",le,se]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:X()}],"text-color":[{text:X()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Re(),"wavy"]}],"text-decoration-thickness":[{decoration:[Te,"from-font","auto",le,Ko]}],"text-decoration-color":[{decoration:X()}],"underline-offset":[{"underline-offset":[Te,"auto",le,se]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:P()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",le,se]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",le,se]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:O()}],"bg-repeat":[{bg:V()}],"bg-size":[{bg:Q()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},oo,le,se],radial:["",le,se],conic:[oo,le,se]},rD,oD]}],"bg-color":[{bg:X()}],"gradient-from-pos":[{from:ee()}],"gradient-via-pos":[{via:ee()}],"gradient-to-pos":[{to:ee()}],"gradient-from":[{from:X()}],"gradient-via":[{via:X()}],"gradient-to":[{to:X()}],rounded:[{rounded:te()}],"rounded-s":[{"rounded-s":te()}],"rounded-e":[{"rounded-e":te()}],"rounded-t":[{"rounded-t":te()}],"rounded-r":[{"rounded-r":te()}],"rounded-b":[{"rounded-b":te()}],"rounded-l":[{"rounded-l":te()}],"rounded-ss":[{"rounded-ss":te()}],"rounded-se":[{"rounded-se":te()}],"rounded-ee":[{"rounded-ee":te()}],"rounded-es":[{"rounded-es":te()}],"rounded-tl":[{"rounded-tl":te()}],"rounded-tr":[{"rounded-tr":te()}],"rounded-br":[{"rounded-br":te()}],"rounded-bl":[{"rounded-bl":te()}],"border-w":[{border:fe()}],"border-w-x":[{"border-x":fe()}],"border-w-y":[{"border-y":fe()}],"border-w-s":[{"border-s":fe()}],"border-w-e":[{"border-e":fe()}],"border-w-bs":[{"border-bs":fe()}],"border-w-be":[{"border-be":fe()}],"border-w-t":[{"border-t":fe()}],"border-w-r":[{"border-r":fe()}],"border-w-b":[{"border-b":fe()}],"border-w-l":[{"border-l":fe()}],"divide-x":[{"divide-x":fe()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":fe()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...Re(),"hidden","none"]}],"divide-style":[{divide:[...Re(),"hidden","none"]}],"border-color":[{border:X()}],"border-color-x":[{"border-x":X()}],"border-color-y":[{"border-y":X()}],"border-color-s":[{"border-s":X()}],"border-color-e":[{"border-e":X()}],"border-color-bs":[{"border-bs":X()}],"border-color-be":[{"border-be":X()}],"border-color-t":[{"border-t":X()}],"border-color-r":[{"border-r":X()}],"border-color-b":[{"border-b":X()}],"border-color-l":[{"border-l":X()}
vendor: 4,122 bytes, line 99
99],"divide-color":[{divide:X()}],"outline-style":[{outline:[...Re(),"none","hidden"]}],"outline-offset":[{"outline-offset":[Te,le,se]}],"outline-w":[{outline:["",Te,Dr,Ko]}],"outline-color":[{outline:X()}],shadow:[{shadow:["","none",y,Zc,Kc]}],"shadow-color":[{shadow:X()}],"inset-shadow":[{"inset-shadow":["none",g,Zc,Kc]}],"inset-shadow-color":[{"inset-shadow":X()}],"ring-w":[{ring:fe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:X()}],"ring-offset-w":[{"ring-offset":[Te,Ko]}],"ring-offset-color":[{"ring-offset":X()}],"inset-ring-w":[{"inset-ring":fe()}],"inset-ring-color":[{"inset-ring":X()}],"text-shadow":[{"text-shadow":["none",v,Zc,Kc]}],"text-shadow-color":[{"text-shadow":X()}],opacity:[{opacity:[Te,le,se]}],"mix-blend":[{"mix-blend":[...ot(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":ot()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[Te]}],"mask-image-linear-from-pos":[{"mask-linear-from":ve()}],"mask-image-linear-to-pos":[{"mask-linear-to":ve()}],"mask-image-linear-from-color":[{"mask-linear-from":X()}],"mask-image-linear-to-color":[{"mask-linear-to":X()}],"mask-image-t-from-pos":[{"mask-t-from":ve()}],"mask-image-t-to-pos":[{"mask-t-to":ve()}],"mask-image-t-from-color":[{"mask-t-from":X()}],"mask-image-t-to-color":[{"mask-t-to":X()}],"mask-image-r-from-pos":[{"mask-r-from":ve()}],"mask-image-r-to-pos":[{"mask-r-to":ve()}],"mask-image-r-from-color":[{"mask-r-from":X()}],"mask-image-r-to-color":[{"mask-r-to":X()}],"mask-image-b-from-pos":[{"mask-b-from":ve()}],"mask-image-b-to-pos":[{"mask-b-to":ve()}],"mask-image-b-from-color":[{"mask-b-from":X()}],"mask-image-b-to-color":[{"mask-b-to":X()}],"mask-image-l-from-pos":[{"mask-l-from":ve()}],"mask-image-l-to-pos":[{"mask-l-to":ve()}],"mask-image-l-from-color":[{"mask-l-from":X()}],"mask-image-l-to-color":[{"mask-l-to":X()}],"mask-image-x-from-pos":[{"mask-x-from":ve()}],"mask-image-x-to-pos":[{"mask-x-to":ve()}],"mask-image-x-from-color":[{"mask-x-from":X()}],"mask-image-x-to-color":[{"mask-x-to":X()}],"mask-image-y-from-pos":[{"mask-y-from":ve()}],"mask-image-y-to-pos":[{"mask-y-to":ve()}],"mask-image-y-from-color":[{"mask-y-from":X()}],"mask-image-y-to-color":[{"mask-y-to":X()}],"mask-image-radial":[{"mask-radial":[le,se]}],"mask-image-radial-from-pos":[{"mask-radial-from":ve()}],"mask-image-radial-to-pos":[{"mask-radial-to":ve()}],"mask-image-radial-from-color":[{"mask-radial-from":X()}],"mask-image-radial-to-color":[{"mask-radial-to":X()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":D()}],"mask-image-conic-pos":[{"mask-conic":[Te]}],"mask-image-conic-from-pos":[{"mask-conic-from":ve()}],"mask-image-conic-to-pos":[{"mask-conic-to":ve()}],"mask-image-conic-from-color":[{"mask-conic-from":X()}],"mask-image-conic-to-color":[{"mask-conic-to":X()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:O()}],"mask-repeat":[{mask:V()}],"mask-size":[{mask:Q()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",le,se]}],filter:[{filter:["","none",le,se]}],blur:[{blur:yn()}],brightness:[{brightness:[Te,le,se]}],contrast:[{contrast:[Te,le,se]}],"drop-shadow":[{"drop-shadow":["","none",w,Zc,Kc]}],"drop-shadow-color":[{"drop-shadow":X()}],grayscale:[{grayscale:["",Te,le,se]}],"hue-rotate":[{"hue-rotate":[Te,le,se]}],invert:[{invert:["",Te,le,se]}],saturate:[{saturate:[Te,le,se]}],sepia:[{sepia:["",Te,le,se]}],"backdrop-filter":[{"backdrop-filter":["","none",le,se]}],"backdrop-blur":[{"backdrop-blur":yn()}],"backdrop-brightness":[{"backdrop-brightness":[Te,le,se]}],"backdrop-contrast":[{"backdrop-contrast":[Te,le,se]}],"backdrop-grayscale":[{"backdrop-grayscale":["",Te,le,se]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[Te,le,se]}
vendor: 7,215 bytes, line 99
99],"backdrop-invert":[{"backdrop-invert":["",Te,le,se]}],"backdrop-opacity":[{"backdrop-opacity":[Te,le,se]}],"backdrop-saturate":[{"backdrop-saturate":[Te,le,se]}],"backdrop-sepia":[{"backdrop-sepia":["",Te,le,se]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":P()}],"border-spacing-x":[{"border-spacing-x":P()}],"border-spacing-y":[{"border-spacing-y":P()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",le,se]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[Te,"initial",le,se]}],ease:[{ease:["linear","initial",C,le,se]}],delay:[{delay:[Te,le,se]}],animate:[{animate:["none",E,le,se]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[k,le,se]}],"perspective-origin":[{"perspective-origin":G()}],rotate:[{rotate:Vt()}],"rotate-x":[{"rotate-x":Vt()}],"rotate-y":[{"rotate-y":Vt()}],"rotate-z":[{"rotate-z":Vt()}],scale:[{scale:on()}],"scale-x":[{"scale-x":on()}],"scale-y":[{"scale-y":on()}],"scale-z":[{"scale-z":on()}],"scale-3d":["scale-3d"],skew:[{skew:Jn()}],"skew-x":[{"skew-x":Jn()}],"skew-y":[{"skew-y":Jn()}],transform:[{transform:[le,se,"","none","gpu","cpu"]}],"transform-origin":[{origin:G()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:Gt()}],"translate-x":[{"translate-x":Gt()}],"translate-y":[{"translate-y":Gt()}],"translate-z":[{"translate-z":Gt()}],"translate-none":["translate-none"],accent:[{accent:X()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:X()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",le,se]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":P()}],"scroll-mx":[{"scroll-mx":P()}],"scroll-my":[{"scroll-my":P()}],"scroll-ms":[{"scroll-ms":P()}],"scroll-me":[{"scroll-me":P()}],"scroll-mbs":[{"scroll-mbs":P()}],"scroll-mbe":[{"scroll-mbe":P()}],"scroll-mt":[{"scroll-mt":P()}],"scroll-mr":[{"scroll-mr":P()}],"scroll-mb":[{"scroll-mb":P()}],"scroll-ml":[{"scroll-ml":P()}],"scroll-p":[{"scroll-p":P()}],"scroll-px":[{"scroll-px":P()}],"scroll-py":[{"scroll-py":P()}],"scroll-ps":[{"scroll-ps":P()}],"scroll-pe":[{"scroll-pe":P()}],"scroll-pbs":[{"scroll-pbs":P()}],"scroll-pbe":[{"scroll-pbe":P()}],"scroll-pt":[{"scroll-pt":P()}],"scroll-pr":[{"scroll-pr":P()}],"scroll-pb":[{"scroll-pb":P()}],"scroll-pl":[{"scroll-pl":P()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",le,se]}],fill:[{fill:["none",...X()]}],"stroke-w":[{stroke:[Te,Dr,Ko,fx]}],stroke:[{stroke:["none",...X()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","inset-bs","inset-be","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pbs","pbe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mbs","mbe","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-bs","border-w-be","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-bs","border-color-be","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mbs","scroll-mbe","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pbs","scroll-pbe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},uD=HP(dD);function hi(...t){return uD(d0(t))}const hD=wP,fD=xP,C0=A.forwardRef(({className:t,...e},n)=>M.jsx(i0,{ref:n,className:hi("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",t),...e}));C0.displayName=i0.displayName;const A0=A.forwardRef(({className:t,children:e,...n},i)=>M.jsxs(fD,{children:[M.jsx(C0,{}),M.jsxs(s0,{ref:i,className:hi("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg",t),...n,children:[e,M.jsxs(kP,{className:"absolute right-4 top-4 roun
99ded-sm opacity-70 ring-offset-background cursor-pointer transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[M.jsx(ES,{className:"h-4 w-4"}),M.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));A0.displayName=s0.displayName;const T0=({className:t,...e})=>M.jsx("div",{className:hi("flex flex-col space-y-1.5 text-center sm:text-left",t),...e});T0.displayName="DialogHeader";const R0=A.forwardRef(({className:t,...e},n)=>M.jsx(r0,{ref:n,className:hi("text-lg font-semibold leading-none tracking-tight",t),...e}));R0.displayName=r0.displayName;const E0=A.forwardRef(({className:t,...e},n)=>M.jsx(l0,{ref:n,className:hi("text-sm text-muted-foreground",t),...e}));E0.displayName=l0.displayName;const sd=A.forwardRef(({className:t,type:e,...n},i)=>M.jsx("input",{type:e,className:hi("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",t),ref:i,...n}));sd.displayName="Input";var pD=Symbol.for("react.lazy"),Cd=Mp[" use ".trim().toString()];function mD(t){return typeof t=="object"&&t!==null&&"then"in t}function O0(t){return t!=null&&typeof t=="object"&&"$$typeof"in t&&t.$$typeof===pD&&"_payload"in t&&mD(t._payload)}function gD(t){const e=yD(t),n=A.forwardRef((i,s)=>{let{children:l,...d}=i;O0(l)&&typeof Cd=="function"&&(l=Cd(l._payload));const u=A.Children.toArray(l),f=u.find(vD);if(f){const p=f.props.children,y=u.map(g=>g===f?A.Children.count(p)>1?A.Children.only(null):A.isValidElement(p)?p.props.children:null:g);return M.jsx(e,{...d,ref:s,children:A.isValidElement(p)?A.cloneElement(p,void 0,y):null})}return M.jsx(e,{...d,ref:s,children:l})});return n.displayName=`${t}.Slot`,n}function yD(t){const e=A.forwardRef((n,i)=>{let{children:s,...l}=n;if(O0(s)&&typeof Cd=="function"&&(s=Cd(s._payload)),A.isValidElement(s)){const d=xD(s),u=wD(l,s.props);return s.type!==A.Fragment&&(u.ref=i?Gd(i,d):d),A.cloneElement(s,u)}return A.Children.count(s)>1?A.Children.only(null):null});return e.displayName=`${t}.SlotClone`,e}var bD=Symbol("radix.slottable");function vD(t){return A.isValidElement(t)&&typeof t.type=="function"&&"__radixId"in t.type&&t.type.__radixId===bD}function wD(t,e){const n={...e};for(const i in e){const s=t[i],l=e[i];/^on[A-Z]/.test(i)?s&&l?n[i]=(...u)=>{const f=l(...u);return s(...u),f}:s&&(n[i]=s):i==="style"?n[i]={...s,...l}:i==="className"&&(n[i]=[s,l].filter(Boolean).join(" "))}return{...t,...n}}function xD(t){let e=Object.getOwnPropertyDescriptor(t.props,"ref")?.get,n=e&&"isReactWarning"in e&&e.isReactWarning;return n?t.ref:(e=Object.getOwnPropertyDescriptor(t,"ref")?.get,n=e&&"isReactWarning"in e&&e.isReactWarning,n?t.props.ref:t.props.ref||t.ref)}var kD=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],SD=kD.reduce((t,e)=>{const n=gD(`Primitive.${e}`),i=A.forwardRef((s,l)=>{const{asChild:d,...u}=s,f=d?n:e;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),M.jsx(f,{...u,ref:l})});return i.displayName=`Primitive.${e}`,{...t,[e]:i}},{}),_D="Label",I0=A.forwardRef((t,e)=>M.jsx(SD.label,{...t,ref:e,onMouseDown:n=>{n.target.closest("button, input, select, textarea")||(t.onMouseDown?.(n),!n.defaultPrevented&&n.detail>1&&n.preventDefault())}}));I0.displayName=_D;var M0=I0;const gx=t=>typeof t=="boolean"?`${t}`:t===0?"0":t,yx=d0,CD=(t,e)=>n=>{if(e?.variants==null)return yx(t,n?.class,n?.className);const{variants:i,defaultVariants:s}=e,l=Object.keys(i).map(u=>{const f=n?.[u],p=s?.[u];if(f===null)return null;const y=gx(f)||gx(p);return i[u][y]});return n&&Object.entries(n).reduce((u,f)=>{let[p,y]=f;return y===void 0||(u[p]=y),u},{}),yx(t,l,void 0,n?.class,n?.className)},AD=CD("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),fs=A.forwardRef(({className:t,...e},n)=>M.jsx(M0,{ref:n,className:hi(AD(),t),...e}));fs.displayName=M0.displayName;const TD=["Agency","Freelancer","SaaS company","Other"],RD=["Instantly","Smartlead","Apollo","Saleshandy","Reachinbox","Heyreach","Aimfox","Lemlist","Woodpecker","Mailshake","Outreach.io","Salesloft","Reply.io","QuickMail","Klenty","Hunter Campaigns","Snov.io","MailerLite","Mixmax","GMass","Yesware","PersistIQ","Amplemarket","La Growth Machine","Expandi","Dripify","Waalaxy","
99Linked Helper","MeetAlfred","Skylead","Zopto","Closely","We-Connect","Octopus CRM","Custom / in-house","None","Other"];function ED({open:t,onOpenChange:e}){const n=LO(L2),[i,s]=bt.useState(""),[l,d]=bt.useState(""),[u,f]=bt.useState(""),[p,y]=bt.useState(""),[g,v]=bt.useState([]),[w,x]=bt.useState(!1),[k,S]=bt.useState(!1),[C,E]=bt.useState(!1),[R,D]=bt.useState(null),G=bt.useRef(null);bt.useEffect(()=>{function P(W){G.current&&!G.current.contains(W.target)&&x(!1)}return document.addEventListener("mousedown",P),()=>document.removeEventListener("mousedown",P)},[]),bt.useEffect(()=>{t||setTimeout(()=>{E(!1),D(null)},200)},[t]);function z(P){v(W=>W.includes(P)?W.filter(oe=>oe!==P):[...W,P])}async function N(P){if(P.preventDefault(),D(null),!i.trim()||!l.trim()||!p){D("Please fill in the required fields.");return}S(!0);try{await n({data:{name:i.trim(),email:l.trim(),website:u.trim(),company_type:p,outreach_tools:g}}),E(!0),s(""),d(""),f(""),y(""),v([])}catch(W){D(W instanceof Error?W.message:"Something went wrong.")}finally{S(!1)}}return M.jsx(hD,{open:t,onOpenChange:e,children:M.jsxs(A0,{className:"max-w-lg rounded-2xl",children:[M.jsxs(T0,{children:[M.jsx(R0,{className:"text-2xl font-semibold tracking-tight",children:"Join the OutreachFox waitlist"}),M.jsx(E0,{children:"We'll be in touch as spots open up. Takes under a minute."})]}),C?M.jsxs("div",{className:"py-6 text-center",children:[M.jsx("div",{className:"mx-auto mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-lime text-ink",children:M.jsx(Zw,{className:"h-5 w-5"})}),M.jsx("p",{className:"text-sm text-ink font-medium",children:"You're on the list."}),M.jsxs("p",{className:"mt-1 text-xs text-muted-foreground",children:["We'll reach out to ",M.jsx("span",{className:"font-medium",children:l||"you"})," soon."]})]}):M.jsxs("form",{onSubmit:N,className:"space-y-4",children:[M.jsxs("div",{className:"grid gap-2",children:[M.jsxs(fs,{htmlFor:"wl-name",children:["Name ",M.jsx("span",{className:"text-destructive",children:"*"})]}),M.jsx(sd,{id:"wl-name",value:i,onChange:P=>s(P.target.value),required:!0,maxLength:120})]}),M.jsxs("div",{className:"grid gap-2",children:[M.jsxs(fs,{htmlFor:"wl-email",children:["Email ",M.jsx("span",{className:"text-destructive",children:"*"})]}),M.jsx(sd,{id:"wl-email",type:"email",value:l,onChange:P=>d(P.target.value),required:!0,maxLength:255})]}),M.jsxs("div",{className:"grid gap-2",children:[M.jsx(fs,{htmlFor:"wl-website",children:"Website"}),M.jsx(sd,{id:"wl-website",placeholder:"yourcompany.com",value:u,onChange:P=>f(P.target.value),maxLength:255})]}),M.jsxs("div",{className:"grid gap-2",children:[M.jsxs(fs,{children:["You are a ",M.jsx("span",{className:"text-destructive",children:"*"})]}),M.jsx("div",{className:"flex flex-wrap gap-2",children:TD.map(P=>{const W=p===P;return M.jsx("button",{type:"button",onClick:()=>y(P),className:`rounded-full border px-3 py-1.5 text-xs transition ${W?"bg-ink text-white border-ink":"bg-white text-ink border-border hover:bg-secondary"}`,children:P},P)})})]}),M.jsxs("div",{className:"grid gap-2",ref:G,children:[M.jsx(fs,{children:"Which outreach tool(s) do you currently use?"}),M.jsxs("div",{className:"relative",children:[M.jsxs("button",{type:"button",onClick:()=>x(P=>!P),className:"flex w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2 text-left text-sm shadow-sm hover:bg-secondary/50",children:[M.jsx("span",{className:g.length===0?"text-muted-foreground":"text-ink",children:g.length===0?"Select all that apply":`${g.length} selected`}),M.jsx(I2,{className:`h-4 w-4 transition-transform ${w?"rotate-180":""}`})]}),w&&M.jsx("div",{className:"absolute z-50 mt-1 max-h-64 w-full overflow-auto rounded-md border border-border bg-white p-1 shadow-lg",children:RD.map(P=>{const W=g.includes(P);return M.jsxs("button",{type:"button",onClick:()=>z(P),className:"flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-sm hover:bg-secondary",children:[M.jsx("span",{className:`flex h-4 w-4 items-center justify-center rounded border ${W?"bg-ink border-ink text-white":"border-border bg-white"}`,children:W&&M.jsx(Zw,{className:"h-3 w-3"})}),M.jsx("span",{className:"text-ink",children:P})]},P)})})]}),g.length>0&&M.jsx("div",{className:"flex flex-wrap gap-1.5 pt-1",children:g.map(P=>M.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-secondary px-2 py-0.5 text-[11px] text-ink",children:[P,M.jsx("button",{type:"button",onClick:()=>z(P),className:"text-muted-foreground hover:text-ink",children:M.jsx(ES,{className:"h-3 w-3"})})]},P))})]}),R&&M.jsx("p",{className:"text-xs text-destructive",children:R}),M.jsxs("button",{type:"submit",disabled:k,className:"inline-flex w-full items-center justify-center gap-2 rounded-md bg-ink text-white text-sm font-medium px-5 py-3 hover:bg-ink/90 transition disabled:opacity-60",children:[k&&M.jsx(P2,{className:"h-4 w-4 animate-spin"}),k?"Submitting...":"Join waitlist"]})]})]})})}function OD(){const[t,e]=bt.useState(!1);return bt.useEffect(()=>{function n(){e(!0)}
99return window.addEventListener("open-waitlist",n),()=>window.removeEventListener("open-waitlist",n)},[]),M.jsx(ED,{open:t,onOpenChange:e})}const bx="https://outreachfox.ai",vx={"":"Home",blog:"Blog",pricing:"Pricing",affiliate:"Affiliate",enrichment:"Enrichment",outreach:"Outreach","master-inbox":"Master Inbox","mailbox-infra":"Mailbox Infra",tools:"Tools","email-verifier":"Email Verifier",dmarc:"DMARC Checker",dkim:"DKIM Checker",spf:"SPF Checker",mx:"MX Lookup",blacklist:"Blacklist Checker",auth:"Sign In","instantly-alternative":"Instantly Alternative","smartlead-alternative":"Smartlead Alternative","saleshandy-alternative":"Saleshandy Alternative","reachinbox-alternative":"Reachinbox Alternative","heyreach-alternative":"Heyreach Alternative","apollo-alternative":"Apollo Alternative","aimfox-alternative":"Aimfox Alternative",terms:"Terms & Conditions",privacy:"Privacy Policy","fair-usage":"Fair Usage Policy",refund:"Refund Policy"};function ID(t){return vx[t]?vx[t]:t.split("-").map(e=>e.length?e[0].toUpperCase()+e.slice(1):e).join(" ")}function MD(){const n=RO({select:d=>d.location.pathname}).split("?")[0].split("#")[0].replace(/\/+$/,"").split("/").filter(Boolean),i=[{"@type":"ListItem",position:1,name:"Home",item:`${bx}/`}];let s="";n.forEach((d,u)=>{s+=`/${d}`,i.push({"@type":"ListItem",position:u+2,name:ID(d),item:`${bx}${s}`})});const l={"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:i};return M.jsx("script",{type:"application/ld+json",dangerouslySetInnerHTML:{__html:JSON.stringify(l)}})}const Bt="https://cdn.outreachfox.ai",Kn={icon:`${Bt}/landing/outreachfox-icon.png?v=4`,logo:`${Bt}/landing/outreachfox-logo.png`,favicon:`${Bt}/landing/outreachfox-icon.png?v=4`,dashEnrichment:`${Bt}/landing/dash-enrichment.jpg`,dashMailbox:`${Bt}/landing/dash-mailbox.jpg`,dashOutreach:`${Bt}/landing/dash-outreach.jpg`,dashWarmup:`${Bt}/landing/dash-warmup.jpg`,dashLinkedin:`${Bt}/landing/dash-linkedin.jpg`,dashInbox:`${Bt}/landing/dash-inbox.jpg`,videoEnrichment:`${Bt}/landing/enrichment.mp4`,videoMailbox:`${Bt}/landing/mailbox-infra.mp4`,videoOutreach:`${Bt}/landing/multichannel-outreach.mp4`,videoWarmup:`${Bt}/landing/warmup.mp4`,videoLinkedin:`${Bt}/landing/linkedin.mp4`,videoInbox:`${Bt}/landing/unified-inbox.mp4`,ogHome:`${Bt}/landing/og-home.jpg?v=1`};function PD(){return A.useEffect(()=>{if(!(typeof window>"u")){try{document.title="404 â Page Not Found | OutreachFox"}catch{}try{const t=window,e={page_location:window.location.href,page_referrer:document.referrer||"",requested_path:window.location.pathname+window.location.search,page_title:document.title};typeof t.gtag=="function"?t.gtag("event","page_not_found",e):(t.dataLayer=t.dataLayer||[],t.dataLayer.push({event:"page_not_found",...e}))}catch{}}},[]),M.jsx("div",{className:"flex min-h-screen items-center justify-center bg-background px-4",children:M.jsxs("div",{className:"max-w-md text-center",children:[M.jsx("h1",{className:"text-7xl font-bold text-foreground",children:"404"}),M.jsx("h2",{className:"mt-4 text-xl font-semibold text-foreground",children:"Page not found"}),M.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:"The page you're looking for doesn't exist or has been moved."}),M.jsx("div",{className:"mt-6",children:M.jsx(Qp,{to:"/",className:"inline-flex items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90",children:"Go home"})})]})})}function DD({error:t,reset:e}){console.error(t);const n=At();return A.useEffect(()=>{S2(t,{boundary:"tanstack_root_error_component"})},[t]),M.jsx("div",{className:"flex min-h-screen items-center justify-center bg-background px-4",children:M.jsxs("div",{className:"max-w-md text-center",children:[M.jsx("h1",{className:"text-xl font-semibold tracking-tight text-foreground",children:"This page didn't load"}),M.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:"Something went wrong on our end. You can try refreshing or head back home."}),M.jsxs("div",{className:"mt-6 flex flex-wrap justify-center gap-2",children:[M.jsx("button",{onClick:()=>{n.invalidate(),e()},className:"inline-flex items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90",children:"Try again"}),M.jsx("a",{href:"/",className:"inline-flex items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground transition-colors hover:bg-accent",children:"Go home"})]})]})})}const Me=dO()({head:()=>({meta:[{charSet:"utf-8"},{name:"viewport",content:"width=device-width, initial-scale=1"},{name:"author",content:"OutreachFox"},{property:"og:type",content:"website"},{property:"og:site_name",content:"OutreachFox"},{property:"og:locale",content:"en_US"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@outreachfox"}],links:[{rel:"stylesheet",href:k2}
99,{rel:"preconnect",href:"https://fonts.googleapis.com"},{rel:"preconnect",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"},{rel:"preconnect",href:"https://cdn.outreachfox.ai"},{rel:"dns-prefetch",href:"https://www.googletagmanager.com"},{rel:"dns-prefetch",href:"https://datafa.st"},{rel:"preload",as:"style",href:"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"},{rel:"icon",href:Kn.favicon,type:"image/png"},{rel:"preload",as:"image",href:Kn.icon,fetchPriority:"high"}],scripts:[{children:["(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':","new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],","j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=","'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);","})(window,document,'script','dataLayer','GTM-NS429T8X');"].join("")},{children:"(function(){var l=document.createElement('link');l.rel='stylesheet';l.href='https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap';document.head.appendChild(l);})();"},{children:["(function(){","var loaded=false;","function load(){","if(loaded)return;loaded=true;","var s1=document.createElement('script');","s1.async=true;s1.src='https://www.googletagmanager.com/gtag/js?id=G-NN3043MJRE';","document.head.appendChild(s1);","window.dataLayer=window.dataLayer||[];","function gtag(){dataLayer.push(arguments);}","window.gtag=gtag;gtag('js',new Date());gtag('config','G-NN3043MJRE');","var s2=document.createElement('script');","s2.defer=true;s2.src='https://datafa.st/js/script.js';","s2.setAttribute('data-website-id','dfid_q2Xb89S3p9ExVKxQVxdCa');","s2.setAttribute('data-domain','outreachfox.ai');","document.head.appendChild(s2);","var s3=document.createElement('script');","s3.async=true;s3.src='https://analytics.ahrefs.com/analytics.js';","s3.setAttribute('data-key','fJYbLMqgJYnzQSRuHqNE5Q');","document.head.appendChild(s3);","}","if('requestIdleCallback' in window){requestIdleCallback(load,{timeout:3000});}","else{setTimeout(load,2000);}","})();"].join("")},{async:!0,src:"https://id.getleads.io/pixels/04ac5d0e-1368-4f29-900e-4b566ad13447/p.js","data-key":"04ac5d0e-1368-4f29-900e-4b566ad13447"},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"SoftwareApplication",name:"OutreachFox",applicationCategory:"BusinessApplication",operatingSystem:"Web",url:"https://outreachfox.ai",description:"Infrastructure-first cold outreach platform with private sending infrastructure, waterfall lead enrichment, and multic
99hannel email + LinkedIn sequences.",offers:{"@type":"Offer",price:"49",priceCurrency:"USD",priceValidUntil:"2027-12-31",availability:"https://schema.org/InStock",url:"https://outreachfox.ai/pricing"},aggregateRating:{"@type":"AggregateRating",ratingValue:"4.8",reviewCount:"127",bestRating:"5",worstRating:"1"}})},{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"Organization",name:"OutreachFox",alternateName:"outreachfox.ai",url:"https://outreachfox.ai",logo:Kn.logo,description:"Complete multichannel outreach platform with native email and LinkedIn automation, data enrichment across 50+ providers, 90%+ email match rates, unified inbox, and workflow automation for lead generation agencies, GTM teams, and solo founders.",foundingDate:"2025-07-01",founder:{"@type":"Person",name:"Timothy Vadde",sameAs:"https://www.wikidata.org/wiki/Q140756475"},sameAs:["https://www.wikidata.org/wiki/Q140756578","https://www.linkedin.com/company/outreachfox","https://twitter.com/outreachfox","https://affiliate.outreachfox.ai"],contactPoint:{"@type":"ContactPoint",contactType:"customer support",email:"[email protected]"},makesOffer:{"@type":"Offer",priceCurrency:"USD",price:"0",url:"https://outreachfox.ai/pricing"}})}]}),shellComponent:LD,component:ND,notFoundComponent:PD,errorComponent:DD});function LD({children:t}){return M.jsxs("html",{lang:"en",children:[M.jsxs("head",{children:[M.jsx("style",{dangerouslySetInnerHTML:{__html:"@layer base{html{-webkit-text-size-adjust:100%;background:#faf9f6;color:#0b0b0c;font-family:Inter,ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;line-height:1.5}body{margin:0;background:inherit;color:inherit;overflow-x:hidden}*,*::before,*::after{box-sizing:border-box}img,svg,video{max-width:100%;height:auto;display:block}header img,footer img{width:36px;height:36px;object-fit:contain}ul,ol{list-style:none;margin:0;padding:0}a{color:inherit;text-decoration:none}h1,h2,h3,h4,p{margin:0}button{font:inherit;color:inherit;background:none;border:0}}"}}),M.jsx(MO,{})]}),M.jsxs("body",{children:[M.jsx("noscript",{children:M.jsx("iframe",{src:"https://www.googletagmanager.com/ns.html?id=GTM-NS429T8X",height:"0",width:"0",style:{display:"none",visibility:"hidden"},title:"Google Tag Manager"})}),t,M.jsx(PO,{})]})]})}function ND(){const{queryClient:t}=Me.useRouteContext();return A.useEffect(()=>{if(typeof window>"u")return;let e=!1;return ye(async()=>{const{default:n}=await import("./index-Cl9fPS9W.js");return{default:n}},[]).then(({default:n})=>{if(e)return;const i=window;i.__gleapInitialized||(i.__gleapInitialized=!0,n.initialize("Hui0FikR5pCWJniLMOCpZah16pFK3lSN"))}),()=>{e=!0}},[]),M.jsxs(v2,{client:t,children:[M.jsx($k,{}),M.jsx(MD,{}),M.jsx(OD,{})]})}const UD="https://outreachfox.ai",P0=60,D0=155;function Ad(t,e){const n=(t??"").trim().replace(/\s+/g," ");if(n.length<=e)return n;const i=n.slice(0,e-1),s=i.lastIndexOf(" ");return(s>e*.6?i.slice(0,s):i).replace(/[\s,;:.\-ââ]+$/,"")+"â¦"}function jD(t){return Ad(t,P0)}function FD(t){return Ad(t,D0)}const qD={url:Kn.ogHome,width:1200,height:630,alt:"OutreachFox"};function Qe(t){const e=`${UD}${t.path}`,n=t.ogType??"website",i=t.noindex?void 0:t.image??qD,s=Ad(t.title,P0),l=Ad(t.description,D0),d=[{title:s},{name:"description",content:l},{property:"og:title",content:s},{property:"og:description",content:l},{property:"og:type",content:n},{property:"og:url",content:e},{name:"twitter:title",content:s},{name:"twitter:description",content:l}];if(i){const u=i.width??1200,f=i.height??630;d.push({property:"og:image",content:i.url},{property:"og:image:width",content:String(u)},{property:"og:image:height",content:String(f)},{name:"twitter:image",content:i.url}),i.alt&&d.push({property:"og:image:alt",content:i.alt})}return t.noindex&&d.push({name:"robots",content:"noindex,follow"}),{meta:d,links:[{rel:"canonical",href:e}],canonical:e}}const BD=()=>ye(()=>import("./terms-Cf03A8c-.js"),__vite__mapDeps([0,1,2])),zD=_e("/terms")({head:()=>Qe({title:"Terms & Conditions â OutreachFox",description:"The terms that govern your use of OutreachFox, including account rules, acceptable use, billing, and liability.",path:"/terms"}),component:be(BD,"component")}
99),HD=["Private isolated infrastructure","Dedicated campaign IPs","Owned warmup pool (not outsourced/shared)","Native owned mailboxes","Industry warmup profiles","Waterfall enrichment (50+)","Patented email verification","Email + LinkedIn multichannel","Unified inbox","API-first core"];function Lr(t){const e=["â","â","â private","â","â","â","â","â","â","â"];return HD.map((n,i)=>({capability:n,competitor:t[i],outreachfox:e[i]}))}const GD=[{slug:"instantly",competitor:"Instantly",path:"/instantly-alternative",seoTitle:"OutreachFox vs Instantly: Best Instantly Alternative 2026",seoDescription:"Instantly's shared warmup pool and shared IPs burn domains. OutreachFox gives you the same scale on private, isolated sending infrastructure.",eyebrow:"OutreachFox vs Instantly",h1:"The OutreachFox alternative to Instantly â scale that doesn't burn your domains",subhead:"Instantly made high-volume cold email cheap with unlimited inboxes. But the engine underneath is a shared warmup pool on shared sending infrastructure â and when the neighborhood gets flagged, your domains go down with it. OutreachFox gives you the same scale on infrastructure that's yours alone.",primaryCta:"Switch from Instantly â free migration",doesWell:["Flat, predictable pricing.","Unlimited connected inboxes with no per-mailbox tax.","Genuinely clean UI.","Large built-in lead database.","Fast to launch."],exposed:[{title:"A shared warmup pool that ESPs already know.",body:"Instantly's warmup runs through a network of hundreds of thousands of accounts firing near-identical engagement patterns. Mailbox providers pattern-matched that behavior years ago â which is why r/coldemail threads through 2026 keep surfacing the same story: brand-new domains getting reputation-blocked by the warmup network itself."},{title:"Inflated health scores that hide the truth.",body:"The pool props up a 90%+ warmup health score while live campaigns land 30â40% in spam. The number on the dashboard isn't the number in the inbox."},{title:"Shared campaign IPs.",body:"Your sends ride shared IP ranges co-mingled with thousands of other senders. A dedicated IP is tier-locked to higher plans â and even then, it doesn't fix a shared sender reputation on its own."}
99,{title:"A delivery vehicle, not infrastructure.",body:"Instantly sends; it doesn't isolate, own, or actively protect your sending environment."}],switchReasons:["Private, isolated infrastructure + dedicated campaign IPs on every plan â your reputation is never shared, never co-mingled.","A premium, private warmup pool with industry-tuned Warmup Profiles â real engagement patterns, not synthetic ones ESPs flag.","Native owned Google & Microsoft mailboxes built for deliverability.","Auto mailbox protection that watches real placement, not just a vanity health score.","Built-in waterfall enrichment, verification, and true email + LinkedIn multichannel."],faq:[{q:"Can I migrate from Instantly without losing warmup progress?",a:"Yes. Import campaigns and mailboxes, and our warmup picks up where Instantly left off â on a private pool instead of a shared one."},{q:"Do I get dedicated IPs on the entry plan?",a:"Yes. Dedicated campaign IPs are included on every plan, not tier-locked behind upgrades."},{q:"How is your warmup different from Instantly's?",a:"It runs on a private pool with industry-tuned Warmup Profiles and reports real placement instead of a synthetic health score."}],table:"generic",rows:Lr(["â shared","tier-locked","â shared pool","add-on","â","basic","â","â","â","partial"])},{slug:"smartlead",competitor:"Smartlead",path:"/smartlead-alternative",seoTitle:"OutreachFox vs Smartlead: Best Smartlead Alternative 2026",seoDescription:"Smartlead owns no mailboxes, no IPs, no infrastructure. OutreachFox is the owned infrastructure Smartlead sits on top of â with the same API-first power.",eyebrow:"OutreachFox vs Smartlead",h1:"The OutreachFox alternative to Smartlead â the infrastructure Smartlead never gives you",subhead:"Smartlead is a capable sending-and-sequencing layer with a great API. But it owns no mailboxes, no IPs, and no infrastructure â it rotates your sends across a shared warmup network and leaves the deliverability foundation entirely to you. OutreachFox is the foundation Smartlead sits on top of.",primaryCta:"Switch from Smartlead â keep your warmup progress",doesWell:["API-first and well-documented.","Master inbox.","Subsequences and conditional logic.","Deep agency tooling (sub-accounts, white-label).","Unlimited AI warmup on every plan."],exposed:[{title:"A shared warmup network, same detectable patterns.",body:`Smartlead's "unlimited" warmup runs across a pool of tens of thousands of shared inboxes â the same pooled-engagement model ESPs have learned to spot. It inflates a per-inbox health score that doesn't track real placement.`},{title:"No IPs and no mailboxes of its own.",body:"Smartlead is a sequencing layer, not infrastru
99cture. You bring your own mailboxes (or buy SmartSenders as a separate cost), and sends rotate across shared sending infrastructure with no dedicated, isolated campaign IPs."},{title:"It doesn't watch the thing your results depend on.",body:"Smartlead does almost nothing to monitor the mailboxes and domains it relies on â so when warmup props up a score while placement quietly drops, nothing flags it."},{title:"Email-only.",body:"No native enrichment, no buying signals, no LinkedIn at most tiers â so you're stitching it to three other tools anyway."}],switchReasons:["Owned native mailboxes + private isolated infrastructure with dedicated campaign IPs â not a separate purchase, not a shared pool.","A private warmup pool with industry Warmup Profiles + auto mailbox protection that monitors real deliverability per inbox.","Built-in waterfall enrichment + patented verification (Smartlead has neither).","Email + LinkedIn in one coordinated sequence.","The same API-first power â but the infrastructure beneath the API is finally yours."],faq:[{q:"Will my Smartlead API integrations still work?",a:"Yes. OutreachFox is API-first on every plan with parity on the workflows teams build on Smartlead."},{q:"Do I still need to buy mailboxes separately?",a:"No. Native owned Google and Microsoft mailboxes are included â no SmartSenders-style separate purchase."},{q:"What happens to my warmup progress?",a:"We carry it forward on a private warmup pool instead of dropping you back to day zero on a shared one."}],table:"generic",rows:Lr(["â layer only","â none","â shared pool","separate cost","â","â","basic","add-on","â","â"])},{slug:"apollo",competitor:"Apollo",path:"/apollo-alternative",seoTitle:"OutreachFox vs Apollo: Best Apollo Alternative 2026",seoDescription:"Apollo's stale data drives 15â35% bounce rates on shared sending servers. OutreachFox pairs waterfall-verified data with private sending infrastructure.",eyebrow:"OutreachFox vs Apollo",h1:"The OutreachFox alternative to Apollo â verified data, on infrastructure that actually sends",subhead:"Apollo is a massive B2B database that also sends. But roughly one in three records is stale, reported bounce rates run 15â35%, and it sends through shared servers with weak deliverability controls. OutreachFox pairs waterfall-verified data with private sending infrastructure.",primaryCta:"Switch from Apollo â stop the bounce spiral",doesWell:["275M+ contact database.","All-in-one prospecting, sequencing, and a built-in dialer.","Native CRM integrations.","Low entry price for the data volume."],exposed:[{title:"~65% data accuracy.",body:"Independent tests put Apollo's data accuracy around 65% overall â and lower outside the US â with bounce rates that regularly hit 15â35% (the safe ceiling is under 2â5%)."},{title:'False confidence from the "verified" label.',body:"Teams send at scale on the strength of that label and torch their domain reputation when the data turns out stale."},{title:"Shared sending infrastructure.",body:"Sending runs on shared infrastructure, there's no true LinkedIn automation, and the credit system clouds real cost."},{title:"A data tool that sends, not a cold email engine.",body:"As reviewers put it: Apollo is built around the database, not around inbox placement."}],switchReasons:["Waterfall enrichment across 50+ providers â 85â95% match rates vs Apollo's ~65%.","Patented verification before send, so bounces never reach your queue or your reputation.","Private isolated infrastructure + dedicated IPs (Apollo shares sending servers).","True email + LinkedIn multichannel (Apollo offers only manual LinkedIn tasks).","Native owned mailboxes engineered for inbox placement."],faq:[{q:"Can I keep using Apollo for data and just send through OutreachFox?",a:"Yes â pipe Apollo records through our verification waterfall and send from owned infrastructure to protect your reputation."},{q:"How much will bounces drop?",a:"Teams typically move from 15â35% on Apollo to under 2% by verifying every record before send."},{q:"Do you replace Apollo's database?",a:"We waterfall across 50+ providers including Apollo-class sources, so you get broader coverage with higher match rates."}],table:"generic",rows:Lr(["â shared","â","warmup discontinued","
99shared send","â","single-source ~65%",'"verified" label',"manual tasks","â","â"])},{slug:"saleshandy",competitor:"Saleshandy",path:"/saleshandy-alternative",seoTitle:"OutreachFox vs Saleshandy: Best Saleshandy Alternative 2026",seoDescription:"Saleshandy's outsourced warmup and shared dynamic IPs quietly cost you the inbox. OutreachFox is built the opposite way â owned infrastructure first.",eyebrow:"OutreachFox vs Saleshandy",h1:'The OutreachFox alternative to Saleshandy â when "cheap and all-in-one" quietly costs you the inbox',subhead:"Saleshandy bundles unlimited inboxes, a lead finder, and warmup at an aggressive price. But its warmup is an outsourced shared network reviewers say doesn't reflect real placement, its data accuracy is inconsistent, and it sends on shared dynamic IPs with no isolation. OutreachFox is built the opposite way â owned infrastructure first.",primaryCta:"Switch from Saleshandy",doesWell:["Unlimited email accounts on every plan at a genuinely low entry price.","A 700M+ lead finder built in.","Sender rotation and a unified inbox.","Conditional-branching sequences.","Agency-friendly with white-label."],exposed:[{title:"Warmup is outsourced and shared.",body:"Saleshandy has no warmup network of its own â it leans on a third-party integration (TrulyInbox) across a shared pool. G2 carries dozens of warmup complaints, and the r/coldemail consensus is blunt: the warmup scores don't reflect real inbox placement."},{title:"Shared dynamic IP allocation, no isolation.",body:"Sends rotate across shared infrastructure with dynamic IPs â there are no private, dedicated campaign IPs, so your reputation is never truly your own."},{title:"Inconsistent data.",body:"The lead database is large but accuracy varies, especially for smaller companies and non-US contacts â which feeds bounces straight into a shared sending pool."},{title:"Email-only, thin monitoring, gated basics.",body:"No native LinkedIn or phone. Deliverability monitoring is basic. The Starter tier has no API, webhooks, or CRM sync, so the real working price is a tier up."}],switchReasons:["A private warmup pool with industry-tuned Warmup Profiles â owned and real, not an outsourced shared network.","Private isolated infrastructure + dedicated campaign IPs instead of shared dynamic-IP rotation.","Waterfall enrichment across 50+ providers with patented verification â accuracy that protects deliverability instead of feeding bounces.","Native owned Google & Microsoft mailboxes.","Email + LinkedIn in one sequence, with a real API on every plan."],faq:[{q:"Is OutreachFox more expensive than Saleshandy?",a:"Once you account for warmup that actually works and an API on every plan, total cost of ownership is typically lower."},{q:"Do I lose unlimited inboxes?",a:"No â connect what you need. The difference is they sit on owned mailboxes and private IPs instead of a shared pool."},{q:"Can I send LinkedIn from the same sequence?",a:"Yes. LinkedIn is native, not a separate tool to stitch in."}],table:"generic",rows:Lr(["â shared","â dynamic shared","â outsourced","bring-your-own","â","inconsistent finder","basic add-on","â email-only","â","gated (not Starter)"])},{slug:"reachinbox",competitor:"Reachinbox",path:"/reachinbox-alternative",seoTitle:"OutreachFox vs Reachinbox: Best Reachinbox Alternative 2026",seoDescription:"Reachinbox is polished AI email on shared rotation with a thin lead finder. OutreachFox owns the infrastructure and adds the data and LinkedIn it doesn't.",eyebrow:"OutreachFox vs Reachinbox",h1:"The OutreachFox alternative to Reachinbox â beyond AI cold email into owned infrastructure and multichannel",subhead:"Reachinbox is a polished AI cold email tool with clever touches like out-of-office rescheduling. But it's email-only, runs on shared inbox-rotation infrastructure, and its lead finder is thin. OutreachFox owns the infrastructure and adds the data and LinkedIn Reachinbox doesn't.",primaryCta:"Switch from Reachinbox",doesWell:["AI email writing and variants.","Unlimited accounts with auto-rotation.","AI warmup.",'"Onebox" reply management.',"ESP/provider matching.","AI out-of-office rescheduler.","White-label."],exposed:[{title:"Email-only.",body:"No LinkedIn channel in the same sequence â half the play is missing."},{title:"Shared inbox rotation, not dedicated IPs.",body:"Deliverability rests on inbox rotation across shared accounts rather than dedicated, isolated IPs."},{title:"Thin lead finder, no real enrichment or CRM.",body:"The built-in lead finder is shallow on filters and there's no real enrichment waterfall."},{title:"Reply sync bugs.",body:"Reviewers note occasional missed-reply and sync issues in Onebox."}
99],switchReasons:["Private isolated infrastructure + dedicated IPs (Reachinbox rotates across shared accounts).","Deep waterfall enrichment + verification vs a thin lead finder.","Email + LinkedIn in one sequence.","Native owned mailboxes.","A fast-sync unified inbox engineered not to drop replies."],faq:[{q:"Do you have an AI writer like Reachinbox?",a:"Yes â with variants and conditional logic, plus enrichment signals to personalize against."},{q:"Will replies still land in one inbox?",a:"Yes. Our unified inbox covers email and LinkedIn in one view with fast sync."},{q:"Do I get dedicated IPs?",a:"Yes â on every plan, not shared rotation."}],table:"generic",rows:Lr(["â rotation","â","shared","â","â","thin finder","basic","â","â Onebox","partial"])},{slug:"heyreach",competitor:"Heyreach",path:"/heyreach-alternative",seoTitle:"OutreachFox vs Heyreach: Best Heyreach Alternative 2026",seoDescription:"Heyreach is LinkedIn-only, forcing a second email tool. OutreachFox runs LinkedIn and email in one sequence and one inbox.",eyebrow:"OutreachFox vs Heyreach",h1:"The OutreachFox alternative to Heyreach â LinkedIn at scale, without bolting on a separate email tool",subhead:"Heyreach is one of the best LinkedIn-only tools out there: multi-account sender rotation and a clean unified LinkedIn inbox. But LinkedIn alone is half a campaign â and Heyreach makes you run email in a second tool and coordinate the two by hand. OutreachFox runs LinkedIn and email in one sequence and one inbox.",primaryCta:"Run LinkedIn + email in one place",doesWell:["Multi-account sender rotation â connect many LinkedIn accounts to one campaign and rotate actions to stay under LinkedIn's ~40â50/day limits safely.","Unified LinkedIn inbox across all connected accounts.","Residential proxies and a strong account-safety record.","Agency white-label and webhooks.","Native Clay/HubSpot integrations."],exposed:[{title:"LinkedIn-only.",body:"There's no email channel and no true multichannel sequencing â to pair LinkedIn with email you run Smartlead or Instantly alongside it and coordinate by hand, in two inboxes."},{title:"No built-in enrichment or buying signals.",body:"Targeting depends on what you bring in from external tools."},{title:"Dashboard slows past ~20 accounts.",body:"Performance degrades at the scale agencies actually run."}],switchReasons:["Same multi-account LinkedIn rotation and safety â plus email steps in the same sequence (no second tool, no manual coordination).","One unified inbox for LinkedIn and email replies â not LinkedIn alone.","Built-in waterfall enrichment to feed LinkedIn targeting (Heyreach has none).","Owned email infrastructure so the email half of the play actually lands in the inbox."],faq:[{q:"Do you support multi-account LinkedIn rotation like Heyreach?",a:"Yes â connect multiple accounts and rotate actions safely under daily limits."},{q:"Do I still need a separate email tool?",a:"No. Email runs in the same sequence and the same inbox."},{q:"Is it safe on LinkedIn?",a:"Yes â residential rotation, account-safety guardrails, and your own accounts (no rented profiles)."}],table:"linkedin",rows:[{capability:"Multi-account LinkedIn rotation",competitor:"â",outreachfox:"â"},{capability:"Uses your own accounts (no rented profiles)",competitor:"â",outreachfox:"â"},{capability:"LinkedIn + email in one sequence",competitor:"â",outreachfox:"â"},{capability:"Unified inbox across LinkedIn + email",competitor:"LinkedIn only",outreachfox:"â"},{capability:"Reliable fast inbox sync",competitor:"â",outreachfox:"â"},{capability:"Built-in enrichment",competitor:"â",outreachfox:"â"},{capability:"Owned email infrastructure",competitor:"â",outreachfox:"â"},{capability:"White-label",competitor:"â",outreachfox:"â"}]},{slug:"aimfox",competitor:"Aimfox",path:"/aimfox-alternative",seoTitle:"OutreachFox vs Aimfox: Best Aimfox Alternative 2026",seoDescription:"Aimfox is LinkedIn-only with rented-profile ToS risk and buggy sync. OutreachFox scales LinkedIn safely on your own accounts and adds email.",eyebrow:"OutreachFox vs Aimfox",h1:"The OutreachFox alternative to Aimfox â scale LinkedIn safely, and add the email channel Aimfox can't",subhead:"Aimfox brings AI personalization and multi-account LinkedIn outreach â but it leans on rented profiles that push LinkedIn's terms of service, its inbox sync is frequently buggy, and it's LinkedIn-only. OutreachFox scales LinkedIn on your own accounts, syncs replies in seconds, and runs email in the same sequence.",primaryCta:"Scale LinkedIn + email safely",doesWell:["AI personalization with voice notes, auto-translate, and smart timezones.",'"Unibox" across multiple accounts.',"Event-based lead generation (paste a LinkedIn event URL â pull attendees).","Static residential IPs.","Multi-user and A/B testing.","Well-reviewed supp
99ort."],exposed:[{title:"LinkedIn-only.",body:"No email channel at all."},{title:"Rented-profile ToS risk.",body:"The headline scaling feature relies on rented LinkedIn profiles, which raises real ToS and account-safety red flags."},{title:"Buggy inbox sync.",body:"Inbox-sync glitches are a recurring complaint (replies showing late or miscounted), and there's no auto-reply."},{title:"Per-seat pricing.",body:"Costs scale per user instead of per workflow."}],switchReasons:["Scale across your own LinkedIn accounts with safe rotation â no risky rented profiles.","A unified inbox that syncs in seconds, not one with reported sync bugs.","Email + LinkedIn in one sequence and one inbox.","Built-in waterfall enrichment + verification (Aimfox has neither).","Owned email infrastructure behind the email channel."],faq:[{q:"Do you use rented LinkedIn profiles?",a:"No. We scale on your own accounts with safe rotation â no ToS risk from rented profiles."},{q:"Is the inbox sync reliable?",a:"Yes â replies sync in seconds across LinkedIn and email in one view."},{q:"Do you have AI personalization like Aimfox?",a:"Yes, plus enrichment signals so personalization isn't just template variables."}],table:"linkedin",rows:[{capability:"Multi-account LinkedIn rotation",competitor:"â",outreachfox:"â"},{capability:"Uses your own accounts (no rented profiles)",competitor:"â rented option",outreachfox:"â"},{capability:"LinkedIn + email in one sequence",competitor:"â",outreachfox:"â"},{capability:"Unified inbox across LinkedIn + email",competitor:"LinkedIn only",outreachfox:"â"},{capability:"Reliable fast inbox sync",competitor:"â reported bugs",outreachfox:"â"},{capability:"Built-in enrichment",competitor:"â",outreachfox:"â"},{capability:"Owned email infrastructure",competitor:"â",outreachfox:"â"},{capability:"White-label",competitor:"â",outreachfox:"â"}]}];function fi(t){const e=GD.find(n=>n.slug===t);if(!e)throw new Error(`Unknown comparison: ${t}`);return e}const Gf=fi("smartlead"),WD=()=>ye(()=>import("./smartlead-alternative-CK08AxxN.js"),__vite__mapDeps([3,4,2])),$D=_e("/smartlead-alternative")({head:()=>Qe({title:Gf.seoTitle,description:Gf.seoDescription,path:Gf.path}),component:be(WD,"component")}),Wf=fi("saleshandy"),VD=()=>ye(()=>import("./saleshandy-alternative-Clgxu6rh.js"),__vite__mapDeps([5,4,2])),YD=_e("/saleshandy-alternative")({head:()=>Qe({title:Wf.seoTitle,description:Wf.seoDescription,path:Wf.path}),component:be(VD,"component")}),KD=()=>ye(()=>import("./refund-BQfDm_zQ.js"),__vite__mapDeps([6,1,2])),ZD=_e("/refund")({head:()=>Qe({title:"Refund Policy â OutreachFox",description:"When OutreachFox issues refunds, our 7-day money-back guarantee for new customers, what is non-refundable, and the exact steps to request a refund.",path:"/refund"}),component:be(KD,"component")}),$f=fi("reachinbox"),QD=()=>ye(()=>import("./reachinbox-alternative-CqEKFTYI.js"),__vite__mapDeps([7,4,2])),XD=_e("/reachinbox-alternative")({head:()=>Qe({title:$f.seoTitle,description:$f.seoDescription,path:$f.path}),component:be(QD,"component")}),JD=()=>ye(()=>import("./privacy-Dsljx1WO.js"),__vite__mapDeps([8,1,2])),eL=_e("/privacy")({head:()=>Qe({title:"Privacy Policy â OutreachFox",description:"How OutreachFox collects, uses, stores, and protects your account, campaign, and mailbox data â plus the access, export, and deletion rights you have over it.",path:"/privacy"}),component:be(JD,"component")}),tL=()=>ye(()=>import("./pricing-Cd_vO5e_.js"),__vite__mapDeps([9,2,10,11,12])),nL=_e("/pricing")({head:()=>({...Qe({title:"OutreachFox Pricing â Plans for every outbound team",description:"Transparent OutreachFox pricing. Starter, Growth, Scale, Pro, and Agency plans with credit-based enrichment, multichannel email + LinkedIn outreach, and private sending infrastructure.",path:"/pricing",ogType:"product"}),scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"Product",name:"OutreachFox",description:"Multichannel cold outreach platform with private sending infrastructure and waterfall enrichment.",brand:{"@type":"Brand",name:"OutreachFox"},image:Kn.ogHome,sku:"outreachfox-plans",offers:{"@type":"AggregateOffer",priceCurrency:"USD",lowPrice:"29",highPrice:"5274",offerCount:"5",availability:"https://schema.org/InStock",priceValidUntil:"2027-12-31",url:"https://outreachfox.ai/pricing"},aggregateRating:{"@type":"AggregateRating",ratingValue:"4.8",reviewCount:"127",bestRating:"5",worstRating:"1"}})}]}),component:be(tL,"component")}),aL=[{name:"LI Only Starter Plan",bestFor:"Solo operators getting started",monthly:39,yearly:34,credits:"250 credits / mo",cta:"Get Started",features:["1 LI seat (+$29 / extra seat)","Unified Inbox","Connect, message, follow, profile view","Unlimited campaign sequences","Basic AI personalization","Dedicated residential proxy","A
99ccount warmup included","Unlimited Workspaces","Chat & email support"]},{name:"LI Growth Only Plan",bestFor:"Small teams scaling outreach",monthly:89,yearly:82,credits:"1,000 credits / mo",highlight:!0,badge:"Most Popular",cta:"Get Started",features:["3 LI seats (+$29 / extra seat)","Unified Inbox","All actions + reactions, endorsements, InMail","Unlimited sequences + A/B testing","Full AI filters + variables","Native LI + email in one sequence","Dedicated residential proxy + warmup Unlimited","3 workspaces","Priority chat support"]},{name:"LI Only Pro Plan",bestFor:"Power users & growing teams",monthly:139,yearly:135,credits:"3,000 credits / mo",cta:"Get Started",features:["7 LI seats (+$24 / extra seat)","Unified Inbox - LI + Email","All + voice notes, attachments, video","Unlimited sequences + A/B + auto-translate","Full AI + custom merge tags","Advanced account warmup","Dedicated or BYO proxy","Unlimited Workspaces","Priority support + onboarding"]},{name:"LI Only Agency Plan",bestFor:"White-label client management",monthly:299,yearly:279,credits:"7,500 pooled credits / mo",cta:"Talk to Sales",features:["15 LI seats (+$24 / extra seat)","Unified Inbox - LI + Email","All LI actions (full suite)","Full white-label, multi-brand included","Advanced warmup · BYO or managed proxy","UNLIMITED Workspaces","Unlimited team members (free)","Dedicated manager + Slack + migration"]}];aL.map(t=>({name:t.name,price:e=>e==="year"?t.yearly:t.monthly,highlight:t.highlight,badge:t.badge}));const oL=()=>ye(()=>import("./mcp-BMkiH5TE.js"),__vite__mapDeps([13,2,14,15,16,17,18,11,19])),Vf="OutreachFox MCP Server â Connect AI to your outreach",Qc="The OutreachFox MCP server connects Claude, Cursor, Windsurf, and any MCP-compatible AI to your outreach workflows â 158 tools covering sequences, contacts, mailboxes, inbox, warmup, LinkedIn, and analytics.",iL=_e("/mcp")({head:()=>({meta:[{title:Vf},{name:"description",content:Qc},{property:"og:type",content:"website"},{property:"og:site_name",content:"OutreachFox"},{property:"og:title",content:Vf},{property:"og:description",content:Qc},{property:"og:url",content:"https://outreachfox.ai/mcp"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:title",content:Vf},{name:"twitter:description",content:Qc}],links:[{rel:"canonical",href:"https://outreachfox.ai/mcp"}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"SoftwareApplication",name:"OutreachFox MCP Server",applicationCategory:"DeveloperApplication",operatingSystem:"Web",url:"https://outreachfox.ai/mcp",description:Qc,offers:{"@type":"Offer",price:"0",priceCurrency:"USD"},provider:{"@type":"Organization",name:"OutreachFox",url:"https://outreachfox.ai"}})}]}),component:be(oL,"component")}),Yf=fi("instantly"),sL=()=>ye(()=>import("./instantly-alternative-CDlgvT4U.js"),__vite__mapDeps([20,4,2])),rL=_e("/instantly-alternative")({head:()=>Qe({title:Yf.seoTitle,description:Yf.seoDescription,path:Yf.path}),component:be(sL,"component")}),Kf=fi("heyreach"),lL=()=>ye(()=>import("./heyreach-alternative-C3BdozXc.js"),__vite__mapDeps([21,4,2])),cL=_e("/heyreach-alternative")({head:()=>Qe({title:Kf.seoTitle,description:Kf.seoDescription,path:Kf.path}),component:be(lL,"component")}),dL=()=>ye(()=>import("./fair-usage-BGPajRyv.js"),__vite__mapDeps([22,1,2])),uL=_e("/fair-usage")({head:()=>Qe({title:"Fair Usage Policy â OutreachFox",description:"Sending limits, infrastructure use, and abuse rules that keep OutreachFox fast and deliverable for everyone.",path:"/fair-usage"}),component:be(dL,"component")}),hL=()=>ye(()=>import("./cancellation-CBnckLsp.js"),__vite__mapDeps([23,1,2])),fL=_e("/cancellation")({head:()=>Qe({title:"Cancellation Policy â OutreachFox",description:"How to cancel your OutreachFox subscription, what happens to mailboxes and billing at the end of your cycle, and special terms for Icemail customers.",path:"/cancellation"}),component:be(hL,"component")}),pL=()=>ye(()=>import("./auth-CA5lN5MP.js"),[]),mL=_e("/auth")({head:()=>Qe({title:"Sign in â OutreachFox",description:"Sign in to your OutreachFox account to manage mailboxes, campaigns, and enrichment.",path:"/auth",noindex:!0}),component:be(pL,"component")}),Zf=fi("apollo"),gL=()=>ye(()=>import("./apollo-alternative-BBcQpy13.js"),__vite__mapDeps([24,4,2])),yL=_e("/apollo-alternative")({head:()=>
99Qe({title:Zf.seoTitle,description:Zf.seoDescription,path:Zf.path}),component:be(gL,"component")}),Qf=fi("aimfox"),bL=()=>ye(()=>import("./aimfox-alternative-DJYi5qJn.js"),__vite__mapDeps([25,4,2])),vL=_e("/aimfox-alternative")({head:()=>Qe({title:Qf.seoTitle,description:Qf.seoDescription,path:Qf.path}),component:be(bL,"component")}),wL=()=>ye(()=>import("./affiliate-_JhfV9y0.js"),__vite__mapDeps([26,2,27,18,17])),xL=_e("/affiliate")({head:()=>Qe({title:"OutreachFox Affiliate Program â Lifetime 30% Recurring Commission",description:"Earn lifetime 30% recurring commission on every OutreachFox subscription you refer. No caps, no expiry â real passive income for creators, agencies, and consultants.",path:"/affiliate"}),component:be(wL,"component")}),kL=()=>ye(()=>import("./route-BiAaa6e0.js"),[]),SL=_e("/_authenticated")({beforeLoad:async()=>{const{data:t,error:e}=await vS.auth.getUser();if(e||!t.user)throw Vr({to:"/auth"});return{user:t.user}},component:be(kL,"component")}),_L="20260708a",CL=t=>t&&`${t}${t.includes("?")?"&":"?"}v=${_L}`,AL=()=>ye(()=>import("./index-BPdCsc2q.js"),__vite__mapDeps([28,2,29,14,30,16,31,11,27,15,17,12,18,32])),TL=_e("/")({head:()=>({meta:[{title:"OutreachFox â Cold Email & LinkedIn Outreach Platform"},{name:"description",content:"Infrastructure-first cold outreach: isolated sending infra, dedicated IPs, waterfall enrichment, and multic
99hannel email + LinkedIn in one inbox."},{property:"og:title",content:"OutreachFox â Cold Email & LinkedIn Outreach Platform"},{property:"og:description",content:"Infrastructure-first cold outreach: isolated sending infra, dedicated IPs, waterfall enrichment, and multichannel email + LinkedIn in one inbox."},{property:"og:url",content:"https://outreachfox.ai/"},{property:"og:image",content:Kn.ogHome},{property:"og:image:width",content:"1200"},{property:"og:image:height",content:"630"},{property:"og:image:alt",content:"OutreachFox â Infrastructure-first Email + LinkedIn Cold Outreach"},{name:"twitter:title",content:"OutreachFox â Cold Email & LinkedIn Outreach Platform"},{name:"twitter:description",content:"Infrastructure-first cold outreach: isolated sending infra, dedicated IPs, waterfall enrichment, and multichannel email + LinkedIn in one inbox."},{name:"twitter:image",content:Kn.ogHome}],links:[{rel:"canonical",href:"https://outreachfox.ai/"},{rel:"preload",as:"video",href:CL(Kn.videoMailbox),type:"video/mp4",fetchPriority:"low"}],scripts:[{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"FAQPage",mainEntity:[{"@type":"Question",name:"What is OutreachFox?",acceptedAnswer:{"@type":"Answer",text:"An infrastructure-first cold outreach platform: private sending infrastructure, waterfall enrichment, and multic
99hannel email + LinkedIn sequences â all in one product."}},{"@type":"Question",name:"How is isolated infrastructure different from a dedicated IP?",acceptedAnswer:{"@type":"Answer",text:"A dedicated IP is one address that's yours. Isolated infrastructure is the entire sending environment around it â warmup pool, reputation profile, and routing â walled off from every other customer."}},{"@type":"Question",name:"How does warmup work and why won't it get flagged?",acceptedAnswer:{"@type":"Answer",text:"We use a private engagement pool tuned by industry, and route messages provider-to-provider (GmailâGmail, OutlookâOutlook) at human-like cadences. Per-mailbox health pauses anything trending poorly."}},{"@type":"Question",name:"Do you provide the mailboxes or do I bring my own?",acceptedAnswer:{"@type":"Answer",text:"Both. Native Google Workspace and Microsoft 365 mailboxes ship pre-warmed and ready to send in ~10 minutes. You can also connect existing inboxes via IMAP/SMTP."}},{"@type":"Question",name:"How does waterfall enrichment pricing work?",acceptedAnswer:{"@type":"Answer",text:"We meter on verified records found, not on every provider hit. You don't pay for empty lookups."}},{"@type":"Question",name:"Can I run email and LinkedIn in one sequence?",acceptedAnswer:{"@type":"Answer",text:"Yes. Mixed steps with conditional logic and per-channel throttling, in the same builder."}},{"@type":"Question",name:"Is there a full API?",acceptedAnswer:{"@type":"Answer",text:"Yes â every dashboard action is an endpoint, with webhooks for bounces, opens, replies, and mailbox health."}},{"@type":"Question",name:"Is it built for agencies?",acceptedAnswer:{"@type":"Answer",text:"Yes. White-label workspaces, isolated infra per client, bulk mailbox provisioning, and an API designed for managing 100+ inboxes."}}]})}]}),component:be(AL,"component")}),RL=()=>ye(()=>import("./tools.index-DPYR4sjb.js"),__vite__mapDeps([33,2,11,34])),EL=_e("/tools/")({head:()=>Qe({title:"Free Email Deliverability Tools â OutreachFox",description:"Free SPF, DKIM, DMARC, MX, blacklist and email verifier tools from OutreachFox. Audit your sending setup, diagnose issues and boost deliverability in seconds.",path:"/tools"}),component:be(RL,"component")}),OL=()=>ye(()=>import("./help.index-BEMeYB5z.js"),__vite__mapDeps([35,36,18,19,34,2,30,29,31])),IL=_e("/help/")({head:()=>({meta:[{title:"OutreachFox Help Center â Guides & Product Docs"},{name:"description",content:"Setup guides, mailbox infrastructure, warmup, deliverability, campaigns and Unified Inbox help for OutreachFox multichannel outreach."},{property:"og:title",content:"OutreachFox Help Center"},{property:"og:description",content:"Everything you need to launch, scale and troubleshoot outreach with OutreachFox."},{property:"og:type",content:"website"},{name:"twitter:card",content:"summary_large_image"}]}),component:be(OL,"component")}),ML=/^https?:\/\/cdn\.outreachfox\.ai\//i;function rm(t){const e=t?.trim()||"";return!e||/^(data:|blob:)/i.test(e)||!/^https?:\/\//i.test(e)?"":ML.test(e)?e:""}const PL=wt({method:"GET"}).handler(It("a203df098dcd51db3aa4a9e3fac54c6b9d72aa51ccbd0f797d373573fcb9af36")),DL=wt({method:"GET"}).handler(It("3aa053b96fc0210714e1178b0d48178b2eb60efba85b51706002c3c1beaba5dd"));wt({method:"GET"}).handler(It("327a5b242778479235ca3a65f608d00f5d676f37ddbe114eaf82d8f347042eae"));const LL=wt({method:"GET"}).handler(It("c51579b402b7da6e6d8d1d8c369687227f19b47edf8d2971040a3233b4fd2bfc")),M6=wt({method:"GET"}).middleware([Xn]).handler(It("602f44b7721fc9984733482e3303368107ce0e96c85dc86c2d1b225e0f01bf16")),P6=wt({method:"GET"}).middleware([Xn]).handler(It("e6371bfd756aaefe50e3b548898fc11ea101a8fbfe15bbeaab1e55e8a37c7797")),D6=wt({method:"POST"}).middleware([Xn]).handler(It("88309f2cf4f52389ba095e2cedfb673cfedc6cffd8e3fd2775abf2ff38f32e72")),L6=wt({method:"POST"}).middleware([Xn]).handler(It("9b164c50ac331cd46966f09b659ba2f9f52e826800c7787b0acb02b3f9b5d425")),N6=wt({method:"GET"}).middleware([Xn]).handler(It("4642fe87f714345798dd092f953147867d3b31e62d82115fcd5b2c9b2287dae4"));wt({method:"POST"}).middleware([Xn]).handler(It("12697b5d8c3e1478566f399596df37082a159122698
9901e2b60312967e093dfba"));wt({method:"POST"}).middleware([Xn]).handler(It("0d44815b65af7bfe628f3300fa2485501e4580411be0b478b098e739144fa6bd"));const NL={queryKey:["posts","blog"],queryFn:()=>PL({data:{collection:"blog"}})};var He;(function(t){t.assertEqual=s=>{};function e(s){}t.assertIs=e;function n(s){throw new Error}t.assertNever=n,t.arrayToEnum=s=>{const l={};for(const d of s)l[d]=d;return l},t.getValidEnumValues=s=>{const l=t.objectKeys(s).filter(u=>typeof s[s[u]]!="number"),d={};for(const u of l)d[u]=s[u];return t.objectValues(d)},t.objectValues=s=>t.objectKeys(s).map(function(l){return s[l]}),t.objectKeys=typeof Object.keys=="function"?s=>Object.keys(s):s=>{const l=[];for(const d in s)Object.prototype.hasOwnProperty.call(s,d)&&l.push(d);return l},t.find=(s,l)=>{for(const d of s)if(l(d))return d},t.isInteger=typeof Number.isInteger=="function"?s=>Number.isInteger(s):s=>typeof s=="number"&&Number.isFinite(s)&&Math.floor(s)===s;function i(s,l=" | "){return s.map(d=>typeof d=="string"?`'${d}'`:d).join(l)}t.joinValues=i,t.jsonStringifyReplacer=(s,l)=>typeof l=="bigint"?l.toString():l})(He||(He={}));var wx;(function(t){t.mergeShapes=(e,n)=>({...e,...n})})(wx||(wx={}));const ce=He.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),lo=t=>{switch(typeof t){case"undefined":return ce.undefined;case"string":return ce.string;case"number":return Number.isNaN(t)?ce.nan:ce.number;case"boolean":return ce.boolean;case"function":return ce.function;case"bigint":return ce.bigint;case"symbol":return ce.symbol;case"object":return Array.isArray(t)?ce.array:t===null?ce.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?ce.promise:typeof Map<"u"&&t instanceof Map?ce.map:typeof Set<"u"&&t instanceof Set?ce.set:typeof Date<"u"&&t instanceof Date?ce.date:ce.object;default:return ce.unknown}}
vendor: 37,932 bytes, line 99
99,Z=He.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class Ta extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=i=>{this.issues=[...this.issues,i]},this.addIssues=(i=[])=>{this.issues=[...this.issues,...i]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=e}format(e){const n=e||function(l){return l.message},i={_errors:[]},s=l=>{for(const d of l.issues)if(d.code==="invalid_union")d.unionErrors.map(s);else if(d.code==="invalid_return_type")s(d.returnTypeError);else if(d.code==="invalid_arguments")s(d.argumentsError);else if(d.path.length===0)i._errors.push(n(d));else{let u=i,f=0;for(;f<d.path.length;){const p=d.path[f];f===d.path.length-1?(u[p]=u[p]||{_errors:[]},u[p]._errors.push(n(d))):u[p]=u[p]||{_errors:[]},u=u[p],f++}}};return s(this),i}static assert(e){if(!(e instanceof Ta))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,He.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=n=>n.message){const n={},i=[];for(const s of this.issues)if(s.path.length>0){const l=s.path[0];n[l]=n[l]||[],n[l].push(e(s))}else i.push(e(s));return{formErrors:i,fieldErrors:n}}get formErrors(){return this.flatten()}}Ta.create=t=>new Ta(t);const Tp=(t,e)=>{let n;switch(t.code){case Z.invalid_type:t.received===ce.undefined?n="Required":n=`Expected ${t.expected}, received ${t.received}`;break;case Z.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(t.expected,He.jsonStringifyReplacer)}`;break;case Z.unrecognized_keys:n=`Unrecognized key(s) in object: ${He.joinValues(t.keys,", ")}`;break;case Z.invalid_union:n="Invalid input";break;case Z.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${He.joinValues(t.options)}`;break;case Z.invalid_enum_value:n=`Invalid enum value. Expected ${He.joinValues(t.options)}, received '${t.received}'`;break;case Z.invalid_arguments:n="Invalid function arguments";break;case Z.invalid_return_type:n="Invalid function return type";break;case Z.invalid_date:n="Invalid date";break;case Z.invalid_string:typeof t.validation=="object"?"includes"in t.validation?(n=`Invalid input: must include "${t.validation.includes}"`,typeof t.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${t.validation.position}`)):"startsWith"in t.validation?n=`Invalid input: must start with "${t.validation.startsWith}"`:"endsWith"in t.validation?n=`Invalid input: must end with "${t.validation.endsWith}"`:He.assertNever(t.validation):t.validation!=="regex"?n=`Invalid ${t.validation}`:n="Invalid";break;case Z.too_small:t.type==="array"?n=`Array must contain ${t.exact?"exactly":t.inclusive?"at least":"more than"} ${t.minimum} element(s)`:t.type==="string"?n=`String must contain ${t.exact?"exactly":t.inclusive?"at least":"over"} ${t.minimum} character(s)`:t.type==="number"?n=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="bigint"?n=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="date"?n=`Date must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(t.minimum))}`:n="Invalid input";break;case Z.too_big:t.type==="array"?n=`Array must contain ${t.exact?"exactly":t.inclusive?"at most":"less than"} ${t.maximum} element(s)`:t.type==="string"?n=`String must contain ${t.exact?"exactly":t.inclusive?"at most":"under"} ${t.maximum} character(s)`:t.type==="number"?n=`Number must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="bigint"?n=`BigInt must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="date"?n=`Date must be ${t.exact?"exactly":t.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(t.maximum))}`:n="Invalid input";break;case Z.custom:n="Invalid input";break;case Z.invalid_intersection_types:n="Intersection results could not be merged";break;case Z.not_multiple_of:n=`Number must be a multiple of ${t.multipleOf}`;break;case Z.not_finite:n="Number must be finite";break;default:n=e.defaultError,He.assertNever(t)}return{message:n}};let UL=Tp;function jL(){return UL}const FL=t=>{const{data:e,path:n,errorMaps:i,issueData:s}=t,l=[...n,...s.path||[]],d={...s,path:l};if(s.message!==void 0)return{...s,path:l,message:s.message};let u="";const f=i.filter(p=>!!p).slice().reverse();for(const p of f)u=p(d,{data:e,defaultError:u}).message;return{...s,path:l,message:u}};function ae(t,e){const n=jL(),i=FL({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,n,n===Tp?void 0:Tp].filter(s=>!!s)});t.common.issues.push(i)}class gn{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,n){const i=[];for(const s of n){if(s.status==="aborted")return ke;s.status==="dirty"&&e.dirty(),i.push(s.value)}return{status:e.value,value:i}}static async mergeObjectAsync(e,n){const i=[];for(const s of n){const l=await s.key,d=await s.value;i.push({key:l,value:d})}return gn.mergeObjectSync(e,i)}static mergeObjectSync(e,n){const i={};for(const s of n){const{key:l,value:d}=s;if(l.status==="aborted"||d.status==="aborted")return ke;l.status==="dirty"&&e.dirty(),d.status==="dirty"&&e.dirty(),l.value!=="__proto__"&&(typeof d.value<"u"||s.alwaysSet)&&(i[l.value]=d.value)}return{status:e.value,value:i}}}const ke=Object.freeze({status:"aborted"}),qr=t=>({status:"dirty",value:t}),En=t=>({status:"valid",value:t}),xx=t=>t.status==="aborted",kx=t=>t.status==="dirty",Ss=t=>t.status==="valid",Td=t=>typeof Promise<"u"&&t instanceof Promise;var ue;(function(t){t.errToObj=e=>typeof e=="string"?{message:e}:e||{},t.toString=e=>typeof e=="string"?e:e?.message})(ue||(ue={}));class So{constructor(e,n,i,s){this._cachedPath=[],this.parent=e,this.data=n,this._path=i,this._key=s}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const Sx=(t,e)=>{if(Ss(e))return{success:!0,data:e.value};if(!t.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new Ta(t.common.issues);return this._error=n,this._error}}};function Ee(t){if(!t)return{};const{errorMap:e,invalid_type_error:n,required_error:i,description:s}=t;if(e&&(n||i))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:s}:{errorMap:(d,u)=>{const{message:f}=t;return d.code==="invalid_enum_value"?{message:f??u.defaultError}:typeof u.data>"u"?{message:f??i??u.defaultError}:d.code!=="invalid_type"?{message:u.defaultError}:{message:f??n??u.defaultError}},description:s}}class je{get description(){return this._def.description}_getType(e){return lo(e.data)}_getOrReturnCtx(e,n){return n||{common:e.parent.common,data:e.data,parsedType:lo(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new gn,ctx:{common:e.parent.common,data:e.data,parsedType:lo(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const n=this._parse(e);if(Td(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(e){const n=this._parse(e);return Promise.resolve(n)}parse(e,n){const i=this.safeParse(e,n);if(i.success)return i.data;throw i.error}safeParse(e,n){const i={common:{issues:[],async:n?.async??!1,contextualErrorMap:n?.errorMap},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:lo(e)},s=this._parseSync({data:e,path:i.path,parent:i});return Sx(i,s)}"~validate"(e){const n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:lo(e)};if(!this["~standard"].async)try{const i=this._parseSync({data:e,path:[],parent:n});return Ss(i)?{value:i.value}:{issues:n.common.issues}}catch(i){i?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),n.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:n}).then(i=>Ss(i)?{value:i.value}:{issues:n.common.issues})}async parseAsync(e,n){const i=await this.safeParseAsync(e,n);if(i.success)return i.data;throw i.error}async safeParseAsync(e,n){const i={common:{issues:[],contextualErrorMap:n?.errorMap,async:!0},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:lo(e)},s=this._parse({data:e,path:i.path,parent:i}),l=await(Td(s)?s:Promise.resolve(s));return Sx(i,l)}refine(e,n){const i=s=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(s):n;return this._refinement((s,l)=>{const d=e(s),u=()=>l.addIssue({code:Z.custom,...i(s)});return typeof Promise<"u"&&d instanceof Promise?d.then(f=>f?!0:(u(),!1)):d?!0:(u(),!1)})}refinement(e,n){return this._refinement((i,s)=>e(i)?!0:(s.addIssue(typeof n=="function"?n(i,s):n),!1))}_refinement(e){return new As({schema:this,typeName:Se.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)}}optional(){return ko.create(this,this._def)}nullable(){return Ts.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Zn.create(this)}promise(){return Md.create(this,this._def)}or(e){return Od.create([this,e],this._def)}and(e){return Id.create(this,e,this._def)}transform(e){return new As({...Ee(this._def),schema:this,typeName:Se.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const n=typeof e=="function"?e:()=>e;return new Ep({...Ee(this._def),innerType:this,defaultValue:n,typeName:Se.ZodDefault})}brand(){return new l5({typeName:Se.ZodBranded,type:this,...Ee(this._def)})}catch(e){const n=typeof e=="function"?e:()=>e;return new Op({...Ee(this._def),innerType:this,catchValue:n,typeName:Se.ZodCatch})}describe(e){const n=this.constructor;return new n({...this._def,description:e})}pipe(e){return lm.create(this,e)}readonly(){return Ip.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const qL=/^c[^\s-]{8,}$/i,BL=/^[0-9a-z]+$/,zL=/^[0-9A-HJKMNP-TV-Z]{26}$/i,HL=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,GL=/^[a-z0-9_-]{21}$/i,WL=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,$L=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,VL=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,YL="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let Xf;const KL=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ZL=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,QL=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,XL=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,JL=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,e5=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,L0="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",t5=new RegExp(`^${L0}$`);function N0(t){let e="[0-5]\\d";t.precision?e=`${e}\\.\\d{${t.precision}}`:t.precision==null&&(e=`${e}(\\.\\d+)?`);const n=t.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${n}`}function n5(t){return new RegExp(`^${N0(t)}$`)}function a5(t){let e=`${L0}T${N0(t)}`;const n=[];return n.push(t.local?"Z?":"Z"),t.offset&&n.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${n.join("|")})`,new RegExp(`^${e}$`)}function o5(t,e){return!!((e==="v4"||!e)&&KL.test(t)||(e==="v6"||!e)&&QL.test(t))}function i5(t,e){if(!WL.test(t))return!1;try{const[n]=t.split(".");if(!n)return!1;const i=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),s=JSON.parse(atob(i));return!(typeof s!="object"||s===null||"typ"in s&&s?.typ!=="JWT"||!s.alg||e&&s.alg!==e)}catch{return!1}}function s5(t,e){return!!((e==="v4"||!e)&&ZL.test(t)||(e==="v6"||!e)&&XL.test(t))}class bo extends je{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==ce.string){const l=this._getOrReturnCtx(e);return ae(l,{code:Z.invalid_type,expected:ce.string,received:l.parsedType}),ke}const i=new gn;let s;for(const l of this._def.checks)if(l.kind==="min")e.data.length<l.value&&(s=this._getOrReturnCtx(e,s),ae(s,{code:Z.too_small,minimum:l.value,type:"string",inclusive:!0,exact:!1,message:l.message}),i.dirty());else if(l.kind==="max")e.data.length>l.value&&(s=this._getOrReturnCtx(e,s),ae(s,{code:Z.too_big,maximum:l.value,type:"string",inclusive:!0,exact:!1,message:l.message}),i.dirty());else if(l.kind==="length"){const d=e.data.length>l.value,u=e.data.length<l.value;(d||u)&&(s=this._getOrReturnCtx(e,s),d?ae(s,{code:Z.too_big,maximum:l.value,type:"string",inclusive:!0,exact:!0,message:l.message}):u&&ae(s,{code:Z.too_small,minimum:l.value,type:"string",inclusive:!0,exact:!0,message:l.message}),i.dirty())}else if(l.kind==="email")VL.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"email",code:Z.invalid_string,message:l.message}),i.dirty());else if(l.kind==="emoji")Xf||(Xf=new RegExp(YL,"u")),Xf.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"emoji",code:Z.invalid_string,message:l.message}),i.dirty());else if(l.kind==="uuid")HL.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"uuid",code:Z.invalid_string,message:l.message}),i.dirty());else if(l.kind==="nanoid")GL.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"nanoid",code:Z.invalid_string,message:l.message}),i.dirty());else if(l.kind==="cuid")qL.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"cuid",code:Z.invalid_string,message:l.message}),i.dirty());else if(l.kind==="cuid2")BL.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"cuid2",code:Z.invalid_string,message:l.message}),i.dirty());else if(l.kind==="ulid")zL.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"ulid",code:Z.invalid_string,message:l.message}),i.dirty());else if(l.kind==="url")try{new URL(e.data)}catch{s=this._getOrReturnCtx(e,s),ae(s,{validation:"url",code:Z.invalid_string,message:l.message}),i.dirty()}else l.kind==="regex"?(l.regex.lastIndex=0,l.regex.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"regex",code:Z.invalid_string,message:l.message}),i.dirty())):l.kind==="trim"?e.data=e.data.trim():l.kind==="includes"?e.data.includes(l.value,l.position)||(s=this._getOrReturnCtx(e,s),ae(s,{code:Z.invalid_string,validation:{includes:l.value,position:l.position},message:l.message}),i.dirty()):l.kind==="toLowerCase"?e.data=e.data.toLowerCase():l.kind==="toUpperCase"?e.data=e.data.toUpperCase():l.kind==="startsWith"?e.data.startsWith(l.value)||(s=this._getOrReturnCtx(e,s),ae(s,{code:Z.invalid_string,validation:{startsWith:l.value},message:l.message}),i.dirty()):l.kind==="endsWith"?e.data.endsWith(l.value)||(s=this._getOrReturnCtx(e,s),ae(s,{code:Z.invalid_string,validation:{endsWith:l.value},message:l.message}),i.dirty()):l.kind==="datetime"?a5(l).test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{code:Z.invalid_string,validation:"datetime",message:l.message}),i.dirty()):l.kind==="date"?t5.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{code:Z.invalid_string,validation:"date",message:l.message}),i.dirty()):l.kind==="time"?n5(l).test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{code:Z.invalid_string,validation:"time",message:l.message}),i.dirty()):l.kind==="duration"?$L.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"duration",code:Z.invalid_string,message:l.message}),i.dirty()):l.kind==="ip"?o5(e.data,l.version)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"ip",code:Z.invalid_string,message:l.message}),i.dirty()):l.kind==="jwt"?i5(e.data,l.alg)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"jwt",code:Z.invalid_string,message:l.message}),i.dirty()):l.kind==="cidr"?s5(e.data,l.version)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"cidr",code:Z.invalid_string,message:l.message}),i.dirty()):l.kind==="base64"?JL.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"base64",code:Z.invalid_string,message:l.message}),i.dirty()):l.kind==="base64url"?e5.test(e.data)||(s=this._getOrReturnCtx(e,s),ae(s,{validation:"base64url",code:Z.invalid_string,message:l.message}),i.dirty()):He.assertNever(l);return{status:i.value,value:e.data}}_regex(e,n,i){return this.refinement(s=>e.test(s),{validation:n,code:Z.invalid_string,...ue.errToObj(i)})}_addCheck(e){return new bo({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...ue.errToObj(e)})}url(e){return this._addCheck({kind:"url",...ue.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...ue.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...ue.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...ue.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...ue.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...ue.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...ue.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...ue.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...ue.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...ue.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...ue.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...ue.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??!1,local:e?.local??!1,...ue.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...ue.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...ue.errToObj(e)})}regex(e,n){return this._addCheck({kind:"regex",regex:e,...ue.errToObj(n)})}includes(e,n){return this._addCheck({kind:"includes",value:e,position:n?.position,...ue.errToObj(n?.message)})}startsWith(e,n){return this._addCheck({kind:"startsWith",value:e,...ue.errToObj(n)})}endsWith(e,n){return this._addCheck({kind:"endsWith",value:e,...ue.errToObj(n)})}min(e,n){return this._addCheck({kind:"min",value:e,...ue.errToObj(n)})}max(e,n){return this._addCheck({kind:"max",value:e,...ue.errToObj(n)})}length(e,n){return this._addCheck({kind:"length",value:e,...ue.errToObj(n)})}nonempty(e){return this.min(1,ue.errToObj(e))}trim(){return new bo({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new bo({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new bo({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(const n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxLength(){let e=null;for(const n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e}}bo.create=t=>new bo({checks:[],typeName:Se.ZodString,coerce:t?.coerce??!1,...Ee(t)});function r5(t,e){const n=(t.toString().split(".")[1]||"").length,i=(e.toString().split(".")[1]||"").length,s=n>i?n:i,l=Number.parseInt(t.toFixed(s).replace(".","")),d=Number.parseInt(e.toFixed(s).replace(".",""));return l%d/10**s}class _s extends je{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==ce.number){const l=this._getOrReturnCtx(e);return ae(l,{code:Z.invalid_type,expected:ce.number,received:l.parsedType}),ke}let i;const s=new gn;for(const l of this._def.checks)l.kind==="int"?He.isInteger(e.data)||(i=this._getOrReturnCtx(e,i),ae(i,{code:Z.invalid_type,expected:"integer",received:"float",message:l.message}),s.dirty()):l.kind==="min"?(l.inclusive?e.data<l.value:e.data<=l.value)&&(i=this._getOrReturnCtx(e,i),ae(i,{code:Z.too_small,minimum:l.value,type:"number",inclusive:l.inclusive,exact:!1,message:l.message}),s.dirty()):l.kind==="max"?(l.inclusive?e.data>l.value:e.data>=l.value)&&(i=this._getOrReturnCtx(e,i),ae(i,{code:Z.too_big,maximum:l.value,type:"number",inclusive:l.inclusive,exact:!1,message:l.message}),s.dirty()):l.kind==="multipleOf"?r5(e.data,l.value)!==0&&(i=this._getOrReturnCtx(e,i),ae(i,{code:Z.not_multiple_of,multipleOf:l.value,message:l.message}),s.dirty()):l.kind==="finite"?Number.isFinite(e.data)||(i=this._getOrReturnCtx(e,i),ae(i,{code:Z.not_finite,message:l.message}),s.dirty()):He.assertNever(l);return{status:s.value,value:e.data}}gte(e,n){return this.setLimit("min",e,!0,ue.toString(n))}gt(e,n){return this.setLimit("min",e,!1,ue.toString(n))}lte(e,n){return this.setLimit("max",e,!0,ue.toString(n))}lt(e,n){return this.setLimit("max",e,!1,ue.toString(n))}setLimit(e,n,i,s){return new _s({...this._def,checks:[...this._def.checks,{kind:e,value:n,inclusive:i,message:ue.toString(s)}]})}_addCheck(e){return new _s({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:ue.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:ue.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:ue.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:ue.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:ue.toString(e)})}multipleOf(e,n){return this._addCheck({kind:"multipleOf",value:e,message:ue.toString(n)})}finite(e){return this._addCheck({kind:"finite",message:ue.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:ue.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:ue.toString(e)})}get minValue(){let e=null;for(const n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxValue(){let e=null;for(const n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e}get isInt(){return!!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&He.isInteger(e.value))}get isFinite(){let e=null,n=null;for(const i of this._def.checks){if(i.kind==="finite"||i.kind==="int"||i.kind==="multipleOf")return!0;i.kind==="min"?(n===null||i.value>n)&&(n=i.value):i.kind==="max"&&(e===null||i.value<e)&&(e=i.value)}return Number.isFinite(n)&&Number.isFinite(e)}}_s.create=t=>new _s({checks:[],typeName:Se.ZodNumber,coerce:t?.coerce||!1,...Ee(t)});class rl extends je{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==ce.bigint)return this._getInvalidInput(e);let i;const s=new gn;for(const l of this._def.checks)l.kind==="min"?(l.inclusive?e.data<l.value:e.data<=l.value)&&(i=this._getOrReturnCtx(e,i),ae(i,{code:Z.too_small,type:"bigint",minimum:l.value,inclusive:l.inclusive,message:l.message}),s.dirty()):l.kind==="max"?(l.inclusive?e.data>l.value:e.data>=l.value)&&(i=this._getOrReturnCtx(e,i),ae(i,{code:Z.too_big,type:"bigint",maximum:l.value,inclusive:l.inclusive,message:l.message}),s.dirty()):l.kind==="multipleOf"?e.data%l.value!==BigInt(0)&&(i=this._getOrReturnCtx(e,i),ae(i,{code:Z.not_multiple_of,multipleOf:l.value,message:l.message}),s.dirty()):He.assertNever(l);return{status:s.value,value:e.data}}_getInvalidInput(e){const n=this._getOrReturnCtx(e);return ae(n,{code:Z.invalid_type,expected:ce.bigint,received:n.parsedType}),ke}gte(e,n){return this.setLimit("min",e,!0,ue.toString(n))}gt(e,n){return this.setLimit("min",e,!1,ue.toString(n))}lte(e,n){return this.setLimit("max",e,!0,ue.toString(n))}lt(e,n){return this.setLimit("max",e,!1,ue.toString(n))}setLimit(e,n,i,s){return new rl({...this._def,checks:[...this._def.checks,{kind:e,value:n,inclusive:i,message:ue.toString(s)}]})}_addCheck(e){return new rl({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:ue.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:ue.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:ue.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:ue.toString(e)})}multipleOf(e,n){return this._addCheck({kind:"multipleOf",value:e,message:ue.toString(n)})}get minValue(){let e=null;for(const n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxValue(){let e=null;for(const n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e}}rl.create=t=>new rl({checks:[],typeName:Se.ZodBigInt,coerce:t?.coerce??!1,...Ee(t)});class _x extends je{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==ce.boolean){const i=this._getOrReturnCtx(e);return ae(i,{code:Z.invalid_type,expected:ce.boolean,received:i.parsedType}),ke}return En(e.data)}}_x.create=t=>new _x({typeName:Se.ZodBoolean,coerce:t?.coerce||!1,...Ee(t)});class Rd extends je{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==ce.date){const l=this._getOrReturnCtx(e);return ae(l,{code:Z.invalid_type,expected:ce.date,received:l.parsedType}),ke}if(Number.isNaN(e.data.getTime())){const l=this._getOrReturnCtx(e);return ae(l,{code:Z.invalid_date}),ke}const i=new gn;let s;for(const l of this._def.checks)l.kind==="min"?e.data.getTime()<l.value&&(s=this._getOrReturnCtx(e,s),ae(s,{code:Z.too_small,message:l.message,inclusive:!0,exact:!1,minimum:l.value,type:"date"}),i.dirty()):l.kind==="max"?e.data.getTime()>l.value&&(s=this._getOrReturnCtx(e,s),ae(s,{code:Z.too_big,message:l.message,inclusive:!0,exact:!1,maximum:l.value,type:"date"}),i.dirty()):He.assertNever(l);return{status:i.value,value:new Date(e.data.getTime())}}_addCheck(e){return new Rd({...this._def,checks:[...this._def.checks,e]})}min(e,n){return this._addCheck({kind:"min",value:e.getTime(),message:ue.toString(n)})}max(e,n){return this._addCheck({kind:"max",value:e.getTime(),message:ue.toString(n)})}get minDate(){let e=null;for(const n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(const n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e!=null?new Date(e):null}}Rd.create=t=>new Rd({checks:[],coerce:t?.coerce||!1,typeName:Se.ZodDate,...Ee(t)});class Cx extends je{_parse(e){if(this._getType(e)!==ce.symbol){const i=this._getOrReturnCtx(e);return ae(i,{code:Z.invalid_type,expected:ce.symbol,received:i.parsedType}),ke}return En(e.data)}}Cx.create=t=>new Cx({typeName:Se.ZodSymbol,...Ee(t)});class Ax extends je{_parse(e){if(this._getType(e)!==ce.undefined){const i=this._getOrReturnCtx(e);return ae(i,{code:Z.invalid_type,expected:ce.undefined,received:i.parsedType}),ke}return En(e.data)}}Ax.create=t=>new Ax({typeName:Se.ZodUndefined,...Ee(t)});class Tx extends je{_parse(e){if(this._getType(e)!==ce.null){const i=this._getOrReturnCtx(e);return ae(i,{code:Z.invalid_type,expected:ce.null,received:i.parsedType}),ke}return En(e.data)}}Tx.create=t=>new Tx({typeName:Se.ZodNull,...Ee(t)});class Ed extends je{constructor(){super(...arguments),this._any=!0}_parse(e){return En(e.data)}}Ed.create=t=>new Ed({typeName:Se.ZodAny,...Ee(t)});class Rx extends je{constructor(){super(...arguments),this._unknown=!0}_parse(e){return En(e.data)}}Rx.create=t=>new Rx({typeName:Se.ZodUnknown,...Ee(t)});class _o extends je{_parse(e){const n=this._getOrReturnCtx(e);return ae(n,{code:Z.invalid_type,expected:ce.never,received:n.parsedType}),ke}}_o.create=t=>new _o({typeName:Se.ZodNever,...Ee(t)});class Ex extends je{_parse(e){if(this._getType(e)!==ce.undefined){const i=this._getOrReturnCtx(e);return ae(i,{code:Z.invalid_type,expected:ce.void,received:i.parsedType}),ke}return En(e.data)}}Ex.create=t=>new Ex({typeName:Se.ZodVoid,...Ee(t)});class Zn extends je{_parse(e){const{ctx:n,status:i}=this._processInputParams(e),s=this._def;if(n.parsedType!==ce.array)return ae(n,{code:Z.invalid_type,expected:ce.array,received:n.parsedType}),ke;if(s.exactLength!==null){const d=n.data.length>s.exactLength.value,u=n.data.length<s.exactLength.value;(d||u)&&(ae(n,{code:d?Z.too_big:Z.too_small,minimum:u?s.exactLength.value:void 0,maximum:d?s.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:s.exactLength.message}),i.dirty())}if(s.minLength!==null&&n.data.length<s.minLength.value&&(ae(n,{code:Z.too_small,minimum:s.minLength.value,type:"array",inclusive:!0,exact:!1,message:s.minLength.message}),i.dirty()),s.maxLength!==null&&n.data.length>s.maxLength.value&&(ae(n,{code:Z.too_big,maximum:s.maxLength.value,type:"array",inclusive:!0,exact:!1,message:s.maxLength.message}),i.dirty()),n.common.async)return Promise.all([...n.data].map((d,u)=>s.type._parseAsync(new So(n,d,n.path,u)))).then(d=>gn.mergeArray(i,d));const l=[...n.data].map((d,u)=>s.type._parseSync(new So(n,d,n.path,u)));return gn.mergeArray(i,l)}get element(){return this._def.type}min(e,n){return new Zn({...this._def,minLength:{value:e,message:ue.toString(n)}})}max(e,n){return new Zn({...this._def,maxLength:{value:e,message:ue.toString(n)}})}length(e,n){return new Zn({...this._def,exactLength:{value:e,message:ue.toString(n)}})}nonempty(e){return this.min(1,e)}}Zn.create=(t,e)=>new Zn({type:t,minLength:null,maxLength:null,exactLength:null,typeName:Se.ZodArray,...Ee(e)});function ps(t){if(t instanceof vt){const e={};for(const n in t.shape){const i=t.shape[n];e[n]=ko.create(ps(i))}return new vt({...t._def,shape:()=>e})}else return t instanceof Zn?new Zn({...t._def,type:ps(t.element)}):t instanceof ko?ko.create(ps(t.unwrap())):t instanceof Ts?Ts.create(ps(t.unwrap())):t instanceof ii?ii.create(t.items.map(e=>ps(e))):t}class vt extends je{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const e=this._def.shape(),n=He.objectKeys(e);return this._cached={shape:e,keys:n},this._cached}_parse(e){if(this._getType(e)!==ce.object){const p=this._getOrReturnCtx(e);return ae(p,{code:Z.invalid_type,expected:ce.object,received:p.parsedType}),ke}const{status:i,ctx:s}=this._processInputParams(e),{shape:l,keys:d}=this._getCached(),u=[];if(!(this._def.catchall instanceof _o&&this._def.unknownKeys==="strip"))for(const p in s.data)d.includes(p)||u.push(p);const f=[];for(const p of d){const y=l[p],g=s.data[p];f.push({key:{status:"valid",value:p},value:y._parse(new So(s,g,s.path,p)),alwaysSet:p in s.data})}if(this._def.catchall instanceof _o){const p=this._def.unknownKeys;if(p==="passthrough")for(const y of u)f.push({key:{status:"valid",value:y},value:{status:"valid",value:s.data[y]}});else if(p==="strict")u.length>0&&(ae(s,{code:Z.unrecognized_keys,keys:u}),i.dirty());else if(p!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const p=this._def.catchall;for(const y of u){const g=s.data[y];f.push({key:{status:"valid",value:y},value:p._parse(new So(s,g,s.path,y)),alwaysSet:y in s.data})}}return s.common.async?Promise.resolve().then(async()=>{const p=[];for(const y of f){const g=await y.key,v=await y.value;p.push({key:g,value:v,alwaysSet:y.alwaysSet})}return p}).then(p=>gn.mergeObjectSync(i,p)):gn.mergeObjectSync(i,f)}get shape(){return this._def.shape()}strict(e){return ue.errToObj,new vt({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(n,i)=>{const s=this._def.errorMap?.(n,i).message??i.defaultError;return n.code==="unrecognized_keys"?{message:ue.errToObj(e).message??s}:{message:s}}}:{}})}strip(){return new vt({...this._def,unknownKeys:"strip"})}passthrough(){return new vt({...this._def,unknownKeys:"passthrough"})}extend(e){return new vt({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new vt({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:Se.ZodObject})}setKey(e,n){return this.augment({[e]:n})}catchall(e){return new vt({...this._def,catchall:e})}pick(e){const n={};for(const i of He.objectKeys(e))e[i]&&this.shape[i]&&(n[i]=this.shape[i]);return new vt({...this._def,shape:()=>n})}omit(e){const n={};for(const i of He.objectKeys(this.shape))e[i]||(n[i]=this.shape[i]);return new vt({...this._def,shape:()=>n})}deepPartial(){return ps(this)}partial(e){const n={};for(const i of He.objectKeys(this.shape)){const s=this.shape[i];e&&!e[i]?n[i]=s:n[i]=s.optional()}return new vt({...this._def,shape:()=>n})}required(e){const n={};for(const i of He.objectKeys(this.shape))if(e&&!e[i])n[i]=this.shape[i];else{let l=this.shape[i];for(;l instanceof ko;)l=l._def.innerType;n[i]=l}return new vt({...this._def,shape:()=>n})}keyof(){return U0(He.objectKeys(this.shape))}}vt.create=(t,e)=>new vt({shape:()=>t,unknownKeys:"strip",catchall:_o.create(),typeName:Se.ZodObject,...Ee(e)});vt.strictCreate=(t,e)=>new vt({shape:()=>t,unknownKeys:"strict",catchall:_o.create(),typeName:Se.ZodObject,...Ee(e)});vt.lazycreate=(t,e)=>new vt({shape:t,unknownKeys:"strip",catchall:_o.create(),typeName:Se.ZodObject,...Ee(e)});class Od extends je{_parse(e){const{ctx:n}=this._processInputParams(e),i=this._def.options;function s(l){for(const u of l)if(u.result.status==="valid")return u.result;for(const u of l)if(u.result.status==="dirty")return n.common.issues.push(...u.ctx.common.issues),u.result;const d=l.map(u=>
vendor: 4,241 bytes, line 99
99new Ta(u.ctx.common.issues));return ae(n,{code:Z.invalid_union,unionErrors:d}),ke}if(n.common.async)return Promise.all(i.map(async l=>{const d={...n,common:{...n.common,issues:[]},parent:null};return{result:await l._parseAsync({data:n.data,path:n.path,parent:d}),ctx:d}})).then(s);{let l;const d=[];for(const f of i){const p={...n,common:{...n.common,issues:[]},parent:null},y=f._parseSync({data:n.data,path:n.path,parent:p});if(y.status==="valid")return y;y.status==="dirty"&&!l&&(l={result:y,ctx:p}),p.common.issues.length&&d.push(p.common.issues)}if(l)return n.common.issues.push(...l.ctx.common.issues),l.result;const u=d.map(f=>new Ta(f));return ae(n,{code:Z.invalid_union,unionErrors:u}),ke}}get options(){return this._def.options}}Od.create=(t,e)=>new Od({options:t,typeName:Se.ZodUnion,...Ee(e)});function Rp(t,e){const n=lo(t),i=lo(e);if(t===e)return{valid:!0,data:t};if(n===ce.object&&i===ce.object){const s=He.objectKeys(e),l=He.objectKeys(t).filter(u=>s.indexOf(u)!==-1),d={...t,...e};for(const u of l){const f=Rp(t[u],e[u]);if(!f.valid)return{valid:!1};d[u]=f.data}return{valid:!0,data:d}}else if(n===ce.array&&i===ce.array){if(t.length!==e.length)return{valid:!1};const s=[];for(let l=0;l<t.length;l++){const d=t[l],u=e[l],f=Rp(d,u);if(!f.valid)return{valid:!1};s.push(f.data)}return{valid:!0,data:s}}else return n===ce.date&&i===ce.date&&+t==+e?{valid:!0,data:t}:{valid:!1}}class Id extends je{_parse(e){const{status:n,ctx:i}=this._processInputParams(e),s=(l,d)=>{if(xx(l)||xx(d))return ke;const u=Rp(l.value,d.value);return u.valid?((kx(l)||kx(d))&&n.dirty(),{status:n.value,value:u.data}):(ae(i,{code:Z.invalid_intersection_types}),ke)};return i.common.async?Promise.all([this._def.left._parseAsync({data:i.data,path:i.path,parent:i}),this._def.right._parseAsync({data:i.data,path:i.path,parent:i})]).then(([l,d])=>s(l,d)):s(this._def.left._parseSync({data:i.data,path:i.path,parent:i}),this._def.right._parseSync({data:i.data,path:i.path,parent:i}))}}Id.create=(t,e,n)=>new Id({left:t,right:e,typeName:Se.ZodIntersection,...Ee(n)});class ii extends je{_parse(e){const{status:n,ctx:i}=this._processInputParams(e);if(i.parsedType!==ce.array)return ae(i,{code:Z.invalid_type,expected:ce.array,received:i.parsedType}),ke;if(i.data.length<this._def.items.length)return ae(i,{code:Z.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),ke;!this._def.rest&&i.data.length>this._def.items.length&&(ae(i,{code:Z.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const l=[...i.data].map((d,u)=>{const f=this._def.items[u]||this._def.rest;return f?f._parse(new So(i,d,i.path,u)):null}).filter(d=>!!d);return i.common.async?Promise.all(l).then(d=>gn.mergeArray(n,d)):gn.mergeArray(n,l)}get items(){return this._def.items}rest(e){return new ii({...this._def,rest:e})}}ii.create=(t,e)=>{if(!Array.isArray(t))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new ii({items:t,typeName:Se.ZodTuple,rest:null,...Ee(e)})};class Ox extends je{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:n,ctx:i}=this._processInputParams(e);if(i.parsedType!==ce.map)return ae(i,{code:Z.invalid_type,expected:ce.map,received:i.parsedType}),ke;const s=this._def.keyType,l=this._def.valueType,d=[...i.data.entries()].map(([u,f],p)=>({key:s._parse(new So(i,u,i.path,[p,"key"])),value:l._parse(new So(i,f,i.path,[p,"value"]))}));if(i.common.async){const u=new Map;return Promise.resolve().then(async()=>{for(const f of d){const p=await f.key,y=await f.value;if(p.status==="aborted"||y.status==="aborted")return ke;(p.status==="dirty"||y.status==="dirty")&&n.dirty(),u.set(p.value,y.value)}return{status:n.value,value:u}})}else{const u=new Map;for(const f of d){const p=f.key,y=f.value;if(p.status==="aborted"||y.status==="aborted")return ke;(p.status==="dirty"||y.status==="dirty")&&n.dirty(),u.set(p.value,y.value)}return{status:n.value,value:u}}}}Ox.create=(t,e,n)=>new Ox({valueType:e,keyType:t,typeName:Se.ZodMap,...Ee(n)});class ll extends je{_parse(e){const{status:n,ctx:i}=this._processInputParams(e);if(i.parsedType!==ce.set)return ae(i,{code:Z.invalid_type,expected:ce.set,received:i.parsedType}),ke;
vendor: 9,770 bytes, line 99
99const s=this._def;s.minSize!==null&&i.data.size<s.minSize.value&&(ae(i,{code:Z.too_small,minimum:s.minSize.value,type:"set",inclusive:!0,exact:!1,message:s.minSize.message}),n.dirty()),s.maxSize!==null&&i.data.size>s.maxSize.value&&(ae(i,{code:Z.too_big,maximum:s.maxSize.value,type:"set",inclusive:!0,exact:!1,message:s.maxSize.message}),n.dirty());const l=this._def.valueType;function d(f){const p=new Set;for(const y of f){if(y.status==="aborted")return ke;y.status==="dirty"&&n.dirty(),p.add(y.value)}return{status:n.value,value:p}}const u=[...i.data.values()].map((f,p)=>l._parse(new So(i,f,i.path,p)));return i.common.async?Promise.all(u).then(f=>d(f)):d(u)}min(e,n){return new ll({...this._def,minSize:{value:e,message:ue.toString(n)}})}max(e,n){return new ll({...this._def,maxSize:{value:e,message:ue.toString(n)}})}size(e,n){return this.min(e,n).max(e,n)}nonempty(e){return this.min(1,e)}}ll.create=(t,e)=>new ll({valueType:t,minSize:null,maxSize:null,typeName:Se.ZodSet,...Ee(e)});class Ix extends je{get schema(){return this._def.getter()}_parse(e){const{ctx:n}=this._processInputParams(e);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}Ix.create=(t,e)=>new Ix({getter:t,typeName:Se.ZodLazy,...Ee(e)});class Mx extends je{_parse(e){if(e.data!==this._def.value){const n=this._getOrReturnCtx(e);return ae(n,{received:n.data,code:Z.invalid_literal,expected:this._def.value}),ke}return{status:"valid",value:e.data}}get value(){return this._def.value}}Mx.create=(t,e)=>new Mx({value:t,typeName:Se.ZodLiteral,...Ee(e)});function U0(t,e){return new Cs({values:t,typeName:Se.ZodEnum,...Ee(e)})}class Cs extends je{_parse(e){if(typeof e.data!="string"){const n=this._getOrReturnCtx(e),i=this._def.values;return ae(n,{expected:He.joinValues(i),received:n.parsedType,code:Z.invalid_type}),ke}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){const n=this._getOrReturnCtx(e),i=this._def.values;return ae(n,{received:n.data,code:Z.invalid_enum_value,options:i}),ke}return En(e.data)}get options(){return this._def.values}get enum(){const e={};for(const n of this._def.values)e[n]=n;return e}get Values(){const e={};for(const n of this._def.values)e[n]=n;return e}get Enum(){const e={};for(const n of this._def.values)e[n]=n;return e}extract(e,n=this._def){return Cs.create(e,{...this._def,...n})}exclude(e,n=this._def){return Cs.create(this.options.filter(i=>!e.includes(i)),{...this._def,...n})}}Cs.create=U0;class Px extends je{_parse(e){const n=He.getValidEnumValues(this._def.values),i=this._getOrReturnCtx(e);if(i.parsedType!==ce.string&&i.parsedType!==ce.number){const s=He.objectValues(n);return ae(i,{expected:He.joinValues(s),received:i.parsedType,code:Z.invalid_type}),ke}if(this._cache||(this._cache=new Set(He.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){const s=He.objectValues(n);return ae(i,{received:i.data,code:Z.invalid_enum_value,options:s}),ke}return En(e.data)}get enum(){return this._def.values}}Px.create=(t,e)=>new Px({values:t,typeName:Se.ZodNativeEnum,...Ee(e)});class Md extends je{unwrap(){return this._def.type}_parse(e){const{ctx:n}=this._processInputParams(e);if(n.parsedType!==ce.promise&&n.common.async===!1)return ae(n,{code:Z.invalid_type,expected:ce.promise,received:n.parsedType}),ke;const i=n.parsedType===ce.promise?n.data:Promise.resolve(n.data);return En(i.then(s=>this._def.type.parseAsync(s,{path:n.path,errorMap:n.common.contextualErrorMap})))}}Md.create=(t,e)=>new Md({type:t,typeName:Se.ZodPromise,...Ee(e)});class As extends je{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===Se.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:n,ctx:i}=this._processInputParams(e),s=this._def.effect||null,l={addIssue:d=>{ae(i,d),d.fatal?n.abort():n.dirty()},get path(){return i.path}};if(l.addIssue=l.addIssue.bind(l),s.type==="preprocess"){const d=s.transform(i.data,l);if(i.common.async)return Promise.resolve(d).then(async u=>{if(n.value==="aborted")return ke;const f=await this._def.schema._parseAsync({data:u,path:i.path,parent:i});return f.status==="aborted"?ke:f.status==="dirty"||n.value==="dirty"?qr(f.value):f});{if(n.value==="aborted")return ke;const u=this._def.schema._parseSync({data:d,path:i.path,parent:i});return u.status==="aborted"?ke:u.status==="dirty"||n.value==="dirty"?qr(u.value):u}}if(s.type==="refinement"){const d=u=>{const f=s.refinement(u,l);if(i.common.async)return Promise.resolve(f);if(f instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return u};if(i.common.async===!1){const u=this._def.schema._parseSync({data:i.data,path:i.path,parent:i});return u.status==="aborted"?ke:(u.status==="dirty"&&n.dirty(),d(u.value),{status:n.value,value:u.value})}else return this._def.schema._parseAsync({data:i.data,path:i.path,parent:i}).then(u=>u.status==="aborted"?ke:(u.status==="dirty"&&n.dirty(),d(u.value).then(()=>({status:n.value,value:u.value}))))}if(s.type==="transform")if(i.common.async===!1){const d=this._def.schema._parseSync({data:i.data,path:i.path,parent:i});if(!Ss(d))return ke;const u=s.transform(d.value,l);if(u instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:u}}else return this._def.schema._parseAsync({data:i.data,path:i.path,parent:i}).then(d=>Ss(d)?Promise.resolve(s.transform(d.value,l)).then(u=>({status:n.value,value:u})):ke);He.assertNever(s)}}As.create=(t,e,n)=>new As({schema:t,typeName:Se.ZodEffects,effect:e,...Ee(n)});As.createWithPreprocess=(t,e,n)=>new As({schema:e,effect:{type:"preprocess",transform:t},typeName:Se.ZodEffects,...Ee(n)});class ko extends je{_parse(e){return this._getType(e)===ce.undefined?En(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}ko.create=(t,e)=>new ko({innerType:t,typeName:Se.ZodOptional,...Ee(e)});class Ts extends je{_parse(e){return this._getType(e)===ce.null?En(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}Ts.create=(t,e)=>new Ts({innerType:t,typeName:Se.ZodNullable,...Ee(e)});class Ep extends je{_parse(e){const{ctx:n}=this._processInputParams(e);let i=n.data;return n.parsedType===ce.undefined&&(i=this._def.defaultValue()),this._def.innerType._parse({data:i,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}Ep.create=(t,e)=>new Ep({innerType:t,typeName:Se.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...Ee(e)});class Op extends je{_parse(e){const{ctx:n}=this._processInputParams(e),i={...n,common:{...n.common,issues:[]}},s=this._def.innerType._parse({data:i.data,path:i.path,parent:{...i}});return Td(s)?s.then(l=>({status:"valid",value:l.status==="valid"?l.value:this._def.catchValue({get error(){return new Ta(i.common.issues)},input:i.data})})):{status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new Ta(i.common.issues)},input:i.data})}}removeCatch(){return this._def.innerType}}Op.create=(t,e)=>new Op({innerType:t,typeName:Se.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...Ee(e)});class Dx extends je{_parse(e){if(this._getType(e)!==ce.nan){const i=this._getOrReturnCtx(e);return ae(i,{code:Z.invalid_type,expected:ce.nan,received:i.parsedType}),ke}return{status:"valid",value:e.data}}}Dx.create=t=>new Dx({typeName:Se.ZodNaN,...Ee(t)});class l5 extends je{_parse(e){const{ctx:n}=this._processInputParams(e),i=n.data;return this._def.type._parse({data:i,path:n.path,parent:n})}unwrap(){return this._def.type}}class lm extends je{_parse(e){const{status:n,ctx:i}=this._processInputParams(e);if(i.common.async)return(async()=>{const l=await this._def.in._parseAsync({data:i.data,path:i.path,parent:i});return l.status==="aborted"?ke:l.status==="dirty"?(n.dirty(),qr(l.value)):this._def.out._parseAsync({data:l.value,path:i.path,parent:i})})();{const s=this._def.in._parseSync({data:i.data,path:i.path,parent:i});return s.status==="aborted"?ke:s.status==="dirty"?(n.dirty(),{status:"dirty",value:s.value}):this._def.out._parseSync({data:s.value,path:i.path,parent:i})}}static create(e,n){return new lm({in:e,out:n,typeName:Se.ZodPipeline})}}class Ip extends je{_parse(e){const n=this._def.innerType._parse(e),i=s=>(Ss(s)&&(s.value=Object.freeze(s.value)),s);return Td(n)?n.then(s=>i(s)):i(n)}unwrap(){return this._def.innerType}}Ip.create=(t,e)=>new Ip({innerType:t,typeName:Se.ZodReadonly,...Ee(e)});function c5(t,e={},n){return Ed.create()}var Se;(function(t){t.ZodString="ZodString",t.ZodNumber="ZodNumber",t.ZodNaN="ZodNaN",t.ZodBigInt="ZodBigInt",t.ZodBoolean="ZodBoolean",t.ZodDate="ZodDate",t.ZodSymbol="ZodSymbol",t.ZodUndefined="ZodUndefined",t.ZodNull="ZodNull",t.ZodAny="ZodAny",t.ZodUnknown="ZodUnknown",t.ZodNever="ZodNever",t.ZodVoid="ZodVoid",t.ZodArray="ZodArray",t.ZodObject="ZodObject",t.ZodUnion="ZodUnion",t.ZodDiscriminatedUnion="ZodDiscriminatedUnion",t.ZodIntersection="ZodIntersection",t.ZodTuple="ZodTuple",t.ZodRecord="ZodRecord",t.ZodMap="ZodMap",t.ZodSet="ZodSet",t.ZodFunction="ZodFunction",t.ZodLazy="ZodLazy",t.ZodLiteral="ZodLiteral",t.ZodEnum="ZodEnum",t.ZodEffects="ZodEffects",t.ZodNativeEnum="ZodNativeEnum",t.ZodOptional="ZodOptional",t.ZodNullable="ZodNullable",t.ZodDefault="ZodDefault",t.ZodCatch="ZodCatch",t.ZodPromise="ZodPromise",t.ZodBranded="ZodBranded",t.ZodPipeline="ZodPipeline",t.ZodReadonly="ZodReadonly"})(Se||(Se={}));const d5=bo.create,u5=_s.create;Ed.create;_o.create;Zn.create;const h5=vt.create;Od.create;Id.create;ii.create;Cs.create;Md.create;ko.create;Ts.create;var f5=t=>{const e="input"in t?t.input:"input",n="output"in t?t.output:"output",i="schema"in t?t.schema._input
99:t._input,s="schema"in t?t.schema._output:t._output;return{types:{input:e==="output"?s:i,output:n==="input"?i:s},parse:l=>"schema"in t?t.schema.parse(l):t.parse(l)}},Lx=(t,e)=>c5().pipe(t.catch(e));function p5(t){return t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function m5(t){return t.split("-").filter(Boolean).map(e=>e[0].toUpperCase()+e.slice(1)).join(" ")}const g5=()=>ye(()=>import("./blog.index-CDTYrFE2.js"),[]),y5=()=>ye(()=>import("./blog.index-BPXSfGR4.js"),[]),b5=()=>ye(()=>import("./blog.index-LxvC8PDL.js"),__vite__mapDeps([37,38,39,2])),v5=h5({tag:Lx(d5(),"").optional(),page:Lx(u5().int(),1).optional()});function w5(t,e=1){if(!t)return{title:`OutreachFox Blog${e>1?` â Page ${e}`:""} â Cold email & LinkedIn outreach`,description:"Cold outreach playbooks, deliverability tactics, and multichannel email + LinkedIn growth guides from the OutreachFox team â practical tips for outbound teams.",path:e>1?`/blog?page=${e}`:"/blog",noindex:!1};const n=p5(t),i=m5(n);return{title:`${i} â OutreachFox Blog`,description:`${i} on the OutreachFox blog â playbooks, deliverability tactics, and multichannel email + LinkedIn tips for outbound teams that ship.`,path:"/blog",noindex:!0}}const x5=_e("/blog/")({validateSearch:f5(v5),head:({match:t})=>{const e=t.search,n=w5(e?.tag,Math.max(1,e?.page??1));return Qe({title:n.title,description:n.description,path:n.path,noindex:n.noindex,image:{url:Kn.ogHome,width:1200,height:630,alt:"OutreachFox"}})},loader:({context:t})=>t.queryClient.ensureQueryData(NL),component:be(b5,"component"),errorComponent:be(y5,"errorComponent"),notFoundComponent:be(g5,"notFoundComponent")}),k5=()=>ye(()=>import("./tools.spf-CLDy-mxH.js"),__vite__mapDeps([40,41,2,27,11])),S5=_e("/tools/spf")({head:()=>Qe({title:"Free SPF Record Checker â OutreachFox",description:"Check the SPF record of any domain. See included senders, mechanisms and the all qualifier in seconds. No signup required.",path:"/tools/spf"}),component:be(k5,"component")}),_5=()=>ye(()=>import("./tools.mx-CWy-oDoy.js"),__vite__mapDeps([42,41,2,27,11])),C5=_e("/tools/mx")({head:()=>Qe({title:"Free MX Record Lookup â OutreachFox",description:"Free MX record lookup â see the mail servers for any domain, ordered by priority, and instantly detect the email provider (Google, Microsoft 365 and more).",path:"/tools/mx"}),component:be(_5,"component")}),A5=()=>ye(()=>import("./tools.email-verifier-B9KicVe3.js"),__vite__mapDeps([43,41,2,27,11])),T5=_e("/tools/email-verifier")({head:()=>Qe({title:"Free Email Verifier â OutreachFox",description:"Free email verifier â check syntax, MX records, disposable and role mailboxes, and get an instant deliverability score for any address. No signup required.",path:"/tools/email-verifier"}),component:be(A5,"component")}),R5=()=>ye(()=>import("./tools.dmarc-Dey5bkcV.js"),__vite__mapDeps([44,41,2,27,11])),E5=_e("/tools/dmarc")({head:()=>Qe({title:"Free DMARC Record Checker â OutreachFox",description:"Free DMARC record checker â inspect any domain's DMARC policy, alignment, reporting addresses and subdomain handling in one click. No signup, unlimited use.",path:"/tools/dmarc"}),component:be(R5,"component")}),O5=()=>ye(()=>import("./tools.dkim-l9s6oNk0.js"),__vite__mapDeps([45,41,2,27,11])),I5=_e("/tools/dkim")({head:()=>Qe({title:"Free DKIM Record Checker â OutreachFox",description:"Free DKIM record checker â verify DKIM signing keys on any selector. We probe 20+ common selectors automatically when none is provided. No signup required.",path:"/tools/dkim"}),component:be(O5,"component")}),M5=()=>ye(()=>import("./tools.blacklist-C_OIpoEF.js"),__vite__mapDeps([46,41,2,27,11])),P5=_e("/tools/blacklist")({head:()=>Qe({title:"Free IP & Domain Blacklist Checker â OutreachFox",description:"Free blacklist checker â scan any IP or domain across 10 major DNS blacklists including Spamhaus, SpamCop and Barracuda. Instant results, no signup required.",path:"/tools/blacklist"}),component:be(M5,"component")}),D5="https://outreachfox.ai",Nx="OutreachFox";function L5(t){return{"@context":"https://schema.org","@type":"Article",headline:t.title,de
99scription:t.description||void 0,image:t.image||void 0,datePublished:t.datePublished||void 0,dateModified:t.dateModified||t.datePublished||void 0,url:t.url,mainEntityOfPage:t.url,author:t.authorName?{"@type":"Person",name:t.authorName,...t.authorUrl?{url:t.authorUrl}:{}}:{"@type":"Organization",name:Nx},publisher:{"@type":"Organization",name:Nx,url:D5},citation:t.sources?.length?t.sources.map(e=>({"@type":"CreativeWork",name:e.title,url:e.url})):void 0}}function ul(t){return{"@context":"https://schema.org","@type":"FAQPage",mainEntity:t.map(e=>({"@type":"Question",name:e.q,acceptedAnswer:{"@type":"Answer",text:e.a}}))}}function N5(t){return{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:t.map((e,n)=>({"@type":"ListItem",position:n+1,name:e.name,item:e.url}))}}function ni(t){return{type:"application/ld+json",children:JSON.stringify(t)}}const U5=[{q:"How is your data different from ZoomInfo or Apollo?",a:"Single-source databases cap out around 40â50% coverage. OutreachFox runs waterfall enrichment across 50+ data providers â when one source misses, the next one fills the gap â so coverage and accuracy compound instead of capping. Every email is verified by our proprietary verification engine before it ever enters a campaign."},{q:'What does "waterfall enrichment" actually mean?',a:"Instead of buying data from one vendor, we query providers sequentially in an optimized order. Each lead pulls the best available email, phone number, and firmographics across the network, and you only consume credits when we find verified data â not on empty lookups."},{q:"Do you verify emails before sending?",a:"Yes, every address passes proprietary verification at enrichment time and again at send time. Catch-alls, role accounts, and dead inboxes are flagged before they can bounce and damage your sender reputation."},{q:"Can I import my own lists and enrich them?",a:"Yes. Upload a CSV or push leads via API, and the same waterfall enrichment and verification runs on your existing data â filling missing emails, phones, LinkedIn profiles, and firmographics."},{q:"What is the Clay-style table?",a:"A spreadsheet-like workspace where each row is a lead and each column is an enrichment step â find email, verify, pull LinkedIn URL, add firmographics. You see exactly what was found, from which source, at each step."},{q:"How fresh is the data?",a:"Enrichment runs in real time at the moment you request it â not from a database snapshot exported months ago. Contacts are verified as of the day you launch, not the day the list was compiled."},{q:"How does credit pricing work?",a:"No surprise overages. You only pay for successful finds, and plans include predictable enrichment volume â no per-seat tax stacked on top."},{q:"Can I search for leads directly inside the platform?",a:"Yes. The built-in B2B database lets you filter by title, company size, industry, and region, then push results straight into a sequence â no exp
99orts, no CSV handoffs between tools."}],j5=[{q:`What do you mean by "we don't rent your mailboxes, we build them"?`,a:"Most providers resell shared SMTP relays dressed up as infrastructure. We provision real Google Workspace and Microsoft 365 accounts on Google's and Microsoft's own infrastructure â the highest baseline inbox trust that exists â dedicated to your account alone."},{q:"Why does a shared warmup pool hurt my deliverability?",a:"On a shared network, thousands of accounts fire identical patterns from the same IP ranges â ESPs flagged that playbook years ago. When one stranger in the pool hits Spamhaus, every domain in the neighborhood inherits the damage. Isolation removes that variable entirely: your reputation depends on your behavior, not someone else's."},{q:"How fast can I get sending mailboxes?",a:"Minutes, not days. Mailboxes are provisioned with SPF, DKIM, and DMARC configured automatically â no manual DNS records, no silent misconfigurations â and enter warmup immediately."},{q:"Do I need to configure DNS myself?",a:"No. Authentication is automated end-to-end. Every mailbox ships with SPF, DKIM, and DMARC set correctly on day one."},{q:"What are dedicated campaign IPs?",a:"Your sending IPs are yours alone â never shared, never co-mingled, never on a blacklist because of someone else's mistakes. You can also choose the region (US or EU) your sender reputation lives in."},{q:"What is industry-tuned warmup?",a:"Warmup patterns are calibrated to your sending profile and provider mix rather than a generic ramp. Mailboxes auto-heal 24/7 â if health drops, sending volume adjusts automatically before deliverability takes damage."},{q:"What deliverability should I expect?",a:"Customer accounts typically see 95%+ inbox placement with no shared-blacklist incidents, because there's no shared surface to inherit problems from."},{q:"Do you support both Google and Microsoft?",a:"Yes â native Google Workspace and Microsoft 365, with provider-matched routing: Gmail leads receive from Gmail senders, Outlook leads from Outlook senders. Provider-to-provider routing measurably lifts inbox placement."},{q:"What happens if a mailbox's health drops?",a:"Monitoring runs continuously per mailbox. Degrading mailboxes are throttled, rotated out of campaigns, and rehabilitated through warmup automatically â no manual babysitting."}],F5=[{q:"Why isn't email alone enough anymore?",a:"Email-only reply rates keep sliding as inboxes get smarter. Prospects who skip your email will often answer a LinkedIn touch â but running separate tools means two sequences and two inboxes that never sync, so the coordinated follow-up that would've landed never gets sent."},{q:"Which channels are supported?",a:"Email and LinkedIn (profile visits, connection requests, and messages) in a single sequence, with conditional steps â e.g., if a connection request is accepted, send a LinkedIn message; if not, fall back to email."},{q:"How do email and LI steps coordinate?",a:"One sequence, one timeline, one lead record. Every touch on either channel is aware of every other touch, so a prospect never gets a cold email the day after they replied on LinkedIn."},{q:"Can I personalize at scale?",a:"Yes â every enrichment field (title, company, funding, tech stack, LinkedIn activity) is available as a variable in both email and LinkedIn steps, plus AI-generated personalization lines built from lead context."},{q:"Is there an API?",a:"The platform is API-first. Create leads, trigger sequences, pull reply data, and sync outcomes to your CRM programmatically â everything the UI does, the API does."},{q:"How do you protect deliverability while scaling volume?",a:"Sending runs on your isolated infrastructure (dedicated IPs, owned mailboxes), volume is spread across mailboxes automatically with per-mailbox daily caps, and verification blocks bad addresses before they bounce."},{q:"Can I A/B test sequences?",a:"Yes â split-test subject lines, copy, send times, and channel order, with reply and positive-reply rates tracked per variant."},{q:"What does this replace in my stack?",a:"Typically 5 tools: a data provider, an enrichment tool, an email sender, a warmup service, and a LinkedIn automation tool â which is where most teams see a significant drop in total tech-stack cost."}],q5=[{q:"What lands in the unified inbox?",a:"Replies from every sending mailbox and every LinkedIn seat, across all campaigns, threaded into one stream. No tab-switching between Gmail tabs, Outlook windows, and LinkedIn."},{q:"How fast do replies sync?",a:"Near real-time â faster than legacy inboxes that poll on delay. Speed-to-lead is one of the highest-leverage variables in cold outreach: a reply answered in five minutes converts far better than one answered in five hours."},{q:"How do AI replies work?",a:"AI reads the full thread plus the lead's enrichment data and drafts a contextual reply for every incoming message â in your voice. Review, tweak, and send in one click, or let it handle common objections and scheduling suggestions automatically."},{q:"What is AI intent tagging?",a:"Every incoming reply is classified the moment it arrives â Interested, Objection, Not now, Wrong person, OOO, Referral â so your team works the hottest replies first and pipeline reporting stays clean with zero manual triage."},{q:"Can my team collaborate in the inbox?",a:"Yes â assign threads to teammates, leave internal notes on conversations, and use shared saved replies so anyone can pick up a thread with full context."},{q:"Does the inbox show lead context?",a:"Every thread carries a sidebar with the lead's enrichment data, campaign history, and prior touches on both channels â you always reply with the full picture."},{q:"Can I push replies to my CRM?",a:"Yes â mark interested, book meetings, and sync qualified replies to your CRM without leaving the inbox, via native integrations or the API."},{q:"Does replying pause the sequence?",a:"Automatically. Any reply on any channel halts remaining sequence steps for that lead instantly, so nobody gets an automated follow-up after a human conversation has started."}],B5=()=>ye(()=>import("./features.unified-inbox-DUpbQQ08.js"),__vite__mapDeps([47,2,48,18,17,27])),z5=_e("/features/unified-inbox")({head:()=>({...Qe({title:"Unified Inbox â Every reply, one inbox | OutreachFox",description:"Email and LinkedIn replies from every mailbox and campaign threaded into one view, with AI-drafted replies and automatic intent tagging so follow-ups happen in minutes.",path:"/features/unified-inbox"}),scripts:[ni(ul(q5))]}),component:be(B5,"component")}),H5=()=>ye(()=>import("./features.multichannel-outreach-CHFKDsqx.js"),__vite__mapDeps([49,2,48,32,15,31,27,17])),G5=_e("/features/multichannel-outreach")({head:()=>({...Qe({title:"Cold Email & LinkedIn Outreach Sequences â OutreachFox",description:"Multichannel cold outreach: cold email and LinkedIn in one AI-built sequence, per-channel throttling, smart rotation, conditional logic, and a full REST API with webhooks.",path:"/features/multichannel-outreach"}),scripts:[ni(ul(F5))]}),component:be(H5,"component")}),W5=()=>ye(()=>
99import("./features.mailbox-infrastructure-zAfSddWw.js"),__vite__mapDeps([50,2,48,11,17,31,27,16])),$5=_e("/features/mailbox-infrastructure")({head:()=>({...Qe({title:"Mailbox Infrastructure â Private, dedicated sending stack | OutreachFox",description:"Private isolated sending infrastructure, dedicated campaign IPs, native Google Workspace and Microsoft 365 mailboxes, and premium warmup tuned to your industry.",path:"/features/mailbox-infrastructure"}),scripts:[ni(ul(j5))]}),component:be(W5,"component")}),V5=()=>ye(()=>import("./features.data-and-enrichment-CGrvnpqW.js"),__vite__mapDeps([51,2,48,27,11,10,30])),Y5=_e("/features/data-and-enrichment")({head:()=>({...Qe({title:"Enrichment â Find & verify contact data | OutreachFox",description:"Waterfall enrichment across 50+ providers, work email and phone discovery, and proprietary verification. Hit 90%+ match rates and verify every address before send.",path:"/features/data-and-enrichment"}),scripts:[ni(ul(U5))]}),component:be(V5,"component")}),U6=wt({method:"GET"}).handler(It("df2fa5691b2feeae1819278ec5f928002c89b33dfd3f383eb8456f5a2e7aab14")),K5=wt({method:"GET"}).handler(It("18856d46946b1a000549e367405dbc0467679b4379d4bd5be899c6a3f00fe362")),j6=wt({method:"POST"}).middleware([Xn]).handler(It("8befdb716ced3083fa959cc9c332a67d0261aacc7d84f4a74fbab3d20ac3d6fd")),F6=wt({method:"POST"}).middleware([Xn]).handler(It("f649f0621b904126aeb22fed5aef0a2e253f0f275eb50d0afb7f9f535a2f5924")),Z5=t=>({queryKey:["post","blog",t],queryFn:()=>DL({data:{collection:"blog",slug:t}})}),Q5=t=>({queryKey:["author",t],queryFn:()=>K5({data:{slug:t}})}),X5=t=>({queryKey:["post","blog",t,"related"],queryFn:()=>LL({data:{collection:"blog",slug:t}})}),j0=/^https?:\/\/cdn\.outreachfox\.ai\//i;function J5(t){return rm(t)}function q6(t){const e=rm(t.cover_url);return e&&j0.test(e)?e:(t.fallback,"")}function B6(t,e={}){if(!t)return"";const n=rm(t);return n&&j0.test(n)?n:""}function z6(t,e,n={}){return""}const eN=()=>ye(()=>import("./blog._slug-V9Ugt42c.js"),__vite__mapDeps([52,2])),tN=()=>ye(()=>import("./blog._slug-ufMD57Pp.js"),[]),nN=()=>ye(()=>import("./blog._slug-DEoemIyW.js"),__vite__mapDeps([53,54,39,38,2,55,56])),aN=_e("/blog/$slug")({loader:async({context:t,params:e})=>{const n=await t.queryClient.ensureQueryData(Z5(e.slug));if(!n.post)throw Up();return await t.queryClient.ensureQueryData(X5(e.slug)).catch(()=>null),n.post.author_slug&&await t.queryClient.ensureQueryData(Q5(n.post.author_slug)).catch(()=>null),n},head:({loaderData:t})=>{const e=t?.post;if(!e)return{meta:[{title:"Unavailable â OutreachFox Blog"},{name:"robots",content:"noindex,nofollow"}]};const n=e.seo_title||`${e.title} â OutreachFox Blog`,i=jD(n),s=(e.meta_description||e.excerpt||e.tldr||"").trim(),l=FD(s.length>=70?s:`${e.title} â practical cold outreach, deliverability, and LinkedIn playbooks from the OutreachFox team.`),d=J5(e.og_image||e.cover_url)||Kn.ogHome,u=`https://outreachfox.ai/blog/${e.slug}`,f=d&&/^https?:\/\/cdn\.outreachfox\.ai\//i.test(d)?d:null,p=[];return p.push(ni(L5({title:e.seo_title||e.title,description:e.meta_description||e.excerpt,image:d,datePublished:e.published_at,dateModified:e.updated_at||e.published_at,url:u,authorName:e.author_name||"OutreachFox Team",authorUrl:e.author_slug?`https://outreachfox.ai/blog?author=${e.author_slug}`:void 0,sources:Array.isArray(e.sources)?e.sources:void 0}))),p.push(ni(N5([{name:"Home",url:"https://outreachfox.ai/"},{name:"Blog",url:"https://outreachfox.ai/blog"},{name:e.title,url:u}]))),Array.isArray(e.faqs)&&e.faqs.length>0&&p.push(ni(ul(e.faqs))),{meta:[{title:i},{name:"description",content:l},{property:"og:title",content:i},{property:"og:description",content:l},{property:"og:url",content:u},{property:"og:type",content:"article"},{property:"og:site_name",content:"OutreachFox"},{property:"og:locale",content:"en_US"},...e.published_at?[{property:"article:published_time",content:e.published_at}]:[],...e.updated_at?[{property:"article:modified_time",content:e.updated_at}]:[],...e.author_name?[{property:"article:author",content:e.author_name}]:[],...d?[{property:"og:image",content:d}
99]:[],...d?[{property:"og:image:width",content:"1200"}]:[],...d?[{property:"og:image:height",content:"675"}]:[],{name:"twitter:card",content:"summary_large_image"},{name:"twitter:title",content:i},{name:"twitter:description",content:l},...d?[{name:"twitter:image",content:d}]:[],...e.noindex?[{name:"robots",content:"noindex"}]:[]],links:[{rel:"canonical",href:e.canonical_override||u},...f?[{rel:"preload",as:"image",href:f,fetchpriority:"high"}]:[]],scripts:p}},component:be(nN,"component"),errorComponent:be(tN,"errorComponent"),notFoundComponent:be(eN,"notFoundComponent")}),oN=[{slug:"getting-started",name:"Getting Started"},{slug:"email-accounts",name:"Email Accounts & Connection"},{slug:"mailbox-infrastructure",name:"Mailbox Infrastructure"},{slug:"warmup",name:"Warmup"},{slug:"data-enrichment",name:"Data & Enrichment"},{slug:"campaigns-sequences",name:"Campaigns: Sequences"},{slug:"campaigns-leads",name:"Campaigns: Leads"},{slug:"campaigns-schedule",name:"Campaigns: Schedule & Options"},{slug:"multichannel",name:"Multichannel Outreach"},{slug:"unified-inbox",name:"Unified Inbox"},{slug:"deliverability",name:"Deliverability"},{slug:"analytics-crm",name:"Analytics & CRM"},{slug:"integrations-api",name:"Integrations, API & Webhooks"},{slug:"workspaces-team",name:"Workspaces, Team & White-label"},{slug:"account-billing",name:"Account & Billing"}],iN=JSON.parse(`[{"slug":"what-is-outreachfox","title":"What is OutreachFox?","category":"getting-started","summary":"OutreachFox is a single platform for building and running outbound campaigns. It covers the full outreach process in one place: finding prospects, preparing sending infrastructure, warming up mailbâ¦","body":"OutreachFox is a single platform for building and running outbound campaigns. It covers the full outreach process in one place: finding prospects, preparing sending infrastructure, warming up mailboxes, and running cold email or LinkedIn sequences.\\n\\n## What makes OutreachFox different?\\n\\nMost outreach tools depend on shared sending systems, which puts your email reputation at the mercy of other senders. They also often force you to stitch together separate products for enrichment, warmup and campaign management. OutreachFox runs on its own infrastructure and brings these pieces into one workflow.\\n\\n## Industry-tuned warmup\\n\\nA healthy mailbox is the foundation of cold outreach. OutreachFox includes an industry-tuned warmup system that prepares mailboxes specifically for outbound campaigns and builds sender reputation over time. The result is more emails delivered, fewer bounces, and a safer path to scaling volume without hurting deliverability.\\n\\n## Waterfall enrichment\\n\\nContact data should not be a guessing game. OutreachFox uses waterfall enrichment across 50+ data providers, checking source after source until it finds verified, high-quality information. Cleaner lists mean fewer bounces and higher reply rates.\\n\\n## Multichannel outreach in one workflow\\n\\nYou can create and run coordinated cold email and LinkedIn campaigns from a single sequence. Three campaign types are available:\\n\\n - **Email Outreach** â an email-only campaign.\\n - **LinkedIn Outreach** â a LinkedIn-only campaign.\\n - **Multi Channel Outreach** â email and LinkedIn steps combined in one sequence.\\n\\n## The interface at a glance\\n\\nAfter you log in, you land on **Campaigns**. The left navigation gives you access to the main sections of the product:\\n\\n - **Campaigns** â create, search and filter campaigns by status. Click **Create Campaign** (top right), give the campaign a name, pick the campaign type and click **Create**.\\n - **Contacts** â upload contacts and organise them into lists (**New List**).\\n - **Mailbox** â connect your sending mailboxes, enable warmup and manage per-mailbox settings.\\n - **LinkedIn** â connect LinkedIn accounts for LinkedIn and multichannel outreach.\\n - **Domain** â see all your domains in one place, check how they perform and manage tracking-domain settings.\\n - **Sett
99ings / Campaign Settings** (bottom left) â sending schedules and reply categorization.\\n\\nBuilt-in infrastructure is available through **Icemail**: click the OutreachFox icon at the top left, choose **Icemail** from the dropdown, and buy domains and mailboxes (Google, Microsoft, IMAP/SMTP or Azure) that you can then import straight into OutreachFox.\\n\\n## Related articles\\n\\n - Quick Start Guide: from zero to first campaign\\n - Platform overview: navigating OutreachFox\\n - Pre-launch checklist: everything you need before your first campaign\\n - Buy domains and mailboxes through Icemail\\n - Enable mailbox warmup\\n - How to create and launch your first email campaign","video":{"src":"https://cdn.outreachfox.ai/help/videos/what-is-outreachfox.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"9bb336c5-290c-4e10-b852-9206a63c2f7a"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/what-is-outreachfox.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"9bb336c5-290c-4e10-b852-9206a63c2f7a"}],"_source_doc":"https://docs.google.com/document/d/14LziZb06yDrrfQSRjTAmfj-amB3FG2DfP-c3xexSC38/edit"},{"slug":"quick-start-guide-from-zero-to-first-campaign","title":"Quick Start Guide: from zero to first campaign","category":"getting-started","summary":"This guide walks you through the whole path from a new OutreachFox account to a live campaign. Each stage links to the detailed article for that step. Budget two to three weeks end to end: most of â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThis guide walks you through the whole path from a new OutreachFox account to a live campaign. Each stage links to the detailed article for that step. Budget two to three weeks end to end: most of that time is mailbox warmup, which you should not skip.\\n\\n## Prerequisites\\n\\n - An OutreachFox login.\\n - Either mailboxes you already own (Google Workspace, Microsoft 365 or any SMTP/IMAP provider), or a wallet balance to buy them through Icemail.\\n - A contact list as a CSV with at least an email column (first name, company and other personalisation fields are strongly recommended).\\n\\n## Steps\\n\\n### Stage 1 â Get sending mailboxes (day 1)\\n\\n1. Decide whether to buy or bring your own. New senders should buy through Icemail: SPF, DKIM and DMARC are configured automatically. See *Buy domains and mailboxes through Icemail*.\\n2. To buy: click the OutreachFox icon at the top left, choose **Icemail**, then **Add Domain** â **Buy Domains**. After the domain purchase, choose the mailbox type (Google, Microsoft, IMAP or Azure), click **Buy New Mailboxes**, set the quantity and check out. Use 2â3 mailboxes per domain.\\n3. To bring your own: make sure SPF, DKIM and DMARC records exist on the domain before connecting. See *Connect a Google Workspace mailbox to OutreachFox*, *Connect a Microsoft 365 / Outlook mailbox to OutreachFox* or *Connect any SMTP/IMAP mailbox (custom provider)*.\\n\\n### Stage 2 â Connect the mailboxes to OutreachFox (day 1)\\n\\n1. Go to **Mailbox** â **Connect Mailbox**.\\n2. Icemail mailboxes: scroll down and click **Import from Icemail**.\\n3. Own mailboxes: pick **Google Workspace** or **Office365 Outlook** and follow the on-screen admin instructions, then **Connect with Google** / **Connect with Outlook**.\\n4. Confirm each mailbox appears in the **Mailbox** list.\\n\\n### Stage 3 â Warm up (days 1â14+)\\n\\n1. In **Mailbox**, select all new mailboxes and click **Enable Warm Up**.\\n2. Pick the warm-up profile that matches the provider (Google, Microsoft, Azure or Custom Mailboxes), then click **Enable Warmer**. See *Enable mailbox warmup* and *Using warm-up profiles*.\\n3. Wait at least 14 days (2â3 weeks is safer for brand-new domains). Check the **Warm up** tab for health, inbox placement and bounce rate before moving on. See *Mailbox warmup analytics*.\\n\\n### Stage 4 â Upload contacts (any time during warmup)\\n\\n1. Go to **Contacts** â **Upload Contacts**, drag and drop your CSV.\\n2. Assign the contacts to a list or create a new one, choose **skip** or **merge** for duplicates, map the columns and click **Save and Continue**. See *U
99pload contacts to OutreachFox*.\\n\\n### Stage 5 â Create the campaign (during warmup)\\n\\n1. Go to **Campaigns** â **Create Campaign**. Name it, choose **Email Outreach** (or LinkedIn / Multi Channel) and click **Create**.\\n2. Click **Start with Email** and write the first step: subject and body. Use **Variables** for personalisation, **Spam Words** to check the copy and **Preview** to review it. Click **Save**.\\n3. Add 2â3 follow-up steps with **Add Step** (wait 3â4 days between steps) and, optionally, **New Variant** for A/B tests. Click **Save and Next**.\\n4. Choose the **Sender Accounts** (your warmed-up mailboxes), then upload or select the contact list and click **Next**.\\n5. In **Settings**, set a sending schedule, keep the daily new-contacts limit modest (30â50 emails per mailbox per day) and enable **Pause campaign when bounce rate reaches** 3%. See *Campaign settings and advanced configurations*.\\n\\n### Stage 6 â Launch (after warmup completes)\\n\\n1. Run through the *Pre-launch checklist*.\\n2. Review the summary and click **Launch Campaign**.\\n\\n## What you see afterwards\\n\\nThe campaign shows as active in **Campaigns**. Sends begin at the next window in your sending schedule. Track replies, bounces and lead statuses in the campaign's **Contacts** tab.\\n\\n## Tips\\n\\n - Never launch on a mailbox that is less than 14 days into warmup.\\n - Keep warmup running during campaigns; it maintains reputation.\\n - Start with one small list (a few hundred contacts) and one campaign; scale mailboxes before you scale volume.\\n - Add an unsubscribe link (Risk Control â **Include Unsubscribe Message**) from day one.\\n\\n## Related articles\\n\\n - What is OutreachFox?\\n - Platform overview: navigating OutreachFox\\n - Pre-launch checklist: everything you need before your first campaign\\n - Buy domains and mailboxes through Icemail\\n - Enable mailbox warmup\\n - Upload contacts to OutreachFox\\n - How to create and launch your first email campaign\\n - Create sending schedules","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1bIK-OBZXhuA75sB9aaOBS2xjCjkPULmL7LcA6cF85bs/edit"},{"slug":"platform-overview-navigating-outreachfox","title":"Platform overview: navigating OutreachFox","category":"getting-started","summary":"This article is a map of the OutreachFox interface: what each item in the left navigation does, where the campaign-level settings live, and how to switch between OutreachFox and Icemail. Read it onâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThis article is a map of the OutreachFox interface: what each item in the left navigation does, where the campaign-level settings live, and how to switch between OutreachFox and Icemail. Read it once and you will know where to look for everything else in this knowledge base.\\n\\n## The layout\\n\\nAfter you log in you land on **Campaigns**. The screen has three areas:\\n\\n - **Left navigation** â the main sections of the product.\\n - **Main panel** â the list or editor for the section you are in.\\n - **Top-left product switcher** â the OutreachFox icon with a small arrow. Clicking it opens a dropdown where you choose between **OutreachFox** and **Icemail**.\\n\\n## Left navigation\\n\\n### Campaigns\\n\\nThe home screen. It lists every campaign with its status. Use the search box to find a campaign by name and the status filters (active, paused, completed, draft and so on) to narrow the list. **Create Campaign** sits at the top right. Opening a campaign gives you its sequence editor, its **Contacts** tab (lead statuses such as replied and bounced), analytics and **Edit Campaign** â **Settings**.\\n\\n### Contacts\\n\\nYour contact database. **Upload Contacts** imports a CSV, assigns it to a list (or creates one), handles duplicates (skip or merge) and maps columns. Lists created here are what you attach to campaigns.\\n\\n### Mailbox\\n\\nEvery sending account connected to the workspace. From here you:\\n\\
99n - **Connect Mailbox** â Google Workspace, Office365 Outlook, SMTP/IMAP, or **Import from Icemail**.\\n - Select mailboxes and use the bulk actions: **Enable Warm Up**, campaign emails per day, and the three-dots menu (set/clear signature, delete).\\n - Open a mailbox â **Settings** to edit its signature and per-mailbox limits.\\n - Open a mailbox â **Warm up** tab to see health score, inbox and spam placement, bounce rate, send/reply history and ESP breakdown.\\n\\n### LinkedIn\\n\\nConnect LinkedIn accounts used by LinkedIn Outreach and Multi Channel Outreach campaigns.\\n\\n### Domain\\n\\nAll your sending domains in one place with their performance. Select a domain â **Settings** to add a custom tracking domain (CNAME at your DNS host â **Save** â **Verify**).\\n\\n### Settings / Campaign Settings (bottom left)\\n\\nWorkspace-wide configuration that campaigns reuse:\\n\\n - **Sending Schedules** â named schedules with time zone, days, send window and an option to skip public holidays by country. A campaign picks one schedule.\\n - **Reply Categorization** â the default reply categories plus **Create new category** (name, description, sentiment, whether it counts as useful).\\n\\nAccount-level items such as plan, billing and credits are also reached from this area.\\n\\n## The product switcher: OutreachFox and Icemail\\n\\nIcemail is the built-in marketplace for domains and mailboxes. To reach it, click the OutreachFox icon at the top left and choose **Icemail**. Inside Icemail you can buy domains, connect domains you own, buy Google, Microsoft, IMAP/SMTP or Azure mailboxes, and export them to OutreachFox. To return, click the same icon and choose **OutreachFox**. Mailboxes exported from Icemail appear under **Mailbox** â **Connect Mailbox** â **Import from Icemail**.\\n\\n## Inside a campaign\\n\\n - **Sequence editor** â **Start with Email** or **Start with LinkedIn**, then **Add Step**, **New Variant** (A/B/C), and **Conditions** with day/hour waits. Editor tools: **Variables**, **Spintext**, **Spam Words**, **Preview**.\\n - **Sender Accounts** and **LinkedIn Account** selection.\\n - **Contacts** step â upload or select a list, map columns.\\n - **Sett
99ings** â **Show Advanced Configurations** â daily new contacts limit, sending strategy, start date, bounce-rate pause, plain-text sending, Risk Control (unsubscribe message and header) and Deliverability and Safety (auto match leads / ESP matching). Save changes with **Resume Campaign** on a live campaign.\\n\\n## Tips\\n\\n - Bookmark **Mailbox** and **Campaigns**; you will spend most of your time there.\\n - Set up **Sending Schedules** and **Reply Categorization** once before creating campaigns so every campaign inherits them.\\n - If a menu item is missing, check that you are in OutreachFox rather than Icemail via the top-left switcher.\\n\\n## Related articles\\n\\n - What is OutreachFox?\\n - Quick Start Guide: from zero to first campaign\\n - Buy domains and mailboxes through Icemail\\n - Create sending schedules\\n - AI reply categorization\\n - Set up a custom tracking domain","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1L3Tm2zQWaeAve1nGlE6lbe_PLs3OO_4EcL4gFJ-A8Wo/edit"},{"slug":"pre-launch-checklist","title":"Pre-launch checklist: everything you need before your first campaign","category":"getting-started","summary":"Before you can launch a campaign you need sending accounts, warmed-up mailboxes, an email sequence and leads. This checklist takes you through those items in order. OutreachFox makes the first partâ¦","body":"Before you can launch a campaign you need sending accounts, warmed-up mailboxes, an email sequence and leads. This checklist takes you through those items in order. OutreachFox makes the first part easy through Icemail, its built-in marketplace for domains and mailboxes.\\n\\n## Steps\\n\\n### 1\\\\. Get sending accounts\\n\\n1. Click the OutreachFox icon (the arrow) in the top-left corner.\\n2. From the dropdown, select **Icemail**.\\n\\n\\n\\n3. Click **Domains**. From here you can connect a domain you already own or buy a new one directly through Icemail.\\n\\n\\n\\n4. Once your domain is set, buy mailboxes for whichever provider you prefer â Google Workspace, Microsoft, Azure or SMTP â from the Icemail menu.\\n\\n\\n\\n5. After the mailboxes are assigned, export them to OutreachFox. See *Export mailboxes from Icemail to OutreachFox* for the exact steps.\\n\\n\\n\\n### 2\\\\. Bring your own domains or mailboxes (optional)\\n\\n1. If you already have mailboxes elsewhere, connect them directly: go to **Mailbox** â **Connect Mailbox** and pick the provider.\\n2. Make sure the domain has SPF, DKIM and DMARC records set up before you connect. Domains bought through Icemail already have these records and can be connected straight away.\\n\\n### 3\\\\. Switch back to OutreachFox and check the mailboxes\\n\\
99n1. Click the OutreachFox icon again and select **OutreachFox** from the dropdown.\\n2. Open **Mailbox**. Every mailbox you purchased or transferred through Icemail, and every mailbox you connected yourself, is listed here.\\n\\n### 4\\\\. Warm up\\n\\n1. Select the mailboxes and enable warm-up.\\n\\n\\n\\n2. Let warm-up run for at least 14 days before sending campaign email from those mailboxes.\\n\\n### 5\\\\. Create the campaign\\n\\n1. Click **Create Campaign**, give it a name (for example \\"Test\\") and click **Create**.\\n2. Write your email copy in the sequence editor and click **Save**.\\n3. Add your leads.\\n4. Set up anything else you need in the campaign settings, then start the campaign.\\n\\nThat is everything you need before launching your first campaign.\\n\\n## Checklist summary\\n\\n - Domain purchased or connected, with SPF, DKIM and DMARC in place\\n - Mailboxes purchased or connected and visible under **Mailbox**\\n - Warm-up enabled and running for 14+ days\\n - Contact list uploaded and mapped\\n - Sequence written, spam words checked, preview reviewed\\n - Sender accounts selected\\n - Sending schedule, daily limits and bounce-rate pause configured\\n - Unsubscribe message enabled\\n\\n## Tips\\n\\n - Use 2â3 mailboxes per domain and keep each mailbox at 30â50 campaign emails per day.\\n - Keep the bounce rate under 3%; enable **Pause campaign when bounce rate reaches** so a bad list stops itself.\\n - Verify emails before uploading a list; unverified lists are the most common cause of early bounces.\\n\\n## Related articles\\n\\n - Quick Start Guide: from zero to first campaign\\n - Buy domains and mailboxes through Icemail\\n - Export mailboxes from Icemail to OutreachFox\\n - Connect a Google Workspace mailbox to OutreachFox\\n - Connect a Microsoft 365 / Outlook mailbox to OutreachFox\\n - Enable mailbox warmup\\n - Upload contacts to OutreachFox\\n - How to create and launch your first ema","video":{"src":"https://cdn.outreachfox.ai/help/videos/pre-launch-checklist.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"e6fa4427-cb5d-42f8-83d4-7997109d65d2"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/pre-launch-checklist.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"e6fa4427-cb5d-42f8-83d4-7997109d65d2"}],"_source_doc":"https://docs.google.com/document/d/1UhQm0nRbjd7H_ZLiE74BdXp8ImBoV_6CxXd4-v_FfJ0/edit"},{"slug":"plans-overview","title":"Plans overview","category":"getting-started","summary":"OutreachFox is sold as a subscription with tiers that scale with the size of your outbound operation. This article explains what changes between tiers and how to pick one. It does not list prices: â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nOutreachFox is sold as a subscription with tiers that scale with the size of your outbound operation. This article explains what changes between tiers and how to pick one. It does not list prices: current prices and exact limits are on the pricing page and in your account's billing area.\\n\\n## What every plan includes\\n\\n - Unlimited email and LinkedIn campaigns and sequences with A/B variants.\\n - Mailbox warmup with the four default warm-up profiles and custom profiles.\\n - Sending schedules, reply categorization and campaign analytics.\\n - Access to Icemail for buying domains and mailboxes (paid separately from your wallet).\\n - Contact upload, deduplication and column mapping.\\n\\n## What scales between tiers\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Dimension\\\\*\\\\* | \\\\*\\\\*What it means\\\\*\\\\* | \\\\*\\\\*How it scales\\\\*\\\\* |\\n| Connected mailboxes | Sending accounts under \\\\*\\\\*Mailbox\\\\*\\\\* (own or Icemail) | Higher tiers allow more mailboxes; some tiers are unlimited |\\n| Active contacts / leads | Contacts stored under \\\\*\\\\*Contacts\\\\*\\\\* and used in campaigns | Higher tiers raise the contact ceiling |\\n| Monthly emails | Campaign emails sent per month across all mailboxes | Raised per tier |\\n| Workspaces | Separate environments for clients or brands | Single workspace on entry tiers; multiple on agency-oriented tiers |\\n| Team members | Users invited to a workspace | More seats on higher tiers |\\n| Enrichment and verification credits | Credits for waterfall enrichment and email verification | A monthly allowance that grows per tier; top-ups available on any tier |\\n| LinkedIn accounts | Accounts connected for LinkedIn / multichannel outreach | More accounts on higher tiers |\\n| Support | Chat and email support, onboarding, priority response | Priority support on higher tiers |\\n\\n## Typical tiers\\n\\
99nTier names and limits change; treat these as shapes rather than a price list.\\n\\n - **Starter** â one workspace, a small number of mailboxes, a contact cap in the low tens of thousands, a small credit allowance. Suits a founder or a single SDR running one or two campaigns.\\n - **Growth** â more mailboxes, a larger contact cap, more credits, additional seats. Suits an in-house team running several campaigns in parallel.\\n - **Agency / Scale** â multiple workspaces, high or unlimited mailbox counts, large contact and email allowances, priority support. Suits agencies managing many clients or teams sending at high volume.\\n\\n## How to choose\\n\\n1. Count the mailboxes you will send from. A common rule is 2â3 mailboxes per domain at 30â50 emails per day each, so 1,000 emails a day needs roughly 20â30 mailboxes.\\n2. Estimate contacts per month: daily sends ÷ steps in your sequence à working days.\\n3. Decide whether you need separate workspaces (one per client or brand).\\n4. Pick the lowest tier that covers those three numbers; credits can be topped up separately.\\n\\n## Where to see and change your plan\\n\\n1. Click **Settings** in the bottom-left navigation.\\n2. Open the **Billing** or **Plan** section (label may vary).\\n3. Your current tier, renewal date and usage against limits are shown here, with **Upgrade** / **Change plan** buttons.\\n\\n## Tips\\n\\n - Mailbox and domain purchases through Icemail are billed from the Icemail wallet, not the OutreachFox subscription.\\n - Annual billing usually carries a discount; check the pricing page.\\n - If you approach a mailbox or contact limit, OutreachFox warns you in the relevant list; campaigns are not cut off without notice.\\n\\n## Troubleshooting\\n\\n - **\\"Mailbox limit reached\\" when connecting** â remove unused mailboxes under **Mailbox** or upgrade the tier.\\n - **Cannot create a second workspace** â workspaces are limited by tier; upgrade or ask support.\\n\\n## Related articles\\n\\n - Credits & usage explained\\n - Buy domains and mailboxes through Icemail\\n - Quick Start Guide: from zero to first campaign\\n - Manage workspaces and team members","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1b0OOrQ_bNPZMkJ9CFlQbCg7gd84NoOWCFkCwaS2thpY/edit"},{"slug":"credits-and-usage-explained","title":"Credits & usage explained","category":"getting-started","summary":"OutreachFox uses credits for actions that call external data providers: enriching a contact and verifying an email address. Sending email, warmup and campaign management do not consume credits. Thiâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nOutreachFox uses credits for actions that call external data providers: enriching a contact and verifying an email address. Sending email, warmup and campaign management do not consume credits. This article explains what a credit buys, where to see your balance and usage, and how to top up.\\n\\n## What consumes credits\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Action\\\\*\\\\* | \\\\*\\\\*What happens\\\\*\\\\* | \\\\*\\\\*Typical cost\\\\*\\\\* |\\n| Email verification | Checks that an address exists and accepts mail before you send | 1 credit per address |\\n| Waterfall enrichment â email | Searches 50+ data providers in sequence until a verified work email is found | Charged only when a result is found; a few credits per contact |\\n| Waterfall enrichment â phone | Same waterfall for mobile or direct dial | Higher cost per hit than email |\\n| Company / person data | Adds fields such as title, company size, industry, LinkedIn URL | Charged per enriched record |\\n\\nExact per-action costs are shown next to each action in the product and on the pricing page. You are not charged for a lookup that returns nothing.\\n\\n## Where to see your balance and usage\\n\\n1. Click **Settings** in the bottom-left navigation.\\n2. Open **Billing** (or **Credits & Usage**).\\n3. You see:\\n\\n - **Credits remaining** â the current balance.\\n - **Monthly allowance** â credits included in your plan and the date they reset.\\n - **Usage** â credits consumed this period, broken down by verification and enrichment, with a per-day chart.\\n - **Mailboxes / contacts / emails** â usage against the plan's limits (see *Plans overview*).\\n\\nEnrichment and verification jobs also show their credit cost before you confirm them, and the result summary afterwards (found / not found / credits used).\\n\\n## How to top up\\n\\n1. Go to **Settings** â **Billing**.\\n2. Click **Buy credits** (or **Top up**).\\n3. Choose a credit pack. Larger packs have a lower per-credit price.\\n4. Confirm payment. Credits are added immediately and do not expire with the monthly allowance.\\n\\nOptional: turn on **Auto top-up** and set a threshold (for example 500 credits) and a pack size, so long enrichment jobs never stall.\\n\\n## Wallet vs credits\\n\\nOutreachFox has two separate balances:\\n\\n - **Credits** â enrichment and verification inside OutreachFox.\\n - **Icemail wallet** â money used to buy domains and mailboxes in Icemail
99(top-left switcher â **Icemail**). It also supports auto top-up.\\n\\nTopping up one does not affect the other.\\n\\n## Tips\\n\\n - Verify before you upload: run verification on a list first and keep only valid addresses. It costs 1 credit per row and prevents bounces, which are far more expensive in reputation.\\n - Deduplicate before enriching. Choose **merge** for duplicates on upload so you do not enrich the same person twice.\\n - Enrich in batches of a few hundred and review the hit rate before running a full list.\\n - Watch the monthly reset date; use the included allowance before buying packs.\\n\\n## Troubleshooting\\n\\n - **Enrichment job stopped part-way** â the balance ran out. Top up or enable auto top-up; the job resumes from where it stopped.\\n - **Charged for a contact with no email** â check the result: a phone or company hit still costs credits. Restrict the job to email only if that is all you need.\\n - **Usage looks higher than expected** â open the per-day usage chart; a re-run on an already-enriched list is the usual cause.\\n\\n## Related articles\\n\\n - Plans overview\\n - Waterfall enrichment: find verified emails\\n - Verify emails before sending\\n - Upload contacts to OutreachFox\\n - Buy domains and mailboxes through Icemail","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1bPvwX1BIeb2DGSm5JU-MsOlXmBZXayxucvfASvmGmjg/edit"},{"slug":"google-workspace-allow-outreachfox-in-google-admin","title":"Google Workspace: allow OutreachFox in Google Admin","category":"email-accounts","summary":"Before a Google Workspace mailbox can be connected to OutreachFox, a Workspace administrator must mark the OutreachFox app as trusted in the Google Admin console. This is a one-time task per Workspâ¦","body":"Before a Google Workspace mailbox can be connected to OutreachFox, a Workspace administrator must mark the OutreachFox app as trusted in the Google Admin console. This is a one-time task per Workspace domain; once done, any user on that domain can connect their mailbox.\\n\\n## Prerequisites\\n\\n - Super admin (or an admin with API-controls rights) access to the Google Admin console for the domain.\\n - The OutreachFox client ID, shown on the **Google Workspace** connection screen in OutreachFox (**Mailbox** â **Connect Mailbox** â **Google Workspace**).\\n\\n## Steps\\n\\n1. In OutreachFox, go to **Mailbox** â **Connect Mailbox** â **Google Workspace**. You are shown instructions to set up access in your Google Admin account. Click the provided link, or open admin.google.com in a new tab.\\n\\n\\n\\n2. In the Google Admin console, type **API** in the search bar at the top.\\n\\n\\n\\n3. Click **API controls**.\\n\\n\\n\\n4. Click **Manage App Access** (under Third-party app access).\\n\\n\\n\\n5. Click **Configure new app**.\\n\\n\\n\\n6. Return to the OutreachFox setup screen and copy the displayed client ID.\\n\\n\\n\\n7. Paste the client ID into the search field in the admin console and click **Search**.\\n\\n\\n\\n8. Select the app that is found.\\n\\n\\n\\n9. Click **Continue**.\\n\\n\\n\\n10. Set the app access to **Trusted**.\\n\\n\\n\\n11. Click **Continue** to save.\\n\\n\\n\\n12. Follow the remaining prompts to finish the configuration.\\n\\n\\n\\nYou can now go back to OutreachFox and connect the mailbox. See *Connect a Google Worksp
99ace mailbox to OutreachFox*.\\n\\n## Why this matters\\n\\nGoogle Workspace blocks third-party apps from accessing Gmail data through OAuth unless an admin has allowed them. Marking OutreachFox as **Trusted** lets the \\"Connect with Google\\" sign-in succeed and lets OutreachFox send and read mail on behalf of the mailbox. Without it, users see an \\"app is blocked\\" or \\"admin policy\\" error during sign-in.\\n\\n## Tips\\n\\n - If you have several Workspace domains, repeat these steps in each domain's admin console.\\n - Apply the setting to the whole organisation (top-level OU) unless you deliberately want to restrict which users can connect.\\n - Changes normally take effect within a few minutes; if the connection still fails, wait up to 24 hours as Google's policy cache refreshes.\\n\\n## Troubleshooting\\n\\n - **App not found when searching the client ID** â make sure you copied the full ID with no trailing spaces and searched under the OAuth App Name Or Client ID option.\\n - **\\"This app is blocked\\" during Connect with Google** â the app is still marked Blocked or Limited; return to **Manage App Access** and set it to **Trusted**.\\n - **No API controls menu** â your account lacks admin rights; ask a super admin.\\n\\n## Related articles\\n\\n - Connect a Google Workspace mailbox to OutreachFox\\n - Fix mailbox disconnection errors (Google, Microsoft, SMTP)\\n - Buy domai","video":{"src":"https://cdn.outreachfox.ai/help/videos/google-workspace-allow-outreachfox-in-google-admin.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"c4f72007-5be1-498c-9064-40fd26819196"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/google-workspace-allow-outreachfox-in-google-admin.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"c4f72007-5be1-498c-9064-40fd26819196"}],"_source_doc":"https://docs.google.com/document/d/11hv7F-ufghgtvNZBsPk_Msx7FZa2sPBozGOXSKUmtlE/edit"},{"slug":"connect-a-google-workspace-mailbox-to-outreachfox","title":"Connect a Google Workspace mailbox to OutreachFox","category":"email-accounts","summary":"Connect a Google Workspace mailbox so OutreachFox can send campaign email and warmup email from it and read replies. This is the OutreachFox-side part of the setup.","body":"Connect a Google Workspace mailbox so OutreachFox can send campaign email and warmup email from it and read replies. This is the OutreachFox-side part of the setup.\\n\\n## Prerequisites\\n\\n - A Workspace admin has already allowed OutreachFox in the Google Admin console. See *Google Workspace: allow OutreachFox in Google Admin*. Without this, the sign-in in step 6 is blocked.\\n - You know the password (or have an active browser session) for the Google account you want to connect.\\n\\n## Steps\\n\\n1. Log in to your OutreachFox account.\\n2. Click **Mailbox** in the left sidebar.\\n\\n\\n\\n3. Click **Connect Mailbox**.\\n\\n\\n\\n4. Select **Google Workspace** as the mailbox provider.\\n\\n\\n\\n5. Read the instructions shown. If the admin step has not been done yet, complete it now (link in the prerequisites), then return to this screen.\\n6. Click **Connect with Google**.\\n\\n\\n\\n7. Choose the Google account you want to connect and approve the requested permissions.\\n\\n\\n\\n8. The mailbox now appears in your **Mailbox** list.\\n\\n\\n\\n## What you see afterwards\\n\\nThe mailbox is listed under **Mailbox** with a connected status. From here you can enable warmup, set the daily campaign limit and add a signature, and select it as a sender account in campaigns.\\n\\n## Tips\\n\\n - Connect every mailbox on the domain the same way; once the admin step is done, no further admin work is needed.\\n - Enable warmup immediately after connecting and wait at least 14 days before using the mailbox in a campaign.\\n - Keep 2â3 mailboxes per domain and 30â50 campaign emails per mailbox per day.\\n - If the Google account uses 2-step verification, that is fine; OAuth handles it. No app password is needed for this method.\\n\\n## Troubleshooting\\n\\n - **\\"This app is blocked\\" or \\"Access blocked: admin policy\\"** â the Workspace admin has not marked OutreachFox as Trusted. See *Google Worksp
99ace: allow OutreachFox in Google Admin*.\\n - **Wrong account was connected** â remove the mailbox (three-dots menu â delete) and repeat from step 3, choosing the correct account in step 7.\\n - **Mailbox shows as disconnected later** â usually a changed password or revoked access. See *Fix mailbox disconnection errors (Google, Microsoft, SMTP)*.\\n\\n## Related articles\\n\\n - Google Workspace: allow OutreachFox in Google Admin\\n - Connect a Microsoft 365 / Outlook mailbox to OutreachFox\\n - Connect any SMTP/IMAP mailbox (custom provider)\\n - Enable mailbox warmup\\n - Add a custom email signature to a mailbox\\n - Fix mailbox disconnection errors (Google, Mi","video":{"src":"https://cdn.outreachfox.ai/help/videos/connect-a-google-workspace-mailbox-to-outreachfox.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"70fbc3c3-cfd9-41eb-b633-433b08243cc0"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/connect-a-google-workspace-mailbox-to-outreachfox.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"70fbc3c3-cfd9-41eb-b633-433b08243cc0"}],"_source_doc":"https://docs.google.com/document/d/1XO1rmTxI3LmiAaOn9rM73CAFFaO4NU4VTWNlYkL8L1E/edit"},{"slug":"microsoft-365-enable-smtp-auth-and-imap-for-a-user","title":"Microsoft 365: enable SMTP AUTH and IMAP for a user","category":"email-accounts","summary":"OutreachFox sends and reads mail from a Microsoft 365 (Outlook) mailbox over SMTP and IMAP. Both protocols are disabled by default on many tenants, so a Microsoft 365 administrator must enable themâ¦","body":"OutreachFox sends and reads mail from a Microsoft 365 (Outlook) mailbox over SMTP and IMAP. Both protocols are disabled by default on many tenants, so a Microsoft 365 administrator must enable them for each user whose mailbox you want to connect. This article covers that admin-center step.\\n\\n## Prerequisites\\n\\n - Global admin or Exchange admin access to the Microsoft 365 admin center (admin.microsoft.com).\\n - The list of users whose mailboxes will be connected.\\n\\n## Steps\\n\\n1. In OutreachFox, go to **Mailbox** â **Connect Mailbox** â **Office365 Outlook**. Read the on-screen instructions; they tell you which settings to enable.\\n\\n\\n\\n2. In a new tab, log in to the Microsoft 365 admin center.\\n\\n\\n\\n3. Go to **Users** â **Active Users**.\\n\\n\\n\\n4. Select the user whose mailbox you want to connect.\\n\\n\\n\\n5. In the user's details panel, click the **Mail** tab.\\n\\n\\n\\n6. Click **Manage Email Apps**.\\n\\n\\n\\n7. Make sure **Authenticated SMTP** (SMTP AUTH) and **IMAP** are both ticked. They may already be enabled; if not, tick them.\\n\\n\\n\\n\\n\\n8. Click **Save changes** and wait for the confirmation.\\n9. Close the admin panel. Repeat steps 4â8 for each additional user.\\n\\nNow return to OutreachFox and connect the mailbox. See *Connect a Microsoft 365 / Outlook mailbox to OutreachFox*.\\n\\n## Why this matters\\n\\n - **SMTP AUTH** lets OutreachFox send mail through smtp.office365.com as the user.\\n - **IMAP** lets OutreachFox read the inbox to detect replies and bounces and to run warmup.\\n\\nIf either is off, the connection either fails outright or connects but never sees replies.\\n\\n## Tips\\n\\n - Changes can take up to 30â60 minutes to propagate across Microsoft's servers; if the connection fails immediately after saving, wait and retry.\\n - Some tenants also block SMTP AUTH at the organisation level (Exchange admin center â **Settings** â **Mail flow** â \\"Turn off SMTP AUTH protocol for your organization\\"). The per-user setting overrides it, but check this if connections keep failing.\\n - Security Defaults or Conditional Access policies that block \\"legacy authentication\\" can also block SMTP AUTH; exclude the sending users from those policies or use modern-auth-compatible settings.\\n\\n## Troubleshooting\\n\\n - **Manage Email Apps is greyed out** â the user has no Exchange license;
99 assign one first.\\n - **Settings revert after saving** â an organisation-wide policy is overriding them; see the tips above.\\n - **Connection still fails after enabling** â see *Fix mailbox disconnection errors (Google, Microsoft, SMTP)*.\\n\\n## Related articles\\n\\n - Connect a Microsoft 365 / Outlook mailbox to OutreachFox\\n - Fix mailbox disconnection errors (Google, Microsoft, SMTP)\\n - Common IMAP/SMTP hostnames","video":{"src":"https://cdn.outreachfox.ai/help/videos/microsoft-365-enable-smtp-auth-and-imap-for-a-user.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"56ddfeb8-6189-4427-8e07-e688e71e654b"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/microsoft-365-enable-smtp-auth-and-imap-for-a-user.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"56ddfeb8-6189-4427-8e07-e688e71e654b"}],"_source_doc":"https://docs.google.com/document/d/1tUIqNlvQUpsCX5qB3atkj-H7C8gykFiFkHwdgmj6CHo/edit"},{"slug":"connect-a-microsoft-365-outlook-mailbox-to-outreachfox","title":"Connect a Microsoft 365 / Outlook mailbox to OutreachFox","category":"email-accounts","summary":"Connect a Microsoft 365 or Outlook mailbox so OutreachFox can send campaign and warmup email from it and read replies. This is the OutreachFox-side part of the setup.","body":"Connect a Microsoft 365 or Outlook mailbox so OutreachFox can send campaign and warmup email from it and read replies. This is the OutreachFox-side part of the setup.\\n\\n## Prerequisites\\n\\n - SMTP AUTH and IMAP are enabled for the user in the Microsoft 365 admin center. See *Microsoft 365: enable SMTP AUTH and IMAP for a user*. If they are not, the connection will fail or replies will not be detected.\\n - You can sign in to the Microsoft account you want to connect.\\n\\n## Steps\\n\\n1. Log in to your OutreachFox account.\\n2. Click **Mailbox** in the left-side menu.\\n\\n\\n\\n3. Click **Connect Mailbox**.\\n\\n\\n\\n4. Choose **Office365 Outlook** from the connection options.\\n\\n\\n\\n5. Read the on-screen instructions. If the admin settings are not yet enabled, complete them now (link in the prerequisites), then come back to this screen.\\n\\n\\n\\n6. Click **Connect with Outlook**.\\n\\n\\n\\n7. Sign in with the Microsoft account and grant the requested permissions when prompted.\\n\\n\\n\\n8. Click **Accept** to complete the connection.\\n\\n\\n\\n9. The mailbox is now added and ready to use.\\n\\n\\n\\n## What you see afterwards\\n\\nThe mailbox appears in the **Mailbox** list with a connected status. Enable warmup, set a daily campaign limit and a signature, and it can be selected as a sender account in campaigns.\\n\\n## Tips\\n\\n - Warm up for at least 14 days before sending campaigns. Microsoft mailboxes are generally more sensitive to sudden volume than Google; use the **Microsoft** warm-up profile.\\n - Keep 30â50 campaign emails per mailbox per day and 2â3 mailboxes per domain.\\n - If your organisation requires admin consent for third-party apps, an admin may need to accept the permissions once on behalf of the tenant; ask them to sign in at step 7.\\n\\n## Troubleshooting\\n\\n - **\\"Need admin approval\\" at sign-in** â the tenant restricts user consent. A global admin must approve the OutreachFox app, or grant consent on behalf of the organisation at the same prompt.\\n - **Connected but no replies detected** â IMAP is disabled for the user. See *Microsoft 365: enable SMTP AUTH and IMAP for a user*.\\n - **Sending fails with authentication error** â SMTP AUTH is disabled for the user or blocked tenant-wide; see the same article.\\n - **Mailbox disconnects after a while** â see *Fix mailbox disconnection errors (Google, Microsoft, SMTP)*.\\n\\n## Related articles\\n\\n - Microsoft 365: enable SMTP AUTH and IMAP for a user\\n - Connect a Google Worksp
99ace mailbox to OutreachFox\\n - Connect any SMTP/IMAP mailbox (custom provider)\\n - Enable mailbox warmup\\n - Add a custom email signature to a mailbox\\n - Fix mailbox disconnection errors (Goog","video":{"src":"https://cdn.outreachfox.ai/help/videos/connect-a-microsoft-365-outlook-mailbox-to-outreachfox.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"2dbf50f2-513c-46cf-924d-1d5a0b0a4829"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/connect-a-microsoft-365-outlook-mailbox-to-outreachfox.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"2dbf50f2-513c-46cf-924d-1d5a0b0a4829"}],"_source_doc":"https://docs.google.com/document/d/1tXYRWK6LQtzGQbxMaWVvLCzPWJiqdkQV2eoPSHG21FI/edit"},{"slug":"add-a-custom-email-signature-to-a-mailbox","title":"Add a custom email signature to a mailbox","category":"email-accounts","summary":"Each connected mailbox can have its own signature. OutreachFox appends it to campaign emails sent from that mailbox, and you can insert it in sequences with the signature variable. This article shoâ¦","body":"Each connected mailbox can have its own signature. OutreachFox appends it to campaign emails sent from that mailbox, and you can insert it in sequences with the signature variable. This article shows how to add or edit a signature for one mailbox; to apply one signature to many mailboxes at once, see *Bulk set or clear signatures, and delete mailboxes*.\\n\\n## Steps\\n\\n1. Log in to your OutreachFox account.\\n\\n\\n\\n2. Click **Mailbox** in the left menu.\\n\\n\\n\\n3. Select the mailbox you want to add a signature to.\\n\\n\\n\\n4. Click **Settings** for that mailbox.\\n\\n\\n\\n5. Click **Edit** next to the signature.\\n\\n\\n\\n6. Enter the signature in the editor. Format the text and add contact details, links or other information as needed.\\n\\n\\n\\n7. Use the **+ Name** and **+ Email** buttons to insert the mailbox's sender name or email address automatically.\\n\\n\\n\\n8. Check the preview panel to see how the signature will look in outgoing emails.\\n\\n\\n\\n9. Click **Save**.\\n\\n## What you see afterwards\\n\\nThe signature is stored on the mailbox. It is used in every campaign email sent from that mailbox from now on, including emails already scheduled in running campaigns.\\n\\n## Tips\\n\\n - Keep cold-email signatures short: name, title, company, one link. Two to four lines is plenty.\\n - Avoid images and logos. Image-heavy signatures raise spam scores and tracking-pixel blockers can strip them anyway.\\n - Use plain hyperlinks sparingly; one link is fine, several look like marketing mail.\\n - Use **+ Name** and **+ Email** rather than typing them, so the same signature template works when you copy it to other mailboxes.\\n - If you send in plain text (campaign setting **Send emails in plain text**), formatting is dropped; check the preview with that in mind.\\n\\n## Troubleshooting\\n\\n - **Signature appears twice** â the sequence body already contains the signature variable and the mailbox also appends one. Remove one of the two.\\n - **Signature missing on some mailboxes** â signatures are per mailbox; set it on each one or use the bulk action.\\n - **Formatting looks different in the recipient's inbox** â email clients render HTML differently; keep formatting minimal.\\n\\n## Related articles\\n\\n - Bulk set or clear signatures, and delete mailboxes\\n - Set sender name, reply-to address and aliases\\n - Use variables to personalise emails\\n - Send","video":{"src":"https://cdn.outreachfox.ai/help/videos/add-a-custom-email-signature-to-a-mailbox.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"5696c189-1b0c-45e0-b9a1-86631cb25ab8"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/add-a-custom-email-signature-to-a-mailbox.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"5696c189-1b0c-45e0-b9a1-86631cb25ab8"}],"_source_doc":"https://docs.google.com/document/d/1tkaKuCU25i6Z8YeOqvPvfc5-brDzKdSg3IkuNARg1-0/edit"},{"slug":"bulk-set-daily-campaign-sending-limits-for-multiple-mailboxes","title":"Bulk-set daily campaign sending limits for multiple mailboxes","category":"email-accounts","summary":"The daily campaign limit caps how many campaign emails a mailbox sends per day. Instead of opening each mailbox's settings, you can select several mailboxes and set the limit for all of them in oneâ¦","body":"The daily campaign limit caps how many campaign emails a mailbox sends per day. Instead of opening each mailbox's settings, you can select several mailboxes and set the limit for all of them in one action.\\n\\n## Steps\\n\\n1. Log in to your OutreachFox account.\\n\\n\\n\\n2. Go to **Mailbox** from the main menu.\\n\\n\\n\\n3. Select the mailboxes you want to update. Tick individual mailboxes, or use the select-all checkbox at the top of the list.\\n\\n\\n\\n\\n\\n4. The bulk actions bar appears with the available settings.\\n\\n\\n\\n5. Set the **campaign emails per day** limit. This is how many campaign emails each selected mailbox may
99send per day.\\n\\n\\n\\n6. Confirm to apply the limit to every selected mailbox.\\n\\n## What you see afterwards\\n\\nEach selected mailbox shows the new daily limit in the **Mailbox** list. Running campaigns respect the new limit from the next sending window.\\n\\n## Recommended limits\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Mailbox age\\\\*\\\\* | \\\\*\\\\*Campaign emails per day\\\\*\\\\* |\\n| Still in warmup (days 1â14) | 0 â do not send campaigns yet |\\n| Weeks 3â4 | 10â20 |\\n| Established (1 month+) | 30â50 |\\n| Google Workspace ceiling | 50 is a safe upper bound; never exceed 100 |\\n| Microsoft 365 ceiling | 30â40 is safer; Microsoft is stricter on sudden volume |\\n\\nKeep warmup running alongside campaigns so the mailbox's total daily volume stays natural.\\n\\n## Tips\\n\\n - The per-mailbox limit works together with the campaign-level **Daily new contacts limit**. The campaign spreads its daily volume across the selected sender accounts, and no mailbox exceeds its own cap.\\n - Scale by adding mailboxes, not by raising this number. 20 mailboxes at 40/day is far safer than 8 at 100/day.\\n - Lower the limit for any mailbox whose **Warm up** tab shows spam placement climbing or a health score dropping.\\n\\n## Troubleshooting\\n\\n - **Campaign sends fewer emails than expected** â total mailbox caps are lower than the campaign's daily target. Add sender accounts or raise caps modestly.\\n - **Sett
99ing did not apply to some mailboxes** â those mailboxes were not selected or are disconnected; reconnect them and repeat.\\n\\n## Related articles\\n\\n - Bulk enable or disable warmup for multiple mailboxes\\n - Bulk set or clear signatures, and delete mailboxes\\n - Set campaign sending volume and priorities\\n - Enable mailbox warmup\\n - Mailbox wa","video":{"src":"https://cdn.outreachfox.ai/help/videos/bulk-set-daily-campaign-sending-limits-for-multiple-mailboxes.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"a3b2bb36-8627-4336-8fc1-7f4787f4a450"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/bulk-set-daily-campaign-sending-limits-for-multiple-mailboxes.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"a3b2bb36-8627-4336-8fc1-7f4787f4a450"}],"_source_doc":"https://docs.google.com/document/d/1jx_-oItAS5iqIxEza7r19FM9YQo4If1ZmF0wfaA45pY/edit"},{"slug":"bulk-enable-or-disable-warmup-for-multiple-mailboxes","title":"Bulk enable or disable warmup for multiple mailboxes","category":"email-accounts","summary":"Warmup builds and maintains a mailbox's sender reputation by exchanging emails with other warmed mailboxes. You can turn it on or off for many mailboxes in a single action from the Mailbox page.","body":"Warmup builds and maintains a mailbox's sender reputation by exchanging emails with other warmed mailboxes. You can turn it on or off for many mailboxes in a single action from the **Mailbox** page.\\n\\n## Steps\\n\\n### Enable warmup in bulk\\n\\n1. Log in to your OutreachFox account and go to **Mailbox**.\\n\\n\\n\\n2. Select the mailboxes you want to warm up, or use the select-all checkbox at the top.\\n\\n\\n\\n3. In the bulk actions bar, click **Warm Up**.\\n\\n\\n\\n4. Pick a warm-up profile from the list. Four defaults are available: Custom Mailboxes, Azure, Microsoft and Google. To create your own, click **Manage Profiles** and set emails per day and ramp-up, then return and select it.\\n\\n\\n\\n5. Click **Enable**.\\n\\n\\n\\n### Disable warmup in bulk\\n\\n1. Select the mailboxes, click **Warm Up** in the bulk actions bar, and choose **Disable**.\\n\\n\\n\\n## What you see afterwards\\n\\nEach selected mailbox shows warmup as active (or inactive) in the **Mailbox** list. Warmup emails start within the next few hours and ramp up over the following days according to the profile.\\n\\n## Tips\\n\\n - Match the profile to the provider: Google mailboxes get the Google profile, Microsoft 365 the Microsoft profile, Azure the Azure profile and SMTP/IMAP the Custom Mailboxes profile. If you select a mixed batch, run the bulk action once per provider group.\\n - Warm new mailboxes for 14 days minimum (2â3 weeks for new domains) before adding them to campaigns.\\n - Do not disable warmup when a campaign starts. Keep it running at a lower volume for the life of the mailbox; it repairs reputation after a bad send.\\n - Disable warmup only for mailboxes you are about to delete or that are disconnected.\\n\\n## Troubleshooting\\n\\n - **Enable did nothing for some mailboxes** â they are disconnected; reconnect under **Mailbox** and repeat. See *Fix mailbox disconnection errors (Google, Microsoft, SMTP)*.\\n - **Warmup emails land in spam** â normal in the first days; the network moves them out of spam automatically. If spam placement stays high after two weeks, check SPF/DKIM/DMARC on the domain.\\n - **Wrong profile applied** â select the mailboxes again, click **Warm Up**, choose the correct profile and click **Enable**; the new profile replaces the old one.\\n\\n## Related articles\\n\\n - Enable mailbox warmup\\n - Using warm-up profiles\\n - Mailbox warmup analytics\\n - Bulk-set daily campaign sending limits for multiple mailboxes\\n - Bulk set or clear signatures, and de","video":{"src":"https://cdn.outreachfox.ai/help/videos/bulk-enable-or-disable-warmup-for-multiple-mailboxes.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"c63eb455-1554-4136-8e71-6e475ce48660"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/bulk-enable-or-disable-warmup-for-multiple-mailboxes.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"c63eb455-1554-4136-8e71-6e475ce48660"}],"_source_doc":"https://docs.google.com/document/d/1Idu2bNL9OOHkiLqUmg5foRZ5jFcPInb1Fs_LBtxBJqw/edit"},{"slug":"bulk-set-or-clear-signatures-and-delete-mailboxes","title":"Bulk set or clear signatures, and delete mailboxes","category":"email-accounts","summary":"The three-dots menu in the bulk actions bar on the Mailbox page lets you apply one signature to many mailboxes, remove signatures, or delete mailboxes from OutreachFox in a single step.","body":"The three-dots menu in the bulk actions bar on the **Mailbox** page lets you apply one signature to many mailboxes, remove signatures, or delete mailboxes from OutreachFox in a single step.\\n\\n## Steps\\n\\n1. Log in to your OutreachFox account and go to **Mailbox**.\\n\\n\\n\\n2. Select the mailboxes you want to change, or use the select-all checkbox at the top.\\n\\n\\n\\n3. In the bulk actions bar, click the **three dots** menu.\\n\\n\\n\\n4. Choose one of the options:\\n\\n - **Set Signature** â opens the signature editor. Write the signature, use **+ Name** and **+ Email** so each mailbox inserts its own sender name and address, and save. The signature is applied to every selected mailbox.\\n - **Clear Signature** â removes the signature from every selected mailbox.\\n - **Delete** â removes the selected mailboxes from OutreachFox.\\n\\n\\n\\n5. Confirm the action.\\n\\n## What you see afterwards\\n\\n - After **Set Signature**, opening any selected mailbox â **Settings** shows the new signature, with the name and email already filled in for that mailbox.\\n - After **Clear Signature**, the signature field is empty.\\n - After **Delete**, the mailboxes disappear from the list. Campaigns that used them as sender accounts stop sending from them.\\n\\n## Tips\\n\\n - Use the **+ Name** and **+ Email** placeholders rather than typing a specific name; otherwise every mailbox gets the same person's details.\\n - Keep the shared signature short and image-free (name, title, company, one link).\\n - Before deleting, check which campaigns use the mailboxes as
99sender accounts and reassign them, so a running campaign does not lose all its senders.\\n - Deleting a mailbox in OutreachFox does not delete the mailbox at Google, Microsoft or Icemail; it only disconnects it. You can reconnect it later.\\n\\n## Troubleshooting\\n\\n - **Signature applied but names are wrong** â the sender name on the mailbox is wrong; fix it under the mailbox's **Settings** (see *Set sender name, reply-to address and aliases*), the signature updates automatically.\\n - **Delete option greyed out** â at least one selected mailbox is in use by a live campaign; pause the campaign or deselect that mailbox.\\n - **Deleted a mailbox by mistake** â reconnect it via **Connect Mailbox** (or **Import from Icemail**). Warmup history and per-mailbox settings are not restored, so re-enable warmup.\\n\\n## Related articles\\n\\n - Add a custom email signature to a mailbox\\n - Bulk-set daily campaign sending limits for multiple mailboxes\\n - Bulk enable or disable warmup for multiple mailboxes\\n - Set sender name, reply-to address and aliases\\n - Connect a Google Workspace mailbox to Out","video":{"src":"https://cdn.outreachfox.ai/help/videos/bulk-set-or-clear-signatures-and-delete-mailboxes.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"7b09f090-ff9f-4f78-ae9b-35744d99362e"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/bulk-set-or-clear-signatures-and-delete-mailboxes.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"7b09f090-ff9f-4f78-ae9b-35744d99362e"}],"_source_doc":"https://docs.google.com/document/d/12gQcakLaYP8FmuREPD-SznIeL2lsf_mZpJaEHjCV4ws/edit"},{"slug":"connect-any-smtp-imap-mailbox","title":"Connect any SMTP/IMAP mailbox (custom provider)","category":"email-accounts","summary":"If your mailbox is not on Google Workspace or Microsoft 365 â for example Zoho, Yahoo, a cPanel/web-host mailbox, an Icemail SMTP mailbox or a transactional provider such as SendGrid or Amazon SES â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nIf your mailbox is not on Google Workspace or Microsoft 365 â for example Zoho, Yahoo, a cPanel/web-host mailbox, an Icemail SMTP mailbox or a transactional provider such as SendGrid or Amazon SES â connect it with SMTP
99(for sending) and IMAP (for reading replies and running warmup). You need the host, port, username and password for both.\\n\\n## Prerequisites\\n\\n - SMTP and IMAP are enabled on the mailbox at the provider. Many providers turn IMAP off by default.\\n - If the account uses two-factor authentication, an app password rather than the normal password (Gmail, Yahoo, Zoho and iCloud all require this).\\n - The hostnames and ports for your provider. See *Common IMAP/SMTP hostnames and ports reference*.\\n\\n## Steps\\n\\n1. Go to **Mailbox** â **Connect Mailbox**.\\n2. Select the **SMTP / IMAP** (custom provider) option.\\n3. Fill in the sender details:\\n\\n - **From name** â the name recipients see.\\n - **Email address** â the mailbox address.\\n4. Fill in the **SMTP** section:\\n\\n - **Host** â for example smtp.zoho.com.\\n - **Port** â 587 (STARTTLS) or 465 (SSL).\\n - **Username** â usually the full email address.\\n - **Password** â the mailbox or app password.\\n - **Encryption** â TLS/STARTTLS for 587, SSL for 465.\\n5. Fill in the **IMAP** section:\\n\\n - **Host** â for example imap.zoho.com.\\n - **Port** â 993 (SSL).\\n - **Username** and **Password** â normally the same as SMTP. Tick \\"same as SMTP\\" if the option is shown.\\n6. Click **Test connection** (if shown) and wait for both SMTP and IMAP to pass.\\n7. Click **Connect** / **Save**.\\n\\n## What you see afterwards\\n\\nThe mailbox appears in the **Mailbox** list as connected. Enable warmup with the **Custom Mailboxes** profile and set the daily campaign limit before using it as a sender account.\\n\\n## Tips\\n\\n - Use port 587 with STARTTLS as the default; fall back to 465/SSL only if 587 is blocked.\\n - For transactional providers (SendGrid, Mailgun, SES) the SMTP username is a literal string such as apikey or an SMTP credential, not your email address; the IMAP side must point to a real mailbox that receives replies (for example a Google or Zoho inbox for the same address).\\n - Make sure the domain's SPF record includes the provider's sending servers and that DKIM is signed by the provider, otherwise mail will fail authentication.\\n - Icemail SMTP mailboxes come with the host, port and password shown in Icemail under the mailbox; you can also use **Import from Icemail** instead of entering them by hand.\\n - Custom SMTP mailboxes have no provider-side reputation to lean on. Warm up for a full 3 weeks and keep them at 20â30 campaign emails per day.\\n\\n## Troubleshooting\\n\\n - **SMTP authentication failed** â wrong username format, a normal password where an app password is required, or SMTP AUTH disabled at the provider.\\n - **IMAP connection timed out** â IMAP disabled, wrong port (use 993), or a firewall on the provider's side. Confirm IMAP is on in the provider's mail settings.\\n - **Connected but replies not detected** â IMAP credentials point to a different mailbox than the From address, or replies are routed to a folder other than Inbox.\\n - **Certificate error** â the host name does not match the certificate; use the exact hostname from the reference article rather than an IP address or a CNAME alias.\\n - **Works then disconnects** â password rotated or provider rate limit. See *Fix mailbox disconnection errors (Google, Microsoft, SMTP)*.\\n\\n## Related articles\\n\\n - Common IMAP/SMTP hostnames and ports reference\\n - Bulk import sending accounts via CSV\\n - Fix mailbox disconnection errors (Google, Microsoft, SMTP)\\n - Connect a Google Workspace mailbox to OutreachFox\\n - Connect a Microsoft 365 / Outlook mailbox to OutreachFox\\n - Enable mailbox warmup","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1CAz5UY6A6zRb_4J6rFYwficlAw7sr9sSBWuOW_mEXHE/edit"},{"slug":"common-imap-smtp-hostnames-and-ports-reference","title":"Common IMAP/SMTP hostnames and ports reference","category":"email-accounts","summary":"Use this table when connecting a mailbox through Mailbox â Connect Mailbox â SMTP / IMAP. Values are the providers' published settings as of writing; check the provider's own documentation if a conâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nUse this table when connecting a mailbox through **Mailbox** â **Connect Mailbox** â SMTP / IMAP. Values are the providers' published settings as of writing; check the provider's own documentation if a connection fails.\\n\\n## General rules\\n\\n - **SMTP**: port **587** with STARTTLS is the default. Port **465** with SSL/TLS is the alternative. Port 25 is for server-to-server mail and is usually blocked; do not use it.\\n - **IMAP**: port **993** with SSL/TLS. Port 143 (unencrypted or STARTTLS) is rarely needed.\\n - **Username** is normally the full email address unless stated otherwise.\\n - **Password** is an app password wherever 2-factor authentication is on.\\n\\n## Provider table\\n\\n| | | | | | | |\\n| :-: | :-: | :-: | :-: | :-: | :-: | :-: |\\n| \\\\*\\\\*Provider\\\\*\\\\* | \\\\*\\\\*SMTP host\\\\*\\\\* | \\\\*\\\\*SMTP port\\\\*\\\\* | \\\\*\\\\*IMAP host\\\\*\\\\* | \\\\*\\\\*IMAP port\\\\*\\\\* | \\\\*\\\\*Username\\\\*\\\\* | \\\\*\\\\*Notes\\\\*\\\\* |\\n| Gmail / Google Worksp
99ace | smtp.gmail.com | 587 (TLS) or 465 (SSL) | imap.gmail.com | 993 | full address | Prefer \\\\*\\\\*Connect with Google\\\\*\\\\* (OAuth). For SMTP use an app password (2-step verification required). Enable IMAP in Gmail settings. |\\n| Outlook.com / Microsoft 365 | smtp.office365.com | 587 (STARTTLS) | outlook.office365.com | 993 | full address | Prefer \\\\*\\\\*Connect with Outlook\\\\*\\\\*. SMTP AUTH and IMAP must be enabled per user; basic-auth SMTP may be blocked by tenant policy. |\\n| Zoho Mail | smtp.zoho.com (or smtp.zoho.eu / .in per data centre) | 587 (TLS) or 465 (SSL) | imap.zoho.com (or .eu / .in) | 993 | full address | Enable IMAP in Zoho Mail settings; use an app-specific password with 2FA. |\\n| Yahoo Mail | smtp.mail.yahoo.com | 587 or 465 | imap.mail.yahoo.com | 993 | full address | Generate an app password under Account Security. |\\n| iCloud Mail | smtp.mail.me.com | 587 (STARTTLS) | imap.mail.me.com | 993 | full address | App-specific password required. |\\n| SendGrid | smtp.sendgrid.net | 587 or 465 | â (no IMAP) | â | apikey (literal) | Password is the API key. Point IMAP at a real inbox for the same From address. |\\n| Mailgun | smtp.mailgun.org (or smtp.eu.mailgun.org) | 587 or 465 | â (no IMAP) | â | SMTP login from the Mailgun domain settings | Password is the SMTP password, not the API key. Pair with a separate IMAP inbox. |\\n| Amazon SES | email-smtp..amazonaws.com | 587 or 465 (also 2587/2465) | â (no IMAP) | â | SES SMTP username | Credentials are SES SMTP credentials generated in the console, not IAM keys. Pair with a separate IMAP inbox. |\\n| Icemail SMTP mailboxes | shown in Icemail on the mailbox | as shown (typically 587) | shown in Icemail on the mailbox | 993 | full address | Easiest path is \\\\*\\\\*Mailbox\\\\*\\\\* â \\\\*\\\\*Connect Mailbox\\\\*\\\\* â \\\\*\\\\*Import from Icemail\\\\*\\\\*, which fills these in automatically. |\\n| cPanel / web host | mail.yourdomain.com | 587 or 465 | mail.yourdomain.com | 993 | full address | Values vary by host; check the \\"Email accounts â Connect devices\\" page in cPanel. |\\n\\n## Encryption settings in OutreachFox\\n\\n - Port 587 â choose **TLS** / **STARTTLS**.\\n - Port 465 â choose **SSL**.\\n - Port 993 (IMAP) â choose **SSL**.\\n\\nMismatching port and encryption is the single most common cause of a failed test connection.\\n\\n## Tips\\n\\n - Transactional providers (SendGrid, Mailgun, SES) are built for volume, not cold email. They lack an inbox for replies and their shared IP pools can be reputation risks. Use them only if you know why; Google, Microsoft or Icemail mailboxes are the normal choice for outreach.\\n - Copy hostnames exactly; a trailing space or a typo such as \\"smpt\\" causes a DNS error.\\n - Keep a note of which data-centre region your provider assigned (Zoho .eu, Mailgun EU, SES region); using the wrong one returns an authentication error even with correct credentials.\\n\\n## Related articles\\n\\n - Connect any SMTP/IMAP mailbox (custom provider)\\n - Bulk import sending accounts via CSV\\n - Fix mailbox disconnection errors (Google, Microsoft, SMTP)\\n - Microsoft 365: enable SMTP AUTH and IMAP for a user\\n - Buy domains and mailboxes through Icemail","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1nuQlKhwALJxAeInlsfW08DJzJ6cNa1Dbb7moklWAkNs/edit"},{"slug":"bulk-import-sending-accounts-via-csv","title":"Bulk import sending accounts via CSV","category":"email-accounts","summary":"When you have dozens of SMTP/IMAP mailboxes, entering them one at a time is slow. A CSV import lets you connect them all in one upload. This works for any mailbox that authenticates with a usernameâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nWhen you have dozens of SMTP/IMAP mailboxes, entering them one at a time is slow. A CSV import lets you connect them all in one upload. This works for any mailbox that authenticates with a username and password over SMTP and IMAP (Icemail SMTP mailboxes, Zoho, cPanel, and Google or Microsoft accounts using app passwords). Mailboxes that need OAuth sign-in (**Connect with Google** / **Connect with Outlook**) cannot be imported this way; Icemail-purchased Google and Microsoft mailboxes should use **Import from Icemail** instead.\\n\\n## Prerequisites\\n\\n - SMTP and IMAP enabled on each mailbox, with an app password where 2FA is on.\\n - Hostnames and ports for the provider. See *Common IMAP/SMTP hostnames and ports reference*.\\n - A spreadsheet editor that saves UTF-8 CSV.\\n\\n## Steps\\n\\n1. Go to **Mailbox** â **Connect Mailbox**.\\n\\n1. Choose **Bulk import** (or **Import from CSV**).\\n\\n1. Click **Download sample CSV** to get the template with the expected column headers.\\n\\n1. Fill in one row per mailbox. Typical columns:\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Column\\\\*\\\\* | \\\\*\\\\*Example\\\\*\\\\* | \\\\*\\\\*Required\\\\*\\\\* |\\n| first\\\\\\\\\\\\_name | Sara | yes |\\n| last\\\\\\\\\\\\_name | Lopez | no |\\n| email | \\\\<[email protected]\\\\> | yes |\\n| smtp\\\\\\\\\\\\_host | smtp.zoho.com | yes |\\n| smtp\\\\\\\\\\\\_port | 587 | yes |\\n| smtp\\\\\\\\\\\\_username | \\\\<[email protected]\\\\> | yes |\\n| smtp\\\\\\\\\\\\_password | app-password | yes |\\n| imap\\\\\\\\\\\\_host | imap.zoho.com | yes |\\n| imap\\\\\\\\\\\\_port | 993 | yes |\\n| imap\\\\\\\\\\\\_username | \\\\<[email protected]\\\\> | yes |\\n| imap\\\\\\\\\\\\_password | app-password | yes |\\n| daily\\\\\\\\\\\\_limit | 40 | no |\\n| warmup\\\\\\\\\\\\_enabled | true | no |\\n| signature | Sara Lopez, Acme | no |\\n\\n1. Save the file as CSV (UTF-8).\\n\\n1. Drag and drop the file onto the upload area or click to browse.\\n\\n1. Review the preview. Rows with missing required fields or malformed emails are flagged.\\n\\n1. Click **Import**. OutreachFox tests SMTP and IMAP for each row.\\n\\n1. Review the result: connected mailboxes, and failed rows with the reason. Download the failed rows, fix them and re-import only those.\\n\\n## What you see afterwards\\n\\nImported mailboxes appear in the **Mailbox** list. Rows with warmup\\\\_enabled set to true start warmup with the Custom Mailboxes profile; you can change the profile with the bulk **Warm Up** action.\\n\\n## Tips\\n\\n - Keep passwords out of shared drives; delete the CSV after import.\\n - Set daily\\\\_limit to 0â10 for brand-new mailboxes and raise it after 2â3 weeks of warmup.\\n - Group mailboxes by provider in separate CSVs so you can pick the right warm-up profile per batch.\\n - Use the signature column with the same template for all rows, then adjust individual ones under mailbox **Sett
99ings**.\\n - Import in batches of 50 or fewer; connection tests take a few seconds per mailbox.\\n\\n## Troubleshooting\\n\\n - **Whole file rejected** â the header row does not match the template. Re-download the sample and paste your data under its headers.\\n - **Authentication failed on every row for one provider** â wrong host or port, or normal passwords used where app passwords are required.\\n - **Some rows imported twice** â the email column had trailing spaces or different capitalisation; duplicates are matched on exact email. Delete the extras with the bulk **Delete** action.\\n - **Google/Microsoft rows fail** â basic-auth SMTP is blocked by the admin; connect those with **Connect with Google** / **Connect with Outlook** instead.\\n\\n## Related articles\\n\\n - Connect any SMTP/IMAP mailbox (custom provider)\\n - Common IMAP/SMTP hostnames and ports reference\\n - Export mailboxes from Icemail to OutreachFox\\n - Bulk enable or disable warmup for multiple mailboxes\\n - Bulk-set daily campaign sending limits for multiple mailboxes\\n - Fix mailbox disconnection errors (Google, Microsoft, SMTP)","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1gGxx2sDAfF6JTWrbTcziGQnV-4nakorkW8bKmDa3e7g/edit"},{"slug":"fix-mailbox-disconnection-errors","title":"Fix mailbox disconnection errors (Google, Microsoft, SMTP)","category":"email-accounts","summary":"A mailbox shows as Disconnected (or an error badge) in the Mailbox list when OutreachFox can no longer authenticate to it for sending or reading. While disconnected, the mailbox sends no campaign oâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nA mailbox shows as **Disconnected** (or an error badge) in the **Mailbox** list when OutreachFox can no longer authenticate to it for sending or reading. While disconnected, the mailbox sends no campaign or warmup email, and campaigns using it as a sender account lose that capacity. This article lists the causes by provider and how to fix each one.\\n\\n## First: read the error\\n\\n1. Go to **Mailbox**.\\n2. Hover over or click the error badge on the mailbox to see the message. It is one of three kinds:\\n\\n - **Authentication / credentials** â password changed, token revoked, app password deleted.\\n - **Permission / policy** â an admin blocked the app or protocol.\\n - **Connection / limit** â provider rate limit, temporary block or network issue.\\n3. Fix the cause using the section below, then click **Reconnect** on the mailbox (or **Connect Mailbox** and choose the same provider and account again).\\n\\n## Google Workspace\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Symptom\\\\*\\\\* | \\\\*\\\\*Cause\\\\*\\\\* | \\\\*\\\\*Fix\\\\*\\\\* |\\n| \\"Token expired\\" / \\"invalid\\\\\\\\\\\\_grant\\" | Password changed, or the user revoked OutreachFox under Google Account â Security â Third-party access | Click \\\\*\\\\*Reconnect\\\\*\\\\* and sign in again with \\\\*\\\\*Connect with Google\\\\*\\\\* |\\n| \\"Access blocked: admin policy\\" | The app was set to Blocked or Limited in Google Admin, or a new OU policy applies | Admin sets OutreachFox to \\\\*\\\\*Trusted\\\\*\\\\* again: \\\\*Google Workspace: allow OutreachFox in Google Admin\\\\* |\\n| Sending works, replies missing | IMAP disabled in Gmail settings, or the account was suspended | Enable IMAP; check admin console for suspension |\\n| \\"Daily sending quota exceeded\\" | Mailbox hit Google's limit (2,000/day Workspace, 500/day for new or trial accounts) | Lower the daily campaign limit to 30â50 and let warmup stay under 40; the block clears within 24 hours |\\n| Mailbox suspended for spam | Too much volume too early, high bounce or spam complaints | Pause campaigns on it, keep warmup on, request review in Google Admin; when reinstated, restart at 10/day |\\n\\n## Microsoft 365 / Outlook\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Symptom\\\\*\\\\* | \\\\*\\\\*Cause\\\\*\\\\* | \\\\*\\\\*Fix\\\\*\\\\* |\\n| \\"SMTP AUTH disabled\\" / 535 5.7.139 | Authenticated SMTP off for the user or the tenant | \\\\*Microsoft 365: enable SMTP AUTH and IMAP for a user\\\\*; check Exchange admin center org-wide setting |\\n| \\"IMAP disabled\\" | IMAP off for the user | Same article, tick \\\\*\\\\*IMAP\\\\*\\\\* |\\n| \\"Need admin approval\\" on reconnect | Tenant blocks user consent to third-party apps | A global admin grants consent once during \\\\*\\\\*Connect with Outlook\\\\*\\\\* |\\n| Token expired after password reset | Microsoft revokes refresh tokens on password change | \\\\*\\\\*Reconnect\\\\*\\\\* and sign in again |\\n| \\"Legacy authentication blocked\\" | Security Defaults or Conditional Access | Exclude the sending users, or ensure SMTP AUTH is allowed via modern auth |\\n| 550 5.4.1 / re
99cipient rejected | Anti-spam outbound policy or the mailbox is on Microsoft's restricted list | Check Defender â Restricted entities, release the user, lower volume |\\n| Mailbox sends only a fraction | Microsoft's 10,000 recipients/day and 30 messages/minute limits, or the tenant is new | Keep 30â40 campaign emails/day per mailbox; new tenants are throttled for the first weeks |\\n\\n## SMTP / IMAP (custom providers)\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Symptom\\\\*\\\\* | \\\\*\\\\*Cause\\\\*\\\\* | \\\\*\\\\*Fix\\\\*\\\\* |\\n| \\"Authentication failed\\" | Password rotated, app password deleted, wrong username format | Update credentials under mailbox \\\\*\\\\*Settings\\\\*\\\\* â \\\\*\\\\*Reconnect\\\\*\\\\* |\\n| \\"Connection timed out\\" | Wrong port, IMAP/SMTP disabled at provider, provider firewall | Confirm ports (587/465 SMTP, 993 IMAP) and that both protocols are on |\\n| \\"Certificate verify failed\\" | Hostname mismatch | Use the exact hostname from \\\\*Common IMAP/SMTP hostnames and ports reference\\\\* |\\n| \\"Too many connections\\" / 421 | Provider limits concurrent IMAP sessions | Make sure no other tool polls the same inbox; wait 15 minutes and reconnect |\\n| \\"Sending limit exceeded\\" | Provider's hourly or daily cap | Lower the daily campaign limit; Zoho and shared hosts often cap at 50â300/day |\\n\\n## Icemail mailboxes\\n\\
99nMailboxes bought through Icemail rarely disconnect; when they do, open Icemail (top-left switcher â **Icemail**), check the mailbox status there, then use **Mailbox** â **Connect Mailbox** â **Import from Icemail** to re-import. Icemail also offers free replacements if a mailbox is permanently blocked.\\n\\n## After reconnecting\\n\\n - Confirm the status shows **Connected**.\\n - Check the mailbox's **Warm up** tab the next day; if health dropped during the outage, keep campaign volume low for a few days.\\n - Campaigns resume using the mailbox automatically at the next sending window.\\n\\n## Tips\\n\\n - Turn on disconnection alerts (email notification in **Settings**) so you hear about it before a campaign day is lost.\\n - Do not change mailbox passwords without reconnecting in OutreachFox the same day.\\n - Avoid connecting the same mailbox to two outreach tools; competing IMAP sessions cause repeated disconnects.\\n - Review the **Mailbox** list weekly for error badges.\\n\\n## Related articles\\n\\n - Google Workspace: allow OutreachFox in Google Admin\\n - Connect a Google Workspace mailbox to OutreachFox\\n - Microsoft 365: enable SMTP AUTH and IMAP for a user\\n - Connect a Microsoft 365 / Outlook mailbox to OutreachFox\\n - Connect any SMTP/IMAP mailbox (custom provider)\\n - Common IMAP/SMTP hostnames and ports reference\\n - Mailbox warmup analytics","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/165qd97hvSbL_tNXpi9XaDKDNjB6Ed2ukhArf8eyxEWg/edit"},{"slug":"set-sender-name-reply-to-address-and-aliases","title":"Set sender name, reply-to address and aliases","category":"email-accounts","summary":"Each connected mailbox has a sender name (what recipients see in the From field), an optional reply-to address (where replies go if not the mailbox itself) and, on Google and Microsoft mailboxes, oâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nEach connected mailbox has a sender name (what recipients see in the From field), an optional reply-to address (where replies go if not the mailbox itself) and, on Google and Microsoft mailboxes, optional aliases (other addresses the mailbox is allowed to send as). This article shows where these live and how to set them.\\n\\n## Prerequisites\\n\\n - The mailbox is connected under **Mailbox**.\\n - For aliases: the alias is already configured at the provider (Gmail \\"Send mail as\\" or Workspace alias; Microsoft 365 proxy address).\\n\\n## Steps\\n\\n### Sender name\\n\\n1. Go to **Mailbox** and click the mailbox.\\n2. Click **Settings**.\\n3. In **First name** and **Last name** (or **Sender name**), enter the name recipients should see, for example \\"Sara Lopez\\".\\n4. Click **Save**.\\n\\nThe name is also what the **+ Name** button inserts into signatures and what the sender-name variable resolves to in sequences.\\n\\n### Reply-to address\\n\\n1. In the same **Settings** panel, find **Reply-to**.\\n2. Enter the address that should receive replies, for example a shared inbox or your primary work address.\\n3. Click **Save**.\\n\\nLeave it blank to have replies come back to the sending mailbox. Note that OutreachFox detects replies by reading the sending mailbox over IMAP; if you redirect replies elsewhere, reply detection and reply categorization only work if that address is also connected as a mailbox.\\n\\n### Aliases\\n\\n1. In **Settings**, find **Aliases** (Google Workspace and Microsoft 365 mailboxes).\\n2. Click **Add alias** and enter the alias address, or select from the aliases OutreachFox found on the account.\\n3. Choose whether the alias should be used as the From address for campaigns.\\n4. Click **Save**.\\n\\n## What you see afterwards\\n\\nThe mailbox list shows the sender name next to the address. Test it by sending a preview email from a campaign to yourself and checking the From and Reply-To headers.\\n\\n## Tips\\n\\n - Use a real person's name, first and last, in normal capitalisation. \\"Sara Lopez\\" beats \\"Sara @ Acme\\" or \\"Acme Team\\" for reply rates and for spam filters.\\n - Keep the same sender name across all mailboxes for one person; changing names on the same address looks suspicious.\\n - Do not set reply-to to a different domain than the From address; it fails many DMARC-alignment checks and looks like spoofing.\\n - Use aliases only when you need a specific address (for example a shorter domain) and the alias's domain al
99so has SPF/DKIM set up for the provider.\\n - Sending from an alias on a domain you have not warmed up carries the same risk as a cold mailbox; warm the alias too.\\n\\n## Troubleshooting\\n\\n - **Recipients see the raw email address instead of a name** â sender name is empty; set it under **Settings**.\\n - **Replies not appearing in the campaign** â a reply-to address is set that is not a connected mailbox. Clear it or connect that mailbox.\\n - **Alias not offered** â it is not configured at the provider, or the mailbox was connected before the alias was created; reconnect the mailbox.\\n - **Alias sends are rejected** â the alias's domain lacks SPF/DKIM for the provider; add the records.\\n\\n## Related articles\\n\\n - Add a custom email signature to a mailbox\\n - Bulk set or clear signatures, and delete mailboxes\\n - Connect a Google Workspace mailbox to OutreachFox\\n - Connect a Microsoft 365 / Outlook mailbox to OutreachFox\\n - AI reply categorization\\n - Use variables to personalise emails","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1KsgbrJpP_GWzVOcN2-A1cvyHScDhw2AvmNwIPF9-waQ/edit"},{"slug":"what-is-icemail-outreachfox-s-built-in-mailbox-marketplace","title":"What is Icemail? OutreachFox's built-in mailbox marketplace","category":"mailbox-infrastructure","summary":"Icemail is the domain and mailbox marketplace built into OutreachFox. You use it to buy sending domains, buy mailboxes on those domains (Google, Microsoft, IMAP/SMTP or Azure), and manage your wholâ¦","body":"Icemail is the domain and mailbox marketplace built into OutreachFox. You use it to buy sending domains, buy mailboxes on those domains (Google, Microsoft, IMAP/SMTP or Azure), and manage your whole sending infrastructure from one dashboard. You do not need to visit a registrar, a Google Workspace admin console or a DNS host: Icemail provisions the domain, creates the mailboxes and configures the DNS records for you.\\n\\n## How to open Icemail\\n\\n1. Log in to OutreachFox.\\n2. Click the **OutreachFox** icon (the arrow) at the top-left of the dashboard.\\n3. Select **Icemail** from the dropdown.\\n4. To return, click the same icon and select **OutreachFox**.\\n\\n## What you see in Icemail\\n\\n1. Log in and open the Icemail dashboard. The layout shows your domains, mailboxes and infrastructure options in a single view.\\n\\n\\n\\n2. Use **Add Domain** to connect a domain you already own or to buy a new one, then add mailboxes to it. Icemail handles the technical setup, including authentication, in the background.\\n\\n\\n\\n3. Monitor mailbox health, manage domains and keep the whole setup in one interface.\\n\\n\\n\\n## Why this matters\\n\\n - **Dedicated, not shared, infrastru
99cture.** Every domain and mailbox you buy is yours. You are not sending through a pool shared with other customers, so another sender's bad behaviour does not damage your reputation.\\n - **No DNS work.** SPF, DKIM and DMARC are configured automatically when the domain is registered through Icemail. See *How Icemail automates SPF, DKIM and DMARC â and replaces mailboxes for free*.\\n - **One-click import into OutreachFox.** Once mailboxes exist in Icemail, you pull them into OutreachFox with **Mailbox â Connect Mailbox â Import from Icemail**. No client IDs, no SMTP passwords.\\n - **Free replacements.** If a mailbox is burned, you replace it at no cost instead of buying a new one.\\n\\n## Typical workflow\\n\\n1. Icemail â **Add Domain** â **Buy Domains** (or connect an existing domain by pointing its nameservers at Icemail).\\n2. Choose a mailbox type (Google, Microsoft, IMAP/SMTP, Azure) â **Buy New Mailboxes** â set quantity â **Add to Cart** â checkout.\\n3. Back in OutreachFox: **Mailbox â Connect Mailbox â Import from Icemail**.\\n4. Select the imported mailboxes â **Enable Warm Up** â pick a profile â **Enable Warmer**.\\n5. Warm up for at least 14 days before using the mailboxes in a campaign.\\n\\n## Tips\\n\\n - Buy 2â3 mailboxes per domain and spread sending across several domains rather than loading one domain with many accounts.\\n - Keep your wallet topped up before placing an order; domains and mailboxes are charged together in a single order.\\n - Your Icemail domains appear under **Domain** in the OutreachFox left nav once mailboxes are imported, where you can add a custom tracking domain.\\n\\n## Related articles\\n\\n - How Icemail automates SPF, DKIM and DMARC â and replaces mailboxes for free\\n - Buy a domain through Icemail from inside OutreachFox\\n - Buy mailboxes through Icemail (Google, Microsoft, IMAP/SMTP, Azure)\\n - Import your Icemail mailboxes into OutreachFox\\n - Enable warmup on your mailboxes\\n - How many mailboxes per domain and domains per campaign (best prac","video":{"src":"https://cdn.outreachfox.ai/help/videos/what-is-icemail-outreachfox-s-built-in-mailbox-marketplace.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"df71292f-cabe-4e3b-8f55-9f61377afb31"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/what-is-icemail-outreachfox-s-built-in-mailbox-marketplace.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"df71292f-cabe-4e3b-8f55-9f61377afb31"}],"_source_doc":"https://docs.google.com/document/d/1ua2S8P4gUjPWkw4DXUQ5XVza5L0mLVz7RB-pkuxcqCI/edit"},{"slug":"how-icemail-automates-spf-dkim-and-dmarc-and-replaces-mailboxes-for-fr","title":"How Icemail automates SPF, DKIM and DMARC â and replaces mailboxes for free","category":"mailbox-infrastructure","summary":"When you buy a domain and mailboxes through Icemail, the platform writes the email authentication records for you and lets you swap out a damaged mailbox at no cost. This article explains what happâ¦","body":"When you buy a domain and mailboxes through Icemail, the platform writes the email authentication records for you and lets you swap out a damaged mailbox at no cost. This article explains what happens in the background and what you still need to do yourself.\\n\\n## Steps\\n\\n1. In Icemail, add a domain (buy it, or connect one you own) and add mailboxes to it. Icemail performs the technical setup in the background.\\n\\n\\n\\n2. Icemail publishes the authentication records for the domain: **SPF**, **DKIM** and **DMARC**. You do not enter these at a registrar.\\n\\n\\n\\n3. If a mailbox stops performing, replace it from the Icemail dashboard. Replacements are unlimited and free, so campaigns keep running without a fresh purchase.\\n\\n\\n\\n4. Connect the infrastru
99cture to your outreach tool. In OutreachFox this is **Mailbox â Connect Mailbox â Import from Icemail**.\\n\\n\\n\\n## What Icemail configures for you\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Record\\\\*\\\\* | \\\\*\\\\*What it does\\\\*\\\\* | \\\\*\\\\*What Icemail sets\\\\*\\\\* |\\n| SPF (TXT) | Lists the servers allowed to send for the domain | Include for the mailbox provider you bought (Google, Microsoft, Azure or Icemail SMTP) |\\n| DKIM (TXT/CNAME) | Cryptographically signs each message so the receiver can confirm it was not altered | Provider selector and public key |\\n| DMARC (TXT at \\\\\\\\\\\\_dmarc) | Tells receivers what to do when SPF/DKIM fail and where to send reports | A valid policy record so Gmail/Yahoo bulk-sender rules are met |\\n| MX | Where inbound mail for the domain is delivered | Provider MX so replies and bounces reach the mailbox |\\n\\nIf you connected a domain you already own, Icemail can only write these records when the domain's nameservers point at Icemail. If you keep DNS at your registrar, add the records yourself â see *SPF, DKIM and DMARC: what they are and how to check yours*.\\n\\n## Why this matters\\n\\nGmail, Yahoo and Microsoft reject or junk mail from domains that fail authentication. Since 2024, bulk senders must pass SPF and DKIM and publish DMARC. A single missing or malformed record can send an entire domain's traffic to spam. Automating the setup removes the most common cause of day-one deliverability failure.\\n\\n## Free mailbox replacement\\n\\nA mailbox is \\"burned\\" when its reputation has dropped so far that warm-up cannot recover it: spam placement stays high for a week or more, or the provider suspends it. Rather than buying a new account:\\n\\n1. In Icemail, open the domain and locate the affected mailbox.\\n2. Request a replacement. Icemail deletes the old account and provisions a new one on the same domain.\\n3. Re-import into OutreachFox (**Mailbox â Connect Mailbox â Import from Icemail**) and enable warm-up on the new mailbox.\\n\\nReplacing the mailbox does not reset the domain's reputation. If the whole domain is blacklisted, replace the domain instead.\\n\\n## Tips\\n\\n - Even with automatic setup, verify records once after purchase using a free DNS lookup tool. Look for one SPF record (not two), a DKIM selector that resolves, and a DMARC record at \\\\_dmarc.yourdomain.com.\\n - Do not add a second SPF record manually. Two SPF records is a permanent fail.\\n - Start DMARC at p=none and move to p=quarantine after a few weeks of clean reports. Icemail lets you set or remove DMARC per domain.\\n\\n## Troubleshooting\\n\\n - **Records show as missing after purchase.** DNS propagation can take up to 24â48 hours. Check again later.\\n - **You connected an existing domain and records are missing.** Confirm the nameservers at your registrar match Icemail's nameservers.\\n - **DKIM fails after moving mailboxes between providers.** The DKIM selector is provider-specific. Re-provision the DNS records in Icemail for the new provider.\\n\\n## Related articles\\n\\n - What is Icemail? OutreachFox's built-in mailbox marketplace\\n - SPF, DKIM and DMARC: what they are and how to check yours\\n - Adding DNS records at Cloudflare, GoDaddy, Namecheap and Porkbun\\n - Import your Icemail mailboxes into OutreachFox\\n - Troubleshooting warmup (paused, low health score, high spam pl","video":{"src":"https://cdn.outreachfox.ai/help/videos/how-icemail-automates-spf-dkim-and-dmarc-and-replaces-mailboxes-for-fr.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"980c5ec3-4557-4e99-b6ba-a6c3ef7ef425"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/how-icemail-automates-spf-dkim-and-dmarc-and-replaces-mailboxes-for-fr.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"980c5ec3-4557-4e99-b6ba-a6c3ef7ef425"}],"_source_doc":"https://docs.google.com/document/d/1rDP5ckXRzEI9AgWJNTgni8lyIiHkBpfwsTdHXfE8DrI/edit"},{"slug":"buy-a-domain-through-icemail-from-inside-outreachfox","title":"Buy a domain through Icemail from inside OutreachFox","category":"mailbox-infrastru
99cture","summary":"You can register new sending domains without leaving OutreachFox. Icemail buys the domain, sets up its DNS and makes it ready for mailboxes in one step.","body":"You can register new sending domains without leaving OutreachFox. Icemail buys the domain, sets up its DNS and makes it ready for mailboxes in one step.\\n\\n## Prerequisites\\n\\n - An OutreachFox account.\\n - Enough balance in your Icemail wallet to cover the domain (and the mailboxes you plan to add).\\n\\n## Steps\\n\\n1. Log in to your OutreachFox account.\\n2. Click the **arrow** at the top-left of the dashboard.\\n\\n\\n\\n3. Select **Icemail** from the dropdown menu.\\n\\n\\n\\n4. Click **Add Domain**.\\n5. Click **Buy Domains**.\\n\\n\\n\\n\\n\\n6. Type the domain you want in the search bar, choose your preferred domain from the results and complete the purchase.\\n\\n\\n\\n\\n\\nAfter purchase, Icemail shows the options for which mailbox type to assign to the domain. Continue with *Buy mailboxes through Icemail (Google, Microsoft, IMAP/SMTP, Azure)*.\\n\\n## Choosing a good cold-email domain\\n\\n - Use a variation of your main brand, not the brand domain itself: getacme.com, acmehq.com, tryacme.com, acme-team.com. Never send cold email from your primary company domain.\\n - Prefer .com, then .net, .org, .live. Icemail supports these TLDs; avoid cheap TLDs (.xyz, .info, .biz) that spam filters distrust.\\n - Keep it short, readable and free of numbers or hyphen chains.\\n - Check the domain's history before you buy. A previously used domain may be on a blocklist; Icemail runs a blacklist check before ordering and skips domains that fail.\\n - Buy several domains at once and spread mailboxes across them (2â3 per domain).\\n\\n## Connecting a domain you already own instead\\n\\nFrom **Add Domain** you can also connect an existing domain. Icemail gives you its nameservers; change the nameservers at your registrar, wait for propagation, then complete the order. Mailboxes only are charged. Until the nameservers point at Icemail, mailbox provisioning cannot complete.\\n\\n## Tips\\n\\n - Set the domain to forward to your main website so prospects who type it in land somewhere real. See *Domain forwarding and MX records for cold-email domains*.\\n - Domains bought here appear under **Domain** in OutreachFox once mailboxes are imported. That is where you add a custom tracking domain.\\n - Turn on wallet auto top-up if you buy domains regularly, so orders never fail on balance.\\n\\n## Troubleshooting\\n\\n - **Domain shows as unavailable.** Try a different variation or TLD. Icemail shows suggestions.\\n - **Order skipped a domain.** The domain failed the pre-order blacklist check. Pick another name; a blacklisted domain will hurt deliverability from day one.\\n - **Insufficient balance.** Top up the wallet, then retry the order.\\n\\n## Related articles\\n\\n - What is Icemail? OutreachFox's built-in mailbox marketplace\\n - Buy mailboxes through Icemail (Google, Microsoft, IMAP/SMTP, Azure)\\n - Import your Icemail mailboxes into OutreachFox\\n - Pre-warmed domains and mailboxes explained\\n - How many mailboxes per domain and domains per campaign (","video":{"src":"https://cdn.outreachfox.ai/help/videos/buy-a-domain-through-icemail-from-inside-outreachfox.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"f564a968-33ab-45a1-82d2-c6b38f2f7213"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/buy-a-domain-through-icemail-from-inside-outreachfox.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"f564a968-33ab-45a1-82d2-c6b38f2f7213"}],"_source_doc":"https://docs.google.com/document/d/1kPF4q6yatwf0R0_cP0rvJidvWx62Qf_Zwkq3qd7APfk/edit"},{"slug":"buy-mailboxes-through-icemail","title":"Buy mailboxes through Icemail
99(Google, Microsoft, IMAP/SMTP, Azure)","category":"mailbox-infrastructure","summary":"Once a domain is in Icemail, you add mailboxes to it. You pick the provider, set the quantity and check out. Icemail creates the accounts and configures authentication for the provider you chose.","body":"Once a domain is in Icemail, you add mailboxes to it. You pick the provider, set the quantity and check out. Icemail creates the accounts and configures authentication for the provider you chose.\\n\\n## Prerequisites\\n\\n - A domain in Icemail (bought through Icemail or connected with its nameservers pointing at Icemail).\\n - Wallet balance to cover the mailboxes.\\n\\n## Steps\\n\\n1. In Icemail, open the domain you just bought or connected. After purchase you land on the mailbox options for that domain.\\n2. Choose the mailbox type to assign: **Google Mailboxes**, **Microsoft Mailboxes**, **IMAP** or **Azure**.\\n3. Click **Buy New Mailboxes**.\\n4. Enter the number of mailboxes you need.\\n5. Click **Add to Cart** and finish the checkout process.\\n\\n\\n\\nWhen the order completes, the mailboxes are listed under the domain in Icemail and are ready to import into OutreachFox. See *Import your Icemail mailboxes into OutreachFox*.\\n\\n## Which mailbox type to choose\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Type\\\\*\\\\* | \\\\*\\\\*Best for\\\\*\\\\* | \\\\*\\\\*Notes\\\\*\\\\* |\\n| Google Mailboxes | Prospect lists heavy in Google Workspace recipients; highest inbox rates to Gmail | Most expensive per seat. Warm-up needed. |\\n| Microsoft Mailboxes | Prospect lists heavy in Outlook/Microsoft 365 recipients | Good Outlook placement. Microsoft's own bulk-sending limits apply. |\\n| Azure | High-volume sending at lower cost per mailbox | Runs on Microsoft infrastructure without full M365 seats. Use the Azure warm-up profile. |\\n| IMAP/SMTP | Cheapest, fastest to provision, no provider admin console | Reputation depends on Icemail's sending infrastructure. Use the Custom Mailboxes warm-up profile. |\\n\\nMixing types is a good strategy. With **Auto match leads** enabled in a campaign (Settings â Show Advanced Configurations â Deliverability and Safety), OutreachFox sends to Gmail recipients from Google mailboxes and to Outlook recipients from Microsoft mailboxes where possible.\\n\\n## How many to buy\\n\\n - 2â3 mailboxes per domain. More than that on one domain concentrates risk.\\n - Plan on 30â50 campaign emails per mailbox per day after warm-up.\\n - Example: 1,000 emails/day ÷ 40 per mailbox = 25 mailboxes ÷ 3 per domain = 9 domains.\\n\\n## Tips\\n\\n - Name the mailboxes as real people (first name, or first.last) â Icemail lets you set names on each mailbox. Avoid sales@, info@, noreply@.\\n - Buy all mailboxes for a domain in one order so they are provisioned together.\\n - After importing, enable warm-up immediately. Idle mailboxes do not build reputation.\\n - Pre-warmed mailboxes are available if you cannot wait 2â3 weeks. See *Pre-warmed domains and mailboxes explained*.\\n\\n## Troubleshooting\\n\\n - **Order placed but mailboxes not appearing.** Provisioning for Google and Microsoft can take a few hours. IMAP mailboxes are usually immediate.\\n - **Cannot add mailboxes to a connected domain.** The domain's nameservers are not pointing at Icemail yet. Update them at the registrar and retry.\\n - **Google mailboxes need a client ID.** Icemail handles Workspace API access for mailboxes it provisions; you only need the client-ID step when connecting your own Google Workspace directly to OutreachFox.\\n\\n## Related articles\\n\\n - Buy a domain through Icemail from inside OutreachFox\\n - Import your Icemail mailboxes into OutreachFox\\n - What is Icemail? OutreachFox's built-in mailbox marketplace\\n - How many mailboxes per domain and domains per campaign (best practice)\\n - Create and customise a warmup profile\\n - Enable warmup on your mailboxes","video":{"src":"https://cdn.outreachfox.ai/help/videos/buy-mailboxes-through-icemail.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"1c2b7eff-1f8d-42c0-bbc4-d9206e8b5826"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/buy-mailboxes-through-icemail.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"1c2b7eff-1f8d-42c0-bbc4-d9206e8b5826"}],"_source_doc":"https://docs.google.com/document/d/1jz8e38BHBoFDRLxDhAdI969ffG2aUTs4YGd2dEYnzl8/edit"},{"slug":"import-your-icemail-mailboxes-into-outreachfox","title":"Import your Icemail mailboxes into OutreachFox","category":"mailbox-infrastru
99cture","summary":"Mailboxes you buy in Icemail do not appear in OutreachFox automatically. You import them once with Import from Icemail, then enable warm-up. No client IDs, app passwords or SMTP settings are needed.","body":"Mailboxes you buy in Icemail do not appear in OutreachFox automatically. You import them once with **Import from Icemail**, then enable warm-up. No client IDs, app passwords or SMTP settings are needed.\\n\\n## Prerequisites\\n\\n - Mailboxes assigned to a domain in Icemail (see *Buy mailboxes through Icemail*).\\n\\n## Steps\\n\\n1. In Icemail, confirm your mailboxes are assigned to the domain and the order is complete. Export them to OutreachFox from the Icemail side if prompted.\\n\\n\\n\\n2. Return to your OutreachFox dashboard: click the **OutreachFox** icon at the top-left and select **OutreachFox** from the dropdown.\\n\\n\\n\\n\\n\\n3. Click **Mailbox** in the left nav.\\n4. Click **Connect Mailbox**.\\n5. Scroll down until you see **Import from Icemail** and select it. Your purchased mailboxes import directly into OutreachFox.\\n6. Back on the **Mailbox** page, select the imported mailboxes and click **Enable Warm Up**.\\n\\n\\n\\n7. Pick the warm-up profile that matches the mailbox type (Google, Microsoft, Azure or Custom Mailboxes) and click **Enable Warmer**.\\n\\n## What you see afterwards\\n\\nEvery mailbox you purchased or transferred through Icemail is listed on the **Mailbox** page, with its warm-up status, daily campaign limit and health. The domains appear under **Domain**.\\n\\n## Bringing your own domains or mailboxes\\n\\
99nIf your mailboxes live somewhere else (an existing Google Workspace or Microsoft 365 tenant), connect them from the same **Connect Mailbox** screen by choosing **Google Workspace** or **Office365 Outlook** instead of Import from Icemail. Before you do, make sure SPF, DKIM and DMARC records exist on that domain â OutreachFox does not write DNS for domains it does not manage. Domains bought from Icemail can be connected directly with no extra DNS work.\\n\\n## Tips\\n\\n - Warm up for at least 14 days before adding the mailboxes to a campaign. Two to three weeks is safer for brand-new domains.\\n - Set a signature on each imported mailbox (**Mailbox â Settings â Edit signature**) before launching.\\n - Use the bulk-actions bar on the Mailbox page to set **campaign emails per day** for all imported mailboxes at once. Start at 20â30 and raise to 40â50 after warm-up.\\n\\n## Troubleshooting\\n\\n - **Import from Icemail shows no mailboxes.** The Icemail order may still be provisioning. Wait and retry, or check the domain in Icemail for a pending status.\\n - **Mailboxes imported but warm-up will not enable.** Check that the mailbox has finished provisioning and can send (Google/Microsoft accounts occasionally need a first login on the provider side).\\n - **Mailbox imported twice.** Delete the duplicate with the three-dots menu â **Delete**. Warm-up history stays with the original.\\n\\n## Related articles\\n\\n - Buy mailboxes through Icemail (Google, Microsoft, IMAP/SMTP, Azure)\\n - Enable warmup on your mailboxes\\n - Create and customise a warmup profile\\n - Connect a Google Workspace mailbox\\n - Connect a Microsoft 365 / Outlook mailbox\\n - Warmup best practices: how long, how fast, and when t","video":{"src":"https://cdn.outreachfox.ai/help/videos/import-your-icemail-mailboxes-into-outreachfox-1.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"2d1ae72b-7c68-47d5-92ea-3368dddeb68f"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/import-your-icemail-mailboxes-into-outreachfox-1.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"2d1ae72b-7c68-47d5-92ea-3368dddeb68f"},{"src":"https://cdn.outreachfox.ai/help/videos/import-your-icemail-mailboxes-into-outreachfox-2.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"f4f09ff4-3c0e-4004-8160-c9e96058c756"}],"_source_doc":"https://docs.google.com/document/d/1HBgWdbti2JFMMhiGDnBzRk9HUUvOgLJfYGLnE0EQCZU/edit"},{"slug":"set-up-a-custom-tracking-domain","title":"Set up a custom tracking domain","category":"mailbox-infrastructure","summary":"A custom tracking domain replaces the shared tracking link in your emails with a subdomain you own (for example link.yourdomain.com). Open and click tracking then run through your own domain, whichâ¦","body":"A custom tracking domain replaces the shared tracking link in your emails with a subdomain you own (for example link.yourdomain.com). Open and click tracking then run through your own domain, which keeps your links consistent with your sender and avoids sharing a tracking host with other senders.\\n\\n## Prerequisites\\n\\n - A domain listed under **Domain** in OutreachFox.\\n - Access to the DNS settings for that domain (your registrar, Cloudflare, or Icemail if the domain was bought there).\\n\\n## Steps\\n\\n1. Click **Domain** in the main menu.\\n\\n\\n\\n2. Select the domain you want to set up.\\n\\n\\n\\n3. Click **Settings** for that domain, then scroll down to the **custom tracking domain** section.\\n\\n\\n\\n\\n\\n4. Add the CNAME record shown in the DNS settings wherever your domain is hosted.\\n\\n\\n\\n\\n\\n5. Click **Save** to confirm your changes.\\n\\n\\n\\n6. Once the CNAME is added and saved, click **Verify** to complete the setup.\\n\\n\\n\\nThe tracking domain now shows as verified and is used for tracked links and open pixels sent from mailboxes on that domain.\\n\\n## The CNAME record\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Field\\\\*\\\\* | \\\\*\\\\*Value\\\\*\\\\* |\\n| Type | CNAME |\\n| Host / Name | The subdomain shown in OutreachFox (commonly link, track or go) |\\n| Target / Value | The tracking host shown in the custom tracking domain section |\\n| TTL | Automatic or 3600 |\\n\\nAt Cloudflare, set the proxy status to **DNS only** (grey cloud). A proxied CNAME breaks verification. Registrar-specific steps are in *Adding DNS records at Cloudflare, GoDaddy, Namecheap and Porkbun*.\\n\\n## Why this matters\\n\\n - Shared tracking domains are used by thousands of senders. If any of them get blocklisted, your links inherit the reputation.\\n - A link whose host matches your sending domain looks legitimate to spam filters that compare link domains with the From domain.\\n - Set one tracking subdomain per sending domain. Do not point several sending domains at one tracking subdomain.\\n\\n## Tips\\n\\n - Use a subdomain, never the root domain. The root should keep forwarding to your website.\\n - Keep link tracking off in the first 1â2 weeks of a new campaign if placement is shaky; open tracking alone is lower risk. Re-enable once inbox rates are stable.\\n - If the domain was bought through Icemail, add the CNAME from the domain's DNS records in Icemail.\\n\\n## Troubleshooting\\n\\n - **Verify fails immediately.** DNS has not propagated. Wait 10â60 minutes (up to 48 hours at some registrars) and click **Verify** again.\\n - **Verify still fails after a day.** Check the host name: many registrars append the domain automatically, so entering link.yourdomain.com as host becomes link.yourdomain.com.yourdomain.com. Enter only link.\\n - **Cloudflare domain never verifies.** The record is proxied. Switch to DNS only.\\n - **Links open but show a certificate warning.** Wait for the SSL certificate to be issued after verification; this can take a few minutes.\\n\\n## Related articles\\n\\n - Adding DNS records at Cloudflare, GoDaddy, Namecheap and Porkbun\\n - Domain forwarding and MX records for cold-email domains\\n - Deliverability fundamentals for cold email\\n - Landing in spam? T","video":{"src":"https://cdn.outreachfox.ai/help/videos/set-up-a-custom-tracking-domain.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"e7be8ca6-58b3-4ea1-aa75-c864eed30ddb"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/set-up-a-custom-tracking-domain.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"e7be8ca6-58b3-4ea1-aa75-c864eed30ddb"}],"_source_doc":"https://docs.google.com/document/d/1zelOa2NL8DIRLSGeUZ8IEuEF8rGYlYUGNhTI4S8roxk/edit"},{"slug":"spf-dkim-and-dmarc-what-they-are-and-how-to-check-yours","title":"SPF, DKIM and DMARC: what they are and how to check yours","category":"mailbox-infrastructure","summary":"SPF, DKIM and DMARC are three DNS records that prove your email really comes from your domain. Gmail, Yahoo and Microsoft require all three from bulk senders, and cold email counts as bulk. A domaiâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nSPF, DKIM and DMARC are three DNS records that prove your email really comes from your domain. Gmail, Yahoo and Microsoft require all three from bulk senders, and cold email counts as bulk. A domain missing any one of them lands in spam regardless of how good the copy is. Domains bought through Icemail get these records automatically; domains you bring yourself need them added by hand.\\n\\n## What each record does\\n\\n**SPF (Sender Policy Framework)** â a TXT record at the root of the domain listing which servers may send mail for it. Example for Google Workspace:\\n\\nv=spf1 include:\\\\_spf.google.com \\\\~all\\n\\nFor Microsoft 365: v=spf1 include:spf.protection.outlook.com \\\\~all. One SPF record per domain only; multiple includes go inside the same record. Stay under 10 DNS lookups.\\n\\n**DKIM (DomainKeys Identified Mail)** â a public key published at selector.\\\\_domainkey.yourdomain.com. The mail server signs each message with the private key; receivers verify the signature. Google uses selector google; Microsoft uses selector1 and selector2 as CNAMEs. A DKIM signature also proves the message was not altered in transit.\\n\\n**DMARC (Domain-based Message Authentication, Reporting and Conformance)** â a TXT record at \\\\_dmarc.yourdomain.com that tells receivers what to do when SPF or DKIM fail, and where to send reports:\\n\\nv=DMARC1; p=none; rua=mailto:[email protected]; pct=100\\n\\nPolicies: p=none (monitor only), p=quarantine (send failures to spam), p=reject (drop failures). Start at none, move to quarantine after 2â4 weeks of clean reports.\\n\\n## Steps: check your records\\n\\n1. Open a DNS lookup tool (MXToolbox, Google Admin Toolbox Dig, or dig in a terminal).\\n2. **SPF:** look up TXT for yourdomain.com. You should see exactly one record starting v=spf1 that includes your provider.\\n3. **DKIM:** look up TXT (Google) or CNAME (Microsoft) for selector.\\\\_domainkey.yourdomain.com. A result containing v=DKIM1 or a CNAME to the provider's key host means it is published.\\n4. **DMARC:** look up TXT for \\\\_dmarc.yourdomain.com. You should see one record starting v=DMARC1.\\n5. Send a test email from the mailbox to a personal Gmail account. Open the message â **Show original**. The headers should read SPF: PASS, DKIM: PASS, DMARC: PASS.\\n6. In OutreachFox, open **Domain**, select the domain and review its details and settings; fix any records flagged as missing at your DNS host.\\n\\n## What you see afterwards\\n\\nAll three headers show PASS in Gmail's \\"Show original\\" view, and the domain is ready for warm-up.\\n\\n## Tips\\n\\n - Use \\\\~all (softfail) in SPF for c
99old-email domains; -all is stricter and can cause hard rejections when a provider adds a new IP range.\\n - Add the DMARC rua address so you receive aggregate reports; a free DMARC report viewer makes them readable.\\n - Re-check records after moving mailboxes between providers. DKIM selectors are provider-specific.\\n - Icemail lets you set or remove DMARC per domain from its dashboard.\\n\\n## Troubleshooting / FAQ\\n\\n - **SPF PASS but DKIM FAIL.** DKIM is not enabled in the provider's admin console, or the selector record is missing. In Google Admin: Apps â Google Workspace â Gmail â Authenticate email â Generate record â publish â Start authentication.\\n - **Two SPF records.** Merge them into one; two records is a permanent fail.\\n - **\\"SPF PermError: too many DNS lookups\\".** Remove unused includes; you have more than 10.\\n - **DMARC PASS requires alignment.** The From domain must match the SPF or DKIM domain. Sending from [email protected] through a provider that signs with its own domain fails alignment until DKIM is configured for your domain.\\n\\n## Related articles\\n\\n - How Icemail automates SPF, DKIM and DMARC â and replaces mailboxes for free\\n - Adding DNS records at Cloudflare, GoDaddy, Namecheap and Porkbun\\n - Domain forwarding and MX records for cold-email domains\\n - Deliverability fundamentals for cold email\\n - Landing in spam? The recovery playbook","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/13zDY0A8X45G7U5lmyqmzWyEwPZm2uEgIWtNKC0FDdp8/edit"},{"slug":"adding-dns-records-at-cloudflare-godaddy-namecheap-and-porkbun","title":"Adding DNS records at Cloudflare, GoDaddy, Namecheap and Porkbun","category":"mailbox-infrastructure","summary":"If you bring your own domain to OutreachFox, you add DNS records yourself: SPF, DKIM and DMARC for authentication, MX for inbound mail, and a CNAME for a custom tracking domain. This article shows â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nIf you bring your own domain to OutreachFox, you add DNS records yourself: SPF, DKIM and DMARC for authentication, MX for inbound mail, and a CNAME for a custom tracking domain. This article shows where the DNS editor lives at four common registrars and how to fill in each field. Domains bought through Icemail skip all of this.\\n\\n## Before you start\\n\\nHave these values ready:\\n\\n - **SPF** â TXT at @, e.g. v=spf1 include:\\\\_spf.google.com \\\\~all\\n - **DKIM** â TXT at google.\\\\_domainkey (Google) or two CNAMEs selector1.\\\\_domainkey / selector2.\\\\_domainkey (Microsoft), copied from the provider's admin console\\n - **DMARC** â TXT at \\\\_dmarc, e.g. v=DMARC1; p=none; rua=mailto:[email protected]\\n - **Tracking CNAME** â host and target shown in OutreachFox under **Domain â (domain) â Settings â custom tracking domain**\\n\\nField naming differs by registrar: \\"Name\\" = \\"Host\\" = \\"Record name\\"; \\"Value\\" = \\"Content\\" = \\"Points to\\" = \\"Answer\\".\\n\\n## Steps\\n\\n### Cloudflare\\n\\n1. Log in, select the domain, open **DNS â Records**.\\n2. Click **Add record**, choose the **Type**.\\n3. Enter **Name** (@, \\\\_dmarc, google.\\\\_domainkey, or link) and **Content**.\\n4. For the tracking CNAME, set **Proxy status** to **DNS only** (grey cloud). Proxied records break verification.\\n5. Click **Save**.\\n\\n### GoDaddy\\n\\n1. Log in â **My Products** â next to the domain click **DNS** (or **Manage DNS**).\\n2. Click **Add New Record**.\\n3. Choose **Type**, enter **Name** and **Value**, leave TTL at default.\\n4. Click **Save**. GoDaddy already has a default @ TXT and MX set; delete any existing SPF before adding yours.\\n\\n### Namecheap\\n\\n1. Log in â **Domain List** â **Manage** next to the domain â **Advanced DNS** tab.\\n2. Under **Host Records** click **Add New Record**.\\n3. Choose **Type**, enter **Host** and **Value**, TTL **Automatic**.\\n4. Click the green tick to save.\\n5. For MX, use the **Mail Settings** dropdown â **Custom MX** and add the provider's MX hosts with priorities.\\n\\n### Porkbun\\n\\n1. Log in â **Domain Management** â click the domain â **DNS Records** (the DNS link under the domain).\\n2. Choose **Type**, enter **Host** (leave blank for root) and **Answer**.\\n3. Click **Add**.\\n4. Delete Porkbun's default parked-page ALIAS/CNAME records for @ and \\\\* if you plan to forward the domain.\\n\\n## What you see afterwards\\n\\nWithin minutes to an hour the records resolve. Verify with a DNS lookup tool, then return to OutreachFox and click **Verify** for the tracking domain.\\n\\n## Tips\\n\\n - Enter only the subdomain part in the host field (\\\\_dmarc, not \\\\_dmarc.yourdomain.com). Most registrars append the domain automatically.\\n - Set TTL to 3600 or Automatic. Low TTLs are unnecessary.\\n - One SPF record only. If your registrar pre-created one, edit it rather than adding a second.\\n - If you move nameservers to Icemail so it can manage DNS, all records at the registrar stop being used. Do not manage records in two places.\\n\\n## Troubleshooting\\n\\n - **Record saved but lookup shows nothing.** Propagation can take up to 48 hours; usually under an hour. Also check the domain's nameservers actually point at the registrar whose DNS you edited.\\n - **Cloudflare tracking domain will not verify.** Turn off the proxy (orange cloud â grey cloud).\\n - **Namecheap DKIM value rejected as too long.** Paste the value as a single line with no quotes; Namecheap splits it automatically.\\n - **GoDaddy shows \\"record already exists\\".** Edit the existing record
99instead of adding a duplicate.\\n\\n## Related articles\\n\\n - SPF, DKIM and DMARC: what they are and how to check yours\\n - Set up a custom tracking domain\\n - Domain forwarding and MX records for cold-email domains\\n - How Icemail automates SPF, DKIM and DMARC â and replaces mailboxes for free\\n - Connect a Google Workspace mailbox\\n - Connect a Microsoft 365 / Outlook mailbox","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1qrt_nTNIhKvIFNViAlfM2I_RjNRb8i--g3zGH4r4Htg/edit"},{"slug":"domain-forwarding-and-mx-records-for-cold-email-domains","title":"Domain forwarding and MX records for cold-email domains","category":"mailbox-infrastructure","summary":"A cold-email domain should behave like a real company domain. Two things make that true: the domain forwards to a real website, and it can receive mail. Spam filters and curious prospects both checâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nA cold-email domain should behave like a real company domain. Two things make that true: the domain forwards to a real website, and it can receive mail. Spam filters and curious prospects both check. This article covers domain forwarding (redirects) and MX records for secondary sending domains, whether managed in Icemail or at your own registrar.\\n\\n## Why this matters\\n\\n - Filters such as Google's look at whether a From domain resolves to a live website. A parked page or DNS error is a spam signal.\\n - Prospects who type your domain into a browser should land on your real site, not an error.\\n - Without MX records, replies, bounces and out-of-office messages have nowhere to go. You lose replies and cannot detect bounces, which pushes bounce rate up.\\n - A domain that receives mail but has no mailbox to store it (a \\"null MX\\") is also a red flag.\\n\\n## Steps: set up domain forwarding\\n\\n### In Icemail\\n\\n1. Open **Icemail** from the OutreachFox dropdown (top-left icon â **Icemail**).\\n2. Open the domain and find the **forwarding** setting.\\n3. Enter your main website URL (for example https://www.acme.com).\\n4. Save. Icemail creates the redirect records; both acmehq.com and www.acmehq.com now redirect.\\n\\n### At a registrar\\n\\n1. Open the domain's DNS or **Forwarding** section (GoDaddy: **Forwarding**; Namecheap: **Domain â Redirect Domain**; Porkbun: **URL Forwarding**; Cloudflare: **Rules â Redirect Rules**).\\n2. Add a forward from @ and www to your main site.\\n3. Choose **301 (permanent)** and forward the whole domain, not a single path.\\n4. Remove any parked-page A/ALIAS records the registrar added.\\n5. Test by opening http://yourdomain.com and http://www.yourdomain.com in a private browser window.\\n\\n## Steps: set MX records\\n\\nIcemail sets MX automatically for domains it manages. For your own domains, add the provider's MX at your DNS host.\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Provider\\\\*\\\\* | \\\\*\\\\*MX host\\\\*\\\\* | \\\\*\\\\*Priority\\\\*\\\\* |\\n| Google Workspace | smtp.google.com | 1 |\\n| Microsoft 365 | yourdomain-com.mail.protection.outlook.com (copy from the M365 admin centre) | 0 |\\n| Icemail IMAP/SMTP mailboxes | Provided in the domain's DNS records in Icemail | as shown |\\n\\n1. Open the DNS editor for the domain.\\n2. Delete any placeholder MX records (registrar defaults such as mx1.parking...).\\n3. Add the provider's MX record(s) with the priorities shown.\\n4. Save and wait for propagation.\\n5. Send a test email to a mailbox on the domain and confirm it arrives.\\n\\n## What you see afterwards\\n\\nThe domain redirects to your main site, and test messages to the mailboxes arrive. In OutreachFox, replies to campaign emails show up in the campaign's replies and lead statuses update correctly.\\n\\n## Tips\\n\\n - Forward to the homepage or a landing page that matches what your emails talk about.\\n - Keep the main brand domain out of cold outreach entirely; it holds your transactional and team mail.\\n - If you use catch-all on a sending domain, monitor it: catch-all inboxes collect spam that can trigger provider alerts.\\n - Mailbox-level forwarding (copying inbound mail from a cold mailbox to a central inbox) is available in Icemail per mailbox. Use it when a team member handles replies for many mailboxes.\\n\\n## Troubleshooting\\n\\n - **Forward works for the root but not** **www****.** Add the www forward separately or add a CNAME www â @.\\n - **Redirect shows a certificate warning.** Use a forwarding service that issues SSL (Cloudflare, Porkbun, Icemail). Plain registrar forwards over HTTPS often do not.\\n - **Replies are missing.** Check MX with a lookup tool. If MX points at the registrar's parking host, the messages are being discarded.\\n - **Bounce rate looks like 0% but replies are also 0.** Almost always missing or wrong MX; bounces are not being received.\\n\\n## Related articles\\n\\n - Adding DNS records at Cloudflare, GoDaddy, Namecheap and Porkbun\\n - SPF, DKIM and DMARC: what they are and how to check yours\\n - Buy a domain through Icemail from inside OutreachFox\\n - Set up a custom tracking domain\\n - Deliverability fundamentals for cold email","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/114IyBkxL0pl-gquOKyEFmBDHHs96T8zPsv331teVucg/edit"},{"slug":"how-many-mailboxes-per-domain-and-domains-per-campaign","title":"How many mailboxes per domain and domains per campaign (best practice)","category":"mailbox-infrastru
99cture","summary":"Cold email scales horizontally: many mailboxes sending a little each, spread across many domains, rather than one mailbox sending a lot. This article gives the numbers to plan your infrastructure aâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nCold email scales horizontally: many mailboxes sending a little each, spread across many domains, rather than one mailbox sending a lot. This article gives the numbers to plan your infrastructure and shows where to set them in OutreachFox.\\n\\n## The numbers\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Setting\\\\*\\\\* | \\\\*\\\\*Recommended\\\\*\\\\* | \\\\*\\\\*Why\\\\*\\\\* |\\n| Campaign emails per mailbox per day | 30â50 (start at 20) | Above 50 looks like automation to Google and Microsoft |\\n| Warm-up emails per mailbox per day (ongoing) | 20â40 | Keeps positive engagement flowing alongside campaign volume |\\n| Mailboxes per domain | 2â3 | One burned mailbox does not take five others down with it |\\n| Domains per 1,000 emails/day | 8â10 | 1,000 ÷ 40 per mailbox = 25 mailboxes ÷ 3 = \\\\\\\\\\\\~9 domains |\\n| Mailboxes per campaign | As many as needed to hit daily volume | Rotation is automatic; more senders = lower per-sender load |\\n| Domains per campaign | Spread a campaign across all its domains | Never concentrate one campaign's volume on one domain |\\n| Bounce-rate pause threshold | 3% | Set in campaign advanced configurations |\\n\\n## Sizing example\\n\\nYou want to contact 5,000 prospects over 4 weeks with a 3-step sequence (â15,000 sends, â750/day on working days).\\n\\n1. 750 ÷ 40 per mailbox â 19 mailboxes.\\n2. 19 ÷ 3 per domain â 7 domains.\\n3. Buy 7 domains and 21 mailboxes through Icemail; warm up for 2â3 weeks; then launch.\\n\\n## Steps: apply the limits in OutreachFox\\n\\n1. Go to **Mailbox**.\\n2. Select all mailboxes in the batch (use the select-all checkbox at the top).\\n3. In the bulk actions bar, set **campaign emails per day** to 20 for newly warmed mailboxes; raise to 40â50 after two weeks of clean sending.\\n4. Open the campaign â **Edit Campaign** â **Settings** â **Show Advanced Configurations**.\\n5. Set **Daily new contacts limit** so total daily sends across all steps stays under (mailboxes à per-mailbox limit).\\n6. Set **Pause campaign when bounce rate reaches** to 3%.\\n7. Under **Sender Accounts**, add every mailbox from every domain reserved for this campaign.\\n8. Click **Save**, then **Resume Campaign** or **Launch Campaign**.\\n\\n## What you see afterwards\\n\\nThe campaign's daily send volume is capped by the sum of its sender accounts' limits, and OutreachFox rotates sends across mailboxes and domains.\\n\\n## Tips\\n\\n - Keep warm-up running on mailboxes that are in campaigns, at a reduced rate (around 20/day). Turning it off after launch is the most common reason health scores decay.\\n - Mix providers (Google + Microsoft) across domains and enable **Auto match leads** so recipients get mail from a matching ESP.\\n - Do not run more than one campaign at full volume from the same small set of mailboxes; the per-mailbox limit is global, so campaigns share it.\\n - Give every mailbox a real person's name and a signature. Five firstname@ accounts on a domain is normal; five sales1@â¦sales5@ is not.\\n - Retire and replace, rather than push, any mailbox whose health score stays below 70 for a week.\\n\\n## Troubleshooting\\n\\n - **Campaign sends fewer than expected.** The sender accounts' combined daily limit is lower than the campaign's daily new contacts limit plus follow-ups. Add mailboxes or raise limits gradually.\\n - **One domain has much higher bounce/spam than the rest.** Pause its mailboxes, check blacklists and DNS, and let the rest of the campaign continue.\\n - **Provider suspended a mailbox.** You exceeded provider limits (Google Workspace hard-caps at \\\\~2,000/day but flags far lower for cold mail). Stay in the 30â50 range.\\n\\n## Related articles\\n\\n - Buy mailboxes through Icemail
99(Google, Microsoft, IMAP/SMTP, Azure)\\n - Warmup best practices: how long, how fast, and when to launch\\n - Set campaign sending volume and daily limits\\n - Enable bounce protection (pause at X% bounce)\\n - Enable Auto match ESP\\n - Deliverability fundamentals for cold email","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1_DaTq7PZwsJN4Xtb8aE_TegfLNQXXUInqxKYujZ9fBI/edit"},{"slug":"pre-warmed-domains-and-mailboxes-explained","title":"Pre-warmed domains and mailboxes explained","category":"mailbox-infrastructure","summary":"A brand-new domain has no sending history, so the first two to three weeks after purchase are spent warming up before you can send campaigns. Pre-warmed domains are domains that Icemail registered â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nA brand-new domain has no sending history, so the first two to three weeks after purchase are spent warming up before you can send campaigns. Pre-warmed domains are domains that Icemail registered and warmed in advance. You buy them ready-aged, import the mailboxes, run a short top-up warm-up and launch within days instead of weeks.\\n\\n## What \\"pre-warmed\\" means\\n\\n - The domain was registered weeks or months ago, has full SPF/DKIM/DMARC and MX, and forwards to a live page.\\n - Mailboxes on it have been exchanging warm-up emails, so providers have seen consistent, engaged, low-volume sending.\\n - Reputation is real but modest. Pre-warmed does not mean \\"send 200 a day on day one\\".\\n\\n## When to buy pre-warmed\\n\\n - You have a campaign that must start this week.\\n - You lost a domain to a blocklist and need to replace capacity fast.\\n - You are testing a new market and do not want to wait three weeks to learn whether the offer works.\\n\\nWhen you have time, buying fresh domains and warming them yourself is cheaper and gives you full control over the history.\\n\\n## Steps\\n\\n1. Click the **OutreachFox** icon at the top-left and select **Icemail**.\\n2. Click **Add Domain** and look for the **pre-warmed domains** option (listed separately from **Buy Domains**).\\n3. Browse the available stock. Each listing shows the domain name, its age and the mailbox type already on it.\\n4. Choose a domain whose name fits your brand and add it to the cart. Buy several to spread volume.\\n5. Complete checkout from your wallet balance.\\n6. Return to OutreachFox: **Mailbox â Connect Mailbox â Import from Icemail**.\\n7. Select the imported mailboxes â **Enable Warm Up** â choose the profile for the mailbox type â **Enable Warmer**.\\n8. Run warm-up for 3â5 days, then add the mailboxes to a campaign with **campaign emails per day** set to 20â30. Raise to 40â50 after a week of clean stats.\\n\\n## What you see afterwards\\n\\nThe domain appears under **Domain** in OutreachFox and its mailboxes on the **Mailbox** page. On the mailbox's **Warm up** tab you see health and placement stats from the first day of your own warm-up.\\n\\n## Tips\\n\\n - Keep warm-up on permanently at a reduced rate, exactly as you would for a self-warmed mailbox.\\n - Set a custom tracking domain on the pre-warmed domain before launch.\\n - Check the domain's forwarding target in Icemail and repoint it to your website.\\n - Pre-warmed stock changes. If you need many domains with a naming pattern, fresh domains give you more choice.\\n\\n## FAQ\\n\\n - **Can I pre-warm my own domains?** Yes â buy domains and mailboxes ahead of when you need them and leave warm-up running. Domains you buy today are your pre-warmed domains in a month.\\n - **Does a pre-warmed domain make my copy safe?** No. Copy, list quality and volume still decide placement. A pre-warmed domain only removes the waiting period.\\n - **Is the domain name changeable?** No. You buy the domain as listed. Choose names that could plausibly belong to your company.\\n - **What if a pre-warmed domain performs badly?** Treat it like any other: pause its mailboxes, check blacklists, and use Icemail's free mailbox replacement if a mailbox is the problem.\\n\\n## Related articles\\n\\n - Buy a domain through Icemail from inside OutreachFox\\n - Buy mailboxes through Icemail
99(Google, Microsoft, IMAP/SMTP, Azure)\\n - Import your Icemail mailboxes into OutreachFox\\n - Warmup best practices: how long, how fast, and when to launch\\n - What is mailbox warmup and how it works in OutreachFox","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1J7i2Qyzw8TF4pE_aSjN8nB4KBu3_8rwjz1PSfGt8nd8/edit"},{"slug":"enable-warmup-on-your-mailboxes","title":"Enable warmup on your mailboxes","category":"warmup","summary":"Warming up a mailbox builds its sender reputation before you use it in campaigns, so your emails stay out of spam. You enable warm-up from the Mailbox page by selecting one or more mailboxes and asâ¦","body":"Warming up a mailbox builds its sender reputation before you use it in campaigns, so your emails stay out of spam. You enable warm-up from the Mailbox page by selecting one or more mailboxes and assigning a warm-up profile.\\n\\n## Prerequisites\\n\\n - At least one connected mailbox (imported from Icemail, or connected via Google Workspace / Office365 Outlook).\\n\\n## Steps\\n\\n1. In your OutreachFox account, click **Mailbox** on the left-hand side.\\n\\n\\n\\n\\n\\n2. Select the mailboxes you want to enable warm-up for. You can tick several at once.\\n\\n\\n\\n3. Click **Enable Warm Up**.\\n\\n\\n\\n\\n\\n4. Pick a warm-up profile from the list. Four profiles are available by default: **Custom Mailboxes**, **Azure**, **Microsoft** and **Google**. Choose the one matching the mailbox's provider (for example, Default Warmer for Google for Google Workspace mailboxes).\\n\\n\\n\\n\\n\\n5. Select the chosen profile.\\n\\n\\n\\n\\n\\n6. Click **Enable Warmer** to activate mailbox warm-up.\\n\\n\\n\\n## What you see afterwards\\n\\nThe selected mailboxes show a warm-up status on the **Mailbox** page. Warm-up emails start going out at the profile's starting volume and ramp up daily. Open a mailbox and click **Warm up** to see health, placement and history.\\n\\n## Why this matters\\n\\nProviders judge a mailbox by its history. A new mailbox that suddenly sends 50 cold emails a day looks like a spam account. Warm-up sends a small, rising number of emails between real mailboxes in the OutreachFox warm-up network; those emails get opened, replied to and pulled out of spam, which teaches Gmail and Microsoft that mail from this address is wanted.\\n\\n## Tips\\n\\n - Enable warm-up on every new mailbox the day it is connected. Idle time does not build reputation.\\n - Warm up for at least 14 days before adding a mailbox to a campaign; 2â3 weeks for a brand-new domain.\\n - Leave warm-up on after launch at a lower volume. Use the bulk actions bar to switch profiles for many mailboxes at once.\\n - To turn warm-up off, select the mailboxes and choose **Disable** in the warm-up bulk action.\\n\\n## Troubleshooting\\n\\n - **Enable Warm Up is greyed out.** No mailbox is selected, or the mailbox is still provisioning.\\n - **Warm-up shows as paused shortly after enabling.** The mailbox failed to send (wrong credentials, provider block, or SMTP/IMAP not enabled for Microsoft accounts). Reconnect the mailbox and re-enable.\\n - **Wrong profile chosen.** Select the mailbox, click **Enable Warm Up** again and pick a different profile; the new profile replaces the old one.\\n\\n## Related articles\\n\\n - Create and customise a warmup profile\\n - What is mailbox warmup and how it works in OutreachFox\\n - Warmup best practices: how long, how fast, and when to launch\\n - Read the warmup health dashboard\\n - Import your Icemail mailboxes into OutreachFox","video":{"src":"https://cdn.outreachfox.ai/help/videos/enable-warmup-on-your-mailboxes.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"c4f61d01-1908-45a9-aefc-f20a21f8973e"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/enable-warmup-on-your-mailboxes.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"c4f61d01-1908-45a9-aefc-f20a21f8973e"}],"_source_doc":"https://docs.google.com/document/d/1E3oOSlHxxGkcWXen_4IbYYZZ1-zxkmGmq1TK2Ld1GG4/edit"},{"slug":"create-and-customise-a-warmup-profile","title":"Create and customise a warmup profile","category":"warmup","summary":"A warm-up profile defines how many warm-up emails a mailbox sends each day and how fast that number ramps up. OutreachFox ships four default profiles and lets you create your own. You reach profileâ¦","body":"A warm-up profile defines how many warm-up emails a mailbox sends each day and how fast that number ramps up. OutreachFox ships four default profiles and lets you create your own. You reach profiles either from **Settings** or from **Manage Profiles
99** in the Enable Warm Up dialog.\\n\\n## The four default profiles\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Profile\\\\*\\\\* | \\\\*\\\\*Use for\\\\*\\\\* |\\n| \\\\*\\\\*Custom Mailboxes\\\\*\\\\* | IMAP/SMTP mailboxes and any provider not listed |\\n| \\\\*\\\\*Azure\\\\*\\\\* | Azure-based Microsoft mailboxes |\\n| \\\\*\\\\*Microsoft\\\\*\\\\* | Microsoft 365 / Outlook mailboxes |\\n| \\\\*\\\\*Google\\\\*\\\\* | Google Workspace mailboxes |\\n\\nEach is tuned to the provider's tolerance for volume ramp. Pick the matching one unless you have a reason to change it.\\n\\n## Steps: view and edit profiles from Settings\\n\\n1. In your OutreachFox account, look at the bottom-left and click **Settings**.\\n\\n\\n\\n\\n\\n2. In Settings, review the list of existing warm-up profiles.\\n\\n\\n\\n3. Note the four pre-created profiles: **Custom Mailboxes**, **Azure**, **Microsoft** and **Google**.\\n\\n\\n\\n4. To customise a profile, click it and adjust its settings as needed, then save.\\n\\n\\n\\n## Steps: create a custom profile while enabling warm-up\\n\\n1. Go to **Mailbox**, select the mailboxes and click **Enable Warm Up**.\\n2. Click **Manage Profiles**.\\n\\n\\n\\n3. Create a new profile. Set the number of warm-up emails sent daily, how quickly the volume ramps up, and the other preferences shown.\\n4. Save the profile, return to the list, select it and click **Enable Warmer**.\\n\\n## Recommended profile settings\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Setting\\\\*\\\\* | \\\\*\\\\*New domain\\\\*\\\\* | \\\\*\\\\*Aged domain / after launch\\\\*\\\\* |\\n| Starting emails per day | 3â5 | 15â20 |\\n| Daily increase | \\\\\\\\+2â3 per day | \\\\\\\\+5 per day |\\n| Maximum emails per day | 30â40 | 20â25 (reduced, running alongside campaigns) |\\n| Reply rate | 30â40% | 30â40% |\\n| Days to reach max | 10â14 | 3â5 |\\n\\nKeep the ramp slow for Google mailboxes and slightly slower again for Microsoft/Azure, which are more sensitive to sudden volume.\\n\\n## Tips\\n\\n - Create one profile per mailbox batch rather than editing a default. Name it by purpose: \\"Google â new domains\\", \\"Azure â in campaign\\".\\n - Editing a profile changes every mailbox that uses it. Check which mailboxes are on a profile before you change it.\\n - A high reply rate (30â40%) in warm-up produces more positive engagement signals than a high send volume.\\n - When a mailbox moves into a campaign, switch it to a reduced profile rather than turning warm-up off.\\n\\n## Troubleshooting\\n\\n - **Profile not appearing in the Enable Warm Up list.** Refresh the page; newly created profiles load on the next open of the dialog.\\n - **Mailboxes ramped too fast and health dropped.** Move them to a profile with a lower max and slower increase; health usually recovers in 5â7 days.\\n - **Cannot delete a default profile.** Defaults are fixed. Create a custom profile instead.\\n\\n## Related articles\\n\\n - Enable warmup on your mailboxes\\n - Warmup best practices: how long, how fast, and when to launch\\n - What is mailbox warmup and how it works in OutreachFox\\n - Read the warmup health dashboard\\n - Bulk ma","video":{"src":"https://cdn.outreachfox.ai/help/videos/create-and-customise-a-warmup-profile-1.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"57cd55f4-e29e-458d-b79b-681591ced9f6"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/create-and-customise-a-warmup-profile-1.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"57cd55f4-e29e-458d-b79b-681591ced9f6"},{"src":"https://cdn.outreachfox.ai/help/videos/create-and-customise-a-warmup-profile-2.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"0742ae2a-1122-4c0c-b23c-3f0fff654b85"}],"_source_doc":"https://docs.google.com/document/d/1iRHEQjA_xkJz_TWAYZNV85cK2ZPZlJZ55bRn5Qgpidg/edit"},{"slug":"read-the-warmup-health-dashboard","title":"Read the warmup health dashboard (health score, inbox vs spam placement, bounce rate)","category":"warmup","summary":"Each mailbox has a Warm up tab showing when warm-up started and four headline metrics: mailbox health, inbox placement, spam placement and bounce rate. Check it before adding a mailbox to a campaigâ¦","body":"Each mailbox has a **Warm up** tab showing when warm-up started and four headline metrics: mailbox health, inbox placement, spam placement and bounce rate. Check it before adding a mailbox to a campaign and weekly while it sends.\\n\\n## Steps\\n\\n1. Log in to your OutreachFox account.\\n\\n\\n\\n2. Click **Mailbox** in the main menu.\\n\\n\\n\\n3. Select the mailbox you want to analyse.\\n\\n\\n\\n4. Click **Warm up** to open its analytics.\\n\\n\\n\\n5. Review the dashboard. It shows when warm-up started and tracks mailbox health, inbox placement, spam placement and bounce rate.\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n## How to read each metric\\n\\n**Health score** â a composite of placement, bounces and engagement over the recent warm-up window, on a 0â100 scale.\\n\\n - 90â100: ready for campaigns at full daily limit.\\n - 70â89: usable, keep the campaign limit at 20â30/day and watch it.\\n - Below 70: not ready. Keep warming; if it stays under 70 for a week, investigate (see below) or replace the mailbox.\\n\\n**Inbox placement** â the share of warm-up emails that landed in the primary inbox of receiving mailboxes. Target 95%+. Below 90% means the mailbox or domain is being filtered.\\n\\n**Spam placement** â the share of warm-up emails that landed in spam before the warm-up network rescued them. Target under 5%. A spike on one day is normal; a rising trend over 3+ days is not.\\n\\n**Bounce rate** â the share of warm-up emails that could not be delivered. Should be near 0%. Any bounce in warm-up points at a mailbox or DNS problem, not list quality, because the warm-up network only uses valid addresses.\\n\\n## Tips\\n\\n - Compare mailboxes on the same domain. If all of them dip together, the domain (DNS, blacklist, content) is the cause. If one dips alone, the mailbox is.\\n - Check the dashboard on day 7 and day 14 of warm-up before you decide to launch.\\n - Do not launch from a mailbox showing spam placement above 10% regardless of health score.\\n\\n## Troubleshooting\\n\\n - **Health high but inbox placement low.** Health lags; placement is the leading indicator. Trust placement.\\n - **Bounce rate above 0% in warm-up.** Check that SPF/DKIM/DMARC pass and MX is set. For Microsoft mailboxes, confirm SMTP AUTH and IMAP are enabled.\\n - **Metrics frozen.** Warm-up is paused for the mailbox. See *Troubleshooting warmup*.\\n\\n## Related articles\\n\\n - Review warmup send/reply history and ESP breakdown\\n - Troubleshooting warmup (paused, low health score, high spam placement)\\n - Warmup best practices: how long, how fast, and when to launch\\n - Enable warmup on your mailboxes\\n - Inb","video":{"src":"https://cdn.outreachfox.ai/help/videos/read-the-warmup-health-dashboard.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"bce3e2f3-ebfc-4d16-a14e-3babf53ff488"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/read-the-warmup-health-dashboard.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"bce3e2f3-ebfc-4d16-a14e-3babf53ff488"}],"_source_doc":"https://docs.google.com/document/d/13-kdfIyP8leUDClFTxS66E3auvdhgAXqzCfLQc5XBfw/edit"}
99,{"slug":"review-warmup-send-reply-history-and-esp-breakdown","title":"Review warmup send/reply history and ESP breakdown","category":"warmup","summary":"Below the headline metrics on a mailbox's Warm up tab, OutreachFox shows the day-by-day history of warm-up emails sent and replies received, and a breakdown of placement by receiving email service â¦","body":"Below the headline metrics on a mailbox's **Warm up** tab, OutreachFox shows the day-by-day history of warm-up emails sent and replies received, and a breakdown of placement by receiving email service provider (ESP). Use these to confirm the ramp is running as planned and to see whether one provider is filtering you.\\n\\n## Prerequisites\\n\\n - A mailbox with warm-up enabled for at least a day.\\n\\n## Steps\\n\\n1. Go to **Mailbox**, select the mailbox and click **Warm up**.\\n2. Scroll down to view the exact history of sent emails and replies for that mailbox.\\n\\n\\n\\n\\n\\n3. Scroll further to see the ESP (Email Service Provider) breakdown.\\n\\n\\n\\n\\n\\n## Reading the send/reply history\\n\\nThe history lists, per day, how many warm-up emails the mailbox sent and how many replies it received.\\n\\n - **Sent** should rise in line with the profile's ramp (for example 5, 8, 11, 14 ⦠up to the max). A flat line at 0 means warm-up is paused or the mailbox cannot send.\\n - **Replies** should track the profile's reply rate (30â40% of sent). Replies are the strongest positive signal; a day with sends but no replies is worth a second look.\\n - The first day is often partial because warm-up started mid-day.\\n\\n## Reading the ESP breakdown\\n\\nThe breakdown groups warm-up recipients by provider â Google, Microsoft, and others â and shows inbox versus spam placement for each.\\n\\n - Placement is rarely uniform. A mailbox can be 98% inbox at Google and 80% at Microsoft.\\n - Compare the breakdown with your prospect list. If most of your leads are on Microsoft 365 and Microsoft placement is weak, fix that before launching, or route those leads to Microsoft mailboxes with **Auto match leads**.\\n - A single provider dropping while others stay high usually points to that provider's filtering (Microsoft is stricter with new domains) rather than a domain-wide problem.\\n\\n## Tips\\n\\n - Screenshot or note the day-14 numbers as a baseline. After launch, compare weekly; a drop of more than 10 points at any ESP is your early warning.\\n - Use the history to confirm a profile change took effect: the next day's send count should match the new profile.\\n - If you enable **Auto match leads** in a campaign, the ESP breakdown tells you which mailbox types you need more of.\\n\\n## Troubleshooting\\n\\n - **History shows sends but health is not improving.** Check the ESP breakdown; one provider may be putting everything in spam.\\n - **Replies far below the profile's reply rate.** The warm-up network replies to your mail; a low rate can mean your mailbox's inbound is broken (MX or IMAP). Send a test email to the mailbox and confirm it arrives.\\n - **ESP breakdown empty.** Not enough warm-up volume yet. Check again after 3â4 days.\\n\\n## Related articles\\n\\n - Read the warmup health dashboard\\n - Troubleshooting warmup (paused, low health score, high spam placement)\\n - Enable Auto match ESP\\n - Warmup best practices: how long, how fast, and when to launch\\n - Inbox placement","video":{"src":"https://cdn.outreachfox.ai/help/videos/review-warmup-send-reply-history-and-esp-breakdown.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"9a4b5054-c684-41d1-b767-3b1991e7f75b"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/review-warmup-send-reply-history-and-esp-breakdown.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"9a4b5054-c684-41d1-b767-3b1991e7f75b"}],"_source_doc":"https://docs.google.com/document/d/1z8vxiNiCEz2DUhyWTQ2AIsOd7y0VIpz4kl9suwz8TfM/edit"},{"slug":"what-is-mailbox-warmup-and-how-it-works-in-outreachfox","title":"What is mailbox warmup and how it works in OutreachFox","category":"warmup","summary":"Mailbox warm-up is the process of building a positive sending history for a mailbox before, and while, you use it for cold outreach. OutreachFox includes its own industry-tuned warm-up system: yourâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nMailbox warm-up is the process of building a positive sending history for a mailbox before, and while, you use it for cold outreach. OutreachFox includes its own industry-tuned warm-up system: your mailboxes exchange realistic emails with other mailboxes in the OutreachFox warm-up network, and those emails are opened, replied to, marked important and rescued from spam. Providers see wanted, engaged mail and rate the mailbox accordingly.\\n\\n## Why it is needed\\n\\nGmail and Microsoft assign every sending address and domain a reputation. A new address has none, and a new domain is treated with suspicion. If the first thing a mailbox does is send 50 unsolicited emails a day, the provider classifies it as a spam source within days and the mailbox is effectively burned. Warm-up front-loads the good history so campaign mail arrives from a known, trusted sender.\\n\\n## How OutreachFox warm-up works\\n\\n1. **Warm-up network.** All mailboxes with warm-up enabled form a private pool. Your mailbox sends to and receives from other real mailboxes across Google, Microsoft and other providers â not from a single test server.\\n2. **Realistic conversations.** Warm-up emails are threaded, varied, human-length messages with subjects and replies. They do not contain marketing content or links.\\n3. **Engagement actions.** Receiving mailboxes open the email, reply to a percentage of them, and if a message landed in spam, move it to the inbox and mark it not spam. This is the signal that repairs reputation.\\n4. **Ramp-up.** A warm-up profile controls volume: start at a few emails a day and increase daily until the max is reached (usually 10â14 days). See *Create and customise a warmup profile*.\\n5. **Provi
99der-specific tuning.** The four default profiles (Custom Mailboxes, Azure, Microsoft, Google) apply different ramps because each provider tolerates volume differently.\\n6. **Continuous monitoring.** The mailbox's **Warm up** tab reports health score, inbox placement, spam placement, bounce rate, daily send/reply history and an ESP breakdown.\\n7. **Runs alongside campaigns.** Warm-up keeps going after launch at a reduced level, so engagement signals keep flowing while campaign mail â which gets far fewer replies â goes out.\\n\\n## Where you control it\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Task\\\\*\\\\* | \\\\*\\\\*Path\\\\*\\\\* |\\n| Turn on | \\\\*\\\\*Mailbox\\\\*\\\\* â select mailboxes â \\\\*\\\\*Enable Warm Up\\\\*\\\\* â choose profile â \\\\*\\\\*Enable Warmer\\\\*\\\\* |\\n| Change or create a profile | \\\\*\\\\*Settings\\\\*\\\\* (bottom-left) â warm-up profiles, or \\\\*\\\\*Manage Profiles\\\\*\\\\* in the Enable Warm Up dialog |\\n| Bulk enable/disable | \\\\*\\\\*Mailbox\\\\*\\\\* â select all â bulk actions â \\\\*\\\\*Warm Up\\\\*\\\\* â \\\\*\\\\*Enable\\\\*\\\\* / \\\\*\\\\*Disable\\\\*\\\\* |\\n| See stats | \\\\*\\\\*Mailbox\\\\*\\\\* â mailbox â \\\\*\\\\*Warm up\\\\*\\\\* tab |\\n\\n## What warm-up does not do\\n\\n - It does not fix missing SPF, DKIM or DMARC. Authentication must be in place first.\\n - It does not repair a blacklisted domain. Check blocklists separately.\\n - It does not make bad lists or spammy copy deliverable. Warm-up protects reputation; campaigns spend it.\\n\\n## Timeline\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Day\\\\*\\\\* | \\\\*\\\\*What happens\\\\*\\\\* |\\n| 0 | Mailbox connected, warm-up enabled, 3â5 emails sent |\\n| 1â7 | Volume ramps +2â3/day; placement stabilises; health score appears |\\n| 7â14 | Volume reaches 30â40/day; check health, placement, ESP breakdown |\\n| 14+ | Add to campaign at 20â30 emails/day; switch to a reduced warm-up profile |\\n| 21+ | Raise campaign limit to 40â50/day if bounce \\\\\\\\\\\\<3% and spam placement \\\\\\\\\\\\<5% |\\n\\n## FAQ\\n\\n - **Can recipients see warm-up emails?** No. Warm-up emails only go to other warm-up network mailboxes. OutreachFox files them out of the way in the receiving mailbox.\\n - **Does warm-up count against my campaign limit?** No. Campaign emails per day and warm-up emails per day are separate settings.\\n - **Should I ever turn it off?** Only when retiring a mailbox. Keep it on at reduced volume for as long as the mailbox sends campaigns.\\n\\n## Related articles\\n\\n - Enable warmup on your mailboxes\\n - Create and customise a warmup profile\\n - Warmup best practices: how long, how fast, and when to launch\\n - Read the warmup health dashboard\\n - Troubleshooting warmup (paused, low health score, high spam placement)\\n - Deliverability fundamentals for cold email","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1P6iWUg2qTadk1efhTjL8FRL8EqYhMVq22hJh0cs4dIU/edit"},{"slug":"warmup-best-practices","title":"Warmup best practices: how long, how fast, and when to launch","category":"warmup","summary":"Most deliverability problems trace back to one of three warm-up mistakes: launching too early, ramping too fast, or switching warm-up off once campaigns start. This article gives the numbers that aâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nMost deliverability problems trace back to one of three warm-up mistakes: launching too early, ramping too fast, or switching warm-up off once campaigns start. This article gives the numbers that avoid all three and shows where to apply them in OutreachFox.\\n\\n## How long\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Situation\\\\*\\\\* | \\\\*\\\\*Minimum warm-up before campaign use\\\\*\\\\* |\\n| New domain, new mailbox | 14 days; 21 is safer |\\n| Aged domain (6+ months of real use), new mailbox | 7â10 days |\\n| Pre-warmed domain from Icemail | 3â5 days |\\n| Existing mailbox that has sent real mail for months | 5â7 days |\\n| Mailbox recovering from spam placement | Until spam placement is under 5% for 5 straight days |\\n\\nThe **Warm up** tab shows the start date. Do not count days before the mailbox actually sent.\\n\\n## How fast\\n\\nSet these in the warm-up profile (**Settings** â warm-up profiles, or **Manage Profiles
99** in the Enable Warm Up dialog):\\n\\n - **Start:** 3â5 emails/day for new domains, 10â15 for aged ones.\\n - **Increase:** +2â3 per day (Google), +2 per day (Microsoft/Azure), +3â5 (IMAP/SMTP with a good sending host).\\n - **Max:** 30â40/day during the pre-launch phase.\\n - **Reply rate:** 30â40%.\\n - **After launch:** drop the max to 20â25/day and keep it there.\\n\\nRamping faster than +5/day is the most common cause of a health score that climbs and then collapses around day 8â10.\\n\\n## When to launch\\n\\nLaunch a mailbox into a campaign only when, on the **Warm up** tab:\\n\\n - Health score is 85+ (90+ preferred).\\n - Inbox placement is 95%+.\\n - Spam placement is under 5%.\\n - Bounce rate is 0%.\\n - The ESP breakdown shows no provider below 85% inbox.\\n - At least 14 days have elapsed (see table above).\\n\\nThen:\\n\\n1. Go to **Mailbox**, select the mailboxes, and use the bulk actions bar to set **campaign emails per day** to 20â30.\\n2. Select them again â **Enable Warm Up** â choose a reduced profile (max 20â25/day) â **Enable Warmer**.\\n3. Add them as **Sender Accounts** in the campaign and launch.\\n4. After 7 days, if bounce is under 3% and spam placement is still under 5%, raise the campaign limit to 40â50/day.\\n\\n## Steps: weekly warm-up review\\n\\n1. Go to **Mailbox** and sort or scan by health.\\n2. Open any mailbox under 80 â **Warm up** tab.\\n3. Check the ESP breakdown to see which provider is filtering.\\n4. If spam placement is over 10%, remove the mailbox from campaigns (uncheck it under the campaign's Sender Accounts) and let warm-up run alone for a week.\\n5. If it does not recover, replace it through Icemail's free mailbox replacement.\\n\\n## Tips\\n\\n - Stagger new batches. Warming 30 mailboxes on one domain at once creates a volume spike at the domain level; spread them over 2â3 domains.\\n - Never run warm-up and campaigns from a mailbox whose daily total (warm-up + campaign) exceeds about 70.\\n - Use provider-matched profiles. Google mailboxes on the Microsoft profile ramp too slowly; Microsoft on Google ramps too fast.\\n - Keep one or two spare warmed mailboxes per domain so you can swap out a struggling one without pausing the campaign.\\n - Warm-up cannot compensate for a purchased list with 10% invali
99d addresses. Verify lists before launch and set the bounce pause at 3%.\\n\\n## Troubleshooting\\n\\n - **Health drops the day campaigns start.** Campaign limit too high for the mailbox's age. Halve it and increase weekly.\\n - **Health fine, but campaign replies are low.** Deliverability is not the issue; look at copy, targeting and send timing.\\n - **Health never gets above 70.** Check DNS and blacklists for the domain; if clean, replace the mailbox.\\n\\n## Related articles\\n\\n - What is mailbox warmup and how it works in OutreachFox\\n - Create and customise a warmup profile\\n - Read the warmup health dashboard\\n - Troubleshooting warmup (paused, low health score, high spam placement)\\n - How many mailboxes per domain and domains per campaign (best practice)\\n - Pre-warmed domains and mailboxes explained","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1xziOIYMefo75LB_VZ3ruePTIaNO_9cxZ4zpL9gzFP6k/edit"},{"slug":"troubleshooting-warmup","title":"Troubleshooting warmup (paused, low health score, high spam placement)","category":"warmup","summary":"Warm-up problems show up in three ways on the Mailbox page and a mailbox's Warm up tab: warm-up has paused, the health score is low, or spam placement is high. Each has a short list of likely causeâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nWarm-up problems show up in three ways on the **Mailbox** page and a mailbox's **Warm up** tab: warm-up has paused, the health score is low, or spam placement is high. Each has a short list of likely causes. Work through them in order.\\n\\n## Warm-up is paused\\n\\nWarm-up pauses when the mailbox cannot send or receive.\\n\\n1. Go to **Mailbox** and open the mailbox. Note any error shown next to its status.\\n2. **Credentials expired or password changed.** Reconnect: **Mailbox â Connect Mailbox**, choose the provider, and re-authorise (**Connect with Google** / **Connect with Outlook**). For Icemail mailboxes, re-run **Import from Icemail**.\\n3. **Microsoft mailbox: SMTP AUTH or IMAP disabled.** In the Microsoft 365 admin centre â **Active Users** â the user â **Mail** â **Manage Email Apps** â enable **Authenticated SMTP** and **IMAP**.\\n4. **Google Workspace: app no longer trusted.** In Google Admin â **Security â API controls â Manage App Access**, confirm the OutreachFox app is **Trusted**.\\n5. **Provider suspended the account** for suspicious activity. Log in to the mailbox directly, complete any verification, then re-enable warm-up. If suspensions repeat, replace the mailbox.\\n6. **Sending limit hit.** Warm-up plus campaign volume exceeded the provider's cap. Lower the campaign limit and the warm-up max.\\n7. Select the mailbox â **Enable Warm Up** â choose the profile â **Enable Warmer** to resume.\\n\\n## Health score is low (under 70)\\n\\n1. Check **how long** warm-up has run. Under 7 days, a low score is normal; wait.\\n2. Check the **ramp**. If the profile increases by more than +5/day or started above 10/day on a new domain, move the mailbox to a slower profile.\\n3. Check **authentication**: SPF, DKIM and DMARC must all PASS. Send a test to Gmail and use Show original.\\n4. Check **blacklists** for the domain and, for IMAP/SMTP mailboxes, the sending IP (see *Blacklist monitoring*).\\n5. Check whether **all mailboxes on the domain** are low. If yes, the domain is the problem (DNS, blacklist, or too much total volume). If only one, the mailbox is; replace it via Icemail.\\n6. Remove the mailbox from campaigns for 7 days and let warm-up run alone.\\n\\n## Spam placement is high (over 10%)\\n\\n1. Open the **ESP breakdown** on the Warm up tab. If one provider is responsible, the fix is provider-specific (Microsoft is strict with new domains â slow the ramp and give it another week).\\n2. Reduce the profile max by half for 5â7 days. Rescues from spam are how warm-up repairs reputation, so keep it running; just at lower volume.\\n3. Confirm the domain **forwards to a real website** and has **MX** set.\\n4. If the mailbox is also in a campaign, check that campaign's bounce rate and reply rate. A campaign with bounces over 3% or spam complaints will drag warm-up placement down. Pause the campaign for that mailbox.\\n5. If spam placement stays above 20% for 10 days, replace the mailbox. If every mailbox on the domain is affected, replace the domain.\\n\\n## Quick reference\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Symptom\\\\*\\\\* | \\\\*\\\\*Most likely cause\\\\*\\\\* | \\\\*\\\\*First fix\\\\*\\\\* |\\n| Paused within hours of enabling | Auth failure | Reconnect mailbox |\\n| Sends 0, replies 0 | Provider block or wrong credentials | Log in to the mailbox directly |\\n| Sends fine, replies 0 | Inbound broken (MX/IMAP) | Send a test email to the mailbox |\\n| Health rises then crashes \\\\\\\\\\\\~day 8 | Ramp too fast | Slower profile |\\n| One ESP at 60% inbox, rest at 95% | Provider-specific filtering | Slow ramp, wait, use Auto match leads |\\n| All mailboxes on a domain low | Domain DNS or blacklist | Check records and blocklists |\\n\\n## Tips\\n\\n - Change one thing at a time and give it 3â5 days; warm-up metrics lag.\\n - Keep spare warmed mailboxes so a troubled one can leave the campaign without hurting volume.\\n - Free replacements exist for a reason. Do not spend weeks nursing a burned mailbox.\\n\\n## Related articles\\n\\n - Read the warmup health dashboard\\n - Review warmup send/reply history and ESP breakdown\\n - Warmup best practices: how long, how fast, and when to launch\\n - Blacklist monitoring: how to check and delist a domain or IP\\n - How Icemail automates
99SPF, DKIM and DMARC â and replaces mailboxes for free\\n - Connect a Microsoft 365 / Outlook mailbox\\n - Connect a Google Workspace mailbox","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/12DkZLPgNcG8qIITTxGyMcGpPBQebsIo4OMmxGo3rvJw/edit"},{"slug":"lead-database-overview-search-by-icp-filters","title":"Lead database overview: search by ICP filters","category":"data-enrichment","summary":"The lead database lets you find prospects inside OutreachFox instead of buying lists elsewhere. You describe your ideal customer profile (ICP) with filters such as job title, industry, company sizeâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThe lead database lets you find prospects inside OutreachFox instead of buying lists elsewhere. You describe your ideal customer profile (ICP) with filters such as job title, industry, company size and location, review the matching people, and unlock their verified emails with credits. Behind the search, OutreachFox runs waterfall enrichment across 50+ data providers, so the results combine several sources rather than one vendor's database.\\n\\n## Where to find it\\n\\nClick **Lead List** in the left navigation, then **New List** (or **Find Leads**). The search page has a filter panel on the left and results on the right.\\n\\n## Steps\\n\\n1. Click **Lead List** â **New List**.\\n2. Name the list; it is where unlocked leads will be saved.\\n3. Set **People** filters:\\n\\n - **Job title**: enter titles or pick seniority levels (C-level, VP, Director, Manager). Use several synonyms: Head of Sales, VP Sales, Sales Director.\\n - **Department** or **function**.\\n - **Location**: country, state or city of the person.\\n4. Set **Company** filters:\\n\\n - **Industry**.\\n - **Employee count** (for example 51â200).\\n - **Revenue** range, if available.\\n - **Company location** or HQ country.\\n - **Technologies used** (for tech-stack targeting).\\n - **Keywords** in the company description.\\n5. Click **Search**. The result count and a preview of the matching people appear.\\n6. Refine until the count is in the range you can work with (a few hundred to a few thousand).\\n7. Select the leads you want (tick individually or use select-all with a cap) and click **Unlock** to reveal emails (see *Unlock verified emails and how credits are charged*).\\n8. Unlocked leads are saved to the list and are ready to push into a campaign.\\n\\n## Building a good ICP search\\n\\n - Start narrow and widen. VP Marketing at SaaS, 51â500 employees, United States gives a tight, relevant set. Add Head of Marketing and CMO only if you need more volume.\\n - Exclude what you do not want: current customers (upload a suppression list), competitors, and irrelevant industries.\\n - Company size is the strongest predictor of fit for most B2B offers. Pick a band, not \\"all\\".\\n - Save each search's filters in the list name: VP Mktg â SaaS â 51-500 â US â Sep26.\\n\\n## Tips\\n\\n - Search results show counts before you spend credits. Iterate on filters for free.\\n - Do not unlock more than you can contact in the next 30 days; data decays and credits are better spent on fresh pulls.\\n - Titles vary by region: Managing Director in the UK is often a CEO-equivalent; Director in the US is mid-level.\\n - Combine a technology filter with an industry filter for the highest reply rates; the message can reference the tool they use.\\n\\n## Troubleshooting\\n\\n - **Too few results**: remove the least important filter first (usually revenue or technology), then widen the employee band.\\n - **Results are mostly the wrong seniority**: add seniority-level filters rather than more title keywords.\\n - **Duplicate people across searches**: leads already unlocked are not charged again; duplicates are skipped when pushing to a campaign.\\n\\n## Related articles\\n\\n - Unlock verified emails and how credits are charged\\n - Email verification: how it works and what each status means\\n - Push found leads straight into a campaign\\n - Waterfall enrichment: append data fields to your contacts","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1L1OQABqKjCWQOOEBSB3JDTeYKEHygy3JTQFr6bkplR4/edit"}
99,{"slug":"unlock-verified-emails-and-how-credits-are-charged","title":"Unlock verified emails and how credits are charged","category":"data-enrichment","summary":"Searching the lead database is free. Revealing a person's email address costs credits. OutreachFox finds the address through waterfall enrichment across 50+ data providers, verifies it, and only châ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nSearching the lead database is free. Revealing a person's email address costs credits. OutreachFox finds the address through waterfall enrichment across 50+ data providers, verifies it, and only charges you when it delivers a verified result. This article explains the unlock flow, the credit rules, and how to keep credit spend efficient.\\n\\n## Prerequisites\\n\\n - A workspace with credits (see your plan under **Settings** â **Billing** / **Credits**).\\n - A lead search with results (see *Lead database overview: search by ICP filters*).\\n\\n## Steps\\n\\n1. In **Lead List**, open your search results.\\n2. Tick the leads to unlock, or tick select-all. Set a maximum number if you only want the first N results.\\n3. Click **Unlock** (or **Reveal emails**).\\n4. Confirm the estimated credit cost shown in the dialog.\\n5. Wait for the job to finish. Progress is shown at the top of the list; large batches take a few minutes because each lead is checked against several providers in sequence.\\n6. Unlocked leads now show the email, its verification status, and any extra fields the providers returned (phone, LinkedIn URL, company data).\\n\\n## How credits are charged\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Result\\\\*\\\\* | \\\\*\\\\*Charged?\\\\*\\\\* |\\n| \\\\*\\\\*Verified\\\\*\\\\* email found | Yes, 1 credit per lead |\\n| \\\\*\\\\*Catch-all / accept-all\\\\*\\\\* email found | Yes, 1 credit (address exists at a domain that accepts everything; treat as risky) |\\n| \\\\*\\\\*No email found\\\\*\\\\* after the full waterfall | No |\\n| Lead already unlocked in this workspace | No, the existing data is reused |\\n| Phone number reveal (where offered) | Separate credit rate, shown before you confirm |\\n\\nCredits are deducted per lead, not per provider queried. If the first provider has nothing and the fifth has a verified address, that is still one credit.\\n\\n## Checking your balance\\n\\nGo to **Settings** â **Credits**. You see the current balance, usage this period, and the renewal date. Monthly plan credits reset; purchased top-up credits roll over.\\n\\n## Tips\\n\\n - Unlock in batches of 100â500 and push each batch to a campaign before unlocking the next. This keeps addresses fresh and lets you check the bounce rate before spending more.\\n - Filter out **catch-all** results into their own list and send them from a separate campaign with a lower daily limit and bounce protection at 2%.\\n - Always dedupe against your CRM before unlocking; existing customers and open opportunities waste credits.\\n - Set an alert or check the balance weekly if several people share the workspace.\\n\\n## Troubleshooting\\n\\n - **Unlock finished with fewer emails than leads selected**: some leads had no findable email. You were not charged for those.\\n - **\\"Insufficient credits\\"**: buy a top-up under **Settings** â **Credits** or unlock a smaller batch.\\n - **An unlocked email bounced**: verification is a point-in-time check. Report it (where the option exists) and remove the lead; typical residual bounce on verified data is 1â2%.\\n\\n## Related articles\\n\\n - Lead database overview: search by ICP filters\\n - Email verification: how it works and what each status means\\n - Push found leads straight into a campaign\\n - Managing bounced leads and cleaning your lists","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/19m3bnWQMtOnlExIk0LCvyhhhIYmJOktEc14xoirtOH8/edit"},{"slug":"email-verification-how-it-works-and-what-each-status-means","title":"Email verification: how it works and what each status means","category":"data-enrichment","summary":"Email verification checks whether an address can receive mail before you send to it. Every email unlocked from the lead database is verified automatically, and you can run verification on lists youâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nEmail verification checks whether an address can receive mail before you send to it. Every email unlocked from the lead database is verified automatically, and you can run verification on lists you upload yourself. Verified lists keep the bounce rate under 2â3%, which is the line between healthy and damaged sender reputation.\\n\\n## How verification works\\n\\nEach address goes through a sequence of checks:\\n\\n1. **Syntax**: is it a well-formed address.\\n2. **Domain**: does the domain exist and have MX records (a mail server).\\n3. **Disposable / role check**: is it a throwaway domain or a role address such as info@.\\n4. **Mailbox check**: OutreachFox connects to the mail server and asks whether the mailbox exists, without sending an email.\\n5. **Catch-all detection**: if the server says yes to a random made-up address, the domain accepts everything and the mailbox check is inconclusive.\\n\\n## Statuses\\n\\
99n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Status\\\\*\\\\* | \\\\*\\\\*Meaning\\\\*\\\\* | \\\\*\\\\*Send?\\\\*\\\\* |\\n| \\\\*\\\\*Valid\\\\*\\\\* | Mailbox exists and accepts mail. | Yes |\\n| \\\\*\\\\*Catch-all\\\\*\\\\* (accept-all) | Domain accepts any address, so the mailbox cannot be confirmed. Roughly 60â80% of these are real. | Yes, but isolate them in a separate campaign with bounce protection at 2% |\\n| \\\\*\\\\*Risky\\\\*\\\\* | Server responded ambiguously (greylisting, timeout), or the address is a role account. | Only after a second verification pass |\\n| \\\\*\\\\*Invalid\\\\*\\\\* | Mailbox does not exist, domain has no mail server, or syntax is wrong. | No |\\n| \\\\*\\\\*Unknown\\\\*\\\\* | Server could not be reached in time. | Re-verify later |\\n| \\\\*\\\\*Disposable\\\\*\\\\* | Temporary-email domain. | No |\\n\\n## Steps: verify an uploaded list\\n\\n1. Click **Contacts** and open the list.\\n2. Select the contacts (select-all for the whole list).\\n3. Choose **Verify emails** from the actions menu.\\n4. Confirm the credit cost if your plan charges for verification.\\n5. When the job completes, each contact shows a verification status column. Filter by status to remove **Invalid** and **Disposable** contacts and to separate **Catch-all**.\\n\\n## Tips\\n\\n - Verify every externally sourced list before uploading to a campaign, even if the vendor says it is verified. Vendor verification is often weeks old.\\n - Re-verify lists older than 90 days; addresses decay at 2â3% per month.\\n - Do not send to **Risky** or **Unknown** without a second pass; a second pass a day later usually resolves most of them.\\n - Combine with **Pause campaign when bounce rate reaches 3%** on the campaign so any residual bad addresses are caught early.\\n\\n## Troubleshooting\\n\\n - **Everything comes back Catch-all**: your list is dominated by large companies, which commonly run catch-all domains. That is normal; send them at lower volume.\\n - **Verified list still bounced above 3%**: check whether the bounces come from one sending mailbox (a mailbox problem) or are spread evenly (a data problem). Also check for a high share of catch-all addresses.\\n - **Verification is slow**: mailbox checks are rate-limited by the receiving servers; 10,000 addresses can take an hour.\\n\\n## Related articles\\n\\n - Unlock verified emails and how credits are charged\\n - Managing bounced leads and cleaning your lists\\n - Bounce protection: auto-pause a campaign at a bounce-rate threshold\\n - Upload a CSV of contacts and assign it to a list","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/13j-I7HYRSAoY7Uxc2cWaMxPYgtlzGFY47XPyeKOYdfU/edit"},{"slug":"waterfall-enrichment-append-data-fields-to-your-contacts","title":"Waterfall enrichment: append data fields to your contacts","category":"data-enrichment","summary":"Waterfall enrichment fills in missing data on contacts you already have. Instead of querying one data vendor and accepting whatever it returns, OutreachFox asks provider after provider, in order, uâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nWaterfall enrichment fills in missing data on contacts you already have. Instead of querying one data vendor and accepting whatever it returns, OutreachFox asks provider after provider, in order, until a verified value is found, across 50+ data providers. The result is higher fill rates than any single source: a list with 40% emails can typically come back with 70â85%.\\n\\n## What you can enrich\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Field group\\\\*\\\\* | \\\\*\\\\*Examples\\\\*\\\\* |\\n| \\\\*\\\\*Contact\\\\*\\\\* | Work email, direct phone, mobile, LinkedIn URL |\\n| \\\\*\\\\*Person\\\\*\\\\* | Current title, seniority, department, location |\\n| \\\\*\\\\*Company\\\\*\\\\* | Website, industry, employee count, revenue range, HQ location, founded year, LinkedIn URL |\\n| \\\\*\\\\*Technographics\\\\*\\\\* | Tools detected on the company's website |\\n| \\\\*\\\\*Signals\\\\*\\\\* | Recent funding, hiring, job change (where available) |\\n\\n## Prerequisites\\n\\n - Contacts in a list under **Contacts**, with at least a name and company (or a LinkedIn URL, or an email) so providers can match the person.\\n - Credits. Enrichment is charged per
99contact per field group that returns a value; nothing is charged when nothing is found.\\n\\n## Steps\\n\\n1. Click **Contacts** and open the list to enrich.\\n2. Select the contacts (select-all for the whole list).\\n3. Choose **Enrich** from the actions menu.\\n4. Tick the fields to append: for example **Work email** and **Company size**. Untick fields you already have to save credits.\\n5. Review the estimated credit cost and click **Start enrichment**.\\n6. Wait for the job to finish. Progress is shown on the list. Large lists run in the background; you can leave the page.\\n7. New values are written to the matching contact fields. Existing values are kept unless you chose to overwrite.\\n\\nEnriched fields are immediately available as **Variables** in the sequence editor.\\n\\n## How the waterfall decides\\n\\n1. Providers are ordered by historical accuracy for the field and region.\\n2. The first provider is queried; if it returns a value, the value is verified (emails via mailbox check).\\n3. If verification fails or nothing is returned, the next provider is queried.\\n4. The first verified value wins; remaining providers are skipped, and you are charged once.\\n\\n## Tips\\n\\n - Enrich before uploading to a campaign, not after; that way the mapping and variables are ready at launch.\\n - Include the **LinkedIn URL** in your upload when you have it. It is the most reliable matching key across providers.\\n - Use **Company size** and **Industry** enrichment to segment a mixed list into separate campaigns with different copy.\\n - Enrich in batches and review a sample of 20 contacts for accuracy before running the full list.\\n\\n## Troubleshooting\\n\\n - **Low fill rate for emails**: contacts lack company domain or full name. Add a website or company name column and re-run.\\n - **Title is out of date**: providers refresh at different rates. Re-enrich only the **Title** field, which queries a different provider order.\\n - **Enrichment overwrote a field I wanted to keep**: choose **Keep existing values** in the enrichment dialog next time; restore from your original CSV via **Merge** on upload.\\n\\n## Related articles\\n\\n - AI enrichment: generate personalised first lines\\n - Unlock verified emails and how credits are charged\\n - Email verification: how it works and what each status means\\n - Handle duplicates and map CSV columns to contact fields","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1HevolL17QXMDtzGgDYPdRzdkwpfPi4xggi09GkT38mo/edit"},{"slug":"ai-enrichment-generate-personalised-first-lines","title":"AI enrichment: generate personalised first lines","category":"data-enrichment","summary":"AI enrichment writes a short, specific opening line for each contact using what OutreachFox knows about them: their title, company, website, LinkedIn profile and any enriched fields. The line is stâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nAI enrichment writes a short, specific opening line for each contact using what OutreachFox knows about them: their title, company, website, LinkedIn profile and any enriched fields. The line is stored in a custom field and inserted into your email with a variable, so every email opens with something that could only have been written for that person. Done well, personalised first lines lift reply rates by 30â50% over a generic opener.\\n\\n## Prerequisites\\n\\n - Contacts in a list with, at minimum, company name and website or LinkedIn URL. More data produces better lines; run waterfall enrichment first if fields are missing.\\n - Credits. AI enrichment is charged per generated line.\\n\\n## Steps\\n\\n1. Click **Contacts** and open the list.\\n2. Select the contacts.\\n3. Choose **AI enrich** (or **Generate first lines**) from the actions menu.\\n4. Choose a template or write your own prompt. A working starting prompt:\\n\\nWrite one sentence (max 20 words) that shows I looked at {{company}}'s website and understand what they do. Reference a specific product, customer or claim. No flattery, no exclamation marks, no \\"I noticed\\".\\n\\n1. Choose the output field, for example a custom field named first\\\\_line.\\n2. Generate a **sample** of 5â10 lines and read them. Adjust the prompt until you would send them yourself.\\n3. Click **Generate** to run the full list.\\n4. When the job finishes, spot-check 20 lines. Edit or clear any that are wrong.\\n\\n## Steps: use the line in your sequence\\n\\n1. Open the campaign's sequence editor.\\n2. Place the cursor at the start of the email body.\\n3. Click **Variables** and pick first\\\\_line.\\n4. Write the rest of the email as usual. Use **Preview** to see the line rendered for real contacts.\\n5. Provide a fallback (in the variable options, or with **Spintext**) for contacts where the line is empty, for example Saw {{company}} is hiring in sales.\\n\\n## What a good first line looks like\\n\\n - Specific: names a product, page, post or number from the company.\\n - Short: under 20 words.\\n - Plain: no compliments, no \\"I was impressed by\\".\\n - Relevant: connects to the reason you are writing.\\n\\nExample: Your pricing page lists a 14-day trial for teams under 50, which is exactly the segment we help onboard.\\n\\n## Tips\\n\\n - Constrain the model in the prompt: word limit, banned phrases, what to reference. Vague prompts produce vague lines.\\n - Generate for one ICP at a time; a prompt tuned for SaaS founders reads wrong for hospital administrators.\\n - Do not stack AI lines with heavy spintext;
99 one personalised sentence plus a clear, short email beats a paragraph of variation.\\n - Re-run on contacts whose title or company changed after re-enrichment.\\n\\n## Troubleshooting\\n\\n - **Lines are generic (\\"your company does great work\\")**: the contact lacks a website or LinkedIn URL. Enrich those fields first.\\n - **Lines mention the wrong company**: a company name is ambiguous. Include the website in the prompt inputs.\\n - **Line is empty for some contacts**: not enough data. Use a fallback in the variable so the email still reads correctly.\\n\\n## Related articles\\n\\n - Waterfall enrichment: append data fields to your contacts\\n - Use variables and Spintext for personalisation\\n - Push found leads straight into a campaign\\n - Lead database overview: search by ICP filters","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1KMJnf_djAZuGzfuxMirHAPFnpZjlHQoOb7eUTQQyh_I/edit"},{"slug":"push-found-leads-straight-into-a-campaign","title":"Push found leads straight into a campaign","category":"data-enrichment","summary":"Leads you unlock in the lead database do not need to be exported and re-uploaded. Every unlocked lead is saved to a list under Lead List, and any list can be attached to a campaign, new or running,â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nLeads you unlock in the lead database do not need to be exported and re-uploaded. Every unlocked lead is saved to a list under **Lead List**, and any list can be attached to a campaign, new or running, in a few clicks. This keeps the whole loop (search, unlock, verify, enrich, send) inside OutreachFox.\\n\\n## Prerequisites\\n\\n - A list of unlocked leads (see *Unlock verified emails and how credits are charged*).\\n - A campaign with a saved sequence and attached mailboxes, or a plan to create one.\\n\\n## Steps: add to a running campaign\\n\\n1. Open the campaign in **Campaigns**.\\n2. Click **Contacts** â **Upload Contacts**.\\n3. Select **Lists** and pick the list created by your lead search.\\n4. Add any extra sender mailboxes if the campaign now needs more capacity.\\n5. Click **Next**.\\n6. Click **Resume Campaign**.\\n\\nThe leads appear as **Not contacted** and start receiving step 1 on the next send window, subject to the daily new-contacts limit.\\n\\n## Steps: add to a new campaign\\n\\n1. Click **Create Campaign**, name it, choose the campaign type, click **Create**.\\n2. Build the sequence (**Start with Email**, write steps, **Save and Next**).\\n3. Choose **Sender Accounts** (and a LinkedIn account for multichannel).\\n4. At the contacts step, choose **Lists** and select the lead list.\\n5. Click **Next**, set **Settings** (schedule, daily limit, bounce protection, auto-match), review, and click **Launch Campaign**.\\n\\n## Steps: push directly from the lead list\\n\\n1. Open **Lead List** and select the list.\\n2. Tick the leads (or select-all).\\n3. Choose **Add to campaign** from the actions menu.\\n4. Pick the campaign and confirm.\\n5. Open the campaign and click **Resume Campaign** if it was paused.\\n\\n## Tips\\n\\n - Filter the list by verification status before pushing: send **Valid** leads to the main campaign and **Catch-all** leads to a separate low-volume campaign.\\n - Run AI enrichment on the list before pushing so the first\\\\_line variable is populated at launch.\\n - Push in batches that match your daily capacity. A 2,000-lead list attached to 8 mailboxes will take about two weeks to work through; that is fine, but do not unlock another 2,000 until the first batch shows a healthy bounce rate.\\n - Leads already in the campaign are skipped, so pushing the same list twice is harmless.\\n\\n## Troubleshooting\\n\\n - **The list does not appear under Lists**: the unlock job has not finished, or the list is empty. Check **Lead List**.\\n - **Leads pushed but campaign is not sending**: the campaign is paused. Open it and click **Resume Campaign**. See *Why did my campaign pause or stop sending?*\\n - **Variables show blank in Preview**: the fields exist on the lead but under a different name than the variable expects. Check the field mapping on the list.\\n\\n## Related articles\\n\\n - Lead database overview: search by ICP filters\\n - Unlock verified emails and how credits are charged\\n - Add more leads to an active campaign (from a list or a new CSV)\\n - AI enrichment: generate personalised first lines\\n - Set the daily new-contacts limit for a campaign","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1N8b67G5g26pYJGN8BarOcJ5p4edKxayy6NfU8ay0FDE/edit"},{"slug":"create-an-email-campaign-and-write-your-first-email","title":"Create an email campaign and write your first email","category":"campaigns-sequences","summary":"This article covers the first half of launching an email campaign in OutreachFox: creating the campaign, choosing the channel type and writing the subject and body of your first email. Personalisatâ¦","body":"This article covers the first half of launching an email campaign in OutreachFox: creating the campaign, choosing the channel type and writing the subject and body of your first email. Personalisation, spam-word checks and preview are covered in the next article.\\n\\n## Prerequisites\\n\\n - At least one connected mailbox (Mailbox â Connect Mailbox, or Import from Icemail).\\n - A list of contacts, or a CSV ready to upload.\\n\\n## Steps\\n\\n1. Log in to your OutreachFox account. You land on the dashboard.\\n2. Click **Create Campaign**.\\n\\n\\n\\n3. Enter a name for your campaign. Use something you will recognise later, for example the audience and month.\\n\\n\\n\\n4. Select the channel type. You have three options: **Email Outreach**, **LinkedIn Outreach** and **Multi Channel Outreach**. Choose **Email Outreach** and click **Continue**.\\n\\n\\n\\n5. On the sequence screen, click **Start with Email**. This creates step 1 of your sequence.\\n\\n\\n\\n6. Click into the editor and type your email body. Add your email subject in the subject field above the body.\\n\\n\\n\\nWhat you see afterwards: step 1 shows in the left-hand sequence panel with variant A. The editor toolbar shows **Variables**, **Spintext**, **Spam Words** and **Preview**. Continue with *Personalise, check spam words and preview before you save*.\\n\\n## Tips\\n\\n - Keep the first email under 120 words and the subject under 6 words. Short, plain emails get more replies and fewer spam flags.\\n - Write in plain text style: no images, no heavy formatting, one link at most.\\n - Ask one clear question at the end. Do not include a calendar link in email 1.\\n - Name campaigns consistently (for example SaaS-CTO-Sep26-v1) so reporting stays readable when you have dozens of campaigns.\\n\\n## Troubleshooting\\n\\n - **Continue is greyed out** â the campaign name is empty or no channel type is selected.\\n - **You cannot find Create Campaign** â click **Campaigns** in the left nav; the button is at the top of the campaign list.\\n\\n## Related articles\\n\\n - Personalise, check spam words and preview before you save\\n - Add follow-up steps and delays to an email sequence\\n - A/B test with multiple email variants\\n - Upload contacts to OutreachFox\\n - Checklist before launching yo","video":{"src":"https://cdn.outreachfox.ai/help/videos/create-an-email-campaign-and-write-your-first-email.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"e838525f-8c9d-4d24-a4fb-8935e4b9cef4"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/create-an-email-campaign-and-write-your-first-email.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"e838525f-8c9d-4d24-a4fb-8935e4b9cef4"}],"_source_doc":"https://docs.google.com/document/d/1hLBrrm3TM-o3F0mHSTM-zQmnZWYnbQgs_Eyk_B8fcQk/edit"},{"slug":"personalise-check-spam-words-and-preview-before-you-save","title":"Personalise, check spam words and preview before you save","category":"campaigns-sequences","summary":"Once your subject and body are written, use the editor tools to personalise the email, remove spam triggers and check how it renders before you save. This is the second half of launching your firstâ¦","body":"Once your subject and body are written, use the editor tools to personalise the email, remove spam triggers and check how it renders before you save. This is the second half of launching your first email campaign.\\n\\n## Steps\\n\\n1. With step 1 open in the editor, click **Variables**. Insert placeholders such as the lead's first name or company. Spintext tags and other placeholders are also available from here.\\n\\n\\n\\n2. Click **Spam Words**. OutreachFox lists words in your copy that are commonly treated as spammy. Rewrite or remove them so you land in the primary inbox rather than the spam folder.\\n\\n\\n\\n3. Click **Preview** to see how the email looks to a recipient, with variables filled in.\\n4. When you are happy with the email, click **Save**.\\n5. Optional: click **New Variant** to add an A/B variant of this step. Add as many variants as you want.\\n6. Optional: click **Add Step** to add another email to the sequence.\\n7. Click **Save and Next**.\\n8. Set up your leads: choose who receives the emails (upload a CSV or pick an existing list).\\n9. On the **Settings** step, review timing, daily sending volume, ESP matching and the other campaign settings, then launch.\\n\\nWhat you see afterwards: the campaign appears in the **Campaigns** list. Open it to see sequence, contacts, settings and reporting tabs.\\n\\n## Tips\\n\\n - Always add a fallback for variables (for example \\"there\\" for first name) so a blank field never produces \\"Hi ,\\".\\n - Spam Words flags the obvious triggers (\\"free\\", \\"guarantee\\", \\"act now\\"). It does not catch tone, so still read the email aloud.\\n - Preview with two or three different c
99ontacts, not just the first row, to catch odd capitalisation in imported data.\\n - Save before switching steps; unsaved edits in the editor are lost when you click another step.\\n\\n## Troubleshooting\\n\\n - **Preview shows the raw variable name** â the contact list has no column mapped to that field. Re-map on the contacts step or add a fallback.\\n - **Save and Next is disabled** â the active step has an empty subject or body, or an unsaved variant.\\n\\n## Related articles\\n\\n - Create an email campaign and write your first email\\n - Personalisation variables: lead, sender and context fields\\n - Spintext: randomise phrases so no two emails are identical\\n - A/B test with multiple email variants\\n - Set campaign sending volu","video":{"src":"https://cdn.outreachfox.ai/help/videos/personalise-check-spam-words-and-preview-before-you-save.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"23fe2b9e-16b8-47f7-b70d-1d2bbcb578a6"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/personalise-check-spam-words-and-preview-before-you-save.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"23fe2b9e-16b8-47f7-b70d-1d2bbcb578a6"}],"_source_doc":"https://docs.google.com/document/d/1SMlVOEZOi55keGdP_oNRvPXxYdTiE50iiaHTG2BNGPc/edit"},{"slug":"personalisation-variables-lead-sender-and-context-fields","title":"Personalisation variables: lead, sender and context fields","category":"campaigns-sequences","summary":"Variables are placeholders that OutreachFox fills in per recipient when the email is sent. You can insert them in the subject line and in the body. There are three groups: lead fields (from your coâ¦","body":"Variables are placeholders that OutreachFox fills in per recipient when the email is sent. You can insert them in the subject line and in the body. There are three groups: lead fields (from your contact list), sender fields (from the mailbox that sends the email) and context fields (day, time, month).\\n\\n## Steps\\n\\n1. Open the campaign and go to the email body of the step you want to edit.\\n\\n\\n\\n2. Place the cursor in the subject line or in the body where the variable should appear.\\n\\n\\n\\n3. Click **Variables** to open the list of available fields.\\n\\n\\n\\n4. Choose a lead field such as **First Name**. OutreachFox pulls the value from the matching column in your contacts. This works the same way for every variable.\\n\\n\\n\\n5. Scroll the list to see the other lead fields (company, title, website, custom fields and so on).\\n\\n\\n\\n6. Add sender variables where needed: sender name, sender email and signature. These are filled from whichever mailbox sends that particular email, so rotated mailboxes always sign correctly.\\n\\n\\n\\n7. Add context variables to reference the day of the week, time of day or month at send time.\\n\\n\\n\\nWhat you see afterwards: variables appear in the editor as highlighted tokens. Use **Preview** to see them filled with a real contact's data.\\n\\n## Tips\\n\\n - Use the sender signature variable instead of typing a signature into every step. Edit signatures once under Mailbox â Settings.\\n - Context variables are useful for natural openers (\\"Hope your Monday is going well\\") without maintaining separate copies per day.\\n - Keep lead data clean before upload: variables copy the value exactly, including trailing spaces or all-caps company names.\\n - Limit personalisation to two or three fields per email. Over-templated emails read as automated.\\n\\n## Troubleshooting\\n\\n - **A variable renders as the raw tag** â the contact has no value for that field. Check the column mapping in Contacts, or add a fallback value.\\n - **Sender name is wrong** â set the name in Mailbox â Settings for that mailbox; the variable reads from there.\\n\\n## Related articles\\n\\n - Spintext: randomise phrases so no two emails are identical\\n - Custom variables and updating them mid-campaign\\n - Add a signature to a mailbox\\n - Upload contac","video":{"src":"https://cdn.outreachfox.ai/help/videos/personalisation-variables-lead-sender-and-context-fields.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"44fbcb33-e0d9-4c63-b329-e1055ed244ac"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/personalisation-variables-lead-sender-and-context-fields.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"44fbcb33-e0d9-4c63-b329-e1055ed244ac"}],"_source_doc":"https://docs.google.com/document/d/10Iz7tewgUkurbu0HSm519oHkyARbX98ALrBxUhO6FR0/edit"},{"slug":"spintext-randomise-phrases-so-no-two-emails-are-identical","title":"Spintext: randomise phrases so no two emails are identical","category":"campaigns-sequences","summary":"Spintext lets you give OutreachFox several alternatives for a phrase. Each send picks one at random, so the emails leaving your mailboxes are not word-for-word copies of each other. Mailbox provideâ¦","body":"Spintext lets you give OutreachFox several alternatives for a phrase. Each send picks one at random, so the emails leaving your mailboxes are not word-for-word copies of each other. Mailbox providers score identical bulk copy as a spam signal; spintext, together with variables, keeps each message unique.\\n\\n## Steps\\n\\n1. Open the campaign, select the step and place the cursor in the body (or subject) where you want the randomised phrase.\\n2. Click **Spintext** in the editor toolbar and enter your alternatives, for example a greeting with three options: \\"Hi\\", \\"Hello\\", \\"Hey\\".\\n\\n\\n\\n3. Repeat for one or tw
99o other phrases in the email, such as the opener sentence or the sign-off.\\n4. Check that both your variables and your spintext blocks are in place, then click **Preview** to see a rendered version. Preview several times to confirm different alternatives are chosen.\\n\\n\\n\\n5. Click **Save**.\\n\\nWhat you see afterwards: spintext blocks show in the editor as a highlighted group. At send time each recipient receives one of the alternatives.\\n\\n## Tips\\n\\n - Two to four alternatives per block is enough. Spinning every sentence makes copy hard to read and to maintain.\\n - Spin low-risk phrases: greetings, sign-offs, transition sentences. Do not spin the value proposition or the call to action, or you cannot tell which version worked.\\n - Alternatives should be the same length and tone so the email still reads naturally whichever one is chosen.\\n - Spintext is different from A/B variants. Spintext randomises inside one variant; variants are separate emails whose results you compare.\\n\\n## Troubleshooting\\n\\n - **Preview always shows the same alternative** â preview picks at random; try again several times. If it never changes, the block was not saved as spintext (plain text with braces is not parsed).\\n - **Odd spacing around the spun phrase** â put spaces outside the spintext block, not inside each alternative.\\n\\n## Related articles\\n\\n - Personalisation variables: lead, sender and context fields\\n - A/B test with multiple email variants\\n - Personalise, check spam words and preview before you save\\n - Send emails as plain te","video":{"src":"https://cdn.outreachfox.ai/help/videos/spintext-randomise-phrases-so-no-two-emails-are-identical.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"0436f975-e283-4e3b-be75-4caf21a80872"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/spintext-randomise-phrases-so-no-two-emails-are-identical.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"0436f975-e283-4e3b-be75-4caf21a80872"}],"_source_doc":"https://docs.google.com/document/d/1r-TVjRrMJPHvfJ9orbH_iZ6Os4aNraoJuwn3PTKNOz8/edit"},{"slug":"add-follow-up-steps-and-delays-to-an-email-sequence","title":"Add follow-up steps and delays to an email sequence","category":"campaigns-sequences","summary":"A sequence with follow-ups gets several times more replies than a single email. This article shows how to add steps to an existing email campaign and set the wait time between them.","body":"A sequence with follow-ups gets several times more replies than a single email. This article shows how to add steps to an existing email campaign and set the wait time between them.\\n\\n## Steps\\n\\n1. Open the email campaign you want to extend from the **Campaigns** list.\\n\\n\\n\\n2. If the sequence is empty, click **Start with email** to create the first step. Otherwise the first step is already shown.\\n\\n\\n\\n3. Click **Add Step** to insert the next step in the sequence.\\n\\n\\n\\n4. Set the delay: enter the number of **days** and **hours** to wait after the previous step before this email is sent.\\n\\n\\n\\n5. Write the subject and body of the follow-up, then click **Save**.\\n6. Repeat **Add Step** (Add Sequence) for as many follow-ups as you need.\\n\\n\\n\\n7. In any step, click **New Variant** to add an A/B variant and personalise the content for that step.\\n\\n\\n\\nWhat you see afterwards: the sequence panel lists each step with its delay.
99Contacts move to the next step after the delay unless they reply, bounce or unsubscribe.\\n\\n## Tips\\n\\n - A good default is 3â4 steps: day 0, day 3, day 7, day 14. Beyond four steps reply rates drop and complaint rates rise.\\n - Set delays in whole days plus 0 hours so follow-ups land inside your sending schedule, not at odd hours.\\n - Each follow-up should add something new (a case study, a different angle, a short question), not just \\"bumping this\\".\\n - Keep the last step short and give the prospect an easy out (\\"if now isn't the time, just say so\\").\\n - Contacts who reply are removed from the sequence automatically, so you never follow up on a conversation that has already started.\\n\\n## Troubleshooting\\n\\n - **Follow-up sent too early** â the delay counts from when the previous step was actually sent, and the daily limit can shift sends; check the campaign sending schedule.\\n - **Cannot add a step to a live campaign** â click **Edit Campaign** first, make the change, then **Resume Campaign**.\\n\\n## Related articles\\n\\n - Follow-ups in the same thread vs a new thread\\n - A/B test with multiple email variants\\n - Subsequences: branch on reply intent\\n - Create sending schedules\\n - Set campaign","video":{"src":"https://cdn.outreachfox.ai/help/videos/add-follow-up-steps-and-delays-to-an-email-sequence.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"ea24aef7-9549-40dd-bab4-53915a027ab1"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/add-follow-up-steps-and-delays-to-an-email-sequence.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"ea24aef7-9549-40dd-bab4-53915a027ab1"}],"_source_doc":"https://docs.google.com/document/d/1pzcGR4L2d-NdVUwf4W8Zs84Yr4C_DH1-oVSpzdd7vZ0/edit"},{"slug":"a-b-test-with-multiple-email-variants","title":"A/B test with multiple email variants","category":"campaigns-sequences","summary":"Variants let you send two or more versions of the same step and compare which gets more replies. OutreachFox rotates variants across contacts in that step; you keep the winner and drop the rest.","body":"Variants let you send two or more versions of the same step and compare which gets more replies. OutreachFox rotates variants across contacts in that step; you keep the winner and drop the rest.\\n\\n## Steps\\n\\n1. Open the campaign where you want to add variants.\\n\\n\\n\\n2. Click the started email (step 1) in the sequence. Variant A is already there.\\n\\n\\n\\n3. Click **New Variant**. A **B** variant is created; write its subject and body.\\n\\n\\n\\n4. Click **New Variant** again to add **C**, and so on, as many as you need.\\n\\n\\n\\n5. Click **Save** on each variant.\\n6. Repeat in any other sequence step where you want to test alternatives.\\n\\n\\n\\nWhat you see afterwards: the step shows tabs A, B, C⦠Campaign reporting breaks down sent, opened and replied per variant so you can compare.\\n\\n## Tips\\n\\n - Test one thing at a time: subject line, opener or call to action. If B differs from A in five ways you will not know what caused the difference.\\n - Two variants per step is usually enough. Each extra variant needs more sends before the result is meaningful; aim for at least 200â300 sends per variant before judging.\\n - Judge on reply rate (and positive-reply rate), not open rate. Open tracking is unreliable with Apple Mail Privacy and image-blocking clients.\\n - Once a winner is clear, delete the losing variant so 100% of new contacts get the better copy.\\n - Step 1 is where variants matter most; follow-up variants rarely move results.\\n\\n## Troubleshooting\\n\\n - **Variant B never sends** â
99check it was saved; an unsaved variant shows an empty body and is skipped.\\n - **Uneven split** â rotation is per contact as they enter the step, so counts even out over time; small samples look uneven.\\n\\n## Related articles\\n\\n - Add follow-up steps and delays to an email sequence\\n - Spintext: randomise phrases so no two emails are identical\\n - Personalise, check spam words and preview before you save\\n - Campaign analytics","video":{"src":"https://cdn.outreachfox.ai/help/videos/a-b-test-with-multiple-email-variants.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"bd549d87-ba65-4d88-9630-4f818e9ffadd"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/a-b-test-with-multiple-email-variants.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"bd549d87-ba65-4d88-9630-4f818e9ffadd"}],"_source_doc":"https://docs.google.com/document/d/1CuCFcV6nveH_UuCdZEhA4gv1ZSUynTQC23mGpYwCqis/edit"},{"slug":"send-emails-as-plain-text","title":"Send emails as plain text","category":"campaigns-sequences","summary":"By default OutreachFox sends HTML emails. Turning on Send emails in plain text strips the HTML wrapper so the message is delivered as plain text only. Plain text emails look like a normal one-to-onâ¦","body":"By default OutreachFox sends HTML emails. Turning on **Send emails in plain text** strips the HTML wrapper so the message is delivered as plain text only. Plain text emails look like a normal one-to-one email, render the same in every client, and carry fewer of the signals spam filters associate with marketing mail.\\n\\n## Steps\\n\\n1. Create a new campaign or pick an existing one from the **Campaigns** list. The steps are the same either way.\\n\\n\\n\\n2. Click **Edit Campaign** on the chosen campaign.\\n\\n\\n\\n3. Go to **Settings** within the campaign.\\n\\n\\n\\n4. Scroll down and click **Show Advanced Configurations**.\\n\\n\\n\\n5. Find **Send emails in plain text** and enable it.\\n\\n\\n\\n6. Confirm the toggle is on, then save (for a live campaign, click **Resume Campaign**).\\n\\n\\n\\nWhat you see afterwards: all emails in this campaign are sent as plain text. Bold, links with custom anchor text, images and HTML signatures are not rendered; a link shows as its full URL.\\n\\n## Tips\\n\\n - Plain text is the recommended setting for cold outreach. Use HTML only when you genuinely need formatting.\\n - Open tracking relies on an invisible image, so open rates are not available in plain text mode. Judge by replies instead.\\n - Write links as bare URLs in the copy so they read naturally in plain text.\\n - If your signature is HTML (logo, coloured text), set a plain text version under Mailbox â Settings â Edit signature before enabling this.\\n\\n## Troubleshooting\\n\\n - **Signature looks broken** â the HTML signature is being flattened. Replace it with a text-only signature.\\n - **Sett
99ing does not stick** â you must click **Resume Campaign** (or Save) after toggling; leaving the page discards the change.\\n\\n## Related articles\\n\\n - Add an unsubscribe link to your emails\\n - Images, GIFs and video links in cold emails\\n - Add a signature to a mailbox\\n - Set up a custom t","video":{"src":"https://cdn.outreachfox.ai/help/videos/send-emails-as-plain-text.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"c9cf753c-6be6-49b9-b388-080c0b9f22fa"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/send-emails-as-plain-text.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"c9cf753c-6be6-49b9-b388-080c0b9f22fa"}],"_source_doc":"https://docs.google.com/document/d/1SdZ7JVlIxTbfb0X6fi2tuN9z-VvzsPH6okl20c-wVDs/edit"},{"slug":"add-an-unsubscribe-link-to-your-emails","title":"Add an unsubscribe link to your emails","category":"campaigns-sequences","summary":"An unsubscribe link at the bottom of your emails lets recipients opt out with one click instead of marking you as spam. OutreachFox adds the link automatically when Include Unsubscribe Message is oâ¦","body":"An unsubscribe link at the bottom of your emails lets recipients opt out with one click instead of marking you as spam. OutreachFox adds the link automatically when **Include Unsubscribe Message** is on, and removes anyone who clicks it from the campaign.\\n\\n## Steps\\n\\n1. Log in to your OutreachFox account. You can enable this on a new campaign or an existing one.\\n\\n\\n\\n2. Open the campaign and click **Edit Campaign**.\\n\\n\\n\\n3. Go to **Settings**.\\n\\n\\n\\n4. Scroll down and click **Show Advanced Configurations**.\\n\\n\\n\\n5. Scroll again until you see **Risk Control**.\\n\\n\\n\\n6. Under **Include Unsubscribe Message**, switch the toggle on. This appends a short unsubscribe message with a link at the end of every email in the campaign.\\n\\n\\n\\n7. Edit the message text if you want different wording.\\n\\n\\n\\n8. Click **Resume Campaign** to save your changes.\\n\\n\\n\\nWhat you see afterwards: every email in the campaign ends with the unsubscribe line. Contacts who click it get the status Unsubscribed and receive no further steps from any campaign.\\n\\n## Tips\\n\\n - Keep the wording low-key and human: \\"If this isn't relevant, let me know or unsubscribe here.\\" Avoid the word \\"newsletter\\".\\n - Enable it together with the unsubscribe header (see the next article); Gmail and Yahoo require one-click unsubscribe for senders above 5,000 messages a day, and it helps everyone.\\n - Keep spam-complaint rate under 0.1%. An easy opt-out is the cheapest way to do that.\\n - Unsubscribes are honoured across campaigns, so re-uploading a contact to a new campaign will not re-enable sending.\\n\\n## Troubleshooting\\n\\n - **Link missing from the email** â the toggle was switched but the campaign was not resumed/saved.\\n - **Contact still receiving emails after unsubscribing** â check whether the same person exists under a second email address in your contacts.\\n\\n## Related articles\\n\\n - Enable the unsubscribe header (one-click List-Unsubscribe)\\n - Send emails as plain text\\n - Enable email bounce protection\\n - Check lead st","video":{"src":"https://cdn.outreachfox.ai/help/videos/add-an-unsubscribe-link-to-your-emails.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"6e018bea-f418-4eb2-a1a5-b8eb62129802"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/add-an-unsubscribe-link-to-your-emails.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"6e018bea-f418-4eb2-a1a5-b8eb62129802"}],"_source_doc":"https://docs.google.com/document/d/1koyBVzu9Y2NiVGQggyAChRZE5XXVnm_b0TbbKyIvFBM/edit"},{"slug":"enable-the-unsubscribe-header","title":"Enable the unsubscribe header (one-click List-Unsubscribe)","category":"campaigns-sequences","summary":"The unsubscribe header adds a List-Unsubscribe header to each email. Gmail, Yahoo and Outlook read it and show an Unsubscribe button next to the sender name at the top of the message, separate fromâ¦","body":"The unsubscribe header adds a List-Unsubscribe header to each email. Gmail, Yahoo and Outlook read it and show an **Unsubscribe** button next to the sender name at the top of the message, separate from any link in the body. Since 2024 Gmail and Yahoo require this header from bulk senders, and it reduces spam complaints for everyone because recipients opt out instead of hitting \\"Report spam\\".\\n\\n## Steps\\n\\n1. Open the campaign, click **Edit Campaign**, then **Sett
99ings**.\\n2. Click **Show Advanced Configurations** and scroll to **Risk Control**.\\n3. Switch on **Unsubscribe Header**. This adds the one-click unsubscribe button next to your email, the way Gmail displays it.\\n\\n\\n\\n4. Customise the text if needed, and make sure the toggles you want (message and/or header) are on.\\n\\n\\n\\n5. Click **Resume Campaign** to save.\\n\\nWhat you see afterwards: recipients in Gmail see an \\"Unsubscribe\\" button beside the sender address. Clicking it removes them from the campaign; nothing visible changes in the email body.\\n\\n## Tips\\n\\n - Turn on both **Include Unsubscribe Message** and **Unsubscribe Header**. The header covers Gmail/Yahoo/Outlook; the body link covers clients that do not surface the header.\\n - The header is invisible in the email body, so it does not affect the look of plain text emails.\\n - Combine with a bounce-rate pause and a low daily volume per mailbox (30â50) for a complete deliverability baseline.\\n - Make sure SPF, DKIM and DMARC are set on the sending domain. Mail providers only honour one-click unsubscribe from authenticated senders.\\n\\n## Troubleshooting\\n\\n - **No Unsubscribe button in Gmail** â Gmail shows the button only for authenticated senders with some sending history; verify DKIM/DMARC on the domain. It also appears only in the recipient's view, not in your Sent folder.\\n - **Button visible but click does nothing** â the campaign was paused or deleted before the click was processed; the contact is still marked unsubscribed on OutreachFox's side.\\n\\n## Related articles\\n\\n - Add an unsubscribe link to your emails\\n - Enable email bounce protection\\n - Set up SPF, DKIM and DMARC\\n - Enable auto-match E","video":{"src":"https://cdn.outreachfox.ai/help/videos/enable-the-unsubscribe-header.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"81622f23-6c17-493d-95e5-f9ffa5b7fdef"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/enable-the-unsubscribe-header.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"81622f23-6c17-493d-95e5-f9ffa5b7fdef"}],"_source_doc":"https://docs.google.com/document/d/1Mw63XACWr3sEBJEtOAGaZDRDFixOYVNDVS53OnbC7w8/edit"},{"slug":"custom-variables-and-updating-them-mid-campaign","title":"Custom variables and updating them mid-campaign","category":"campaigns-sequences","summary":"Custom variables are lead fields you define yourself: anything beyond the standard first name, last name, company, title and email. Typical examples are a one-line personalised opener, a pain pointâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nCustom variables are lead fields you define yourself: anything beyond the standard first name, last name, company, title and email. Typical examples are a one-line personalised opener, a pain point, the prospect's tech stack or a case-study link. Any column you upload with your contacts becomes a variable you can insert with **Variables** in the editor. This article covers how to create them, how to use them, and how to change their values after a campaign is already running.\\n\\n## Prerequisites\\n\\n - A CSV where each custom field is its own column with a clear header (for example opener, pain\\\\_point, case\\\\_study\\\\_url).\\n - Values filled for every row, or a fallback planned for empty cells.\\n\\n## Steps\\n\\n### Create custom variables at upload\\n\\n1. Go to **Contacts** â **Upload Contacts** and drag in your CSV.\\n2. Assign the contacts to a list (or create one) and choose how to handle duplicates: **skip** or **merge**.\\n3. On the column-mapping screen, map standard columns (email, first name, company). For each extra column, map it to a new custom field with the same name as the header.\\n4. Click **Save and Continue**.\\n\\n### Use them in a sequence\\n\\n1. Open the campaign, select the step and click **Variables**.\\n2. Custom fields appear alongside the lead fields. Insert the one you want, for example {{opener}}.\\n3. Click **Preview** and page through two or three contacts to check the values read well in context.\\n4. Click **Save**.\\n\\n### Update values mid-campaign\\n\\n1. Fix the values in your CSV (keep the email column unchanged, as that is the match key).\\n2. Go to **Contacts** â **Upload Contacts**, upload the corrected file into the same list and choose **merge** for duplicates. Merged fields overwrite the old values; contacts keep their place in the sequence.\\n3. To change a single contact, open it from the campaign's **Contacts** tab and edit the field directly.\\n4. Emails already sent are unchanged. Steps not yet sent use the new value at send time.\\n\\n## Tips\\n\\n - Never leave a custom field blank. Either fill every row or write the copy so the sentence still works when the variable is empty, and use a fallback value.\\n - Keep custom values short (under 15 words) and lower
99-case unless they are proper nouns. They are dropped into the middle of your sentences.\\n - Write personalised openers as a complete clause (\\"saw you just opened a Berlin office\\") so the template can be \\"Hi {{first\\\\_name}}, {{opener}} â ...\\".\\n - Use one variable for the case study URL rather than pasting links into copy; you can then swap the link for all remaining sends with one merge upload.\\n - Test with a CSV of three internal addresses before uploading a thousand rows.\\n\\n## Troubleshooting\\n\\n - **The variable is not in the Variables list** â the column was not mapped at upload, or was mapped to a standard field. Re-upload with merge and map it as a custom field.\\n - **Raw** **{{tag}}** **in a sent email** â the contact had no value and no fallback. Add the value and it will render correctly in later steps.\\n - **Merge created duplicates instead of updating** â the email column in the new file did not match exactly (extra whitespace, different case). Normalise the emails and re-upload.\\n\\n## Related articles\\n\\n - Personalisation variables: lead, sender and context fields\\n - Upload contacts to OutreachFox\\n - Add leads to an existing campaign\\n - Spintext: randomise phrases so no two emails are identical","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1z4VS-BOz3xjvGWBY26cHqJqmWflMbkSo70WbD9R7Ek4/edit"},{"slug":"sequence-templates-save-and-reuse-sequences","title":"Sequence templates: save and reuse sequences","category":"campaigns-sequences","summary":"Once a sequence works, you will want to run it again for a new list, a new region or a new sender set without rebuilding every step, delay and variant. This article shows how to save a sequence as â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nOnce a sequence works, you will want to run it again for a new list, a new region or a new sender set without rebuilding every step, delay and variant. This article shows how to save a sequence as a template and start new campaigns from it, and how to copy a campaign when a template is not available.\\n\\n## Prerequisites\\n\\n - A campaign whose sequence you are happy with (steps, delays, variants and settings).\\n\\n## Steps\\n\\n### Save a sequence as a template\\n\\n1. Open the campaign from **Campaigns** and go to the sequence editor.\\n2. Open the sequence menu (three dots next to the sequence name) and choose **Save as Template**.\\n3. Give the template a descriptive name, for example SaaS â 4-step â case study.\\n4. Click **Save**. Steps, delays, variants and spintext are stored. Contacts, sender accounts and campaign settings are not part of the template.\\n\\n### Start a new campaign from a template\\n\\n1. Click **Create Campaign**, enter a name and select the channel type.\\n2. On the sequence screen, choose **Use Template** instead of **Start with Email** and pick your template.\\n3. Edit any step that should differ (offer, dates, c
99ase study), then click **Save and Next**.\\n4. Choose sender accounts, upload or map contacts, review settings and click **Launch Campaign**.\\n\\n### Duplicate a campaign instead\\n\\n1. In the **Campaigns** list, open the three-dots menu on the source campaign and click **Duplicate**.\\n2. The copy contains the sequence and settings but no contacts. Rename it, then edit and launch as usual.\\n\\n## Tips\\n\\n - Keep templates generic: use variables and spintext rather than hard-coded company names, so a template works for any list.\\n - Version your templates in the name (v1, v2) and note the reply rate in the description so you know which to reuse.\\n - Templates capture copy, not performance. Re-check spam words after editing a template; a new offer can introduce new triggers.\\n - Duplicating a live campaign is the fastest way to run the same sequence with a different sender set, for example one campaign per mailbox provider.\\n - Review templates every quarter. Openers that referenced a season, event or news item go stale.\\n\\n## Troubleshooting\\n\\n - **Template does not appear when creating a campaign** â templates are per channel type; an email template will not show for a LinkedIn Outreach campaign.\\n - **Changing a template did not change existing campaigns** â templates are copied at creation time. Update each running campaign separately.\\n - **Duplicated campaign is paused** â duplicates always start paused with no contacts; add contacts and launch.\\n\\n## Related articles\\n\\n - Create an email campaign and write your first email\\n - Add follow-up steps and delays to an email sequence\\n - A/B test with multiple email variants\\n - Multichannel best practices: sequencing email and LinkedIn touches","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1KW2FYnZM_xZEWK_8eygaRPbQDL_F3Abeghd7f9FRVn0/edit"},{"slug":"follow-ups-in-the-same-thread-vs-a-new-thread","title":"Follow-ups in the same thread vs a new thread","category":"campaigns-sequences","summary":"Each follow-up step in a sequence can either reply to the previous email (same thread, subject shown as \\"Re: â¦\\") or go out as a fresh email with its own subject line. Both are valid; they suit diffâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nEach follow-up step in a sequence can either reply to the previous email (same thread, subject shown as \\"Re: â¦\\") or go out as a fresh email with its own subject line. Both are valid; they suit different goals. This article explains the difference, how to set it per step, and when to use each.\\n\\n## How the two options behave\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| | \\\\*\\\\*Same thread\\\\*\\\\* | \\\\*\\\\*New thread\\\\*\\\\* |\\n| Subject | Inherits step 1 subject, shown as \\"Re:\\" | Your own subject per step |\\n| Recipient sees | Whole conversation quoted below | A standalone email |\\n| Best for | Short bumps, keeping context | New angle, second chance at the subject line |\\n| Deliverability | Slightly better: replies to existing threads look like real conversations | Neutral; each email is judged on its own |\\n\\n## Steps\\n\\n1. Open the campaign and click the follow-up step in the sequence panel.\\n2. Above the editor, find the subject setting for the step. Choose **Reply in same thread** (the subject field is greyed out and shows the step 1 subject) or **New thread** (enter a subject).\\n3. Write the body. For same-thread steps do not repeat the greeting or your full pitch; the previous email is quoted underneath.\\n4. Click **Save**.\\n5. Repeat for each follow-up. A sequence can mix both, for example steps 2 and 3 in the thread and step 4 as a new thread.\\n\\n## Tips\\n\\n - Recommended default for cold outreach: step 2 and step 3 in the same thread, step 4 (the \\"break-up\\" email) as a new thread with a new subject.\\n - Same-thread follow-ups should be one to three sentences. \\"Any thoughts on the below?\\" outperforms a second essay.\\n - Use a new thread when step 1 had a weak subject line; it is your only way to get a second look at the inbox list.\\n - Do not alternate threads every step; two or three parallel threads with the same person feel like spam.\\n - For plain text campaigns the quoted thread is still included, so keep step 1 short to avoid long quoted blocks.\\n\\n## Troubleshooting\\n\\n - **Follow-up shows \\"Re:\\" but the original is not quoted** â some clients hide quoted text behind \\"...\\"; the recipient can expand it. Nothing is wrong.\\n - **Follow-up arrived as a new email even though same thread was selected** â the recipient's client threads by subject and message ID;
99 if they deleted the original, the follow-up appears alone. Also happens if step 1 bounced and was retried from another mailbox.\\n - **Subject field is locked** â the step is set to same thread. Switch to new thread to edit it.\\n\\n## Related articles\\n\\n - Add follow-up steps and delays to an email sequence\\n - Subsequences: branch on reply intent\\n - Preheader text and test sends\\n - A/B test with multiple email variants","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1AQeKIcOE6wSvM56vUxekbHVC6iOwcE6xKip0dqSsfOQ/edit"},{"slug":"subsequences-branch-on-reply-intent","title":"Subsequences: branch on reply intent","category":"campaigns-sequences","summary":"A reply ends the main sequence for that contact, but not every reply is a meeting. \\"Not now, try me in Q1\\", \\"wrong person, talk to Priya\\" and \\"send me more info\\" each deserve a different next messaâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nA reply ends the main sequence for that contact, but not every reply is a meeting. \\"Not now, try me in Q1\\", \\"wrong person, talk to Priya\\" and \\"send me more info\\" each deserve a different next message. Subsequences are short follow-on sequences that start automatically when a reply is categorised with a given intent, so the right response goes out without you triaging every inbox by hand.\\n\\nOutreachFox's AI reply categorisation (Campaign Settings â Reply Categorization) assigns each reply a category such as Interested, Not Interested, Out of Office, Wrong Person or Later. Subsequences hook onto those categories.\\n\\n## Prerequisites\\n\\n - Reply categorisation enabled with the default categories, or your own categories created with a description and sentiment.\\n - A campaign that is already receiving replies.\\n\\n## Steps\\n\\n1. Open the campaign and go to the sequence editor.\\n2. Click **Add Sequence** and choose **Subsequence**.\\n3. Name the subsequence after the intent it handles, for example Out of office â retry.\\n4. Set the trigger: pick the reply category that starts it (for example **Out of Office**). Optionally set a delay before the first step, such as 7 days for out-of-office replies.\\n5. Add steps exactly as in a normal sequence: subject or same-thread reply, body, wait time. Keep it to one or two steps.\\n6. Click **Save**.\\n7. Repeat for the other intents you want to automate. Common set: Out of Office (retry in 7â10 days), Later (check in after 30â60 days), Wrong Person (ask for the right contact once), More Info (send the one-pager and a question).\\n8. Leave **Interested** replies out of automation. Those should be answered personally from the inbox.\\n\\nWhat you see afterwards: when a reply is categorised, the contact leaves the main sequence and enters the matching subsequence. The campaign's **Contacts** tab shows the subsequence a contact is in.\\n\\n## Tips\\n\\n - Check the categorisation accuracy on the first 50 replies before trusting a subsequence to send automatically. Adjust category descriptions if replies are mislabelled.\\n - Subsequence emails should reference the reply (\\"Thanks for letting me know you're away\\") so they never read as automated.\\n - Do not put a hard sell in a Not Interested subsequence. Either skip it entirely or send one polite close.\\n - Set a generous delay on Later subsequences; a follow-up 30 days after \\"ask me next quarter\\" is fine, 3 days is not.\\n - Only one subsequence should be able to fire per category. Overlapping triggers cause double sends.\\n\\n## Troubleshooting\\n\\n - **Subsequence never starts** â the trigger category does not match the one the classifier assigned. Check the reply's category on the Contacts tab and compare.\\n - **Subsequence started for an auto-reply** â the auto-reply was classified as Interested or More Info. Refine the category descriptions under Reply Categorization.\\n - **Contact received both a main-sequence step and a subsequence step** â the main step was already queued when the reply arrived. Shorter daily batches reduce this window.\\n\\n## Related articles\\n\\n - AI reply categorisation guide\\n - Add follow-up steps and delays to an email sequence\\n - Follow-ups in the same thread vs a new thread\\n - Check lead statuses in a campaign","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1aUHLLycRStwnQNpwhyGDTFBXC4UbHMKQZbTErCV4JVM/edit"},{"slug":"images-gifs-and-video-links-in-cold-emails","title":"Images, GIFs and video links in cold emails (and why to avoid attachments)","category":"campaigns-sequences","summary":"Cold email is judged by spam filters that have never seen your domain before. Every image, tracked link and attachment adds weight that a plain one-to-one email would not carry. This article explaiâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nCold email is judged by spam filters that have never seen your domain before. Every image, tracked link and attachment adds weight that a plain one-to-one email would not carry. This article explains what is safe to include, how to add it in the OutreachFox editor, and why attachments should stay out of your sequences.\\n\\n## Short version\\n\\n - **Attachments: never.** Unknown senders with attachments are the classic phishing pattern. Bounce and spam-folder rates rise sharply, and your domain reputation drops for every campaign after.\\n - **Images and GIFs: avoid in step 1.** If you use them at all, one small hosted image in a later step, never in the first touch.\\n - **Video: link to it.** Host the video (Loom, Vidyard, YouTube unlisted) and put a plain link or a small thumbnail image that links out. Never embed video.\\n - **Links in general: at most one per email**, and none in step 1 if you can manage it. Use the custom tracking domain so tracked links match your sending domain.\\n\\n## Steps\\n\\n### Add a hosted image\\n\\n1. Upload the image to your own hosting (your website, a CDN or a Drive/Cloud link with public access). Keep it under 100 KB and under 600 px wide.\\n2. In the OutreachFox editor, place the cursor where the image should go and use the **Image** tool in the toolbar; paste the image URL.\\n3. Add alt text describing the image;
99 many clients block images by default and show the alt text instead.\\n4. Click **Preview**, then **Save**.\\n\\n### Link to a video\\n\\n1. Record and upload the video. Copy the share link.\\n2. In the editor, write the sentence (\\"I recorded a 60-second walkthrough for you\\") and use **Link** to attach the URL, or paste the bare URL if the campaign sends plain text.\\n3. Optional: use a small thumbnail image that links to the same URL. Keep the thumbnail static; animated \\"play button\\" GIFs are a known spam signal.\\n4. Click **Save**.\\n\\n### Share a document without attaching it\\n\\n1. Upload the PDF to a shared drive or your website and link to it. If the prospect asks for it in a reply, then send it as an attachment from your inbox by hand.\\n\\n## Tips\\n\\n - If a campaign has **Send emails in plain text** enabled, images are not rendered at all; use links only.\\n - Personalised images (name on a whiteboard) are fun but still images; treat them the same way and keep them out of step 1.\\n - Do not link-shorten. bit.ly and similar domains are heavily abused and score badly.\\n - Set up a custom tracking domain (Domain â Settings) before enabling link tracking, so the tracked URL is on your domain.\\n - Test any image-bearing step with a seed list across Gmail, Outlook and Yahoo and check inbox placement in the warm-up analytics before rolling it out.\\n\\n## Troubleshooting\\n\\n - **Image shows as a broken icon** â the hosting URL is not public, or it requires login. Open it in a private browser window to check.\\n - **Deliverability dropped after adding a GIF** â remove it from the step and let the campaign run for a few days; reputation recovers with clean sends.\\n - **Editor strips the image on save** â the campaign is in plain text mode.\\n\\n## Related articles\\n\\n - Send emails as plain text\\n - Set up a custom tracking domain\\n - Preheader text and test sends\\n - Mailbox warm-up analytics guide","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1inQPGAU6gWbshyzinUKAUjEQYb6pv94BOXyDrQJb9Co/edit"},{"slug":"preheader-text-and-test-sends","title":"Preheader text and test sends","category":"campaigns-sequences","summary":"The preheader is the snippet of text an inbox shows after the subject line. In cold email it is simply the first line of your body, so what you write first decides whether the email gets opened. A â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThe preheader is the snippet of text an inbox shows after the subject line. In cold email it is simply the first line of your body, so what you write first decides whether the email gets opened. A test send lets you see the subject, preheader and rendered body in a real inbox before the campaign goes to prospects. This article covers both.\\n\\n## Preheader: what it is and how to control it\\n\\nGmail shows roughly 40â90 characters of preview text, Outlook about 40 and mobile clients as few as 30. OutreachFox does not add hidden preheader text (hidden text is a spam signal), so the preview is your opening sentence.\\n\\n1. Open the step in the editor.\\n2. Make the first line of the body a complete, specific sentence that continues the subject. Example: subject question about onboarding at Acme, first line Saw your team doubled the CS hiring page last month.\\n3. Do not start with \\"Hi {{first\\\\_name}},\\" on its own line followed by a blank line: the preview then reads \\"Hi Priya,\\" and nothing else. Put the greeting and the first sentence on the same line, or drop the greeting.\\n4. Click **Preview** and read the first 60 characters as if they were the preview.\\n5. Click **Save**.\\n\\n## Test sends\\n\\n1. In the sequence editor, click **Send Test** (next to **Preview**).\\n2. Choose the mailbox to send from and enter one or more test addresses. Use a Gmail, an Outlook and, if relevant, a Yahoo address.\\n3. Pick the contact whose data should fill the variables, or accept the sample contact.\\n4. Click **Send**. The test goes out immediately through the selected mailbox and does not count toward the campaign's contacts or reporting.\\n5. Open the test in each inbox. Check: subject and preview in the inbox list; variables filled correctly; unsubscribe line and header present if enabled; links working; signature correct; spacing and quoting in plain text mode.\\n6. Fix issues in the editor and resend the test until it is clean, then **Save and Next**.\\n\\n## Tips\\n\\n - Test with a real contact from your list, not the sample, so you see actual data quality.\\n - Send at least one test from each mailbox provider you will use (Google, Microsoft, custom SMTP); signatures and formatting differ.\\n - Tests count towards the mailbox's daily send limit at the provider, so keep them to a handful per mailbox.\\n - Check the test on a phone. Most first opens of a cold email happen on mobile, where the preview is shortest.\\n - Do not use spam-checker services that need you to email a random address; they consume reputation on a fresh mailbox. Use the built-in **Spam Words** check and a seed inbox instead.\\n\\n## Troubleshooting\\n\\n - **Test landed in spam** â on a new mailbox this is normal for the first weeks; check warm-up is on and give it 14 days before judging. Also check SPF/DKIM/DMARC on the domain.\\n - **Preview in Gmail shows part of the signature** â the body is too short; Gmail continues the snippet into the signature. Add a second sentence or accept it.\\n - **Send Test is disabled** â the step has unsaved changes, or no sender account is assigned to the campaign yet.\\n\\n## Related articles\\n\\n - Personalise, check spam words and preview before you save\\n - Send emails as plain text\\n - Enable mailbox warm-up\\n - Add a signature to a mailbox\\n - Follow-ups in the same thread vs a new thread","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1wd2KDtXg2DhLpOuWEI0LhbZPN8lmoC51Rwi83ALnSVE/edit"},{"slug":"upload-a-csv-of-contacts-and-assign-it-to-a-list","title":"Upload a CSV of contacts and assign it to a list","category":"campaigns-leads","summary":"Contacts you upload to OutreachFox live in the Contacts area and are organised into lists. A list can then be attached to any campaign, so you upload once and reuse the same leads everywhere. This â¦","body":"Contacts you upload to OutreachFox live in the **Contacts** area and are organised into lists. A list can then be attached to any campaign, so you upload once and reuse the same leads everywhere. This article covers uploading a CSV and putting it in a list. Duplicate handling and column mapping are covered in the next article.\\n\\n## Prerequisites\\n\\n - A CSV file with one contact per row and a header row. At minimum include an email column; first name, last name and company make personalisation possible.\\n - UTF-8 encoding. Export from Excel or Google Sheets as **CSV (UTF-8)**.\\n\\n## Steps\\n\\n1. In your OutreachFox account, click **Contacts** in the left navigation.\\n\\n\\n\\n2. Click **Upload Contacts**.\\n\\n\\n\\n3. Drag and drop your CSV onto the upload area, or click the area to browse and select the file from your computer, then open it.\\n\\n\\n\\n\\n\\n4. When the file finishes uploading, choose the list to assign these contacts to. Pick an existing list from the dropdown, or create a new list and give it a name.\\n\\n\\n\\n\\n\\n\\n\\n5. Continue to the duplicate-handling and column-mapping screens (see *Handle duplicates and map CSV columns to contact fields*) and click **Save and Continue** to finish.\\n\\nAfter the import
99completes, the contacts appear under **Contacts** and in the list you selected. You can now select that list when adding leads to a campaign.\\n\\n## Tips\\n\\n - Name lists by segment and date, for example SaaS CTOs â Sep 2026. It makes reuse and clean-up easier later.\\n - Keep one list per ICP or per data source rather than one giant list; campaigns and reporting stay cleaner.\\n - Verify emails before uploading (see *Email verification: how it works and what each status means*). Uploading unverified lists is the most common cause of bounce rates above 3%.\\n - Remove rows with no email address before uploading; they cannot be contacted and only add noise.\\n\\n## Troubleshooting\\n\\n - **File not accepted**: confirm the extension is .csv and the first row is a header. XLSX files must be exported to CSV first.\\n - **Special characters look wrong** (accented names, umlauts): re-export the file as CSV UTF-8.\\n - **Fewer contacts imported than rows in the file**: rows without a valid email, or duplicates you chose to skip, are not imported.\\n\\n## Related articles\\n\\n - Handle duplicates and map CSV columns to contact fields\\n - Add more leads to an active campaign (from a list or a new CSV)\\n - Import leads from Google Sheets or your CRM\\n - Email verification: how it works and what","video":{"src":"https://cdn.outreachfox.ai/help/videos/upload-a-csv-of-contacts-and-assign-it-to-a-list.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"5f32ce9b-c060-416f-9e0d-6353f3becf6b"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/upload-a-csv-of-contacts-and-assign-it-to-a-list.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"5f32ce9b-c060-416f-9e0d-6353f3becf6b"}],"_source_doc":"https://docs.google.com/document/d/1-oDEEQha8eTe8qKtA-L7rI0YSSpqkW4HMqGrO5iOXSM/edit"},{"slug":"handle-duplicates-and-map-csv-columns-to-contact-fields","title":"Handle duplicates and map CSV columns to contact fields","category":"campaigns-leads","summary":"After you upload a CSV and choose a list, OutreachFox asks two questions: what to do with contacts that already exist in your account, and which CSV column belongs to which contact field. Getting bâ¦","body":"After you upload a CSV and choose a list, OutreachFox asks two questions: what to do with contacts that already exist in your account, and which CSV column belongs to which contact field. Getting both right keeps your data clean and makes variables like first name and company fill correctly in your emails.\\n\\n## Prerequisites\\n\\n - You have uploaded a CSV and selected a list (see *Upload a CSV of contacts and assign it to a list*).\\n\\n## Steps\\n\\n1. On the duplicates option, choose what happens when a lead in the file already exists in your contacts:\\n\\n - **Skip**: the existing contact is left untouched and the row in the file is ignored.\\n - **Merge**: the existing contact is kept and updated with any new or changed values from the file.\\n\\n\\n\\n\\n\\n2. Click **Save and Continue**.\\n\\n\\n\\n3. Map each column from your file to the matching contact field. OutreachFox pre-selects fields whose header names match; check each one and correct any that are wrong. Leave a column unmapped if you do not need it.\\n\\n\\n\\n4. Click **Save and continue** to complete the import.\\n\\n\\n\\nThe contacts now appear in the list you chose, with every mapped column stored on the contact record.\\n\\n## Which option should I choose for duplicates?\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Situation\\\\*\\\\* | \\\\*\\\\*Choose\\\\*\\\\* |\\n| Re-uploading a list you already enriched in OutreachFox | \\\\*\\\\*Skip\\\\*\\\\* â protects data you already have |\\n| Uploading a fresher export from your CRM | \\\\*\\\\*Merge\\\\*\\\\* â updates titles, companies, phone numbers |\\n| Not sure | \\\\*\\\\*Skip\\\\*\\\\* â it never overwrites anything |\\n\\nDuplicates are detected on the email address.\\n\\n## Tips\\n\\n - Use the standard fields (**First Name**, **Last Name**, **Email**, **Company**, **Title**, **Website**, **LinkedIn URL**, **Phone**) wherever possible; they map directly to the personalisation variables in the sequence editor.\\n - Map extra columns (for example pain\\\\_point or icebreaker) to custom fields so you can insert them with **Variables** in the editor.\\n - Rename headers in your CSV to match OutreachFox field names before uploading;
99 auto-mapping then does most of the work.\\n - Check a sample of contacts after import to confirm first names are not landing in the last-name field. A wrong mapping is the usual reason a first-line reads \\"Hi Smith\\".\\n\\n## Troubleshooting\\n\\n - **A column is missing from the mapping screen**: the header cell in your CSV is probably empty. Add a header and re-upload.\\n - **First and last name are in one column**: split them in your spreadsheet before uploading. OutreachFox maps one column to one field.\\n - **Everything was skipped**: the whole list already exists in your account. Re-upload with **Merge** if you want to refresh the data.\\n\\n## Related articles\\n\\n - Upload a CSV of contacts and assign it to a list\\n - Import leads from Google Sheets or your CRM\\n - Managing bounced leads and cleaning your lists\\n - Waterfall enrichment: append data fields to yo","video":{"src":"https://cdn.outreachfox.ai/help/videos/handle-duplicates-and-map-csv-columns-to-contact-fields.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"763418ae-7132-4aae-b0c1-dab40b34294b"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/handle-duplicates-and-map-csv-columns-to-contact-fields.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"763418ae-7132-4aae-b0c1-dab40b34294b"}],"_source_doc":"https://docs.google.com/document/d/1HxstqN4n9nO_Y6AQOmtnETPgUYukMSPwCkODecLl2CM/edit"},{"slug":"add-more-leads-to-an-active-campaign","title":"Add more leads to an active campaign (from a list or a new CSV)","category":"campaigns-leads","summary":"You do not need to create a new campaign when you have more leads. Open the running campaign, add contacts from a saved list or a new CSV, and resume. New leads join the sequence from step 1; leadsâ¦","body":"You do not need to create a new campaign when you have more leads. Open the running campaign, add contacts from a saved list or a new CSV, and resume. New leads join the sequence from step 1; leads already in the campaign are not affected.\\n\\n## Prerequisites\\n\\n - A launched campaign.\\n - Either a list already in **Contacts**, or a CSV ready to upload.\\n\\n## Steps\\n\\n1. In **Campaigns**, select the campaign you want to add contacts to.\\n\\n\\n\\n2. Click **Contacts** inside the campaign.\\n\\n\\n\\n3. Click **Upload Contacts**.\\n\\n\\n\\n4. Choose the source:\\n\\
99n - To use a saved list, select **Lists** and pick the list.\\n\\n\\n\\n - To upload new leads, click **Upload new CSV** and select your file. Map the columns as usual.\\n\\n\\n\\n5. On the same screen you can add sender mailboxes. Add any extra mailboxes you want to send from now that the campaign has more leads.\\n\\n\\n\\n6. Click **Next**.\\n\\n\\n\\n7. Click **Resume Campaign** to put the campaign back into sending with the new leads.\\n\\n\\n\\nThe campaign's **Contacts** tab now shows the added leads with status **Not contacted**. They are picked up on the next sending window according to your daily new-contacts limit and sending strategy.\\n\\n## Tips\\n\\n - Adding leads pauses the campaign while you edit. Always finish with **Resume Campaign**; if you close the editor early the campaign stays paused.\\n - If you add a large batch (for example 2,000 leads) and want your existing follow-ups to keep flowing, set the sending strategy to **Follow-ups first** or **Balanced** before resuming.\\n - Add sender mailboxes in proportion: roughly one warmed mailbox per 30â50 new emails per day.\\n - Leads that already exist in the campaign are not added twice.\\n\\n## Troubleshooting\\n\\n - **New leads are not getting emails**: check the **Daily new contacts limit** in campaign **Sett
99ings**; if today's quota is already used, the new leads start tomorrow.\\n - **Campaign shows as paused after adding leads**: you did not click **Resume Campaign**. Open the campaign and resume it.\\n - **List not visible under Lists**: the list is empty or was created under **Contacts** after you opened the dialog. Close and reopen **Upload Contacts**.\\n\\n## Related articles\\n\\n - Upload a CSV of contacts and assign it to a list\\n - Set the daily new-contacts limit for a campaign\\n - Choose a sending strategy: follow-ups first, balanced, or new leads first\\n - Push found leads stra","video":{"src":"https://cdn.outreachfox.ai/help/videos/add-more-leads-to-an-active-campaign.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"8c577e8f-4b0f-47eb-9e00-538737618241"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/add-more-leads-to-an-active-campaign.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"8c577e8f-4b0f-47eb-9e00-538737618241"}],"_source_doc":"https://docs.google.com/document/d/1QwjDPLWdlCFvmd21lc2q0ZScJdScl9o8nZDeHTerBXA/edit"},{"slug":"check-lead-statuses-and-replies-inside-a-campaign","title":"Check lead statuses and replies inside a campaign","category":"campaigns-leads","summary":"Every lead in a campaign has a status that tells you where it is in the sequence and how it responded. The campaign Contacts tab lets you search for a lead or filter the whole list by status, so yoâ¦","body":"Every lead in a campaign has a status that tells you where it is in the sequence and how it responded. The campaign **Contacts** tab lets you search for a lead or filter the whole list by status, so you can pull up everyone who replied, everyone who bounced, and so on in one click.\\n\\n## Steps\\n\\n1. In your OutreachFox account, open the campaign you want to review.\\n\\n\\n\\n2. Click **Contacts** to view the lead list for that campaign.\\n\\n\\n\\n3. Use the search bar to look up a specific lead, or click **Status** to filter leads by their current status.\\n\\n\\n\\n4. To see everyone who has replied, select the **Replied** filter.\\n\\n\\n\\n5. To see emails that did not go through, select the **Bounced** filter.\\n\\n\\n\\nIf the campaign has not sent any emails yet, the list shows **No data available**. Statuses only populate once sending starts.\\n\\n\\n\\n## What the filters are for\\n\\n - **Replied**: your working queue. Open each lead to read the reply and its AI category (Interested, Not interested, Out of office, and so on).\\n - **Bounced**: leads to remove from your lists. A campaign bounce rate above 3% starts to hurt deliverability for every mailbox in the campaign.\\n - **Not contacted / In progress**: leads still waiting for step 1 or moving through the sequence.\\n - **Unsubscribed**: leads who clicked the unsubscribe link. They are suppressed automatically.\\n\\nThe full list of statuses is explained in *Lead statuses explained*.\\n\\n## Tips\\n\\n - Check **Replied** daily. Reply speed is the single biggest factor in converting an interested reply to a meeting.\\n - Check **Bounced** after the first day of sending. If it is more than a handful of leads, pause and verify the rest of the list before continuing.\\n - Combine the **Status** filter with search to find one person quickly in a large campaign.\\n\\n## Troubleshooting\\n\\n - **A lead replied but is not under Replied**: replies are detected when OutreachFox reads the sending mailbox. Confirm the mailbox is still connected under **Mailbox**, and allow a few minutes for sync.\\n - **No data available on a live campaign**: no lead has reached that status yet; try another filter or clear the filter.\\n\\n## Related articles\\n\\n - Lead statuses explained\\n - Set up AI reply categorisation and create custom categories\\n - Managing bounced leads and cleaning your lists\\n - Lead activity log: see every email, open and reply","video":{"src":"https://cdn.outreachfox.ai/help/videos/check-lead-statuses-and-replies-inside-a-campaign.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"50c4498d-bbb7-47ea-9101-81af41dbceeb"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/check-lead-statuses-and-replies-inside-a-campaign.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"50c4498d-bbb7-47ea-9101-81af41dbceeb"}],"_source_doc":"https://docs.google.com/document/d/1kz1hDDU5iUpCIJEQlT5iSpx2COz9n_kxzIA3-Pxo5Cs/edit"},{"slug":"set-up-ai-reply-categorisation-and-create-custom-categories","title":"Set up AI reply categorisation and create custom categories","category":"campaigns-leads","summary":"AI reply categorisation reads every reply your campaigns receive and labels it with a category such as Interested, Not interested or Out of office. You can add your own categories for cases the defâ¦","body":"AI reply categorisation reads every reply your campaigns receive and labels it with a category such as Interested, Not interested or Out of office. You can add your own categories for cases the defaults do not cover. Categories drive the reply filters in each campaign and make it easy to hand interested leads to the right person.\\n\\n## Steps\\n\\n1. Click **Campaign Settings** (bottom-left of the left navigation).\\n\\n\\n\\n2. Select **Reply Categorization**.\\n\\n\\n\\n3. Review the default categories already listed. These are applied to all campaigns automatically.\\n\\n\\n\\n4. To add your own, click **Create new category** at the top right.\\n\\n\\n\\n5. Enter a name for the category. For example, Dicey for leads who sound both interested and not interested and you want to review by hand.\\n\\n\\n\\n6. Add a description that explains when a reply belongs in this category. The AI uses this text to decide, so write it as plain instructions: \\"Lead asks a question about pricing or timing but does not commit either way.\\"\\n\\n\\n\\n7. Set the **sentiment** (positive, neutral or negative) and choose whether replies in this category are **useful**.\\n\\n\\n\\n8. Click **Save reply category**.\\n\\n\\n\\nFrom now on, incoming replies that match the description are assigned to the new category automatically. You can filter by it in the campaign **Contacts** tab.\\n\\n## Why sentiment and \\"useful\\" matter\\n\\n - **Sentiment** feeds campaign reporting: positive replies count toward your positive reply rate, which is the metric that tells you whether copy is working.\\n - **Useful** separates real conversations from noise. Auto-replies, bounces and \\"unsubscribe me\\" are not useful; questions and objections are. Mark a category useful if a human should read it.\\n\\n## Tips\\n\\n - Keep custom categories to a handful. Overlapping categories confuse the classifier and produce inconsistent labels.\\n - Write descriptions with examples of phrases you expect (\\"
99send me more info\\", \\"not the right person, try X\\").\\n - A common useful set beyond the defaults: Referral (lead points you to a colleague), Later (asks you to come back in a quarter), Pricing question.\\n - Review the **Replied** filter weekly and correct any misclassified replies; it shows you where a description needs tightening.\\n\\n## Troubleshooting\\n\\n - **Replies land in the wrong category**: the description is too broad or overlaps another category. Edit the description to be more specific.\\n - **New category never gets used**: replies that fit it are rare, or an existing default category matches first. Make the description more distinctive.\\n\\n## Related articles\\n\\n - Check lead statuses and replies inside a campaign\\n - Lead statuses explained\\n - Lead activity log: see every email, open and","video":{"src":"https://cdn.outreachfox.ai/help/videos/set-up-ai-reply-categorisation-and-create-custom-categories.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"c88f730a-de60-46de-84e1-61a816224b80"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/set-up-ai-reply-categorisation-and-create-custom-categories.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"c88f730a-de60-46de-84e1-61a816224b80"}],"_source_doc":"https://docs.google.com/document/d/1Eqkzt689xuHaVwE_TbiVuF4dbnpktaXLTHGK6QM48KQ/edit"},{"slug":"lead-statuses-explained","title":"Lead statuses explained","category":"campaigns-leads","summary":"Every lead in a campaign carries one status. It tells you where the lead is in the sequence and whether OutreachFox will send them anything else. You see statuses in the campaign Contacts tab and câ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nEvery lead in a campaign carries one status. It tells you where the lead is in the sequence and whether OutreachFox will send them anything else. You see statuses in the campaign **Contacts** tab and can filter on them with the **Status** dropdown. This article lists each status, what triggers it, and what happens to the lead next.\\n\\n## Sequence statuses\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Status\\\\*\\\\* | \\\\*\\\\*Meaning\\\\*\\\\* | \\\\*\\\\*Will more emails be sent?\\\\*\\\\* |\\n| \\\\*\\\\*Not contacted\\\\*\\\\* | Lead is in the campaign but step 1 has not been sent yet. | Yes, when the daily new-contacts limit and schedule allow. |\\n| \\\\*\\\\*In progress\\\\*\\\\* | At least one step has been sent and the lead is waiting for the next step or a reply. | Yes, until the sequence ends or the lead replies. |\\n| \\\\*\\\\*Completed\\\\*\\\\* | Every step in the sequence has been sent and the lead never replied. | No. |\\n| \\\\*\\\\*Paused\\\\*\\\\* | You paused this lead manually. | No, until you resume the lead. |\\n| \\\\*\\\\*Stopped\\\\*\\\\* | You stopped the lead, or a condition in the sequence ended it. | No. |\\n\\n## Response statuses\\n\\nThese are set automatically when OutreachFox reads the reply in the sending mailbox. A reply stops the sequence for that lead.\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Status\\\\*\\\\* | \\\\*\\\\*Meaning\\\\*\\\\* | \\\\*\\\\*Recommended action\\\\*\\\\* |\\n| \\\\*\\\\*Replied\\\\*\\\\* | Any human reply was received. The AI reply category (below) says what kind. | Read and answer within a day. |\\n| \\\\*\\\\*Interested\\\\*\\\\* | Reply classified as positive: wants a call, asks for more information, agrees to next step. | Book the meeting. Move to your CRM. |\\n| \\\\*\\\\*Not interested\\\\*\\\\* | Reply classified as negative: declines, \\"no thanks\\", \\"remove me\\". | Do not re-add to future campaigns. |\\n| \\\\*\\\\*Out of office\\\\*\\\\* | Auto-responder detected. | Sequence continues after the return date; no action needed. |\\n| \\\\*\\\\*Wrong person\\\\*\\\\* | Lead says they are not the right contact, often naming someone else. | Add the referred person as a new lead. |\\n| \\\\*\\\\*Unsubscribed\\\\*\\\\* | Lead clicked the unsubscribe link or asked to be removed and was marked as such. | Nothing. The address is suppressed across all campaigns. |\\n\\n## Delivery statuses\\n\\
99n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Status\\\\*\\\\* | \\\\*\\\\*Meaning\\\\*\\\\* | \\\\*\\\\*Recommended action\\\\*\\\\* |\\n| \\\\*\\\\*Bounced\\\\*\\\\* | The receiving server rejected the email (hard bounce: address does not exist; soft bounce: mailbox full, temporary block). | Remove hard bounces from lists. Verify the rest of the list if bounces exceed 3%. |\\n| \\\\*\\\\*Blocked\\\\*\\\\* | The sending mailbox refused to send, usually because of a daily limit or authentication failure. | Check the mailbox under \\\\*\\\\*Mailbox\\\\*\\\\*. |\\n\\n## How statuses interact with AI categories\\n\\n**Replied** is the umbrella status. The AI reply categorisation (see *Set up AI reply categorisation and create custom categories*) assigns a category such as Interested, Not interested, Out of office or a custom one. The campaign **Status** filter exposes the most common categories directly so you can jump to them.\\n\\n## Tips\\n\\n - Filter **Interested** every morning; those leads are your pipeline.\\n - Filter **Bounced** after day one of any new list. A clean list bounces under 2%.\\n - Do not delete **Not interested** or **Unsubscribed** leads from **Contacts**; keeping them is what stops you emailing them again from another campaign.\\n - Use **Out of office** as a signal that the address is real and monitored; these leads convert well on the next follow-up.\\n\\n## Troubleshooting\\n\\n - **Lead stuck on Not contacted for days**: the campaign is paused, the sending schedule has no window today, or the daily new-contacts limit is reached. See *Why did my campaign pause or stop sending?*\\n - **Lead replied but status is In progress**: the reply came to a mailbox that is not connected to OutreachFox, or came from a different address. Mark the lead as replied manually from the lead's activity log.\\n\\n## Related articles\\n\\n - Check lead statuses and replies inside a campaign\\n - Set up AI reply categorisation and create custom categories\\n - Pause, stop or delete leads in a campaign\\n - Managing bounced leads and cleaning your lists\\n - Why did my campaign pause or stop sending?","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1ChgE4DLO9bK1jJPqs0PONp4yt1VcdEJLhaeQbcE4xso/edit"},{"slug":"pause-stop-or-delete-leads-in-a-campaign","title":"Pause, stop or delete leads in a campaign","category":"campaigns-leads","summary":"Sometimes one lead needs different treatment from the rest of the campaign: a prospect asks you to hold off for a month, a colleague is already talking to them, or the address turns out to be wrongâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nSometimes one lead needs different treatment from the rest of the campaign: a prospect asks you to hold off for a month, a colleague is already talking to them, or the address turns out to be wrong. You can act on individual leads (or a selection) from the campaign **Contacts** tab without touching the campaign itself.\\n\\n## The three actions\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Action\\\\*\\\\* | \\\\*\\\\*What happens\\\\*\\\\* | \\\\*\\\\*Reversible?\\\\*\\\\* |\\n| \\\\*\\\\*Pause\\\\*\\\\* | Sequence stops for this lead. Their position is kept. | Yes, \\\\*\\\\*Resume\\\\*\\\\* picks up at the next step. |\\n| \\\\*\\\\*Stop\\\\*\\\\* | Sequence ends for this lead. Status becomes \\\\*\\\\*Stopped\\\\*\\\\*. History is kept. | No, but you can re-add the lead to another campaign. |\\n| \\\\*\\\\*Delete\\\\*\\\\* | Lead is removed from the campaign entirely. Their contact record stays in \\\\*\\\\*Contacts\\\\*\\\\*. | No. |\\n\\n## Steps\\n\\n1. Open the campaign in **Campaigns**.\\n2. Click **Contacts**.\\n3. Find the lead with the search bar or the **Status** filter.\\n4. Tick the checkbox next to the lead, or tick several to act in bulk.\\n5. Open the actions menu (three dots or the bulk-actions bar) and choose **Pause**, **Stop** or **Delete**.\\n6. Confirm the dialog.\\n\\nThe lead's status updates immediately. Paused leads show **Paused**; use the same menu and choose **Resume** to continue them.\\n\\n## When to use which\\n\\
99n - **Pause** when a lead says \\"not now, try me in Q1\\". Resume them later, or note the date and stop them instead if you plan a fresh campaign.\\n - **Stop** when a conversation is happening outside OutreachFox (a colleague booked a call, the lead replied from another address). Stopping prevents an embarrassing automated follow-up.\\n - **Delete** when the lead should never have been in the campaign: wrong ICP, an existing customer, a competitor. Deleting from the campaign does not delete the contact from **Contacts**; delete there too if you want them gone for good.\\n - For bounced and unsubscribed leads you do not need to do anything; OutreachFox stops them automatically.\\n\\n## Tips\\n\\n - Bulk-stop everyone who replied **Not interested** before you reuse a list in a new campaign, so they are not contacted again.\\n - Prefer **Stop** over **Delete** for anyone who replied; you keep the thread and the AI category for reporting.\\n - If you need to pause everyone, pause the campaign instead (campaign menu â **Pause**), not the leads one by one.\\n\\n## Troubleshooting\\n\\n - **Paused lead still received an email**: the email was already queued in the sending window before you paused. Pausing takes effect on the next step.\\n - **Cannot find the lead**: check the **Status** filter is cleared; a filtered view hides leads in other statuses.\\n - **Deleted lead appears again**: they were re-added from a list that still contains them. Remove them from the list in **Contacts** as well.\\n\\n## Related articles\\n\\n - Lead statuses explained\\n - Move or copy leads between campaigns\\n - Managing bounced leads and cleaning your lists\\n - Why did my campaign pause or stop sending?","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/148GZz62jnLyTDKAucuX9YjaTrXletHaUdw_3u5_4JCA/edit"},{"slug":"move-or-copy-leads-between-campaigns","title":"Move or copy leads between campaigns","category":"campaigns-leads","summary":"Leads often need a second campaign: people who never replied to your first sequence, leads who said \\"later\\", or a segment that turned out to deserve different copy. Because every lead in OutreachFoâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nLeads often need a second campaign: people who never replied to your first sequence, leads who said \\"later\\", or a segment that turned out to deserve different copy. Because every lead in OutreachFox is a contact that can belong to any number of lists, moving leads between campaigns is a matter of selecting them, putting them in a list, and adding that list to the target campaign.\\n\\n## Move vs copy\\n\\n - **Copy**: the lead stays in the source campaign (in whatever status they have) and is also added to the target campaign. Use this when the source campaign is finished and you only want the history kept.\\n - **Move**: the lead is stopped or deleted in the source campaign and added to the target. Use this when the source campaign is still sending and you do not want the lead to receive two sequences at once.\\n\\n## Steps\\n\\n1. Open the source campaign and click **Contacts**.\\n2. Use the **Status** filter to select the group you want, for example **Completed** (finished the sequence without replying) or **Not interested**.\\n3. Tick the leads (use the select-all checkbox for the whole filtered view).\\n4. From the actions menu choose **Add to list**, then pick an existing list or create a new one such as Q3 no-reply â retarget.\\n5. If you are moving rather than copying, keep the selection and choose **Stop** (keeps history) or **Delete** (removes from campaign).\\n6. Open the target campaign, click **Contacts** â **Upload Contacts** â **Lists**, select the list you just created, click **Next**, then **Resume Campaign** (or **Launch Campaign** for a new campaign).\\n\\nThe leads appear in the target campaign as **Not contacted** and start at step 1 of the new sequence.\\n\\n## Alternative: export and re-import\\n\\nIf your workflow lives in a spreadsheet, export the filtered leads to CSV (see *Export leads to CSV*), edit the file, and upload it into the target campaign with **Upload new CSV**. Choose **Merge** on the duplicate screen so enrichment data on the contact is preserved.\\n\\n## Tips\\n\\n - Wait at least 4â6 weeks before retargeting leads who finished a sequence with no reply, and change the angle, not just the wording.\\n - Never copy **Unsubscribed** or **Bounced** leads; OutreachFox suppresses unsubscribes, but bounced addresses will bounce again and hurt the new campaign's reputation.\\n - Name retarget lists with the source campaign in the name so you can trace where a lead came from later.\\n - A lead can be in two campaigns at once. OutreachFox does not stop the first sequence automatically, so stop or delete them in the source if both campaigns are live.\\n\\n## Troubleshooting\\n\\n - **Leads did not appear in the target campaign**: they already existed in that campaign (duplicates are not added twice) or the list you selected is empty.\\n - **Lead received emails from both campaigns**: you copied instead of moved. Stop the lead in the campaign you do not want.\\n\\n## Related articles\\n\\n - Pause, stop or delete leads in a campaign\\n - Add more leads to an active campaign (from a list or a new CSV)\\n - Export leads to CSV\\n - Lead statuses explained","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1r2tI_iuJHnMJc3wHOoUMVFF4iZIB-WIvV6E3PxQgZfE/edit"},{"slug":"export-leads-to-csv","title":"Export leads to CSV","category":"campaigns-leads","summary":"Export leads when you need them outside OutreachFox: to push interested replies into your CRM, share a bounce list with your data provider, or keep an offline copy of an enriched list. You can expoâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nExport leads when you need them outside OutreachFox: to push interested replies into your CRM, share a bounce list with your data provider, or keep an offline copy of an enriched list. You can export from a campaign (with campaign statuses) or from **Contacts** (the full contact record, across campaigns).\\n\\n## Export from a campaign\\n\\nUse this when you want the status, step reached and reply category for each lead.\\n\\n1. Open the campaign and click **Contacts**.\\n2. Optionally filter with **Status** (for example **Interested**) or search, so only the leads you want are shown.\\n3. Tick the select-all checkbox, or tick individual leads.\\n4. Open the actions menu and choose **Export** (or **Export CSV**).\\n5. The file downloads to your browser.\\n\\nThe export includes the contact fields (email, first name, last name, company, title, custom fields) plus campaign columns such as status, last step sent, reply category, and timestamps for sent, opened and replied.\\n\\n## Export from Contacts\\n\\nUse this for a full list, independent of any campaign.\\n\\n1. Click **Contacts** in the left navigation.\\n2. Select a list, or filter the contacts view.\\n3. Tick the contacts to export (select all for the whole list).\\n4. Choose **Export** from the actions menu.\\n\\nThe export contains every contact field, including enrichment fields, but no campaign-specific status.\\n\\n## Common exports\\n\\
99n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Goal\\\\*\\\\* | \\\\*\\\\*Where\\\\*\\\\* | \\\\*\\\\*Filter\\\\*\\\\* |\\n| Hand-off to CRM | Campaign | \\\\*\\\\*Interested\\\\*\\\\* |\\n| Suppression list for a data vendor | Campaign | \\\\*\\\\*Bounced\\\\*\\\\* + \\\\*\\\\*Unsubscribed\\\\*\\\\* |\\n| Retarget in a new tool | Campaign | \\\\*\\\\*Completed\\\\*\\\\* |\\n| Back-up of an enriched list | Contacts | List |\\n\\n## Tips\\n\\n - Export **Bounced** leads after every campaign and remove them from your source spreadsheet; re-uploading them later is how bounce rates creep back up.\\n - Keep the exported column headers when you re-import; OutreachFox auto-maps them.\\n - Exports are a snapshot. If replies keep coming in, export again rather than editing the old file.\\n - Large exports (10,000+ rows) may take a minute to prepare; wait for the download rather than clicking again.\\n\\n## Troubleshooting\\n\\n - **Export button greyed out**: nothing is selected. Tick at least one lead.\\n - **File opens with all data in one column**: your spreadsheet app used the wrong delimiter. Use *Data â From text/CSV* in Excel, or open it in Google Sheets.\\n - **Missing custom fields**: custom fields only appear if they were mapped during import or added by enrichment.\\n\\n## Related articles\\n\\n - Move or copy leads between campaigns\\n - Managing bounced leads and cleaning your lists\\n - Import leads from Google Sheets or your CRM\\n - Check lead statuses and replies inside a campaign","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1EMTEAcrHIAmtBPGfXmtC60rLH4Fq9bm1augwOsNRM7Y/edit"},{"slug":"managing-bounced-leads-and-cleaning-your-lists","title":"Managing bounced leads and cleaning your lists","category":"campaigns-leads","summary":"A bounce is an email the receiving server rejected. Bounces are the fastest way to damage sender reputation: mailbox providers treat a sender who keeps hitting dead addresses as a spammer. Keep youâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nA bounce is an email the receiving server rejected. Bounces are the fastest way to damage sender reputation: mailbox providers treat a sender who keeps hitting dead addresses as a spammer. Keep your campaign bounce rate under 3% (under 2% is the goal), and clean lists before and after every campaign. This article explains the two bounce types, how OutreachFox handles them, and a repeatable clean-up routine.\\n\\n## Hard vs soft bounces\\n\\n| | | | |\\n| :-: | :-: | :-: | :-: |\\n| \\\\*\\\\*Type\\\\*\\\\* | \\\\*\\\\*Cause\\\\*\\\\* | \\\\*\\\\*OutreachFox action\\\\*\\\\* | \\\\*\\\\*Your action\\\\*\\\\* |\\n| \\\\*\\\\*Hard bounce\\\\*\\\\* | Address does not exist, domain does not exist, recipient blocked you permanently | Lead is marked \\\\*\\\\*Bounced\\\\*\\\\* and removed from the sequence | Remove from all lists; never re-upload |\\n| \\\\*\\\\*Soft bounce\\\\*\\\\* | Mailbox full, server temporarily unavailable, message too large, greylisting | Lead is marked \\\\*\\\\*Bounced\\\\*\\\\* after retries fail | Verify the address; re-add only if verification passes |\\n\\n## Steps: clean a campaign after bounces\\n\\n1. Open the campaign and click **Contacts**.\\n2. Set the **Status** filter to **Bounced**.\\n3. Tick select-all and choose **Export** to keep a suppression file.\\n4. With the same selection, choose **Delete** to remove them from the campaign (optional; bounced leads no longer receive emails either way).\\n5. Go to **Contacts**, open the source list, and remove the same addresses so they are not reused.\\n6. If the bounce rate is above 3%, pause the campaign and run the remaining **Not contacted** leads through email verification before resuming (see *Email verification: how it works and what each status means*).\\n\\n## Steps: prevent bounces before launch\\n\\n1. Verify every new list before uploading, or use the lead database's **verified** emails.\\n2. Upload with **Skip** for duplicates so you never re-import an address that bounced earlier and was cleaned.\\n3. In campaign **Sett
99ings** â **Show advanced configurations**, set **Pause campaign when bounce rate reaches** to 3% (see *Bounce protection*). This is your safety net.\\n4. Send from mailboxes that have warmed up for at least 14 days; new mailboxes bounce more because receiving servers do not trust them yet.\\n\\n## Tips\\n\\n - Catch-all domains are the main source of \\"verified\\" addresses that still bounce. Treat **catch-all / accept-all** results as risky and send them from a separate campaign with a lower daily limit.\\n - Role addresses (info@, sales@, support@) bounce and get reported as spam more often. Drop them.\\n - Old lists decay at roughly 2â3% per month as people change jobs. Re-verify anything older than 90 days.\\n - Watch the **Bounce rate** on the **Mailbox** â **Warm up** tab too; a single mailbox with a high bounce rate can be the cause rather than the list.\\n\\n## Troubleshooting\\n\\n - **Bounce rate suddenly spikes on a list that was fine**: usually a mailbox problem (authentication broken, domain blacklisted), not the list. Check **Domain** and **Mailbox** health before blaming the data.\\n - **Bounced leads still show in Contacts**: expected. The campaign status is **Bounced**; the contact record is kept so you can suppress it. Delete from **Contacts** only if you want it gone entirely.\\n - **Verified addresses still bounce**: verification is a point-in-time check and cannot confirm catch-all domains. A 1â2% residual bounce rate on verified lists is normal.\\n\\n## Related articles\\n\\n - Bounce protection: auto-pause a campaign at a bounce-rate threshold\\n - Email verification: how it works and what each status means\\n - Lead statuses explained\\n - Export leads to CSV\\n - Unlock verified emails and how credits are charged","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1EA6BPHEsJIutiZSvC9iIRY3Z_YLTI_d1Lcv_rzBc2Es/edit"},{"slug":"lead-activity-log","title":"Lead activity log: see every email, open and reply for a contact","category":"campaigns-leads","summary":"The activity log is the full history of one lead: every step that was sent, from which mailbox, when it was opened, which links were clicked, and the reply text. Use it before you answer a reply, wâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThe activity log is the full history of one lead: every step that was sent, from which mailbox, when it was opened, which links were clicked, and the reply text. Use it before you answer a reply, when a lead claims they never heard from you, or to work out why a lead is stuck.\\n\\n## Steps\\n\\n1. Open the campaign in **Campaigns** and click **Contacts**.\\n2. Find the lead with the search bar or a **Status** filter.\\n3. Click the lead's name or email to open the lead panel.\\n4. Select the **Activity** (or **Timeline**) tab.\\n\\nYou see a chronological list of events, newest first.\\n\\n## What each event means\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Event\\\\*\\\\* | \\\\*\\\\*Meaning\\\\*\\\\* |\\n| \\\\*\\\\*Added\\\\*\\\\* | Lead was added to the campaign, from which list or CSV. |\\n| \\\\*\\\\*Sent â Step N (Variant A)\\\\*\\\\* | The email for that step was sent. Shows the sending mailbox and the subject line. |\\n| \\\\*\\\\*Opened\\\\*\\\\* | The tracking pixel loaded. Multiple opens are logged separately. |\\n| \\\\*\\\\*Clicked\\\\*\\\\* | A tracked link was clicked, with the URL. |\\n| \\\\*\\\\*Replied\\\\*\\\\* | A reply was received. The reply body and the AI category appear here. |\\n| \\\\*\\\\*Bounced\\\\*\\\\* | The email was rejected, with the bounce reason from the receiving server. |\\n| \\\\*\\\\*Unsubscribed\\\\*\\\\* | The lead used the unsubscribe link. |\\n| \\\\*\\\\*Paused / Resumed / Stopped\\\\*\\\\* | Manual actions, with who did them. |\\n| \\\\*\\\\*Status changed\\\\*\\\\* | Any status change, automatic or manual. |\\n\\nFrom the same panel you can read the full email thread, reply from the sending mailbox, and change the lead's status or reply category manually.\\n\\n## Tips\\n\\n - Read the thread here before replying so you match the tone and the variant the lead actually received.\\n - Opens are a weak signal. Apple Mail Privacy Protection and corporate security scanners trigger opens automatically, so a lead with five opens and no reply may never have read anything. Clicks and replies are reliable.\\n - Use the bounce reason text to distinguish hard bounces (\\"user unknown\\", \\"no such recipient\\") from soft bounces (\\"mailbox full\\", \\"try again later\\").\\n - If a lead replied from a different address, mark the original lead as replied here so follow-ups stop.\\n\\n## Troubleshooting\\n\\n - **No opens or clicks logged**: open tracking or link tracking is turned off for the campaign, or the recipient's client blocks images. See *Open tracking and link tracking*.\\n - **Sent event exists but lead says nothing arrived**: check the bounce events; if none, the email most likely landed in spam. Review mailbox health under **Mailbox** â **Warm up**.\\n - **Reply is missing from the log**: replies are read from the sending mailbox. Confirm the mailbox is still connected and that the reply was sent to that address, not to a signature address.\\n\\n## Related articles\\n\\n - Check lead statuses and replies inside a campaign\\n - Lead statuses explained\\n - Open tracking and link tracking (and when to turn them off)\\n - Set up AI reply categorisation and create custom categories","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1RFnHzeJd2Hnu8OOUthALW_ibIV8tpsstAUT2x1Tbd5U/edit"}
99,{"slug":"import-leads-from-google-sheets-or-your-crm","title":"Import leads from Google Sheets or your CRM","category":"campaigns-leads","summary":"OutreachFox imports contacts from CSV files. If your leads live in Google Sheets, HubSpot, Salesforce, Pipedrive or another CRM, export them to CSV, tidy the columns, and upload. This article givesâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nOutreachFox imports contacts from CSV files. If your leads live in Google Sheets, HubSpot, Salesforce, Pipedrive or another CRM, export them to CSV, tidy the columns, and upload. This article gives the export steps for the common sources and a column layout that maps automatically.\\n\\n## Prepare the sheet\\n\\nWhatever the source, aim for these headers in the first row. Anything else can be mapped to custom fields.\\n\\nemail, first\\\\_name, last\\\\_name, company, title, website, linkedin\\\\_url, phone, city, country\\n\\nRules:\\n\\n - One contact per row, one email per contact.\\n - No merged cells, no blank header cells, no totals row at the bottom.\\n - Remove c
99ontacts that are already customers, open opportunities, or on your do-not-contact list before exporting.\\n\\n## From Google Sheets\\n\\n1. Open the sheet and make sure the tab with your leads is active.\\n2. **File** â **Download** â **Comma Separated Values (.csv)**. Only the current tab is exported.\\n3. In OutreachFox, go to **Contacts** â **Upload Contacts**, drop the file, choose or create a list, handle duplicates, map columns, and click **Save and Continue**.\\n\\n## From HubSpot\\n\\n1. **Contacts** â **Contacts**, apply a filter or open a saved view.\\n2. **Export** â format **CSV**, choose the properties (at least Email, First name, Last name, Company name, Job title).\\n3. HubSpot emails you the file; download it and upload it in OutreachFox as above.\\n\\n## From Salesforce\\n\\n1. Create a **Report** on Leads or Contacts with the columns you need.\\n2. **Export** â **Details Only** â format **CSV**.\\n3. Upload in OutreachFox.\\n\\n## From Pipedrive\\n\\n1. **Contacts** â **People**, filter as needed.\\n2. **...** â **Export filter results** â **CSV**.\\n3. Upload in OutreachFox.\\n\\n## Adding leads straight into a campaign\\n\\nIf the list is for one campaign only, skip **Contacts** and upload inside the campaign instead: open the campaign â **Contacts** â **Upload Contacts** â **Upload new CSV** â map â **Next** â **Resume Campaign** or **Launch Campaign**.\\n\\n## Tips\\n\\n - Export the CRM's record ID as a column and map it to a custom field. When you export replies back out of OutreachFox you can match rows without relying on email.\\n - Choose **Merge** for duplicates when re-importing from a CRM; it refreshes titles and companies that changed.\\n - Verify emails from a CRM before sending. CRM data is often years old, and a stale list bounces at 10% or more.\\n - Keep a source column (hubspot-2026-09) mapped to a custom field so you can compare reply rates by data source later.\\n\\n## Troubleshooting\\n\\n - **Google Sheets export has extra empty rows**: delete the blank rows at the bottom of the sheet; they import as contacts with no email and are rejected.\\n - **Dates or phone numbers look mangled**: the spreadsheet reformatted them. Set those columns to plain text before exporting.\\n - **HubSpot export includes thousands of unwanted contacts**: export from a filtered view or list, not from All contacts.\\n\\n## Related articles\\n\\n - Upload a CSV of contacts and assign it to a list\\n - Handle duplicates and map CSV columns to contact fields\\n - Export leads to CSV\\n - Email verification: how it works and what each status means","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1v3Wn19D4D0KhxI1rfDIzlV4ghiDGg-ZQIgT9HQDkDQA/edit"},{"slug":"create-a-sending-schedule","title":"Create a sending schedule (time zone, holidays, days, send windows)","category":"campaigns-schedule","summary":"A sending schedule defines when a campaign is allowed to send: the time zone, the days of the week, the hours within those days, and whether public holidays are skipped. Schedules are created once â¦","body":"A sending schedule defines when a campaign is allowed to send: the time zone, the days of the week, the hours within those days, and whether public holidays are skipped. Schedules are created once under **Campaign Settings** and then applied to any campaign, so you can keep a \\"US business hours\\" and a \\"UK business hours\\" schedule side by side.\\n\\n## Steps\\n\\n1. Click **Campaign Settings** at the bottom left of your OutreachFox account.\\n\\n\\n\\n2. Select **Sending Schedules**.\\n\\n\\n\\n3. Click **Create new schedule**.\\n\\n\\n\\n4. Enter a name for the schedule, for example US East â business hours.\\n\\n\\n\\n5. Choose the time zone. Pick the time zone of your recipients, not your own, so emails arrive during their working day.\\n\\n\\n\\n6. To avoid sending on public holidays, tick **Skip public holidays**.\\n\\n\\n\\n7. Select the country whose holiday calendar should apply.\\n\\n\\n\\n8. Click the days of the week on which emails may be sent. Select one or several.\\n\\n\\n\\n9. Adjust the send timings to set the start and end of the daily send window.\\n\\n\\n\\n10. Click **Save**.\\n\\n\\n\\nThe schedule now appears in the **Sending Schedules** list and can be selected in any campaign's settings.\\n\\n## Recommended settings\\n\\n - **Days**: Monday to Friday. Tuesday to Thursday get the best reply rates; Monday mornings and Friday afternoons the worst.\\n - **Window**: 8:00 to 17:00 recipient time. A wider window spreads sends more naturally; a very narrow window (for example 9:00â10:00) forces bursts that look automated.\\n - **Holidays**: always on for the country of your recipients. Sending on a public holiday wastes a step and lowers open rates.\\n\\n## Tips\\n\\n - Create one schedule per target region and name it by region, not by campaign.\\n - If you send to several regions from one campaign, split the campaign by region so each gets the right schedule, or use lead-level time zones (see *Campaign time zone and lead-level time zones*).\\n - The send window caps volume: a mailbox limited to 40 emails per day over a 9-hour window sends roughly one email every 13 minutes, which is the pace you want.\\n\\n## Related articles\\n\\n - Manage multiple sending schedules and apply one to a campaign\\n - Campaign time zone and lead-level time zones\\n - Daily sending limits: mailbox limit vs campaign limit\\n - Sche","video":{"src":"https://cdn.outreachfox.ai/help/videos/create-a-sending-schedule.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"3b48a670-a171-4fd6-9d5e-32b7bdb32d14"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/create-a-sending-schedule.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"3b48a670-a171-4fd6-9d5e-32b7bdb32d14"}],"_source_doc":"https://docs.google.com/document/d/1u60Ax--dNFXLUvc6qjeF9ZAK_Dv2t9qOoPslSpiHL6c/edit"},{"slug":"manage-multiple-sending-schedules-and-apply-one-to-a-campaign","title":"Manage multiple sending schedules and apply one to a campaign","category":"campaigns-schedule","summary":"You can keep as many sending schedules as you need under Campaign Settings â Sending Schedules, one per region or audience. Each campaign uses exactly one schedule, chosen in the campaign's settingâ¦","body":"You can keep as many sending schedules as you need under **Campaign Settings** â **Sending Schedules**, one per region or audience. Each campaign uses exactly one schedule, chosen in the campaign's settings. This article covers building a set of schedules, finding them, and attaching one to a campaign.\\n\\n## Prerequisites\\n\\n - At least one schedule created (see *Create a sending schedule*).\\n\\n## Steps: create additional schedules\\n\\n1. Go to **Campaign Settings** â **Sending Schedules**.\\n2. Click **Create new schedule** and repeat the setup (name, time zone, holidays, days, send timings) for each region or audience. Click **Save** after each one.\\n\\n\\n\\n3. When the list grows, use the search bar at the top of **Sending Schedules** to find a schedule by name.\\n\\n\\n\\n## Steps: apply a schedule to a campaign\\n\\n1. While creating a campaign, after saving the sequence and adding leads, open the campaign **Sett
99ings** step. For an existing campaign, open it, click **Edit Campaign**, then **Settings**.\\n2. In the schedule field, select the sending schedule you want from the dropdown.\\n\\n\\n\\n3. Click **Save**, then **Launch Campaign** (new campaign) or **Resume Campaign** (existing campaign).\\n\\nThe campaign now only sends within that schedule's days and hours, in its time zone.\\n\\n## A sensible starting set\\n\\n| | | | |\\n| :-: | :-: | :-: | :-: |\\n| \\\\*\\\\*Schedule name\\\\*\\\\* | \\\\*\\\\*Time zone\\\\*\\\\* | \\\\*\\\\*Days\\\\*\\\\* | \\\\*\\\\*Window\\\\*\\\\* |\\n| US East â business hours | America/New\\\\\\\\\\\\_York | MonâFri | 08:00â17:00 |\\n| US West â business hours | America/Los\\\\\\\\\\\\_Angeles | MonâFri | 08:00â17:00 |\\n| UK & Ireland | Europe/London | MonâFri | 08:00â17:00 |\\n| Central Europe | Europe/Berlin | MonâFri | 08:00â17:00 |\\n| APAC â Singapore | Asia/Singapore | MonâFri | 08:00â17:00 |\\n\\nTick **Skip public holidays** with the matching country on each.\\n\\n## Tips\\n\\n - Edit a schedule rather than creating a near-duplicate; changes apply to every campaign using it from the next send window.\\n - Changing a campaign's schedule takes effect immediately for emails not yet sent. Emails already queued for today follow the old window.\\n - If you run one campaign across several regions, lead-level time zones can override the campaign schedule per lead (see *Campaign time zone and lead-level time zones*).\\n\\n## Troubleshooting\\n\\n - **Schedule missing from the campaign dropdown**: it was not saved. Go back to **Sending Schedules** and confirm it is in the list.\\n - **Campaign sends outside the expected hours**: check the schedule's time zone. A schedule set to your own zone while targeting another region is the usual cause.\\n - **Campaign did not send today**: today is a selected holiday, or not a selected day, in that schedule.\\n\\n## Related articles\\n\\n - Create a sending schedule (time zone, holidays, days, send windows)\\n - Campaign time zone and lead-level time zones\\n - Why did my campaign pause or stop sending?\\n - Schedule a campaign start","video":{"src":"https://cdn.outreachfox.ai/help/videos/manage-multiple-sending-schedules-and-apply-one-to-a-campaign.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"af7eea91-0c10-4fef-aa39-4f6305b50d18"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/manage-multiple-sending-schedules-and-apply-one-to-a-campaign.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"af7eea91-0c10-4fef-aa39-4f6305b50d18"}],"_source_doc":"https://docs.google.com/document/d/1z0Ob6co1UN79sZw4fdOg8EN1gNm8wS2ildB96tKW_w8/edit"},{"slug":"set-the-daily-new-contacts-limit-for-a-campaign","title":"Set the daily new-contacts limit for a campaign","category":"campaigns-schedule","summary":"The Daily new contacts limit caps how many leads a campaign contacts for the first time each day. It does not limit follow-ups; those are governed by the sequence delays and your mailbox limits. Usâ¦","body":"The **Daily new contacts limit** caps how many leads a campaign contacts for the first time each day. It does not limit follow-ups; those are governed by the sequence delays and your mailbox limits. Use it to ramp a campaign gradually, keep total volume inside what your mailboxes can safely send, and avoid dumping a whole list on day one.\\n\\n## Steps\\n\\n1. In **Campaigns**, select the campaign you want to adjust.\\n\\n\\n\\n2. Click **Edit Campaign**.\\n\\n\\n\\n3. Go to the campaign **Sett
99ings**.\\n\\n\\n\\n4. Find **Daily new contacts limit**.\\n\\n\\n\\n5. Enter the number of new leads the campaign may start each day. The default is 1,000; change it to your desired number.\\n\\n\\n\\n6. Click **Save**.\\n\\n\\n\\n7. Click **Resume campaign** to put the campaign back into sending.\\n\\n\\n\\nThe same setting is available at the **Settings** step when you create a new campaign.\\n\\n## How to choose the number\\n\\nWork backwards from your mailboxes:\\n\\n1. Count the warmed mailboxes attached to the campaign.\\n2. Multiply by the per-mailbox campaign limit (30â50 emails per day is safe for a warmed mailbox).\\n3. Reserve roughly half of that for follow-ups once the campaign is a week old.\\n\\nExample: 10 mailboxes à 40 emails = 400 sends per day. Set the daily new-contacts limit to about 200 so that, with a three-step sequence, follow-ups fit in the remaining capacity.\\n\\nStart lower for the first week of a new campaign (for example 50â100) and raise it once the bounce rate and reply categories look healthy.\\n\\n## Tips\\n\\n - The limit resets each day in the campaign's sending schedule time zone.\\n - If several campaigns share the same mailboxes, the mailbox limit is what actually caps volume; the sum of the campaigns' daily new-contacts limits can exceed it without any harm, but the campaigns will contact fewer leads than the setting suggests.\\n - A limit of 1,000 with a small list simply means \\"as fast as the mailboxes allow\\".\\n\\n## Troubleshooting\\n\\n - **Campaign contacts fewer new leads than the limit**: the mailboxes hit their own daily limits, the send window closed, or the sending strategy is prioritising follow-ups. See *Daily sending limits: mailbox limit vs campaign limit*.\\n - **Change did not apply**: you must click **Save** and then **Resume campaign**; leaving the editor without resuming keeps the campaign paused.\\n\\n## Related articles\\n\\n - Choose a sending strategy: follow-ups first, balanced, or new leads first\\n - Daily sending limits: mailbox limit vs campaign limit\\n - Inbox rotation: how OutreachFox spreads sends across mailboxes\\n - Add more leads to an active campaign (from a l","video":{"src":"https://cdn.outreachfox.ai/help/videos/set-the-daily-new-contacts-limit-for-a-campaign.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"f2b31d42-c8c1-4d6f-9cd5-867d92a17476"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/set-the-daily-new-contacts-limit-for-a-campaign.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"f2b31d42-c8c1-4d6f-9cd5-867d92a17476"}],"_source_doc":"https://docs.google.com/document/d/1fx3Wuh5qdO54Q8gtWZlgG6UIsTbT418X0NOwXaREwW8/edit"},{"slug":"choose-a-sending-strategy","title":"Choose a sending strategy: follow-ups first, balanced, or new leads first","category":"campaigns-schedule","summary":"Once a campaign has more emails due than your mailboxes can send in a day, OutreachFox has to decide which to send first: follow-ups to leads already in the sequence, or step 1 to leads who have noâ¦","body":"Once a campaign has more emails due than your mailboxes can send in a day, OutreachFox has to decide which to send first: follow-ups to leads already in the sequence, or step 1 to leads who have not been contacted. The **sending strategy** setting controls that priority.\\n\\n## Prerequisites\\n\\n - You are in the campaign's **Settings** (open the campaign â **Edit Campaign** â **Settings**, or the **Settings** step of a new campaign).\\n\\n## Steps\\n\\n1. In campaign **Sett
99ings**, find the sending volume strategy option.\\n\\n\\n\\n2. Choose one of the three strategies:\\n\\n - **Follow-ups first**: leads already in the sequence get their next step before any new lead receives step 1. If the first email went out yesterday, people waiting for email two are served first.\\n\\n\\n\\n\\n\\n - **Balanced**: daily capacity is split evenly between follow-ups and first emails to new leads.\\n\\n\\n\\n\\n\\n - **New leads first**: all step-1 emails to new leads go out before any follow-ups are sent.\\n\\n\\n\\n3. Click **Save**, then **Resume campaign** to apply the change.\\n\\n\\n\\n## Which strategy to pick\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Strategy\\\\*\\\\* | \\\\*\\\\*Best for\\\\*\\\\* | \\\\*\\\\*Watch out for\\\\*\\\\* |\\n| \\\\*\\\\*Follow-ups first\\\\*\\\\* | Most campaigns. Follow-ups produce the majority of replies, and keeping the gaps between steps consistent matters more than reaching new names. | New leads may wait several days if capacity is tight. |\\n| \\\\*\\\\*Balanced\\\\*\\\\* | Campaigns with plenty of mailbox capacity where you want steady growth in reach and steady follow-ups. | Neither queue is guaranteed to finish each day. |\\n| \\\\*\\\\*New leads first\\\\*\\\\* | Time-boxed pushes: an event invite, a launch, a list that expires. | Follow-up delays stretch and reply rates on later steps drop. |\\n\\n## Tips\\n\\n - Combine the strategy with the **Daily new contacts limit**. Follow-ups first plus a modest new-contacts limit is the most reliable setup.\\n - When you add a large batch of leads to a live campaign, switch to **Follow-ups first** for the first few days so existing conversations are not starved.\\n - If follow-ups are consistently late by more than a day, you need more mailboxes, not a different strategy.\\n\\n## Related articles\\n\\n - Set the daily new-contacts limit for a campaign\\n - Daily sending limits: mailbox limit vs campaign limit\\n - Inbox rotation: how OutreachFox spreads sends across mailboxes\\n - Add more leads to an active campaign (from a l","video":{"src":"https://cdn.outreachfox.ai/help/videos/choose-a-sending-strategy.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"16f7e4c2-ec61-478d-a477-a1b7ccee62c0"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/choose-a-sending-strategy.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"16f7e4c2-ec61-478d-a477-a1b7ccee62c0"}],"_source_doc":"https://docs.google.com/document/d/119A7nIXSRJhZLG-YJTuQgwRAI65foKRHVYueoWX0KQ8/edit"},{"slug":"schedule-a-campaign-start-date","title":"Schedule a campaign start date","category":"campaigns-schedule","summary":"You can finish building a campaign today and have it begin sending on a date you choose. The start date lives in the campaign Settings. Leave it blank and the campaign starts as soon as you launch â¦","body":"You can finish building a campaign today and have it begin sending on a date you choose. The start date lives in the campaign **Sett
99ings**. Leave it blank and the campaign starts as soon as you launch it and the sending schedule opens.\\n\\n## Steps\\n\\n1. Click **Create Campaign**.\\n\\n\\n\\n2. Name the campaign, choose the campaign type such as **Email Outreach**, and click **Create**.\\n\\n\\n\\n3. Fill in the campaign: write the email subject and body for each step and save the sequence.\\n\\n\\n\\n4. Upload your contacts.\\n\\n\\n\\n5. Go to **Settings** and find the campaign start date section.\\n\\n\\n\\n6. Select the date you want the campaign to begin, or leave the field empty to start immediately.\\n7. When everything else is set (mailboxes, schedule, limits), click **Launch Campaign**. Do not click launch until the earlier steps are complete.\\n\\n\\n\\nAfter launch, the campaign shows as scheduled and starts sending on the chosen date at the first window in its sending schedule. To change the date on an existing campaign, open it, click **Edit Campaign** â **Settings**, change the date, **Save**, and **Resume Campaign**.\\n\\n## Tips\\n\\n - Pick a Tuesday or Wednesday start; a campaign that starts on Friday sends its first step into the weekend for many recipients.\\n - The start date applies in the time zone of the campaign's sending schedule.\\n - Use a future date when mailboxes are still warming up. Set the date to the day warm-up finishes (14 days from connection is the usual minimum) so you do not have to remember to launch.\\n - If the campaign is already launched with no date, adding a date later does not pause it; pause the campaign first if you want a gap.\\n\\n## Troubleshooting\\n\\n - **Campaign did not start on the date**: the date fell on a day or holiday excluded by the sending schedule, so the first send moved to the next allowed window; or the campaign was not launched (it is still in draft).\\n - **Start date field is greyed out**: the campaign has already started. Pause it and edit the date, or leave it as is.\\n\\n## Related articles\\n\\n - Create a sending schedule (time zone, holidays, days, send windows)\\n - Manage multiple sending schedules and apply one to a campaign\\n - Set the daily new-contacts limit for a campaign\\n - Why did my campaign pause or","video":{"src":"https://cdn.outreachfox.ai/help/videos/schedule-a-campaign-start-date.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"cfbfb831-160d-4071-89f7-c2dd219abf8d"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/schedule-a-campaign-start-date.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"cfbfb831-160d-4071-89f7-c2dd219abf8d"}],"_source_doc":"https://docs.google.com/document/d/1Lj2WuXZLH7nMnhUijtGXvgidbJiQFb_yhH25GNvVCRY/edit"},{"slug":"auto-match-esp","title":"Auto-match ESP: send from a mailbox that matches the recipient's provider","category":"campaigns-schedule","summary":"Auto-match ESP sends each email from a mailbox on the same email service provider as the recipient whenever one is available. A lead on Google Workspace gets an email from one of your Google mailboâ¦","body":"Auto-match ESP sends each email from a mailbox on the same email service provider as the recipient whenever one is available. A lead on Google Workspace gets an email from one of your Google mailboxes; a lead on Microsoft 365 gets one from a Microsoft mailbox. Mail between two accounts on the same provider is treated with more trust, so this improves inbox placement. When no matching mailbox exists, OutreachFox falls back to a random pick from the campaign's other mailboxes according to your usual rotation.\\n\\n## Prerequisites\\n\\n - The campaign has mailboxes from more than one provider attached (for example Google and Microsoft). With a single provider there is nothing to match.\\n - You are on the campaign's **Sett
99ings** step (new campaign) or in **Edit Campaign** â **Settings** (existing campaign).\\n\\n## Steps\\n\\n1. In the campaign settings, click **Show advanced configurations**.\\n\\n\\n\\n2. Under **Deliverability and Safety**, find **Auto match leads**.\\n\\n\\n\\n3. Turn **Auto match** on.\\n\\n\\n\\n4. Click **Launch Campaign** for a new campaign, or **Save** and **Resume Campaign** for an existing one.\\n\\n\\n\\nFrom now on, each lead's provider is detected from their domain's MX records and the matching mailbox is used when one is free within its daily limit.\\n\\n## Why this matters\\n\\nGoogle-to-Google and Microsoft-to-Microsoft traffic passes through fewer external reputation checks and is less likely to be filtered as unknown. In practice a mixed mailbox pool with auto-match on typically lands a few percentage points more emails in the primary inbox than the same pool without it.\\n\\n## Tips\\n\\n - Buy mailboxes in proportion to your list. If your lead list is 60% Google Workspace and 40% Microsoft 365, attach mailboxes in roughly that split so matching rarely falls back.\\n - Icemail lets you buy Google, Microsoft, Azure and IMAP-SMTP mailboxes, which is the easiest way to build a mixed pool.\\n - Keep auto-match on for every campaign; there is no downside when the pool is mixed.\\n\\n## Troubleshooting\\n\\n - **Everything still sends from one provider**: the campaign only has mailboxes from that provider attached. Add mailboxes of the other provider under sender accounts.\\n - **Matched mailboxes hit their limit early**: a large share of your list is on one provider. Add more mailboxes of that type or lower the daily new-contacts limit.\\n\\n## Related articles\\n\\n - Inbox rotation: how OutreachFox spreads sends across mailboxes\\n - Daily sending limits: mailbox limit vs campaign limit\\n - Bounce protection: auto-pause a campaign at a bounce-rate threshold\\n - Buy mailboxes through","video":{"src":"https://cdn.outreachfox.ai/help/videos/auto-match-esp.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"094bd05d-ce92-4063-a4da-c17220e291ce"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/auto-match-esp.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"094bd05d-ce92-4063-a4da-c17220e291ce"}],"_source_doc":"https://docs.google.com/document/d/1a3Px_0t47xqJ_EGDZrOrqE96lxUyDRrV126VIveAQ-I/edit"},{"slug":"bounce-protection","title":"Bounce protection: auto-pause a campaign at a bounce-rate threshold","category":"campaigns-schedule","summary":"Bounce protection pauses a campaign automatically when its bounce rate reaches a threshold you set. A campaign that keeps sending into a bad list can get every attached mailbox flagged within a dayâ¦","body":"Bounce protection pauses a campaign automatically when its bounce rate reaches a threshold you set. A campaign that keeps sending into a bad list can get every attached mailbox flagged within a day; this setting stops the damage while you fix the list. It works the same way for a new campaign and for one that is already running.\\n\\n## Steps\\n\\n1. Open the campaign you want to protect, or create a new one.\\n\\n\\n\\n2. Click **Edit Campaign**.\\n\\n\\n\\n3. Go to **Settings**.\\n\\n\\n\\n4. Scroll down and click **Show Advanced Configurations**.\\n\\n\\n\\n5. Find **Pause Campaign when bounce rate reaches**.\\n\\n\\n\\n6. Enter the maximum bounce rate as a percentage. When the campaign's bounce rate reaches this value it is paused automatically.\\n\\n\\n\\n7. Click **Save**.\\n\\n\\n\\n8. Click **Resume Campaign** (existing campaign) or **Launch Campaign** (new campaign).\\n\\n\\n\\nIf the threshold is hit, the campaign status changes to paused and no further emails are sent until you resume it.\\n\\n## What threshold to set\\n\\n - **3%** is the standard ceiling. Above this, Google and Microsoft start to throttle or spam-folder the sending mailboxes.\\n - **2%** for new domains or mailboxes still building reputation.\\n - **5%** only for a deliberately risky list (for example catch-all addresses) that you have isolated in its own campaign with its own mailboxes.\\n\\n## What to do when it triggers\\n\\n1. Open the campaign â **Contacts** â **Status: Bounced** and export the list.\\n2. Remove the bounced addresses from your source list.\\n3. Verify the remaining **Not contacted** leads.\\n4. Check **Mailbox** â **Warm up** for the attached mailboxes; if one mailbox carries most of the bounces, the problem is that mailbox, not the list.\\n5. **Resume Campaign**.\\n\\n## Tips\\n\\n - Bounce rate is calculated over the campaign's sends so far; early in a campaign a handful of bounces can exceed the threshold. Start with a small daily new-contacts limit so a bad list is caught after 50 sends, not 500.\\n - Bounce protection is per
99campaign. Set it on every campaign, including ones you clone.\\n - Pair it with a bounce-rate check on the **Mailbox** â **Warm up** tab, which tracks the mailbox rather than the campaign.\\n\\n## Related articles\\n\\n - Managing bounced leads and cleaning your lists\\n - Why did my campaign pause or stop sending?\\n - Email verification: how it works and what each status means\\n - Set the daily new-contacts","video":{"src":"https://cdn.outreachfox.ai/help/videos/bounce-protection.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"e3ad89f8-f597-4d2a-bda9-057662fc1279"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/bounce-protection.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"e3ad89f8-f597-4d2a-bda9-057662fc1279"}],"_source_doc":"https://docs.google.com/document/d/1-ppGghfhGm5dmU-2HTSaHZfDaFFVy-Klc9rDTvpzMAE/edit"},{"slug":"campaign-time-zone-and-lead-level-time-zones","title":"Campaign time zone and lead-level time zones","category":"campaigns-schedule","summary":"A campaign's time zone comes from its sending schedule: every send window, day selection and holiday rule is evaluated in that zone. That is fine when all leads are in one region. When a single camâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nA campaign's time zone comes from its sending schedule: every send window, day selection and holiday rule is evaluated in that zone. That is fine when all leads are in one region. When a single campaign targets several regions, you can give each lead its own time zone so the send window is applied in the lead's local time instead. This article explains both levels and how they interact.\\n\\n## Campaign time zone\\n\\n - Set on the sending schedule (**Campaign Settings** â **Sending Schedules** â schedule â time zone) and applied to the campaign in its **Settings**.\\n - Governs when the campaign is allowed to send, when the daily new-contacts limit resets, and how the start date is interpreted.\\n - If a lead has no time zone of their own, this is the zone used for them.\\n\\n## Lead-level time zones\\n\\nA lead time zone overrides the campaign zone for that lead only. The send window stays the same (for example 08:00â17:00) but is applied in the lead's local time.\\n\\n### Steps: set time zones from your CSV\\n\\n1. Add a column such as timezone to your CSV. Use IANA names (America/Chicago, Europe/Paris, Asia/Tokyo), one per lead.\\n2. Upload the file via **Contacts** â **Upload Contacts** or inside the campaign via **Upload new CSV**.\\n3. On the column-mapping screen, map the column to the **Time zone** field.\\n4. Complete the import.\\n\\n### Steps: set a time zone on one lead\\n\\n1. Open the campaign â **Contacts** and click the lead.\\n2. Edit the **Time zone** field in the lead details and save.\\n\\n## Which approach to use\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Situation\\\\*\\\\* | \\\\*\\\\*Approach\\\\*\\\\* |\\n| All leads in one region | Campaign schedule only |\\n| Two or three regions, distinct copy per region | Separate campaigns, one schedule each |\\n| Many regions, same copy | One campaign with lead-level time zones |\\n\\n## Tips\\n\\n - If you do not have a time zone column, derive one from country or city before uploading; a spreadsheet lookup table handles 95% of leads.\\n - Lead time zones do not change the days of the week or the holiday calendar; those still come from the campaign schedule. If you send to Australia and the US from one campaign, holidays for only one country are skipped.\\n - Mailbox capacity is shared across all zones. A campaign with leads in Sydney and New York effectively sends around the clock, so the per-mailbox daily limit is what keeps volume in check.\\n\\n## Troubleshooting\\n\\n - **Lead received an email at 3 am local time**: the lead has no time zone set and the campaign zone is far from theirs. Add a lead time zone or split the campaign.\\n - **Time zone column did not map**: values are not valid IANA names (for example EST or GMT+1). Replace them with America/Ne
99w\\\\_York, Europe/Berlin, and so on.\\n\\n## Related articles\\n\\n - Create a sending schedule (time zone, holidays, days, send windows)\\n - Manage multiple sending schedules and apply one to a campaign\\n - Handle duplicates and map CSV columns to contact fields\\n - Daily sending limits: mailbox limit vs campaign limit","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1zMaYTFhptX19O_Egm0tNGqow5tbw79toV15hgMBUiww/edit"},{"slug":"daily-sending-limits-mailbox-limit-vs-campaign-limit","title":"Daily sending limits: mailbox limit vs campaign limit","category":"campaigns-schedule","summary":"Two separate limits decide how many emails go out each day, and confusing them is the most common reason a campaign sends less (or more) than expected. The mailbox limit caps what one mailbox sendsâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nTwo separate limits decide how many emails go out each day, and confusing them is the most common reason a campaign sends less (or more) than expected. The **mailbox limit** caps what one mailbox sends across all campaigns. The **campaign limit** caps how many new leads one campaign starts. Both must allow a send for it to happen.\\n\\n## The two limits\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| | \\\\*\\\\*Mailbox limit\\\\*\\\\* | \\\\*\\\\*Campaign limit\\\\*\\\\* |\\n| Where | \\\\*\\\\*Mailbox\\\\*\\\\* page â select mailboxes â bulk action \\\\*\\\\*campaign emails per day\\\\*\\\\* (or per-mailbox settings) | Campaign â \\\\*\\\\*Edit Campaign\\\\*\\\\* â \\\\*\\\\*Settings\\\\*\\\\* â \\\\*\\\\*Daily new contacts limit\\\\*\\\\* |\\n| Scope | One mailbox, all campaigns combined | One campaign, all its mailboxes combined |\\n| Counts | Every campaign email (step 1 and follow-ups). Warm-up emails are separate. | Only first emails to new leads |\\n| Protects | Mailbox reputation | Pace of a campaign |\\n\\n## How they combine\\n\\nEach time a send is due, OutreachFox checks:\\n\\n1. Is the campaign inside its sending schedule window? If not, wait.\\n2. Is this a new lead, and has the campaign already reached its **Daily new contacts limit** today? If so, wait until tomorrow.\\n3. Is there a mailbox attached to the campaign that still has room under its own daily limit? If not, wait.\\n\\nDaily capacity of a campaign is therefore the sum of the free capacity of its mailboxes, and part of that goes to follow-ups, which the campaign limit does not count.\\n\\n## Steps: set the mailbox limit\\n\\n1. Click **Mailbox** in the left navigation.\\n2. Tick the mailboxes to change.\\n3. From the bulk actions, choose the option to set campaign emails per day and enter the number.\\n4. Save.\\n\\n## Steps: set the campaign limit\\n\\n1. Open the campaign â **Edit Campaign** â **Settings**.\\n2. Set **Daily new contacts limit**.\\n3. **Save**, then **Resume Campaign**.\\n\\n## Recommended numbers\\n\\n - **Mailbox limit**: 30â50 campaign emails per day for a mailbox that has warmed for 2â3 weeks; 10â20 during the first week of sending. Never above 50 for cold outreach, even on old mailboxes.\\n - **Campaign limit**: about half of the combined mailbox capacity, so follow-ups always have room.\\n\\nExample: 8 mailboxes à 40 = 320 emails/day of capacity. Campaign limit 150 new leads/day. A 3-step sequence over 10 days then settles at roughly 150 first emails + 150â170 follow-ups per day, inside capacity.\\n\\n## Tips\\n\\n - Sharing mailboxes between campaigns divides their capacity between the campaigns. Prefer a dedicated mailbox pool per campaign when you can.\\n - Raise mailbox limits gradually (5â10 per day per week). A jump from 20 to 50 overnight looks like a compromised account to the provider.\\n - Warm-up emails use a separate allowance managed by the warm-up profile and do not count toward the campaign limit.\\n\\n## Troubleshooting\\n\\n - **Campaign sends far fewer than the campaign limit**: mailbox limits are the bottleneck. Check the combined capacity of the attached mailboxes.\\n - **A mailbox stopped sending mid-day**: it reached its daily limit; sending resumes tomorrow. If it stopped with an error, check its connection under **Mailbox**.\\n - **Follow-ups are late**: total capacity is too low for the number of leads in the sequence. Add mailboxes or lower the daily new-contacts limit.\\n\\n## Related articles\\n\\n - Set the daily new-contacts limit for a campaign\\n - Choose a sending strategy: follow-ups first, balanced, or new leads first\\n - Inbox rotation: how OutreachFox spreads sends across mailboxes\\n - Bulk mailbox settings","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1CfrDlb86hR1DCHya-LUH42U91Ioj6t69QN6b1E83iH0/edit"},{"slug":"inbox-rotation","title":"Inbox rotation: how OutreachFox spreads sends across mailboxes","category":"campaigns-schedule","summary":"Inbox rotation is how OutreachFox turns a pool of mailboxes into one campaign. Instead of one address sending 300 emails a day, thirty addresses each send ten, and every email in a lead's thread coâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nInbox rotation is how OutreachFox turns a pool of mailboxes into one campaign. Instead of one address sending 300 emails a day, thirty addresses each send ten, and every email in a lead's thread comes from the same address. Rotation is automatic; you control it by choosing which mailboxes are attached to the campaign and what their daily limits are.\\n\\n## How rotation works\\n\\n1. When a campaign is due to send step 1 to a new lead, OutreachFox picks a sender from the campaign's attached mailboxes.\\n2. The pick prefers mailboxes with the most remaining daily capacity, so volume spreads evenly rather than exhausting one mailbox f
99irst.\\n3. If **Auto match leads** is on, a mailbox on the same provider as the lead is preferred (see *Auto-match ESP*).\\n4. The chosen mailbox is stored on the lead. Every follow-up to that lead is sent from the same mailbox so the thread stays intact and replies land in one inbox.\\n5. Sends are spaced across the sending window rather than fired in a burst, with a small random gap between emails.\\n\\n## Steps: attach mailboxes to a campaign\\n\\n1. When creating a campaign, after saving the sequence, choose the **Sender Accounts** on the next screen (and a LinkedIn account for LinkedIn or multichannel campaigns). For a running campaign, open it â **Edit Campaign** and open the sender accounts step.\\n2. Tick every mailbox that should take part in rotation.\\n3. Click **Next**, review, then **Launch Campaign** or **Resume Campaign**.\\n\\n## Sizing the pool\\n\\n| | | | |\\n| :-: | :-: | :-: | :-: |\\n| \\\\*\\\\*Daily new leads\\\\*\\\\* | \\\\*\\\\*Sequence steps\\\\*\\\\* | \\\\*\\\\*Approx. emails/day\\\\*\\\\* | \\\\*\\\\*Mailboxes at 40/day\\\\*\\\\* |\\n| 50 | 3 | 150 | 4 |\\n| 100 | 3 | 300 | 8 |\\n| 200 | 4 | 800 | 20 |\\n| 500 | 4 | 2,000 | 50 |\\n\\nKeep 2â3 mailboxes per domain and spread domains across a few different ones so a single blacklisted domain cannot take out the whole campaign.\\n\\n## Tips\\n\\n - Only attach warmed mailboxes. A mailbox that joined the pool yesterday sends its share of the campaign at full speed and will burn its reputation.\\n - Keep warm-up running on mailboxes that are in campaigns; warm-up traffic and campaign traffic use separate allowances.\\n - If a mailbox is removed from a campaign, leads assigned to it are reassigned for their remaining follow-ups, but replies to earlier emails still arrive in the removed mailbox. Keep it connected so replies are captured.\\n - Use the same signature format across all mailboxes in a pool so a lead who is referred internally sees consistent branding.\\n\\n## Troubleshooting\\n\\n - **One mailbox sends much more than the others**: the others are hitting their daily limits earlier, or are on a provider that auto-match rarely needs. Compare limits on the **Mailbox** page.\\n - **A lead received step 1 and step 2 from different addresses**: the original mailbox was disconnected or removed from the campaign between steps. Reconnect it under **Mailbox**.\\n - **Campaign stopped sending although mailboxes have capacity**: check the sending schedule window and the campaign status; see *Why did my campaign pause or stop sending?*\\n\\n## Related articles\\n\\n - Auto-match ESP: send from a mailbox that matches the recipient's provider\\n - Daily sending limits: mailbox limit vs campaign limit\\n - Enable mailbox warm-up\\n - Bulk mailbox settings","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1Fo9FwOQEC_naTDALJQiHs7vjALqlTh46lXnwQtKr2zw/edit"},{"slug":"open-tracking-and-link-tracking","title":"Open tracking and link tracking (and when to turn them off)","category":"campaigns-schedule","summary":"Open tracking inserts an invisible 1Ã1 image into each email; when the recipient's mail client loads it, the open is recorded. Link tracking rewrites each link in the email to pass through a trackiâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nOpen tracking inserts an invisible 1Ã1 image into each email; when the recipient's mail client loads it, the open is recorded. Link tracking rewrites each link in the email to pass through a tracking domain before redirecting to the real URL; a click is recorded on the way. Both give you engagement data, and both have a deliverability cost. This article shows where the settings are and when to switch them off.\\n\\n## Steps\\n\\n1. Open the campaign â **Edit Campaign** â **Settings** (or the **Settings** step of a new campaign).\\n2. Click **Show advanced configurations**.\\n3. Find the tracking options:\\n\\n - **Track opens**: on or off.\\n - **Track link clicks**: on or off.\\n4. Set them as you want, click **Save**, then **Launch Campaign** or **Resume Campaign**.\\n\\nFor link tracking to work without hurting deliverability, set up a custom tracking domain first (**Domain** â select domain â **Settings** â custom tracking domain â add the CNAME at your DNS host â **Save** â **Verify**). Without it, links route through a shared tracking domain that other senders may have burned.\\n\\n## What the data is worth\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Signal\\\\*\\\\* | \\\\*\\\\*Reliability\\\\*\\\\* | \\\\*\\\\*Why\\\\*\\\\* |\\n| Open | Low | Apple Mail Privacy Protection, Gmail image proxying and corporate security scanners load the pixel automatically. Expect inflated open rates and s
99ome \\"opens\\" seconds after sending. |\\n| Click | Medium | Security scanners also click links, but a human click usually follows an open by minutes, not seconds. |\\n| Reply | High | The only signal that proves a person read the email. |\\n\\n## When to turn tracking off\\n\\n - **Open tracking off** for plain-text style campaigns. The pixel is the one piece of HTML in an otherwise text email and is a known spam-filter signal. If you enabled **Send emails in plain text**, open tracking is unavailable anyway.\\n - **Link tracking off** when you have no custom tracking domain, or when the email contains only one link (your calendar) and you would rather protect deliverability than know it was clicked.\\n - **Both off** for high-value, low-volume campaigns (under 100 leads) where you will judge success on replies alone.\\n\\n## Tips\\n\\n - If you keep open tracking on, judge campaigns on reply rate, not open rate. Compare variants by replies per send.\\n - Fewer links beat tracked links: an email with no links at all usually outperforms one with a tracked link.\\n - Never tracked-link an unsubscribe URL that points to your own page; the unsubscribe option under **Risk Control** handles that.\\n - When you turn link tracking on, re-check the **Preview** in the editor to confirm links resolve to your tracking domain.\\n\\n## Troubleshooting\\n\\n - **Open rate over 80%**: bot opens. Turn open tracking off or ignore the metric.\\n - **Links show a warning in Gmail**: the shared tracking domain is flagged. Set up a custom tracking domain and verify it.\\n - **No opens recorded at all**: images are blocked by the recipient's client, or tracking is off for the campaign.\\n\\n## Related articles\\n\\n - Set up a custom tracking domain\\n - Send emails in plain text\\n - Lead activity log: see every email, open and reply for a contact\\n - Add unsubscribe links","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1XKrBgrbSG5utmMSDqXJNViZMP1jtGZkqBy7kIDZAkKQ
99/edit"},{"slug":"cc-and-bcc-on-campaign-emails","title":"CC and BCC on campaign emails","category":"campaigns-schedule","summary":"You can add CC or BCC recipients to the emails a campaign sends. The usual reasons are to log every outbound email into a CRM via its BCC-to-CRM address, to copy an account manager on a specific stâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nYou can add CC or BCC recipients to the emails a campaign sends. The usual reasons are to log every outbound email into a CRM via its BCC-to-CRM address, to copy an account manager on a specific step, or to keep a colleague in the loop. Use it sparingly: every extra recipient is another copy of the email, and CC in particular changes how the lead perceives the message.\\n\\n## Steps\\n\\n1. Open the campaign â **Edit Campaign** â **Settings** (or the **Settings** step of a new campaign).\\n2. Click **Show advanced configurations**.\\n3. Find the **CC** and **BCC** fields.\\n4. Enter one or more addresses, separated by commas.\\n5. Click **Save**, then **Launch Campaign** or **Resume Campaign**.\\n\\nThe addresses apply to every step in the sequence. If you need CC on one step only, put that step in its own campaign or handle the introduction manually from the reply.\\n\\n## CC vs BCC\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| | \\\\*\\\\*CC\\\\*\\\\* | \\\\*\\\\*BCC\\\\*\\\\* |\\n| Visible to the lead | Yes | No |\\n| Typical use | Introduce a colleague, show a manager is aware | CRM logging ([email protected]), compliance archive |\\n| Effect on replies | Lead may reply-all, including the CC | No effect |\\n| Effect on deliverability | Slightly negative: cold emails with CC are unusual | Negligible if the BCC address accepts mail reliably |\\n\\n## Tips\\n\\n - For CRM logging, BCC only the address your CRM provides for inbound logging. Test with one send and check the CRM before launching to a full list.\\n - Do not CC a lead's colleague you found in the same company; that is two cold emails, and recipients read it as pressure.\\n - Keep CC/BCC addresses on domains that are not part of your sending pool, so a bounce or complaint on them is not attributed to a sending domain.\\n - Replies from the lead go to the sending mailbox and are read by OutreachFox as usual; CC'd colleagues receive the reply only if the lead replies-all.\\n\\n## Troubleshooting\\n\\n - **BCC copies are not appearing in the CRM**: the CRM's logging address may require the sender to be a known user. Add each sending mailbox as a user or allowed sender in the CRM.\\n - **Emails now bounce**: one of the CC/BCC addresses is invalid, and some providers reject the whole message. Remove the address and resume.\\n - **CC field not visible**: expand **Show advanced configurations**; the fields are in the advanced section.\\n\\n## Related articles\\n\\n - Lead activity log: see every email, open and reply for a contact\\n - Export leads to CSV\\n - Open tracking and link tracking (and when to turn them off)\\n - Import leads from Google Sheets or your CRM","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1BZ2xEQ4l1IaAz15wQxp9ZC0cMpkgWhk_Z9A3WtKWQcI/edit"},{"slug":"why-did-my-campaign-pause-or-stop-sending","title":"Why did my campaign pause or stop sending? (all reasons in one place)","category":"campaigns-schedule","summary":"A campaign that is not sending is either paused (status shows paused, nothing goes out until you resume) or waiting (status is active but a limit, schedule or mailbox is blocking sends). Work throuâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nA campaign that is not sending is either paused (status shows paused, nothing goes out until you resume) or waiting (status is active but a limit, schedule or mailbox is blocking sends). Work through the checks below in order; the first five cover almost every case.\\n\\n## Quick checklist\\n\\n1. Campaign status is **Active**, not **Paused** or **Draft**.\\n2. Today is inside the sending schedule (day, hours, time zone, not a skipped holiday).\\n3. Start date is today or earlier.\\n4. The daily new-contacts limit has not been reached.\\n5. Attached mailboxes are connected and under their daily limits.\\n\\n## Reasons the campaign is paused\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Cause\\\\*\\\\* | \\\\*\\\\*How to tell\\\\*\\\\* | \\\\*\\\\*Fix\\\\*\\\\* |\\n| \\\\*\\\\*You edited the campaign and did not resume\\\\*\\\\* | Status paused right after you opened \\\\*\\\\*Edit Campaign\\\\*\\\\* | Open the campaign and click \\\\*\\\\*Resume Campaign\\\\*\\\\* |\\n| \\\\*\\\\*Bounce protection triggered\\\\*\\\\* | Status paused; \\\\*\\\\*Contacts\\\\*\\\\* â \\\\*\\\\*Bounced\\\\*\\\\* shows a rise; bounce rate at or above the threshold set under \\\\*\\\\*Show advanced configurations\\\\*\\\\* | Clean the list, verify remaining leads, then \\\\*\\\\*Resume Campaign\\\\*\\\\* |\\n| \\\\*\\\\*Added leads without resuming\\\\*\\\\* | Paused after \\\\*\\\\*Upload Contacts\\\\*\\\\* in the campaign | Click \\\\*\\\\*Resume Campaign\\\\*\\\\* |\\n| \\\\*\\\\*Paused manually\\\\*\\\\* | A teammate paused it | Resume, and check with the team first |\\n\\n## Reasons an active campaign is not sending\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Cause\\\\*\\\\* | \\\\*\\\\*How to tell\\\\*\\\\* | \\\\*\\\\*Fix\\\\*\\\\* |\\n| \\\\*\\\\*Outside the send window\\\\*\\\\* | Current time in the schedule's zone is outside the window, or today is unselected or a holiday | Wait, or edit the schedule under \\\\*\\\\*Campaign Settings\\\\*\\\\* â \\\\*\\\\*Sending Schedules\\\\*\\\\* |\\n| \\\\*\\\\*Start date in the future\\\\*\\\\* | \\\\*\\\\*Settings\\\\*\\\\* shows a later start date | Change or clear the date, \\\\*\\\\*Save\\\\*\\\\*, \\\\*\\\\*Resume Campaign\\\\*\\\\* |\\n| \\\\*\\\\*Daily new contacts limit reached\\\\*\\\\* | New leads stay \\\\*\\\\*Not contacted\\\\*\\\\*; follow-ups still go | Raise the limit or wait for the reset |\\n| \\\\*\\\\*Mailbox daily limits reached\\\\*\\\\* | Sends stop at the same time each day | Add mailboxes or raise limits gradually under \\\\*\\\\*Mailbox\\\\*\\\\* |\\n| \\\\*\\\\*Mailbox disconnected\\\\*\\\\* | Mailbox shows an error on the \\\\*\\\\*Mailbox\\\\*\\\\* page (password changed, OAuth revoked, SMTP/IMAP disabled by the admin) | Reconnect via \\\\*\\\\*Mailbox\\\\*\\\\* â \\\\*\\\\*Connect Mailbox\\\\*\\\\* |\\n| \\\\*\\\\*No mailboxes attached\\\\*\\\\* | Sender accounts step is empty | Attach mailboxes and resume |\\n| \\\\*\\\\*No leads left to contact\\\\*\\\\* | All leads are \\\\*\\\\*Completed\\\\*\\\\*, \\\\*\\\\*Replied\\\\*\\\\*, \\\\*\\\\*Bounced\\\\*\\\\* or \\\\*\\\\*Unsubscribed\\\\*\\\\* | Add leads |\\n| \\\\*\\\\*Sequence has no saved step\\\\*\\\\* | Sequence editor shows an unsaved or empty step | Save the sequence |\\n| \\\\*\\\\*Lead-level time zones\\\\*\\\\* | Leads are in zones whose windows have not opened yet | Wait or review lead time zones |\\n\\n## Reasons a mailbox specifically stopped\\n\\n - Provider blocked sending (Google or Microsoft \\"sending limit exceeded\\" or \\"suspicious activity\\"). Pause that mailbox for 24â48 hours and reduce its limit.\\n - Domain authentication broke (SPF, DKIM or DMARC record changed). Check under **Domain**.\\n - The mailbox was deleted or replaced in Icemail. Import the replacement under **Mailbox** â **Connect Mailbox** â **Import from Icemail** and attach it to the campaign.\\n\\n## Tips\\n\\n - After any edit to a live campaign, the last click must be **Resume Campaign**. Make it a habit.\\n - Check the **Mailbox** page every morning; one disconnected mailbox in a pool of ten silently cuts capacity by 10%.\\n - Set bounce protection at 3% so a pause caused by a bad list happens early, while it is cheap.\\n\\n## Related articles\\n\\n - Bounce protection: auto-pause a campaign at a bounce-rate threshold\\n - Daily sending limits: mailbox limit vs campaign limit\\n - Manage multiple sending schedules and apply one to a campaign\\n - Schedule a campaign start date\\n - Lead statuses explained","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1pg6gfimN2lxD-SDwXtie1_G42hA1QsWy7io-QPHgJ8U/edit"},{"slug":"create-a-multi-channel-campaign-and-choose-the-starting-channel","title":"Create a multi-channel campaign and choose the starting channel","category":"multichannel","summary":"A multi-channel campaign sequences email and LinkedIn actions in one flow, with conditions and variants. This first article creates the campaign and picks which channel the sequence starts on. The â¦","body":"A multi-channel campaign sequences email and LinkedIn actions in one flow, with conditions and variants. This first article creates the campaign and picks which channel the sequence starts on. The following three articles add email steps, LinkedIn actions and conditions, and launch.\\n\\n## Prerequisites\\n\\n - At least one connected mailbox.\\n - A connected LinkedIn account (see *Connect your LinkedIn account to OutreachFox*).\\n\\n## Steps\\n\\n1. In your OutreachFox account, click **Campaigns** in the left nav.\\n\\n\\n\\n2. Click **Create Campaign**.\\n\\n\\n\\n3. Enter a name for your campaign.\\n4. Select **Multi Channel Outreach** and click **Create**.\\n\\n\\n\\n\\n\\n5. Inside the sequence editor you see tw
99o options: **Start with Email** and **Start with LinkedIn**. This choice sets the first step of the campaign. Click the one you want.\\n\\n\\n\\n\\n\\n\\n\\nWhat you see afterwards: step 1 is created for the chosen channel and the editor opens for it. Continue with *Add email steps and variants to a multi-channel sequence*.\\n\\n## Tips\\n\\n - Start with LinkedIn (a profile view or connection request) when the list is senior or small; a warm name in their notifications lifts the reply rate of the email that follows.\\n - Start with email when the list is large or you have limited LinkedIn daily capacity; LinkedIn actions are rate-limited to protect your account, email is not to the same degree.\\n - The starting channel cannot be swapped after steps are added without rebuilding the sequence; decide first.\\n - Contacts in a multi-channel campaign need both an email address and a LinkedIn URL. Rows missing the LinkedIn URL skip LinkedIn steps.\\n\\n## Troubleshooting\\n\\n - **Only Start with Email is shown** â no LinkedIn account is connected yet. Connect one under Settings, then reopen the campaign.\\n - **Create is disabled** â the campaign name is empty.\\n\\n## Related articles\\n\\n - Add email steps and variants to a multi-channel sequence\\n - Add LinkedIn actions and conditions to a multi-channel sequence\\n - Assign sender accounts, LinkedIn account and contacts, then launch\\n - Connect your LinkedIn account to OutreachFox\\n - Multichannel best practices: sequencing email and","video":{"src":"https://cdn.outreachfox.ai/help/videos/create-a-multi-channel-campaign-and-choose-the-starting-channel.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"b45d3a62-646a-4f62-b86a-8a95b32efb19"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/create-a-multi-channel-campaign-and-choose-the-starting-channel.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"b45d3a62-646a-4f62-b86a-8a95b32efb19"}],"_source_doc":"https://docs.google.com/document/d/1905wgDXgBD8o7yP9yHQu4OIm3ZpnpWYwhvqaGX3mVPs/edit"},{"slug":"add-email-steps-and-variants-to-a-multi-channel-sequence","title":"Add email steps and variants to a multi-channel sequence","category":"multichannel","summary":"With the campaign created and Start with Email chosen, write the first email, add variants if you want to test copy, and add the next step. The next step can be another email or a LinkedIn action.","body":"With the campaign created and **Start with Email** chosen, write the first email, add variants if you want to test copy, and add the next step. The next step can be another email or a LinkedIn action.\\n\\n## Steps\\n\\n1. After clicking **Start with Email**, write your email subject and body in the editor. Use **Variables** for personalisation.\\n\\n\\n\\n\\n\\n2. Click **Save**.\\n\\n\\n\\n3. Optional: click **New Variant** to add a B version of this email for A/B testing.\\n\\n\\n\\n4. Click the **Add Sequence** tab to add the next step.\\n\\n\\n\\n5. Choose the next action. Pick an **email** action (for example a follow-up email) or jump to **LinkedIn** actions. For an email follow-up, set the wait in days and hours, write the email and click **Save**.\\n\\n\\n\\n\\n\\n\\n\\nWhat you see afterwards: the sequence panel lists step 1 (Email) with its variants and step 2 with its channel icon. Continue with *Add LinkedIn actions and conditions to a multi-channel sequence*.\\n\\n## Tips\\n\\n - In a multi-channel flow keep emails shorter than in email-only campaigns; the LinkedIn touches carry part of the message.\\n - Reference the other channel lightly (\\"also sent you a note on LinkedIn\\") once, not in every step.\\n - Variants work per step, so you can test the email while keeping the LinkedIn steps constant.\\n - The same variables (lead, sender, context) and spintext are available in multi-channel email steps.\\n\\n## Troubleshooting\\n\\n - **Add Sequence does nothing** â the current step is unsaved. Click **Save** first.\\n - **Email step shows no delay field** â step 1 has no delay; delays appear from step 2 onward.\\n\\n## Related articles\\n\\n - Create a multi-channel campaign and choose the starting channel\\n - Add LinkedIn actions and conditions to a multi-channel sequence\\n - A/B test with multiple email variants\\n - Add follow-up steps and delays","video":{"src":"https://cdn.outreachfox.ai/help/videos/add-email-steps-and-variants-to-a-multi-channel-sequence.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"a5a17b35-493d-4e05-a2dc-b6c8f4dc96ac"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/add-email-steps-and-variants-to-a-multi-channel-sequence.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"a5a17b35-493d-4e05-a2dc-b6c8f4dc96ac"}],"_source_doc":"https://docs.google.com/document/d/17XpaSkHInkEJ89bISLQc_LztWE79nUbf1smF51Y-odA/edit"},{"slug":"add-linkedin-actions-and-conditions-to-a-multi-channel-sequence","title":"Add LinkedIn actions and conditions to a multi-channel sequence","category":"multichannel","summary":"Once your email step is saved, the next step can be a LinkedIn action. This article adds a connection request with a note, then shows how to keep adding email steps, LinkedIn steps and conditions uâ¦","body":"Once your email step is saved, the next step can be a LinkedIn action. This article adds a connection request with a note, then shows how to keep adding email steps, LinkedIn steps and conditions until the sequence is complete.\\n\\n## Steps\\n\\n1. On the **Add Sequence** step, select **LinkedIn** as the channel for this step. You can also add a **Condition** here if the step is LinkedIn-based (for example, wait N days and branch on whether the connection was accepted).\\n2. Choose the LinkedIn action. For a first LinkedIn touch select **Connection Request**.\\n\\n\\n\\n3. Write the connection request note. Keep it under 200 characters (LinkedIn's limit is 300) and personalise it with variables.\\n\\n\\n\\n4. Click **Save**.\\n\\n\\n\\n5. Keep adding steps: another email, another LinkedIn action (Message, Like Latest Post, and so on) or a condition with a day/hour wait. Click **Save** after each action.\\n\\n\\n\\n\\n\\n6. Add as many steps and conditions as your strategy needs across both channels.\\n\\nWhat you see afterwards: the sequence panel shows each step with its channel and, for conditions, an accepted / not accepted branch. Continue with *Assign sender accounts, LinkedIn account and contacts, then launch*.\\n\\n## Tips\\n\\n - Typical structure: Email 1 â wait 2 days â LinkedIn Connection Request â condition (wait 3 days): accepted â LinkedIn Message; not accepted â Like Latest Post â Email 2.\\n - Only a LinkedIn Message can follow an accepted connection; put it on the accepted branch.\\n - Give conditions at least 3 days. Many people accept requests in batches once or twice a week.\\n - Put the email follow-up after the LinkedIn touch on the not-accepted branch so those contacts still get a second message.\\n\\n## Troubleshooting\\n\\n - **Message action is unavailable** â the contact is not connected yet. Place Message after a condition's accepted branch.\\n - **Condition option is missing** â conditions are only offered after a LinkedIn step, not after an email step.\\n\\n## Related articles\\n\\n - Add email steps and variants to a multi-channel sequence\\n - LinkedIn conditions, wait times and branching (accepted vs not accepted)\\n - Assign sender accounts, LinkedIn account and contacts, then launch\\n - Connect your LinkedIn account to","video":{"src":"https://cdn.outreachfox.ai/help/videos/add-linkedin-actions-and-conditions-to-a-multi-channel-sequence.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"933b34d1-3852-4203-8afc-2291fe30ebfe"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/add-linkedin-actions-and-conditions-to-a-multi-channel-sequence.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"933b34d1-3852-4203-8afc-2291fe30ebfe"}],"_source_doc":"https://docs.google.com/document/d/1BgXE5cy_aFpVSEEfTIYMxKH7eaxY9hN4ED3Km0cqlG8/edit"},{"slug":"assign-sender-accounts-linkedin-account-and-contacts-then-launch","title":"Assign sender accounts, LinkedIn account and contacts, then launch","category":"multichannel","summary":"With the sequence built, the last part of setting up a multi-channel campaign is to say which mailboxes and which LinkedIn account do the sending, who the contacts are, and to launch.","body":"With the sequence built, the last part of setting up a multi-channel campaign is to say which mailboxes and which LinkedIn account do the sending, who the contacts are, and to launch.\\n\\n## Steps\\n\\n1. When all steps and conditions are in place, click **Save and Next**.\\n\\n\\n\\n2. Select your **Sen
99der Accounts** (the mailboxes that send the email steps) and your **LinkedIn Account** (the profile that performs the LinkedIn steps).\\n\\n\\n\\n3. Add contacts: upload a CSV, or map contacts that already exist in your OutreachFox account. Make sure the email and LinkedIn URL columns are mapped.\\n\\n\\n\\n\\n\\n4. Click **Next**.\\n\\n\\n\\n5. Review the campaign settings (sending schedule, daily limits, advanced configurations), then click **Launch Campaign**.\\n\\n\\n\\nWhat you see afterwards: the campaign shows as Active in the **Campaigns** list. The **Contacts** tab shows each contact's current step and status; email and LinkedIn activity appear in the campaign reporting.\\n\\n## Tips\\n\\n - Select several warmed-up mailboxes as
99sender accounts; OutreachFox rotates across them so no single mailbox carries the whole list.\\n - One LinkedIn account per campaign. Its daily limits (roughly 20â25 connection requests and 50 messages per day) cap how fast contacts move through LinkedIn steps, so size the daily new contacts limit to match.\\n - Check **Daily new contacts limit** in Settings before launching. For multi-channel, start at 20â30 per day so LinkedIn steps do not back up.\\n - Set a sending schedule that matches the prospects' time zone; LinkedIn actions follow the same schedule.\\n\\n## Troubleshooting\\n\\n - **Launch Campaign is disabled** â no sender account selected, no LinkedIn account selected, or the contact list is empty.\\n - **Contacts skip the LinkedIn steps** â their LinkedIn URL column was not mapped or is empty. Re-upload with merge and map the column.\\n - **LinkedIn steps queue but never run** â the LinkedIn account disconnected (session expired). Reconnect it under Settings.\\n\\n## Related articles\\n\\n - Add LinkedIn actions and conditions to a multi-channel sequence\\n - Connect your LinkedIn account to OutreachFox\\n - Upload contacts to OutreachFox\\n - Set campaign sending volume\\n - Create sen","video":{"src":"https://cdn.outreachfox.ai/help/videos/assign-sender-accounts-linkedin-account-and-contacts-then-launch.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"30ade2ca-9fe8-43c3-8758-bb98dec5b08e"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/assign-sender-accounts-linkedin-account-and-contacts-then-launch.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"30ade2ca-9fe8-43c3-8758-bb98dec5b08e"}],"_source_doc":"https://docs.google.com/document/d/1IclYPq3CnbyL4MPvv1ILVY2YbjUMSGtmOZ6rpRaJa4I/edit"},{"slug":"create-a-linkedin-campaign-and-send-the-first-connection-request","title":"Create a LinkedIn campaign and send the first connection request","category":"multichannel","summary":"A LinkedIn Outreach campaign automates connection requests, messages and engagement actions from your LinkedIn profile. This article creates the campaign and sets up the first step: a connection reâ¦","body":"A LinkedIn Outreach campaign automates connection requests, messages and engagement actions from your LinkedIn profile. This article creates the campaign and sets up the first step: a connection request with a personalised note.\\n\\n## Prerequisites\\n\\n - A LinkedIn account connected to OutreachFox.\\n - Contacts with a LinkedIn profile URL.\\n\\n## Steps\\n\\n1. Click **Create Campaign** from the campaign list.\\n\\n\\n\\n2. Enter a name for your campaign, for example \\"LinkedIn Outreach\\". Select **LinkedIn Outreach** as the campaign type.\\n\\n\\n\\n3. Click **Create** to start building your sequence.\\n\\n\\n\\n4. Click **Start with LinkedIn** and pick your first action. Choose **Connection Request**.\\n\\n\\n\\n\\n\\n5. Enter a personalised note for the connection request, then click **Save**.\\n\\n\\n\\nWhat you see afterwards: step 1 (Connection Request) appears in the sequence panel. Continue with *LinkedIn conditions, wait times and branching*.\\n\\n## Tips\\n\\n - Notes are limited to 300 characters by LinkedIn; aim for 150â200. Say who you are and why them, no pitch.\\n - Requests without a note are accepted at similar rates and do not count against LinkedIn's monthly note allowance on free accounts. Test both.\\n - Use variables ({{first\\\\_name}}, {{company}}) in the note so each request reads as written by hand.\\n - Do not mention \\"email\\" in the note; a request that reads like a follow-up to unsolicited email is more likely to be ignored.\\n\\n## Troubleshooting\\n\\n - **Start with LinkedIn is missing** â no LinkedIn account is connected. Connect one first.\\n - **Note is cut off** â over 300 characters after variables are filled. Shorten it; check with a long company name.\\n\\n## Related articles\\n\\n - LinkedIn conditions, wait times and branching (accepted vs not accepted)\\n - Choose the LinkedIn account, upload contacts and launch\\n - Connect your LinkedIn account to OutreachFox\\n - Create a multi-channel campaign and choose the st","video":{"src":"https://cdn.outreachfox.ai/help/videos/create-a-linkedin-campaign-and-send-the-first-connection-request.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"dc3f87e6-5069-4c5f-8c47-4ea9707816ae"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/create-a-linkedin-campaign-and-send-the-first-connection-request.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"dc3f87e6-5069-4c5f-8c47-4ea9707816ae"}],"_source_doc":"https://docs.google.com/document/d/1hFa3nkM2yAUL-MIU2F6dG3VVp2WaI_C73htIn1jbdQM/edit"},{"slug":"linkedin-conditions-wait-times-and-branching","title":"LinkedIn conditions, wait times and branching (accepted vs not accepted)","category":"multichannel","summary":"After the connection request, a condition checks whether the prospect accepted and sends them down one of two branches. This article adds the condition, sets the wait time and fills both branches.","body":"After the connection request, a condition checks whether the prospect accepted and sends them down one of two branches. This article adds the condition, sets the wait time and fills both branches.\\n\\n## Steps\\n\\n1. With the connection request saved, click to add a **Condition** or another LinkedIn action below it.\\n\\n\\n\\n\\n\\n2. Set the waiting time for the condition by entering **days** and **hours**. OutreachFox waits that long, then checks whether the request was accepted.\\n3. Click **Save** after setting the condition.\\n\\n\\n\\n4. You now see two branches: **accepted** and **not accepted**. On the **not accepted** branch, pick another LinkedIn action that helps you get noticed, such as **Like Latest Post**.\\n\\n\\n\\n5. On the **accepted** branch, add the next step, such as a LinkedIn **Message**. Write the message and click **Save**.\\n\\n\\n\\n6. Keep building each branch the same way (more conditions, messages, waits) until the sequence is complete.\\n\\nWhat you see afterwards: the sequence shows as a tree with the condition at the fork. Continue with *Choose the LinkedIn account, upload contacts and launch*.\\n\\n## Tips\\n\\n - Wait 3â5 days before checking acceptance. A 1-day check
99sends most contacts down the not-accepted branch unnecessarily.\\n - Not-accepted branch: one engagement action (Like Latest Post, Profile View) then stop, or hand over to email in a multi-channel campaign. Do not send a second request.\\n - Accepted branch: wait 1 day before the first message. A message seconds after acceptance reads as automated.\\n - First message after acceptance: thank them, one sentence of context, one question. Save the pitch for message two.\\n - Keep total LinkedIn steps to 3â4 per contact. Prospects who have not replied by then rarely do.\\n\\n## Troubleshooting\\n\\n - **Everyone ends up on not accepted** â the wait is too short or the LinkedIn account was disconnected during the wait; check the account status and lengthen the condition.\\n - **Message step fails** â the contact accepted but later withdrew the connection, or LinkedIn's messaging limit for the day was reached. It retries next day.\\n\\n## Related articles\\n\\n - Create a LinkedIn campaign and send the first connection request\\n - Choose the LinkedIn account, upload contacts and launch\\n - Add LinkedIn actions and conditions to a multi-channel sequence\\n - Multichannel best practices: sequencing email and Linke","video":{"src":"https://cdn.outreachfox.ai/help/videos/linkedin-conditions-wait-times-and-branching.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"7cdaed9c-f402-4327-a5e5-f902bb7c1bc9"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/linkedin-conditions-wait-times-and-branching.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"7cdaed9c-f402-4327-a5e5-f902bb7c1bc9"}],"_source_doc":"https://docs.google.com/document/d/1h2s--VoY7MkR5Qd9FllUMjeM0opMbhe0CS1f0LjPR-c/edit"},{"slug":"choose-the-linkedin-account-upload-contacts-and-launch","title":"Choose the LinkedIn account, upload contacts and launch","category":"multichannel","summary":"The last stage of a LinkedIn Outreach campaign: pick the profile that runs the actions, add the contacts and launch.","body":"The last stage of a LinkedIn Outreach campaign: pick the profile that runs the actions, add the contacts and launch.\\n\\n## Steps\\n\\n1. When the sequence is finished, click **Save and Next**.\\n\\n\\n\\n2. Select the **LinkedIn account** you want to use for this outreach.\\n3. Upload your contacts (CSV with at least a LinkedIn profile URL and first name), or map an existing list.\\n\\n\\n\\n4. Open **Settings** and double-check the details: sending schedule, daily limits and start date.\\n5. Click **Launch Campaign** to start your LinkedIn outreach.\\n\\n\\n\\nWhat you see afterwards: the campaign is Active. Actions run during the sending schedule at a human-like pace; the **Contacts** tab shows each contact's current step, whether the connection was accepted, and replies.\\n\\n## Tips\\n\\n - Use full profile URLs (https://www.linkedin.com/in/â¦). Sales Navigator URLs (/sales/lead/â¦) are not the same and will not resolve.\\n - Start with a small list (50â100) on a new LinkedIn account and raise the daily limit gradually, as you would warm up a mailbox.\\n - Keep pending invitations under control. LinkedIn penalises accounts with hundreds of unanswered requests; withdraw requests older than 3â4 weeks.\\n - Set the schedule to the prospects' business hours. LinkedIn actions outside working hours look automated.\\n\\n## Troubleshooting\\n\\n - **Launch Campaign is disabled** â no LinkedIn account selected or the contact list is empty.\\n - **Contacts stuck on step 1** â the daily connection-request limit was reached; they continue tomorrow. Or the LinkedIn session expired; reconnect the account.\\n - **\\"Profile not found\\" on some contacts** â the URL is wrong, the profile is private or the person changed their public URL. Fix and re-upload with merge.\\n\\n## Related articles\\n\\n - Create a LinkedIn campaign and send the first connection request\\n - LinkedIn conditions, wait times and branching (accepted vs not accepted)\\n - Connect your LinkedIn account to OutreachFox\\n - Upload contacts to OutreachFox\\n - Create sending sche","video":{"src":"https://cdn.outreachfox.ai/help/videos/choose-the-linkedin-account-upload-contacts-and-launch.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"ab419e99-7862-4b6a-9ff4-04b90e7ca545"},"videos":[{"src":"https://cdn.outreachfox.ai/help/videos/choose-the-linkedin-account-upload-contacts-and-launch.mp4","poster":null,"duration_seconds":null,"_clueso_project_id":"ab419e99-7862-4b6a-9ff4-04b90e7ca545"}],"_source_doc":"https://docs.google.com/document/d/1559WCUzAEaZFAKnksBksCtnjC_uzQWpioS55zdBWj9s/edit"},{"slug":"connect-your-linkedin-account-to-outreachfox","title":"Connect your LinkedIn account to OutreachFox (safety limits, what actions are supported)","category":"multichannel","summary":"LinkedIn Outreach and Multi Channel Outreach campaigns run actions from your own
99LinkedIn profile. Before you can select a LinkedIn account in a campaign, you connect it once under Settings. This aâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nLinkedIn Outreach and Multi Channel Outreach campaigns run actions from your own LinkedIn profile. Before you can select a LinkedIn account in a campaign, you connect it once under Settings. This article covers the connection, the daily limits OutreachFox applies to keep the account safe, and which actions a sequence can perform.\\n\\n## Prerequisites\\n\\n - A LinkedIn account in good standing that you have used normally for at least a few weeks (a brand-new profile is restricted quickly).\\n - Two-factor authentication details handy if enabled on the account.\\n - Optional: LinkedIn Premium or Sales Navigator; both raise the practical limits.\\n\\n## Steps\\n\\n1. Click **Settings** in the bottom-left of the left nav.\\n2. Open the **LinkedIn Accounts** section and click **Connect LinkedIn Account**.\\n3. Sign in with your LinkedIn email and password in the window that opens. If LinkedIn asks for a verification code, enter it.\\n4. OutreachFox connects through a dedicated proxy located in your country so LinkedIn sees a consistent location. Confirm the country if prompted.\\n5. Set the daily limits for this account (see recommended values below) and click **Save**.\\n6. The account shows as **Connected** with its daily limits. It is now selectable as the LinkedIn Account when you build a LinkedIn or multi-channel campaign.\\n\\n## Supported actions in a sequence\\n\\n - **Connection Request** â with or without a note (300-character limit).\\n - **Message** â to first-degree connections (after an accepted request).\\n - **Like Latest Post** â likes the prospect's most recent post.\\n - **View Profile** â a visit that appears in the prospect's \\"who viewed your profile\\".\\n - **Follow** â follows the profile without a request.\\n - **Condition** â wait N days/hours, then branch on accepted / not accepted (and replied / not replied for messages).\\n - InMail and Sales Navigator-only actions depend on the account's subscription.\\n\\n## Recommended daily limits\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Action\\\\*\\\\* | \\\\*\\\\*New account (first 2 weeks)\\\\*\\\\* | \\\\*\\\\*Established account\\\\*\\\\* |\\n| Connection requests | 5â10 | 20â25 (max \\\\\\\\\\\\~100/week) |\\n| Messages | 10â20 | 40â50 |\\n| Profile views | 20â30 | 60â80 |\\n| Post likes | 10 | 20â30 |\\n\\nOutreachFox spreads actions across the sending schedule with random gaps rather than firing them in a burst.\\n\\n## Tips\\n\\n - One LinkedIn account should be connected to one outreach tool only. Two tools acting on the same account is the fastest route to a restriction.\\n - Keep using LinkedIn normally (posting, replying) from the same device and location; a profile that only ever sends requests looks like a bot.\\n - Withdraw pending requests older than 3â4 weeks. A large pending pile lowers acceptance and triggers LinkedIn's weekly cap sooner.\\n - If LinkedIn shows a \\"we've restricted your account\\" warning, pause all LinkedIn campaigns for a week, then resume at half the previous limits.\\n - Reconnect after changing your LinkedIn password; the session is invalidated.\\n\\n## Troubleshooting\\n\\n - **Connection fails at verification** â LinkedIn sent the code to the email or authenticator app on the account; enter it within a few minutes. Try again from the Settings page if it timed out.\\n - **Account shows Disconnected** â the session expired or LinkedIn asked for a fresh login. Click **Reconnect**. Campaign steps queue until reconnected.\\n - **Actions run but nothing appears on LinkedIn** â the daily limit is set to 0 for that action, or the sending schedule has no active hours today.\\n - **\\"Weekly invitation limit reached\\"** â LinkedIn's own cap (about 100 requests per week). Lower the daily limit; requests resume when the week rolls over.\\n\\n## Related articles\\n\\n - Create a LinkedIn campaign and send the first connection request\\n - Choose the LinkedIn account, upload contacts and launch\\n - Create a multi-channel campaign and choose the starting channel\\n - Multichannel best practices: sequencing email and LinkedIn touches\\n - Create sending schedules","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/13O3uYg92scupEZF1Uok-NZBrmqEid1baHWoQNUrnAk4/edit"},{"slug":"multichannel-best-practices","title":"Multichannel best practices: sequencing email and LinkedIn touches","category":"multichannel","summary":"Email and LinkedIn do different jobs. Email carries the message and scales; LinkedIn makes you a recognisable name and gets you past inboxes that filter strangers. A well-built multi-channel sequenâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nEmail and LinkedIn do different jobs. Email carries the message and scales; LinkedIn makes you a recognisable name and gets you past inboxes that filter strangers. A well-built multi-channel sequence uses each for what it is good at instead of repeating the same pitch on both. This article gives a reference sequence, timing rules and the mistakes that get accounts restricted or emails ignored.\\n\\n## Reference sequence (14 days, 6 touches)\\n\\n| | | | |\\n| :-: | :-: | :-: | :-: |\\n| \\\\*\\\\*Day\\\\*\\\\* | \\\\*\\\\*Ch
99annel\\\\*\\\\* | \\\\*\\\\*Step\\\\*\\\\* | \\\\*\\\\*Notes\\\\*\\\\* |\\n| 0 | LinkedIn | View Profile | Silent touch; your name appears in their notifications |\\n| 1 | Email | Email 1 | Short, one question, no link |\\n| 2 | LinkedIn | Connection Request | Note optional; never mention the email |\\n| 5 | Condition | Accepted? | Wait 3 days |\\n| 6 | LinkedIn (accepted) | Message 1 | Thank + one sentence of context; no pitch |\\n| 6 | LinkedIn (not accepted) | Like Latest Post | Then continue with email only |\\n| 7 | Email | Email 2 (same thread) | Two sentences, new angle |\\n| 11 | Email | Email 3 (new thread) | Case study or proof |\\n| 14 | Email | Break-up email | Give them an easy out |\\n\\nBuild it in OutreachFox as: **Create Campaign** â **Multi Channel Outreach** â **Start with LinkedIn** (View Profile) â **Add Sequence** for each row, using **Condition** after the connection request.\\n\\n## Timing rules\\n\\n - Leave at least 24 hours between an email and a LinkedIn action to the same person. Same-hour touches on two channels feel like surveillance.\\n - Give LinkedIn conditions 3â5 days. Acceptances arrive in batches.\\n - Keep the whole sequence inside 2â3 weeks. Reply probability after day 21 is near zero, and a long tail of pending LinkedIn steps ties up your daily limits.\\n - Set one sending schedule for the campaign in the prospects' time zone; both channels follow it.\\n\\n## Volume and capacity\\n\\n - LinkedIn is the bottleneck: about 20â25 connection requests a day per account. Set **Daily new contacts limit** to the same number so email steps do not race ahead of LinkedIn steps.\\n - Email volume per mailbox stays at 30â50 a day; assign enough warmed mailboxes to cover email steps for all contacts in the sequence at once.\\n - One LinkedIn account per campaign. To go faster, run parallel campaigns with different LinkedIn accounts and split the list.\\n\\n## Copy rules\\n\\n - Do not paste the email into the LinkedIn message. Each channel gets its own, shorter version.\\n - Reference the other channel at most once (\\"dropped you a note here too\\").\\n - Keep the ask consistent across channels. If the email asks for a 15-minute call, the LinkedIn message should not ask them to download something.\\n - A reply on either channel should stop the whole sequence. OutreachFox does this when reply detection is on for both channels; check that the LinkedIn account is connected so message replies are detected.\\n\\n## Mistakes to avoid\\n\\n - Starting with a connection request and a hard pitch in the note.\\n - Sending a second connection request on the not-accepted branch.\\n - Running LinkedIn actions outside business hours.\\n - Uploading contacts without LinkedIn URLs to a multi-channel campaign; they silently get email only, and your reporting mixes two very different journeys.\\n - Measuring only email opens. Track replies and accepted connections per step in the campaign report.\\n\\n## Related articles\\n\\n - Create a multi-channel campaign and choose the starting channel\\n - Add LinkedIn actions and conditions to a multi-channel sequence\\n - LinkedIn conditions, wait times and branching (accepted vs not accepted)\\n - Connect your LinkedIn account to OutreachFox\\n - Follow-ups in the same thread vs a new thread\\n - Manual tasks and call steps in a sequence","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1Yejf1w06d4bUsixu4d3EVlDgd-MxlR4JkTEiIKKq7fw/edit"},{"slug":"manual-tasks-and-call-steps-in-a-sequence","title":"Manual tasks and call steps in a sequence","category":"multichannel","summary":"Not every touch can be automated. A phone call, a hand-written LinkedIn comment or a personalised video are worth more than another templated email, but only if someone actually does them. Manual tâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nNot every touch can be automated. A phone call, a hand-written LinkedIn comment or a personalised video are worth more than another templated email, but only if someone actually does them. Manual task steps put those actions into the sequence: OutreachFox creates a task for you at the right moment, waits until you mark it done, then continues to the next step. This article shows how to add task and call steps and how to work through the task queue.\\n\\n## Prerequisites\\n\\n - A campaign (email, LinkedIn or multi-channel) with at least one automated step.\\n - Phone numbers in your contact list if you plan call steps (map the column at upload).\\n\\n## Steps\\n\\n### Add a manual task or call step\\n\\n1. Open the campaign and click **Add Sequence** at the point where the manual touch belongs.\\n2. Choose **Manual Task** as the step type, then pick the task kind: **Call**, **LinkedIn (manual)** or **Custom task**.\\n3. Set the wait time (days and hours) after the previous step, as for any step.\\n4. Write instructions for the person doing the task. Variables work here, so \\"Call {{first\\\\_name}} at {{phone}} about {{pain\\\\_point}}
99\\" fills in per contact. For calls, add a short talk track.\\n5. Optional: set a due window (for example 2 days). Overdue tasks are highlighted in the task list.\\n6. Click **Save**.\\n\\n### Work through the task queue\\n\\n1. Go to **Campaigns** and open the **Tasks** tab (also reachable from the campaign's own Tasks tab).\\n2. Filter by campaign, task type or due date. Each task shows the contact, their recent activity (emails opened, connection accepted) and your instructions.\\n3. Do the task. For calls, click the phone number to dial from your softphone or copy it.\\n4. Log the outcome: **Done**, **No answer**, **Skip**. Add a note; it is stored on the contact.\\n5. The contact moves to the next step after the outcome is logged. Skipped tasks also advance; No answer can be set to retry after a delay.\\n\\n## Tips\\n\\n - Put manual steps after a signal, not before: after an accepted connection, after an email open in step 2, or after a click. Calling cold contacts from the top of the list burns time.\\n - Keep one manual step per sequence. Two or more and the queue backs up; contacts then wait days for the next automated step.\\n - Size the daily new contacts limit to the number of tasks you can actually clear each day. If you can make 20 calls, do not add 100 contacts a day.\\n - Use \\"No answer\\" with a 2-day retry, then a plain email step, so the sequence never dead-ends on an unanswered call.\\n - Assign task ownership when several people share the account, so two reps do not call the same prospect.\\n\\n## Troubleshooting\\n\\n - **Contacts are stuck at the manual step** â nobody has marked the task done. Check the Tasks tab for overdue items.\\n - **Task shows no phone number** â the phone column was not mapped at upload. Re-upload with merge and map it.\\n - **Task created for a contact who already replied** â the reply arrived after the task was generated. Mark it Skip; the reply already ended the sequence for the following steps.\\n - **Manual Task is not offered as a step type** â the campaign type is LinkedIn Outreach with a LinkedIn-only sequence; manual steps are available in email and multi-channel campaigns.\\n\\n## Related articles\\n\\n - Multichannel best practices: sequencing email and LinkedIn touches\\n - Add follow-up steps and delays to an email sequence\\n - Add LinkedIn actions and conditions to a multi-channel sequence\\n - Check lead statuses in a campaign\\n - Custom variables and updating them mid-campaign","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1Sdwnq8GA0hw6BCOq-iX0jz9MFVStZaXQFzkssHImkdg/edit"},{"slug":"unified-inbox-overview","title":"Unified Inbox overview: every reply from every mailbox and channel in one place","category":"unified-inbox","summary":"The Unified Inbox collects every reply your campaigns receive â from every connected mailbox and from LinkedIn â into one view. You no longer log in to 20 Google Workspace or Outlook accounts to fiâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThe Unified Inbox collects every reply your campaigns receive â from every connected mailbox and from LinkedIn â into one view. You no longer log in to 20 Google Workspace or Outlook accounts to find out who answered. Each conversation shows the lead, the campaign, the sending mailbox, the AI reply category, and the full thread, and you can answer from the same screen.\\n\\n## What the Unified Inbox shows\\n\\n - **Conversation list** (left): one row per lead thread, newest activity first. Each row shows the lead name, subject or first line, the campaign it belongs to, the reply category badge (Interested, Not Interested, Out of Office, Meeting Booked, and any custom categories) and a timestamp.\\n - **Thread view** (centre): every message in the conversation in order â your sequence emails, the lead's replies and anything you sent manually. LinkedIn messages from a Multi Channel Outreach campaign appear in the same thread as the emails to that lead.\\n - **Lead panel** (right): the lead's contact fields, the campaign and step they are on, their status (Replied, Bounced, Unsubscribed and so on), labels, and the assigned teammate.\\n - **Filters** (top): by campaign, mailbox, channel (Email / LinkedIn), reply category, label, assignee, read/unread and date.\\n\\n## Steps\\n\\n1. In the left nav, click **Inbox**.\\n2. The **All** folder opens by default. Click a conversation to open the thread.\\n3. Use the filter bar to narrow the list: pick a **Campaign**, a **Mailbox**, a **Category** (for example **Interested**) or a **Label**.\\n4. Type in the **Search** box to find a lead by name, email or company.\\n5. Open a conversation and read the thread. Unread conversations are shown in bold and are marked read when you open them.\\n6. Act on the conversation from the toolbar: **Reply**, **Forward**, change the **Category**, add a **Label**, **Assign** to a teammate, **Archive**, or mark **Unread**.\\n\\n## How replies reach the inbox\\n\\n - OutreachFox polls each connected mailbox through the same Google, Microsoft or IMAP connection you set up under **Mailbox â Connect Mailbox**. Replies typically appear within 1â5 minutes.\\n - A reply is matched to a campaign and lead by the message thread and the lead's email address. When a lead replies, the campaign stops sending further steps to that lead automatically.\\n - Each incoming reply is classified by AI reply categorization (see **Campaign Settings â Reply Categorization**) before it appears, so you can filter on **Interested** straight away.\\n - Auto-replies such as out-of-office messages are categorized as **Out of Office** and do not count as real replies in campaign analytics.\\n\\n## Tips\\n\\n - Work from the **Interested** filter first each morning; that is where revenue is. Aim to answer positive replies within one business hour â response time is the biggest lever on meeting rate.\\n - Keep **All** at zero unread by archiving conversations you have handled. Archived threads stay searchable and reopen automatically if the lead writes again.\\n - If several people share the inbox, assign every open conversation to one owner so nothing gets two replies or none.\\n - Do not reply from your personal Gmail or Outlook. Replying from the Unified Inbox keeps the thread and the tracking intact and keeps the lead's status correct.\\n\\n## Troubleshooting\\n\\n - **A reply is missing.** Check that the mailbox is still connected under **Mailbox** (a red status means the token expired â reconnect it). Also check the lead's spam or junk folder in the mailbox itself; OutreachFox only reads the inbox.\\n - **A reply is attached to the wrong lead.** This happens when a lead forwards your email to a colleague who replies from a different address. Use **Move to lead** or add the new address as a contact.\\n - **\\"No data available\\" in the inbox.** The campaign has not sent any emails yet, or no lead has replied.\\n\\n## Related articles\\n\\n - Reply, forward and attach files from the Unified Inbox\\n - Reply templates (macros) for faster responses\\n - Custom lead labels and how they relate to AI reply categories\\n - Filters, folders and assigning conversations to teammates\\n - Set AI reply categorization to organize campaign responses\\n - How to check lead statuses and replies","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1zSa5tTQKIawfLh20eqH_u6y10wsidHCzKwV_TeOdfHY/edit"},{"slug":"reply-forward-and-attach-files-from-the-unified-inbox","title":"Reply, forward and attach files from the Unified Inbox","category":"unified-inbox","summary":"You can answer any lead directly from the Unified Inbox. Replies are sent from the same mailbox that sent the original campaign email, so the thread stays intact for the lead and your reply lands iâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nYou can answer any lead directly from the Unified Inbox. Replies are sent from the same mailbox that sent the original campaign email, so the thread stays intact for the lead and your reply lands in the existing conversation. You can also forward a thread to a colleague (for example an account executive) and attach files such as a deck or a one-pager.\\n\\n## Prerequisites\\n\\n - The sending mailbox is connected and healthy under **Mailbox**. A disconnected mailbox cannot send replies.\\n - For LinkedIn replies, the LinkedIn account used by the campaign is still connected.\\n\\n## Steps: reply to a lead\\n\\n1. In the left nav, click **Inbox** and open the conversation.\\n2. Click **Reply** at the bottom of the thread. The composer opens with the lead's address in **To**, the original subject with **Re:**, and the previous message quoted.\\n3. The **From** field is pre-set to the mailbox that sent the campaign email. Leave it as is unless that mailbox is paused or disconnected.\\n4. Write your message. You can use the same editor tools as in campaigns: **Variables** (for example the lead's first name or your signature), **Templates** and **Preview**.\\n5. Optionally click **Cc** or **Bcc** to add colleagues.\\n6. Click **Send**. To send later, click the arrow next to **Send** and choose **Schedule**.\\n\\nThe reply appears in the thread immediately with a \\"Sent\\" marker, and the lead's status stays **Replied**. The campaign does not resume sending sequence steps to a lead who has replied.\\n\\n## Steps: forward a conversation\\n\\n1. Open the conversation and click the **three-dots** menu on the message you want to forward, or click **Forward** in the toolbar.\\n2. Enter the recipient's address in **To**. Forwarding to a teammate's OutreachFox account keeps the thread linked; forwarding to an external address sends a plain copy.\\n3. Add a note above the quoted message if needed and click **Send**.\\n\\n## Steps: attach a file\\n\\n1. In the reply or forward composer, click the **paperclip** icon.\\n2. Choose a file from your computer. Keep individual attachments under 10 MB and the total under 20 MB; larger files are refused by most receiving mail servers.\\n3. The file name appears under the editor. Click **x** next to it to remove it.\\n4. Click **Send**.\\n\\n## Tips\\n\\n - Reply from the Unified Inbox rather than from Gmail or Outlook so the reply is logged against the lead and visible to your team.\\n - Match the tone and length of the lead's reply. A two-line \\"Yes, Tuesday works\\" deserves a two-line answer with a calendar link, not a new pitch.\\n - Attachments are fine in one-to-one replies, but keep them out of sequence emails â attachments in cold email hurt deliverability. Use a link instead.\\n - Do not change the subject line when replying; a changed subject breaks threading in the lead's mail client.\\n - Use **Preview** before sending if you inserted variables, to make sure none are empty.\\n\\n## Troubleshooting\\n\\n - **Send fails with an authentication error.** The mailbox token expired. Go to **Mailbox**, find the mailbox and click **Reconnect**, then send again.\\n - **Reply sent but not visible in the lead's thread.** Refresh the inbox. If the mailbox uses IMAP-SMTP, make sure the \\"Sent\\" folder is configured correctly in the mailbox settings so OutreachFox can read sent mail.\\n - **Attachment rejected.** Reduce the file size or upload it to a shared drive and paste the link.\\n - **The lead received the reply from a different address.** The campaign mailbox was replaced or removed; the reply went from the fallback mailbox. Reconnect the original mailbox to keep threads consistent.\\n\\n## Related articles\\n\\n - Unified Inbox overview: every reply from every mailbox and channel in one place\\n - Reply templates (macros) for faster responses\\n - Schedule a reply and set follow-up reminders\\n - AI reply suggestions\\n - Add a signature to a mailbox","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1QHMlfwEM9sZxG8U6AWxwYdNptBavdQ57RS4FM4n9v4Y/edit"},{"slug":"reply-templates-for-faster-responses","title":"Reply templates (macros) for faster responses","category":"unified-inbox","summary":"Reply templates (also called macros or canned responses) are saved replies you insert into the Unified Inbox composer with one click. Most cold-email replies fall into a handful of buckets â \\"send â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nReply templates (also called macros or canned responses) are saved replies you insert into the Unified Inbox composer with one click. Most cold-email replies fall into a handful of buckets â \\"send me more info\\", \\"who are you?\\", \\"not now, try next quarter\\", \\"book a time\\" â and a good template set lets you clear those in seconds while keeping the wording consistent across your team.\\n\\n## Steps: create a template\\n\\n1. In the left nav, click **Inbox**.\\n2. Open any conversation and click **Reply**.\\n3. In the composer toolbar, click **Templates**, then **Manage templates**. (Templates can also be managed under **Settings â Reply Templates**.)\\n4. Click **New template**.\\n5. Enter a **Name** that describes the situation, for example Interested â send calendar link.\\n6. Optionally enter a **Subject**. Leave it blank to keep the existing thread subject (recommended for replies).\\n7. Write the **Body**. Use **Variables** to personalize: lead fields such as {{first\\\\_name}} and {{company}}, and sender fields such as {{sender\\\\_name}}, {{sender\\\\_email}} and {{signature}}.\\n8. Choose **Visibility**: **Private** (only you) or **Shared** (everyone in the workspace).\\n9. Click **Save**.\\n\\n## Steps: use a template in a reply\\n\\
99n1. Open the conversation and click **Reply**.\\n2. Click **Templates** and pick one from the list, or start typing / followed by the template name to search.\\n3. The body is inserted with variables already filled from the lead and the sending mailbox. Edit anything specific to this lead.\\n4. Click **Send**.\\n\\n## Recommended starter set\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Template name\\\\*\\\\* | \\\\*\\\\*Use for\\\\*\\\\* | \\\\*\\\\*Key line\\\\*\\\\* |\\n| Interested â book a call | Category \\\\*\\\\*Interested\\\\*\\\\* | \\"Here is my calendar: {{calendar\\\\\\\\\\\\_link}}. Pick any 20-minute slot.\\" |\\n| More info | \\"Send me details\\" | Two sentences plus one link; no attachments. |\\n| Wrong person | \\"Not me, try X\\" | \\"Thanks â could you point me to the right person, or may I mention you referred me?\\" |\\n| Not now | \\"Try again in Q1\\" | \\"Understood. I will reach out in {{month}}. Anything changing before then?\\" |\\n| Out of office follow-up | Lead is back | \\"Welcome back â following up on my note from last week.\\" |\\n| Unsubscribe confirmation | \\"Remove me\\" | \\"Done â you will not hear from us again.\\" |\\n\\n## Tips\\n\\n - Keep templates short (under 80 words). The lead already replied; you are moving to a next step, not pitching again.\\n - Store the calendar link as a sender variable or in the signature so one template works for every team member.\\n - Review templates monthly. Replace any that get edited every time they are used â that means the template is wrong.\\n - Pair templates with reply categories: open the **Interested** filter and use one template for the whole batch.\\n - Templates are for the Unified Inbox only. Sequence emails are written in the campaign editor and support the same variables and Spintext.\\n\\n## Troubleshooting\\n\\n - **A variable shows as empty in the sent reply.** The lead record does not have that field. Use **Preview** before sending, or add a fallback value such as {{first\\\\_name|there}} if supported.\\n - **Template not visible to a teammate.** It is saved as **Private**. Edit it and switch **Visibility** to **Shared**.\\n - **The signature appears twice.** The mailbox signature is added automatically; remove {{signature}} from the template body.\\n\\n## Related articles\\n\\n - Reply, forward and attach files from the Unified Inbox\\n - AI reply suggestions\\n - Schedule a reply and set follow-up reminders\\n - Custom lead labels and how they relate to AI reply categories\\n - Using variables in email content","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1BhcEGnXQTivEkh1CJ31tYqHt05TjOPpBCwUXM0yq2IY/edit"},{"slug":"schedule-a-reply-and-set-follow-up-reminders","title":"Schedule a reply and set follow-up reminders","category":"unified-inbox","summary":"Two tools in the Unified Inbox keep conversations from going cold: scheduling a reply so it lands during the lead's working hours, and reminders that bring a thread back to the top of your inbox ifâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nTwo tools in the Unified Inbox keep conversations from going cold: scheduling a reply so it lands during the lead's working hours, and reminders that bring a thread back to the top of your inbox if the lead has not answered by a date you choose.\\n\\n## Prerequisites\\n\\n - The sending mailbox must be connected at the scheduled time. A scheduled reply from a disconnected or deleted mailbox fails and stays in **Scheduled** with an error.\\n\\n## Steps: schedule a reply\\n\\n1. In the left nav, click **Inbox** and open the conversation.\\n2. Click **Reply** and write your message.\\n3. Click the **arrow** next to **Send** and choose **Schedule send**.\\n4. Pick a date and time. Suggested options are **Tomorrow morning**, **Monday morning** and **Custom**. Times use the time zone shown next to the picker; switch it to the lead's time zone if it differs.\\n5. Click **Schedule**.\\n\\nThe message moves to the **Scheduled** folder and shows a clock icon in the thread. You can open it to **Edit**, **Send now** or **Cancel** until the scheduled time. Once sent it appears in the thread like any other reply.\\n\\n## Steps: set a follow-up reminder\\n\\n1. Open the conversation.\\n2. Click **Remind me** in the toolbar (the bell icon).\\n3. Choose when: **In 2 days**, **In 1 week**, **Next Monday** or **Custom date**.\\n4. Optionally tick **Only if no reply**. With this on, the reminder is cancelled automatically if the lead writes back first.\\n5. Add a short note (for example Chase for decision â CFO out until 12th) and click **Set reminder**.\\n\\nWhen the reminder is due, the conversation reappears at the top of **All** with a **Reminder** badge and the note, and you get a notification (in-app, and by email or Slack if positive-reply notifications are on). Click **Done** to clear it or **Snooze** to push it out again.\\n\\n## Tips\\n\\n - Schedule replies for 8:00â10:00 in the lead's local time on a weekday. Replies sent at 23:00 sit unread under the morning's mail.\\n - Do not schedule a reply more than 3â4 days out; if the lead's situation changes, an old scheduled message can read as tone-deaf. Use a reminder instead and write the message when it is due.\\n - Set a reminder on every **Interested** conversation the moment you reply. A two-business-day window is the standard: if there is no answer, send a one-line nudge.\\n - For \\"not now\\" replies, set a reminder for the date the lead gave and tag the conversation with a Revisit label so it can be found without the reminder.\\n - Reminders are personal. If you assign a conversation to a teammate, set the reminder from their account or ask them to set it.\\n\\n## Troubleshooting\\n\\n - **Scheduled reply did not send.** Open **Scheduled**, check the error on the message. Usual causes: mailbox disconnected (reconnect under **Mailbox**), mailbox daily limit reached (the reply goes out at the next available slot), or the lead unsubscribed
99in between (the send is blocked).\\n - **Reminder fired even though the lead replied.** **Only if no reply** was not ticked when the reminder was created. Edit the reminder and enable it.\\n - **Wrong time zone.** The picker defaults to your profile time zone. Change it in **Settings â Profile** or select the zone per schedule.\\n\\n## Related articles\\n\\n - Reply, forward and attach files from the Unified Inbox\\n - Reply templates (macros) for faster responses\\n - Positive-reply notifications (email, Slack, push)\\n - Filters, folders and assigning conversations to teammates\\n - Creating sending schedules","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1t0q_Jr_JOd6y0YShviU3P7aADxVUm2WqnmpY-9MPqfU/edit"},{"slug":"custom-lead-labels-and-how-they-relate-to-ai-reply-categories","title":"Custom lead labels and how they relate to AI reply categories","category":"unified-inbox","summary":"OutreachFox gives you two ways to tag a conversation: reply categories, which the AI assigns automatically from the content of a reply, and labels, which you add by hand for anything the AI cannot â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nOutreachFox gives you two ways to tag a conversation: **reply categories**, which the AI assigns automatically from the content of a reply, and **labels**, which you add by hand for anything the AI cannot know â deal stage, territory, priority, product line. Understanding which one to use keeps your inbox and your analytics clean.\\n\\n## Categories vs labels\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| | \\\\*\\\\*Reply category\\\\*\\\\* | \\\\*\\\\*Label\\\\*\\\\* |\\n| Set by | AI, on every incoming reply (you can override) | You or a teammate, manually |\\n| How many per conversation | Exactly one | Any number |\\n| Where managed | \\\\*\\\\*Campaign Settings â Reply Categorization\\\\*\\\\* | \\\\*\\\\*Inbox â Labels\\\\*\\\\* (or \\\\*\\\\*Settings â Labels\\\\*\\\\*) |\\n| Carries sentiment | Yes (Positive / Neutral / Negative) and a \\"useful\\" flag | No |\\n| Used in analytics | Yes â Interested replies drive the Opportunities count | Filter only |\\n| Examples | Interested, Not Interested, Out of Office, Meeting Booked, Wrong Person, Unsubscribe, plus custom ones | Hot, Enterprise, EMEA, Needs AE, Revisit Q1 |\\n\\nRule of thumb: if the tag describes **what the lead said**, it is a category. If it describes **what you want to do about it**, it is a label.\\n\\n## Steps: create a label\\n\\n1. In the left nav, click **Inbox**.\\n2. In the folder list on the left, next to **Labels**, click **+** (or open **Settings â Labels** and click **New label**).\\n3. Enter a **Name** (keep it under 20 characters so it fits the conversation row) and pick a **Colour**.\\n4. Click **Save**. The label appears under **Labels** in the folder list for everyone in the workspace.\\n\\n## Steps: apply a label to a conversation\\n\\n1. Open the conversation in the Unified Inbox.\\n2. Click **Label** in the toolbar (the tag icon) and tick one or more labels. Untick to remove.\\n3. The labels show as coloured chips on the conversation row and in the lead panel.\\n4. To label several conversations at once, tick their checkboxes in the list and use the bulk **Label** action.\\n\\n## Steps: correct an AI category\\n\\n1. Open the conversation. The current category is shown as a badge at the top of the thread.\\n2. Click the badge and choose the right category from the list.\\n3. The change is saved immediately and is reflected in campaign analytics (for example, moving a reply from **Not Interested** to **Interested** adds an opportunity).\\n\\n## Tips\\n\\n - Create custom reply categories only for things the AI can detect from the text of the reply, such as \\"Asked for pricing\\" or \\"Referred to colleague\\". Everything else should be a label.\\n - Keep the label set small â 6 to 10 labels. Beyond that people stop applying them consistently.\\n - Agree one owner for the label list. Duplicate labels (Hot, hot lead, HOT) make filtering useless.\\n - Labels are workspace-wide and follow the lead across campaigns; a lead labelled Enterprise in one campaign keeps the label if uploaded to another.\\n - Combine both: filter **Category = Interested** and **Label = Enterprise** to find the conversations an AE should take over.\\n - Correcting categories improves your reporting; it does not retrain the AI. If a category is consistently wrong, tighten its description under **Reply Categorization**.\\n\\n## Troubleshooting\\n\\n - **A lead shows the wrong category and I cannot change it.** You need edit rights on the campaign. Ask a workspace admin.\\n - **Label disappeared from the list.** It was deleted under **Settings â Labels**. Deleting a label removes it from every conversation; there is no undo, so archive unused labels by renaming them (for example zz-old-Hot) instead.\\n - **Custom category never gets assigned.** Its description is too vague or overlaps a default category. Rewrite the description with concrete phrases the lead would use.\\n\\n## Related articles\\n\\n - Set AI reply categorization to organize campaign responses\\n - Unified Inbox overview: every reply from every mailbox and channel in one place\\n - Filters, folders and assigning conversations to teammates\\n - Opportunities and pipeline view: manage interested leads\\n - How to check lead statuses and replies","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1gt3UFvKHRZ7v8g9gmogg4Yd12JYUGvaDUeQB10ygT9M/edit"},{"slug":"ai-reply-suggestions","title":"AI reply suggestions","category":"unified-inbox","summary":"When a lead replies, OutreachFox can draft an answer for you. The suggestion is built from the full thread, the lead's contact fields, the reply category and the sending mailbox's signature, so it â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nWhen a lead replies, OutreachFox can draft an answer for you. The suggestion is built from the full thread, the lead's contact fields, the reply category and the sending mailbox's signature, so it already knows what you offered, what the lead asked and how to sign off. You review, edit and send â the AI never sends on its own.\\n\\n## Prerequisites\\n\\n - AI reply categorization is active (it is on by default under **Campaign Settings â Reply Categorization**). Suggestions use the category to choose the right angle.\\n - AI suggestions are enabled for the workspace under **Settings â AI**. A workspace admin can turn them off.\\n\\n## Steps\\n\\n1. In the left nav, click **Inbox** and open a conversation with a reply from the lead.\\n2. Click **Reply**. Above the editor you see **Suggest reply** (sparkle icon). Click it.\\n3. Wait 2â5 seconds. The draft appears in the editor. Depending on the category you see one of three angles:\\n\\n - **Interested**: confirms interest, proposes a time or asks one qualifying question, includes your calendar link if the sender has one.\\n - **Not Interested / Not now**: thanks the lead, asks for a better time or the right person, keeps the door open in t
99wo lines.\\n - **Question / More info**: answers the question using the thread and suggests a next step.\\n4. To get a different version, click **Regenerate**, or pick a tone from the dropdown: **Short**, **Friendly** or **Formal**.\\n5. Edit the draft. Check names, dates and any claim about your product. Delete anything you would not say yourself.\\n6. Click **Send**, or schedule it.\\n\\n## What the AI uses and does not use\\n\\n - Uses: the thread, lead fields (name, company, title, custom fields you uploaded), the reply category, the sender name and signature, and the campaign's original email so it does not repeat the pitch.\\n - Does not use: other leads' conversations, your CRM, or anything outside OutreachFox. It does not know your pricing unless it appears in the thread.\\n - Suggestions are generated on demand; nothing is sent or changed until you click **Send**.\\n\\n## Tips\\n\\n - Treat the suggestion as a first draft. Leads can tell when an answer is generic â add one specific detail from their reply.\\n - Suggestions work best when your original sequence email is specific. If the AI's answer is vague, the thread it learned from was vague.\\n - For high-value **Interested** replies, combine a suggestion with a reply template: use the template for structure and the suggestion for the personalized first line.\\n - Keep replies under 100 words. If the suggestion is longer, choose **Short**.\\n - Upload useful lead fields (industry, product interest, trigger event) with your contacts. The AI can only reference what it has.\\n\\n## Troubleshooting\\n\\n - **The button is greyed out.** The conversation has no reply from the lead yet, or AI features are disabled for the workspace. Check **Settings â AI**.\\n - **The draft is in the wrong language.** The AI follows the language of the lead's reply. If the lead wrote in English but you want to answer in German, select the language from the tone dropdown or write the reply manually.\\n - **The draft mentions something incorrect about my product.** It inferred it from the thread. Correct the draft and consider making the sequence email more explicit.\\n - **Slow generation.** Under heavy load the draft can take up to 15 seconds. Do not click **Suggest reply** repeatedly; each click starts a new draft.\\n\\n## Related articles\\n\\n - Reply templates (macros) for faster responses\\n - Reply, forward and attach files from the Unified Inbox\\n - Set AI reply categorization to organize campaign responses\\n - Custom lead labels and how they relate to AI reply categories\\n - Using variables in email content","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1G3v3yDaM2H4Q8ylTV7fdWfcG9So81bOMjTwq_mud7P0/edit"},{"slug":"auto-pause-and-resume-on-out-of-office-replies","title":"Auto-pause and resume on out-of-office replies","category":"unified-inbox","summary":"An out-of-office (OOO) auto-reply is not a real reply, and it should not stop your sequence for good. But sending follow-up 2 and 3 while the lead is on holiday wastes those steps. OutreachFox deteâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nAn out-of-office (OOO) auto-reply is not a real reply, and it should not stop your sequence for good. But sending follow-up 2 and 3 while the lead is on holiday wastes those steps. OutreachFox detects OOO messages, pauses the lead's sequence, reads the return date from the auto-reply where possible, and resumes the sequence after that date.\\n\\n## How it works\\n\\n1. A reply arrives and AI reply categorization classifies it as **Out of Office**.\\n2. The lead's sequence is paused. The lead's status shows **Paused (OOO)** in the campaign **Contacts** tab, and the conversation gets the **Out of Office** badge in the Unified Inbox.\\n3. OutreachFox parses the auto-reply for a return date (\\"I will be back on 14 October\\", \\"returning 10/14\\"). If a date is found, the resume date is that date plus one day. If no date is found, the default pause length is used (see settings).\\n4. On the resume date the lead continues from the next unsent step, subject to the campaign's sending schedule and daily limits.\\n5. OOO replies are excluded from the **Replies** count and reply rate in analytics, and the lead is not counted as **Replied**.\\n\\n## Steps: enable and configure\\n\\n1. In the left nav, click **Campaigns** and open the campaign.\\n2. Click **Edit Campaign**, then **Sett
99ings**, then **Show Advanced Configurations**.\\n3. Find **Out-of-office handling** and switch **Auto-pause on out-of-office replies** on. It is on by default for new campaigns.\\n4. Set **Default pause duration** for auto-replies with no readable return date. Recommended: **7 days**.\\n5. Set **Maximum pause** to cap long absences. Recommended: **30 days**. Beyond this the lead resumes anyway.\\n6. Choose what happens on resume: **Continue from next step** (recommended) or **Resend the last step**. Resending is useful if the last email is the one you want them to see first when they return.\\n7. Click **Resume Campaign** (live campaigns) or **Save**.\\n\\n## Steps: check and override a paused lead\\n\\n1. Open the campaign and click **Contacts**.\\n2. Click **Status** and choose **Paused**. Each row shows the resume date.\\n3. To change the date, open the lead and click **Edit resume date**.\\n4. To resume immediately, select the lead and click **Resume**.\\n\\n## Tips\\n\\n - Leave the default pause at 7 days. Most OOO replies without a date are for a week or less; a longer default delays real conversations.\\n - Watch for OOO replies that contain a colleague's contact (\\"please contact jane@...\\"). These are categorized as **Out of Office** but often name the right person â worth a manual look in the **Out of Office** filter once a week.\\n - Many companies' auto-replies also fire on every follow-up. OutreachFox only pauses on the first one; repeated OOO replies within the pause window are ignored.\\n - Around major holidays (late December, August in Europe), expect 10â20% of leads to go OOO. Keep the campaign running; the pauses spread the load.\\n\\n## Troubleshooting\\n\\n - **A real reply was classified as Out of Office.** Open the conversation, click the category badge and change it to the correct category. The lead's sequence stops (a real reply always stops the sequence) and the lead is counted as replied.\\n - **The lead resumed too early.** The parsed date was wrong (common with formats like 03/04). Set a corrected resume date on the lead. Consider setting a longer default pause if this is frequent.\\n - **The lead never resumed.** Check the campaign is still live and the mailbox is connected; a paused campaign holds all resumes. Also check whether the lead unsubscribed or bounced in the meantime.\\n - **OOO replies show up as Replied.** Reply categorization is disabled or the custom categories override the default. Check **Campaign Settings â Reply Categorization** and make sure **Out of Office** exists and is enabled.\\n\\n## Related articles\\n\\n - Set AI reply categorization to organize campaign responses\\n - How to check lead statuses and replies\\n - Unified Inbox overview: every reply from every mailbox and channel in one place\\n - Campaign analytics explained: sent, delivered, opens, replies, bounces, opportunities\\n - Creating sending schedules","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1IOEPldmo_Wpv1sZjlR4gGdK9enyC0zgWkPQq68uvwzU/edit"},{"slug":"positive-reply-notifications","title":"Positive-reply notifications (email, Slack, push)","category":"unified-inbox","summary":"Speed matters after a positive reply: the chance of booking a meeting drops sharply after the first hour. Notifications tell you the moment a lead replies with interest â by email, in a Slack channâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nSpeed matters after a positive reply: the chance of booking a meeting drops sharply after the first hour. Notifications tell you the moment a lead replies with interest â by email, in a Slack channel, or as a browser/mobile push â so you can answer from the Unified Inbox without watching it all day.\\n\\n## What triggers a notification\\n\\n - Default: any reply the AI categorizes as **Interested** or **Meeting Booked**.\\n - Optional: any custom category with **Positive** sentiment and the **useful** flag (set under **Campaign Settings â Reply Categorization**).\\n - Optional: **All replies** (noisy â only for low-volume campaigns).\\n - Never: **Out of Office**, **Bounce** and **Unsubscribe**.\\n\\nEach notification contains the lead name, company, campaign, category, the first lines of the reply and a link that opens the conversation in the Unified Inbox.\\n\\n## Steps: email notifications\\n\\n1. In the left nav, click **Settings**, then **Notifications**.\\n2. Under **Email**, switch **Positive replies** on.\\n3. Enter the recipient addresses (comma-separated). Your login email is filled in by default.\\n4. Choose **Instant** or **Daily digest** (one email at the time you choose with all positive replies from the day).\\n5. Click **Save**.\\n\\n## Steps: Slack notifications\\n\\n1. In **Settings â Notifications**, under **Slack**, click **Connect Slack**.\\n2. Approve the OutreachFox app in Slack for your workspace.\\n3. Pick the **Channel** (for example \\\\#outreach-replies). A private channel works if you invite the OutreachFox app to it first.\\n4. Tick the events to post: **Interested**, **Meeting Booked**, custom positive categories, and optionally **Campaign paused (bounce rate)** and **Mailbox disconnected**.\\n5. Click **Save** and then **Send test** to confirm a message appears in the channel.\\n\\n## Steps: push notifications\\n\\n1. In **Settings â Notifications**, under **Push**, click **Enable**.\\n2. Allow notifications when your browser asks. On mobile, install the web app to the home screen first, then enable.\\n3. Choose which events to push. Recommended: **Interested** and **Meeting Booked** only.\\n4. Click **Save**.\\n\\n## Steps: per-campaign overrides\\n\\
99n1. Open the campaign, click **Edit Campaign â Settings â Show Advanced Configurations**.\\n2. Under **Notifications**, choose **Use workspace defaults** or set a different channel or recipient list for this campaign. Useful when one campaign belongs to a different rep or client.\\n3. Click **Resume Campaign** or **Save**.\\n\\n## Tips\\n\\n - Route Slack notifications to a shared channel and have the assignee react with an emoji when they take a conversation. It is the simplest way to avoid two people replying.\\n - If you run campaigns for several clients, use a Slack channel per client via the per-campaign override.\\n - Use the daily digest for **Not Interested** and **Wrong Person** if you want visibility without interruptions.\\n - Notifications are only as good as your categories. Once a week, check the **Interested** filter in the inbox against what was notified and fix any miscategorized replies.\\n - Turn on **Mailbox disconnected** alerts. A disconnected mailbox silently stops replies from reaching the inbox.\\n\\n## Troubleshooting\\n\\n - **No Slack messages.** The app was removed from the channel or the channel was archived. Reconnect under **Settings â Notifications** and pick the channel again. Also check that the events are ticked.\\n - **Email notifications go to spam.** Add the OutreachFox notification sender to your contacts or create a filter in your mail client.\\n - **Push works on desktop but not on mobile.** iOS requires the web app to be installed to the home screen and notifications allowed in iOS Settings for that app.\\n - **Notified for replies that are not positive.** A custom category has **Positive** sentiment but is used for neutral replies. Change its sentiment under **Reply Categorization**.\\n\\n## Related articles\\n\\n - Set AI reply categorization to organize campaign responses\\n - Unified Inbox overview: every reply from every mailbox and channel in one place\\n - Schedule a reply and set follow-up reminders\\n - Opportunities and pipeline view: manage interested leads\\n - Pause campaign automatically when the bounce rate is too high","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1EQTsq2GGVy2BE8EKvA0VMpSAbczt6cGNeHUhS-jUs48/edit"},{"slug":"filters-folders-and-assigning-conversations-to-teammates","title":"Filters, folders and assigning conversations to teammates","category":"unified-inbox","summary":"Once several campaigns and mailboxes feed the Unified Inbox, you need a way to see only what matters to you. Folders group conversations by state, filters narrow any folder by campaign, mailbox, caâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nOnce several campaigns and mailboxes feed the Unified Inbox, you need a way to see only what matters to you. Folders group conversations by state, filters narrow any folder by campaign, mailbox, category or label, and assignment gives every open conversation one owner.\\n\\n## Folders\\n\\nThe folder list on the left of **Inbox** contains:\\n\\n - **All** â every conversation that is not archived.\\n - **Unread** â conversations with at least one message you have not opened.\\n - **Assigned to me** â conversations where you are the assignee.\\n - **Unassigned** â open conversations with no owner. Keep this at zero.\\n - **Scheduled** â replies waiting for their send time.\\n - **Reminders** â conversations with a reminder set, ordered by due date.\\n - **Archived** â handled conversations. They return to **All** automatically if the lead replies again.\\n - **Labels** â one entry per label; click one to see all conversations with that label.\\n\\n## Steps: filter a folder\\n\\n1. In the left nav, click **Inbox** and pick a folder.\\n2. In the filter bar, click **Campaign** and tick one or more campaigns.\\n3. Click **Mailbox** to limit to a sending mailbox, **Channel** to choose **Email** or **LinkedIn**, and **Category** to choose a reply category such as **Interested**.\\n4. Click **Label** to add label conditions, and **Assignee** to pick a teammate.\\n5. Use the **Date** picker for a range (for example last 7 days).\\n6. Click **Save view** to keep this combination. Saved views appear under the folder list with the name you give them, for example Interested â EMEA â this week.\\n\\nFilters combine with AND: every condition must match. Within one filter (for example two campaigns) the values combine with OR.\\n\\n## Steps: assign a conversation\\n\\n1. Open the conversation.\\n2. Click **Assign** in the toolbar and pick a teammate. Type to search. Pick **Me** to take it yourself.\\n3. The assignee's avatar appears on the conversation row, and they receive a notification (in-app, and email or Slack if enabled).\\n4. To reassign, click the avatar and choose someone else. To clear, choose **Unassign**.\\n\\n## Steps: bulk actions\\n\\n1. In any folder, tick the checkboxes on
99several conversations, or tick the header checkbox to select the page.\\n2. Use the bulk toolbar: **Assign**, **Label**, **Change category**, **Mark read/unread**, **Archive**.\\n\\n## Auto-assignment rules\\n\\n1. Go to **Settings â Inbox** and click **Assignment rules**.\\n2. Click **New rule**, then choose a condition: **Campaign is**, **Mailbox is**, **Category is** or **Label is**.\\n3. Choose **Assign to** a single teammate or **Round robin** across a group.\\n4. Click **Save**. Rules apply to new conversations from that point on; use bulk assign for existing ones.\\n\\nTypical setup: everything from campaign X goes to the rep who owns it; every **Interested** reply round-robins between two AEs.\\n\\n## Tips\\n\\n - Give every teammate the same starting view: **Assigned to me** + **Unread**. Work that folder to zero, then check **Unassigned**.\\n - Archive, do not delete. Archived conversations keep the history and reopen when the lead writes.\\n - Use saved views instead of labels for anything that can be expressed as a filter (campaign, category, date). Labels are for information that is not otherwise in the data.\\n - Review **Unassigned** at the end of each day. A positive reply with no owner is a lost meeting.\\n\\n## Troubleshooting\\n\\n - **A teammate cannot see a conversation.** Their role is limited to specific campaigns. A workspace admin can change this under **Settings â Team**.\\n - **Saved view shows no results.** One of the conditions no longer exists (for example a deleted campaign or label). Edit the view and remove it.\\n - **Round robin assigns everything to one person.** The other members of the group have no access to the campaign, so they are skipped. Fix campaign access under **Settings â Team**.\\n\\n## Related articles\\n\\n - Unified Inbox overview: every reply from every mailbox and channel in one place\\n - Custom lead labels and how they relate to AI reply categories\\n - Schedule a reply and set follow-up reminders\\n - Positive-reply notifications (email, Slack, push)\\n - Invite teammates and manage roles","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/11LI5Zn-3ZOaorWBlMEoiD3hjxeic9HZhwAN846zP03A/edit"},{"slug":"deliverability-fundamentals-for-cold-email","title":"Deliverability fundamentals for cold email","category":"deliverability","summary":"Deliverability is whether your email reaches the primary inbox rather than spam or nowhere at all. For cold email it is the single biggest lever on results: a campaign with 40% inbox placement needâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nDeliverability is whether your email reaches the primary inbox rather than spam or nowhere at all. For cold email it is the single biggest lever on results: a campaign with 40% inbox placement needs two and a half times the volume of one with 100%. This article is the map. Each section links to the article that goes deeper.\\n\\n## The five pillars\\n\\n### 1\\\\. Infrastructure\\n\\n - Send from secondary domains, never your main brand domain.\\n - 2â3 mailboxes per domain, spread across several domains.\\n - SPF, DKIM and DMARC all passing; MX set; domain forwarding to a real site.\\n - A custom tracking domain per sending domain.\\n - Icemail sets up all of this automatically for domains bought through it.\\n\\n### 2\\\\. Reputation (warm-up)\\n\\n - Warm up every mailbox 14â21 days before use and keep warm-up on afterwards.\\n - Health 85+, inbox placement 95%+, spam placement under 5% before launch.\\n - Replace, do not nurse, mailboxes that stay under 70.\\n\\n### 3\\\\. Volume\\n\\n - 30â50 campaign emails per mailbox per day (start at 20).\\n - Ramp campaign volume the same way you ramp warm-up: increase weekly, not daily.\\n - Set **Daily new contacts limit** and use a sending schedule with business hours in the recipient's time zone.\\n\\n### 4\\\\. List quality\\n\\n - Verify every list before upload. Bounce rate must stay under 3%; set **Pause campaign when bounce rate reaches** 3%.\\n - Remove role addresses (info@, sales@), catch-all domains you cannot verify, and anyone who has replied \\"no\\".\\n - Use the global blocklist to keep competitors, customers and unsubscribers out of every campaign.\\n\\n### 5\\\\. Content and engagement\\n\\n - Plain-looking, short (under 120 words), one link at most, no images, no attachments.\\n - Personalised with variables and spintext so no two emails are identical.\\n - Run the **Spam Words** check in the editor before saving a step.\\n - Include an unsubscribe option (**Risk Control â Include Unsubscribe Message / Unsubscribe Header**).\\n - Replies are the strongest positive signal; a reply rate under 1% means the message, not the mailbox, needs work.\\n\\n## Where each control lives in OutreachFox\\n\\
99n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Control\\\\*\\\\* | \\\\*\\\\*Path\\\\*\\\\* |\\n| Buy domains/mailboxes with DNS pre-configured | Top-left icon â \\\\*\\\\*Icemail\\\\*\\\\* |\\n| Custom tracking domain | \\\\*\\\\*Domain\\\\*\\\\* â domain â \\\\*\\\\*Settings\\\\*\\\\* |\\n| Warm-up | \\\\*\\\\*Mailbox\\\\*\\\\* â select â \\\\*\\\\*Enable Warm Up\\\\*\\\\* |\\n| Per-mailbox daily limit | \\\\*\\\\*Mailbox\\\\*\\\\* â select â bulk actions â campaign emails per day |\\n| Daily new contacts, bounce pause, plain text, unsubscribe, auto match ESP | Campaign â \\\\*\\\\*Edit Campaign\\\\*\\\\* â \\\\*\\\\*Settings\\\\*\\\\* â \\\\*\\\\*Show Advanced Configurations\\\\*\\\\* |\\n| Sending schedules | \\\\*\\\\*Campaign Settings\\\\*\\\\* â \\\\*\\\\*Sending Schedules\\\\*\\\\* |\\n| Spam words | Sequence editor â \\\\*\\\\*Spam Words\\\\*\\\\* |\\n| Global blocklist | \\\\*\\\\*Settings\\\\*\\\\* â blocklist |\\n\\n## Healthy campaign benchmarks\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Metric\\\\*\\\\* | \\\\*\\\\*Healthy\\\\*\\\\* | \\\\*\\\\*Act if\\\\*\\\\* |\\n| Bounce rate | \\\\\\\\\\\\< 2% | \\\\\\\\\\\\> 3% |\\n| Reply rate (any) | 3â8% | \\\\\\\\\\\\< 1% |\\n| Spam complaint rate | \\\\\\\\\\\\< 0.1% | \\\\\\\\\\\\> 0.3% |\\n| Warm-up inbox placement | \\\\\\\\\\\\> 95% | \\\\\\\\\\\\< 90% |\\n| Open rate (if tracked) | 40â60% | \\\\\\\\\\\\< 25% |\\n\\n## Steps: a 10-minute pre-launch check\\n\\n1. **Domain** â confirm every sending domain has a verified tracking domain.\\n2. **Mailbox** â every sender shows health 85+ and warm-up on.\\n3. Campaign â **Settings â Show Advanced Configurations**: bounce pause 3%, unsubscribe on, daily new contacts limit set, auto match leads on.\\n4. Sequence editor â run **Spam Words** on every step and variant; use **Preview** to check variables render.\\n5. Contacts â list is verified and deduplicated.\\n6. Send a test to a Gmail and an Outlook address you own; confirm inbox placement and that authentication headers PASS.\\n\\n## Related articles\\n\\n - SPF, DKIM and DMARC: what they are and how to check yours\\n - What is mailbox warmup and how it works in OutreachFox\\n - How many mailboxes per domain and domains per campaign (best practice)\\n - Spam-trigger words and copy checks\\n - Blacklist monitoring: how to check and delist a domain or IP\\n - Inbox placement testing\\n - Global blocklist: exclude domains and emails from all campaigns\\n - Landing in spam? The recovery playbook","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1OlqtD8lkDI3J8XngnPjNzmdkvErnKIi3H6C5RIwzBDk/edit"},{"slug":"spam-trigger-words-and-copy-checks","title":"Spam-trigger words and copy checks","category":"deliverability","summary":"Spam filters score the words, formatting and structure of your email as well as its sender. The sequence editor in OutreachFox has a Spam Words button that flags risky phrases in a step before you â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nSpam filters score the words, formatting and structure of your email as well as its sender. The sequence editor in OutreachFox has a **Spam Words** button that flags risky phrases in a step before you save it. This article explains how to use it, what it catches, and the other copy checks to run before launch.\\n\\n## Steps: run the Spam Words check\\n\\n1. Open the campaign and go to the sequence editor (**Edit Campaign** â the email step).\\n2. Write or paste the subject line and body.\\n3. Click **Spam Words** in the editor toolbar (next to **Variables**, **Spintext** and **Preview**).\\n4. Review the highlighted words and phrases and the count.\\n5. Rewrite each flagged phrase in plain language, then run the check again until nothing is flagged.\\n6. Repeat for every variant (A/B/C) and every step in the sequence.\\n7. Click **Save**.\\n\\n## What you see afterwards\\n\\nFlagged phrases are highlighted in the editor with a total count. A clean step
99shows zero flags. Saving with flags is allowed but not recommended.\\n\\n## Common trigger categories\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Category\\\\*\\\\* | \\\\*\\\\*Examples\\\\*\\\\* | \\\\*\\\\*Rewrite as\\\\*\\\\* |\\n| Money and offers | free, discount, 50% off, no cost, cheapest, guarantee | \\"no charge for the first month\\" â describe the specific terms |\\n| Urgency | act now, limited time, urgent, last chance, don't miss | remove; cold email should not be urgent |\\n| Hype | amazing, incredible, revolutionary, best-in-class, \\\\\\\\\\\\#1 | state a concrete result instead |\\n| Sales cliches | dear friend, click here, buy now, order today, risk-free | \\"reply if useful\\" |\\n| Finance and prizes | earn money, winner, congratulations, cash, income | remove |\\n| Formatting | ALL CAPS, multiple exclamation marks, red text, large fonts | sentence case, no styling |\\n\\n## Other copy checks\\n\\n - **Length:** 50â120 words in the first email. Follow-ups shorter.\\n - **Links:** zero or one. No shortened URLs (bit.ly). Use the custom tracking domain if link tracking is on.\\n - **Images and attachments:** none in cold email. Put the deck behind a reply.\\n - **HTML:** minimal. Consider **Send emails in plain text** (campaign â Settings â Show Advanced Configurations) for the first step.\\n - **Personalisation:** at least first name and company via **Variables**; use **Spintext** on greetings and closing lines so every send differs.\\n - **Subject line:** 2â5 words, lowercase or sentence case, no \\"Re:\\" or \\"Fwd:\\" fakes, no emojis.\\n - **Signature:** name, title, company, one line of contact. No banners or social icons (**Mailbox â Settings â Edit signature**).\\n - **Unsubscribe:** enable **Include Unsubscribe Message** or **Unsubscribe Header** under Risk Control.\\n - **Preview:** click **Preview** to confirm variables render with real contact data and no {{first\\\\_name}} placeholders leak.\\n\\n## Tips\\n\\n - Write the way you would to a colleague. Most spam words are marketing words.\\n - Test the rewritten email by sending it to your own Gmail; if it lands in Promotions, cut links and adjectives further.\\n - A/B variants let you test a \\"safer\\" version against your original; watch reply rate, not open rate.\\n - Filters also read the reply thread. Keep follow-ups in the same thread and equally plain.\\n\\n## Troubleshooting\\n\\n - **Spam Words shows nothing but emails still land in spam.** Words are one input. Check warm-up health, authentication and list bounce rate first â see *Landing in spam? The recovery playbook*.\\n - **A variable's value triggers the check.** Company names sometimes contain flagged words (\\"Free Range Foods\\"). Ignore flags inside variable output.\\n - **Legitimate word flagged.** Use a synonym; filters do not know your context.\\n\\n## Related articles\\n\\n - Use spintext and variables for personalisation\\n - Send emails in plain text\\n - Add unsubscribe links and headers\\n - Deliverability fundamentals for cold email\\n - Inbox placement testing\\n - Landing in spam? The recovery playbook","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1FybnN1X1MF6mvq_dzeRFlDCC5zVdUz4uECbdfSccpv0/edit"},{"slug":"blacklist-monitoring-how-to-check-and-delist-a-domain-or-ip","title":"Blacklist monitoring: how to check and delist a domain or IP","category":"deliverability","summary":"A blacklist (blocklist, DNSBL) is a public list of domains or IP addresses reported for sending spam. Receiving servers query these lists and reject or junk mail from anything listed. A listing canâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nA blacklist (blocklist, DNSBL) is a public list of domains or IP addresses reported for sending spam. Receiving servers query these lists and reject or junk mail from anything listed. A listing can appear overnight and cut inbox placement for an entire domain. Check weekly and immediately whenever a domain's warm-up placement drops.\\n\\n## Which lists matter\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*List\\\\*\\\\* | \\\\*\\\\*Type\\\\*\\\\* | \\\\*\\\\*Impact\\\\*\\\\* |\\n| Spamhaus (SBL, XBL, DBL) | IP and domain | Highe
99st; used by most providers |\\n| SURBL | Domain (URLs in the body) | High; Icemail checks this before every order |\\n| Barracuda | IP | Medium |\\n| SpamCop | IP | Medium |\\n| UCEPROTECT | IP ranges | Low; often lists whole provider ranges, ignore level 2/3 |\\n| Microsoft / Google internal reputation | Not public | Shows only as spam placement |\\n\\nFor Google Workspace and Microsoft 365 mailboxes, the sending IPs belong to Google or Microsoft and are rarely listed; the domain lists (Spamhaus DBL, SURBL) are what to watch. For IMAP/SMTP mailboxes, the sending IP matters too.\\n\\n## Steps: check a domain\\n\\n1. Open a multi-list checker such as MXToolbox Blacklist Check or BlacklistMaster.\\n2. Enter the sending domain (acmehq.com) and run the check.\\n3. Enter the custom tracking domain (link.acmehq.com) and any domain linked in the email body, and check those too. URL blocklists look at links, not just the From domain.\\n4. For IMAP/SMTP mailboxes, send a test to your own Gmail, open **Show original**, find the sending IP in the last Received: header, and check that IP.\\n5. Record results. A clean check on all major lists means the domain is not the problem; look at warm-up, content and list quality instead.\\n\\n## Steps: delist\\n\\n1. Open the listing's detail link on the checker. Each list has its own removal page.\\n2. **Fix the cause first.** Lists re-add you within days if the behaviour continues. Typical causes: a purchased list with spam traps, bounce rate above 5%, a compromised mailbox, or a link to a listed site.\\n3. Submit the removal request. Spamhaus, Barracuda and SpamCop remove within 24â48 hours if the form is completed honestly; some lists expire automatically after 7â30 days of no new reports.\\n4. Pause the domain's mailboxes in OutreachFox while you wait: open the campaign â **Sender Accounts** and untick them, or set their **campaign emails per day** to 0 in bulk actions. Keep warm-up running.\\n5. Re-check after 48 hours. Once clean, resume at half volume for a week.\\n\\n## Steps: ongoing monitoring\\n\\n1. Set a weekly reminder to run the check on every sending and tracking domain.\\n2. Watch the **Warm up** tab's inbox placement for each mailbox; a sudden domain-wide drop is often a listing.\\n3. Watch campaign bounce rate. A spike in \\"blocked\\" or \\"rejected\\" bounces with reasons mentioning Spamhaus or \\"listed\\" confirms it.\\n4. When buying through Icemail, rely on its pre-order check, which rejects domains already on BlacklistMaster or SURBL.\\n\\n## Tips\\n\\n - Never link to a domain you have not checked. A partner's or a customer's blacklisted site in your email is enough to get you filtered.\\n - Sending domains are cheap. If a domain has been listed on Spamhaus DBL twice, retire it and buy a new one.\\n - Keep bounce pause at 3%; most listings start from bounces that hit spam traps.\\n - UCEPROTECT and a few small lists cannot be delisted without payment. Do not pay; providers largely ignore them.\\n\\n## Troubleshooting\\n\\n - **Listed but no bounces or placement drop.** Minor list; monitor, do not act.\\n - **Delisted but placement still low.** Provider-internal reputation lags a week or more. Continue reduced volume with warm-up.\\n - **IP listed for a Google/Microsoft mailbox.** Almost always a shared range false positive; nothing to do.\\n\\n## Related articles\\n\\n - Landing in spam? The recovery playbook\\n - Deliverability fundamentals for cold email\\n - Troubleshooting warmup (paused, low health score, high spam placement)\\n - Enable bounce protection (pause at X% bounce)\\n - Set up a custom tracking domain\\n - How Icemail automates SPF, DKIM and DMARC â and replaces mailboxes for free","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1y9ujKZfSSPjEOTAcTKvN-lUAB1VoBRaZ5P7XtDZcdWY/edit"},{"slug":"inbox-placement-testing","title":"Inbox placement testing","category":"deliverability","summary":"An inbox placement test sends a real campaign email to a set of mailboxes you control across Gmail, Outlook and other providers, then records where it landed: primary inbox, promotions, spam, or noâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nAn inbox placement test sends a real campaign email to a set of mailboxes you control across Gmail, Outlook and other providers, then records where it landed: primary inbox, promotions, spam, or not delivered. Warm-up analytics tell you how the mailbox performs with warm-up content; a placement test tells you how your actual campaign copy performs from that mailbox. Run one before every launch and after any change to copy or infrastru
99cture.\\n\\n## Prerequisites\\n\\n - The campaign sequence written and saved.\\n - Sender mailboxes warmed (health 85+).\\n - Seed addresses: at least one personal Gmail, one Google Workspace, one Outlook.com, one Microsoft 365, and if possible Yahoo and iCloud. Create them or use a paid seed-list service.\\n\\n## Steps: manual seed test\\n\\n1. Create a list called \\"Seed â placement\\" under **Contacts** and upload your seed addresses with a real first name and company so variables render.\\n2. Duplicate the campaign or create a test campaign with the same sequence, and select every sender mailbox under **Sender Accounts**.\\n3. Under **Contacts**, add the seed list. Set **Daily new contacts limit** high enough to send all seeds today.\\n4. Click **Launch Campaign**.\\n5. Wait 10â15 minutes, then log in to each seed mailbox and note where the email landed: Inbox, Promotions/Other, Spam, or missing.\\n6. For at least one Gmail seed, open the message â **Show original** and confirm SPF: PASS, DKIM: PASS, DMARC: PASS.\\n7. Record the results per sender mailbox and per provider in a simple table.\\n8. Pause or delete the test campaign.\\n\\n## Steps: using OutreachFox warm-up data as a proxy\\n\\n1. Go to **Mailbox** â mailbox â **Warm up**.\\n2. Read inbox placement, spam placement and the **ESP breakdown**.\\n3. Treat this as the mailbox baseline. If the seed test result is much worse than the warm-up placement, the copy is the cause; if both are bad, the mailbox or domain is.\\n\\n## How to read results\\n\\n| | | |\\n| :-: | :-: | :-: |\\n| \\\\*\\\\*Result\\\\*\\\\* | \\\\*\\\\*Meaning\\\\*\\\\* | \\\\*\\\\*Action\\\\*\\\\* |\\n| Inbox at all providers | Ready | Launch |\\n| Inbox at Google, spam at Microsoft | Provider-specific reputation | Slow ramp, route Microsoft leads to Microsoft mailboxes (Auto match leads), retest in 5 days |\\n| Promotions tab | Content looks like marketing | Cut links, images, formatting; enable plain text |\\n| Spam everywhere | Authentication or domain reputation | Check SPF/DKIM/DMARC, blacklists, warm-up health |\\n| Missing (never arrived) | Hard block or MX issue on seed | Check bounce in campaign; check seed mailbox filters |\\n\\n## Tips\\n\\n - Test each sending domain separately. One domain's problem should not hide behind another's success.\\n - Test each variant (A/B/C) â a single extra link in variant B can move it to Promotions.\\n - Retest weekly during a campaign's first month; reputation moves.\\n - Seed mailboxes must be used normally (receive other mail, log in regularly) or providers treat them as dormant and filter oddly.\\n - Marking your own test emails as \\"not spam\\" in seed inboxes helps a little, but do not rely on it; that is what warm-up is for.\\n\\n## Troubleshooting\\n\\n - **Seeds show inbox but real prospects do not reply.** Placement is fine; targeting or copy is not. Check reply categorisation for negative replies.\\n - **Placement varies day to day.** Normal within 10%. Larger swings point at volume spikes; check the send/reply history for the mailbox.\\n - **Test campaign keeps sending follow-ups to seeds.** Pause the test campaign after step 1 arrives, or delete it.\\n\\n## Related articles\\n\\n - Read the warmup health dashboard\\n - Review warmup send/reply history and ESP breakdown\\n - Spam-trigger words and copy checks\\n - SPF, DKIM and DMARC: what they are and how to check yours\\n - Enable Auto match ESP\\n - Landing in spam? The recovery playbook","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1iqr4vwHKi35nzoGGTWuwX9ls5-njvd6U1upRpLvF8e0/edit"},{"slug":"global-blocklist","title":"Global blocklist: exclude domains and emails from all campaigns","category":"deliverability","summary":"The global blocklist is a workspace-wide list of email addresses and domains that OutreachFox will never send to, in any campaign, now or later. Use it for unsubscribes, existing customers, competiâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThe global blocklist is a workspace-wide list of email addresses and domains that OutreachFox will never send to, in any campaign, now or later. Use it for unsubscribes, existing customers, competitors, partners, and anyone who asked not to be contacted. Contacts on the blocklist are skipped at upload and at send time, so a stray CSV cannot email them by mistake.\\n\\n## Why this matters\\n\\n - **Compliance.** An unsubscribe must be honoured everywhere, not just in the campaign it came from.\\n - **Reputation.** Emailing someone who already said no is the fastest route to a spam complaint, and complaints hurt more than bounces.\\n - **Relationships.** Cold-emailing a current customer or a partner's CEO is avoidable.\\n\\n## Steps: add entries manually\\n\\n1. Click **Settings** at the bottom-left.\\n2. Open the **Blocklist** (also labelled Block List / Do Not Contact) section.\\n3. Click **Add**.\\n4. Enter one or more values, one per line:\\n\\n - a full address: [email protected]\\n - a whole domain: acme.com (blocks every address at that domain)\\n5. Click **Save**.\\n\\n## Steps: import a blocklist file\\n\\n1. In the Blocklist section, click **Import** (or **Upload CSV**).\\n2. Choose a CSV with a single column of emails or domains, one per row, header optional.\\n3. Map the column if prompted and confirm.\\n4. Review the count of entries added and any rows skipped as invali
99d.\\n\\n## Steps: check whether a contact is blocked\\n\\n1. Go to **Contacts** and search the address.\\n2. A blocked contact shows a blocked or do-not-contact status and is excluded from campaign sends.\\n3. Inside a campaign, the **Contacts** tab's **Status** filter shows blocked leads separately from bounced and replied.\\n\\n## What happens automatically\\n\\n - Recipients who click the unsubscribe link or header (enabled under **Risk Control** in the campaign's advanced configurations) are added to the blocklist.\\n - Replies categorised as \\"Not interested / Do not contact\\" by reply categorisation can be blocklisted from the reply view.\\n - Contacts uploaded later that match a blocklisted address or domain are marked blocked and never sent to.\\n\\n## Tips\\n\\n - Block by domain for customers and competitors; block by address for individual opt-outs.\\n - Add your own company domains and your sending domains so seeds and colleagues never receive campaigns.\\n - Export the blocklist monthly and keep it with your CRM; if you move tools, the list moves with you.\\n - Blocking a domain does not remove existing contacts from lists; it stops sending to them. Use the Contacts page to delete records if required for a deletion request.\\n - Do not use the blocklist for temporary pauses. Untick the lead in the campaign or change its status instead.\\n\\n## Troubleshooting\\n\\n - **Blocked contact still received an email.** Check whether the email was sent before the entry was added; the blocklist is not retroactive. Also check for a typo or a subdomain (mail.acme.com is not blocked by acme.com unless wildcard matching is enabled).\\n - **Import skipped rows.** Rows with spaces, missing @, or multiple values per cell are rejected. Clean and re-import.\\n - **Need to unblock someone.** Find the entry in the Blocklist section and delete it. Contacts already marked blocked may need their status reset or a fresh upload.\\n\\n## Related articles\\n\\n - Add unsubscribe links and headers\\n - AI reply categorisation\\n - Check lead statuses in a campaign\\n - Upload contacts\\n - Deliverability fundamentals for cold email\\n - Landing in spam? The recovery playbook","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1eF3Gcdx_TC7bBUu2o5xbV9cEXqjfTwYJAbxaKyO4dcU/edit"},{"slug":"landing-in-spam-the-recovery-playbook","title":"Landing in spam? The recovery playbook","category":"deliverability","summary":"Replies stopped, warm-up spam placement jumped, or a seed test came back in the junk folder. This playbook takes you from \\"something is wrong\\" to a diagnosis and back to sending, in order. Do not sâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nReplies stopped, warm-up spam placement jumped, or a seed test came back in the junk folder. This playbook takes you from \\"something is wrong\\" to a diagnosis and back to sending, in order. Do not skip ahead: the fixes at the top are cheap and cover most cases.\\n\\n## Step 0: stop the bleeding (5 minutes)\\n\\n1. Open the affected campaign â **Edit Campaign** â **Settings** â **Show Advanced Configurations**.\\n2. Halve the **Daily new contacts limit**. If bounce rate is above 3%, pause the campaign entirely.\\n3. Go to **Mailbox**, select the affected mailboxes and confirm warm-up is **enabled**. If it was off, enable it with the provider's profile now.\\n4. Do not add new mailboxes or domains to the campaign yet.\\n\\n## Step 1: find the scope (10 minutes)\\n\\nAnswer one question: is it one mailbox, one domain, or everything?\\n\\n1. **Mailbox** â open each sender â **Warm up** tab. Compare spam placement across mailboxes.\\n2. One mailbox bad, others fine â mailbox problem. Go to Step 2.\\n3. All mailboxes on one domain bad â domain problem. Go to Step 3.\\n4. Every domain bad â campaign content or list problem. Go to Step 4.\\n\\n## Step 2: one mailbox\\n\\n1. Remove it from the campaign (**Sender Accounts** â untick).\\n2. Move it to a low-volume warm-up profile (max 15/day, reply rate 40%) for 7 days.\\n3. If spam placement returns under 5%, re-add at 20 emails/day.\\n4. If not, replace it: Icemail offers free mailbox replacements. Import the new mailbox and warm it 14 days.\\n\\n## Step 3: one domain\\n\\n1. **Authentication.** Send a test from the domain to Gmail â **Show original**. SPF, DKIM and DMARC must all PASS. Fix any FAIL at your DNS host (Icemail domains: check the DNS records in Icemail).\\n2. **Blacklists.** Run the domain and its tracking domain through a blacklist checker. Listed â delist and fix the cause.\\n3. **Domain basics.** Confirm the domain forwards to a real website and has MX records.\\n4. **Tracking domain.** **Domain** â domain â **Settings**: is the custom tracking domain verified? If links used a shared tracker, set one up now.\\n5. **Volume.** Add up all mailboxes on the domain à their daily limits. Above \\\\~150/day per domain is high; spread across more domains.\\n6. Pause the domain's mailboxes for 7 days with warm-up on, then re-add at half volume.\\n7. If the domain has been listed on Spamhaus DBL twice or spam placement stays above 20% after two weeks, retire the domain and buy a replacement.\\n\\n## Step 4: everything\\n\\nThe mailboxes are fine; what you are sending is not.\\n\\n1. **List quality.** Check the campaign's bounce rate. Above 3% â verify the list with an email verifier, remove invalid and catch-all addresses, and upload a clean list. Set **Pause campaign when bounce rate reaches** 3%.\\n2. **Complaints.** Look at reply categorisation for angry or \\"remove me\\" replies. More than a handful per 1,000 sends means targeting is off. Add those contacts and domains to the global blocklist.\\n3. **Copy.** Open each step â **Spam Words**. Remove flagged phrases, cut to under 120 words, one link maximum, no images. Turn on **Send emails in plain text** for the first step. Enable **Include Unsubscribe Message**.\\n4. **Per
99sonalisation.** Confirm **Variables** and **Spintext** are in use so sends differ from each other.\\n5. **Schedule.** Check the sending schedule sends in business hours in the recipient's time zone and not at weekends.\\n6. **Auto match leads.** Enable it under Deliverability and Safety so Gmail recipients get Google senders and Outlook recipients get Microsoft senders.\\n7. Run a seed placement test with the revised copy before resuming.\\n\\n## Step 5: resume carefully\\n\\n1. Resume at 50% of the previous daily volume.\\n2. After 7 days with bounce under 3% and warm-up spam placement under 5%, return to full volume.\\n3. Keep warm-up on permanently at 20â25/day per mailbox.\\n4. Schedule a weekly check of warm-up placement and blacklists.\\n\\n## Diagnosis table\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Signal\\\\*\\\\* | \\\\*\\\\*Points to\\\\*\\\\* |\\n| Replies dropped, bounces normal, warm-up placement dropped | Reputation (domain or mailbox) |\\n| Bounces spiked | List quality |\\n| Warm-up fine, seeds in Promotions | Content and formatting |\\n| One provider only (e.g. Microsoft) | Provider reputation; slow down, auto match |\\n| Sudden, all domains at once | Blacklist on shared element (tracking domain, linked site) |\\n\\n## Related articles\\n\\n - Deliverability fundamentals for cold email\\n - Troubleshooting warmup (paused, low health score, high spam placement)\\n - Blacklist monitoring: how to check and delist a domain or IP\\n - Spam-trigger words and copy checks\\n - Inbox placement testing\\n - SPF, DKIM and DMARC: what they are and how to check yours\\n - Global blocklist: exclude domains and emails from all campaigns\\n - Enable bounce protection (pause at X% bounce)","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1IntPMntlGXBAZYpd7aufdBik0tCXgX7djjTvaoTp6KA/edit"},{"slug":"campaign-analytics-explained","title":"Campaign analytics explained: sent, delivered, opens, replies, bounces, opportunities","category":"analytics-crm","summary":"Every campaign has an Analytics tab that shows how the sequence is performing. This article explains what each number means, how it is calculated, what a healthy value looks like for cold outreach,â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nEvery campaign has an **Analytics** tab that shows how the sequence is performing. This article explains what each number means, how it is calculated, what a healthy value looks like for cold outreach, and what to change when a number is off.\\n\\n## Steps: open campaign analytics\\n\\n1. In the left nav, click **Campaigns** and open the campaign.\\n2. Click the **Analytics** tab (the campaign opens on it by default once it is live).\\n3. Use the **Date range** picker at the top right to change the period. The default is the full life of the campaign.\\n4. Use the **Step** dropdown to see numbers for a single step or variant instead of the whole sequence.\\n5. Scroll down for the daily chart and the per-mailbox breakdown.\\n\\n## The metrics\\n\\n| | | | |\\n| :-: | :-: | :-: | :-: |\\n| \\\\*\\\\*Metric\\\\*\\\\* | \\\\*\\\\*What it counts\\\\*\\\\* | \\\\*\\\\*Healthy range\\\\*\\\\* | \\\\*\\\\*Notes\\\\*\\\\* |\\n| \\\\*\\\\*Contacts\\\\*\\\\* | Leads uploaded to the campaign, minus those removed | â | Includes leads not yet contacted. |\\n| \\\\*\\\\*Sent\\\\*\\\\* | Emails handed to the mailbox provider, all steps combined | â | One lead in a 3-step sequence can contribute up to 3 sends. |\\n| \\\\*\\\\*Delivered\\\\*\\\\* | Sent minus bounces | \\\\\\\\\\\\> 97% of Sent | Delivered does not mean it reached the inbox; spam placement is not visible here. |\\n| \\\\*\\\\*Opens\\\\*\\\\* / \\\\*\\\\*Open rate\\\\*\\\\* | Unique leads whose email loaded the tracking pixel ÷ Delivered | 40â70% | Only counted when open tracking is on. Apple Mail Privacy Protection and corporate image proxies inflate opens; treat as a trend, not a truth. |\\n| \\\\*\\\\*Clicks\\\\*\\\\* / \\\\*\\\\*Click rate\\\\*\\\\* | Unique leads who clicked a tracked link ÷ Delivered | 2â5% | Requires link tracking and, ideally, a custom tracking domain. |\\n| \\\\*\\\\*Replies\\\\*\\\\* / \\\\*\\\\*Reply rate\\\\*\\\\* | Unique leads who replied ÷ Delivered | 3â8% | Excludes Out of Office and bounce notifications. A lead who replies twice counts once. |\\n| \\\\*\\\\*Positive replies\\\\*\\\\* | Replies categorized \\\\*\\\\*Interested\\\\*\\\\* or \\\\*\\\\*Meeting Booked\\\\*\\\\*, or a custom category with positive sentiment | 1â3% of Delivered; 25â40% of Replies | Driven by AI reply categorization; fixing a category in the inbox updates this number. |\\n| \\\\*\\\\*Bounces\\\\*\\\\* / \\\\*\\\\*Bounce rate\\\\*\\\\* | Hard + soft bounces ÷ Sent | \\\\\\\\\\\\< 3% (pause at 5%) | Hard bounces (invalid address) are permanent; the lead is marked \\\\*\\\\*Bounced\\\\*\\\\* and removed from the sequence. |\\n| \\\\*\\\\*Unsubscribes\\\\*\\\\* | Leads who clicked the unsubscribe link or replied asking to be removed | \\\\\\\\\\\\< 1% | Added to the workspace suppression list. |\\n| \\\\*\\\\*Opportunities\\\\*\\\\* | Leads moved into the pipeline (automatically on \\\\*\\\\*Interested\\\\*\\\\*, or manually) | â | Feeds the Opportunities view. |\\n\\n## Reading the per-step view\\n\\
99nSelect a step to see Sent, Delivered, Open, Reply and Bounce rates for that step alone. Variants (A/B/C) appear as separate rows with their own rates and a **Winner** marker when the difference is significant (OutreachFox needs roughly 100 sends per variant before the comparison means anything). Reply rate almost always falls with each follow-up; a follow-up that gets under a third of step 1's reply rate is a candidate to rewrite or drop.\\n\\n## Reading the per-mailbox view\\n\\nScroll to **Mailboxes** to see the same metrics per sending account. A mailbox whose bounce rate or reply rate is far from the others is the one to pause and check under **Mailbox â Warm up**.\\n\\n## Tips\\n\\n - Judge a campaign on **Reply rate** and **Positive replies**, not opens. Opens are unreliable and, if open tracking is off for deliverability reasons, not present at all.\\n - Do not read the numbers before at least 200 delivered emails; small samples swing wildly.\\n - Bounce rate above 3% on the first day means the list was not verified. Pause, verify, then resume. The bounce-protection setting can do the pause for you.\\n - Compare campaigns with the same offer and audience only. A reply rate is meaningless across different ICPs.\\n\\n## Troubleshooting\\n\\n - **Opens are 0%.** Open tracking is off for the campaign, or **Send emails in plain text** is on (plain text has no tracking pixel).\\n - **Replies in the inbox but 0 replies in analytics.** Replies arrived from a different address than the one contacted, so they could not be matched. Merge them from the inbox.\\n - **Sent is lower than expected.** The daily new contacts limit, the mailbox daily limits or the sending schedule are throttling volume. Check **Edit Campaign â Settings â Show Advanced Configurations**.\\n - **Delivered is higher than Sent.** The date range filter cut across a day boundary. Widen the range.\\n\\n## Related articles\\n\\n - Workspace-level analytics across all campaigns and mailboxes\\n - Opportunities and pipeline view: manage interested leads\\n - Export reports and analytics to CSV\\n - How to check lead statuses and replies\\n - Pause campaign automatically when the bounce rate is too high\\n - Set up a custom tracking domain","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1-h6ALnwOoXLlher5D26FA668PRG-sl2l4Q2L0Tf1rnI/edit"},{"slug":"workspace-level-analytics-across-all-campaigns-and-mailboxes","title":"Workspace-level analytics across all campaigns and mailboxes","category":"analytics-crm","summary":"Campaign analytics tell you how one sequence performs. The workspace Analytics page adds everything up: total volume, reply and positive-reply rates across every campaign, and the health of every mâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nCampaign analytics tell you how one sequence performs. The workspace **Analytics** page adds everything up: total volume, reply and positive-reply rates across every campaign, and the health of every mailbox and domain, so you can spot the campaign that is dragging the average down or the mailbox that is about to hurt everyone's deliverability.\\n\\n## Steps\\n\\n1. In the left nav, click **Analytics**.\\n2. Set the **Date range** at the top right. Presets: **Last 7 days**, **Last 30 days**, **This month**, **Custom**. The default is the last 30 days.\\n3. Read the summary tiles: **Sent**, **Delivered**, **Reply rate**, **Positive reply rate**, **Bounce rate**, **Opportunities**. Each tile shows the change against the previous period.\\n4. Scroll to the **Daily** chart. Toggle the lines (**Sent**, **Replies**, **Bounces**, **Positive**) using the legend.\\n5. Scroll to the **Campaigns** table. Every campaign appears with status, contacts, sent, reply rate, positive reply rate and bounce rate. Click a column header to sort; click a campaign name to open its own analytics.\\n6. Scroll to the **Mailboxes** table. Every connected mailbox appears with emails sent, replies, bounce rate, warm-up status and health score. Click a mailbox to open **Mailbox â Warm up** for that account.\\n7. Scroll to the **Domains** table for sent volume, bounce rate and tracking-domain status per domain.\\n8. Use the **Campaign**, **Mailbox** and **Tag** filters above the tables to restrict everything on the page â for example one client's campaigns only.\\n\\n## What to look for\\n\\n - **Reply rate by campaign.**
99Sort the campaigns table by reply rate. Anything under 2% with more than 300 delivered needs a new angle or a new list. Anything over 8% is worth cloning.\\n - **Bounce rate by mailbox.** A single mailbox with a bounce rate two or three times the others usually has a list problem in one campaign, or the mailbox itself is being blocked. Pause it and check the warm-up health.\\n - **Volume distribution.** Sent per mailbox should be roughly even. If two mailboxes carry most of the volume, the other mailboxes are paused, disconnected or capped too low under **Mailbox** bulk settings.\\n - **Positive reply rate over time.** Falling positive rate at stable reply rate means the list quality has slipped or the message is attracting the wrong replies.\\n - **Domain-level bounces.** A domain with bounce rate above 5% is at risk of a blocklist. Stop sending from it for 7 days and check warm-up.\\n\\n## Recommended weekly routine\\n\\n1. Monday: last 7 days, check the four rate tiles against the previous week.\\n2. Sort the mailboxes table by bounce rate; pause any mailbox above 5% and any with health under 70.\\n3. Sort the campaigns table by positive reply rate; move budget and lists towards the top two.\\n4. Export the tables (see the CSV article) if you report to a client or manager.\\n\\n## Tips\\n\\n - Tag campaigns by client or product (**Edit Campaign â Settings â Tags**) so the **Tag** filter turns this page into a per-client dashboard.\\n - Keep total daily volume per mailbox at 30â50 emails including warm-up. The mailboxes table shows the combined number.\\n - Workspace numbers include paused and completed campaigns within the date range. Use the campaign **Status** filter to look at live campaigns only.\\n - Analytics refresh every 15 minutes; the page does not show real-time sends.\\n\\n## Troubleshooting\\n\\n - **Tiles show dashes.** No sends in the selected period. Widen the date range.\\n - **A mailbox is missing from the table.** It was deleted or it has never sent. Deleted mailboxes' historical sends are still counted in campaign totals but not shown as a row.\\n - **Totals differ from the sum of campaign analytics.** Workspace totals dedupe leads contacted by several campaigns; per-campaign numbers do not.\\n - **A teammate sees fewer campaigns.** Their role is restricted to specific campaigns; the page respects those permissions.\\n\\n## Related articles\\n\\n - Campaign analytics explained: sent, delivered, opens, replies, bounces, opportunities\\n - Export reports and analytics to CSV\\n - Mailbox warm-up analytics\\n - Bulk mailbox settings\\n - Opportunities and pipeline view: manage interested leads","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1cLQ0nLxG1qrvAg0OD6X3l06lfAGUbYeIx5XaMenByUg/edit"},{"slug":"opportunities-and-pipeline-view-manage-interested-leads","title":"Opportunities and pipeline view: manage interested leads","category":"analytics-crm","summary":"An opportunity is a lead who has shown interest and now needs to be worked to a meeting or a deal. The Opportunities page is a light CRM inside OutreachFox: a kanban board of interested leads by stâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nAn opportunity is a lead who has shown interest and now needs to be worked to a meeting or a deal. The **Opportunities** page is a light CRM inside OutreachFox: a kanban board of interested leads by stage, with value, owner and next step, so nothing that replied \\"yes\\" falls through the cracks between the inbox and your real CRM.\\n\\n## How leads become opportunities\\n\\n - Automatically, when a reply is categorized **Interested** or **Meeting Booked** (or any custom category with positive sentiment and the **useful** flag). The lead lands in the first stage.\\n - Manually, from the Unified Inbox: open the conversation and click **Add to opportunities**.\\n - Manually, from the campaign **Contacts** tab: select leads and click **Add to opportunities**.\\n\\nA lead is one opportunity across all campaigns; replying to two campaigns does not create two cards.\\n\\n## Steps: work the pipeline\\n\\n1. In the left nav, click **Opportunities**.\\n2. The board shows the default stages: **New**, **Contacted**, **Meeting booked**, **Proposal**, **Won**, **Lost**. Each card shows the lead, company, campaign, owner and days in stage.\\n3. Drag a card to the next stage, or open it and change **Stage**.\\n4. Open a card to see the full conversation thread (same as the inbox), the lead's fields and the activity log.\\n5. Set **Value** (expected deal size), **Owner** and **Next step** with a date. Overdue next steps show in red on the card.\\n6. Add **Notes** for context that is not in the thread â call notes, objections, decision date.\\n7. To close, drag to **Won** or **Lost**. For **Lost**, pick a reason (**No budget**, **Timing**, **Chose competitor**, **No response**, **Other**). Reasons appear in the pipeline report.\\n\\n## Steps: customise stages\\n\\n1. On the **Opportunities** page, click **Settings** (gear icon).\\n2. Click **Add stage**, give it a name and drag it into position. Rename or delete stages with the three-dots menu. Deleting a stage moves its cards to the previous stage.\\n3. Optionally set a **Default value** so new cards get a placeholder deal size.\\n4. Click **Save**.\\n\\n## Steps: filter and switch views\\n\\n1. Use the filters above the board: **Owner**, **Campaign**, **Stage**, **Label**, **Created date**.\\n2. Click **List** to switch from kanban to a sortable table with the same columns, or **Forecast** for value per stage and expected close month.\\n\\n## Tips\\n\\n - Treat **New** as an inbox: every card there should be moved to **Contacted** the same day you reply. Cards older than two days in **New** mean someone is not replying.\\n - Push opportunities to your CRM at **Meeting booked**, not at **New**. Earlier stages create noise for sales; later stages lose the source data.\\n - Use **Lost** reasons honestly. \\"No response\\" above 40% means your follow-up after a positive reply is too slow or too weak â see the reminders article.\\n - Keep values rough (three tiers is enough). The point is to prioritise, not to forecast to the dollar.\\n - Review the board in a 15-minute weekly meeting: overdue next steps first, then cards over 14 days in any stage.\\n\\n## Troubleshooting\\n\\n - **An interested lead did not appear.** The reply was categorized differently. Open it in the inbox, change the category to **Interested**; the card is created immediately.\\n - **Duplicate cards for one company.** Two different people at the company replied. That is expected â merge manually by marking one **Lost** with reason **Other** and noting the primary contact.\\n - **Card shows \\"No owner\\".** Auto-assignment rules do not cover this campaign. Assign an owner on the card, or add a rule under **Settings â Inbox â Assignment rules**.\\n - **Value totals look wrong in Forecast.** Cards without a value are counted as zero. Set a **Default value** in stage settings.\\n\\n## Related articles\\n\\n - Custom lead labels and how they relate to AI reply categories\\n - Positive-reply notifications (email, Slack, push)\\n - Schedule a reply and set follow-up reminders\\n - Campaign analytics explained: sent, delivered, opens, replies, bounces, opportunities\\n - Export reports and analytics to CSV\\n - Set AI reply categorization to organize campaign responses","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1-Ci8UG-tMuBwDfMxGeC3LMrnTxDaz86ZKJdrKcvN4IA/edit"},{"slug":"export-reports-and-analytics-to-csv","title":"Export reports and analytics to CSV","category":"analytics-crm","summary":"Everything you see in OutreachFox anal
99ytics, the campaign Contacts tab and the Opportunities page can be downloaded as a CSV file. Use exports to report to clients or managers, to push replies intoâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nEverything you see in OutreachFox analytics, the campaign **Contacts** tab and the **Opportunities** page can be downloaded as a CSV file. Use exports to report to clients or managers, to push replies into your CRM, to build a suppression list, or to analyse results in a spreadsheet.\\n\\n## What you can export\\n\\n| | | | |\\n| :-: | :-: | :-: | :-: |\\n| \\\\*\\\\*Export\\\\*\\\\* | \\\\*\\\\*Where\\\\*\\\\* | \\\\*\\\\*Rows\\\\*\\\\* | \\\\*\\\\*Typical columns\\\\*\\\\* |\\n| Campaign summary | \\\\*\\\\*Campaigns â campaign â Analytics â Export\\\\*\\\\* | One per day (or per step) | Date, sent, delivered, opens, clicks, replies, positive replies, bounces, unsubscribes |\\n| Campaign leads | \\\\*\\\\*Campaigns â campaign â Contacts â Export\\\\*\\\\* | One per lead | All lead fields, status, current step, last sent, replied at, reply category, bounce type, mailbox used |\\n| Workspace analytics | \\\\*\\\\*Analytics â Export\\\\*\\\\* | One per campaign, mailbox or domain (choose the table) | Same columns as the table shown |\\n| Opportunities | \\\\*\\\\*Opportunities â List â Export\\\\*\\\\* | One per opportunity | Lead, company, campaign, stage, value, owner, next step, created, closed, lost reason |\\n| Inbox conversations | \\\\*\\\\*Inbox â filter â Export\\\\*\\\\* | One per conversation | Lead, campaign, category, labels, assignee, last message date, reply text (first 500 characters) |\\n| Contacts list | \\\\*\\\\*Contacts â list â Export\\\\*\\\\* | One per contact | All fields, lists, status, unsubscribed |\\n\\n## Steps: export campaign leads\\n\\n1. In the left nav, click **Campaigns** and open the campaign.\\n2. Click **Contacts**.\\n3. Optionally click **Status** and pick a filter (for example **Replied** or **Bounced**) â the export respects the current filter and search.\\n4. Click **Export** at the top right and choose **CSV**.\\n5. Choose **All columns** or **Selected columns**, then click **Export**.\\n6. Small exports (under 5,000 rows) download immediately. Larger exports run in the background; you get an in-app notification and an email with a download link, valid for 7 days.\\n\\n## Steps: export analytics\\n\\n1. Open the campaign's **Analytics** tab or the workspace **Analytics** page.\\n2. Set the **Date range** and any filters. The export matches what is on screen.\\n3. Click **Export** and choose **Daily** (one row per day) or **By step** / **By campaign** / **By mailbox**.\\n4. Click **Download**.\\n\\n## File format\\n\\n - UTF-8 with a header row, comma-separated, dates in ISO format (2026-09-21T14:03:00Z, UTC).\\n - Rates are exported as raw counts, not percentages; compute rates in your spreadsheet so they stay correct after filtering.\\n - Custom lead fields appear as extra columns with the field name as the header.\\n - Excel users: open via **Data â From Text/CSV** and pick UTF-8 to keep accented names intact.\\n\\n## Tips\\n\\n - For CRM imports, export **Campaign leads** filtered to **Replied**, then filter the reply-category column to **Interested** in your spreadsheet.\\n - To build a do-not-contact list for another tool, export **Contacts** filtered to **Unsubscribed** plus campaign leads filtered to **Bounced**.\\n - For client reporting, export the workspace **Analytics** by campaign with the **Tag** filter set to the client, last 30 days. Combine with the opportunities exp
99ort for a one-page report.\\n - Exports are a snapshot. Schedule them (weekly, same day) if you track trends; there is no automatic scheduled export today.\\n - Export before deleting a campaign; deleted campaigns' data is not recoverable.\\n\\n## Troubleshooting\\n\\n - **The download is empty or has only a header.** The current filter matched no rows. Clear the **Status** filter and search box and try again.\\n - **Reply text is cut off.** The inbox export includes the first 500 characters only. Open the conversation for the full thread.\\n - **Names show as garbled characters.** The file was opened with the wrong encoding. Re-open as UTF-8.\\n - **The export email never arrived.** Check spam, then **Settings â Notifications** to confirm your email address. Large exports can take up to 15 minutes.\\n - **No Export button.** Your role does not allow exports. Ask a workspace admin under **Settings â Team**.\\n\\n## Related articles\\n\\n - Campaign analytics explained: sent, delivered, opens, replies, bounces, opportunities\\n - Workspace-level analytics across all campaigns and mailboxes\\n - Opportunities and pipeline view: manage interested leads\\n - How to check lead statuses and replies\\n - Uploading contacts to OutreachFox","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1Dq2ixGOx6MFIQpdtNvZZItcV4CdLNPkb8AGYiv2r_Lw/edit"},{"slug":"api-keys-and-authentication","title":"API keys and authentication","category":"integrations-api","summary":"The OutreachFox API lets you create campaigns, push leads, read replies and manage mailboxes from your own code. Every request is authenticated with an API key that belongs to one workspace. This aâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThe OutreachFox API lets you create campaigns, push leads, read replies and manage mailboxes from your own code. Every request is authenticated with an API key that belongs to one workspace. This article shows where to create keys, how to send them, how to stay inside rate limits and how to rotate a key safely.\\n\\n## Prerequisites\\n\\n - You are an **Owner** or **Admin** of the workspace. Members and Client viewers cannot create keys.\\n - You know which workspace the key should belong to. A
99key only reaches the campaigns, contacts and mailboxes of the workspace it was created in.\\n\\n## Steps\\n\\n1. Click **Settings** in the bottom-left corner of the left nav.\\n2. Open the **Integrations** tab and click **API Keys**.\\n3. Click **Create API Key**.\\n4. Enter a **Name** that says where the key will be used, for example zapier-prod or crm-sync.\\n5. Choose the **Scope**. Use **Read only** for reporting and dashboards; use **Read and write** only when the integration needs to create leads, campaigns or webhooks.\\n6. Click **Create**. The full key is shown once. Copy it into your secrets manager now; after you close the dialog only the last four characters are visible.\\n7. Send the key in the Authorization header of every request:\\n\\nGET https://api.outreachfox.com/v1/campaigns\\n\\nAuthorization: Bearer of\\\\_live\\\\_xxxxxxxxxxxxxxxxxxxx\\n\\nContent-Type: application/json\\n\\n1. Check the response. A 200 with a JSON body means the key works. 401 Unauthorized means the key is missing, malformed or revoked; 403 Forbidden means the key's scope does not allow the action.\\n\\nAfter the key is created it appears in the **API Keys** list with its name, scope, creation date and **Last used** timestamp. Use **Last used** to find keys that are no longer needed.\\n\\n## Rate limits and etiquette\\n\\n - The default limit is **60 requests per minute per API key**, with bursts of up to 10 requests per second. The response headers X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset tell you where you stand.\\n - When you receive 429 Too Many Requests, wait for the number of seconds in the Retry-After header and retry with exponential backoff (1 s, 2 s, 4 s, up to 60 s). Do not retry in a tight loop.\\n - Use bulk endpoints where they exist. POST /v1/leads/bulk accepts up to 1,000 leads per call and costs one request, not one thousand.\\n - Poll no more often than every 60 seconds. For anything event-driven (replies, bounces, unsubscribes), use webhooks instead of polling. See \\"Webhooks: events, payload examples and retries\\".\\n - Paginate with the cursor parameter and a limit of 100 or less.\\n\\n## Key rotation\\n\\nRotate a key every 90 days, whenever a team member with access leaves, and immediately if a key is pasted into a ticket, a chat or a public repository.\\n\\n1. Create a new key with the same name plus a suffix, for example crm-sync-2.\\n2. Deploy the new key to the integration.\\n3. Confirm the new key's **Last used** timestamp updates.\\n4. In **Settings â Integrations â API Keys**, click the three dots next to the old key and choose **Revoke**. Revocation is immediate and cannot be undone.\\n\\n## Tips\\n\\n - Create one key per integration. If one key leaks, you only revoke that one.\\n - Never put a key in a URL query string; it ends up in server logs.\\n - Store keys in environment variables or a secrets manager, never in front-end code.\\n - Keys for a test workspace are prefixed of\\\\_test\\\\_; production keys are prefixed of\\\\_live\\\\_. Check the prefix when a request unexpectedly returns empty data.\\n\\n## Troubleshooting\\n\\n - **401 on every request**: check for a trailing space or missing Bearer prefix in the header.\\n - **403 on a write**: the key was created with **Read only** scope. Create a new key with **Read and write**; scope cannot be changed after creation.\\n - **Empty lists**: the key belongs to a different workspace than the one you are looking at in the app.\\n - **Sudden 429s**: another process is sharing the same key. Give each process its own key.\\n\\n## Related articles\\n\\n - Webhooks: events, payload examples and retries\\n - Connect OutreachFox to Zapier and Make\\n - OutreachFox MCP server: use OutreachFox from Claude, Cursor and other AI agents\\n - Create workspaces, invite members and set roles\\n - Security: two-factor authentication, sessions and audit logs","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1bYD57q5NZ1YBSsXmw-ewSYl07HwLwOO6RLuYBM4hHkw/edit"},{"slug":"webhooks-events-payload-examples-and-retries","title":"Webhooks: events, payload examples and retries","category":"integrations-api","summary":"Webhooks push campaign events to a URL you control the moment they happen, so you do not have to poll the API. Use them to route replies to your CRM, alert your team in Slack or suppress bounced adâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nWebhooks push campaign events to a URL you control the moment they happen, so you do not have to poll the API. Use them to route replies to your CRM, alert your team in Slack or suppress bounced addresses in other tools.\\n\\n## Prerequisites\\n\\n - An HTTPS endpoint that accepts POST requests and returns a 2xx status within 10 seconds.\\n - **Owner** or **Admin** role in the workspace.\\n\\n## Available events\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Event\\\\*\\\\* | \\\\*\\\\*Fires when\\\\*\\\\* |\\n| email.sent | A campaign email leaves a mailbox |\\n| lead.replied | A reply is received and matched to a lead |\\n| lead.interested | Reply Categorization marks a reply as \\\\*\\\\*Interested\\\\*\\\\* (or another category flagged as useful) |\\n| lead.bounced | A hard or soft bounce is recorded for a lead |\\n| lead.unsubscribed | A lead clicks the unsubscribe link or is marked unsubscribed |\\n| campaign.paused | A campaign is paused manually or automatically (for example by the bounce-rate limit) |\\n\\n## Steps\\n\\n1. Click **Settings** in the bottom-left corner, then open **Integrations â Webhooks**.\\n2. Click **Add Webhook**.\\n3. Enter the **Endpoint URL** (HTTPS only).\\n4. Tick the **Events** you want. Start with lead.replied and lead.bounced; add the rest when your handler is ready for them.\\n5. Optionally restrict the webhook to specific **Campaigns**. Leave empty to receive events from all campaigns in the workspace.\\n6. Click **Save**. OutreachFox generates a **Signing secret**. Copy it; you use it to verify that requests really come from OutreachFox.\\n7. Click **Send test event** to deliver a sample lead.replied payload to your endpoint and confirm you see a 200 in the **Deliveries** log.\\n\\n## Payload format\\n\\nEvery event uses the same envelope:\\n\\
99n{\\n\\n \\"id\\": \\"evt\\\\_01J8XK3Q7M2P\\",\\n\\n \\"type\\": \\"lead.replied\\",\\n\\n \\"created\\\\_at\\": \\"2026-09-21T09:14:02Z\\",\\n\\n \\"workspace\\\\_id\\": \\"ws\\\\_4f2a\\",\\n\\n \\"data\\": {\\n\\n \\"campaign\\": { \\"id\\": \\"cmp\\\\_8c1d\\", \\"name\\": \\"Q4 SaaS founders\\" },\\n\\n \\"lead\\": {\\n\\n \\"id\\": \\"lead\\\\_2b9e\\",\\n\\n \\"email\\": \\"[email protected]\\",\\n\\n \\"first\\\\_name\\": \\"Jane\\",\\n\\n \\"company\\": \\"Example Inc\\",\\n\\n \\"status\\": \\"replied\\"\\n\\n },\\n\\n \\"mailbox\\": { \\"id\\": \\"mbx\\\\_71aa\\", \\"email\\": \\"[email protected]\\" },\\n\\n \\"reply\\": {\\n\\n \\"subject\\": \\"Re: Quick question\\",\\n\\n \\"snippet\\": \\"Sure, send over a time.\\",\\n\\n \\"category\\": \\"Interested\\",\\n\\n \\"sentiment\\": \\"positive\\",\\n\\n \\"received\\\\_at\\": \\"2026-09-21T09:13:55Z\\"\\n\\n }\\n\\n }\\n\\n}\\n\\nlead.bounced replaces reply with bounce: { \\"type\\": \\"hard\\", \\"reason\\": \\"550 5.1.1 user unknown\\" }. campaign.paused carries data.campaign plus reason: \\"bounce\\\\_rate\\\\_limit\\" | \\"manual\\" | \\"mailbox\\\\_disconnected\\". email.sent carries data.step (step and variant), data.subject and data.message\\\\_id. lead.unsubscribed carries source: \\"link\\" | \\"manual\\" | \\"reply\\".\\n\\n## Verifying signatures\\n\\nEach request includes an X-OutreachFox-Signature header: t=\\\\<unix timestamp\\\\>,v1=\\\\<hex HMAC-SHA256\\\\>. Compute HMAC-SHA256(secret, \\"\\\\<timestamp\\\\>.\\\\<raw body\\\\>\\"), compare it to v1 with a constant-time comparison, and reject requests whose timestamp is more than 5 minutes old.\\n\\n## Retries\\n\\n - A delivery is successful when your endpoint returns any 2xx within 10 seconds.\\n - On timeout or a non-2xx response, OutreachFox retries with backoff: 1 min, 5 min, 30 min, 2 h, 6 h, 24 h (six attempts over roughly 33 hours).\\n - Deliveries can arrive out of order and, rarely, twice. Store id and ignore events you have already processed.\\n - If every delivery fails for 7 days, the webhook is disabled and the workspace Owner is emailed. Re-enable it under **Settings â Integrations â Webhooks** after fixing the endpoint.\\n\\n## Tips\\n\\n - Acknowledge immediately and process in a background job; do not call your CRM inside the request handler.\\n - Use one webhook per destination rather than one giant handler.\\n - The **Deliveries** tab shows the last 30 days of attempts with status, response code and body. Click **Redeliver** to resend a single event.\\n\\n## Troubleshooting\\n\\n - **No events arrive**: check that the endpoint is public, HTTPS and not blocking OutreachFox's IPs. Send a test event and read the response in **Deliveries**.\\n - **Signature mismatches**: verify against the raw request body, not a re-serialised version.\\n - **Duplicate CRM records**: deduplicate on data.lead.id, not on email address.\\n\\n## Related articles\\n\\n - API keys and authentication\\n - Connect OutreachFox to Zapier and Make\\n - Sync leads and replies with HubSpot, Pipedrive and Salesforce\\n - Slack notifications for replies and campaign events\\n - AI Reply Categorization Guide\\n - Enable Email Bounce Protection","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/14Gq_Z1e1iK0Y4Mk274ohC9uzhSEZqaXjLiriCkUdhKw/edit"},{"slug":"connect-outreachfox-to-zapier-and-make","title":"Connect OutreachFox to Zapier and Make","category":"integrations-api","summary":"Zapier and Make let you connect OutreachFox to thousands of other apps without writing code. Typical uses: add a new form submission or CRM contact to a campaign, post interested replies to a
99spreaâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nZapier and Make let you connect OutreachFox to thousands of other apps without writing code. Typical uses: add a new form submission or CRM contact to a campaign, post interested replies to a spreadsheet, or pause a campaign when a Google Sheet flag changes. Both platforms connect to OutreachFox with an API key and receive events through webhooks.\\n\\n## Prerequisites\\n\\n - An OutreachFox API key with **Read and write** scope (see \\"API keys and authentication\\").\\n - A Zapier or Make account. Webhook triggers require a paid Zapier plan; Make includes them on all plans.\\n\\n## Steps: Zapier\\n\\n1. In Zapier, click **Create Zap**.\\n2. For the trigger, search for **OutreachFox** and choose an event such as **New Reply**, **Lead Interested** or **Lead Bounced**. If the OutreachFox app is not available in your Zapier account, use **Webhooks by Zapier â Catch Hook** instead and copy the hook URL.\\n3. Click **Sign in** and paste your API key. Zapier tests the key and shows the workspace name.\\n4. Pick the **Campaign** to watch, or leave it blank for all campaigns.\\n5. Click **Test trigger**. Zapier pulls a recent event so you can map fields.\\n6. Add an action. Common actions: **OutreachFox â Add Lead to Campaign**, **HubSpot â Create Contact**, **Slack â Send Channel Message**, **Google Sheets â Create Row**.\\n7. For **Add Lead to Campaign**, map at least **Email**, **First Name** and **Company**. Extra columns become custom variables you can use in the sequence editor with {{custom.field}}.\\n8. Click **Publish**.\\n\\nIf you used **Catch Hook**, go to OutreachFox **Settings â Integrations â Webhooks**, click **Add Webhook**, paste the Zapier hook URL, select the events and click **Save**.\\n\\n## Steps: Make\\n\\n1. In Make, click **Create a new scenario**.\\n2. Add the **OutreachFox** module, or a **Webhooks â Custom webhook** module if you prefer raw events.\\n3. Click **Add** next to Connection, paste the API key and click **Save**.\\n4. Choose the trigger (**Watch Replies**, **Watch Bounces**, **Watch Interested Leads**) or the action (**Add Lead**, **Update Lead Status**, **Pause Campaign**, **Resume Campaign**).\\n5. Connect the following modules and map fields the same way as in Zapier.\\n6. Click **Run once** to confirm the flow, then turn **Scheduling** on.\\n\\nFor a custom webhook, copy the address Make shows, add it in OutreachFox under **Settings â Integrations â Webhooks**, and click **Send test event** so Make can detect the data structure.\\n\\n## What you see afterwards\\n\\nNew leads added through Zapier or Make appear in **Contacts** and in the campaign's **Contacts** tab with the status **New**. They are sent according to the campaign's sending schedule and the **Daily new contacts limit** in **Edit Campaign â Settings â Show Advanced Configurations**.\\n\\n## Tips\\n\\n - Add a **Filter** step before **Add Lead to Campaign** to drop rows without a valid email, personal domains (gmail.com, yahoo.com) and roles like info@ or sales@.\\n - Set duplicate handling at the campaign level: leads that already exist in the workspace are skipped by default, so re-running a Zap does not double-send.\\n - Keep polling triggers at the platform default (every 15 minutes on Zapier). Webhook triggers are instant and do not count against the API rate limit.\\n - Use a dedicated API key named zapier or make so you can revoke it without touching other integrations.\\n\\n## Troubleshooting\\n\\n - **\\"Authentication failed\\"**: the key has a trailing space or is **Read only**. Create a new **Read and write** key.\\n - **Leads added but never emailed**: the campaign is paused, has no sender accounts, or the daily new contacts limit is reached. Check **Campaigns â your campaign â Settings**.\\n - **Trigger fires twice**: both an OutreachFox app trigger and a webhook are enabled for the same event. Keep one.\\n - **Custom fields empty in emails**: the variable name in the sequence editor must exactly match the column name you mapped in Zapier or Make.\\n\\n## Related articles\\n\\n - API keys and authentication\\n - Webhooks: events, payload examples and retries\\n - Sync leads and replies with HubSpot, Pipedrive and Salesforce\\n - Slack notifications for replies and campaign events\\n - Uploading Contacts to OutreachFox\\n - Adding Leads to Existing Campaign","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1JyR6tJ-7bn5NQCun6dPAHGn_F1QPuDT5OJVmAmv_Zi4/edit"},{"slug":"sync-leads-and-replies-with-hubspot-pipedrive-and-salesforce","title":"Sync leads and replies with HubSpot, Pipedrive and Salesforce","category":"integrations-api","summary":"The CRM integrations keep OutreachFox and your CRM in step: leads you upload to a campaign are created or updated in the CRM, and replies, bounces and status changes flow back as activities and proâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThe CRM integrations keep OutreachFox and your CRM in step: leads you upload to a campaign are created or updated in the CRM, and replies, bounces and status changes flow back as activities and property updates. Your sales team works from the CRM; your outreach team works from OutreachFox; nobody copies rows by hand.\\n\\n## Prerequisites\\n\\n - **Owner** or **Admin** role in the OutreachFox workspace.\\n - A CRM user with permission to install apps and edit contact and deal fields (HubSpot Super Admin, Pipedrive Admin, Salesforce System Administrator or a profile with API access).\\n - One CRM connection per workspace. Agencies running one workspace per client connect each client's CRM to that client's workspace.\\n\\n## Steps: connect the CRM\\n\\
99n1. Click **Settings** in the bottom-left corner and open **Integrations â CRM**.\\n2. Click **Connect** next to **HubSpot**, **Pipedrive** or **Salesforce**.\\n3. Sign in to the CRM in the pop-up and approve the requested permissions (read and write contacts, companies, deals or opportunities, and activities).\\n4. Back in OutreachFox, choose the **Sync direction**:\\n\\n - **OutreachFox â CRM**: push leads and activities to the CRM (default).\\n - **Two-way**: also pull contacts from a CRM list, view or filter into a lead list.\\n5. Under **Field mapping**, match OutreachFox lead fields to CRM properties. **Email**, **First name**, **Last name** and **Company** are mapped automatically; add custom fields such as **LinkedIn URL** or **Job title**.\\n6. Under **Sync events**, tick what should create CRM activity: **Email sent**, **Reply received**, **Interested**, **Bounced**, **Unsubscribed**.\\n7. Choose the **Owner** rule: keep the existing CRM owner, or assign new contacts to the OutreachFox user who launched the campaign.\\n8. Click **Save**. The first sync runs within a few minutes.\\n\\n## Steps: enable sync on a campaign\\n\\n1. Open **Campaigns**, select the campaign, click **Edit Campaign â Settings**.\\n2. Turn on **Sync with CRM** and, if prompted, pick a **Pipeline** and **Stage** for interested leads.\\n3. Click **Save**, then **Resume Campaign** if the campaign was live.\\n\\n## What syncs\\n\\n| | | | |\\n| :-: | :-: | :-: | :-: |\\n| \\\\*\\\\*OutreachFox event\\\\*\\\\* | \\\\*\\\\*HubSpot\\\\*\\\\* | \\\\*\\\\*Pipedrive\\\\*\\\\* | \\\\*\\\\*Salesforce\\\\*\\\\* |\\n| Lead added to campaign | Contact created or updated; Lead status = In sequence | Person created or updated | Lead created or updated |\\n| Email sent | Logged email on timeline | Email activity | Task (type Email) |\\n| Reply received | Logged email + Last reply date | Note + activity | Task + Last reply date |\\n| Interested | Lead status = Interested; optional Deal created | Deal created in chosen stage | Opportunity created (optional) |\\n| Bounced | Email marked invalid | Person flagged | Email bounced checked |\\n| Unsubscribed | Marketing contact set to non-marketing | Do not contact flag | Email opt out checked |\\n\\n## Tips\\n\\n - Deduplicate on email address in both systems before the first sync. Duplicates in the CRM cause activities to land on the wrong record.\\n - Map **Campaign name** to a custom property so reporting in the CRM can group by campaign.\\n - Suppress CRM contacts already in an open deal: use the two-way filter \\"Deal stage is empty\\" when importing a list.\\n - CRM sync uses the same rate limits as the API. Large backfills (over 10,000 leads) run in batches over several hours.\\n\\n## Troubleshooting\\n\\n - **\\"Connection expired\\"**: the CRM user's password or permissions changed. Click **Reconnect** in **Settings â Integrations â CRM**.\\n - **Replies logged on the wrong contact**: the CRM has two records with the same email. Merge them in the CRM; OutreachFox matches the first record returned.\\n - **Nothing syncs for one campaign**: **Sync with CRM** is off for that campaign, or the campaign was created before the CRM was connected. Toggle it on in **Edit Campaign â Settings**.\\n - **Field mapping missing an option**: the CRM property is read-only or a calculated field. Choose a text or dropdown property.\\n\\n## Related articles\\n\\n - Webhooks: events, payload examples and retries\\n - Connect OutreachFox to Zapier and Make\\n - Slack notifications for replies and campaign events\\n - Uploading Contacts to OutreachFox\\n - Checking Lead Statuses Guide\\n - AI Reply Categorization Guide","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1VwMem3rCxDjPxgh-eE6KCgRnxA9fr8r0t6LxuTfV7Q4/edit"},{"slug":"slack-notifications-for-replies-and-campaign-events","title":"Slack notifications for replies and campaign events","category":"integrations-api","summary":"The Slack integration posts a message to a channel of your choice when a lead replies, when a reply is categorised as interested, when a lead bounces or unsubscribes, and when a campaign pauses. Itâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThe Slack integration posts a message to a channel of your choice when a lead replies, when a reply is categorised as interested, when a lead bounces or unsubscribes, and when a campaign pauses. It is the fastest way to make sure a hot reply is answered within the hour instead of sitting in a shared inbox.\\n\\n## Prerequisites\\n\\n - **Owner** or **Admin** role in the OutreachFox workspace.\\n - Permission to install apps in your Slack workspace, or a Slack admin who can a
99pprove the app.\\n\\n## Steps\\n\\n1. Click **Settings** in the bottom-left corner and open **Integrations â Slack**.\\n2. Click **Connect Slack**.\\n3. In the Slack authorisation screen, pick the Slack workspace and click **Allow**.\\n4. Back in OutreachFox, click **Add notification**.\\n5. Choose a **Channel**. Private channels appear only after you invite the OutreachFox app to them in Slack (/invite @OutreachFox).\\n6. Tick the **Events** to post:\\n\\n - **Reply received** (every reply)\\n - **Interested reply** (only replies Reply Categorization marks as **Interested** or another category flagged as useful)\\n - **Bounce**\\n - **Unsubscribe**\\n - **Campaign paused**\\n - **Mailbox disconnected**\\n - **Daily summary** (sent, replies, bounce rate per campaign, posted at 9:00 in the workspace time zone)\\n7. Optionally limit the notification to specific **Campaigns**.\\n8. Click **Save**, then **Send test message** to confirm it lands in the channel.\\n\\n## What a notification looks like\\n\\nA reply notification contains the lead's name, company and email, the campaign and step, the category and sentiment assigned by Reply Categorization, the first 300 characters of the reply, and two buttons: **Open in OutreachFox** and **Mark as interested / not interested**. Bounce and unsubscribe messages show the lead, campaign and reason. A campaign-paused message shows the reason, for example \\"Bounce rate reached 5%\\".\\n\\n## Recommended setup\\n\\n - \\\\#outreach-interested: **Interested reply** only, all campaigns. Whoever owns follow-up watches this channel.\\n - \\\\#outreach-all-replies: **Reply received**, all campaigns, for the person maintaining categorisation.\\n - \\\\#outreach-alerts: **Bounce**, **Campaign paused**, **Mailbox disconnected**. Treat anything here as a same-day fix.\\n - One channel per client for agencies, filtered by that client's campaigns.\\n\\n## Tips\\n\\n - Keep **Reply received** out of channels that people mute; out-of-office and \\"not interested\\" replies quickly outnumber real ones.\\n - If you have set a bounce-rate pause threshold (**Edit Campaign â Settings â Show Advanced Configurations â Pause campaign when bounce rate reaches X%**), the **Campaign paused** event is the alert that tells you it triggered.\\n - Enable **Daily summary** in one channel only to avoid duplicate posts.\\n - For a workflow beyond notifications (creating a Slack thread per lead, assigning owners
99), use a webhook with Zapier or Make instead.\\n\\n## Troubleshooting\\n\\n - **Channel not listed**: invite the app to the channel in Slack, then click **Refresh channels**.\\n - **Notifications stopped**: the Slack user who authorised the app was deactivated. Click **Reconnect** in **Settings â Integrations â Slack** with an active user.\\n - **Interested notifications missing**: Reply Categorization is turned off, or the category is not marked as useful. Check **Campaign Settings â Reply Categorization**.\\n - **Duplicate messages**: the same event is enabled in two notification rules for overlapping campaigns. Remove one.\\n\\n## Related articles\\n\\n - Webhooks: events, payload examples and retries\\n - Connect OutreachFox to Zapier and Make\\n - AI Reply Categorization Guide\\n - Enable Email Bounce Protection\\n - Checking Lead Statuses Guide","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1CxwnTE-sK5X_Pb1v6PmSCfJdAobY1GhEiLSc51s8QY8/edit"},{"slug":"outreachfox-mcp-server","title":"OutreachFox MCP server: use OutreachFox from Claude, Cursor and other AI agents","category":"integrations-api","summary":"The OutreachFox MCP server lets AI assistants that support the Model Context Protocol (Claude, Cursor, Windsurf, VS Code Copilot and others) read and act on your OutreachFox workspace. Once connectâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThe OutreachFox MCP server lets AI assistants that support the Model Context Protocol (Claude, Cursor, Windsurf, VS Code Copilot and others) read and act on your OutreachFox workspace. Once connected you can ask an assistant to summarise yesterday's replies, draft a three-step sequence, upload a lead list or pause a campaign with a high bounce rate, and it calls OutreachFox for you.\\n\\n## Prerequisites\\n\\n - An OutreachFox API key. Use **Read only** scope if you want the assistant to report but never change anything; use **Read and write** to let it create campaigns and leads.\\n - A client that supports remote MCP servers. Claude (web, desktop and Claude Code), Cursor 0.45 or later, Windsurf and VS Code with Copilot all do.\\n\\n## Steps: Claude\\n\\n1. In Claude, open **Settings â Connectors** (or **Customize â Connectors** on the web) and click **Add custom connector**.\\n2. Enter the name OutreachFox and the server URL https://mcp.outreachfox.com/mcp.\\n3. Click **Add**. When prompted, paste your API key in the **Authorization** field as Bearer of\\\\_live\\\\_..., or sign in with your OutreachFox account if OAuth is offered.\\n4. Start a new chat and confirm the OutreachFox tools are listed under the tools menu.\\n\\nFor Claude Code, run claude mcp add --transport http outreachfox https://mcp.outreachfox.com/mcp --header \\"Authorization: Bearer of\\\\_live\\\\_...\\".\\n\\n## Steps: Cursor and other editors\\n\\n1. Open **Settings â MCP** and click **Add new MCP server**, or edit .cursor/mcp.json in your project.\\n2. Add:\\n\\n{\\n\\n \\"m
99cpServers\\": {\\n\\n \\"outreachfox\\": {\\n\\n \\"url\\": \\"https://mcp.outreachfox.com/mcp\\",\\n\\n \\"headers\\": { \\"Authorization\\": \\"Bearer of\\\\_live\\\\_xxxxxxxx\\" }\\n\\n }\\n\\n }\\n\\n}\\n\\n1. Save and reload. The server should show a green status with its tool list.\\n\\nFor VS Code use the same JSON under \\"servers\\" in .vscode/mcp.json; for Windsurf use \\\\~/.codeium/windsurf/mcp\\\\_config.json.\\n\\n## Tools the server exposes\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Tool\\\\*\\\\* | \\\\*\\\\*What it does\\\\*\\\\* |\\n| list\\\\\\\\\\\\_campaigns | Campaigns with status, sent, replied, bounced counts |\\n| get\\\\\\\\\\\\_campaign | Full detail including sequence steps, variants and advanced configurations |\\n| create\\\\\\\\\\\\_campaign | New Email, LinkedIn or Multi Channel campaign with a sequence |\\n| update\\\\\\\\\\\\_campaign\\\\\\\\\\\\_settings | Daily new contacts limit, sending strategy, bounce-rate pause, plain text, unsubscribe options |\\n| pause\\\\\\\\\\\\_campaign / resume\\\\\\\\\\\\_campaign | Pause or resume |\\n| add\\\\\\\\\\\\_leads | Add up to 1,000 leads to a campaign or lead list |\\n| list\\\\\\\\\\\\_leads | Filter leads by status (new, sent, replied, bounced, interested, unsubscribed) |\\n| list\\\\\\\\\\\\_replies | Replies in a date range with category and sentiment |\\n| list\\\\\\\\\\\\_mailboxes | Mailboxes with warm-up status, health score and daily limits |\\n| get\\\\\\\\\\\\_warmup\\\\\\\\\\\\_analytics | Inbox placement, spam placement, bounce rate per mailbox |\\n| list\\\\\\\\\\\\_domains | Domains with tracking-domain and DNS status |\\n| check\\\\\\\\\\\\_spam\\\\\\\\\\\\_words | Run the spam words checker on draft copy |\\n\\nWrite tools ask your client for confirmation before running, so nothing is sent or changed without you approving it.\\n\\n## Example prompts\\n\\n - \\"List campaigns with a bounce rate above 3% and pause them.\\"\\n - \\"Summarise interested replies from the last 7 days, grouped by campaign, with the lead's company and the sentence that shows intent.\\"\\n - \\"Draft a 3-step email sequence for CFOs at Series B SaaS companies, run it through the spam words checker, then create it as a paused Email Outreach campaign named 'CFO Q4'.\\"\\n - \\"Which mailboxes have a health score below 70? Show their spam placement for the last 14 days.\\"\\n - \\"Add these 40 leads from the CSV in this folder to the 'CFO Q4' campaign, skipping duplicates.\\"\\n\\n## Tips\\n\\n - Create a separate API key named mcp so you can revoke agent access without breaking other integrations.\\n - Start with **Read only**. Move to **Read and write** once you trust the assistant's judgement on your data.\\n - The server respects the workspace of the key. Connect a second server entry with a different key to work across several workspaces.\\n - Agents count against the same rate limit as the API (60 requests per minute per key).\\n\\n## Troubleshooting\\n\\n - **Server shows as disconnected**: check the header format (Bearer plus the key) and that the key is not revoked.\\n - **\\"Permission denied\\" on a write**: the key is **Read only**.\\n - **Tools missing in the chat**: start a new conversation after adding the connector; existing chats do not pick up new tools.\\n\\n## Related articles\\n\\n - API keys and authentication\\n - Webhooks: events, payload examples and retries\\n - Connect OutreachFox to Zapier and Make\\n - Adding Steps to Email Campaigns\\n - Mailbox Warmup Analytics Guide","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1bT07bUYqEAhayeWW68kDD5PNTrKXPOg1xF2u6bKdWLY/edit"},{"slug":"create-workspaces-invite-members-and-set-roles","title":"Create workspaces, invite members and set roles","category":"workspaces-team","summary":"A workspace is a self-contained container for campaigns, contacts, mailboxes, domains, sending schedules and integrations. Use one workspace per company, or, if you are an agency, one per client, sâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nA workspace is a self-contained container for campaigns, contacts, mailboxes, domains, sending schedules and integrations. Use one workspace per company, or, if you are an agency, one per client, so that lead lists, mailboxes and reporting never mix. Members are invited per workspace and get a role that controls what they can see and change.\\n\\n## Roles\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Role\\\\*\\\\* | \\\\*\\\\*Can do\\\\*\\\\* |\\n| \\\\*\\\\*Owner\\\\*\\\\* | Everything, including billing, deleting the workspace and transferring ownership. One Owner per workspace. |\\n| \\\\*\\\\*Admin\\\\*\\\\* | Manage campaigns, contacts, mailboxes, domains, integrations, API keys and members. Cannot access billing or delete the workspace. |\\n| \\\\*\\\\*Member\\\\*\\\\* | Create and edit campaigns, upload contacts, reply to leads, connect their own mailboxes. Cannot invite members, create API keys or change workspace settings. |\\n| \\\\*\\\\*Client viewer\\\\*\\\\* | Read-only access to campaign stats, replies and lead statuses. Cannot see mailboxes, domains, settings or other clients' workspaces. Intended for agency clients. |\\n\\n## Steps: create a workspace\\n\\n1. Click the **OutreachFox icon / arrow** at the top-left of the screen to open the workspace dropdown.\\n2. Click **Create workspace**.\\n3. Enter a **Workspace name** (for example the client's company name) and choose the **Time zone**. The time zone is the default for new sending schedules.\\n4. Click **Create**. You are switched into the new, empty workspace.\\n\\nSwitch between workspaces at any time from the same top-left dropdown. The workspace you are in is shown next to the icon.\\n\\n## Steps: invite a member\\n\\n1. Click **Settings** in the bottom-left corner and open **Team**.\\n2. Click **Invite member**.\\n3. Enter the person's **Email**.\\n4. Choose a **Role** (Owner cannot be assigned here; see \\"Transfer workspace ownership\\").\\n5. Optionally tick **Also invite to** other workspaces you administer, choosing a role per workspace.\\n6. Click **Send invite**. The person receives an email with a link that is valid for 7 days.\\n\\nThe invitee appears in the **Team** list with the status **Pending** until they accept. Click **Resend** if the link expires, or the three dots â **Cancel invite** to withdraw it.\\n\\n## Steps: change a role or remove a member\\n\\n1. In **Settings â Team**, find the member.\\n2. Click the **Role** dropdown and pick the new role. The change applies immediately, including to their open sessions.\\n3. To remove, click the three dots â **Remove from workspace**. Campaigns they created remain in the workspace; mailboxes they connected stay connected unless you delete them.\\n\\n## Tips\\n\\n - Keep the number of Admins small. Admins can revoke API keys and delete mailboxes.\\n - Give freelancers and contractors **Member**, not Admin, and remove them the day the engagement ends.\\n - Use **Client viewer** rather than screenshots or exports for client reporting; combine with white-label so they see your branding.\\n - Name workspaces consistently (Acme â Outbound, Acme â Partnerships) so the dropdown stays readable at 20+ workspaces.\\n - Sending schedules, reply categories and warm-up profiles are per workspace. Recreate them in each new workspace, or duplicate a workspace's settings from **Settings â General â Copy settings from**.\\n\\n## Troubleshooting\\n\\n - **Invite email not received**: check
99spam, then verify the address. Invites come from [email protected].\\n - **\\"Seat limit reached\\"**: your plan includes a fixed number of members. Upgrade in **Settings â Billing** or remove an inactive member.\\n - **Member cannot see a workspace**: they were invited to a different workspace. Invite them again from inside the correct one.\\n - **Cannot change someone to Owner**: ownership is transferred, not assigned. See \\"Transfer workspace ownership and move mailboxes between workspaces\\".\\n\\n## Related articles\\n\\n - Client access and white-label for agencies\\n - Transfer workspace ownership and move mailboxes between workspaces\\n - Security: two-factor authentication, sessions and audit logs\\n - API keys and authentication\\n - Upgrade or downgrade your plan","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/11vMFvTrEZDc5elbytWP6OVEIO4ndGVW4wDTzkoqutUU/edit"},{"slug":"client-access-and-white-label-for-agencies","title":"Client access and white-label for agencies","category":"workspaces-team","summary":"White-label lets an agency run OutreachFox under its own brand: clients log in at your domain, see your logo and colours, and never see the OutreachFox name. Combined with the Client viewer role, eâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nWhite-label lets an agency run OutreachFox under its own brand: clients log in at your domain, see your logo and colours, and never see the OutreachFox name. Combined with the **Client viewer** role, each client gets a live, read-only view of their own campaigns without access to your other clients or your infrastructure.\\n\\n## Prerequisites\\n\\n - An Agency plan (white-label is not included on Starter or Growth plans; see \\"Upgrade or downgrade your plan\\").\\n - **Owner** role in the agency account.\\n - Access to the DNS of the domain you want to use for the client portal, for example app.youragency.com.\\n - A logo in PNG or SVG (at least 400 px wide, transparent background) and a square favicon (64 à 64 px).\\n\\n## Steps: set up white-label\\n\\n1. Click **Settings** in the bottom-left corner and open **White-label**.\\n2. Under **Custom domain**, enter the subdomain, for example app.youragency.com, and click **Save**.\\n3. At your DNS host, add a **CNAME** record pointing that subdomain to portal.outreachfox.com. Wait for propagation (usually under an hour, up to 24 hours).\\n4. Back in OutreachFox, click **Verify**. The status changes to **Active** and an SSL certificate is issued automatically.\\n5. Under **Branding**, upload your **Logo** and **Favicon**, set the **Brand name** and the **Primary colour**.\\n6. Tick **Hide OutreachFox branding**. This removes the OutreachFox name and logo from the login page, the app header, notification emails and unsubscribe pages seen by clients.\\n7. Under **Email sender**, set the **From name** and **Reply-to** used for invites and notifications sent to clients, for example Reports \\\\<[email protected]\\\\>. Add the SPF include shown on screen to that domain so these emails are not marked as spam.\\n8. Click **Save**. Open https://app.youragency.com in a private window to check the login page.\\n\\n## Steps: give a client access\\n\\n1. Switch to the client's workspace using the **OutreachFox icon / arrow** at the top-left.\\n2. Open **Settings â Team** and click **Invite member**.\\n3. Enter the client's email and choose the role **Client viewer**.\\n4. Click **Send invite**. Because white-label is on, the invite email carries your branding and links to your custom domain.\\n\\n## What the client sees\\n\\nA Client viewer logs in at your custom domain and lands on **Campaigns** for their workspace only. They can open each campaign, see sent, replied, bounced and interested counts, read replies and filter leads by status in the **Contacts** tab. They cannot see **Mailbox**, **Domain**, **Settings**, other workspaces, or which sending infrastructure is behind the campaign. They cannot edit, pause or launch anything.\\n\\n## Tips\\n\\n - One workspace per client. A Client viewer in a shared workspace would see every campaign in it.\\n - If a client wants to write copy or approve sequences, give them **Member** on their workspace and keep **Client viewer** for everyone else at their company.\\n - Keep mailboxes and domains in the agency-owned workspace of each client so that when the engagement ends you can move or delete them cleanly. See \\"Transfer workspace ownership and move mailboxes between workspaces\\".\\n - Custom tracking domains (**Domain â Settings**) are separate from the white-label domain. Set both
99so neither open-tracking links nor the portal reveal OutreachFox.\\n\\n## Troubleshooting\\n\\n - **Verify fails**: the CNAME has not propagated, or there is a conflicting A record on the same subdomain. Remove the A record and retry.\\n - **Client sees OutreachFox logo in an email**: **Hide OutreachFox branding** was turned on after the invite was sent. Resend the invite.\\n - **Certificate warning on the custom domain**: wait up to 30 minutes after verification for the certificate to be issued. If it persists, check that the DNS host is not proxying the CNAME (turn off the proxy or \\"orange cloud\\").\\n - **Client viewer sees \\"No campaigns\\"**: they were invited to the wrong workspace.\\n\\n## Related articles\\n\\n - Create workspaces, invite members and set roles\\n - Transfer workspace ownership and move mailboxes between workspaces\\n - Custom Tracking Domain Setup\\n - Upgrade or downgrade your plan\\n - Understanding your charges: subscription, mailboxes, domains and credits","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1bbqhkXkO5rBUq-i-VHgNWQMN6-eIYHBJqu2g9NDP8DA/edit"},{"slug":"transfer-workspace-ownership-and-move-mailboxes-between-workspaces","title":"Transfer workspace ownership and move mailboxes between workspaces","category":"workspaces-team","summary":"Every workspace has exactly one Owner, who controls billing and deletion. When the person who set up the account leaves, or when an agency hands a workspace over to the client, you transfer ownershâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nEvery workspace has exactly one Owner, who controls billing and deletion. When the person who set up the account leaves, or when an agency hands a workspace over to the client, you transfer ownership. Separately, mailboxes can be moved between workspaces you administer, for example when you consolidate two client workspaces or reassign warmed-up mailboxes to a new campaign team.\\n\\n## Transfer ownership\\n\\n### Prerequisites\\n\\n - You are the current **Owner**.\\n - The new owner is already a member of the workspace (any role). Invite them first if not.\\n - Two-factor authentication is enabled on your account; the transfer asks for a code.\\n\\n### Steps\\n\\n1. Click **Settings** in the bottom-left corner and open **Team**.\\n2. Click the three dots next to the member who will become Owner and choose **Transfer ownership**.\\n3. Read the summary. It lists what moves with ownership: billing responsibility for this workspace, the ability to delete it, and API keys created by you (they keep working; the new owner can revoke them).\\n4. Enter your two-factor code and click **Transfer**.\\n5. The new owner receives an email and must click **Accept ownership** within 7 days. Until they accept, you remain Owner and can click **Cancel transfer**.\\n\\nAfter acceptance, your role becomes **Admin**. If the workspace was billed on your payment method, it is billed on the new owner's payment method from the next renewal; they are prompted to add one on acceptance.\\n\\n### Handing a workspace to a client\\n\\nAgencies usually follow this order: transfer ownership, then have the client add their payment method, then remove your own users from **Settings â Team**. White-label branding stays whatever the agency configured until the new owner changes it.\\n\\n## Move mailboxes between workspaces\\n\\n### Prerequisites\\n\\n - **Admin** or **Owner** in both the source and destination workspaces.\\n - The mailbox is not a sender account in a **running** campaign. Pause the campaign or remove the mailbox from its sender accounts first.\\n\\n### Steps\\n\\n1. In the source workspace, open **Mailbox** in the left nav.\\n2. Select the mailboxes to move using the checkboxes.\\n3. Click the three dots (bulk actions) and choose **Move to workspace**.\\n4. Pick the **Destination workspace** and click **Move**.\\n\\nThe mailbox appears in the destination workspace's **Mailbox** list within a minute.\\n\\n### What moves with a mailbox\\n\\n - Connection credentials (Google, Microsoft or IMAP/SMTP). No reconnection needed.\\n - Warm-up status, warm-up profile assignment and warm-up history. Warm-up continues without interruption.\\n - Signature and campaign emails-per-day limit.\\n\\n### What does not move\\n\\n - Campaign history. Emails already sent stay with the campaigns in the source workspace.\\n - Domain records. If the mailbox's domain is registered through Icemail, the domain stays visible in both workspaces' **Domain** page as long as at least one of its mailboxes is present.\\n - The custom tracking domain set in **Domain â Settings**. Set it again in the destination workspace.\\n\\n## Tips\\n\\n - Move mailboxes in groups by domain (2â3 mailboxes per domain) so a domain's reputation is not split across teams.\\n - Do the move outside the sending schedule's active hours to avoid a half-sent step.\\n - After moving, re-check the mailboxes' **Warm up** tab in the destination workspace to confirm health and inbox placement are still reporting.\\n\\n## Troubleshooting\\n\\n - **\\"Transfer ownership\\" is greyed out**: you are not the Owner, or two-factor is not enabled on your account.\\n - **New owner did not get the email**: check **Settings â Team**, where the transfer shows as **Pending**; click **Resend**.\\n - **Mailbox not in the bulk menu**: it is a sender account in a running campaign. Pause the campaign and retry.\\n - **Moved mailbox shows \\"Disconnected\\"**: the destination workspace's Google client ID or Microsoft app is different. Reconnect via **Mailbox â Connect Mailbox**.\\n\\n## Related articles\\n\\n - Create workspaces, invite members and set roles\\n - Client access and white-label for agencies\\n - Security: two-factor authentication, sessions and audit logs\\n - Bulk Settings in OutreachFox\\n - Connect Google Mailboxes to OutreachFox\\n - Add Microsoft Mailbox to OutreachFox","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1Ni2ywCIz8JqMPHJIOO3Mz4tELfj_oEu6bmRUmq1GcVU/edit"},{"slug":"security-two-factor-authentication-sessions-and-audit-logs","title":"Security: two-factor authentication, sessions and audit logs","category":"workspaces-team","summary":"Your OutreachFox account holds connected mailboxes, lead data and API keys, so it is worth locking down. This article covers turning on two-factor authentication (2FA), reviewing and ending sessionâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nYour OutreachFox account holds connected mailboxes, lead data and API keys, so it is worth locking down. This article covers turning on two-factor authentication (2FA), reviewing and ending sessions, and reading the audit log to see who changed what.\\n\\n## Two-factor authentication\\n\\n2FA adds a six-digit code from an authenticator app to every login. It is per user, not per workspace. Owners can require it for everyone in a workspace.\\n\\n### Steps: enable 2FA for your account\\n\\n1. Click your avatar at the bottom-left, then **Account settings â Security**.\\n2. Click **Enable two-factor authentication**.\\n3. Scan the QR code with an authenticator app (Google Authenticator, Authy, 1Password, Microsoft Authenticator) or enter the setup key manually.\\n4. Enter the six-digit code the app shows and click **Verify**.\\n5. Download or copy the ten **Recovery codes** and store them somewhere safe. Each code works once and is the only way in if you lose your phone.\\n6. Click **Done**.\\n\\nFrom the next login you enter your password, then the code.\\n\\n### Steps: require 2FA for the workspace\\n\\n1. As Owner, open **Sett
99ings â Security**.\\n2. Turn on **Require two-factor authentication for all members**.\\n3. Click **Save**. Members without 2FA are prompted to set it up at their next login and cannot use the workspace until they do. Client viewers are included.\\n\\n### Recovering access\\n\\nIf you lose your authenticator, log in with a recovery code, then go to **Account settings â Security**, click **Reset two-factor authentication** and set it up again. If you have no recovery codes, the workspace Owner can click **Reset 2FA** next to your name in **Settings â Team**; you then set it up afresh at next login.\\n\\n## Sessions\\n\\nEvery browser and device you log in from creates a session. Sessions expire after 30 days of inactivity, or immediately when you change your password.\\n\\n### Steps: review and end sessions\\n\\n1. Open **Account settings â Security â Sessions**.\\n2. Each row shows device, browser, approximate location, IP address and last activity. Your current session is marked.\\n3. Click **Log out** next to a session you do not recognise, or **Log out all other sessions** to keep only the current one.\\n4. Change your password straight afterwards if any session looked unfamiliar.\\n\\nOwners and Admins can end another member's sessions from **Settings â Team** â three dots â **Log out everywhere**, which is the right first step when someone leaves the company.\\n\\n## Audit log\\n\\nThe audit log records security-relevant and destructive actions in the workspace for 12 months. Owners and Admins can read it.\\n\\n### Steps: read the audit log\\n\\n1. Open **Settings â Security â Audit log**.\\n2. Filter by **Actor**, **Action** or **Date range**.\\n3. Click a row to see details, including the previous and new value where relevant.\\n4. Click **Export CSV** to download the filtered view.\\n\\nLogged actions include: login and failed login, 2FA enabled or reset, member invited, role changed, member removed, ownership transferred, API key created or revoked, webhook added or changed, mailbox connected, deleted or moved, campaign deleted, contacts exported, contacts deleted, billing changes and workspace deletion requests.\\n\\n## Tips\\n\\n - Turn on **Require two-factor authentication** before inviting any client viewers.\\n - Rotate API keys when a member with Admin access leaves; keys are not tied to the person who created them.\\n - Check the audit log weekly for **Contacts exported** and **API key created** events you did not expect.\\n - Use a password manager and a unique password; OutreachFox does not support SMS codes, so an authenticator app is required.\\n\\n## Troubleshooting\\n\\n - **Code rejected**: the phone's clock is out of sync. Enable automatic time in the phone settings and retry.\\n - **Locked out with no recovery codes and no Owner available**: contact support from the email address on the account; identity verification takes one business day.\\n - **Audit log missing an event**: only actions listed above are recorded. Routine edits such as changing email copy are not.\\n\\n## Related articles\\n\\n - Create workspaces, invite members and set roles\\n - Transfer workspace ownership and move mailboxes between workspaces\\n - API keys and authentication\\n - Export your account data\\n - Delete your account and GDPR requests","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1lulOZgA-z6jrh5R3hcPwYJW-DwMgUn_BD_q-UB4SLFQ/edit"},{"slug":"upgrade-or-downgrade-your-plan","title":"Upgrade or downgrade your plan","category":"account-billing","summary":"OutreachFox plans differ in how many active contacts, connected mailboxes, workspaces and team seats you get, and in which features are included (CRM sync, white-label, API access). You can change â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nOutreachFox plans differ in how many active contacts, connected mailboxes, workspaces and team seats you get, and in which features are included (CRM sync, white-label, API access). You can change plan at any time from the billing page; upgrades take effect immediately and downgrades at the end of the current billing period.\\n\\n## Prerequisites\\n\\n - **Owner** role. Admins can view the billing page but not change the plan.\\n - A payment method on file (see \\"Payment methods and invoices\\").\\n\\n## Plans at a glance\\n\\n| | | | |\\n| :-: | :-: | :-: | :-: |\\n| | \\\\*\\\\*Starter\\\\*\\\\* | \\\\*\\\\*Growth\\\\*\\\\* | \\\\*\\\\*Agency\\\\*\\\\* |\\n| Active contacts | 5,000 | 50,000 | 250,000 |\\n| Connected mailboxes | 10 | 50 | Unlimited |\\n| Workspaces | 1 | 3 | Unlimited |\\n| Team seats | 2 | 5 | 15 (add-on seats available) |\\n| Warm-up, sending schedules, reply categorisation | Included | Included | Included |\\n| LinkedIn and Multi Channel outreach | â | Included | Included |\\n| Webhooks, API, Zapier/Make | â | Included | Included |\\n| CRM sync | â | Included | Included |\\n| White-label and Client viewer role | â | â | Included |\\n\\nLimits and prices shown in the app are authoritative; the table is indicative. Mailboxes and domains bought through Icemail are billed separately from the plan (see \\"Understanding your charges\\").\\n\\n## Steps: upgrade\\n\\n1. Click **Settings** in the bottom-left corner and open **Billing**.\\n2. Under **Current plan**, click **Change plan**.\\n3. Choose the plan and toggle **Monthly** or **Annual** (annual is billed up front at a discount, typically two months free).\\n4. Review the **Prorated charge**. You pay only for the remaining days of the current period at the new price.\\n5. Click **Confirm upgrade**.\\n\\nThe new limits are available immediately. A prorated invoice is emailed to the billing contact within a few minutes.\\n\\n## Steps: downgrade\\n\\n1. Open **Sett
99ings â Billing â Change plan**.\\n2. Choose the lower plan and click **Continue**.\\n3. Read the **What changes** summary. It lists anything over the new limits: extra mailboxes, workspaces, seats or contacts, and features that will be switched off.\\n4. Click **Confirm downgrade**.\\n\\nThe downgrade is scheduled for the end of the current billing period and shown as **Scheduled** on the billing page. You keep the current plan until then. Click **Cancel scheduled change** at any time before the period ends to stay on the current plan.\\n\\n## What happens when you are over a limit after downgrading\\n\\n - **Mailboxes**: the oldest mailboxes above the limit are set to **Disconnected** for campaigns; warm-up also stops. Choose which ones stay by deleting others in **Mailbox** before the period ends.\\n - **Workspaces**: additional workspaces become read-only. You can still export from them.\\n - **Seats**: the most recently invited members above the limit lose access.\\n - **Contacts**: no contacts are deleted, but you cannot upload new ones until you are under the limit or upgrade again.\\n - **Features**: webhooks, CRM sync and white-label are paused, not deleted; they resume if you upgrade again.\\n\\n## Tips\\n\\n - Upgrade before a big launch rather than during it. A campaign that hits a limit mid-send pauses until the limit is raised.\\n - Check **Settings â Billing â Usage** first. It shows contacts, mailboxes and seats in use against the plan.\\n - If you only need one more seat or a few more mailboxes, an add-on may be cheaper than the next tier; add-ons are listed under **Add-ons** on the same page.\\n - Annual plans can be upgraded mid-term (prorated) but downgraded only at renewal.\\n\\n## Troubleshooting\\n\\n - **\\"Change plan\\" is greyed out**: you are not the Owner, or a payment is outstanding. Settle the invoice under **Invoices**.\\n - **Upgrade charged the full amount**: you were on a free trial; trials are not prorated.\\n - **Downgrade did not reduce the invoice**: the change is scheduled for the next period. The next invoice reflects it.\\n\\n## Related articles\\n\\n - Payment methods and invoices\\n - Understanding your charges: subscription, mailboxes, domains and credits\\n - Cancel your subscription\\n - Create workspaces, invite members and set roles\\n - Client access and white-label for agencies","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1HcajnZ4vYQ1jfCmDugUuzUnKQTdhYJxlD0EgUMIfmEI/edit"},{"slug":"payment-methods-and-invoices","title":"Payment methods and invoices","category":"account-billing","summary":"The billing page is where you add or replace a card, set billing details that appear on invoices, and download invoices for your accounts team. All payments are processed by Stripe; OutreachFox doeâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThe billing page is where you add or replace a card, set billing details that appear on invoices, and download invoices for your accounts team. All payments are processed by Stripe; OutreachFox does not store card numbers.\\n\\n## Prerequisites\\n\\n - **Owner** role. Admins can download invoices but cannot change the payment method.\\n\\n## Steps: add or replace a payment method\\n\\n1. Click **Settings** in the bottom-left corner and open **Billing**.\\n2. Under **Payment method**, click **Add payment method** (or **Update** if one exists).\\n3. Choose **Card** (Visa, Mastercard, American Express) or, on annual plans, **Bank transfer / SEPA**.\\n4. Enter the details and click **Save**. A temporary authorisation of a small amount may appear on your statement and is released within a few days.\\n5. If you added a second card, click **Set as default** next to the one that should be charged. The previous default stays on file as a backup; remove it with the three dots â **Remove**.\\n\\nThe next subscription renewal, Icemail purchase or add-on charge uses the default method.\\n\\n## Steps: set billing details\\n\\n1. Under **Billing details** on the same page, click **Edit**.\\n2. Enter the **Company
99name**, **Billing address**, **VAT / tax ID** and the **Billing email** that should receive invoices. You can add several emails separated by commas, for example your own and [email protected].\\n3. Click **Save**. Details apply to invoices issued from now on; already issued invoices are not changed.\\n\\nIf you enter a valid EU VAT ID outside the seller's country, VAT is reverse-charged and shown as 0% on the invoice.\\n\\n## Steps: download an invoice\\n\\n1. Open **Settings â Billing â Invoices**.\\n2. Each row shows the date, description (subscription, add-on, Icemail order or credit top-up), amount and status (**Paid**, **Open**, **Failed**).\\n3. Click **PDF** to download the invoice, or **Receipt** for a paid invoice.\\n4. Click **Export CSV** to download the full list for a date range.\\n\\nInvoices are also emailed to the billing email when they are issued. Subscription invoices are issued on the renewal date; Icemail orders are invoiced at the moment of purchase.\\n\\n## Failed payments\\n\\nWhen a charge fails, the invoice shows **Failed** and the Owner and billing email receive a notice. OutreachFox retries after 3 and 7 days. If the payment still fails, the workspace is placed in **Read-only** on day 10: campaigns pause, warm-up continues, nothing is deleted. Update the card and click **Retry payment** next to the invoice to restore access immediately.\\n\\n## Tips\\n\\n - Use a company card, not a personal one, so ownership transfers do not break billing.\\n - Add accounts@ to the billing email before the first invoice; retroactive re-sends have to be requested from support.\\n - Annual plans paid by bank transfer have a 14-day payment window; the plan activates on receipt.\\n - Keep one backup card on file so a single expired card does not pause your campaigns.\\n\\n## Troubleshooting\\n\\n - **Card declined**: most declines are bank-side (international transactions blocked, 3-D Secure not completed). Try again and complete the bank's verification pop-up, or use another card.\\n - **Invoice shows the wrong company name**: update **Billing details** and ask support to reissue the invoice; only the current billing period can be reissued.\\n - **VAT charged despite entering a VAT ID**: the ID failed validation. Check it at the EU VIES service and re-enter it without spaces.\\n - **Cannot see the Billing page**: you are a Member or Client viewer. Ask the Owner.\\n\\n## Related articles\\n\\n - Upgrade or downgrade your plan\\n - Understanding your charges: subscription, mailboxes, domains and credits\\n - Cancel your subscription\\n - Transfer workspace ownership and move mailboxes between workspaces","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1PQIhj52vclDvucMWcq0t31KjJ5pn7DcjkU1eq9mUiIQ/edit"},{"slug":"understanding-your-charges","title":"Understanding your charges: subscription, mailboxes, domains and credits","category":"account-billing","summary":"An OutreachFox bill can contain up to four kinds of line: the plan subscription, mailboxes bought through Icemail, domains bought through Icemail, and credits (wallet top-ups and enrichment or veriâ¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nAn OutreachFox bill can contain up to four kinds of line: the plan subscription, mailboxes bought through Icemail, domains bought through Icemail, and credits (wallet top-ups and enrichment or verification usage). This article explains each one so you can read an invoice and forecast next month's spend.\\n\\n## Where to look\\n\\nClick **Settings** in the bottom-left corner and open **Billing**. The page has four sections: **Current plan**, **Icemail purchases**, **Credits and wallet**, and **Invoices**. The **Usage** tab shows the running total for the current period.\\n\\n## 1\\\\. Subscription\\n\\nThe plan fee (Starter, Growth or Agency) is charged monthly or annually in advance on the renewal date. It covers the platform: campaigns, warm-up, sending schedules, reply categorisation, team seats, and, depending on plan, API, CRM sync and white-label. Add-ons such as extra seats or extra mailbox slots appear as separate lines on the same invoice and renew with the plan.\\n\\nMailboxes you connect yourself (your own Google Worksp
99ace or Microsoft 365 accounts via **Mailbox â Connect Mailbox**) cost nothing beyond the plan's mailbox slots.\\n\\n## 2\\\\. Mailboxes bought through Icemail\\n\\nIcemail is the built-in marketplace reached from the **OutreachFox icon / arrow** at the top-left â **Icemail**. Mailboxes bought there (Google, Microsoft, IMAP-SMTP or Azure) are billed per mailbox per month, from the day of purchase, and renew monthly on that anniversary, independently of the plan renewal date. They appear on the **Billing** page under **Icemail purchases** with the domain, mailbox count, unit price and next renewal.\\n\\n - Prices differ by provider; Google and Microsoft mailboxes cost more than IMAP-SMTP.\\n - Free replacements offered by Icemail for damaged mailboxes are not charged.\\n - Deleting mailboxes in Icemail stops the charge at the end of the current mailbox month; there is no refund for the remaining days.\\n - Mailboxes imported into OutreachFox with **Import from Icemail** still count against the plan's mailbox slots.\\n\\n## 3\\\\. Domains bought through Icemail\\n\\nDomains are charged once per year at purchase and again on the registration anniversary. Icemail configures SPF, DKIM and DMARC at no extra cost. The line shows the domain name and expiry date. Auto-renew is on by default; turn it off per domain in Icemail if you plan to retire it. Domains you already own and connect via nameservers are not charged.\\n\\n## 4\\\\. Credits and wallet\\n\\nThe **wallet** is a prepaid balance used for Icemail orders and for usage-based features:\\n\\n - **Lead enrichment**: waterfall enrichment across 50+ data providers deducts credits per contact successfully enriched (no charge for misses).\\n - **Email verification**: credits per address verified before upload.\\n - **Icemail orders**: mailboxes and domains are paid from the wallet when a balance exists, otherwise from the default card.\\n\\nTop up under **Credits and wallet â Top up**, or enable **Auto top-up** with a threshold and amount (for example top up $100 when the balance drops below $20) so a campaign upload is never blocked. Wallet top-ups are invoiced when purchased; usage is shown in **Usage** but is not invoiced again.\\n\\n## Reading an invoice\\n\\nA typical monthly invoice for a Growth customer looks like:\\n\\n| | |\\n| :-: | :-: |\\n| \\\\*\\\\*Line\\\\*\\\\* | \\\\*\\\\*Amount\\\\*\\\\* |\\n| Growth plan, monthly | 1 Ã plan price |\\n| Extra seat add-on | 2 Ã seat price |\\n| Icemail mailboxes, acme-outreach.com, 3 Ã Google | 3 Ã mailbox price |\\n| Icemail mailboxes, acme-mail.net, 3 Ã Google | 3 Ã mailbox price |\\n| Wallet top-up | as purchased |\\n| Tax / VAT | per billing details |\\n\\nIcemail mailbox lines may appear on a separate invoice if their anniversary differs from the plan renewal date.\\n\\n## Tips\\n\\n - Align renewals: buy Icemail mailboxes on the plan renewal date so all charges land on one invoice.\\n - Budget 2â3 mailboxes per domain and 30â50 emails per mailbox per day; work backwards from your target volume to estimate mailbox and domain lines.\\n - Set **Auto top-up** before a large enrichment job.\\n - Export **Usage** monthly for client rebilling.\\n\\n## Troubleshooting\\n\\n - **Unexpected charge mid-month**: usually an Icemail mailbox anniversary or an auto top-up. Match the date against **Icemail purchases**.\\n - **Charged for mailboxes I deleted**: deletion took effect after the mailbox month had already been billed; no further charge follows.\\n - **Enrichment stopped**: wallet is empty and auto top-up is off.\\n\\n## Related articles\\n\\n - Upgrade or downgrade your plan\\n - Payment methods and invoices\\n - Cancel your subscription\\n - Buy Mailboxes on OutreachFox\\n - Uploading Contacts to OutreachFox","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1VnhLziAcnYfBVBhEtxcfnp3dtB5MvIobCFq24DbTvdc/edit"},{"slug":"cancel-your-subscription","title":"Cancel your subscription","category":"account-billing","summary":"Cancelling stops the plan from renewing. You keep full access until the end of the peri
99od you have already paid for, after which the workspace becomes read-only. Your data, mailboxes and campaigns â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nCancelling stops the plan from renewing. You keep full access until the end of the period you have already paid for, after which the workspace becomes read-only. Your data, mailboxes and campaigns are not deleted by cancelling; deletion is a separate step described in \\"Delete your account and GDPR requests\\".\\n\\n## Prerequisites\\n\\n - **Owner** role in the workspace.\\n - No outstanding invoice. Settle any **Open** or **Failed** invoice under **Settings â Billing â Invoices** first.\\n\\n## Before you cancel\\n\\n - **Export what you need.** Contacts, replies and campaign stats can be exported while the workspace is active (see \\"Export your account data\\").\\n - **Decide what to do with Icemail mailboxes and domains.** They are billed separately and keep renewing after the plan is cancelled unless you delete them or turn off auto-renew in Icemail. Warmed-up mailboxes are valuable; consider pausing the plan instead if you may come back within 90 days.\\n - **Tell your team.** Members and client viewers lose write access on the end date.\\n\\n## Steps\\n\\n1. Click **Settings** in the bottom-left corner and open **Billing**.\\n2. Under **Current plan**, click **Cancel subscription**.\\n3. Choose a reason from the list and, optionally, add a comment. This is used only to improve the product.\\n4. If offered, review the **Pause instead** option: pausing keeps your workspace intact for up to 90 days at a reduced fee, with campaigns stopped and warm-up continuing. Click **Pause** to take it, or **Continue to cancel**.\\n5. Review the **What happens next** summary: end date, what becomes read-only, and which Icemail items will keep renewing.\\n6. Tick **I understand** and click **Confirm cancellation**.\\n\\n## What you see afterwards\\n\\nThe billing page shows \\\\*\\\\*Cancels on \\\\*\\\\* and a \\\\*\\\\*Resume subscription\\\\*\\\\* button. A confirmation email is sent to the Owner and the billing email. Campaigns keep running until the end date; the day after, campaigns pause, warm-up stops for plan-slot mailboxes, and the workspace opens in read-only mode where you can still view and export data for 30 days. After 30 days of read-only, the workspace is scheduled for deletion and you receive a final warning email 7 days before it happens.\\n\\n## Resuming\\n\\nClick **Resume subscription** any time before the end date to remove the cancellation with no change to your renewal date. After the end date, click **Reactivate** on the read-only banner, choose a plan and confirm payment; everything is restored as it was, including warm-up history.\\n\\n## Annual plans\\n\\nCancelling an annual plan stops the next annual renewal. The remaining months are not refunded, except within 14 days of the initial purchase, where a full refund is available on request through support.\\n\\n## Tips\\n\\n - Cancel at least one day before the renewal date; cancellations on the renewal date may be processed after the charge.\\n - If you only need fewer mailboxes or seats, downgrade rather than cancel (see \\"Upgrade or downgrade your plan\\").\\n - Delete Icemail mailboxes you will not use again from Icemail before the end date so they are not billed for another month.\\n - Keep at least one Owner login active during the read-only period so you can export.\\n\\n## Troubleshooting\\n\\n - **\\"Cancel subscription\\" is missing**: you are not the Owner, or the plan is already scheduled to cancel.\\n - **Still charged after cancelling**: the charge is for Icemail mailboxes or domains, which are separate. Check **Billing â Icemail purchases**.\\n - **Need an early refund on an annual plan**: contact support from the Owner's email within 14 days of purchase.\\n\\n## Related articles\\n\\n - Upgrade or downgrade your plan\\n - Payment methods and invoices\\n - Understanding your charges: subscription, mailboxes, domains and credits\\n - Export your account data\\n - Delete your account and GDPR requests","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1xh6c6Jcpgp63sRbYhH_yMqwhQIBQ_7oz2IZfpzHxtUM/edit"},{"slug":"export-your-account-data","title":"Export your account data","category":"account-billing","summary":"You can export everything you have put into OutreachFox and everything it has collected on your behalf: contacts and their statuses, replies, campaign sequences and statistics, mailbox and warm-up â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nYou can export everything you have put into OutreachFox and everything it has collected on your behalf: contacts and their statuses, replies, campaign sequences and statistics, mailbox and warm-up data, and billing records. Use exports for backups, client reporting, moving to another tool, or responding to a data request.\\n\\n## Prerequisites\\n\\n - **Owner** or **Admin** to run a full workspace export. Members can export contacts from a campaign or list they can see.\\n - Client viewers cannot export.\\n\\n## Steps: export contacts from a campaign or list\\n\\n1. Open **Campaigns**, select the campaign and click the **Contacts** tab. For a lead list, open **Contacts** and select the list.\\n2. Optionally filter by **Status** (for example **replied**, **interested**, **bounced**) to export a subset.\\n3. Click **Export**.\\n4. Choose **CSV** or **XLSX** and whether to include **Custom fields** and **Activity columns** (last sent, last reply, step reached, category).\\n5. Click **Download**. Small exports download immediately; exports over 10,000 rows are emailed to you as a link within a few minutes.\\n\\n## Steps: export replies\\n\\
99n1. Open the campaign and click the **Replies** tab.\\n2. Set the date range and, optionally, the **Category** filter.\\n3. Click **Export**. The file contains lead email, campaign, step, received date, category, sentiment, subject and the full reply text.\\n\\n## Steps: full workspace export\\n\\n1. Click **Settings** in the bottom-left corner and open **Data export**.\\n2. Tick the data sets to include:\\n\\n - **Contacts and lead lists**\\n - **Campaigns** (settings, sequences with all variants, advanced configurations, sending schedules)\\n - **Campaign statistics** (per day: sent, replies, bounces, unsubscribes, interested)\\n - **Replies** (full text)\\n - **Mailboxes** (addresses, provider, daily limits, signatures; no passwords or tokens)\\n - **Warm-up history** (per mailbox per day: health, inbox placement, spam placement, bounce rate)\\n - **Domains** (DNS and tracking-domain status)\\n - **Team and audit log**\\n - **Billing** (invoices as PDF)\\n3. Click **Start export**. Progress is shown on the same page.\\n4. When the status is **Ready**, click **Download**. The ZIP contains one CSV per data set, plus a README.txt describing columns. The link is valid for 7 days.\\n\\nEvery export is recorded in the audit log with who ran it.\\n\\n## Formats\\n\\n - CSV files are UTF-8 with a header row, comma separated, dates in ISO 8601 (2026-09-21T09:14:02Z).\\n - Sequences are exported as CSV rows (campaign, step number, variant, channel, delay, subject, body) and as JSON for re-import.\\n - Nothing is exported as a proprietary format; the files open in Excel, Google Sheets or any database.\\n\\n## Tips\\n\\n - Run a full export before cancelling, downgrading, transferring ownership or deleting a workspace.\\n - For recurring client reports, use the API or a Zapier/Make flow instead of manual exports (see \\"Connect OutreachFox to Zapier and Make\\").\\n - Exports contain personal data. Store them where your privacy policy allows and delete them when no longer needed.\\n - Bounced and unsubscribed statuses are included; keep these in your suppression list when you move to another tool.\\n\\n## Troubleshooting\\n\\n - **Export button greyed out**: your role does not allow exports for this data, or an export is already running (one at a time per workspace).\\n - **Email link expired**: run the export again; links last 7 days.\\n - **Missing custom fields**: tick **Custom fields** in the export dialog.\\n - **Characters look wrong in Excel**: open via **Data â From Text/CSV** and choose UTF-8.\\n\\n## Related articles\\n\\n - Cancel your subscription\\n - Delete your account and GDPR requests\\n - Security: two-factor authentication, sessions and audit logs\\n - Checking Lead Statuses Guide\\n - Uploading Contacts to OutreachFox","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1Gynw40eO3EEt8UrVMmcbQtErunSdq2DbTTq1Y11odBU/edit"},{"slug":"delete-your-account-and-gdpr-requests","title":"Delete your account and GDPR requests","category":"account-billing","summary":"This article covers three related but different things: deleting a single workspace, deleting your entire account, and handling GDPR or similar data-protection requests, both for your own data and â¦","body":"*Draft â written from product facts + domain knowledge; UI labels to be verified before publishing.*\\n\\nThis article covers three related but different things: deleting a single workspace, deleting your entire account, and handling GDPR or similar data-protection requests, both for your own data and for leads who contact you. Deletion is permanent, so export first.\\n\\n## Delete a workspace\\n\\n### Prerequisites\\n\\n - **Owner** of the workspace.\\n - The subscription for the workspace is cancelled or the workspace is on a plan that allows multiple workspaces.\\n - A full export has been taken if you need the data (see \\"Export your account data\\").\\n\\n### Steps\\n\\n1. Switch to the workspace using the **OutreachFox icon / arrow** at the top-left.\\n2. Click **Settings** in the bottom-left corner and open **General**.\\n3. Scroll to **Danger zone** and click **Delete workspace**.\\n4. Read the summary. It lists campaigns, contacts, mailboxes and Icemail items in the workspace. Icemail mailboxes and domains are not deleted with the workspace; delete them in Icemail separately or move the mailboxes to another workspace first.\\n5. Type the workspace name to confirm, enter your two-factor code and click **Delete workspace**.\\n\\nThe workspace is disabled immediately and permanently deleted after a 14-day grace peri
99od. During the grace period an Owner can contact support to restore it.\\n\\n## Delete your account\\n\\nDeleting your account removes your user profile and every workspace you own. Workspaces where you are Admin, Member or Client viewer are unaffected; you are removed from them.\\n\\n### Steps\\n\\n1. Transfer ownership of any workspace that should survive (see \\"Transfer workspace ownership and move mailboxes between workspaces\\").\\n2. Cancel active subscriptions in each workspace you own (see \\"Cancel your subscription\\").\\n3. Delete or turn off auto-renew for Icemail mailboxes and domains you do not want billed.\\n4. Click your avatar at the bottom-left, then **Account settings â Security**.\\n5. Scroll to **Delete account** and click **Delete my account**.\\n6. Type DELETE, enter your two-factor code and click **Confirm**.\\n\\nYou are logged out. Personal data is removed within 30 days; invoices are retained for the period required by tax law (typically 7â10 years) with personal data minimised.\\n\\n## GDPR and data-subject requests\\n\\nOutreachFox acts as a processor for the lead data you upload; you are the controller. Two situations come up:\\n\\n### A lead asks you to delete their data or stop contacting them\\n\\n1. Open **Contacts**, search for the email address.\\n2. Click the contact and choose **Mark as unsubscribed** so no campaign in the workspace can email them again. This adds them to the workspace suppression list.\\n3. If they asked for erasure, click the three dots â **Delete permanently**. This removes the contact, their reply text and activity from all campaigns and lead lists. Aggregate statistics (counts) are kept without personal data.\\n4. Reply to the person confirming the action within one month, as GDPR requires.\\n\\nTo erase many contacts at once, upload a CSV of emails in **Contacts â Upload Contacts**, assign them to a list named for the request, then select all in that list and choose **Delete permanently**.\\n\\n### You want a copy or deletion of your own data\\n\\nUse **Settings â Data export** for a copy. For deletion, follow the workspace or account steps above. For a formal request, email the address on the privacy policy page from the Owner's email; OutreachFox responds within 30 days.\\n\\n## Data processing agreement\\n\\nOwners can download and sign the DPA under **Settings â Security â Data processing agreement**. Sub-processors (hosting, email delivery, payment) are listed on the same page.\\n\\n## Tips\\n\\n - Add unsubscribe links to every sequence (**Edit Campaign â Settings â Show Advanced Configurations â Risk Control â Include Unsubscribe Message**) so most requests handle themselves.\\n - Keep a dated record of deleti
99on requests outside OutreachFox, since the contact record itself is gone after erasure.\\n - Reply-based unsubscribe requests (\\"please remove me\\") are categorised by Reply Categorization; review that category weekly.\\n\\n## Troubleshooting\\n\\n - **\\"Delete workspace\\" is greyed out**: an active subscription is still attached. Cancel it first.\\n - **Contact reappears after deletion**: a CSV re-upload or CRM sync re-created it. Use **Mark as unsubscribed** in addition to deletion; the suppression list survives re-uploads.\\n - **Need data restored after deletion**: possible only within the 14-day workspace grace period.\\n\\n## Related articles\\n\\n - Export your account data\\n - Cancel your subscription\\n - Transfer workspace ownership and move mailboxes between workspaces\\n - Security: two-factor authentication, sessions and audit logs\\n - Adding Unsubscribe Links in OutreachFox","video":null,"videos":[],"_source_doc":"https://docs.google.com/document/d/1g91R9iYXOT0v4XcAR1V2cHLWJ4x7ClCxOhjD3Gejw1o/edit"}]`),F0={categories:oN,articles:iN},sN=F0.categories,q0=F0.articles;function H6(t){const e=t.replace(/[^A-Za-z ]/g," ").split(/\s+/).filter(Boolean);return((e[0]?.[0]??"")+(e[1]?.[0]??e[0]?.[1]??"")).toUpperCase()}function cm(t){return sN.find(e=>e.slug===t)}function B0(t){return q0.filter(e=>e.category===t)}function G6(t,e=12){const n=t.trim().toLowerCase();if(n.length<2)return[];const i=[];for(const s of q0){const l=s.title.toLowerCase();let d=0;l.includes(n)&&(d+=3),s.summary.toLowerCase().includes(n)&&(d+=2),s.body.toLowerCase().includes(n)&&(d+=1),d>0&&i.push({a:s,score:d})}return i.sort((s,l)=>l.score-s.score).slice(0,e).map(s=>s.a)}function W6(t){if(!t&&t!==0)return null;const e=Math.floor(t/60),n=Math.round(t%60);return`${e}:${String(n).padStart(2,"0")}`}const $6=["what-is-outreachfox","pre-launch-checklist","connect-a-google-workspace-mailbox-to-outreachfox","create-an-email-campaign-and-write-your-first-email","enable-warmup-on-your-mailboxes","set-up-a-custom-tracking-domain"],rN=()=>ye(()=>import("./help._categorySlug.index-WdPVQt5O.js"),__vite__mapDeps([57,36,18,19,34,2,30,29,31,58])),lN=_e("/help/$categorySlug/")({loader:({params:t})=>{const e=cm(t.categorySlug);if(!e)throw Up();return{cat:e,articles:B0(e.slug)}},head:({loaderData:t})=>{const e=`${t?.cat.name??"Category"} â OutreachFox Help`,n=t?`${t.articles.length} guides on ${t.cat.name.toLowerCase()} in OutreachFox.`:"OutreachFox help articles.";return{meta:[{title:e},{name:"description",content:n},{property:"og:title",content:e},{property:"og:description",content:n},{property:"og:type",content:"website"},{name:"twitter:card",content:"summary_large_image"}]}},component:be(rN,"component")}),cN=()=>ye(()=>import("./help.c._-DtqBFgK5.js"),[]),dN={infrastructure:"mailbox-infrastructure",sequences:"campaigns-sequences",leads:"campaigns-leads","schedule-options":"campaigns-schedule",unibox:"unified-inbox",analytics:"analytics-crm",integrations:"integrations-api",workspaces:"workspaces-team",billing:"account-billing"},uN=_e("/help/c/$")({loader:({params:t})=>{const[e]=(t._splat??"").split("/"),n=e?dN[e]??e:"";throw n&&cm(n)?Vr({to:"/help/$categorySlug",params:{categorySlug:n},statusCode:301}):Vr({to:"/help",statusCode:301})},component:be(cN,"component")}),hN=()=>ye(()=>import("./help._categorySlug._articleSlug-CrNsa8bB.js"),__vite__mapDeps([59,36,18,19,34,2,30,29,31,58,56])),fN=_e("/help/$categorySlug/$articleSlug")({loader:({params:t})=>{const e=cm(t.categorySlug),n=e?B0(e.slug):[],i=n.findIndex(s=>s.slug===t.articleSlug);if(!e||i<0)throw Up();return{cat:e,articles:n,index:i,article:n[i]}},head:({loaderData:t})=>{if(!t)return{meta:[{title:"Not found â OutreachFox Help"},{name:"robots",content:"noindex"}]};const e=`${t.article.title} â OutreachFox Help`,n=t.article.summary;return{meta:[{title:e},{name:"description",content:n},{property:"og:title",content:e},{property:"og:description",content:n},{property:"og:type",content:"article"},{name:"twitter:card",content:"summary_large_image"}]}},component:be(hN,"component")}),pN=()=>ye(()=>import("./admin.waitlist-DJnjhIDg.js"),__vite__mapDeps([60,54,39])),mN=_e("/_authenticated/admin/waitlist")({head:()=>({meta:[{title:"Waitlist â OutreachFox CMS"},{name:"robots",content:"noindex,nofollow"}]}),component:be(pN,"component")}),gN=()=>ye(()=>import("./admin.topics-Ct-cUwk1.js"),__vite__mapDeps([61,54,39,62,63])),yN=_e("/_authenticated/admin/topics")({head:()=>({meta:[{title:"Topics â OutreachFox CMS"},{name:"robots",content:"noindex,nofollow"}]}),component:be(gN,"component")}),bN=()=>ye(()=>import("./admin.seo-jrNZuauY.js"),__vite__mapDeps([64,54,39,65,63])),vN=_e("/_authenticated/admin/seo")({head:()=>({meta:[{title:"SEO dashboard â OutreachFox CMS"},{name:"robots",content:"noindex,nofollow"}]}),component:be(bN,"component")}),wN=()=>ye(()=>import("./admin.redirects-DLRogIIY.js"),__vite__mapDeps([66,54,39,63])),xN=_e("/_authenticated/admin/redirects")({head:()=>({meta:[{title:"Redirects â OutreachFox CMS"},{name:"robots",content:"noindex,nofollow"}]}),component:be(wN,"component")}),kN=()=>ye(()=>import("./admin.authors-C32wgaOt.js"),__vite__mapDeps([67,54,39,63])),SN=_e("/_authenticated/admin/authors")({head:()=>({meta:[{title:"Authors â OutreachFox CMS"},{name:"robots",content:"noindex,nofollow"}]}),component:be(kN,"component")}),_N=()=>ye(()=>import("./admin.posts.index-CxMA4aqq.js"),__vite__mapDeps([68,54,39,63])),CN=_e("/_authenticated/admin/posts/")({head:()=>({meta:[{title:"Posts â OutreachFox CMS"},{name:"robots",content:"noindex,nofollow"}]}
99),component:be(_N,"component")}),AN=()=>ye(()=>import("./admin.posts.new-D-1rHUWD.js"),__vite__mapDeps([69,70,54,39,62,65,55,56,63])),TN=_e("/_authenticated/admin/posts/new")({head:()=>({meta:[{title:"New post â OutreachFox CMS"},{name:"robots",content:"noindex,nofollow"}]}),component:be(AN,"component")}),RN=()=>ye(()=>import("./admin.posts._id-Cic_PGYd.js"),__vite__mapDeps([71,70,54,39,62,65,55,56,63])),EN=_e("/_authenticated/admin/posts/$id")({head:()=>({meta:[{title:"Edit post â OutreachFox CMS"},{name:"robots",content:"noindex,nofollow"}]}),component:be(RN,"component")}),ON=zD.update({id:"/terms",path:"/terms",getParentRoute:()=>Me}),IN=$D.update({id:"/smartlead-alternative",path:"/smartlead-alternative",getParentRoute:()=>Me}),MN=YD.update({id:"/saleshandy-alternative",path:"/saleshandy-alternative",getParentRoute:()=>Me}),PN=ZD.update({id:"/refund",path:"/refund",getParentRoute:()=>Me}),DN=XD.update({id:"/reachinbox-alternative",path:"/reachinbox-alternative",getParentRoute:()=>Me}),LN=eL.update({id:"/privacy",path:"/privacy",getParentRoute:()=>Me}),NN=nL.update({id:"/pricing",path:"/pricing",getParentRoute:()=>Me}),UN=iL.update({id:"/mcp",path:"/mcp",getParentRoute:()=>Me}),jN=rL.update({id:"/instantly-alternative",path:"/instantly-alternative",getParentRoute:()=>Me}),FN=cL.update({id:"/heyreach-alternative",path:"/heyreach-alternative",getParentRoute:()=>Me}),qN=uL.update({id:"/fair-usage",path:"/fair-usage",getParentRoute:()=>Me}),BN=fL.update({id:"/cancellation",path:"/cancellation",getParentRoute:()=>Me}),zN=mL.update({id:"/auth",path:"/auth",getParentRoute:()=>Me}),HN=yL.update({id:"/apollo-alternative",path:"/apollo-alternative",getParentRoute:()=>Me}),GN=vL.update({id:"/aimfox-alternative",path:"/aimfox-alternative",getParentRoute:()=>Me}),WN=xL.update({id:"/affiliate",path:"/affiliate",getParentRoute:()=>Me}),Oa=SL.update({id:"/_authenticated",getParentRoute:()=>Me}),$N=TL.update({id:"/",path:"/",getParentRoute:()=>Me}),VN=EL.update({id:"/tools/",path:"/tools/",getParentRoute:()=>Me}),YN=IL.update({id:"/help/",path:"/help/",getParentRoute:()=>Me}),KN=x5.update({id:"/blog/",path:"/blog/",getParentRoute:()=>Me}),ZN=S5.update({id:"/tools/spf",path:"/tools/spf",getParentRoute:()=>Me}),QN=C5.update({id:"/tools/mx",path:"/tools/mx",getParentRoute:()=>Me}),XN=T5.update({id:"/tools/email-verifier",path:"/tools/email-verifier",getParentRoute:()=>Me}),JN=E5.update({id:"/tools/dmarc",path:"/tools/dmarc",getParentRoute:()=>Me}),e6=I5.update({id:"/tools/dkim",path:"/tools/dkim",getParentRoute:()=>Me}),t6=P5.update({id:"/tools/blacklist",path:"/tools/blacklist",getParentRoute:()=>Me}),n6=z5.update({id:"/features/unified-inbox",path:"/features/unified-inbox",getParentRoute:()=>Me}),a6=G5.update({id:"/features/multichannel-outreach",path:"/features/multichannel-outreach",getParentRoute:()=>Me}),o6=$5.update({id:"/features/mailbox-infrastructure",path:"/features/mailbox-infrastructure",getParentRoute:()=>Me}),i6=Y5.update({id:"/features/data-and-enrichment",path:"/features/data-and-enrichment",getParentRoute:()=>Me}),s6=aN.update({id:"/blog/$slug",path:"/blog/$slug",getParentRoute:()=>Me}),r6=lN.update({id:"/help/$categorySlug/",path:"/help/$categorySlug/",getParentRoute:()=>Me}),l6=uN.update({id:"/help/c/$",path:"/help/c/$",getParentRoute:()=>Me}),c6=fN.update({id:"/help/$categorySlug/$articleSlug",path:"/help/$categorySlug/$articleSlug",getParentRoute:()=>Me}),d6=mN.update({id:"/admin/waitlist",path:"/admin/waitlist",getParentRoute:()=>Oa}),u6=yN.update({id:"/admin/topics",path:"/admin/topics",getParentRoute:()=>Oa}),h6=vN.update({id:"/admin/seo",path:"/admin/seo",getParentRoute:()=>Oa}),f6=xN.update({id:"/admin/redirects",path:"/admin/redirects",getParentRoute:()=>Oa}),p6=SN.update({id:"/admin/authors",path:"/admin/authors",getParentRoute:()=>Oa}),m6=CN.update({id:"/admin/posts/",path:"/admin/posts/",getParentRoute:()=>Oa}),g6=TN.update({id:"/admin/posts/new",path:"/admin/posts/new",getParentRoute:()=>Oa}),y6=EN.update({id:"/admin/posts/$id",path:"/admin/posts/$id",getParentRoute:()=>Oa}),b6={AuthenticatedAdminAuthorsRoute:p6,AuthenticatedAdminRedirectsRoute:f6,AuthenticatedAdminSeoRoute:h6,AuthenticatedAdminTopicsRoute:u6,AuthenticatedAdminWaitlistRoute:d6,AuthenticatedAdminPostsIdRoute:y6,AuthenticatedAdminPostsNewRoute:g6,AuthenticatedAdminPostsIndexRoute:m6},v6=Oa._addFileChildren(b6),w6={IndexRoute:$N,AuthenticatedRouteRoute:v6,AffiliateRoute:WN,AimfoxAlternativeRoute:GN,ApolloAlternativeRoute:HN,AuthRoute:zN,CancellationRoute:BN,FairUsageRoute:qN,HeyreachAlternativeRoute:FN,InstantlyAlternativeRoute:jN,McpRoute:UN,PricingRoute:NN,PrivacyRoute:LN,ReachinboxAlternativeRoute:DN,RefundRoute:PN,SaleshandyAlternativeRoute:MN,SmartleadAlternativeRoute:IN,TermsRoute:ON,BlogSlugRoute:s6,FeaturesDataAndEnrichmentRoute:i6,FeaturesMailboxInfrastru
99ctureRoute:o6,FeaturesMultichannelOutreachRoute:a6,FeaturesUnifiedInboxRoute:n6,ToolsBlacklistRoute:t6,ToolsDkimRoute:e6,ToolsDmarcRoute:JN,ToolsEmailVerifierRoute:XN,ToolsMxRoute:QN,ToolsSpfRoute:ZN,BlogIndexRoute:KN,HelpIndexRoute:YN,ToolsIndexRoute:VN,HelpCategorySlugArticleSlugRoute:c6,HelpCSplatRoute:l6,HelpCategorySlugIndexRoute:r6},x6=Me._addFileChildren(w6),k6=()=>{const t=new b2;return _O({routeTree:x6,context:{queryClient:t},scrollRestoration:!0,defaultPreloadStaleTime:0})};async function S6(){const t=await k6();let e;if(Fw){const n=await Fw.getOptions();n.serializationAdapters=n.serializationAdapters??[],window.__TSS_START_OPTIONS__=n,e=n.serializationAdapters,t.options.defaultSsr=n.defaultSsr}else e=[],window.__TSS_START_OPTIONS__={serializationAdapters:e};return e.push(AE),t.options.serializationAdapters&&e.push(...t.options.serializationAdapters),t.update({basepath:"",serializationAdapters:e}),t.stores.matchesId.get().length||await OE(t),t}async function _6(){const t=await S6();return window.$_TSR?.h(),t}var Jf;function C6(){return Jf||(Jf=_6()),M.jsx(DE,{promise:Jf,children:t=>M.jsx(TO,{router:t})})}A.startTransition(()=>{gA.hydrateRoot(document,M.jsx(A.StrictMode,{children:M.jsx(C6,{})}))});export{wp as $,q0 as A,NL as B,Zw as C,LO as D,T6 as E,al as F,m2 as G,$t as H,E6 as I,Nn as J,R6 as K,Qp as L,wt as M,It as N,$k as O,$6 as P,hi as Q,bt as R,zd as S,s2 as T,q5 as U,J4 as V,xp as W,ES as X,SS as Y,Q4 as Z,X4 as _,Wf as a,wS as a0,h2 as a1,n2 as a2,Gd as a3,U2 as a4,di as a5,z2 as a6,Ea as a7,Lf as a8,xo as a9,EN as aA,Wd as aa,il as ab,F5 as ac,j5 as ad,U5 as ae,aN as af,Z5 as ag,Q5 as ah,X5 as ai,rm as aj,Ux as ak,lN as al,W6 as am,fN as an,N6 as ao,O6 as ap,Xn as aq,RO as ar,M6 as as,U6 as at,j6 as au,F6 as av,gD as aw,L6 as ax,P6 as ay,D6 as az,$f as b,I2 as c,Gf as d,Hd as e,Yf as f,Kf as g,Zf as h,Qf as i,M as j,Kn as k,G6 as l,CL as m,sN as n,cm as o,H6 as p,B0 as q,A as r,vS as s,q6 as t,zk as u,B6 as v,z6 as w,x5 as x,p5 as y,m5 as z};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.